xcrysden-1.6.2/0000755000175000017500000000000013556022211012050 5ustar tonetonexcrysden-1.6.2/external/0000755000175000017500000000000013556022211013672 5ustar tonetonexcrysden-1.6.2/external/Makefile0000644000175000017500000000023313556022211015330 0ustar tonetonedefault: distclean: for dir in bin etc include lib lib64 share usr man; do \ if test -d $$dir ; then rm -rf $$dir ; fi; \ done cd src; $(MAKE) clean xcrysden-1.6.2/external/src/0000755000175000017500000000000013556022211014461 5ustar tonetonexcrysden-1.6.2/external/src/Makefile0000644000175000017500000002366613556022211016136 0ustar tonetoneTOPDIR = $(PWD)/../.. include ../../make.include include ../../Make.sys default: @echo; echo "*** Possible targets: tcl tk togl mesa fftw clean"; echo all: tcl tk mesa togl fftw meschach bwidget tcl: @if test "$(COMPILE_TCLTK)" = yes -o "$(COMPILE_ALL)" = yes; then \ \ if test ! -f $(TCL_TGZ); then \ echo ;\ echo "#------------------------------------#";\ echo "# #";\ echo "# Downloading external Tcl-library #";\ echo "# #";\ echo "#------------------------------------#";\ echo ;\ $(DOWNLOAD) $(TCL_DOWNLOAD); \ fi; \ \ echo ;\ echo "#----------------------------------#";\ echo "# #";\ echo "# Compiling external Tcl-library #";\ echo "# #";\ echo "#----------------------------------#";\ echo ;\ \ if [ \( ! -d tcl$(TCL_VER3) \) -a \( -f $(TCL_TGZ) \) ]; then \ gunzip -c $(TCL_TGZ) | tar xvf -; \ fi; \ \ cd tcl$(TCL_VER3)/unix; \ ./configure $(TCLTK_OPTIONS) --prefix=$(TOPDIR)/external; \ $(MAKE); $(MAKE) install; \ fi tk: @if test "$(COMPILE_TCLTK)" = yes -o "$(COMPILE_ALL)" = yes; then \ \ if test ! -f $(TK_TGZ); then \ echo ;\ echo "#-----------------------------------#";\ echo "# #";\ echo "# Downloading external Tk-library #";\ echo "# #";\ echo "#-----------------------------------#";\ echo ;\ $(DOWNLOAD) $(TK_DOWNLOAD); \ fi; \ \ echo ;\ echo "#---------------------------------#";\ echo "# #";\ echo "# Compiling external Tk-library #";\ echo "# #";\ echo "#---------------------------------#";\ echo ;\ \ if [ \( ! -d tk$(TCL_VER3) \) -a \( -f $(TK_TGZ) \) ]; then \ gunzip -c $(TK_TGZ) | tar xvf -; \ fi; \ \ cd tk$(TCL_VER3)/unix; \ CPPFLAGS=-I$(TOPDIR)/external/include LDFLAGS=-L$(TOPDIR)/external/lib ./configure $(TCLTK_OPTIONS) --prefix=$(TOPDIR)/external; \ $(MAKE); $(MAKE) install; \ fi togl: @if test "$(COMPILE_TOGL)" = yes -o "$(COMPILE_ALL)" = yes; then \ \ if test ! -f $(TOGL_TGZ); then \ echo ;\ echo "#-------------------------------------#";\ echo "# #";\ echo "# Downloading external Togl-library #";\ echo "# #";\ echo "#-------------------------------------#";\ echo ;\ $(DOWNLOAD) $(TOGL_DOWNLOAD); \ fi; \ \ echo ;\ echo "#-----------------------------------#";\ echo "# #";\ echo "# Compiling external Togl-library #";\ echo "# #";\ echo "#-----------------------------------#";\ echo ;\ \ if [ \( ! -d Togl$(TOGL_VER) \) -a \( -f $(TOGL_TGZ) \) ]; then \ gunzip -c $(TOGL_TGZ) | tar xvf -; \ fi; \ \ (cd Togl$(TOGL_VER); \ CPPFLAGS=-I$(TOPDIR)/external/include LDFLAGS=-L$(TOPDIR)/external/lib ./configure $(TOGL_OPTIONS) --prefix=$(TOPDIR)/external; \ $(MAKE); $(MAKE) install); \ (cd ../lib; togl=`ls libTogl$(TOGL_VER).*`; if test x$$togl = x; then ln -sf Togl$(TOGL_VER)/libTogl$(TOGL_VER).* .; fi); \ fi #mesa: mesa-traditional mesa: mesa-new glu-new mesa-new: external_dirs @if test "$(COMPILE_MESA)" = yes -o "$(COMPILE_ALL)" = yes; then \ \ if test ! -f $(MESA_TGZ); then \ echo ;\ echo "#-------------------------------------#";\ echo "# #";\ echo "# Downloading external Mesa-library #";\ echo "# #";\ echo "#-------------------------------------#";\ echo ;\ $(DOWNLOAD) $(MESA_DOWNLOAD); \ fi; \ \ echo ;\ echo "#-----------------------------------#";\ echo "# #";\ echo "# Compiling external Mesa-library #";\ echo "# #";\ echo "#-----------------------------------#";\ echo ;\ \ if [ \( ! -d mesa-$(MESA_VER) \) -a \( -f $(MESA_TGZ) \) ]; then \ gunzip -c $(MESA_TGZ) | tar -xvf -; \ fi; \ cd mesa-$(MESA_VER); \ ./configure $(MESA_OPTIONS) --prefix=$(TOPDIR)/external; \ $(MAKE); $(MAKE) install; \ fi glu-new: external_dirs @if test "$(COMPILE_MESA)" = yes -o "$(COMPILE_ALL)" = yes; then \ \ if test ! -f $(GLU_TGZ); then \ echo ;\ echo "#------------------------------------#";\ echo "# #";\ echo "# Downloading external GLU-library #";\ echo "# #";\ echo "#------------------------------------#";\ echo ;\ $(DOWNLOAD) $(GLU_DOWNLOAD); \ fi; \ \ echo ;\ echo "#----------------------------------#";\ echo "# #";\ echo "# Compiling external GLU-library #";\ echo "# #";\ echo "#----------------------------------#";\ echo ;\ \ if [ \( ! -d glu-$(GLU_VER) \) -a \( -f $(GLU_TGZ) \) ]; then \ gunzip -c $(GLU_TGZ) | tar -xvf -; \ fi; \ cd glu-$(GLU_VER); \ CPPFLAGS=-I$(TOPDIR)/external/include LDFLAGS=-L$(TOPDIR)/external/lib ./configure $(GLU_OPTIONS) --prefix=$(TOPDIR)/external; \ $(MAKE); $(MAKE) install; \ fi mesa-traditional: external_dirs @if test "$(COMPILE_MESA)" = yes -o "$(COMPILE_ALL)" = yes; then \ \ if test ! -f $(MESA_TGZ); then \ echo ;\ echo "#-------------------------------------#";\ echo "# #";\ echo "# Downloading external Mesa-library #";\ echo "# #";\ echo "#-------------------------------------#";\ echo ;\ $(DOWNLOAD) $(MESA_DOWNLOAD); \ fi; \ \ echo ;\ echo "#-----------------------------------#";\ echo "# #";\ echo "# Compiling external Mesa-library #";\ echo "# #";\ echo "#-----------------------------------#";\ echo ;\ \ if [ \( ! -d Mesa-$(MESA_VER) \) -a \( -f $(MESA_TGZ) \) ]; then \ gunzip -c $(MESA_TGZ) | tar -xvf -; \ fi; \ cd Mesa-$(MESA_VER); \ $(MAKE) $(MESA_TARGET); \ $(MAKE) install DESTDIR=$(TOPDIR)/external; \ for dir in usr/local usr/X11; do \ if test -d $(TOPDIR)/external/$$dir; then \ mv $(TOPDIR)/external/$$dir/lib/* $(TOPDIR)/external/lib/; \ mv $(TOPDIR)/external/$$dir/include/* $(TOPDIR)/external/include/; \ rm -rf $(TOPDIR)/external/$$dir; \ fi; \ done; \ fi fftw: @if test "$(COMPILE_FFTW)" = yes -o "$(COMPILE_ALL)" = yes; then \ \ if test ! -f $(FFTW_TGZ); then \ echo ;\ echo "#-------------------------------------#";\ echo "# #";\ echo "# Downloading external FFTW-library #";\ echo "# #";\ echo "#-------------------------------------#";\ echo ;\ $(DOWNLOAD) $(FFTW_DOWNLOAD); \ fi; \ \ echo ;\ echo "#----------------------------------#";\ echo "# #";\ echo "# Compiling external FFTW-library #";\ echo "# #";\ echo "#----------------------------------#";\ echo ;\ \ if [ \( ! -d fftw-$(FFTW_VER) \) -a \( -f $(FFTW_TGZ) \) ]; then \ gunzip -c $(FFTW_TGZ) | tar xvf -; \ fi; \ \ cd fftw-$(FFTW_VER); \ ./configure $(FFTW_OPTIONS) --prefix=$(TOPDIR)/external; \ $(MAKE); $(MAKE) install; \ fi meschach: external_dirs @if test "$(COMPILE_MESCHACH)" = yes -o "$(COMPILE_ALL)" = yes; then \ \ if test ! -f $(MESCHACH_TGZ); then \ echo ;\ echo "#-----------------------------------------#";\ echo "# #";\ echo "# Downloading external MESCHACH-library #";\ echo "# #";\ echo "#-----------------------------------------#";\ echo ;\ $(DOWNLOAD) $(MESCHACH_DOWNLOAD); \ fi; \ \ echo ;\ echo "#---------------------------------------#";\ echo "# #";\ echo "# Compiling external Meschach-library #";\ echo "# #";\ echo "#---------------------------------------#";\ echo ;\ \ if [ \( ! -d meschach$(MESCHACH_VER) \) -a \( -f $(MESCHACH_TGZ) \) ]; then \ mkdir meschach$(MESCHACH_VER); \ cd meschach$(MESCHACH_VER); \ gunzip -c ../$(MESCHACH_TGZ) | tar xvf -; \ cd ..; \ fi; \ \ cd meschach$(MESCHACH_VER); \ $(MAKE) clean; $(MAKE); \ if test ! -d $(TOPDIR)/external/include/meschach; then \ mkdir $(TOPDIR)/external/include/meschach; \ fi; \ cp *.h $(TOPDIR)/external/include/meschach/; \ mv meschach.a $(TOPDIR)/external/lib/libmeschach.a; \ fi bwidget: @if test ! -f $(BWIDGET_TGZ); then \ echo ;\ echo "#----------------------------------------#";\ echo "# #";\ echo "# Downloading external BWidget-library #";\ echo "# #";\ echo "#----------------------------------------#";\ echo ;\ $(DOWNLOAD) $(BWIDGET_DOWNLOAD); \ fi if test ! -d $(TOPDIR)/external/lib; then \ mkdir $(TOPDIR)/external/lib; \ fi if test -f $(BWIDGET_TGZ); then \ if test ! -d $(TOPDIR)/external/lib/bwidget-$(BWIDGET_VER); then \ cd $(TOPDIR)/external/lib; tar zxvf $(TOPDIR)/external/src/bwidget-$(BWIDGET_VER).tar.gz; \ fi; \ fi external_dirs: for dir in lib include bin; do \ if test ! -d $(TOPDIR)/external/$$dir; then \ mkdir $(TOPDIR)/external/$$dir; \ fi; \ done clean: for file in tcl*gz* tk*gz* Mesa*gz* mesa*gz* glu*gz* Togl*gz* bwidget*gz* fftw*gz* mesch*gz*; do \ if test -f $$file; then rm -f $$file; fi; \ done; \ for dir in tcl$(TCL_VER3) tk$(TCL_VER3) Togl$(TOGL_VER) mesa-$(MESA_VER) glu-$(GLU_VER) Mesa-$(MESA_VER) bwidget-$(BWIDGET_VER) fftw-$(FFTW_VER) meschach$(MESCHACH_VER); do \ if test -d $$dir ; then rm -rf $$dir ; fi; \ done xcrysden-1.6.2/examples/0000755000175000017500000000000013556022211013666 5ustar tonetonexcrysden-1.6.2/examples/Makefile0000644000175000017500000000005313556022211015324 0ustar tonetonedefault: clean: -rm -f *~ -rm -f */*~ xcrysden-1.6.2/examples/XYZ/0000755000175000017500000000000013556022211014360 5ustar tonetonexcrysden-1.6.2/examples/XYZ/mol1.xyz0000644000175000017500000000110711712736221016010 0ustar tonetone13 XYZ Format Test #: 1 C01 2.325243 -0.115261 0.031711 H1 2.344577 -0.363301 1.077589 F1 3.131708 -0.909527 -0.638930 F2 2.736189 1.130568 -0.134093 O1 1.079338 -0.265162 -0.526351 C02 0.007719 -0.041269 0.244204 F3 0.064656 1.154700 0.824420 F4 -0.042641 -0.911850 1.255074 O2 -1.071578 -0.152842 -0.539134 C03 -2.310374 0.036537 0.022189 H2 -2.267004 0.230694 1.077874 F5 -2.890949 1.048938 -0.593940 F6 -3.029540 -1.046542 -0.203665 xcrysden-1.6.2/examples/XYZ/bucky.xyz0000644000175000017500000000561211712736221016262 0ustar tonetone60 bucky-ball C 1.22650 0.00000 3.31450 C 0.37900 1.16640 3.31450 C -0.99220 0.72090 3.31450 C -0.99220 -0.72090 3.31450 C 0.37900 -1.16640 3.31450 C 3.40840 0.72090 0.59480 C 2.79510 1.16640 1.82130 C 2.41610 0.00000 2.57930 C 2.79510 -1.16640 1.82130 C 3.40840 -0.72090 0.59480 C 0.36760 3.46430 0.59480 C -0.24560 3.01880 1.82130 C 0.74660 2.29790 2.57930 C 1.97310 2.29790 1.82130 C 1.73890 3.01880 0.59480 C -3.18120 1.42020 0.59480 C -2.94690 0.69930 1.82130 C -1.95470 1.42020 2.57930 C -1.57570 2.58660 1.82130 C -2.33370 2.58660 0.59480 C -2.33370 -2.58660 0.59480 C -1.57570 -2.58660 1.82130 C -1.95470 -1.42020 2.57930 C -2.94690 -0.69930 1.82130 C -3.18120 -1.42020 0.59480 C 1.73890 -3.01880 0.59480 C 1.97310 -2.29790 1.82130 C 0.74660 -2.29790 2.57930 C -0.24560 -3.01880 1.82130 C 0.36760 -3.46430 0.59480 C 0.99220 0.72090 -3.31450 C -0.37900 1.16640 -3.31450 C -1.22650 0.00000 -3.31450 C -0.37900 -1.16640 -3.31450 C 0.99220 -0.72090 -3.31450 C 2.33370 2.58660 -0.59480 C 1.57570 2.58660 -1.82130 C 1.95470 1.42020 -2.57930 C 2.94690 0.69930 -1.82130 C 3.18120 1.42020 -0.59480 C -1.73890 3.01880 -0.59480 C -1.97310 2.29790 -1.82130 C -0.74660 2.29790 -2.57930 C 0.24560 3.01880 -1.82130 C -0.36760 3.46430 -0.59480 C -3.40840 -0.72090 -0.59480 C -2.79510 -1.16640 -1.82130 C -2.41610 0.00000 -2.57930 C -2.79510 1.16640 -1.82130 C -3.40840 0.72090 -0.59480 C -0.36760 -3.46430 -0.59480 C 0.24560 -3.01880 -1.82130 C -0.74660 -2.29790 -2.57930 C -1.97310 -2.29790 -1.82130 C -1.73890 -3.01880 -0.59480 C 3.18120 -1.42020 -0.59480 C 2.94690 -0.69930 -1.82130 C 1.95470 -1.42020 -2.57930 C 1.57570 -2.58660 -1.82130 C 2.33370 -2.58660 -0.59480 xcrysden-1.6.2/examples/XYZ/mol2.xyz0000644000175000017500000000122311712736221016010 0ustar tonetone15 an example C -2.567869 0.032045 -0.221028 F -2.886000 0.687964 0.883366 O -1.382513 -0.640867 -0.040575 C -0.229973 0.040074 -0.088613 F -0.144013 0.755076 -1.202635 F -3.477776 -0.891429 -0.435296 O 0.750693 -0.879985 -0.022804 C 2.051993 -0.506002 0.090723 F 2.454670 -0.625774 1.333637 F -0.132224 0.912482 0.909417 F 2.776631 -1.267760 -0.681152 O 2.543443 1.857414 -0.537325 H -2.530354 0.718822 -1.046630 H 2.306985 0.752430 -0.270590 H 2.083902 2.304517 0.170326 xcrysden-1.6.2/examples/XYZ/anim.xyz0000644000175000017500000000635211712736221016073 0ustar tonetone12 benzene.1 C 0.0000000000 0.0000000000 0.0000000000 C 0.0000000000 0.0000000000 1.1000000000 C 0.9712420000 0.0000000000 1.6164190000 C 1.8831840000 0.0000000000 1.0013070000 C 1.7682020000 0.0000000000 -0.0926680000 C 0.7483000000 0.0000000000 -0.5047350000 H -1.0875690000 0.0000000000 -0.5071420000 H -0.9583630000 0.0000000000 1.8221780000 H 1.1589640000 0.0000000000 2.8016450000 H 3.0178060000 0.0000000000 1.3919880000 H 2.6458270000 0.0000000000 -0.9110660000 H 0.5605790000 0.0000000000 -1.6899610000 12 benzene.2 C -0.9558780000 0.0000000000 -0.5394100000 C -0.9475050000 0.0000000000 0.6243570000 C 0.0819810000 0.0000000000 1.1609490000 C 1.0457520000 0.0000000000 0.5068940000 C 0.9272380000 0.0000000000 -0.6479690000 C -0.1518210000 0.0000000000 -1.0854280000 H -2.0406830000 0.0000000000 -1.0344840000 H -1.8968190000 0.0000000000 1.3439410000 H 0.2687930000 0.0000000000 2.3374690000 H 2.1702340000 0.0000000000 0.9000470000 H 1.8043710000 0.0000000000 -1.4538110000 H -0.3297240000 0.0000000000 -2.2644720000 12 benzene.3 C -1.0423030000 0.0000000000 -0.5721340000 C -1.0217390000 0.0000000000 0.6818480000 C 0.0901300000 0.0000000000 1.2464030000 C 1.1268530000 0.0000000000 0.5372300000 C 1.0034780000 0.0000000000 -0.7036330000 C -0.1594070000 0.0000000000 -1.1769690000 H -2.1226720000 0.0000000000 -1.0509940000 H -1.9589860000 0.0000000000 1.3967790000 H 0.2749050000 0.0000000000 2.4107300000 H 2.2369990000 0.0000000000 0.9337300000 H 1.8794450000 0.0000000000 -1.4920680000 H -0.3235560000 0.0000000000 -2.3471400000 12 benzene.4 C -1.1285670000 0.0000000000 -0.6039240000 C -1.0954930000 0.0000000000 0.7402980000 C 0.0987730000 0.0000000000 1.3322460000 C 1.2081120000 0.0000000000 0.5679060000 C 1.0800230000 0.0000000000 -0.7588520000 C -0.1668570000 0.0000000000 -1.2680040000 H -2.2039570000 0.0000000000 -1.0674630000 H -2.0214160000 0.0000000000 1.4495910000 H 0.2807530000 0.0000000000 2.4844990000 H 2.3039230000 0.0000000000 0.9675930000 H 1.9543380000 0.0000000000 -1.5302430000 H -0.3174010000 0.0000000000 -2.4291520000 12 benzene.5 C -1.2148990000 0.0000000000 -0.6353910000 C -1.1690790000 0.0000000000 0.7990850000 C 0.1075930000 0.0000000000 1.4179350000 C 1.2892740000 0.0000000000 0.5983880000 C 1.1566140000 0.0000000000 -0.8141810000 C -0.1744090000 0.0000000000 -1.3590760000 H -2.2848420000 0.0000000000 -1.0844050000 H -2.0843120000 0.0000000000 1.5019050000 H 0.2861380000 0.0000000000 2.5582130000 H 2.3707480000 0.0000000000 1.0011110000 H 2.0288440000 0.0000000000 -1.5688500000 H -0.3114940000 0.0000000000 -2.5110520000 xcrysden-1.6.2/examples/GAUSSIAN_files/0000755000175000017500000000000013556022211016262 5ustar tonetonexcrysden-1.6.2/examples/GAUSSIAN_files/benzene-6CH3-OCH3.g980000644000175000017500000000306411712736221021404 0ustar tonetone%chk=benzene-6CH3-OH.chk # B3LYP 6-31G opt scf=nosymm Initial Structural Optimization of C6H6-5CH3-OH 0 2 C C 1 rCC1 C 2 rCC2 1 aCCCb1 C 3 rCC3 2 aCCCb2 1 dBenzen C 4 rCC3 3 aCCCb3 2 dBenzen C 5 rCC2 4 aCCCb2 3 dBenzen C 1 rCCm 2 aCCCmOH 3 dMetOH H 7 rCH 1 aHCC 2 dH1 H 7 rCH 1 aHCC 2 dH2 H 7 rCH 1 aHCC 2 dH3 C 2 rCCm 3 aCCCm 4 dMethyl H 11 rCH 2 aHCC 3 dH1m H 11 rCH 2 aHCC 3 dH2m H 11 rCH 2 aHCC 3 dH3m C 3 rCCm 4 aCCCm 5 dMethyl H 15 rCH 3 aHCC 4 dH1 H 15 rCH 3 aHCC 4 dH2 H 15 rCH 3 aHCC 4 dH3 C 4 rCCm 5 aCCCm 6 dMethyl H 19 rCH 4 aHCC 5 dH1m H 19 rCH 4 aHCC 5 dH2m H 19 rCH 4 aHCC 5 dH3m C 5 rCCm 6 aCCCm 1 dMethyl H 23 rCH 5 aHCC 6 dH1 H 23 rCH 5 aHCC 6 dH2 H 23 rCH 5 aHCC 6 dH3 C 6 rCCm 1 aCCCm 2 dMethyl H 27 rCH 6 aHCC 1 dH1m H 27 rCH 6 aHCC 1 dH2m H 27 rCH 6 aHCC 1 dH3m O 1 rCO 2 aCCO 3 dOH C 31 r31_32 1 a1_31_32 2 d31_1_2_32 H 32 r32_33 31 a31_32_33 1 180.0 H 32 r32_33 31 a31_32_33 1 60.0 H 32 r32_33 31 a31_32_33 1 -60.0 Variables: rCO = 1.504 rCC1 = 1.5166 rCC2 = 1.381 rCC3 = 1.4379 rCCm = 1.52 rCH = 1.10 aHCC = 112.35 aCCCb1 = 120.1 aCCCb2 = 120.2 aCCCb3 = 120.3 aCCCmOH= 120.0 aCCO = 120.0 dMetOH = 120.0 dOH =-120.0 aCCCm = 120.0 dBenzen = 0.0 dMethyl = 180.0 dH1 = 90.0 dH2 = -30.0 dH3 =-150.0 dH1m = -90.1 dH2m = 30.1 dH3m = 150.1 r31_32 = 1.5 a1_31_32 = 120.0 d31_1_2_32 = 60.0 r32_33 = 1.1 a31_32_33 = 107.0 xcrysden-1.6.2/examples/GAUSSIAN_files/benzene.g98_out0000644000175000017500000023032011712736221021135 0ustar tonetone Entering Gaussian System, Link 0=g98 Initial command: /home/tone/bin/g98a5/l1.exe /temp/tone/g98/Gau-20887.inp -scrdir=/temp/tone/g98/ Entering Link 1 = /home/tone/bin/g98a5/l1.exe PID= 20888. Copyright (c) 1988,1990,1992,1993,1995,1998 Gaussian, Inc. All Rights Reserved. This is part of the Gaussian(R) 98 program. It is based on the Gaussian 94(TM) system (copyright 1995 Gaussian, Inc.), the Gaussian 92(TM) system (copyright 1992 Gaussian, Inc.), the Gaussian 90(TM) system (copyright 1990 Gaussian, Inc.), the Gaussian 88(TM) system (copyright 1988 Gaussian, Inc.), the Gaussian 86(TM) system (copyright 1986 Carnegie Mellon University), and the Gaussian 82(TM) system (copyright 1983 Carnegie Mellon University). Gaussian is a federally registered trademark of Gaussian, Inc. This software contains proprietary and confidential information, including trade secrets, belonging to Gaussian, Inc. This software is provided under written license and may be used, copied, transmitted, or stored only in accord with that written license. The following legend is applicable only to US Government contracts under DFARS: RESTRICTED RIGHTS LEGEND Use, duplication or disclosure by the US Government is subject to restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 252.227-7013. Gaussian, Inc. Carnegie Office Park, Building 6, Pittsburgh, PA 15106 USA The following legend is applicable only to US Government contracts under FAR: RESTRICTED RIGHTS LEGEND Use, reproduction and disclosure by the US Government is subject to restrictions as set forth in subparagraph (c) of the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19. Gaussian, Inc. Carnegie Office Park, Building 6, Pittsburgh, PA 15106 USA --------------------------------------------------------------- Warning -- This program may not be used in any manner that competes with the business of Gaussian, Inc. or will provide assistance to any competitor of Gaussian, Inc. The licensee of this program is prohibited from giving any competitor of Gaussian, Inc. access to this program. By using this program, the user acknowledges that Gaussian, Inc. is engaged in the business of creating and licensing software in the field of computational chemistry and represents and warrants to the licensee that it is not a competitor of Gaussian, Inc. and that it will not use this program in any manner prohibited above. --------------------------------------------------------------- Cite this work as: Gaussian 98, Revision A.5, M. J. Frisch, G. W. Trucks, H. B. Schlegel, G. E. Scuseria, M. A. Robb, J. R. Cheeseman, V. G. Zakrzewski, J. A. Montgomery, Jr., R. E. Stratmann, J. C. Burant, S. Dapprich, J. M. Millam, A. D. Daniels, K. N. Kudin, M. C. Strain, O. Farkas, J. Tomasi, V. Barone, M. Cossi, R. Cammi, B. Mennucci, C. Pomelli, C. Adamo, S. Clifford, J. Ochterski, G. A. Petersson, P. Y. Ayala, Q. Cui, K. Morokuma, D. K. Malick, A. D. Rabuck, K. Raghavachari, J. B. Foresman, J. Cioslowski, J. V. Ortiz, B. B. Stefanov, G. Liu, A. Liashenko, P. Piskorz, I. Komaromi, R. Gomperts, R. L. Martin, D. J. Fox, T. Keith, M. A. Al-Laham, C. Y. Peng, A. Nanayakkara, C. Gonzalez, M. Challacombe, P. M. W. Gill, B. Johnson, W. Chen, M. W. Wong, J. L. Andres, C. Gonzalez, M. Head-Gordon, E. S. Replogle, and J. A. Pople, Gaussian, Inc., Pittsburgh PA, 1998. ********************************************* Gaussian 98: x86-Linux-G98RevA.5 21-Sep-1998 21-Feb-2003 ********************************************* ------------------ # B3LYP STO-3G opt ------------------ 1/14=-1,18=20,26=3,38=1/1,3; 2/9=110,17=6,18=5/2; 3/11=2,25=1,30=1/1,2,3; 4//1; 5/5=2,38=4,42=-5/2; 6/7=2,8=2,9=2,10=2,28=1/1; 7//1,2,3,16; 1/14=-1,18=20/3(1); 99//99; 2/9=110/2; 3/11=2,25=1,30=1/1,2,3; 4/5=5,16=2/1; 5/5=2,38=4,42=-5/2; 7//1,2,3,16; 1/14=-1,18=20/3(-5); 2/9=110/2; 6/7=2,8=2,9=2,10=2,19=2,28=1/1; 99/9=1/99; ------------------------------------------------------ Optimization and Mulliken Population of BENZENE (C6H6) ------------------------------------------------------ Symbolic Z-matrix: Charge = 0 Multiplicity = 1 C C 1 rCCb C 2 rCCb 1 aCCCb C 3 rCCb 2 aCCCb 1 0. 0 C 4 rCCb 3 aCCCb 2 0. 0 C 5 rCCb 4 aCCCb 3 0. 0 H 1 rCH 2 aCCH 3 180. 0 H 2 rCH 3 aCCH 4 180. 0 H 3 rCH 4 aCCH 5 180. 0 H 4 rCH 5 aCCH 6 180. 0 H 5 rCH 6 aCCH 1 180. 0 H 6 rCH 1 aCCH 2 180. 0 Variables: rCCb 1.1 rCH 1.2 aCCCb 118. aCCH 115. GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Berny optimization. Initialization pass. ---------------------------- ! Initial Parameters ! ... cutting ... ----------------------------------------------------------------------------- Trust Radius=3.00E-01 FncErr=1.00E-07 GrdErr=1.00E-06 Number of steps in this run= 64 maximum allowed number of steps= 100. GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 .000000 .000000 .000000 2 6 0 .000000 .000000 1.100000 3 6 0 .971242 .000000 1.616419 4 6 0 1.883184 .000000 1.001307 5 6 0 1.768202 .000000 -.092668 6 6 0 .748300 .000000 -.504735 7 1 0 -1.087569 .000000 -.507142 8 1 0 -.958363 .000000 1.822178 9 1 0 1.158964 .000000 2.801645 10 1 0 3.017806 .000000 1.391988 11 1 0 2.645827 .000000 -.911066 12 1 0 .560579 .000000 -1.689961 --------------------------------------------------------------------- Distance matrix (angstroms): ... cutting ... SCF Done: E(RB+HF-LYP) = -227.781477880 A.U. after 13 cycles Convg = .3354E-08 -V/T = 1.9791 S**2 = .0000 ********************************************************************** Population analysis using the SCF density. ********************************************************************** ... cutting ... ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -1.973794793 .000000000 .466520864 2 6 -.728963376 .000000000 .525631193 3 6 .051646771 .000000000 .866574226 4 6 .818038971 .000000000 .301682250 5 6 .716366348 .000000000 -.533432628 6 6 1.120848159 .000000000 -1.648963914 7 1 .043677096 .000000000 .030689422 8 1 .039679781 .000000000 -.048736157 9 1 -.025157396 .000000000 -.057502065 10 1 -.062555361 .000000000 -.005461111 11 1 -.033363359 .000000000 .054787151 12 1 .033577158 .000000000 .048210770 ------------------------------------------------------------------- Cartesian Forces: Max 1.973794793 RMS .558528904 ... cutting ... GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -.955878 .000000 -.539410 2 6 0 -.947505 .000000 .624357 3 6 0 .081981 .000000 1.160949 4 6 0 1.045752 .000000 .506894 5 6 0 .927238 .000000 -.647969 6 6 0 -.151821 .000000 -1.085428 7 1 0 -2.040683 .000000 -1.034484 8 1 0 -1.896819 .000000 1.343941 9 1 0 .268793 .000000 2.337469 10 1 0 2.170234 .000000 .900047 11 1 0 1.804371 .000000 -1.453811 12 1 0 -.329724 .000000 -2.264472 --------------------------------------------------------------------- Distance matrix (angstroms): ... cutting ... Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -.871779 .664913 .000000 2 6 0 -1.024260 -.488852 .000000 3 6 0 -.078776 -1.162522 .000000 4 6 0 .966112 -.647882 .000000 5 6 0 1.008278 .512280 .000000 6 6 0 .000000 1.094616 .000000 7 1 0 -1.877789 1.305105 .000000 8 1 0 -2.063882 -1.070388 .000000 9 1 0 -.056290 -2.353568 .000000 10 1 0 2.025498 -1.192612 .000000 11 1 0 1.988326 1.189219 .000000 12 1 0 -.013313 2.286931 .000000 --------------------------------------------------------------------- ... cutting ... SCF Done: E(RB+HF-LYP) = -228.434061192 A.U. after 12 cycles Convg = .2863E-08 -V/T = 1.9915 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -1.371236692 .000000000 .334197836 2 6 -.487462784 .000000000 .370667001 3 6 .049447321 .000000000 .586488898 4 6 .557183835 .000000000 .199251094 5 6 .482793790 .000000000 -.365944598 6 6 .773522573 .000000000 -1.144372817 7 1 .045892408 .000000000 .026188683 8 1 .037956518 .000000000 -.046501456 9 1 -.023228776 .000000000 -.054783345 10 1 -.059338604 .000000000 -.005485685 11 1 -.033069025 .000000000 .051020824 12 1 .027539435 .000000000 .049273564 ------------------------------------------------------------------- Cartesian Forces: Max 1.371236692 RMS .385820300 GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.042303 .000000 -.572134 2 6 0 -1.021739 .000000 .681848 3 6 0 .090130 .000000 1.246403 4 6 0 1.126853 .000000 .537230 5 6 0 1.003478 .000000 -.703633 6 6 0 -.159407 .000000 -1.176969 7 1 0 -2.122672 .000000 -1.050994 8 1 0 -1.958986 .000000 1.396779 9 1 0 .274905 .000000 2.410730 10 1 0 2.236999 .000000 .933730 11 1 0 1.879445 .000000 -1.492068 12 1 0 -.323556 .000000 -2.347140 --------------------------------------------------------------------- Distance matrix (angstroms): ...cutting ... Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -.955875 .704619 .000000 2 6 0 -1.103253 -.540842 .000000 3 6 0 -.076905 -1.249069 .000000 4 6 0 1.045373 -.684963 .000000 5 6 0 1.089109 .561251 .000000 6 6 0 .000000 1.185903 .000000 7 1 0 -1.962470 1.323706 .000000 8 1 0 -2.127719 -1.123962 .000000 9 1 0 -.049555 -2.427648 .000000 10 1 0 2.092496 -1.226415 .000000 11 1 0 2.062680 1.225411 .000000 12 1 0 -.006127 2.367515 .000000 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -228.995037669 A.U. after 12 cycles Convg = .2639E-08 -V/T = 2.0041 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -.794104367 .000000000 .212929958 2 6 -.250363697 .000000000 .215733064 3 6 .039136891 .000000000 .312837075 4 6 .303136039 .000000000 .096257242 5 6 .254814561 .000000000 -.198012697 6 6 .451478141 .000000000 -.656536159 7 1 .046100143 .000000000 .020708626 8 1 .034505953 .000000000 -.042350079 9 1 -.020388685 .000000000 -.049738366 10 1 -.053663458 .000000000 -.005155789 11 1 -.031221796 .000000000 .045123315 12 1 .020570275 .000000000 .048203809 ------------------------------------------------------------------- Cartesian Forces: Max .794104367 RMS .219963563 GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.128567 .000000 -.603924 2 6 0 -1.095493 .000000 .740298 3 6 0 .098773 .000000 1.332246 4 6 0 1.208112 .000000 .567906 5 6 0 1.080023 .000000 -.758852 6 6 0 -.166857 .000000 -1.268004 7 1 0 -2.203957 .000000 -1.067463 8 1 0 -2.021416 .000000 1.449591 9 1 0 .280753 .000000 2.484499 10 1 0 2.303923 .000000 .967593 11 1 0 1.954338 .000000 -1.530243 12 1 0 -.317401 .000000 -2.429152 --------------------------------------------------------------------- Distance matrix (angstroms): Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.039943 .743965 .000000 2 6 0 -1.182057 -.593133 .000000 3 6 0 -.074967 -1.335444 .000000 4 6 0 1.124395 -.721947 .000000 5 6 0 1.170030 .610198 .000000 6 6 0 .000000 1.277264 .000000 7 1 0 -2.045875 1.343492 .000000 8 1 0 -2.192400 -1.175916 .000000 9 1 0 -.044464 -2.501579 .000000 10 1 0 2.158883 -1.260821 .000000 11 1 0 2.137284 1.261268 .000000 12 1 0 .001823 2.448128 .000000 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.271674640 A.U. after 12 cycles Convg = .3242E-08 -V/T = 2.0124 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -.430273997 .000000000 .141843386 2 6 -.095843504 .000000000 .111863574 3 6 .025814871 .000000000 .135472000 4 6 .138816498 .000000000 .027574686 5 6 .107036884 .000000000 -.085576294 6 6 .258012288 .000000000 -.345523618 7 1 .043771400 .000000000 .016007357 8 1 .030085225 .000000000 -.037316878 9 1 -.017444730 .000000000 -.043515246 10 1 -.046893674 .000000000 -.004418950 11 1 -.028047931 .000000000 .038679928 12 1 .014966669 .000000000 .044910054 ------------------------------------------------------------------- Cartesian Forces: Max .430273997 RMS .115968300 GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.214899 .000000 -.635391 2 6 0 -1.169079 .000000 .799085 3 6 0 .107593 .000000 1.417935 4 6 0 1.289274 .000000 .598388 5 6 0 1.156614 .000000 -.814181 6 6 0 -.174409 .000000 -1.359076 7 1 0 -2.284842 .000000 -1.084405 8 1 0 -2.084312 .000000 1.501905 9 1 0 .286138 .000000 2.558213 10 1 0 2.370748 .000000 1.001111 11 1 0 2.028844 .000000 -1.568850 12 1 0 -.311494 .000000 -2.511052 --------------------------------------------------------------------- Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.123976 .782995 .000000 2 6 0 -1.260714 -.645685 .000000 3 6 0 -.072978 -1.421668 .000000 4 6 0 1.203221 -.758837 .000000 5 6 0 1.251040 .659141 .000000 6 6 0 .000000 1.368671 .000000 7 1 0 -2.128228 1.364261 .000000 8 1 0 -2.257798 -1.226574 .000000 9 1 0 -.040700 -2.575388 .000000 10 1 0 2.224789 -1.295652 .000000 11 1 0 2.212053 1.296921 .000000 12 1 0 .010332 2.528728 .000000 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.367179799 A.U. after 13 cycles Convg = .4259E-08 -V/T = 2.0174 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -.201543295 .000000000 .101597798 2 6 .005099483 .000000000 .041448217 3 6 .012540443 .000000000 .020069573 4 6 .031855829 .000000000 -.017979306 5 6 .010809833 .000000000 -.009883122 6 6 .143857534 .000000000 -.147713843 7 1 .039593773 .000000000 .011823028 8 1 .024825119 .000000000 -.031574657 9 1 -.014434121 .000000000 -.036266044 10 1 -.039188854 .000000000 -.003273526 11 1 -.023747820 .000000000 .031782769 12 1 .010332077 .000000000 .039969111 ------------------------------------------------------------------- Cartesian Forces: Max .201543295 RMS .054513480 Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.251969 .000000 -.628597 2 6 0 -1.157675 .000000 .822018 3 6 0 .136259 .000000 1.430714 4 6 0 1.317765 .000000 .585215 5 6 0 1.155146 .000000 -.835432 6 6 0 -.192512 .000000 -1.388493 7 1 0 -2.249979 .000000 -1.047938 8 1 0 -2.035810 .000000 1.451411 9 1 0 .266267 .000000 2.505085 10 1 0 2.315534 .000000 1.004870 11 1 0 1.998033 .000000 -1.510941 12 1 0 -.293926 .000000 -2.466366 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.390632636 A.U. after 11 cycles Convg = .9692E-08 -V/T = 2.0171 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -.086368522 .000000000 .099303857 2 6 .048186399 .000000000 -.010926284 3 6 -.004904706 .000000000 -.045506431 4 6 -.037269876 .000000000 -.029429855 5 6 -.034486310 .000000000 .034410904 6 6 .117691710 .000000000 -.048296744 7 1 -.011728576 .000000000 -.006843870 8 1 -.014334725 .000000000 .005547726 9 1 -.001524907 .000000000 .014102815 10 1 .011278594 .000000000 .008360742 11 1 .013447824 .000000000 -.007255277 12 1 .000013096 .000000000 -.013467582 ------------------------------------------------------------------- Cartesian Forces: Max .117691710 RMS .034921863 GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.262896 .000000 -.614589 2 6 0 -1.143867 .000000 .831995 3 6 0 .148067 .000000 1.428503 4 6 0 1.319108 .000000 .576349 5 6 0 1.145997 .000000 -.836015 6 6 0 -.198005 .000000 -1.390943 7 1 0 -2.271234 .000000 -1.040253 8 1 0 -2.046713 .000000 1.452805 9 1 0 .258619 .000000 2.518672 10 1 0 2.319685 .000000 1.022899 11 1 0 2.015461 .000000 -1.502944 12 1 0 -.289145 .000000 -2.481695 --------------------------------------------------------------------- Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.164148 .786068 .000000 2 6 0 -1.251283 -.662788 .000000 3 6 0 -.056901 -1.436330 .000000 4 6 0 1.223066 -.758695 .000000 5 6 0 1.251816 .663948 .000000 6 6 0 .000000 1.403707 .000000 7 1 0 -2.102001 1.350307 .000000 8 1 0 -2.232981 -1.149412 .000000 9 1 0 -.101928 -2.531164 .000000 10 1 0 2.150277 -1.342510 .000000 11 1 0 2.207005 1.200955 .000000 12 1 0 .064326 2.496367 .000000 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.396484669 A.U. after 11 cycles Convg = .7454E-08 -V/T = 2.0174 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -.074120978 .000000000 .079597472 2 6 .026081155 .000000000 -.009879619 3 6 -.006762270 .000000000 -.029048074 4 6 -.026583177 .000000000 -.014266378 5 6 -.018459802 .000000000 .022114324 6 6 .101430072 .000000000 -.046225199 7 1 -.003004176 .000000000 -.001488086 8 1 -.001619884 .000000000 .001316722 9 1 .000490427 .000000000 .002308123 10 1 .002432484 .000000000 .000401390 11 1 .001300470 .000000000 -.001606487 12 1 -.001184322 .000000000 -.003224188 ------------------------------------------------------------------- Cartesian Forces: Max .101430072 RMS .027741452 GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.279573 .000000 -.590042 2 6 0 -1.122292 .000000 .843383 3 6 0 .159366 .000000 1.412319 4 6 0 1.309576 .000000 .556817 5 6 0 1.135997 .000000 -.834596 6 6 0 -.191244 .000000 -1.400319 7 1 0 -2.294224 .000000 -1.020814 8 1 0 -2.040980 .000000 1.449980 9 1 0 .248491 .000000 2.509823 10 1 0 2.303153 .000000 1.031363 11 1 0 2.030175 .000000 -1.476935 12 1 0 -.273966 .000000 -2.499419 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.403559747 A.U. after 13 cycles Convg = .7998E-08 -V/T = 2.0175 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -.034523025 .000000000 .038888861 2 6 -.003648244 .000000000 -.018258006 3 6 -.003853526 .000000000 -.007697719 4 6 -.012873571 .000000000 .009801160 5 6 -.006995278 .000000000 .001928025 6 6 .057361335 .000000000 -.023390307 7 1 .002317991 .000000000 .002343449 8 1 .004463424 .000000000 .003166409 9 1 .004467221 .000000000 -.002449897 10 1 .000197397 .000000000 -.005294672 11 1 -.003993555 .000000000 -.002241834 12 1 -.002920170 .000000000 .003204530 ------------------------------------------------------------------- Cartesian Forces: Max .057361335 RMS .014348285 GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.287887 .000000 -.580060 2 6 0 -1.123590 .000000 .845024 3 6 0 .151778 .000000 1.404191 4 6 0 1.296485 .000000 .555859 5 6 0 1.136146 .000000 -.827357 6 6 0 -.177057 .000000 -1.403287 7 1 0 -2.296497 .000000 -1.013490 8 1 0 -2.035328 .000000 1.463049 9 1 0 .252157 .000000 2.499924 10 1 0 2.290505 .000000 1.027077 11 1 0 2.032099 .000000 -1.468863 12 1 0 -.266797 .000000 -2.497470 --------------------------------------------------------------------- Distance matrix (angstroms): 1 2 3 4 5 Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 1.237093 .679038 .000000 2 6 0 .000000 1.405301 .000000 3 6 0 -1.214018 .723103 .000000 4 6 0 -1.225226 -.701641 .000000 5 6 0 -.023955 -1.405873 .000000 6 6 0 1.226218 -.703543 .000000 7 1 0 2.190172 1.223829 .000000 8 1 0 .054978 2.505391 .000000 9 1 0 -2.149594 1.302244 .000000 10 1 0 -2.199707 -1.212041 .000000 11 1 0 -.050680 -2.507484 .000000 12 1 0 2.154154 -1.290248 .000000 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.406011469 A.U. after 12 cycles Convg = .2758E-08 -V/T = 2.0174 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -.009754618 .000000000 .020581806 2 6 -.014301538 .000000000 -.018892230 3 6 .004001989 .000000000 .001169771 4 6 -.005232437 .000000000 .016461690 5 6 -.005312578 .000000000 -.010692566 6 6 .029716541 .000000000 -.004568614 7 1 -.000839969 .000000000 .000836448 8 1 .004337669 .000000000 .002075885 9 1 .003465137 .000000000 -.001852100 10 1 .000383188 .000000000 -.003976624 11 1 -.003999219 .000000000 -.000958073 12 1 -.002464166 .000000000 -.000185393 ------------------------------------------------------------------- Cartesian Forces: Max .029716541 RMS .008368939 GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.290060 .000000 -.576370 2 6 0 -1.129538 .000000 .841685 3 6 0 .143585 .000000 1.400332 4 6 0 1.288515 .000000 .561811 5 6 0 1.141707 .000000 -.820624 6 6 0 -.159512 .000000 -1.403606 7 1 0 -2.299068 .000000 -1.015849 8 1 0 -2.026051 .000000 1.476137 9 1 0 .262340 .000000 2.492727 10 1 0 2.286839 .000000 1.021137 11 1 0 2.029684 .000000 -1.466808 12 1 0 -.262538 .000000 -2.499247 --------------------------------------------------------------------- Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -.014704 -1.412268 .000000 2 6 0 1.221509 -.699229 .000000 3 6 0 1.225735 .691062 .000000 4 6 0 .000000 1.406293 .000000 5 6 0 -1.209024 .720043 .000000 6 6 0 -1.224353 -.705721 .000000 7 1 0 -.015052 -2.512831 .000000 8 1 0 2.160999 -1.268108 .000000 9 1 0 2.180005 1.235854 .000000 10 1 0 .022809 2.504979 .000000 11 1 0 -2.155866 1.276414 .000000 12 1 0 -2.187876 -1.237386 .000000 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.407064323 A.U. after 14 cycles Convg = .2002E-08 -V/T = 2.0173 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -.000196450 .000000000 .008291133 2 6 -.014111962 .000000000 -.016055760 3 6 .010820800 .000000000 .004179542 4 6 -.000669347 .000000000 .015367479 5 6 -.007622531 .000000000 -.015213078 6 6 .009469940 .000000000 .001764629 7 1 .001430931 .000000000 .001136485 8 1 .000819095 .000000000 .001296613 9 1 .000870048 .000000000 -.000490294 10 1 .000078213 .000000000 -.001310111 11 1 -.000308511 .000000000 -.000733169 12 1 -.000580228 .000000000 .001766532 ------------------------------------------------------------------- Cartesian Forces: Max .016055760 RMS .005990079 Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.289202 .000000 -.577230 2 6 0 -1.135537 .000000 .836675 3 6 0 .139880 .000000 1.398953 4 6 0 1.286272 .000000 .565597 5 6 0 1.144823 .000000 -.821013 6 6 0 -.151492 .000000 -1.403430 7 1 0 -2.294597 .000000 -1.017308 8 1 0 -2.025891 .000000 1.482032 9 1 0 .266504 .000000 2.490620 10 1 0 2.288152 .000000 1.017020 11 1 0 2.030465 .000000 -1.473030 12 1 0 -.261867 .000000 -2.495409 --------------------------------------------------------------------- Distance matrix (angstroms): 1 2 3 4 5 Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -.010077 -1.411879 .000000 2 6 0 1.222526 -.702350 .000000 3 6 0 1.224157 .691509 .000000 4 6 0 .000000 1.405747 .000000 5 6 0 -1.212528 .718383 .000000 6 6 0 -1.224189 -.702710 .000000 7 1 0 -.008471 -2.509370 .000000 8 1 0 2.171560 -1.257823 .000000 9 1 0 2.172631 1.246637 .000000 10 1 0 .010195 2.504584 .000000 11 1 0 -2.165764 1.266863 .000000 12 1 0 -2.179486 -1.243088 .000000 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.407410945 A.U. after 9 cycles Convg = .4344E-08 -V/T = 2.0174 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 .003206555 .000000000 .006267215 2 6 -.010836381 .000000000 -.010602122 3 6 .011742716 .000000000 .003698230 4 6 .000390096 .000000000 .011133092 5 6 -.006435222 .000000000 -.014085988 6 6 .003357207 .000000000 .004651987 7 1 -.000559811 .000000000 -.000429521 8 1 .000730852 .000000000 -.000702109 9 1 -.000559116 .000000000 -.000436618 10 1 -.000498453 .000000000 .000081894 11 1 -.000588616 .000000000 .001077008 12 1 .000050174 .000000000 -.000653069 ------------------------------------------------------------------- Cartesian Forces: Max .014085988 RMS .004807448 Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.287494 .000000 -.575944 2 6 0 -1.139760 .000000 .832185 3 6 0 .139720 .000000 1.399949 4 6 0 1.286060 .000000 .570585 5 6 0 1.145680 .000000 -.822152 6 6 0 -.145514 .000000 -1.401628 7 1 0 -2.293168 .000000 -1.019214 8 1 0 -2.023420 .000000 1.483088 9 1 0 .268850 .000000 2.490341 10 1 0 2.289968 .000000 1.015514 11 1 0 2.027537 .000000 -1.475226 12 1 0 -.262729 .000000 -2.494375 --------------------------------------------------------------------- Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.223839 -.701439 .000000 2 6 0 -1.216739 .714401 .000000 3 6 0 .000000 1.406478 .000000 4 6 0 1.223069 .695110 .000000 5 6 0 1.221757 -.704683 .000000 6 6 0 -.005475 -1.409577 .000000 7 1 0 -2.180497 -1.242433 .000000 8 1 0 -2.160697 1.274288 .000000 9 1 0 .020157 2.504304 .000000 10 1 0 2.177804 1.237580 .000000 11 1 0 2.164136 -1.266910 .000000 12 1 0 -.013542 -2.508563 .000000 Keep R1 and R2 integrals in memory in canonical form, NReq= 853085. SCF Done: E(RB+HF-LYP) = -229.407662416 A.U. after 11 cycles Convg = .4498E-08 -V/T = 2.0174 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 .001605735 .000000000 .002639443 2 6 -.004383118 .000000000 -.005230866 3 6 .009893921 .000000000 .001252948 4 6 -.000180976 .000000000 .005768532 5 6 -.005787290 .000000000 -.008569960 6 6 -.001176015 .000000000 .002421384 7 1 .000684172 .000000000 -.000244551 8 1 -.001272181 .000000000 -.000577664 9 1 -.001322142 .000000000 .000443100 10 1 -.000250425 .000000000 .001117694 11 1 .001385365 .000000000 .000549608 12 1 .000802955 .000000000 .000430331 ------------------------------------------------------------------- Cartesian Forces: Max .009893921 RMS .002943249 Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.286437 .000000 -.574965 2 6 0 -1.141743 .000000 .828844 3 6 0 .142008 .000000 1.400813 4 6 0 1.286751 .000000 .572371 5 6 0 1.143674 .000000 -.825800 6 6 0 -.144949 .000000 -1.400967 7 1 0 -2.289910 .000000 -1.019479 8 1 0 -2.025534 .000000 1.480725 9 1 0 .267651 .000000 2.491631 10 1 0 2.291553 .000000 1.015070 11 1 0 2.027032 .000000 -1.478271 12 1 0 -.264137 .000000 -2.492018 --------------------------------------------------------------------- Largest concise Abelian subgroup C1 NOp 1 Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.221977 -.701722 .000000 2 6 0 -1.219547 .709523 .000000 3 6 0 .000000 1.408000 .000000 4 6 0 1.222431 .699188 .000000 5 6 0 1.221041 -.706284 .000000 6 6 0 -.003031 -1.408435 .000000 7 1 0 -2.175523 -1.245138 .000000 8 1 0 -2.164555 1.268982 .000000 9 1 0 .015030 2.505927 .000000 10 1 0 2.177482 1.240932 .000000 11 1 0 2.165678 -1.266375 .000000 12 1 0 -.011616 -2.505943 .000000 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.407806875 A.U. after 9 cycles Convg = .3555E-08 -V/T = 2.0174 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 .000631849 .000000000 .001501021 2 6 -.000781362 .000000000 -.000537084 3 6 .006271823 .000000000 -.000516273 4 6 -.000848332 .000000000 .001936898 5 6 -.002654036 .000000000 -.003756613 6 6 -.001395199 .000000000 .001392531 7 1 -.000428562 .000000000 -.000722380 8 1 -.000846084 .000000000 -.000937278 9 1 -.001189392 .000000000 .000412296 10 1 -.000168388 .000000000 .001117814 11 1 .000753344 .000000000 .000844299 12 1 .000654339 .000000000 -.000735232 ------------------------------------------------------------------- Cartesian Forces: Max .006271823 RMS .001491439 Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.286332 .000000 -.573201 2 6 0 -1.140738 .000000 .828201 3 6 0 .146063 .000000 1.401869 4 6 0 1.288419 .000000 .572659 5 6 0 1.141078 .000000 -.828583 6 6 0 -.146753 .000000 -1.400600 7 1 0 -2.289842 .000000 -1.018995 8 1 0 -2.026447 .000000 1.476633 9 1 0 .265505 .000000 2.493235 10 1 0 2.292573 .000000 1.016586 11 1 0 2.026465 .000000 -1.477391 12 1 0 -.264741 .000000 -2.492298 --------------------------------------------------------------------- Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.219762 .704444 .000000 2 6 0 -1.221328 -.704500 .000000 3 6 0 -.001479 -1.409427 .000000 4 6 0 1.221233 -.704061 .000000 5 6 0 1.221045 .704907 .000000 6 6 0 .000000 1.408298 .000000 7 1 0 -2.171224 1.252608 .000000 8 1 0 -2.169917 -1.256881 .000000 9 1 0 .003326 -2.507299 .000000 10 1 0 2.173530 -1.250435 .000000 11 1 0 2.169353 1.257695 .000000 12 1 0 -.003324 2.506348 .000000 --------------------------------------------------------------------- Convg = .9208E-08 -V/T = 2.0174 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 -.000834522 .000000000 .000405850 2 6 .001150508 .000000000 .000934252 3 6 .002585182 .000000000 -.001554040 4 6 -.001595086 .000000000 .000227610 5 6 -.000783383 .000000000 .000058304 6 6 -.000303062 .000000000 -.000405921 7 1 -.000131873 .000000000 -.000286858 8 1 -.000773314 .000000000 -.000170366 9 1 -.000505128 .000000000 .000443642 10 1 .000148138 .000000000 .000574387 11 1 .000719652 .000000000 .000056017 12 1 .000322889 .000000000 -.000282878 ------------------------------------------------------------------- Cartesian Forces: Max .002585182 RMS .000704382 ... cutting ... Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.287901 .000000 -.571883 2 6 0 -1.139254 .000000 .829340 3 6 0 .148459 .000000 1.401534 4 6 0 1.288039 .000000 .571833 5 6 0 1.139224 .000000 -.829431 6 6 0 -.148567 .000000 -1.401444 7 1 0 -2.291710 .000000 -1.017845 8 1 0 -2.027589 .000000 1.475412 9 1 0 .263970 .000000 2.493836 10 1 0 2.291737 .000000 1.017969 11 1 0 2.027439 .000000 -1.475669 12 1 0 -.264199 .000000 -2.493766 --------------------------------------------------------------------- Largest concise Abelian subgroup C1 NOp 1 Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.220323 .704640 .000000 2 6 0 .000000 1.409148 .000000 3 6 0 1.220477 .704842 .000000 4 6 0 1.220389 -.704785 .000000 5 6 0 -.000068 -1.409181 .000000 6 6 0 -1.220444 -.704704 .000000 7 1 0 -2.171655 1.253715 .000000 8 1 0 -.000500 2.507578 .000000 9 1 0 2.171547 1.254325 .000000 10 1 0 2.171795 -1.253667 .000000 11 1 0 .000227 -2.507612 .000000 12 1 0 -2.171601 -1.254101 .000000 --------------------------------------------------------------------- SCF Done: E(RB+HF-LYP) = -229.407888780 A.U. after 11 cycles Convg = .1595E-08 -V/T = 2.0174 S**2 = .0000 ***** Axes restored to original set ***** ------------------------------------------------------------------- Center Atomic Forces (Hartrees/Bohr) Number Number X Y Z ------------------------------------------------------------------- 1 6 .000021922 .000000000 -.000265335 2 6 -.000191710 .000000000 .000134552 3 6 .000255200 .000000000 -.000172381 4 6 -.000270035 .000000000 .000329925 5 6 .000247281 .000000000 -.000022111 6 6 -.000116330 .000000000 -.000023417 7 1 .000030973 .000000000 .000037598 8 1 .000068760 .000000000 .000007259 9 1 .000041400 .000000000 -.000032643 10 1 .000002776 .000000000 -.000050334 11 1 -.000063857 .000000000 -.000000129 12 1 -.000026380 .000000000 .000057017 ------------------------------------------------------------------- Cartesian Forces: Max .000329925 RMS .000117682 -- Stationary point found. ---------------------------- ! Optimized Parameters ! ! (Angstroms and Degrees) ! ------------------------ ------------------------- ! Name Definition Value Derivative Info. ! ----------------------------------------------------------------------------- ! R1 R(1,2) 1.4091 -DE/DX = 0.0001 ! ! R2 R(1,6) 1.4093 -DE/DX = -0.0001 ! ! R3 R(1,7) 1.0984 -DE/DX = 0. ! ! R4 R(2,3) 1.4091 -DE/DX = 0.0001 ! ! R5 R(2,8) 1.0984 -DE/DX = -0.0001 ! ! R6 R(3,4) 1.4096 -DE/DX = -0.0003 ! ! R7 R(3,9) 1.0984 -DE/DX = 0. ! ! R8 R(4,5) 1.4091 -DE/DX = 0.0001 ! ! R9 R(4,10) 1.0984 -DE/DX = 0. ! ! R10 R(5,6) 1.4091 -DE/DX = 0.0001 ! ! R11 R(5,11) 1.0984 -DE/DX = -0.0001 ! ! R12 R(6,12) 1.0984 -DE/DX = -0.0001 ! ! A1 A(2,1,6) 120.0033 -DE/DX = 0. ! ! A2 A(2,1,7) 120.0096 -DE/DX = 0. ! ! A3 A(6,1,7) 119.9871 -DE/DX = 0. ! ! A4 A(1,2,3) 120.0134 -DE/DX = -0.0001 ! ! A5 A(1,2,8) 119.9723 -DE/DX = 0.0001 ! ! A6 A(3,2,8) 120.0142 -DE/DX = 0. ! ! A7 A(2,3,4) 119.9846 -DE/DX = 0.0001 ! ! A8 A(2,3,9) 119.9945 -DE/DX = 0. ! ! A9 A(4,3,9) 120.0209 -DE/DX = -0.0001 ! ! A10 A(3,4,5) 119.9953 -DE/DX = 0. ! ! A11 A(3,4,10) 119.9778 -DE/DX = 0. ! ! A12 A(5,4,10) 120.0269 -DE/DX = -0.0001 ! ! A13 A(4,5,6) 120.0121 -DE/DX = 0. ! ! A14 A(4,5,11) 119.9764 -DE/DX = 0.0001 ! ! A15 A(6,5,11) 120.0116 -DE/DX = 0. ! ! A16 A(1,6,5) 119.9913 -DE/DX = 0. ! ! A17 A(1,6,12) 120.016 -DE/DX = 0. ! ! A18 A(5,6,12) 119.9927 -DE/DX = 0. ! ! D1 D(6,1,2,3) 0. -DE/DX = 0. ! ! D2 D(6,1,2,8) 180. -DE/DX = 0. ! ! D3 D(7,1,2,3) -180. -DE/DX = 0. ! ! D4 D(7,1,2,8) 0. -DE/DX = 0. ! ! D5 D(2,1,6,5) 0. -DE/DX = 0. ! ! D6 D(2,1,6,12) 180. -DE/DX = 0. ! ! D7 D(7,1,6,5) 180. -DE/DX = 0. ! ! D8 D(7,1,6,12) 0. -DE/DX = 0. ! ! D9 D(1,2,3,4) 0. -DE/DX = 0. ! ! D10 D(1,2,3,9) 180. -DE/DX = 0. ! ! D11 D(8,2,3,4) -180. -DE/DX = 0. ! ! D12 D(8,2,3,9) 0. -DE/DX = 0. ! ! D13 D(2,3,4,5) 0. -DE/DX = 0. ! ! D14 D(2,3,4,10) 180. -DE/DX = 0. ! ! D15 D(9,3,4,5) 180. -DE/DX = 0. ! ! D16 D(9,3,4,10) 0. -DE/DX = 0. ! ! D17 D(3,4,5,6) 0. -DE/DX = 0. ! ! D18 D(3,4,5,11) 180. -DE/DX = 0. ! ! D19 D(10,4,5,6) 180. -DE/DX = 0. ! ! D20 D(10,4,5,11) 0. -DE/DX = 0. ! ! D21 D(4,5,6,1) 0. -DE/DX = 0. ! ! D22 D(4,5,6,12) 180. -DE/DX = 0. ! ! D23 D(11,5,6,1) 180. -DE/DX = 0. ! ! D24 D(11,5,6,12) 0. -DE/DX = 0. ! ----------------------------------------------------------------------------- GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad Input orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.287892 .000000 -.571874 2 6 0 -1.139246 .000000 .829348 3 6 0 .148467 .000000 1.401543 4 6 0 1.288048 .000000 .571842 5 6 0 1.139232 .000000 -.829422 6 6 0 -.148559 .000000 -1.401435 7 1 0 -2.291702 .000000 -1.017836 8 1 0 -2.027581 .000000 1.475421 9 1 0 .263978 .000000 2.493844 10 1 0 2.291745 .000000 1.017978 11 1 0 2.027447 .000000 -1.475661 12 1 0 -.264191 .000000 -2.493757 --------------------------------------------------------------------- Distance matrix (angstroms): 1 2 3 4 5 1 C .000000 2 C 1.409085 .000000 3 C 2.440800 1.409117 .000000 4 C 2.818431 2.440914 1.409627 .000000 5 C 2.440751 2.818329 2.441069 1.409144 .000000 6 C 1.409345 2.440872 2.818672 2.440832 1.409115 7 H 1.098415 2.177211 3.436251 3.916846 3.436104 8 H 2.176822 1.098430 2.177302 3.436546 3.916759 9 H 3.436122 2.177059 1.098392 2.177800 3.436593 10 H 3.916814 3.436172 2.177329 1.098383 2.177423 11 H 3.436322 3.916760 3.436403 2.176919 1.098431 12 H 2.177521 3.436386 3.917097 3.436181 2.177064 6 7 8 9 10 6 C .000000 7 H 2.177202 .000000 8 H 3.436135 2.507208 .000000 9 H 3.917064 4.343202 2.507674 .000000 10 H 3.436371 5.015229 4.343481 2.507991 .000000 11 H 2.177272 4.343346 5.015190 4.343592 2.507605 12 H 1.098425 2.507816 4.343261 5.015489 4.343396 11 12 11 H .000000 12 H 2.507613 .000000 Stoichiometry C6H6 Framework group CS[SG(C6H6)] Deg. of freedom 21 Full point group CS NOp 2 Largest Abelian subgroup CS NOp 2 Largest concise Abelian subgroup C1 NOp 1 Standard orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 -1.220323 .704640 .000000 2 6 0 .000000 1.409148 .000000 3 6 0 1.220477 .704842 .000000 4 6 0 1.220389 -.704785 .000000 5 6 0 -.000068 -1.409181 .000000 6 6 0 -1.220444 -.704704 .000000 7 1 0 -2.171655 1.253715 .000000 8 1 0 -.000500 2.507578 .000000 9 1 0 2.171547 1.254325 .000000 10 1 0 2.171795 -1.253667 .000000 11 1 0 .000227 -2.507612 .000000 12 1 0 -2.171601 -1.254101 .000000 --------------------------------------------------------------------- Rotational constants (GHZ): 5.5842576 5.5834890 2.7919367 Isotopes: C-12,C-12,C-12,C-12,C-12,C-12,H-1,H-1,H-1,H-1,H-1,H-1 ********************************************************************** Population analysis using the SCF density. ********************************************************************** Orbital Symmetries: Occupied (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') (A") (A') (A') (A") (A") Virtual (A") (A") (A") (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') (A') The electronic state is 1-A'. Alpha occ. eigenvalues -- -10.00629 -10.00593 -10.00592 -10.00527 -10.00526 Alpha occ. eigenvalues -- -10.00478 -.79960 -.69645 -.69637 -.55662 Alpha occ. eigenvalues -- -.55653 -.47847 -.42362 -.39064 -.37577 Alpha occ. eigenvalues -- -.37572 -.30973 -.29696 -.29683 -.19235 Alpha occ. eigenvalues -- -.19225 Alpha virt. eigenvalues -- .08906 .08920 .25009 .33941 .39362 Alpha virt. eigenvalues -- .39377 .44512 .45615 .45633 .58142 Alpha virt. eigenvalues -- .58158 .58995 .59027 .74246 .79642 Condensed to atoms (all electrons): 1 2 3 4 5 6 1 C 4.804367 .500664 -.028552 -.011274 -.028561 .500583 2 C .500664 4.804306 .500682 -.028552 -.011267 -.028550 3 C -.028552 .500682 4.804426 .500459 -.028539 -.011266 4 C -.011274 -.028552 .500459 4.804434 .500684 -.028550 5 C -.028561 -.011267 -.028539 .500684 4.804301 .500653 6 C .500583 -.028550 -.011266 -.028550 .500653 4.804354 7 H .388670 -.024870 .001357 .000032 .001357 -.024879 8 H -.024897 .388664 -.024863 .001356 .000032 .001357 9 H .001357 -.024884 .388670 -.024843 .001354 .000032 10 H .000033 .001356 -.024878 .388668 -.024858 .001356 11 H .001357 .000032 .001357 -.024891 .388661 -.024866 12 H -.024855 .001356 .000032 .001357 -.024883 .388669 7 8 9 10 11 12 1 C .388670 -.024897 .001357 .000033 .001357 -.024855 2 C -.024870 .388664 -.024884 .001356 .000032 .001356 3 C .001357 -.024863 .388670 -.024878 .001357 .000032 4 C .000032 .001356 -.024843 .388668 -.024891 .001357 5 C .001357 .000032 .001354 -.024858 .388661 -.024883 6 C -.024879 .001357 .000032 .001356 -.024866 .388669 7 H .586481 -.003497 -.000032 .000002 -.000032 -.003489 8 H -.003497 .586507 -.003492 -.000032 .000002 -.000032 9 H -.000032 -.003492 .586437 -.003484 -.000032 .000002 10 H .000002 -.000032 -.003484 .586455 -.003493 -.000032 11 H -.000032 .000002 -.000032 -.003493 .586500 -.003493 12 H -.003489 -.000032 .000002 -.000032 -.003493 .586456 Total atomic charges: 1 1 C -.078892 2 C -.078936 3 C -.078886 4 C -.078882 5 C -.078934 6 C -.078894 7 H .078900 8 H .078894 9 H .078914 10 H .078906 11 H .078898 12 H .078912 Sum of Mulliken charges= .00000 Atomic charges with hydrogens summed into heavy atoms: 1 1 C .000007 2 C -.000042 3 C .000028 4 C .000024 5 C -.000036 6 C .000018 7 H .000000 8 H .000000 9 H .000000 10 H .000000 11 H .000000 12 H .000000 Sum of Mulliken charges= .00000 Electronic spatial extent (au): = 461.2620 Charge= .0000 electrons Dipole moment (Debye): X= .0001 Y= .0000 Z= .0000 Tot= .0001 Quadrupole moment (Debye-Ang): XX= -30.3009 YY= -30.3015 ZZ= -35.1853 XY= .0003 XZ= .0000 YZ= .0000 Octapole moment (Debye-Ang**2): XXX= .0013 YYY= .0005 ZZZ= .0000 XYY= -.0006 XXY= .0002 XXZ= .0000 XZZ= -.0001 YZZ= .0001 YYZ= .0000 XYZ= .0000 Hexadecapole moment (Debye-Ang**3): XXXX= -257.9243 YYYY= -257.9530 ZZZZ= -28.5979 XXXY= -.0013 XXXZ= .0000 YYYX= -.0072 YYYZ= .0000 ZZZX= .0000 ZZZY= .0000 XXYY= -85.9736 XXZZ= -54.6563 YYZZ= -54.6603 XXYZ= .0000 YYXZ= .0000 ZZXY= -.0020 N-N= 2.013231756322E+02 E-N=-9.334409434559E+02 KE= 2.254910638781E+02 Symmetry A' KE= 2.180186910171E+02 Symmetry A" KE= 7.472372860987E+00 Atom 3 needs variable 1= 1.4091173188 but is 1.4090849304 Input z-matrix variables are not compatible with final structure. 1\1\GINC-STUFF\FOpt\RB3LYP\STO-3G\C6H6\TONE\21-Feb-2003\0\\# B3LYP STO -3G OPT\\Optimization and Mulliken Population of BENZENE (C6H6)\\0,1\C ,-1.2878923359,0.,-0.5718741246\C,-1.1392456583,0.,0.8293483796\C,0.14 84674499,0.,1.4015429\C,1.2880477719,0.,0.5718419584\C,1.1392321092,0. ,-0.8294220522\C,-0.1485589543,0.,-1.4014352318\H,-2.2917018458,0.,-1. 0178363342\H,-2.0275805898,0.,1.4754207275\H,0.2639784974,0.,2.4938444 491\H,2.29174519,0.,1.0179776844\H,2.0274471941,0.,-1.4756605774\H,-0. 2641907403,0.,-2.4937569254\\Version=x86-Linux-G98RevA.5\State=1-A'\HF =-229.4078888\RMSD=1.595e-09\RMSF=1.177e-04\Dipole=0.0000127,0.,0.0000 459\PG=CS [SG(C6H6)]\\@ ONLY A FOOL KNOWS EVERYTHING. -- THE CHEMIST ANALYST, SEPTEMBER 1946 Job cpu time: 0 days 0 hours 39 minutes 17.6 seconds. File lengths (MBytes): RWF= 10 Int= 0 D2E= 0 Chk= 6 Scr= 1 Normal termination of Gaussian 98. xcrysden-1.6.2/examples/GAUSSIAN_files/N2O_homo+lumo.cube.gz0000644000175000017500000015751211712736221022151 0ustar tonetone‹„X>N2O_homo+lumo.cubeì½Ë®-IÏ-ÔßO‘§,ÅýÒFuDNƒ'„Ò‘¸¼?vx8ˆbíü¿jý¹çœ™‘a{Ø1üü·å?ýÿóùü×ÿñù_ÿ·ÿáù?þûÿü¿?ÿá?ü‡?Ï÷_ýÇç¿ù_ÿóÿô?þŸÿù¿ÿßžÿt®ýyžç­úþj)÷4ÿïÿÝÿcç¹ð/ó~ð¿¿êœ»uûï¤ÿ»ÿûþ—÷Õÿç§ð/kþûžûSø—ÏÔÿóÿú/ùßoù«Œ’ÛüWŸzÞ¿ò’'µO-ý?¿øTù+·¶“®ÏSðèx \äïüWË}ì¿ßÔ°¦k­:ôùPÍ¥g»2þ*+ÍjWê_ò‰žìÊþ«·>ôŸÉ×õ¿Jš«Û¥üW5ãßU<]^­5¿²JOË®lY¿‘Îɲ¬–ñCUï.÷Uô/\}·l’ïî½òÊê«W¿Ò“\ó+sï2ùuòmmú¥VÛõ¡•ºÝÜÝœE×D¯´=†=Ä»ä‡RÚçaåêܼ¡Ôä9l…ä¾óL3®´qþÙú«­žùÏæ®y»ëµ™ÖòÕ/mçf¢¬Ñø^fóç[ Y|w××¼—~·|¼Ì9ZYþKK¬e؇†l‡¼’_)»v»»wâÉÏ;—7¶rÒÏÈÃÊ/õRÆò Tl;È•–Òè~¥–\›Þ|ìŒ:ý÷ÔS;_7°ýWáKï=Ûw¿M¥ÌWö^¾=«¼ŠÌ-4Ö(çëäßÕR÷]—5ŠM˜Ûð[]r?ÓïnÊóuûC6n9WþàäÁËy Ù]uíf—°ü©Ÿ÷,OQkMÓ}Ž;<•²mÁåÍâgס·YÎKÇ~(¾’ò%enIÙB™›uË‹á–ìež½×\’.¸ípÙ(þ6›Ü]ö}\`™¾÷›˜Ò(ݯ4Ù“¼ÒG¢ý•¿äQÝþê_²ú«ú‡úÌ™V¶ö¹ýºšŽ™Êö&»•_—G[)LndîO±„BS+­NC—¥ãw/±ô̵“­–¸ñF2ߥÿN,ÉQVhÍã†Ô!ŒÅ7‹;w'ûaÍž‹[™ü;_}±‘tÝ÷nþžo­Ùhè»ÛKúƒKØûgõųÂsgªßÅJy¥åÙ ×[œä<;Û!×îoiÍrnU6µ8ã¶Ýzúš¾÷±=ÇLn=CìÙ ¦É«È¾Yų–ÜùG¯¾Bxl(Þ]¾W÷_[ÞK9#–ÞÍ‹¨-‰õ™Sú£Ñ¢Äh1ë>¿$f!–^7eÖ’ÜKŠ£PwÖ/°.»Ëw¸¼ÀÜü¥cíɽ/ûsp;TyMÇ`äWK^±%·YuÇ8†Çx2¹ÓåŽ1Rš_COůˆc-ç¥?°‘ì{Müljiø‡ä-åáw×z:A_W¦ÿYï“_'Þ%L®ŒÑyæ¹±·BƒÙkŸòˆ ƒ¹ÃéÈÛR“§-þ ò@9ñ½È6ùæxcâ“Zæoþ¶ÿ’Ä.[I¿NV_0u¤D}Ÿ‡•°»šYp7¤”õŠ:jA£ç»76Jv Uñ2ÇäSˆÍ§èÀÍ'ØËÝ ÞŸÓßX—¯¦™ ÒJnCžŽ_¾;ÑmË«HýDPÍN§C­äÝ×d–gX²(‚ÝغäÜj³5Çq@Þé˜)â_‰èX¼Puü)[²öÆ’ÇÊLH%ÙÓM ~úXîŽù‘¸fY,ϰd»·Ú,Ä‹(€ÁÈÖc ¼'¯ìÊv‡kÔR ÔΑAúV3”"‘rrã¥êOÌBî!ÌBÌjúÞ——^#K(™¹Ã%ÇžŒ#3oÿЂ)Å•…„Ò®®”˜I·¶ä½ÌóuÈÄšæ å@oÍGŠ^É{$¿"Øío=žìMwn‘t¨(4{I«ÓG²‡/v#m#£¼ËM.Ñ´¹w¨«“N©Êí™9k1ÆpœæGòÒuwé•ÌÍŠÈ_Ž)ýÑJXs€×œê Lî°PúX§rG&( „_¬ûFï£ðý¥±[*„FßÔò^OŒR¸°º|d7Úߢ9ãÒÌQ7SGÝjæþÛX¼CFÁg‘iÊVÜ9·ƒ¬BTpÌx#›PàÔúÛS"Y”ÄHTò¶ÜòÏ©ç4Þ‘¬C SzcZ¶û<Û¹j^¹!?ªÇ”¥Œ[q{²ÆÇ‡wÄ‘J?ÔZôîâjfx(ñ¾ÃåJÐ;µ³Sýî=ÜÏñ³Üûy÷óÝZw(Ý#Œì(¹2Ü,$ÍÓí®O#7—7¿n2-š,yÕàØŸLìùÄ/ž¤á6‘ÒÊÝw¡ü3y3Qê«ÇXtÙ×/}­â?+)¿lCJ»Ÿ‡ÇXvãoÃ2â°¾õµiK,lY §Š6w%Q’î8KRÌ'ÔUôH²Ôél9D—´Ç¿ÉRÚˆ§eéze{¥E·ÕáiÒŸsKÉ–'¯ÈnnBqC…F&wt¬ ÏQ.KÄ‚wWm@¸»z‚=–84ê8›ìõ8¹‡Ù<ùÂN˜BƒAvÊ:”@eÈÅK'(/b$Lˆ'4ëèi%0”l‡šC¢kó`WO«HËÒêF™4‹VKš±ÃÇJ~Eö÷y™Ø…oª_‘øpE˜Ö-¦›-5Øú¡ÖÆì¾ðgš’<ÜÔ1ÆI“„Ï3¬‚ eóå7$¯,1ö6Úç!:^E¼†ä‰çëÄñKž_#ø¤”š€«½ø^ÚŠ.@ù<¬.dÎa0‚t[,øè+|xŸ'ò¿(ó¸ävÿN\~'.ÿþʼnK±æ~ž©k jóÑ%¦3,¥mMC ý’M¬Õ•·oI™w¢°‰3åÜû’ñÑÇUI}‡û¡šØÀU=¼@_±[+÷ñ7BèëZÑ?šWTBÑ4B‚ õÍä«—quiWS‡ãëÆ¶Ë:ý1ËÒK ÄßÒÞÍwa—u¤ÁH¶½J ï‰p¨ËÆÚÕ”·$"hD¹4'¯Ô1¼¨h°‚™“ÄO‰^=ñî—ðïz%™ßQÁ)k2‚¢´SÜ‘MAŒ!Aü‹g±b0%†jb Q«ǽ!+œa$zíø: Ûã+vHn#ó/Ä5Fypÿ£0ŽâÖS‹¸Á ·±–|]ábŒ‰¦„.aåÝ †ê4¥“wëÜ’„æhóäÎvâ²Ö寽Q^ð8"¯[kÉey¥\Ë3î’X>¼rP»6ÔØþ‡%—“€C`saS%fzÒ¡l˜IzŽ,Q½‡çï8|òŠ„<ßû‚t%§r¼·¢D,Vê%T¯V´òNäë’sY4ì+r˜,ÿ£ÉÉ/îO ˆxàN¿±†„е£‚‰˜HfµWüôfÛ_Ò÷Ê÷"¡0}WT¶[÷ú‹æËËéâlJŠ€,x¿ÁÊbEQ‰9}Z<ÉŠv ¯ NoÜ’£îMÕPõæÎíÛ+p(VXåÞ fKî|–u£Ú{Ùßê‰Tì²1F!D1{««^F‰™VÖV;Ë…ò—`Þ¬~åΕ2hJClÜ]9)­‹bšsâ²Z(:˜3{³­{ºeÚ/^é±.ý>ºeW• ¨Îo·kÛŒ4¢y#Ùmãfm©$fyâê½4ƒ*Y"3iƒÂ次Šë;åõÙ£JÖgTYä¹ûéåi-Ìsqm1,É $¼;ù†É+âP 3¬Ò;w8i%¸,²5ŽÁþµ±l0Z¯\† ˜bˆ èër6mwüSKÍ_Å<®µ«ê‰„†¼Z¼* Ô;ëÀº'«€Nו'–Â`!á*›·Ô´.{Ж<¬„6àeC¥æXÂHc„É9…õH–‘™ÝHÂТèÝ%bÙPa´³E•³²Ö)Y§(+çÆþþÚÕ›£’¡tXü.qmzMvOòU×Mü XQkdéÓŠ½Ö‡w¼™@È÷u†„‚õ÷5–˜å5½þ©Äáý(­¹T‡Wx»DµI`xTˆsó‚WÓ´3ø ÉðgÑNGÎ5ªŠbXõ0Q@MÛ+)AÎ;4fô‡6ËLÓêÚSñŠÎàcÕl:¼æ Eò‰E7˜Èà0‹Ä·%/ßúi éf•øp‚!L Ì7„-©fTw”í°ñr!‹§&w™¸Ò p”Ó°[‘,¥C úcµ>ï‹*·’%ÝìõSx×7VäB`‚deWCx޽SŒÕϾ¡d âd¯DPÅæ lö-„ Gcü·ÖîT\×¢•µ5fùïÉïÞ5ö“Ïðs”f¿ì°àI²ÖBªãI•ymF%Á¼Ë;ý(Ÿìˆ p’‘¸¦R¢{ âÅLÚîÝÑÞê‰^RL.sQ–$®ît‘iÖàe D1öҌ事~1+ÏbåW»¡”rzé³sP<¼ ùî~q!’@7ÒÂ’ ¹dD¶ÛjÞÜ×Ô¾&’ŸQ'u¤ìQ‚0³“º@ˆÛìÃl‡WÕÛ;ý²‡dl:~YþÊ–VnKéä! Ê2âR—\ŽD_Ùx^?“+‚¢ÙéßeFHüc;5/fº-!™‹ïE|Ú‰QZ¿æfÅÚÍ ë51Ó KnrÜÖΙÇT¦sÀ+¨M›~QßèñŒ2¼Ã ¬ÕLjÝÅ}äØvÄ×­IÄ"(l/h›ýíáTþÕ —Üs6n¨Ùöྗšô1ç=‘0¨]±è¦¹³ÛÒ£i^t´d·/bŒŒêœÇñÓÎTÞ˜‡„…mÜÜé6e=Ññ—ƒ Í,Ά²§Ãν;ðuô$Ar …X'ýlÛÛ[óJ¿¼2N@¶÷\¬²VNs¸‡Á™Ò9W”õù¡mDC#_nÃÊFAÜõœ@©H¶¾LVoZüùävNèGÏÝ›tø£ OªðϪ7-´6×^ кjTáwKqC” Ëì¿`.†àp+ùrIÁ1 ©?H yßuW/½ZYYß‹l´íl”•·Ó‹ÑÀQ¥¼xC¨C]}Ѷ|顪U!ô’°Wp–lÂøœH¦-ñ ÿ¢5ìäKÉÒKĨšƒG"0)H ‚ã ±XžÎó)³´†²²ÑÃÍ`FžáZcY«(ù‹±ZþU&†Jâk¸(YË!0‰¿Šæ†­¤7à¢}´ÒN›[RrÐN®Ç@;¼6§›+5Ôª1‡ß¯TD¿2G›txJqZ@ÂRá/‰Å-2sAL"7­CÕ¯“,¨øV“œo~¤åþ|MÑeeœÝñoÈ-Ç)AÔÁ°Ü¨$Ó`ĸÁ #ÍÎæÕê^.qedÆž9VTO˜eÇ`4Ó¼˜Ç»Ã1Ø6‚¶ßWn+Buªý>X´/X¼þ·)ûJÜŸ‚”Ç,VnW}^¼é‰ÛkW"`¡âRè‡Ä+E''§¥¾5!¾<ª¢Žš" p›Ã’þÉ?Án>_¯w7G¤Á5 Þ:©­°ý#Ñt'Ì™Z¶~"ÚN=ûÞG.>ü•5åCEÒÑ-ìZÒ±6!,ŠÿÉ=ðF7 ¦å{_BÔÞ´ ta0©7Í¢ B'†ZÍŠ«†èŽõ$‰±@ôÊ¡v‰rÝ©åØ6Âéîëiç…³â*&/ÍÓ‡ñEñ *‡´úÆìE6Øi9$C®ÚÒµùgœ*èÿ:§äNO.øœ||‰õµÒ`z#ßY éLWžQw!XCiœ‘_PI敜ϑ#±ˆQcæ¿“ 0"¤û11Í-ïÑ*3‚>‚Ë)€ßWP'/ÚÛœ91 wGËr½‰;ÓMœøWR'†ª²×œ| ß; ÀOçc ÅŽ ¹±p$.3ÑN봂¡—ÁGbz§@œâ¶òÙÔ[¹~lå_°•¿ó0ÿ¾ó0ßy˜_œ‡ùN\ú–üN\ZÀúN\þã‰K@ªÐÈvŸýœŒ¸M=Ç£³íýêÞBncõ#e^2·Ð¸½f±ydì齇؂DÝE+N²†j…W…5$ˆßðš¿t4\grP‰ây¥õAM ì(—£PŒ1C&Mwº†2½$EŒ#ƒ„¸xw}ºV³kçþÌ·¾WHm+ΙÑÎo9Sf 5ÉuõKφ%ÉÛ~Y"‚,ªŸöop…-ºÕ¨pp‡K:YúX=‚E®”qÓ$¶Ð‘‰¨a Æ5Fí‘[RgtÓá‘jó˜ò³7Э›Ó“ª‰ihSÀU;ôY|‡/`DW¤×6½é#U™F£-ZÝʰƣEP)¥3`íZãW%R"@‘¼?…8²bíî®8¼í’â^+#ò„Äâ5ÊË IÄk+´£/X1$Ý%"®hI†gñNyóмs™âÛ!´]AK%w\; E©–}Ò¤ò—ª…ETß’(PPßDY<“º]âƒð0º+ âëÄÆ¸¡$ïaük(%>t¼# ¬{³¢í–³oVÈ^ 2RT\E¥ÃîyÆ„¤ÐI ½xÄäë©]gó˜RÉä¯Eš?jÌŒ­²iR¸Š±ÃU,ÈÒŵM1däâ¾Æ*RfE=p*.•®<’ä hû–;Èô0mú%ƳJôËÑœ·.(…ÿ¬ï5S  +¼„F¶[ZÈǰ fM³h*LkW7¾ôø,W*åQ ˆ›í\ëÔtÇûö‚ÉÔ\€Å«”ËJñϼƅ˜"—¢q™ÇhL-ÚlNÂäq®TL'ò˜H£\Yº¥LŒ<5™ÔZ}¯m-z³º Èvp‰é®¼áL‡_8I_Á*ɵzËá†ÚÊÚ t~ä“:É'K[Ÿ,§¢<ŸieT…ÓGýñ¦õkîU1Y²% w´Ø„À˜ÉMIŒÇkǨJ–^=!¦8ùRÛ÷íÉÒfg”“íª6Ù<Ý:NÀ ¦k.ÀÛsðWlÛ̸ñ9gçÞÏ{ùCüÏ\æÙá­¬èÚ§o³BžÒ¯¬œCW¼âùÙ; 9Z0ÆòÌü:Ù'ÁIž3õ NvºúÝÊ+a+ 4ºÙÏÖÝ`6P¦§ö<öÚô˜WRópºóI‰fÈ Šv®ªë˕ДÄö¹ ÏPÕôTõ̇Y;Ñì3g[aÐÑß§ /¨âš´–¯ ¸Æ‰Ú’ÚçuòWSŽûEÛèÎE‚Ðr ]@ JÞÎ\™ê5=C¶‰¿?)©Ñ¿Uýïì.P­úÕÖi>õCj›·3€þ{n§ìW†D²»¡È³ Œ(Î/°mÊ, ‚„Ó¼_–K/a0sQ=µÁ‡Giæ2ÚIõéjyÏŠNªxÉäËŽ½Ë•Ì\þ "zhòÕ4âeJ:¹È_{å›­µ}’ªÃ&šÅœäz Õ±LÚØ’«8­ù_¢¶yÑÑ#ü:’¹9Ò‹¦Tkw„‡Äu;—5®v¬Ñg/þ›ÊîaŒnFêy\b SI¼»=¶§¨Õ¶˜_$`(&ìæ¬|Drpðu§¥iiu[+øBdƒZjضñ;ÆS£ß€â$ý’ NFÚ yX~hí|ññGоQvßñu&,xÈ—eF°—Ûö‘>`8ÏPóÖíîÒR"Þwn”‘/S¿Šn%„ê¡Y.9ó±ƒišÖÕ%ê XÒœåóà|(FïÏ“}UÕ3ýÜEt «R˜«Ê¾ ¶ ’¿p€g¤*é¼É–ðѸ%eOob(qVa}d&èZô8Û’Á†ð.·8 ÷áœA¼YRÔµ=Ç ¨>”\ð ]ˆ^É_º Îü’‡Ôuæ™ý Ç"Êñ怳éša6ÊLÄ~©85[y–z?ÕSQVÛ®þ-•ÅdP<zìsÄCŸtNœTDlº•´6Å ç 6µÌVÃwµÍ¡x¨l§X‚˜De]|hšæJű§6ƒø/ÿÝïJéñ¡Î¡q¸Õ±/+#ÓT³Nçàèž;$d¦7Û!Ç ‚ Zf¿@àbpÉÄ3_ça$Wi”=GÜÍ5æSHY‘ æ+¸æÜcÔD¿Q|OÎ8M)/šp«iò•ÕtÞ*óš9OZmVQªs`ýnqLlq¬ží}g»v„„8²'i‹ y°ÈK_t6+Ûùªrú 5NMŒž_§V|ä›rý­†xRfû"£ËÖe$À7!87õ`²$_Ñd™ù–ò5 @Œ6†á”9}šŸ998þåÌU/Y” ç~ÎÄ¡äÒJŒY5-øø©¤žìPGœDÜi0’Tš’ÄúÆ,wº8Ÿ1Z˜…Ü#ŒD÷PûÓw¸žsÉ)®”ˇ÷äX ‰]ξmpÚÑG¢éñß’*T?:7ʆCàÝÁäx¢ Dæi¥LÛ–”£ÐzjÞ&1ƒgªÔC•çQÏh£bBÄËiêKcŒ Øñä½E„™{F,“0GWÇîa0²oƒYÖr ˜3Y%ÓípÙiоî.1 ’.ÈòÄi2ÌñƒnÄ.4˜5Ò¢Á‚³˜’¨Æ0[Ámq b+NËáÎ1Ú _pÀ‘åð1æ5á)‘v£Tq¯Ñ²rŒiåÔ—ô¥ƒŸC¶ä<9¶¾˜!a)ÊZ=û8GÐoGıôä!AgkúAH=Š×ˆä1t…>|œ‘>f0c/¢!û3¼ây(§Giá¨NõIzÇ!ì0 õ1šÔe®*‡—Làg‘å* Õ­ÕÈÿÒpܬgdGÇ%ÿŸ““Û¼¬ Ó©ýßI28xE°ö䯎“°™Áôâ¹³V8¦»Â©Óé¢R@ 䡿† æ‰Ø\÷—sÔ`*‚óE˜/Â|æ_D˜/‡ùr˜/‡ù9ÌW%ûªd_•ì×U²¯ãåëÃ|}˜_ôa¾NÿùÐ×éÿ:ý¿ëô\²òqÉ>.Ùo¹d[ù|èc+×­ü ¶òwÆýìwæ;ó‹ó0߉Kß6߉ËïÄå/N\VSûøçæ¢/?îavZ™„Óã¡äÍŠ!ølq¨iµK*¨ŒâK„óù~Üp\§‡jÅEZ`³… aoéj«®Lí¬8kx(»®xâÇB„f4{uÔŒ~vF>™9v"T-l”Ͷ¯K©1YÊó„`kë¤a¥sã&‚±[ÔÂZóƳʯ0‰&æíl¶  ­:•'¾—5ò¿O•]—hJÀ~®“•M"¡²*¯l—ÂÕx½éâ–¸.Úvv-,ë4Žêp™Xò„ÐÝI*gIy ã´D˜¼ÆŽh1)Á…~þŒ’’+b4K£¼ÂˆmÜLW¼)`œµ¹Ìàž!oÓOÊÅ#‚ªþ„’,ðld‡9·”Cµ"åM]2ègWAm­ˆâU­ñèm¥P,ƒÞ­bÎD/YÐ޶N]Íņ ñ¾S¬’ÝÕãe¦åWHt¬ G–8à‡D<ïƒÊwÊmžë•Ýg ÝœBî[‡ÃÏ(It/Ãã à£ß@‡Â»zs€.Ѥ¦DÙ/ °ítôª` ´BN+)40ºÿªxŠ#îê¹¢œ²Ö`W±W+Wº~>ùŠ $sz·"&)d–F=rlÙtBO¨ÜZ)WIbfÿ:AÑchœsÄjàãVжܹDü;[Òœ¤öþu¨V´”âÕÇPCO¡ ’ +¨yϱ”ÈÁø'µ"4Î(–P?~ qé` wg¡ú G+™Ì$Ùh0’>è 5Åmm®Ž:¦òÂB¡vå=‚¯õxeÉú¼É !á`‚rZž£¡œ(a¸Èö±÷2\QVµÍ‹‡jsPJZ®¨miKÞ®E§#ÿ:¨¾¦Æ¸/ðhÚPÝÞX…‘¿nß„°ú:7MI ³ÑÈz&ØÖ.ÑËfi›nòÿQ[,È.ÓMIVØǵßí¹ îሰYY¹´5¼—K{ u£;Åÿ€Uôìòz cdŠƒ8¯fAK-)Í1xäæ\«3 e,lïåA¡oG¦Ž’ø¥´ë–\)êÀϼ[¦ËÊÙÆ­à×uÔÐBgÜ]¹†qÈ5*ÐdÙNÞr9ÂÛuÁJtðüño`J5Ê|šºF*¬§æh ‰‰„„ïÂý}êÜ‚÷'?ƒù0§‡¥;|;Á nGϽ6'ΩfV_|c}\k"V¯¯¹«Ëg¸ hÎKwôh—SΗ÷ë¡›žEØ^ÕászÀ@ÿÁsËBaÈ륅0*kDõÙ ©°$w¦-Á»E7ªI”F  ¥_>¹d-ÔÔ¤ê„t„Ýb£BΉË\ ÌDØ[4tœGqeBïZ+ÏrËî!˜Eqiôâúø ¼Ú¨–’BW<rˆñ«GWÜv¸ì¾¥2w((Ï2¼¸ª,žþÚ}ŠÄÇŒzw:ý¿Øé‡óéÃhŸ0Æ]€lǯ[cz—A)²¤Æ€³Ü` ?ž=éWrwL(AÜY` FîŒzeçÐü¦»ê}.>_9<»’—Â7ÚùÁHó]-­î%fˆSrjš3ÚĶ#Õñ†\´°t©ƒkœ}ó£D¬UëÜpq—Þ{€Äð]úg_ñ¡tÑÇ@àuÕš‹Ç¡5³§ Xô˜²áCì½:‹ @¯ ™æèÞ Î”A’¾]qU# ´¤Ñªd%$m3ŽŒBA¼­Xè%%>\êÅû­ÓØÆˆùˆ&›Yô’¹%]L׺ìµõ\ŒÌGØüËÅIñ}…ŒMqîNMS!ÆÂ–´øƒ«—.I£ó6€İ‘gðÆ:JfNžÅþ,N»QºÉá[§ñ$lö»„2²|µ#c b™%WT—¼ÇÇt—L~‰Yº¼'À@s7]IG#[ûLÁà¾Ý­¬å}»¡kØÁ.Þ€GÛ.o]3zѽÂ×Órˆó?T\õ5èÅmcÇ'•Šíqø ¥qÍPš%ý+Í`ŸÉ1Ò†òpÊÙ{,ùÝ-”À sgôšÿ!™å5,&×Í”hMÂT ûe0˜»teȃ™&fNåhM´æ ®–/g]5¢«ÅÜäU„pM`‘Œ6HŒ²\×. ¡ ½÷`Òb`÷~/eJ‘øœ] 9èÅyùQ ¬Pòý‰ó0Œ=ð<ËIàÚ\ì¾ qZÀ Lzf5mâºþˆk5†ýìS—>ö7sœ‡é»†‚²SfÛqÊ¡út­Íµð5uЪEý§zpˆI‡Ú@+ÍÅ5©•]Zm…“Èœµ5AzñÚ¾ÃQðšT%Ɔá;2ì™RÍ ºÔ|ä­½_öêuꥒ«Z•‰Bì q¸Áèy˜J+ÛÍÏnÅáÉ9¶§7Ú;«ž¾ašGŠôKXk Ý'.˜¦-ú0™e-{EO]‹ÏÁC.ÐÖGd½‰®úáÔéê ÞJ9mUË;w@ÓÑ“t)’Ю؅3Ç@¬Œž4·$»±ôT'ka܇{®YÞê>Ÿ©¡)z ³M‰ÓkмñM:´ÃÇA<:˜aÒ”¿†«_»ÿj‡4jEoNÐA2¸·“…>aæ{‘€£Úœ…OÞμÒb­ù’׸%Ðð³×!4.£OØlB—¥¶ýhX35ÇÐ?Á(Îåß™ça9®#íÌ|°+i1ù ÄÊr$l‰ƒ€Õgþ³r†ˆXìéÖV-§¬¼î8jy Ó‡B»]þUÌ<ÚQÑÕ‰)¶q3m$_ä)ŽS/-mf*’”Í(Îu? ª£©v½òÄMòfú4? †¢Ç&¡š6}œÜ©‡K:â˜_©Ì*¤;<3‹Åp£“/ùØÕ®G(º_ú´gXèû‡cà‰»?x÷’¬aº ³øþVîרãg»œec=Vh'uùÈZ†š˜p¯LS%úú¹JÈaó\ÉÒÙ,Ó¯`2o¨ÏYy«âZbK¦£¥ÑÁïtJÕ3¥z”Mü²83NáÐàPÊ©§h0sIÀ8‹Ÿ„“”hOÏ3îÐ44\Náv&~Ý*= [(J™õ:úQs 7©ø×!é¸,}½îáFÀG£Á ¿Ì‘žý ()×\Œð$†ÂÑ0˜/Â|æ‹0ÿ"Â|9Ì—Ã|9̯s˜¯Jv>ôUɾ*Ùoªd_æ|èëÃ|}˜ßôa¾NÿÙk_§ÿëôÿ¦ÓÿqÉ^Œ—ìã’¯û.ÙÇVöøð±•?¶ò/ØÊßy˜³©¿ó0õ;ó‹ó0߉Ëó¡ïÄ¥™ïÄå?Ÿ¸÷WJe„¨7.*34H0o=â%ÏHzüì)…/ÙH¨:¯™Ð{ï<ˆã$ùÞPÕÉÊ¯ÕÆÝÛ–,QÕ˜šíØk›b0¹ûåPmšÙ°êšˆ%ŒcM&h¶PS#§„m÷ö'¹× YÈÛ<ÎKu–ëU¡b¹#™O£…^Î<âÇ`Fn K qNi†_º"¼Q]!˜ùQ]É5mtKú RAÞåÓ‡5„`)QÞéΣVÈ,ÉÆ èÊ<Ðs ™ÏXpƒdòÆ|·Â¶³çzVöü’sÓÍY¢Ò.®H3!éR]êlܵ>³[!uI°É$ÏX’o½yÔŒ»'5g§ Mè®}„<†üŽÒ(w"3‘Ã@njGž/>Üë4ÃÜFPg[!ßRŽÐ«m!ÏMáIZw¶<ÃÊÖJQÉ‚üAݬ—’‡ìbw…ú×+6¶ï„Ô‘ üg+L[òêtZÂ-³ÔÓŽt$¨i,à8´fdsô0 T¡˜Ô//)›+e”Sç6§[jf>"!Ьc öKw8È'´ I,X¥^Š{yI<”7O·ÆpJiE•:C€z/Bé¡Ô;OŸÉJÛyd~¨ŒYd‡ÅßU²kÛ¡ÐòÐ[.¶7ñC“¡ ZÏL-s‰±W£†·ŽÜ°å‰-oª¶ucîÞ”ä&ƒA¼”æLÝ^šAâsdÎŽSêž Š»Ê¥„çIÝIyPþ²}gN·Œé=•˜`:On¯u•IÐìJ™‚u¨øØ˜±âeÔ4géd€ì:[⢖êΉ„ ò²pî‹[m-‹r£ŒëîRù­1\­ŒqâaI,óÊh¦9C¼}³¢ ­ÁÒhâ¼&Ò8ôFËËAÞVŠ,½ULæ¬EyouŽƒox.¥,WàÅÈÅ7G¹9‘¨ï xm§ Zü+ÁeÙÞe·Æ GÂ(oq Z™@ŒÆ åÊêd‚áaS¢jöqò· …{2M‹Î…åÙÔf¦w˜§ƒoyÝL¼;är%ÔE¤ô`•Ül n/oùE7³tÙj?Ø"¤¡,ÒBG&×5~lî ß‹¸ýÎehµ²5¡b—ÞÃBÛ#‡C/ýľç¥Jud>°r¦šœ,½rÐBÐ àå•Q«EW ÓAžÞ¸«wð¤ºr5Ú¯K ÷´xµÆ²ÀŸP윧êz ˆuüª"<¸Âå‘H2§³û¼*z³%‚‡’ø}(Ž»îš¦|+ªµ” §Ü íÁIÁ+‚d$·¤˜½S+*ŠÂW§Öêô$æË÷'î.lÚ—”Ü2µ]ãm\É×|Šžügn×ø!m±y#*ˆ-b¤‹½fùx¿x’qKöìž æ¼¨*>EõùLZWÉ´ ñ;WfWWYÕù«óùÚ‘¢¶rŒßP©cäxò•K†¤quÆÉÖÉ%S.DpåzeÙ\3{§èO9Œ¬d¹Ò,7ep £¤Ñé—剸-nãâ!vâ€$e!g>8òFÈçiÂÖƒÿ²‹±Ç¬J-·°°PëM–:µy ‰ðzLŽA)l¸¼Þk&FÐä]0ÛCÕ»j@£ý„9ÓuÌ‚ö0{b~¡_-Ë@/:Ïd%Õ‹¦—ßñ•DÉ3oš’ô{–«5_7_Œª‹nŽÝÖE#ÏÜáù¯Î¦Ûnq‡#4rô¸(ÑÅ?$hÖiº z7PµûÊ—)!øbº ös’¤«ÃY¤ö>bù:PÉi™pÙùˆÊ%Ë®P áâèq ¸•‚™“ô*T›üD†&Åu¶¶Bu9÷> “0.«¡— x¨Ä²–F+Cß‹ ÞËÅ éáDLSøêÒ±Yµ%‰P!È2üùÆHÁ%ë³/¦Q’g.·?Y®yͧh%{‹Ì·¤§G<<#éX#‚k>K leÔü—$ÏLqFଯ¸ŽÕ‹ó0²@Á×Ã’ ޹ë8_pú t=àž¯B$‘’[i”Äÿ±Ö"dôAЃ<Š$~•^DòkI´Œ–?TgïWdØÃzòº®£{±®þ<º¥ƒ¼Ï²U³tÙ•#wpQm6w×F ¢éúŒ8еâdƒ¬x€tµé”V?Tom¶,?g¦þáoÉëÞÕÆŒšéQá&{HØbW%†¤µ6óðG´ú!¡šÝ+Æ Uãú= 0ü‡0ƒ/³¤ÅÖ|Ó‘™Ìaêò3ê¶K£Ëëóé5€M­3¯“ ×":—Îæð‚uVÈe§ÆõžáŽFÚrH†˜9év©È )§ƒ ¬E!~ùîg|WcÎX&ï ÀFÖ¶<ßÞ‰ )F‘ˆPŠ.±#­”I/Æ1¿U 8² Qþ!¸2òVÙ‚ƒô܃Ö"fD˜Qêu.a.¿!ìiξ˜`Ix¸QÚÆ¤õä™RŒ„¼˜ Qι53˜ØdbÌ™O¬ì¢˜Ô~e±i‡wðÒ¨ŒlOOó4ôÇ+“ØZ"Žô6/ýŽsi'rYpzkG>¹órrø&µñ¥KZ­6’uCÝ¥0?­“5ʱú!+’dk’ïXâCñ§ì­Á—>K¡w@Ýg%zjp ÂׯâãÐ.‘{Éw»ßÇIÊ8|€èL ‹gƉ˺|¾>”ç5û°ú±¬IMœ“ªÅãIwÊ.ÏTÕL¦¾¶Üƒ80¥A×D &5…‡²l¹´ñìl­„“Œ³Dœ2ñ‡¿s ·é ›m5ÞPž¨\ܨͭ›8¾×¼†áHòÖ"%xéÖfJ %órqÖæt>¡{µñµÝ–PÎÞq5ë(P¼rLjñ³3æü¡Zø£Ò'†ê¼Ž(c¼.ý1æ*’&:þtƒ‘ÿvß Ê'é#$vøpY‡B_QKä:ÖCl9‹b‡tï£ìÙi àl‡Ö F£|HkJÙ¸VÍ?´t'OË¥âk‚'¼5Ìl#ÒjI9¢V+ªÅ>N)άȖ «ÀýܧUÇ$tKÕÔß³‘×ÙOÜJDdp¶Ä7VÛöóØØã:@¶Fw·-±µÕÊ,OV´­PȲ5Q¿?gÔíé{Vƒ™~¶Z?TÌh³FIÌ™•UM s#sÜÝJWR%ðšgä¹+±ßÎõu-ElÅ̸»hs6%NÆPC±ÊP-ˆÓ#ÌÀÐiÏìu¼g\êÑ@/`0Z*þE˜/Â|æ_F˜/‡aÀúr˜/‡ùû9ÌW%ûªd_•ì×U²¯s>ôõa¾>Ìoú0_§ÿ|èëôþßtú?.™èã’}\²_pÉ>¶²o¨­¬Oþ±•ÿ™­ü‡9ñï;S¿ó0¿8ó¸<úN\ÖïÄ¥{‡8qÙPìŒ09{Ý@;vÃ'®£ÊBüºjö×¹tÙQ±^›šgºSˆ2QoÜ+ Fp3R6ݶd­uÐ`ÆÁ"Õ®Íç/Å"¡šVéý–žD÷-‰°…̧Ź"ÕUU––”"TÛëY'{Óµ“,vðùÊÑi59 Adܬ£–i‘÷êI?¶d¿" *8„dòï¾ÚÑRH†æw@e¨XÚg–î./IœÌ345ä¶cktÄûÎex# ꤫h+SB\¸YšÅ¨FÅ·7#°Q’k¬º…›•° â<#ä¯ÀL¥ò¾áŽ[~ˆŒ—¾ä¹Ó`öž‘!#ÍPž}ç¢ûšs@21mßú‚yd$ÄA[Z+Ç¡R%sÆííîþ fQ='R¡¦Q|&‡³ÙÒ…¡¦82Ð ”F÷Wr‹J,Êd:"ibŒkZÒ/¾+zA»¥Ð6O¹Þ ‹ÞÖ‚P ‰?Ý]Iÿ.¡Bº‚i£éwby½¨!ìæs&2Bž1kh·ƒís ;œy¾Ö±4€ª‘¤GÓw®œ^’¨Ýøy4?-éßÔlíTÎ?_wjL«™ô×3}Á\Å<Œ8Ó›^!#,nÑû+âï’uJ©~CVD¹Ñ½ ~ÝeWåð®ìërìðoÈ®ñuÛtÔ 5©…±•¢Þ÷Ñsúcrhsp–Ê?rj{é!O“¡CS:_×þXãËú„–N{ëQžËËÔ a®”·ãBT+è‘£Ä#xHÐjo¨‡K"dzSnWL]Ô¥òȽŠFkr’ìc‹'ó.- ÎÍ›o*„Ê.-bõjüY nÝœSôÒA å2 {cÁk×SE²²²X-’ÄO'ÀT­¿"ù¶ÓWÀÄœQלÎu´>}NŽ1Ý¢í©m6fQe|(}y üLmeyÌl‚Ì÷<ÊsÄ ¥èíéjØZ..×| T<ùð¬%S7ƒ"¦'ýâ>%nÓz$çtdc<"哟݌^5¸r¨ï^|;#*Õý>î5u·Š‰g>ÁG)^Ëc^W­ôæfQ½„ª…éäêqàqA©žþež¦½‚™)îhRyO^¼‹1ëÕT›ÉÉ_(ÚØÚÖ ¤ÁgÛ cËÞ1G9nÅôŒ>ÉÁÁ<çÉÀ;´qµæAV’ߘAN\eFó4!ùò+]¼;ý<ž}Äȯ~i‰|c؇‘W{5eŽH Q—ûùUKØdKMÞÝvJ-±¬…ækãg/ÂX›œO\ T x;)žÏ‰sxò¶+w—Üw'Ö{DÒ1g ¶kÝ=‘ ÓÃÊT9¸ªéŸ‡Pew×úˆö$”DÌ뤖ôçàQ–¹Bµ×ÇäX•Úô¤!§ÔüŽ$Ý#(êc7ÑRн#%ê©LZ°8¥ÔyÍ•£GdÁCj-±‰¡$Ùmü:Ù —çx k ŽÌÒ@ˆâ׃"R[“;\|ÉÏ(0uwk j0 v¶è£µî4V¥ô8%D‹úgÈÆã›,oOUFf7¦Å=L§¦ úè+ú K..YIN‚ÓÁgTfÅv¨>’IÍ"HÍ#±ŽA-‰G#à3®¡š3@´tÚ®²·b RÊ#ÎIŒ£fWJ)åä¹ÃóL£VÀíªH²ÔÑ´¯É\N-ûX›Ô#:Ë–Üá®Rй/‚hÎ॔à$—êç$ðïRŸa­ÇY¹Û%åÿc Rœ°¶àt{ÔvdŸÐzJÚ›Ö#o¹E’¾úˆž<]èËvñ)^ÖB:1b„Àöâq¿p€¡+§w,tã+óŒí‰æ[Ã[Åè-͈#k‘•×T•låÙr£3]Ë Y¶%DÕÝãµÊi[ †Î8æ0Ñ{qs–@ëÝ2´3Â`PøK1Ök.wkZC¯ƒV2 I•ãtð퉪Eþsø@2MòPófjßëòè…±BŽR`J©9íO”8n hf:“å5é† l¯jZ1¹ÜÞjš›l­†:_A«8Çaj±‚||Á¾¡Ð§/NÎiñËÂhœ—°’“K•ÞX|í  L&4šÚ#ÖNÌÊ¡ˆ–î[Û0ÑŽÈú»#oÂL{é4¥Ñk ü‰tqpc»£hMc3³€(3'Ù(›%‰5ÏÃM'£Î}$ŠO–.°ð*¢ª¢m¼ ÀÁ{ÅÞÐCØÛQDçKï©ÆyŒ¤NVDq4$s“Öy|ajI÷¢Kì'‰¿ŒÞhèÞɨ˜÷Ó³`mä€,¥Yªš@/›Ÿí󼌤©Z•ø&nè™5fwITÊa²Ž‹ G²ÎÌ('ìÏ!Û6°ê‰ND”ÓòŸƒã®ã5ÃÀQ6¼Þ‹ ^ÔfCèβVÚM/±[)Á)¥ž¸l7ž€Š ”ÃPÐC/‚Öý,ƒÖ‹ ¥d“Sž;¾ÝS¿"/ÂmDr–˜-‡Ã‰…w'9ÃàF뉱eup¾ª€3è›’Ä1åÉ œR¿‘GÕÒ¯Q›%‰¥l´äÖ“[¶ Lœð`Kñ]Ñ$¡¢@/x!ÐZæ´Œ%ÍQ)_1¹Â8s‘SŽ—>9íI‡¯—¶'y˜½æêLá¦mnXÙá•$²ÍÈX1JŒ¢ÚËT†Ânç¥Ã€M"ܶ¤ìwu#z LöøÐ6c¶=dô¿ #«‡~^ze õΩ³^Ü®šƒ#§{šzÔ'êùgÙ’~ù>rU1eúÖíi¦öOEJüô€…µk<³d7&vJ'´‘üvlع®_w‘|ï·ts9½ ’»—jÕ´¿Ï•Ûr2ô‘5³Ø<­Švõ‡Ån­<7ƒ¦6çó"‘nñ*EãV”ë¯ÁKm͘󇳃á&çàà¬`(¬Fê)+—(` R¾zy(…1KÏ­Mpç•ÈÕ}YµäңشÆÉæ9ޤë /¦Ì¸èVg‡ ØCy3¾·Ü—ƒž¡£5ã¸qi…!Î+V([ñ*[Y¹†Uû–ÌÚ1Ÿ´¥aÜsûв½o³üÜ¡õ»Ýþ´—ζø– *À à bÜEr³@ºÅ„<0ô.«07”—ºÇpÉœÖp³À±'L­ÆSSÂHßæ#ßíãÖ@0Ÿ~ÔWÉÏdÄÁNËYH…ëuóÊLö^ôa÷n;²zYn;çvY™Uõ fqð½ààérƒ‘l”_‡r>4ø,uÏb»Rzˆý$„{™‹Jfì‘Pí%y$å:¢ìCIN¥€ÅŠ­sÝØÏg`bµ!¶5N…£1Œ ñ¼Èeù"Ìa¾ó/"Ì—Ã|9Ì—Ãü‹æ«’}U²¯Jö›*Ùׇ9úú0_æ7}˜¯Ó>ôuú¿Nÿo:ý—Ì7õÇ%û¸d¿à’}leÿÐÇVÖ'ÿØÊÿÌVþÎÜ}çaêwæça¾—çC߉Ëú¸üʼnK¤Amò’X… @7¡-žéGÔ-îýÄDüëð^2'qk Àe& C{ìµkˆI¬Ô]ìÀ²uz¿$®9^ºOî‹G O-^rÊìÅõ ÞÝ]Á7Àa´†µKJw)TzeÐDâÊ‚ýgÝÅ}¸êGìP€²=„ÂCu]+kÙVÝ5fœéoãT/ Ö³A-ßeêð+=’ÌÇÞ‹poÍB”R ÕUG°§Ã×ÏzYpž¡ÿˆíO^s*4ˆTSÞ¤ «)5S‡]!!)qæØò’ýþ…BF*ÄØâR¹ôVÄù…Œ *íü£¯©xªVÿ<S½F©-|«O4òëÓvñ’ uÓµ”ð’Š'*ˆË’ŽfFkmƒdé¼@3 y¨íf!°¹$~ß΋/]Þ¿bh~Ju¡@8; « 4C] Ý’Dï.¾Âu×ÛÖé·è,´ÀK<ÏIÙ1Z9­Òò¥žçd.WÊ©ÿ1x•Cµ)ÃÄ,2cÏ*®À ì'X²qCÍì^[÷ˆ VÓ׳n™B2ÀYFOš);:qÍ}xuy˰$*å‚òss)èv™6SSRPN±»ð’¶]?ƒd 蛀‘P¹õ1xC½÷À~º]JWØŠ»¶æåY£-·ú.Œüâ'ƒŠÄ¡6ý‡`À4ƺÅX»ªóC%•—ì(žduQÉÚâ6"£]óŠ0’2`¬½_7Ó`{YCRMi Jà دK5¦ý9ÛûÙÚ¯¦KV+!J¨e1‡‘˜r–UÅSZèÄ©eŒoN·ÏŤ_öÉ¢7]ìñX%$„øë(‰Û )B@§UOþˆÑAl¨\…?ÉŽBh2Ýã.v¥>·nÉ«Í œk0Ú¢žIv–ã+®z}ðq^ú ?•N|ÐJHÈï ßÍe¿žGRÆ+éo®¿£¤µù‚É£´&ÈÏ"]%Ðy%KÄ,éŸg³ÛR™=»,ÿeå’CäªÖ2´²Û[ްßYá—Kåw¼ö(Ž,] )J;±vâX}‡«ä¿‹ÐtÕ)ÏnÐ3d±IÏ@:øg‹¾K²¿䯊ΥV=l­“ë\u£¶.›LÔ¤YµÉ\[Ò/ùã$äìÝ4‰¬JV{_·˜æ@è]2£’ódÅÀ^p†r¾•”NH¸ëv’8 qrDÂ-.Éã éÝŸW•Y[ì¡Â­F¹îô€¬ô*ÖÂöJ±Ãg©Þ¬ªYU2ôX£AF÷G1¸‚rB=|PŒ5ôÔJ$lâÁ£ÎV6%½`´?X.Ë¥šŠÞ“ÿl—ÌÉ*ëÞbõ{½ôsÁ¨v ¼Î½L<$ toë`sŒu´%¡Œ…dŽþE6GqƒÈêˆÕ_®½0z\Ü)+/·¥bD‰²rרž1=ÏãWvö–Ø«ú¹þï”%1i’£yA3F‹Tu¸ß°rÜUVsžL$ö¸n— Sa@né’ù”<ÂêWKaÎS¬ù@7Œ,2)+3É&o"Ÿ6´a¨ÎLL.„Lù¼—rå–ÊÃäeÊ}k·Å{b†¯¹ÕZñÛ«U$¯ÖcG% ¦‚h¸œm€G/Aï\ÀÇÍ@îJ2$³÷>(ÌgÇ%tØø¡-ð“¸\çfùë»’è¤k‡õü}ʳòu.Rªk+“áR磊=Òƒ‡íèzõºröæTC%¤E¹qïˆuûü"¥;§½ÖÚeq¼&§õé» ,øu§†ÞŒò2=œŠ+ìF7¾%ã#çL¶I[fÈí£¡5çÅ$Z5"ú:ŠÕ§q9#¤Ë2Vº«•Zá× ö¸˜nmzËã7µ•QÃcé°c˜ÊfʰÓÌ K¨èÒ7Ï™ƒ0–æîNQ4%èAaÚCÚ“”DE}K¬Pª‘bMoN¼Þ.9ÐÑ éÅ[²ª²wu§xeòC™[R Oâ–D€Á¾ùȩӚß1…IZó½¶²{w­“2X ’ý•Mx9EoÖÄîl^T!| Öxøà,•R­>ªGÙL$Î!Òò†&ë®A èÝB£¤hqê’ Y/gƒˆwªÌ®aN¿{(”V©{ JÞ;Åv.ØÇ9Úª3oòŽ*RÌ$ÉmºwÇ\†,dùO €E > Ùg' ½zk¾Â!8qëÂI®|LéÜÝŠ¡õÌq²ÈŸ¯€%VšÃäF ²Aiä0j7žžEÓ´¹§WM¾#€’+?+Q1Ñ`Ä5_\2Œ‹æM]¬e"‘òz•Ú);™Ò£ZÅY°Ó1z3ЧR/aÉœvPTÚ:ØL³ÄØŸ¾‡ôDM»gC)ÞIü ÝÌ n­A‡'fZ]›ÞȉÁ³H§˜=% ­í„³$ûœ¿JâH ;Úª²õcTV/“¦«ðo8„æbÝVB‚z—S»BY+AØDÝ6ðgÏ;¨w¢>¼aXBY,ŒsšÅv¡¤ Í×d̳@ÖéMÐVÀ‚óA±ìƒO¬o šˆôWåµ\ÄÏÿ²¹”táT1žfÁɪ±kXåw'qÒ%ÕÁdÈÑ©_|Kyt>l ~5£³ÒúŠ7;ë=ŸpDg° ('AY ÚŽlD~ÔÙÊšçG®³wÔµ4š˜ÔS±,v®Hì0Ó0û{ÎmÂÂ*YBë;3è’ è„‘0á2×*$'J>3.Ù|ÙGœ÷æ°‰s-émæöq•ÀÊ)΂I*Q‚@/)Cj~ -£â’¿‡_ÉgŠ–ž‡‹Æºd>öÝΨ„<¥3t¬57AOo;NË lŠDL iÄy Kö'~¬%ߟ‚fíƒG¶Mnêž”0Q9ôÉ# ×]ˆ`å:ÀÊzŽ€¼ž{ìÂeã ô ÇÝþv[ÄU‰ú½ÙJf9¨“+Ï==4Ø8Ÿi¢VëôiTBZP_ÙzLœ(¢%ÁÁ„ª0ç¹k©œ‘¨IU¿†ÔÓ²¼P×PDòTüb¥ Ô.ƒPEtñîÎG8$e-I|'_fʲŸvÍ¡wˆ³'ðבœäé£4c+½þ.Þ!3œÖ”ZlÉ<9Ð%«hrœø:Tv3‹e ¶l»Ð˜ŠÙÒN«µg¿»Ñ}§¤tæÅšw_)NU»‡lFÖ|çx÷äw·µCŒˆ9N$`dƒŽž¯`™Mú}œó»CŽváTIÄέj õn„2h¬1›mªBª âÉÏkYk¢þÌGßùÆ9½ò4§¸Ï˜ñUϧ¬…m%NÒ!«ÏÏ¥ú˜Bb¶-4âpšx”sNI‡ÁÅ|àZ¥Ây‘âôšb&Üh ô¬-*”w´âî0˜6hÖ>ºIoõ¨÷[¸Y¬} ­úXëí ™EÝÆl䲨[ÒÒ™…i䓼¢Ú‹4Ø’m[ U‘`Kâ˜&ùÀbèð:“€­øˆ!n0³ïL¸ `{GYy‰¨u­«ä/+ñÛ©Á|E˜‘·O/Õ±Wv|Ö*­ù~@qg Z™²ÜâëêAØî’MÒV凇·ú‰DHÙ9½ãƒóâ>n¶vƒ‘e(ÌÒt?Þ'× ýKKvõC-;7˜5—»m5J» -Ñ`$ƒñݘ¾ch*æ\1zIþèY‚œeN¶÷›ÍžÉ üÍÉKeYvšmëZ-ìDçÖ¹8PsnÄÆó0HiÇ![faªà̰f-1ÌOœC8ê–ï—9õ(/ôÒe¢ÐÊãQ¥vƒ1$¾ª:Lº­¨Rš¢ ˆiVa0_„ù"ÌaþE„ùr˜/‡ùr˜_ç0_•ì«’}U²Q%ûú0çC_æëÃü¦óuúÝñþ¯Óÿ‹NÿÇ%ó}\²Kö .ÙÇVöMý±•uÛ|låf+ça·¾ó0õ;ó‹ó0߉˳©¿—õ;qéó'.µ¦ë67±â­¸—ËZ×gô2½F¶'?3 Û.;`}Šl Ý2ŽïFµBÁ ɧ#¿ÇÑUµ€% Â³%(¤´°²)(B™@¼æ{#M¢Â®M{÷á[àÝ5èCyQ yp÷ŠI…x€Käh¡`ÐwAr)?$»GÐB£ Âîâ–L5²§þÝ­šüœijˆ9ŸiîZœ+½Åv66$o½`…„I–i¬Ò“÷`âƒÌ‚vµâ½ôØáâÝ[`‚asºè òUì#£ØLÂbï ç\b_"* t(a0ÀáKÈ/¨ä¸É% :Òl`„|HtÔlu¶æéM÷?Ä÷¹Ô…j&WŠ[ˆC™Åÿ^q¦¿§î9Œv“†ç0hYéÉÌb1éŸØÇái!w&—â“KæH¾,ãžDk=•B?+n(¢Êez? Ï7Û™JÖ¢ú”<ˆ?Å&^A«Ä„Î-Â$Tÿö,H|¿åìO%פI„Ž+CÂ,§ de­Ú méTP¼ª™,ïò’ÀëmЇ „®n0â©»»Lë% f±h!Ó¶%µˆö9jx¼Õ¹†{mÌ4ÕD\R{‹ DvW„$Ø„J¤„„êI?ûwxAZ®%; Ì1¡˜3[@M ï…V/~¿¸Á ½•ëæÞ$ïl‚“ÁGl»\fAmu=¡Œµ2µ”š"Ý c¸ 0È:íò¦3¦6r´kKöK9J|$ËZýû Ï› @ í9¯JAs}|àÔ‘˜Ãô¼ùuÿÇíÅ|HþZuû[‚X÷ôeXäpœ¨´®…Â+ X¾©»‚š…“Á€Õò˜mÛ)ã[t^)ÅꟂɩâÎÆž&ÉQH–.ñ1qÅ+­•VÇ©p-—X}/ç(FÌ™k"!dødCµÈdb àÕŠy/+T˜ÃlxL×ÃëávÅG•l-RûLío õ y«–E¨œO]Ţײ=ÆU¢ !¶íR¤QžÌdMªœñ)fJpº;þ¿µv1Ó'.Q*ʼ‰Ñ܇£Š´CSàp';˜!‹1ßCêÖ®n§D%¶¡:x¥ÎBbø‚(…æœ:e–0PÂEËQÅ-ÞUêw°àÅN6öZ¦ ýc’Õ¬Rç±£J&àØÛ o^UjŒc jÅ:ÍÜ“¥×ë†V±u³×jQÒÓ ¡kÔeB3R¾gë b(Èm«¾jèÅaÏð’» €½<$bÕ×X¢Ò ‘躜ò‹É„$ƒVëÍo8Ó\ˆ:G¨2Êšº 4êÜ¥óŠDç}È•n§öubpN›¨¥„*q/)3ä‰g =5Ð1h=£vÊí#ØW7˜ªŒœ€³g ™ÒQ³üO0LIP€{H­ÕˆDko´Ø)’‚0îš2Áƒ,׊µÜÊ k à“^…£^¢xì }êÃóéHÚ·â=ÀÞî´ žÆŒ=„4ý¶<Š+Ϫ‚y ´‰a­vï‘WUÕôÂ-êû–Þ—‚²`Ähøˆ¿bãRE°° ÜUêÕ‡O3’è;2•ÒÜ! —·+yx²=+nACdz£xáTÌ~âSÔ;{ÛgÞ‚[$ìò!ÄÕ¯`‹ì½ï!eW 8ÚÍÛÁ Û,t¦µ-§b˜ÊôrŽòç‘0±¥”‹±’û5[`^SiÄüasîñR™³3°µYüîàlJHU&±fvh’ƒhŒm÷~¬ ™û0i«K(ê¡GÎï§uÂéÚa©@·_çLß!F.óà4V°ÌÊáã[5f´N,‰a[€”Æ5…I2xv³$Òq& øH Í{ØX@9§“KD¼}èƒ)HfߟȗIšF y\Ä<ŸL—‰;M“g²Ö6_­ªo² ú´šPÎjvš½Çž>¢|ál¶ó€p«c†-òVFÝ"»Ýy ½’B'ÐÏû0à!Ì@x)“ãêrõ°Ùƒ,KÏ-œ&EÞ((õ"‰G`ÁYp S{Q50áD£Æ ›¼$Øõã-u Ì*1( (ød7™wWà@ý)ÄcÊF^>° ÖÓÖ5h®®à`N„3m`Ü5Êæ²W½­ƒÙd 7UG§)¥ÕbÌX-ë³jöëª5ÔÚ#é@+oû/É¥PGñ¼$ÿ%0Òý±YKs²HRo1dٕъĈ¾(87ŸâƒÝ:ù.À«®íŠ>ሱeÐa$ÂC?8ŲÚTš|Òêä^rCçúJ‰µBWß„ZhÌ–Ng ú§GpÎrtúAú¥lòi´1{†ÊXÑ-;—e«öµSHv1‰êô3+8KTNÙÕ粃® ù•[…Ú·$Ò–‘ 9Ayr²”“Ì )8âƒØâ9‰ ã ú5²Oöw?¼LŒÕ+Î%SF¿BTš| XÉ,½ß4¦øÝ!×aOS‚ î ÉÄ7­'(gvÕR9 †­!ïÞj<s#k±ºWv‰êÂ^3Qréo‹;MŒ ‡»4Z½À«ÜzOŠÕéÖLØ›Ï, Û’¥7^âíåÇžù6Á!V–Uð,Äš,ªøƒéV‘%épHQözf˜Õc˜àØ‚x\šÍ’:X¬m|f\Þ3¾À)'‰lç«ãCÃR9;uȳJï—äÆmÝ‘U"œ¢E<xÅæ© ‘FSï7Ï2Ôðzœ”oödz¢0%Zùܸ6OW Éqqyš¥Ìì#ÄLßá˜Aê’p‚“,€lðFÌ^Óc%>Ysa¦hv>>êUÓ©ú8þU6aá<Á^?ÔãØ“ŽQ›<-³,-Ḭ¥éèQí´$æ £:qUùgeõ¸»£½ožçÐ 6í“© •?h0eÌA³_ÓkèðŸ|Ž€äxй×8-Àó’h+œø‡:T S£õ9°UG¹Å‰½3WÑÞK{”µHH¶qÖ«,]ÇG/çV¹Ž¤½{Ò¡íŸdbŽq*¹}à´Î¡Ú™Š¨Ó{÷Üu‹Û‡‡F¡Á€êÿE˜/Â|æÿW„ùr˜/‡ùr˜‘Ã|U²¯JöUÉ~]%ûú0çC_æëÃü¦óuú=Ê}þ¯Óÿ«NÿÇ%+—ìã’ý–Kö±•χ>¶²¹¸­üÏlåï<ÌùÐw¦~ça~qæ;qy>ô¸t ñ¸|ÿáÄ%ª½%¦2cBóò—Þ{^ËM¯æþs7Ë£L Ç`ïŽyÔ‹¶üÙÜÊvO—Ñæ \Â#Ø‚ÆúÚ´¿²vÁ‡æ%kÜw®1ç]²–ÊÜk¬e ÁÆŽÃ5KX—Ç#á×Í>®Âû¦†:ÓÉ—)¹ó•à oÍþ|£èéƒ4ñ|»t:ùºz¬ý÷34Ü̹ù€lD¢ãüúwÜýŠ˜y`ü‰oÿº}JfŽ¡FçKDˆê%’‰ÂJ&‘£oLÐ^¢‹ƒ–™ ©à^)ÑX5ù*þ¡•S# —oNÜ# —7Q½TÛ¹&Bï—Zçhp¤ötÊmgGd®ä;\`œ˜ŸŒøÙvFƒݵÊÃú«tWyAŸÉh ¶=·µkÌ*Žøí±¿mŒ€n’¹IQJ·Âmk>¬| 2=©|’3»D}¼úheÄs„ ¢ó®Ž€FSk=–¿N–.Ên•jfê–¨ž“ãp´æ[É‘-I˜î2ÅL}Y»ê"5¿²ª 98¯áÊ ªìR #Œ ‰€ ID™Ð'"”œ­¤Ä»Œ¸;ɾCÝ¢Ö5¸uåV3ŸoyYÒè++4ù²8P÷ÐÅÍß%å.üÒüÕj2¸/]¤žC˜•°I雺˜k±¶ƒ.Ñy>ÊîôÀõè›]M{³GH¥¯xîA1 t¸¹B ŸÐ‘ÉfX-¾nzÿ{c\9¨ÜB´=ÖdlÕÊEÜÄc×Ô|ôÈÊÙ‡Àéôm,^Íÿ€ž/`Ð#¨þ°`…µÆœ2üþ°F6ý¾x«|ÒD‹Ü"éOPæ¤Y$»q3‹:ÊT&ÃÊ&·Ñ »§+À‹ˆ"{æ+kÞ§P‰ÍB?qs±¶?Ö úß¼Šs0çIÕèÊ%WÇ×S›óTqŽ5<Ðãügµ«Ö\j­!‚º!úù%D’z©1dç¸;ÐWÀc~4cèåAŒ([21þ­Õý! ~d¤5»»uª,š©äí¥5lŽn½-(Ðj “mVxòAX/ovÏèìÄ~wG³Úýˆ)¹Ú¸lþ«£[·F¶C&¨“Mãy†ö±ƒxµBY Y ÅÉkYk6 I&+A„¿¸" éæÃ ­¢ÌßN‘H˜”ZÇ*¿GYiyÒUUºÒ”j­N1j¢î€Cu»i"流•!dË¡G*‰rô»\Rþ¨.ð $ð–¤ »‡Só~AQ¯?Nk/›åœ¾†;²®ó@ˆ›¨œILjip­»²‚:&ÙÊhFTJUªÜ[”8¥QbÀ¾Ì>mRc$¾Ä ,ä@W§?g=ág«ëxk*Å«¬ä¥:ýOgÏp ª63´ÍGéÁg“„4H~âÂ=`$41 ¥ô~[[GO·dEàÕFâ±$™ö—NÛÃØGõΘ¦ƒàïÑÁ/Á Ïš|ณ‹+Ž0Ò-Y;’O4Á=|K4.ç í´GŒ*Ï\b¦-wŒ*pûkðΆ`x_\ȾwL½’+Aœ=¹”?J ‡c}дCvYüâ¥?>ŠScPý"ºZ¨1‡)‰#d§¿³mu"ÑŒ¶G) $‚ »´³äèôCØá,Ú¯¹Ç­eögƒ ,ü%n…iµ ¨Nãî®3hôbš|µ©MXæÎl4‹">…DÃtx˜SJ+ؼ 9×xŒ;¼º¹¾ðÈDé{Æ@³òcrEÎô( 0¸;WážÝÙíÅÇ”È2Ëɽ;ÀL£~<ö¾U‘ŒË"÷æŒTeÓÇô(Ùj£€_RçñÓq FK9G#$îr‡ [±B’3CV+MI^‘#І_Œ­…1< S*á?ÆTͦRgVM¨÷_§3jv–Œ€LruÄ»»ûµ8³>0Oq¬ä¤<`¨1óàÝ¥FÒ´éG““ç êÏ\ƒîJŒÇYJS[•a0ŒcyQ@=Ù'¡›¾GqÔ„s.ãÒå\ÍË9]Ld¶’ÄQiyÆ——½Ù>hg,›åâ…IÓ#0,‹¤Ä9U§Ÿ9zé‚C?Ï^ˆ”$‚ Æú:ØÈïçëŠÑèVeÀBsƒÄ”ø-sr~JÖˆ§',œ Ø>çž´øï“ô0’©úyœ9rj¡Êí§áßÌéx153ŽˆßpŠ%Îu¥8 ‘|S#õ%!Õ=ÖÁÁì$îŸ)’ȰjßÌ 1”‹!¹®ÿ&ߟÀ©fº+t«ã•­ìLýŠêB£ýÖÏ8N`‡#Ã2§heƒÿ51êqCC‰«Da˜ÅPíoç’©ÂwŒó Hš²@Œ=ê"zµ3æÁ°ß$%K»ÐΦ@—h²ð£^#Á~ÚÑ&“EoÄã¹Ã`ZbÓIkW§QV5Ñ4Ì#ô¹SõÒÌÓî ÚZ⌡‰V‹U¥ÁÔ=F€ž”G¸c‰é¤÷KЬÎ%kz…¼)¹‡8õ))_¤têù6ýЋkªNïWîÓî€t-5´#ZÍ­G}\Û<@&‘Çר*?É_°¥îÀR³¼Í’„,dÿÅÕŸC&6wiÒUÈ2r àP. É¥óŒýȇU¹iJcmŸ´Z´¬¼=*áX—G˜¥ù/Í•"‡Yµú”L°ïã gJŸž<ÓJìÙ< ÎV(•8‰'©@â•|ÒD;X”’‹Åãe?|‡¿jŠ¡$5åÄ?r-“Ï5ÙO*·ãà˜…°6æ¿y a –é=„ÕI@#Œì:w"8Ô:©KyËv8æpÑ`8{’¾Bw­H>„ÀKóc3àtD¯jês‡f¶hàŠÍ^ôÆUËÈ+»ÆÅŽ“—û™WcJ ¬»¿‰Òvœ HòïøbÚ™kc»Kð> FÐYwƒÈî@QÞ³ö¹kî†Ïlìãê§øeÓ¦oIó×3‘ DI·¤ ž{)[ktZf:›¼Üròø·0PÉ7¿‘‚øH›³©5{óÏZVnq¨ M0Þ§G=Z/öök9ï둜ƒjÄÀÄ“”sÝœµ}>VÐ^QN«†ÁôÔ6ãŸß‚ž…FÓ)N ŒEò³žÞº¨Ùô¨ŽŸ³Éä|D”b‡ä7tþ)3ä©{ƒÅ9É&£Ê‰)GÓÃ@è‹vÓ«ÏeÐ‟ՇٷÂÖàa¾óE˜a¾æËa¾æ_ä0_•ì«’}U²Q%ûú0_æëÃüºóuúχ¾Nÿ×éÿM§ÿã’}\²Kö.ÙÇV>úØÊ[ù7låï<Œo¨ï<Ìwæça¾—n´ß‰KK¿—ÿtâòÕSó¸×’L’Tñ™ü¡É‰ÊJã 6µFмµÎÝÕ7Ûê³ô½üëP“Ð64>_¡ûXþЖûÂî²+ò;;ù•UÔ7ë×!õUùi\jh³¥àCèVkEÝ®,q"˯@zqú•)Èy¯³ò^öK9Ï´ýCââjÜ5튬 B:®`«©üÇùº1 \­psœíŽÁÐûø¤©Õ/û:1?óI&B“Ý¥ Ç£4>ÙO‰/²]•[mŽÉU…0ëyX}1sÑ‚SPø!Ó÷²ª~òÊÝ÷ög:þNïN`e°O£.Â0ªÿºÝüÕ†æMØß™«¬Üˆ5pý)ޱø7:7!”bMÉ·Ls$o¶”“*ó¨Á,•ôb´¨Öï>f!¾0Rž“Î4ïî7Ô#^!aÐÁ ÖÑ/÷·¸1A€{_¶Fç[ücV¡w‡ˆWüҔݕìCϵÚp=Æ ±+¥™UØ eù|]V~.e-ýVÿPÅd¿ÒÎË\–ò©$®ÀzÎFÑöÖÄÿbã­Æ­Û _lˆ!T%Që©¥ô4ëM»^¸úb}%ûSä27?NIóªâ‡ÄQÅÝöu T,ÊÖ8Id$’`¡jY|Ä@ûÜ<ϣʗ©Ñ‡OÄüÙUòâ× ¨êÛ±‘Ô'}*kç3âFï³M°¯“ÛqG†Æ¶=lw¡Üý1úDܼÑ#`ÀÍŒ¡qôífèUF‰[=V¦Îtd7%HøªøŸ 21Í·Ì–ðaTi²ð&JÕ¤ø`¨VÝ¥te®VîËi¼|Èœf„„©¢öbv®ƒf!®ùljÍò†oIäš–=$a\·¤^š5-š… ¡TýÕ¢‡|v8Ä‹LE™{ø–TÔºr|H»Dö¡jleû!Ìâh~E¢Ú¢‘Irïð¥ vøwÀg)ÜvÙ»Ñä¦ÉDâHl¦øµî Lhýº ´æß^Š¡c»¡^á¡yn~G)º&Úe?#/ÖÍb¡§²"%Úsò‘z˱ %º»Ulø» 3²¨Z§ØRÀãæümÆBZædŸ™»—ëîzÝ\Ö¢û£€Pãöî:Ö°*µÁTÔŽ=`)uk2F‰ó[D@µéü©–¬LzàÞê‹™S+*{Âéi fêü©LƒA+!òà=;óD¹wü*8‰>Ä`ÙÉ\}éèåÍÆh(9ÐY/0÷êÄ©²Ã7Tïó@-%~¤â!3t.i“.eߟeÓ”½[?{SR-~eíá{Hiê™»4k>1J;Usð‡jcø¥e{™ÛÔûÏÝm‰É·¤d7“kW“eÒfJV.¶‡…”î±èm¶ék·Áí=Q@µ µVëû“L KÒò¬ïÏÕ¶ÿPî{û–„(Ÿy(‹“Àèþ|»¬swZÝÓÆ‰½fäƒ~£¤³@êtų׶ŽUÎBöãÈ”}”Ýбª¹Ózê>ÑëTøs£Á@h’#ÙßYU˾g˜’É`š)Íb›ka%õÍLlÌ^¸§‡D"¼6kâ&4ˆzq?nYÇšDaÅtO–¾V‰âd"éãÀ“ÉnÜ’‡ ŒæFé¦YS¿0²%Ƽ=öñ¯*#_ ~Róî6ËÖS|‡£õYÝ`”ïí{M__¾x-oßáðJÿ R%VEHòžI·vã´®oó(™ó¹ï¡]h†2 öÝL;s¨“Òi\½“ªÎM]O}¶qVBœÞ'½_HP ʸ;ñ}Ÿ:":qÆ%;›zTr`+×yîN%Uåñ¬þ…¡a²ñúè\ÙÒŠ®¦î†2jfHãÖ5žjXÓ°û‰Sýç´ñ ¶îyAJ'œ¢°Y҅Ĉ?1C„kXÃ.Vž›ö‡q:iüµÑ®H4ª§Áš[FA£Äh=]r‰0Ú52H j<S’1Ù­tfécÖƒÐuPÒ8Q§„í@‚½ZaÅP z*|ôÚçI °¡ÊHŒ#êð'X´“˜ë‚O¥ë×áÔR_Å÷±d¾ëìPðK¦ªÓöñCmµGPhu·ž4•0fÖ“Œ»~j¹¶Â0jíÑš¨V33kÄQC)Å ­,6™' HiLTçH:`Jt£åÊ8‚ Þf¨TóqÇ#E+Æ—Uéæ¹ÐÛHÔ&ÍÂôÿY¬µ‡»cÉ›rõ µÑ˜=[õTŒÓRÈéf¡hfÿRí?4¶öP³"„ÙÎ0·„´Ï~0N–Î×ÂcBÓ2A‚<¿ &¦•íëÊÖ±vi¶r¶®žª'ÂóM=4qnµ2³×ãéܹҹ‡@¼ÂµŽ|–Ë©-w§×N¿-±òðZË'äÙŸÃÿèÆh´WMîjlÿ |iknÏ–×& Þ£NFÐ=Gc0¹:žµ^„[úOqj•Э؄5Ûà £1ÕA¿€Ù[ëÃÛ‰ZV.±÷1"Êk™È'gíþ}cÎÈT2ÿxlc’¨Œ0 @E\z÷0›gó°Ì<=KoZDgÒQÏË\6Ö ›†ðЀ¼`DJÛx’Mú¸¶,]žgÄ ¬˜Å\ŠmIAÞŠä‡Õj•&!hv£,û$¾sA*I½Ó³NÍÿ|‡Ïu<5·vP÷8t s4F1ó4üëd e>D:B"{vê\²q,¸;  íuð(gI¾©çnƒ# wö®S`&M3çåH^kÌ™ûxÚ™c=ÓúGÃN€ÚâÛ×í­gÇq õAíÞYè$èaIwL›­ð‡Š[œa¨=Ü!Ó¬…¹¥d^…á'ñaæLÉV™ XÙ§Ÿƒ‰µt¤dö .û.Ÿa6çtƒé&Ã~ ¦Mê{ fW6ß¾óE˜/Âü«óå0_óå0¿Îa¾*ÙûUɾ*Ùï«d_Æó¨¯óõa~Õ‡ù:ý_§ÿëôÿºÓÿqɲ|\2«à|\²ä’}låó¡­¼?¶ò/ØÊßy˜ó¡ï<ÌþÎÃüâ<Ìwâò|è;q¹¿—¿8qyŸéî3ýï}¦ÿ¹Ïô¿÷™þçÇ™þ÷>ÓÿÜgúßûLÿsŸéï3ýÏ3ýï}¦ÿ¹Ïô¿÷™þç>ÓÿÞgúŸgúßûLÿsŸéï3ýÏ}¦ÿ½Ïô??Îô¿÷™þ÷>ÓÿÞgúßûLÿ{Ÿéœéï3ýï}¦ÿ¹Ïô¿÷™þç>Óÿþ8ÓÿÜgúßûLÿsŸéï3ýÏ}¦ÿýq¦ÿ¹Ïô?÷™þç>ÓÿÜgúŸûLÿóãLÿsŸéî3ýÏ}¦ÿ¹Ïô?÷™þçÇ™þç>ÓÿÜgúŸûLÿsŸéî3ýÏ3ýÏ}¦ÿù¿ŸéÕ˜çVyoÕ˜èG)$ªÆ·òå{+_>·òå{+_>?”/ß[ùò¹•/ß[ùò¹•/ß[ùòù¡|ùÞÊ—ï­|ùÞÊ—ï­|ùÞÊ—ïåË÷V¾|oåËçV¾|oåËçV¾|(_>·òå{+_>·òå{+_>·òåóCùò¹•/Ÿ[ùò¹•/Ÿ[ùò¹•/ŸÊ—Ï­|ùÜÊ—Ï­|ùÜÊ—Ï­|ùüP¾|nåËçV¾|nåËçV¾|nåËç‡òås+_>?”/ß[[ù¹µ•ß[[ù¹µ•ß[[ùù¡­üÞÚÊÏ­­üÞÚÊÏ­­üÞÚÊÏmå÷ÖV~nmå÷ÖV~nmå÷ÖV~~h+¿·¶òsk+¿·¶òsk+¿·¶òóC[ù½µ•ß[[ù½µ•ß[[ù½µ•ßÚÊï­­üÞÚÊÏ­­üÞÚÊÏ­­üþÐV~nmå÷ÖV~nmåçÖV~nmå燶òsk+?·¶òsk+?·¶òsk+??´•Ÿ[[ù¹µ•Ÿ[[ù¹µ•Ÿ[[ùù¡­üÜÚÊÏ­­üÜÚÊÏ­­üÜÚÊÏmåçÖV~~h+¿·zÿs«÷¿·zÿs«÷¿·zÿóC½ÿ½ÕûŸ[½ÿ½ÕûŸ[½ÿ½ÕûŸêýï­ÞÿÜêýï­ÞÿÜêýï­ÞÿüPïoõþçVïoõþçVïoõþç‡zÿ{«÷¿·zÿ{«÷¿·zÿ{«÷¿?Ôûß[½ÿ½ÕûŸ[½ÿ½ÕûŸ[½ÿý¡ÞÿÜêýï­ÞÿÜêýÏ­ÞÿÜêýÏõþçVïnõþçVïnõþçVï~¨÷?·zÿs«÷?·zÿs«÷?·zÿóC½ÿ¹ÕûŸ[½ÿ¹ÕûŸ[½ÿ¹ÕûŸêýÏ­ÞÿüPïïù0Ï=æ½çÃ<÷|˜÷žóü˜óÞóaž{>Ì{χyîù0ï=æù1æ½çÃ<÷|˜÷žóÜóaÞ{>Ìóc>Ì{χyîù0ï=æ¹çü÷|˜çÇ|˜÷žóÞóaÞ{>Ì{χyïù0ïù0ï=æ½çü÷|˜÷žóÜóaÞóaž{>Ì{χyîù0Ï=æ¹çÃÌsχy~̇yîù0Ï=æ¹çÃ<÷|˜çžóü˜óÜóaž{>Ìsχyîù0Ï=æù1æ¹çÃ?f\¾÷ŒËçžqùÞ3.Ÿ{Æå{ϸ|~̸|ï—Ï=ãò½g\>÷ŒË÷žqùü˜qùÞ3.Ÿ{Æå{ϸ|î—ï=ãòù1ãò½g\¾÷ŒË÷žqùÞ3.ß{ÆåûcÆå{ϸ|ï—ï=ãò½g\>÷ŒË÷ÇŒËçžqùÞ3.Ÿ{Æåsϸ|î—Ï—Ï=ãò¹g\>÷ŒËçžqùÜ3.Ÿ3.Ÿ{Æåsϸ|î—Ï=ãò¹g\>?f\>÷ŒËçžqùÜ3.Ÿ{Æåsϸ|~̸|î—Ï—ï=Eù¹§(¿÷å瞢üÞS”ŸS”ß{ŠòsOQ~ï)ÊÏ=Eù½§(??¦(¿÷å瞢üÞS”Ÿ{Šò{OQ~~LQ~ï)ÊÏ=Eù½§(?÷å÷ž¢üü˜¢üÞS”ß{Šò{OQ~ï)Êï=Eùý1Eù½§(¿÷å÷ž¢üÞS”Ÿ{ŠòûcŠòsOQ~ï)ÊÏ=Eù¹§(?÷åçÇå瞢üÜS”Ÿ{ŠòsOQ~î)ÊÏ)ÊÏ=Eù¹§(?÷å瞢üÜS”ŸS”Ÿ{ŠòsOQ~î)ÊÏ=Eù¹§(??¦(?÷åçÇå/Â|æ‹0ÿ.Â|9Ì—Ã|9Ì¿Èa¾*ÙW%ûªdÿ¢Jöõa¾>ÌׇùuæëôŸ}þ¯Óÿ›NÿÇ%;ú¸d—ì7\²­|>ô±•?¶òoØÊßyßPßy˜ï<Ì/ÎÃ|'.Ýh¿—–&~'.ÿ?N\JfçAj¸ÝÇ5ÔíW²Ì<øÒ‹X­B6äU¥N½G¡©*—`msÁ%ÑäËÜiLú}ÙùÖ* " ˜i¢ãŸi05\%g" 4™Ë‰çê8[²òî ÄQ=ÇÆ÷DûC™”åªdŠ«ÇûµS7‰Éir-OŸ·­5<Ÿb^´e4⟵Íú¼äJÉ£8ÆeÕ&›ãu¤^“W&7Þ³*šØ×I½¼ù¦¥™AH†\<Š¡›V¼—îâ4tp¶¢+‹0u°5!°P6QìϺwÜPO`%¿ZŒ=h– Þ]%(!‚ ’¤GQh…òM´)ÆòR4Vç¼vx^»)Á2,ý# ŠfYÕ@)êö‡ÐfÒWo=[³¥l-±3à|¬MxUV)L!e;tF¬4sgýLò‡(Ûå¶gä0Sr_ÖÃQ&´©k9(*%€I µŸ€¦5œ."ìøH¶ë…Û¦ÚôÒÁq*dÛsÔ$Ø—Èày„A¯kDb^gö¸1™,í=jd—õÒ C 쬵ËC$¦º¼µ«í‘œ¸sKâm§jI"­ìf¡˜âf¯‹rö§JÁ§É0YM(Ô¾âUzdíj/´¥µ‹oÝ®2ÉQ©[«2`Aâ6âZjÕ füEýEâä`Ú™öJ´ížKŠf÷+¢‹ovs kæ(k¥š  ¯Áå¶/úÊè)n!&lè‘ïð"i'ïçot;û1%p=A3¬V/~¿¸Á•â 8´‡.—••ó*‘ô‹m—Ë,Z¿]Oæ••WŠÌ¢í!a V›¤TÛJb¸™‰Õž®-ÙÛå2Wn^†èÒâ€Ä ¯’MŸoàÃ’%+x­‘"5”ò¯Ü+/:¾®±=AÊíoiÿ…ZŹ»]êJ ü »goÀkÀòM û«fÑÙ…FPÉà !¡¤ A)Vÿ4Êÿ;\Ò‘Óô}t¶Gã­Šðüf³â WÑr‰ÕÆÐ©"]LÙP-èU²Þ-«Ô‹Õ”ãÝNÈÐöFG†6LTÉĶ7ïn–æ8Nå¦<ñéÐŒ"›ö9•°LYn0¹C2H[¶QR`»kO–ö_ÅôÔŽ)”N¢¢›z´Å°$ ©G$u2\£Eóm&Ö”J'ŠrÞË EáU·V颒‰GŸNÀº®ÔÓ-§pÛù|# þö> JàQš)ÙÍEáO•Þ=`y øgë =ò«“Vôa `šìå!eHNÜÁ¶ñb6ÐÖÃH|¿nhå[7;Ûuàá/,C*……¤Ñ¥ƒ eƒé|DqÛ«FÊ'èÚûôè`ŒpqxNÑ|ù4иLsЋHt޶•›mYèLѾÃs¶,Áž o§c×° ‘ê’ Å½‹ nFšì¾vhüýM‚ ¥e3ít·ŒÉ0Š"¥„8ébjí8šNm÷~¬â}ÝÓ>쪠Æä~yçéj:æö'è£çfõ=#ÉU'ó`ˆ*2Å*ìà£-7ZôßË´,ÏØÊ=_՘Ŏ2Ì¢‘–¢fL}y#¶ñ0ž¡ípMÉ|”(ç~Ë—«¿ôQޤ¸:ñŽÓ5¶$’g2Æ6_-ØÙ–ÁØ"Ó)P@ÿ™D¤r½ÇOk6úp A g³K¦)‰ pZ¦ ˜3ê–Ýœq«#7¼¹¦Lò(€÷\g ¼tò`ÛŸ§0vlö`#ËÒÑeéÎÃÓÖµb]蜳¥"8°"ÍÐèÅÈ&/‰vžŒ¥N †k§¾*­½ñ3Èn2ï®ÀúSˆ-V~C^mДZ[Áj¯õ?@Œ³ Y¬‡O!{u³±Ð ï¦$Ùß )%hźõÔb̃CïÏëª5x[@·$d®·ÿ’\ò~ÚŽ=вxÎ3ÔNU„‘îpH1jè,’ŽH4 °í±¡Èãê6f,¾ž°mK®Éw1L¼5ßQ±tòׂèç Â+c Õ§÷#­Nî%îy¥D[笘ó’?j ;/úûaÑ™ýI2$~è1ÓFÐé ŲçÊiÑ-;ím«öµSH6¹Ã1 êÐä‹ ÿž²ò›w’_'ù•[…Ú·$Ò–‘ 9Ú˜¾\`w0h›ÐuV~ÊsCú„'û»æ?øPV²5ÎöCÙdv[ XÉ,ÏÚ¤ÃÀ7j’ †t ÂàÞL|ÓzÒ‰rfW-E“`ØjÜ$Â5ž¹X¬u³º'/3ª {ÍD)Û‘ŽSa4!ð³Ã÷¸K£Õ ¼à+$OŠÕéÖLØ›g?¾[²ô ¥¬ÚºŸ©Â²^ozÅÄʲ žÅ¢=YSlç>oV%´›ãp ¼s.ÁÈH ؇dQÛÜBz3—`ßåX€¢×ò'YÉÏ<¹1¶q&ìCÃR9;Ʊ!¤ÄÉÙîLÛ^%©À¡J<x‡f 6¶x¿iœy­áõF«€oÎûñ¶žSaJ´ò¹qí Öb[EÜó`æ:Z]3}‡/tR7¿ê¢8—ÁoèÜ"‚ L!‡?—–ÞzÕô3¼ ç öú!Iã½À’αD/b+Ḭ¥éèQí´}s\ ”l<üóh»­x„Aë³Þø×áL'9C¹Ô$ä ±¥²F½{NW[.oï¸Ú{Žš®ÄÇáZ)¸ˆW‹ïYu%[Y}ÀvX‘µ&üðÍ#„…é[9(Ó7øPe3‹Ë$#béÞQ-4e;<% '¶Ä#’˜Œ³Ý7×C=ÈúŽsO£YRlZ#Î=É"L «§Fb{h?¥¶tNÇX¹ÄˆY“ø?mî‹ [«Ÿ­¦,³¸lԘÆ1û놵ìxÛš™’Txl竈z!¾NÓ£oê7l›òv@Ï0Ï£ûCçøÆÊ9Na†öÚ~â²já¶rÁ»á[Èó8ÎÆšöÇ]uI çh`¬ÔJP—1ÓÎÿ,º‰Ð3ª~ß ÃÐ*Ôˆ0¼7ø–äs™ä0Êð‚BG’¤¼ä)¨—•(a6KÌž¬I,ŠÛ¬çà´\Ô`K‹ÓŽõœ¶2ƒY•ÈçÊ\¼dÖ(7žµ€Ì,­ä ® "$›˜Ç™ˆgnyD²ö]øbÐ ;;¼èÁ‚Ôc; F\\§kͨ~ø‡J®=Ž1®Üh™âýˆòyö*I¤•ûöЂŸ€M¹x¾÷7ðYäGõ¼Ì¬[l^×I|Îñ!»»± F"‚?NªµNÜ•mìã1˜2ì™9„é5tøÏªÓ%ìäð>ÍïrFµí«Š¶Â‰Ê·ô€¬YkQÆñnš’ü£â+=”dB2Ä}z•,]Öi´Y6i0ÈxÖ&¥½{R=Gìx›˜##(š ,]ˆÕ„q'˜Ð½{ƒA&»…ÁHÀ z\)­}æ‹0_„ùÿa¾æËa¾æ_ä0_•ì«’}U²_Wɾ>ÌùÐׇùú0¿éÃ|~r_§ÿëôÿªÓÿqÉÊÇ%û¸d¿å’}låó¡­l.îc+ÿ3[ù;s>ô‡©ßy˜_œ‡ùN\ž}'.H|'.Ÿ8q ¤Ô&#Œ­ûÂoºÖÄQ÷@’Ztÿ¥.¹á¦Áˆ§.ô}Qf ð¸º&&ŠÇ=ö~»+å[ Wv‰$%rÇïÞ+ÂRw)ND¥Õš»/wk*3¸]Øj@XüÀãWK¨•¡–4øCÀ<áã¼,ùÇàÕÎñ|Ëá«ÁÈžÞŒ­#õÐÊ„&Ɖ;§jŠãë„tCɪ×~Þ³JO­8œN \ÀÈ‚äwB¨ ½ˆ =:j‚Ojk¹Dr¹~à‚é¦77µÆÝ…I¿–©=Ê)MO:*ÿÖo”¬›ÃŠŽÎÞf^Vϼ„b´0jòA}zžúÝeFbWΘÛCLÿ½ª¿ÙmÊd§ÞýªCJõ”]áð«d²ñÊŒ&ù8ÂVö¡Ý¼¥ ç•cêÀ¨#„P%•HØ HÊö«x¡ÈTÇ)H+‘8€õá?“åBÆQZ¬~¯^ ƒ¶Á(È¥ÛÉ_¨âº(nuô«ù݆nQÚN#ÌBû—rÏ.Áê/§œŒw’Žå¶¤úˆ¡ð]ÚðWaŠô<B@9 Hi¼;HZN $´¿¼’ëK\cdÕ§¸È£'*žôëP‹ÉT`MwWJÚ‘ Âí_a²Ž°úCi5sžuy#8 Ï~¸)Ê'&SÈÔYýfWolxé5@Ï8Ä«R§ ª>áø}ƒãkn5:ýïô7m‡C;^`!9 Î~·æÎ2+ksZQclœO¡ |\*‰Ê³è¥—hiæêºÛ¯å¬´J¢“®Ôcÿ°b¸Ø%Ø =ч§–ÂþÒš®¨^¡ºE1òŠJ™IÇÌ$‰4E·½#  Å–mOeºÁøø¡×4ÆV¬ñ>|/ÕõoQA•mâáÂÖ}ù–T-ã»ÎÛÆS>ÄH=K,äªÑ—eevwE"¤Ë2Vº«%Ïʯ+iESTÒíLfálG‰úñì«Ð$`uv0šl¡™–Ä7GB:'ÅÈQÞ=Âi‹ÚU†v¦ÿ6^vˆTb¦¿pg#ÅšùŒý@wä–¢Fk#¸dmSîMkžñÊZv¶"hɉ[ûvxöGní‹Ä!Ië+»wW–ƒø/Ù_ÙT¯]CóÍW\>ôcF†ì5îO’»_b!G‚önΈ´¼!”ríâê=Bõ.E Z§dfÍÜY/gƒˆwªÐúÍÁxed”çßåã'®IÚþ°ºs£NÁ<Ë¿Ü!²r›îÝPa´óåã8(Ñ'ƒ½ ç’O³/ þéaÙBÎt‘fò1¥swþʰ¬‰sÆ2\ ÚÅarò2ÔZòWñ5»¸-yIÜÓëPS‚i“°zI4qÍéª0– æbÎ^|TÔŒ1pɘ‹¯8ºª‹­yŸ­c¦Y,¦ •}0 n‚Ã×ìD†¯0ðô=¤•mÇgC5^³|ó:Ñ é ÃÃ8¤rÞ³fÒËO  ÌÝ4 gO‰‚J‹áy‡þ>µ‰Ì>¶€õI %[¿s;ô2a Bšk8„VÝF´²ù â¡®PÖ¼Ëï¾ú üÙ³“”ËR Oœ¬D¶2TQK€Qñ¿NZëP‘Ehò”Å5°àô#Áë›ô•¬ èæð dèN.g >‘ÿes)—`¿ X7%eºuª±kXO™ÃiEŠ¡nrÍ¡‡[S4‚«¥#)V<×ÅÁiŒÎʧé1ò&Iú–üaWÁ•ƒÜ-ÙÊ;æ¹`.ÊrWËó#×Ù;êÀZMÌGê©‹X;W$v]Òtò¡d aaíã(ÑÎÛ^9ÅŒ¡ÚÈÍ–eM¯ä£nd8apÆ Ø‘Ìi?*[ï“—ÖS#V1y›±·“³ÍU­–Cñ`μl£Äàâ’¿IüÏhþýúl²5™cK&pÖw\i 0†ŽµHýÙhªžÚ«ÍÜHÄÄlvן–:íOüXã1±2¬O¯‚°ò°>wPÇÈı‹Ý2é (ìB+÷Œ8••'†ÚÈqäÈg9d“Hål9M;y€L~i¬šÓ g$¢d–'ÑU>T\Ù7b ÙÔ“dƒŠËüCm GŒ[cìÙ9E°CºÌYŒÙñ ž¯Šà=è w]!•¾Ï”Lµž.1Ű$ÇU½»0QDOdvLjÌâ*¢çÉ—™ro?í3˜Ñj!ðZHâŸqP=éî3ö@î™áÎ×2ɾÂÎêsRuú^uBa“g¥0 oùÙ&æ2ýîÏUâÑôÃö9§Sã•Ü|çx÷äw·µäË]Ý¥L”ãÔ‹üÿ}6 Îû8SX[š”ì<̾qª$b~¼–£–TÝ'T6T‡*ƒ¸¤JÉO|)Kðœ|Ãê}ãœ^yFÜg ‡ÞŠŸ–ÛâyìøåI:¦`1—rÆ9žã—¦Žžm Á3›âQüÀÞTˆx «~–á¦X†aw)3¥íu$ZOm)P¡¼£w— beÒ;ÊaÃ\GªkC«>Özóú§2MwÝÆlä²`osò—N(‰L£˜© “}mlÆITEâˆòä¼_=ðZ/àÕÖ"ŠÞç´@95„L¸ `›#Ãt$Sã:ˆ 8[WOª•8ˆ!„Œ0#oŸ¯ (bRÔf0xØå— ÈçüÐ6hs¾Îç+ù2MúÏê Üh ÙF¦ØDäR¼V ÚM^ÜÇâ=ÏàH%¶¬Â,]ðA÷dpr½Ð¿´daW?4вsƒÁÐî#p¿Ý…–h0ùв4È”VF/Écþ›¬VçvOmr(,Àßœ¼TV\H X+L©¶Î…äók!ðÝüh®Aƒ8nư&LýH×lÀZ6ÁZO55¢©GT{”:’lâøe)ÞÕ±øªÚ\›UêQSTA¥ƒù"Ìa¾ó/"Ì—Ã|9Ì—Ãü:‡ùªd_•ì«’ý‹*Ùׇ9úú0_æ7}˜¯ÓïŽÿëôþ_tú?.™èã’}\²_pÉ>¶²oê­¬Ûæc+ÿ3[ù;s>ô‡©ßy˜_œ‡ùN\žMý¸¬ß‰K7˜8qÙtKÒ`(-"‰qࣖN<¤»j¡î4«ÕHŽÌ”T¸üˆˆãÒ¨^ŽƒÃóíþjnâŽc ¿½á×J™%Lìn•y”ìãÇ@MƒK@æf±нÐ`ÄñLÆyŠÂÉ–îL%÷eøÐ[áÃö}4_NÓwdn¼\ë&£¡»0Ãý†Š8~Fޱg„”Ãýî*ö{(>^Ê.«Þö¥Tãèÿ¨=àžà’+¤é2H:’k†`CŽ4Guž†–ÞÕ?Í`¦õaÌ`6е¾÷[M>àÜŒk ¬5CÿJÞeø8 y“ÎTr¯FwŒ&fèB´º¢ê-ð¬ÓÇI4½cõÔ·QïÏÖašÖ‚u:$q Eò$ý pÉem#dÎx\à\¼è=¡K…‡ ¥ÿÊ"ÕïN‹ÈX›¥È{8UåÁçè¡P´È¹Y¡ØÉ€%ïÕlIëžèÜÜh¡¹+û“H©%ëb6½! \? F\«ÂÐMŒ4hµ]ãf$Û Wñ”:â­y4ß\Ñâ¾CDVÂÍ%÷ yuvËÄQ¸Ñ¢}P¼Ê‰ÆÉtŽØ"¨œwç×5½µ8—+·nÎ)´%³8.Cê3ÊZ»š’••%ød:%‰Ÿ^\E'Ü•ƒñÏÊöR;(YWš(¯òjÍ ÞÏ|>¹Ÿm íY¦D(f¯` îœ/}nÀÏãR@ŠÍ¡¦%»kF—] }:]YÅ;lŠžÅSÀ³”ŒË‚) ¾©Å›/ZÏšë*+÷1¢¼ ?»½P$cý¬Ý]qBAe@‰* ãîV!¸dvOo€©!Þç7ÑÇ õþZ.ýN É2ËwãRÒ|·ÅäÒZÛÓ}¡!¼x}c¿"1À•­‘HÛÚÆenAÈél~+m/oHü›eñÊÌÔoCjhQ6(¹ÔyLç“¢¸:£í‘ÈsB8ÕU‰Q<%kœô9ø u”ÅÐ1zï¬sË«-QôîN ÔÞðôƉ‚Öœ™£ BœtÛ)µãt5¯kÞ¾Sùê·Ú¬pt—ÙûÁV²N)ž/ùt,°Èwåî’;ðî2šÐyDÒ!Á5Úìu÷[¤šV–µ`Â.4´¿y«Ž9ŸËQø!É3‚Í´b†’V9cŒE™Ëƒý‚Ï-n0˜íÑ/9B ­,ÕJ’î%.ò-Aɺ$ÔrÝ;R"´€£ _-kq1ºU a {%HžsÙø%o‰æ[_7W¹|84Õd?9J²ÎD³è‚ÉcNmMîpñ $_‚dÛÝ­A£{„«‹¦¤/ß…ÈA“ï}67;ý ZðÞÓ:8‹G `ZÜa€@AÕsTÍ-s²^Ä‘Ü&8»-Øu“\*f]ÌqÈFÈiF¾Ë::¿+ö×z4ÕænNkG³l_ CeÈ•§Û£¶ÓÒ¦õ”´7­gŸ™G–{­îš¦XÖ57CB_R•HB§#Æ.‹×Iû… ]0q!Œ+Ì%½ DÒUG1âÈZÅéq˜Ò·Bn6Ç{Ym†Ó]½l†çv¦ÁéþÅdú ÍÕüîĪÒ-3‡Á ð—v޹[C AÞ,­läåô⎪ˆ§DÁb5ûà "¥€÷ÍÔn_ä=éЛ¸Ò‹Á׌¶j:óätÅ5O:„1]±ÚÈ¥—>þÞq«~ä¡XÒâ›ÿ¬ø 'O-VV$øÀ7h™×܉ޗ“žàÑå1¯”=t,I‰Š¯]A¹2åeÄÚ‰Yñ< Fn´ פÙ#?’õ©ô¹â .&fç 2ñÚ¢oI\Úî¨uÔÙØÌ,æpe]-†öÍ’Äëâ’!¤-arZn%{ šNDqI$*LïU§&QÈ8 øP¸qNbC1ž®DLZ'ÃkjI׳tÔ.¶fØ(þ7š…€«ÈÒs™~l¯¥œ)>Y³tñ1k)¯êô~ˆ‘s×Â!7t€ÌZöäÕþdAd™Qn®æÏ7T2ž s’èD$@]óÑÇÝ|GÙðzw&ŸÎˆ:Ó/¡?^3À]ðQº[)éi¤ž¸l7ž€Š‹­u¤î³ÿ[>ÛJëÅÅÒ¡e;ƒI$_æ‡c:’n#K9©¯¦w× ©1<È©& åÔÂpƒ>/¼$±-Ê9ùDçaéýÊ IÙ/ÉæŠÁ˜â”¯dpÔÿ>çaÄõë¥WÖðPÏi1”´úzíd@F8ÈÏ­E}¢žfçaJÛ~ÞN¬Ÿ×jJœcj_N?ߎ•á kל„•\dc âØ×¤Éoã—äÎAPî#ùYLTà–{‡« ¢§^J©?†Åø„X\I… .û‰6Ó,Oü:ø¡ƒ—F½xˆwæGÐ{稌[÷‰KqÖâÇáI 79{StàüŠ'ékÉUj.W¢€=Ï”ÅÓüž# „¹ÕÌLe . âq÷eÕ’KbÓãžqRGÌä•|àYjp²ÒÈq¦ª´¼ß[6ЬL]Wq'Ÿñj0p^±BÙŠWç,X « ö-™uJQÓiŇV‹Sgy3KXzuûëz<ÃÍy! gnI‚>=jèX¶ —6©¥‡úmæ†ÎŒçÔS>Éœ|Ú$Î2”AƒÁÀšì¦„3=Í F¾›||LM5Ê ÛÏShÛŠgml 6¯ÌdïEvïvì›’ë.7‹s»¬Ìª€zÅõñO·v· Èï›w—³Ÿ9RFq58 Jì×–ãJü‘Jfì‘Pí%y$¥ÍC™¯J‹:ÎÊ»¯:q¸1»©Û¶Æ©p´ÃÉäM8§ç‹0_„ù"Ì¿‰0_óå0_ó/r˜¯Jv>ôUɾ*Ùoªd_æ|èëÃ|}˜ßôa¾NÿùÐ×éÿ:ý¿éô\2ßÔ—ìã’ý‚Kö±•ýC[YŸüc+ÿ3[ù;s>ô‡©ßy˜_œ‡ùN\ž}'.ëwâò'.Ñù2K°3ýs†Ø‰D{@µÂ£4{Î{¶_r­“£|R ×KÀ^fÀuÊksŠÞ¯h-%¢RÍÂ+’‹Ñ`êtP§Øï:íP,H0gz?I;£K‹QÕW‰q~"BÜ6²\™“Ó iBy•žiÍä=˜ò ü,G£`¯Uº Ù4- f´8Ó?{»"ŒìVï(¯_  ü»n²%®{¡=y\ý«<„#¡l J؇žZ HR…Al'*òZvìð…¹ñ¾PŽÚ¾ñf¹¤XÄí‡ÇDO-ö¾}Ô¡fM9ˆìàµB•âùÊѬ³6“#·7f²&BÓL°Jm·ÛCW)? ¸;u¿o!¸ë²öŠ äã·ïý2­´ÖùÄÒ<3‹Þ‚‚RC„þJMLèãS™žç”ÙþXñŠ:!(ÜzV…½ßÖ$$´â¯ ÍïB?Ék$ É oHqíL|²dÖ6kµÐÇOÑp-ó‡ÌàN!Ù QÛS¼ޛޕR¢“£!Ðîâ¾àVá7æ»¶‰Öj³‹X´N7çªÚØÓ}¸ä,;"Lk3 YËL-݆Q–’õ5w.z†É$Mðæ[SŠÉô§Haà!äÆû–òdBÖ®S\mÁßUßC à’b)ŒâÙña®€ ’Ä!ôè —¹½øñ¨(fXÙbÐÔ}Ì׬`fòõÉ.vW¨ˆDbc›; ¡þ³$CÛÜ”úyçÉÄ»  ZgÃäM4q•¬jVF yö0‹t¦yIÙ\±(\ ª#, ‰GÈDÑ &Ê,Hp}‡÷yå0Ðïñ,]¶î¨¡‹´†kQƒ •æÕZ’½Yúخ֧uš;é/=*²{¼¸ª²Ù™*£èÆ7²°9R»®ÜÎ&è‘;8¡öw:æ–Vºñ¡4ƒ½MßÕÒâ¥F¹LÍÑ–Vˆ½±‡õ â@¦žôcsìĤ¿—ÙcIBÊTÉ%DZJê.°ˆ¢›í;sºeLït ‚¶Š)™,%p.á4··4;Íò€e%‰îœËÆ JÑÌ!_Íìf6— Ò®ø¾äöQ•¤•eÙÜjë¨÷[”e\w—*A ”äv¦z¢¢­ÝqÔs°ü…*PH:–w«Ñd-f!ÎkÒ)A‰š¥°!¾Æs-dTBïz\T9µ¢Æ+«ûHì}WáRŠ!›SVÎ%º¾w¸¼Ì 1D'£ ³à•jyס¶÷»Q뻤Tb´èìVïúµWZ·¢G÷ØÇÉÿ˜˜æ2Û‰ÎWë¥Í ´Î4B­oÎÄ»+ª`/Ä‚Ñ d)Þa¯K޾ÏÄ*™lµeeÔ¢ƒ/[]®"Í ·q‰AB>žËÐêÁ¶ÖË›5:Å)åpèâeØ®ÀÌ´¿)vúÚÕ4[$²Â>áºk#€WBÎçÏ—êrƒAKoÜÕ;xÑ*fÈõ/%…{Z¼ZcY¹PwM=f®‘{ÍF(s…Ë#Ñ£ƒÙ§I®7!YB"x(‰ß·dCõF@¼ûê‘v–’ô”ô`ã‘M(8)ˆ@½ûÜ—WÍþRE­•óaÐìª1+D,É÷'îv^È$'·L4 ¦+—âŠåïåð9nFuq?ÔF9lAP)8p#;ÿ8<÷«­ÊY 0¬ìžìU…Åâ·èÄÄ<Ó*ÄïÌh«îCý©F/&Átf” –Ï‚s¡­>ùÍ–Ü{]Íáîó $$1$õµK¢ÂZ­äGNý9Œ¬dbtFG2ˆ-m cˬÏcØÖޏ-nƒóaÕh aj‰-?£¥ éá  ž¹6æ*ʤ¶òTÁ[¬Ú‡+C¢ÐS*³j4}‰ð佄s— {8[åõ=Á?ݹd½kßáúÉqÉÞ¢"Ïà½dE’ì:Þ XâC.móšƒMˆy îºÒ‚1&w¾~Ÿ£ºþ‘{Éw»ß_¨Jòð¢3-þ9¹%åw: ^ãÈ(Þ#_\“Óa;ôâ–ƒ\:gó<<™Ô\+íž³¦Z0©)|xêÙgíâx'ä©¿géâ kõVqêimzÂfÇ8b°j6AŠ;'´†8SfÌ®Ü>¹É0T1ôV`o06¼Y]Èy9‚ø tÝ(º•æCI”€vNRZ§¿ä(P`BIâNÉ,è4œBt…J+Ÿ“Z’õå“" V‹¡°µ;AYö`¥·2bÆeí}‡_™ðcƒ‰rûh„—X»cÓ÷îqyžÉ¯l¸ñíúÆ\@xþ¡…<Ê™nS‡Q‘å¹ O ¾àMH«%åˆZ­l¨û8ùX`匰 ÜϦé$tK•“Ž—ŽSPß²‡;F™†o¬¶Í¡\èTm¿fn¿§ØÕ˜ÁŠé.Qpž–½eóûsF !Šl¶NÉá®S!1gTVƒ7c¯Q¾Â•Tµæö×TΜØoû@:ý£¥ˆ­i /çÀ`ÖuD¹NŽ•Õé¥qpJ§GŒ ßžÙÃÐ;ÏÃ`Y“°-ÿ"Ìa¾ó/#Ì—Ã0`}9Ì—Ãüý‹æ«’}U²¯Jöë*Ùׇ9úú0_æ7}˜¯Ó>ôuú¿Nÿo:ý—Ì?ôqÉ>.Ù/¸d[Ù7ÔÇVÖ'ÿØÊÿÌVþÎÜø÷‡©ßy˜_œ‡ùN\ž}'.ëwâÒ½Ã?œ¸SmüzS U¬Þ¬ß6cô2rÆå®gô¾:)·)QÅwxÅÙêÆåÛîDx­øsÅîÍ÷>ŠãÉ;®hÑäT°š¼—F‡¾¨M1ÖѨê0Ú\aâc‡Ë.ž¬p`˜4ãŸDÉÌ8"î¼ò‡Äœï`_9c¨ ^©Å¹q5°›¦$8Éw€+k( Hfyé!ˆK ÕŠ’éëÕ”2ß‹82ß’ *Ùáz Âž<Ø#y^erQ ùÈ-YÅKrõe^®~,O£S›ßÕñ§dÁºÝêÅ}Ðá!Ò7£’¹IîÞÿSs!™æ1I¾½¤´Q=I@â“LŸL7qŒGðÂ+3»Äð3ýˆ<í’Ĉƒûëô´DNÊ“#ïe¹Á`ê»3‹ÚAA®5]ðTçûki‡UHâêÚØ6}nþº®Ö„$o‹!¡ät$ð2ÓÌ{佦 ²ÄQCpÉNk{ŒíòHi³W:òàÁúïÞVÅxyßCÚÓÜ¡ Sjé|.¶g®¾Sñ5XSô2H&®¢2t@1b‹“&œ1¹¾û¯Š§(—€Hq¬ðªƘÅ:PMÓ‘ž£5/Žþt—•®0gÀzù‚É€%¹Ngb0d;ÐUTÙ„ÛßXk¥°†P’iz†’8Ù™tÔa8§™Ðr cäB(¹“y­‹1éP‚Aºé&šn“Ö³Ä×0e‡à?ßlË˽øë°µôÍJövê/h¸N{†Âf;0@ï®ì¦Ô§«€-%(jV@ÛóärXþ½m®Ž|%—©MÆê•{âÞK‰èjJø !<:劗Ô=ç^}ŸÖ.(Y%]BšûTˆ5éðŠ‰½‹B³½#ïÀ³Aƒ‡PëEéÉLðMxw¸iÞ BH÷ç3Øë X0Ë®ƒªÞ¬œç:P—±¾Ù¸‹f‘²Ë¼˜zdö`?­HˆM÷^Fõ²¸:Ãó#è²ýP!ÑØ#$L`FÉßz®qJ)#”g½‹©[ …âS ¦JI‰/”÷¦ãTYUyÑì9’A˜Här{QFRUüCûè›1z®cu`æ–à \Ù[Ïà –Š•¯X6K ÅÎʯVà×—Æ &4^†2‰œžM—Ú ›l“Þ`ùÛš,÷óc8Q¤ä8¼¢¥é2n ´"Âz8¯«HRbFÆÐ „1XкWZ1¹‚Eo0hLjÍöÄxζÑKfñª”r}ý䪧­Ó¼Ó¨Ëº¢ÕjŸü:‰Ô1ŽEž"š(L³VTƒº ¯^=Âèô ŸÀçUN> +gO+Ñ¡0ÏØ='æu]|RôaÊ\™vÕ<Ñå»BýU•F›üL—„æê剗 Ýñ]?WÐr=D’0î‚k"V¯¯¹«Ë;"š3*¼ñ5Ј˗÷cU&bÔ ¹q(€f¤k.¡å7 C^/-²Î,+DTÏÊš¬Üm Þ(Z²êhgÌ#Á|’ª5¨«{Â6Qœ;!a÷Hà™ÁLj‡ï%ÂÞ¢¡ƒ%p D™ÐÂt,zg9ûˆK£;MÛ&å˜ €f'ëÀù ôrØv;¨i­· •£ÿXNÏ!Ää{ß›¦´ëÕÔ–ý" ‹ âÎvrÍ«¢ÞAâÇ Ë\c ާñîFr",b”$A™Q@6 -¸ôÑSó‚Δi”ùD·eFq )G{òáêx¸"©ÓÙŸ`V¬iÔ,ÞÖÁ>î%Šãâ”B$^îaÛŽÄ …W]c‰ü-’q¬îR@‚ãœäË%Ì“:—9•E«Ïá»4ôÏk$E¥h¹Üj"%DÜq‰ MžÙSP Õ–Ê){ñÁ¾7Š,t]UóÍ£_dɲÙtÒ^Ç206-i´±ã%$¢ø¸ãÈ8} ½WAœ™^RâC'Šn{6÷á¨)ò) ™Yô’¹%— ŒxÂBB¦½„ÖÆ½/Ñýbk5'ì¸M>¯bö“ói°B®,­Ö{FŒß°:pçð%P¸T3r¾ÚæP@¿Ô©µW"[œùC;0Ñ€ÑüÖàê8ÛÀ(uÙ‰(Õ†wÇA+ʇ OÑknL:p‚jI^À5©G­Ö¶ä®NQÀ*|×kr ^³n–zÑeG‘:Ú:³Î>òV‚I+{µèæZ+##ê ÄýðRû6+­ ³ùï0‚‡ÖƒyAšé5®@ªûŸЬöˆèU¤ôå¨Õ2ÝšÉgUÙŒEâœÉµ3QãÊÒkÎLÒ$ý uí,Ù% Ã&y¦Jr´Mtå'Nœ­œn’Ñõpq1ŸB–uÑÏ–ÕbN•˜U ƒ‘ ƽ)˜ÿÍS{À9PiÊ=>›eßÅ „Èzðñ{é!,Þ£q ï2ÃÒª)¸VH‚¼Cé1£zmþ¶Ž$<ÄÀ(1çLï0z zñ:EaëÒÖ˜0#ŽúAÝÞ‹Õ‚3ɉšˆ9!\CðÄ—v‰âY)%樭6W<_Îâq¾Xò=ºt„¥IPW2ß ªd¹;`t c”¸—àÎ#rlw·*_:–5Ç™ÕG„% æ»ÚMÜçÐôli#K÷:÷…ÔàâVO¤N“9½_ ›Nðq‹Äg{z£ÞêéšAÔ‚GÁ¹Źg²•L3D¡A"¿O Cc¬N“Õ“9ß»«ù¨H©)q‡3a>¼;ÉF:íT|W’áÝÓ¤)µ~¹ú%‘ôþ>2Ïà _vN’Á½cXZpÌ÷âƒQŠnâT6X}gÒ¬8®qKüE·çaÄ;lú¸1+~’†‘T*³„ªãfb‡gf±hÚ·Î UFr Ž&ù\=á“9P°£æg;Áy)þ¡ZR€µ‹å r”Ow±úK[¼;1m-¦“W› +´“º|êVŸ§9Ñã) XCûÙš²Ûù|¨ºÆI™=î!o³òV¡9ïça”³äÇ`XœÐÕqž"FÍ3¨¬š }ü¨;¥U G’oÌ\c0ÊWÏHhr¾Ž]„]¡iXy¼…Û™øu«ô0,l¡(eÖ´h05×à× lÎþu:[õ:d¹†ûæ-~#5 ú›LurÏþŽ<”ça0›J‚\ ƒù"Ìa¾ó/"Ì—Ã|9Ì—Ãü:‡ùªdçC_•ì«’ý¦Jöõa·¾>ÌׇùMæëôŸ½öuú¿Nÿo:ý—ìuÀøqÉ>.Ùùºà’}le[ùc+ÿ‚­ü‡9›ú;S¿ó0¿8ó¸<úN\˜ùN\þó‰K4z—ßT4š|ù!žçšKuuèý5Þ °ÇýÒ}t½®W÷”XkûfÕ²òä‹‘P¿˜°‰íTßáùò¦-åå¯! s„…}ºÓóô;ôZgàF-zy`S †¸2yv*ˆ¹ÓÖÞ—nP]+`’¦‡dÒ¨“ ž^Ùk >¬äîÃÑ5ÎŒÎKb”é›´ƒð®Yå¥.š…`òÇp=Øv„åÝ;X%¤.ò¼ô#Æê‘ª¢qd›…É’àúpMù¢Z·áOìÊ_–µGŽožáÕ ù[²/fš2„K9"Pú¡'ò ucÑ*†¹Â#ó’ÌeÚ<ñj«¯ÈgZ¥w/&AbwWküjíÛ¥a,£ñ§˜PÕ˜Òô ÷zfÍW³:}¹lCf7×W`(Ïå´/GЃjZ,Å2†þ¹=ÏUCÔ_&:ûj«Ê…JoÚÚåœ%zyèߪ!JÕ ˆÞñ3À¾%;Ä£éæâp ñL:0vn¨ÕN\ûcÚ §²iRý¼MÅ9÷f]„M6â›ðS¹?, ô}54z¥‚\&ÖmœÀ ˜*·àíÒ%žds¤íNIÅéCêB6M W1v¸ IG ]"Jö¯Êô5ÆßÕ#LÓ:M$4%µé›U²¨hصbº±vw‚ï#L[Nýe¢`åWä?+ÿ™`èQI’ªð©µ«AÓéÚÝ4‹ëɃv•R(Œ‰eæ0Y‡Mt%/s{#_žÖ¸ÔäG;s9¨ºÓKÊVs©X(c­!¡·Òˆ‡0b @b¡W"!ÄŸB;¥¯kP¯CGx^2KÛÇTTenÔÒN–>‘ÅN~]ìå½f#ñK»…ÌD¸™«N8߬òß›Q©wµ:<ýùÄÊÚ‰08|±Ü±¢Ov†ï!$*ÅšN§Â_Öb@NGHÌ:Àà½ý}’~ñÁµª‘Ã@Íü(’ê/…bJÂŽórWÃ-B*tÁi=t~ê5²t5èlÄ`ã«Huãv—çI,2ñ QKsƒQÝß—a!º=úU²àß°";«±è\îâ²€€ù-5³à$QdvS*GkèÈ,õ[fiöK Õÿ¿½¬ ‰£wÔ+ uÄ›FªŒò@™…ÜCs/)Ûf·iõ¨–À‰¬Q û ¹ýºH(…¬ÊKaJnÇéºÆ¡¯Žò5ëÀâeCjTÂÕ ¦›„ÆÆK³µ`¬@;šWd¹¢J:ç7¬8;ׄüÄ™6F"É¿‚Ñ–êY6TY)þ™+—jZMõp->Žã©Q˜Í;"›E 5I b ‚ìŒÂ !*Ÿ öñ úßuk01àV0îðË]ÙB6W-Ôb„‚rš—‚d–b·-‚°rŠ•Î7Ú%´ ‹¬p”ÌR !?p)0vÜŸª1eÒ`êìƒtNÛ†j³3ÊÉvϽA òÕOAƒéš ðöüÛ63n|±`Ýû’SVBJÙ®1}ÜJôaFjñ6¡3ô£œ]ûT©!3/;c‡Á Gc{²AìÞ?ÔG‰¶ÇœN]ÖÞ)]½DÆu'lEê#jŽÖ l Dâ0dÒ¦½K¨±–®YÏh^°TeV*›)‡Ñù‘Hv÷ A%ó⨬èÐH rJ²ÐZ=ÀÊf½„ÁLÙlÉoB|xc¹Œ³YJ'ÆhûÒ6ÇL.o b?äu›™ËšõA¼šF¼LÉH]{]ê©à±5/Ð(Ñ,äýùKüAÌGƒùÓ¦N=þ5;¿.¯Ò¸9Ò¡3Ú [~’m9ÜÒv,Á~‹ÏðGØTÈèÐÆIusÆ™õ³ 9WÞÝ>#Ã,%ªíJ£¬BŒÌ“²»Fuâ?¾ÎækN[‹OÑzÏô")Æ €k\¢p[箣8ÉI¿ä‚“‘µZ:t ò½RAî†ö掯k®š­•òÁ^nÛùê˜o¼Ï„¼•-wñÍ-Åd޲Níã4rá6– ׯ*Ác‡fZ%z¬®k'ŽHp¡š½Ü`ôEãdϽGzgY èÊ•‘Ñ»‘ü6úc;E ²±â¨LNÎVÐC8T؉³—¹ZXE™IаO‡±^ÓˆD9p@ò‰ªSvâñÀ3|¸€ §jTWÒýCâ΃4º%¢_Äx² q«‰ÔXY FœXf8‹‚•_ÅžhnÒ|M€Ý“·æ•üìÓµl>ý$Bæ^LåÁc äï#âø$ck N]q{º•ôÒc””d!±™1¸‡/©m¯ph¥À'x€Z(±£Ç‡V$Åä& f¶ü‚æ'(¬èÖ|Ž¡–¨ª“Äp«c_V6®qr»ù‘lã~‡„Ìô¦c;dâ8AP±§Ƭgy#N±{#ÂS)Îå…Q®NGÏuxAz8²Á|WYŸNôQÅoGßF·^º¤ï‹&ܪŸ,Ò Õ®Is§ kÁâ¤Õfµq ZUÍI~zÄC&º÷Ñ:wøŽ,ÓéèÃq–a6Ú²  ?ïê°ËšœT‚m3#ŒxÅkz†àáOÑZ bË:McT•v•ww3Å2äw'xØKT Þƒ§sf$&ÍÙbJJ¯×Ñ–T“ÓŠ´×| ;X˜7«ïù &·ß07Çåé»äË}œ³Ù©À’ŸÅÿÆ|I@r2ù€ÉélV#î'#ËF¿fdH ºˆe-7Z˜MdÑøïæ¼A)Ì‚dø&Äì ©xž,ÉË2çá)4§Œ˜Ç•ºyš§Ž“sð7AU ù¶Hr€B»Ïé@É¥•à‘¬ž¸‡t ÌOÖKðÚ%wŒä•¦´“§ìJユë8JåŒ0®_l`"w8Îüµ8«!àÿòá=9ÖBb—³oet ÞÝj¾%ìÓ¹Qv ¦Tòù7€s0ÿW“iÛ’rm¸fg²£D2 yðP^|DÙ¼ÎÍLk²yž­ÑmOSÑ'ï-"L ôTÚi-`wƒ‘};èŽËâ 2ÀœÉ*™n‡ËNSz¿Ü]SA$#\åYÜ 8ħuRáä˰h0‚`ƒ-‰jåê n»*¥Íf(+/‡œ@¾2Ô˜ƒÙ5[`À°¶*™6ZVžL¸[™×²U’G -»ú™?=ð‡h 7ÍÂmn#bÏöÙVf0c?TpºÉKÄKôáèBÇy˜A†%éL&>ñ/y¬îz*„{-U'H*ñ ðô¢Í‘‰c«Æy´ÖjäiÌ`ºahuœ”ß™~HXY%ÁU'8×_°vÌ.'a3ƒé…pQá˜î 'æt̨PÂѹ憠托l“lZ,Ä/HöE˜/Â|æ_D˜/‡ùr˜/‡ù9ÌW%ûªd_•ì×U²¯ãåëÃ|}˜_ôa¾NÿùÐ×éÿ:ý¿ëô\²òqÉ>.Ùo¹d[ù|èc+×­ü ¶òwÆýìwæ;ó‹ó0߉Kß6߉ËïÄå/N\b‰vgz#xøL[VÁ¸¹Ï‡Ä‡o3{‚ðhJõ”äMH‚Óƒw4k <Á<¾ñ°Ý>”ºÏ±W€±¥‘ñ]´©± Gñ8‚æÍZtõyR€°!ñÀ­Qn‡ŸíÅ%¯ôJX!Všãë$Y ‡'{¿ðîvi…e¦Х֤ãêÐäÐJÄõkW“íp]}l›PH6.ÝÞË‘½‰ÛÏÙ¯ˆ7pûRJ)Ó‚Ûryl‡éÎÆ€à…` å;7¼ƒ†„sÌ]ÐíO0ùÁŸ¸’zd 8¹nVœ8¡V[EΖlWY«ÖtžO…²»o÷†„ÔÿíY­þÙN+/ùGî¼-X¾®ðãO~CЦ'j‚RswcDß²™U 1?å sZY¤[ñ¿.WÙ¿î‰+œsÙŒ# œ¾PÇH5nȲ„+ |‰ ½¡í¨²|uß ‰Æì…?(ÍŒî äš²T²DQ©Ë{„†6ÐUô÷þ@eºHPœ¦rF‡6Óf†5óò{€6ErŒÜkNzN‹joÎ49ùïÅý)ÉMc0l)uú5ê$zÌ%_pI6sq4pYc.-U¾—T'º| pWë)`}+ËkùHÑ€HËéf3TáP‘¸j­D„#‹°$!8"̨ûªAó˜;7ZyKhkD7ƒÙm„ÌKªã²¿Ö‚ˆ^n b˜‘nUÉ|½†7½3­¬­æ™ xÓæ Éê×7§©ß=ÎÜ»»*ƒh.Ç`ðbêä T¾„~Ö…2IüЕŒ:w;áÔ^º jר‚Âéµm$hf†çqšæ®R‰„[\½+ªÜpuÉ@h‡íÆ\UÀv°}Rµ^l1CŸœ¡hé…[̱˜aòK軌‡É+(.°hSzçGO¬dnjÙÇ¿` $Ü­‡ê2$ÙÏ6ÈÒ/g#Ñ?ÒÓqãŽkíÚ®%B^-­±—½+ðçìãYã(úù¥ q¡Ž×ÚŠ¤¿ƒ›v¾6»îLdž:I•ª6¹Œ”mîÆzº:£Ù™?®/¥ÑÝ"O¼±˜£®À× ÞcÔlZ¥òž–Í7³ÓÝ©¬4•Trþ耜©¹)åÜ=³@ÑmëF1™¥òs‡šV^áî(I^-¨‘ï‚ì‘`6Ðãj™Z‡’\છ ˆhß—öbZNÜ™0ÓKùyà°*u픳¼šÎ6€.` ‡A¯â»p¥‘¸¡dy¸ÃÌ"qãíe½fûsºHRG|𤸲º¸²–zITíÔB9gÓ÷:µ0w™Ú›J®¨§œEì'àÔ4ͽ" ¨Ü˜2 è{ʧ\¯! 6j`‚´]„[Çéø8¼Ùž}CM­ö²í!¨âjœ”uàµãЮž»Km›•1·|T~ò»wMýä3¼»¬rÑ,“gZ÷‚,Üñq6ͽ6£’`^×RB˜;"(œäI¾´|Y2Ë{Ξµõ;fiôÚ£¥)&—¹(k×ìNúW,CÁ¼G½?sú‰vs9j ¡R•ÃÕíu‡ËÖºÈF àïÓ‡‘¼uɧYCušÉ,» á¸˃£3}<îÂêÝNDÐáŒF¥|lÈA%Ár„·Uk4úL‚EN#{hm^ wO]§¤°")h jvÍ#.õ4¼¹1±ñN)óUíöE&ÃÍ?#ùÇöN?^ ‡ý !ë„?'(# ¢‚^|nJŸ²¬¬õ¸ I.5ÐNÉÃ[‰³úËb¢9Š%ÒÖ‡É}ç³sßy§=È•Ö$b6ˆŽÁ“Š¢›ü«ÐuÜse¶<®"O´¸=÷舒UøOæÔÚÛÉ©K¦i^c^&»}cäQ®Á“…#Í{<$,VáNÓŒF6γ‚Yœ eO‘–ó(—âkdq$©hk0“0߇Ô-gFXŸÂÌ-:¡s‘lµìê<$æÙ@ÉÏ ºWÞ±ÄUP[c°ë;ƒb2ò ýªLNÆÊF÷ÕÃéÀ‘Pãí~ŽÀ˜ndu!Ü´7$@©°l°ûò'ïèF„Tå8Õõ¢|DT’Yœd!q‰!ï»tg¨AÄé²4g Iƒõ⃇WŽÌµ}¨ïÅZ¹†ne]´mt¸`¨Ú€µ«Ñ µ~£´%A?Эÿ¢†Š—duB¶£j¹LI…¦T&t==ÖíƉÑMõ µ¾Põ²2Öa†€p3³ÁÑjg¬–g5’ø.Š@Öâä/P®8"+yÆz¡ißGæS¤í|!XÅ*1!H¶›ßJ€¹æ3 N)Â^sí}Œ;vø-ˆÇ^—¦zqá/‰Å…Â>„BÙ'L«‡î½d7\2èßL·äχ)S¹yÖ‹EÐ|\r“âĵŠéXmo "ÜÌbëeí\âÊ…ï)‘ÕÁÝ Æ†Áñù$Î×ÅÆ÷•ÛŠPj§OBµê‚õÀ럮½mâþ¤#ßÄ5wÚ°é ²v%*.…~H¼Ròp®$˜g×’G ‰TÅÉ_(ܦ X àUpA°›ÏWF o¤åtáÕUôü\%߬­cؽý_í]É‘e9»—ã@Gh£Ê—†D@}©Îº¿cÆÏüùq‹ÆZ.“xMJè*„ÙrG£ØÍ¦²º\ø):æK ¸:Á‰Æ y§Þ]gãMB"S½ó÷ú7ÏЙCa߇ŸLºã£Œµµ =ï DîÓhK˜óÄï§Fr ½íøGkMáнˆâ¶Þø²­~KÈÝ)7 x¦ºs³òk˜ øýºŠ{ð#h´ç¡DCZ=ØÃÓ¤‘ùÛ›ørÄ>Å>üC‚{h?Ó‚s4Þ÷—€±ŽfhIºi©ó# ¾¾$9…Ö¸À—63?ÉPóãÕy§ô˜¾lÍ{Ã{ô54%ß-@£‹ ,[ø3 Wð«—GfäÄ*ÈÝ•&¤JɹûËÒ-— ‡öÌlÁS¾7‹L#nO?%éSKïÌFSÍ#lhÑN± 9Vв‚Çt£ó„8чû Ä(ÚÕÀš‹ fÜÌb&-8¦4ËiFŒÚ§06Nvy:k·J˜¦ôßóø?C· dëïrñˆi2Âx‘e0îúSë€ðŸ½ðh¯õQƒß˜ÑÃÛÓQ¥]/fp+¬%æ—ÍþõºýÔsÔfÖ&ÿתª1’œR—´ð&)”d¢…Ø]¡1•žT?5ñ€’¨ªÅ½ˆ?·¥1­ºÔ¢m¹]g´ÂÇê—ð¨+¹âÖKù~œ'ètæ¸Ì„V^™Z/Xœ*“Öã%Q Ñ4š§ÚO²v%¢j´•£J€òë Úe<Õœ‹+y‡SUSØøCÛgåÆƒ‡'ü,9+À—«¾gÊ E‰\åýZn…ÁÂmq¨è}hQp­¡5]Z-«5K0¸Ö¥÷ÙEã.NKl@.ó¼\2?…5 Û³êžôõˆ27K¸[ ‡^12Š8PBV9aiîYãÆ3â{{–ØúZ bd4˜À¹½§”%» ”§ ÆW<»‰E,£ÁÌ÷·»œ±¨”¬=•Óݲ=Û:mj¯²äµøoÍŸþ³-Pµoà)z6ᆠd(Ø5 }¢ŽÚrÑ‹þ— NÃNÛÍåÙ‡)+:üíSR€/¿óE˜/ÂüE„ùj˜0‹¯†ùj˜Ô0_—Œö÷uɾ.Ùýº?vɾ9Ì7‡ùæ01‡ù&ýߤÿ›ôÿxÒÿaÉ®7ý°dõÃ’ýKö¡•ï¡þÐÊõC+ÿ­üíÃDüûöa¾}˜ìÃ|—q$¿Ë°¾Ë?n\" ³ÎýgäS=ž1X{ïC9ü 5^ŒÿEHK/8ô ÕÒEro×ð4µ¨£\-Î(ðzbån1ÇNÿ®4Åþç¡§±(ÆtY9°ÁÍ.—«Ñ2¡Ø®ø‡áÍ-tý‘«O¿1ÖÜ÷qçüvÂf“fX  áy™1ÔVÎ#©´h±„è<-óׯºlZ¿%Æ!4l'¨¬Lƒ)“rðpŒÍèû<Ävf¬“Ãoô_B“þŸMZnL9ý°ÏŸ¸ ÿ2pçAL6ÉÄ,eBx^$~C…«öAïÁÛãî\o²6@cZ ‚!Áþd>ä‡:ÒÐ1•°|r\\;L޽ÓLgŸ\Â/(N ÍDš;€$xð0dÒŠ.|ç{™C­±NâãqÿÑ%£‹ýŸý{ê{ɨëFË…}`"'I—s·Þ¶2³µÍÿŸ&OÀ$Ï¡^ä'àäc„YÅa²kñàÅÅh>([öœÂ’jqÏ€ãìãxö‘ÂzúÌŒ0žct¶µ0ËËÆÐ5§Ñv(^]íqV—×0§H·ýìÀϗÖÜúŽSúu2þž-F]÷?¡^¥2¸z!]Xø£WH¨ëV7Çé¦'¸°¦žËŒçxäÎãPý5±†ñG7u$=}‰wÑÁïÜX©àJÉÍ”{ÐCOlû¸c<¬N^\y²)Uñ–DµRMu÷¼fdß½\ÖóóuH$4fïCÑyäè.삦‰rÍ`5WÔ´ù†ÓžÙkhp&§»pÞ‹_)3yÿf½1÷ID‹ ‡ÀijæYX©xJ-"M¯ÿ’‚x-êl{¨¨ 3›âÝvÏ5@˶A(>iâ­œþ´Éø /p„_߯ŒszPk-‘Ф š9§Ásº°¿±0=¬Ìo¯Œø¡®bÌÏÖ$ÍÒIgY¤ûKŽÜa÷Ùd;Tœs][Ú¸°3q½¡Õ§´?°°È”óð²fe)bž§K¶8hÚó`½y(Ü­—†Byæ<ôXs"ósƒÊFôã”%±nÎyçÆ‘;2›¬.KºMÓÛ%36ò'f±ágÑ? Î3œÂTÔø:O8è%=)çf3 %ž!¨9°š˜+¸·¨Å”Æ É*ºdk9 _¯- €EÔd+ûÝ(ž“¤¼Œî B·w°,…¥“•Jói›Áö†««E³’šêÓ¦9–›ŠÌÂ) Èìpj‡´•³ïðB5´Ú_ðI sUÞ|JCdM šîº^2³¢¹Âè³1z|yèö½Ò,ô’øµk0›4"ÂF™uÎWÖZƬp¶€±ÝÜ)]ÁÂË÷Ë@ wñ9§J¯+«<5 k@(¢TÕ‰“dž~jz ¶†Ô3 ÀcÆ uïIOCÊ¢Yl®‹ìádÛÃoI2HL;E8½<6ìá4±eÖE!œÂ5%lã¡,€í“©JÅ«tÎa*QÛueòâ‚ØØ*(ðrøzŒ9éX“¬¡uãðVø$´?ãëÀâ•L%‘­@4zÜŽÛÉ”r yœ³Èð@â,n׊—Ù9‡©àÌ@f€bS ¯Â=|j3ÆQÞX€VpÓ·C§lŸûWGª5ˆÒ×ü!̨°ü¡Ü²úØH‹Öá†f“mø°¡qÓ[W[Ù½PUKÐÿéÓÜ9ú܈ÍàÄËLëZÏÖªX¬œ¼âQaOSÁ½ȼ˜:0·4”ïù+{ªÝÈÃwdJ©kHsìÌFˆ‡ÝÂi‘+ûÁK¤Šmš&³p³â¤ß_ºØ ›§’1iàÃŒ##¯ø£¹U¦Ô ·ÀË¢¹ÓV¡[›¹q–¾µ&ıSo1˜§Ûó<0AÏS{|gjEÏVºŠO* Í~¦“þŽ([bŒ)ôöñuðI)Q[gRµ©M„yó¸ì\)TR°`J÷J¹¦t¸íZäxÍ©vz`ÏÉ#-´Å% _§ë+Ñ"ˆïdJê«)¡âRÈ®ÿÈ­Œta=úE«Å„}`šóV_È‘0¢o4; Í\I†Œ_[B¥ÔÙ²ÆöÒ)ûQÓðÆ#‡„ôü)¨ƒãÉLÔ0~ïÂÉ)‰ü¡$F¢’$ùtz<j¼"b Å˲eÄ ‚,ŠÅ“ëècT€ñl¡\nˆ#•~¨µüÚñ½y¨tÇœç‹üïY¯é±B±ýÂÙçe!&†¾Ã]Ï8S" ¼å§#$û€™x „¢Dy¢:½Ÿ`4x»×þB½f'=M©-^²˜)ÍlâdGB­¾z]À‰Î= —éÇ=0uxgÈ;SZ¦}Ÿ²„ÀÀ 9 1ÀpLíx°ô2FweU çìE±Vòͨïh¤ãä™ÃÃys|w£6`€ØÎ@ ë`ll|ÍS>¬JH&UIÌփ؅-2‚„tÿô ¥°_Åkp î<]µg[`ÔÀ0n@G(og“£·U˜¢øÚ Æ5i0¨N5€HØ¡Z[̬˲Í~ˆ€SX”CùqPÐì½…úÞÜ®žV‘¦Ùz(•½'J‹%Äj? ×i!6²»_O„iZ¨@ã¶„l',¸b ‡õÙfñ[ A,8¥Cä~«ôYãúVº‡u¢E°X@\w¼ÕÛF¤q˜¥7.ßAfÑÔ6ŸËtAþÊcçF±ò€‘{Uë÷FgsJŠÁS›¤%w“ï¥MpO”„óÌ>…gºMôü#!Gf[ò†®®¸1“ªy¿Ù@c6ñ?p¹„ÉT³SNåBˆíöÐ[ø;G¥ ¥ ‹5[W(ƒHƒ…Á@íW)Y-ŶÄ`oKRHÃÓ3 m' ¤ Nx-Uf,ƒ@,O¸Ù”Yn-ñ¨•ÚþrWÚ³ ¦‡ü3.5W‰«zb“¢bJÖûj§'CCfX舢5jõQaº•ô¹ Fôf•)Ç.«~.5ÇjRèÚ÷36£Áø}«‡î·*Áçº Ù3ºòìU¦©51@‘^ÄfâÕµ•eJieÚߨ³J ƒ™W.á‹0_„ù"Ì_G˜¯†ùj˜¯†ù‹æë’}]²¯Köã.Ù7‡añÍa¾9ÌïÿœÃ|“þûGߤ¿~“þLú?,Ùõ³–¬~X²`É>´rć­ü¡•€VþöaâPû0ûþ¾}˜?ïÃ|—<î߯å·qùû?6.ÿË„+`£xcrysden-1.6.2/examples/WIEN_struct_files/0000755000175000017500000000000013556022211017216 5ustar tonetonexcrysden-1.6.2/examples/WIEN_struct_files/in2o3.struct0000644000175000017500000001073211712736221021426 0ustar tonetone Bixbyite In2O3 B LATTICE,NONEQUIV. ATOMS 3 MODE OF CALC=RELA 19.124800 19.124800 19.124800 90.000000 90.000000 90.000000 ATOM= -1: X=0.25000000 Y=0.25000000 Z=0.25000000 MULT= 4 ISPLIT= 8 -1: X=0.25000000 Y=0.75000000 Z=0.75000000 -1: X=0.75000000 Y=0.25000000 Z=0.75000000 -1: X=0.75000000 Y=0.75000000 Z=0.25000000 In1 NPT= 381 R0=0.00005000 RMT= 1.6000 Z: 49.0 LOCAL ROT MATRIX: 0.7071068 0.4082483 0.5773503 -0.7071068 0.4082483 0.5773503 0.0000000-0.8164966 0.5773503 ATOM= -2: X=0.03500000 Y=0.00000000 Z=0.25000000 MULT=12 ISPLIT= 8 -2: X=0.46500000 Y=0.00000000 Z=0.75000000 -2: X=0.25000000 Y=0.03500000 Z=0.00000000 -2: X=0.75000000 Y=0.46500000 Z=0.00000000 -2: X=0.00000000 Y=0.25000000 Z=0.03500000 -2: X=0.00000000 Y=0.75000000 Z=0.46500000 -2: X=0.96500000 Y=0.00000000 Z=0.75000000 -2: X=0.53500000 Y=0.00000000 Z=0.25000000 -2: X=0.75000000 Y=0.96500000 Z=0.00000000 -2: X=0.25000000 Y=0.53500000 Z=0.00000000 -2: X=0.00000000 Y=0.75000000 Z=0.96500000 -2: X=0.00000000 Y=0.25000000 Z=0.53500000 In2 NPT= 381 R0=0.00005000 RMT= 1.6000 Z: 49.0 LOCAL ROT MATRIX: 0.0000000 0.0000000 1.0000000 1.0000000 0.0000000 0.0000000 0.0000000 1.0000000 0.0000000 ATOM= -3: X=0.88000000 Y=0.66200000 Z=0.90000000 MULT=24 ISPLIT= 8 -3: X=0.12000000 Y=0.83800000 Z=0.90000000 -3: X=0.62000000 Y=0.66200000 Z=0.10000000 -3: X=0.88000000 Y=0.33800000 Z=0.60000000 -3: X=0.90000000 Y=0.88000000 Z=0.66200000 -3: X=0.90000000 Y=0.12000000 Z=0.83800000 -3: X=0.10000000 Y=0.62000000 Z=0.66200000 -3: X=0.60000000 Y=0.88000000 Z=0.33800000 -3: X=0.66200000 Y=0.90000000 Z=0.88000000 -3: X=0.83800000 Y=0.90000000 Z=0.12000000 -3: X=0.66200000 Y=0.10000000 Z=0.62000000 -3: X=0.33800000 Y=0.60000000 Z=0.88000000 -3: X=0.12000000 Y=0.33800000 Z=0.10000000 -3: X=0.88000000 Y=0.16200000 Z=0.10000000 -3: X=0.38000000 Y=0.33800000 Z=0.90000000 -3: X=0.12000000 Y=0.66200000 Z=0.40000000 -3: X=0.10000000 Y=0.12000000 Z=0.33800000 -3: X=0.10000000 Y=0.88000000 Z=0.16200000 -3: X=0.90000000 Y=0.38000000 Z=0.33800000 -3: X=0.40000000 Y=0.12000000 Z=0.66200000 -3: X=0.33800000 Y=0.10000000 Z=0.12000000 -3: X=0.16200000 Y=0.10000000 Z=0.88000000 -3: X=0.33800000 Y=0.90000000 Z=0.38000000 -3: X=0.66200000 Y=0.40000000 Z=0.12000000 O NPT= 381 R0=0.00005000 RMT= 1.5000 Z: 8.0 LOCAL ROT MATRIX: 1.0000000 0.0000000 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 1.0000000 24 NUMBER OF SYMMETRY OPERATIONS -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 1 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 2 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 3 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 4 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 5 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 6 -1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.5000000 7 1 0 0 0.0000000 0 1 0 0.5000000 0 0-1 0.0000000 8 0-1 0 0.0000000 0 0-1 0.5000000 1 0 0 0.0000000 9 0-1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.5000000 10 0 0-1 0.5000000 1 0 0 0.0000000 0-1 0 0.0000000 11 0 0-1 0.0000000 1 0 0 0.0000000 0 1 0 0.5000000 12 1 0 0 0.5000000 0-1 0 0.0000000 0 0 1 0.0000000 13 -1 0 0 0.5000000 0 1 0 0.0000000 0 0-1 0.0000000 14 0 0 1 0.0000000 -1 0 0 0.0000000 0-1 0 0.5000000 15 1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.5000000 16 0 1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.5000000 17 0 1 0 0.5000000 0 0-1 0.0000000 1 0 0 0.0000000 18 -1 0 0 0.0000000 0-1 0 0.5000000 0 0 1 0.0000000 19 0 0-1 0.0000000 -1 0 0 0.5000000 0 1 0 0.0000000 20 0-1 0 0.5000000 0 0 1 0.0000000 -1 0 0 0.0000000 21 0 0 1 0.0000000 1 0 0 0.5000000 0-1 0 0.0000000 22 0 0 1 0.5000000 -1 0 0 0.0000000 0 1 0 0.0000000 23 0 1 0 0.0000000 0 0 1 0.5000000 -1 0 0 0.0000000 24 xcrysden-1.6.2/examples/WIEN_struct_files/b12.struct0000644000175000017500000000374411712736221021065 0ustar tonetoneBoron 12 R LATTICE,NONEQUIV. ATOMS 2 MODE OF CALC=RELA 9.274430 9.274430 23.744700 90.000000 90.000000 90.000000 Atom -1: X=0.00999820 Y=0.00999820 Z=0.65499310 MULT= 6 ISPLIT= 8 Atom -1: X=0.65499310 Y=0.00999820 Z=0.00999820 Atom -1: X=0.00999820 Y=0.65499310 Z=0.00999820 Atom -1: X=0.99000180 Y=0.99000180 Z=0.34500690 Atom -1: X=0.99000180 Y=0.34500690 Z=0.99000180 Atom -1: X=0.34500690 Y=0.99000180 Z=0.99000180 B 1 NPT= 381 R0=0.00050000 RMT= 1.5000 Z: 5.0 1.000000000.000000000.00000000 0.000000000.000000001.00000000 0.000000001.000000000.00000000 Atom -2: X=0.22010260 Y=0.22010260 Z=0.63193750 MULT= 6 ISPLIT= 8 Atom -2: X=0.36806250 Y=0.77989740 Z=0.77989740 Atom -2: X=0.63193750 Y=0.22010260 Z=0.22010260 Atom -2: X=0.22010260 Y=0.63193750 Z=0.22010260 Atom -2: X=0.77989740 Y=0.77989740 Z=0.36806250 Atom -2: X=0.77989740 Y=0.36806250 Z=0.77989740 B 2 NPT= 381 R0=0.00050000 RMT= 1.5000 Z: 5.0 1.000000000.000000000.00000000 0.000000000.000000001.00000000 0.000000001.000000000.00000000 12 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 2 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 3 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 4 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 5 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 6 0 0-1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 7 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 8 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 9 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 10 -1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 11 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 12 xcrysden-1.6.2/examples/WIEN_struct_files/bi.struct0000644000175000017500000000227511712736221021071 0ustar tonetoneBismut R LATTICE,NONEQUIV. ATOMS 1 MODE OF CALC=RELA 8.590000 8.590000 22.415000 90.000000 90.000000 90.000000 Atom -1: X=0.23400000 Y=0.23400000 Z=0.23400000 MULT= 2 ISPLIT= 4 Atom -1: X=0.76600000 Y=0.76600000 Z=0.76600000 Bi NPT= 781 R0=0.00001000 RMT= 2.8000 Z: 83.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 12 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 2 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 3 0 0-1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 4 -1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 5 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 6 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 7 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 8 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 9 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 10 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 11 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 12 xcrysden-1.6.2/examples/WIEN_struct_files/gaas.struct0000644000175000017500000000421011712736221021401 0ustar tonetone GaAs F LATTICE,NONEQUIV. ATOMS 2 MODE OF CALC=RELA 10.684000 10.684000 10.684000 90.000000 90.000000 90.000000 Atom 1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 2 Ga NPT= 781 R0=0.00050000 RMT= 2.2000 Z: 31.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom 2: X=0.25000000 Y=0.25000000 Z=0.25000000 MULT= 1 ISPLIT= 2 As NPT= 781 R0=0.00050000 RMT= 2.2000 Z: 33.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 24 SYMMETRY OPERATIONS: -1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 1 0 0-1 0.0000000 0 1 0 0.0000000 -1 0 0 0.0000000 2 -1 0 0 0.0000000 0 0 1 0.0000000 0-1 0 0.0000000 3 0 0-1 0.0000000 1 0 0 0.0000000 0-1 0 0.0000000 4 0-1 0 0.0000000 0 0 1 0.0000000 -1 0 0 0.0000000 5 0-1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 6 -1 0 0 0.0000000 0 0-1 0.0000000 0 1 0 0.0000000 7 0 0-1 0.0000000 -1 0 0 0.0000000 0 1 0 0.0000000 8 -1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 9 0 0-1 0.0000000 0-1 0 0.0000000 1 0 0 0.0000000 10 0 1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 11 0 1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 12 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 13 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 14 0 0 1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 15 1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 16 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 17 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 18 0-1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 19 0-1 0 0.0000000 0 0-1 0.0000000 1 0 0 0.0000000 20 0 0 1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 21 1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 22 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 23 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 24 xcrysden-1.6.2/examples/WIEN_struct_files/cab6.struct0000644000175000017500000000753711712736221021320 0ustar tonetoneCaB6 P LATTICE,NONEQUIV. ATOMS 2 MODE OF CALC=RELA 7.847090 7.847090 7.847090 90.000000 90.000000 90.000000 Atom 1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 2 CaLCIUM NPT= 381 R0=0.00050000 RMT= 1.9000 Z: 20.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.50000000 Y=0.50000000 Z=0.20207630 MULT= 6 ISPLIT= 1 Atom -2: X=0.50000000 Y=0.50000000 Z=0.79792370 Atom -2: X=0.20207630 Y=0.50000000 Z=0.50000000 Atom -2: X=0.79792370 Y=0.50000000 Z=0.50000000 Atom -2: X=0.50000000 Y=0.20207630 Z=0.50000000 Atom -2: X=0.50000000 Y=0.79792370 Z=0.50000000 B ORON NPT= 381 R0=0.00050000 RMT= 1.5000 Z: 5.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 48 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 2 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 3 1 0 0 0.0000000 0 0-1 0.0000000 0 1 0 0.0000000 4 1 0 0 0.0000000 0 0 1 0.0000000 0-1 0 0.0000000 5 1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 6 1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 7 1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 8 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 9 0 1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 10 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 11 0 0-1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 12 0 0 1 0.0000000 1 0 0 0.0000000 0-1 0 0.0000000 13 0 0-1 0.0000000 1 0 0 0.0000000 0-1 0 0.0000000 14 0-1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 15 0-1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 16 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 17 0 1 0 0.0000000 0 0-1 0.0000000 1 0 0 0.0000000 18 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 19 0 0-1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 20 0 0 1 0.0000000 0-1 0 0.0000000 1 0 0 0.0000000 21 0 0-1 0.0000000 0-1 0 0.0000000 1 0 0 0.0000000 22 0-1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 23 0-1 0 0.0000000 0 0-1 0.0000000 1 0 0 0.0000000 24 0 1 0 0.0000000 0 0 1 0.0000000 -1 0 0 0.0000000 25 0 1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 26 0 0 1 0.0000000 0 1 0 0.0000000 -1 0 0 0.0000000 27 0 0-1 0.0000000 0 1 0 0.0000000 -1 0 0 0.0000000 28 0 0 1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 29 0 0-1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 30 0-1 0 0.0000000 0 0 1 0.0000000 -1 0 0 0.0000000 31 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 32 0 1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 33 0 1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 34 0 0 1 0.0000000 -1 0 0 0.0000000 0 1 0 0.0000000 35 0 0-1 0.0000000 -1 0 0 0.0000000 0 1 0 0.0000000 36 0 0 1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 37 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 38 0-1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 39 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 40 -1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 41 -1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 42 -1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 43 -1 0 0 0.0000000 0 0-1 0.0000000 0 1 0 0.0000000 44 -1 0 0 0.0000000 0 0 1 0.0000000 0-1 0 0.0000000 45 -1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 46 -1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 47 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 48 xcrysden-1.6.2/examples/WIEN_struct_files/fecl2.struct0000644000175000017500000000416411712736221021471 0ustar tonetonefecl2 AF R LATTICE,NONEQUIV. ATOMS 4 MODE OF CALC=RELA 6.808690 6.808690 66.276500 90.000000 90.000000 90.000000 Atom -1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 8 Fe1 NPT= 781 R0=0.00050000 RMT= 2.2000 Z: 26.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.50000000 Y=0.50000000 Z=0.50000000 MULT= 1 ISPLIT= 8 Fe2 NPT= 781 R0=0.00050000 RMT= 2.2000 Z: 26.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -3: X=0.12500000 Y=0.12500000 Z=0.12500000 MULT= 2 ISPLIT= 8 Atom -3: X=0.87500000 Y=0.87500000 Z=0.87500000 Cl1 NPT= 781 R0=0.00050000 RMT= 2.2000 Z: 17.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -4: X=0.37500000 Y=0.37500000 Z=0.37500000 MULT= 2 ISPLIT= 8 Atom -4: X=0.62500000 Y=0.62500000 Z=0.62500000 Cl2 NPT= 781 R0=0.00050000 RMT= 2.2000 Z: 17.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 12 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 2 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 3 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 4 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 5 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 6 0 0-1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 7 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 8 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 9 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 10 -1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 11 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 12 xcrysden-1.6.2/examples/WIEN_struct_files/yfe2.struct0000644000175000017500000000746711712736221021354 0ustar tonetoneYFe2 Laves phase <= F LATTICE,NONEQUIV. ATOMS 2 MODE OF CALC=RELA 13.912100 13.912100 13.912100 90.000000 90.000000 90.000000 Atom 1: X=0.12500000 Y=0.12500000 Z=0.12500000 MULT= 2 ISPLIT= 2 Atom 1: X=0.87500000 Y=0.87500000 Z=0.87500000 Y NPT= 781 R0=0.00050000 RMT= 2.5000 Z: 39.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.50000000 Y=0.50000000 Z=0.50000000 MULT= 4 ISPLIT= 4 Atom -2: X=0.50000000 Y=0.25000000 Z=0.25000000 Atom -2: X=0.25000000 Y=0.50000000 Z=0.25000000 Atom -2: X=0.25000000 Y=0.25000000 Z=0.50000000 Fe NPT= 781 R0=0.00050000 RMT= 2.4000 Z: 26.0 0.40824800-0.707107000.57735000 0.408248000.707107000.57735000 -0.816497000.000000000.57735000 48 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 1 0 0 0.7500000 0 1 0 0.7500000 0 0-1 0.0000000 2 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 3 1 0 0 0.7500000 0 0-1 0.0000000 0 1 0 0.7500000 4 1 0 0 0.7500000 0 0 1 0.7500000 0-1 0 0.0000000 5 1 0 0 0.0000000 0 0-1 0.2500000 0-1 0 0.2500000 6 1 0 0 0.7500000 0-1 0 0.0000000 0 0 1 0.7500000 7 1 0 0 0.0000000 0-1 0 0.2500000 0 0-1 0.2500000 8 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 9 0 1 0 0.7500000 1 0 0 0.7500000 0 0-1 0.0000000 10 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 11 0 0-1 0.0000000 1 0 0 0.7500000 0 1 0 0.7500000 12 0 0 1 0.7500000 1 0 0 0.7500000 0-1 0 0.0000000 13 0 0-1 0.2500000 1 0 0 0.0000000 0-1 0 0.2500000 14 0-1 0 0.0000000 1 0 0 0.7500000 0 0 1 0.7500000 15 0-1 0 0.2500000 1 0 0 0.0000000 0 0-1 0.2500000 16 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 17 0 1 0 0.7500000 0 0-1 0.0000000 1 0 0 0.7500000 18 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 19 0 0-1 0.0000000 0 1 0 0.7500000 1 0 0 0.7500000 20 0 0 1 0.7500000 0-1 0 0.0000000 1 0 0 0.7500000 21 0 0-1 0.2500000 0-1 0 0.2500000 1 0 0 0.0000000 22 0-1 0 0.0000000 0 0 1 0.7500000 1 0 0 0.7500000 23 0-1 0 0.2500000 0 0-1 0.2500000 1 0 0 0.0000000 24 0 1 0 0.7500000 0 0 1 0.7500000 -1 0 0 0.0000000 25 0 1 0 0.0000000 0 0-1 0.2500000 -1 0 0 0.2500000 26 0 0 1 0.7500000 0 1 0 0.7500000 -1 0 0 0.0000000 27 0 0-1 0.2500000 0 1 0 0.0000000 -1 0 0 0.2500000 28 0 0 1 0.0000000 0-1 0 0.2500000 -1 0 0 0.2500000 29 0 0-1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 30 0-1 0 0.2500000 0 0 1 0.0000000 -1 0 0 0.2500000 31 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 32 0 1 0 0.7500000 -1 0 0 0.0000000 0 0 1 0.7500000 33 0 1 0 0.0000000 -1 0 0 0.2500000 0 0-1 0.2500000 34 0 0 1 0.7500000 -1 0 0 0.0000000 0 1 0 0.7500000 35 0 0-1 0.2500000 -1 0 0 0.2500000 0 1 0 0.0000000 36 0 0 1 0.0000000 -1 0 0 0.2500000 0-1 0 0.2500000 37 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 38 0-1 0 0.2500000 -1 0 0 0.2500000 0 0 1 0.0000000 39 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 40 -1 0 0 0.0000000 0 1 0 0.7500000 0 0 1 0.7500000 41 -1 0 0 0.2500000 0 1 0 0.0000000 0 0-1 0.2500000 42 -1 0 0 0.0000000 0 0 1 0.7500000 0 1 0 0.7500000 43 -1 0 0 0.2500000 0 0-1 0.2500000 0 1 0 0.0000000 44 -1 0 0 0.2500000 0 0 1 0.0000000 0-1 0 0.2500000 45 -1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 46 -1 0 0 0.2500000 0-1 0 0.2500000 0 0 1 0.0000000 47 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 48 xcrysden-1.6.2/examples/WIEN_struct_files/crb2.struct0000644000175000017500000000437211712736221021327 0ustar tonetoneCrB2 H LATTICE,NONEQUIV. ATOMS 2 MODE OF CALC=RELA 5.610600 5.610600 5.793900 90.000000 90.000000120.000000 Atom -1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 4 CrOMIUM NPT= 381 R0=0.00050000 RMT= 1.8000 Z: 24.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.66666660 Y=0.33333330 Z=0.50000000 MULT= 2 ISPLIT= 4 Atom -2: X=0.33333330 Y=0.66666660 Z=0.50000000 B ORON NPT= 381 R0=0.00050000 RMT= 1.5000 Z: 5.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 24 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 2 1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 3 -1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 4 0-1 0 0.0000000 1-1 0 0.0000000 0 0 1 0.0000000 5 0 1 0 0.0000000 -1 1 0 0.0000000 0 0 1 0.0000000 6 0-1 0 0.0000000 1-1 0 0.0000000 0 0-1 0.0000000 7 0 1 0 0.0000000 -1 1 0 0.0000000 0 0-1 0.0000000 8 -1 1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 9 1-1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 10 -1 1 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 11 1-1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 12 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 13 0-1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 14 0 1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 15 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 16 -1 0 0 0.0000000 -1 1 0 0.0000000 0 0 1 0.0000000 17 1 0 0 0.0000000 1-1 0 0.0000000 0 0 1 0.0000000 18 -1 0 0 0.0000000 -1 1 0 0.0000000 0 0-1 0.0000000 19 1 0 0 0.0000000 1-1 0 0.0000000 0 0-1 0.0000000 20 1-1 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 21 -1 1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 22 1-1 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 23 -1 1 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 24 xcrysden-1.6.2/examples/WIEN_struct_files/a-quartz.struct0000644000175000017500000000272211712736221022240 0ustar tonetoneSiO2, alpha quartz H 2 RELA 9.426630 9.426630 10.330553 90.000000 90.000000120.000000 -1 0.4735339 0.0000000 0.0000000 3 1 -1 0.0000000 0.4735339 0.6666667 -1 0.5264661 0.5264661 0.3333333 Si 781 .000500000 1.45000 14.00000 0.0000000-0.5000000 0.8660254 0.0000000-0.8660254-0.5000000 1.0000000 0.0000000 0.0000000 -2 0.4126002 0.2609634 0.1231508 6 1 -2 0.7390366 0.1516368 0.7898178 -2 0.8483632 0.5873998 0.4564838 -2 0.2609634 0.4126002 0.5435162 -2 0.5873998 0.8483632 0.2101822 -2 0.1516368 0.7390366 0.8768492 O 781 .000500000 1.45000 8.00000 1.0000000 0.0000000 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 1.0000000 6 1-1 00.00000000 0-1 00.00000000 0 0-10.00000000 1 1 0 00.00000000 0 1 00.00000000 0 0 10.00000000 2 -1 1 00.00000000 -1 0 00.00000000 0 0 10.33333333 3 0-1 00.00000000 1-1 00.00000000 0 0 10.66666667 4 0 1 00.00000000 1 0 00.00000000 0 0-10.66666667 5 -1 0 00.00000000 -1 1 00.00000000 0 0-10.33333333 6 xcrysden-1.6.2/examples/WIEN_struct_files/cos2.struct0000644000175000017500000000522611712736221021344 0ustar tonetoneCoS2 Pa3 (a=6.107A) Pyrite P LATTICE,NONEQUIV. ATOMS 2 MODE OF CALC=RELA 10.466300 10.466300 10.466300 90.000000 90.000000 90.000000 Atom -1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 4 ISPLIT= 2 Atom -1: X=0.00000000 Y=0.50000000 Z=0.50000000 Atom -1: X=0.50000000 Y=0.50000000 Z=0.00000000 Atom -1: X=0.50000000 Y=0.00000000 Z=0.50000000 Co NPT= 781 R0=0.00050000 RMT= 2.2000 Z: 27.0 0.40824800-0.707107000.57735000 0.408248000.707107000.57735000 -0.816497000.000000000.57735000 Atom -2: X=0.38988000 Y=0.38988000 Z=0.38988000 MULT= 8 ISPLIT= 2 Atom -2: X=0.88988000 Y=0.11012000 Z=0.61012000 Atom -2: X=0.61012000 Y=0.88988000 Z=0.11012000 Atom -2: X=0.11012000 Y=0.61012000 Z=0.88988000 Atom -2: X=0.88988000 Y=0.38988000 Z=0.11012000 Atom -2: X=0.38988000 Y=0.11012000 Z=0.88988000 Atom -2: X=0.11012000 Y=0.88988000 Z=0.38988000 Atom -2: X=0.61012000 Y=0.61012000 Z=0.61012000 S NPT= 781 R0=0.00050000 RMT= 1.9500 Z: 16.0 0.40824800-0.707107000.57735000 0.408248000.707107000.57735000 -0.816497000.000000000.57735000 24 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 -1 0 0 0.5000000 0-1 0 0.0000000 0 0 1 0.5000000 2 -1 0 0 0.0000000 0 1 0 0.5000000 0 0-1 0.5000000 3 1 0 0 0.5000000 0-1 0 0.5000000 0 0-1 0.0000000 4 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 5 0 0 1 0.5000000 -1 0 0 0.5000000 0-1 0 0.0000000 6 0 0-1 0.5000000 -1 0 0 0.0000000 0 1 0 0.5000000 7 0 0-1 0.0000000 1 0 0 0.5000000 0-1 0 0.5000000 8 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 9 0-1 0 0.0000000 0 0 1 0.5000000 -1 0 0 0.5000000 10 0 1 0 0.5000000 0 0-1 0.5000000 -1 0 0 0.0000000 11 0-1 0 0.5000000 0 0-1 0.0000000 1 0 0 0.5000000 12 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 13 1 0 0 0.5000000 0 1 0 0.0000000 0 0-1 0.5000000 14 1 0 0 0.0000000 0-1 0 0.5000000 0 0 1 0.5000000 15 -1 0 0 0.5000000 0 1 0 0.5000000 0 0 1 0.0000000 16 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 17 0 0-1 0.5000000 1 0 0 0.5000000 0 1 0 0.0000000 18 0 0 1 0.5000000 1 0 0 0.0000000 0-1 0 0.5000000 19 0 0 1 0.0000000 -1 0 0 0.5000000 0 1 0 0.5000000 20 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 21 0 1 0 0.0000000 0 0-1 0.5000000 1 0 0 0.5000000 22 0-1 0 0.5000000 0 0 1 0.5000000 1 0 0 0.0000000 23 0 1 0 0.5000000 0 0 1 0.0000000 -1 0 0 0.5000000 24 xcrysden-1.6.2/examples/WIEN_struct_files/fef2.struct0000644000175000017500000000371311712736221021317 0ustar tonetoneFEF2 (AF RUTILE): U=0.30123 CXY LATTICE,NONEQUIV. ATOMS 4 MODE OF CALC=RELA 12.543000 12.543000 6.237350 90.000000 90.000000 90.000000 Atom -1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 8 Fe1 NPT= 381 R0=0.00005000 RMT= 2.0000 Z: 26.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.50000000 Y=0.00000000 Z=0.50000000 MULT= 1 ISPLIT= 8 Fe2 NPT= 381 R0=0.00005000 RMT= 2.0000 Z: 26.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -3: X=0.30123000 Y=0.00000000 Z=0.00000000 MULT= 2 ISPLIT= 8 Atom -3: X=0.69877000 Y=0.00000000 Z=0.00000000 F 1 NPT= 381 R0=0.00005000 RMT= 1.7500 Z: 9.0 0.000000000.000000001.00000000 0.000000001.000000000.00000000 1.000000000.000000000.00000000 Atom -4: X=0.00000000 Y=0.19877000 Z=0.50000000 MULT= 2 ISPLIT= 8 Atom -4: X=0.00000000 Y=0.80123000 Z=0.50000000 F 2 NPT= 381 R0=0.00005000 RMT= 1.7500 Z: 9.0 1.000000000.000000000.00000000 0.000000000.000000001.00000000 0.000000001.000000000.00000000 8 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 2 1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 3 -1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 4 -1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 5 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 6 -1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 7 1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 8 xcrysden-1.6.2/examples/WIEN_struct_files/ferrocen.struct0000644000175000017500000001003311712736221022271 0ustar tonetoneFerrocen (Molecule) <= P LATTICE,NONEQUIV. ATOMS 11 MODE OF CALC=RELA 15.000000 15.000000 15.000000 90.000000 90.000000 90.000000 Atom -1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 8 Fe NPT= 381 R0=0.00050000 RMT= 2.1000 Z: 26.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.08686660 Y=0.12560000 Z=0.20900000 MULT= 2 ISPLIT= 8 Atom -2: X=0.91313340 Y=0.87440000 Z=0.79100000 C 1 NPT= 381 R0=0.00050000 RMT= 1.2500 Z: 6.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -3: X=0.90739070 Y=0.12142770 Z=0.20900000 MULT= 2 ISPLIT= 8 Atom -3: X=0.09260930 Y=0.87857230 Z=0.79100000 C 2 NPT= 381 R0=0.00050000 RMT= 1.2500 Z: 6.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -4: X=0.85589760 Y=0.94944650 Z=0.20900000 MULT= 2 ISPLIT= 8 Atom -4: X=0.14410240 Y=0.05055350 Z=0.79100000 C 3 NPT= 381 R0=0.00050000 RMT= 1.2500 Z: 6.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -5: X=0.00354910 Y=0.84732850 Z=0.20900000 MULT= 2 ISPLIT= 8 Atom -5: X=0.99645090 Y=0.15267150 Z=0.79100000 C 4 NPT= 381 R0=0.00050000 RMT= 1.2500 Z: 6.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -6: X=0.14629600 Y=0.95619730 Z=0.20900000 MULT= 2 ISPLIT= 8 Atom -6: X=0.85370400 Y=0.04380270 Z=0.79100000 C 5 NPT= 381 R0=0.00050000 RMT= 1.2500 Z: 6.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -7: X=0.16444000 Y=0.23976270 Z=0.20566670 MULT= 2 ISPLIT= 8 Atom -7: X=0.83556000 Y=0.76023730 Z=0.79433330 H 1 NPT= 381 R0=0.00050000 RMT= 0.8200 Z: 1.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -8: X=0.82278690 Y=0.23048250 Z=0.20566670 MULT= 2 ISPLIT= 8 Atom -8: X=0.17721310 Y=0.76951750 Z=0.79433330 H 2 NPT= 381 R0=0.00050000 RMT= 0.8200 Z: 1.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -9: X=0.72603630 Y=0.90268330 Z=0.20566670 MULT= 2 ISPLIT= 8 Atom -9: X=0.27396370 Y=0.09731670 Z=0.79433330 H 3 NPT= 381 R0=0.00050000 RMT= 0.8200 Z: 1.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -10: X=0.00789420 Y=0.70937250 Z=0.20566670 MULT= 2 ISPLIT= 8 Atom -10: X=0.99210580 Y=0.29062750 Z=0.79433330 H 4 NPT= 381 R0=0.00050000 RMT= 0.8200 Z: 1.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -11: X=0.27884260 Y=0.91769900 Z=0.20566670 MULT= 2 ISPLIT= 8 Atom -11: X=0.72115740 Y=0.08230100 Z=0.79433330 H 5 NPT= 381 R0=0.00050000 RMT= 0.8200 Z: 1.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 2 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 2 xcrysden-1.6.2/examples/WIEN_struct_files/fe4n.struct0000644000175000017500000000766311712736221021341 0ustar tonetoneFe4N P LATTICE,NONEQUIV. ATOMS 3 MODE OF CALC=RELA 7.141800 7.141800 7.141800 90.000000 90.000000 90.000000 Atom 1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 8 Fe1 NPT= 781 R0=0.00005000 RMT= 1.8000 Z: 26.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.00000000 Y=0.50000000 Z=0.50000000 MULT= 3 ISPLIT= 8 Atom -2: X=0.50000000 Y=0.00000000 Z=0.50000000 Atom -2: X=0.50000000 Y=0.50000000 Z=0.00000000 Fe2 NPT= 781 R0=0.00005000 RMT= 1.8000 Z: 26.0 0.000000000.000000001.00000000 0.000000001.000000000.00000000 1.000000000.000000000.00000000 Atom 3: X=0.50000000 Y=0.50000000 Z=0.50000000 MULT= 1 ISPLIT= 8 N 2 NPT= 781 R0=0.00005000 RMT= 1.7000 Z: 7.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 48 SYMMETRY OPERATIONS: -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 1 1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 2 0 0-1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 3 0 0-1 0.0000000 0-1 0 0.0000000 1 0 0 0.0000000 4 0 0 1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 5 0 0 1 0.0000000 0-1 0 0.0000000 1 0 0 0.0000000 6 -1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 7 1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 8 -1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 9 1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 10 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 11 0 0-1 0.0000000 1 0 0 0.0000000 0-1 0 0.0000000 12 0 0 1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 13 0 0 1 0.0000000 1 0 0 0.0000000 0-1 0 0.0000000 14 -1 0 0 0.0000000 0 0 1 0.0000000 0-1 0 0.0000000 15 1 0 0 0.0000000 0 0 1 0.0000000 0-1 0 0.0000000 16 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 17 0-1 0 0.0000000 0 0-1 0.0000000 1 0 0 0.0000000 18 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 19 0-1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 20 0-1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 21 0-1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 22 0-1 0 0.0000000 0 0 1 0.0000000 -1 0 0 0.0000000 23 0-1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 24 0 1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 25 0 1 0 0.0000000 0 0-1 0.0000000 1 0 0 0.0000000 26 0 1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 27 0 1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 28 0 1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 29 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 30 0 1 0 0.0000000 0 0 1 0.0000000 -1 0 0 0.0000000 31 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 32 -1 0 0 0.0000000 0 0-1 0.0000000 0 1 0 0.0000000 33 1 0 0 0.0000000 0 0-1 0.0000000 0 1 0 0.0000000 34 0 0-1 0.0000000 -1 0 0 0.0000000 0 1 0 0.0000000 35 0 0-1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 36 0 0 1 0.0000000 -1 0 0 0.0000000 0 1 0 0.0000000 37 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 38 -1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 39 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 40 -1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 41 1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 42 0 0-1 0.0000000 0 1 0 0.0000000 -1 0 0 0.0000000 43 0 0-1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 44 0 0 1 0.0000000 0 1 0 0.0000000 -1 0 0 0.0000000 45 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 46 -1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 47 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 48 xcrysden-1.6.2/examples/WIEN_struct_files/ybco7.struct0000644000175000017500000000630711712736221021522 0ustar tonetoneYBA2CU3O7 P LATTICE,NONEQUIV. ATOMS 8 MODE OF CALC=RELA 7.224600 7.344200 22.073300 90.000000 90.000000 90.000000 Atom -1: X=0.50000000 Y=0.50000000 Z=0.50000000 MULT= 1 ISPLIT= 8 Y TTRIUM NPT= 771 R0=0.00050000 RMT= 2.2000 Z: 39.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.50000000 Y=0.50000000 Z=0.18430000 MULT= 2 ISPLIT= 8 Atom -2: X=0.50000000 Y=0.50000000 Z=0.81570000 BaRIUM NPT= 771 R0=0.00050000 RMT= 2.2000 Z: 56.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -3: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 8 Cu1 NPT= 771 R0=0.00050000 RMT= 1.9000 Z: 29.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -4: X=0.00000000 Y=0.00000000 Z=0.35560000 MULT= 2 ISPLIT= 8 Atom -4: X=0.00000000 Y=0.00000000 Z=0.64440000 Cu2 NPT= 771 R0=0.00050000 RMT= 1.9000 Z: 29.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -5: X=0.00000000 Y=0.50000000 Z=0.00000000 MULT= 1 ISPLIT= 8 O 1 NPT= 771 R0=0.00050000 RMT= 1.5500 Z: 8.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -6: X=0.50000000 Y=0.00000000 Z=0.37730000 MULT= 2 ISPLIT= 8 Atom -6: X=0.50000000 Y=0.00000000 Z=0.62270000 O 2 NPT= 771 R0=0.00050000 RMT= 1.5500 Z: 8.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -7: X=0.00000000 Y=0.50000000 Z=0.37890000 MULT= 2 ISPLIT= 8 Atom -7: X=0.00000000 Y=0.50000000 Z=0.62110000 O 3 NPT= 771 R0=0.00050000 RMT= 1.5500 Z: 8.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -8: X=0.00000000 Y=0.00000000 Z=0.15840000 MULT= 2 ISPLIT= 8 Atom -8: X=0.00000000 Y=0.00000000 Z=0.84160000 O 4 NPT= 771 R0=0.00050000 RMT= 1.5500 Z: 8.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 8 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 -1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 2 1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 3 -1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 4 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 5 1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 6 -1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 7 1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 8 xcrysden-1.6.2/examples/WIEN_struct_files/mos2.struct0000644000175000017500000000511211712736221021350 0ustar tonetone MoS2 H LATTICE,NONEQUIV. ATOMS 2 MODE OF CALC=RELA 5.970000 5.970000 23.230000 0.000000 90.000000120.000000 ATOM= -1: X= .33333330 Y= .66666660 Z= .25000000 MULT= 2 ISPLIT= 4 -1: X= .66666660 Y= .33333330 Z= .75000000 Mo NPT= 381 R0=0.00010000 RMT= 2.2000 Z: 42.0 LOCAL ROT MATRIX: 1.0000000 .0000000 .0000000 .0000000 1.0000000 .0000000 .0000000 .0000000 1.0000000 ATOM= -2: X= .33333330 Y= .66666660 Z= .62100000 MULT= 4 ISPLIT= 1 -2: X= .33333330 Y= .66666660 Z= .87900000 -2: X= .66666660 Y= .33333330 Z= .37900000 -2: X= .66666660 Y= .33333330 Z= .12100000 S NPT= 381 R0=0.00010000 RMT= 2.2000 Z: 16.0 LOCAL ROT MATRIX: 1.0000000 .0000000 .0000000 .0000000 1.0000000 .0000000 .0000000 .0000000 1.0000000 24 NUMBER OF SYMMETRY OPERATIONS 1 0 0 .0000000 0 1 0 .0000000 0 0 1 .0000000 1 -1 0 0 .0000000 0-1 0 .0000000 0 0 1 .5000000 2 1 0 0 .0000000 0 1 0 .0000000 0 0-1 .5000000 3 -1 0 0 .0000000 0-1 0 .0000000 0 0-1 .0000000 4 0-1 0 .0000000 1-1 0 .0000000 0 0 1 .0000000 5 0 1 0 .0000000 -1 1 0 .0000000 0 0 1 .5000000 6 0-1 0 .0000000 1-1 0 .0000000 0 0-1 .5000000 7 0 1 0 .0000000 -1 1 0 .0000000 0 0-1 .0000000 8 -1 1 0 .0000000 -1 0 0 .0000000 0 0 1 .0000000 9 1-1 0 .0000000 1 0 0 .0000000 0 0 1 .5000000 10 -1 1 0 .0000000 -1 0 0 .0000000 0 0-1 .5000000 11 1-1 0 .0000000 1 0 0 .0000000 0 0-1 .0000000 12 0 1 0 .0000000 1 0 0 .0000000 0 0 1 .5000000 13 0-1 0 .0000000 -1 0 0 .0000000 0 0 1 .0000000 14 0 1 0 .0000000 1 0 0 .0000000 0 0-1 .0000000 15 0-1 0 .0000000 -1 0 0 .0000000 0 0-1 .5000000 16 -1 0 0 .0000000 -1 1 0 .0000000 0 0 1 .5000000 17 1 0 0 .0000000 1-1 0 .0000000 0 0 1 .0000000 18 -1 0 0 .0000000 -1 1 0 .0000000 0 0-1 .0000000 19 1 0 0 .0000000 1-1 0 .0000000 0 0-1 .5000000 20 1-1 0 .0000000 0-1 0 .0000000 0 0 1 .5000000 21 -1 1 0 .0000000 0 1 0 .0000000 0 0 1 .0000000 22 1-1 0 .0000000 0-1 0 .0000000 0 0-1 .0000000 23 -1 1 0 .0000000 0 1 0 .0000000 0 0-1 .5000000 24 xcrysden-1.6.2/examples/WIEN_struct_files/pt.struct0000644000175000017500000003753511712736221021131 0ustar tonetoneTitle F LATTICE,NONEQUIV. ATOMS 1 MODE OF CALC=RELA 7.515955 7.515955 7.515955 90.000000 90.000000 90.000000 ATOM= 1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 0 Pt NPT= 781 R0=0.00000500 RMT= 2.5500 Z: 78.0 LOCAL ROT MATRIX: 1.0000000 0.0000000 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 1.0000000 48 NUMBER OF SYMMETRY OPERATIONS 1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 1 1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 2 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 3 -1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 4 0 1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 5 0 0 1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 6 0 1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 7 0 0 1 0.0000000 1 0 0 0.0000000 0-1 0 0.0000000 8 0 1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 9 0 0 1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 10 0 1 0 0.0000000 0 0-1 0.0000000 1 0 0 0.0000000 11 0 0 1 0.0000000 0-1 0 0.0000000 1 0 0 0.0000000 12 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 13 0-1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 14 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 15 0 0-1 0.0000000 1 0 0 0.0000000 0-1 0 0.0000000 16 1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 17 -1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 18 1 0 0 0.0000000 0 0 1 0.0000000 0-1 0 0.0000000 19 -1 0 0 0.0000000 0 0 1 0.0000000 0-1 0 0.0000000 20 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 21 0 0-1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 22 0-1 0 0.0000000 0 0-1 0.0000000 1 0 0 0.0000000 23 0 0-1 0.0000000 0-1 0 0.0000000 1 0 0 0.0000000 24 0 0 1 0.0000000 0 1 0 0.0000000 -1 0 0 0.0000000 25 0 1 0 0.0000000 0 0 1 0.0000000 -1 0 0 0.0000000 26 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 27 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 28 1 0 0 0.0000000 0 0-1 0.0000000 0 1 0 0.0000000 29 -1 0 0 0.0000000 0 0-1 0.0000000 0 1 0 0.0000000 30 1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 31 -1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 32 0 0 1 0.0000000 -1 0 0 0.0000000 0 1 0 0.0000000 33 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 34 0 1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 35 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 36 0 0-1 0.0000000 0 1 0 0.0000000 -1 0 0 0.0000000 37 0-1 0 0.0000000 0 0 1 0.0000000 -1 0 0 0.0000000 38 0 0-1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 39 0-1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 40 0 0-1 0.0000000 -1 0 0 0.0000000 0 1 0 0.0000000 41 0-1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 42 0 0-1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 43 0-1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 44 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 45 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 46 -1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 47 -1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 48 xcrysden-1.6.2/examples/WIEN_struct_files/si111.struct0000644000175000017500000000242411712736221021331 0ustar tonetoneSi 111 Trigonal (for Phonon) F LATTICE,NONEQUIV. ATOMS 1 MODE OF CALC=RELA 10.260000 10.260000 10.260000 90.000000 90.000000 90.000000 Atom -1: X=0.12250000 Y=0.12250000 Z=0.12250000 MULT= 2 ISPLIT= 4 Atom -1: X=0.87750000 Y=0.87750000 Z=0.87750000 Si NPT= 381 R0=0.00010655 RMT= 2.0000 Z: 14.0 0.40824800-0.707107000.57735000 0.408248000.707107000.57735000 -0.816497000.000000000.57735000 12 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 2 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 3 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 4 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 5 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 6 0 0-1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 7 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 8 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 9 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 10 -1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 11 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 12 xcrysden-1.6.2/examples/WIEN_struct_files/coo.struct0000644000175000017500000000353011712736221021252 0ustar tonetoneCoO AF-II R LATTICE,NONEQUIV. ATOMS 3 MODE OF CALC=RELA 5.522130 5.522130 27.052800 90.000000 90.000000 90.000000 Atom -1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 8 Co1 NPT= 381 R0=0.00050000 RMT= 2.0000 Z: 27.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.50000000 Y=0.50000000 Z=0.50000000 MULT= 1 ISPLIT= 8 Co2 NPT= 381 R0=0.00050000 RMT= 2.0000 Z: 27.0 -1.000000000.000000000.00000000 0.00000000-1.000000000.00000000 0.000000000.000000001.00000000 Atom -3: X=0.25000000 Y=0.25000000 Z=0.25000000 MULT= 2 ISPLIT= 8 Atom -3: X=0.75000000 Y=0.75000000 Z=0.75000000 O 2 NPT= 381 R0=0.00050000 RMT= 1.7500 Z: 8.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 12 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 2 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 3 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 4 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 5 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 6 0 0-1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 7 0-1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 8 0 0-1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 9 0-1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 10 -1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 11 -1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 12 xcrysden-1.6.2/examples/WIEN_struct_files/cd8te7sb.struct0000644000175000017500000001172311712736221022120 0ustar tonetone Cd8Te7Sb F LATTICE,NONEQUIV. ATOMS 16 MODE OF CALC=RELA 24.491000 24.491000 24.491000 90.000000 90.000000 90.000000 Atom -1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 2 Sb NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 51.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.12500000 Y=0.12500000 Z=0.12500000 MULT= 1 ISPLIT= 2 Cd1 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -3: X=0.37500000 Y=0.37500000 Z=0.12500000 MULT= 1 ISPLIT= 2 Cd2 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -4: X=0.37500000 Y=0.12500000 Z=0.37500000 MULT= 1 ISPLIT= 2 Cd3 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -5: X=0.12500000 Y=0.37500000 Z=0.37500000 MULT= 1 ISPLIT= 2 Cd4 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -6: X=0.25000000 Y=0.25000000 Z=0.00000000 MULT= 1 ISPLIT= 2 Te1 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 52.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -7: X=0.25000000 Y=0.00000000 Z=0.25000000 MULT= 1 ISPLIT= 2 Te2 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 52.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -8: X=0.00000000 Y=0.25000000 Z=0.25000000 MULT= 1 ISPLIT= 2 Te3 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 52.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -9: X=0.75000000 Y=0.75000000 Z=0.50000000 MULT= 1 ISPLIT= 2 Te4 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 52.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -10: X=0.75000000 Y=0.50000000 Z=0.75000000 MULT= 1 ISPLIT= 2 Te5 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 52.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -11: X=0.50000000 Y=0.75000000 Z=0.75000000 MULT= 1 ISPLIT= 2 Te6 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 52.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -12: X=0.62500000 Y=0.62500000 Z=0.62500000 MULT= 1 ISPLIT= 2 Cd5 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -13: X=0.87500000 Y=0.87500000 Z=0.62500000 MULT= 1 ISPLIT= 2 Cd6 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -14: X=0.87500000 Y=0.62500000 Z=0.87500000 MULT= 1 ISPLIT= 2 Cd7 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -15: X=0.62500000 Y=0.87500000 Z=0.87500000 MULT= 1 ISPLIT= 2 Cd8 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -16: X=0.50000000 Y=0.50000000 Z=0.50000000 MULT= 1 ISPLIT= 2 Te7 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 52.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 1 SYMMETRY OPERATIONS: 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 1 xcrysden-1.6.2/examples/WIEN_struct_files/al2o3.struct0000644000175000017500000000323711712736221021416 0ustar tonetone Korund R-3c R 2 RELA 8.9894300 8.989430024.543200090.000000090.000000090.0000000 -1 .3519208 .3519208 .3519208 4 1 -1 .8519208 .8519208 .8519208 -1 .1480792 .1480792 .1480792 -1 .6480792 .6480792 .6480792 Al 781 .000500000 1.70000 13.00000 1.00000000 .00000000 .00000000 .000000001.00000000 .00000000 .00000000 .000000001.00000000 -2 .9437520 .5562480 .2500000 6 6 -2 .5562480 .2500000 .9437520 -2 .2500000 .9437520 .5562480 -2 .0562480 .4437520 .7500000 -2 .4437520 .7500000 .0562480 -2 .7500000 .0562480 .4437520 0 781 .000500000 1.70000 8.00000 1.00000000 .00000000 .00000000 .00000000 .000000001.00000000 .000000001.00000000 .00000000 12 1 0 0 .00 0 1 0 .00 0 0 1 .00 1 -1 0 0 .00 0-1 0 .00 0 0-1 .00 2 0 1 0 .00 0 0 1 .00 1 0 0 .00 3 0 0 1 .00 1 0 0 .00 0 1 0 .00 4 0 0-1 .00 -1 0 0 .00 0-1 0 .00 5 0-1 0 .00 0 0-1 .00 -1 0 0 .00 6 0 0-1 .50 0-1 0 .50 -1 0 0 .50 7 0-1 0 .50 -1 0 0 .50 0 0-1 .50 8 1 0 0 .50 0 0 1 .50 0 1 0 .50 9 0 1 0 .50 1 0 0 .50 0 0 1 .50 10 -1 0 0 .50 0 0-1 .50 0-1 0 .50 11 0 0 1 .50 0 1 0 .50 1 0 0 .50 12 xcrysden-1.6.2/examples/WIEN_struct_files/cd16te15sb.struct0000644000175000017500000001060611712736221022255 0ustar tonetone Cd16Te15Sb B LATTICE,NONEQUIV. ATOMS 5 MODE OF CALC=RELA 24.491000 24.491000 24.491000 90.000000 90.000000 90.000000 Atom 1: X=0.00000000 Y=0.00000000 Z=0.00000000 MULT= 1 ISPLIT= 8 Sb NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 51.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.12426410 Y=0.12426410 Z=0.12426410 MULT= 4 ISPLIT= 8 Atom -2: X=0.87573590 Y=0.87573590 Z=0.12426410 Atom -2: X=0.12426410 Y=0.87573590 Z=0.87573590 Atom -2: X=0.87573590 Y=0.12426410 Z=0.87573590 Cd1 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 0.40824800-0.707107000.57735000 0.408248000.707107000.57735000 -0.816497000.000000000.57735000 Atom -3: X=0.25081660 Y=0.25081660 Z=0.99972220 MULT=12 ISPLIT= 8 Atom -3: X=0.25081660 Y=0.99972220 Z=0.25081660 Atom -3: X=0.99972220 Y=0.25081660 Z=0.25081660 Atom -3: X=0.74918340 Y=0.74918340 Z=0.99972220 Atom -3: X=0.25081660 Y=0.00027780 Z=0.74918340 Atom -3: X=0.00027780 Y=0.25081660 Z=0.74918340 Atom -3: X=0.74918340 Y=0.25081660 Z=0.00027780 Atom -3: X=0.74918340 Y=0.00027780 Z=0.25081660 Atom -3: X=0.99972220 Y=0.74918340 Z=0.74918340 Atom -3: X=0.25081660 Y=0.74918340 Z=0.00027780 Atom -3: X=0.74918340 Y=0.99972220 Z=0.74918340 Atom -3: X=0.00027780 Y=0.74918340 Z=0.25081660 Te1 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 52.0 0.000000000.70710700-0.70710700 0.000000000.707107000.70710700 1.000000000.000000000.00000000 Atom -4: X=0.37531700 Y=0.37531700 Z=0.12521920 MULT=12 ISPLIT= 8 Atom -4: X=0.37531700 Y=0.12521920 Z=0.37531700 Atom -4: X=0.12521920 Y=0.37531700 Z=0.37531700 Atom -4: X=0.62468300 Y=0.62468300 Z=0.12521920 Atom -4: X=0.87478080 Y=0.62468300 Z=0.37531700 Atom -4: X=0.62468300 Y=0.87478080 Z=0.37531700 Atom -4: X=0.12521920 Y=0.62468300 Z=0.62468300 Atom -4: X=0.37531700 Y=0.87478080 Z=0.62468300 Atom -4: X=0.37531700 Y=0.62468300 Z=0.87478080 Atom -4: X=0.62468300 Y=0.12521920 Z=0.62468300 Atom -4: X=0.87478080 Y=0.37531700 Z=0.62468300 Atom -4: X=0.62468300 Y=0.37531700 Z=0.87478080 Cd2 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 48.0 0.000000000.70710700-0.70710700 0.000000000.707107000.70710700 1.000000000.000000000.00000000 Atom -5: X=0.50000000 Y=0.50000000 Z=0.00000000 MULT= 3 ISPLIT= 8 Atom -5: X=0.00000000 Y=0.50000000 Z=0.50000000 Atom -5: X=0.50000000 Y=0.00000000 Z=0.50000000 Te2 NPT= 381 R0=0.00050000 RMT= 2.3000 Z: 52.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 24 SYMMETRY OPERATIONS: -1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 1 -1 0 0 0.0000000 0 0-1 0.0000000 0 1 0 0.0000000 2 0 0-1 0.0000000 0 1 0 0.0000000 -1 0 0 0.0000000 3 0 1 0 0.0000000 0 0-1 0.0000000 -1 0 0 0.0000000 4 0 0-1 0.0000000 -1 0 0 0.0000000 0 1 0 0.0000000 5 0 1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 6 -1 0 0 0.0000000 0 0 1 0.0000000 0-1 0 0.0000000 7 -1 0 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 8 0 0-1 0.0000000 1 0 0 0.0000000 0-1 0 0.0000000 9 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 10 0 0-1 0.0000000 0-1 0 0.0000000 1 0 0 0.0000000 11 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 12 0-1 0 0.0000000 0 0 1 0.0000000 -1 0 0 0.0000000 13 0 0 1 0.0000000 0-1 0 0.0000000 -1 0 0 0.0000000 14 0-1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 15 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 16 1 0 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 17 1 0 0 0.0000000 0 0 1 0.0000000 0 1 0 0.0000000 18 0-1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 19 0 0 1 0.0000000 -1 0 0 0.0000000 0-1 0 0.0000000 20 0-1 0 0.0000000 0 0-1 0.0000000 1 0 0 0.0000000 21 0 0 1 0.0000000 0 1 0 0.0000000 1 0 0 0.0000000 22 1 0 0 0.0000000 0 0-1 0.0000000 0-1 0 0.0000000 23 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 24 xcrysden-1.6.2/examples/WIEN_struct_files/cr2o3.struct0000644000175000017500000000335111712736221021423 0ustar tonetoneCr2O3 (a=5.35, alpha=55,1) AF R LATTICE,NONEQUIV. ATOMS 3 MODE OF CALC=RELA 9.354150 9.354150 25.643600 90.000000 90.000000 90.000000 Atom -1: X=0.14500000 Y=0.14500000 Z=0.14500000 MULT= 2 ISPLIT= 8 Atom -1: X=0.64500000 Y=0.64500000 Z=0.64500000 Cr1 NPT= 781 R0=0.00010000 RMT= 1.8000 Z: 24.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.35500000 Y=0.35500000 Z=0.35500000 MULT= 2 ISPLIT= 8 Atom -2: X=0.85500000 Y=0.85500000 Z=0.85500000 Cr2 NPT= 781 R0=0.00010000 RMT= 1.8000 Z: 24.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -3: X=0.55000000 Y=0.95000000 Z=0.25000000 MULT= 6 ISPLIT= 8 Atom -3: X=0.25000000 Y=0.55000000 Z=0.95000000 Atom -3: X=0.95000000 Y=0.25000000 Z=0.55000000 Atom -3: X=0.45000000 Y=0.05000000 Z=0.75000000 Atom -3: X=0.75000000 Y=0.45000000 Z=0.05000000 Atom -3: X=0.05000000 Y=0.75000000 Z=0.45000000 O 2 NPT= 781 R0=0.00050000 RMT= 1.7000 Z: 8.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 6 SYMMETRY OPERATIONS: 0 0 1 0.0000000 1 0 0 0.0000000 0 1 0 0.0000000 1 0 1 0 0.0000000 0 0 1 0.0000000 1 0 0 0.0000000 2 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 3 0 1 0 0.5000000 1 0 0 0.5000000 0 0 1 0.5000000 4 1 0 0 0.5000000 0 0 1 0.5000000 0 1 0 0.5000000 5 0 0 1 0.5000000 0 1 0 0.5000000 1 0 0 0.5000000 6 xcrysden-1.6.2/examples/WIEN_struct_files/fe2p.struct0000644000175000017500000000440311712736221021326 0ustar tonetoneFe2P H LATTICE,NONEQUIV. ATOMS 4 MODE OF CALC=RELA 11.088000 11.088000 6.534860 90.000000 90.000000120.000000 Atom -1: X=0.00000000 Y=0.00000000 Z=0.50000000 MULT= 1 ISPLIT= 8 P 1 NPT= 781 R0=0.00050000 RMT= 2.0000 Z: 15.0 0.000000001.000000000.00000000 1.000000000.000000000.00000000 0.000000000.000000001.00000000 Atom -2: X=0.33333330 Y=0.66666670 Z=0.00000000 MULT= 2 ISPLIT= 8 Atom -2: X=0.66666670 Y=0.33333330 Z=0.00000000 P 2 NPT= 781 R0=0.00050000 RMT= 2.0000 Z: 15.0 1.000000000.000000000.00000000 0.000000001.000000000.00000000 0.000000000.000000001.00000000 Atom -3: X=0.00000000 Y=0.25683000 Z=0.00000000 MULT= 3 ISPLIT= 8 Atom -3: X=0.74317000 Y=0.74317000 Z=0.00000000 Atom -3: X=0.25683000 Y=0.00000000 Z=0.00000000 Fe1 NPT= 781 R0=0.00050000 RMT= 2.0000 Z: 26.0 1.000000000.000000000.00000000 0.000000000.000000001.00000000 0.000000001.000000000.00000000 Atom -4: X=0.00000000 Y=0.59461000 Z=0.50000000 MULT= 3 ISPLIT= 8 Atom -4: X=0.59461000 Y=0.00000000 Z=0.50000000 Atom -4: X=0.40539000 Y=0.40539000 Z=0.50000000 Fe2 NPT= 781 R0=0.00050000 RMT= 2.0000 Z: 26.0 1.000000000.000000000.00000000 0.000000000.000000001.00000000 0.000000001.000000000.00000000 12 SYMMETRY OPERATIONS: 1-1 0 0.0000000 0-1 0 0.0000000 0 0-1 0.0000000 1 -1 1 0 0.0000000 -1 0 0 0.0000000 0 0-1 0.0000000 2 0-1 0 0.0000000 1-1 0 0.0000000 0 0-1 0.0000000 3 -1 0 0 0.0000000 -1 1 0 0.0000000 0 0-1 0.0000000 4 0 1 0 0.0000000 1 0 0 0.0000000 0 0-1 0.0000000 5 1 0 0 0.0000000 0 1 0 0.0000000 0 0-1 0.0000000 6 1-1 0 0.0000000 0-1 0 0.0000000 0 0 1 0.0000000 7 -1 1 0 0.0000000 -1 0 0 0.0000000 0 0 1 0.0000000 8 0-1 0 0.0000000 1-1 0 0.0000000 0 0 1 0.0000000 9 -1 0 0 0.0000000 -1 1 0 0.0000000 0 0 1 0.0000000 10 0 1 0 0.0000000 1 0 0 0.0000000 0 0 1 0.0000000 11 1 0 0 0.0000000 0 1 0 0.0000000 0 0 1 0.0000000 12 xcrysden-1.6.2/examples/WIEN_struct_files/tellur.struct0000644000175000017500000000134511712736221022003 0ustar tonetone Tellur (P3121) H LATTICE,NONEQUIV.ATOMS 1,NEW format MODE OF CALC=RELA POINTGROUP:32 9.4100000 9.4100000 11.199000 ATOM= -1: X= .7646800 Y= .7646800 Z= 0.0000000 MULT= 3 ISPLIT= 8 ATOM= -1: X= .2353200 Y= .0000000 Z= 0.3333333 ATOM= -1: X= .0000000 Y= .2353200 Z= 0.6666667 Te NPT= 381 R0=.000100000 RMT=2.100000000 Z:52.0 LOCAL ROT.MATRIX: 0.0 0.5000000 0.8660254 0.0000000 -.8660254 0.5000000 1.0000000 0.0000000 0.0 6 IORD OF GROUP G0 010000 000100 000001 1 000100 010000 0000-1 2 00-100 01-100 000001 .3333333 3 -10000 -10100 0000-1 .3333333 4 -10100 -10000 000001 .6666667 5 01-100 00-100 0000-1 .6666667 6 xcrysden-1.6.2/examples/PWSCF_files/0000755000175000017500000000000013556022211015732 5ustar tonetonexcrysden-1.6.2/examples/PWSCF_files/CH3Rh111.out0000644000175000017500000024642311712736221017575 0ustar tonetone Program PWSCF 1.2.0 starts ... Today is 5Sep2003 at 2:12:33 Parallel version (MPI) Number of processors in use: 4 R & G space division: nprocp = 4 Ultrasoft (Vanderbilt) Pseudopotentials Complex Hamiltonian current dimensions of program pwscf are: ntypx= 6 npsx = 6 lmax = 3 npk =40000 nbrx = 6 lqmax = 7 nqfm = 8 Warning: card ignored Warning: card ignored Warning: card ignored Warning: card ignored Warning: card ignored current restart_mode = restart current disk_io mode = default RECOVER from restart file has been switched off on input Starting configuration read from file TOP-fcc.save Reading file TOP-fcc.save Writing file TOP-fcc.save file written Planes per process (thick) : nr3 =132 npp = 33 ncplane = 3136 Planes per process (smooth): nr3s= 96 npps= 24 ncplanes= 1296 --- Executing new GGEN Loop --- Title: CH3 + Rh(111)-1x1-3L(1R+2F) bravais-lattice index = 0 lattice parameter (a_0) = 10.3550 a.u. unit-cell volume = 2596.2491 (a.u.)^3 number of atoms/cell = 16 number of atomic types = 3 kinetic-energy cutoff = 27.0000 Ry charge density cutoff = 216.0000 Ry convergence threshold = 1.0E-06 beta = .3000 number of iterations used = 8 local-TF mixing Exchange-correlation = ? (1434) iswitch = 1 nstep = 50 celldm(1)= 10.35501 celldm(2)= .00000 celldm(3)= .00000 celldm(4)= .00000 celldm(5)= .00000 celldm(6)= .00000 crystal axes: (cart. coord. in units of a_0) a(1) = ( 1.0000 .0000 .0000 ) a(2) = ( -.5000 .8660 .0000 ) a(3) = ( .0000 .0000 2.7000 ) reciprocal axes: (cart. coord. in units 2 pi/a_0) b(1) = ( 1.0000 .5774 .0000 ) b(2) = ( .0000 1.1547 .0000 ) b(3) = ( .0000 .0000 .3704 ) PSEUDO 1 is H (US) zval = 1.0 lmax= 1 lloc= 0 Version 0 0 0 of US pseudo code Using log mesh of 1061 points The pseudopotential has 2 beta functions with: l(1) = 0 l(2) = 0 Q(r) pseudized with 0 coefficients, rinner = .000 .000 .000 PSEUDO 2 is C (US) zval = 4.0 lmax= 2 lloc= 0 Version 0 0 0 of US pseudo code Using log mesh of 627 points The pseudopotential has 4 beta functions with: l(1) = 0 l(2) = 0 l(3) = 1 l(4) = 1 Q(r) pseudized with 0 coefficients, rinner = .000 .000 .000 .000 .000 PSEUDO 3 is Rh (US) zval = 9.0 lmax= 2 lloc= 0 Version 0 0 0 of US pseudo code Using log mesh of 1191 points The pseudopotential has 3 beta functions with: l(1) = 1 l(2) = 2 l(3) = 2 Q(r) pseudized with 0 coefficients, rinner = .000 .000 .000 .000 .000 atomic species valence mass pseudopotential H 1.00 1.00000 H ( 1.00) C 4.00 1.00000 C ( 1.00) Rh 9.00 1.00000 Rh( 1.00) No symmetry! Cartesian axes site n. atom positions (a_0 units) 1 H tau( 1) = ( -.1657590 -.0955104 1.2559945 ) 2 H tau( 2) = ( .1659009 -.0954643 1.2557377 ) 3 H tau( 3) = ( .0000000 .1917322 1.2548077 ) 4 C tau( 4) = ( .0000000 .0000000 1.1886906 ) 5 Rh tau( 5) = ( .0000000 .0000000 .8054534 ) 6 Rh tau( 6) = ( .7499998 -.4330126 .8054534 ) 7 Rh tau( 7) = ( .4999998 .0000000 .8054534 ) 8 Rh tau( 8) = ( .2499999 -.4330126 .8054534 ) 9 Rh tau( 9) = ( -.2499999 .1443376 .4082482 ) 10 Rh tau( 10) = ( .0000000 -.2886750 .4082482 ) 11 Rh tau( 11) = ( .4999998 -.2886750 .4082482 ) 12 Rh tau( 12) = ( .2499999 .1443376 .4082482 ) 13 Rh tau( 13) = ( -.4999998 .2886750 .0000000 ) 14 Rh tau( 14) = ( -.2499999 -.1443376 .0000000 ) 15 Rh tau( 15) = ( .2499999 -.1443376 .0000000 ) 16 Rh tau( 16) = ( .0000000 .2886750 .0000000 ) number of k points= 8 gaussian broad. (ryd)= .0300 ngauss = 1 cart. coord. in units 2pi/a_0 k( 1) = ( .1250000 .2165064 -.1851852), wk = .2500000 k( 2) = ( .1250000 .5051815 -.1851852), wk = .2500000 k( 3) = ( .1250000 -.3608439 -.1851852), wk = .2500000 k( 4) = ( .1250000 -.0721688 -.1851852), wk = .2500000 k( 5) = ( .3750000 .3608439 -.1851852), wk = .2500000 k( 6) = ( .3750000 .6495191 -.1851852), wk = .2500000 k( 7) = ( .3750000 -.2165064 -.1851852), wk = .2500000 k( 8) = ( .3750000 .0721688 -.1851852), wk = .2500000 G cutoff = 586.6719 ( 139091 G-vectors) FFT grid: ( 56, 56,132) G cutoff = 293.3360 ( 49197 G-vectors) smooth grid: ( 36, 36, 96) nbndx = 552 nbnd = 69 natomwfc = 79 npwx = 1566 nelec = 115.00 nkb = 170 ngl = 5780 The initial density is read from file TOP-fcc.rho Starting wfc from file Dynamical memory: 38.46Mb current, 46.24Mb maximum total cpu time spent up to now is 5.56 secs iteration # 1 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 5.6 total energy = -545.21310561 ryd estimated scf accuracy < .00072885 ryd total cpu time spent up to now is 61.51 secs iteration # 2 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 4.9 total energy = -545.21357494 ryd estimated scf accuracy < .00021685 ryd total cpu time spent up to now is 116.49 secs iteration # 3 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 4.8 total energy = -545.21362068 ryd estimated scf accuracy < .00015172 ryd total cpu time spent up to now is 158.95 secs iteration # 4 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 4.9 total energy = -545.21372321 ryd estimated scf accuracy < .00002951 ryd total cpu time spent up to now is 201.87 secs iteration # 5 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 4.0 total energy = -545.21373977 ryd estimated scf accuracy < .00000964 ryd total cpu time spent up to now is 236.69 secs iteration # 6 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 4.2 total energy = -545.21374177 ryd estimated scf accuracy < .00000307 ryd total cpu time spent up to now is 271.14 secs iteration # 7 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 2.4 total energy = -545.21374248 ryd estimated scf accuracy < .00000185 ryd total cpu time spent up to now is 299.65 secs iteration # 8 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 4.0 k = .1250 .2165 -.1852 ( 6180 PWs) bands (ev): -7.2477 -1.7434 -.7444 -.7095 -.5273 -.4958 -.3968 -.3747 -.3043 -.2538 -.2395 -.1875 -.0612 .0155 .0834 .3929 .3938 .5332 1.2301 1.3227 1.3813 1.3969 1.7024 1.8159 1.8469 1.8701 1.8891 1.9914 2.1442 2.1962 2.2459 2.3119 2.3928 2.4777 2.6041 2.8370 2.8450 2.8748 3.2215 3.3884 3.5430 3.5828 3.6290 3.6468 3.7289 3.7737 3.8169 3.9227 4.1761 4.2916 4.3907 4.4351 4.5498 4.6021 4.6124 4.6701 4.7896 4.8205 4.9340 4.9671 5.0524 5.0935 5.2710 5.2895 5.3165 5.4313 6.1179 6.1803 6.6258 k = .1250 .5052 -.1852 ( 6146 PWs) bands (ev): -7.2318 -.8086 -.6619 -.6082 -.3990 .0563 .0685 .1160 .1565 .2191 .3331 .4207 .4482 .5017 .5853 .8592 .8905 .9882 1.0309 1.2390 1.3153 1.4296 1.4618 1.5609 1.6637 1.8417 1.9571 2.1035 2.1921 2.2248 2.2697 2.3285 2.3622 2.3878 2.4671 2.5655 2.6039 2.7430 2.7791 2.8065 2.8720 2.9347 2.9972 3.0244 3.0949 3.4186 3.4444 3.5384 3.6002 3.7032 3.7603 3.8443 3.8981 3.9922 4.1559 4.2569 4.3405 4.4054 4.5367 4.6087 4.7722 4.8995 4.9741 5.0193 5.1308 5.2261 5.2529 6.2738 6.5433 k = .1250 -.3608 -.1852 ( 6170 PWs) bands (ev): -7.2385 -1.3028 -.6966 -.6411 -.3752 -.2166 -.1355 -.1083 -.0671 -.0196 .0933 .1334 .1581 .1779 .2935 .6141 .7610 .8668 1.1892 1.2440 1.3534 1.4478 1.5268 1.5935 1.8630 1.8776 1.9126 2.0182 2.0899 2.2149 2.3164 2.3628 2.4346 2.5237 2.5457 2.5699 2.6182 2.8515 3.1046 3.2135 3.2582 3.2974 3.3769 3.4200 3.4813 3.5483 3.5761 3.6174 3.6829 3.7162 3.8261 4.0670 4.1253 4.2556 4.2973 4.4648 4.4914 4.5769 4.7469 4.8329 4.9137 4.9746 5.0476 5.2010 5.2471 5.3082 5.6768 6.0748 6.4073 k = .1250 -.0722 -.1852 ( 6156 PWs) bands (ev): -7.2542 -1.9882 -.8065 -.7862 -.6764 -.6410 -.5497 -.5135 -.4928 -.4204 -.3661 -.3477 -.1672 -.0365 -.0191 .2152 .2700 .2705 1.2159 1.3481 1.3623 1.4025 1.7751 1.7867 1.8027 1.8583 1.9676 2.0094 2.1473 2.2025 2.2639 2.2786 2.3162 2.4928 2.6330 2.6515 3.0381 3.0542 3.5434 3.6169 3.6477 3.6960 3.7245 3.7394 3.8390 3.9270 3.9296 4.1882 4.3231 4.5928 4.7199 4.7400 4.7829 4.8270 4.8509 4.9216 4.9826 4.9988 5.0253 5.1251 5.2784 5.3008 5.4496 5.4629 5.4778 5.5436 6.0449 6.3193 6.9439 k = .3750 .3608 -.1852 ( 6146 PWs) bands (ev): -7.2319 -.8084 -.6609 -.6096 -.3987 .0562 .0686 .1160 .1565 .2188 .3332 .4208 .4483 .5018 .5852 .8592 .8904 .9881 1.0306 1.2391 1.3149 1.4297 1.4617 1.5608 1.6637 1.8421 1.9572 2.1038 2.1922 2.2252 2.2693 2.3285 2.3623 2.3879 2.4677 2.5651 2.6039 2.7426 2.7795 2.8064 2.8718 2.9349 2.9968 3.0241 3.0950 3.4186 3.4443 3.5384 3.6001 3.7031 3.7603 3.8442 3.8980 3.9923 4.1559 4.2569 4.3406 4.4055 4.5367 4.6087 4.7721 4.8996 4.9741 5.0193 5.1306 5.2260 5.2529 6.2739 6.5433 k = .3750 .6495 -.1852 ( 6112 PWs) bands (ev): -7.2290 -.6939 -.6153 -.3433 -.3111 .0440 .2550 .2843 .3536 .3579 .4518 .5097 .5680 .6256 .6551 .8052 .8875 .9622 .9700 1.2846 1.3116 1.3255 1.5763 1.6109 1.8104 1.8667 1.9355 1.9627 1.9868 2.0073 2.0578 2.0960 2.1346 2.3111 2.3433 2.4022 2.5569 2.6225 2.6412 2.6515 2.7016 2.7698 2.8555 2.9209 3.2712 3.3565 3.5231 3.5811 3.7023 3.7469 3.7608 3.8622 3.9697 4.1181 4.2500 4.4064 4.4483 4.6572 4.6675 4.6960 4.7674 4.8512 4.8994 4.9645 5.0165 5.0572 5.2268 5.5065 5.9094 k = .3750 -.2165 -.1852 ( 6154 PWs) bands (ev): -7.2357 -1.1265 -.6946 -.6221 -.4488 -.1047 -.0837 -.0320 -.0088 .1404 .2115 .2471 .2908 .3113 .3253 .6488 .9374 .9587 1.1179 1.2964 1.3522 1.3917 1.4688 1.5804 1.7550 1.8712 1.9585 2.1179 2.1606 2.2435 2.3372 2.4115 2.4420 2.4809 2.5461 2.5927 2.6914 2.7242 2.9810 3.0785 3.1122 3.1959 3.2521 3.3297 3.3487 3.4237 3.4648 3.5136 3.5914 3.6952 3.7010 4.0285 4.0380 4.1504 4.2533 4.2946 4.3866 4.4371 4.4791 4.5999 4.7178 4.9501 5.0587 5.1162 5.1287 5.3194 5.3453 6.0982 7.1719 k = .3750 .0722 -.1852 ( 6170 PWs) bands (ev): -7.2385 -1.3027 -.6950 -.6429 -.3749 -.2165 -.1351 -.1083 -.0671 -.0199 .0929 .1333 .1581 .1779 .2935 .6141 .7610 .8668 1.1885 1.2441 1.3537 1.4472 1.5269 1.5949 1.8630 1.8776 1.9126 2.0180 2.0898 2.2151 2.3164 2.3628 2.4348 2.5238 2.5457 2.5699 2.6182 2.8511 3.1047 3.2135 3.2583 3.2974 3.3768 3.4198 3.4814 3.5482 3.5759 3.6177 3.6830 3.7160 3.8259 4.0669 4.1253 4.2555 4.2973 4.4649 4.4915 4.5767 4.7469 4.8329 4.9138 4.9746 5.0476 5.2009 5.2470 5.3082 5.6771 6.0745 6.4073 the Fermi energy is 4.6669 ev ! total energy = -545.21374359 ryd estimated scf accuracy < .00000016 ryd band energy sum = 15.56828740 ryd one-electron contribution = -2114.48297326 ryd hartree contribution = 1132.57803104 ryd xc contribution = -103.88093227 ryd ewald contribution = 540.57670807 ryd scf in/out correction = -.00741985 ryd correction for metals = -.00457717 ryd convergence has been achieved Forces acting on atoms (Ry/au): atom 1 type 1 force = .01178589 .00671649 -.00370617 atom 2 type 1 force = -.01165606 .00670024 -.00383326 atom 3 type 1 force = .00005964 -.01367884 -.00324235 atom 4 type 2 force = -.00039172 .00052728 .01765618 atom 5 type 3 force = .00121949 -.00092669 .02380124 atom 6 type 3 force = .00135980 -.00076028 -.00695406 atom 7 type 3 force = -.00012820 .00261244 -.00640033 atom 8 type 3 force = -.00234086 -.00118075 -.00639205 atom 9 type 3 force = .00105344 -.00059192 -.01550843 atom 10 type 3 force = -.00016400 .00099932 -.01525184 atom 11 type 3 force = .00038398 -.00022161 -.02050865 atom 12 type 3 force = -.00094181 -.00033875 -.01522757 atom 13 type 3 force = -.00023035 .00015061 .00844688 atom 14 type 3 force = .00146416 .00040259 .01574347 atom 15 type 3 force = -.00185215 .00106313 .01562834 atom 16 type 3 force = .00037876 -.00147325 .01574860 Total force = .267804 Total SCF correction = .002682 EPSE = .10E-03 EPSF = .10E-02 UPSCALE = 10.00 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 1, scf threshold 2.01E-07 H -.164620776 -.094861776 1.255636555 H .164775276 -.094817290 1.255367562 H .000005758 .190411262 1.254494619 C -.000037829 .000050920 1.190395662 Rh .000117768 -.000089492 .807751880 Rh .750131092 -.433085991 .804781792 Rh .499987468 .000252287 .804835267 Rh .249773864 -.433126596 .804836067 Rh -.249999925 .144337556 .408248177 Rh .000000000 -.288675013 .408248177 Rh .499999849 -.288675013 .408248177 Rh .249999925 .144337556 .408248177 Rh -.499999849 .288675013 .000000000 Rh -.249999925 -.144337556 .000000000 Rh .249999925 -.144337556 .000000000 Rh .000000000 .288675013 .000000000 Writing file TOP-fcc.save file written NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 344.26 secs iteration # 1 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-09, avg # of iterations = 5.6 total energy = -545.21416635 ryd estimated scf accuracy < .00132031 ryd total cpu time spent up to now is 413.16 secs iteration # 2 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-09, avg # of iterations = 4.2 total energy = -545.21438725 ryd estimated scf accuracy < .00079690 ryd total cpu time spent up to now is 462.80 secs iteration # 3 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-09, avg # of iterations = 4.1 total energy = -545.21478047 ryd estimated scf accuracy < .00029434 ryd total cpu time spent up to now is 500.39 secs iteration # 4 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-09, avg # of iterations = 5.0 total energy = -545.21492613 ryd estimated scf accuracy < .00002815 ryd total cpu time spent up to now is 539.44 secs iteration # 5 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-09, avg # of iterations = 2.2 total energy = -545.21493462 ryd estimated scf accuracy < .00001234 ryd total cpu time spent up to now is 572.98 secs iteration # 6 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-09, avg # of iterations = 3.2 total energy = -545.21493753 ryd estimated scf accuracy < .00000257 ryd total cpu time spent up to now is 601.60 secs iteration # 7 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 2.24E-09, avg # of iterations = 2.2 total energy = -545.21493828 ryd estimated scf accuracy < .00000136 ryd total cpu time spent up to now is 626.49 secs iteration # 8 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.18E-09, avg # of iterations = 2.6 total energy = -545.21493888 ryd estimated scf accuracy < .00000040 ryd total cpu time spent up to now is 662.83 secs iteration # 9 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 3.47E-10, avg # of iterations = 3.8 k = .1250 .2165 -.1852 ( 6180 PWs) bands (ev): -7.3131 -1.7447 -.7759 -.7405 -.5324 -.5021 -.4024 -.3844 -.2998 -.2579 -.2446 -.1905 -.0658 .0083 .0764 .3908 .3915 .5314 1.2261 1.3260 1.3780 1.3974 1.7002 1.8142 1.8457 1.8660 1.8859 1.9941 2.1431 2.1942 2.2471 2.3131 2.3913 2.4766 2.6041 2.8351 2.8414 2.8713 3.2206 3.3857 3.5418 3.5804 3.6265 3.6472 3.7279 3.7718 3.8151 3.9209 4.1683 4.2921 4.3890 4.4339 4.5480 4.5993 4.6126 4.6676 4.7878 4.8201 4.9322 4.9660 5.0524 5.0892 5.2673 5.2871 5.3176 5.4275 6.1168 6.1793 6.6304 k = .1250 .5052 -.1852 ( 6146 PWs) bands (ev): -7.2977 -.8257 -.6937 -.6555 -.4002 .0535 .0695 .1142 .1548 .2185 .3371 .4196 .4457 .4988 .5833 .8573 .8883 .9886 1.0295 1.2401 1.3136 1.4259 1.4597 1.5556 1.6606 1.8377 1.9557 2.1047 2.1871 2.2229 2.2660 2.3273 2.3605 2.3855 2.4681 2.5633 2.6020 2.7399 2.7786 2.8081 2.8677 2.9304 2.9978 3.0276 3.0958 3.4167 3.4417 3.5361 3.5997 3.7010 3.7574 3.8447 3.8965 3.9922 4.1537 4.2550 4.3387 4.4040 4.5335 4.6074 4.7705 4.8977 4.9706 5.0173 5.1282 5.2230 5.2535 6.2771 6.5417 k = .1250 -.3608 -.1852 ( 6170 PWs) bands (ev): -7.3041 -1.3043 -.7390 -.6845 -.3777 -.2199 -.1388 -.1087 -.0691 -.0205 .0915 .1292 .1537 .1769 .2909 .6117 .7588 .8653 1.1954 1.2396 1.3506 1.4443 1.5260 1.5935 1.8626 1.8734 1.9096 2.0163 2.0883 2.2144 2.3141 2.3625 2.4336 2.5203 2.5459 2.5671 2.6169 2.8548 3.1026 3.2116 3.2527 3.2954 3.3732 3.4222 3.4775 3.5431 3.5711 3.6204 3.6815 3.7158 3.8273 4.0629 4.1232 4.2551 4.2978 4.4633 4.4900 4.5720 4.7466 4.8303 4.9124 4.9721 5.0457 5.1970 5.2485 5.3063 5.6790 6.0696 6.4058 k = .1250 -.0722 -.1852 ( 6156 PWs) bands (ev): -7.3194 -1.9894 -.8244 -.8070 -.6815 -.6412 -.5631 -.5346 -.5004 -.4154 -.3696 -.3522 -.1715 -.0479 -.0317 .2130 .2681 .2687 1.2130 1.3438 1.3601 1.4050 1.7725 1.7820 1.8026 1.8561 1.9691 2.0086 2.1474 2.1995 2.2686 2.2781 2.3154 2.4910 2.6311 2.6528 3.0336 3.0500 3.5433 3.6157 3.6452 3.6953 3.7233 3.7366 3.8362 3.9259 3.9281 4.1892 4.3211 4.5868 4.7175 4.7381 4.7831 4.8250 4.8485 4.9204 4.9806 4.9933 5.0236 5.1237 5.2769 5.2989 5.4484 5.4607 5.4761 5.5416 6.0460 6.3142 6.9516 k = .3750 .3608 -.1852 ( 6146 PWs) bands (ev): -7.2977 -.8251 -.6926 -.6573 -.4000 .0534 .0696 .1142 .1547 .2182 .3371 .4197 .4457 .4989 .5833 .8573 .8883 .9886 1.0293 1.2402 1.3133 1.4260 1.4596 1.5556 1.6606 1.8380 1.9558 2.1049 2.1872 2.2232 2.2657 2.3274 2.3605 2.3856 2.4687 2.5630 2.6021 2.7395 2.7789 2.8080 2.8676 2.9306 2.9977 3.0272 3.0958 3.4167 3.4416 3.5360 3.5996 3.7010 3.7574 3.8446 3.8964 3.9923 4.1537 4.2550 4.3388 4.4040 4.5335 4.6074 4.7705 4.8978 4.9706 5.0173 5.1281 5.2229 5.2534 6.2771 6.5417 k = .3750 .6495 -.1852 ( 6112 PWs) bands (ev): -7.2950 -.7410 -.6660 -.3421 -.3138 .0434 .2559 .2831 .3487 .3610 .4600 .5080 .5654 .6230 .6532 .8051 .8890 .9571 .9662 1.2850 1.3074 1.3232 1.5740 1.6091 1.8098 1.8585 1.9269 1.9586 1.9893 2.0025 2.0547 2.0914 2.1333 2.3126 2.3479 2.4033 2.5527 2.6186 2.6381 2.6442 2.7032 2.7799 2.8495 2.9240 3.2721 3.3547 3.5199 3.5788 3.7004 3.7488 3.7565 3.8599 3.9672 4.1166 4.2487 4.4054 4.4465 4.6540 4.6665 4.6948 4.7656 4.8501 4.8940 4.9608 5.0194 5.0562 5.2233 5.5048 5.9104 k = .3750 -.2165 -.1852 ( 6154 PWs) bands (ev): -7.3014 -1.1286 -.7362 -.6699 -.4507 -.1081 -.0834 -.0351 -.0117 .1486 .2065 .2415 .2867 .3103 .3235 .6463 .9333 .9599 1.1213 1.2931 1.3494 1.3925 1.4671 1.5770 1.7492 1.8692 1.9570 2.1220 2.1525 2.2428 2.3358 2.4096 2.4399 2.4809 2.5440 2.5918 2.6927 2.7235 2.9796 3.0742 3.1101 3.1916 3.2476 3.3329 3.3471 3.4215 3.4601 3.5124 3.5914 3.6974 3.6997 4.0295 4.0374 4.1455 4.2524 4.2927 4.3850 4.4313 4.4783 4.5981 4.7186 4.9482 5.0564 5.1132 5.1278 5.3155 5.3468 6.0956 7.1759 k = .3750 .0722 -.1852 ( 6170 PWs) bands (ev): -7.3041 -1.3042 -.7369 -.6868 -.3775 -.2199 -.1385 -.1087 -.0691 -.0207 .0912 .1291 .1537 .1769 .2909 .6117 .7588 .8653 1.1948 1.2397 1.3508 1.4438 1.5260 1.5947 1.8626 1.8734 1.9095 2.0162 2.0882 2.2146 2.3141 2.3624 2.4338 2.5204 2.5459 2.5671 2.6169 2.8544 3.1026 3.2116 3.2529 3.2953 3.3731 3.4220 3.4775 3.5431 3.5709 3.6206 3.6816 3.7156 3.8272 4.0629 4.1232 4.2550 4.2978 4.4634 4.4901 4.5718 4.7466 4.8303 4.9125 4.9721 5.0456 5.1970 5.2484 5.3063 5.6792 6.0694 6.4058 the Fermi energy is 4.6649 ev ! total energy = -545.21493911 ryd estimated scf accuracy < .00000008 ryd band energy sum = 15.53213187 ryd one-electron contribution = -2113.71730671 ryd hartree contribution = 1132.19161922 ryd xc contribution = -103.90166040 ryd ewald contribution = 540.21697879 ryd scf in/out correction = -.00528908 ryd correction for metals = -.00457001 ryd convergence has been achieved Forces acting on atoms (Ry/au): atom 1 type 1 force = .00234115 .00132729 .00088556 atom 2 type 1 force = -.00258057 .00149148 .00063812 atom 3 type 1 force = .00002531 -.00261930 .00132272 atom 4 type 2 force = .00005028 .00003018 .00606965 atom 5 type 3 force = .00088305 -.00066323 .01838947 atom 6 type 3 force = .00076410 -.00043972 -.00588275 atom 7 type 3 force = -.00003292 .00181341 -.00530536 atom 8 type 3 force = -.00159425 -.00088164 -.00530449 atom 9 type 3 force = .00208308 -.00118767 -.01519147 atom 10 type 3 force = -.00017058 .00212389 -.01504123 atom 11 type 3 force = .00040691 -.00023525 -.02116055 atom 12 type 3 force = -.00192888 -.00090262 -.01500477 atom 13 type 3 force = -.00016321 .00010815 .00865452 atom 14 type 3 force = .00148100 .00043543 .01565928 atom 15 type 3 force = -.00192253 .00110374 .01560821 atom 16 type 3 force = .00035807 -.00150415 .01566309 Total force = .199434 Total SCF correction = .002032 searching for next position (pslinmin)... Eold = -545.21374359 Etot = -545.21493911 DEold = -.04022652 DEtot = -.01910679 linmin: 3rd order interpolation Enext = -545.21527866 Xnext= 1.879801 .... Search of equilibrium positions: iteration # 23, scf threshold 2.27E-07 H -.163988426 -.094362117 1.277771278 H .163983062 -.094303192 1.277379545 H -.000059284 .189649091 1.278223691 C -.000141043 .000498270 1.211965743 Rh .000252186 -.000100096 .828371430 Rh .748923448 -.432494518 .802069842 Rh .500198910 -.000042957 .802562713 Rh .250065866 -.433314112 .802556933 Rh -.249999925 .144337556 .408248177 Rh .000000000 -.288675013 .408248177 Rh .499999849 -.288675013 .408248177 Rh .249999925 .144337556 .408248177 Rh -.499999849 .288675013 .000000000 Rh -.249999925 -.144337556 .000000000 Rh .249999925 -.144337556 .000000000 Rh .000000000 .288675013 .000000000 Writing file TOP-fcc.save file written NEW-OLD atomic charge density approx. for the potential Extrapolating wave-functions (first order) ... total cpu time spent up to now is 7164.75 secs iteration # 1 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 3.67E-09, avg # of iterations = 6.0 total energy = -545.21450737 ryd estimated scf accuracy < .00386725 ryd total cpu time spent up to now is 7234.82 secs iteration # 2 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 3.67E-09, avg # of iterations = 5.0 total energy = -545.21708531 ryd estimated scf accuracy < .00109018 ryd total cpu time spent up to now is 7279.40 secs iteration # 3 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 3.67E-09, avg # of iterations = 4.8 total energy = -545.21772654 ryd estimated scf accuracy < .00034629 ryd total cpu time spent up to now is 7322.72 secs iteration # 4 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 3.67E-09, avg # of iterations = 4.1 total energy = -545.21789971 ryd estimated scf accuracy < .00008918 ryd total cpu time spent up to now is 7383.87 secs iteration # 5 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 3.67E-09, avg # of iterations = 4.1 total energy = -545.21792853 ryd estimated scf accuracy < .00001411 ryd total cpu time spent up to now is 7427.11 secs iteration # 6 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 3.67E-09, avg # of iterations = 2.6 total energy = -545.21793240 ryd estimated scf accuracy < .00000793 ryd total cpu time spent up to now is 7452.55 secs iteration # 7 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 3.67E-09, avg # of iterations = 4.1 total energy = -545.21793657 ryd estimated scf accuracy < .00000213 ryd total cpu time spent up to now is 7482.44 secs iteration # 8 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.85E-09, avg # of iterations = 2.2 total energy = -545.21793704 ryd estimated scf accuracy < .00000117 ryd total cpu time spent up to now is 7507.87 secs iteration # 9 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.01E-09, avg # of iterations = 3.4 k = .1250 .2165 -.1852 ( 6180 PWs) bands (ev): -7.2434 -1.7536 -.6642 -.6346 -.5537 -.4776 -.4118 -.3678 -.2957 -.2731 -.2615 -.1909 -.0762 .0231 .0821 .3665 .3776 .5122 1.1926 1.3281 1.3581 1.4119 1.6827 1.7865 1.8207 1.8351 1.8594 2.0089 2.1295 2.1657 2.2658 2.3145 2.3801 2.4748 2.5904 2.8033 2.8119 2.8505 3.1767 3.3536 3.5111 3.5445 3.5850 3.6292 3.7166 3.7443 3.7937 3.8914 4.0897 4.2846 4.3594 4.4099 4.5151 4.5690 4.5982 4.6280 4.7561 4.7981 4.8997 4.9292 5.0297 5.0568 5.2170 5.2551 5.3120 5.3740 6.0916 6.1578 6.6029 k = .1250 .5052 -.1852 ( 6146 PWs) bands (ev): -7.2290 -.7919 -.5936 -.5276 -.4041 .0280 .0698 .1073 .1632 .2147 .3501 .4156 .4386 .4994 .5838 .8381 .8684 .9970 1.0217 1.2380 1.3116 1.3991 1.4390 1.5212 1.6285 1.7835 1.9379 2.0798 2.1329 2.1952 2.2188 2.3048 2.3308 2.3687 2.4718 2.5403 2.5753 2.6935 2.7471 2.8123 2.8558 2.8998 2.9629 3.0615 3.1387 3.3910 3.4175 3.5009 3.5797 3.6686 3.7393 3.8358 3.8676 3.9786 4.1246 4.2185 4.3104 4.3813 4.4957 4.5845 4.7411 4.8689 4.9191 4.9858 5.0919 5.1789 5.2479 6.2262 6.5141 k = .1250 -.3608 -.1852 ( 6170 PWs) bands (ev): -7.2350 -1.3084 -.6071 -.5568 -.3838 -.2307 -.1388 -.1109 -.0795 -.0208 .0806 .1025 .1338 .2160 .2926 .5924 .7348 .8538 1.2023 1.2308 1.3278 1.4155 1.5243 1.5923 1.8294 1.8581 1.8840 1.9826 2.0716 2.2014 2.2842 2.3507 2.4142 2.4864 2.5378 2.5495 2.6177 2.8472 3.0787 3.1820 3.1977 3.2557 3.3244 3.4230 3.4303 3.4850 3.5445 3.6343 3.6719 3.7066 3.8366 4.0188 4.0962 4.2202 4.2954 4.4345 4.4626 4.5195 4.7251 4.7946 4.8864 4.9293 5.0139 5.1496 5.2445 5.2790 5.6578 6.0124 6.3790 k = .1250 -.0722 -.1852 ( 6156 PWs) bands (ev): -7.2492 -2.0000 -.7562 -.7297 -.7095 -.6240 -.5522 -.4956 -.4867 -.3971 -.3772 -.3552 -.1887 -.0366 -.0187 .1939 .2441 .2564 1.1824 1.3261 1.3377 1.4235 1.7386 1.7490 1.7898 1.8251 1.9685 1.9946 2.1456 2.1782 2.2614 2.2982 2.3505 2.4680 2.6054 2.6478 2.9952 3.0158 3.5045 3.5927 3.6039 3.6749 3.6960 3.7053 3.7969 3.9086 3.9101 4.1704 4.2796 4.5131 4.6787 4.6907 4.7708 4.7946 4.8181 4.9002 4.9318 4.9474 4.9861 5.0992 5.2447 5.2743 5.4164 5.4252 5.4559 5.5092 6.0254 6.2399 6.9652 k = .3750 .3608 -.1852 ( 6146 PWs) bands (ev): -7.2290 -.7919 -.5941 -.5269 -.4044 .0278 .0698 .1070 .1632 .2148 .3503 .4155 .4387 .4992 .5838 .8381 .8684 .9969 1.0221 1.2377 1.3120 1.3990 1.4394 1.5215 1.6287 1.7835 1.9380 2.0791 2.1331 2.1951 2.2190 2.3045 2.3307 2.3685 2.4713 2.5405 2.5754 2.6937 2.7471 2.8124 2.8559 2.9000 2.9628 3.0618 3.1390 3.3912 3.4174 3.5010 3.5799 3.6684 3.7396 3.8358 3.8679 3.9783 4.1244 4.2183 4.3105 4.3812 4.4956 4.5846 4.7411 4.8689 4.9191 4.9860 5.0920 5.1788 5.2477 6.2260 6.5141 k = .3750 .6495 -.1852 ( 6112 PWs) bands (ev): -7.2264 -.6057 -.5324 -.3378 -.3249 .0421 .2632 .2681 .3091 .3835 .4952 .5041 .5514 .6195 .6553 .7976 .9195 .9224 .9521 1.2640 1.2836 1.3093 1.5561 1.5862 1.7617 1.7831 1.8941 1.9341 1.9467 1.9918 2.0222 2.0524 2.1007 2.2983 2.3286 2.4125 2.5154 2.5693 2.5952 2.6313 2.6970 2.7937 2.8449 2.9604 3.2797 3.3383 3.4866 3.5490 3.6841 3.7013 3.7403 3.8414 3.9440 4.0822 4.2180 4.3764 4.4283 4.6039 4.6448 4.6781 4.7385 4.8086 4.8342 4.9238 5.0252 5.0323 5.1894 5.4788 5.8945 k = .3750 -.2165 -.1852 ( 6154 PWs) bands (ev): -7.2324 -1.1294 -.6087 -.5388 -.4547 -.1281 -.0843 -.0359 -.0143 .1709 .1977 .2098 .2553 .3305 .3414 .6269 .8962 .9692 1.1387 1.2578 1.3339 1.3883 1.4641 1.5480 1.7151 1.8367 1.9391 2.0844 2.1261 2.2212 2.3068 2.3881 2.4068 2.4702 2.5204 2.6144 2.6714 2.7166 2.9561 3.0373 3.0685 3.1504 3.1979 3.3156 3.3227 3.4023 3.4517 3.4902 3.5799 3.6913 3.7078 4.0145 4.0182 4.1008 4.2254 4.2582 4.3640 4.3760 4.4659 4.5686 4.7040 4.9188 5.0097 5.0757 5.1026 5.2658 5.3433 6.0264 7.1419 k = .3750 .0722 -.1852 ( 6170 PWs) bands (ev): -7.2350 -1.3085 -.6079 -.5558 -.3840 -.2305 -.1390 -.1114 -.0795 -.0208 .0806 .1024 .1339 .2161 .2929 .5923 .7348 .8537 1.2022 1.2314 1.3278 1.4159 1.5243 1.5910 1.8296 1.8583 1.8840 1.9825 2.0722 2.2014 2.2842 2.3511 2.4139 2.4864 2.5377 2.5496 2.6172 2.8478 3.0787 3.1821 3.1980 3.2555 3.3245 3.4228 3.4302 3.4853 3.5445 3.6341 3.6720 3.7064 3.8369 4.0187 4.0962 4.2204 4.2956 4.4344 4.4624 4.5197 4.7251 4.7946 4.8864 4.9296 5.0140 5.1494 5.2443 5.2790 5.6574 6.0126 6.3790 the Fermi energy is 4.6330 ev ! total energy = -545.21793755 ryd estimated scf accuracy < .00000019 ryd band energy sum = 15.44198397 ryd one-electron contribution = -2084.53113610 ryd hartree contribution = 1117.52221288 ryd xc contribution = -103.86501736 ryd ewald contribution = 525.66077436 ryd scf in/out correction = -.01709389 ryd correction for metals = -.00477133 ryd convergence has been achieved Forces acting on atoms (Ry/au): atom 1 type 1 force = -.00066749 -.00042489 -.00045945 atom 2 type 1 force = .00046828 -.00028717 -.00054887 atom 3 type 1 force = .00001866 .00093544 -.00065161 atom 4 type 2 force = .00015147 -.00033200 .00035358 atom 5 type 3 force = .00033397 -.00025581 .00108313 atom 6 type 3 force = .00206111 -.00100779 .00060288 atom 7 type 3 force = -.00039517 .00181207 .00049660 atom 8 type 3 force = -.00178202 -.00038500 .00051573 atom 9 type 3 force = .00841086 -.00492241 -.01110622 atom 10 type 3 force = -.00032268 .00936658 -.01052402 atom 11 type 3 force = .00042499 -.00028124 -.02460764 atom 12 type 3 force = -.00827873 -.00446938 -.01062880 atom 13 type 3 force = .00013219 -.00009491 .00953117 atom 14 type 3 force = .00139962 .00058694 .01517454 atom 15 type 3 force = -.00215621 .00125364 .01559871 atom 16 type 3 force = .00020116 -.00149409 .01517026 Total force = .172167 Total SCF correction = .002525 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 24, scf threshold 1.24E-07 H -.164121892 -.094451679 1.276574634 H .164111638 -.094381756 1.276176682 H -.000052411 .189818792 1.276940084 C -.000134495 .000459297 1.211149114 Rh .000308233 -.000147929 .827891711 Rh .749176011 -.432620307 .801977819 Rh .500158573 .000189911 .802472419 Rh .249846958 -.433373050 .802468498 Rh -.249999925 .144337556 .408248177 Rh .000000000 -.288675013 .408248177 Rh .499999849 -.288675013 .408248177 Rh .249999925 .144337556 .408248177 Rh -.499999849 .288675013 .000000000 Rh -.249999925 -.144337556 .000000000 Rh .249999925 -.144337556 .000000000 Rh .000000000 .288675013 .000000000 Writing file TOP-fcc.save file written NEW-OLD atomic charge density approx. for the potential Extrapolating wave-functions (first order) ... total cpu time spent up to now is 7548.18 secs iteration # 1 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.98E-09, avg # of iterations = 6.0 total energy = -545.21616595 ryd estimated scf accuracy < .00195288 ryd total cpu time spent up to now is 7619.60 secs iteration # 2 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.98E-09, avg # of iterations = 5.0 total energy = -545.21739137 ryd estimated scf accuracy < .00066176 ryd total cpu time spent up to now is 7665.25 secs iteration # 3 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.98E-09, avg # of iterations = 4.8 total energy = -545.21789128 ryd estimated scf accuracy < .00011561 ryd total cpu time spent up to now is 7708.75 secs iteration # 4 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.98E-09, avg # of iterations = 4.1 total energy = -545.21795256 ryd estimated scf accuracy < .00002496 ryd total cpu time spent up to now is 7740.48 secs iteration # 5 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.98E-09, avg # of iterations = 4.1 total energy = -545.21796023 ryd estimated scf accuracy < .00000566 ryd total cpu time spent up to now is 7772.09 secs iteration # 6 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.98E-09, avg # of iterations = 3.2 total energy = -545.21796219 ryd estimated scf accuracy < .00000263 ryd total cpu time spent up to now is 7800.01 secs iteration # 7 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.98E-09, avg # of iterations = 3.5 total energy = -545.21796339 ryd estimated scf accuracy < .00000097 ryd total cpu time spent up to now is 7826.83 secs iteration # 8 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.42E-10, avg # of iterations = 2.4 total energy = -545.21796366 ryd estimated scf accuracy < .00000042 ryd total cpu time spent up to now is 7849.29 secs iteration # 9 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 3.65E-10, avg # of iterations = 3.0 k = .1250 .2165 -.1852 ( 6180 PWs) bands (ev): -7.2477 -1.7546 -.6720 -.6427 -.5567 -.4816 -.4139 -.3716 -.2963 -.2742 -.2629 -.1925 -.0779 .0207 .0797 .3661 .3767 .5116 1.1918 1.3273 1.3580 1.4103 1.6815 1.7860 1.8204 1.8345 1.8594 2.0074 2.1283 2.1647 2.2642 2.3134 2.3791 2.4733 2.5900 2.8032 2.8112 2.8496 3.1776 3.3532 3.5114 3.5443 3.5849 3.6288 3.7160 3.7442 3.7935 3.8915 4.0901 4.2840 4.3596 4.4091 4.5152 4.5684 4.5980 4.6282 4.7562 4.7980 4.8997 4.9293 5.0304 5.0558 5.2176 5.2554 5.3114 5.3750 6.0915 6.1575 6.6046 k = .1250 .5052 -.1852 ( 6146 PWs) bands (ev): -7.2332 -.7943 -.6042 -.5399 -.4056 .0271 .0677 .1063 .1613 .2136 .3485 .4146 .4366 .4977 .5818 .8371 .8679 .9954 1.0202 1.2369 1.3102 1.3981 1.4382 1.5201 1.6281 1.7838 1.9372 2.0803 2.1326 2.1944 2.2186 2.3048 2.3295 2.3685 2.4713 2.5405 2.5749 2.6934 2.7473 2.8120 2.8544 2.8990 2.9626 3.0606 3.1368 3.3907 3.4167 3.5014 3.5794 3.6690 3.7381 3.8351 3.8678 3.9784 4.1244 4.2187 4.3105 4.3808 4.4958 4.5841 4.7413 4.8688 4.9199 4.9860 5.0925 5.1793 5.2474 6.2293 6.5139 k = .1250 -.3608 -.1852 ( 6170 PWs) bands (ev): -7.2392 -1.3097 -.6183 -.5683 -.3858 -.2326 -.1400 -.1124 -.0810 -.0220 .0796 .1017 .1322 .2134 .2906 .5917 .7343 .8529 1.2015 1.2289 1.3273 1.4150 1.5231 1.5906 1.8285 1.8574 1.8835 1.9825 2.0710 2.2007 2.2841 2.3495 2.4137 2.4855 2.5368 2.5488 2.6164 2.8470 3.0781 3.1820 3.1984 3.2557 3.3247 3.4227 3.4304 3.4853 3.5438 3.6334 3.6708 3.7058 3.8359 4.0189 4.0960 4.2204 4.2949 4.4345 4.4623 4.5200 4.7252 4.7945 4.8863 4.9298 5.0141 5.1500 5.2440 5.2789 5.6588 6.0136 6.3787 k = .1250 -.0722 -.1852 ( 6156 PWs) bands (ev): -7.2536 -2.0010 -.7604 -.7347 -.7118 -.6265 -.5541 -.5011 -.4936 -.3985 -.3785 -.3572 -.1899 -.0394 -.0216 .1933 .2436 .2556 1.1817 1.3259 1.3375 1.4218 1.7385 1.7482 1.7895 1.8248 1.9676 1.9935 2.1448 2.1761 2.2606 2.2964 2.3475 2.4675 2.6052 2.6470 2.9948 3.0153 3.5054 3.5918 3.6043 3.6745 3.6959 3.7048 3.7973 3.9085 3.9099 4.1703 4.2797 4.5139 4.6788 4.6911 4.7705 4.7945 4.8179 4.8996 4.9323 4.9474 4.9864 5.0987 5.2450 5.2739 5.4165 5.4253 5.4555 5.5093 6.0259 6.2416 6.9642 k = .3750 .3608 -.1852 ( 6146 PWs) bands (ev): -7.2332 -.7943 -.6051 -.5389 -.4059 .0269 .0677 .1061 .1613 .2137 .3487 .4145 .4367 .4975 .5818 .8371 .8678 .9953 1.0206 1.2367 1.3106 1.3980 1.4385 1.5203 1.6282 1.7838 1.9372 2.0796 2.1328 2.1943 2.2188 2.3045 2.3294 2.3683 2.4708 2.5406 2.5749 2.6936 2.7473 2.8120 2.8545 2.8992 2.9626 3.0608 3.1370 3.3908 3.4166 3.5015 3.5795 3.6689 3.7384 3.8351 3.8680 3.9781 4.1243 4.2186 4.3106 4.3808 4.4957 4.5841 4.7413 4.8688 4.9199 4.9862 5.0925 5.1792 5.2472 6.2291 6.5139 k = .3750 .6495 -.1852 ( 6112 PWs) bands (ev): -7.2306 -.6182 -.5444 -.3383 -.3272 .0405 .2614 .2671 .3083 .3817 .4941 .5021 .5496 .6176 .6535 .7964 .9176 .9211 .9502 1.2628 1.2843 1.3075 1.5553 1.5856 1.7624 1.7833 1.8925 1.9327 1.9464 1.9914 2.0212 2.0520 2.1018 2.2980 2.3289 2.4121 2.5149 2.5698 2.5954 2.6290 2.6971 2.7943 2.8438 2.9588 3.2787 3.3373 3.4862 3.5485 3.6826 3.7019 3.7411 3.8407 3.9435 4.0828 4.2182 4.3776 4.4269 4.6047 4.6446 4.6770 4.7382 4.8091 4.8346 4.9242 5.0247 5.0328 5.1897 5.4786 5.8949 k = .3750 -.2165 -.1852 ( 6154 PWs) bands (ev): -7.2367 -1.1308 -.6204 -.5503 -.4566 -.1293 -.0864 -.0368 -.0162 .1700 .1961 .2089 .2547 .3283 .3383 .6261 .8956 .9681 1.1369 1.2574 1.3332 1.3873 1.4625 1.5472 1.7136 1.8369 1.9384 2.0842 2.1261 2.2206 2.3067 2.3879 2.4057 2.4695 2.5200 2.6116 2.6717 2.7154 2.9554 3.0373 3.0691 3.1503 3.1980 3.3160 3.3227 3.4019 3.4504 3.4902 3.5792 3.6905 3.7070 4.0144 4.0180 4.1009 4.2254 4.2581 4.3634 4.3767 4.4651 4.5685 4.7040 4.9186 5.0104 5.0763 5.1029 5.2664 5.3428 6.0289 7.1437 k = .3750 .0722 -.1852 ( 6170 PWs) bands (ev): -7.2392 -1.3097 -.6194 -.5670 -.3861 -.2325 -.1402 -.1129 -.0810 -.0220 .0796 .1017 .1323 .2134 .2909 .5916 .7343 .8528 1.2015 1.2295 1.3274 1.4154 1.5231 1.5894 1.8287 1.8576 1.8835 1.9824 2.0714 2.2006 2.2842 2.3498 2.4134 2.4854 2.5367 2.5489 2.6160 2.8475 3.0781 3.1821 3.1987 3.2555 3.3248 3.4225 3.4303 3.4855 3.5439 3.6332 3.6709 3.7056 3.8363 4.0189 4.0960 4.2205 4.2951 4.4344 4.4621 4.5201 4.7251 4.7945 4.8863 4.9300 5.0142 5.1499 5.2438 5.2790 5.6584 6.0137 6.3787 the Fermi energy is 4.6330 ev ! total energy = -545.21796388 ryd estimated scf accuracy < .00000006 ryd band energy sum = 15.43201455 ryd one-electron contribution = -2085.99033407 ryd hartree contribution = 1118.26201161 ryd xc contribution = -103.86823756 ryd ewald contribution = 526.38334560 ryd scf in/out correction = .00891938 ryd correction for metals = -.00474946 ryd convergence has been achieved Forces acting on atoms (Ry/au): atom 1 type 1 force = -.00040526 -.00027094 -.00009159 atom 2 type 1 force = .00031681 -.00020433 -.00011991 atom 3 type 1 force = .00001251 .00044728 -.00031484 atom 4 type 2 force = .00005446 -.00006683 .00042804 atom 5 type 3 force = .00019750 -.00014214 .00043403 atom 6 type 3 force = .00140109 -.00067172 .00070383 atom 7 type 3 force = -.00028000 .00116254 .00062289 atom 8 type 3 force = -.00114496 -.00019472 .00063662 atom 9 type 3 force = .00836906 -.00488853 -.01134963 atom 10 type 3 force = -.00030690 .00932100 -.01088176 atom 11 type 3 force = .00042801 -.00027984 -.02454175 atom 12 type 3 force = -.00823176 -.00445173 -.01096487 atom 13 type 3 force = .00014388 -.00010090 .00952376 atom 14 type 3 force = .00141740 .00059510 .01516727 atom 15 type 3 force = -.00217222 .00126035 .01558428 atom 16 type 3 force = .00020037 -.00151459 .01516363 Total force = .167183 Total SCF correction = .001360 searching for next position (pslinmin)... Eold = -545.21793755 Etot = -545.21796388 DEold = -.00125606 DEtot = -.00047558 linmin: 3rd order interpolation Enext = -545.21796519 Xnext= 1.214471 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 25, scf threshold 1.00E-07 H -.164150517 -.094470887 1.276317988 H .164139214 -.094398606 1.275918702 H -.000050937 .189855188 1.276664787 C -.000133091 .000450938 1.210973971 Rh .000320254 -.000158188 .827788825 Rh .749230178 -.432647285 .801958083 Rh .500149921 .000239854 .802453054 Rh .249800009 -.433385690 .802449532 Rh -.249999925 .144337556 .408248177 Rh .000000000 -.288675013 .408248177 Rh .499999849 -.288675013 .408248177 Rh .249999925 .144337556 .408248177 Rh -.499999849 .288675013 .000000000 Rh -.249999925 -.144337556 .000000000 Rh .249999925 -.144337556 .000000000 Rh .000000000 .288675013 .000000000 Writing file TOP-fcc.save file written NEW-OLD atomic charge density approx. for the potential Extrapolating wave-functions (first order) ... total cpu time spent up to now is 7888.54 secs iteration # 1 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.08E-09, avg # of iterations = 5.2 total energy = -545.21793508 ryd estimated scf accuracy < .00003760 ryd total cpu time spent up to now is 7951.90 secs iteration # 2 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.08E-09, avg # of iterations = 4.1 total energy = -545.21796084 ryd estimated scf accuracy < .00000900 ryd total cpu time spent up to now is 7984.42 secs iteration # 3 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.08E-09, avg # of iterations = 3.1 total energy = -545.21796449 ryd estimated scf accuracy < .00000419 ryd total cpu time spent up to now is 8015.12 secs iteration # 4 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.08E-09, avg # of iterations = 2.0 total energy = -545.21796649 ryd estimated scf accuracy < .00000114 ryd total cpu time spent up to now is 8041.50 secs iteration # 5 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 9.93E-10, avg # of iterations = 2.9 total energy = -545.21796681 ryd estimated scf accuracy < .00000018 ryd total cpu time spent up to now is 8067.80 secs iteration # 6 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.58E-10, avg # of iterations = 2.1 k = .1250 .2165 -.1852 ( 6180 PWs) bands (ev): -7.2479 -1.7548 -.6734 -.6441 -.5571 -.4822 -.4142 -.3721 -.2963 -.2743 -.2631 -.1927 -.0780 .0204 .0794 .3662 .3767 .5116 1.1918 1.3273 1.3582 1.4104 1.6815 1.7861 1.8206 1.8346 1.8595 2.0072 2.1282 2.1647 2.2641 2.3133 2.3791 2.4731 2.5901 2.8033 2.8112 2.8496 3.1780 3.3533 3.5118 3.5445 3.5851 3.6289 3.7161 3.7444 3.7937 3.8917 4.0904 4.2840 4.3598 4.4091 4.5155 4.5685 4.5982 4.6285 4.7565 4.7982 4.9000 4.9296 5.0307 5.0558 5.2179 5.2556 5.3115 5.3755 6.0916 6.1576 6.6053 k = .1250 .5052 -.1852 ( 6146 PWs) bands (ev): -7.2334 -.7947 -.6060 -.5420 -.4058 .0271 .0674 .1063 .1610 .2135 .3483 .4145 .4364 .4975 .5816 .8370 .8679 .9953 1.0201 1.2369 1.3102 1.3981 1.4382 1.5200 1.6282 1.7841 1.9372 2.0806 2.1327 2.1944 2.2188 2.3049 2.3294 2.3687 2.4714 2.5408 2.5750 2.6936 2.7475 2.8121 2.8543 2.8990 2.9628 3.0606 3.1366 3.3908 3.4168 3.5017 3.5795 3.6693 3.7381 3.8352 3.8680 3.9785 4.1246 4.2190 4.3108 4.3809 4.4960 4.5842 4.7416 4.8689 4.9203 4.9863 5.0928 5.1796 5.2475 6.2302 6.5140 k = .1250 -.3608 -.1852 ( 6170 PWs) bands (ev): -7.2395 -1.3098 -.6202 -.5703 -.3861 -.2329 -.1401 -.1126 -.0812 -.0221 .0795 .1017 .1320 .2130 .2904 .5917 .7344 .8528 1.2016 1.2288 1.3274 1.4151 1.5230 1.5905 1.8285 1.8575 1.8836 1.9826 2.0710 2.2007 2.2843 2.3495 2.4138 2.4855 2.5368 2.5489 2.6163 2.8473 3.0782 3.1822 3.1988 3.2558 3.3250 3.4229 3.4306 3.4855 3.5439 3.6334 3.6708 3.7059 3.8360 4.0192 4.0962 4.2206 4.2950 4.4347 4.4624 4.5203 4.7254 4.7947 4.8865 4.9301 5.0144 5.1503 5.2441 5.2791 5.6592 6.0140 6.3789 k = .1250 -.0722 -.1852 ( 6156 PWs) bands (ev): -7.2538 -2.0011 -.7611 -.7355 -.7121 -.6268 -.5544 -.5019 -.4947 -.3987 -.3786 -.3575 -.1900 -.0398 -.0220 .1933 .2437 .2556 1.1817 1.3261 1.3377 1.4219 1.7387 1.7483 1.7896 1.8250 1.9676 1.9934 2.1448 2.1759 2.2607 2.2962 2.3470 2.4676 2.6053 2.6470 2.9949 3.0154 3.5058 3.5918 3.6045 3.6746 3.6961 3.7049 3.7976 3.9086 3.9100 4.1705 4.2800 4.5143 4.6790 4.6914 4.7706 4.7947 4.8181 4.8997 4.9327 4.9476 4.9866 5.0988 5.2452 5.2740 5.4167 5.4255 5.4556 5.5095 6.0262 6.2422 6.9643 k = .3750 .3608 -.1852 ( 6146 PWs) bands (ev): -7.2334 -.7947 -.6069 -.5409 -.4061 .0269 .0674 .1061 .1610 .2136 .3485 .4145 .4365 .4973 .5815 .8370 .8679 .9952 1.0205 1.2367 1.3105 1.3980 1.4385 1.5203 1.6283 1.7841 1.9373 2.0800 2.1329 2.1943 2.2189 2.3047 2.3293 2.3685 2.4709 2.5409 2.5750 2.6938 2.7475 2.8122 2.8544 2.8992 2.9628 3.0608 3.1368 3.3909 3.4167 3.5018 3.5796 3.6692 3.7383 3.8352 3.8683 3.9783 4.1244 4.2188 4.3109 4.3809 4.4959 4.5843 4.7416 4.8690 4.9203 4.9864 5.0928 5.1795 5.2473 6.2301 6.5140 k = .3750 .6495 -.1852 ( 6112 PWs) bands (ev): -7.2308 -.6203 -.5465 -.3383 -.3275 .0403 .2611 .2671 .3083 .3815 .4940 .5019 .5494 .6174 .6533 .7963 .9174 .9210 .9501 1.2627 1.2846 1.3074 1.5553 1.5856 1.7627 1.7835 1.8924 1.9326 1.9465 1.9915 2.0212 2.0521 2.1022 2.2983 2.3291 2.4122 2.5150 2.5701 2.5956 2.6288 2.6973 2.7946 2.8438 2.9586 3.2787 3.3373 3.4864 3.5486 3.6825 3.7022 3.7414 3.8407 3.9437 4.0832 4.2184 4.3780 4.4268 4.6051 4.6447 4.6770 4.7383 4.8094 4.8349 4.9245 5.0248 5.0331 5.1900 5.4787 5.8951 k = .3750 -.2165 -.1852 ( 6154 PWs) bands (ev): -7.2369 -1.1309 -.6224 -.5522 -.4568 -.1294 -.0867 -.0368 -.0164 .1700 .1959 .2089 .2547 .3281 .3378 .6261 .8957 .9680 1.1367 1.2575 1.3332 1.3873 1.4625 1.5472 1.7134 1.8371 1.9384 2.0844 2.1264 2.2206 2.3068 2.3881 2.4056 2.4695 2.5201 2.6113 2.6720 2.7154 2.9554 3.0374 3.0694 3.1504 3.1982 3.3163 3.3228 3.4020 3.4504 3.4904 3.5792 3.6906 3.7070 4.0146 4.0181 4.1011 4.2256 4.2583 4.3635 4.3771 4.4651 4.5687 4.7042 4.9188 5.0107 5.0766 5.1032 5.2667 5.3429 6.0297 7.1443 k = .3750 .0722 -.1852 ( 6170 PWs) bands (ev): -7.2395 -1.3099 -.6214 -.5689 -.3863 -.2328 -.1402 -.1130 -.0812 -.0221 .0795 .1017 .1321 .2131 .2906 .5916 .7344 .8527 1.2015 1.2294 1.3275 1.4155 1.5230 1.5894 1.8286 1.8576 1.8836 1.9825 2.0715 2.2007 2.2843 2.3498 2.4135 2.4854 2.5367 2.5490 2.6159 2.8477 3.0782 3.1823 3.1990 3.2557 3.3251 3.4227 3.4306 3.4857 3.5439 3.6333 3.6709 3.7056 3.8363 4.0191 4.0962 4.2208 4.2952 4.4346 4.4623 4.5203 4.7253 4.7947 4.8865 4.9303 5.0144 5.1502 5.2439 5.2792 5.6588 6.0141 6.3789 the Fermi energy is 4.6332 ev ! total energy = -545.21796686 ryd estimated scf accuracy < .00000009 ryd band energy sum = 15.43169540 ryd one-electron contribution = -2086.30436669 ryd hartree contribution = 1118.42144841 ryd xc contribution = -103.86873756 ryd ewald contribution = 526.53843389 ryd scf in/out correction = .01338710 ryd correction for metals = -.00474492 ryd convergence has been achieved Forces acting on atoms (Ry/au): atom 1 type 1 force = -.00036888 -.00025090 -.00002103 atom 2 type 1 force = .00030461 -.00019929 -.00003618 atom 3 type 1 force = .00001170 .00036719 -.00025143 atom 4 type 2 force = .00003358 -.00001123 .00045061 atom 5 type 3 force = .00016884 -.00011826 .00027393 atom 6 type 3 force = .00125895 -.00059912 .00073475 atom 7 type 3 force = -.00025454 .00102360 .00065370 atom 8 type 3 force = -.00100810 -.00015417 .00066633 atom 9 type 3 force = .00835831 -.00488006 -.01139629 atom 10 type 3 force = -.00030350 .00931188 -.01095384 atom 11 type 3 force = .00042921 -.00027964 -.02451563 atom 12 type 3 force = -.00822217 -.00444806 -.01103218 atom 13 type 3 force = .00014642 -.00010207 .00952089 atom 14 type 3 force = .00142111 .00059679 .01516387 atom 15 type 3 force = -.00217582 .00126202 .01558231 atom 16 type 3 force = .00020030 -.00151866 .01516019 Total force = .166202 Total SCF correction = .003372 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 26, scf threshold 1.00E-07 H -.164215774 -.094516847 1.276039276 H .164194938 -.094435135 1.275637108 H -.000047701 .189927793 1.276332002 C -.000127096 .000437853 1.210814389 Rh .000354999 -.000184481 .827681731 Rh .749479542 -.432767334 .802086683 Rh .500101027 .000443048 .802563912 Rh .249600577 -.433419408 .802562769 Rh -.249999925 .144337556 .408248177 Rh .000000000 -.288675013 .408248177 Rh .499999849 -.288675013 .408248177 Rh .249999925 .144337556 .408248177 Rh -.499999849 .288675013 .000000000 Rh -.249999925 -.144337556 .000000000 Rh .249999925 -.144337556 .000000000 Rh .000000000 .288675013 .000000000 Writing file TOP-fcc.save file written NEW-OLD atomic charge density approx. for the potential Extrapolating wave-functions (first order) ... total cpu time spent up to now is 8105.99 secs iteration # 1 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 5.1 total energy = -545.21768157 ryd estimated scf accuracy < .00031037 ryd total cpu time spent up to now is 8160.24 secs iteration # 2 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 4.9 total energy = -545.21787411 ryd estimated scf accuracy < .00011059 ryd total cpu time spent up to now is 8205.36 secs iteration # 3 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 4.4 total energy = -545.21796816 ryd estimated scf accuracy < .00001039 ryd total cpu time spent up to now is 8241.94 secs iteration # 4 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 2.2 total energy = -545.21797357 ryd estimated scf accuracy < .00000349 ryd total cpu time spent up to now is 8269.19 secs iteration # 5 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 3.2 total energy = -545.21797579 ryd estimated scf accuracy < .00000012 ryd total cpu time spent up to now is 8300.24 secs iteration # 6 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 1.03E-10, avg # of iterations = 4.4 k = .1250 .2165 -.1852 ( 6180 PWs) bands (ev): -7.2487 -1.7538 -.6749 -.6457 -.5567 -.4822 -.4133 -.3720 -.2958 -.2729 -.2621 -.1917 -.0767 .0206 .0798 .3668 .3771 .5122 1.1924 1.3280 1.3593 1.4110 1.6824 1.7872 1.8209 1.8350 1.8598 2.0080 2.1288 2.1659 2.2653 2.3144 2.3796 2.4738 2.5905 2.8041 2.8120 2.8504 3.1793 3.3538 3.5133 3.5452 3.5860 3.6295 3.7164 3.7451 3.7942 3.8925 4.0912 4.2845 4.3609 4.4091 4.5163 4.5687 4.5988 4.6291 4.7570 4.7985 4.9005 4.9298 5.0319 5.0555 5.2186 5.2563 5.3114 5.3762 6.0923 6.1581 6.6058 k = .1250 .5052 -.1852 ( 6146 PWs) bands (ev): -7.2342 -.7943 -.6092 -.5454 -.4049 .0286 .0682 .1080 .1617 .2148 .3492 .4160 .4371 .4981 .5826 .8381 .8687 .9960 1.0209 1.2379 1.3111 1.3991 1.4388 1.5211 1.6288 1.7854 1.9373 2.0821 2.1338 2.1948 2.2194 2.3057 2.3295 2.3699 2.4720 2.5422 2.5754 2.6949 2.7483 2.8126 2.8542 2.8996 2.9633 3.0616 3.1361 3.3914 3.4169 3.5028 3.5800 3.6702 3.7381 3.8351 3.8688 3.9791 4.1254 4.2196 4.3113 4.3813 4.4964 4.5844 4.7421 4.8692 4.9210 4.9864 5.0932 5.1802 5.2475 6.2313 6.5147 k = .1250 -.3608 -.1852 ( 6170 PWs) bands (ev): -7.2402 -1.3090 -.6236 -.5732 -.3853 -.2319 -.1386 -.1116 -.0800 -.0209 .0802 .1031 .1329 .2133 .2911 .5922 .7350 .8535 1.2023 1.2295 1.3285 1.4162 1.5239 1.5915 1.8293 1.8580 1.8844 1.9832 2.0716 2.2014 2.2855 2.3501 2.4146 2.4863 2.5374 2.5502 2.6170 2.8479 3.0787 3.1832 3.2004 3.2564 3.3258 3.4233 3.4314 3.4863 3.5443 3.6336 3.6710 3.7064 3.8366 4.0197 4.0966 4.2212 4.2952 4.4354 4.4626 4.5210 4.7257 4.7952 4.8868 4.9305 5.0147 5.1510 5.2441 5.2796 5.6597 6.0147 6.3795 k = .1250 -.0722 -.1852 ( 6156 PWs) bands (ev): -7.2546 -2.0002 -.7610 -.7356 -.7113 -.6263 -.5544 -.5027 -.4961 -.3976 -.3775 -.3568 -.1884 -.0396 -.0221 .1938 .2443 .2561 1.1823 1.3271 1.3386 1.4224 1.7390 1.7478 1.7901 1.8260 1.9684 1.9944 2.1462 2.1769 2.2628 2.2967 2.3470 2.4682 2.6058 2.6473 2.9960 3.0164 3.5069 3.5919 3.6058 3.6754 3.6971 3.7057 3.7989 3.9091 3.9103 4.1708 4.2809 4.5151 4.6795 4.6921 4.7709 4.7951 4.8186 4.9001 4.9335 4.9483 4.9870 5.0994 5.2461 5.2742 5.4178 5.4262 5.4560 5.5099 6.0269 6.2429 6.9645 k = .3750 .3608 -.1852 ( 6146 PWs) bands (ev): -7.2342 -.7943 -.6099 -.5445 -.4052 .0285 .0682 .1079 .1617 .2149 .3494 .4160 .4371 .4979 .5825 .8380 .8687 .9959 1.0213 1.2377 1.3114 1.3990 1.4391 1.5213 1.6289 1.7853 1.9374 2.0816 2.1340 2.1947 2.2195 2.3055 2.3294 2.3697 2.4716 2.5423 2.5754 2.6951 2.7484 2.8126 2.8543 2.8998 2.9634 3.0618 3.1363 3.3915 3.4168 3.5029 3.5801 3.6702 3.7383 3.8351 3.8690 3.9788 4.1253 4.2194 4.3114 4.3812 4.4963 4.5844 4.7421 4.8692 4.9210 4.9866 5.0932 5.1801 5.2473 6.2312 6.5147 k = .3750 .6495 -.1852 ( 6112 PWs) bands (ev): -7.2316 -.6241 -.5500 -.3366 -.3273 .0413 .2615 .2695 .3098 .3823 .4956 .5029 .5503 .6183 .6545 .7974 .9182 .9221 .9508 1.2631 1.2865 1.3074 1.5560 1.5863 1.7648 1.7847 1.8926 1.9325 1.9475 1.9923 2.0212 2.0526 2.1044 2.2986 2.3300 2.4126 2.5158 2.5712 2.5963 2.6278 2.6987 2.7959 2.8439 2.9581 3.2795 3.3379 3.4870 3.5489 3.6819 3.7031 3.7424 3.8412 3.9441 4.0843 4.2192 4.3798 4.4263 4.6062 4.6449 4.6766 4.7386 4.8098 4.8354 4.9252 5.0248 5.0335 5.1903 5.4793 5.8955 k = .3750 -.2165 -.1852 ( 6154 PWs) bands (ev): -7.2377 -1.1301 -.6258 -.5554 -.4560 -.1282 -.0860 -.0350 -.0157 .1716 .1969 .2102 .2559 .3287 .3376 .6267 .8967 .9688 1.1374 1.2583 1.3340 1.3885 1.4631 1.5484 1.7142 1.8385 1.9385 2.0847 2.1276 2.2207 2.3079 2.3887 2.4061 2.4717 2.5207 2.6118 2.6727 2.7163 2.9561 3.0382 3.0705 3.1509 3.1990 3.3168 3.3236 3.4023 3.4503 3.4912 3.5801 3.6911 3.7072 4.0150 4.0185 4.1014 4.2265 4.2590 4.3635 4.3779 4.4654 4.5692 4.7045 4.9190 5.0111 5.0771 5.1033 5.2674 5.3430 6.0307 7.1449 k = .3750 .0722 -.1852 ( 6170 PWs) bands (ev): -7.2402 -1.3090 -.6245 -.5722 -.3855 -.2319 -.1387 -.1119 -.0801 -.0209 .0803 .1031 .1330 .2134 .2913 .5921 .7350 .8534 1.2022 1.2300 1.3286 1.4165 1.5239 1.5904 1.8295 1.8582 1.8844 1.9831 2.0720 2.2013 2.2856 2.3503 2.4143 2.4863 2.5372 2.5503 2.6166 2.8483 3.0787 3.1832 3.2007 3.2563 3.3259 3.4231 3.4314 3.4865 3.5444 3.6335 3.6711 3.7061 3.8370 4.0196 4.0966 4.2213 4.2954 4.4353 4.4625 4.5211 4.7256 4.7952 4.8868 4.9306 5.0148 5.1509 5.2440 5.2797 5.6593 6.0148 6.3795 the Fermi energy is 4.6337 ev ! total energy = -545.21797581 ryd estimated scf accuracy < .00000006 ryd band energy sum = 15.43663718 ryd one-electron contribution = -2086.25852991 ryd hartree contribution = 1118.39882422 ryd xc contribution = -103.86816344 ryd ewald contribution = 526.51464822 ryd scf in/out correction = .00979118 ryd correction for metals = -.00475490 ryd convergence has been achieved Forces acting on atoms (Ry/au): atom 1 type 1 force = -.00010965 -.00009289 .00003646 atom 2 type 1 force = .00016430 -.00011344 .00007980 atom 3 type 1 force = .00000895 .00012485 -.00015276 atom 4 type 2 force = -.00007962 -.00000698 .00045707 atom 5 type 3 force = .00007096 -.00002817 .00014692 atom 6 type 3 force = .00060333 -.00026601 .00045127 atom 7 type 3 force = -.00012629 .00043887 .00044300 atom 8 type 3 force = -.00041596 -.00000493 .00044751 atom 9 type 3 force = .00831991 -.00484730 -.01129765 atom 10 type 3 force = -.00029579 .00927976 -.01095431 atom 11 type 3 force = .00045127 -.00028871 -.02410279 atom 12 type 3 force = -.00818772 -.00442727 -.01101340 atom 13 type 3 force = .00015604 -.00010749 .00951252 atom 14 type 3 force = .00143527 .00060565 .01517612 atom 15 type 3 force = -.00219273 .00126971 .01559747 atom 16 type 3 force = .00019772 -.00153565 .01517277 Total force = .161295 Total SCF correction = .002269 searching for next position (pslinmin)... Eold = -545.21796686 Etot = -545.21797581 DEold = -.00158515 DEtot = -.00066871 linmin: 3rd order interpolation Enext = -545.21797699 Xnext= 1.451437 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 27, scf threshold 1.00E-07 H -.164245233 -.094537595 1.275913455 H .164220094 -.094451625 1.275509986 H -.000046240 .189960570 1.276181771 C -.000124390 .000431945 1.210742348 Rh .000370684 -.000196350 .827633385 Rh .749592114 -.432821528 .802144738 Rh .500078954 .000534776 .802613958 Rh .249510545 -.433434630 .802613889 Rh -.249999925 .144337556 .408248177 Rh .000000000 -.288675013 .408248177 Rh .499999849 -.288675013 .408248177 Rh .249999925 .144337556 .408248177 Rh -.499999849 .288675013 .000000000 Rh -.249999925 -.144337556 .000000000 Rh .249999925 -.144337556 .000000000 Rh .000000000 .288675013 .000000000 Writing file TOP-fcc.save file written NEW-OLD atomic charge density approx. for the potential Extrapolating wave-functions (first order) ... total cpu time spent up to now is 8338.33 secs iteration # 1 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 5.0 total energy = -545.21792427 ryd estimated scf accuracy < .00005650 ryd total cpu time spent up to now is 8391.87 secs iteration # 2 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 4.6 total energy = -545.21796101 ryd estimated scf accuracy < .00001822 ryd total cpu time spent up to now is 8463.94 secs iteration # 3 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 3.8 total energy = -545.21797583 ryd estimated scf accuracy < .00000234 ryd total cpu time spent up to now is 8497.51 secs iteration # 4 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 8.70E-10, avg # of iterations = 2.0 total energy = -545.21797707 ryd estimated scf accuracy < .00000079 ryd total cpu time spent up to now is 8523.16 secs iteration # 5 ecut= 27.00 ryd beta= .30 Davidson diagonalization with overlap ethr = 6.85E-10, avg # of iterations = 2.4 k = .1250 .2165 -.1852 ( 6180 PWs) bands (ev): -7.2492 -1.7531 -.6755 -.6464 -.5562 -.4820 -.4127 -.3717 -.2953 -.2720 -.2614 -.1910 -.0759 .0210 .0802 .3674 .3775 .5127 1.1930 1.3286 1.3601 1.4115 1.6830 1.7879 1.8213 1.8354 1.8602 2.0085 2.1294 2.1668 2.2662 2.3151 2.3801 2.4743 2.5909 2.8047 2.8127 2.8510 3.1800 3.3542 3.5143 3.5458 3.5867 3.6300 3.7168 3.7457 3.7947 3.8931 4.0918 4.2850 4.3617 4.4094 4.5169 4.5690 4.5993 4.6296 4.7576 4.7988 4.9010 4.9302 5.0327 5.0557 5.2192 5.2569 5.3117 5.3768 6.0929 6.1586 6.6063 k = .1250 .5052 -.1852 ( 6146 PWs) bands (ev): -7.2346 -.7938 -.6107 -.5469 -.4042 .0295 .0689 .1091 .1623 .2156 .3500 .4169 .4376 .4987 .5833 .8388 .8693 .9966 1.0216 1.2386 1.3118 1.3998 1.4394 1.5219 1.6294 1.7862 1.9377 2.0830 2.1346 2.1953 2.2200 2.3063 2.3298 2.3707 2.4726 2.5431 2.5758 2.6958 2.7490 2.8131 2.8544 2.9002 2.9639 3.0623 3.1361 3.3919 3.4172 3.5035 3.5805 3.6709 3.7384 3.8353 3.8695 3.9796 4.1260 4.2201 4.3118 4.3817 4.4968 4.5847 4.7426 4.8696 4.9216 4.9868 5.0936 5.1807 5.2477 6.2320 6.5152 k = .1250 -.3608 -.1852 ( 6170 PWs) bands (ev): -7.2407 -1.3083 -.6251 -.5746 -.3847 -.2312 -.1377 -.1108 -.0792 -.0201 .0809 .1040 .1336 .2137 .2917 .5927 .7356 .8541 1.2029 1.2300 1.3292 1.4169 1.5246 1.5921 1.8300 1.8586 1.8850 1.9837 2.0721 2.2019 2.2864 2.3506 2.4153 2.4870 2.5379 2.5511 2.6175 2.8484 3.0791 3.1838 3.2015 3.2570 3.3264 3.4237 3.4321 3.4869 3.5448 3.6339 3.6714 3.7069 3.8371 4.0202 4.0971 4.2217 4.2956 4.4360 4.4630 4.5217 4.7262 4.7957 4.8872 4.9309 5.0151 5.1516 5.2443 5.2801 5.6602 6.0152 6.3800 k = .1250 -.0722 -.1852 ( 6156 PWs) bands (ev): -7.2551 -1.9994 -.7608 -.7354 -.7106 -.6258 -.5542 -.5029 -.4965 -.3968 -.3767 -.3562 -.1873 -.0394 -.0219 .1943 .2448 .2565 1.1829 1.3278 1.3393 1.4228 1.7394 1.7479 1.7907 1.8268 1.9691 1.9952 2.1471 2.1776 2.2641 2.2972 2.3473 2.4687 2.6063 2.6476 2.9968 3.0171 3.5076 3.5923 3.6066 3.6760 3.6979 3.7063 3.7997 3.9096 3.9107 4.1712 4.2816 4.5156 4.6800 4.6927 4.7714 4.7956 4.8191 4.9005 4.9341 4.9489 4.9874 5.1000 5.2468 5.2746 5.4185 5.4268 5.4565 5.5103 6.0275 6.2435 6.9649 k = .3750 .3608 -.1852 ( 6146 PWs) bands (ev): -7.2346 -.7938 -.6112 -.5462 -.4045 .0294 .0689 .1090 .1623 .2158 .3501 .4169 .4376 .4985 .5833 .8388 .8693 .9965 1.0219 1.2385 1.3121 1.3997 1.4397 1.5221 1.6295 1.7862 1.9377 2.0825 2.1348 2.1952 2.2200 2.3062 2.3297 2.3705 2.4722 2.5431 2.5759 2.6960 2.7490 2.8131 2.8545 2.9003 2.9639 3.0626 3.1363 3.3920 3.4171 3.5036 3.5806 3.6709 3.7386 3.8354 3.8697 3.9793 4.1259 4.2200 4.3119 4.3817 4.4967 4.5847 4.7426 4.8696 4.9215 4.9869 5.0937 5.1807 5.2476 6.2319 6.5152 k = .3750 .6495 -.1852 ( 6112 PWs) bands (ev): -7.2320 -.6258 -.5516 -.3356 -.3269 .0421 .2620 .2708 .3108 .3829 .4966 .5036 .5509 .6190 .6553 .7982 .9188 .9229 .9514 1.2636 1.2877 1.3077 1.5567 1.5868 1.7659 1.7854 1.8929 1.9327 1.9483 1.9929 2.0214 2.0531 2.1057 2.2989 2.3307 2.4130 2.5165 2.5719 2.5969 2.6277 2.6995 2.7967 2.8442 2.9581 3.2801 3.3385 3.4876 3.5493 3.6818 3.7038 3.7431 3.8417 3.9445 4.0851 4.2198 4.3809 4.4264 4.6070 4.6453 4.6767 4.7390 4.8102 4.8359 4.9257 5.0250 5.0340 5.1907 5.4798 5.8959 k = .3750 -.2165 -.1852 ( 6154 PWs) bands (ev): -7.2381 -1.1294 -.6274 -.5569 -.4553 -.1273 -.0855 -.0339 -.0151 .1726 .1976 .2111 .2568 .3293 .3378 .6272 .8974 .9694 1.1380 1.2589 1.3346 1.3893 1.4636 1.5493 1.7148 1.8394 1.9389 2.0851 2.1284 2.2211 2.3086 2.3893 2.4066 2.4730 2.5212 2.6123 2.6733 2.7170 2.9567 3.0388 3.0713 3.1515 3.1996 3.3172 3.3243 3.4027 3.4505 3.4919 3.5808 3.6915 3.7075 4.0155 4.0190 4.1019 4.2272 4.2596 4.3637 4.3786 4.4657 4.5696 4.7049 4.9193 5.0116 5.0776 5.1036 5.2680 5.3433 6.0314 7.1454 k = .3750 .0722 -.1852 ( 6170 PWs) bands (ev): -7.2407 -1.3083 -.6259 -.5736 -.3849 -.2312 -.1378 -.1112 -.0793 -.0201 .0809 .1040 .1337 .2138 .2919 .5926 .7356 .8541 1.2028 1.2305 1.3293 1.4173 1.5245 1.5910 1.8301 1.8587 1.8850 1.9837 2.0725 2.2018 2.2865 2.3508 2.4150 2.4869 2.5378 2.5512 2.6172 2.8488 3.0791 3.1839 3.2017 3.2568 3.3265 3.4235 3.4321 3.4871 3.5449 3.6338 3.6715 3.7066 3.8375 4.0201 4.0971 4.2218 4.2958 4.4358 4.4629 4.5217 4.7260 4.7957 4.8872 4.9311 5.0152 5.1515 5.2443 5.2802 5.6598 6.0154 6.3800 the Fermi energy is 4.6341 ev ! total energy = -545.21797761 ryd estimated scf accuracy < .00000002 ryd band energy sum = 15.44102542 ryd one-electron contribution = -2086.23351996 ryd hartree contribution = 1118.38418644 ryd xc contribution = -103.86787666 ryd ewald contribution = 526.50399235 ryd scf in/out correction = .00151654 ryd correction for metals = -.00475978 ryd convergence has been achieved Forces acting on atoms (Ry/au): atom 1 type 1 force = .00001818 -.00001486 .00007138 atom 2 type 1 force = .00009001 -.00006801 .00014129 atom 3 type 1 force = .00000756 .00000191 -.00009887 atom 4 type 2 force = -.00013138 -.00000497 .00047995 atom 5 type 3 force = .00002350 .00001512 .00006352 atom 6 type 3 force = .00030547 -.00011432 .00032263 atom 7 type 3 force = -.00006730 .00016988 .00034358 atom 8 type 3 force = -.00014292 .00006487 .00034427 atom 9 type 3 force = .00830216 -.00483237 -.01125352 atom 10 type 3 force = -.00029228 .00926479 -.01095821 atom 11 type 3 force = .00046189 -.00029329 -.02391482 atom 12 type 3 force = -.00817215 -.00441804 -.01100792 atom 13 type 3 force = .00016025 -.00011012 .00950505 atom 14 type 3 force = .00144108 .00060952 .01518049 atom 15 type 3 force = -.00220028 .00127293 .01560381 atom 16 type 3 force = .00019621 -.00154304 .01517737 Total force = .159277 Total SCF correction = .000586 BFGS: convergence achieved, Efinal= -545.21797761 ------------------------------------------------------------------------ Final estimate of positions H -.164239853 -.094536468 1.276377272 H .164216063 -.094451329 1.275978295 H -.000046353 .189957990 1.276642040 C -.000134021 .000429320 1.211198769 Rh .000380493 -.000197787 .827954031 Rh .749701213 -.432869576 .802263880 Rh .500053791 .000615780 .802727027 Rh .249430135 -.433435976 .802727958 Rh -.249999925 .144337556 .408248177 Rh .000000000 -.288675013 .408248177 Rh .499999849 -.288675013 .408248177 Rh .249999925 .144337556 .408248177 Rh -.499999849 .288675013 .000000000 Rh -.249999925 -.144337556 .000000000 Rh .249999925 -.144337556 .000000000 Rh .000000000 .288675013 .000000000 Writing file TOP-fcc.save file written Writing file TOP-fcc.pun for program phonon Writing file TOP-fcc.save file written PWSCF : 2h22m CPU time init_run : 5.55s CPU electrons : 7961.75s CPU ( 28 calls, 284.348 s avg) forces : 230.57s CPU ( 28 calls, 8.235 s avg) electrons : 7961.75s CPU ( 28 calls, 284.348 s avg) c_bands : 6086.47s CPU ( 200 calls, 30.432 s avg) sum_band : 997.47s CPU ( 200 calls, 4.987 s avg) v_of_rho : 201.71s CPU ( 428 calls, .471 s avg) newd : 420.69s CPU ( 228 calls, 1.845 s avg) mix_rho : 133.38s CPU ( 200 calls, .667 s avg) c_bands : 6086.47s CPU ( 200 calls, 30.432 s avg) init_us_2 : 26.54s CPU ( 3424 calls, .008 s avg) cegterg : 6042.49s CPU ( 1600 calls, 3.777 s avg) sum_band : 997.47s CPU ( 200 calls, 4.987 s avg) sumbec : 1.03s CPU ( 1600 calls, .001 s avg) addusdens : 376.10s CPU ( 200 calls, 1.880 s avg) cegterg : 6042.49s CPU ( 1600 calls, 3.777 s avg) h_psi : 3534.54s CPU ( 7983 calls, .443 s avg) g_psi : 12.56s CPU ( 6383 calls, .002 s avg) overlap : 539.69s CPU ( 6383 calls, .085 s avg) cdiaghg : 860.62s CPU ( 6383 calls, .135 s avg) update : 835.45s CPU ( 6383 calls, .131 s avg) last : 128.92s CPU ( 1600 calls, .081 s avg) h_psi : 3534.54s CPU ( 7983 calls, .443 s avg) init : 748.89s CPU ( 7983 calls, .094 s avg) firstfft : 1035.83s CPU ( 375237 calls, .003 s avg) secondfft : 994.79s CPU ( 375237 calls, .003 s avg) add_vuspsi : 331.21s CPU ( 7983 calls, .041 s avg) s_psi : 337.30s CPU ( 7983 calls, .042 s avg) General routines ccalbec : 840.38s CPU ( 9807 calls, .086 s avg) cft3 : 230.45s CPU ( 10236 calls, .023 s avg) cft3s : 2194.93s CPU ( 861302 calls, .003 s avg) interpolate : 9.93s CPU ( 428 calls, .023 s avg) davcio : 16.12s CPU ( 6496 calls, .002 s avg) Parallel routines reduce : 802.68s CPU ( 50032 calls, .016 s avg) fft_scatter : 954.63s CPU ( 871538 calls, .001 s avg) Dynamical memory: 38.46Mb current, 50.27Mb maximum xcrysden-1.6.2/examples/PWSCF_files/CH3Rh111.inp0000644000175000017500000000540011712736221017540 0ustar tonetone ************************************************************************ Structure: CH3(TOP-fcc)+Rh(111) ; (2x2) SUPER-CELL ------------------------------------------------------------------------ (111) surface lattice: 1.0 0.0 0.0 0.5 V3/2 0.0 0.0 0.0 X.X ------------------------------------------------------------------------ 3L slab (1L-relaxed + 2Lfixed) ************************************************************************ &CONTROL title = 'CH3 + Rh(111)-1x1-3L(1R+2F)' , calculation = 'relax', verbosity = 'default', restart_mode = 'restart' , tprnfor = .true., outdir = '/scratch/sists022/Rh111/ch3rh111/', prefix = 'TOP-fcc', disk_io = 'default', pseudo_dir = '/u/sists022/pw/pseudo/', / &SYSTEM nosym = .true. ibrav = 0, celldm(1) = 10.35501312505203925684, nat = 16, ntyp = 3, ecutwfc = 27.0000000000, ecutrho = 216.0000000000, occupations = 'smearing' , degauss = 0.03, smearing = 'methfessel-paxton' , / &ELECTRONS electron_maxstep = 100, conv_thr = 1.0e-06, mixing_mode = 'local-TF' , startingpot = 'atomic' , startingwfc = 'atomic' , mixing_beta = 0.300000000, mixing_ndim = 8, diagonalization = 'david_overlap' , diago_david_ndim = 8, / &IONS ion_dynamics = 'bfgs', potential_extrapolation = 'wfc', / CELL_PARAMETERS hexagonal 1.00000 0.00000000000000000000 0.00000 -0.50000 0.86602540378443864675 0.00000 0.00000 0.00000000000000000000 2.70000 ATOMIC_SPECIES H 1.000 HUSPBE.RRKJ3 C 1.000 C2s2pUSPBE.RRKJ3 Rh 1.000 RhUSPBE.RRKJ3 ATOMIC_POSITIONS angstrom H -0.9082985520 -0.5233621001 6.8823909581 1 1 1 H 0.9090764523 -0.5231097341 6.8809842289 1 1 1 H -0.0000000095 1.0506227016 6.8758881212 1 1 1 C 0.0000000000 0.0000000000 6.5135902286 1 1 1 Rh 0.0000000000 0.0000000000 4.4135902286 1 1 1 Rh 4.1097248451 -2.3727507352 4.4135902286 1 1 1 Rh 2.7398165634 0.0000000000 4.4135902286 1 1 1 Rh 1.3699082817 -2.3727507352 4.4135902286 1 1 1 Rh -1.3699082817 0.7909170944 2.2370509086 0 0 0 Rh 0.0000000000 -1.5818336408 2.2370509086 0 0 0 Rh 2.7398165634 -1.5818336408 2.2370509086 0 0 0 Rh 1.3699082817 0.7909170944 2.2370509086 0 0 0 Rh -2.7398165634 1.5818336408 0.0000000000 0 0 0 Rh -1.3699082817 -0.7909170944 0.0000000000 0 0 0 Rh 1.3699082817 -0.7909170944 0.0000000000 0 0 0 Rh 0.0000000000 1.5818336408 0.0000000000 0 0 0 K_POINTS automatic 4 4 1 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/EthAl001-2x2.out0000644000175000017500000047211611712736221020332 0ustar tonetone Program PWSCF 0.0.1 starts ... Today is 04-07-01 at 09:57:21 Parallel version (MPI) Number of processors in use: 4 R & G space division: nprocp = 4 Ultrasoft (Vanderbilt) Pseudopotentials Complex Hamiltonian current dimensions of program pwscf are: ntypx= 6 npsx = 6 lmax = 2 npk =20000 nbrx = 6 lqx = 5 nqfm = 8 Planes per process (thick) : nr3 =220 npp = 55 ncplane = 3136 Planes per process (smooth): nr3s=154 npps= 39 ncplanes= 1296 Title: Eth(GGA:TOP)/Al(001)-2x2 crystal is Eth/Al(001) bravais-lattice index = 6 lattice parameter (a_0) = 10.8476 a.u. unit-cell volume = 5373.7899 (a.u.)^3 number of atoms/cell = 32 number of atomic types = 3 kinetic-energy cutoff = 27.0000 Ry charge density cutoff = 216.0000 Ry convergence threshold = 1.0E-13 beta = .5000 number of iterations used = 4 Exch-corr: mfxcx, mfxcc, mgcx, mgcc = 1 4 3 4 iswitch = 1 nstep = 50 celldm(1)= 10.84758 celldm(2)= .00000 celldm(3)= 4.21000 celldm(4)= .00000 celldm(5)= .00000 celldm(6)= .00000 crystal axes: (cart. coord. in units of a_0) a(1) = ( 1.0000 .0000 .0000 ) a(2) = ( .0000 1.0000 .0000 ) a(3) = ( .0000 .0000 4.2100 ) reciprocal axes: (cart. coord. in units 2 pi/a_0) b(1) = ( 1.0000 .0000 .0000 ) b(2) = ( .0000 1.0000 .0000 ) b(3) = ( .0000 .0000 .2375 ) PSEUDO 1 is Al zval = 3.0 lmax= 2 lloc= 0 (in numerical form: 879 grid points, xmin = -6.00, dx = .0150) PSEUDO 2 is C (US) zval = 4.0 lmax= 2 lloc= 0 Version 0 0 0 of US pseudo code Using log mesh of 627 points The pseudopotential has 4 beta functions with: l(1) = 0 l(2) = 0 l(3) = 1 l(4) = 1 Q(r) pseudized with 0 coefficients, rinner = .000 .000 .000 .000 .000 PSEUDO 3 is H (US) zval = 1.0 lmax= 1 lloc= 0 Version 0 0 0 of US pseudo code Using log mesh of 1061 points The pseudopotential has 2 beta functions with: l(1) = 0 l(2) = 0 Q(r) pseudized with 0 coefficients, rinner = .000 .000 .000 atomic species valence pseudopotential Al 3.00 Al( 1.00) C 4.00 C ( 1.00) H 1.00 H ( 1.00) 8 Sym.Ops. (with inversion) s frac. trans. isym = 1 identity cryst. s( 1) = ( 1 0 0 ) ( 0 1 0 ) ( 0 0 1 ) carth. s( 1) = ( 1.0000000 .0000000 .0000000 ) ( .0000000 1.0000000 .0000000 ) ( .0000000 .0000000 1.0000000 ) isym = 2 180 deg rotation - carth. axis [0,0,1] cryst. s( 2) = ( -1 0 0 ) ( 0 -1 0 ) ( 0 0 1 ) carth. s( 2) = ( -1.0000000 .0000000 .0000000 ) ( .0000000 -1.0000000 .0000000 ) ( .0000000 .0000000 1.0000000 ) isym = 3 180 deg rotation - carth. axis [0,1,0] cryst. s( 3) = ( -1 0 0 ) ( 0 1 0 ) ( 0 0 -1 ) carth. s( 3) = ( -1.0000000 .0000000 .0000000 ) ( .0000000 1.0000000 .0000000 ) ( .0000000 .0000000 -1.0000000 ) isym = 4 180 deg rotation - carth. axis [1,0,0] cryst. s( 4) = ( 1 0 0 ) ( 0 -1 0 ) ( 0 0 -1 ) carth. s( 4) = ( 1.0000000 .0000000 .0000000 ) ( .0000000 -1.0000000 .0000000 ) ( .0000000 .0000000 -1.0000000 ) isym = 5 inversion cryst. s( 5) = ( -1 0 0 ) ( 0 -1 0 ) ( 0 0 -1 ) carth. s( 5) = ( -1.0000000 .0000000 .0000000 ) ( .0000000 -1.0000000 .0000000 ) ( .0000000 .0000000 -1.0000000 ) isym = 6 inv. 180 deg rotation - carth. axis [0,0,1] cryst. s( 6) = ( 1 0 0 ) ( 0 1 0 ) ( 0 0 -1 ) carth. s( 6) = ( 1.0000000 .0000000 .0000000 ) ( .0000000 1.0000000 .0000000 ) ( .0000000 .0000000 -1.0000000 ) isym = 7 inv. 180 deg rotation - carth. axis [0,1,0] cryst. s( 7) = ( 1 0 0 ) ( 0 -1 0 ) ( 0 0 1 ) carth. s( 7) = ( 1.0000000 .0000000 .0000000 ) ( .0000000 -1.0000000 .0000000 ) ( .0000000 .0000000 1.0000000 ) isym = 8 inv. 180 deg rotation - carth. axis [1,0,0] cryst. s( 8) = ( -1 0 0 ) ( 0 1 0 ) ( 0 0 1 ) carth. s( 8) = ( -1.0000000 .0000000 .0000000 ) ( .0000000 1.0000000 .0000000 ) ( .0000000 .0000000 1.0000000 ) Carthesian axes site n. atom positions (a_0 units) 1 C tau( 1) = ( .5000000 .6158884 1.3180000 ) 2 H tau( 2) = ( .6616002 .7158629 1.3180000 ) 3 H tau( 3) = ( .3383998 .7158629 1.3180000 ) 4 C tau( 4) = ( .5000000 .3841116 1.3180000 ) 5 H tau( 5) = ( .6616002 .2841371 1.3180000 ) 6 H tau( 6) = ( .3383998 .2841371 1.3180000 ) 7 Al tau( 7) = ( .5000000 .5000000 .7083029 ) 8 Al tau( 8) = ( .5000000 .0000000 .7083029 ) 9 Al tau( 9) = ( .0000000 .5000000 .7083029 ) 10 Al tau(10) = ( .0000000 .0000000 .7083029 ) 11 Al tau(11) = ( -.2500000 -.2500000 .3530030 ) 12 Al tau(12) = ( -.2500000 .2500000 .3530030 ) 13 Al tau(13) = ( .2500000 -.2500000 .3530030 ) 14 Al tau(14) = ( .2500000 .2500000 .3530030 ) 15 Al tau(15) = ( .5000000 .5000000 .0000000 ) 16 Al tau(16) = ( .5000000 .0000000 .0000000 ) 17 Al tau(17) = ( .0000000 .5000000 .0000000 ) 18 Al tau(18) = ( .0000000 .0000000 .0000000 ) 19 Al tau(19) = ( .2500000 .2500000 -.3530030 ) 20 Al tau(20) = ( .2500000 -.2500000 -.3530030 ) 21 Al tau(21) = ( -.2500000 .2500000 -.3530030 ) 22 Al tau(22) = ( -.2500000 -.2500000 -.3530030 ) 23 Al tau(23) = ( -.5000000 -.5000000 -.7083029 ) 24 Al tau(24) = ( -.5000000 .0000000 -.7083029 ) 25 Al tau(25) = ( .0000000 -.5000000 -.7083029 ) 26 Al tau(26) = ( .0000000 .0000000 -.7083029 ) 27 C tau(27) = ( .5000000 .6158884 -1.3180000 ) 28 H tau(28) = ( .6616002 .7158629 -1.3180000 ) 29 H tau(29) = ( .3383998 .7158629 -1.3180000 ) 30 C tau(30) = ( .5000000 .3841116 -1.3180000 ) 31 H tau(31) = ( .6616002 .2841371 -1.3180000 ) 32 H tau(32) = ( .3383998 .2841371 -1.3180000 ) Crystallographic axes site n. atom positions (cryst. coord.) 1 C tau( 1) = ( .5000000 .6158884 .3130641 ) 2 H tau( 2) = ( .6616002 .7158629 .3130641 ) 3 H tau( 3) = ( .3383998 .7158629 .3130641 ) 4 C tau( 4) = ( .5000000 .3841116 .3130641 ) 5 H tau( 5) = ( .6616002 .2841371 .3130641 ) 6 H tau( 6) = ( .3383998 .2841371 .3130641 ) 7 Al tau( 7) = ( .5000000 .5000000 .1682430 ) 8 Al tau( 8) = ( .5000000 .0000000 .1682430 ) 9 Al tau( 9) = ( .0000000 .5000000 .1682430 ) 10 Al tau(10) = ( .0000000 .0000000 .1682430 ) 11 Al tau(11) = ( -.2500000 -.2500000 .0838487 ) 12 Al tau(12) = ( -.2500000 .2500000 .0838487 ) 13 Al tau(13) = ( .2500000 -.2500000 .0838487 ) 14 Al tau(14) = ( .2500000 .2500000 .0838487 ) 15 Al tau(15) = ( .5000000 .5000000 .0000000 ) 16 Al tau(16) = ( .5000000 .0000000 .0000000 ) 17 Al tau(17) = ( .0000000 .5000000 .0000000 ) 18 Al tau(18) = ( .0000000 .0000000 .0000000 ) 19 Al tau(19) = ( .2500000 .2500000 -.0838487 ) 20 Al tau(20) = ( .2500000 -.2500000 -.0838487 ) 21 Al tau(21) = ( -.2500000 .2500000 -.0838487 ) 22 Al tau(22) = ( -.2500000 -.2500000 -.0838487 ) 23 Al tau(23) = ( -.5000000 -.5000000 -.1682430 ) 24 Al tau(24) = ( -.5000000 .0000000 -.1682430 ) 25 Al tau(25) = ( .0000000 -.5000000 -.1682430 ) 26 Al tau(26) = ( .0000000 .0000000 -.1682430 ) 27 C tau(27) = ( .5000000 .6158884 -.3130641 ) 28 H tau(28) = ( .6616002 .7158629 -.3130641 ) 29 H tau(29) = ( .3383998 .7158629 -.3130641 ) 30 C tau(30) = ( .5000000 .3841116 -.3130641 ) 31 H tau(31) = ( .6616002 .2841371 -.3130641 ) 32 H tau(32) = ( .3383998 .2841371 -.3130641 ) number of k points= 4 gaussian broad. (ryd)= .0300 ngauss = 1 carth. coord. in units 2pi/a_0 k( 1) = ( .1250000 .1250000 -.1187648), wk = .5000000 k( 2) = ( .1250000 .3750000 -.1187648), wk = .5000000 k( 3) = ( .3750000 .1250000 -.1187648), wk = .5000000 k( 4) = ( .3750000 .3750000 -.1187648), wk = .5000000 cryst. coord. k( 1) = ( .1250000 .1250000 -.5000000), wk = .5000000 k( 2) = ( .1250000 .3750000 -.5000000), wk = .5000000 k( 3) = ( .3750000 .1250000 -.5000000), wk = .5000000 k( 4) = ( .3750000 .3750000 -.5000000), wk = .5000000 G cutoff = 643.8130 ( 72048 G-vectors) FFT grid: ( 56, 56,220) G cutoff = 321.9065 ( 25451 G-vectors) smooth grid: ( 36, 36,154) nbndx = 200 nbnd = 50 natomwfc = 104 npwx = 3240 nelec = 84.00 nkb = 18 nkbtot = 208 ngl = 15433 Initial potential from superpositions of free atoms starting charge = 83.17836 Starting wfc are atomic Dynamical memory: 52.78Mb current, 73.41Mb maximum total cpu time spent up to now is 42.66 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.00E-05, avg # of iterations = 11.8 potential mean squ. error = 4.4E-05 ryd^2 total energy = -54.28480494 ryd total cpu time spent up to now is 144.46 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 WARNING: e( 34) = -3.14719 is not converged to within 5.0E-06 WARNING: e( 37) = -3.12228 is not converged to within 5.0E-06 WARNING: e( 38) = -3.05854 is not converged to within 5.0E-06 WARNING: e( 39) = -3.03236 is not converged to within 5.0E-06 WARNING: e( 40) = -3.01954 is not converged to within 5.0E-06 WARNING: e( 41) = -3.01948 is not converged to within 5.0E-06 WARNING: e( 43) = -2.94158 is not converged to within 5.0E-06 WARNING: e( 44) = -2.94141 is not converged to within 5.0E-06 WARNING: e( 45) = -2.93231 is not converged to within 5.0E-06 WARNING: e( 47) = -2.88189 is not converged to within 5.0E-06 WARNING: e( 48) = -2.85949 is not converged to within 5.0E-06 WARNING: e( 49) = -2.85890 is not converged to within 5.0E-06 WARNING: e( 50) = -2.83203 is not converged to within 5.0E-06 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 32) = -3.23898 is not converged to within 5.0E-06 WARNING: e( 36) = -3.13116 is not converged to within 5.0E-06 WARNING: e( 37) = -3.09593 is not converged to within 5.0E-06 WARNING: e( 38) = -3.04489 is not converged to within 5.0E-06 WARNING: e( 39) = -3.03515 is not converged to within 5.0E-06 WARNING: e( 40) = -3.02402 is not converged to within 5.0E-06 WARNING: e( 42) = -2.99159 is not converged to within 5.0E-06 WARNING: e( 43) = -2.97367 is not converged to within 5.0E-06 WARNING: e( 44) = -2.95618 is not converged to within 5.0E-06 WARNING: e( 45) = -2.95450 is not converged to within 5.0E-06 WARNING: e( 46) = -2.89321 is not converged to within 5.0E-06 WARNING: e( 48) = -2.88888 is not converged to within 5.0E-06 WARNING: e( 49) = -2.83240 is not converged to within 5.0E-06 WARNING: e( 50) = -2.82629 is not converged to within 5.0E-06 eneter cegter 872532280 873172296 878977016 WARNING: e( 50) = -2.83113 is not converged to within 5.0E-06 warning : 1 eigenvectors not converged after 2 attemps eneter cegter 872532280 873172296 878977016 WARNING: e( 37) = -3.09584 is not converged to within 5.0E-06 WARNING: e( 38) = -3.04491 is not converged to within 5.0E-06 WARNING: e( 40) = -3.02445 is not converged to within 5.0E-06 WARNING: e( 42) = -2.99206 is not converged to within 5.0E-06 WARNING: e( 43) = -2.97337 is not converged to within 5.0E-06 WARNING: e( 44) = -2.95633 is not converged to within 5.0E-06 WARNING: e( 45) = -2.95476 is not converged to within 5.0E-06 WARNING: e( 46) = -2.89271 is not converged to within 5.0E-06 WARNING: e( 48) = -2.88897 is not converged to within 5.0E-06 WARNING: e( 49) = -2.83419 is not converged to within 5.0E-06 WARNING: e( 50) = -2.82902 is not converged to within 5.0E-06 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 34) = -3.19050 is not converged to within 5.0E-06 WARNING: e( 39) = -3.02778 is not converged to within 5.0E-06 WARNING: e( 40) = -3.01134 is not converged to within 5.0E-06 WARNING: e( 41) = -2.99339 is not converged to within 5.0E-06 WARNING: e( 42) = -2.93164 is not converged to within 5.0E-06 WARNING: e( 43) = -2.91544 is not converged to within 5.0E-06 WARNING: e( 44) = -2.87352 is not converged to within 5.0E-06 WARNING: e( 45) = -2.87303 is not converged to within 5.0E-06 WARNING: e( 46) = -2.86629 is not converged to within 5.0E-06 WARNING: e( 47) = -2.81916 is not converged to within 5.0E-06 WARNING: e( 48) = -2.79572 is not converged to within 5.0E-06 WARNING: e( 49) = -2.78627 is not converged to within 5.0E-06 WARNING: e( 50) = -2.78466 is not converged to within 5.0E-06 eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = -2.79589 is not converged to within 5.0E-06 warning : 1 eigenvectors not converged after 2 attemps ethr = 5.00E-06, avg # of iterations = 37.8 potential mean squ. error = 5.2E-04 ryd^2 total energy = 751.84216693 ryd total cpu time spent up to now is 438.99 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = -.28947 is not converged to within 2.5E-06 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 WARNING: e( 47) = -.32266 is not converged to within 2.5E-06 WARNING: e( 48) = -.27409 is not converged to within 2.5E-06 WARNING: e( 49) = -.27337 is not converged to within 2.5E-06 WARNING: e( 50) = -.27022 is not converged to within 2.5E-06 warning : 4 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 WARNING: e( 48) = -.27334 is not converged to within 2.5E-06 WARNING: e( 49) = -.27250 is not converged to within 2.5E-06 WARNING: e( 50) = -.27018 is not converged to within 2.5E-06 warning : 3 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = -.29830 is not converged to within 2.5E-06 WARNING: e( 50) = -.29344 is not converged to within 2.5E-06 warning : 2 eigenvectors not converged after 1 attemps ethr = 2.50E-06, avg # of iterations = 20.0 potential mean squ. error = 6.4E-05 ryd^2 total energy = 46.62144515 ryd total cpu time spent up to now is 607.22 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 WARNING: e( 48) = -.10080 is not converged to within 1.3E-06 WARNING: e( 50) = -.09220 is not converged to within 1.3E-06 warning : 2 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = -.06482 is not converged to within 1.3E-06 WARNING: e( 50) = -.05895 is not converged to within 1.3E-06 warning : 2 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 WARNING: e( 48) = -.06635 is not converged to within 1.3E-06 WARNING: e( 49) = -.06466 is not converged to within 1.3E-06 WARNING: e( 50) = -.05795 is not converged to within 1.3E-06 warning : 3 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 WARNING: e( 44) = -.15887 is not converged to within 1.3E-06 WARNING: e( 45) = -.15820 is not converged to within 1.3E-06 WARNING: e( 49) = -.10325 is not converged to within 1.3E-06 warning : 3 eigenvectors not converged after 1 attemps ethr = 1.25E-06, avg # of iterations = 20.0 potential mean squ. error = 4.8E-05 ryd^2 total energy = -54.65949264 ryd total cpu time spent up to now is 762.88 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 6.25E-07, avg # of iterations = 16.2 potential mean squ. error = 4.3E-05 ryd^2 total energy = -62.61722305 ryd total cpu time spent up to now is 908.91 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 3.13E-07, avg # of iterations = 15.5 potential mean squ. error = 9.4E-06 ryd^2 total energy = -119.02375417 ryd total cpu time spent up to now is 1025.33 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 WARNING: e( 50) = .24224 is not converged to within 1.6E-07 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.56E-07, avg # of iterations = 17.2 potential mean squ. error = 4.7E-06 ryd^2 total energy = -128.29678554 ryd total cpu time spent up to now is 1131.68 secs iteration # 8 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 48) = .22884 is not converged to within 7.8E-08 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 WARNING: e( 50) = .24675 is not converged to within 7.8E-08 warning : 1 eigenvectors not converged after 1 attemps ethr = 7.81E-08, avg # of iterations = 19.5 potential mean squ. error = 4.9E-09 ryd^2 total energy = -137.40683916 ryd total cpu time spent up to now is 1250.82 secs iteration # 9 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 3.91E-08, avg # of iterations = 15.8 potential mean squ. error = 5.6E-09 ryd^2 total energy = -137.40635927 ryd total cpu time spent up to now is 1350.73 secs iteration # 10 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = .24072 is not converged to within 2.0E-08 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.95E-08, avg # of iterations = 15.0 potential mean squ. error = 4.5E-10 ryd^2 total energy = -137.42913987 ryd total cpu time spent up to now is 1444.57 secs iteration # 11 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = .24264 is not converged to within 9.8E-09 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 9.77E-09, avg # of iterations = 16.0 potential mean squ. error = 2.6E-11 ryd^2 total energy = -137.43146300 ryd total cpu time spent up to now is 1536.67 secs iteration # 12 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = .24298 is not converged to within 4.9E-09 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.88E-09, avg # of iterations = 14.5 potential mean squ. error = 2.3E-11 ryd^2 total energy = -137.43154949 ryd total cpu time spent up to now is 1617.02 secs iteration # 13 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = .24366 is not converged to within 2.4E-09 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.44E-09, avg # of iterations = 14.2 potential mean squ. error = 1.2E-10 ryd^2 total energy = -137.43125557 ryd total cpu time spent up to now is 1700.11 secs iteration # 14 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = .24397 is not converged to within 1.2E-09 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.22E-09, avg # of iterations = 12.5 potential mean squ. error = 1.8E-12 ryd^2 total energy = -137.43160914 ryd total cpu time spent up to now is 1777.42 secs iteration # 15 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = .24412 is not converged to within 6.1E-10 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 6.10E-10, avg # of iterations = 14.2 potential mean squ. error = 1.8E-13 ryd^2 total energy = -137.43161492 ryd total cpu time spent up to now is 1851.96 secs iteration # 16 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 WARNING: e( 49) = .24406 is not converged to within 3.1E-10 warning : 1 eigenvectors not converged after 1 attemps eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 3.05E-10, avg # of iterations = 10.8 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.3011 -13.3011 -8.9763 -8.6550 -8.6549 -7.9840 -6.5333 -5.9397 -5.9396 -5.6642 -5.6617 -4.7996 -4.7717 -4.6908 -4.6849 -4.5630 -3.5109 -3.5071 -3.2527 -3.2425 -2.9174 -2.9171 -2.5288 -2.5236 -2.4630 -2.2600 -1.6192 -1.5054 -1.3531 -1.2923 -1.2201 -1.1219 -1.0532 -.8876 -.1273 -.0989 .0382 .4802 .7703 .7873 1.0487 1.1152 1.3904 1.4134 1.7891 1.9948 2.7647 2.8538 2.8644 2.9081 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.2913 -13.2912 -8.7276 -8.7275 -8.4188 -7.4294 -7.3106 -6.3267 -5.9840 -5.9122 -5.9107 -5.1192 -4.8885 -4.6452 -4.6401 -4.1478 -4.0435 -4.0411 -3.0799 -2.9978 -2.9959 -2.9791 -2.9614 -2.7096 -2.0000 -1.9458 -1.8293 -1.6450 -1.4311 -1.1782 -.9731 -.8519 -.7906 -.5958 -.3975 .1196 .2230 .3394 .4139 1.2611 1.3191 1.5224 1.6010 2.2476 2.2792 2.4190 2.7391 3.2032 3.3206 3.3406 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.2988 -13.2987 -8.6503 -8.6501 -8.4191 -7.4299 -7.3108 -6.3289 -6.0116 -5.9701 -5.9441 -5.1193 -4.8938 -4.7638 -4.7507 -4.1478 -4.0417 -4.0411 -3.0783 -2.9789 -2.9777 -2.9527 -2.9399 -2.7089 -1.9991 -1.9454 -1.8416 -1.6453 -1.4348 -1.1821 -.9737 -.8514 -.8018 -.5978 -.3686 .1198 .2262 .3512 .4129 1.2808 1.3335 1.5237 1.5865 2.2493 2.2779 2.4182 2.7363 3.2040 3.2858 3.4102 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.2890 -13.2890 -8.7214 -8.7213 -7.8638 -6.8774 -6.7608 -6.7586 -5.9455 -5.9439 -5.7807 -5.7729 -5.6643 -5.4334 -4.6893 -4.6323 -4.6319 -4.3484 -4.3390 -3.5072 -3.2695 -3.0381 -3.0304 -2.4531 -2.4159 -1.5678 -1.4682 -1.2133 -.8839 -.3652 -.3622 .0236 .1436 .1554 .6035 .6057 .8091 1.0224 1.0697 1.6284 1.7268 1.8676 1.9940 1.9985 2.2102 2.4208 2.4985 2.8331 3.1359 3.4227 the Fermi energy is 1.6103 ev ! total energy = -137.43161772 ryd band energy sum = -21.74111650 ryd one-electron contribution = -630.47394671 ryd hartree contribution = 337.26407109 ryd xc contribution = -50.62826491 ryd ewald contribution = 206.40921862 ryd scf accuracy < .00890636 ryd potential mean squ. error = 5.6E-14 ryd^2 correction for metals = -.00269582 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 .00453537 .00218199 atom 2 type 3 force = .00001117 .00019208 -.00023975 atom 3 type 3 force = -.00001117 .00019208 -.00023975 atom 4 type 2 force = .00000000 -.00453537 .00218199 atom 5 type 3 force = .00001117 -.00019208 -.00023975 atom 6 type 3 force = -.00001117 -.00019208 -.00023975 atom 7 type 1 force = .00000000 .00000000 .00736771 atom 8 type 1 force = .00000000 .00000000 .00554892 atom 9 type 1 force = .00000000 .00000000 .00550803 atom 10 type 1 force = .00000000 .00000000 .00616217 atom 11 type 1 force = .00015270 .00017328 .00701243 atom 12 type 1 force = .00015270 -.00017328 .00701243 atom 13 type 1 force = -.00015270 .00017328 .00701243 atom 14 type 1 force = -.00015270 -.00017328 .00701243 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = -.00015270 -.00017328 -.00701243 atom 20 type 1 force = -.00015270 .00017328 -.00701243 atom 21 type 1 force = .00015270 -.00017328 -.00701243 atom 22 type 1 force = .00015270 .00017328 -.00701243 atom 23 type 1 force = .00000000 .00000000 -.00736771 atom 24 type 1 force = .00000000 .00000000 -.00554892 atom 25 type 1 force = .00000000 .00000000 -.00550803 atom 26 type 1 force = .00000000 .00000000 -.00616217 atom 27 type 2 force = .00000000 .00453537 -.00218199 atom 28 type 3 force = .00001117 .00019208 .00023975 atom 29 type 3 force = -.00001117 .00019208 .00023975 atom 30 type 2 force = .00000000 -.00453537 -.00218199 atom 31 type 3 force = .00001117 -.00019208 .00023975 atom 32 type 3 force = -.00001117 -.00019208 .00023975 Total force = .138294 Total SCF correction = .003840 forces : 19.34s CPU EPSE = .10E-03 EPSF = .10E-02 UPSCALE = 30.00 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 1, scf threshold 2.01E-15 .500000000 .616306481 1.318201150 2 .661601263 .715880633 1.317977898 3 .338398737 .715880633 1.317977898 3 .500000000 .383693519 1.318201150 2 .661601263 .284119367 1.317977898 3 .338398737 .284119367 1.317977898 3 .500000000 .500000000 .708982105 1 .500000000 .000000000 .708814436 1 .000000000 .500000000 .708810667 1 .000000000 .000000000 .708870970 1 -.249985923 -.249984026 .353649427 1 -.249985923 .249984026 .353649427 1 .249985923 -.249984026 .353649427 1 .249985923 .249984026 .353649427 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .249985923 .249984026 -.353649427 1 .249985923 -.249984026 -.353649427 1 -.249985923 .249984026 -.353649427 1 -.249985923 -.249984026 -.353649427 1 -.500000000 -.500000000 -.708982105 1 -.500000000 .000000000 -.708814436 1 .000000000 -.500000000 -.708810667 1 .000000000 .000000000 -.708870970 1 .500000000 .616306481 -1.318201150 2 .661601263 .715880633 -1.317977898 3 .338398737 .715880633 -1.317977898 3 .500000000 .383693519 -1.318201150 2 .661601263 .284119367 -1.317977898 3 .338398737 .284119367 -1.317977898 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 1958.85 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.01E-07, avg # of iterations = 6.2 potential mean squ. error = 3.0E-11 ryd^2 total energy = -137.43218346 ryd total cpu time spent up to now is 2025.10 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 5.47E-09, avg # of iterations = 10.8 potential mean squ. error = 1.2E-09 ryd^2 total energy = -137.42903199 ryd total cpu time spent up to now is 2098.79 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.74E-09, avg # of iterations = 12.0 potential mean squ. error = 2.9E-12 ryd^2 total energy = -137.43228552 ryd total cpu time spent up to now is 2173.46 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.37E-09, avg # of iterations = 6.0 potential mean squ. error = 3.5E-13 ryd^2 total energy = -137.43229548 ryd total cpu time spent up to now is 2244.39 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 5.94E-10, avg # of iterations = 5.0 potential mean squ. error = 8.8E-14 ryd^2 total energy = -137.43229705 ryd total cpu time spent up to now is 2305.71 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.97E-10, avg # of iterations = 3.5 potential mean squ. error = 2.4E-14 ryd^2 total energy = -137.43229726 ryd total cpu time spent up to now is 2350.92 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.48E-10, avg # of iterations = 4.2 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.2807 -13.2806 -8.9660 -8.6708 -8.6708 -7.9817 -6.5317 -5.9422 -5.9422 -5.6537 -5.6515 -4.7841 -4.7540 -4.6883 -4.6825 -4.5589 -3.5004 -3.4968 -3.2510 -3.2408 -2.9448 -2.9445 -2.5263 -2.5214 -2.4524 -2.2606 -1.6108 -1.5026 -1.3507 -1.2830 -1.2140 -1.1202 -1.0477 -.8767 -.1248 -.0983 .0406 .4899 .7725 .7895 1.0458 1.1131 1.3922 1.4166 1.7912 2.0058 2.7619 2.8520 2.8617 2.9057 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.2706 -13.2706 -8.7435 -8.7434 -8.4085 -7.4270 -7.3003 -6.3243 -5.9826 -5.9146 -5.9130 -5.1088 -4.8869 -4.6271 -4.6219 -4.1454 -4.0413 -4.0306 -3.0793 -3.0227 -3.0192 -2.9687 -2.9631 -2.7080 -1.9976 -1.9355 -1.8262 -1.6434 -1.4178 -1.1706 -.9706 -.8412 -.7875 -.5941 -.3974 .1220 .2248 .3389 .4157 1.2609 1.3198 1.5238 1.5985 2.2581 2.2817 2.4256 2.7401 3.2055 3.3182 3.3326 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.2783 -13.2782 -8.6661 -8.6660 -8.4088 -7.4276 -7.3005 -6.3266 -6.0119 -5.9726 -5.9447 -5.1089 -4.8915 -4.7463 -4.7338 -4.1454 -4.0395 -4.0306 -3.0765 -2.9866 -2.9797 -2.9683 -2.9552 -2.7073 -1.9967 -1.9350 -1.8382 -1.6436 -1.4215 -1.1751 -.9713 -.8408 -.7990 -.5961 -.3681 .1222 .2283 .3506 .4147 1.2824 1.3327 1.5251 1.5838 2.2599 2.2803 2.4247 2.7373 3.2063 3.2826 3.4035 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.2683 -13.2683 -8.7373 -8.7373 -7.8535 -6.8751 -6.7504 -6.7483 -5.9479 -5.9463 -5.7782 -5.7708 -5.6539 -5.4318 -4.6869 -4.6141 -4.6138 -4.3467 -4.3374 -3.5052 -3.2685 -3.0643 -3.0563 -2.4510 -2.4137 -1.5583 -1.4608 -1.2040 -.8821 -.3550 -.3514 .0215 .1539 .1553 .6062 .6079 .8074 1.0230 1.0721 1.6359 1.7242 1.8661 1.9956 2.0000 2.2212 2.4226 2.5007 2.8308 3.1383 3.4270 the Fermi energy is 1.6110 ev ! total energy = -137.43229733 ryd band energy sum = -21.72315387 ryd one-electron contribution = -629.26244394 ryd hartree contribution = 336.65494437 ryd xc contribution = -50.61702053 ryd ewald contribution = 205.79501753 ryd scf accuracy < -.00102707 ryd potential mean squ. error = 1.4E-15 ryd^2 correction for metals = -.00279475 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 -.00736206 .00184798 atom 2 type 3 force = .00108390 .00111919 -.00010196 atom 3 type 3 force = -.00108390 .00111919 -.00010196 atom 4 type 2 force = .00000000 .00736206 .00184798 atom 5 type 3 force = .00108390 -.00111919 -.00010196 atom 6 type 3 force = -.00108390 -.00111919 -.00010196 atom 7 type 1 force = .00000000 .00000000 .00735558 atom 8 type 1 force = .00000000 .00000000 .00558125 atom 9 type 1 force = .00000000 .00000000 .00553656 atom 10 type 1 force = .00000000 .00000000 .00616925 atom 11 type 1 force = .00011748 .00014805 .00648542 atom 12 type 1 force = .00011748 -.00014805 .00648542 atom 13 type 1 force = -.00011748 .00014805 .00648542 atom 14 type 1 force = -.00011748 -.00014805 .00648542 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = -.00011748 -.00014805 -.00648542 atom 20 type 1 force = -.00011748 .00014805 -.00648542 atom 21 type 1 force = .00011748 -.00014805 -.00648542 atom 22 type 1 force = .00011748 .00014805 -.00648542 atom 23 type 1 force = .00000000 .00000000 -.00735558 atom 24 type 1 force = .00000000 .00000000 -.00558125 atom 25 type 1 force = .00000000 .00000000 -.00553656 atom 26 type 1 force = .00000000 .00000000 -.00616925 atom 27 type 2 force = .00000000 -.00736206 -.00184798 atom 28 type 3 force = .00108390 .00111919 .00010196 atom 29 type 3 force = -.00108390 .00111919 .00010196 atom 30 type 2 force = .00000000 .00736206 -.00184798 atom 31 type 3 force = .00108390 -.00111919 .00010196 atom 32 type 3 force = -.00108390 -.00111919 .00010196 Total force = .158573 Total SCF correction = .000626 forces : 39.07s CPU ( 2 calls, 19.535 s avg) searching for next position (pslinmin)... Eold = -137.43161772 Etot = -137.43229733 DEold = -.02833138 DEtot = -.01962875 linmin: 3rd order interpolation Enext = -137.43291649 Xnext= 3.218404 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 2, scf threshold 9.88E-15 .500000000 .617233995 1.318647382 2 .661603548 .715919915 1.317928868 3 .338396452 .715919915 1.317928868 3 .500000000 .382766005 1.318647382 2 .661603548 .284080085 1.317928868 3 .338396452 .284080085 1.317928868 3 .500000000 .500000000 .710488852 1 .500000000 .000000000 .709949227 1 .000000000 .500000000 .709937096 1 .000000000 .000000000 .710131175 1 -.249954696 -.249948590 .355083516 1 -.249954696 .249948590 .355083516 1 .249954696 -.249948590 .355083516 1 .249954696 .249948590 .355083516 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .249954696 .249948590 -.355083516 1 .249954696 -.249948590 -.355083516 1 -.249954696 .249948590 -.355083516 1 -.249954696 -.249948590 -.355083516 1 -.500000000 -.500000000 -.710488852 1 -.500000000 .000000000 -.709949227 1 .000000000 -.500000000 -.709937096 1 .000000000 .000000000 -.710131175 1 .500000000 .617233995 -1.318647382 2 .661603548 .715919915 -1.317928868 3 .338396452 .715919915 -1.317928868 3 .500000000 .382766005 -1.318647382 2 .661603548 .284080085 -1.317928868 3 .338396452 .284080085 -1.317928868 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 2434.80 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 9.88E-07, avg # of iterations = 6.2 potential mean squ. error = 6.2E-11 ryd^2 total energy = -137.43263298 ryd total cpu time spent up to now is 2501.74 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 7.89E-09, avg # of iterations = 11.2 potential mean squ. error = 2.7E-09 ryd^2 total energy = -137.42545328 ryd total cpu time spent up to now is 2580.70 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 3.94E-09, avg # of iterations = 12.5 potential mean squ. error = 2.3E-11 ryd^2 total energy = -137.43285374 ryd total cpu time spent up to now is 2658.57 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.97E-09, avg # of iterations = 7.5 potential mean squ. error = 1.4E-12 ryd^2 total energy = -137.43293345 ryd total cpu time spent up to now is 2725.48 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 9.86E-10, avg # of iterations = 6.2 potential mean squ. error = 3.0E-13 ryd^2 total energy = -137.43293907 ryd total cpu time spent up to now is 2795.15 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.93E-10, avg # of iterations = 4.8 potential mean squ. error = 3.7E-14 ryd^2 total energy = -137.43293993 ryd total cpu time spent up to now is 2849.21 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.92E-10, avg # of iterations = 4.5 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.2378 -13.2378 -8.9443 -8.7074 -8.7073 -7.9774 -6.5289 -5.9506 -5.9506 -5.6316 -5.6298 -4.7526 -4.7167 -4.6833 -4.6779 -4.5498 -3.4783 -3.4752 -3.2479 -3.2376 -3.0077 -3.0072 -2.5216 -2.5174 -2.4301 -2.2628 -1.5933 -1.4971 -1.3462 -1.2634 -1.2006 -1.1171 -1.0351 -.8538 -.1202 -.0970 .0451 .5105 .7766 .7938 1.0386 1.1078 1.3954 1.4228 1.7953 2.0293 2.7551 2.8474 2.8528 2.9023 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.2274 -13.2274 -8.7802 -8.7801 -8.3868 -7.4228 -7.2785 -6.3200 -5.9801 -5.9227 -5.9208 -5.0868 -4.8839 -4.5885 -4.5832 -4.1409 -4.0372 -4.0085 -3.0960 -3.0843 -3.0575 -2.9614 -2.9469 -2.7050 -1.9931 -1.9138 -1.8201 -1.6405 -1.3888 -1.1537 -.9660 -.8188 -.7814 -.5911 -.3975 .1265 .2281 .3377 .4189 1.2592 1.3212 1.5263 1.5923 2.2803 2.2863 2.4383 2.7424 3.2096 3.3125 3.3142 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.2354 -13.2354 -8.7027 -8.7026 -8.3871 -7.4233 -7.2787 -6.3224 -6.0149 -5.9809 -5.9473 -5.0869 -4.8874 -4.7093 -4.6976 -4.1410 -4.0353 -4.0085 -3.0771 -3.0415 -3.0346 -2.9602 -2.9465 -2.7044 -1.9923 -1.9134 -1.8318 -1.6406 -1.3923 -1.1595 -.9667 -.8182 -.7935 -.5929 -.3673 .1267 .2322 .3490 .4179 1.2852 1.3307 1.5277 1.5772 2.2822 2.2849 2.4372 2.7398 3.2104 3.2749 3.3882 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.2251 -13.2250 -8.7741 -8.7741 -7.8318 -6.8708 -6.7284 -6.7267 -5.9558 -5.9544 -5.7734 -5.7670 -5.6319 -5.4289 -4.6824 -4.5755 -4.5754 -4.3436 -4.3344 -3.5015 -3.2677 -3.1246 -3.1152 -2.4470 -2.4093 -1.5380 -1.4457 -1.1826 -.8780 -.3335 -.3285 .0162 .1530 .1776 .6111 .6120 .8032 1.0231 1.0766 1.6518 1.7179 1.8625 1.9984 2.0025 2.2443 2.4257 2.5046 2.8250 3.1427 3.4348 the Fermi energy is 1.6119 ev ! total energy = -137.43294004 ryd band energy sum = -21.69011382 ryd one-electron contribution = -626.59744918 ryd hartree contribution = 335.32277220 ryd xc contribution = -50.59283786 ryd ewald contribution = 204.43758647 ryd scf accuracy < -.00161257 ryd potential mean squ. error = 1.8E-15 ryd^2 correction for metals = -.00301166 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 -.03279827 .00113583 atom 2 type 3 force = .00346222 .00315173 .00020533 atom 3 type 3 force = -.00346222 .00315173 .00020533 atom 4 type 2 force = .00000000 .03279827 .00113583 atom 5 type 3 force = .00346222 -.00315173 .00020533 atom 6 type 3 force = -.00346222 -.00315173 .00020533 atom 7 type 1 force = .00000000 .00000000 .00731484 atom 8 type 1 force = .00000000 .00000000 .00565408 atom 9 type 1 force = .00000000 .00000000 .00558921 atom 10 type 1 force = .00000000 .00000000 .00619614 atom 11 type 1 force = .00002660 .00005532 .00532103 atom 12 type 1 force = .00002660 -.00005532 .00532103 atom 13 type 1 force = -.00002660 .00005532 .00532103 atom 14 type 1 force = -.00002660 -.00005532 .00532103 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = -.00002660 -.00005532 -.00532103 atom 20 type 1 force = -.00002660 .00005532 -.00532103 atom 21 type 1 force = .00002660 -.00005532 -.00532103 atom 22 type 1 force = .00002660 .00005532 -.00532103 atom 23 type 1 force = .00000000 .00000000 -.00731484 atom 24 type 1 force = .00000000 .00000000 -.00565408 atom 25 type 1 force = .00000000 .00000000 -.00558921 atom 26 type 1 force = .00000000 .00000000 -.00619614 atom 27 type 2 force = .00000000 -.03279827 -.00113583 atom 28 type 3 force = .00346222 .00315173 -.00020533 atom 29 type 3 force = -.00346222 .00315173 -.00020533 atom 30 type 2 force = .00000000 .03279827 -.00113583 atom 31 type 3 force = .00346222 -.00315173 -.00020533 atom 32 type 3 force = -.00346222 -.00315173 -.00020533 Total force = .283023 Total SCF correction = .000882 forces : 59.16s CPU ( 3 calls, 19.720 s avg) ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 3, scf threshold 1.00E-13 .500000000 .616936224 1.320117235 2 .661940693 .716340333 1.317798848 3 .338059307 .716340333 1.317798848 3 .500000000 .383063776 1.320117235 2 .661940693 .283659667 1.317798848 3 .338059307 .283659667 1.317798848 3 .500000000 .500000000 .715783784 1 .500000000 .000000000 .713950878 1 .000000000 .500000000 .713907047 1 .000000000 .000000000 .714567179 1 -.249856877 -.249835191 .359966617 1 -.249856877 .249835191 .359966617 1 .249856877 -.249835191 .359966617 1 .249856877 .249835191 .359966617 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .249856877 .249835191 -.359966617 1 .249856877 -.249835191 -.359966617 1 -.249856877 .249835191 -.359966617 1 -.249856877 -.249835191 -.359966617 1 -.500000000 -.500000000 -.715783784 1 -.500000000 .000000000 -.713950878 1 .000000000 -.500000000 -.713907047 1 .000000000 .000000000 -.714567179 1 .500000000 .616936224 -1.320117235 2 .661940693 .716340333 -1.317798848 3 .338059307 .716340333 -1.317798848 3 .500000000 .383063776 -1.320117235 2 .661940693 .283659667 -1.317798848 3 .338059307 .283659667 -1.317798848 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 2936.58 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.00E-05, avg # of iterations = 5.0 potential mean squ. error = 9.0E-10 ryd^2 total energy = -137.43426390 ryd total cpu time spent up to now is 2995.87 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 3.00E-08, avg # of iterations = 13.2 potential mean squ. error = 3.8E-08 ryd^2 total energy = -137.33462849 ryd total cpu time spent up to now is 3087.12 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.50E-08, avg # of iterations = 13.2 potential mean squ. error = 1.3E-10 ryd^2 total energy = -137.43678916 ryd total cpu time spent up to now is 3174.83 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 7.50E-09, avg # of iterations = 6.5 potential mean squ. error = 8.5E-12 ryd^2 total energy = -137.43717456 ryd total cpu time spent up to now is 3240.97 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.92E-09, avg # of iterations = 5.2 potential mean squ. error = 8.1E-13 ryd^2 total energy = -137.43721568 ryd total cpu time spent up to now is 3308.30 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 8.98E-10, avg # of iterations = 6.0 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.2520 -13.2520 -8.8755 -8.6846 -8.6845 -7.9658 -6.5226 -5.9350 -5.9349 -5.5614 -5.5610 -4.7717 -4.7377 -4.6699 -4.6673 -4.5424 -3.4091 -3.4076 -3.2394 -3.2289 -2.9767 -2.9762 -2.5087 -2.5069 -2.3598 -2.2895 -1.6096 -1.4842 -1.3344 -1.2776 -1.1994 -1.1094 -1.0370 -.7813 -.1182 -.1081 .0576 .5764 .7868 .8033 1.0105 1.0817 1.4039 1.4409 1.8054 2.1038 2.7340 2.8022 2.8264 2.8998 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.2417 -13.2416 -8.7580 -8.7580 -8.3179 -7.4111 -7.2093 -6.3081 -5.9734 -5.9068 -5.9051 -5.0172 -4.8772 -4.6093 -4.6033 -4.1287 -4.0278 -3.9384 -3.0744 -3.0550 -3.0378 -2.9516 -2.8782 -2.6961 -1.9814 -1.8662 -1.8253 -1.6329 -1.4125 -1.1770 -.9534 -.7708 -.7497 -.5840 -.4185 .1388 .2336 .3225 .4269 1.2462 1.3233 1.5322 1.5658 2.2986 2.3503 2.4668 2.7576 3.2207 3.2585 3.2936 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.2496 -13.2496 -8.6798 -8.6797 -8.3182 -7.4117 -7.2096 -6.3108 -6.0051 -5.9655 -5.9355 -5.0172 -4.8822 -4.7304 -4.7165 -4.1288 -4.0258 -3.9384 -3.0627 -3.0114 -3.0079 -2.9493 -2.8777 -2.6956 -1.9804 -1.8723 -1.8302 -1.6328 -1.4164 -1.1830 -.9542 -.7824 -.7488 -.5853 -.3891 .1390 .2408 .3309 .4259 1.2847 1.3205 1.5335 1.5506 2.2971 2.3526 2.4649 2.7556 3.2209 3.2561 3.3278 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.2393 -13.2393 -8.7518 -8.7518 -7.7628 -6.8591 -6.6584 -6.6582 -5.9407 -5.9389 -5.7601 -5.7560 -5.5624 -5.4222 -4.6704 -4.5957 -4.5956 -4.3364 -4.3275 -3.4924 -3.2600 -3.0963 -3.0869 -2.4401 -2.3983 -1.5667 -1.4520 -1.1872 -.9017 -.2674 -.2567 -.0045 .1312 .2505 .6226 .6253 .7812 1.0148 1.0891 1.6962 1.7042 1.8420 2.0055 2.0083 2.3178 2.4342 2.5146 2.8059 3.1551 3.4542 the Fermi energy is 1.6108 ev ! total energy = -137.43721795 ryd band energy sum = -21.60108592 ryd one-electron contribution = -618.26772868 ryd hartree contribution = 331.16867369 ryd xc contribution = -50.53432830 ryd ewald contribution = 200.19984512 ryd scf accuracy < .00705800 ryd potential mean squ. error = 2.6E-14 ryd^2 correction for metals = -.00367978 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 -.02056486 -.00100692 atom 2 type 3 force = -.00052615 .00026219 .00122651 atom 3 type 3 force = .00052615 .00026219 .00122651 atom 4 type 2 force = .00000000 .02056486 -.00100692 atom 5 type 3 force = -.00052615 -.00026219 .00122651 atom 6 type 3 force = .00052615 -.00026219 .00122651 atom 7 type 1 force = .00000000 .00000000 .00660293 atom 8 type 1 force = .00000000 .00000000 .00570756 atom 9 type 1 force = .00000000 .00000000 .00568240 atom 10 type 1 force = .00000000 .00000000 .00619140 atom 11 type 1 force = -.00026764 -.00024420 .00158242 atom 12 type 1 force = -.00026764 .00024420 .00158242 atom 13 type 1 force = .00026764 -.00024420 .00158242 atom 14 type 1 force = .00026764 .00024420 .00158242 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = .00026764 .00024420 -.00158242 atom 20 type 1 force = .00026764 -.00024420 -.00158242 atom 21 type 1 force = -.00026764 .00024420 -.00158242 atom 22 type 1 force = -.00026764 -.00024420 -.00158242 atom 23 type 1 force = .00000000 .00000000 -.00660293 atom 24 type 1 force = .00000000 .00000000 -.00570756 atom 25 type 1 force = .00000000 .00000000 -.00568240 atom 26 type 1 force = .00000000 .00000000 -.00619140 atom 27 type 2 force = .00000000 -.02056486 .00100692 atom 28 type 3 force = -.00052615 .00026219 -.00122651 atom 29 type 3 force = .00052615 .00026219 -.00122651 atom 30 type 2 force = .00000000 .02056486 .00100692 atom 31 type 3 force = -.00052615 -.00026219 -.00122651 atom 32 type 3 force = .00052615 -.00026219 -.00122651 Total force = .167529 Total SCF correction = .003408 forces : 78.77s CPU ( 4 calls, 19.692 s avg) searching for next position (pslinmin)... Eold = -137.43294004 Etot = -137.43721795 DEold = -.02606402 DEtot = -.01545521 linmin: 3rd order interpolation Enext = -137.43957681 Xnext= 2.486284 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 4, scf threshold 1.00E-13 .500000000 .616493652 1.322301853 2 .662441784 .716965194 1.317605603 3 .337558216 .716965194 1.317605603 3 .500000000 .383506348 1.322301853 2 .662441784 .283034806 1.317605603 3 .337558216 .283034806 1.317605603 3 .500000000 .500000000 .723653558 1 .500000000 .000000000 .719898467 1 .000000000 .500000000 .719807520 1 .000000000 .000000000 .721160340 1 -.249711492 -.249666648 .367224292 1 -.249711492 .249666648 .367224292 1 .249711492 -.249666648 .367224292 1 .249711492 .249666648 .367224292 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .249711492 .249666648 -.367224292 1 .249711492 -.249666648 -.367224292 1 -.249711492 .249666648 -.367224292 1 -.249711492 -.249666648 -.367224292 1 -.500000000 -.500000000 -.723653558 1 -.500000000 .000000000 -.719898467 1 .000000000 -.500000000 -.719807520 1 .000000000 .000000000 -.721160340 1 .500000000 .616493652 -1.322301853 2 .662441784 .716965194 -1.317605603 3 .337558216 .716965194 -1.317605603 3 .500000000 .383506348 -1.322301853 2 .662441784 .283034806 -1.317605603 3 .337558216 .283034806 -1.317605603 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 3409.80 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.00E-05, avg # of iterations = 6.0 potential mean squ. error = 2.2E-09 ryd^2 total energy = -137.43268091 ryd total cpu time spent up to now is 3473.72 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.66E-08, avg # of iterations = 13.2 potential mean squ. error = 9.4E-08 ryd^2 total energy = -137.18957963 ryd total cpu time spent up to now is 3565.94 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.33E-08, avg # of iterations = 13.5 potential mean squ. error = 2.7E-10 ryd^2 total energy = -137.43872861 ryd total cpu time spent up to now is 3654.20 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.17E-08, avg # of iterations = 6.5 potential mean squ. error = 1.8E-11 ryd^2 total energy = -137.43955916 ryd total cpu time spent up to now is 3723.66 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.24E-09, avg # of iterations = 5.2 potential mean squ. error = 1.4E-12 ryd^2 total energy = -137.43964643 ryd total cpu time spent up to now is 3789.45 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.18E-09, avg # of iterations = 6.0 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.2747 -13.2747 -8.7766 -8.6502 -8.6501 -7.9482 -6.5106 -5.9115 -5.9114 -5.4627 -5.4602 -4.8018 -4.7695 -4.6524 -4.6483 -4.5277 -3.3154 -3.3147 -3.2190 -3.2092 -2.9299 -2.9294 -2.4911 -2.4891 -2.3317 -2.2564 -1.6359 -1.4646 -1.3142 -1.3022 -1.1934 -1.0951 -1.0347 -.6781 -.1473 -.0890 .0761 .6728 .8050 .8203 .9691 1.0433 1.4197 1.4677 1.8230 2.2107 2.7050 2.7168 2.7979 2.9085 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.2646 -13.2646 -8.7248 -8.7247 -8.2188 -7.3934 -7.1100 -6.2901 -5.9610 -5.8828 -5.8812 -4.9173 -4.8647 -4.6408 -4.6336 -4.1102 -4.0110 -3.8380 -3.0484 -3.0107 -3.0023 -2.9336 -2.7845 -2.6758 -1.9639 -1.8963 -1.7385 -1.6168 -1.4481 -1.2126 -.9344 -.7521 -.6549 -.5701 -.4460 .1574 .2342 .3127 .4418 1.2228 1.3361 1.5257 1.5447 2.3193 2.4472 2.4794 2.8081 3.1753 3.2351 3.2697 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.2723 -13.2723 -8.6454 -8.6453 -8.2191 -7.3941 -7.1103 -6.2931 -5.9899 -5.9423 -5.9156 -4.9173 -4.8734 -4.7625 -4.7433 -4.1105 -4.0087 -3.8379 -3.0426 -2.9687 -2.9660 -2.9277 -2.7836 -2.6757 -1.9627 -1.9066 -1.7387 -1.6165 -1.4526 -1.2188 -.9352 -.7631 -.6519 -.5710 -.4188 .1574 .2490 .3137 .4407 1.2667 1.3281 1.5106 1.5458 2.3178 2.4514 2.4754 2.8069 3.2212 3.2384 3.2455 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.2623 -13.2623 -8.7184 -8.7184 -7.6636 -6.8414 -6.5602 -6.5575 -5.9180 -5.9157 -5.7407 -5.7385 -5.4625 -5.4097 -4.6529 -4.6261 -4.6256 -4.3230 -4.3144 -3.4761 -3.2461 -3.0536 -3.0442 -2.4274 -2.3791 -1.6102 -1.4640 -1.1887 -.9372 -.1836 -.1553 -.0251 .1002 .3543 .6385 .6465 .7511 .9951 1.1076 1.6664 1.7864 1.8144 2.0186 2.0202 2.4218 2.4502 2.5293 2.7812 3.1733 3.4562 the Fermi energy is 1.6110 ev ! total energy = -137.43965040 ryd band energy sum = -21.46915540 ryd one-electron contribution = -606.03668436 ryd hartree contribution = 325.06522245 ryd xc contribution = -50.44865745 ryd ewald contribution = 193.98471467 ryd scf accuracy < .01078250 ryd potential mean squ. error = 6.3E-14 ryd^2 correction for metals = -.00424570 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 -.00213020 -.00445410 atom 2 type 3 force = -.00633241 -.00400675 .00287126 atom 3 type 3 force = .00633241 -.00400675 .00287126 atom 4 type 2 force = .00000000 .00213020 -.00445410 atom 5 type 3 force = -.00633241 .00400675 .00287126 atom 6 type 3 force = .00633241 .00400675 .00287126 atom 7 type 1 force = .00000000 .00000000 .00551860 atom 8 type 1 force = .00000000 .00000000 .00576442 atom 9 type 1 force = .00000000 .00000000 .00580142 atom 10 type 1 force = .00000000 .00000000 .00617765 atom 11 type 1 force = -.00071557 -.00069611 -.00353517 atom 12 type 1 force = -.00071557 .00069611 -.00353517 atom 13 type 1 force = .00071557 -.00069611 -.00353517 atom 14 type 1 force = .00071557 .00069611 -.00353517 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = .00071557 .00069611 .00353517 atom 20 type 1 force = .00071557 -.00069611 .00353517 atom 21 type 1 force = -.00071557 .00069611 .00353517 atom 22 type 1 force = -.00071557 -.00069611 .00353517 atom 23 type 1 force = .00000000 .00000000 -.00551860 atom 24 type 1 force = .00000000 .00000000 -.00576442 atom 25 type 1 force = .00000000 .00000000 -.00580142 atom 26 type 1 force = .00000000 .00000000 -.00617765 atom 27 type 2 force = .00000000 -.00213020 .00445410 atom 28 type 3 force = -.00633241 -.00400675 -.00287126 atom 29 type 3 force = .00633241 -.00400675 -.00287126 atom 30 type 2 force = .00000000 .00213020 .00445410 atom 31 type 3 force = -.00633241 .00400675 -.00287126 atom 32 type 3 force = .00633241 .00400675 -.00287126 Total force = .218119 Total SCF correction = .004399 forces : 98.24s CPU ( 5 calls, 19.648 s avg) ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 5, scf threshold 8.38E-15 .500000000 .616293120 1.322225990 2 .661919020 .716680958 1.317844244 3 .338080980 .716680958 1.317844244 3 .500000000 .383706880 1.322225990 2 .661919020 .283319042 1.317844244 3 .338080980 .283319042 1.317844244 3 .500000000 .500000000 .725397976 1 .500000000 .000000000 .721366174 1 .000000000 .500000000 .721271404 1 .000000000 .000000000 .722767562 1 -.249755789 -.249705524 .368026331 1 -.249755789 .249705524 .368026331 1 .249755789 -.249705524 .368026331 1 .249755789 .249705524 .368026331 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .249755789 .249705524 -.368026331 1 .249755789 -.249705524 -.368026331 1 -.249755789 .249705524 -.368026331 1 -.249755789 -.249705524 -.368026331 1 -.500000000 -.500000000 -.725397976 1 -.500000000 .000000000 -.721366174 1 .000000000 -.500000000 -.721271404 1 .000000000 .000000000 -.722767562 1 .500000000 .616293120 -1.322225990 2 .661919020 .716680958 -1.317844244 3 .338080980 .716680958 -1.317844244 3 .500000000 .383706880 -1.322225990 2 .661919020 .283319042 -1.317844244 3 .338080980 .283319042 -1.317844244 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 3893.85 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 8.38E-07, avg # of iterations = 4.8 potential mean squ. error = 1.1E-10 ryd^2 total energy = -137.44021625 ryd total cpu time spent up to now is 3952.32 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.05E-08, avg # of iterations = 12.8 potential mean squ. error = 3.1E-09 ryd^2 total energy = -137.43281620 ryd total cpu time spent up to now is 4038.70 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 5.25E-09, avg # of iterations = 12.2 potential mean squ. error = 2.5E-11 ryd^2 total energy = -137.44044026 ryd total cpu time spent up to now is 4118.51 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.62E-09, avg # of iterations = 6.5 potential mean squ. error = 1.5E-11 ryd^2 total energy = -137.44047432 ryd total cpu time spent up to now is 4188.03 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.31E-09, avg # of iterations = 7.5 potential mean squ. error = 8.5E-13 ryd^2 total energy = -137.44052742 ryd total cpu time spent up to now is 4254.02 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 6.56E-10, avg # of iterations = 4.8 potential mean squ. error = 2.3E-13 ryd^2 total energy = -137.44052965 ryd total cpu time spent up to now is 4314.22 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 3.28E-10, avg # of iterations = 4.8 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.2969 -13.2969 -8.7559 -8.6711 -8.6709 -7.9315 -6.5008 -5.9295 -5.9294 -5.4420 -5.4391 -4.8187 -4.7890 -4.6359 -4.6314 -4.5272 -3.2968 -3.2959 -3.2067 -3.1970 -2.9349 -2.9344 -2.4744 -2.4721 -2.3399 -2.2355 -1.6459 -1.4480 -1.3105 -1.3091 -1.1929 -1.0847 -1.0274 -.6565 -.1502 -.0779 .0940 .6935 .8088 .8242 .9640 1.0391 1.4308 1.4851 1.8261 2.2321 2.7010 2.7038 2.7948 2.9178 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.2869 -13.2868 -8.7450 -8.7450 -8.1980 -7.3766 -7.0891 -6.2733 -5.9521 -5.9012 -5.8986 -4.8963 -4.8549 -4.6614 -4.6541 -4.0933 -4.0084 -3.8169 -3.0382 -3.0150 -2.9997 -2.9310 -2.7657 -2.6637 -1.9472 -1.9065 -1.7190 -1.6057 -1.4608 -1.2203 -.9171 -.7486 -.6365 -.5599 -.4473 .1743 .2338 .3139 .4524 1.2200 1.3397 1.5215 1.5549 2.3232 2.4643 2.4839 2.8233 3.1636 3.2474 3.2717 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.2945 -13.2945 -8.6663 -8.6662 -8.1983 -7.3774 -7.0895 -6.2767 -5.9939 -5.9596 -5.9195 -4.8964 -4.8667 -4.7821 -4.7597 -4.0936 -4.0061 -3.8169 -3.0273 -2.9706 -2.9706 -2.9262 -2.7647 -2.6637 -1.9458 -1.9172 -1.7190 -1.6053 -1.4653 -1.2264 -.9179 -.7596 -.6326 -.5607 -.4209 .1741 .2499 .3139 .4513 1.2644 1.3315 1.5059 1.5563 2.3216 2.4691 2.4792 2.8222 3.2199 3.2255 3.2608 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.2846 -13.2846 -8.7387 -8.7387 -7.6428 -6.8246 -6.5396 -6.5365 -5.9353 -5.9336 -5.7243 -5.7220 -5.4416 -5.3999 -4.6495 -4.6468 -4.6329 -4.3133 -4.3043 -3.4734 -3.2367 -3.0575 -3.0474 -2.4262 -2.3755 -1.6242 -1.4705 -1.1901 -.9424 -.1693 -.1348 -.0234 .0976 .3759 .6554 .6639 .7480 .9926 1.1255 1.6625 1.8048 1.8120 2.0293 2.0308 2.4434 2.4616 2.5415 2.7821 3.1913 3.4566 the Fermi energy is 1.6158 ev ! total energy = -137.44053016 ryd band energy sum = -21.44909301 ryd one-electron contribution = -604.25732561 ryd hartree contribution = 324.18216053 ryd xc contribution = -50.45367546 ryd ewald contribution = 193.09265476 ryd scf accuracy < -.00255543 ryd potential mean squ. error = 5.6E-15 ryd^2 correction for metals = -.00434438 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 -.00034887 -.00386585 atom 2 type 3 force = -.00301519 -.00226596 .00260768 atom 3 type 3 force = .00301519 -.00226596 .00260768 atom 4 type 2 force = .00000000 .00034887 -.00386585 atom 5 type 3 force = -.00301519 .00226596 .00260768 atom 6 type 3 force = .00301519 .00226596 .00260768 atom 7 type 1 force = .00000000 .00000000 .00493015 atom 8 type 1 force = .00000000 .00000000 .00522493 atom 9 type 1 force = .00000000 .00000000 .00526264 atom 10 type 1 force = .00000000 .00000000 .00554853 atom 11 type 1 force = -.00067317 -.00065316 -.00360038 atom 12 type 1 force = -.00067317 .00065316 -.00360038 atom 13 type 1 force = .00067317 -.00065316 -.00360038 atom 14 type 1 force = .00067317 .00065316 -.00360038 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = .00067317 .00065316 .00360038 atom 20 type 1 force = .00067317 -.00065316 .00360038 atom 21 type 1 force = -.00067317 .00065316 .00360038 atom 22 type 1 force = -.00067317 -.00065316 .00360038 atom 23 type 1 force = .00000000 .00000000 -.00493015 atom 24 type 1 force = .00000000 .00000000 -.00522493 atom 25 type 1 force = .00000000 .00000000 -.00526264 atom 26 type 1 force = .00000000 .00000000 -.00554853 atom 27 type 2 force = .00000000 -.00034887 .00386585 atom 28 type 3 force = -.00301519 -.00226596 -.00260768 atom 29 type 3 force = .00301519 -.00226596 -.00260768 atom 30 type 2 force = .00000000 .00034887 .00386585 atom 31 type 3 force = -.00301519 .00226596 -.00260768 atom 32 type 3 force = .00301519 .00226596 -.00260768 Total force = .161316 Total SCF correction = .000860 forces : 117.14s CPU ( 6 calls, 19.523 s avg) searching for next position (pslinmin)... Eold = -137.43965040 Etot = -137.44053016 DEold = -.01778630 DEtot = -.01261097 linmin: 3rd order interpolation Enext = -137.44143316 Xnext= 3.484945 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 6, scf threshold 5.18E-14 .500000000 .615794812 1.322037475 2 .660619979 .715974649 1.318437256 3 .339380021 .715974649 1.318437256 3 .500000000 .384205188 1.322037475 2 .660619979 .284025351 1.318437256 3 .339380021 .284025351 1.318437256 3 .500000000 .500000000 .729732761 1 .500000000 .000000000 .725013346 1 .000000000 .500000000 .724909076 1 .000000000 .000000000 .726761419 1 -.249865864 -.249802130 .370019355 1 -.249865864 .249802130 .370019355 1 .249865864 -.249802130 .370019355 1 .249865864 .249802130 .370019355 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .249865864 .249802130 -.370019355 1 .249865864 -.249802130 -.370019355 1 -.249865864 .249802130 -.370019355 1 -.249865864 -.249802130 -.370019355 1 -.500000000 -.500000000 -.729732761 1 -.500000000 .000000000 -.725013346 1 .000000000 -.500000000 -.724909076 1 .000000000 .000000000 -.726761419 1 .500000000 .615794812 -1.322037475 2 .660619979 .715974649 -1.318437256 3 .339380021 .715974649 -1.318437256 3 .500000000 .384205188 -1.322037475 2 .660619979 .284025351 -1.318437256 3 .339380021 .284025351 -1.318437256 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 4398.18 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 5.18E-06, avg # of iterations = 4.8 potential mean squ. error = 3.2E-10 ryd^2 total energy = -137.44021975 ryd total cpu time spent up to now is 4457.23 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.78E-08, avg # of iterations = 13.0 potential mean squ. error = 7.7E-09 ryd^2 total energy = -137.42250499 ryd total cpu time spent up to now is 4550.55 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 8.89E-09, avg # of iterations = 12.0 potential mean squ. error = 1.3E-10 ryd^2 total energy = -137.44095576 ryd total cpu time spent up to now is 4632.39 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.45E-09, avg # of iterations = 9.2 potential mean squ. error = 6.2E-11 ryd^2 total energy = -137.44118995 ryd total cpu time spent up to now is 4708.46 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.22E-09, avg # of iterations = 9.5 potential mean squ. error = 4.7E-12 ryd^2 total energy = -137.44140051 ryd total cpu time spent up to now is 4781.20 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.11E-09, avg # of iterations = 6.5 potential mean squ. error = 1.1E-12 ryd^2 total energy = -137.44141474 ryd total cpu time spent up to now is 4850.11 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 5.56E-10, avg # of iterations = 5.8 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.3558 -13.3558 -8.7277 -8.7267 -8.7028 -7.8902 -6.4759 -5.9776 -5.9773 -5.3902 -5.3864 -4.8656 -4.8412 -4.5950 -4.5893 -4.5242 -3.2528 -3.2505 -3.1731 -3.1643 -2.9499 -2.9493 -2.4331 -2.4302 -2.3606 -2.1829 -1.6741 -1.4062 -1.3296 -1.3003 -1.1904 -1.0582 -1.0077 -.6026 -.1567 -.0499 .1382 .7452 .8193 .8349 .9523 1.0297 1.4594 1.5283 1.8348 2.2856 2.6723 2.6920 2.7882 2.9416 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.3459 -13.3459 -8.7992 -8.7992 -8.1460 -7.3352 -7.0371 -6.2318 -5.9550 -5.9501 -5.9195 -4.8441 -4.8301 -4.7162 -4.7086 -4.0516 -4.0008 -3.7644 -3.0356 -3.0281 -2.9736 -2.9232 -2.7206 -2.6312 -1.9332 -1.9061 -1.6707 -1.5765 -1.4948 -1.2403 -.8743 -.7388 -.5954 -.5327 -.4465 .2141 .2346 .3191 .4796 1.2140 1.3498 1.5115 1.5814 2.3338 2.4759 2.5237 2.8642 3.1354 3.2518 3.3038 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.3535 -13.3535 -8.7222 -8.7220 -8.1463 -7.3360 -7.0375 -6.2365 -6.0242 -6.0054 -5.9112 -4.8644 -4.8435 -4.8345 -4.7900 -4.0519 -3.9985 -3.7644 -3.0017 -2.9846 -2.9667 -2.9202 -2.7192 -2.6313 -1.9450 -1.9042 -1.6702 -1.5760 -1.4993 -1.2460 -.8751 -.7499 -.5871 -.5339 -.4233 .2136 .2531 .3173 .4785 1.2594 1.3411 1.4951 1.5831 2.3321 2.4745 2.5254 2.8634 3.1945 3.2131 3.3031 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.3437 -13.3437 -8.7932 -8.7931 -7.5908 -6.7832 -6.4880 -6.4839 -5.9824 -5.9815 -5.6839 -5.6801 -5.3894 -5.3749 -4.7035 -4.7020 -4.5928 -4.2885 -4.2786 -3.4661 -3.2133 -3.0695 -3.0573 -2.4229 -2.3654 -1.6612 -1.4894 -1.1921 -.9555 -.1426 -.0849 -.0092 .0931 .4299 .6974 .7057 .7427 .9866 1.1698 1.6540 1.8071 1.8516 2.0563 2.0580 2.4885 2.4994 2.5694 2.7880 3.2359 3.4541 the Fermi energy is 1.6290 ev ! total energy = -137.44141713 ryd band energy sum = -21.40342323 ryd one-electron contribution = -599.89294401 ryd hartree contribution = 322.03084724 ryd xc contribution = -50.46805449 ryd ewald contribution = 190.89318872 ryd scf accuracy < -.00514065 ryd potential mean squ. error = 2.5E-14 ryd^2 correction for metals = -.00445459 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 .00407133 -.00249084 atom 2 type 3 force = .00525703 .00205674 .00200024 atom 3 type 3 force = -.00525703 .00205674 .00200024 atom 4 type 2 force = .00000000 -.00407133 -.00249084 atom 5 type 3 force = .00525703 -.00205674 .00200024 atom 6 type 3 force = -.00525703 -.00205674 .00200024 atom 7 type 1 force = .00000000 .00000000 .00343219 atom 8 type 1 force = .00000000 .00000000 .00386392 atom 9 type 1 force = .00000000 .00000000 .00390069 atom 10 type 1 force = .00000000 .00000000 .00398049 atom 11 type 1 force = -.00054800 -.00053044 -.00378322 atom 12 type 1 force = -.00054800 .00053044 -.00378322 atom 13 type 1 force = .00054800 -.00053044 -.00378322 atom 14 type 1 force = .00054800 .00053044 -.00378322 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = .00054800 .00053044 .00378322 atom 20 type 1 force = .00054800 -.00053044 .00378322 atom 21 type 1 force = -.00054800 .00053044 .00378322 atom 22 type 1 force = -.00054800 -.00053044 .00378322 atom 23 type 1 force = .00000000 .00000000 -.00343219 atom 24 type 1 force = .00000000 .00000000 -.00386392 atom 25 type 1 force = .00000000 .00000000 -.00390069 atom 26 type 1 force = .00000000 .00000000 -.00398049 atom 27 type 2 force = .00000000 .00407133 .00249084 atom 28 type 3 force = .00525703 .00205674 -.00200024 atom 29 type 3 force = -.00525703 .00205674 -.00200024 atom 30 type 2 force = .00000000 -.00407133 .00249084 atom 31 type 3 force = .00525703 -.00205674 -.00200024 atom 32 type 3 force = -.00525703 -.00205674 -.00200024 Total force = .170009 Total SCF correction = .002014 forces : 136.47s CPU ( 7 calls, 19.496 s avg) ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 7, scf threshold 2.42E-15 .500000000 .615926057 1.321686865 2 .660833510 .716009240 1.318745174 3 .339166490 .716009240 1.318745174 3 .500000000 .384073943 1.321686865 2 .660833510 .283990760 1.318745174 3 .339166490 .283990760 1.318745174 3 .500000000 .500000000 .730602616 1 .500000000 .000000000 .725859931 1 .000000000 .500000000 .725758803 1 .000000000 .000000000 .727662380 1 -.249943378 -.249876233 .369788108 1 -.249943378 .249876233 .369788108 1 .249943378 -.249876233 .369788108 1 .249943378 .249876233 .369788108 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .249943378 .249876233 -.369788108 1 .249943378 -.249876233 -.369788108 1 -.249943378 .249876233 -.369788108 1 -.249943378 -.249876233 -.369788108 1 -.500000000 -.500000000 -.730602616 1 -.500000000 .000000000 -.725859931 1 .000000000 -.500000000 -.725758803 1 .000000000 .000000000 -.727662380 1 .500000000 .615926057 -1.321686865 2 .660833510 .716009240 -1.318745174 3 .339166490 .716009240 -1.318745174 3 .500000000 .384073943 -1.321686865 2 .660833510 .283990760 -1.318745174 3 .339166490 .283990760 -1.318745174 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 4945.94 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.42E-07, avg # of iterations = 4.8 potential mean squ. error = 1.7E-11 ryd^2 total energy = -137.44189001 ryd total cpu time spent up to now is 5007.64 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.15E-09, avg # of iterations = 12.2 potential mean squ. error = 3.5E-10 ryd^2 total energy = -137.44102454 ryd total cpu time spent up to now is 5087.00 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.08E-09, avg # of iterations = 8.8 potential mean squ. error = 6.7E-12 ryd^2 total energy = -137.44192739 ryd total cpu time spent up to now is 5156.65 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.04E-09, avg # of iterations = 6.8 potential mean squ. error = 2.4E-12 ryd^2 total energy = -137.44192174 ryd total cpu time spent up to now is 5226.85 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 5.19E-10, avg # of iterations = 7.0 potential mean squ. error = 1.8E-12 ryd^2 total energy = -137.44193711 ryd total cpu time spent up to now is 5295.29 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.60E-10, avg # of iterations = 4.5 potential mean squ. error = 2.9E-15 ryd^2 total energy = -137.44194283 ryd total cpu time spent up to now is 5356.25 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 5.41E-11, avg # of iterations = 2.8 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.3507 -13.3506 -8.7263 -8.7256 -8.6930 -7.8722 -6.4653 -5.9791 -5.9789 -5.3802 -5.3765 -4.8584 -4.8338 -4.5769 -4.5712 -4.5227 -3.2431 -3.2407 -3.1624 -3.1533 -2.9590 -2.9582 -2.4148 -2.4121 -2.3623 -2.1728 -1.6758 -1.3881 -1.3269 -1.2988 -1.1885 -1.0473 -.9969 -.5923 -.1533 -.0388 .1576 .7553 .8212 .8371 .9536 1.0317 1.4711 1.5458 1.8358 2.2952 2.6714 2.6917 2.7892 2.9517 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.3407 -13.3407 -8.7983 -8.7983 -8.1361 -7.3171 -7.0271 -6.2137 -5.9553 -5.9516 -5.9100 -4.8341 -4.8194 -4.7083 -4.7008 -4.0336 -3.9997 -3.7544 -3.0424 -3.0372 -2.9581 -2.9216 -2.7110 -2.6204 -1.9355 -1.8881 -1.6611 -1.5656 -1.4953 -1.2378 -.8557 -.7370 -.5876 -.5222 -.4414 .2263 .2419 .3215 .4907 1.2153 1.3520 1.5132 1.5928 2.3352 2.4782 2.5334 2.8731 3.1340 3.2530 3.3222 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.3483 -13.3483 -8.7210 -8.7209 -8.1363 -7.3180 -7.0275 -6.2189 -6.0247 -6.0066 -5.9018 -4.8553 -4.8335 -4.8271 -4.7810 -4.0339 -3.9972 -3.7544 -3.0036 -2.9937 -2.9559 -2.9191 -2.7095 -2.6205 -1.9475 -1.8860 -1.6606 -1.5651 -1.4997 -1.2436 -.8565 -.7484 -.5783 -.5232 -.4188 .2287 .2573 .3202 .4896 1.2616 1.3430 1.4964 1.5946 2.3335 2.4765 2.5354 2.8723 3.1937 3.2129 3.3221 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.3384 -13.3384 -8.7922 -8.7922 -7.5808 -6.7651 -6.4780 -6.4740 -5.9838 -5.9831 -5.6659 -5.6619 -5.3794 -5.3642 -4.6954 -4.6939 -4.5747 -4.2780 -4.2678 -3.4652 -3.2042 -3.0786 -3.0649 -2.4227 -2.3639 -1.6639 -1.4893 -1.1899 -.9531 -.1377 -.0756 -.0033 .0965 .4402 .7159 .7213 .7475 .9881 1.1892 1.6545 1.8095 1.8610 2.0677 2.0695 2.4999 2.5100 2.5805 2.7953 3.2555 3.4555 the Fermi energy is 1.6356 ev ! total energy = -137.44194284 ryd band energy sum = -21.36086123 ryd one-electron contribution = -599.20563297 ryd hartree contribution = 321.70081491 ryd xc contribution = -50.45227567 ryd ewald contribution = 190.51963910 ryd scf accuracy < .00009731 ryd potential mean squ. error = 9.1E-16 ryd^2 correction for metals = -.00448821 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 .00160927 -.00163052 atom 2 type 3 force = .00426655 .00174279 .00161091 atom 3 type 3 force = -.00426655 .00174279 .00161091 atom 4 type 2 force = .00000000 -.00160927 -.00163052 atom 5 type 3 force = .00426655 -.00174279 .00161091 atom 6 type 3 force = -.00426655 -.00174279 .00161091 atom 7 type 1 force = .00000000 .00000000 .00292471 atom 8 type 1 force = .00000000 .00000000 .00319607 atom 9 type 1 force = .00000000 .00000000 .00320786 atom 10 type 1 force = .00000000 .00000000 .00321955 atom 11 type 1 force = -.00041400 -.00039908 -.00308298 atom 12 type 1 force = -.00041400 .00039908 -.00308298 atom 13 type 1 force = .00041400 -.00039908 -.00308298 atom 14 type 1 force = .00041400 .00039908 -.00308298 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = .00041400 .00039908 .00308298 atom 20 type 1 force = .00041400 -.00039908 .00308298 atom 21 type 1 force = -.00041400 .00039908 .00308298 atom 22 type 1 force = -.00041400 -.00039908 .00308298 atom 23 type 1 force = .00000000 .00000000 -.00292471 atom 24 type 1 force = .00000000 .00000000 -.00319607 atom 25 type 1 force = .00000000 .00000000 -.00320786 atom 26 type 1 force = .00000000 .00000000 -.00321955 atom 27 type 2 force = .00000000 .00160927 .00163052 atom 28 type 3 force = .00426655 .00174279 -.00161091 atom 29 type 3 force = -.00426655 .00174279 -.00161091 atom 30 type 2 force = .00000000 -.00160927 .00163052 atom 31 type 3 force = .00426655 -.00174279 -.00161091 atom 32 type 3 force = -.00426655 -.00174279 -.00161091 Total force = .130186 Total SCF correction = .000139 forces : 156.10s CPU ( 8 calls, 19.512 s avg) searching for next position (pslinmin)... Eold = -137.44141713 Etot = -137.44194284 DEold = -.01885237 DEtot = -.01492830 linmin: 3rd order interpolation Enext = -137.44280080 Xnext= 4.657190 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 8, scf threshold 3.24E-14 .500000000 .616406047 1.320404620 2 .661614435 .716135750 1.319871291 3 .338385565 .716135750 1.319871291 3 .500000000 .383593953 1.320404620 2 .661614435 .283864250 1.319871291 3 .338385565 .283864250 1.319871291 3 .500000000 .500000000 .733783844 1 .500000000 .000000000 .728956053 1 .000000000 .500000000 .728866418 1 .000000000 .000000000 .730957362 1 -.250226863 -.250147242 .368942395 1 -.250226863 .250147242 .368942395 1 .250226863 -.250147242 .368942395 1 .250226863 .250147242 .368942395 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .250226863 .250147242 -.368942395 1 .250226863 -.250147242 -.368942395 1 -.250226863 .250147242 -.368942395 1 -.250226863 -.250147242 -.368942395 1 -.500000000 -.500000000 -.733783844 1 -.500000000 .000000000 -.728956053 1 .000000000 -.500000000 -.728866418 1 .000000000 .000000000 -.730957362 1 .500000000 .616406047 -1.320404620 2 .661614435 .716135750 -1.319871291 3 .338385565 .716135750 -1.319871291 3 .500000000 .383593953 -1.320404620 2 .661614435 .283864250 -1.319871291 3 .338385565 .283864250 -1.319871291 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 5436.19 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 3.24E-06, avg # of iterations = 5.2 potential mean squ. error = 9.7E-11 ryd^2 total energy = -137.44234264 ryd total cpu time spent up to now is 5498.90 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 9.84E-09, avg # of iterations = 15.0 potential mean squ. error = 1.3E-09 ryd^2 total energy = -137.43920872 ryd total cpu time spent up to now is 5590.50 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.92E-09, avg # of iterations = 12.8 potential mean squ. error = 2.8E-11 ryd^2 total energy = -137.44272993 ryd total cpu time spent up to now is 5662.51 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.46E-09, avg # of iterations = 12.5 potential mean squ. error = 1.9E-11 ryd^2 total energy = -137.44267254 ryd total cpu time spent up to now is 5742.70 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.23E-09, avg # of iterations = 11.2 potential mean squ. error = 2.1E-11 ryd^2 total energy = -137.44277770 ryd total cpu time spent up to now is 5820.42 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 6.15E-10, avg # of iterations = 7.0 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.3325 -13.3325 -8.7217 -8.7214 -8.6565 -7.8056 -6.4253 -5.9841 -5.9837 -5.3430 -5.3396 -4.8334 -4.8077 -4.5206 -4.5078 -4.5025 -3.2068 -3.2038 -3.1230 -3.1119 -2.9908 -2.9895 -2.3680 -2.3475 -2.3455 -2.1356 -1.6825 -1.3217 -1.3174 -1.2924 -1.1801 -1.0060 -.9559 -.5543 -.1395 .0031 .2288 .7928 .8292 .8463 .9591 1.0400 1.5151 1.6097 1.8414 2.3307 2.6691 2.6914 2.7941 2.9896 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.3224 -13.3224 -8.7947 -8.7946 -8.0992 -7.2505 -6.9902 -6.1470 -5.9583 -5.9561 -5.8715 -4.7970 -4.7789 -4.6803 -4.6731 -3.9961 -3.9654 -3.7173 -3.0714 -3.0691 -2.9229 -2.8878 -2.6747 -2.5800 -1.9437 -1.8222 -1.6251 -1.5250 -1.4976 -1.2283 -.7877 -.7288 -.5605 -.4834 -.4194 .2379 .3003 .3347 .5329 1.2212 1.3613 1.5204 1.6359 2.3417 2.4867 2.5695 2.9063 3.1297 3.2563 3.3914 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.3301 -13.3301 -8.7166 -8.7165 -8.0995 -7.2514 -6.9906 -6.1550 -6.0273 -6.0092 -5.8646 -4.8223 -4.8007 -4.7963 -4.7474 -3.9942 -3.9650 -3.7173 -3.0292 -3.0255 -2.9228 -2.8868 -2.6729 -2.5799 -1.9569 -1.8191 -1.6243 -1.5241 -1.5019 -1.2348 -.7882 -.7413 -.5469 -.4828 -.4003 .2542 .2974 .3387 .5316 1.2708 1.3513 1.5023 1.6380 2.3398 2.4845 2.5721 2.9056 3.1917 3.2123 3.3923 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.3201 -13.3201 -8.7885 -8.7885 -7.5439 -6.6985 -6.4409 -6.4372 -5.9885 -5.9881 -5.5994 -5.5952 -5.3425 -5.3239 -4.6672 -4.6656 -4.5079 -4.2385 -4.2269 -3.4611 -3.1755 -3.1105 -3.0853 -2.4213 -2.3572 -1.6741 -1.4890 -1.1812 -.9436 -.1222 -.0420 .0219 .1106 .4782 .7439 .7850 .8005 .9943 1.2606 1.6571 1.8198 1.8960 2.1110 2.1130 2.5425 2.5497 2.6166 2.8285 3.3275 3.4600 the Fermi energy is 1.6618 ev ! total energy = -137.44283980 ryd band energy sum = -21.20191909 ryd one-electron contribution = -596.68595944 ryd hartree contribution = 320.48450624 ryd xc contribution = -50.39433719 ryd ewald contribution = 189.15745897 ryd scf accuracy < .00366701 ryd potential mean squ. error = 1.8E-14 ryd^2 correction for metals = -.00450837 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 -.00706664 .00156886 atom 2 type 3 force = .00059041 .00054253 .00013278 atom 3 type 3 force = -.00059041 .00054253 .00013278 atom 4 type 2 force = .00000000 .00706664 .00156886 atom 5 type 3 force = .00059041 -.00054253 .00013278 atom 6 type 3 force = -.00059041 -.00054253 .00013278 atom 7 type 1 force = .00000000 .00000000 .00114466 atom 8 type 1 force = .00000000 .00000000 .00086467 atom 9 type 1 force = .00000000 .00000000 .00078101 atom 10 type 1 force = .00000000 .00000000 .00058817 atom 11 type 1 force = .00005980 .00006845 -.00062548 atom 12 type 1 force = .00005980 -.00006845 -.00062548 atom 13 type 1 force = -.00005980 .00006845 -.00062548 atom 14 type 1 force = -.00005980 -.00006845 -.00062548 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = -.00005980 -.00006845 .00062548 atom 20 type 1 force = -.00005980 .00006845 .00062548 atom 21 type 1 force = .00005980 -.00006845 .00062548 atom 22 type 1 force = .00005980 .00006845 .00062548 atom 23 type 1 force = .00000000 .00000000 -.00114466 atom 24 type 1 force = .00000000 .00000000 -.00086467 atom 25 type 1 force = .00000000 .00000000 -.00078101 atom 26 type 1 force = .00000000 .00000000 -.00058817 atom 27 type 2 force = .00000000 -.00706664 -.00156886 atom 28 type 3 force = .00059041 .00054253 -.00013278 atom 29 type 3 force = -.00059041 .00054253 -.00013278 atom 30 type 2 force = .00000000 .00706664 -.00156886 atom 31 type 3 force = .00059041 -.00054253 -.00013278 atom 32 type 3 force = -.00059041 -.00054253 -.00013278 Total force = .057455 Total SCF correction = .001697 forces : 176.11s CPU ( 9 calls, 19.568 s avg) ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 9, scf threshold 4.72E-15 .500000000 .616178564 1.320487498 2 .661625500 .716126892 1.320090693 3 .338374500 .716126892 1.320090693 3 .500000000 .383821436 1.320487498 2 .661625500 .283873108 1.320090693 3 .338374500 .283873108 1.320090693 3 .500000000 .500000000 .735240640 1 .500000000 .000000000 .730192721 1 .000000000 .500000000 .730093323 1 .000000000 .000000000 .732268859 1 -.250263397 -.250178567 .369395038 1 -.250263397 .250178567 .369395038 1 .250263397 -.250178567 .369395038 1 .250263397 .250178567 .369395038 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .250263397 .250178567 -.369395038 1 .250263397 -.250178567 -.369395038 1 -.250263397 .250178567 -.369395038 1 -.250263397 -.250178567 -.369395038 1 -.500000000 -.500000000 -.735240640 1 -.500000000 .000000000 -.730192721 1 .000000000 -.500000000 -.730093323 1 .000000000 .000000000 -.732268859 1 .500000000 .616178564 -1.320487498 2 .661625500 .716126892 -1.320090693 3 .338374500 .716126892 -1.320090693 3 .500000000 .383821436 -1.320487498 2 .661625500 .283873108 -1.320090693 3 .338374500 .283873108 -1.320090693 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 5927.12 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.72E-07, avg # of iterations = 5.0 potential mean squ. error = 3.3E-11 ryd^2 total energy = -137.44287092 ryd total cpu time spent up to now is 5988.24 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 5.74E-09, avg # of iterations = 14.5 potential mean squ. error = 6.6E-10 ryd^2 total energy = -137.44130667 ryd total cpu time spent up to now is 6069.97 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.87E-09, avg # of iterations = 11.0 potential mean squ. error = 2.7E-11 ryd^2 total energy = -137.44284961 ryd total cpu time spent up to now is 6142.42 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.43E-09, avg # of iterations = 9.8 potential mean squ. error = 1.0E-11 ryd^2 total energy = -137.44288282 ryd total cpu time spent up to now is 6212.81 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 7.17E-10, avg # of iterations = 6.5 potential mean squ. error = 1.5E-14 ryd^2 total energy = -137.44292899 ryd total cpu time spent up to now is 6277.31 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.23E-10, avg # of iterations = 5.8 potential mean squ. error = 4.9E-14 ryd^2 total energy = -137.44292894 ryd total cpu time spent up to now is 6334.73 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 6.15E-11, avg # of iterations = 5.2 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.3474 -13.3473 -8.7155 -8.7151 -8.6411 -7.7906 -6.4168 -5.9856 -5.9852 -5.3276 -5.3240 -4.8451 -4.8200 -4.5187 -4.4937 -4.4879 -3.1942 -3.1905 -3.1115 -3.1008 -2.9784 -2.9771 -2.3753 -2.3326 -2.3305 -2.1199 -1.6939 -1.3269 -1.3066 -1.2908 -1.1804 -.9970 -.9486 -.5383 -.1427 .0127 .2449 .8082 .8311 .8482 .9550 1.0364 1.5249 1.6249 1.8427 2.3464 2.6588 2.6881 2.7912 2.9976 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.3374 -13.3374 -8.7885 -8.7884 -8.0838 -7.2355 -6.9748 -6.1320 -5.9596 -5.9576 -5.8630 -4.7815 -4.7706 -4.6929 -4.6852 -3.9950 -3.9504 -3.7017 -3.0594 -3.0569 -2.9213 -2.8731 -2.6617 -2.5689 -1.9535 -1.8080 -1.6110 -1.5151 -1.5102 -1.2361 -.7724 -.7270 -.5534 -.4735 -.4159 .2363 .3120 .3386 .5422 1.2188 1.3630 1.5167 1.6452 2.3435 2.4853 2.5841 2.9195 3.1210 3.2536 3.4070 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.3450 -13.3450 -8.7104 -8.7103 -8.0840 -7.2364 -6.9752 -6.1411 -6.0284 -6.0096 -5.8564 -4.8280 -4.8131 -4.7810 -4.7450 -3.9930 -3.9501 -3.7017 -3.0173 -3.0133 -2.9211 -2.8721 -2.6598 -2.5688 -1.9670 -1.8044 -1.6101 -1.5148 -1.5142 -1.2424 -.7730 -.7395 -.5367 -.4735 -.3992 .2537 .3063 .3443 .5409 1.2685 1.3529 1.4984 1.6474 2.3415 2.4829 2.5871 2.9189 3.1818 3.2095 3.4081 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.3351 -13.3351 -8.7822 -8.7822 -7.5284 -6.6835 -6.4256 -6.4217 -5.9900 -5.9896 -5.5845 -5.5799 -5.3270 -5.3153 -4.6798 -4.6781 -4.4927 -4.2299 -4.2181 -3.4602 -3.1664 -3.0988 -3.0737 -2.4218 -2.3555 -1.6877 -1.4976 -1.1832 -.9490 -.1207 -.0291 .0318 .1099 .4942 .7420 .8003 .8152 .9913 1.2768 1.6541 1.8177 1.9102 2.1204 2.1225 2.5536 2.5645 2.6222 2.8352 3.3437 3.4572 the Fermi energy is 1.6664 ev ! total energy = -137.44292904 ryd band energy sum = -21.17022616 ryd one-electron contribution = -595.07998550 ryd hartree contribution = 319.68812707 ryd xc contribution = -50.38402408 ryd ewald contribution = 188.33739548 ryd scf accuracy < -.00143775 ryd potential mean squ. error = 1.9E-15 ryd^2 correction for metals = -.00444201 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 -.00046379 .00177355 atom 2 type 3 force = -.00003391 .00001749 .00005830 atom 3 type 3 force = .00003391 .00001749 .00005830 atom 4 type 2 force = .00000000 .00046379 .00177355 atom 5 type 3 force = -.00003391 -.00001749 .00005830 atom 6 type 3 force = .00003391 -.00001749 .00005830 atom 7 type 1 force = .00000000 .00000000 .00059536 atom 8 type 1 force = .00000000 .00000000 .00033958 atom 9 type 1 force = .00000000 .00000000 .00025659 atom 10 type 1 force = .00000000 .00000000 .00003781 atom 11 type 1 force = .00009835 .00010303 -.00051504 atom 12 type 1 force = .00009835 -.00010303 -.00051504 atom 13 type 1 force = -.00009835 .00010303 -.00051504 atom 14 type 1 force = -.00009835 -.00010303 -.00051504 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = -.00009835 -.00010303 .00051504 atom 20 type 1 force = -.00009835 .00010303 .00051504 atom 21 type 1 force = .00009835 -.00010303 .00051504 atom 22 type 1 force = .00009835 .00010303 .00051504 atom 23 type 1 force = .00000000 .00000000 -.00059536 atom 24 type 1 force = .00000000 .00000000 -.00033958 atom 25 type 1 force = .00000000 .00000000 -.00025659 atom 26 type 1 force = .00000000 .00000000 -.00003781 atom 27 type 2 force = .00000000 -.00046379 -.00177355 atom 28 type 3 force = -.00003391 .00001749 -.00005830 atom 29 type 3 force = .00003391 .00001749 -.00005830 atom 30 type 2 force = .00000000 .00046379 -.00177355 atom 31 type 3 force = -.00003391 -.00001749 -.00005830 atom 32 type 3 force = .00003391 -.00001749 -.00005830 Total force = .018017 Total SCF correction = .000565 forces : 196.43s CPU ( 10 calls, 19.643 s avg) searching for next position (pslinmin)... Eold = -137.44283980 Etot = -137.44292904 DEold = -.00345409 DEtot = -.00062232 linmin: 3rd order interpolation Enext = -137.44293189 Xnext= 1.210915 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 10, scf threshold 2.10E-16 .500000000 .616130584 1.320504978 2 .661627834 .716125024 1.320136968 3 .338372166 .716125024 1.320136968 3 .500000000 .383869416 1.320504978 2 .661627834 .283874976 1.320136968 3 .338372166 .283874976 1.320136968 3 .500000000 .500000000 .735547900 1 .500000000 .000000000 .730453553 1 .000000000 .500000000 .730352095 1 .000000000 .000000000 .732545473 1 -.250271103 -.250185174 .369490508 1 -.250271103 .250185174 .369490508 1 .250271103 -.250185174 .369490508 1 .250271103 .250185174 .369490508 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .250271103 .250185174 -.369490508 1 .250271103 -.250185174 -.369490508 1 -.250271103 .250185174 -.369490508 1 -.250271103 -.250185174 -.369490508 1 -.500000000 -.500000000 -.735547900 1 -.500000000 .000000000 -.730453553 1 .000000000 -.500000000 -.730352095 1 .000000000 .000000000 -.732545473 1 .500000000 .616130584 -1.320504978 2 .661627834 .716125024 -1.320136968 3 .338372166 .716125024 -1.320136968 3 .500000000 .383869416 -1.320504978 2 .661627834 .283874976 -1.320136968 3 .338372166 .283874976 -1.320136968 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 6426.30 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.10E-08, avg # of iterations = 4.8 potential mean squ. error = 1.0E-12 ryd^2 total energy = -137.44293136 ryd total cpu time spent up to now is 6484.25 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.00E-09, avg # of iterations = 7.2 potential mean squ. error = 7.5E-13 ryd^2 total energy = -137.44293072 ryd total cpu time spent up to now is 6548.85 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 5.00E-10, avg # of iterations = 6.2 potential mean squ. error = 4.4E-12 ryd^2 total energy = -137.44292154 ryd total cpu time spent up to now is 6611.74 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.50E-10, avg # of iterations = 5.8 potential mean squ. error = 1.4E-12 ryd^2 total energy = -137.44292645 ryd total cpu time spent up to now is 6679.52 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.25E-10, avg # of iterations = 6.2 potential mean squ. error = 5.2E-16 ryd^2 total energy = -137.44293198 ryd total cpu time spent up to now is 6746.70 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.28E-11, avg # of iterations = 3.8 potential mean squ. error = 1.5E-15 ryd^2 total energy = -137.44293198 ryd total cpu time spent up to now is 6789.95 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.14E-11, avg # of iterations = 5.0 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.3506 -13.3506 -8.7142 -8.7139 -8.6379 -7.7875 -6.4150 -5.9859 -5.9855 -5.3245 -5.3208 -4.8477 -4.8227 -4.5185 -4.4907 -4.4848 -3.1917 -3.1878 -3.1091 -3.0985 -2.9758 -2.9745 -2.3769 -2.3295 -2.3274 -2.1167 -1.6963 -1.3289 -1.3035 -1.2904 -1.1805 -.9951 -.9471 -.5350 -.1434 .0146 .2482 .8113 .8315 .8485 .9541 1.0356 1.5269 1.6280 1.8429 2.3497 2.6567 2.6873 2.7905 2.9992 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.3406 -13.3406 -8.7872 -8.7872 -8.0806 -7.2324 -6.9716 -6.1289 -5.9600 -5.9580 -5.8613 -4.7783 -4.7689 -4.6957 -4.6878 -3.9948 -3.9473 -3.6985 -3.0569 -3.0544 -2.9211 -2.8700 -2.6590 -2.5666 -1.9556 -1.8050 -1.6081 -1.5130 -1.5129 -1.2377 -.7693 -.7266 -.5522 -.4714 -.4151 .2360 .3140 .3398 .5441 1.2182 1.3634 1.5159 1.6471 2.3438 2.4849 2.5872 2.9223 3.1191 3.2530 3.4101 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.3482 -13.3482 -8.7092 -8.7090 -8.0808 -7.2333 -6.9720 -6.1383 -6.0287 -6.0097 -5.8547 -4.8295 -4.8158 -4.7778 -4.7443 -3.9928 -3.9470 -3.6985 -3.0148 -3.0108 -2.9208 -2.8690 -2.6571 -2.5665 -1.9692 -1.8014 -1.6071 -1.5176 -1.5121 -1.2440 -.7699 -.7391 -.5348 -.4716 -.3989 .2535 .3078 .3459 .5428 1.2680 1.3532 1.4976 1.6493 2.3418 2.4824 2.5902 2.9217 3.1797 3.2089 3.4113 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.3383 -13.3383 -8.7810 -8.7810 -7.5252 -6.6804 -6.4224 -6.4185 -5.9903 -5.9900 -5.5814 -5.5767 -5.3238 -5.3135 -4.6825 -4.6808 -4.4896 -4.2282 -4.2162 -3.4600 -3.1645 -3.0963 -3.0713 -2.4220 -2.3552 -1.6906 -1.4995 -1.1836 -.9502 -.1206 -.0265 .0339 .1099 .4975 .7415 .8034 .8183 .9907 1.2801 1.6534 1.8172 1.9131 2.1223 2.1244 2.5558 2.5677 2.6232 2.8366 3.3471 3.4565 the Fermi energy is 1.6673 ev ! total energy = -137.44293198 ryd band energy sum = -21.16390460 ryd one-electron contribution = -594.74402945 ryd hartree contribution = 319.52270425 ryd xc contribution = -50.38190009 ryd ewald contribution = 188.16471882 ryd scf accuracy < .00010451 ryd potential mean squ. error = 1.3E-17 ryd^2 correction for metals = -.00442550 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 .00093562 .00181887 atom 2 type 3 force = -.00016903 -.00009389 .00004188 atom 3 type 3 force = .00016903 -.00009389 .00004188 atom 4 type 2 force = .00000000 -.00093562 .00181887 atom 5 type 3 force = -.00016903 .00009389 .00004188 atom 6 type 3 force = .00016903 .00009389 .00004188 atom 7 type 1 force = .00000000 .00000000 .00047785 atom 8 type 1 force = .00000000 .00000000 .00022668 atom 9 type 1 force = .00000000 .00000000 .00014523 atom 10 type 1 force = .00000000 .00000000 -.00007852 atom 11 type 1 force = .00010514 .00011123 -.00049266 atom 12 type 1 force = .00010514 -.00011123 -.00049266 atom 13 type 1 force = -.00010514 .00011123 -.00049266 atom 14 type 1 force = -.00010514 -.00011123 -.00049266 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = -.00010514 -.00011123 .00049266 atom 20 type 1 force = -.00010514 .00011123 .00049266 atom 21 type 1 force = .00010514 -.00011123 .00049266 atom 22 type 1 force = .00010514 .00011123 .00049266 atom 23 type 1 force = .00000000 .00000000 -.00047785 atom 24 type 1 force = .00000000 .00000000 -.00022668 atom 25 type 1 force = .00000000 .00000000 -.00014523 atom 26 type 1 force = .00000000 .00000000 .00007852 atom 27 type 2 force = .00000000 .00093562 -.00181887 atom 28 type 3 force = -.00016903 -.00009389 -.00004188 atom 29 type 3 force = .00016903 -.00009389 -.00004188 atom 30 type 2 force = .00000000 -.00093562 -.00181887 atom 31 type 3 force = -.00016903 .00009389 -.00004188 atom 32 type 3 force = .00016903 .00009389 -.00004188 Total force = .020985 Total SCF correction = .000061 forces : 216.28s CPU ( 11 calls, 19.662 s avg) ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 11, scf threshold 1.11E-16 .500000000 .616136880 1.320680849 2 .661627819 .716124762 1.320155361 3 .338372181 .716124762 1.320155361 3 .500000000 .383863120 1.320680849 2 .661627819 .283875238 1.320155361 3 .338372181 .283875238 1.320155361 3 .500000000 .500000000 .735660187 1 .500000000 .000000000 .730534144 1 .000000000 .500000000 .730424208 1 .000000000 .000000000 .732598392 1 -.250263725 -.250176935 .369443453 1 -.250263725 .250176935 .369443453 1 .250263725 -.250176935 .369443453 1 .250263725 .250176935 .369443453 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .250263725 .250176935 -.369443453 1 .250263725 -.250176935 -.369443453 1 -.250263725 .250176935 -.369443453 1 -.250263725 -.250176935 -.369443453 1 -.500000000 -.500000000 -.735660187 1 -.500000000 .000000000 -.730534144 1 .000000000 -.500000000 -.730424208 1 .000000000 .000000000 -.732598392 1 .500000000 .616136880 -1.320680849 2 .661627819 .716124762 -1.320155361 3 .338372181 .716124762 -1.320155361 3 .500000000 .383863120 -1.320680849 2 .661627819 .283875238 -1.320155361 3 .338372181 .283875238 -1.320155361 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 6873.98 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.11E-08, avg # of iterations = 4.0 potential mean squ. error = 4.9E-13 ryd^2 total energy = -137.44294771 ryd total cpu time spent up to now is 6931.33 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 7.03E-10, avg # of iterations = 6.0 potential mean squ. error = 7.3E-13 ryd^2 total energy = -137.44294623 ryd total cpu time spent up to now is 6999.50 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 3.52E-10, avg # of iterations = 6.0 potential mean squ. error = 2.3E-12 ryd^2 total energy = -137.44294335 ryd total cpu time spent up to now is 7060.60 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.76E-10, avg # of iterations = 6.8 potential mean squ. error = 2.8E-13 ryd^2 total energy = -137.44294777 ryd total cpu time spent up to now is 7125.08 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 8.79E-11, avg # of iterations = 7.2 potential mean squ. error = 1.4E-14 ryd^2 total energy = -137.44294878 ryd total cpu time spent up to now is 7193.36 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.40E-11, avg # of iterations = 4.2 potential mean squ. error = 1.6E-15 ryd^2 total energy = -137.44294884 ryd total cpu time spent up to now is 7244.67 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.20E-11, avg # of iterations = 5.5 potential mean squ. error = 1.1E-15 ryd^2 total energy = -137.44294884 ryd total cpu time spent up to now is 7281.82 secs iteration # 8 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.10E-11, avg # of iterations = 2.8 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.3500 -13.3500 -8.7142 -8.7138 -8.6386 -7.7870 -6.4153 -5.9857 -5.9853 -5.3251 -5.3214 -4.8474 -4.8222 -4.5195 -4.4902 -4.4842 -3.1921 -3.1883 -3.1095 -3.0988 -2.9759 -2.9747 -2.3774 -2.3289 -2.3268 -2.1173 -1.6960 -1.3289 -1.3029 -1.2917 -1.1814 -.9953 -.9473 -.5356 -.1448 .0145 .2489 .8107 .8302 .8472 .9530 1.0345 1.5269 1.6284 1.8417 2.3490 2.6552 2.6862 2.7893 2.9989 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.3400 -13.3400 -8.7872 -8.7871 -8.0812 -7.2318 -6.9722 -6.1283 -5.9598 -5.9578 -5.8615 -4.7790 -4.7691 -4.6952 -4.6872 -3.9960 -3.9467 -3.6991 -3.0571 -3.0546 -2.9223 -2.8695 -2.6595 -2.5669 -1.9557 -1.8045 -1.6087 -1.5133 -1.5123 -1.2381 -.7688 -.7278 -.5531 -.4717 -.4159 .2347 .3138 .3392 .5440 1.2170 1.3621 1.5148 1.6470 2.3426 2.4839 2.5865 2.9216 3.1178 3.2519 3.4108 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.3476 -13.3476 -8.7091 -8.7090 -8.0815 -7.2328 -6.9726 -6.1377 -6.0285 -6.0094 -5.8549 -4.8293 -4.8153 -4.7784 -4.7442 -3.9940 -3.9464 -3.6991 -3.0150 -3.0110 -2.9219 -2.8685 -2.6576 -2.5668 -1.9692 -1.8008 -1.6077 -1.5170 -1.5124 -1.2445 -.7693 -.7402 -.5356 -.4718 -.3999 .2523 .3073 .3454 .5427 1.2667 1.3520 1.4965 1.6492 2.3406 2.4814 2.5896 2.9211 3.1783 3.2078 3.4120 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.3377 -13.3377 -8.7810 -8.7809 -7.5259 -6.6798 -6.4230 -6.4191 -5.9901 -5.9898 -5.5809 -5.5762 -5.3245 -5.3137 -4.6820 -4.6802 -4.4890 -4.2283 -4.2164 -3.4612 -3.1647 -3.0965 -3.0714 -2.4231 -2.3565 -1.6901 -1.4996 -1.1844 -.9512 -.1216 -.0272 .0332 .1087 .4969 .7403 .8040 .8188 .9895 1.2808 1.6523 1.8159 1.9124 2.1222 2.1243 2.5556 2.5672 2.6227 2.8365 3.3478 3.4553 the Fermi energy is 1.6667 ev ! total energy = -137.44294884 ryd band energy sum = -21.16531651 ryd one-electron contribution = -594.55276243 ryd hartree contribution = 319.42579931 ryd xc contribution = -50.38096655 ryd ewald contribution = 188.06940621 ryd scf accuracy < .00020257 ryd potential mean squ. error = 5.9E-17 ryd^2 correction for metals = -.00442538 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 .00074708 .00159119 atom 2 type 3 force = -.00015178 -.00007770 .00014191 atom 3 type 3 force = .00015178 -.00007770 .00014191 atom 4 type 2 force = .00000000 -.00074708 .00159119 atom 5 type 3 force = -.00015178 .00007770 .00014191 atom 6 type 3 force = .00015178 .00007770 .00014191 atom 7 type 1 force = .00000000 .00000000 .00040096 atom 8 type 1 force = .00000000 .00000000 .00015867 atom 9 type 1 force = .00000000 .00000000 .00008256 atom 10 type 1 force = .00000000 .00000000 -.00012184 atom 11 type 1 force = .00008676 .00009323 -.00040828 atom 12 type 1 force = .00008676 -.00009323 -.00040828 atom 13 type 1 force = -.00008676 .00009323 -.00040828 atom 14 type 1 force = -.00008676 -.00009323 -.00040828 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = -.00008676 -.00009323 .00040828 atom 20 type 1 force = -.00008676 .00009323 .00040828 atom 21 type 1 force = .00008676 -.00009323 .00040828 atom 22 type 1 force = .00008676 .00009323 .00040828 atom 23 type 1 force = .00000000 .00000000 -.00040096 atom 24 type 1 force = .00000000 .00000000 -.00015867 atom 25 type 1 force = .00000000 .00000000 -.00008256 atom 26 type 1 force = .00000000 .00000000 .00012184 atom 27 type 2 force = .00000000 .00074708 -.00159119 atom 28 type 3 force = -.00015178 -.00007770 -.00014191 atom 29 type 3 force = .00015178 -.00007770 -.00014191 atom 30 type 2 force = .00000000 -.00074708 -.00159119 atom 31 type 3 force = -.00015178 .00007770 -.00014191 atom 32 type 3 force = .00015178 .00007770 -.00014191 Total force = .018558 Total SCF correction = .000130 forces : 235.34s CPU ( 12 calls, 19.612 s avg) searching for next position (pslinmin)... Eold = -137.44293198 Etot = -137.44294884 DEold = -.00372775 DEtot = -.00322148 linmin: 3rd order interpolation Enext = -137.44298968 Xnext= 5.925501 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 12, scf threshold 1.42E-15 .500000000 .616167891 1.321547104 2 .661627747 .716123470 1.320245955 3 .338372253 .716123470 1.320245955 3 .500000000 .383832109 1.321547104 2 .661627747 .283876530 1.320245955 3 .338372253 .283876530 1.320245955 3 .500000000 .500000000 .736213258 1 .500000000 .000000000 .730931092 1 .000000000 .500000000 .730779398 1 .000000000 .000000000 .732859044 1 -.250227386 -.250136351 .369211683 1 -.250227386 .250136351 .369211683 1 .250227386 -.250136351 .369211683 1 .250227386 .250136351 .369211683 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .250227386 .250136351 -.369211683 1 .250227386 -.250136351 -.369211683 1 -.250227386 .250136351 -.369211683 1 -.250227386 -.250136351 -.369211683 1 -.500000000 -.500000000 -.736213258 1 -.500000000 .000000000 -.730931092 1 .000000000 -.500000000 -.730779398 1 .000000000 .000000000 -.732859044 1 .500000000 .616167891 -1.321547104 2 .661627747 .716123470 -1.320245955 3 .338372253 .716123470 -1.320245955 3 .500000000 .383832109 -1.321547104 2 .661627747 .283876530 -1.320245955 3 .338372253 .283876530 -1.320245955 3 NEW-OLD atomic charge density approx. for the potential total cpu time spent up to now is 7360.92 secs iteration # 1 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.42E-07, avg # of iterations = 4.2 potential mean squ. error = 7.4E-12 ryd^2 total energy = -137.44296854 ryd total cpu time spent up to now is 7421.62 secs iteration # 2 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 2.73E-09, avg # of iterations = 9.0 potential mean squ. error = 1.3E-11 ryd^2 total energy = -137.44294094 ryd total cpu time spent up to now is 7493.00 secs iteration # 3 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.36E-09, avg # of iterations = 9.0 potential mean squ. error = 3.2E-11 ryd^2 total energy = -137.44292376 ryd total cpu time spent up to now is 7561.89 secs iteration # 4 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 6.82E-10, avg # of iterations = 12.2 potential mean squ. error = 1.3E-12 ryd^2 total energy = -137.44298973 ryd total cpu time spent up to now is 7632.44 secs iteration # 5 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 3.41E-10, avg # of iterations = 8.2 potential mean squ. error = 2.0E-13 ryd^2 total energy = -137.44299531 ryd total cpu time spent up to now is 7701.17 secs iteration # 6 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 1.71E-10, avg # of iterations = 7.5 potential mean squ. error = 1.7E-14 ryd^2 total energy = -137.44299602 ryd total cpu time spent up to now is 7771.24 secs iteration # 7 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 8.53E-11, avg # of iterations = 3.5 potential mean squ. error = 4.0E-15 ryd^2 total energy = -137.44299605 ryd total cpu time spent up to now is 7815.87 secs iteration # 8 ecut= 27.00 ryd beta= .50 Davidson diagonalization with overlap eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 eneter cegter 872532280 873172296 878977016 ethr = 4.26E-11, avg # of iterations = 2.8 k = .1250 .1250 -.1188 (12696 PWs) bands (ev): -13.3472 -13.3471 -8.7141 -8.7137 -8.6414 -7.7842 -6.4162 -5.9846 -5.9842 -5.3280 -5.3243 -4.8461 -4.8197 -4.5241 -4.4874 -4.4813 -3.1942 -3.1908 -3.1110 -3.1001 -2.9766 -2.9754 -2.3799 -2.3260 -2.3239 -2.1201 -1.6946 -1.3290 -1.3000 -1.2979 -1.1856 -.9961 -.9481 -.5385 -.1517 .0138 .2524 .8080 .8244 .8411 .9479 1.0291 1.5266 1.6306 1.8356 2.3458 2.6479 2.6809 2.7835 2.9977 k = .1250 .3750 -.1188 (12732 PWs) bands (ev): -13.3372 -13.3372 -8.7871 -8.7870 -8.0841 -7.2290 -6.9751 -6.1254 -5.9587 -5.9566 -5.8623 -4.7818 -4.7701 -4.6928 -4.6845 -4.0017 -3.9438 -3.7020 -3.0578 -3.0553 -2.9280 -2.8667 -2.6618 -2.5682 -1.9561 -1.8014 -1.6115 -1.5145 -1.5097 -1.2403 -.7662 -.7333 -.5570 -.4733 -.4196 .2286 .3122 .3373 .5433 1.2114 1.3558 1.5095 1.6466 2.3365 2.4791 2.5834 2.9186 3.1115 3.2466 3.4141 k = .3750 .1250 -.1188 (12732 PWs) bands (ev): -13.3448 -13.3448 -8.7090 -8.7089 -8.0843 -7.2299 -6.9755 -6.1350 -6.0275 -6.0082 -5.8557 -4.8282 -4.8130 -4.7813 -4.7435 -3.9997 -3.9435 -3.7020 -3.0158 -3.0117 -2.9274 -2.8658 -2.6600 -2.5681 -1.9693 -1.7979 -1.6104 -1.5145 -1.5135 -1.2469 -.7668 -.7456 -.5394 -.4729 -.4047 .2465 .3049 .3440 .5420 1.2604 1.3459 1.4914 1.6488 2.3344 2.4765 2.5865 2.9181 3.1716 3.2028 3.4154 k = .3750 .3750 -.1188 (12760 PWs) bands (ev): -13.3349 -13.3349 -8.7809 -8.7808 -7.5287 -6.6770 -6.4259 -6.4219 -5.9889 -5.9887 -5.5781 -5.5732 -5.3273 -5.3146 -4.6795 -4.6777 -4.4861 -4.2290 -4.2173 -3.4670 -3.1655 -3.0972 -3.0721 -2.4281 -2.3627 -1.6876 -1.5000 -1.1881 -.9562 -.1267 -.0307 .0297 .1031 .4941 .7347 .8070 .8213 .9838 1.2843 1.6470 1.8097 1.9094 2.1218 2.1239 2.5549 2.5648 2.6200 2.8363 3.3514 3.4499 the Fermi energy is 1.6639 ev ! total energy = -137.44299606 ryd band energy sum = -21.17174304 ryd one-electron contribution = -593.60960668 ryd hartree contribution = 318.94737002 ryd xc contribution = -50.37632469 ryd ewald contribution = 187.59998863 ryd scf accuracy < -.00096320 ryd potential mean squ. error = 7.6E-16 ryd^2 correction for metals = -.00442334 ryd convergence has been achieved Forces acting on atoms: atom 1 type 2 force = .00000000 -.00016789 .00047392 atom 2 type 3 force = -.00007686 -.00000587 .00063303 atom 3 type 3 force = .00007686 -.00000587 .00063303 atom 4 type 2 force = .00000000 .00016789 .00047392 atom 5 type 3 force = -.00007686 .00000587 .00063303 atom 6 type 3 force = .00007686 .00000587 .00063303 atom 7 type 1 force = .00000000 .00000000 .00002342 atom 8 type 1 force = .00000000 .00000000 -.00017580 atom 9 type 1 force = .00000000 .00000000 -.00022593 atom 10 type 1 force = .00000000 .00000000 -.00033699 atom 11 type 1 force = -.00000075 .00000742 .00000861 atom 12 type 1 force = -.00000075 -.00000742 .00000861 atom 13 type 1 force = .00000075 .00000742 .00000861 atom 14 type 1 force = .00000075 -.00000742 .00000861 atom 15 type 1 force = .00000000 .00000000 .00000000 atom 16 type 1 force = .00000000 .00000000 .00000000 atom 17 type 1 force = .00000000 .00000000 .00000000 atom 18 type 1 force = .00000000 .00000000 .00000000 atom 19 type 1 force = .00000075 -.00000742 -.00000861 atom 20 type 1 force = .00000075 .00000742 -.00000861 atom 21 type 1 force = -.00000075 -.00000742 -.00000861 atom 22 type 1 force = -.00000075 .00000742 -.00000861 atom 23 type 1 force = .00000000 .00000000 -.00002342 atom 24 type 1 force = .00000000 .00000000 .00017580 atom 25 type 1 force = .00000000 .00000000 .00022593 atom 26 type 1 force = .00000000 .00000000 .00033699 atom 27 type 2 force = .00000000 -.00016789 -.00047392 atom 28 type 3 force = -.00007686 -.00000587 -.00063303 atom 29 type 3 force = .00007686 -.00000587 -.00063303 atom 30 type 2 force = .00000000 .00016789 -.00047392 atom 31 type 3 force = -.00007686 .00000587 -.00063303 atom 32 type 3 force = .00007686 .00000587 -.00063303 Total force = .009952 Total SCF correction = .000295 forces : 254.61s CPU ( 13 calls, 19.585 s avg) BFGS: convergence achieved, Efinal= -137.44299606 ------------------------------------------------------------------------ Final estimate of positions .500000000 .616160568 1.321872570 2 .661614662 .716118829 1.320328447 3 .338385338 .716118829 1.320328447 3 .500000000 .383839432 1.321872570 2 .661614662 .283881171 1.320328447 3 .338385338 .283881171 1.320328447 3 .500000000 .500000000 .736175648 1 .500000000 .000000000 .730859290 1 .000000000 .500000000 .730688775 1 .000000000 .000000000 .732706510 1 -.250212475 -.250119811 .369008412 1 -.250212475 .250119811 .369008412 1 .250212475 -.250119811 .369008412 1 .250212475 .250119811 .369008412 1 .500000000 .500000000 .000000000 1 .500000000 .000000000 .000000000 1 .000000000 .500000000 .000000000 1 .000000000 .000000000 .000000000 1 .250212475 .250119811 -.369008412 1 .250212475 -.250119811 -.369008412 1 -.250212475 .250119811 -.369008412 1 -.250212475 -.250119811 -.369008412 1 -.500000000 -.500000000 -.736175648 1 -.500000000 .000000000 -.730859290 1 .000000000 -.500000000 -.730688775 1 .000000000 .000000000 -.732706510 1 .500000000 .616160568 -1.321872570 2 .661614662 .716118829 -1.320328447 3 .338385338 .716118829 -1.320328447 3 .500000000 .383839432 -1.321872570 2 .661614662 .283881171 -1.320328447 3 .338385338 .283881171 -1.320328447 3 Writing file S5-4x4.pun for program phonon PWSCF : 2h11m CPU time init_run : 42.53s CPU electrons : 7579.88s CPU ( 13 calls, 583.068 s avg) electrons : 7579.88s CPU ( 13 calls, 583.068 s avg) c_bands : 6032.97s CPU ( 99 calls, 60.939 s avg) sum_band : 801.18s CPU ( 99 calls, 8.093 s avg) v_of_rho : 292.05s CPU ( 112 calls, 2.608 s avg) newd : 251.02s CPU ( 112 calls, 2.241 s avg) mix_pot : 9.34s CPU ( 99 calls, .094 s avg) c_bands : 6032.97s CPU ( 99 calls, 60.939 s avg) init_us_2 : 13.02s CPU ( 848 calls, .015 s avg) cegterg : 5987.32s CPU ( 400 calls, 14.968 s avg) sum_band : 801.18s CPU ( 99 calls, 8.093 s avg) sumbec : .62s CPU ( 19800 calls, .000 s avg) addusdens : 253.93s CPU ( 99 calls, 2.565 s avg) cegterg : 5987.32s CPU ( 400 calls, 14.968 s avg) h_psi : 3428.00s CPU ( 3971 calls, .863 s avg) g_psi : 23.70s CPU ( 3567 calls, .007 s avg) overlap : 487.12s CPU ( 3567 calls, .137 s avg) cdiaghg : 768.38s CPU ( 3571 calls, .215 s avg) update : 896.06s CPU ( 3567 calls, .251 s avg) last : 364.04s CPU ( 637 calls, .571 s avg) h_psi : 3428.00s CPU ( 3971 calls, .863 s avg) init : 554.92s CPU ( 3971 calls, .140 s avg) firstfft : 938.56s CPU ( 91371 calls, .010 s avg) secondfft : 866.96s CPU ( 91371 calls, .009 s avg) add_vuspsi : 484.69s CPU ( 3971 calls, .122 s avg) s_psi : 481.04s CPU ( 3971 calls, .121 s avg) General routines ccalbec : 639.33s CPU ( 4419 calls, .145 s avg) cft3 : 161.13s CPU ( 1843 calls, .087 s avg) cft3s : 1916.20s CPU ( 202753 calls, .009 s avg) interpolate : 21.83s CPU ( 211 calls, .103 s avg) davcio : .27s CPU ( 1994 calls, .000 s avg) Parallel routines reduce : 239.87s CPU ( 13851 calls, .017 s avg) fft_scatter : 652.94s CPU ( 204596 calls, .003 s avg) Dynamical memory: 52.78Mb current, 86.61Mb maximum xcrysden-1.6.2/examples/PWSCF_files/EthAl001-2x2.inp0000644000175000017500000000465411712736221020307 0ustar tonetoneEth(GGA:TOP)/Al(001)-2x2 Eth/Al(001) &input ibrav = 6, celldm(1) = 10.84758, celldm(3) = 4.21, nat = 32, ntyp = 3, ecut(1) = 27.0D0, dual = 8.0D0, beta(1) = 0.5D+00, tr2 = 1.0D-13, upscale = 30.0D0, degauss = 0.03D0, ngauss = 1, lforce = .T., epsf = 1.0D-3, iswitch = 1, niter = 60, nstep = 50, iprint = 1, isolve = 0, pseudop(1) = 'Al3s3pPBEKB.RRKJ3', pseudop(2) = 'C2s2pUSPBE.RRKJ3', pseudop(3) = 'HUSPBE.RRKJ3', tmp_dir = '/scratch/tone/eth-ag001/', pseudo_dir = '/u/sists022/KOKALJ/pw/pseudo/', filpun = 'S5-4x4.pun', output_pot = 'S5-4x4.pot', /&end 0.5000000000 0.6158883806 1.3180 2 0.6616002334 0.7158629261 1.3180 3 0.3383997666 0.7158629261 1.3180 3 0.5000000000 0.3841116194 1.3180 2 0.6616002334 0.2841370739 1.3180 3 0.3383997666 0.2841370739 1.3180 3 0.5000000000 0.5000000000 .7083029015 1 0.5000000000 0.0000000000 .7083029015 1 0.0000000000 0.5000000000 .7083029015 1 0.0000000000 0.0000000000 .7083029015 1 -0.2500000000 -0.2500000000 .353002976 1 -0.2500000000 0.2500000000 .353002976 1 0.2500000000 -0.2500000000 .353002976 1 0.2500000000 0.2500000000 .353002976 1 0.5000000000 0.5000000000 0.0000000000 1 0.5000000000 0.0000000000 0.0000000000 1 0.0000000000 0.5000000000 0.0000000000 1 0.0000000000 0.0000000000 0.0000000000 1 0.2500000000 0.2500000000 -.353002976 1 0.2500000000 -0.2500000000 -.353002976 1 -0.2500000000 0.2500000000 -.353002976 1 -0.2500000000 -0.2500000000 -.353002976 1 -0.5000000000 -0.5000000000 -.7083029015 1 -0.5000000000 0.0000000000 -.7083029015 1 0.0000000000 -0.5000000000 -.7083029015 1 0.0000000000 0.0000000000 -.7083029015 1 0.5000000000 0.6158883806 -1.3180 2 0.6616002334 0.7158629261 -1.3180 3 0.3383997666 0.7158629261 -1.3180 3 0.5000000000 0.3841116194 -1.3180 2 0.6616002334 0.2841370739 -1.3180 3 0.3383997666 0.2841370739 -1.3180 3 'Al' 1 1 1D0 'C ' 1 2 1D0 'H ' 1 3 1D0 0 4 4 1 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/0000755000175000017500000000000013556022211017764 5ustar tonetonexcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav2_A.in0000644000175000017500000000104213521771561021751 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 2, A = 3.5, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav2_A_crystal.in0000644000175000017500000000104513521771560023514 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 2, A = 3.5, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav14_celldm.in0000644000175000017500000000124413521771560023117 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 14, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, celldm(4) = 0.8, celldm(5) = 0.7, celldm(6) = 0.4, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav0_bohr.in0000644000175000017500000000114613521771560022525 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 0, celldm(1) = 6.944, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 1, ntyp = 1, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.5000000000000000 0.5000000000000000 0.5000000000000000 CELL_PARAMETERS bohr -3.307 0.0 3.307 +0.0 3.307 3.307 -3.307 3.307 0.0 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav3_celldm.in0000644000175000017500000000104413521771414023031 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 3, celldm(1) = 6.944, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav-3_celldm.in0000644000175000017500000000104513521771561023112 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = -3, celldm(1) = 6.944, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav11_celldm.in0000644000175000017500000000113413521771560023112 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 11, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav2_celldm.in0000644000175000017500000000104413521771561023033 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 2, celldm(1) = 6.944, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/test.sh0000644000175000017500000000171513522570014021305 0ustar tonetonePWI=../../../scripts/pwi2xsf.sh PWO=../../../scripts/pwo2xsf.sh pwis=" ibrav0_A.in ibrav0_angs.in ibrav0_bohr.in ibrav0_celldm.in ibrav1_celldm.in ibrav2_A.in ibrav2_A_crystal.in ibrav2_celldm.in ibrav2_celldm_crystal.in ibrav3_A.in ibrav3_A_angstrom.in ibrav3_celldm.in ibrav-3_celldm.in ibrav4_celldm.in ibrav5_celldm.in ibrav-5_celldm.in ibrav6_celldm.in ibrav7_celldm.in ibrav8_celldm.in ibrav9_celldm.in ibrav-9_celldm.in ibrav91_celldm.in ibrav10_celldm.in ibrav11_celldm.in ibrav12_celldm.in ibrav-12_celldm.in ibrav13_celldm.in ibrav-13_celldm.in ibrav14_abc.in ibrav14_celldm.in " for pwi in $pwis do pwo=${pwi%.in}.out echo " ------------------------------------------------------------------------ * pw.x input file = $pwi ------------------------------------------------------------------------ " pw.x < $pwi > $pwo $PWI $pwi > $pwi.xsf $PWO -ic $pwo > $pwo.xsf tkdiff $pwi.xsf $pwo.xsf done rm -f pwi2xsf.xsf_out *.old *.new xcrysden-1.6.2/examples/PWSCF_files/lattices.d/crystal_sg.in0000644000175000017500000000075013522102206022464 0ustar tonetone&control calculation = 'scf' prefix = 'rutile' / &system ibrav = 6 celldm(1) = 8.61889817204 celldm(3) = 0.670915393 space_group = 136 nat = 2 ntyp = 2 ecutwfc = 120.0 ecutrho = 1200.0 nbnd=40 / &electrons / ATOMIC_SPECIES Si 1.0 Si.pbe-rrkj.UPF O 1.0 O.pbe-rrkjus.UPF ATOMIC_POSITIONS (crystal_sg) Si 0.000000000 0.000000000 0.000000000 O 0.305707826 0.305707826 0.000000000 K_POINTS (automatic) 4 4 6 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav-12_celldm.in0000644000175000017500000000116513521771560023174 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = -12, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, celldm(5) = 0.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav-9_celldm.in0000644000175000017500000000113413521771561023117 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = -9, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav2_celldm_crystal.in0000644000175000017500000000104713521771561024577 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 2, celldm(1) = 6.944, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav-5_celldm.in0000644000175000017500000000110013521771561023104 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = -5, celldm(1) = 6.944, celldm(4) = 0.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav91_celldm.in0000644000175000017500000000113413521771561023123 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 91, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav10_celldm.in0000644000175000017500000000113413521771560023111 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 10, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav0_angs.in0000644000175000017500000000114413521771560022521 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 0, celldm(1) = 6.944, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 1, ntyp = 1, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.5000000000000000 0.5000000000000000 0.5000000000000000 CELL_PARAMETERS angstrom -1.75 0.0 1.75 +0.0 1.75 1.75 -1.75 1.75 0.0 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav8_celldm.in0000644000175000017500000000113313521771561023040 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 8, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav0_A.in0000644000175000017500000000112213521771560021745 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 0, A = 3.5, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 1, ntyp = 1, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.5000000000000000 0.5000000000000000 0.5000000000000000 CELL_PARAMETERS -0.5 0.0 0.5 +0.0 0.5 0.5 -0.5 0.5 0.0 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav12_celldm.in0000644000175000017500000000116413521771560023116 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 12, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, celldm(4) = 0.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav1_celldm.in0000644000175000017500000000102313521771560023026 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 1, celldm(1) = 6.944, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 1, ntyp = 1, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.5000000000000000 0.5000000000000000 0.5000000000000000 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav9_celldm.in0000644000175000017500000000113313521771561023041 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 9, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav6_celldm.in0000644000175000017500000000110113521771561023031 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 6, celldm(1) = 6.944, celldm(3) = 1.3, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS bohr Cu 0.00 0.00 0.00 O 1.736 1.736 1.736 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav13_celldm.in0000644000175000017500000000116413521771560023117 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 13, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, celldm(4) = 0.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav-13_celldm.in0000644000175000017500000000116413521771560023174 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 13, celldm(1) = 6.944, celldm(2) = 1.2, celldm(3) = 1.6, celldm(5) = 0.8, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav5_celldm.in0000644000175000017500000000107713521771561023044 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 5, celldm(1) = 6.944, celldm(4) = 0.6, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav4_celldm.in0000644000175000017500000000107713521771561023043 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 4, celldm(1) = 6.944, celldm(3) = 1.5, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.30 0.30 0.30 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav3_A_angstrom.in0000644000175000017500000000105113521771561023664 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 3, A = 3.5, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS angstrom Cu 0.00 0.00 0.00 O 0.875 0.875 0.875 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav0_celldm.in0000644000175000017500000000112413521771560023027 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 0, celldm(1) = 6.944, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 1, ntyp = 1, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.5000000000000000 0.5000000000000000 0.5000000000000000 CELL_PARAMETERS -0.5 0.0 0.5 +0.0 0.5 0.5 -0.5 0.5 0.0 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav14_abc.in0000644000175000017500000000116713521771560022410 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 14, A = 3.67461 B = 4.409532 C = 5.879376 cosBC = 0.8, cosAC = 0.7, cosAB = 0.4, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav3_A.in0000644000175000017500000000104213521771425021751 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 3, A = 3.5, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS alat Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/PWSCF_files/lattices.d/ibrav7_celldm.in0000644000175000017500000000110313521771561023034 0ustar tonetone&CONTROL calculation = 'scf', / &SYSTEM ibrav = 7, celldm(1) = 6.944, celldm(3) = 1.2, degauss = 0.03, ecutrho = 240.0, ecutwfc = 30.0, nat = 2, ntyp = 2, occupations = 'smearing', smearing = 'methfessel-paxton', / &ELECTRONS electron_maxstep = 0 / ATOMIC_SPECIES Cu 1.0 Cu.pbe-kjpaw.UPF O 1.0 O.pbe-kjpaw.UPF ATOMIC_POSITIONS crystal Cu 0.00 0.00 0.00 O 0.25 0.25 0.25 K_POINTS automatic 8 8 8 1 1 1 xcrysden-1.6.2/examples/XSF_Files/0000755000175000017500000000000013556022211015450 5ustar tonetonexcrysden-1.6.2/examples/XSF_Files/1symb.xsf0000644000175000017500000000106511712736221017234 0ustar tonetoneATOMS C 2.325243 -0.115261 0.031711 H 2.344577 -0.363301 1.077589 F 3.131708 -0.909527 -0.638930 F 2.736189 1.130568 -0.134093 O 1.079338 -0.265162 -0.526351 C 0.007719 -0.041269 0.244204 F 0.064656 1.154700 0.824420 F -0.042641 -0.911850 1.255074 O -1.071578 -0.152842 -0.539134 C -2.310374 0.036537 0.022189 H -2.267004 0.230694 1.077874 F -2.890949 1.048938 -0.593940 F -3.029540 -1.046542 -0.203665 xcrysden-1.6.2/examples/XSF_Files/CO_lumo.xsf.gz0000644000175000017500000014562313522571622020171 0ustar tonetone‹¹ =mo-008.xsfíýË®5Ë®Œõ×SàöØÈû¥)élÂ/ÿd¹}Þÿ-Ì “Áœ6à~µ §öœ³¾1’I2x >ÿåÿü¯ÿçÿëŸçYþ—þ•ô¿ÿßÿ»­Üç”ßÿó—þ5ZÉ©þó_ÿýßÿÇÿýŸÿõþ¯ÿöýçü—ÿó_þûÿþÿQÿãŸúÿù¿þ÷ýÿç¿üÏÿü¤´þñý§üà¿ïõßþßÿõßÿ<µ>¥ËÿûçùåÍÿÊüû—UüŸkà3¥ÙÿoçÚ8ÿcýW×ÿaàñŸÿ¯gûßð¦¼Fù÷/ÕçWÿ•rKÃV™¹Ùƒ¼»~~­ËÃnçaük¥œ&äuó_«÷^íGKVÚö°ñGù<ä¥66þ¨èù¤”ñ ß?ç63o¥Ñø÷êö°ÿUGÛÅÿÕ:Š?Ì•¾{;ŸnÈËëÊþ-ä eú—Ý{®ÅcØÃA¨ÖÆÏ-'Róy]þW©Éß°DôKßÐðî=ûöÐþ•fIÍŠC¯Óò¿Ví]ìuy•ó†õ¯TòLòÐñºR¶þ.…|¼Ú®ÞZüJrDÓ#7qV?‡^ä?Êe}·} ùµóøEdW¡ÈZ›#ñöNü½š{æëJÊ=nÀúéT˜r &?½PC¯ÆWêmø•\K¤éÇ0óÞÙE6»½[E¶§}ÙºV~%»\•l>äs×±]d5-½Æ*²5†~?Ù–;¸Bdc÷ä"k½é¡¨ÈFN-Qdk¯Ôä6—Ò–G…¹µîß"ˇë<ãšå^óø§ÈÓF髸Ã1QKî%+ßNuÛ^'×°ñGsÌúè­ðu=•ÎPKm|w.;¯ó:ÑÆÒüø§ëÈ3 ‡iºÊ¯¬Þ*UníÚ]~¹\)2y_]9”Ñfr‘1]Y¹wÙ¨}mÙ¬ò Š,ÒÎäÀsÑßS‘µÒ¨er½D±6/Þ.ù£Ýæô´s¼kb»:-TËfzìŒG]"[­ûïèߨþgÃÊè®eb‡RÖ[SÔl—Y\ÎòG¢õ™¯«©†œkŽ»!æ?îFi&~º´·k£X²2­H—[SèòªÛEVVr“‰°r˜¹Ô£Ñ0Ž:¦Æ"fû¨\•kSrÅj­úƒ˜Âí†Q,zÃæRÚsÎóÐ䌧ª3D&?’¯±\J¢³™×föªzz¤´¥ »v÷kV`‡"/ëLé©u§Tø“ÑšZ„b¦§»ZÈÃ.à #,¿}:û£2'ßÐjMü£,ö*”V. oMŸ9‡EŸËmæÿhE’ev‘ÉW­‰"Í}0î\IŠ,å¦v6§îR<(¥škk.Ì&¾âh~½Ò(ä[ìf‚ѳíIþPgëüž|ÖV;¥$ <-žèi¸˜fÊ}ÌZ³sœ3ϸ®’6ÏxåMÙ­:^‹'63ûC™ñ'bY·ßùQ/ñ#¹5“¯[bê)²î×F¿¹øÖ¸P+ç¸P-¥AšÚò[(V²$Œˆ,·Nø!xÍQŒˆxÍ»kµÊÃ-ž\HóKÏ`6 ?ºçd¿†‡=ÓöA{f Š(’]ݨ(rî¦eÏœÓU´CµF®ú'ÏÂÛ‹–Ñü¹Â¬%¹á4kò¯^"›â&SêÜþ (góA¬HæƒØ»Úø ê3)²9xðG&g8TÊoöÄyÁæç–šái{žz²˜êM‘ zö¯!çM[(ßg Pê†ÏÌΊ7#8Þ›?ˆa¬ó¸%yûy€‰Àú,fùß$Aýˆ,ã¦=•‡4ÍØį¹6Â#ÏD‘‰YìY¯{,~õ´ÃÈ ¨|Mg, ±Vžq‰g¼š)8Ñ„ÉùŽ1äAþÄñ‚>ü¦ˆÏ#Þ=ú­´›ðQtû–_®™§$@ó.çàŽmâ»}‘¨îB) ®ŸÄZ,qÆCî§]I;c1xØåA°d®Xþ/JÎõ¼N«—œüu[\cæ»Ë¾eª#Üx•û@[(^àò¥„1¨‚2«ßc‘’u÷îŠ%²hiñaM× Þå²êšî|S‚BÑ"¡i3Û `! ŠLã _&Þ+GR¶ßO9ýÝ+A¢xI÷âK½xó¯" ™\ê¶ ¥$A㉉äAŒß\þ öåæªþk- ûæx|õóù—Ä‹#¢üº„à¿åÒ_5q_|SÓS“™w‡á‰ä'Û1™Ø5Á‚ŵìíÞ^a˜û±õr=«?”°Ÿò Æ~œ×‰E×Amœë9 vF¥Éœ¢Lü@©Í@3¢´5ð¬8¹A{6/®"“¶Ê÷4zw‘£+ÛÝÒ8†Z ãŸÛ9~ù#ñÍΆÈäÌTùå<ùn -ÈV¥­ò¯n·™rrqùÑOšÈÄÐò‹`ÁÖûh ða >¦Á“?™î|äò÷\)%q>.Z$ˆÊ»¨ÜN|è!–<ŒAøÑ £í =%j™(EhÙ’ÿÂJ ê œ*vÿ™Ä‘LÙñôÝb]j¡-ÜòÅõ ž:àBjiVµdbzNvÝ$ù½%ðƒbšO‚ B—˜¯ûCžid tnW7ŒòývT91k«Qd#”’Øú‘OK•»Ë5è6vÆ!Ï)x×]¨er …žïAJ¢ë<®6UNâåávV~ïØŠr‚F+9ä¯-ðž*WZn–MBîðe³Œ+ÿ5Kã»k5º¯šv<ø%ùé‹Õ˜"'~Ð6à‡€òNùÕ# =ðœÃdЉ •ÓÜ•ËÑÒ<Á80'œ™‹LìÓÞ!²¶WàÂÒり”{Àh‘e Añâ<.ѱ…]3K¶;¥Tú\¼ÔC,ÙôøÆUí£šÈ`*(Z„eqJM´’bü\JÀ’}Ó±‰\¯”¥æaøÅú…ÚË·ó$:–Ù4µH;ä’G“"U–ÿhÂÅøCœI+)ýä”+Ä•Q~ÕqŽŠlˆ–u™h}hÙžíÎE~Zö6-û|Ùë|Ù‡_‡¿¸¬¼+.û²úð¦ìÇ—c<"{OŽñËä»È^“Éÿêe¯«—}UéßÛªÒ_ïÇùæïéýø:¬Ž”ÞÓaõõ1úe}Mc¤r¿+Ø[4˜ÑIßT¬®)Kªœ ÎÊ*R]Ë6¬n¥Í„Eà ´d‚WX²œB.UBû0ŒUn^èÒ*bI½Gˆ•ˆø7¢%‡½ ŸgÄ…Jx_|%Ëgë—•Ø«óæ6ñyÅE“B-“ÃjaáiéË$¶ì…"KcžØ®U µ©eó7Œuf7Œ¶TŠ,·²Â—J#€yOº,à¦Aó.΢ѾÈiÒ ¬d)‘ãßÂvhYÏ“­ó7Írkà¶S¸ÚDŒ=ï—áTEä j݆¨TJkìt´ ÎuÐ0¢X•ëà?Ûëî”’œcHA£ù´–Jà¸tlœÅe£gž±yû Ȩ wû^›x]®dç¯M±JŽÊŌ쿇|6ß-X&ñ'Y@5A8„¸P‚Öâ§+‰9FA&óÙh=â2$‚«k™Ä‰•á© Ýâ®^ÀNȤT­ÖÑÌ ì<]Ëj5?bqu#ùƒÀtD!³Dðêà‡ç®wèéK|tõ1Š0©Kbð ]­¸¿Rê9Ä·vWojQ÷ª3d‘¢ ²G­‘ýL+Jä#(:²åd¦-û1˜¼×ìG§ÈVeî©ÔB~µ­ø¨õÔïÌ’É/VÙn)Ѿ)>ÍÐ0ŠØa_æè?ªès:æï‘׉(`‡–YË‘NÇ0¢z6ͼ7ä/wÙžý@f5×2€Éä Øm…%«»…O˜õ:ý´ûäqIðÅì0lŽä¡„Þã$QÏí“iÅ]Òõ záJ[q’…o-{0€„ΕV”Ð2óA0]i»p©&ÕêÅÝ@¸~Nм„[ýÂ"³úw„ ýÿ‚ÆÌåò“¯ºø“Z³§{þÏ}Šb¢å¼N¾Eí›iá)!Hã»[e–dËm5oai¹3Qv–, Æ¥•ÌD†Xw ŒÀˆ´°|!‡òMsÄ|h‡X‰é‘N-+*¦m°òŒjO”Ÿ@¯k#K¹?ÐŒt½¨œÄÒþ:`–™R|„î"K•©'¦£°ÅJË2ååZ†c­Ý{ärˆàƒ|º%2Á°|È‚+ϯMTsÜÁ³WÆ…ÿg‘7¸ªÒyGHÚ_]é¦æŽˆZvÕaÖ2c_dåkÔ$™zÆ_Ðhj=wøtW,” ºûI„ ΧŽöxCµâ„½»×ö¦h÷h»øQåmíG‹RÚ(OM"ÆTF($Áf,ÑÍy’¨–‘µª´(Ý‘2ݬ]Ê QùGñ›¿n Ãw·¸Îg *à©ÚZUºR¹¡X§Óò< @êl(h1ˆKvuðÛ˜cl@Ø?äŒ'ë-(7Où%¶"tˆ9Q~+[Bç´ë”êÕHsnŠL®»%D>%ì'2J{m–Aúꎇ?Úè´…bXS3T«×êT \”QNúhÿIåäü ¸¹iHio¨ò£dQ’´T^·‘Ô=)1 rÆ%¹Ê¡9& $´ßuº˜‚«†µ™iSJ‚›+ÁÜ_X2qe5¤”jô~ }¡¹’àÙïÆ@RpÐBU¹‘.2üÞðø[Û­B´é6­ðâ”Ê‘ðÏÖµtD6Øc°4åÕÜŠ©ï¼ürõ½Ù¦!<¥±]KÎÁÏx Lðùt§ @ÿH@Ɖ–Ð{%`”*7ûòÞ+MX•°³if·™âÖ:}^í£uЬèÙl¡`›€Ñ'v¬MÊ´C}ìLçSê¹Ô*2ÁŸÑú&ˆÃO®Íjžð$¥ÎŸÌ²Ã© –ãg,Îz]T.Ç k:s£:‹Ñ΄6bö#l½ŒÈI ãE69 Å¢8ÑØŸQQžJÍE!ÿªkÏ„–±÷cÊIö“?ùµå×åQèUtdòÝ©\&S®ßˆb¹j¢KhV¯EMõ'Gd«\MUe­z}ÛÌ«›Ú÷5ä´Pum–8ñò–iþÄnÌPŸÌ>Æ\«‡Ò‚g×¾Næ“fq77?}žÄ†ƒ"”¹ zš¼"¾úàBd'ˆ±©ÌN\/Ú]?‡5 ©(7»óAvîŽZ2 £ÀÊé&e![»è±úÑSŒÄÁÞ“dßT·;µø’Í?œ¹¿@Œ¸vm®¯j‚‡N”©hXy£s¾L¤>9¨# ל–„´1($¶‚"äg,!{¹Py‰,ó’‹w^‡Ø~^Ì/uDøGPµ€&EŒ,67¼±vÀÌ*ÿo@Ê)Æ` §AJ'?ˆ€ü‘u¤ÎVL§$ŠL>‚£è… ß‹ÿ zzb_ø<¦ÓYbÝ=ãa§Òõðo_÷ñvTóHÕKy©h% ÝÑÇXÄÚǬ´X(^]¤©ÃÆ­9(ŠtÏ`ŠÂ´¤Ä·& Fàçæƒ`N7™‚säo˜X^…l˜•Þ¤@Ê뢫èµ^Óº©G\=OºÐä'_‰_BûZVÏܳ¹¹š>vŒµùdV…[Šù¤‡óï“.¼^@ŽC ÓåiXZj›ƒÍº§âŒ.Ò|.ÌÎ×UdçRDÙ½6¾[àÕ:¢EޱxZ!óðÈ1–1Q®. ¤„vÄ´KÌqd˜ðeÿì¤ú@ޱ»‹Aޱù»5mã®±ÁÎ2“ßNKü#ŒÌEÊ«®Í¼HÉWZ5¿ësç+.Oë—cC¹}VaÐÜ‘£*ÝÉ!:²ÌNÕ’•VÁ3ùÈÕµÍr¥ ËFÑÎvÁà‰å`ò¾öq@9d^¦gèQË9”Jªâg]5›*Š/¢ ×<Þšý‚)S±j»2‚€üÃ5žZ£%÷Šb±W¬/•˜Ü‡kYW×ÈL~í9_} ³T }‰û¢håËn~†‘‡Wp‡Æ¢ÿ“¯—î Ãä×ö¥‡b°jÙI6uÜËkn^°q½§(¾ šoü£y"yFAå'>%³°“VkäštÌçFB'“ÆD@“ÖtœÂlô‡Šµ¯RÆ$/2r%Î[ ªA;ªÒrÜc!5/Ú£š£D¶ÅÓ²$‹‰â§|Ô¨—­Í!Zdaó Ê‰ŽÎ”½9”-æ8Ïà°Â"·ÎzmÀ¾¢wÁ 'úz´¿YºlíìA ÷:aç?Vˆ^¤AÕEÒ®Óò¬—íIvP°äBÍL Y8¯ƒ(–÷~`$Ðz`Ô‚oæj$h#fŽ×ÊêfQ¹Êæu©Y–A×Äi>°F‚9¢6ÊrAçÆp{5`zš+?–¸"ÑJ"ª"!Yׯ Šl$k'3‘Õ^sÊÅ;Lz‡Öø!7ºþÄ#‡ç{Uh åô3ýˆÀÂD“GKÑ_#Ö¹Ò/‰·ðF‚‰b¸ÃÇ¥“ê”Rµ>8¿ ŠlOÒ\Bè{ÓΖÂü3®Mï@€M# ãïG¿Â´!÷XÌ Ϧ”ö8f[‰Æ[ŒµDµu*sø£>ÎgPÒ©|î§¼{UçœBWÏÊR¶DU¡eà  aìsD‡œ¸í†ò!²Y¢w|ÄÔ#Uÿ5m]lt be‰Éà„É1À]‘©e‚¨ÝšŠáØyRJâ+…Ù<uò Å£/9ÖV*[9í,å´’„–ãÎ7jädÅI®FK¶Œîz¬»:^³å<ýÞ {9ˆJÓKÿèв“,‚—kÕÛ­ÀêJ, "µ<#f™Øɾuâe-r¹OËÞ©eŸ/{/ûãëã—½..û²¯Ë~|9Æ—å¿Lþïm™ü¯^¦ßüMõ²¯*­_öMUé¯÷ãˆì=½_‡Õùæïé°úúÏ7O#¼«ócÃTqRd}$^ÉV¹`c“‘ÿ´·+ò—_>kìëv†ñÃÁŸŒ½ƒ¿‰é«Á;]ôî£ö˜B€6/ùÕཕp9>‚Ü.~:`­±h Eå~(·p‘IÜC‘I@« F V^¤,óÅž}¨¬A8·EÃXåBJrŸŽd7º€‹wÕžA-[õø2̲^mk=ø1©Ky¥NÇÅ1ÑúÁX@|OÆê®ÃR–iÆy­˜!ÊJ5@T'yås»b_ŸÚûçx¬I7‡Yð@=­] êÈtlbÂí z,ng%¢ËÍRc˵ ‰¶éò«¸6™“/þÍåÃyì‹ èYCd÷Ÿ¯ÍüCÀE6‹å8tØ%[MÑ­0`ZÖuгÅÖxo«‚†ê¶ýÛûåˆÝN ;b>"Õ@ü¥µ ¥—ôÞ÷PˆÉ€8Fì…Ôˆ8:Óãø@÷P¨„†×’ ä½_ÐÑZÔ‰Záð6FÊúÅΟvøÉ6æ…岺ÍÔPÚ'C0¼mzj=ùg(´žŒÂù8 eƒPÍh Ç–yÍ`b|ÆÃºÖïŒsØrs³ƒ|ȹ4£|ú¡ƒÖå$™“/˜|§/“[8S§ÈJ¯×ΞÞ  (¼¦‘ËêqÆò%"¨]{Fì›çŽL,1œŽá?–ÑÅH R¼1ÚSŒŠ–]“g#Å욜õDoö‹DBt®Sdbz<"íÈ÷þȳQJ«vŸÁDiáq¬tÒRpl=V æ³”OæuB_[Ó³ç1ŒšÖ"?.“—݃·éº)û1Ââ ªá|êå×ÞWö*•Ø"V¤Gì›E²û¶ ¡{„Û@yÒ"© ÀÀ‡rFrÿ±ñèkôsG6Z7ÝÅrñ^™bR@Ó¶ï"qS´òèîÅÆ~R·¸¹'ÏiÇ%Ê}¢bkVzÍ~ˆÇb9‰Ò,îkEµRnø58 ãåœ'/rö—¥ôÙå°ÓÆ^Z(·Ï™©#l ‚çƒÎF“R¿H@oYºB´,ò€}Æö1ZŽ K$ëNñ`ʼnSH¬ð e,¾;´w±jgšŠî]£;=¿â2Œ;EZ8Õ˜2™Ç¾Ì.ò;é 8¶D9ò™ÇE1<íшYw½]ƒ¨c2y/gâ¹_Ø®Íz ÿHwI´îòë£Ý|ŒkD³^Þ¾¬Øžƒ$Wdòs‹¥|ËɈ,)XjpX¥Ä,e×Õ{ÓVF%4xÄÖf‘»ÍÈËuˆ°yÕ,]A—'è#¨ZÀ †›X(ôÙ<û]€µŸØ ‚áà­X²|–Y~}d¼}àú»wLÀÇÆòè•'¢ªÙnyÔ6‡ÅÑÌ“ÈÀ’€«Ò€n«ŸzÙ`âYÏcâ”&¥”$êçƒhœÇDMóvgœ&S]w3Qb+‚Ž Û.ÏO°‹70…p%eWnÙ¤‹ùe—¨Ä”Ùf8M |"*áüÕû!Ÿ!0ç(ÎT…Õžù"#š%4AB´Æ¼Š§,Ýœq<ŒÜvjˆ6ù¦¤{{-ü‡ä Ê/¾§Ä)æ*\cu,YíôO#A¹ ‚ùlw5ÅÚ+vÄÕÁ¾¥+C¿Ö`w…N{zå ‘kZr[Á¶n±ä#—u ÿ3Ðù|[Ñ¡³ý…žÊU •‹Åª(&´‹"¨’H,@ÝE¯"dH©¯Χ_¬ƫ¬xX–k8½×EiÙ—ºiïG/Ñû!6‰õNqgjV{?F ׈ÞÃÅ­ùÃFªà"DšH-û\«÷ÄY늈¥óR Šó˪Õ.Âh„ƒ$à)å4(²µ¸ k)?$ P0gŒ^£y§„œ{­Q¢®‘šÖþ“(À¶Q.»1[¥­­F CçÔ%ù8çÚ€s£h÷˜£PdûÌÆšÈD±:ÿ;Ù‰Uäß™®í”Tåï¯ð§sÊÈzÐH@‘¡‰-šò A,;¯8O˜<âaíx<+¬è‹SaE ”'£ÑâÌë€n·å‰ Xj®ßAË5x#•µ\i:t ß&w[£•„4æq•‚¾¦~õð´à `CE»òPFöd˜†KíP€¿âÕX8Ÿeл˜%—Íœ}¥hëÉÞöèkWÚ  G3ëÜYc:MAbu3m™‘”4"\1º±ú²„ëÀFÑVÐ;µl—|õ1ÊëÜ÷OÝåºÔ¸ EÉ4¶Q2|X;ˆ:6â7W¬…ÛºùîÔXÈ”¯¾¹Í‘kLþáy:X<ùÆÃ”¢À…šQ£”¦oW3ÚªŽP/ÛÝ—h?÷D­~öÍs¥…ɹ¸2ªÝèìëO6½/̤ճUýøéê<} &²q1ptq*ÑTuZ†Ld‹Û«”X/:2¶³®üc3ÿÕ™Ò±xà{²^ èż„Eix]¶#ªÊÿØR0(.4nÂg~7”™¨8*×þ¹Ug ‘µá[®pù«o ÄWwéÌðÈñV;ðÊvr'çd}tóïŽ7ôqµ¨rõ¥µeUŠ %øèC+{ÌPÑÚ{âå²G»U;-Ÿ–½TË>_ö:_ö!Æ×!Æ/.{]\öe?^—ýørŒ¯Ë1~™ü—eò¿zÙïmõ²¯*­_öMUé¯÷ãˆì=½_‡ÕÙ{:¬¾>ÆóÍßÓLj!Z›7‹^ÈZ;tö|  [N†ˆÊæÈ 4„MˆÊ…”RºÆ 1ÚCÁˆ» KVG¯aÜ»§Å¿röI‰| —’ønd¹(%ÌÒQS‹´ðB.Òé„åŒ[‹÷øÌ€øìÔ²ll çSë _êùb;˜}Ï ï]ÉA©17&Q猡Pã׸ÓL”Ÿœ]ùW¯^}_“/r ÃÓJÐîhf¢ûÓ%Œå}š/‹gR»MeØHà(õŒS"ˆ!:¸bƒ×ÄwlÐK¤31C›|I·1ó M²ó¶mó¤MmgH+‡Pé˜lþáPhÖ^¨÷¢Ú±È¡ŽÞ~È©2"¦]Э\ DæÞ‘”È+Ë­­îØ0£8ƒSdÕ\)?¹iÙS–3 xäbD;çkXN!|)öÈa¶A‘IëvâXu_c9b\À #óô‡IšÈV_ûÝ\Õ’¹&ã·´\5Çó‘\…ÞNî±D̶[Ëö‘`óh# .'‘6W¿)WIѤ”æ%%AaDåâËÂ’õÔ*ïþ–]=T}­¹®<`ˆ ûª¿[üHn½Çü°+¸äFÅàmîn!¿³¶â¡áãóÊ1Ê7÷p°«Ò2¢iõÊ¢c=è%Ò>óeHq ByD†\Hõòf‰§S à884ܬ„xÄ©ìaåOÝÆº¼ÍY¼³ÊÊDÆ^ „stèôÙƒŽªmÞã~7„"ÉÕ˜_˜Ø{çõa쉼 ‹¿šl0•X`…–æÐûyDV¬%*Û&F&ïá¹ Ü89ö?Êu¼dÎÃÙ"Q_Ü*ŒÛ{E‚=7 )mÏû<ÚÁ骺"ší:ºµuдb-r+;ÐL.7mãŠ9ª9ü@Í®Uc)¬˜"”>[w?-{§–}¾ìe¾ìCŒ~à¯AŒ_\ö¸ìË~¼.ûñå_—cü2ù¯Ëäõ²—Õ˾ªôïmUé¯÷ã÷¶Þ¯Ãêˆì=V_ãÙ{úAã¿ÜêíAGy¨‰™ƒ´S¸<ÁˆÑ­ŸZ LöúÙhFW”~I)Œ×Î)R‘»–kIËÚWŠW<úp4#Ç1ÇE뫞,½Ù“¿äø““>#ê O7nÖYÞ <|Ë„ÚéžCBÚìÉo*Zöt—“ö¶ÎûlsUÝVÈØ0}˜Õå‚uÝv|tE3Iâ²£Xzj¶ûÁ9 ?†E—bA§‹½S§”`*ØÙœSŽx¹úƒ—ºÏ“Õ°3.é¢?yX4ÛïkŽ>]tìØŠsù¿Æ@ ¼ô½Ð0VÑ¿«AµújWþK ßu¡|‚Y #&¡6­ÈtˆÓo¦¶á×pém5> [ÿí£*ù B¼±èA=Vã°ü'‚QÍ`Ã…±&ÙCöocXG’ÜfÊÝ-ÞmìÖz*‚It_Ès÷fq¼azÒÂe)›gŒU]‹g\k‚ctÙ¹@«D•'ï+€0Ëz«åˆ±o¼;&q8¢¡Æt—øÜ‹îˆhˆM *lØ%Ñ*3·ƒ¿¦ûÙ?j=iÀN¶6¸9渆•ú$U\ê ©©ºdû_†Ô»í/3ÚýefÛ|žøÖ#Z8Ô3ÓiŸ5ÏÍ!ÈßÔHø Þˆ=|½’™àÇØ,u„‚‚¨"å¼]ÿj,ñ°¸ KïšCÛ+20b›c…Ä01(×$F/z=œ"ªeÛ]mÚ:57F©8*–§+2Á"كʱ¶ÄV3YRPŽn2É× —Ü|žHYWÖfVC Eç?Tò žÿ±M…6¯mÿ@h.¿9ïÍJ¢÷ƒ‚©£z{wMõkNr”£š9#æ\«t`øJƒ €RZ%ǃœB,”È'¹zš|]]\o‚í|­"“·Qíkßaå—€Û3ç@äÅpi”ãµØÌà X¬qcŠCç“gì!ˆþžØ ÝÅf¥=’ËOlW„ÒâðõÃ2Îûa ½Í å7Jò94ÅWé†aëÚp3[ sFí„ڊĹ”+LjrB°ðŒé¸k¸ŠK®Z°®ˆ[ÚLE¦]îñö\"eY&—lâ¬ØîÔc½ I× ‘­ÎM ÝØ²X èqU0íÆKŽ.„)72Xs²\¯˜ÂÁ/ß&¸u[ C¸Íå·1³ê×ÅÎçŠûcZˆ#û<üKLzântU|<ÝÀN)Ì–•Òߤ³Á¤”¼¡Æxbg,סJi-VÎõ5"y/V(訪H9 ñ…¾ ô”ߊ¿Al}¥Ð%€ŒKé@<‹ÙÅ…†/—à†)…á,CÊŠ+犜 “¿#Ø‘t(4ˆr&ìE†4 ¯‚ÎÁVšØƒ„•œ0U~R܈ç‘Ý%Ô~vϬ`”Ñ– ù.NÆNÈõŒ°…ŒLé!-L)¡îÈd-ú¢^&H0!äÚ8²ÄúÍîr^ºŠ%ŠgÃ)£¬’v¡ò²œÿÒ\^VÕœ±­~MQ§ë–³:ÅθÖ{¯íàòLç×âC‹FÝF‚`ýÓi„[ PœÏŽBtg#ˆ¢m¯Ä Ý#/ÚÏv–¯˜k:®€åh°~TQMßs¦øx^ȹFÛ öŸ€ø^j¹í±ðo.s»ÇôtV®¦–Ó‡Ëb7† [KœQ•.)zwäAEqªÒÜëNk 0ˆm~¬ì‰”×ÛNy:'….2í‘LÀg—ÌÐ)ö# ëÑ|É‹y''9ytó—+–†¯PͲ‚6«~³ÛϵӤÿ›Ó*Þ¾ÁnD3‘D ›>O.W9¿§qú ›‚Þz¬:vÐV‰‰‹ZUé9ή®Ú£Ãjœ+zÆ¢ÏqßÓAT§ÃÖ*žË?ŸK³œÞm¯ÓÞ±S0ŵƒòyJØp¹4üt‚s¸¹YŤR»úpÄø¹ü4®öÒWƒ—K=~m±û%p"Eè‚9kî @ÑhŽâgÊ–x°vqÛÎü:•<„»šð¦¸…”|pðéM v0³Ú%ð*jÅkdfñPDLþ:dJÉ€ÓŸ¡K1ÖæÃ´ý^ùô×èW2‘•Ü£­' Ó˜lP–Éá–¸u«B{b]“ØË \šG:ÖTÜ<vò G~êäÞÓ¡Å "[Ë»c €âB/ÓêP¹Ö£^]Kò惲h ‘}a»È4ÐU¥þÐ29¼I% ‘ÍÃh¶0‘umƒ\Ä>u]¦û²¥p”p +úàú—`¬š­J`«ƒíY„ÙîתÍå«ÈDýz8¶:.ÃØ·{P=Ïãª+rü]jÅkÊêU¼%Qlý&Ó_àIÀ<-È-ö-ÙuI ¨·Õi«Z"šÙë‚6ÍõT³ÿ›{ŸP?1ä‰ vXÉÚÎ*²S-¹¶ïÊb±®Ó \(ƒˆCÇ$Þ+×–@¤@)M$ø,µyzJ-ål‚‘È‚¶P<ÿ ù+‰"«eSš"ô̦Æ<ÙzŠ5]†Ñ s* ËÇuÃd¢Ã‹Ó}2RB“6ÎÖŒÊo¤Æ‡ì-ÿ¡gšÖžSV²\$ªÈ^…È:¹V·â3ˆ Ûá`C0Á€ ²õiÙ‹µìóe¯óeb|büâ2—ßkâ²/ûAˆðžìÇ—c|]ŽñËä¿.“ÿÕË^V/ûªÒ¿·U¥¿ÞßÛz?¾+}xS‡Õ×ÇxDöž>Fˆ,Ý"YM‰ÝÂSð^q‘Õ]3UNnMÌ4 ~CËäsGßu÷\–‰¬Þ Â9Œ®j(- Ù%²Å šOg¾I’0'„È2÷vaT³rdsZ+ˆx{¾ 9líçÙYk!Šêòëë8À.ãèí†ÿÍ\©Èä‹_6[ƒ÷YË¢ª$Ö…cÀœ©°Á[þQ5Ý'|OrRc†aœ³²ÿ|©ìz2G¡XµzBU ã ŒVØ™Eó›¬"Í’r}K\S5â»8_†©×† ªB;+¡XPú ¬Ÿ4Œ¢r¡e¹—Z†M%É`äÃE&WzqA>i¦Ê•9º‰˜å¿Ä3ÃX8÷ÄÝ0L›ëã2Xã6]JضaÿªZÉ‚ï÷oŽQ´¯Ãȧ2Ðj¿þÍÖÓQcJ@B¹Ê.ˆ:Óg¥~Œ ~¦…?vë¨+œl\Dæ»F•GLk&Ê”@“ZVA"cQkÝ3nCò‘ÿ¦É!‡2¢Úr^7Gå'ÚLü²»_òìÇ…8†(÷äOªqMœØKðüGÿyZ³î×^$ñroaäüÍ ȓ;dF‡•Zµ J¸9[ØÈŸ#ã -~Û&V3Æ)•ˆ$áÈ}ÚÈ— ¿¶EÁŒyU vio¥Q#™|O…üí5- ˜ïP¬ìA‘ééOj0"ÍJÄ8u¾¥»bå‘=> W9°×‚´yMgbçà±³ÈãÎÔ"˜K6ÖV-ÇÏ­M•å7æÞ“Ñ`Ïç2ÁO bŽ6Út˜-)cÑ* š%]_0À,ð•},að$F É×êD v”kMH›±D.õó%À{猰=ÌÝ#™²ÚŽÏ–80…l ŒJ Q û%²XÓ3?d_9‡±àæÚ.°wH3•`žÀ^T–8Åpx½sƒRÉŽHÀ ~º†<™ÛY|‹u"±ž'ÓÄÁ ›ÒJ¾ÈKd˜öF††£Â2H…N3LcÏ©†»ü‚¢ 'ß„VÅRï§*=šï/Þ7šžæÈñƒŽÉ”Àî Jr–(„ƒdÓBæ±/€Ûb3ù\‹¢¥ž×êgñ?Ò¾ùÏD­é_¹L«D|8#÷[b™®n»ªÒ…T;H6Ì«]¢™ ò˜:o)!KÍþÔ(­BO„«‘OÊ„‚XeÛ»¥]®vÑgö^‰¯îì*I”«÷£Õè>H«çó›äfUzô%riB-° É<|ÙòšQ}ÐGåÄe@k‰´q]Ù(21]Ý‹/H?ngª#÷k­*¶±"Û[©rÃ/TNýh×A"Šnn¥íh–ÚÚà¼]‡øJ"¬®t‘ ®ÅÄ>3zvJ4=¢—Œ}Á¿¢¾˜ª-Ì9:Pž¦ª±(²vÃíáæLdb *ÛB8Ø×&%ãËúu‡©˜¹D­±4ó”h1]‚Ù¾Û.fÎØw*FÛÛêPì÷FA”E»5é™ÈÄn4PÔ“è˜Ódb9(ÛuäÑ{%á·¯PFoŒÄ˜¡¬š"ækÖ4všâr‹™ÿM¾&€ŒÁ˜Y®MU`wa¹çFÖTΠo}ŒE.è )ÕŠƒì|O¤ŸÇD†n¾AÔ/³´NçuJ–UoÄF©‹,Zœqø›‰T»¥J:‘¹rèL?p,sàõ(A“Ãã—QsóÚ:D÷"0Lq/n(e¥ÈÝ"ñÜÄVa¯jŠ{Þ5hãäÛuO»!”#¤‘@8 üÊ3©5/T.¨pün$*Rµçˆr¹l¡üý `Úºkd+QÛC7Á#2lI Õ4Tg"k–T‘áeÔXÉzX•†·H¾õûú¦×µ‘‡ðcP©ÞT% §/wXR‘!CA; r£á"C (Û­ØDSœØÒJùåÞ¼—£:‰Fæ$Eƒõ³OË^ªeŸ/{/ûãËã—¹'zM\öe?Ü’½(ûñå_—cü2ù¯Ëäõ²—Õ˾ªôëªÒ_ïÇïm½_‡ÕïmV_ãÙ{úuPá˜j†,‰*×2­$–\M¿x˜^“_)Ÿ¹Ž#2ù²aM×åUDíW˜Ö::-ÙJ5Ô7>*Þ0k åw©}®|wÎͯÃBÔÏ tˆ‰"÷.œO©YÊí ¤àZÕ[£÷Ú4Q 4lÕNUÕbÉg`çv=0ºÛYµq˜oiþ Z6‡ËOàÐòá{Ý2á†a¬ÁènÙ«­aµž"IÂ6õ‘ɃŒžnÛ]t:ÓËä¡ÈUÛa‡ö(¡3&ÔDcÚeÉÄÊv> ƒF·TLjY qðî{ÙŒ‘±z#@F™ŽS ùI8i²R’û29þEžà¦œmøbÃ?„±n)»ZdxŸ;Äk•»°æeÅ ñJ± $åäü¢è €ðwˇë®e½ž%´à üg»ÍÒõ4μ¤t@¾Ii^ðQ pКR¢S^..WdÄ/ —{¬°˜±—³pͲ>ÄryX¯ÛX•Æ7”äéŒ:Œ°’‚ÂfèŸDÈ·ÊùÂ1±‹ »`u›Û‰-}6H™ÚÇ<“Ü–FÚ±iÅêˆɆóI"ØÂ@‰I>ÞðÉ3Lâ4_%‡9˜f³ ÍRcÅ÷XÄvD‹Áo×Qà`.ŸY˜½êuGK"¤–¸Ë“‡v8,a•×=+} õŠ¥¸";Ððv¡Âõ#%Ãde®×9ÇR·»¡§Ó‰ŽnY¯ÆO²tE÷¯¤Éß$©%§äA:{ÅÊ2 Mb$w-Ûœhaž€ÛQ6çþ)V‡n•×r+í`”¨yÇ=ÞylZ²‘ªWBqvÛ+«(ƒlNqb0nÄ–«Uj0‚¦s`‰ý#ŠÜ«u¾N~OÀ¥ ŠH Ǫ ä9kLç™g|„Üiz°6ÍãNÈ"§ÎL~›Ž”tÎuÅb@1˜ÎH´mnIJ̣Œ-¤Yc ò[ÍKÔX‡Ð¼¨¢A?2¥$+@v`yÒEÓKœæºÌߘÁA&*VÕqV–uÇdØ`Q9+ °ÅÁ¿/FáÁ´Ô¡Î¢&̰³Á×ôdŠ(‰Ü<¾Ali$–Å#„F"“«K‘µÃAf0zv®8EfʼnËÎ}?™|p;ÌÍJÌŽ‘ªÐÆ Uï;^ VVó;Í,6l–®8ViG»Î\#"\ù@™¶pÌËÒ%˜ØÄ yS:ðL…ùë%šrÄBE³ê|ü °ò'k—kø: ­y®«Gäð„YcpX)‡£ƒÜý៽*˜û]Þªg¹ž¤ó A~¹y盼àv [´ø2­$¨„(²^Û¤aD³/ŠjÙù–‡Ü Õ<§AZ¹>U›âb’fÞ玘hŠs Ò¢>ƒeOPН´ÿ)-P,üä‡â‡z(Ö08“ÒI6èjÜ;D¶zô«J0ì¨ùhºŠlæ­@Y,2m##*Z“ìõ¢ID+ls)•îƒ*¿y8=5ø²JhÖÇuövMiñ V²M+‰=ìÔttÌò¢ºšŒ&гçé§“Ò+n¨™ïÍ`.åâ;;?-{£–}¾ìe¾ìCŒ¯CŒ_\vdñ¦¸ìË~¼.ûñå_—cü2ù/Ëäõ²×Õ˾ªôëªÒ_ïÇïm½_‡ÕïmV_ãQ¹÷ô1êo“ÅÅKÑ=“»Pì"˜Ý•£>‡ýS_Cdò!‚ö»r‹ä×FôÍË]MTFìÈy©\?t$FqÚY·á–:ñLïŒÙlj«õsKàÊ7èÏ®‹†Q,µ·Fëhkμ…)Q˜ãjsôítëë²&z‰.r; R©®>ã$jšMøZh¡"w\hðÄz¦Ù‹rþ%«–ÁÖÖa™Öà-·Õ?4˜ÔõÛbŠ©¸b«Ÿâ¦0ŒµQ* O»©.ÍàÞÎ¥mæÚ4“%¨ÝñÐV ±w;Å31›PBÎíÀÞƒ8†ër÷„Ѹ…c*–½+‹qö¹#QÍÖÔhã¶cĽـ…Ʊ÷¤-9Gì ÊŸ¤³ÇAß-Çã-r…¶Y53Œ£’´Lœ©€'ʪæËæjÇ»jV~œÖê(™ðJ`Sœà¡  åÁt€@ŠùˆÒsL§Þ¸æèû…÷flmÂCºÐÌ‹ãyăœVP«‹ü£ù_ °Ô ®‚"ÿ7ØyŸ2i6@š¿íUÙãôäÃÔCH3$ÎøšO*•³~ îO™B 3bԯ߻\Äé2îƒzL°Nᦾ©Üîÿ±¤RÉ”ö¡Ñ¢ç}‘q7‰Ø¨X+¦à5Ù@L†pÐwêñÏ£»yqžh#˜eLÁ6"/ kDžŒË\ªzZª&&¢#êcÜÔ6„U&T+ÂAߪҔb6hIHÄ)2¬7á<ó>C:oU›Â=¯”Å CñÕžz‡/.1 r^z_˜¯ð àŒ)›Û5ùeÛ¬dq™xÃFó€Ñž°6“3Dšئ­YÄ8QqLqö +1w+ðB)¬—©§m,C®q­ Õ >Më®j±Y|A0ç¾Òì=H$Zó±DU˜üJ³ì°Í嬾9iá^#xTô—i‹G‰Dº¦!OF~!ÆÈs­˜_šƒåÇâ"Ôš›?¬›òͱiÖvˆLÖ]XƒÂZÎqcßò›¹©÷}ú»A’Áü¥ˆ9jqò}¼¢Øu‘ш{œ’[¼Š‘c?ð†Bí±"¨¯æÅÏÆüžÕ1ç¼;æ’¼–ƒLTj¡§ÉÓ¦îËqÞ$$<Ü: +Õ¢š‡Ê^Ù‡J‘Së?õ²±‚K«Û(2±]¡K¨¦ó†KDÛizDzÉÕb >MLÎÌ0훑@W²é[Ié*qÖCuu¼Ýéäê²–8Ó¥rc܈?娂Ìz¶ãé¡`ؽûyåqæEdtŸðÕ“dµD~­äX+>Ç«½@Ýûpª2¿°x†‰ñ(qž˜Ó¡“¼ýd!UN4/@FøQâlÛ9‚´×‚«£`+æ¦ÈDÊwEªùس6ùOð•È„~«h¾õ)-€86ÔRJbö'¥Ôö¢ª>-Ùw˜â’e¹וõ/h‰vƒ u¬(c‘-3€õQª_5¹”¶6ŒDïG²¾íý@ÂÞ‚už.¿Q6[IlË4pMçÈS;»õô'a2wQƒÄe1Ì„#5 ¼1oŸ¶§65A4cû‘ĉÁ'–ÞÍVÈ\Lq¥3ýjt>ro¦SÖ(´1å>íWï‡èv4òˆýìl×Ùeœ}º1*EÂ<¾ÁSÚ®“ƽå±Lg2DoY'â†6ú±Æ.NmªŒØ£C®:¥ ÆNå4ƒißZõ½OÊÖd4æ×­]g¥N?)ßnQdæo¢”œ›Ï™cŸ]·ZŽ… ÅÈ4ÌJ&ÛV½Sp2>í©º/1á±G±L.ÃêHm·‘|.ÃBÔ#Áž›YÉÓǸ¢[Qðl=RRµw8”jw‘•XYlFí|]9™‡léìäHbêÒ“ßC%›üJ ØÛÙ ÿ(=ç`·â¨Ö˜-“_å—÷:Û¬¡™»xª«!—c–¦ô£Ñp0ò féµ^EÒÑ£C.;IÍ?Æ“NéRÛ"÷d0'~Í @–®H»‚w“"Ci/Úêˆ.ÀÒq€-þ>FP&RËļç裚-ZO×ï*%Ô´Š?ÔfÝ“&2`2*–Hù¢@ÉѤŒ]Ü0‚g±â!éi½†&¥CD’í$4ìs†þ•áæøÑü¥Óˆ Ü3€Ž„±æxŒ„d}¯DÝ^Ü!ª6{­Qw9îÆ÷È…"“‡ðãÓ²×iÙçË^çË>Äø:ÄøÅe¯‹Ë¾ìÇë²_Žñu9Æ/“ÿ²LþW/{]½ì«J¿®*ýõ~¸WyMïÇ×aõ{[‡Õ×ÇxTî=}Œ˜{(NЬƒGÛ >•X'ä7òÉŸ µ}ÿ² iÓr"XÓææÒœ-ä‡õô7¥ïpÀœ”Kͧ ØBÙƒó^ T¦'Ñš¿r·÷bfrûçÆ ¥G4 #”'ØÑYþµŸSý~eŒJ£„Žu¶íæn½öퟳ&(·kÏ¡>³Û/™DÈÝEX7 ÏKdbs[r‘‰Zè§3ÖÚdn׺…mêx!Z• úò]¯ÛÚg¡•a6MŠ@›¾¬ô‘9† éozß±& SVÑí]ZLµ!‡"“ß‹6n¹‚ÈÝ¡çÖý_â›·Kdެ"¹Ýœ.ŠåÃ.H,§ž:¯»¦+6qœ„´+FU¼ãüØLK¨nÆRc* «NØ“ŸÁOÃ(?(Ó¥™D˜œë<•×aú¦ûÏ5uJiŠ¥&‘›âZ†7¤p*-;ãÂè+kŽ#"óÚ"™‰Ñ Âà‰»Pö@ï˜gêé”H¡×5î\Ã!ËК}«ŠZ‘íÒxÜ-—e‡"‘>'ÏzãòÀi¤>ª+- `ꑺ݂Ðc$©§MıÖòµ }«£”­I2h£lׯ•,‘qÛºX¨×N…ˆqLßNbSË1y†%¹AÆX)ŧy­5ª¤Ù£ˆ}ËŒ¨j×ʼn–F¼cªQÊ×!±Ÿ‹R}#Aî­0¯…u—)¶¹æ$›íTT^rò“Äx;×G i9›×[çö*]oÒ–ÿQÎË÷‘4ÍErÂ)ŸA(f™9†•ÄUGŒ–CÝþ/ÕÜÜç¨Öru ‹A®.%b¤óh=µ‹¦¡Í8;‰ßk⣴Çô?–™1./:S^XÂÆ‘²Åño}ˆ€©ì‘R²1|/êÇ$æ ð£–3æS,imüþ¶ñ# ‹àÍß4¿¬HëçÜ/ˆw-IÂ*‰Hø¯Z¼À%@'s›ÁÒ4RòÇ ×rù­–|Ø AZ‹ MB“¡´ü}§Î3*fµšã¶ìÇHÍC1]6¯è«]Ù˜ÓËx ªÒ<Å%;ã‚u‚<þ”.Ö€´‚ùe®Éjrà%vÛ‰ÄYËÙ®±™G$Vr Ž±Ò‹/&En{+‹µH}ÒßqLQÆš+Ækʼn{º yŸŒ<ãÏXö£µkVd'e‚Uk+R!I®{se`¹htàm·³XþÐcø·nÆo +dînáta²šwÔ”çYz`v¨9â}mü ¾öê¤4¯$ã´|Üh¯Ò¢‡à·ÑðÕ‰Ànyx\&o(×x»8À°Àëž]ÃÒŠHžÈüÌðu§åRn¿ŸH ¯œYG=®Ñ+'ªÂâŒêóÊÁÒB˜HüA<º¢7 <.ZkdSbìË5Šg Ÿ·Sóª´æE\´ ¶Vì/oNj÷‹Q¢§ž(¥<ªì*‡b›‰L>‘ ¦ƒcÆñ–ËlWÚ ¥õd&v4öH γÊъܨ3ãŸcé`G2%3•Ug‰ÁÛìa‚¥÷Š3^k{! J[bù)¢/˜a”X|)Íס)Xöû©¯A{ÓCùÍÔ‚iL,µ3JH˜~•öqE&7±4,!?Œ{ …;™¯Œê®ÁRSÒŒIYEHH˜î> «YléÔË߀v–[Q¢€” Û8r1ðngUÞ)qV’‹m(·ç¨0\™6íl*„øÉ¾¨„P:gl´2Q¬šË‰“PóÉN´2±ˆÖYs†ò›Q˜bÃsÔË䓺,Šfw(?\jz'i€úÉáÙÿ©5ײ{3ñh`˜°Ò,!²ºG 7¯^bËœXµB)m³‘@^xÝ€¦°dØkU\JU/ ÑvÁ”C¾uz¯R0øõCvv ZŽ÷†¶˜³Ìèÿ«æÓòH´UÇèȨ^ÍC¸¤•âðœÇ¦ç0žœvöî,¤àN '#dUé»8+®nPÑí ÚYýÚ¥Zvì¿h÷—!e2S–½÷ ËžU´ªô¬î93E†GT×ÓŠ ‹š6}”8¬áZ6Q·½Ž dŒ ‡– "ó®D æ¬Ã MÑ–•K<ýëØæm`ä™îà'6²Õ¨–”e0ÓšªÚ¸ı-h\®¬-5ËÛå4ÕÃ«Ž’kxé‹"kì\eÈ`—¨„JПéåÄÌ^ia$3©e{UßÙ ·»®Å޽ÕðXélñ2(˜oÖŽC*RŒœ1U‚‘ \(ö—`FL§Ïá4ZÀe§/8“RKCõ‡^,!n"{?’˜o°ÃJîÐi‰BÅ{çèœoE d‘Md•ìø‹6`f>äZÙnxÌv+¦AÎ(ÇÀ–(0w¦p%&UN€Ò¤ÈÊÙMhŸn´‹)NÂåhØÐ9½ñrœØ¾ï0Œ]~"[-ÂÝÙ{§ƒ¥Mâu Þa…8¢íðc);#±›Ð0kb”‚Ïôè6Çͦƙ `›ÈįLÑ è¹Ú²Œ—Òúçº6¡Ö5I°ûôØi¹yNVEÖühÜMŽ_`Oýku¹fJv?³žñÞ#Hää{”ÚÝ\AG¼e褼ҌO7Jˆl¯í)/t¥B‘ZöR-û|Ùë|Ù‡_‡¿¸ìuqÙ—ýx]öãË1¾,ÇøeòyàoÉäõ²×Õ˾ªôëªÒ_ïÇëz?¾«ó{ïé°úúÏG}O#R sò[tÌ/ºüä>›¢ ê÷[x?|5g¡Æg/•-â  hÅak#b=ý'['ä$ýuH)³ùµ<ÝnïÝÛÏ&'ŽOG:f%oÜÆ¼M÷ŽlÜÏ1ü7Ñ‘C& ºÙÞ«¹™œýô%\v€&Þdécã Ù0VzÕâr±Ax‰ÎRƒå:g°BØîsù˜`6;{ˆjíY·°|×%¨foŒ\ÜZüjë'LÐÚeS.Û˜¹-fƒ>Âf¡QG’/PoèÑ¥eÃ0l¡–åÉ '˜àåoÀoó0ÕРƒÇ¢û—h'`"÷܈¨`Z;­dÎÿ‹Ñ„ìì_ O”ÏÂ㤨¤ÇPÓ¨4 ‚$‡X$DÎlýþÃGœ¡{S/´ðŸôè´Õ:¬{·0*ìÉÇ4maÏæ«å. ¿*ÌH‰ÁÆÜì9Àµq1µç“zò†-ì=—ýH\ߢ úݳ£êtê1,QRñbk½¹üº97jmû˜‰Lœæ¦/ÛmÎË[Ø0¥ô†ÿÚ£#ã“¬Ž ö‘tbù 1…´V ùÉ'HáØÚòɳ‰°¥¸/ƒµ·üW¢¦c^㌠>=ÛÚªåv§”ngšµÑ†ÛB…+¡#rŽ“g E‘ÉY¡XD±‚+£®‰SœY+R1Q»¯õ4bï"e)ʽ¡îµ4r¥‹FŽkòVIâýŒGWÛŸ” "Œ¶â?ÐŽþu¸±‚kœü†ß;_2‹vü¨{ƒÚ`²a¬–ø kÄ˵ÈŸpÏ.g虫¬=·Æ0A”"’òXUC`‰6Bé<»ãÿ özŸ\‚õKV”ߊíé¡9¤TZŒaŒ7þr(QcÉ©0p¬mEÀ5ö2Ç‘ëðòwÕ"pT¼;7Í`h¹F¯åê»”°ïaGi¡ÕÒxmƹÇ*2¹Îâ¿•‘À1™n) .ºí F—JTKÀïϺv«;vüÓÇ ùæ@Bl1O´¤;_Šó `ñ¨¦qÔXØ(!HñÜŒÎkÇð¯ž[Ãî"Ûic +±üƒ¸I.ÑdÀŒuòƒ0JÿæÙi fø`˜–‘… $L8v ˜=Æ‚ÅH8¶áY<;þ(Í9FŒSRiSõˆ:êŒÌCËݧ8/$¯âã²S}(QGì¿j§´w2ô^P<ÏVzuƒ*BsæçnÌqÀcív¶Ù+ê#NaáÄ šieº ¬Œ’鿽Á[PfÌ¥酳6‘RÀ:ÂH Ïë?Àâ¡4æž™KÆzÊ鿝ëþÀì»qt^—Ÿú» µ¾ ?ÊÔ²e:9†H™´±*_WÊIÞ[érs§,æx›—A´ê×Y|I­f2Pí’cå–s×D'_‚JóJÞcÙ%E[vñB&H†˜ƒïi. ]2çÜT@ýª·¬³Fê$=WÎa‰h÷!P¬$ }’6°9œ ìq¤Ô{¹(@ŽSýŒËž® ˜o2°ˆ£øu€EŸþ (Œ¼ȈçN\XAù Šy Gb𠋦§Xkedñ™žïEoø.U´q”ÁŸdQM€d‡—-´ZR\´_U¶£]Uùzžð_XSçƒÓCªŽp‡Ê Ÿ‡}U„)¢VÝC• r¿A-«y]üµÇÊ2ùB±/gwf˜ª¶œÐD¶+3ùHP ÙÚHdÈêÑU ?hþ€Þ®ƒÏzqXI¸ìÄeÀ…{QdØ_Í& 1¾ Éöa;!v_^•Ç´§/¹E]tæhÊ‘8ïüˆdúÉ2ãŒå†û m\8 Tç0t—Hÿ·¨x´NO%#Ë\¹‹ÓJ€ts¢5fâ×Ù­e%ÎÞïµg¤Vz&(·[e.>Þ®,þG‚z&¹ôѳ  Ìv1­x–O-|-ŠlËÄGöuÏ a›o¦F²á¢IiÓ‡²QÉ•V(qÚ~(룚%ÚurBþК¥CÏ*pÛ,˜mý-WuAiG_4 («ÑO"½N-Ã.Áë¢8Ú,kE†á{Öevì©CCZ¿ÈýÈ/‚Œ&^%ŠPÁR°@7 \íìî6$‘Ùc»/]5ÑÔØ"õžKqÎˬsæl]Ì'— Ö[aÀ:¬Ä=œÆ'-ì`䬅›áµ*æ$‡J*ÙxBØku¶,Fön)es‹¦ÆIJ:ëcœìÝu? ®åí::-ïÛkEÓK÷¦8e÷È——ëó²’ÞD£¼;“+çÀ?”3‘‰„lnwJ-´ ÛÛi¯š( ãÓý‡Ã*“fÐ;¹&Ø9]Ë” ÌíÕB(‘8oØ…8N=ÐZOS:ô£š“°Ð0ÿcNŠKŠuÏ™wX)÷ȠȰ¤“a½i”Ä¿˜öåP5J¬¸Áäsïhj¬+Q~-·óB»Y)2¤ ¶‹l‘eÏzE;±¤„–¡e…Ý…ZÍÞì†`‡ç"×ñÛn'ƒýiÙ;µìóe/óeb|büâ²ßÛâ²/ûAY¼%ûñåÝù¼&ÇøeòÏ¿'“ÿÕË^W/ûªÒn¢^S•þz?^×ûñuXù½§Ãêëc<ÿì{ú5Íö@DŒS¬­øC²¢ÀÕ%+vµz·°@¼½+}ÿnN0¥• À‡Qr§& #Ë»±ÒðÉü^ß—Ùn·UüurÕv¡‹ëñæc 5–)%±áGdA,o"«mnŠLà^ã·-gTÅÎa8ó±R¡×`UÞ`iŽ3.NŠŒû.‚a«5RGlÏbRš?\Ñ Ju¾À0í~È#ôX9õÆ;$6é€?õ^';n_vz~T¾‘ ß"YóWµØÅµ I’¹x÷›?ücƒôWƒ÷ØàÏó2ÿ`x¯ÕP9À.¿‚ÝZ>7f¡X?¾ ¡Êv-ë˜`Ö e"°¶k|Áî¶PÓn`0òA†äF*f=È<Žsµ0/í…ü;Þâ?Œx…+ ZÉz‚/·ŸÃ_‡@±‡•OºÃc•küC~Í­ò>9¾„ØÙá P—møÆ‹Š¬+¦žÛûámr‚x¡í1‰÷Ï@å — û‚7$üHÅG¯¯©Ó—a ôE*Ù £ÜLŽâôilæËŠªô34]}&kÜV‘Þ¦½B%­º”~tb‘~*MvÆTÝ×*£ÑI‰g<ƒqæ¥Jð—Óµ¤E«üH­ú ÆåΉ¸PHáµMØ”R_4èbf=XÕe'H™U‡Ãé¢t–xH¬£3œë!rA œ| L·þt‚ÉœGÈoìv\„¹†ð˜ø0úÓ`±]®´˜Ñ°Ô¦‘{Ë}§E¦ôP ƺcòE®MáÕm¹…³á"§ˆÏHéäK#bÜØs–ˆÅÁ8¿ :3Æöêæb ”D®ÌXë6X\Ž%óÚ¥‚Éìù‰-ú Ä(ßhÒO–=>âuõš“çœ å±Éêœ$F-ålpñT9Öªü ÈüuUép˜Ö¨ØÊG¡‹gd^Ô4QO%NÜ”Ÿ¹Ÿx < eLk*¾zžŽšÏ’À'Ô>)%°ÐÅÌ2¥$®Ç5ÓòZûL»óøÛŒ%ô”TÅÏÝJ dU ¾e¾ÛøPVÂŽ`²°uŸŒ§…5Ñ–èà«f™I ‘ž.UôPl釀è}D’$ç3™lÃJxÆxíš~tJÜÃt È÷B Fª5ÆÐVw/€”WO›ÞPÈž.?ñö)D/GHŒ°,ÜóJ3œOö©l·Vã—~Ø7ÇÔ²|V7X’Ú‚“Bwä¨D1’+ÆŠiá¢Ã±ü£"¡JÄß»yçn(ƒ¸n+ê^D\€x‹þ&¯ê;ª Î96ó@·#)?|d\!ž©³•ßf$¶°fù?ÛÕô0ù+oS~óÜ\‹¸1Æ„¡Ø ×F€|ëé0™n;n-a…4s$½r¬Æ‹|à¼)^ñF?Åbö££Ë$6hay- CÓ‡—±,Y´21†¸jîâD)ÔóÔZóŇº£q¾’G‡‘3…¹OvÇ„¹—×s‘/L×úÆrvj!SðAP}ˆ1Nô†"Ùpy{µZ&_(ÖùˆåñZÖ_YLd™|Ø«À¢„x©LŠLps½Æž/B9qé,#ëʤIÕKœPîâi}x™ «`âb^X4I‚ñšu{–Y®îÙÛ¥¯»6…Ë?ÇÚáaf÷K-ß¼ûcTõ2$b,¯&(ÈŸ^Ã]ÿ@8ãU¢Þ™×öU]Ú‰56E†»M kxïÇD?Œg)ÑFUcåœ ™˜Ë”Žü¸áº#F%r(?‘¡p/à¯×?£¬¡™©F‹âw>HÌ d=Ùv)aØ:»”(RO‘M»¸Å,08½µy¿œ’ù^éR}§-œycéÙÙu:ªésP-ÔåÓT•u#,›rêÙ©½;{ѪË/ïæK„ò;¢‚rr}†áë2QË)ë(‚Ú¸äÖ°Ínð»"AÖËļûVðžef*21’‹"5·(±xÏžõÍÔHê.²ÕIäCµó±ë°ûÿF0µ¨ücÅpŠ5K-ïF¹ìi»‹Î*p¹ÑI×Òi|RXC§êŠh6Å¥}øyÌBe6 :ïë¬qà­¸Èj±WñòiäYjR5x†aÛ3úàD±¢÷£ç£^å‘°’¥¯;´Èn Öt†a!A¤ÿ³µªÕŒj ;”ŸhªÚÞk Ó:G¢/[‚£¯¾‹{gí×þð™«;)7ÍÀ’:¬$Œ:ËÒµjTeÎzºBdK~bšp@b–¶G´:µÝ¢ÚŒu’ÑÇ(Ÿîì‰×^ѳÙòH=öºË­9»Éõ†{Ç v4¶NÚ±ªE(þ³Y„D¶³V‹ÃLð”I`"v6 s$±!2 VY3÷å'VmyçÓ²jÙçË^çË>Äø2ÄøÅe¿·Åe_öã<¼'ûñå/¼&ÇøeòoËäõ²€Û/©—}Ui¿ü¯©J½¯ëýø:¬^Øaõõ1¾®qX® /LQòd{[!:0 ¬B<4ÌWã„ìa%¸ÉËf¥›¶CãGˆÌu¸Ò–­6ÀƒfÆp¡ì¡o¥Ûµ‡‘·}5ŒuµÒø†µaì“êÀ©u»“} 24fŸ“Üé¼Î’kçt¤å¼;«bå­’µYy€&$eþÇCÓøûÛù2ìG«éš=”ªË¢ð g·•‚Ø^'gž×!÷kǰmòwÒ~„/«^’… Ú–\’Áª»aLJsjbÒ¾­ˆew?‘s)~B¢ç0öeåÿÖïwθêâ'üh¡E|Ÿ½âz{˜Uí•àa´PçišfÉó[ó¢ ;ìurB‰r^¢Xü m'¿]9Ô\âKèhëYnÃ?8[)I=¤Tt M²’×eÝ9aÇŠPξVšë\¨Çæ”›ÿ(-5xÀ,±¦ÓðhŽGã©¥‘7aŠNT²ŠˆíŸm ¸¶‡¥# “"ŸR¿àPäeR‘åíç0Z÷K &ó±(°tçs(ØÕ]ÎøºÆÆd‘÷@ÚÔĘÂcÙf++ŠN[¨ÈÇê<óyC×uhxÁÁnTÍ5V£Èf²è|£Ê N ˜íŒ{ÓY?H ñ¤‚ üÄæ;—?È¡.þÔÞçuнu¿Þù£¢sön±(cSÎÝ– 3×=†«lÍ Òb©Ch£j£(c=Ê çS´¼aR¢ZL‡ ?”œ[£”«nÊÅ6yø—‚iIs²öЇîN±‡ayN{ètP.³)È?¯C!ñyÝÒI¡#ô¦Q±ÉE¨DµO:€l"ÃrŒuD†MCc•ö>ÕÝ]21ÙjuP±«-J[£IØÎ¼îÍHÃ\-ö>\«Ù¾ ÍS:šd×Å âw?ðÜ[w;‹eË eÙTÍYt9‰}¤¼(Y±à+¾ùâë.Í~^§›óGÈCäy®ƒÒQ•ã'­HêSt{ãæë’ ›ÈD²3äWÚ±"À{uŸHUÖ2>Sð¾ºkGw˜Ã_Fa§ÚÍÝÿØæÊå±Ó†½êÓE&1U˜ž±W¥…Ÿ¾iý.Gå¨}i Ô¤Ô-$µìՉšÊ њÝ1$!1cw_†p×ÏñÛн½Æ™ê,нQÇnzD™›[²¯rþ%xûfè}Zé„:‚ÜÌ:ÁWëçÞé@f±{gc÷ ù °§üZÕÝaçeS˜©ˆåpyXå6@ëf[œ@ÄÙ†ÓD- ó×ðXK{?ŽbUà]±ÈPÅZÊd—º´­(Ì,Yéݵt8É—ÖíSwÁÌêçð3€Ÿ ëÝÑæ‘<,]‘ fêò0<× @Ë4ºË¼é T¼Ô¢À£Ò’‰Z¨_j%“rضÆdÀ„}µléÔÒÞݱ«fù Pvˆž©€Fgt hWš¢ã ópu5Àh•Ÿ®¤"M×N77íî«Èê‘ ãý8¶P¼}`²6 ï±XôóéÌ´°~Y«¶Gd *ãFNz+.¥’{@< ±wrQ¬¤yIûï!ÝÔ o€(ܤ.u±º”zÑMÄx@qPÙTdº»tLÿ½e]lö†^-PÖ&6Ohéñü¸äÎØÝ°{¼• ÑŽ?Y#P P“߬&ŠaaìvÉ.ÝkØY¹™°Òu@GZíáå¬É­dw1#1$h"«³•î"ÃR°ä"'N-ÛÙ2µL°Í\(€ˆŠ•mס#A:*²Ýk ‘ Ô:ùÂUãu`/i~àS>÷vQlc³Ó©ãFp0 W¨4{R.¡ó†:E¶%†ìî|P#¦ú7þ±E˜v Íö¢A{·.¨æ¶P¹PÂJƒæ.8šé"Àíÿ,’Oý¸~hºU¯Èšö¸‘µäVr ûÎs3§_"³.Ä#²1’çq?-{–}¾ìu¾ìCŒ¯CŒ_\æ^å5qÙ—ýpøšìÇ—ct¼ðšã—ÉwóšLþW/û½­^öU¥Ï±¾§*ýõ~¼®÷ãë°z]‡Õ×Çèï~Kãsw ?w·ðsw ?w·ðsw ?º…Ÿ»[ø¹»…Ÿ»[ø¹»…Ÿ»[øùÓ-üÜÝÂÏÝ-üÜÝÂÏÝ-üÜÝÂÏŸnáçî~înáçî~înáßÝ-üûÓ-ü»»…w·ðïîþÝÝ¿»[ø÷§[øww ÿînáߟnáçîÉîžüçîÉîžüçîÉþôä?wOþs÷ä?wOþs÷ä?wOþó§'ÿ¹{òŸ»'ÿ¹{òŸ»'ÿ¹{òŸ?=ùÏÝ“ÿÜ=ùÏÝ“ÿ»{òwOþïOOþïîÉÿÝ=ù¿»'ÿw÷äÿîžüߟžüßÝ“ÿ»{òzòŸ{òå¹'_ž{òå¹'_ž{òåù3ùòÜ“/Ï=ùòÜ“/Ï=ùòÜ“/ÏŸÉ—çž|yîÉ—çž|yîÉ—çž|yþL¾<÷äËsO¾üîÉ—ß=ùò»'_~&_~÷äËïž|ùÝ“/¿{òåwO¾üþL¾üîÉ—ß=ùòû3ùòÜóeÏ=_öÜóeÏ=_öÜóeÏŸù²çž/{îù²çž/{îù²çž/{þÌ—=÷|ÙsÏ—=÷|ÙsÏ—=÷|Ùóg¾ì¹çË~÷|Ùïž/ûÝóe¿{¾ì÷g¾ìwÏ—ýîù²ß=_ö»çË~÷|ÙïÏ|Ùïž/ûÝóe¿?óeÏ=ÅùÜSœÏ=ÅùÜSœÏ=Åùü™â|î)Îçžâ|î)Îçžâ|î)ÎçÏçsOq>÷çsOq>÷çsOq>¦8÷çïžâüÝSœ¿{ŠówOqþþLqþî)Îß=Åù»§8÷çïžâüý™âüÝSœ¿{Šó÷gŠó¹g¥Ÿ{Vú¹g¥Ÿ{Vú¹g¥Ÿ?³ÒÏ=+ýܳÒÏ=+ýܳÒÏ=+ýü™•~îYéçž•~îYéçž•~îYéçϬôïž•þݳҿ{VúwÏJÿîYéߟYéß=+ý»g¥÷¬ôïž•þݳҿ?³Ò¿{VúwÏJÿþÌJ?7#Ás3<7#Ás3<7#Áó‡‘๠ž›‘๠ž›‘๠ž?ŒÏÍHðÜŒÏÍHðÜŒÏÍHðûÃHð» ~7#Áïf$øÝŒ¿›‘à÷‡‘àw3ünF‚ßÍHð» ~7#Áï#Áïf$øÝŒ¿?ŒÏÍûñܼÏÍûñܼÏÍûñüáýxnÞçæýxnÞçæýxnÞçïÇsó~<7ïÇsó~<7ïÇsó~üþð~ünÞßÍûñ»y?~7ïÇïæýøýáýøÝ¼¿›÷ãwó~ünÞßÍûñûÃûñ»y?~7ïÇïïÇs³ë<7»Îs³ë<7»Îs³ë<Øuž›]ç¹Ùuž›]ç¹Ùuž›]çùîóÜì:ÏÍ®óÜì:ÏÍ®ó»Ùu~Øu~7»Îïf×ùÝì:¿›]çw³ëüþ°ëünvßÍ®ó»Ùu~7»Îïf×ùýa×ùÝì:¿›]ç÷‡]ç¹9¬ž›Ãê¹9¬ž›Ãê¹9¬ž?VÏÍaõÜVÏÍaõÜVÏÍaõüá°zn«çæ°zn«çæ°úÝV¿?V¿›ÃêwsXýn«ßÍaõ»9¬~8¬~7‡Õïæ°úÝV¿›ÃêwsXýþpXýn«ßÍaõûÃaõÜLqÏÍ÷ÜLqÏÍ÷ÜLqϦ¸çfŠ{n¦¸çfŠ{n¦¸çfŠ{þ0Å=7SÜs3Å=7SÜs3Åýn¦¸ß¦¸ßÍ÷»™â~7SÜïfŠûÝLq¿?Lq¿›)îw3Åýn¦¸ßÍ÷»™â~˜â~7SÜïfŠûýaŠ{n>Æçæc|n>Æçæc|n>Æçãsó1>7ãsó1>7ãsó1>øŸ›ñ¹ùŸ›ñ¹ù7ãïãïæcüÝ|Œ¿›ñwó1þn>Æß>ÆßÍÇø»ù7ãïæcüÝ|Œ¿?|Œ¿›ñwó1þþð1>7ëés³ž>7ëés³ž>7ëéó‡õô¹YOŸ›õô¹YOŸ›õô¹YOŸ?¬§ÏÍzúܬ§ÏÍzúܬ§¿›õô÷‡õôw³žþnÖÓßÍzú»YO7ëéïëéïf=ýݬ§¿›õôw³žþnÖÓßÖÓßÍzú»YOXO?-{£–}¾ìu¾ìCŒ/CŒ_\ö{[\öe?ÎÃ{²_ŽÑñÂkrŒ_&ÿ÷¶LþW/ ¸ý’zÙW•öËÿšªô×ûñºÞ¯Ãê…V_ãëú÷¢ç†m±7A|ÏâIŠ˜ôòeçð»/Bz~Œ”°d‚E[µé°s\¹ûO6ìP¥ËcUýuÓ7‚,¤+Æ¢ÀX\aÐÞ›©Û‹k¤äs·ƒ$ÔqKTôç9¹Üb”z?òCô<]ËpL9»Â¤•ÕÎÚ¾Pz\Íp}öeEÅ<›ªËO\‡Ý ·3€`9çf ?»–a®cÔhŠC¼œx[˜ñR§êZÖÑà=sœ²¹œì€í{û{KäÚD–D~‰e4™³JPľÔëaü;4ŠIàãoظ]·ü³áåj[ÔàÖwu³\ùvÈäæ–)m~úˆƒ75a-gKFÌ>Û¹:ÿ1Ï]ÓtňETè®0AT˜¾LÔ´Å È–ê9+ µòŸ©ûmÌ(ªÃêÿŽ‹Ëô éìR’8ß㛡•ŠI…±Ñ]»ŸÙ“íÓ)cñøkfZX}uìë´0#*N³Gî ³åY¯5¶wÔmÇj¢ý.¿1Ç$–³8éåúlÍcQkC[¿›åàŽùë‹]´Ùƒ4äIX¸ÒJ‘<܇ÿH>hÀ%!?ù±k!µåÅ— – -ÎÆ$º‰vöX(“Ÿèý±ÇðÜ£»UÑÊÉh¶ôL³60-Hí鳄ŽÈ9Nžñ™@ð E Y¡X(uàíäEÒŒ…q9¥+2ßcQdÃÿY±w³ xô…UÐv4˜3qø‘\“ç°Š‡»ˆhZ”±fIÇÎê€í)_*EÖ4ÿÅLÔF Æru?a®2ˆ9å݃ÂcS<”Ö)3á1W÷ …àË2 –ÉOÆûaRÝ¿hIÄØÐŠ$›ïdJoGŽqYÍÇsŒ=Jiyp÷j—Õ£¯¢7 ²cEöjŽ><“[1'ß ¡f¥üvª‰×¡îÞ$JÈ&˜ÃŽ,Ò,Ì©§ã-ô¾cúFîg$¢$¸´{8eF׿rzr9ÜîE¡‹ƒ÷õÊ5ÑæIÄÞ™ý•Í3äÙ#9Z³`Ü5¹E µvd‚÷lˆ™(ž¢ù 7?ÖNŠ0ö•cm\°‡|Zö\¼á¹ –a?ñ•ZãO$ºŠÜmRJКEðç”ɰÅýe€ÇËs£–]=y_DÑy^¢ÛQ½¥ð¥ƒj*¢0 Á¼W¥q {F&_î´¿4EÓCî‰InÏà 0qÕT,2k£î+s½‰Ž¶ºÚÃ’¥Éü¥ØŠì"SË?ˆ›® ÞâÊ#ÉÂ(mãx:w_ì¶Æ¢æ)z¹o˜jš\‹zµMÛƒÀ!…Æ[L 7ÔÌ „’pç è;Si¹ùZ¨TtZ¨–Mi/¤Øs†YÍâày`Z_bÉŸ0Y”, Þ¦Èâ%JsV_/*xäA…A±$ìl‘0ˆv¥-(#¢™V¦»PÁÊÛRÎí#¥ ÇÂÅ«ù¶6™¨`nK6XJ}ލu,Ád›j! ãÕ’¦#ÚçµT&ﻆ{øÆ¿ºÛBÅ9ÆA¦¯šÇþG#vÏ¢>Üïþ“UùºRîíxm³‘™¨æeÈŠ‡ƒf€ÝÐsâ?Ù%GUS rÝ.¿å…¹3aX| œÔm‘`<Ê2¥F#<rû)ÛÑû±{ l*H”¨Ó>ñ²E>‹‹Ÿl’”æOÀV´ ˆ?§{Ìë^Ec¼*ñÅéÔ‘_pMÓ/ÍAÆÄòë°•}†é^Aa,roÄȸ°‚ò”ø$IñQsÌ¢#;wn\L; iáa\ÿàO*ÇÚP0Û”ì±îJw¬!¿½£¥Øü•ú iñS0¾×1QŸLŽt¿Ð Ÿ‡ô,aЍU÷PE0º\IjY=á„)Ví÷X¾ÐæÃîmЭÓ/b"[Í¥TûŒ Üi„Xw‡U1Š„Óû!Ǫ :–aêv½ôG./ëÜP\¸EæºéÇ*Æa±$‚4Ùñ´h½Åþmm*Úû!ŸO#ˆ±`_`"ñítù‰fw¿¢£Gc—Ä…ïÞ‚•)?1Úî'Z§oB(N¯—)ÿW¡›¥ð ž²D1SÚF7¤kýA\Ì ª“ž‰Êí–0쮎>ÿ#äZ‡{,P̈ž)T²¦8±<”Ë6b¯#²=JæF¶B­õî ¥Ã’ ×Öë&Ø–ý”Oï•!Æ®sùg³ø4ŲÁŸÓZÛ¾À·ËŠ~YaÅ<7Ò”vôEZÅ´ÒOŠ%¼¶•Jü~]GÛ€…-//À6dIb•Õ>>Ê"ƒIªù´¾2Úèå·‘ÿ˜ÈÄ‹t‚¿&@€NEÜMr- tÕ\(DG!3eÀ9ým½úƒ2PÍî`jŒ>Fqsñ÷ïQdµ,fWTǦ¸ž®­ó I‰>FÌÄŸãGöÊÒ¡Ö!—\¡#«Îê°îçA@þ2$oÝ?ò-¼ÝÄW=:äú‰i—ëó²’ÃûJ@~1Y•î¤ÏD&²¸Ý)µÐ2ª‘‡@UŒñéž=dŒ¼6;7ÚÌGíqÃÓ¹–Á ,·W ¡XDòY[§Ât%g<›Ó¸Ìv³Ð0[]5oa¿7Æd‡\k†YTd³sÿ#H”ö¦QBÛà¤Èäˆ÷é)IÍ.Õò©úe뜲̃©\nçBŽ÷vÿWnŽLÐÉ:¯ÍH­KJhZ&Qºod^ÚèˆÍWsê–^#~C3­ÃOË^¨eŸ/{™/ûãëã—ýÞ—}ÙÊâ-Ù/ÇèÎç59Æ/“ü=™ü¯^öºzÙW•võšªô×ûñºÞ¯ÃêÈï=V_ãùgßÔÇ(Ö4&_Ä3z½ü³­ZÉ9¼É\—Õ”…Øé2xÆ¢¥+0çl›– f6Æ`ú+ ÊíkºO©Þ}öIÐ X™v6á \å°±¥ò¢äå÷N×d9^€g“Û]Å«ÆGí£Tz Gêö3è­H¾Û¤ƒÍÙ¨Š¸‡hð®Ý4]凼çÉ¡ªü$ú®Ëß-¦Ë‡4±•}.@rÚAjƒ7²iùßÞÇ(¦:ÆæZ•F¾k#üïò ^IñÈ;¬ß²ÿsÆÈû±¶¼ Tï>gѳNr„aĨÙÖ*ooh%FìaÖB˜­û¿ ´=6o—Àh*­ˆLÌ}™D†“R©Å'u»&`¦"&Z’ÂT>k£a”Ê¢¦¶Â}ŽGËA–ê-þ”ðÓ}ÜR)lO $ðÏ—nwâ¬tò&ú¡câ”6 ,—’Ü”hÝC}§’Ëå|0)K‘­Ökä‘j‹ü‰`÷ßJ¿í Ÿ{oëgŠÂÀL#„^=ÐÐ;TÇIWèʂ̕Rœqš»ðøëL…QÕ8ƒ4–å*³×ïÚ#™‚‘ƒxÝ´…cö#‰9rÄ|¥Åèçè+Æ % ñqmÕ²íàå›Öyxê= ä€5öàŒÌ±gÁœ>ª‰3b˜Ågª‘m¥ºüf®ÅµlbEG%`—@¿Óâ‰B—zjq( 5Nª…¸‰g<23ùº…Æ8ö=t®ûŠò› hÏ]à!n@ÅIçä\}énWiO®W$jzvÍÔJZõüÂ;„ûþ®ü5Ëï»Ü†N—l‹¥%‰Ê[dx^-j‚¯AUšµ{r[ynr¥ÈDÿ<àjêB·?ÌRäc ¯t¦"÷jÎú`”J?ÊÌ•ãØÞ’£Î£Æç®9ÍÐàR»«#}Ò߀q‚¬¦ÿt¡s ’Ö"÷‹eEžÖºZãå¼f‡ Äò _ !5×?¬užÝ65ö•cl–‡7ŠƒðëPöò94.L†½œR >lŒ®‚MsU¡Ád×ÁÔë¬Ì÷¤4Þw[m`ö ÐfùCÛ%x“ú^ªvËc³Ð ‘¥—xmVé‘|·“Ö?%ÎíTº4Ò©Z B1/‘an,÷øI-Þ~¬ZN ¯H-pÌ+­/ݳ”(¿­ ‘?9±À—kÄ\#ÍöNm22ϧŸâ¤+Ú*”vZ†µ9Q¨ù‘Ô¥”£^¹¿ž1êN B¶ìxùRxL(­gx‘ÌÔ¢ö0‘‹<¯[ÊŠPý°ºˆïnsùíÒ%;3:íV06s°C'Õ}ú‡Ð|ÐÒéMÒ¾§ÉDÏXPʱPÀ=€ŠnG-guòØiË‹Ÿ0)Vþ6O;ö8³Äº±Gú_.uŽv¶F«{ÎL‘áã]MUÞË…Äø<ú(pä¹–Éy¥íÜ*ØŒå|w–<Ô zxúZh™ ²y~‚(¡9¢sFq¡¿7¯¡i㲤Vc’ÁCçÓ_ö:_ö!Æ×!Æ/.{]\öe?^—ýørŒ/Ë1~™|ø[2ù_½ìuõ²¯*ýºªô×ûñºÞ¯ÃêüÞ{:¬¾>ÆóQßÔÇØÎ<¬µCo¿QÒ‰ôõ$¬öê…×9k-,p»&_òL!% hbÂIÂÆX¦$W2æVÄ 'ªÆÛ3_‡Ý ¡´sÄÀ›SR÷åiEDÜé¶ít›äîÕɽ«®Ë¡r×d$ФdEŸãŒ‡í}²nañJ›"(èΉŒ]EÖÙ|ŒÕü5$Të%²Q©Ü≲YSYYÆÌÝÿ9Ãyþñtí_<$~J¢-Û?±ˆ(©åÚE ÆýB&õšNAv€ˆ#µÛÀ[¼ã¡­˜0LÍᶾႰc—s«5,rcÖTnWµ½d&2 O™½Ð¼‹º¸ûZèYW$Ø-{µ~hnÔûÅ6Ý@Ã8²aÃ0.?U \³€ÏBû¶ÌŸÆQ[£4¿L6™KèÄa%,j+ÝËØDÐ%6°çµ÷±õÅ4×Éo ¿ÀíkÏÙ\ž0ÖL•ðc‚¥9Îf3‹j\ßò*oÓOŠücí…€«M“)wz„ÈŠçåê#æÁç[0Ö½ÝÆaÏðÝa€y3ó71<úo‡¢ñ£Ró"§‘_0›“ê‰ñ–&3¯´ðœd—n0WÆk–®>ƳaÊ@TöÑOuû2Jûòör…£ü…gÜÅñRJkŽˆªä·Ü-é÷\פlK#bßÕfdTëê;üHõ•zšîmWº>Çfh&77C~¯º–M>",Í‹pl“»ÛE3ÿµAâFnê}g& uµF£+(îÝèÎ?Ô•‘À3ùºWÇ-xÂü:ÀùL¯ Á~§õA ŠW›Á'0GÔË$¤õXT‘¢D¶S z T-Ú=’[Më/ÂO´(²¹v£È0ÉxuX5B±Èvö”{ÛeÕ]£¼áówš‘^rµ#¾Ð_‡IÙê%-ôyïòφ‡ì¡žÕÁ'ÌÛÞûa9¸S¢žˆCå»_ˆ?å(Oo•ùÇz`ª¯õC~ˆý52útœ¤×Rñk%{çM×ÜaT¥‘³fÅ&ÏâVRiDbå#òáf9ý0êÿZkD3ð)Rc‚¢ƒ#(µ]D!W·.Ú1Q‘­m5ê(ò¿{#–Ö1ý'øJk„%„H •iÄóÙUi=gbÿ4K /=Æg§vÓÂÅa%&eœ7`ÍqöÈ®‹(Öb(ÝÅ{eÿæ€õ^•FCŒW¼Ÿ)Ö7¢L~zw°`¶z³ V’fW¹*)±º~%*àšÓ[†”…nQÿÒ\a%ùGØe1Ì„½4Ô€ÿ½*] §cQd˜·§È$NÌôXØ8ÇvìSã 1ºL¼ÎÔè|äÞ̾¢Ãª›rŸÎæ¤aªÛ"ûy6o#°+–Ê2‘­1¢G«/s‡ƒ¬3F:t¡ ]:f‡Õ†6Þ«ï%FU‰½Òå”O#H9”t„wõ:P¾ KÙ(J'—Ÿˆ""åÛÅ6O ó7QJÎ [S!«Ÿë“”zÐÈCEy#•B÷%&<ˆ2Ë̉¨N0¾cŒ zžê½ˆƒzÔµs3+yúWtހь­‹¢ög§º•ߺ‹ tæ‘M´µv¾®œÌƒõ1æäHìâSâ}ƒQÉ-v´÷±û¨Ftè ¼)òKuýË;:¬à«½·1CÛ‰,XX@HÌÒ‘g¡•;D³åø§Óå’å›Õöd0'~í"ªÝiG»@¯-G-+z˜€Ã ÑX:˜ÚèÍ[¢ c–à¼lÓšQò)r»-ÄbÕî-¥`T2Â0K¤|NR3LÉI8±Û.…»¸a”iVB<å€H죛;Úq’¥ð¡ú'1Ç1Ç?Í_®Ì3ð@çbG’ˆtäM+ÙOMÙ€%ð#½d§¹Q²‰Áøù"g<+x?-{©–}¾ìu¾ìCŒ¯CŒ_\öº¸ìË~¼.ûñå_—cü2ù/Ëäõ²×Õ˾ªôëªÒ_ï‡{•×ô~|V¿·uX}}ŒGåÞÓÇX1ÖV†K Þâ|Vø<ß:¢1Ñ<·RÉDKÎRêûö*12î°YG„ NŽ©šló;ö:ŒÁÇN?µ ½”hý‡UùnÑSï#^H¡.Ù€jú-´Á?ª\:Ê­_iÜÍÇ÷s¥‹Ol^ªÛHàÍ\ÅCÐùô~ÕŠ*:oqEæoÒç‹Å_g ]±Ø—'›”EdÝ»…EJl² _â²ÎÎívÆeL—Z™<”2jƶ‡OÉáŒÑMKÖV »äºbŽÙôe˜Ä¡—[J‘»Äv ÜS4‚ï2c[ôå’_K•bN¥02—ã_#SdøàƒZ¶ÚäeÅ­æ ãÉLkŽGƒm¾¬ÖD'Õ<ù¤– †1'oÝ\8nIµ§Øž÷äOÿ—@a#WöÏöêĘ38ÙL“Ò¨KláÅŸ.æ!NAmœ]½ðB)sqôLˆ®; Ý—“ðÉÕy=øº)ÍsÞ+JŠtšü£Q2€O ýëkÞ*G< ¢nK±ø»¸}g È [¤!JºÁíêÉ>ÛåP»2,eyfgº”Fdt>´CC*ä°óm¶)á{—E*Fd8üÀšžkŠ,q[oëL—Q14‰‰}ž~+£^XÙ /€ë÷ÍRF Î9áÿÎyEˆœìæÈ²#2H±‡0/Ì)ªyAؾ‚ƒµ8¿P`«GOFþ) ‰‰Ûuf²0ÏD&Qze\K9šâ°TŠVhãˆdX§S,,lÖÀ°ûô©[ËÑû‘“¯¿Ý¨º{ç6·U7™(ªd"ÆŽ Ó¤ÒÖì+-5Gœ‚*IbÝØ38áÚA£§Êú¡Ö´hŒ4‚vl6KW*Œ`ãCõzD„+(ÓŽI»FÉ"œŸ3ú+¶QS±ºs±©ÂôÊv‘WâOÖÙ,n»\´cëuX'O·ÍJ¦r„dº€5X ÑQÃV'ñ^þéÐ)¸k0åÈqoöÁåUƒ(S48(å#8Õ6_r¹«†lløÑx$hãÚn‰"ëµEXÕxQÄ8PËäå°.²]{,€Ü‡Ì투öI÷…¤Y ÷¹#&Â~æä¶0EÕJ™¬jÅ&XOQÉfT+9ZOÅÜ9ã:ÉkІ¨²wYJ›¦«ÈPŒV.±<<È$bñCA^…båÓ'f}p=E‡\^.Uàý´¢Ý +ß)2|¥âÿ¨i%E+5½ïd‚®&£ 9+îãEÇk9èæÛ›Á\ÊK~ZöN-û|ÙË|Ù‡_‡¿¸ìÈâMqÙ—ýx]öãË1¾.Çøeò_–Éÿêe¯«—}Ué×U¥¿ÞßÛz?¾«ßÛ:¬¾>Æ£rïécD”í£ƒ‚No ÿB,^\åê®Çqãê2‰ ±oIqÆ"Ìtäh•Ÿ¹îL̓8G|J Ax¡´K`J8©UÂ"YDãÜ*ƒ´¬ëJ9ÏH ò¡‹c"„ª›"“ö¦ièvî¼’"äàâN‹‰yATãtôâvÄSYÈŸÍú´a,Óž½övíéÉzè›áÙi0Ó¸i—a–n±…­…°ÖS±Jaä>TF‘E)í]¯KÍ5=@£ƒ‰jÆß:/»Ñ$†‰6ü–rL[´Vth: £È½¦²ü†Å° ­$Ö—…¥ž#”6ûâ!ÅZâ°¢}”êtÂpR¶8£š­¯nRÀ’nIkk¢ïæíŒÛ…ÆK,ÙyÚ³{sÓº´ðq¤’mûWÛYNbÞëË$öx@‡zn€Æ#*Šþ­bñapùJ»Ðê”UÓaÖwx 2xc½Úņ/4ñ÷Ö¡Ù0±¯Wºö‘H49"f|c¥à.§ì£ÅT (Åcг^ʈd´û2¤x‹ONh8‘øe÷ÙÜVOç}š<;äcøØ¡{ %Ž-þ:ˆÞáéØÄÒÇì6yœ¿YxA÷ÜŒŽ;ÅôT;ƒ4úäÓíc@u$b$êRÎHl^BìÈçCÓmg×9oW­mQ0b§Aþ.m2*Nƒ©¬¦Ä®eâi÷j“XSDÙ4>›§)€Ëƒb =2 à8ï®XydO6 ßx\¥v²1Jœ< ËÆYR°ˆÌ3/]“K‚Á6çËR®ÁÁŸ÷ž/çÁ)ÎUOAžVò  v4Å¥6Kº¾` šÀÓ^É»Ãàa.œ¢Èø<ãÑKbôœ›×:0ŒrÃc$°«Ê1e)Ú|mýYc‰M7 ð:ˆKß|H˜»äGEV7¾Qã¦-Ò ÎðíjµË~6+UÆÕsnׄT¹WA@«°}Å7Qçá äè~çúòÏ\nQuÂ>”V­ˆËà˘ð—Æt{<–MÀ MÁº1)T|§¥%~bÿî>Ç)óGvv¨#óŒÅ#×Ç¿B0£õHêŠEÏ|CæHbÀõs¾LWtd&¬°ú†B—ãŽ#û#L+¸õË,õ²™©®›¨Ñ%¦jA!GÌÚŠóšñPòöj‰Ž–G¹Y¾ƒg‚7|µ§Y€9§§Y0àÄÉA̯֋/ÑWÄ µO¼µnå}™×§v+‘o^ÎÓ{,Q6’Äným¸±HÂ3Qr©óöü×@E#X”äùOðGyÄ& FÏTו¹Z£ÌZ×½¶0¥»èç Ç`DF÷«”túÚ¹ºY|Á°YšríäÀ×äŒp1Ó‹øðX½.>Tn„RBߤ£òsœýÛ'‘h¥¡íxVãïç9®ÅŽc©X¢>1€,n72L¢Ï•J±Û¸®¨'ò rõNüÈ1 åö &¥ú?„+ɤ ƵOÚ[=íN-óuAnÞ1ÍŽsqÛ¦¨ã#´mÞ"G±(· óõ‚<“¨>Ø·Òâ!;Q‡ÒK°&‰ár1ëA"!Èw£!aœž@ìì)~Zîp~ºÆ‰–~LÙS–º:eG½ £Ò¡X1·^1S«¬öÆÆ[ù‹Âë¾Çêáà³À ¦ÆZ?¸-5rM¼ÙF”^=Å’‚Vâ”;í="ûF3ÐÓ9~¹hA1ƒN”6Ĺ(°Wþ±Ëí àö¾ ™À%Í>.>ˆ–’_IìqìâÔ¾ù (3­/0 L«D|•Ø-ÊáG×+Ìar~SåDšÑ®“Ørb¨üâ?ÁA*Vö¤Fiz"\ýˆ|°²,4fõÀni[0`µgÑg¶{ˆ¯Žž‘ÄÕHPΚGk÷XÝå° 2¹ÙV2`u’Kj!¾Ðï't ]9~ü³S}º’ûcÕ].‰õêl˜ÿ Ò…Ñ— ‚ñ5ºoPd‚µ¢x¶óöŸíh?©½r·XÌÖŒº &¬]劘w§Ó¦¸Î v¥Lq£ôBo1òÅ7÷½!S‚Gå IÔ{-•/ûÕ,É!§RÁpó¶ºÓ(2¸²¥l¾àX®r nbùMlMTb–û ¥Ò<ÌCêh§K0»zSx8£“GP]¡úÖ]~¨o¹kLt•:Ìi2óèQ¾‘DgŠ„ßÝ_‡y$Æ ÈÂFÌ׬ÁÃDŠBjÙ³Dô>c¢a6˜SOQFî¹]MqyÍXy%Þ¾„.É^C~€f4+žÎ¢ÃWzˆVÔ/Ú"ÁœÅ¦8HöFŒa”PTiqÆáo&Ruîb*Îm´ð£>x¡sqŸ¸Œ ˜[÷ÖEìtvŠ ˜â^ÜPJT²±(ÛE6Qµu$,fÅM—gvO»!”#¤ $ÑûÊ3©5/TŽ 'ÁšBÜ—AÕsÄ ¹\¶°æ]¤m]Š5²‘,ØC?o&²±/¢Ó¾ƒ^Np‰ói„¤BÖÒ+]ÇL¬—)3)+Ç É`SÇBRÐkÏ qgŠš²\6kH€ÔCdÈPÐÎ –ñÖ© >8·ò·uj™ØÒJùeAù…"çlq‘´ˆHi¥SÚû´ìZöù²×ù²1¾ 1~q™{¢×Äe_öÃ-Ù‹²_Žñu9Æ/“ÿºLþW/{Y½ì«J¿®*ýõ~üÞÖûñuXýÞÖaõõ1‘½§±iÈÍÎt1…Nä:t:eºÈZrÌ©"[¡r%5lT‘]´ßø—BòŒ)êUÇZä«EÄöKd{F÷¿ÀÏBó7Ä¥ó3ˆb­Ùh¡e©Þ¹ìÂþýÓ%ZÉZV£b­á6Ÿ»Íã|H¶Êx™Ë¶eXÍD»|îAÇñÖ9}9»m‹bôaž¦ð®Yfñ™ÃD8}YWo€œÃ&8ZɬÃ0ÃÈ9&3HRZg:åÐíæàÿ­õR º~7Œ“.&õ[›Ä0ªk¢ÚLW* —‡Vtw>C%Ð{žYœ=?Ã’¿¡as]¨Ú9—ƒ9­îé:äíß¼é*6è×m ö3°F²ÍXÖD/†Ñ{º1óoÓofþªÍ®éODi]˰]¡–BɦÞDlˆÆrÚÙm‰¨ón‹NëéqE?ä(>ÖÆK.n¾áǾàÇ™_=ð£G¶HÐZ¬@wù/QæM,’7#6`‘#Yƒ àêÖïÎ3¦§ Ô,4¸{sÞp‹hRŽ}$uSdH¨:ƒ~óéÉ>$/,‚æ‡x tb/ “EºB,JÌTL[f¦^NÂàT]²}[^«©–•y[ÓE:oe¹ÏÈß©Åg•s Mi‚GÃŒå q1çÚëHȯíÚ-’³§5@#²Öâ䦧Znñp2·>ä|ß$¯JÔòÔD4“c½Wé:—mWÍ1¨ñ³3}+Y¼£r¥˜ñ¹ ]pÀåmf™1 ×&¡üH½·Jk1¹T×ÚLŠ¡èü‡Ä7'OX!o"Lrt—Ÿ€ŠâöXõ~<œâ,÷¸Ô¹¯8”QjpˆÊޤF¾†caøpõ4cV•ŠÜ<ó(ö°:Ñ ¦=SÄouåHx¬|iò6ª}í¸•{\äKÈæ#«?åöä}òŒkO»TMpaÆÀ¾± 7ÏŸ çà¦ì¯Ýg6ÈnÀL‹ú‡™ F@²btŸÄˆÊ»¾õhœž{ÄtV-v?e,;¡¶"ó~ƒHWHÀÝ™ðØcFú„3ÍÖaû/VíÚ‘îMû,@³±Ë\îYékÓdçNK ²¹ mÅH'æs=˜1í”ÅJ6œ®&ª¬{»(L¹‘×Ηm“»–°Êg³D1¼W&\¼«&Ò,»ÓÎÖÔ}& “‘Ûwl*â¸÷ÎìîõΩ$ƒ"kø†þwäëQ‰©3bßB¢£Š@¿Ð’µ²9ÞÞ‘-ŠÔíF*ßeÑŪ1-,VhóAº«ÅÄXpN L]2ý(¶¾RèeÞ»c5 ÆEkTY;47Œ™ó”ü$ŹÚ+ð7°òˆ"K'Kl³Çsžž=c‰ÿ:OYåïa«+Þâ[}6 vl­_‘ùæž,Dð¾xwhÑQóâK½2‰#l!#Iä Ó€|?O…t­vEñEà¤ú –›.‹Iž"²ß †³¨"­]¨ì ,¤Ô嬪šÓ3híæ° ».aÙ'}byÜZ£¢á»85EŸÄáð¡‰`ù Ð(Áú§CŽcÕBD™"Á…)XÛ9}&ÎdÑ~Êî‘É:fb«Ü»aêÉ®z‰óÚ¾Ò+1$‘˜Sžhu7ò€rÛ`ÏO¯¡«÷`÷Ø• h”a†`®Iq–/{PQdÅ @a|¾ =ö$ E×Ä$kJ3Â7,Òô3¶…Ê,õ¦±ƒ &*ÇŠá:=šÐ:fŽJZÞG.–®ØÅ !H‰u¥™þÍá$ ¢0r£èÿæY‰r¶–ᦠ²éóär•«õ4Ͱ)X¡LU#M­x"osœøò\-&lŢƀÓ's•ÕžS¹–׎‹U¹–øŸ“'ó‘ ¶³à”èÒ÷a#‘áDG: Ïâ b2Kõ8<ßT¨ôk×b@1~.?«}y&š0RêñkëZìX±ÏÚ_7ÉÞ¥åÓåUMx‹–/A9®rh»°ÄÃÉ2×uU¥å¨e»šðvÂ0åϸ}ú¸ ™eº(”å+Ú­–g¥Ì’•ä¯ÃL5ipú3t l?Ñ2m#³Êõ«÷#÷è1Hcž ÏÚûQ'& VÄ|"Ú ž8Ôæ-°~‡æÙ«Ÿ¤åŽüÔ!>€þkø¯õ¶vˆl±n^hWÓz?®v5ÅÕá*‡¤wˆL‚ w®(|pƒ,pk¡e'Ø’$D6Kó /J ;j«ïhŠ“PÎ{ñt_ Ò8,v» ú—`뢵[íÍFèö‘í~½¡ÚBl™¨_ÇVÇe;¹ÓôPšÃ9þ‡.5On›Wq:*tÕXr+Òs¢„ Åé €…j@½ÇÇø¿ˆföº Mã¶)ì¹>FÄÚuê‰!Od°ÃJÖ6/na¬½fÀµkŠšˆ¸÷À…òû2ÅqDO ‡c2A!M$ø®>Ƽrc¢¨ßµdz­`3•Ënze)ËÒ®¶žnׯÈýfr±RÈi‘q±®Pö„*N²8G²x-)¡I7Xà:½W¾÷ðl’vB$z¦ií9;mÈBfpB"{"‹º[ñ™Çeäpbf‹`Ý1Ÿ–½XË>_ö:_ö!Æ—!Æ/.sù½&.û²„ïÉ~|9Æ×å¿Lþë2ù_½ìeõ²¯*ý{[Uúëýø½­÷ãë°Ò‡7uX}}ŒGdïécÄxæ>†V7KäÆnážÈêº0êàò“@øØ Ó?1õÑà-·+zḃŽåÙÚŒr·˜×?4/¥­5D&çsƒ[ŽâX®•*'àqP²âmZÀAÛ‡Ú3ñÍéÏsÊØ&EuùåI>bðoŸ{@¨¹ ð5ó9,Û–SÊÇšjª|œ.` ²­?ݾžq>w‹·†KS°¥Ôía½ûÆzš»‡ÜP¬T&¦‘Ù¦Žq'á#¦72gøp'[ááíQÃüåÞcB¾•±oÝ=ÖÎèá„!È¡sð%`áêÉoÑI.ÿÞ¬T‚ATŽÐßóɤB¶÷¬7‰Y.2Ñ_gÅÖU]1g"ÐÁ³Ì:ÊaP°)˜õµ"Ý$;&_F€)3°ŒnÀZƒ~õF·ô™ #ãçÓMñyN³Æ…sU±äÚ-ž‰€°Jø±‡•-šutK)訃 â̹‡Öl?›QD§—ü3΂4;ï3F1[v ¢žÅß°Žƒï–ªNà+IÐpͦËu¬Ó)X2yÉRF +M ˜˜›¹ÑEí=z󰽞$_sdVä¦åó$%È4¦–íÍ æªI•gœk‰/ØáÄ’7Ñ$Æ;H‹â× ®eªéÉß®)úH…t¾ŸáŽØDyÚˆs<›È•¤·+ æ‡V¯w¬8ò ìgYZ—ß̶‡Åc—1í¹Êò2Èû”kŸÅJW%QŠÒ'žËÚ˜3Ûå'”CËÄË^Xy]K"r‹¾µJd°‹‡&¦³UdX/ʤ`èÅäaÎäªeÙæÎ±3K}§ix”€È-–Û]5»T›§AÇ1w\¨Ü"-,J:1bIËò3Fd®pM+™)=D3ø м c^܉ëN² üQó" ér:#ùÕ é阮rš7° Ã °gfÜ èîg,×f5Nq?î¨[¤˜g–ÛÚR¬b)›E`$•Jˆ ËOýP:fáÓ=Ñ„ñòd ‰íHëKˆ `çAç&®«þ=—“SA5+·Ž€N¥‡ÓÆ uàÆ¨\ê†m—$öÒΔ›[…$z‰š²¸jö~¨£tªäY®ßËeE!³oßÑ¢[z¢üÊXL ëòÚØ:2‹«Ý¡<¸>U}x,¤™éÓ7›Qt8³ÒÐtJ×DFÔË$otðepÚ+xçU"kÌäo ’ºf ´+Â:å,÷ÉˬC§–éåÖ.QZ ¢Ý¼1 æqG‚ÏKZV"»ì•; NÑyS{õtüRnAÈ2™…üÊÌ”_ZÎk‚D¢8äéöDQ/k›„:F$˜å0õ©…è]G´#u+¿åE ˜žÜø° wQ£(¶VX2¸*¥Tw¥`RJÁŽ4û•aJÙèóœÎ(¬*jª¿®‹Î.—Æíù@{DÐS+Ñ(‚ìIJ˜:ß‹¦§×4)‹V|W³æ.œ Þ:beàZ±ØÑ Rºdl¸¡ücP˜esOëF2Ú ~†–ª~ ›™ƒΗóÚG-›ãÃ(Ç^¼xc¤ •'žR–Ì¢÷£û¾#èUd?Ä’%ŠVt$´L×߯’p Å.ÚªdY©ó`*§÷ãìPÓÞT˜Mk.Á ÓW‰µ… ìpþWÏÕKRË"*—pÉpŠ¢wJ©M^Z+æþ@p‹eú2í)™€÷M-C E”¨›ðÍ“?Š’kì [èb«…ÈrYHŽInë°Ê¹bo^ÐlÔ¼)2Á"ÇÍD‡5ÐI@‘­æ#—#y˜J޽Òù,ä::cÞ×*𜪋v#Ô -ÛƒiÅ®ƒï´ágDö*Âþš…U™Ø[´g‡,&Éá*–c'Êoç««g´áëд$;ë\?W³".#¿Yæx»y¹ê«òP =×ÝÚuv¾ÿû QÚ“{Ò„±5JxSÜh„bl¢&Ò'KœXöU‚®× Šô˜_ÀÒ,vÑl”ƒ¢|“NÚô´$–èÐÉËÒûÃŒ+¹NÞü¨KŠÝlÃ5æX'/n)ÚŒäºG^r.2|¶hˆç-5ÁžUÚF®Om0ŒÞ+Š|óû ÀÇØà!³ÝCÉlv ±³Ô2ÔŠ—‹LÌFŠ«,¨œ"+Å“ÖJg_M÷iÙµìóe/óebô büâ²Æe_öãuÙ/Çøºã—É]&ÿ«—½¬^öU¥o«J½¿·õ~|VGdïé°úúÈÞÓLjéÏ’è/AäŠáåWRܳˉ 7ÎîøqÆ%˜öÑ:Ì€üÅ,;Êšáoö , Û(Eh‹íg{)‘¿„{Ž´âÞñiñÓ‰ãncñJŠÍ< G݉Rœ›ÙÕå}à:8Øç.:–<Ù§tÂŽäu{ºü˜lgn¦¢Ù—6‹Í5ÓªI{¢ØÜ~¤Ù°®¨V—³8{5ºÖàÆôîÿ¬( [„‰‘\ 2„iÐJæ¹B•ê®—·‚µ®0/EZÑMYÉ3cj|×|hŇîð”z,’·ºÒúFé9ªÍµðöC™aËÕéÐå¤ÏJ6áòèñ Íô ¿¹|8VBB`›ßU)bsØÍ\ÿìT9A3ûôt#OmvV$¦êÇàÁ´ž0oè­¡ç0,og\ CE‹)Õáßb'KÞ›ú¤zuÞ‹‰ 1q\«¤p>© æF²!"ƒ–62OâÀŠŽM‚Æ ÍÌÍÝZHÇ´k¬»í@7z…Ñ•À'¸¡Qtˆ •«ss¨ÊõW#L7´@ÓàÂr<ú?lǸÇ)íøÕI Zð CL.™¹:v7¬[ÿøàf.oøÜÆjzqµi}šaÔÔ´%jº¥„vqŹ~ꙄöJÐG ›­Uc_‡˜Âg,_bÇñïÙHI¼æ#.W†°7.i1¿ð㚈nœ×VPyäbHn f»q¿×â¦4óâkV"FLhPJbPròÓŸâã”Hx¤äóeÊwÃJyìÁ¨X€÷¦(Ú ±¹ òäƒàÀÖLÉ%`Jºnʤ ‹WR òù^S|õµ9_¼W®[éÊ<7¦àƒÓ`kµHß±d§æ{F0Oäaò{»FŠ#|Q€M#*{_3¦bí'2=áKÜATÍ÷ðiÊ«ŸfÜܼ=󠾺1Þ*µqHAµ¤2“1戉ÚÚlI‹eVÄ-%h0^.L ž¹È°îÆ $çr”2©½´Pnq¸Õ6ˆ˜‚=¿Ödõ´)Š"î9ÔbŠ–1“èÍ<à˜ëÚù²¯e>±ýyØÎú`¿t1£ŒÅwËÅmŒ«åsïøt9ÇâÌmFRDKÎë†2‡l¿¬{9’€‹ù1(,Fr1Qí©÷®7Ž 8jL™Èí|€~1 D•U„Ü_¨Ä?Bú8y˜PuõÆ {¼F@ Õ‡·/ ¥áGzlƼP¨JK4fòŒ[ñU“š,…¢î±” À·`¢½ñDßq··9)M$kãìv±’Œqúµ °WÂJ$©±–½¼±á 7ÇöÄÒ“‰½H½»\믗MÊŠ—sn• øèyøŽàÄwû4ÅÊÛå'ÁÍ`öªø °å—.É’ø›Ù«r¦£›+P]bå¾]“²ùJWˆÆù tya4#õN)¡ðHYˆ­ð É{bΉåµî‰&2·œã•ß+܇Ä ¾E¹ò—¾ Nmóè±DËECdI>C`NÔOy¬5û¬4æWKh–°EÀ*3Š/SÂö£¥`ÎI¡ cß>&Ÿ»×¨%BGÿ̱9]Ó¸\cu¤Sõvú‡¨–œfÚ²K(ÖYuaxa” ‡³è M0 _Ò‘Oq9cÍ*ÁƒÀc0|ØcøGÐâAþDËÿزf =Îæ•‹ _ÝçôbüZÄe`E W)±ýh¡¼Χ¯™«ñ*±J½6ÞJ¢p4–lJü7ù¸zUÍVœà kfŒ¬G;ÙÒ™ÜU/Xë<³?àèö-šW¥cØHÑK˜Î\ùµÿÅí—U‡u £úææSÕ¤ÈÄŽ ­•x`0@ÁÄndž1rÖ­óò«“9ƵhÚ(—ÝìJ[—ºÁ5îÐ%Pí°Ä‰Ö2V+%æ(Ùöb·ïT-ݧ²MG¼o ÇBž>Ppe 2›–¦¶ª4’‚Q&ß×n¦ìëi,%4¯8O˜<âa‡Âo.†^µ‹iŒÑhñ,ûuX OóD,u›|@yŠÈ=¹Ò® ÓSˆ7Kð» š'€‘_štlrŒ;­ž¶/D>;ªÒ#“Ï^¼9Ï"¶B’ u>Ë ·5¤qÙÌÙ}%"ô=P¹Y¢n6¢­’Oçý@8˜\d‰µG½sœvk×i9"\1ºAEYÂuh7_tÈ @Á»Ø>ÐÓ®ÓX°6º‘Ð¥Æå™{êü`We|X»/W‹M¢ziÁj:ͺ¹þV 8"“¿Îæ/‹÷LAç0Î*ðSâ$’æqç 1_FdV¢]GÅÚ˜úµ ²´0™Üö vÃé%ºnYõF¬8­nœqSZâ§«3yóœ:á½}”(O•é,NËoú±„8Nb"ÊÔ~¤Bµèì(³ !³VD)-ßD%Wë°ºš\Ø!‚øJàY”²Qƒ p)H¼FZ¸°/á´ T»Ø¢)§LcbáEÖÌMd¢˜;ÞÐGÃɼZ—³ZÀi޳5Yå\9ÚuÈ)²UƒSDTdGïǧe¯Ó²Ï—½Î—}ˆñuˆñ‹Ë^—}Ù×e?¾ãërŒ_&ÿe™ü¯^ö{[½ì«Jë—}SUúëý8"{OïÇ×auDöž«¯ñ|ó÷ô1Vý½ì\€¥[ÉŽtSÿFî§ûŽ[hsù!#ɱÚe¬Ä#!¿Þ¥Ôz‰~qÐ „ÑECÅá•%S(2ùƒ“/âgt§AOþ—/+°éà†¼Ïžñ`ûÙše?j}ƒÇüd5FRõ¡&P¦ãËtŸ…e˜Qí Ìâ͸óãaãN9Y F¼' Ó\Ët?T¢`r«pIå&S@üM٥ƋäƒÍ¦ÄèfcùP“™Ê «)jár-qÎÐ2äC‡‹ Õ©î†quNöèjÈNÅJ­zY/>N‰}µ,³ÆNâÞ£ü&F$ª]˜Ï=ÉA™3­ ×ù:” –/Q€…²2²¾;' NÌçIP´#û1gÐqŒRb±„Ø—Èâ‰$bÎU"ÂFgí~eüsaRSª-(Ô2%v–a ´±?) ÖÁ[0òS~9E/*{íÊyOë—iÅqr:–?Ïë7ïžáÅâÑå!VÖÀÕ‡› —/i–ùP!‚´6\JˆuFðA`Æûd¥P–±zµe?Äl·ˆìvI æÒhrÃüµn¼‰â_!]9ªv͹ Š­FuƤ¥V_‰áˆcâå"Ÿ»× ­âV"÷‹Ã󺮋>£Ì“®@òe7?ÃðUAv‡F,„Í­¦Kdù ¥C±$¦­œG‡ã^~\ØÙã¨vr‘"´(¿‰žûx-0gõik¸’ `$×è],{ÕŠï%Öi¢ÐŽ`\>]ñö ý¡bí2)¥Ü󠃳DY›˜tn“¥z¨gþ1‰È­#à*˱Zp‹§¢J&Ÿ6G¯±4ëê2i-G½E,pTƒöî(çyEæe_QcÝÛcáY<¢wÁ ^QT¢£ƒú¯zV KØ&—gJä³|kv†ˆ£MþGð^œußÓ®2÷äBÍL)5é`ÏcZ·3…ÛXÔ<õ²Æ¥nHæÀ us|]m^—šùYlÑÈ…À[Ÿ±̱rNDáöjÀôx–AÞÙ ûk°—eE!<ûäKÔH,׿quUZ~‰2û-²¼÷u¡®•sâ7K'³eOÊ/yY;0kߦ(wñ÷sºú ¤6Ψ#áè[ætõ³ìŠÚQ|§8a°‘]G¾yÍJ¨~^Y¼Ôj˜?,îŠv+ áù€ô:“òâÑi»z‹L)‰‘‹ªæ"0Á`±¯Eæ(·qSÇ}=Ì›`ã[ÔÆ>( TwפÈFIQ?@*9D¶ÓµB¦ä}-=T{8ÑÒ½AQÄO¾Êš¥¶÷~èî)oÁ¢­ä¤a RrnœDT§ií§¸¤ÿª˜»áJ[´‘€ 2–W ¦î Šz™xÆ€Ñbx&}‚€‡¨ŠÉŸD‡U^¬Ûkß…3*Í^‹Ú¥8¬ D*àa껣w®ÎN”cY¼A;‹Ø¾ ê)Öu‡Ÿ¬«R½ï+¹f _&aYD'¢˜¾ü }b;Så$.o”VEN:»¶Í’•z-rµ'’.9È^J¹V–Vƒtq¤Éz²J`Nô£å¸C†µNƒwtšè\«ÜAÆ@[(§o&z˜ì‹Œ¬0¸¢O½…W®Ðl3>"M!¥:«—÷Ñ “èËæ¿0gžCè{ÓΖÂuò¸6ýÚmWr|‰2׈@[áø{àz9 û@wãqpv{ÌhvkgU¥•‘Ûò›:UïäbJ>éôr(ߤ“YÑÞ(e§“Œfï £„ß¾˜s#j\agëQÑ(³ôÙf½ ÷¡Æòź¸Š iûêcL`…¡Zˆ§¥–Ê•ï 䓱¾X|E0øµõ²¥$kËßP[‰Þ If¢äÍ`­ÄÃrø ŽÈÊj´dëÀènúî]¸{Dã¨\†«¥Ô© LdÛKÿ¨ ŠVb4§ÐÔZª÷h‹cI¥Lœ3Œ<£.Šë,…¶Ó‰õiÙKµìóe¯óeb|büâ²×Åe_öãuÙ/Çø²ã—Éÿ½-“ÿÕËô›¿©^öU¥õ˾©*ýõ~‘½§÷ãë°:ßü=V_ãùæïécD#1¹i–»Q4\]W9ÎÌü²¢#gÊ^‰ÄüPäˆ2ÇÐHœãX±•ª\g|©E¾4S guè󔛪‰Q#jàÇ)q# 0Õ8HUÑ‘jqQFþ¸¬r¿DRJÛõO‘`¡a”Ãj5D6m+Žá€v€¸Åã9CiÛ>Hv¶L—lV >ðCOȦz›¥ôŒä·k¬Ó,*v¢Ú½ùÁå7F1Q•^®Ö¼K+äÃÍP¬Ù5Úð¡0½FQ{Ì€CQ˜ÐÜ Þ%]tÂ}Ìx]Ûñ‰¯¼¥Î *Áæ( Ìäã™0ü¢¨£Çá—µêè5Ç`–„´Å¿,¶›ƒøôL‘­¼±½nk°0Ö­?l~Õ¬äÌÞŽ*ðgeAënM§]g—FNI¡þÛ»…‘wÝ”R[ƒR¼áoã®-~ðŒ1UÊeÔgì1äq_åòX åÅ6’å„"Ãä)½ìG;†ï“¯¯»V^I|´Ã´–¢ÌW\–rKéÏ‹sŸŒ¬–H“ð´ïìÉ—ˆoïвžý÷¦æÀ`à‰l]ŸÁ ÒSJy»ËÛ0d Z­'_la).%‰hÓѲªëì1®œ*ø½ºûÒ÷-Ù¨Þ0¯Õ1ÆÔ‰»à £gžqÉÅóCºn*fÀºó»¨mNWfe¶´#Ì»_Sd3GŒ\'÷va&Ç6,ï<›ƒFÖt\ æ%2‰UMçàí£‹Ä*ƒìÙŠÞª°2)UÛ–ØÌ 8i¾¦Ìè°‹ÀŠ‘üa÷@Œ ³ûL¾À8w½ûCOÚ ÕÊ%ê’¼˜EÍ“y$à…œt+…Z`?Í Y¤¤ Ç@¦8¶H½Ëùtþ¤Ûeq™D±±1íÑó‚S§0c* Ãf-VjLÁ¡e˜î#2ÿžh_V_‰ ûiÅì°/søŽ8eLÇü!“¿ ³D‡À¿#Ý´O¼U´:ñr1‘Y\&±å)¿j~Ùƒø-;nÝ­§è}_¹C¦öÍ„†&ßÝjqºå¶îXVSbõ2m-º Ò=v)8<)±î<Í1¿‹|!Oý!ÇX'°-…ÙGAQ1•ïÀFÂ,08ÍBUQy”ÎØ¥ÛÙÓ%x&_0‹ïS‘q7ÌÐ%©Ó#b‰¥¢XiùAJÄMŒYwUž|!Ö-®Êùt×xôœñ3Ë2Ø`µ~»·gŽñÏàí8)ªƒ,óŽaB °¶æŽˆZ&ÿR˜+q­¾Qj‘®ê§ So$À¦IÖ´´Y#Êj‚×c­¦ø :Ÿ8[Êf-^1mX+Œâm"-,Ðöšän«]àhQJèýÈ“ˆ1•ŠUÏz!;ãš}’Zí—Y…Ò7ó ¡š's‘0qü£R¸YIO„üZÜ€ ç³Xo鹯P¯øÂ›[¸]‹„Gž1 6QÑ[ô—»Ñ˜ÔiUPˆ*9ü3žóâVi3–Ña–˜Å3s¢üVîÌä£HJ$H“‹å鯀< VøÉ~ý°C(B,ôLþlžc4ƒÀ‰˜¡˜g^j‹2J_ÆäÎcÀ/‰` >%g~Á®¡ååSÈ’éÃ\Q|Ù»9ÈP¬©v+ÏøklÁB-pE<®„XÑ{5çEõl&ÁÜ_X²+Gõaê kå£Ï~7Z(-TuêŠì÷FìF½‡hÓmZáÅ£*kPµ´|Vp™È)–.d&±(A—½ +Ô¥ò×HЗ¼¹E ÑÍU[.3à  «Ed–NEÂw–‘èÉ€byXXÓÉUà¤z&´ieGØz¹H$.zGt™4Ï^éúÆ(ö—ÚÂCÿU×ôÛˆY2ºÞÔõ”_ß;Ú=êLNI§{„/“‰‰}ЬՋTKB•bYx9‰ƒ œmt_ûÎÃË·ÔF¸¯Éw×Úd‰ÂË[¦ù»LG5òõ(ùùç}?*/+ •ÄW?b5¤Ä†QþîNʤ"Û¤ñž-×bÇžG€D,n#®Hí®ˆ#;»&·;dçÎÃ?Ö”3œ©Jä'Hiù庂’Güà•l›š°¹ø ÐΩ胵òÔÁ¾–Â0‚c-DÖstmŠ'»Ö­.P8RËZ+ÆóeßÓÇÊæ5øYå›»Æ@ʼºi9}£¹ÃÝhR§¦8 <½Qz©Oß®šì!´Im³¬Dƒ‚rRd˜†41Ï6|WÓ-/ÿWÅú&|¡Z2¥T'ªíxƒË=ÝT9àß™…B×´n9‘êð#ks<¯îhf¶Md³{O~Úž3F¡¾Ú®»Šl Íàž7`$0OЬ”}F «¯ÞZ4èc­XtCgªÜÔ‹ÇZ{8N²Ìh××y1yT Do1êP.2àÖç ÃØÎ5ˆû×Y²cò“(&òý—fövm\º„VD¶³3^ ;BC‰ŠE¶V“‚4.}æâ¦Æ’÷üCZlÈã(–yÃvLávøtti¹”öœó<4xäî¾LÍ} ;ªJæµ™gőҾ3ÆE…ŽjILpÉË"[ô4K’cëȸç@gï±h:I£“F/Çs_…°Zÿ‹bBiåÒD\6ó½@¤s5Ô‚S€šQˆ¸L¾ª‡b„[ŒÁ$1Ÿî¡ËM+ì¬q°¨”ĘOÊõ$2 0+ˆÛ¾³ŠiNº^T{’?Ôƒ¨NöãP}¨”D½COÃÅ´Ù9q¡qvbŽYâÄØ^‰U,C€ïUqãÖäPç5C+2‹ì‡˜2¿ØRúýˆÈ|µ¬2ݯ~óñgWÆI µH Hê·pb¹… ¦ér½GfFaœ¼¹ÆzvÙ’ØcÖ$S:ÓEƺb#sÍÈzæ‰Ë4-œ|— v3%»ºgZ°zöc¡€§¢ª0r1+=Èt›RÃüIDf-É cºE6çµZ™`&åÄ;±"‘Š{W™c\¢>‘°’¸ –ƒöÑ¢³¡Œ ×¼Ž ŠùÎy2^§*=õäTüÓMŽI_&1U¦-lcÆj9,ß§vù2—ª[qª‹L¾x#¹€ÜOOÊ#·=¯ÜïÙa +¹)‰™à4ÍØŠÍò÷ã‘g¢ÈÄ,^›yêŽ@XìçU„ʵòAt–³Ò¨G,¯‹â[°øRu˜Ÿe0/ñÌäËÛØ¬uZŒ‘AÒ5âÝ£ßJ»{$ïÇ-¿\2OI~Žudž¥n´/Ø» ¥$¸~k9°4 9íJ¶Ã4vQ*íêd!Ø;\±&ü_bµ¹¤íDGP¬^<}¬+$iUJ¬}!Ë$¡kıíädí³æË[Äæ_MöU‹ ÌÅ—ž##+ßcg.¸ ø0ަãó؉rÁÆGw>96  NŠ.!„ 4­bf¯E?+_„H£Ìðeâ½b£I.Ûï'ÖrA øy’{ñ¥^¼ù×mù¸3ÞVðó ‘gúƒ?çý@3ÿðcù¯é×äãí ¼k8"ʯ¯qMÕƒk‚øªkva䔊•Zç=ˆž¨ò„S-,ÈW9klÊaîo”ŒÈ“Ji?Q¼Þ‹YN9*¦WeÁΨ4™óÔÏšfDi¯dŠ8¹É+™3¹+þÙF(…†ì›ÉÝH@Ô-c¨ïGʱ¢VüÓá¸jˆLî÷•`³ Ò•åm8hË:­gí–-^;˜ê¥e"¥ÐYOmáØ@k-ðÞlÐÝo¾j—¿sÃ3ÊA-z?Ä T>Ô¶/ª¤ÆKÆ üè„Ñö†~Ô‰R„–!_|v.® ¹áéY¾“ig¯˜J\VÎVLýµMÊ/ôÍ$§jÁ1œŽ«J—#@+Q{€„b˜fßå•îŒ.ZßZQ•aÔtá Ê¡†#”Ò8í#2Z ’¼^¹Ó¹bŸrÆ!Ï)x×+ßå‚Ú-ÞëºX޽Ø}J•›¶±öÍÚ¥;±—xÈ_±ÿD´9ö¢Å J>ãl6;Yæqå¿&72ƒ‡©F¾¾¦¯-Àzúb5f£Èĉ; ÀÑEˆ”kò†Tór˜L1q¡rbšû Jõ1,XÆH`ý'Ø(½]‡”'š¡¸jÏ£õ€Ñ£\Ü*iÄÂFÑ1òж°kfɸü­ƒ&%ÚåÀÅ6øÆUƒªE›ª6E[Î~X{w©‰VRŒŸK X²G#H›ëJY"KÃ/Ö/Ô^¾'Ði±ðo¤rɨ&Pd¡¼)ƹÄ.ÎÒÆ¤•‡{>%€ŒMÄÕqŽŠ ©÷î"­-Ãvì+ùiÙÛ´ìóe¯óeb|büâ²ò®¸ìË~èÛ²_Žñˆì=9Æ/“ï"{M&ÿ«—½®^öU¥o«J½盿§÷ãë°:RzO‡Õ×Çè—õ%}Œÿþ¿ÿã?ÿã¿üŸÿòßÿ÷ÿøÿ¬ÿ¡Ïÿõþ¯ÿöñ•ÿñÿÌiÉŠ*'xcrysden-1.6.2/examples/XSF_Files/fcc-410-1x1.xsf0000644000175000017500000000116411712736221017645 0ustar tonetone SLAB PRIMVEC 4.1620000000 0.0000000000 0.0000000000 -2.0810000000 8.5801828100 0.0000000000 0.0000000000 0.0000000000 1.0000000000 PRIMCOORD 8 1 47 -1.0405000000 1.5141499100 1.7665082200 47 1.0405000000 3.5330164500 1.2617915900 47 1.0405000000 -3.0282998100 0.7570749540 47 -1.0405000000 -1.0094332700 0.2523583180 47 1.0405000000 -1.5141499100 -1.7665082200 47 -1.0405000000 -3.5330164500 -1.2617915900 47 -1.0405000000 3.0282998100 -0.7570749540 47 1.0405000000 1.0094332700 -0.2523583180 xcrysden-1.6.2/examples/XSF_Files/c2h4:Ag001.xsf0000644000175000017500000000456511712736221017534 0ustar tonetone SLAB PRIMVEC 5.6851400000 0.0000000000 0.0000000000 0.0000000000 5.6851400000 0.0000000000 0.0000000000 0.0000000000 25.0146000000 PRIMCOORD 40 1 1 3.7781334143 4.0882125450 21.2053966916 1 3.7781334143 1.5969264697 21.2053966916 1 1.9070056005 4.0882125450 21.2053966916 1 1.9070056005 1.5969264697 21.2053966916 6 2.8425695074 3.5172371034 21.1578275643 6 2.8425695074 2.1679019170 21.1578275643 47 2.8425695074 2.8425695074 18.7322707924 47 2.8425695074 0.0000000057 18.5413944160 47 0.0000000057 2.8425695074 18.5276513940 47 0.0000000057 0.0000000057 18.5233706378 47 0.0000000057 0.0000000057 6.4912410269 47 0.0000000057 2.8425695074 6.4869602708 47 2.8425695074 0.0000000057 6.4732172488 47 2.8425695074 2.8425695074 6.2823408724 6 2.8425695074 3.5172371034 3.8567841004 6 2.8425695074 2.1679019170 3.8567841004 1 3.7781334143 4.0882125450 3.8092149732 1 3.7781334143 1.5969264697 3.8092149732 1 1.9070056005 4.0882125450 3.8092149732 1 1.9070056005 1.5969264697 3.8092149732 47 4.2452443280 -4.2473703085 16.5863965604 47 4.2452443280 -1.4377686835 16.5863965604 47 1.4398946867 -4.2473703085 16.5863965604 47 1.4398946867 -1.4377686835 16.5863965604 47 2.8425695074 -2.8425694960 14.5250173888 47 2.8425695074 0.0000000057 14.5375864352 47 0.0000000057 -2.8425694960 14.5407976860 47 0.0000000057 0.0000000057 14.5610141313 47 -1.4156802868 -1.4171916355 12.5073058324 47 4.2694587166 -4.2679473565 12.5073058324 47 1.4156802982 -4.2679473565 12.5073058324 47 1.4156802982 -1.4171916355 12.5073058324 47 2.8425695074 -2.8425694960 10.4895942760 47 2.8425695074 0.0000000057 10.4770252296 47 0.0000000057 -2.8425694960 10.4738139788 47 0.0000000057 0.0000000057 10.4535975335 47 -1.4398946753 -1.4377686835 8.4282151043 47 -1.4398946753 1.4377686949 8.4282151043 47 1.4398946867 -4.2473703085 8.4282151043 47 1.4398946867 -1.4377686835 8.4282151043 xcrysden-1.6.2/examples/XSF_Files/CO_homo.xsf.gz0000644000175000017500000010703213522571622020147 0ustar tonetone‹&,:>CO_homo.xsfí}Ë®-KnÜü|Eïƒ|0_ÃnõEC,²<îÿÿ +“Ùà™P‚ Üê½Oíµ’I2|ýéÏÿùïÿóýúӟ柞ÿK¿Óóÿý¿mæ6~³ÿ_ó'ýîVrª¿þòÇßþùßþþ—ý÷ú—¿ÿõÏÿùç¿ýÇ?ÿµþõWýëßÿý?þòÏÿùçýûÿHiüŠý?øÛšÿô¿ÿòǯ?Õú§Òðÿ~ýé'ÿËÿ¯Œüïò»úÎîŸ)ýÞÿßÎ/X?ÿcýÝžÿ¡ûã¯ÿò|þ·ü;•ºÚ?©úCY¶F<´5mÆÃ*­Ÿ‡ò»ô:k<´ÕÇó‚_þ´R›¶Tç‘ãÕßu´Uã¡¥j™f©Åƒ-+ó¼ÿçÎßËf3ÅŸxwægÀ¯-~ºbÙâsÏ…/x^‡¯4Jå÷+³¿y*#¾ìüS*þ:ƒÄq&yåý`¿g³ûÃóézmyì•ß}Í‘öŽ«÷ÖâÁðê~X¿G+æÍßÝV~ŽÂÆËkÆ—ß?*¿G9í‡ü»·ùüÙö|‹jø|ñÁ;NÁ¤•/Áäµ,V/ePk´Æ3ž)×s¬†3³Åƒå²V<´ïסò'­Yˆ ßbdãëÒ“B…o¨þek“0§¾„Y«ñ:|¥ÚZâ—ÅÅ㕬uCê%^7×Òå‡Kó\({>Ý*«Ûþ>P.f!¿a­uʺEaZÊÙB~mm™»(:îç|.T{¾l·çB=ò³µžK½E6rÍ”E>—ãyèÃâô+®./5>î“ÅAV«[~Ï·˜mŽs¬íwÅm˜ñÐko9&¡óaÍ´øpÇÏëš«O/ñ£K‰‡ŠO`çuëwÆ][JÏ¡´£eøJ°¡eøà°‹=¾ÅHmQJпLµpû9x\5éÀ­´¦§ãrÌЄþ»çŠ5ü†Ïeö:ã¡Ú\úIû¸ž×­”;_‹w_I¯ƒ0ûZÔS}év­ÉOWýJ¿lÇóWÐdâB&šÌÚk¦0Ó,9nÀ„y7Ë¡€mímùånò+«Q~6“"›s{´§Œ‘Ž…rçZ{È/¯m_¶ÈzNFçSñ§ ¥4(?Ø€œ&5aŒÇ¹8…ó-ô~†ó™xòm¶’âaN³ ž?ñ;]y(uXèó€r§®‹×â3”Ò •±yðs·^’\#^Pè\q©­Ðð…P~ Š"ëøÜT¹Úl_ÂÆjt€†4(?Kõ(–ÛÏT)?·…9ä×,çJ‘š× iæÚê±Ç¦ö>¸ß¯ø«¶NÅš€ 4k³õÄò»Qâì –xÆÓx¬ ` V—´šá¡<p¼“½='´`ýó”ÇV¬šâPÖo˜ÂIÑâ·¤šµäEe¬yÊ–ŸM µ€öž¨€®ˆ—'\mlÎAû‰ãÎrö8Ÿ¸Ÿî&øý WUŸ®Žò«¹´òëÍÚ¸n†¸ ¨†Èp5æ‘ßÂÚ÷s‹ ž6 Ìj´6øz•º4z¤=e”ʃÌÕ„É>_‰ã‡C~Îx?@ãø“‚¿C)KK?ÉÚ”çu8ýÊ7$¸Ã±à¹G Å ÏyÈ´BÍz|î !׈_ -3üÙíû7jÅÕ%fgL|8dY0ºÆ/Ûs‹sÈFq?g4áG˜LÜéa!?÷΃"ƒ™\òynâ¡à… Å¿‚Ó¤.ùóÛÂNÏL£Ôg¦”²ü¹Z¬'J8gŒÏPyü€W|À5~ÜxÙ¸iØàCÞ®ÿÚ¼Ú¯ƒ’e½· Ö}…ü®åžø%&þ}àÙæ^eÐfâ+ ÷ÂÃÄ7wÿ0QØèIXß›ðØ#ˆ•iE /™‡‚k¦Õudü€A_VKÈfñÑ—3À#¤6³:ò ‘µ”Ql‘5@´"«WZ<¸µLK hSå„ó°Eí³·ëŒY”5)˜–wl±ú¬T¬æ1pÁ'_„&Õ¬-Òà9p¿í¼ÁýdM¼áˆ3Kh|œ0L^£ã®ŽSh2Ç Ç “¹æb¬ïЄ"îl<xZc8L6©š¸CmÑdÖ¢“‰ÿ¢@ü7[ˆ n²Pdˆ•Êàïá+ÉŒ”U A±ÆÖÓç¦ÔI´æŸ¡g™µ±Ò9ãÒ5%Q0â™ò4’Ê!fœ<}à©!‘µ>/|p¦ÐË9¡-?¡“&³´%îC‘y$M7×…Yáx¹¥OŪ5DÖ%¡È _Ž/‹›V‰µrkMì€ÕÒð(&Š_Šl†*Îâ5 Æ%Ë0NîbÆpS‘®fôe ß/Y ‘áÝÁl\ú½Ò… ×:Ÿèù¶­L‰ÌZ¢(J-Âq)#n‘¹Ô)2|w ƶEV‚W×Ô(€ŠÐ Â2™`ÄÎ7€YŠ ¼.ß8¸ŽÙh­(j¬•W`މ"Caž9š‘”fÎ䫳«U†qô^ÌÁGÉuÌ>„%a6„R€L#•œn-ëø?jT6@>,0lJþãÓ²×jÙçË^æË>Äø:ÄøÅe/ŒË>ö£¾‹ýø8Æ#¥÷pŒ“æï5Lþ—/;‚yO¾ìËJŸ‡÷d¥¿ÚJé-µ_…UHéEV_ãG_ã§eÿïê[íº ¸D̨Cî 1¨„ìƒÀæ='žñ%dÒèË äËð¶I¼p•ùkˆ3Vœqs¸7Å]cˆ08b'„X  „Gn(ºÊtE¸N Z’/³R„8݈zOfôe¸û:ÿ5Úxð´¶É†G~¸4“ò›€õ ‘S­“°€‘ˆP¾—ÜBñƒç3´CëÐFHÉJ¢G k´d¹#ªÂ¡”ñ¸VƃĩÒ0⦠ð!˼à^;A/á¶ÃJâzÊÜÎhø±ÔŠü„¬ð!ŸÛºï\?ïPÇMãUƒ…ê²æ*ï'|½¢¯F)AM;UÎÑ ó-@þtZqµPÀåX>ä´7GÈ÷s0@½ø€X•´p¦IyãòûþÇÁ"@C¥§‚¡óAœ°.Ú­ ÂèÒçÒq´ŠŠ®OÂ`)j¬sÏÎ+ÁkŸ çjKèxÑ5:yL•ƒû’ç€ßH"¬<E¾·Ìm‚w §BÂÃjÍDü•qÙ,í±P[d«¦‹ðè³xÂêî>D]ª°"d»ÿÙÀ Ãùu¥Õºç[À»æYhmp#×Å^µIŽÑÖõ€3ѯÙ~Ý&¬à¾Ä§Ô#y¶`ë»>î`¡ü€”a™&B-<ý 5M&¥ÂÖÐqXjåÁZžä§IiúË]hÆO^<›‰^JQ,P¼È~L8äà‹G'¶Bd°Ô‰0ÎMÉ|REH—yw×Q ·6‹ ®“¥ÃÚR°ç‹<ìçGçlæá$(“~­Î(†èuиJ–+Ï­>‡åê3‡üª ù›Tˆ1`Lg©!2qÀL¢Ü.Åo«ÔBoˆžÉ‹ŒÒäßñ¦ß²£V1Á "M+.@·8.¼yÀ,@<Årø½0ŒÐž1: ìt£ÊÙ(%~Ï<@ ™H ˆ9ó` /Tj&R^$]Ô{›E ®¹ÜI±4‰¬Ÿò…ýPÓ•‰àPb1‡)0H ;WÞ•%HP,Æøª…ßµ [¿J ƒÛ9h_`gyƒ™ó$-%'É!LŠ“‚Wòvìr€îæâ!Ÿ¤ßsc¥EùÕ‘®Ô¥U†Ü@å@aÄœsm‡µS¡p†ß[Mµ&êÏã–¤3Æ«¤N»2ÿ­•Å“bQŠl¦*ó7{ZY;Sx~mT1ùEæ À»uSêá÷N–`Ó…å¿|Ô ?™º<-¼i¥­OuvPůàÄ»Ž\¯Ðp”Kd¸4¢ÿK™Šf²I;„ó¹É”Rèñe‡D•6³·Ísn•³ýg7PM'lÜN ÈDižtáÞ\÷Ÿ=6._ÇõŸ3®Í(͹f$¢ŽòŒÓ/Ww=ä°ŸþkÛùì×¹)¼JIºj|ÐHåjNƒ3i0Ç ó†#âD‘9¶U¦ A¿reõ†^*ç>¡´Î†ñìŠçŠEöÁù(fǧV¾æ¥’UÀŒRòk³yƒ“ï̬ýè^¬¾ÌË=ÚóÉR˜R»Ëz’õü(J#Ïe‘àÂñË”îI舛”.aD¯@£»ÚcǾQXò¼Ûa¬i½Òßɤ§Àj£‡È Š=ò Àœ°Í)îgÂáMªœ­0Œ€ÇpŠí=o"[€Cb™a’DYÎÕ"ê/nÃ/Ì2³ ALA¨{˜Â×! :_}Óÿ8;V÷X™Ë"ót‹8œi“Æ áÑ¢–¹…¢QÎeéŒbܲÈyPP?ýÄIù®‡²(Ìêœ,_—ÇP¹Àê¦|'ìK槃Àôé<ÖQíŽmÃX‘š­ä¬¼'b(²Ö‹øç9W¥þ•¹³é[d#ó÷œNcLë*7Å­!´P&Zªz‘ÜN-ÃóéÜ3‹r_eÑ—Á¼·%l éUyM\6A@æ¦W…ðß ‚\z~-IiëÎ}m‘ þ¡]{¥¼ö*&JˆÞ¢2Åü\ÎçÔ>"8Z´’2ÐË!ÎhT9Õ–9*¸ªúÅ•Ñ&ÀÚe%™gp µ3¡[d^ËE2e¦9騀SÄoÃ@#ÍÓ†DV§<Vá|¸ŠqÜkðŒ!ç"Å‚Ì2eàÌÓomÕ¢‡½('²× QG ÊÄ!ì,?>-{–}¾ìu¾ìCŒ/DŒ_\ö²¸ìc?d¼†ýø8Æ0¯á?&?œÔk˜ü/_ý5ù²/+RzMVú«ý)½¦öã«° )½¦Âê«c )½©Žñ«Éßà[jò?_ö:_†Wà;ÑÈÁDM ÆFWKn]ȹ{0®.ø2zº¨MK‰ˆ>/l!,uÍ…¸êb|ÀµS›ËÈgyU¦‰ji5 }Y"0V’üfçëp» äCµÅÚ°/«"Êo%u.s_Þ2w^÷Ì®iz[i2"F+Ä…ÖŽü¼Ñ¹ŠˆZe$w×SâúêU!?ï‘U§ÆÔø×êÒ´hhxÅCó8®àLð÷|}‹%‚6ïæ¼'1„‹B1—‰Œ¼vÙ‰ÌëîgÞqYã@÷ÕKÄ“jdCÌWJãoRËÚã (ÍâGDù!X¥þÁÆ™ ¦í‘&«‹Ó[QEÎTeMÓŒ³sfN¶GCÍ£!Úœí¡enãz¦Ï›cw|ï¸l•0Å|*Œ¾ ²ÂèyÖVd>ýÌ”þI¢á‡}2ñ¸Å¦˜¨ 7NÂÃl(Û)_ííkij‡áŒJ5‰‹tŒ¨ëPgä윯/™ºÝ¼ƒ„6A¨Ì¶Ïé áH…ã ži¡šî¦€å²ªl¥ucòÅg;›fBÕBTk|@à«xXM–~&òlVcÎe$¬|B »pûÉvù 9‹clk(rõt,Ãùy ЖROóWmTž1ÂSe®àªEÿý7Šª¹I«]£ZlÓ¡gT‹]Y1ÜðvýÙ‹å4Šlìzæ+Q~Ne…at““P”„pÕ+‘ Kq5¾ÃçQ˜>lIÓuZ§éñ||5ú<š¹Qe¡Ü µFrÍE>“m=¨l„‚®Š-À)U¸/Fçl¢cpq•ª¯í"Îñ¹—òeßÇ uVVÓgæ[ršÝô0bŽãðÝT¿_çIÍç©M*×êE³?P©ša…³“þÙIonÆ»›ã~‰+«é*Ã<ÄŒCö³&uÌÁ) ¥8qr…” ,Jµ¤ŠŒÙ„m?{ãû,€ €®ž,l&b¹hÝõÈn#ª/+ýʬ´­4)^W©ÜðWš@å™BÞc\÷˜òå8çÌLÙ1Cï¡€{ÕöXùjW=”¦§·Ä_geÄ|%—ß=øjÆ~òN‘2¸üv\¨å@®ÐfBš¡n2ÉŸt¯ZšBa9]ò[…Q£ 0%ÐÞºøË„ N•ƒq—aœøpT9O¾ˆRïcs¨OÌÐÊPó(B2þnìç5«- àóùÊv­ Õ͵Å|2ÿǬí3ž­ †ùýâS¾Âdâ+åÔ(еZ¡d'L…D†¸®ñG>}M©lŸçÀ;”»r4V®Á^#‘­^¦bë‘ôÞæÞéßScéÜlÙ˜Scnrfzʈ1i2GKšèä¸Tru‚É Ï5ÒJú°3‰ f[ùSOÁë¶Þ©^Xz£(€ä«,ÙáÏ·ë÷VY1]Ç ÿê+ÜN>$æhªO¡Hªý˜îç´ÍõnOÒHd÷…ò¹²’gdÔÉå ‚?ÿÁªê 7SaB1Õ^ÙXù‚,Û?œa=«Tú<›¦ŒÛ°1ƒßO2c^(xeBݺ_a^^‘óñ2œaÞ“c퇫ŒAy]#à€YUÎ2g§*oÌò%2')‹ÔZ§,œ¤ü`µ‹lþ\¤×ùtÏÍ1¨eðd²Ôó0‰Û œ¼áÙIΑµ£ë–ß¡`W§góìr ÒºëÈäâ¨,‘ᯊ% ¦¸Ý Ù‡ÿýŠ˜Ì˜\wò¹%ÑøŸeQcö±å…šŠ±fR)ðâÄgS h¾«áþ¦ðÂ<ôÀÙZ™5Õ¹á`í€Ë}Jåla‘õ)0 7gt¡¸ßרÔ3ô`É¢ŽˆÒ¯êŸtjeÊ™¯¤¡>ˆß–Œ0Y·i ¿}ŒOjŠÌq$B–3™HOŸó@ÒxHV²¥¥Œ>Ž~i^§ØèU,QdctŽtù´ìuZöù²×ù²1¾1~qÙëâ²ýøyûñqŒGJïá?&ÿæ=Lþ—/£”Þ’/û²Òñ^“•þj?BJ¯©ýø*¬BJ¯©°úêCJ/ªcü&xoù½f‚÷×ù—õ5/b ,òÄèf¤jàEï¹íþ´)Ÿduª+{ÕÖhE²í.ñ—9c¹ÍU(6‹ä‡7_-¹µ)ȶµíì‰Ìs½¦"¬e Òr/b?`‡bôÁtë>y» J8ʶ¯d.K†¿hHoŒ(“®1h¡ogÂv9 ƒ÷ ÈêXêªÜ‹v_ßÎ5b:¸7,nöñ4ÔÖ[GÜ€¦À,Ïî¾.öãÛXƒy¢úÿyKà7÷#ä÷š¹>êƒql½¦-åe{ätÓ•ž21k–k†Õ¿JÕ@+ŸBùy±ÀÕˆ˜ØaøäDÂÎ>ûw& ¨/Íâì¨,|Aàƒ8À÷'‘ÉïÃR ù嚺²Ò€dWŠs]# €nEéy6ˆZ_vëÈlÄ åÞJëô ‹çŒ*wúV£kÏbò×ÜáÛ©K°K´ž‡–üR’ÚnWD/8Õ‹²tpD›9z3A„³Èh˯ÍN4 ™\Žvn4S¨1æ´b žúl6“üRÓ §P.^ag4,:-Zz¶ªEh{Dt=“9ž¤”Z)šú0O—ê±qkQ•`´«,Ù‚•S¹Gµ0QÕfLÀqz¼J˜P«8H¯ ™ôe w¥ÒƒRÔ©I—VΚVÑ”eu·®iÒ.Ÿ ¼Á#×8;ð6­¥çndoÛ"›…{²2¼ñuvW©Ç“"("Äy¯ˆb7û±zà½õä”G¨DF_æ9À®4H­¹ÓövÙ+\¨Bg¥T©VŠK©4JÉIYîÓšüÉ©SË–r4p»µrµgu¿Ûy9€°CJ^Ø5•þvêB^ΪRN‡Æë<•¶"ÑîIî\>,DÛÕ ²*™7ÑæAÂ’9û±B0¾42]åVyiÁÍJÕøàû\¯{RDÄ üG~»º6ŠÂB5Åo9'Y<»Ë=Fï*ªÊ=IJž»VG¬ýxƨγyçu°ÇÀò5ʪáòðÐR¨³¹íêY/«É€Ö^)¿ž.“ ç#/×aSdÝÇÞÝ{"»2¦éìÊÛ*‡»O '–lºu(ôž”Ž3v¬ò†8þBB(Gá|9Y±À×¢±xÙ <ûT± "ħFÞ`ŒÁä˳íòÊ\õqUšÕº„÷ð#ЬkœØ³>éR‹^{dþía=jã›S=1ÛÈ45s¸gÐÑNÕÏÖù—¼D$é3¤E•C¦0aF¦aDàz¯öéÚ'i)쬘aì´ž ‹DÑ>hSuO'e·EÖ²…iuÂj*fðdAQ³PJ™÷„ù²9’ àøµê ß¼‰>†A¿Òw=™ªt^ÊÅÅnUXxè .s¦,|¡+ËÑ…Ù|í.Ê\Ò¿±“/ûuN{SŸ dbΑ/“‰øOK¦}­­´lÙ”/Ëã ýÖÐJâº3æK´×¥rJ Ìgo¥´¬ÛPF?>І)Ó”äîyóîÀ²+cÚqKdž&Ëâ¾S_hž¹WúÓ²7jÙçËÞæË>Äø2ÄøÅe¯‹Ë>öãuìÇÇ1†”^Ã1~Lþ‘Ò{˜ü/_v¤ôž|Ù—•&KVú«ýT÷šÚ¯Âêæ=V_ãyxSc÷Ù¹”þµ,&“¹rºî1.²nøá}¶–9oJÕ ØÕ2/~aN:n_›ä4½6·òP°“h›™ÄC$kŸú €DFón™‹ßë…Ä«Ñ킹…KÞ›Gù¥Y ¨tØ»}EW¤Á­TðöøGŒ}+jó·Nd`'ÈÔ2X5Îöv®¼è¾ò ·Òg†È¾9ùqY_3'ÿë/;ò{OÙ—…7|M\Öýr J þ! ¨Z¿¤Ô{¾td{ñ-—²ÔNs³pø#˜ „Nâ"ûÕÞ^kÓ<ˆzšÎ÷¯µ3wçD>I 8nÚìG'Çÿ4µ[~¢CS®ütŽªÚÛá8&å—[s\R2çÖ$LX(6Ò8À.™‘|Ààƒµa´CðÕêPs–…]QiH>b“k›V¤üjÙÜïæW/Úå…Ñî) ÁD‘5€ÆN3e1Liž¡›lCÙkÏ«1[â·•ìÕ´¥ùJ0¥šÇ‚øˆ­×ÏxþÄ7À«H0°…Š«}s”²šó Ós0Ó;mÑ3»¼¡·ŒËq'N&ò˜¡kͼ@ ¬eÏñs"ÜÜ$PÍ‹„•ïeo—Sê£PdŒ¯é:p®aœôÜøîuï‹Ë°¾V!¿×̰rT7u'« y{ŸLD)AKõ¯œ„/¨ôeøxãšaÕëÐp*_kuÎØ¹™"‘Áò(õìk”/3¬ÿž—Ù_ÝTp§f뽂ë âúÈ™˜s n¯r‡M½Ó7†'‚: Õv9íZ‡æüµq2æSB5=ŸÛE†¥yA›ìÿóé0kløÜèŒ%¿„s¸²š“ã»<£È‘C¾‚·ÆðqbšúàÛFdñ}'"Õ­§˜ÁA4¸9nü  V× ðÑKTM:T2O{Óÿ÷쟩äY]ëZˆQèø-¤Ê9RÛsªÝÁB£vF]ýÚb‘7ôe‰ ôǺÖÙÔµ/Ÿ:ØG&ްIž¦¢ëÏsBîY¯å}>jLŠÕ4˜ ~Mu3¾²Q•òà#—R_.W òæSÚš6§„⯺§Íª ™-Qdæs´&µ±ŸÉV9[²’ÐstØpÙ ¯f¹j?×x?Ó¼ÅÔ’ô4ÕySÎ-ì‹'»Œ'˭阴³N…,µWØ»òóQe4™¹ìB³zr”ó³w9”jìöáÓSÝ«Üø€œi‡ðòNó\9h¼ÊáÉÂàõÂ3n¥GôÜ@›âÖ¦Rdï& d˜ãæÉ3ë|O³QõϺjñà·…fêXW4‘¬ÒËYšùÒ²ÙUɃ7³À.Ž©Ÿ\XËíb¦íʘzg?Ëz¡Ä çW΋*[Zi2]­ÂÎzÐÇØ×ü‘ÞW¾&Ê™Ïîá·ÍYχjQ~³d•áø<ˆF·´¶KØgŒ€-2–‰ëÝÖs´Tª øk«õN1{á›nÀœEÅéôŒo‘Áž 9Õ-‘u) B¬¡l>ÕnG]3ºò}°Έ‹ó°OzjB7XmQaz.SƒçJ¿vJù¸4¢L„‰¤Óî°1~°P|€T8 ÎCš¬â–YÍxðW™vhâÝ™V {±[»Ï§J±¶ÙmÁÈ´vÿGñeJîÒ²Ž3Y|ÝÒè%ŠXTå#º2ÞøR¬™.,ÏxMØÊ}ip™;xI©^µIy”KJ3)ÿƒ(ï¢z’ñ3øÂáÖSJGôÜ}ìQ¢aD0x…éåÐ{[dýÚò>58É?CædOË^¨eŸ/{/ûãëã—•·Åeûñ2öãã_Ç1~L~à…×0ù_¾ìœÐ{òe_V:Ôç5Yé¯öƒØû-µ_…Õ‘Ò{*¬¾:Æ€/ªcÌ9_Dmº…ˆG*­ÜMâ y+ ¼}³*²]åÔ®f¹ÊÕ+ò7^η~y¹d óÖ³YI]ç‰%ðÏ„d•×ÓWõ|:ßU#Sa“Áª#¯žˆêzøþ'©Üs°Ÿ° ÇàÂ.ÕäɺMCüÓÕèˆðtÚf‰P¨eŽ»¤=ÞUO[ˆ«1ü¼ólßÏökëRU±v>íµû«÷®Î ßÖÀòs| Åé|îàʳŽñûÔv1+u%ýâ2m)€Mz]YIûwà·åË`ƒÔ}ZýŒ–¡¥ZýÆ<ù×nÂdìknÃ5ƒxÒzƒ ¼šúç­‡F+Ùç…ʽ…66D¥‹a|º²Cé=5ºïðfן½]ÇGC»=²aô–ߨÒ·â•Û(¾.ÎsYßÓÅù±G~ïa?|ÒÕÑt¥KÝÒu³¦pÅ“¤ÀÑÎÄ…Ã1ήWÖÔ&²;"ŽÒ°[-"n§ë3Ù7D}R´ð#¨Sf¾îвkçRk ÓñkõŠŽÆØ4é±—b§®fÏñf+=(ŽˆÆ³~KWÚdZGZ&ÞÝé âE¶jf˜çn|©éæ`€&Øõ¡}ÓuÊÛ¦ëeÁo›—,™oº£½²5ÂJúZFS†%"š“âT)‚'ªf­‘C~00Ƶ~ͨJÿ;]£=q¬Rœ‰‹}OäTûrX }տޠ&4“W–á‡ÙP[w²| ³]hfU?§Mòq¾Vµu¨ÏÕF™O¢]Këò=xÂçu ÍÀ IØd¿¯§¿Ó ÄøÕ~ÄËj?š¥k°Ð¸Rõíl_Ù'”‹†ÃÍœ”mn¸PaÉÚC+. fòPº)Äuð†ZÓOÆê±rµûP;Žvk¸­9QO—Ì×è:ó6Ô²q‡yy{#²ƒŽÈ’¸á 4àZÔ<íri^J{æÁ=Mñ{'DÒsxKµ†{ê -pÓ¸@×s}Ñf:»SCd°¦—È|꥔ÓR…ŽÇÁJCG¹r_£×Y.¹ÏxvJ÷áŒQç 7ÞºaÆÔ·ÍòP)iß©+ í±ÛÌ®ô©‹Õ*ÌY1Ÿ*Ò2jmôE´+žºŽã`Ωa=ví‡rôïä$«nŠGbT9 ô€Ãwý£ O0¥ô¢EbNÎJ‘•ÆÐJÁ”‘®ñk.u¡ò9ò…êL5õ$ÚË©¼aFʇÌP €­E-¾f5¨÷ùŒl›ñèA×xâÎÉוAÂÃKs%õP—ÈêµþÖ®A\ø‹‰–_ñk`—W£PdýÒ?ëõ àÛP–Ç㺋7€’)ÏPSíV9‹Ôçnvw˜B‰Œ»Awú-§É0¯®©ÈÜ µ‚QÈ0•gå•b'%¸<›Ç|'D6¹ï¦°¬‘xÆÎš¥8~Ÿb@]Z±G}sp4ŒÓÑèâ¯Ù*µéu+ÇŸõ->8Ch¸§cÎUþ8ðÚ+ÔÑaÚÖuàîÔÐ\W¬³®Y8;š‹‡*épZ2 pl"ƒ“KÔ2XæX`I©`ÉZÀjg&ëÙ™yóiÙKµìóe¯óeb,oCŒ_\VÞ—}ìGyûñqŒå]ãÇ俎Éÿòe?oË—}YésBïÉJµaÖ^SûñUX…ú¼¦Âê«c õyM£Ãèš(¥6«\-¾^Xêîp%¼Jið seyïC ]üB10/‚¾ZDʘs3Lå^…Ô²FÀù¶|IW§¥“Ñ3Úwº›+¡Ž†ZZ œ¿Ì®î )Aµêé>Ýàápf‡ìËM«|’ö…L‹%&„Š…;„ÍÝn‹öGÛ3‡ïD©× á³ÜbFXù2÷rŒ ßfZï,×j&~g|µ]œ¬ó³¡YãX}ÌM–Z#6¥‘ÓJ…‚t“פ°qЦl®µÇ°žæƒÆJæëÊÉÁom3t½í’y”§6_"»¶Ö¶øéDÝ)²Ô¯çÝpZ€ÿMíÖ»˜/Þ §°"¾3—‹F<.ëZ¬:Ôôêú7¡é:#J¶Èf±N7·J—êåVç¤ïÏu$J ¾P.8NRʳ„{‰lPJ³p8•;ˆYø0N/ãóà-´|@èL;ëCäX?dîU­$"{‰¬å‹òB°«^w„ØIõ5Έ+hïóZiW ˆywr'¹FƒóÑ몽.ÙDmZQÿªÿb aª`Ó ¼Êô@*âêåщ¬MÊ»Ì!?Wr¦| s“\çu¸ÖôyÌË<6%çN‘9;®Ø¾ŽÊOgOR°9Øi¼[b7ÏU©zdYS ˜.? Z@<ð!61Ê’Ux o˜y%SN 18ËaJÑÊéU¦j?b=ì„J¹`XU²Ú¬‚x½†ŽxMGxÎd\6ÓC¢Öz•³Ôòó°¶ŸÜ0¦-䇣cá¡×Ë£–ù¨+jÙ²%ø+¤A$éð¸G²ò^ô5 vvRd–®á~nLU(8›°rÆ D§AiU0Òs–ÊEý×RZŸUª¬$¾Òo^+zÐ!Þ ÄèüBâ¢]¯ðJVõ:5ÛÔýÑõ› ï™ ž;WM<œ>xN½ ý¸Ž=„ o†"=.ïÈoŽn•+i]¯3.ì>.Foȯ+PDÈ‹beŠáÅi•Ì/‹¨1ò¹^äÚï1L”2nkf¹t¸íEœŠë]5â~*S1ò•D4Uù—åª<Ÿ¹1"Ð}ŠͶùékT#¼Me0—FnúŸ–½LË>_ö:_ö!Æ"Æ/.+o‹Ë>ö£¼ýø8Æýð"ŽñcòË»˜ü/_öó¶|Ù—•þy[Vú«ý8‚yOíÇWauóž «¯Ž1ÌÚ‹êsÉÆ‹çÿÍo õ›ôÈŽS)¥llK¼ºÄ÷ã3È÷Ï"M¨½H5ýs+X…‘'‚å¹”65ÙY÷‹BF2Ì;Q~ù%ÖªðÂ8ÓvÛg¡È–q”DOäÁ¥ ¼}sEˆ®šî&så6€û,ÜGÍÐoùß“Ç÷dõ\9ÁÛ§>Ô@ÞB´!žíPz·ŠíÚ}8¢«r Ã"eÓÈ_¿6I– ÿ­6˜êËNxÆ­µËôÕÕç:™»IrK³±èN¶KË`ðÔ=…wKèU›J\ƒ/çz}Ôg[J-óÑø=lE¢vZæ” AFõÞÏ|sØÏ‡_¿ #L³T!Ô•L7圻¦§Q Á;¾,kò}ÝÛ³aÛkîv’-?+W³’;x6+ùhõhÌ+{§Ž–Ö.€6€Ö®|Ä™à½xÎ j»VX!‘áe‹ÔÚ³bØ»DY `“•Ä7jõö~:`jõÛ$Û"Ûy†q–(l_.“⣡‰EptM q.µÍ–9LðÈ­Q5³±QÈqïŒö︚²Ÿí p¨'N4µRùÝÈ¡€p)¹‡ü ôeÓ·ò]£0֪ϗ Â´.·ðxËe62¥þY‡ºÈfôãí>ŸàÏ£bç¼²#wñ<¯vféêCKIš>ºå+ž,]~2—kì>T6ÕP@ÀT#Ög`öFümvzqØæDÏáåḽq…½bžQ¬…¦çs\cÓ¨ðbYNôÁâŽV“'êÖÓm@ënNù6+½r³Ò7‘€ô= >&?¼ˆÉÿfXmY¼h†•oƒ¡ÁÕŸ”Röi/t>Ɇù€³bö}Ã[…‡cïNó’; /ïÎ,S÷ÓXl3øëœ|SêL¦vkVÒqœ`&p¯Â·Õ¯CÊ…mçó1ÖôùC"ä`+tú£UeL—]ÌŠVÔÃÎe•œàÀ¯ÁI­éň²3õ¡ã¿:Þ¢}ñ_s\‘9,æ]®3/-Ã×3z,sÇ"ÃçNT¬ÞH©û\ŒÁA¾ÖÈn7P.Ó“ÇUa5vþ ¨›Z<¤ºçåçu6ª ƒòl‚™Ë¯k|î4Y5žLS•\Ú ~Áé–{À^Áˆ»™]»F3 ^Ù]Ïä¶"­ÈQ±|²†Ø‘/Òsd‘žéìgÛN)ÐŒsÎCÍÛ5eË8¡{Í*ÞM‘-÷Âq(N”2Á5Û[ÿX¿P¹gyÎ L¶`9쪀(»"oÓ3æ!o ·W¸îŸ„¹c†¼©÷Æ”>lJeƒuõNn9Ü!íŸ+£oÿƒ{Vr*M÷ì÷­”R*óZÒ(åqï³k#lÜôù5í"ŸEÁ (zÔb öŠe§\g?Ô]±ÿÍYeµEæeª˜ÌL¾àB¥ªuve´#²&Ò!Ú~Ü—Yl½þñPzi“_¿ð ©¼¼xªRç’S¸<8‹¶ë÷NÔxvnÔÚ–.+.Ê5da]E&¾ýÖBd0Ì6;©;&§"_]/dYïØÉ31¬ŽIi¨ í*îì>%jœ×š×bGàëEÆ >XÞÉâ¼I³™ø`ƒ¥§~%·÷ÊçPèݧЩ(®—%¼žK:Ùt(Ä|¼ÅÏ3º"â²ÿt¦p£*|w”H]Jð‚ôŒ8µŒÁL“+à•·ι9»ÖT[½Æýø–Àgøì0 ³ ŠÌcU‰ì*žû´ì…Zöù²×ù²1¾ 1~qÙëâ²ýˆ3~ûñqŒûáEãÇäï‡1ù_¾ìeù²/+ýó¶¬ôWû‚yMíÇWau¤ôž «¯Ž1üÍkê½@˜ÄHs|¡9®$dÎþšoŒøTQ£wG\wŸ$$+4Úò”ʵ›Ýi£­Á12”~H‰kšz™x›L&Ô*èãÑæ¿ÇŒZæF4¥öp1æJ; ä౦ðšÚÄâSîCdn¶¯oªR,xZ(Ü!A›ZwgÖž_öÀ…£=kו?"ƒ)Ù˜ï6ŠtšÝw̺.05[®]†C=¸]óêø®M\ùDðKð/§@ ˜õ~àü{ÿµ»»È@Ë}åÞùT§ý ‡|1cŨ![8x¢Ú cOùªfÏ}ÒcÁ8tó-Mú»2ýñìÜ}‘ÖppdÂëøÔ’_9ýRÏ—Óä±Ea#‡-t㼋ãüvÓänVrðG‹k¥|DISÔ¦©‹ó‘KÀNÇBm–¹3ŽÝc•ÕÖŠ&è{‹J“È€ÁHW82a˜à—ºÉ´úºáÙ4.e´žø“|íÖò‘ ì°˜ŽL2qáZ¦~f_^E/×p=…EÖî‰)Àä³rgòÁcZV²†®Ã‹åçmá—ϯ µZ9äÜKŸ‡ßƒ Îø÷ÓT„rµùÏ3Ž}#ÁÄ-zÅ;Zjå/¼›—7K®°žù8<Áÿ†Ué©1‰füwÉ‘ÙMîI£v-ñÊמŠÖ/ö£Ìu„{¼„ZL·À…Ötœ¾ŽíªÊ|XàðP¬Å?zÚüã²b½S5SÿúYoRO´4¯–@¸¥D!?¸àÇ‹8“âùQ;læÏ35òÃ^TÅZµg\“‚WtÖvb¾_G´‚ŸäKU íÑ6†ÆL9EÅ,ë°ý“-2ÿ$=¡d&‘á~Zöb-û|Ùë|Ù‡_‡¿¸ìeqÙÇ~¼Žýø8Æ8ãqŒ“¼á{˜ü/_VÞ•/û²Ò?oËJµ?o«ýø*¬Ž`ÞSaõÕ1’lxK£÷uõUO•}ÌØ:‚Û:g½>C—ƒÇq±N¼ÒÅ´6ì8â ü`dã¼m]½— âµ3–w߀Ú¹–sBG±l1æk¥Åüôé;‰†D6 ‹µ›Ï7.ÙPy¯·âôpKÞäqEKGæÛlçkÑW󄜓b5"~/l™/m’ÈàÅ£ZøAÄ1ƒØ;{¬Æï¹CmaħG€÷|ܬòz\I1ÁpjñèFg G$•Ov0KWOL]&vzÝà¯ͤ–$²)ÂÊ)Ëz©s2Uõç9†¤6Ù@>½[>.ÿx†æÏ¸¬ƒ“ôÏ,3vv¯ôQ°=ð‚;µÒcç¡ ¢‘I1¨X“ï÷N檾nàrì¯n[•öØýG~%햹ݬTm^ÍJ}ùî ®Õ¾_ƒÇ5c{?ãÁØ×ÇÕ;*OÒ{ø¦ˆ»”“@˜Ò¢°ŸÌÂUà $œÊÖ&ãì4µ*\dÁÕË$HÄU>×á¸^”;Mv.!\Ä"ž°üð^¸«×o7…8´Í`à´˜2Èyu"ôÖ/”ÅmÑQóÈ>˜ðÃyÀ®µæ»µîÚ8`EÔô¯&²Z £×…Ü£*àkm \#u«¶ÂŸŒZé«Ûc…b¸(÷þ«)h Ÿ ~ oiRW†•.OëQC±•8|yTÍJ>¼MB²9ŠHÁ‚CõŽK£–@øÌk5E^‹®ÈÔ¸éƒVB~þG#fpµà?òx¤Ë##\~nÊ¡9ë5¾Þ—9ò /оàÒ5Ñ¥ ­ëëy•;¾êaÉ#ç³qP9ìÕÓµ=^ü0’J{#}»oñÚò³¥m"Õ RåæÕÜì[lÔî^­g³©KøÚÙS§Ö&URN+s4½¹yP-Æä>ßR°Âè6·’%c”@xÏn„{œXeüý µEðî³Ù£óÅ1zºBÒq ðpcˆbQcÖY*µã%ñ€ðô¹Ÿyã½®Xú­Œ[d=çó—…ÂãÇ]h;DDá¦>ó'³×ÿ3Ÿä`Ô1:a)øŸg•U¡kÌî¬ã˶1ãû9'Q5Ö°·LÄèÊÝ'ñO]ÑüšN;ä$Ð8ÂmÔ¿œNŽôÖ+Ò<͉YIó1_Ùš2Œ°Wññ÷5…Ê;ÃÝÅÕ[ÓK®R *I-è%dá#4-p[õ“~ÀßÙÚQhÙŒß3OWÓóãx¡È}U›Çýø“¨PýYî-bT ~ä‘&ëåÚ˜*%AÌQiø#vz–զǴqÑ`Äs@XíÀê&_HYTÔEëÖ4vó 홆gK\›Ö|àL¡È`D®Î—OË^§eŸ/{/ûãëã—½..ûØ—±Çø:ŽñcòãáELþ—/Û/Ê—}Yé—e¥¿ÚŸ·Õ~|V!˜×TX}uŒG0ï©c|†¸+Té§Iø¨\Q3ÈòÉÙ0W EØgœÙ&îRjªê‡QSûðÌwy}¾ÐÚøÿk 0«¹ ¹ÞVoÈð€‰ÑÒtKFvΛ×V¢‘óÚÜ"Ãk¶p±” A)…™ÜDQdÞ²Ciæ6.Tn&ÅòA²]u„Û—Z‹DѶëß sqÐÏ» Á¿ Þõ]¼§o¹Ò¬io@P ü=»¯) ¡oÕ[1 ~ñÚõ{¾AF‘dNøèB"Mæ½ODò©k«Šw"^m‰v†ìSóum.pd³]ò;%ð‡NƒÔ8€3„`ã¹ýèå|Û;’€ÉHµ°$Ú4õú ëÑ`áX«N ³Â“&ó{Ô{ÆW¸P·q{L·íöïA_öì-™ÿÅè÷‹AË=]MÞÐE¿ªNYŸ¿02Ñ;~ zSÑœfbø«¦^\‡./®©$¹öJÄØÓµôþµeUaI|×"±oõ½&¤ˆŽ1˜wöŒ,oÑŽÜÈBÈâJ¦–ÀŒø†¡ŒW¡Ÿô›ÂÊÌ0°„ /›b5€l‘IÆý¤Ap´Ñøìœ0ùãΞgÍ’šô‡7üR-¦]Ë`Ã’_•®$©S ¤›Ci1 ²a‚äz|+—ºy·çõgɪ”6å‹’HQ÷bºRC–&m€ƒÉ~µì¤¬®š´.Ø”Ó4õ_ÓŒ…v†€üÚ«XÚ h[K…л]N32ŠåCË|¸@Z ¥ûI[l…WH}K] >«¤äÓYh¯ªÙ•€ÍCÌëçÍ0M-•šYœ«àÃ&—ùN›f|h‰”|ëÕÃçmÔÄœ¾Á‡-ž¨5i™Š)˜³ÈTnØw‡+ä.µ©WvL¾ÚÚ”ü<0× ¨¹^¨Õç½·2ŽsŒvÖ×·0€hMáËœ ž• Ø[¨r6Î>™çÏ®Cﯞ’’gå,tÚöª3WåÚcÁ]xÏVa7òpb+òîí[Äo˳FÚ0×Éëå3¬2-⇚õ:kJÁò+ù‚{׌{¬c:}Î ¬(ˆšŽïDµ€§¨} ûD›”J¥üÀÖÕÿ¸æÕ§lC‰Lßiª!5‡³˜N"qκ’*ÆúŒºqÀÇŇØúvq>þ¢]œß «ÍP¼h†ÕWûQÞVû8±2‘²` äÊJ™Š•—ì,OO‰ptp«’¨^6õ°¥(H)Y_ª°ÐÚ·³›0oarGd%ÕSpàˆ?61þx¾¥øñŠpj:¼WšOêd¥ýñ»ÉTX’Qiç×rPmAœNÝ™édm2eóàɺBjdê×pFßgH“Ù–]¡‚ÄÛ¡tç°—æðê²’gAééªïMè/Ÿìg9ÿHVpHdΡ° îf×äl<öêÄ­>}ª(n,‹ÑŠ€èsóCû!w ×tÂX¾Ì«ùX”ƒ`ç«®>”×{Щ GxÓS0éåŽu7öç_ûG㨽O×LS™U€ŒráúMémçšjÔ=ÙtЬ?¹=¥Å1Õc …P MhòAÊ¥ÖÌôðüÝÅãzKÙ™+½*Ûå·Èp¬2ƒHb8^W¢=ÕžÊ'‰lž¼Ú®6m›Í'ùóP=f¨òCøÂt‘%N=õøfšÔbFôõó| ó¹]—V9¦õç™t*Y¶ÖgŠ ’(™G T¬r8õc8†ÊŒ|æF ‘áÀ[ˆl<ÉA4åÕAÇ­¤W ‰CmMó•üë…õ‰kKto2®ôB—IJžOË^§eŸ/{/ûã ã—½..ûØ—±Çø:Žñcò)ç÷0ù_¾lËïEù²/+]Þ••þj?B¯©ýø*¬~ÞVaõÕ1Y¼§ŽÑ;ßsLhu•k¡é?]×_ºö”<´…ÁÒé'Ú"åò†y\¨ \|¨ Vá6ûÑŸ_[ì/s]J×ã¾–D¶LaL«>]BœQCd8­®þ²Ò÷ëzÈ”°q­]a쪉R‚+ôDÅ/E¤d‚x½I0.Yš+€mƒvHFsì5á‹¢h}»ÐGdŽÂrˆÌ©÷hl>¹?ôy9î­$¼çU$=«7¡g¶%úHê\/ø?ŠÓn×ú›z€e•Éô©Ãü7@dK¯Ã¯‰Tµ*Â9[ÿ$?üDMH}0ûÂg¥Çòÿ¦Çò ÊRTÆ4G#*‡c+ªÉŸ‹P¾>³…üF¦²P½_›fJÙÉÛ0º>Ó}¿ÌLùÙnœÞsòa”–ŠíûUlo¶Ú«à#À•:"p‡.øÐ©W¤Ö”ÀmoÄ"°Ú➪Mµkã’^ç×]¢C oðdjm€…ט†t­ÈiýZÒâûËØ¬ á•$"„œ%Àƒwh§ÉXÏ,øa•÷^ÕŸE½{/OŠgLHdØ™²•1z6üX%”{>6…üzßà)=mùÚoÒÇu•/|·ÏÕ4Ù5L½zCßÕÖk¼`O;I‡ÚÑÍ×^h)ŸÁ.ò׊?|ïQá_òqúIŸ!‰hóìÍLò¯Td¶3sŠÈ$(zO„¥AcSÉô¾8µ^—qÀûæf²…›ó.À);ÛNç#ÌVk AGSG?kNôH‚)ð’Æ¨ÃüðyßΗxxÑÎø µFzï®ÆÌk”‚-Ó.—š‡ÜÊúù\ ²ž1#¡ìeJ%Tn>í”JO-rŒÃóÕ6ùº2èæ€êf®Œì`fÛEXÕk5…wÓñŒka[ðòFå »Ù5Ò¿ô«‹Ú§P˜ø3×Hÿ¢¨Ñ‘WS3–/)“ ­Œ Zq‡Ê}]ãJ{@Óv-§èQô¼è4Æo~…4]'Ý3zªív1UtEçJ/מ®ÑøÁRšÎ×MqŠK­õjÿ®K[æÒªÊÑx£3Sõ}Û.]šÅ¨§> ãÊÆ.Q!pï‚°ÉÓóüµ\I¨âP:'3 ÏåˆDÀé‹°ò¹-ºÆ³ y/ÙÙÕ.Õì}¨ûÍŠ Â.Þ!Ï5–hé|¦ÅðÓùòS6:!·Œh&×Õ’F¥·HÎ@ëPH)xeCÒ@+\¼H6½}¿ •§3 Ê&bÐÊC-V؉¾öCÝ+½ö¿;¹´“/¾ŠŒÉ—qnáóéFª Êh‡YùqÒóJxòÌ— ;ëkV뜒ç×x²¸]öÅW¡ÆBвxQr+1ËO#ÄWi'>sÅ#×¢4ß²d´/gïáF3z£Ï›£ë£Â^±Å·ñvËïEo¿Iq[}^3)î«°:²xO…•ƒå±!U.>†ÃåBåó¿dçTÜÒ5' >3Ê\—fÌ {þŠ¥ÆÁò<´Ó@¾µ â8gìCE‚–züÒ:Õ#ÏÂövêJÁ”ÂÒEøµS ôSXâ³E¶æŠ5_áz•d¤¬ òç€ðûÁáð~"¸YçÓ=SÃ8XÏ×i™V—â~k?ܱB‹)ßóŒašÂ³ÅÈð>S†¦ûT iY1꽓kŒ‘=ËÍ3Ó÷?^s´²Id‡ÈžtªvëgÛÞ®6m&Å‚§Î|m‡†Çÿí8cŸ1ìËbM)pÅ)ýÙ=ÿz°|þªÿÚˆY?±í¤ß¾øØëü#?”R®Ë¿«hN1_[”_PåPí3Ù"k“Ógü†“P­>`$_QÿR–ÎI.;¡Å6)u#s'î EvÒNŸ–½TË>_ö2_ö!Æ×!Æ/.{a\ö±¯c?>ŽñeãÇ䇞¾†Éÿòeñð¢|Ù—•.ïÊJµ?o«ýø*¬BG^SaõÕ1Á¼§ŽÑ[®Ø‰‘­!»0/xÕ®öèZTimy’Úôøæ îG%wã5Õ(´Ò5²y¥)QÌ–Ù[âU·Ièagœu‡Êe%á£"Òtû²;®ÎôÞÊ+Ù½3¤Qd°³µQ—¬IJ3z»¶u¯UÌÑ€Á¢_òæmz˜‰«B··©Xù°Û§»Z¨©³ZxmÏ™Õ M·a,‡¡x cŽnÁç½kaj½c`8†¡JqkªŽaìˆN|¶wxhmÕ¢‡<‰×‰E¶aœáü3¸_P~¬kÊ}«×¦’2§$›Î‚› ò½o–Ë7×оt³fsvNuà®B¶‡oÃèË-dUÈa Ñ}ô&âõî›Oh ´ #°V£û°3ä7ón›Ýð£œö·-¥™$\µÖáu:»|{"•‡òl¸QÛL:—€š.Ú´¤J`RÏ…Ú(Å6÷{àGŸFÏSÛ JµK5uù‰á-14`À(Â’¸‹˜,Yôv |¥T¨Œ¸4ƇRßÊê5?Y¦h¡qKªiUØámâÝnRæ ;ë¼þ¨„Î!P~úÍJ/°õ}>³Ñ?»H¼Y½y0ï„xÕ73Ñ;ŒM"båjý¼6ôyá³é}¼™¯›•ýÚÞ|ß3E6òµôÀbHÿÊÒ. ¸¼)³¸,]´‹é†ÓM46õÌ„Ùg7z˜5ŠçÕ_Öm([èQÍ>M˜¥ç}s7È"£þõ±’@>¼E¦Ï×ijV2'x;Á—E€ÍjꪇuPšnžÝZ[Gàªc¿µ;ö­Üíã xEã­§§¸‚¤û? )À„óßô³Òk¿ˆß(ÍœÈÕy‡Z× ~‹$Æ¥ÛJã¯Pº/9agM=×kÑ Þ=ÏT†~í´þ:BW“w©-‚4'Λ²•q0ýäšó‚6e·vPº_ÈÒ{ƒhMóÜ®ãVÿ¨K%wžÃñêñi¹Î¡ÍJîFB˺¯°ÐæJX‡ +õ0JÓ·”i‹Wîiñ× (ºéu€”fj|puŽL̶6×4€R´ !äµ°W¾:ÕuÑMÃÒelÖµYŠ p˜¢¨ÏjOVvl@Ö], ®VAô:¥KÞÅI~ÈF™4ïÛ¿ÞÕüþr W^´Ûµ¿ >I`GÛ‡#vî>­ëuˆ²ÅrÕ¢Æé…0]ÎU ñ–·”EwŸÏ½*Ìç>žVq™5(õà^í³ðé'â}ZÕ*ÀâËþO {ÐxS<5D‘Y²› #žõ<&—”uÜÊU]žÙ™j£†¦W:@·˜úß–ÀzTó5[½;SNjq̆O80 D‚_›²q«]aÖà#:‰ypÏ^ÍÉÜåt$þ+<öéïçLª»è¾x¯ËpÖ)DÖs“ÙN3¨§$ÖCùúM°xµÀ8¨~íµƒ8~ml „aYEz/ áeÍ2äkf³ý¤B -5Âe­ª}ih€5|pK!fÓöOvŠÓ?+tâo¥8Ïzæc+¾½ÒQ½e¯ô71Ò‹æ1~uŒ<¼§Ž±¬4¨ÜÖ9Sð¡MãÏ>›¿”sͶ¹§sÆjáØ†Š>8p…“òDÑÆÇy_Ûî9BÜοéÉô´Ð¥ ×¶ôã¡X‹’6g¯VféÛœí\¯œªQ’腹̸õ)ãj¹®ç¨þËšœ«ÏôQ`ÙÓ»veJVvÞ'%e %2gŽÄ®ÃÓ§Æ$2¯Õ ƒÖÚÔª.çíäZöB-û|ÙË|Ù‡_‡¿¸ì…qÙÇ~¼Žýø8Æ—qŒ“O•{ “ÿåËâáEù²/+]Þ••þj?~ÞVûñUX…‹yM…ÕWÇxóž:ƯZøÒ¥wT 5ùAœ¿¦&ÿë| õšÎ—¯¿,@þkú˾.ÎxxQç×+ñÛKz¥¿‰ê^3‘à›û÷øEs?¾é:[~/š®óͰÚêóšVߤ¸#‹÷LŠûæ1Æá½hãWÇx.ÿ‹ê?-{›–}¾ìe¾ìCŒ¯CŒ_\ö¸ìc?^Ç~|ãË8ÆÉ=} “ÿåËâáEù²/+]Þ••þj?~ÞVûñUX…޼¦Âê«c<‚yOcó¶5èz hé%ôoy·'õo˜º€ã—ªÞ[fHŠ…sP¨ÒVfØï}*†qV›Ö‰Øöë`¨Å#¹.ÝVoðƒÈO)êø½ak c ÊíhÞÞØmå@æ})‡”üîS~iî^éƒà'YlŸÛ•ó*gë|ðæÌëîo¸÷ˆ¬•»Z¸^±Zسzˆ ¢a]±Ò «Å±&݇yµµO©'¾°ÉB­Ò.ا BåU&Ÿ?ÁIV™ÌR #Î>«+ÃÙJs!´¿@F7„éütÅMŒÑÕa8¼ý-ÎËÛö! ‹>B¿î,¯wк*ñ^™ã¢Ôá £C‘òks3c;ªjS°Ñ÷`4èÐT†1×Í€>†Ñf ‘9fY+D;½%I%Ü׺ÀÖPÐÞW¯\Èáom½àGo×ïy”Gá2gTåBR³KZ‹(‘ÇW a÷gÈv™Ö±HÔü—Ž+DKE s1¨]9gš¨9פ—óc —ƒû:d¦{˜¶oî†ÞOkЏ\è}X/ŒŠS®“¬etÆ[~¿YYØ´mÄøÈ¯âFÕ?Xz𓱠ÿ‰W'0À‡ ‚ë"¤TO?ÑsñL¨î¹³Í[k™oAÄpÜ¡ùuèWÌP.0§^Dͪ’_.“‘J_Uí”ø®M±/nµ2W >Š }ÖÒÕRfɈ%½í/Q²Ã®þ²|Ø}µÓâûظ™&…YfËô†°„&xÙŒð ò4ò“"£AÖjѬ䆶šü `/5îP硌4Ô§\¦]Tdª]±/üŸÆP¸«e(Ýàp˜Ø¬ˆkE]œÅý._×Ûõg}Δ6嫵|¬ ç$“˳¤NnïŸë’&Þ `!š«œØ0¼M}¼°îq?—̃¢õfVv¨y u9ͽkÞØÕã.¡eŽÿÓ"˜ÒMô†Î¼K{FƒÏ*)‹Ú« Ø£ùjÈ\CíÃͳñž¾àh¼ž>Í|ð8ƒˆ@â »÷U1fpbdD eÞ§vÃæ“V¨ö™“0§fµ2ÂØÔÛ0f5Ly¿”ˆåÚ®øû´In¡#”Ñ-‡Ù×=× !4$2Œð8Î1ÚY@(V½lâa»Æšfm«På øE·«Œ@uÞb˜4·¥¤=ŒaÛ«>u$-‹äu:eã[x*4EPëÞ¾Ûç|ojº­ÞµüÇa‚áðÔrœ.e½ÎšYÀò‹°Â½‹ÈÀ31yšNT~:J¢1 ˆ²;ÕžZ@ ö»uwY£±I©(L_[‚ÇnÖzx[b<ÆE gáéýdÄ9ëaœ€S7 üžÄã•|ñf:~õ•LLîô¤ó P¢v60ìì<Îð±­X½ˆ»¦‚ƒÒg”xÑCüIõ÷ÅB>ëYžè ÄÑ=/š‰Y€1„”z:µ§øÖñ)f¸¬T^qDÒj9ÆÝjô“v§¾ð‡Âû³i‚Çv²»[´ý çEÚ¾ÉÌ”ªrýžƒ Q8ÈèѯíôcʤLê” õ?Ë;é ä3/xË#Ý’[Iþ%€ÑN`'1,ÞPVÅòZŒûL&_"'¹ õLq«±úç¡aÏpªÝµ,– Š™u‡ çÑøØ8üÑ“¼~èЀ?>š¨®úŸêɳ,êèÀDz1T»&. »8ð:i¶Ý•ÉP&EÓàa¤e@ÔW‘É© Ú õ$Æwг®~…ó°­%D†k“:BÅêÍ®b`efŬ•Ð?Ïù\qÝc¶óÉG\㇢:œ¶¹È]UÐê©›yÝ*õ0:%¾P$¦¸t–Þlo‘Æ w]0-ÌöGÅýØ!/É5"sŸ4¶l°ú§å&2ÌðY‰” Þ­ªAÝv¤´‚¸+ª&x¥.q˜×T‰¹-ID[ªÇvýÚšP¨¶'Í0;Ë0"NŒ4ç ó ++e*VN%<-k¥«q EÅ>™å€Ê‹R²¾Tû1úPíÜÈÛBåM"캒#²’T–g}Ò§?»5ù<ø €b¬*ðÁ9äë2Òþø]‹Š4/8(ɨ´s+{G‡Üz Âx€Ërku…*‹³,Ÿ"¨zAï!hÓ– Ú °ÏJçÎôÍS,uYÉ“Dü*¬^YaõÍc<ßï=ó?-{–}¾ìu¾ìCŒ/DŒ_\öº¸ìc?^Æ~|ãë8ÆÉ§œßÃäù²-¿å˾¬tyWVú«ýY¼¦öã«°úy[…ÕWÇxdñž:F|%ó®ùàþ*:ã3øPë©1¬9]¥ûøÔCgì+:T/¼çòcÌç-R×ÌYoõ»"šrµªÀ÷hb½Õ®.ˆB×Î9à‡‡†-¼øôÒáìœ7ÞÖA¸¦uSÉ(˜…˜–¡žæûÓŽ:Eö!Ø•Æ@è™'äLJc7œ&Ðß1xNRî0o‹b)¥Y^¶Vˆ _•¼»«…Ñ0èTÝÈò ]´" :¸:l¸Îx.¯§OR³ì=ÌSµþ`w¦?-ÄÈ«ù²*¼¹¬. ×á–Ä%Ó.‰‹… ƒà}U.Úræ¯^íj¾ƒ†Rò)”³ 6 û§›š“ï E;üÒxó(›•àÖ }µOúH!LÄ:‚s”·‚C)ˆK]HO¨y ÍÏ+äüD®Æ·ÔW¼\’ˆ¨¶øüõˆË|×î}Ú"tÓ„ƒ^—Ô"ù¶¯xhZÿá}cCMË=¶¶:‰Ê]]æË0§ÖÃ^=ݺñW›7*bóÔàëêé²ÿÒ1^[~¶´ç z»5UÎITªLÅ—AÕSæ5iX—¡¦öY$|8²>/!à$ϿűB­*ƒ4'@™G• cܶQf™w±[Mך—<£­{áÚlJv‹¬YRÙס´”“¢ª\®ñ 9i¤ë.ªBI>á¦D˜àmðlìÎ?ë'ãxûr¦Ê°í†hp‡“w{£iµ|µ•B–šAà#`y&$‘å«#ßNûàŠóúzÔö¹éu§W3 cÌ7Ïqí0ï0Ýô¤ž z¼7=ÂC)9ÅA¹¤z:ö[Ñ*Orùˆëçqí/3ÑO@©¹-©înò=%ÊFÕ¸ @ ãð=„™ž¶W̓-57Ú¬h¦s_v¡#­DTgFã­¨¹CÙ=e£FÚpú• ßý¬/ ëpMilzõ.øT…slw0o43 W›9GÌyóõ{TË·%ðQ¬m lÝ”"«}æŠÅò±q„aÃk¯‚܆}éõÚ]\¡Hð†™º„H%ó'>…Ž"›6”¯nǬeò¸‹"CŠå©^òø&é“ÕtÒzÄ@+wy#’/?Þ)˲gNJ¦·ðé,<ØÑÙ°!2ó<;ó¹Þ»´@Ð×¾*Ô¬U[}%E€Ÿ‹*Wϲ¶ @ûÙ·ÃÁÆÙ?ÅrMiÙWûQÞVûñMŠÛˆøE“â¾½Òk½h¯ô§e¯Ó²Ï—½Î—}ˆñuˆñ‹Ë^—}ìÇËØc|Çø1ùñð"&ÿË—í‡å˾¬ô˲Ò_íÇÏÛj?¾ «Ìk*¬¾:Æ#˜÷Ô1šÏšÎ²Ç«WÂÑÜK܇é{­ª.B,E}ey D×å/KÝ >AX%âwÿ”^Í À9S"C¸¤îßû$¼£¤¾ïyü#Ð.½€áJJd%N|C nœî¤¿é°xª¨_S8äF;.YM…ãÜ¡znî¼nø î Š~š‘á?‡Dáਅ”ÆÚÞ¢*]z+~*ô®p€ƒ0ÅcHèçÚUè^¡³” ÂÛyuÉÕ&~aj8ûS­Ÿå‰f¹r’Èvñ_sN½Î]Œœkס"¸bö"*²Zgc¸¯-*·u¤—ßWYõI·4Ë —6n“ú×,Ó0¦É³+ÏœužÉäaœˆ’ÊA)r1ÀÚ5€ðs´0ŒNI$É/s¶ð3„?ÊÔ½“íâp|È‚|z7…óKUó6Pí]@Îæˆßååðí÷òý!ü7°ôKðà é4¿Ôw!ÿ*׊4.e´žd2¯CÜÂbµ¦R;uÏýƒ·ðqƒ]=k“ÖÑv™ÝÄäDÙéå¬\ã e2ë8ÑüóéúØ#%„Z­òóÙ#?ð{¥M"ÿ~ê$-¥0KyÄZŠØÆ‰[v8X†Z?K51ÝÖÙZç  ì@õ–ÕD,YaÑãŒýw5Å ÇèñP}ýQ|ºhL=F·_“5€ "yšyÂ/Æá£ÅŽ£Ç‹Ÿí†Û?T‹”ˆƒ5ãò_°Ñâ!îì) 7bôNÕô6ê_÷ÁèqÞ«ïàätgÂ-%Ú8èÈù!⣖9¶L.&Ù%¥É~B ðßgãT¦é¼±jh7LS,‰oX=,Ÿx R«Xæ§qSë¦Ï¤ ëý†™· ˜Gu­kã.Æ»®Ui>øAô™¯'mHÍôaj ° ´³øª~r,FÅ€©Ë5âS‹¡Ç9’°z6,NÚ8ÄŒ]v¥kPí·óåÐ÷ì|é-µ5ͼ‡Ö×rI|u5ÇfXfÒ`JX²æ1C„»¸x¥ˆ#6ÜI>e>Àé׉‘y÷ùWÎÕ,‘2€iâµ<=umaÈžÓßxÖ·GÈ€| éæríÁYI-nÖäijE¯óä„ÂA#®‡ÓC~æJíí#OŠÌ}‚E¼›5T¹†Ë¡öö•ª,ž¯éÑ=îÄ…ž<³Ð‘æˆ#üHR'?<³º"·çf„ q=ù¥ej‰‹â g)ãí哯³“=+;%ÜT¬á½•jý¢RÔÏÏllÊ»3rƒüt(…ºó2½ÕÕ6BŽVu– ñ>«ØµBf´¬­€)}Üš>_V@]ƒªÙ;[¯Ÿ½¶åŠ“0'ÂÁ«öÃ×èÉI©cßï1ëO¾©»àºªE£™5 Ô Fç2é–ª·×^7 ‰ø”¼ö î.òÜÎgú %~ Øögì­k¤’7³²&1Ú$ó c*Ì@Øiñ€ïM‘mjL­*8/JQññrÿÐÎé_ QÍç¼™Û¯íÓk¢bÕÖE˜:£ó@|Íøx>wÀÔ‰ˆ[5Ý©$5Æá¿E ×iÄ Ï¤hò÷Õ¥Xó4š”cÑWÖCQE=`jÿ5R-åS¨Õ86Öµ¡è6~}Ôkq”O‡è•†Ñ§ÅÓcå”4[†?Æg>³(¡Å(ì0,Þ™ÅPàÞQå¼5V*— müªmü(Â<>x‹ÂÚÞ®fÛ5ÖA•C˜B¿ Þá¾f‚÷ôu0W³Òšjiñô†0¼OÒÙÍ&¹ÌÆ^Tÿ¬Cý-)ÊÙè±|KÁRÛ3ls'°\³·Ì×AZ`à“ñ/®üÚ¡6º)s¸®&\ºlT6‘N½c_À¦LÚeˆ%a›=¼ÜTî¤ »X< ¬!tï“l…¦Õ[LIÊOoÄy÷6È1ºS)“NØW è!&OK Om ”lÈ^ùŽv‘yÜ©–ÀÖÔþïûÙ«ê¹/e pX1ð“œ_ã&M);ïÙºÒµ¥ÿ.Íçn$ãO—êÝÊXÛ…øW“k„_‹4äò¶ÄLì–ÓD O„³›mñ—˜ýè>õ!«%p–2—­4M~r&q£Ì9(̲ÝÜaÖ³ŒNƒOsúTë‡ß6/V[ð¸l±ïÈsU&¹¸nÇ{c)/§5j€|ïŠÊêT¼$ØÜ‡Éô]<…íj¾[$_·‰¡˜w®A‘••`º‰„WºÀÑÊrðèã2 ù^-Òî± µ“ AП#”~:öõ´Ÿ±+º^é'SÉ´æ\¡©/Ð ¥-Þ§È‘S _.³Û¹Nµð4u C…³¤$¼à7¼^CxãÅ×6éË|3OŠcmØ"G\FR]BËœHÐÝ=G®ªÁè&rå>ç¦wªft€@u%+²Cð•/çz±Ù› #þêE+¦~µ·ßëЙü•ö´fÂR&@òá=Œ5ΰúòeçPÞ“/û¦ë„ëxÍtog˜ž×ìâ|¦œTJ)ùIÞcãܧV’†3¼‡›>ЦýCä³(˜¢b›gùÛ¢bÙˆ´êNÔî3v9Ò™'˜)²qlý¾PPÇ))µ#²&Ϊs¯ýðÒ–c¼xÊH7 Îbó!íòâ^à¨8þ§³@¸Ô§C Y(OwÊ´®Ë¹†[Ú"ë3 º_»še‹ VR`r*2ð’“z!˯Âjµ/ª°ú´ìuZöù²×ù²1¾ 1~qÙëâ²ýˆ3~ûñqŒûáEãÇäï‡1ù_¾ìeù²/+ýó¶¬ôWû‚yMíÇWau¤ôž «¯Ž1üÍkê^­iÜ fªyî æú³s)Ç¡$Ç@ñpŒ¦V`Œk}19ÀÌ9Osµs•ÓµΧHË|dºÕN®gy#F¡”LÝ)ã·/¥Ry}©lóñ#…Îè=SdíôJçSêéØÙÐ{ì¶Žƒr“ÅÃqßs™MniöM¦3<Œ<.ÃXîo –ÎØ–G*—Ï€ä VŠ™Áýi£0ŠÂª…6ú„ù=€Ã¶:gú²þä[[¬¤6˜w÷Ÿµ¥¸³¶Ëu´^™pgä‹Þ)B~ûÂxuÓÃbLuU½ÎÁ‘x¤Úä}­‡Àm©¥Wª(=; Û—‘mؽ qôÁÖdGM#ïñ¶ILj7?prb˜`®Biñ•Î&– ßngÑØh5ŠÂ÷Pá{Œ¾lZÏa½ÙņB¶Zo ,Y"x0㈠oA1¡5 Ä”–Êß{â7í“éÞoÁ‡u÷>¯ Ð2ÓëªrNŽ&Eýs\¨žLUÌ´µ„ÒzÌ] U6®/5€Wzg(L«l›uæ6Ñ5>=D ‹Ûb‡Ì³½J¤.ܳˆ |ŸÌ¨UŠ å>ˆ±; hÝ› vK <¿”;ÏT®øfhOÅÀIòôñIÞmõ×É.\0™5S¼K.)”®««)‡U38äT‡ZžÚo¸3{–•lµ¨¹¹ô»÷)N¡Ga÷O<Ø"Ö‚`Õ=ÓFŒ°MhÆçP3¡M*5ð¥ª= ~›XG¿®–À<¢up:X¤ù›]œO&ˆ`÷ üš8ÆÜÓ5JÑ cÇÊj¼µ1$%·d¢r«Úì‚H ”ÑY©$Ê ž?žÜ³ˆ‘\{¥ÇIO¡붪(uœiŒjÙqÐMK­zÂuÃ8}&… Úô\¨™–©ñ6×*=-­„•lÏ:™VÀV6 "àŽÐ¯ûvX‡¡—§u7Á¬ñ5¨¶¬)7àó<Ä1%JJêâ¬>ÐJ;ý}HAÜ(ÒŠÃè~pZÑôPË ÓÚ|á¦Ö'¹,_‡ë©>Þ® Lnz–4׫+¶OR9¿„W{ûÊÚ”`r·¥–cgçxÒ½…’ ûÑÎY©š«dø…Ãã>¦up1ˆsÛÔLäÜ!r [tKžõc díÇäï‡1ùßÜ#˜÷Ìýø¶nìö¢-ëìÛš’Öß–£Ütn›uëga®Üà)”Þê^ÅYØVH*!:‘µI¹Çúéåóó%Ì\³^gM…y‹Šâà ;EæÛŠÛWξå.ù\@<|'/Ä–"hk_ÚúãÓ­(¦ËOƒ^cñ<ð!6Ñ*b¯TS {Ã+™rR±®b7ã†õ&”©-1$ã”ëÜÕ(=ÕȪx߬‚xå>5§«ˆ?`\6ÓC¢Öz->¬K“Æ÷4ÐWüµŽŽ ǼƠµÌÓjÔ²eKðVHE0"“ösey OÇfå¾`g/ê6]¡Ü˜ª¸b6aåÜ3¿lv¥ÕHž0ª™ £(ê¿RZž‹+UV_(>ÀäÚ4‡x+£ó ‰ãF<÷<”„òR9ø5Œ®ØTxÏñúC+½»(‹ÞNÐ~\‡]V°(,=uÓ\¨r%­ëu6U>™*ÿ§4³+PTaì3Í4P¹[÷½#jŒDŠ+àÄw_SÙŸJI—·­åÑÅ×…Oç×})™ê>EÕ%»‡-±ÜjúT×(£ðŠá ¿ö|Î,å“3¨ æÒÈwŧeïҲϗ½Î—}ˆñ…ˆñ‹ËÊÛâ²ý(oc?>Žq?¼ˆcü˜üò.&ÿË—ý¼-_öe¥Þ–•þj?Ž`ÞSûñUXÁ¼§Âê«c ³öš:ÆêÝEWFehîíÑ«òJÎÓ»å7»Âù]ŒC™O+¾\£å ¨nŽz0µ)Ä0’ôœ4Þí™â?xa/à·¥P±è‰jn™ÐÍ›‚_À=>›O¶‘[létÜÛÅ%ûkÚ88¯Líé­•»×?‚· ‹çŸŽ›Jüía”zÛ3ÀmC²ÝJlòÃaGOLfÛËíŽö|‹4jx׿6%Ñ#×Þcðôxlýˆ³KÞuÎz>÷Q‹ž/õéãnê2Œ^ETÏêWû~ÿåQcºX 9Å$"ÆžÐY£ OÞõ_bÌÓÛõk{,v=ÔƒZ“×Y¼°m!^-[xXæç?¹Ú).Ðüµ’Tí]Ôj´œç´… jZCå1† ¤nakÞ[~°ïªÝ/9Ë—µÅ™þòkºá蔂´ËÃ༮^T|$uzÕ¦„Rò8Xĺè&ø®!_ÖíêoñýëÏ^rÆE¹zøÒŒÛ5a†Èú³…÷V$ã<8xÓrºLæÈ—2Zºzø€¼Œ¸&X²pršží½Äê'ÊÜSáíj;bÛ¢ðg…6­G~%í´Å)¹…–MïʾíqVK©]Í.Ö¯Ô3u‚xs™¦á§³ƒkR©«ó¬Œ®qìðŒWߨÚþád¤Z]15ªÅ¯C½F…'S¶ bˆìk“c¦Ï¤˜ù¤Í¸¬Ëác1Ë”0be ¼æè!2oX¬•t®f4­@J“ú7á[yÝ­²'í¡Yø:ð|uÛM¯;̳TÙ:²ã2¥Ê—§|õ!æPóvËKÇåó®#)”þWú-ö^<ÀS"S¦-Eæ³µj2òï1.<ßPÚµs_Ïøé¼³Gx^Ãlrt%>®±ÃnPKëÆèÙ2‰1-ÂØÚÉàø‹\.fZÓi¤¥|# EV¼A>Ѭ> í'Ðeg}ƒvOõöŸyœðG°ð­Šž lŠÚ¹Òu³¦É@8ϬÄG ¼wPOWæØ'ã‹ðð7ñÐJåešlã„Næ7D„òr'ÍK(3_whÙ±µ¦¨¿VE §£1Ǧ@ÿ uòCÝVXÉñ“BaæÃÙûÔeZÇAÎiiQ˜xw§7ôIûÙª™†;g×ÃÁ¬c;ÇP|կ俉Œ-Þ3‘àÛ_v¢þ÷ì/k–®¥Rciå0u¢óÁåÐ@²™“ö’5\¨°d.¥ÆËçñP¼¬‡Ü}¾™~2”ë>Έ쇧š®Tš5²Wîé4Ý$1hÀ‹W˜w&×ENòš¡ƒow¥8çP QfVhQó¼áº_J;ÓUŽdˆä;DKf “Ô6§”ºB Ÿf$þk­®í2Éšj?`M/‘ù¤¤¥%¢+AbÓàÊ=t÷×i±ßg<5XRZÜ(ê ÅÌ|@Äf|€u1Šy]Û«\iÝfv%v\|ü¨¾$U`Ίù#ÅŸé¶Ù6ËÕ¶6æϼµ®é‚ÖѢಯšÚ}*‚±L}¹µ Á<º¤Êm\5µ‹æ^¯@NýšYºPù?< déÝÖÞ[ƒt¯÷W³Ö!ïf¥­e³ Y¨}S¸Åp 1óÁ£y! èið¸sU£‰Ë…Ál³ãÏèUÚBDr•ZæýìÑá#<6õnÛ§—ĨUSí¾wGÃÖJiVÂÿùÔÍçø@ø'I1_>ÿv>6•ùpÂQôª+½±ìîF^•(hôlQÀUF’/Ëu¦ ’ÒóåNÙ¨Œ%º7dÚzŸ4@mÄŸé46Þ¥¾#«@á ¤°Qš}$µ$\‰nJÕóƒi²:wx«úxwcE[©ÒJö3åþLú>Ýt;ÈMê㩽zÆ=Ŧ3N™ÎÇû[Êş䡵pWúÍq¯)Üõ×ׯ­k†»¨à?‚Q`=“°÷B #?Y¹Ecz[p×D‚_Ä+™N[ ´Fº¢®Ž»>ñ$•ßüBŒ£Ð¼;2iJìÌÚdZÍò…·¶­C3Nðöñü›tyïî4 u¥}.^?ý2Ûã†Òn'e5üõ|éH7÷үŎˊR£ü@–íÇ~„} ûñõJ‡ü^Ó+ýmV:ˆê=›•a/ù%œƒ wy´d5]»*—e’òÞB«ä˰¡‘<¦²×vº!Ë (3Ü4ø@­®0YùúD4ºÃºRœžæSó½fÙZWN¢Ðñ[H•sTB~-Ñ’-ç†Ð¨-ò@±Èúê²”ðájê¾å6D†O³ÒÁ6™ÃTtýÙãaN÷¬W ³ô“b5 ´‚_‹ªê Xlëy° Æ¥ÔE†Ë¨Üë£zXÓ§Æ'þª{Ú¬LÚl‰"ó v¥8í*sX°‹¼CÕ‡Í]6\vÃ3€W¾ pMYÍyŠ©]‹ Sjwb“©g\Ï ú8œAk:&í¬“µ0Í9âÈ6?µ•&3—yM×࿊ª ¶¸6ÞŸñÛ³¥Ln܇(ÑáåªÝ>ˆ‰Š5íZ?í\ϸ•Ñs{-Ѱ6•"x—0%Ã?)\®¶g€2¦‹ÓgÂϵ†{¬+šHãã!ˆ¦Eº¯îÊ~â Â,°‹ªoƒ•Öò_S@¢fRt„æL…"&*B3ˆÎ{*œ*[ª¡‹®Vag=ècìëaÞHïkÏšûj?^Zûã× Y¹\Þ¹äØbï"û%²Y²–_/qåD@_ÈÅÅÍ^MËââãິ¬ûLH¾n)ÍãAG»ùl‡®\¾„k¦ ‹À3^SI| ¤d‘.2,×k< ´ï’ÒLeè×úEõ$ë$Y`ýSfm=wO±$FƒW˜Z·È:Ç˹ö4QÎyf–¨~ZöB-û|Ùë|Ù‡_‡¿¸¬¼-.ûØ—±Çø:Žñcò/¼†Éÿòeç„Þ“/û²Ò¡>¯ÉJµÄÞo©ýø*¬Ž”ÞSaõÕ1DxM£ï YŸ./¤äíÑ)_W².FˆÄTn¥Ñ¼;Å;å{žKg\‰Ö†EÖãjS…¿¾A¦óu+åÎ×ÙY¸²ÕG¯kN÷Fµ°y;Þ"tƒ3姃”z7~Y_{Á¯™¦Âà%Ù8„Kê{˜»G 4c–)¥UdñÒY°qÜÒî}z¤Ô×&T÷Ì`¯»¦È×…jN‰¡·çû­1%² +"#nyQËê(wPÀ“çÌø,ðvv5(Kw¨{Ò¶™#U:@_øÁî©&¡/Ÿ\=MJ*Ü•ìM}µdù\ý!M7»l@jÇÃÕ¨ñ:'–ç”-<ø_V«!çgr¼£Ï<Ô€ Ÿd…±Q¡ÌÝ9±Õbmêý‘Ÿ9$ù­ÃÏîÉÜe·`n‘ô\ã„ûflÏlØ—zW ·Ål3R/7Ж©™g¨{o¨5Q0¬×„d(fDPà¦w> $•û‚YS#M^÷î"€ e>Rãê¶å¡JìEra©söiÿñ¹ñ7»b__{§æÊD¬UŸFBt\ýER ˆ_½¸‘Y5ùm±Iàé|¯  Ž´"£ÌYB~£®‘Ÿ.ÜíŸöèOò ¯¶•\›8“¾-^{Ji­&ƒ¾PJ«¶F+’-›@~S Èu]èÝf‘üðækûÉ4øxXØ“ªWÛZŠžátoê–‰«éÖ}òvA•†cV{fóÙ#2üešH%Ÿß@îÂW 1¶ÓÕvš›ÓÐ9•_»µÛÕž‘ðƒ.Ïû+VÈoæ ÿORÑ{átÿ#;ÑaÊ—…ü^—}]œ!¿×tq~;_¾¼fçËôZ‹k¬ÓºÆ?UŸ•ÄKݺˆ»ø²[Gf#^ðÒ¥œìîY-1ÀÁc"®¾ôD_]Ï Ë6=v‰Aö¥)IíG7¥È¬—ΜêE¦88¢Í½™  ƒ¶üÚìD£°‘Aõx¨ö—9BñDQO}öTH~žË¦ý´¼Ä˜´qóUªî¥˜›p¬;"ÝÉ—ŽûYã>?ŠRjåª`™§%÷Ø8NR+¾Ë¥Ê’-X9•ÔTŽ–ªî4#!ï ÈU„ZÅAúvÃI_æÙ%Ž­ò…+EÃáp’× §|qü­_[Ë\W[pšt€ËG*E²xú`¶Âãg.Æ ÕÂË=Û ¹zÖSdŒ²Ÿ—E|9Iïô†OR~ýŒ¸¨çîÏ+ù²zà=GÄaBw‘Ñ—=|½²b îTáe¯p¡ mœA–R¥Zy(.¥¢²\†@užœ¨ªÑZ#ujÙR<Ün=™ÐçuU“C|sMº7¦²ÜÊ?ÝT¾ ƒÈÌêƒÂ(2—9óe+qkÌòÊq3PÙɘXœ‹wQ+ÅÙl)Å ¤t%Ï2cû'¹k|83æTdJ[üG~»zâ‚…jŠß¾é:å]ÓužÝE§[-€VëÞ³k0[_ScãòÈ—ZôÚcg®=0¬ÇCm_ö6_ö!Æ—!Æ/.{]\ö±¯c?>Ž1¤ôŽñcò”ÞÃäù²#¥÷ä˾¬4ø[²Ò_íG º×Ô~|VG0ï©°úêÏÃ{êÝLÖà,–bt霥UÊÏ×dé&»ȯ³ÕK¨ç i…™Uûi¯]ÅãBŸk&êÈ<›fNWQ¾Ü 6Âmg¯Šú¤nVŸÑÌšfc«Š‡ýIæÁ’¤Tæ””² „ÓŠŽˆ»†óqö£«rÛͬQJ§ÿ‘þ}£s¶—"«}CoV#×Í2·s(SiÏWjë±P[ËŠ•$ Z›ÊÔ[¢Yó¤/×jœ¾Üžo9xÄ™\ÁRkÖp;+âÇ!zåÃÚ$ЀXâx9{Í´ÇpðZ2SÎü °¦ÆÝE½ÃuÑ{û¨ôX8M†ÍÕ0ç1{—-ÄT¬ õ öcú@ðÕBË–×q‡ü !a›$|÷C]|HeÃÞ35gì)ͶyÎòhOÛ°b;îS-Ü{Øãú°W ŒQG€©-”w±+l¦•a‚§D6¢Ú¿ç‡BŸàM€ºÓ4ã ØAÚÓÚEœu’šÛVœ.ÎÍ÷æ¬^÷Ú®öv±ºŠ’bµîiGc$^ŽÕMCÃà{¤®JütŽÂøµèá§7Ý©½Ý7ZöŸ·R~­E0WZW<-M‘á¶ÇïA~F£äùˆ9é À«@ Õ¥[ÚNíèV‡l¦!Úé¡r­ìvØ|ñ ¥Ž×U*7üUÓ¡t»ç×´`aç̺xÆEùŽˆCS;ZÇï £‡Òÿ‡ßÆ×Yá°—_ÓÆMߥl^× ëº¶±.r…6Ò µp“iFùùºS¡°œ.ùÉ‹LñÁl žQäƒoX¤ÊÁ¸Ë0N|8ª€ÄPÓr›ÝÙ‘yÙSsìdy¸Æý¼Rœmi#l½ AÚºP)b Ñ k?\J×îàQM5>@WÚyŒ0XAÖj…’ýT{<¯C\×ø#gÇiZ}Ä•ÀëÚæãc,.œÚ®½Ò«—©˜Áºè wvÃë:ý{j !êÑÈ6{&Qsæ"# †¦³ŒF,é4ËêR¹ÞºhŒ®Û6`nÓóˆÌÌö”¢S?º ã,½Q@òU–Ì:g±¹.]¿ç[ªY<ç–•… n ™¯öº8c©|Ù,×€A»?ƒ·ÁKd÷…ú‡Ê>hö•ÍvˆôÛôêƒL/>çR¹‡ÃŸuA­¨mÏ1ú<›¦©}ÃzÄ ~?ë¤É¬e(Lwë~…y€­ªåj9¼gÒóe¬2qäÕ¯„¼-EU£W•[¥5•­4Ë—È<«ÚÖ:eQ|Ùh<Àj=ØÔ¨+\¤×yâŠ>¯Í¡ÑuðdWýž]Ř­$YÉ;ã·ÈZAËïPð½¾›œÉ~r ÒºëÈäâ¨,‘á¯ÄQ²`ŠÛ ’}øßï0¡ÉtZ"ƒÕ¥ ð?›Bd½WN$øfXÅ¥~Í «OË^§eŸ/{/ûãëã—½..ûØŸ·±Çx¤ôŽñcò`ÞÃäù2Jé-ù²/+ï5Yé¯ö#¤ôšÚ¯Â*¤ô𠫝Ž1¤ôš:F‡3Iõ˰6ªyö öu´¼%»`½hLëM÷xŠku;4 ÃÎæk¿$Ñù‚ÔÔN£ÞGY,@A| úÌzgw nú$ñ[úvØÇƒ`E(¥Þë%¥:¥K °‰æA^[¡J¾â#p€O ]]RÊÅŒR:{KiîöçÁŽu°]ÚÞrnÃBµ ÝÚóea¨–9U·ãå£e­vÚŠ’I8:C1¤Xe í-´Cv8Æ}ÆkÔA]rݦ–9aÌŸàm“RRË•¯9k+Îø±º‹æáVQ„[Fb U&¹ ?;â8„NÍØÃ·'•Ÿ^â­e°¹Â{‹Ôû3ŠÙ¨e½Ov¹¥>]ç °MÈ=òÃ¥™”ß´Ýf°maÝeË/k¶°#ª’”¼-q†¶ËÔw[þçË^é˾Ηßk:_¾9ù!¿×ÌÉ÷iøUØí2ïn㺢gçàx¡ðá”Y»Æ4Wª½Šp¯¥êšIxR¿V×Å=á´†^WVRV%Ï)ö" Òúi[—¿I¥©m}ÌCál×8²Pn—å:k'·ãÆ«±y½"6h™r’ÞŽ®­$™Ö¢UVËÌ €Y}/(Ú(ódcÏ–‰1: ìt£Êy ¿g¾ËQ£wQ3h‡˜3ÏÁ›p¯´š) /r-uÃMSç»ç|”qƒø(²^ºx­^“ÚžÛY”叨ÌQ;ÿÂoÕ ÒŒ…¢Ëï]¡Åw½Ž™æ×¸¼ÖÂÁÎ&F43çI4Šð&I~yФx_~VìØå×E™@+OúåWÏŽ¤Ó] ø\š=xgS!+“ÉwZƒXV4Ík2-‰ðñIgŒÿÖx‚êëñxÆ­57÷ÕµGq¦z­8=k'ÏCÑ<”ªÖkˆBÛ¹<ç#mÔn;'t®ÔÂõQŸýz]žÖÓ‹jo¯³Ó€"…Ð†Ž‘‰}`W¹D†K“é K™Šf2åúq>w˜W ò_ö:_ö!Æ"Æ/.{Y\ö±2^Ã~|c˜¿×pŒ“Nê5Lþ—/ ˆþš|Ù—•)½&+ýÕ~„”^SûñUX…”^SaõÕ1†”^TÇè½ó¼^e™æ¬ã¶¿’³R Aðe%L/{ç¡àÕêÆÊƒÁ½£½i |°QƒŒkƹEóƶdm\Aщ.`X¾ìÄò2Å2ñì\‰¤à3^n™åê!òmJ!¥|è…GJ>ç›í”pl3$¯KÞ'þH©¯)Á¬Sv}¤DøáÝåAŒm7‡e í1¿xZ´ÃRæS-ì/s~ÕÂ/Ö²¯&û²×Ôä¼C~¯™àí’ø´Š?E(˜FS³àÊéŠ|ú(&:›Û6*÷͇9î¤7c©¹r^Âæäê 'Ã’ÆÜø®<”:,1ó&9ÝX¯DŽR~³x½'*`_åj‚®ìußÃ/h?qÜYÎç£.ÎZ9,Ä¿×oú§«± Ä?P‰l3w³BöÃÓwb5±×W#‚ß¹´ïç<­ÆÀÿ]ùˆNÃß}tO•ö ¸dW½SÂdˆ¾/ò©˜–žehœ2Çø;¢"φ·`™ïå™-+«™:iaošäŽ?_ë—‡Lkað|‚QmrÙW„Å—^¼šØ5jÇaoM|¨k ²ø’+uqú–2æ.½gùÊ5šV‘M¸FR!¸ÓAqØã#©âQö\òy¹^TÈY‡¶QO.Yíµþßü¶°Óö2úÌ”’¯Ê#í–pD½g|åE¯ÄÃ÷+uâŸ[íí¹Lª¬Ë¸©i&Eó¹Èû‹9Òk‹òóå¢üÿ^½Ò¾ —6Ó«Bd_z¿Ê8ÒHDa£'ae|oÂc –(“¦”ˆçÆ•xôÕQaãÒÙµÃï\™{°S£Ú“ø»ÔÂ6™™fp‘®X)ø´æQöE"§¥´ÑT„”‡†ù&9»Îx]Éâ²´#Î+Ã5PÇ=dÉðY5%Q0â™ò4’Ê!fÔÜà©!‘µ“jÚ7 î1mGƒ“VIÃÇ¢´å¥@K6Ü5†"å¢Óº0‹Ç T ¨ÜêúWWŒÙgÈü̃ê8\ã󥪢4–ë¸AB"»R—3‡–ùÄ<‹¼šO«0î•n^xèo´Ìûà»AÙoõS•”LÇU£ÁH*H-4ƒ°L&øÚ¦ë7e)f(åš§éC‹Xû1Z+Škå•ì>Ö©Qdƒ#ÌóäD“”æY€¼Ev¥ß™tMí«gRÎYÂ’0B)>Š‘JN·–õ¾g Ú!ïäß2£OË^ªeŸ/{™/ûãëã—½0.ûØú.öãã”ÞÃ1~L~˜¿×0ù_¾ìæ=ù²/+}Þ“•þj?(¥·Ô~|V!¥UX}uŒ½£ŽñûëßÿúçÿüóßþãŸÿú÷ú×çù/ÿúïÿô/ü_ñ?þú4‰T*'xcrysden-1.6.2/examples/XSF_Files/mol-urea.xsf.gz0000644000175000017500000015750211712736221020351 0ustar tonetone‹—·B>mol-urea.xsfì½ËŽn;Ž&6çS¬y£6t¿ «F£í,Àn£‡ ÃÞ°=ñÀöÄooR%}+Bѹ…³¨A!uB›"¿_KâMäó¯ÿåßþ‡ÿ‰þ¿$ÿÏü2óÿþ[ãö¯Ê?ó¯ì/—l0¦Öâڿʟϲ¡¸Rrž‡ÿb~¥Zs©üæø¯þå¿ù¯ìgk¹_Æ¥j %öåŒ+6É?;þ«¹úW"—¦f³t޳ 5‡‰Æ§k}ù¯þýøÿéïÿø÷ÿý¿ýwÿùû×ÿò¯ÿñüOû‡ÿù¿ýãý?þ—ÿûÿýÿí÷ÿõÿüŸÿïÿGÛ_ÿñ?ÿý?ÿýßþëßɥǻÇUúÿ+çbøýïxÑ < ¡T¹ä¢É2¢ü+ÆRMiRV? þRE&–ëc ʯÈkÚØ¦1r¹DSÍïqîñ¿l4!ËÀ>á—ÏÙ9ä’³å­<°ÎÅ ƒÂ?sOYÈ…j³éI,^4¾ø‡ÍÎ4 ñ‰¿|åuú€s›?Á–6 þG.%ßG8Øç! ½¯JȰºKò½$_˜Â@º_òm¤þ—øËUWK2ÿòÑ×ÚÉ•_&ø”ÚBÂ]åo8*©2qå.š'\†ÀÚ…õ¿B±ÎöAýe’Ïu`g•˜ûÈ7†rÅó?*†?ßO0m'@@—†€Ub@tà ý¯jK²ý/LÎÆÎwî’)%vrÂ5¦/Ë|óm”þâóØ„þ—˾L!|Ž}s±°A¾«’[Bÿ“ü²Áåú@Ê.õAøUsê[ „ó€Ð~­ºV ¥ù^’o˜ìp»mèÊ¿Œ÷ÞöTù´rý{ÉB; r²*ÿwe?+_MÜù_ÞÕ˜¦µ” ò%þþ²JîLHíYÁ$ÕPû™Kè[ÈoÃ[í‚Á>)í}UB†€Õ] ”ï%ù„.R‡Æ_â/f “Ëüo2oöq æ;V7¨üËñµ:¼‡ø„ úeò×çÓÜ5|me…!é¡fÛ…à}ØÙ_,]Åt†Šëƒð‹7§ÍŸ `ÚN€€8. « Ä.è À@2C!÷“Bþ"ŸNßíòÍæœú%Œs¡$!ý´’O‰ckÈär%ý*¾¦<°“ÛÆßqˆ¿ >AAq&g™gjcˆ/í>àMÈ_}ø8 œ€6¬º3¬Jò½$ß0Ùá å—õÙÔù¡'>xЍcýÂÏÃÝú8w¤M¡‹dH¹ÿHV¶qñÎÌâªíG¡`gä„S„ Ÿû~Â`û±Ïæ§Ø˜'v¶ö=d öyHhï«2¬îR |/É&„pžÿQÈQ¯>5ÜØíåW²¥Î³†/„âÇÕS~Y;.'‚ Á)CU }P ù.¬2Oa“ï0ÙÆ–µgÛáb†\¿¶(6!ûvm¿0m'@@ü½ìư Bì∎ \$³àJS ÚÑ\lz¢8aÜdý•r”£zü~žõz7?%kÜøÈX–3N¿d]LÛ¾‹>*(Öú2‰÷ßÕº#ùÌmGÊÇãMí@â€pPÚ¯UCÀ*¡ ßKò “.R°ó!ökR7ëEùÝêÇ'ÒnI>j¬nO>ÛûÖoBæ_srWYÙsʸ !%ÝÙŸ»|Y.gTòûn`€œè„! ìDnÇŸ`°æ! ½¯JȰºKò½$_˜Âõ2Ç2Ôá,‡ƒYZ³ f©læêñÉŠ_sÙÈLTÝŸA”å;¤b½~‹%öïªÉ–R;é;v‘oÛAa†*oš>`SÉ¥öŽ0m'@@ü½ìư Bì∎ \$ŸôfBÜþMÒŸ‚ypCqXyV˜_½Ö{å?Ì0õŸÂŸØ¼8 OKc£$þÓ‰‰—D¿n’Ë—imUìxÓùªû.˜Ò/%Î @VÝV ¥ù^’& .R„õ¼Ý«Âjù£ðznÄPcQ ²Mê¤ëúeY½ë6‹a]‰n~õÎÙ<¿zùf'ªÕ&31áËÓûyF†˜âÀ®ÈÕãB0Øç! ½¯JȰºKò½$_˜Â@ò!Â¿ÞØ¬¬B³þ[õ`Ûa![çWáb,늲Ñ[ݬ1$;Ödj˜—’ ®*ªü‘ýfÙÐɵ)õm³ ZY±«ÌDýdÓvÄßËn « Ä.è À@z9xòÐXQæeT!c¥‚ §;×øP‡]˜;·ÎsÊö´zœ‹5(ªž¹‹c£°jTRZÚç0ûÕS³çAI5=yߥúq@8(íת‹!`•P $Lv¸Hù*äÈv/[)Úq'¶?Œ_†\èGÿHb8G5Ês—çÀÙ°ÝÚwŠóóžµ>»ñù±R˜mžúO’ÓOÊlÉû‰ïçðm°ÏC @{_•!`u—å{I¾0!„ €¼@•ΰޠJgXoP¥3¬7¨ÒÖ/Pý9¾å¸¸¯Î×ÝÜWçëŠnî«óuE7÷Õùº¢/î« ÝŠÎÊÕnEgåêF·¢³ru£[ÑY¹úR·ú1¾Á¸°ZÏF+ÝX­g£•n¬Ö³ÑJ7VëÙh¥/¬Ö  ],7:»Xn<,tv±ÜxXèìbùÂÃòãœÇç_é¼ð]Ÿ]×tã»>»®éÆw}v]Óïú캦/|×q:Znâ,t´<q:Znâ,t´<ç8ËOPð÷w/"Øç6ÝD°Ÿc›n"Øç6=ìs›¾ˆ`_d[Ð9Ýâ&Û‚Îé7ÙôÓ-ž‹l zŽé_f[ü¤}CjÐEÛ9nòØžcÝä±ÓØúçòØÎilôEÛEÎ%“.Ÿ‹œË~Þ}šty“sIç¤Ë›œK:']~‘sÉ åÚl-'Û%nmãÂ'³ÑÎú†"b³ ¾È"ÿ[?6°ãÐÛ˜;¶ÞóÄÎó~pº‡Äë42Þéó¼ÖœOy^)•/‘M]ôQ-FìóÐÞW%dXÝ¥@ù^’/Lá YÃpýph@&7nS9>ƒ8¸Ì¼ðb×kRsôƬúïӽà ;VÖ“Ó#ŽÉ2¯£¶²DÔù'wq`'ÊcŒãz†¼×;ßÔl¿ÔO0m'@@—†€Ub@tà yÀWÀøKw„éÿF°ãÍàÆ1”ùjqP¶ðu:¿«ÚÝÝüðEÝelïæt`'&úTØ.4.-ooŽ¡p2ClRˆoÓ-ù×€pPÚ°êΰJ(È÷’|Ãd‡ €l¨+1ê!’cê~0ÙûÎÖj ›da)¨›Ð‹—|î;¾íP³D®èîbKÞÉù76ÏÈ;ïº<ý[ÖۤƻĄŠö Ö<¤´÷U Vw)P>|Ç„.’²cïË_¼gRÓ>]ÉSÁ¼õõ€’ïª{4ÚnxóOS¤2<ëM /ÓÝ¿~†¥hÍŪñ.Q¼Î"dW<&çåï†Á6m'@@—}1´± Bì∎ \¤Ä+‚™©‚–Šõ "ò‘TõNÉ,„ÓëÍ—<¿«êÇ=+:¯7)ϯ™?–¢~¾©Åó¡Âò‡¤q$†!¤°|ƒÙf«p™š‚ÿ8 œ€6¬º3¬Jò½$L\dËdaªÃlï©&YÝ×C ÎTë7`´óèâo,êy'w¡×±4‘ìü€swj6a*9 Qúª5 š"Û&åᮆÁ>)í}UB†€Õ] ”ï%ù„.’M‰<œ]±é(¦Lu‘·B× åGâ£Ý®„¹d­~=l³ÔîÑèN#6·³$Z??S(ª°lóÌh k×1ؤâE52]xLæíˆ¿—ÝVAˆ]<Ñß lp½€ŒÕÖyRSgr5WüSL›ÚåÍ{ÊÇ“_7B[¨‹cV¾ÿâ˲j¤T¢JÆŒÝÅŸ_,¡è¾K¦ö¸r³ÉX3Š„ó€ІUw†€UB)@¾—ä&;\äpôºyÉI:˜èóªv×B]qÀÓtÒ…À·©Ñk›¿ª4o¶DlÒØÛîn[(…âg4%óÝ;Þ?@’_6…Ú…M8Øç! ½¯JȰºKò½$_˜Â@ÊIïôZ“TíðÙV¾t»ÂÒƒµ±X=>+ÔÙŒSô»dçÏìy¢›Û¡Z??Sþ®âRlòÀN ×# ‚ÛMe`Ç|—îÆ|`ÚN€€ø{Ù!`„ØÅ#A¸È ¡õwç_lC»em›èÒ¼ m´Å*m¹g}¨ÊI_ÕÈ…WTãšõ`4_¦›|¦{‡(¼J³  rÙ$’/pW?ç ýZu1¬Jòä€ÉÙ>2&1S×¢6us«É—Ð^È ÃYŒ#6s4u†åj§öÉ75kÍV†Áºy§ØîpëIQnÛjÞ:ŸtfVšüÄ.KìHßû<¤´÷U Vw)P>|Ç„.RLX£~GQ”»ZÒÖàz2^;X^Û}±Îœ`Ëö²Ž˜Õ¸“efrƒØí¯y%W[‰xè7Ë iÎ`ç“ï0¼0m'@@—†€Ub@tà ù–ÔXœ²Î¯#@Bc¡,ß¼íi"=ÍRR ÌÐX÷Ð`¦X3Cïn>þ÷Áè=ËÍÍ|6÷⼩mp~"$ñ“ùi³v]óÇá< ´aÕ!`•P ï%ù†ÉIgXoP¥3¬7¨ÒÖTé ë ªt†õçø–#àx]ÑÍ}u¾®èæ¾:_Wts_¯+º¹¯Îו«ÝŠÎÊÕnEgåêF·¢³ru£[ÑY¹ú1Õ¿Ô8­tcµžVº±ZÏF+ÝX­g£•n¬Ö³ÑJgˇ…Î.– ],7:»Xn<,tv±ü¸;«±;ð躦ßõÙuM7¾ë³ëšn|×g×5Ýø®Ï®k:Znâ,t´ÜÄYèh¹‰³Ð9Ðrg¡s åù þþ† à1€M7ìçÀ¦›ö9€M7ìs›n"Øç6Ó-n²-èœnq“mAçt‹›l :§[Üd[Ð9Ýâ'5H¯ž¿45è˜ÆF7ylÏ1­]ÛšÇöÓØè¹Èc;§±ÑMÛ9mä.~–tù\ä\Ò9éò¹È¹ìÕH?Mº|.r.éœtù\ä\ÒsLºì/ºãH:|JVÑÅÖ‘,™>‚é• cß©?öÎFYÃÚâ8†šFÜܹvÑ<æ.Uõñ¹Æ2?ž˜O¸Xû å“LÛ Çe!`„ØÅ#ý Ê×HyN¤@Û•=Ã-ºh«žÆ|š¬?¦Ï%øùÕ[×eyýÑÞéê®áo"š)¬­ÃuÙ/¯`§§‚ÕÊ2¿fñiÎsnBÎ @ûµêbX%”ä{I¾a²Ã@ölhߞ̶ηdòº÷}ðý!NsoÄÇó-æ;ŒGL¡ûÜ·oV^zΫ•ïE»thæt\Î’/žÔ,ò<Í7C>E¿žEfâ| ƒ5)í}Uz3´±ºKò½$_˜Â@òžf}ÚëŽ yxbÈàÇ£¸¦%“ôê‘CYÙ«v8æ:«Ùé ò‚!®'d¾;ºÛ‚-µ¶‹è¢ëUyùþM7}üt°MÛ / m¬‚»x¢#(Ù ¯¢©yü̽ò où93îB2¶`Ï2ÇñdVLX¾Óøf¥8Bp{ôxË}2J¿Äô›@òuì¦\­îã€pPÚ¯UCÀ*¡ ßKò “.²»R~èVª¼Ø¬ÿ(›èFp†ÑJH©õ7g-¤»ËZá0ñ3LS0„^œ¤m(˦üÖÉágèȳr>ß¼QéúøPLÓ° öyHhï«2¬îR¼åÉ&„püËÆ¾l3M+o‡¢W F¿ó*—iÖäêÌ_EÑ·xlÈåù—•›¶§¾¥W7é^^t=“–òðfúïLWôÚ@ü·•¢ábMŸ `ÚN€€ø{Ù!`„ØÅ#A¸H©ì|hí|/©ÑOYg6¾zý¶“ iz*êxu4^¬[å;ȳȠ>wQK\˜ È7¶¯±?‹ì!þÓpɄó€ІUw†€UB)@>0Ùá Ûilârd‹ xíÏÚƒí=ÔmaÜò+æÇ _Òp×þ¾"­º ¼ªs«%£êv—ééçËÝÍhJf³Iƒ‚lθCÂÁ>)í}UB†€Õ] ”$ß1!„ €”Æ£2ShL¯YÐÝ|lžÍíéX9Óã³UÛð[öªóEÏ;+V¢~õ|Úé7ËÜÕáQnî‰Ô ìØ.,Iƒ‚|£K®ÃDÈš^Ü+â¦íˆã²À° Bì∎ \/ £ØfÜq)…°¼‹Ùø<4‘ðËH{ ý*$—d&Þ³áíçÑå²ë®âV†g© ¿=PÌ3N-¦RVÉåYåÜjâÀ÷ deó“á< ´aÕ!`•P ï%ù†ÉÙìÙZÕï/ÿ(•œ‰¿ltu^J|läé“f…ÎÎÊ0Þô‡žý€ÊÙjhSœšeU¯ã ¸ŒITÈuîHÖ®{iŠféæÚáqgú?ŠïÁš‡€ö¾*!CÀê.Ê’ï˜Â@ò/I‹_ñ|é{z‰KŽ¢b² íÔ÷)osZwX+™je•r\UVl‚ÕZSÍóì½Þ/¦êê%’|?ýZ<-÷—ºFìãºð=€i;â¸,0¬‚»x¢#()‡H*3c ä~ÖôÇs|„Ç¥AÉ®›•ÿ»Ÿz7 aç™ÄêŠGW’°[Õ¼‰JtpÛ¬¦Ôìu³¶?(\Ƈžx&ÖºÓ'Ây@h¿V] «„R€|/É7Lv¸È჊^wnH®NOÿFÅ+…ÌÚÆ,²ä\/T22×üö¾B|šã#“:Å.)‚ÏF?^¦ZÝB¬Gº™Øü˜»*”¢ØÁ`ÍC @{_•Þ m¬îR |/É&„p•­µ¢*+Ÿ5nس­ŽU•aÚÑlsÔ#@*oŽ{v„Ýòø™‹–ЗÄU Ê†î[j[¨j-ŸÔ?²äæåUƒ_i¬Öy|n˜¶ ŽËCÀ*±‹G :‚pGTé ë ªt†õU:Ãzƒ*a½Aõçøž#àx_¯+º¹¯Î×ÝÜWçëŠnî«óuE7÷ÕY·¢³ru£[ÑY¹ºÑ­è¬\ÝèVtV®nt«Cà{ £Õz6ZéÆj=­tcµžVº±ZÏF+ÝX­g ],7:»Xn<,tv±ÜxXèìb¹ñ°ü¸¿Çxô]Ÿ]×tã»>»®éÆw}v]Óïú캦ßõ9ÎBç@ËMœ…Ζ›8 -ÏEœ…Ζ›8ËOPð{‚‚Çö9€M7ìçÀ¦›ös `ÓMû9°é&‚ý³-èœnq“mÑ_Y~šnq“mAÏ1Ýâ&Û‚Îé7Ù?©Aß•tÈc{ŽilÝbüÃ<¶ç˜ÆF7ylÏ1nòØžc=ylçœËÈÿ4éò¹È¹¤sÒås‘sIÏ1éò¹È¹¤sÒå[ò&ç²_Œ]‡nm½”æîó¢$¯ÔöÈçΠ-æq®A‡âÊLývøÜ¹±$ÍÛe]&˜0 Û×§0°¦¦‚–öîÕ¬dÊ5Øç! ½¯Jo†6Vw)P¾—ä B¸^@²òºŠˆ3én=´ŸÂºîßjÊ›kyþ²¬»¤qØ$1×âÔ€ƒj-O:ŽÍ»hú[ýž}M7`Ú/SÐäÿÖŸCK¸³"É8¸O0m'@@ü½ìư Bì∎ \d”æ/Ý*² ©Žú ý&óVÉÉs›¢°KãíF? ‚ÖŠÒ ÊÎ3²z;…•wÎÎ+8¥ÞX­;„mÒþ#ñW³û@’ú»=ôÎ @ûµêbX%”ä{I¾a²Ã@6Wjé›{]{Ü|ãÊÇK˜ïX?LE’Ò;QÏëtËHC¸ í·œ({Ù©|‰?¸ù®'•§pâ-4ÕóìÇ‹õVÆ‘AÐצ0Øç! ½¯JȰºKò½%Ÿ˜Â@ñ&Øqˆ”ö"f¸Y}®Ñ~>¶½»ö„>ïO^'3ßõÞÓKÀ—n5 ƒi¹ øð+«ò _îqz8YVµŽø c€Ê'˜¶ þ^vcX!vñDGP.’’öŠ7_ŒV_ÎÈ:tµv£Åù[¿B;Õý ¯ÁšjüÖÜF>8£¾Ÿ&(E|ŸZÅJ%{-ë!î ¿úâe;îÂy@hê;CÀ*¡ H˜ìpí—-E«ÍËËo«ÿH|¹Îw~pÒñ°§ŒÄ^ßxDFZÞœ4 Ê'¦©%¯LÛ /»1¬‚»x¢¿AÙà ùÊLi¥‘MÝM±Ñkm'×nÓéyfMÍ®•Ö0‘H^Û–/ÉuÞñWZæîâ“0Ž(MF¿fÖ®Ó81{e˜îæ3„ó€ІUw†€UB)@¾—ä&;\d7@Y©ÖT’™j¼v™m¨ò5»JÙ¹QÔaTËN¹+Íu9U££–¥“6ʽónÏœ`€¼î»àÆ¡6:u¿'.Î2 V¬yHhï«2¬îR |/É&„p|ˆØÞyï³1©íLCóBÖÔå7–¾Çk³òηºYÍh ݵÏ\Ý¢JØM­EÚLI‹’fòTå[`n5…€˜¶ þ^vcX!vñDGP.Rb8ÁMT¥5æráó´–„d7D­ #»ÆiìWJTÕQZ¢X^_R-óA„H1ê÷ô‡äãsnWªQ룒nµÌ˜8ç>ç  «î «„R€|/É“ÙR44¬(F”T0ÚBmÁ™å*®N#J§M«©3ItãQCªgÒjž¢×½¤ÞçÊd 1y= ù…©ñÇìüÚÆÚ1â`Ÿ‡€ö¾*!CÀê.Ê÷’|aBy*a½A•ΰޠJgXoP¥3¬_ ús|Ëpq_¯+º¹¯Î×ÝÜWçëŠnî«óuE_ÜWº•«ÝŠÎÊÕnEgåêF·¢³rõ¥nõc|ƒ!paµžVº±ZÏF+ÝX­g£•n¬Ö³ÑJ_X­:»Xn<,tv±ÜxXèìb¹ñ°ÐÙÅò…‡åÇøû;ܾëç躦ßõÙuM7¾ëç躦çÂwýAò‰ }é»þã8 -ÏEœ…Ζç"ÎBç@ËMœ…Ζ/â,?AÁù‘ý•AÁ‹ös `ÓMûÀ¦›ös `ÓsÁ~K¾0¡/"ØÙýçé7ÙtN·¸É¶ ç˜nq“mAÏ1Ýâ9g[ü¤ýþŽÔ ‹<¶sÝä±ÓØè&í9¦±Ñs‘ÇöÓØè‹<¶‹œK:']Þä\ö¾)Ÿ&]Þä\Ò9éò&ç’ÎI—_ä\òÖϾ±àFùôþ(n4ÈîV†í/¨S ´ý€2óf^Gú2ÿ|ÑåùrF¾ª•çnXñžØ%-íšùXË´ê˜p‰óz0qÕ¡_Ây@hê;CÀ*¡ ßKò “.²Ÿ¶3Ô½ Å3×Ëõ G@{¢lÇÑ,»ÆÔª,ð'f×Ëë¼]——V€nJÜtúeM¡–»BÊ)¬”õØ+Ô76ÕùzkRÚûªôfhcu—å{I¾0!„ €lÏúyÞž}¦î]lU•]/äZèѬ£×76£ Ò0u¾`h>÷2S÷¥‡ÑÃϸY#"¶ ½LìLé/PzÊäÒÁä-žKù“LÛ Çe!`„ØÅ#A¸H+´47^*;»™oDÐrå|îÛ¡ùnÇ ?s±qݳrU¬8¬Ùý5ßÔ_£é÷q·ÉxŸLe±4L ùüJÉ„ó€ІUw†€UB)@¾—ä&;\äðj‡ ‡o­].z`Õ×|žó÷6(ù½æónÇ7Bšûι 쬜qswñ<íÙP“6÷c“:å4}4ŒIY¯{+§Ó'ƒ5)í}Uz3´±ºKò½$_˜Â@Vþ™}r xâã8ê§íXË;Rúðh`KNm£$˜\pe8'ò¯¬z*¼xßòÜO¦:­-ÓúVÍÆì|µ²æç¡äS˜–<Û6êTLÛ Çe!`„ØÅ#A¸Hy•<ª·È^J*êÒ†²Ç3n=¿c+ÚeҔѲ«Y‚¬Í’lÎybÆ£ÛîGqãÑtK‚HAõò|}ÔŸhÕ€Ò0ëq@8(íת‹!`•P ï-ùÂd‡ €ìYZc$û³ÖÑ,§u×HÕ.c$û2í!ñ‘Ï[D|ú‘ɇ0˜6 Ü‹º?MµZ®ukú{åuÕîHëÉÕlîiªf×÷ÒýÉóè[-Ø?rtä]ˆsæã€pPÚïU'CÀ*¡ ßKò “.²å•ž½Ñ÷W ;Y¯¦RfeÏè¡Äaãç^õaÔîè¥W“Ûb¨¶»-FIH#›¤Ê±¨ç84†‚ß¾sžæ&v¬Uæ¹Y·Á>)í}UB†€Õ] ”ï%ù„.’mãÃt¸ymw&êTbõ®êïbýP¡{¬'î©q §8ËKñ7<æ½0šMA›g6†¼„eN×ÉêXûL:¨Þ­¿À`›¶ ŽËCÀ*±‹G :‚pÒo:+%h¼†ïU¹”5u9$¥)¯Ôñ}NkÆŽŽr]§uÖJm|Õ1¥½ªUSêF•»®éÆw}v]Óïú캦s å¹ˆ³Ð9Ðrg¡s å&ÎBÏ1Ðrg¡s å'(¨Øý¥AÁc›n"ØÏ1€­ù(Á~Žlz."Øç6ÝD°Ïì&ìçé7Ù]ØOÓ-n²-èœnñ\d[Ð9Ýâ&Û‚ÎéÏOjÐïoI :¤±ÑMÛsLcëMÿ0í9¦±Ñs‘ÇvNc£ç"í9¦±Ñ9éò¹È¹¤sÒås‘sÙ‹L~šty“sIç¤Ëç"ç’žcÒeסÛ-ÙêµÚÚ;“ôi¦›nV.þ%úÏ—Z¹Û;µtÚhœf{‹Ë®„•>¬íþ]U»êúšÔïð¡T”âçõÀú“ º»B­`ÓvÄßËn « Ä.è À@òÑœKßÓ¢nÈËã4 ©Ç¿rºÕ·EòP7ù1Hrz§O4i¥÷†œ¢&¦ó¹Ï<¬Œó\V|=¹ì¦ªíøóˆÀ†Ây@h¿V] «„R€| 9`²Ã@¶Ó8 ^Û»ôû[ÃÑ’Ã%çB^Ç'_‹½Ìs+ØkòÌÂ÷¢Ùióq§—®¼éß*¦ß5¶{¨ŽtñfͰ?”ðf°n=«hlƒ}RÚûª„ «»(ßKò… !\$Ûd¬ó–þiÉ1\Úç±(E4Ô3ˈ‹2dY-±ºØÚ«s×HÍîù¦Ø‹12%—'vF5¨ê¦ŽÉpñ=;Þ?'¹gõy `ÚN€€ø{Ù!`„ØÅ#A¸Hy´•ktÞ¤<ŠÂêÆú*âXIîÆ{¤Ö«:7£\&ù:+ÃxÓ•8ÓkCË›£:f¶M» ë¨ÒlÉZµ{ZøÅw¶V Ù„ó€Ð~­ºV ¥ù^’o˜ìpÍ®HãѦü©Jµòy„ǪšHûü¢U 8ÏHÞ[ùÐÊô|eéC?ïúk>ýô¹‡âWG¾Cüx|.ÎSõ-5ýŽm÷a×Ã`Ÿ‡€ö¾*!CÀê.Ê÷’|aB)•üÞ`0×q¢H׌a/ȧmì°tMï´™–?"פ/!믜¼†(¤8‚ÙJ±ÊS âúSfÓ” { …†”˜ñ¦l\ Ÿ¶i;â¸,0¬‚»x¢#()U ¬>ŠËzèOFõå~«>ózhmD×ÖóŽ?7­Ê"Å\ˆ d’^^CXþÈ’õÓ[µ›WÓ®eŸôAÓ>ýpC3í0KÕìÂy@h¿V] «„R€|oÉ&;\d;Óf×K "§ûÓºî;ë/£YÍ ëuo…ùª¼jês—7ÊfµMÍ!¯*!9W-MÑ–²Ò,m-š †j(3ô· öyHáE{­Jo†6Vw)P¾—ä B¸^@Vçó4tl½#ävç#¨Îߥn…Ãäio¦×>tþñVe˜lòªcÅ׆V ò"•L³±Î(ž„çB ŠAs*Äï?-¾0m'@@üò‹!`„ØÅ#A¸^@Š>=¼Ú•-]gÔê±ÒKvu”~/ó«pÉ«ºH­ÎD…ê§^:ô¸¨yâÔÌz.Jp´,É«éÎZ$*»„åÝ~“ÜÀpPÚïU'CÀ*¡ ß[ò…ÉÙÞ€ú­‰£«ãm¼œ¥Å¦<=Hƺå²ËÙ¬U]У‹úé碞]’?²b!Æå™SaC÷ú6ÉùÒ­óÓf£¼_õ¾§ù¾Õü{°æ! ½¯JȰºKò½$_˜Â@IÿH3ìV~©«Z³üÌ#ÑTmV ã„•/?7ƒÖ1~½>Ê^(Ѹ2%¾ÍG)RQ*ÎýíøÐ[[­ØÄ÷¦íˆ¿—ÝVAˆ]<Ñ€ €L|¢tºïU›·J®™íyý±¡«9Vbüõ¶EC﫜Lðyuù.ÉÌaI‚°+—Gꞌ1!„ €”¯"š±Y£”9Tkm>Q†,!¯²i5TýýĉÑà®–˜­ý:Iy>&‘v½SåqneVŠÛiÄá[¶š¨9}ÀtÎ2€i;âïe7†€Ub@tà ¨ÒÖTé ë ªt†õU:ÃzƒêÏð=GÀñ¾:_Wts_¯+º¹¯Î×ÝÜWçëŠnnEgåêF·¢³ru£[ÑY¹ºÑ­è¬\ÝèV?†À÷G«õl´ÒÕz6ZéÆj=­tcµžVº±ZÏ:»Xn<,tv±ÜxXèìby.<,tv±ÜxX~Üßã<ú®Ÿ£ëº'Wÿ¡ïú캦ßõÙuMÏ…ïú캦çÂwýã,t´ÜÄYz[‚O-7qzŽ–›8 =Ç@ËMœå'(ø=AÁcûÀ¦›ö9€M7ìs›€ø?Á>°é&‚}ζ9dŸ¥[<ÙtN·¸É¶ sºÅs‘mAçt‹·äÿL¶ÅOjÐw¥òØžcÝä±ÓØè&íœÆF@üŸÌc;§±ˆþüsylçœK:']Þä\Ò9éò&ç’ÎI—ÏEÎ%“.or.Geþ¬ü‰q7·qà3)é¯Öô'H­‘„7ºWÅTG1Ù®.Ç£ì€Àçþ|…Ⱥ‡ɣƬU~å[]OøÔ7kû0R¨ öyHhï«2¬îR |/É&„p­LA×#š&RMÿ”H3ìŒgyÖÂ÷|ªõV)ýYGaZžÕŸióGZ¦ùQ]ñóÓ6Òÿg~³†í½ù`G|AAOLë{Qä÷¦íˆ¿—†6VAˆ]<Ñ€ €´â^¹Ú>–~¼t«'W=Qx‡WŠŸ’P??%¾$ËÚw~–ã—RÓ½åÁ¸+Ø4™ÏïX cP~eß Ì÷Ûf¼~¢^™û5 œ€ökÕŰJ(È÷’|Ãd‡ €ìÅ÷úÛÍQïb¯ŠÝÜaÛ‘ytGéÜìV³›¿©¤æ±TŽOºQÄ.œe!¤ ‡[M‚‰Ú}BJNä0”ó«¢ »2Û¾½kRÚûª„ «»(ßKò… !\$ßdvTænA¥êûc¹mØV.SݨLaeágçR˜?z ú´]Æè7›óèUÕõ¥j§ŠÉFæ,½å9J‘¼À-ZeB6TÖ'—0€i;âïe7†€Ub@ô7(\d®„q½juãÌ(jûOÑŸµz;_ï˜PõˆËR¥U[ì¸QK¢¹¸ƒíÉ–g´Gï{3\{­g¢úÜÅ#M‡5*M¿¬Zòû€pPÚ¯UCÀ*¡ ß[ò…ÉÙ›±õÒý•¥suüQžÕùyõTÓ_†ÒP_Ú‹BgÍT ³ïqÀ0æX»a9"ïÙk #Òî³ËW¦×·}ÀÁL³äR\¦ ëôUwä> œ^´·Uw†€UB)@¾—ä&;\d·z\˜WØnZGFËéµr$»ÚIJÊoóU‘õž•;Åií£Ö¨/¬ë]c!’å#ù 3á*³-90IR»#ife•]SU`°ÏC @{_•!`u—å{K>1!„ €‹¸ši³nœ‡‚Ïj`0njPüUµ%ü8bB­V˜Ôטgo€™|Ã'}ðÊw¬ƒ¡Ð£Â3AX:[ޏTûÐc‰I±+©¿™~`ÚN€€8. « Ä.è À@VþÅFa×슘—y,à§R‘ª_‘(_S©z°fV®ÇÏ\Eò8sÛiv`ó‰lùÑëå%×vÉsßIŸÅ Ç§wVo¨}@8(¼hê‹!`•P ï%ù†ÉÙ Öe·µÌ«1O‡"aº†¤šÓJ»æi¾U³aå.Š)kUîª%{š ådš36:•<‰ÄMU”Ï´®AuïbùRþ=XóÐÞW%dXÝ¥xˇ’OLá /P¥3¬7¨ÒÖTé ë ªt†õ TŽ€o9.î«óuE7÷Õùº¢›ûê|]ÑÍ}u¾®è‹ûêB·¢³ru£[ÑY¹ºÑ­è¬\ÝèVtV®¾Ô­~ o1þØj=­tcµžVº±ZÏF+ÝX­g£•¾°Z/<,tv±ÜxXèìb¹ñ°ÐÙÅrãa¡³‹å Ë;ð÷w¸/|×g×5Ýø®Ï®ëîZøCßõÙuM7¾ë³ëšž¯|×g¡s å&ÎÒ¨Ï-7q:Znâ,t´|gù þþŽ àEû9°é&‚}`÷Î$Á>°é&‚ý–|aBÏ9‚}‘mÑíÙOÓ-n²-èœnñ\d[Ð9Ýâ&Û‚žcºÅsζøI RÇÇ_œôÇylç4¶îZøÃ<¶ç˜ÆÖ„ýÓ<¶sÝä±ÓØèù*ís.éœtù\ä\öŸ&]>9—tNº¼É¹¤sÒå9—õWð{¦´/ÛX¤¼öúâÞÎ4`y:7Ó€åmý0%D 4ë7ç[¤'{wìlÐK »;½îÜš’:+¥æº(è.ç†÷´Â€pPÚ°êΰJ(È÷’|Ãd‡ €lýÃ@¿?§îöG¿¼ò0šËNîV2çþ¤´'siEãž‚ËÂzÝ(y(6 .¦\§ŸA|oÓ{#áø€³øüÌzŽkÌx‘Vp°ÏC @{_•!`u—å{I¾0!„ €äcÈŽšùCa±ófèW«ê¬ -WpÔþdR b6€ R©ßÍŠņ<í=y‰7OÂ4ž÷k[\KãÚ–~ Q›&$þü¢­Ÿ `ÚN€€ø{Ù!`„ØÅ#A¸H'ý^jœ C©ŽQZ²ìú{²œYOA‚ørôpÙn‘\KœØIß”a`‹;¾Wêï6YÎqšaò,d(œrW”P>ç  «î «„R€| 9`²Ã@öjÝ™Þþ”òøÉD`-P 4ÑDòXÈKÝc'ÎÎóÎJˆB›b%ñ»©ûK·òâ“ÐæÕvÁåÙDî¿5P”ç¥3ƒ5)í}UB†€Õ] ”ï%ù„.RܹEûŠÈn÷úàCJeøõnÛÔѽÀ ïâ*œÁÚ]˜ç]E?iP—5p OÃÆ7Û¬ÌÁ`×yX•¬Þoi T‹ýt°MÛ /»1¬‚»x¢#(É ÕVl ëÕ[ºK+”Ù¢Ê3šÕ ÿ»5zbÚ07kÍ9úY&†iMìäQMŽóI°ä:(A:(ÔáQN­aÈðßU‰xh,dÎ @ûµêbX%”ä{I¾a²Ã@özý±wW*bÑ^ldT£Õ[ÄȨÚVËË¿±A?6ãârôòÕZg8»úÑ#­¹ÙCØ<€|@Mo|ÎãÍtójçñaöîqVXÁ>)í}UB†€Õ] ”ï%ù„.RL §=4øœNÃÓ¶gÉfsؘížËÆé§cïEÑî”ħР›Þ¥E™¹4ã®Yv»ôËi͉^`ÞhXªV&~:ئ툿—ÝVAˆ]<Ñ€ €dý ?_pÆ¢Ý~Š©…óy^zKŽïí"z’GÜõñ‘–ÆçÇGpÓo,M*­ÖóÊÒ^ÕÍØ=ëžvÔâ½1.݉’·åã€pPÚ°êΰJ(È÷’|Ãd‡ €Á™ÕØIZŸ S0ˆ×7ËÒ˜´jΘn#¢.ßK4«Ô´,ë×gSZWå›…§b}@›‘‚Fõkó iPçÅáêw8Øç!…íµ*!CÀê.Ê÷’|aB× HWŒF¥cLYos˰ˆÛ¥$¿„:+Ù21£ð[3%¢×\^:H•y·ÅÎäj«*O‹Y{ß/ô–ÎÇߢó Jõ¶ÀÝîm_˜¶ ŽËCÀ*±‹G :‚p¢ç4Q ÅÍçiB<¸iLòQ£žç¦û©}²ÖÕZËŠ¼K…2̓’kdd7´ §å¥ÄLIzqˆéííhúÕåÜßê¿„ó^6Ú°êΰJ(È’&;\d¯eë¼ø‹Út³²‰hçfõlIÌð«š$Ç~Èšà~UÖÖWBƒTŠêRÈbWŸµ=œÖo›ÑJv$«ù{êªv¥jöyHáM{®JȰºKò½$_˜Â@Êi5šä5—HÏÀ[•“W×[VD¦¤5”Mz²Š·¬˜q_UïT?çÃO›OÊÑUXkžW½3z|úÖ‚1+¹8½z¤Hψ™8À´q\VAˆ]<Ñ€ €l-Œë,•QÃx‘ß½°›§âót‹›l‹nW|šnq“mAçt‹›l zŽé7ÙtN·øI ê¬þÅ©AÇ4¶v|þiÛ9nòØžcÝä±=Ç46z.òØžc“.Ÿ‹œK:']>9—½‹Õ§I—79—tNº|.r.é9&]v×W»þln-r_¨=ž3Ã-ÓôgK¶=Ç ò‚Á…Œ—PHyc7SÛùÑZñlü K°§¨†<ã6LóØŠ5Ó‘•šâ'˜¶ þ^vcX!vñDGP.RR‡}×låþÌ|jh†6¼ìxXPäwéŒo5勞5|¢”´}õÎê'ÙÐ}ŒXuc$Ϥ³¯AA1ѳÉP†÷M ‡{„ó€ІUw†€UB)@¾—ä&;\dójŠíOÑõ總t.óš:¹(•ë°ÉÄÞ]3ZQÊNOi¡àµñ†ü˜Ý·Û‹Áð‡5Ÿèø2_8J£…-À`cžOJ›o>ÎÇ0XóÐÞW%dXÝ¥@ù^’/Lá «xÌ;…f™øþZ¼×¿sa½ƒKÃ9Ü=³rÔÝ’rcVå—u:ý.Ô©!²Š²^fÊç§T–‚àuzl¤†ôp"7gsIŸ¶i;âïe7†€Ub@tà åQ£ÍVO +£' ߺeÖ—fÖ;E¢@ë1sº¾8ß_Ûô—‚°Â&¹MÍtb$¾NB¢V:?3Óªq+ÂJÊ„ó€Ð~­ºV ¥ù@rÀd‡ €ì^kžû3I/C½z²ÉqPí ™×“>‡þ½ôÊÖ¨ïÉÚ¾zñ§h«~³e½È/lK†œ±¯g”‹ÑJ 2Z-4·Á>)í}UB†€Õ] ”ï-ùÄ„.2Ê[®ht³¢¶×Ç-«Eàs=ˆð£f~×$C‰YO5Ö]úMÝî¼½Èwu´@LäƒÓ×½UÞŠ–iþÇñî~ÔhIúô0m'@@ü½ìư Bì∎ \¤´-ú]+­ýLo7û|Åuˆn…¢ÉÓeCP 35Kp½eç¯2«Ï=ŠÆ¢[­ÝyF¿àt«EaAQ•ýdªæTH 5””†i/]5>`‡˜¶ þ^vcX!vñDGP®7Á„©}Æáµ´éiË °]ém g­wºgOṲ̂æ[ªZðLÞ+Ǣ߬˜)Iw—\ÛC]l6‹í•¢Zd:kGNE tp@8(¼ho«î «„R€| 9`²Ã@ö‡8ã±mΗ¡·>™|KŽß¥ŠM§“âØ¹u¢,3^‘äj]; h5ŠVM?2ÙBÒ¸*«äò¤t`"ͼÆÕÓ=dnDû¼7 ½V%dXÝ¥@ù@òB¸HÞû5«Ó!þ’z|ýÒ‚3SQ6vÄÖzœŒ5ĪãðkpÙÑ,Ðâ¦íˆã²À° Bì∎ \¤”{Æ®½êçziêjÕS!5LœÆÉªq« 6[ˆš¨ !bë§VÙ*Ì# ˆ‹S7«É# ßù!yýЭ/:ø^Œéã€pPxÑÞVÝV ¥xÉ·I˜ìpm£¸'ëW|ÕA’‹’Ïz°F¬Õƒ•B½®¤ZtvÚ¨~îÚ>²ØH¬ã#kîsV*Ç %¤Æ×ܾY›úWÚŽÏXJ˜[rìóÐÞW%dXÝ¥@ù@òB¸È^ fº*Ã@ ­xäRRë°Koj?úË5»¾: éµþ¥y¦0´Ê\z=°@Z‘±5žï+øže^“žl±¤¤ kœÿdÓvÄßËn « Ä.è À@Q¥3¬7¨ÒÖTé ë ªt†õÕŸ#à{Ž€ã}u¾®èæ¾:_Wts_¯+º¹¯Î×ÝÜWgÝŠÎÊÕnEgåêF·¢³ru£[ÑY¹ºÑ­~ ï1ŽVëÙh¥«õl´ÒÕz6ZéÆj=­tcµž=,tv±ÜxXèìb¹ñ°ÐÙÅrãa¡³‹åÆÃòãü.wàÁw}v]Óïú캦ßõÙuM7¾ë³ëšn|×ç8 =Ç@Ësgéä> ´ÜÄYè9Znâ,ô-oÉÿ™8ËOPð{‚‚Çös `ÓMûÀ¦›ö9€MÏEûÀ¦ç"‚}ζ sºÅM¶Eï¤þiºÅM¶=Çt‹›l zŽé7Ù?©Aß“tÌc;§±ÑMÛ9nòØÎilt“ÇvNc£›<¶sÎeO ú4éò&ç’ÎI—79—tNº|.r.éœt‰’ÿs9—=Å–‘„-̨<›Þ= ‹R˜Šµ#gÖË«]“õÈe­{¾=–íPjÔO‰o„<íþFÓºZóð±ÉiåŒSL| v%¦ç8ûx¼kRÚûªôfhcu—å{I¾0!„ €dôK¿ZÛ_Ø kjÉxÝÒ­í¦uU×;CõR„|ÿæ™O-- ƨb+Û Û¡$·ºo±5³žaøØ›Ät×Û<¡(\Ö»lçªût°MÛ /»1¬‚»x¢#()o7Œ¯Š*›ÇUŸ ‰ÁPÜÌö.Ìø #ð­‘­2ÄVO˜~Çl³>«“ßrÔð/Ýx÷¥êQ(í»(RçÀk§)þ®ìP÷Åiä¬UehÎ @ûµêbX%”â%H˜,¸ÈV€Ý9Ÿõ–ŠaÍQϚ‡{ó¸‚(3@Þ±~6€i;â¸,0¬‚»x¢#()}sÇSØÀv¦j^«gƨ'Wðøþš¡cÜêϽÍÓ‰ìípÒ…Êë¼Kµ÷5쟩­i€"þŸ‘ÑjØòI8wd­£™°…á< ð¢½­º3¬Ò[ o“0Ùá {¹•ÞµÁZù&è‹Ñk6 ›3m¥@Œ_ ¤¥k±æ.JÏÒdâµ_EUj5óð󩿢ûÎú­t•³£ÜJ·µ?²ÅÁ>ïMh¯U Vw)Þòm’ï˜Â@J)—ì¦f’ÓV¹U~ÙÕAÊÞYZ€½ä©†ãü”xUm–Ì÷§t5ë/eŒÖ^5l‡¯ãSÊÎýÐåfu¡Zû®±8€i;â¸,0¬¾„X∎ \¤oáu¯{5K'´q”V0ršÇ&Ž®ÅÝæíøzę̂\Ô^Íûª5ΤSõ¸RÚGÆ›f…ëk,~éIa”Pl™îso[-ädëÇá< ð¢½­º3¬Jñ–oI˜ìp-ÍÀí±%ÉoFûIñ!Rrœv…cÓdÎåW)AëAIç9_ôSPžZ¸¨V·Sv³ìK ƒ$ÉNÚ1¸Ù’U“«¥.èhEéÞƒ5)í}UB†€Õ] ”$ß1!„ €¼@•ΰޠJgXoP¥3¬7¨ÒÖ/Qý9¾åøãûê|]ÑÍ}u¾®èæ¾:_Wts_¯+úú¾úSÝŠÎÊÕnEgåêF·¢³ru£[ÑY¹úB·ú1~‡!paµžVº±ZÏF+ÝX­g£•n¬Ö³ÑJ_X­:»Xn<,tv±ÜxXèìb¹ñ°ÐÙÅò…‡åǨ÷ì_ê¼ð]Ÿ]×tã»>»®»°è»>»®éÆw}v]Ó¾ë‹8 -ÏEœ…Ζ›8 -7q:Zžsœå'(øû;‚‚ìs»§ýaû9°é&‚}`ÓMûÀ¦/#ØœmAçt‹›l :§[Üd[ÐsL·x.²-èœnñE¶ÅOjÐïïH ºÈc;§±ÑMÛ9­éwšÇvNc£›<¶s=ç<¶‹œK:']>9—tNº|.r.éœty“sIç¤Ë/r.½´%h¿¬½Õß~ì'ŠÓbãõW”ÒiË“‘Úô»v¼DV»§ÞVG‘ôžÇ£±ªúÝÄŽU?}„ÏÊž36ëV‹%-¥"ÆY>}Î @ûµêbX%”ä{I¾a²Ã@6…l´ %›Ë:sÙJYYÜ|îÄ¡G°Ö\úc’ö€(ˆoap'¶·us£“·’Ô!iúy‘WcuîÈbL™ê"«ÓEãdò,g˜òû<¤´÷U Vw)P¾—ä B¸H+FF/išÿuÔÂ{OrÞÇw.çzþhSÞ>NM‹­è<ÏhFŸ¯ö¾"Òóí†rã3­+?^õšäFUr©Ô_ÌPäIp5þ“LÛ Çe!`„ØÅ#A¸HéïPº— •94Ñi¢fóhôÞ^™þŒ¦?7®uÝC|¢h_iyíÜ(–-Á…)±NC šþ ´?¤bÊó11ÁO{•O?ç  «î «„R€| 9`²Ã@ö¼€Ç]塼?…8C0zÖäáÿi޶”ë¸"d¥èc9®\_¦·£…èŽIlDÖå!lk‚“6‘7·#0ÒºãÂÄnìóÐÞW%dXÝ¥@ù^’/Lá «¼kŽA·±T0YÛ3ØÕ„,¹•È’îDúËf“µOBýUù|™©‚òjiF2_ºÃ–ŒÒž£¬ ÒjúUópw6ýÎX ŒÀ¦íˆã²À° Bì∎ \¤´ÂëmµÞüͲQÞÞØ¨G8ën¹o² órfS¤ÎGüõ­æ6rkë7ˬwÓÌä+¸Ž  kz þæÅbEÆe…KšTÌêk@8(íת‹!`•P $Lv¸È:…Zï>B–öi¢óødûl>í ÖiÏ=QXªUk[¢fÁŒ]Ù9u9© fœ“…ͻ콶´baYpÍå‘·¢Ã âq°ÏC @{_•!`u—â-H¾0!„ €LÒıÕAÎ$Ÿ§ÅQ³]6¾´óÓœYߊxÝŸÞG»üª¬5O¿jfŽª)} §°JÖ¼ÙE]øµ=“ž®TéP7üþ0€i;â¸,0¬‚»x¢#(× HÇö|Ç„.RŒ c§©”d÷iòóul¬# —i¸$§~ÎßGYÇg*yç»hГ?ŸVŽŽÍÙiN…D/Æîr;·òRŽé“LÛ Çe!`õ%Ä@tà eO-&ÂO´N Ð_î þÃ8Âd|ho>‰d„ÅPb«pn€ÌgŸ…õ@©¤¤"1áXt:qÛë`B÷pšÞþp4cÃá¼ ½­º3¬Ò[ŠM>0Ùá {Õ N¼©ûlÚ.™¯u½é—NÓ}Ά{U”EÕ ¤Îa*ó# Æj4IÙ’-ÀÕ8ÒVšŸ¾–y)…:2UºÏ½w•4û¼7…ö¾*!CÀê.Ê’ï˜Â@JÒ]y¬•„©Ne3Ò:J·Öf÷4ibTÍ4@ÔwÓ3)Ú©A•ÖvF@ù{©óv·‚кzòè‚Ü ð&4£¶ÌkÓvÄqY`X!vñDGP.²%jÇ<©a·*|{ú «³³‡4›³KÙKfxã[Im ÛÈnHó#ceOûÔJ9Ä\§Âé$š©ÙõXýgfîÂy@h¿V] «„R€| 9`²Ã@ÒÖTé ë ªt†õU:Ãzƒ*aý9¾å8^Wts_¯+º¹¯Î×ÝÜWçëŠnî«óuEgåêF·¢³ru£[ÑY¹ºÑ­è¬\ÝèVtV®~ Eõ/5ŽF+ÝX­g£•n¬Ö³ÑJ7VëÙh¥«õl´ÒÙÅrãa¡³‹åÆÃBgˇ…Î.– ],?îÀÎê_ì<º®‡/àÏ|×g×5Ýø®Ï®kºñ]Ÿ]×ô\ø®Ï®k:Znâ,t´ÜÄY´ø'–›8 =Ç@ËMœ…ΖŸ  îÈ¿4(x `ÓMû9°é&‚}`ÓMû9°é&‚}`Ó9Ýâ¹È¶ sºÅs‘mÑß“}šnñ\d[Ð9Ýâ¹È¶ ç˜nñü¤ýþ†Ô cÝä±=Ç46ºÉc;§±Ñs‘ÇöÓØè&íœÆFç¤Ë›œËžôiÒåMÎ%“.or.é9&]Þä\Ò9éRŒ¿”úïÒn‘4 öÃ!æ47xG/àÄF†Ÿ ެޅɼä)ºs¥õGÖcß˲*‘Í%¬‡‡|ÿ¦™ Ç|×J³>~6€i;âïe7†€Ub@ô7(\däi¥;Ú`S/‰;Ú¹f ÚÞi.–.Nsèk«˜¾eZ×U×—uõ i¤I ž›éMÒóCO¾®3—OLmÞÃWJµ©~Î @VÝV ¥ù^’& .²¿­Z¨=‰F`ñ!V³ž¾•þ‚¡}"òŽ<ëöLuT›¯ÝH[‚> 1_G°ÝW†¿OÚiJ4D£ˆX¹vf¾*gѳ·óAË6Øç! ½¯JȰºKò½$_˜Â@Š¢ÜkH·¿¾¦=ËJEÉz)e—Gv}¡:^‘¶—A¬[O[9Ê;~Ý(q)í}UB†€Õ] ”ï-ùÄ„.R|»¦?ué™Ö5Ìiüì%Cò 0HÉÑʧõ1K¥» r+ùRµúŽ:iõÁbƒŅ̃¾²ŸÔo\˜ñÑv¡™xÁ®þ|2Ÿ `ÚN€€8. « Ä.è ÀõR^1éá|×=úÛ>7Vw›(Ïâ̸Mc²ê.kÞeõÄË8üÄ—žžw¼»´bD«à»å<<€ÝYÙ¦…íœùb=äÑ= „ó€Â‹ö¶êΰJ(ÅK>|Ãd‡ €ìN£îfï.-µD€o—ÀŒÔxÓM‰öUÌZE¹ÇÚ½ŸbÕ¹8¯žTB@ò—' |›jß¿Êÿ&û¹ YR§•o¤Q_W_z^ÀìóÐÞW%dXÝ¥@ù@òB¸H êzUVïTUckÆv·LÛíFšÍ#Àða3]©¶Æèu˜´%«ü£èŒ~õ6 U¦5‰q£ò†…µ:´œõÚ`0óÅo´ž `ÚN€€8. «o!¦x¢#()Ï9{_Ù^Þ&¦¢ç’øÏÃ43ù›HAO) 3µêR†œ;RVCå¼Z^@ˆ#JÙrKlÑzI­—å*ÂèÒä·ÇzÿÉ€pPÚ°êΰJ(È’&;\dK ‰i•¸›z–¸ÊÖú©THOÉyÖÍøHÝ´1z@IÛçå,-‘çþ”$ˆ¹…XëÎ3 ÊjQñþGuÛDŒH©ÅÁ>)í}UB†€Õ] ”$ß1!„ €l¾Ý8¬‡*W¦›AÁ˜æ»f)•áŒÆÉĽa´a¬P½Ç–éçFÙ½l÷Ãñ1²âøfÅÕÛö\6¶kVPø cÙ:òýRz `ÚN€€8. «/!–x¢#(Y¤ya™êT¬#Í öª>­G©~|"bïU1©UƒºæûW±I½?{ÙhÂÌË©.ù6-bm§™æ­Vªbjõöã€pÞ‹ÂFûµêbX¥·›| 9`²Ã@vó¸çÛ´m|,EÏX‡×ÚN•á ’‹Ñ¥Ñµ¸ÎÎÂaò!d3/Àfù¸œYC,Ûå,½Áœ^=Ò–Ò+ ÒßJóZOϾ¬ÅÁ>)í}UB†€Õ] ”$ß1!„ €3,©¥Ëš_ˆê.“λiUc¯Ã Ù+.IÇ­¬°:íKÙb¨iFÞ«À`«òÝ(Õ×¢¦šÏÐ4(ŸëêµåZs’KÔí“LÛ Çe!`„ØÅ#A¸È#ªt†õU:Ãzƒ*a½A•ΰޠús|Ïp¼¯Î×ÝÜWçëŠnî«óuE7÷Õùº¢›ûê¬[ÑY¹ºÑ­è¬\ÝèVtV®nt+:+W7ºÕ!ð=†ÀÑj=­tcµžVº±ZÏF+ÝX­g£•n¬Ö³‡…Î.– ],7:»Xn<,tv±ÜxX~Üßã<ú®Ï®kºñ]Ÿ]×tã»>»®éÆw}v]Óïúg¡s å&ÎBç@ËMœ…Ζ›8 -7q–Ÿ à÷ìçÀnåO#Øç6ÝD°Ïlº‰`?Ç6=ìç˜mAçt‹›l zŽéÏE¶=Çt‹›l zŽé7Ù?©Aß“tÌc{ŽilíñÜŸæ±ÓØè&íœÆFÏEÛ9ž‹<¶sÎeïBÿiÒås‘sIç¤Ë›œK:']>9—„R¼äûãœËN.õ_©ùHKiéõ-‘8ësÞ«ª7,èutM<×ÍÞ³¦~KǾ ë0%jNŒö–Àº<ý“ÁÍâÍ€135š-Ó²” ÖJ×+¬yHhï«2¬îR |/É&„p¼÷Ëðô6:®ç¹7[ÙåŽ~{×ì{+®Q“ÜtÇN7×\²ãS’'ÏÑÊK}êå;3)ª³R^鹺²R³M~ZQk¾Äדçœ7óx `ÚN€€8. « Ä.è À@2Cl÷&ÅÛ˜´¥·ð/é§Ï úía¬÷Û<“øÿæ•YÜèrÐÎ1ÖÕ»$µçW³œ\rôzõ¤:^Ÿ§öe¦8ß—¦àÃ'Ây@hê;CÀ*¡ ß[ò“ÙÙ±÷å K¯âzý»áõmÆ-›ni|"©•…˜ºqˆ~³gƒIëõ•Xë3dRÒÎ2¢‘¾›FÎ:ÎtpÚè³>í“7—F0Øç! ½¯JȰºKò½$_˜Â@JœÚ+ 4·…´áÑÝžÆ ÇÞJ„u™0®1Ãz%¿¤súóå .ÉЊqOìäX ŠIu©ªö)6gYr‚”E—Ah޹¡îlÓvÄqY`X!vñDGP.Ò‹ ѯ·)â-?EôUq+b™Äùû±i£WO”§a)ëÑÅ*ô* !Ñ ÅNžEÖ:ŸE²é^·8§KÃæŒò Jc ™ÍǤM•öá< ´ß«N†€UB)@¾—ä&;\d«fPGø^}§›ý§°AÏs©÷0^‘¶Läêü™ÅÉ®ïɤöüh;Õâi&¬žHÉÞ|MXy³§0°é§W;¸0ß¼{i¤Ô¯wƒ}RxÑ^«2¬îR |oÉ'&„p}²‚Ç+Ë¢o %fã¼Ð¥–̪P$ö«ûS.ÎÓŠ?²œH[¦Ó(Ê£ÔåLaÄ‹ýxO¦äpZW‰çY̧ƒmÚN€€ø{Ù!`„ØÅ#A¸H>QjZm äKêÏåúiºY¼ÞÉGýeåbLvzš‚–Þhnè’ô$Ì­³é¬$·‹æ£Hà.j0Q8GÕƒV†Sáz `ÚN€€8. «/!–x¢#(éå!rG@–ra™Ç.ÎÞ;br¸dõ,e5ÄO×ñ%ýêÅ)6=ÊÁ¶>¾×©ådÚ eÉÅf”[ip™hêÇá¼ ½­º3¬Ò[ŠM>0Ùá ›§¢&…Ul·¨ñY'FFXçtš7_!¨Ã-¶ÐÑÒ܃ÍÚÈNtãnÈõ›ÚŽÇЭ3mÉ«¨ßÌ~äTÈE’æTH?q<ýþwÆà`Ÿ÷¦´×ª„ «»(H¾cB×ÈäýÌ`¶Ó4@­ªt­á–Ô>G€¸$ó23=6V²q4‘ ÝŠÞº|{¯±Qyo^êJ6~hî-¢Œ’=ÍcG…צíˆã²À° Bì∎ \/ =ëÓÓE²«úðm73ê¶!eÖIl‡›UñÿÌ€j¨y5d q¾ëa•Î s¦§:ä46Tj>(«0HÂÝÄŽ·£„ó€ІUw†€UB)@¾—ä&;\dsáóΟ¡?¾#ý"ÑG}ž/n™©nðe*áGE5š×+“Ýê-ísÈsoÔ8Rz£Û¦2ÄÿY“$«Ä•Ý®x??ôm°ÏC /ÚkUB†€Õ] ”$ß1!„ €¼@•ΰޠJgXoP¥3¬7¨ÒÖ/Pý9¾å¸¸¯Î×ÝÜWçëŠnî«óuE7÷Õùº¢/î« ÝŠÎÊÕnEgåêF·¢³ru£[ÑY¹úB·ú1~‡!paµžVº±ZÏF+ÝX­g£•n¬Ö³ÑJ_X­:»Xn<,tv±ÜxXèìb¹ñ°ÐÙÅò…‡åÇøû;ܾë³ëšn|×g×5Ýø®Ï®kºñ]Ÿ]×ô…ïú"ÎBÏ1ÐrgéžÙO-7q:Znâ,t´<ç8ËOPð÷w/"Øç6ÝD°Ïìþræ#Øç6ÝD°ÏlzÎì‹l :§[Üd[ôê|Ÿ¦[Üd[Ð9Ýâ¹È¶ sºÅÙ?©A¿¿#5è"íœÆF7ylç4¶vmÿiÛ9nòØÎilôœóØ.r.éœty“sIç¤Ëç"ç’ÎI—79—tNº|Î9—V|ôi-PBÔa/oãûÞo–3-3Ÿˆ?·e ±ÉâfQG-îvdÛ5òÚµÏq›¶‡òÆit‘WåfFÇ%ƒzÝ"©èóç}@8(íת‹!`•P ï%ù†ÉÙ_Fw„íeä}qúD‡›äøØˆQ”ê½H)Rwõ—8;—õêV¦ÛTu«yq噥λ!n›0zÍ4’ýéó<1a°æ! ½¯JȰºKò½$_˜Â@2C¾ŸV Uºß±'n»l盡Rí¦T$ߟ&ôÝ Ë¹4ËÒ/µ„O¾Xt?ISžù€ÈŽ¡ý}E”ÇSŠwUÛNÉÃÊ´”¡mÓvÄßËn « Ä.èoP6¸HyËe4é=±n<öt+ޤøy§PÅiä¦U`B\}Bí¯d5ÖIÍw&eè'vŽïi#Xí×dëí¦ñ¢.fóq@8(íת‹!`•P ï%ù†ÉÙ(›ËÔ_y”¨'Š ½I÷!樷¤Tz·ë‘ˆ >­¤~yÞ4öÛ6©Ä)RÖT½ûDtó[@ijŸi6¤jû.Õ¼Œ÷5Øç! ½¯Jo†6Vw)P¾—ä B¸H/²<Ô®$oµ@¹Tpvn}£!…¦ß…ò8 ’tÛÉIÊ>ÇéŸLy(’¼ŽtÓˆJe¼A ½›Ñ‡•IžŒh_‘*WñŸ `ÚN€€ø‡eCÀ*±‹G :‚pU^!ê y†zq÷öSðÆ÷3æÅß[šáiÝ3õyeõð«!ûù-{ï×cá\ûë¤&¬¸G¦DÞ‰MKY±Ñ %å½ý8 œ^´·Uw†€UB)@¾—ä&;\d#çJ/ ¥å÷ã Î)Úq¼ˆçr<oµ²Y…Õcóêq{A 庈ÆûÒöW¯=Ùø+ã~óA©ƒ³×©ÐËÙá`Ÿ÷¦°ÑÞW%dȽj¯L)P¾—ä B¸^@ºÒ›iû¦2Í^S¬¶SÈâöúU´.]v¨‹ID¦isÊës¯·ˆ¸W’ßÀÈF/Ëþ0Cû„\ì*y ”èÕA ˜¶ ŽËCÀ*±‹G :‚pbJdõ¸Ê“ÄÑÏ4ry0èmAª›–¼Ó`{»ZËø*Ú ÎÒ8Dq‹[%u³ÔejPâ߬ºŸøBñk¯†ÔwC/[Ëš÷ܬÛ`Ÿ÷¦´×ª„ «»(H¾cB× È M‹Í¸øC% ºµ–ôö³âõí)[½…ö“j:´ßõ%oÁv–§D½+ªÖ<ìilÆh”TÛ0«ý:o ìHÃÚ¹Û¦íˆã²À° Bì∎ \ddC?-]ï¼×ì@ ÷ŽÒcíâ¯c;4{ÏŒƒL2ùKRk´% h¨Î¶  O¬ZrØJ·(>G«wJvY£úÒ +©ï_ÍÿÙ„ó^€6¬ºV ¥ùÞ’/Lv¸H:Ãzƒ*a½A•ΰޠJgXoP¥3¬?GÀ·ÇëŠnî«óuE7÷Õùº¢›ûê|]ÑÍ}u¾®è¬\ÝèVtV®nt+:+W7º•«ÝŠÎÊÕ!ÐYý‹ £ÑJ7VëÙh¥«õl´ÒÕz6ZéÆj=­tv±ÜxXèìb¹ñ°ÐÙÅrãa¡³‹åÆÃBgË;ÐüþwàÑuM7¾ë³ëšn|×g×5Ýø®Ï®kºñ]Ÿ]×t´ÜÄYèh¹‰³Ð9Ðrg¡s å&ÎBç@ËOP°³úlº‰`?Çv þiûÀ¦ç"‚}`ÓMûÀ¦sºÅM¶Ó-n²-èœnq“mAÏ1Ýâ&Û‚Îé?©AÕ¿85è˜ÆÖÌ”?Íc;§±µl™?Íc{Žilô\ä±ÓØè¹Èc{ŽilMØÏ“.or.Ç{²Ï’.Ÿ‹œË^¶öÓ¤Ëç"ç’ÎI—ÏEÎ%=ǤKøa¶*zÍxõ¢GX§¨²Uhë<ÍxÖß–Rç$kg.3_%§¢BðfðSó“´rU*äÕ_-3&ä}ÑVRÄCùt°MÛ / m¬‚»x¢#(iÛ»æ<ãì:Rðë…F©]±i@Ê—4Ï)|<Ö»í<²>Ñé6ãè,Óž—™‹.Þ·þޱ§Ÿ3BY¿zÞëÝÄÎ @ûµêbX%”ä{I¾a²Ã@¶‡‡µrý˜­¥,« %¿î+þ¬æYWùÉÂ/óÁ«øæö1sRº&ÝPÆVíuäÚ˧¢·gKi^W|ŽÍ¦ E,[õêÙû<¤´÷U Vw)Þòä B¸HyQØûs´×-|á…ñØ¢ð¿ yèV,Qéi{z ëÌiü²ÒÊgT=hO•$‘n“òĎϪ8ã&…¢žYq¸õæMi’GÒS’AþdÓvÄßËn « Ä.è À@Ї,ë_˜;qæÎÅŽNS=‡†ØŒàZMT E] ¤µÓfáÛÁŒ’i(d«kŸÏ£ÐAkÄ45w>¬Òt'ñW¾z*¯á< ´_«.†€UB)@>0Ùá {ú²Ñr@u«®éþÁöc¨[­Á¨E\™¡þU4£Õ‡ñaöî¸Ö¯^\1 ®I©“þ:©cgæ£?þ™ã¨¡Ð¬LùývE¼yqØõ0Øç! ½¯JȰºKò½$_˜Â@þêjÜ ›é5tfSâBꈺek×ÕLo7ŠD´ÊEü%̲¬ÈØi‡óU“&Ò*ÎÌZ©ÒÞh¼¥lW«3êl–(n½Þ0m'@@ü½ìư Bì∎ \o kÍóŽcKÙ9£î@ÃæñŒÏ²qê(ŽÙ©w‹~7¹cb.(ßRÄÈŽÒ‚O/ýÜhøƒfcµ²=°úК¹³N íÂy@áE{[ugX%”ä{I¾a²Ã@ö8ÙìÓÆÿ(%}ÙEkÖHbjUŸæ³O>À“Ñ“>…Ñô4õ¼_²^#ÖG·­QúœÚË;¿TþÄú…Þº-³¤‘¨ØzÎŒh öyHhï«2¬îR | ùŽ !\d{T¬ÝÅ‚Ä~íˆre>^ª*q|ÆQ¢¹3ï÷¨ÇcÍf>=•W¶Q¯Qxæ·È·¬߬xßÌp/7aÙjôËÙËÜŸÆj FÀ´q\VAˆ]<Ñ€ €dSB82CYHÑM ªˆ‘˜æóI)ø²޼Vƒl̼‡œÛC$*¼„}òfÖM0u¼>o~†Ñ¥¤)šMÒ2Zª-Õ5 œ^´·Uw†€UzKòm’&;\d d—çÅŸBWéz[c‘=¿ÐêY#JEÍUw—KЊ÷F,ëødÅ]{&Š3/ö/®W¹Ëº=ʼnìüˆ P7ÎÈþ <ÔœÖm°ÏC @{_•!`u—åÉwLá móÙNÍÆž1е³ZöÚ+6ëWá[Û·q¸K­©’£2rÿýFÅk‚…tÛñš@"å0¿Yþ2×°)qƯ)í}UB†€Õ] ”$ß1!„ €¬¿ä¤˜7Y6Uw»¸¸Ëz ËçV¿ë¨f–&"š²~À>ÔÕÛ„Uõ8m-¶s–iÃÜ%µgyVg§ÂÉ&~™Þo¾y–Û´ñ÷²CÀ*±‹G :‚p®)³ÃÖâmlݬIžùÇìO8›î_´ôF;>ƒ×'#5¿è×ó&m½Ó®E“¦°RNfî.þzÖ³]ÖݰF% 4ž§‰Íéü¨SÂy@h¿V] «„R€| 9`²Ã@6uÑÛÕ÷Fž†MóŸ²åM(Ñ®b7É»íÉeŠÔ:Z§ñ¬½Å3C¡ŽÝ¦ö†ºô²NŸMX.-FK3Üøz°I##¯Áš‡€ö¾*!CÀê.Å[>”|bB× HçìúêYIcš—š1eŸÁ›µôB‰i½Q–—ûóš÷&Zå›?‰0÷›ˆ©(1„MX#áÐŽ4ôóZæG<œcG¾0m'@@—†€Ub@tà %‚6"„Í©bºyÜ„sC߈Ҳ4ÎWc¬¯W9ò„7êö”JQÓ»Á§Ýô‡_̪Ÿ[’?¾8#ôU; öz¥?ðo%Òð£à€pދ‹ö¶êbX%”ä{I¾a²Ã@¶âç]/dzo·vnðG¦ÆHgÐê Ã'vîˆr‹d}ÊÜßðÎàëZ–¥JÏ˲Ús¦y«“ïµ;šÍbꬵÀ¦’N?‡ƒ}RxÓž«2¬îR | ùŽ !\¤ôVÄY$hSô¤H%j£76 CN(íúG€4ê «Í°øoç3éRYa·šµR‚øåFd³ëÆÚƳ¨ ¹Ì¢Ò£Ò2€i;â¸,0¬‚»x¢#(× ÈV¡Å ŸdE9£þJ-A&ÏŒyÌ9ßðºäã|ñc­×ê&|Kò£)¸ò"ßÕyHò g4%ÄÞÛ¤Á•ÂèÚ×"Ó)j °}@8(mXugX%”â%H¾a²Ã@¶.nï×£ñUOc9¬–ñžÖyÿäˆC´ D1ÓoÜ+m×»×Ü 'yuäðÞÈiUNÉq¶©õÒt£ƒä0˜ylƒ}RÚûª„ «»(ßKò… !\¤´ëõf¶ø¬ñ)Ž;ŽÏš5_#ÉïâÕGïèÍ×ÚN•ç]Ï_ŸVãªÒPÛw{©ŸVæöäSÈéÕ#Ê£3cßEiÜ©­Á³T;ÒÒU0€i;â¸,0¬‚»x¢#(× H>µ¹¸Äpâ4¢ŠT.ªc»Wéø¬á>k²7QÏR^¦s×Ê/iç¹vé&ë5Š'¥ãR˜éEšw8Ÿ\)ë¾3’ž&ƒ¦£ØÓÇá¼  «.†€UB)@¾—ä&;\d·gÝŠZ üô÷ô¦N’S«nx´BÛ"NÃëÍᇰ#Í%=Õ¢·unÖÇ?r-m,‡¦ÎftµëÅ`˜ÕYånìóÞ6Úûª„ «»(ßKò… !\äªt†õU:Ãzƒ*a½A•ΰ~êÏð-GÀÅ}u¾®èæ¾:_Wts_¯+º¹¯Î×}q_]èVtV®nt+:+W7º•«ÝŠÎÊÕºÕ!ðû; «õl´ÒÕz6ZéÆj=­tcµžVúÂj½ð°ÐÙÅrãa¡³‹åÆÃBgˇ…Î.–/<,?îÀßßá¼ð]Ÿ]×tã»>»®éÆw}v]Óïú캦/|×q:Znâ,t´ÜÄYèh¹‰³Ð9ÐòEœå'(øû;‚‚ìs›n"Øçv9ó‡ìs›n"Øç6=_E°ÿ8Û‚Îé7ÙýDù4Ýâ&Û‚Îé7ÙtN·ø"Ûâ'5è÷w¤]ä±=Ç46ºÉc;§± ÙŸå±=Ç46z.òØÞ’/Lè9ç±]ä\öÇ$Ÿ&]Þä\Ò9éò¹È¹¤sÒåMÎ%=ǤËçœs)¥ËCw·´Ý{]í^WŒº "kÝÁ ÌóGVôCðC7ngMÍý#ëG¯rÚ6®vÔžoÛ¼¬Â¦¬ÓSïs°öÉŸbø8 œ€6¬º3¬Jò½$L\d ÷Žæ-¯•ïÅާݳ£pqÏu©½ËA¯‰c]¸EïŽyÙd|­ôzé“`.þZÖŽ”GÒóíq­ÃÐiÍ|úž,É#É2·ä6Øç! ½¯JȰºKò½%Ÿ˜Â@Ê«ù~ž7À}rZŠ9‹‹;Œ­_¤™×lé Õ¥“/ sêIz¡èËtv™ìÂ4n£üIÏ;ÇwÀz{\MÔ–]-“¼Î8gµ9”OÛ´q\VAˆ]<Ñ€ €lM‡š÷¦Ÿ~Ÿü]¥®)÷¯ÒDCOÌÀ6ùÒâÆÞïï+’ÉóÁ«wv>&‘â£óœXÛÒÐhYEr3S¶ø>X 'ïAÿÉ€pPÚ°êΰJ(È÷’|Ãd‡ €lïz|oÄÓ é£Û]ÜóÕ ÿ`q©>”y»óiÕIÎ 1j“‹>åIr®ÆG…M¥ò*¶¦é?p¾ô ½kŸe¼T‰8Øç! ½¯JȰºKò½$_˜Âõ2Ûqý57»üšº=›ï¶¥CÏxLÛß»¤~qÇÛÁ›¤;€0m $¢£ÊP«îo&ò”¹„µïœêç=üáò´Fـч•¯Á6m'@@—†€Ub@tà ™‚­[Z‡œœŸ•¹«ë…1ÿHjK(*ª¬Ÿ;W¦Êš£²jå®Èj1ÊÍ1ÞŠ¶W–qXå-°ÅgÜð¥d†ùZt.i,dÎ @ûµêbX%”ä{I¾a²Ã@¶ê-¬9d=\)K‹+&…Y½Å˜§÷&—¡½ô*$uf±½Ít«¹²u²5j7!éYlR¸¼òÝ[‘úÙ œÏ;ÆdxOa°ÏC @{_•!`u—å{I¾0!„ë$_^í!r·›ÂèˆÓûŽ•0ϱU’U]C¼¦ùÕóÿ U²ãX/m uæ·ÈººÕ™³Ÿæ¤Eh\%’’èÓ}›~þÙ¦íˆã²À° Bì∎ \/ ï¦[ïÙfG³‡VüÊê7Òb Þëó;iÖ‘Ò|¡šâˆð¶Ÿ™¿„”ª%y^Û^t™u²Nè“nÂÊúÊÌ´f–!Õ꾄ó€ІUw†€UB)@¾—ä&;\d/qnSPXóðúöâZ¤Ñ^G­MÛó©hŠ)ê ¡±Þª¨ûÜÍŒµÀ›ÑãG>ŠïgRžnhÖÕ½b×^Ÿk_<ìóÐÞW%dXÝ¥@ù^’/LázY‚Õú6’ÂP´MIÍOM»®éÆw}v]Ó9Ðrg¡s å&ÎBç@ËMœ…žc å&ÎBç@Ëóüý AÁc»›xÁ>°é&‚}`ÓMûÀ¦›ös `7ì>O·¸É¶èÔ§éÏE¶EKoù<Ýâ¹È¶ sºÅM¶Ó-~Rƒô#ûKSƒŽilíÚþÓ<¶sÝä±ÓØè&í9¦±ÑMÛ9ÎI—ÏEÎ%“.or.éœty“sIÏ1éò&ç’žcÒe¿þšmÛž»]hcÓ§S?6ÄÁ†n'àûKA׫g‹§É»Ñ£ =×0S!«|m»äôL’ŠÔã]‘÷d}×ô8™hW*¢ WOFÞ˜¶ ŽËCÀ*±‹G :‚pâH‹ýòjä¾G@üJoðÐRày·Ç ' [½úÜØK‡Õœ¨¬ÇIòÀ¦}£ˆ#­èÊÙêÇ(¡Kžç Ó{#n‹â>Î @VÝV ¥ù^’o˜ìpý!N/CÞØKíB«ÅwÀ°¼|ëYRHyF3sgm\ûN¾¸ù.K øyª±e9OW‡ù(ϤíQ˜Ç¢´£W|Σ}zÖ<¤´÷UéÍÐÆê.Ê÷’|aBÉ'vè vz-;jw¸™€ÙüFíY¹ªþè¢ÄU=ïØ,Ìë}‹Y±³q˜6ý‰Žêsçï¯ÕÏù ®^ýÆUÞ×ðɦ툿—ÝVAˆ]<Ñß lp®y\kÇ›5 ]?EŸ{>þ*Ê|kÈ'›*“6ó7#ÆÑ¿Zô)³ÿes­^…õ¡¦¹ï²‹«í”8A–ó;‡ì>ç  «î «„R€|/É7Lv¸ÈQ "š¹MYÝqYóP¢kŠÍzF“†#­ådã•»$o@Ë|5ÆWpûN•î2£GZ{UU“f%i¢¦¼6ìóÐÞW%dXÝ¥@ù^’/LázY†‘Ñë¹—²Ê^Ä2œ±­ ™/óÚ–fc¥öäÇúõj,§¯ôä3uªà;y^§Q./ÌÄÎ×ì¦×Þ‡¬j¤0HütÓvÄqY`X!vñDGP®Òic\J|á•Zô±0J)éf•(^½‹…¹U4ÚC•ì8ºø‹ó~Ûàó.)v¬‰Äª=‘øOqô[것:óä IÃkÏ0È+ÔÂy@h¿W «„R€|/É7Lv¸È.l~× ¾ýê ÁðY³zŒúàã4SøpÑסEêòŒÇË\¨úîÞÉz}ò,¬Æ2k6yõ7[yt=i50JX¥ZLo{̾û<¤´÷U Vw)P¾—ä B¸È(³êعâÕ®ušn!¾Íål|âMæL3°™‡¬§/³"„Ö”2ËšYÝË×]Ž=n-+âüœ%ð·ªÓˆ]ÿɦ툿—ÝVAˆ]<Ñß lpl š 2d7ø ­­4u]gFD®µeÒ*[½'ä(}ÔŠ%}˜…Q%öŠKF[ÎFéUµbuâwŠ«u]¬~õ8 œ^´·Uw†€UB)@>0Ùá 96{g¬5­~D^šÅ¢ç4kv¨t­©¯ºj®£ïq¤^fUþ®\\%BºLo8ZÒ]¥*&¼Œ×hJþ%.éñ'ìóÐÞW%dXÝ¥@ùÞ’OLá eÙ9à¯Â87¦I“ðžú²MçTƒ*R$«Žeù9« ‹¸ì†‘Øòø¢®zbï·SJx ¨&ñ{((¬`ös±U\ŠIK\Á¦íˆã²À° Bì∎ \d–wÍqêžm55›ë2MLJ5q}õ%7Ï$û‹î¶=S)ÚÌ+Ê3é™Ð:™™S!-WB™VE3ů¥ì¤Ù\ÖNÎû€pPxÑÞVÝV ¥ù^’o˜ìpÍ…o_v½+ê —xðsï‡2úƵ:Zh¯%\ÙÕ=M"r){ÝŸ¢×8=KY=_ýYù ­?«óZ¬ßí/¶Ûd£¿µÅÁ>)í}UB†€Õ] ”ï%ù„.R?&­|ã¤LHz–JRÍô˜·¢:ã«ðRŒ`}õzöœ©våX… ylü©{¹¥Ghª’ëçF“èÐ6õF’.ëKødÓvÄqY`X!vñDGP.òˆ*a½A•ΰޠJgXoP¥3¬7¨þßsï«óuE7÷Õùº¢›ûê|]ÑÍ}u¾®èæ¾:ëVtV®nt+:+W7º•«ÝŠÎÊÕnõc|!p´ZÏF+ÝX­g£UsÈþÈj=­tcµžVº±ZÏ:»Xn<,tv±ÜxXèìb¹ñ°ÐÙÅrãaùq~;ðè»>»®éÆw}v]Óïú캦ßõÙuM7¾ëçg¡s å&ÎBç@Ësg¡s å&ÎBç@ËMœå'(ø=AÁcûÀ¦›ö9€Ý¼ÚÁ>°é&‚}`ÓMûœmÑߦ|šnñ\d[Ð9Ýâ&Û‚Îé7ÙôÓ-Þ’ÿ3Ù?©Aß“tÌc;§±ÑMÛsLcë½Ýþ0í9¦±ÑMÛ9nòØžcÎ%“.or.éœtù\ä\ÒsLº¼É¹¤sÒåMÎe;QÌÐÁZêSî Ú¼À›=éO‘ä݃wœw¾s'ÚYÌÑj‚0+Ô¬H¦¹½]=£-~U…•Ç;ÓSÁ?³Ÿ– ”Œ]ÛØåbçyƒ5)í}UB†€Õ] ”ï%ù„.²4DQTƒOÍÞk——:p9¹‹Ñ›Œ¯Òõ>Æåþ¬Ý’EÔëv(q*{µ½*/zð¿˜e£¤/ë,ŒÉÓœ1~´™É8€i;âïe7†€Ub@tà ¥öuî9ØÍéúCäþS¸XóÌÀ” [¦|*EsÃçÝÐlå®ÈvÚÊò¬.Nìj®ë!ŸpšÇ/%ê“`lOÈÄÕ((êÇá< ´_«.†€UB)@¾—ä&;\dˆvEóÜűÓ¨vˆ8Ó;5Õ!—d‡³+J•‰8¾$/B“Ú³üËÚªŒ7e}=­ò‚¯ ›ù$´~Þ6±øå?`=2jŸ‹qÄ5öyHhï«Ò›¡Õ] ”$ß1!„ €”#¼·i_=û¹è‰âùH*zÖ$i«5w¹‚s)º%£KZ¦[ÚìÙ°1…ñz§w «=IóÝ6+Þ)¯§Xl`kç9ù2í*ް `ÚN€€8. « Ä.è À@JÏ’ÞsOká÷‹ÑõV"!]-‹õWÃüýBYæ•ü÷©Ê„”–ËÇ„áNjû.”¢ Qª¼ÎSû¬Æ¨;IzÎXíGÔ´—?ç  «î «„R€| 9`²Ã@ö–nù,+¶óá"Í㥸²Š‰DÍŽ)Ψª-_O¿M»9Ã_ér¸Yã–£ÐG;ìÔ M8Ü0@Å퟽ UÚO«pmƒ}RÚûª„ «»où@ò… !\/ ™3¿zËšö˜&:ŠIóø”ª£È“ËÔ1å1îîÈV;\zÉdíxÈ Ù«Â ö¢™ØI!鲋чéÅ26jåÀ´ñ÷²ÀÐÆ*±‹G :‚p¢u…<²ZVz»ÿ ?ˆÈ«LS £;\sª»žAÕèÊü™“OÈZñyä57JÄ»cŽ?À)yô)O “è9 ûd@8(íת‹!`•P ï%ù†ÉÙ®íØs¬ÅÇõ¨Ø—Y¦IÜ´Q;ÝHÛÍ¤ËØVöqþ—`ˆÓ³KŽð®£´#.2ß3 ÇÖº6uiŽÛ|Í|ƒW­ lgï:ìóÐÞW%dXÝ¥@ù^’/Lá ]³ˆÇ;M&7žÐ·Š?·8õRy"«ú]–"Yn.ëbÖbE rvÞáÑYÁ‰móù™0„í‰éÅšùöŸ9°3Ú|ÝjÔíƒmÚN€€8. « Ä.è Àõ2§°´}é1²„ŵ;ÉT³›#ßnÅzlLó«7e(á-I€í½•ÞRÓÈÿíj­už˜ÞÍŒþâ4¾×²´lÔ¾Àû€pPÚ°êΰJ(ÅK¾—ä& .²?&qÆ(àÒ¼púÁøjU›:ȪëuovIûõðTFÕ^©?Œ>t-€Â²N “Ïi–Dñ.¯2?ü‹waÛ•™µ±ewËl]‚·Á>)í}UB†€Õ] ”ï%ù„®Õ÷í,•\3ÐO㜖<šþˆ{ô‰ŠF-©a2zîµOÉŒ_¶•œàÜ­Ão莽_ó(F1°«ÚY8‹÷´Ç›Ú{z>9‹˜¶ ŽËCÀ*±‹G :‚pò%õ<¯]­Umà^Ͻ7ëñè–C˜µ—2-F[GïÞvñ/;5æÎi唿Gq# ­%K˜q ¼VgaVeêÀŽUm©ßóq@8ïEa£ «î «ô–äÉ7Lv¸ÈöHÝn©VÌÞy–jˆ¢©Ã¬(O”O$?kª$§æ.wŠ·A·)içd¹æmû‹Õ¤™˜î$[ªÄܹQð¬'.•V°î߃ƒ}RÚûª„ ½X]R¼åÉ&„p¨ÒÖTé ë ªt†õU:Ãúª?GÀ·÷Õùº¢›ûê|]ÑÍ}u¾®èæ¾:_WôÅ}u¡[ÑY¹ºÑ­è¬\ÝèVtV®nt+:+W_èV?†Àïï0.¬Ö³ÑJ7VëÙh¥«õl´ÒÕz6Zé «õÂÃBgˇ…Î.– ],7:»X¾ð°ü¸•»¿Ôxá»>»®GúòŸù®Ï®kºñ]Ÿ]×tã»>»®é ßõEœ¥PŸZnâ,t´ÜÄYèh¹‰³Ðs ´<ç8ËOPð÷w/"Øç6ÝD°Ïìžô‡ìs›n"Øç6=_E°ÿ8Û‚Îé7ÙýDù4Ýâ&Û‚Îé7ÙtN·ø"Ûâ'5è÷w¤]ä±=Ç46ºÉc;§±uíóóØžc=yloÉ&ôœóØ.r.›æþyÒåMÎ%“.Ÿ‹œK:']Þä\ÒsLº|Î9—òæ}Ôx•ï…þ¢I®M¡î]FZÎ r‰uèT‡¤Ž®™Ö_¥u²jô½G ÷zßëÕ7‘[0ó‹ãoLËt7†V6t U•ð}@8(mXugX%”äÉ“.²ï»Ñ±I4wË_™×”5Á;´íú÷Òª1oÓ&“‚Ûj“ɳO·Î\›¼&aK½úaÛ´‚ÒÞ†¹ŸBƒÒøé·CÏJ•Æór†Áš‡€ö¾*!CÀê.Ê÷’|aB)ï4{eîö—Xj0/l‡NŽoI¥Ýn¥®vWËbÕ¤ðv›ÚW­øl¢¾á­F“µöOÚðĉP6ÚEòøKŸ¶i;â¸ì‹¡Ub@tà Ù<–Îz8HÃuçló<>«/v³¼ªŸ/ºíè÷ÒîbœÆmäŸ_÷:£UJSlêl)äÙƒzߘ¡ÔS÷\Îïç ýZu1¬Jñ’$L\d{ÁÀ‡U1Ce-µ¿ìj*+ß’ªGdÞ! »"1«A«·yDšUGi_¦"X7®ÞûØKc }˜ÇÂòI?ow¶EµW«S‘ÔñÁ{£˜04|ìóÐÞW%dXÝ¥@ù^’/Lá Ë/ÏŸˆ]Û8£WˆÓ…Èß”××üû†ýu¶I«÷ Ø6“oVÕ×gZ¬«F÷Ëí4E#ò÷7ÚS (q5¦h^ÕþgÀ´ñ÷²CÀ*±‹G :‚p½€ä ž’ŸÁ9»rµ3sõwÖ®n|eÖ¥'%_gì5c}˜Ç|ça_÷‹‘×[MúRn­Rx›h·$æ;•<ÀKµðq@8(íת‹!`•P ï%ù†ÉÙ_ÎŒ.ÍPåó¤*ú)÷ª:­[ÿÊnÞîâš&ÿw«WO¯i4dó%`Æg*^º¢N#Q$ƒšõÒ0-ùåG©y6*æ ÆÍ²30Øç! ½¯JȰºKò½$_˜Â@Æ_­ŽN”öUøyÇñN³›nÃb쇻t“™<´N'ú3—aδ;a~Ú¬¶ÎÕbˬ\íù€ ÆêV’~è!ÚO0m'@@ü½ìư Bì∎ \¤à]õ&³RKk8»hx‡g±lCœ´C-~º|LðvþæÅû0½ÒÝH_÷Šc§†é*.¼ˆíèFbÿš}X!½”Gç ýZu1¬Jñ’$L\¤¨<|—ú °Æ8#¢£Lï”GÚj÷jùK˜g©”ß FïYþab,ÝPçõ.}澓§¢y˜V˨H‹»d4EC4wãgöÆ6Øç!…íµ*!CÀê.Ê÷–¼.—Àõ’Uí~çåØWMJCz¢D©RPÕS!=^²ºÕä²_ox%¸6C­E}í¼3ã©o«ÍVGc Ðkô­b#mréµ~¡q¸ú_˜¶ ŽËCÀ*±‹G :‚pòH¶ôrCÛ®~ðѵª:x;Rlš¯#Ú°…(ª¶’ªQkå_°Ü®¶Zfé”P\^;utë?󈀶'¥š…Ây@hê;CÀ*¡/ù@ò “.²YŒÁıd;yÒUÛèÞ/¶?ïn_…<´¯s{-´×[c¦¼®wW´»Ÿ˜½ñQ’W±þ–íÈåIù­—…;6 ÓH‚Á>)í}UB†^¬.)Þòä B¸^@Fç4©­‘«cšÔt4fnýœFx½YÛâŒwz|Ú˜õjåó.m¥Ö*xé•â¥Ù§S“îi.jZU3E›]‹jTM¥°¤Qì5€i;â¸,0ôbub@tà m+÷0ì…Öî5¨:¶´±iȱ¥¬n VX¬+Óx·Õkèˆ7ŠMu]™iÇÙ\œ¥(ieŠ>u†R:«Ý–ú~jw«/Ÿ ç  «î «„R€| 9`²Ã@ÒÖTé ë ªt†õU:Ãzƒ*aý9¾å8^Wts_¯+º¹¯Î×ÝÜWçëŠnî«óuEgåêF·¢³ru£[ÑY¹ºÑ­è¬\ÝèVtV®~ Îê_lVº±ZÏF+ÝX­g£•n¬Ö³ÑJ7VëÙh¥³‹åÆÃBgˇ…Î.– ],7:»X~ÜÕ¿Øxt]Óïú캦ßõÙuM7¾ë³ëšn|×g×5=Ç@ËMœ…žc å&ÎBç@ËMœ…Ζ›8 -?AAýêÿÒ à1€M7ìs›n"Øç6ÝD°Ïlº‰`ŸØtN·x.²-èœnq“mAçt‹›l :§[<ÙôÓ-žŸÔ ßßtLc£›<¶ç˜ÆÖ­í?Ìc{Žilô\ä±ÓØè&íœÆ6r?Kº¼É¹ln™Ï“.or.éœtù\ä\ÒsLº¼É¹¤sÒ¥ͬB7ô›ìS{ËÕòùÓ±EO y«§q{¹ß ™·˜Yuõ /ézQä¦GðÝàÇ•™Û-RÖž^}¢¼¼¢ˆã c†|Ö¼ŽÈ¡~2€i;â¸,0¬‚»x¢¿AÙà E!ëIá¶Pî°ã1Iîgó¨Ô£é„93” y¡<®5¹L}œçdÝ«wQ®‡ª¯d[š³~™R6¡”y3C~&œ³î™òÇá< ´_«.†€UB)@¾·ä “.²©<¥è6fóØ„N®õþH½CDKwãŸÒί"ÖñI¶§ µ;lš[†ÏlT ûS¥&ù|-6 ÿ“:¿f6tÖÓ"'OnçÕ5É·Á>)í}UB†€Õ] ”$ß1!„ €”нÕF;sKì~°¦Ô<œ±r|z­çÞ´žäfF=ÿæË/Î; {ÝwIŸ·×-Å¥iÀÔÖDm2#ïšZ=#A¿éI&mjü6€i;â¸ì‹¡Ub@tà %83̰nÀd¯†€DBžþqjÎ{ˆMï4]á9ÌNE±}ÿ|òf֌˴:3„ÅYiÕS‘¤øCšª[ÔÚ›/Jˆ"MŸ»MU½ÌOµ³²ÜÔ£›WÂÁ>)í}UB†€Õ] ”ï%ù„.R6xÒãS^àöÎývOqýH6¥´|üÉåyVçñ™øË«|X±C6`æ7ëEÇœØ1­sçßÅoïYKVGoGïÒéůOûª–0V÷P´V[VȺ=ÕŽ¦·<A¥­éÐÎ @ûµêbX%”ä{I¾a²Ã@ö~=ÁÌظ~Zõ˜ÖéÞ—N›Ýl_=ÿzaÝCÒÓÓ¨Z’_á^þ÷~~è!tµ¤×hÑ·¹ýÍûæ,‘iêùú'×+Oíƒ5)í}UB†€Õ] ”ï%ù„.R¸‹u=xµýíq7{mUíS.„ñSôçirOê)¥x¦ùèU>ÙF<½ºQäãøÎóêìÕKse«¼ôœé5Z¼Ió}2€i;â¸,0¬‚»x¢#()ï4½* ̪õEÝ2â7[u!ë6ýÎú¸TQS·'¥ÕÆé ÕÏLrÖöL]?žñv`ÍLq3ô'ÆåÜR4üÖ]l ç  «î «„R€|oÉ&;\dÿ*zQÛËå:m7¦¶tz§Jxo¢ÖK{ãµ`—ÓX«XÎFÛNIXØhÅÉ{0=òÞÞÔH­HìÏâï¯{k÷„zìóÐÞW%dXÝ¥xË’/Lá %Æ8¬‡îJµ6êϵk×=žVÕ /uòü2t$gÆÕêkò^w¤oÂ;±?QîÒ윦B†Vßo¤ïT‰¼—™BÔÚVËÀá¦íˆã²ÀЛUbŠG :‚pRhÏjÑ Gó|®ÅS¡ê°TíY5âÌËad€‰O:¿Œ#»Ã­ÚvD@[bz,ÎÝCÒË2Nì¼O#áJúª»¢ùÜc5Ÿ ç  «î «„R€| 9`²Ã@6‡[*ꙕ0BPÇN•þyuæ8[´‚žôÒK ÈœF«¸žSaçM-(œ–¡’ì9ëÖŽd£g  gµØ_–wý¼ëõƒé×¶ÅÁ>)í}UB†€Õ]Š·|›ä;&„pA?ºs‹t-sO»j·”-c·ÖI¬„k›h©•‘4òÞú˜ÙŒ– eN…¨ZݤmO)ð9° ÂnµeN#™Ò‰Åïò'˜¶ ŽËCÀ*±‹G :‚pGTé ë ªt†õU:Ãzƒ*a½Aõçøž#àx_¯+º¹¯Î×ÝÜWçëŠnî«óuE7÷ÕY·¢³ru£[ÑY¹ºÑ­è¬\ÝèVtV®nt«Cà» ƒÕz6ZéÆj=­tcµžVº±ZÏF+ÝX­g ],7:»Xn<,tv±ÜxXèìb¹ñ°ü¸¿Çxô]?G×uö}×g×5Ýø®Ï®kºñ]?G×5Ýø®Ïq–Mù<Ðò\ÄYèh¹‰³Ð9Ðò\ÄYèhù ù?gù ~OPðÁ~ŽìQŠðÏ"Øç6ÝD°Ïlz."Øç6=ìç˜mAçt‹›l‹Ñèä³t‹ç"Û‚žcºÅM¶Ó-n²-~Rƒ¾'5è˜ÇöÓØšÓèOóØÎilt“ÇvNc£ç"íœÆFÏEÛ9ç²s÷iÒås‘sIç¤Ë›œK:']>9—„R¼äûãœËQаwiÞÓZú©Ý^¨æùä©RWÛœÆ{²QðÕÍ:dR±·æñËÊ1ìÜâ¶Ø+™™ùÅis x[o³fCËÍÑ ¢qlƒ5)í}UB†€Õ] ”ï%ù„.²JS¬:7kb%%w ¥@yŠ3é=ˆZ2N©¿»¹ÖƒOA÷§#µM‹ûVð)›ºÕ©`ƒqdÀ¦íˆã²À° Bì∎ \dnžðéGim¢ŒjP’®1ÍhÞì~Þõ^_ä·×ËlFG= Luqjòô|=ˆZljtY[Ý0ù>N# "I¸ÞA•Rh!~Î @VÝVé-È’o˜ìp½dÈÈheYjÕŸ¢ÕÉ3kïg¯Û“5ÄhÕY™eë;WÈÍa´=§”ìÉþàeCÑÊ>¡õóº Ù~éÞÓvK²^£yâ ‘Rƒ}RÚûª„ «»(H¾cBD¡ÞôWz‹åËp&\ñfpË -…ѦÂÉÇÎ*¿Tc¨y~qÉ®:]%vk{4¬4ýÃìØùñd½7ïª_/ºÆŠéçƒmÚN€€8.ûbhc„ØÅ#A¸È$­Ïë(+Ðl‘´¢)¥¤0ƒT­ÄŽʇ EQ{/æy»³"²jwØ”­£Å*÷efNDìÌåá#. „Ķ©+?mª¢8 œ€6¬º3¬Jòä€ÉIÍá=Ü7­Z\˜Y„â°é½»•½–6àÌt =ògÇ…GGë42GoÅîèm7û×’¤²a/hbT7Ž;ñ¹&ëû<¤ð¢½V¥ MVw)P>|Ç„.òU:Ãzƒ*a½A•ΰޠJgX¿@õçø–#àâ¾:_Wts_¯+º¹¯Î×ÝÜWç늾¸¯.t+:+W7º•«ÝŠÎÊÕnEgåê ÝêÇøý†À…Õz6ZéÆj=­tcµžVº±ZÏF+}aµ^xXèìb¹ñ°ÐÙÅrãa¡³‹åÆÃBgË–wàïïp^ø®Ï®kºñ]Ÿ]×tã»>»®éÆw}v]Ó¾ë‹8K¯Ôÿi å&ÎBç@ËMœ…Ζ›8 -Ï9Îòœ÷ì_¼ˆ`ŸØtÁ>°ûõ‡ìs›n"Øç6=çöE¶Ó-n²-ú‰òiºÅM¶Ó-n²-èœnñE¶ÅOjÐïïH ºÈc{Žilt“ÇvNcëå¥þ0í9¦±ÑMÛ[ò… =ç<¶‹œË–µðyÒåMÎ%“.Ÿ‹œK:']Þä\Ò9éò9ç\Ê«×sµ[~·T5oi‡»7a$·+xaœLîŸHÛÆ!†•žm‚~/ñWûçáÎ÷±õzTð%›²ÊÇ[-O…%ʹ¨˜´æ„ó€ІUw†€UB)@¾—ä&;\ds’'ßÏ\¹xÑÎPs5Öñ– Ù6¥vݸ9Òäõ³Yóøû‹­ÕÀ—€eÊ'%¶“îšb«fCgÉ1×F'·¢Ç|”æùò kRÚûªôfhcu—åÉwLá 3“ËeΖ„ž¼¼iT ­¯Ãxhû.8? Ê •§²Õ*תlªd’oÑk­¾=RxÚN„ø3ÝܼѦ²¾ `ÚN€€ø{Ù!`„ØÅ#A¸HyZÌ|0PÇs9ÛºX±JœRà[R[Žð•)Ýdú ÉS3N+yÕÑuÇ~¨å^¢cG‡³~.–ì‡9Óºt©ÓHÊêŠ ’ûÜÇá< ´_«.†€UB)@¾—ä&;\d÷—î|é]Öz5ý¶ÝS-q\JAŠî¯®.¡x?w$k5ó}…|ÆûXzQÄSÈѦMX[\ÒÙk<Ü¯Ý =ÜI½N^6 Ö<¤´÷UéÍÐÆê.Ê÷’|aBÄ‹ÕÕ®¾»o·?×ÐC»}çÖŽ…FÏhô\4y^~µÕjJW¡û»žPÍ´µ<_0ª¹;yĤJ=3$/qú€õ@FÁ}2€i;âïe7†€Ub@tà Û¡m¦‡¥$;Oi>Ðïþ*Ηtò±¿Z¤hÕc^¤ÜCšU6ÃoÜ/F7#m^Þ7©äbΔõ4“uL7KNHkÅøq@8(íת‹!`•P ï%ù†ÉÙíÙØ‰÷â$óÅV'ÏyPˆ¢æ–©½°"’ªnOcG÷‚Îím ûël3Š¥´xLòëIi VÛ.ˆäÕÎ,©Qú bô·y Ö<¤´÷U Vw)P¾—ä B¸H¹ÇÑ,ÛX\±OK¥ ³DK4Ϋyœ~ñõéÇmÊ<˜b¦Ý$ö´‡Œs~ZòÑŽ’¥©˜½ G?¬sZEz0Ä¡‡†ÿdÓvÄqY`X!vñDGP.R‚èÑÍkUŠþ‹5w ÿ0nÔõÛ"ú“f¨7=m?fá¯g:z™i;ÝIúÊ ì¤¶ÌèS[š?”hϤKföŒëÝQL7œ]Ì„ó€Â‹ö¶êΰJ(È÷’|Ãd‡ €ì¥j²j ¬ßÕñޱ™Jέ$Pfw1¹zU®U–~$N›,úpoDQÉÃ|Ý›c]5ÎJñeDIÚsÕ:C&1ºÞ쳙ǾDmdƒ}Þ›ÂF{_•!`u—â-J>1!„ €”ü[¦ÁäÑSÇ·³f40éå„}\ï# Xt†4 ¿ñ_òèÐÛ>?þøæƒ6µ’AJÓìDç’ÂåS]M]­uZW 0m'@@—†^¬¢S<Ñ€ëd.Vß¼3Þ¥—α­gt2½³LÓù߬&Ïü‡=n>é`W“ÃÔîÝ‘u\Ç©ßd¦Ž­V¥¦QéM3rFzzDXØÙZ4cÎ @VÝVé-Å&H˜ìpí«(9O”©ý…x¯gáJ]ÓèÕ2‘ëØ&§¿lŠ)i‚°ôPunDFÄÑÛÝì½RÌÁ(ü¿V‚0O*#9ŵ2‡~`'eCûô8Øç! ½¯JȰºKòä;&„pu5ÈnµÐøG/ºÁ¥ŠÆÔ $íe %Ž8§XåR%mZ=l­—8·C Z­ÅFu?I5ƒqm‡nŒ sí(£ÿlÏø9¯LÛ Çe_ m¬‚»x¢#(× H—ŠŸnZ¾ýfjo‡]/ƒº-’Ä"ÓæQŽ+ Ï—vIge/÷Яi&]æþôÝ©Ù7¡íñІ“]7![J«,èÎ @VÝV ¥ù@rÀd‡ €¤3¬7¨ÒÖTé ë ªt†õU:Ãús|Ëp¼®èæ¾:_Wts_¯+º¹¯Î×ÝÜWçëŠÎÊÕnEgåêF·¢³ru£[ÑY¹ºÑ­è¬\ýÊê_jVº±ZÏF+ÝX­g£•n¬Ö³ÑJ7VëÙh¥³‹åÆÃBgˇ…Î.– ],7:»X~Üæ÷7¸®kºñ]Ÿ]×tã»>»®éÆw}v]ÓïúìºüÏ-7q:Zž‹8K;Ü?´<q:Zž‹8 =Ç@ËOP°³ú—lº‰`?ÇvˬüÓös `ÓsÁ>°é&‚}`Ó9Ýâ&Û‚Îé7ÙtN·¸É¶ ç˜nq“mAçt‹ŸÔ ý´ÿÒÔ cÝä±=Ç4¶–oü§ylÏ1pÞ?—ÇvNc£ç"í9¦±uïӤ˛œËö‘}žtù\ä\6a?Oº|.r.éœtù\ä\ÒsLº”P{Õv×ʬ³µçû_˜\ Û¥ëCWÕÚ6®f¼Il—\èìhšÐOm1äXo/eîéÔ-ù®›Q¹'j†¬ê‹¸ìj™/X‹×´rÀ´ñ÷²ÀÐÆ*±‹G :‚p¢ˆôD¶¿‹ ý aÑI3¯5¥jçy`cÕ‡F"¬]¯:ø4/#}¹½‰š&ž(6Y¿?æÎÏLòÂæŒOëESÊÛcfÏ~Î @ûµêbX%”ä{I¾a²Ã@¶×¾· j€GçkÑdmöóÁ€ç•¬îÈZ‡“ç…ímÕ!`•P $Lv¸È‰ªã«hÛØÕ¥²Ú:´¸ö¡ÛÑÛ­»i‹ÖÙ—×6.ª!ÐÂÕySg;Ô—þ”g˜ÑÍs9¼¾=3Ïmé üŒª½°Ÿ]ã / öyHhï«2¬îR |oÉ'&„píÔî.­V³@êÄèOÁZs™6 [‚êZO.­÷?b²L-'ú¡ÛöËVõ±‰×7›¨0ð]:ëe¾¶Í²×móše‹õŸ¶i;â¸,0¬‚»x¢#(×Èo/6óžáæÒ òÁUœ~,]™ß‹c½d:'Äk14÷,ú|ž&JaÈsßÉ}—ä)·““·j~ºNrŒ«qÎÎ @VÝV ¥ù@rÀd‡ €l?…›–—ܦãä‘Ó8øñÒ³•1Òæ¾=!›ê"ëÝñ>¨\·wg¦Úé'’Ž3Ó^71iWÖJmÕà#Íip†r£”RÁÁ>)í}UB†€Õ] ”ï%ù„.R–íÜµÆ â{ºŠ/Ý®Æa¼Òk $6xÕeo¤UH'‹"8ï ?<ÊÝxOyJÄŸ›WÿPv}õÅ—åÈζ‡?Þ˜¶ ŽËCÀ*±‹G :‚p|žûñŒ¸=µËºR!%c¦‘/a²iÎHˆcêçl#nRù ›ñŠbzá¢îƒŠ>®ð•÷N+*”Ö*Å*\µÌžmr¨U͈Ø„ó€ІUw†€UB)^òä€É‚ €ìɆýÍä“b¬ë¹aï±!gG­Ö©ˆµîé,©Þmé-l9ë]!=T£ÔãPöz4ÅŽ¶©©=0Ý!Õ¥®Ìž‚®¹F² öyHhï«2¬îR|o—|aB)‹†¯X¥KVý EJs¹º~—ᙵ½×ÑP*ú^«=bÅ]æWuŸ’/È2¢$­ÉN±mãñX¿wÔ²-—§ÆÕñÛ´q\V_B,ñDGP.2É'’§DreÔ<ŸSÛýrÕ­B¥Dô¤w¥‡"Íh0¸:9W×ËöìüéhïºÐ4ɹïXÁwQ²v@lUÄLÑÜ·}@8ïEa£ «î «„R€| 9`²Ã@ö4ƒªÔ¥1WÒ‡òŒ~ìaøþÕתº«v;K½­VÕEÛn޹?mI«Y _~fªðgÕ7J2uÓ¦]su]¥¾îz÷æ5Øç! ½¯Jo†6Vw)P>|Ç„.²yµ·xŒÚ{ýµïvÞô6ÏŠ·ú>3‹ä–©ä«ÕÈ»”Ïriæ2ó-»Ê3ò7ff^Σ—w+Xx¡‰C(.¬”ÉÁ÷{ÓvÄqY`X!vñDGP.òˆ*a½A•ΰޠJgXoP¥3¬7¨þßsï«óuE7÷Õùº¢›ûê|]ÑÍ}u¾®èæ¾:ëVtV®nt+:+W7º•«ÝŠÎÊÕnõc|!p´ZÏF+ÝX­g£•n¬Ö³ÑJ7VëÙh¥«õìa¡³‹åÆÃBgˇ…Î.– ],7–wà÷¸¾ë³ëšn|×g×uO›ÿCßõÙuM7¾ë³ëšn|×Ï1ÎBç@ËMœ¥c÷i å&ÎBÏ1Ðrg¡çh¹‰³ü¿+(xˆ`ŸØtÁ~Žì¦}þiû9°é&‚}`ÓMûœmÑ Ÿ¦[Üd[Ð9Ýâ&Û‚ÎéÏE¶Ó-ž‹l‹ŸÔ ïI :æ±ÓØè&í9¦±ÑMÛsLc£›<¶sÝä±=ÇœK:']Þä\¶(ÞçI—ÏEÎ%=Ǥ˛œKzŽI—79—ݵЫåºvjûж±koãé{¿©ñqt&éeº‡-"¿˜ #‹»W3¨½uRSz¥¤|VÀÓx„ߎ}ï«~dEžðjŽÆÏëq®Ì+kRÚûªôfhcu—å{I¾0!„ €´íÅ–ÕÍÊÊ]¿ãšS,ôŠðœ_Žù=òo“ÔyYÉãb”~=Q‹9ó•™³Ÿ'=~ºkäýž)ê©`…³¦e`3Cv™Þ9ÔÏÛ´q\VAˆ]<Ñ€ €Ìò&RÊULÕk¶wÓÈëÐ+{ÉX=écîOûz›½hÇCœæÝ·ÝÚÎ;É#Ÿy©ZÑõ—7ãªÇá< ´_«.†€UB)^òä€É‚ €ìÝ„zs"+ª¶<~óø»bmcÍU~¿lm£]˜B±ó;OÚ *ŒwŒvî;Çÿ¾Ì+ªöâý$¬Ý%Ò®mç“^=’Ÿ_BWÏ[l»ø4ÔJìóÐÞW%dXÝ¥@ù^’/Lá [²®Ò•f8.O-ødŒ5zÖäù‰´¤/cë|§i³ ëjeu.+¬®{ˆ¥ö¬lÓvÄßËC« Ä.è À@2 l¯mìúãåaØÒ5Äö¡[Ÿæ™Ä³7úÕ>vfÈ‹ïR3Õ$yr›¦°eÔ–é†@ ZYݵâSs·z=´·†¹W¯á< ´_«.†€UB)@>0Ùá {³Ý° µgë¼×Ÿ‚­µ8õR9„fìõ_7ƒa¬Ag“y´\Z¬zä)d>) ÕÏçùIÞ›+vìõå{”ŸïPa°ÏC @{_•!`u—å{I¾0!„ë dîµsÚWo]ñãhf%Ä8}9Ú©}JWB«g’”Ö÷uíOyPÖùNR6ÁL«ÇäÞiªí»ÀçÓò0s!(vÅuÅ´™ÿÌt Ÿ `ÚN€€8. « Ä.è À@ÊÇ“BÑm¬e8l+óÃR¨J—äѦ^,V¨Ùt›F”Iq…dmµi¸€+o0ãÒOª¨‰Îç>«ñ3rÀò¤áÕ&ªWTžöyc?ç  «î «„R€| 9`²Ã@ö|cS†Ò+]fs.×Â?E¨ãR£ùK«ìcŒ™6 ŸVÝ3ÔR¿ùZw+ÊÚî,‰Gc¹D˜OmM#|×å·CI# røåÈÞû<¤ð¢½V%dXÝ¥@ù@òB¸È Bûm*^‚\G’ÞÏÏ® ­Áô†[I덱VŸãf¾BœŽà{£^ÉŒõ’éQ.Z,¥t§‘×nBVð}Ьm6%ã'˜¶ ŽËCÀ*±‹G :‚pR#bT éñK5¶Í¦D¶iF¼´‚5ã®÷ί¾xlüåyµz;žÌ¶rÂ5Îw=R*Á‡¤ØI¹¹  ØPV­©hüj_É7Ot„ó^6Ú°êΰJ¤ØåÛ$Lv¸ÈîZ±^¥eŒªƒó½=gÿ]Xî2Ö=’¯V÷ª´èZ/£ãÐ7ú–¾œ¤dštaë/i[5òf:jÓE)e{¹wx•Žif¤lƒ}Þ›ÂF{_•Þ «K ”$ß1!„ €d»Â ¡å„¤@Z©i´¶¾ToÑ8o›Êúe󰈛9ÍúpYŠùhíélZÓ’wɶï¤}eèpy‰¯kéªØXŸ `ÚN€€8. « Ä.èoP6¸Hþͽ-óÈÁ§å!‹5¯~KÞWí'Uuz´¨¥,úÐ].+¤Ç6OXü¬~³õW‹]èVÝs Ä׃é·H¯ÍÆ:ÏHôÛ„ó€ІUw†€UB)@>0Ùá û“ƒA®9Åbðiž¥9jrQvRZ "IQ·Õ%4³{š69Œàh+§WæÕë>µú/Áê×ùØ+ådzêvRX¢‡Žz•»5Øç½)l´÷U Vw)P>|Ç„.òU:Ãzƒ*a½A•ΰޠJgX¿@õçø–#àâ¾:_Wts_¯+º¹¯Î×ÝÜWç늾¸¯.t+:+W7º•«ÝŠÎÊÕnEgåê ÝêÇøCàÂj=­tcµžVº±ZÏF+ÝX­g£•¾°Z/<,tv±ÜxXèìb¹ñ°ÐÙÅrãa¡³‹å Ë;ð÷w¸/|×g×uõ‡¾ëç躦ßõÙuM7¾ë³ëš¾ð]_ÄYèh¹‰³Ð9Ðò\ÄYèh¹‰³Ð9Ðòœã,?AÁßß¼ˆ`ŸØýÍûF°Ïìv@ýiûÀ¦›ö9€M_D°/²-èœnq“mAçt‹›l zŽéÏE¶Ó-¾È¶øI úý©Aylç46ºÉc;§±õǘÇvNc£›<¶s}‘Çv‘sIç¤Ëç"ç’ÎI—ÏEÎ%“.or.éœtùEÎ¥xr3Ã\{eYºæàzc'6¢£ncqÞÌm̤;Ce8Æ“ƒü«V—Æ/+ºúøKOrµ&T•¢ÔQ©VÐçcfÚ˜<°šŸŸ³aÕD^Ây@hê;CÀ*¡ ßKò “.²Õ©txõLòä&úl¥¸IÎäѽ i¶%çu¼X[4m>µ:ÈSéÍ6•!yiïPƒJÎûI¿Å í–ÊØ\YRÖsžØ—³ÕovìóÐÞW%dXÝ¥@ù^’/Lá YÝ(©Y&®={p=Û»¡jkolÐ3àm÷\ö_–íŠôGOa4-io‹X_™¾œlCqúù¥Üýôý;ÏiÞdòt1­þ¬-jíä$Ö‹ümÓvÄßËn « Ä.è À@²Öeú›/ןètðmo¶[ç‡À¿ltiÐŽ¿Dï[ÊlJkSµÿSaÎÍ,-yd×»¨tgeªË³F£Ýál¯»i ™ô/û€pPÚ°êΰJ(È÷’|Ãd‡ €lC¿3ûQáM2Ò{›ÄlôC‹e~ÚÖûõð0(íæÒÊ6Ç«o¦÷*©1Ú¢Ù^ ¿÷—kì¬zߪt ˵`Ù8o§¶Á>)í}UB†€Õ] ”ï%ù„.’y`Û­vÀeâü²=3[ÊYï¡àVÜÔŠÀÏÚåÒb[ÞÎ*¢½”õË©ÊÓº<%3Ÿ É—éµD½0ýPãEOrúF0m'@@—†€Ub@tà åÐ.n( ¢ ÷®oý§ˆ%†8pïóTKøZï­ŒµÚ®½æó+™F3×{…õÀMâPò ÒûLŸ§Iƒ¤¨Æ{‘.A9|Î @VÝV ¥xÉ’& .²}dR>@7e¼=nJoÍujqV;éW‘]YOKuö[`«äb£î±¶×£ÛbV{¶Õ1À»­£õ2Ó«½„s«$ Ö<¤´÷U Vw)P¾—ä B¸HùzªyŸXÒ|¾å4ÆØÊü¸0¿ ÏKŠó«g}'OëH^ŸÏÊܼ»\ÑbSKžOÂ9—ô“.ÅÁ±pçZyT×i7ˆYƒnîZ•Ql[häjDZÄÐa[­Œ¢GØ\â<7rŒ!Ì3ÉÄ4½¹¬¸O™´§*v:v*3V÷>o:?À´ñ÷²CÀ*±‹G :‚p¡ÕÞµý/¹•*¶s‹K,*¬¬•t#±YÛ!Ū<ž‹i>ä`½»æ¹Üpµ#ß"z wýÕ_Û]òÌo|¦ÂPÐFl>ú¡wã€pPÚ¯UCÀ*¡ ßKò “.²÷*ïÝÚŸ"[ ¦ÿ£$} ìHzO’ÒÝ}9ªLKWvM܉Z2nêÖi*E-íÄ%¢BE±©a:É#kçNÅ(e*ÆñÙ´!}ƒ}RÚûªôfhcu—åÉwLá ÅŒÎuþE\bÆŒ7¦Œ§o½JÁð'öÞ½&è1$îøR§‘ÉKˆÓÿêjL+cÇãÎÞ¸ÊÆé‰1¼æÔ­¤9‡&¦Kñ‡¨7u6ÕH¼t6ÌW¤…-Ëa>&ÞOó‘Ï> œ€ökÕŰJ(È÷–|a²Ã@v»¢¿œéw} zI/®â­þH¬š¥±=¥­–µYÙÙ1¦_ÛükN-ÕŒ†~]$ñ;)v>[}×Ãf¬~zÂCˆ³ŽtUêoÿ›ºƒ5)í}Uz3´±ºKò½$_˜Â@Ê©íÒ<¶Á÷i…$Û 49Áù>HjH´(…qmGžgVû‚"ƤòmÕ±Ó|lΧùi7êôއ5–iYúÒŸS··j®VuÔæíˆ¿—ÝVAˆ]<Ñ€ €”ºCAm­ör±»rJ×Q’*]нÙܸMs¾œ*eÂŒrÙ4+¾´² N¼f)VœÊWä‹QÉ‹Tâ龊×A‘–©|Î @VÝV ¥ù^’& .²]Œ5§ù2(òI=5`¶8TOr¢–h‡î]œ1œ`ó,"ž¥vŽ3z+±’¦ÅoªY ÐÕeï&n¾²”J±JÒ J{E¹¶“Óä ¾nµ Û©ÃPñÍVå¾ÄWl;å¬É0Øç½)l´÷U Vw)P>|Ç„.²ýbì;wT)ègéèíÖ|Put êï]òóŠÙÛ©;f>Áçå, W ùû­Q7+%Þì¤âGoOÕª|ï4ý|tÑ­š1˜¶ ŽË¾VQˆ)è Àõ²ÔÑÆµ§ÎX£ïgc{P?N”$Œáâî4ê¹LbÛÄ©}æÔ/w…+ùÆXïFü™)xÛ>²ÞM1öª3 !Ë'ÔðÝÌF¾ÿ8 œ÷¢°Ñ†Uw†€UB)^òm’&;\dïb•´,‹äT-ÝÀÖƒ¶,íÙÂÃâè_EZ·;ŸHI³äïåûv0V¿–榰q˜™†X´¢ÿ%–YÿNàJZg û¼í}Uz3´±ºKñ–o“|Ç„.R ŒÒc=-§¬P«ÔÝXY0.Î…-é¦U^ùWŸj¼µA+Èð±Ÿ{YºvÄñ¥­­YØë1­C„¸;óÜw%ô¼ÈV¹ÑöÝõÀ´q\VAˆ]<Ñ€ €<¢JgXoP¥3¬7¨ÒÖTé ë ª?GÀ÷Çûê|]ÑÍ}u¾®èæ¾:_Wts_¯+º¹¯Îº•«ÝŠÎÊÕnEgåêF·¢³ru£[ýßc­Ö³ÑJ7VëÙh¥«õl´ÒÕz6ZéÆj={Xèìb¹ñ°ÐÙÅrãa¡³‹åÆÃBgˇåÇø=îÀ£ïúí¦]\z.|×g×5Ýø®Ï®kz.|×g×5=¾ësœ…Ζ›8 -7q:Zö?g¡s å&Îòüž à1‚ýؽ`ÝF°Ïì^á#Øç6=ìs›ž‹ös̶ sºÅs‘m1„ý,Ýâ&Û‚žcºÅM¶=Çt‹›l‹ŸÔ ïI :æ±ÓØè&íœÆÖ~Ù?Íc;§±Ñs‘ÇvNc#ýŸÌc;ç\vî>Mº|.r.éœty“sIç¤K¤ýÏå\Ò9éò-ù?“sÙ«àöG ®µèq½¬«ë…aûƒö¢éUòÛï’}¿ m/FzÅí®TdÛ{Î4ÀùàIY!_l˜ß•¸†‚¢Ïþj!Mf–—'ñú'¬yHhï«2¬îR | ùŽ !\¤TØ5íwi©¬ú¤8cMûÈ!ºvÖ¸Ö¿¢xßܹ]!«z•—å³uÉM[¹ºñ¨±?“NY+AˆŽ9RÄ›7(V;Íqo|6€i;âïe¡Ub@tà ÅøËÕê_Jènq×=d©*9'e BR ƒôÞQ Sµâ[ƒèõ=Rs4mÝ5ä Óöð0é›p©áoœñ5=dÞ—>ç ýZu1¬Jò½$ß0Ùá [@5ÖæktòM\áEçI¯«' ÅσGê(¬\×õr†?;õ;f(e=âx78?¿Ö è÷ðaÔ¨½Ž„Ÿ4«Í'V¼Ç³Èˆƒ}RÚûª„ «»(ßKò… !\dkßTà^Þ4k»'¹Æ¦=ëíè\V›RÁvÜô.2s5()F7_·Ôèõ›3¥%¬î´~1v‡i‘_ŒY”„›>À´q\VAˆ]<Ñ€ €däÍæ¶‹f¸‰ó Ä:\’í÷ããe¨%UÌcuqóÝs1 ¤)=T×÷]½û»¬êÝðùæYp C&ˆ³ÔøXöÂÎ @VÝV ¥ù^’& .²¿Œîz`¯Ò<^võŸÂ8_õgZe•n0£2L'¯†óh%§ºXRZ6Óz˜'­(¶QJù(&ÌÓäjéâÂt…Ã`ÍC @{_•Þ m¬îR |/É&„p½€Œ¾¨fË^®q /žËa­‰¶_Lš®©T2ž8¶Àr¶k²Š¢Ê:[3v<)m†N´j>² d\ÑçibõÀ]³ëåÀ/1ÔÕƒsÀ´q\öÅÐÆ*±‹G :‚püñÔînvjtŬӘµ1;N”*ñ4=K‹ˆ¤¨ŠªÝ5Œq@Õåâ#©®jÁ˜Õ¬Cnêé !¨£>´¸òðAñP¬òØ„ó€Ð~­ºV ¥ù@rÀd‡ €lo¢b7‚›ÁÀ6Ææ¸bÚóDq¹—ëÂÆ/+µ|\ÔŠ¿?»=ƒâ¡õ ’Ϋ³Eu.f•\ö`™_³ñqg,ëžÓ»¿ öyHhï«2¬îR |oÉ'&„pIÚÂæá%°-¢>M7i‡2Õ¼Õ 7þ“}}ڲƹ™×aJòU¿«”몷“}]¯ÊùóÝÜlü­BHl"–áy[2'óɦíˆã²À° Bìâˆþeƒëdæq;+"+ɵH B§ÀúºiÛYj†/§9¤¼Y§Õl˜Ö›fŽ.‰¾—ÖÎéî*eœjÍ'ÍJÓÌ' ã6ma©š8 œ÷¢°Ñ†Uw†€UB)@¾—ä&;\d«¨™\±¬äº¾js¸ÍßÅäªiâ½ÉežBò½,ͽH•-ýêmÌqYùª^‰vt™må|ï`Û"Óá_YZ¬,¦ñ'ìóÞ6Úûª„ «»(ßKò… !\dfe¶,·ŒduLµzýGrRÈl¸'›+5‹±=²“çËóÄd9év`!òܑՎò…½NÅ8v‰%*¡«M]G?ñƒmÚN€€8.ûfh± Bì∎ \/ VÂj¾%¬zȤWè?fÛûÚœ¨Õ³Ð²%ýø[ó%õ˵íÌèêšºèƒÆŸ=su߉‘›3¯eªãµû¯•3ÕÎû@!® ¾­º3¬Jñ’$ß0Ùá ©kÊjêJ CT‹8ȧõ0åSòuZÑ•9÷'_vt1½iÂ(C%7zk/§· kÚºk¤b]=*«-~bÇBXÅ.óGV4 û¼í}UB†€Õ] ”ï%ù„.òU:Ãzƒ*a½A•ΰޠJgX¿Dõçø†#àâ¾:_Wts_¯+º¹¯Î×ÝÜWç늾¸¯.t+:+W7º•«ÝŠÎÊÕnEgåê ÝêÇøý†À…Õz6ZéÆj=­tcµžVº±ZÏF+}aµ^xXèìb¹ñ°ÐÙÅrãa¡³‹åÆÃBgË–wàïïp^ø®Ï®kºñ]Ÿ]×tã»>»®éÆw}v]Ó¾ë‹8 -¼øçâ,t´<q:Znâ,t´|gù þþž àG°Ïìžúý‡ìçÀ¦›ö9€M7ìs›¾Œ`ÿq¶Åè›òYºÅM¶Ó-n²-è9¦[<ÙôÓ-¾Ì¶øI ú†Ô ‹<¶s[ÿeÿ0í9¦±ÑMÛ9nòØÎilôEÛEÎ%“.Ÿ‹œË®jšty“sIÏ1éò&ç’ÎI—_ä\&fÕ÷gÝxˆ}O÷WGv¨íjÍÖÌs#²’3`&ÐöFÏû´½Br/–kû#&9Ü3ÿ˜ÁWE¿²®7+Â-VÝ´k-(Ý;±xîã€pPÚ°êΰJ(ÅK>0Yp-K+ôÔo'nIÂ÷}^+óÜ>²F.øž’ßo2ß=CÝÒeæ´!0É+ã|òäh§)áLo;ÕOc’ÑØ›ê×¥ëëlt"æÇ³€‚ƒ}RÚûª„ «»(ßKò… !\¤<×è•ÇÛ_ø,îwœxÈ\ê|7ýÀ„èôDÉÒÔ#N¥×åªÞE9܇¯£9B‹S…–—<3‘‘5»â¬h—ébu1 u1übCÉ6€i;âïe7†€Ub@tà Û)›­|¶Ì›LÎæ^uÜW¾û㾊ú>ƵoqžVbõ8ÝOÅu®ŸòÚt+wJT£÷•zßÚ=§š+—ý8 œ^´aÕŰJ(È’&;\d+HœK{ Û û[‚ö2:mZø_¬7ŬÖèÃÃÊ:a°ªÌò‡àrκœ=PZÛ i4µ k§2TCUO¸ð3žE¦ÖŪΪ0Øç! ½¯JȰºKò½$_˜Âõ’57Nã¶×û Ö<ʼ‡xRÿKO‚°.L‹¸VSæGkÔ—ß|šQ”£EjlÖx…4üq³vû2í´g¥sÝ´Ž¯“?À´q\VAˆ]<Ñ€ €”C»?°i¯øxê^‚^ÜT‚Œú+Ùš—îoüöö¸j “ÒÂiFŸ†É/›ª~³±µÛ™O½ú€[Þ ëyaòe¾è––‰îã€pPÚ¯UCÀ*¡ ß[ò…ÉÙBå|¼$=Bè]OšjÄ‹ÚùŒ˜¯€Uº¡”¼Ås5ÜŸ]Q‹ó;鑿†HU*y„¹…X÷\}X·V/H‘—èE b´lOº·Á>)í}UB†€Õ] ”$ß1!„ë¤Õ½™^›7T+…ãwk»Ï:yV§™Â¬ê‰)Ttƒ;¾¶µ†IÛžRï£ ëÛó|õ³Zi‹ú>íêMÓý¯¹†OÛ´q\VAˆ]<Ñ€ €ì]žŒ¢ÊRóMô'VÙYm4$íLJž.Wf-.Ùo„eèÔÑ7EŽÏbÖJ®r¦õ–ÒåXç7ËVæ*×!öþ %ó¿Xå{Ö€pPxцUCÀ*¡ ßKò “.²¿î5vœIì-ÉÆ¹¤¿K’š1~¨Ð|šnöv?J(3T.ÂŽ*(­½cMú\œ Nk±Heéa!´5Ÿì»Pzu°žf`ôÙ®ÇÁ>)¼h¯U Vw)P¾—ä B¸H>fk¯ÑÔ\)p4½†üã­‡žÞ2Mû´)åérRN¿új† ewmŠ¥ôÜ,6BWµû¾ã=¨5'šHaºúá¹×¦íˆã²À° Bì∎ \d«ÿR²âÍ·ß<%k!U£{ßEŸ§Û‚ÿÅjã[·»>Üow_Ôš¸$o}íêšâð'µ˜‰ê2®/Ô½ ÍsFÅÎ{QØhê;CÀ*¡ ßKò “.²m”j´c“”;êžËñÕ;õaHÆÇð˜·êg9hÐŒ•8Ù'ã€'ùlÌ%ï…E{_•!`u—å{I¾0!„ €”J1Œ›,ÿ2±w7îèŸmßúnð=¬ílo©A.º©j—âµÖ‚ø–Œ䢴ŠÓB3,‘™ýX^{Û·Zœ‰gl6­^¤Û¦íˆã²À° Bì∎ \¤/® ˆ%pÐÓ »Bæ5¯£GÃFh³·—êf—*ã/òÕ—V×cÊì#PÄ Òr+íÜ÷3ýʱõž;V#ÃL’,ÉijÐ> œ÷¦°hê;CÀ*¡/ùPò…ÉIgXoP¥3¬7¨ÒÖTé ë ªt†õçø–#àx]ÑÍ}u¾®èæ¾:_Wts_¯+º¹¯Îו«ÝŠÎÊÕnEgåêF·¢³ru£[ÑY¹ú1ôûK £ÑJ7VëÙh¥«õl´ÒÕz6ZéÆj=­tv±ÜxXèìb¹ñ°ÐÙÅrãa¡³‹åÆÃBgË;P¿ú¿Ôxt]Óïú캦ßõÙuM7¾ë³ëšn|×g×5-ÏEœ…Ζ›8 -7qzŽ–›8 -ÏOPð÷7ìþËþaûÀ¦›ö9€M7ìs›n"ØÏ1€=²?K·¸É¶Eˆ>K·x.²-èœnñ\d[Ð9Ýâ&Û‚Îé?©Aú‘ý¥©AÇ4¶¶ïþ4íœÆF7ylç46ºÉc{Žilt“ÇvNc£sÒås‘sIç¤Ë›œK:']Þä\ÒsLº)Þòr. ႤËÿð÷¿ýãoÿú_þõ?þÿéoÿðkãÿßÿÛ÷Ÿá¿þûÿðÿÓßßÿÝýÜßþñ¿þÿËÿý¿ÿþÇÿöûÿúþÏÿ÷ÿ£í¯ÿøŸÿþŸÿþoÿõï$&F óË´ÿûýïŒyþE Ò†–ÖoZõ2¾œ—?½æ‰5ÙÎÂ6bƒÆÇhóljü©GVaÎ+1øTÛ<¹èJmg‡iþq(È =¨ý­¦ifí¸˜þ@;Ä9MÚBø6hír¥CN''%w}; L{s^}Þ¶²±í‡2bó•ܯCÓMÖܞÚ0ê:¶sÉô&Yi «c^ë¦^ûkÈ6`Û¹7ôjQçÚ˜™öHJ´G×É1^±·=h´‘`•‡ ;dÐ> ¾=¼ÂÀÖ{»ŸMË÷®w_1ÍÃCmàû;^Óº¤þ:¨S°]çìØñZ¹ÌuÛˆÒiL¯"ÜD›6é ¤d³¢jr¯/Ü5ô·!¦?¨ÍKɉû,Ìyµg‰w CÝî@Ž£ß4ñp›^œ9ð W4½@²4ÿü<Ĥ˜ðÏœ»'¤ ëSoTaz/ôÜqÓ”›äÂd†«?2­)C,ííKßw¶ßϦٓ|±¥)lþ€&¬ ýVÛ„üýÔ¹ø/Åè&ÌÒîfîšÐßÊËOQ¤¬FâیٮJÛ³Bkõɳ⪴Åßw®L ãgnûŽm¹.Ÿk{º+Õ]¤hûWÑÜøRú»Ä07Þοø^å¼c'ïÃbÿSm"å¹Õ¬-a}À=Ë¿ÁÅÚ{©úË2ÚI7ŠÜãý ì[•­¤›•ÙÖmÌ?sIc³Ê©¤?f;\m,´o¶†ì}Ñ8œÒάŸ¹ùS°Ñ7à RAÂΟÙñ™î‡°­â|ÓÄ<,²íTrÃ:õø _+¹7âhرUãÿßÖµd˱ƒ°ù[EVãÿgž­dÿ[ˆd@TrÞ,•Ûí¶1] šb P-š?µ‡v0_dþ~–j'eÜ]mÀ³ÞXù^™ÅÒÜàÿþ¥ý³ƒª¶x€6œûÂC«*©vkXìE+ŽoˆRª½Íj†ü\!ÈM ’)•nêù¨|ë)†…¯LÉnîWkļEâlÛQ-^:a‹€»ÚCÞ|‘&Àèg)Ó\¾¿(u¨Þ²î…Èw…‚Ã’†½¦c‚Ò/Ÿüø•îÕjìcÕ鯸ãµ»Rc6ì±cù‡€fïȘX«…Ko}¥YÛµ/¢›Çn7Ü${DÞkTclúÕ„ û Å—(™ÕA>#‡‰ð4ÃzùÎzÖæéqLêÞ[kšPó°úÍ;1ô«qFd63O¨;Q©»?&c¹p¨íû²žð‹ÏŽUJÉáÎ #;<þ+;‹@ãJ øSâ\[z‡/ÅfÖ÷îR×}äðßu‡L†2˜ù!š8‰wÞé Xã/z§Þµ. ±§‘ôé:•¡³ÌNØ,ÓÅ%¬ÓFò¨Z’c>âc­´.Õ?0Ù›F¶N˜QfP7&¯f&íb'*6ï{W‹yf-m±«Õ1c½Z_[ÒXw ÕúŽömë÷ÆU?ÿ-þ¢Å†ïsF;b¸ÓGú†i×)§ 'ÒÅQàRZ(Ê"j×âbé©;øE<°»W=;NÌV~c±ÌŸ£ÙÍá=C&A¨}îÒʱ¼#m€w8WÃes8š’tz°=†tú%j|åS•ìÀ³êÐpìqÈÐÁ†¯û÷‡÷Ž3$d˜h‚C(gGy¥K¦FèÝNAŸ™î}†ÿåÒêÓ‘Ò XĤIïõ qÖzŠ@Ö`Wo›öO©d›·i±ì ÃÑ‚KÑpó¼÷ãÿÅÅG §ëþÓ;ßt·Órn”sÅ#}K¶ ”µ³iS[!®k–-Â}¶t=t‚I¾Š}‡e"¬Hʶإ«í©‡Ù*¥åàþ×’F±¤°I¨öFzé(S¡µÇ Dae¥Ô»ûŒû ·ÙCøˆ¸AW— òÔB°€N%ÜÁÞ ëIR_JPÖ×ùv+“™]˜ÄâoR®6gÄ,c±¯™óÙGƯò6sÇúà<ÅÐ,ÑãFVK€M{•¶¤ŸûZ›_níþ±«–þ…]U‚®†Eý6ÃB)ÔZM6š¡A'³Ä»ŽÈïï H‡µ û÷ ­xð}­wâ(І®t%¢ y2*е”2¯e^9¼ÎwSdóÉðû„•¶`Dc—í]l …VØÙ9ïÖìÍžW¨®6‡sz^Xâa UÃŽ÷ä(ŒÉ\Bì!ü!n¼ÓcÞw·dŸu §%”*BªP‚È8©(§.Iž' 4^š7œHR°Ÿ–ÖÌšzñ«¼V34;DxÝuèp+ö ‹«¬X³—¥«Ö°ÿ¢f5“ݺjrÄI§ŠÁF îN§Ô?ßaý¬šŠÒ{­aŒˆ>šœózW.ü?zbªøç–ìN FníNòˆí§hæo9¢µ¯9Rv§¸«¿Ø>kk^Þ\¦Ð ׺Mì“ )®Ýª;ƒ„†\Ï:ò›ÖS“çZÓ4ƒæîeClgÁ)ÒȺþbÃV÷Ÿ}"Í03øAŒÂ"< ;[ÁÈ)»!«`Òûã©1ƒ¥ 5­‡óº·vv÷Ú.^ ¼n¨1}á½´û ö°E†žn ߤÇQzFŸ0…ÍÕ^‰0Š á?†,S ‹»‰Æ~=Ã^ž”¤ë‘¦ìÐ],©(„ÀO=0LUx¼¼Û¸ wv;;œuCÐ q/IU³Æ’vÆ,©•“x#ÅU[šRó¨‡âb^®&¼´üØ‘9±§$»Þ+ãbŸ´‘XÚ?Y¬ºÚTÌ‚ÈÈ“§ÞÖÊÓo tV=Â\–ËÐtÚ‘¨çvà4{6·i™Ãük¤ežŸÍìâYu·œPŸZÄÈÖN @$U¿'@•-:…Àrg s‰”òa²¹H(Ýïz½%EßD³8<=L?6ÙÕmeQÊ«lUfí¼çDp;X¨§ÝPÏâU{,/Wì¤Ëf·˜é ¨`¾F¼»­ˆÉ¬è*n³—-_gðY#e׎BtŠk'Ò×H Ñf4U)ÞÄ@•âi¾fÍÞî„f¸àgq ø=ÄïÞ>ÙjÏÙ¾Ììõï s=:{ vÕ¡D/¸qœ)¼Š\™ @+[Ê k‘S—VAÚ5BtÍrÎ0‰äV…ç;Ò»‰wWèéño£ ×E˜Ä¬ö éßõÍôß™ êá—ÜÊ»zæ.^+‘Âgˆ`—HÞ‰bü…¹3OÙñcq™±ØÁÙ¸!.Ä6ËñüEupy#d‡ˆ?¸¡ù|˜ÉS«y®¨®±€R0­Á ‹K96`{²3¬¼IÄQÑÉ·b®8uÙ¼ÕGîìG…z]a"“tØâÙw¬?dªñ÷Q`ûߣÀöë¿?Œ™ÝQÄ÷xcrysden-1.6.2/examples/XSF_Files/ANIM.axsf0000644000175000017500000023540511712736221017075 0ustar tonetone ANIMSTEPS 29 SLAB PRIMVEC 5.8859828533 0.0000000000 0.0000000000 0.0000000000 5.8859828533 0.0000000000 0.0000000000 0.0000000000 17.0000133966 PRIMCOORD 1 26 1 6 3.6747591817 2.9429926038 -3.4931030359 -0.0216686900 0.0000000000 -0.0573247900 1 4.1219902853 3.8167349741 -4.0076897956 -0.0004783600 0.0012041500 0.0066573100 1 4.1219902853 2.0692508222 -4.0076897956 -0.0004783600 -0.0012041500 0.0066573100 6 2.2112266146 2.9429926038 -3.4931030359 0.0216686900 0.0000000000 -0.0573247900 1 1.7639955110 3.8167349741 -4.0076897956 0.0004783600 0.0012041500 0.0066573100 1 1.7639955110 2.0692508222 -4.0076897956 0.0004783600 -0.0012041500 0.0066573100 8 0.0000000000 0.0000000000 -2.7190121211 0.0000000000 0.0000000000 -0.0502422400 47 4.4481473101 4.4498925040 -1.9190116984 -0.0228129300 -0.0291236500 0.0075538600 47 4.4481473101 1.4360932923 -1.9190116984 -0.0228129300 0.0291236500 0.0075538600 47 1.4378384862 4.4498925040 -1.9190116984 0.0228129300 -0.0291236500 0.0075538600 47 1.4378384862 1.4360932923 -1.9190116984 0.0228129300 0.0291236500 0.0075538600 47 2.9429926038 2.9429926038 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429926038 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429926038 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4378384862 1.4360932923 1.9190116984 0.0228129300 0.0291236500 -0.0075538600 47 1.4378384862 4.4498925040 1.9190116984 0.0228129300 -0.0291236500 -0.0075538600 47 4.4481473101 1.4360932923 1.9190116984 -0.0228129300 0.0291236500 -0.0075538600 47 4.4481473101 4.4498925040 1.9190116984 -0.0228129300 -0.0291236500 -0.0075538600 8 0.0000000000 0.0000000000 2.7190121211 0.0000000000 0.0000000000 0.0502422400 6 3.6747591817 2.9429926038 3.4931030359 -0.0216686900 0.0000000000 0.0573247900 1 4.1219902853 3.8167349741 4.0076897956 -0.0004783600 0.0012041500 -0.0066573100 1 4.1219902853 2.0692508222 4.0076897956 -0.0004783600 -0.0012041500 -0.0066573100 6 2.2112266146 2.9429926038 3.4931030359 0.0216686900 0.0000000000 0.0573247900 1 1.7639955110 3.8167349741 4.0076897956 0.0004783600 0.0012041500 -0.0066573100 1 1.7639955110 2.0692508222 4.0076897956 0.0004783600 -0.0012041500 -0.0066573100 PRIMCOORD 2 26 1 6 3.6632923218 2.9429928569 -3.5234382143 -0.0135140600 0.0000000000 -0.0474424600 1 4.1217372822 3.8173721376 -4.0041671350 0.0041293900 0.0092160300 0.0014698300 1 4.1217372822 2.0686135762 -4.0041671350 0.0041293900 -0.0092160300 0.0014698300 6 2.2226933862 2.9429928569 -3.5234382143 0.0135140600 0.0000000000 -0.0474424600 1 1.7642484317 3.8173721376 -4.0041671350 -0.0041293900 0.0092160300 0.0014698300 1 1.7642484317 2.0686135762 -4.0041671350 -0.0041293900 -0.0092160300 0.0014698300 8 0.0000000000 0.0000000000 -2.7455989880 0.0000000000 0.0000000000 -0.0385647300 47 4.4360751004 4.4344811292 -1.9150142332 -0.0141667900 -0.0180948200 0.0054976200 47 4.4360751004 1.4515045729 -1.9150142332 -0.0141667900 0.0180948200 0.0054976200 47 1.4499106017 4.4344811292 -1.9150142332 0.0141667900 -0.0180948200 0.0054976200 47 1.4499106017 1.4515045729 -1.9150142332 0.0141667900 0.0180948200 0.0054976200 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4499106017 1.4515045729 1.9150142332 0.0141667900 0.0180948200 -0.0054976200 47 1.4499106017 4.4344811292 1.9150142332 0.0141667900 -0.0180948200 -0.0054976200 47 4.4360751004 1.4515045729 1.9150142332 -0.0141667900 0.0180948200 -0.0054976200 47 4.4360751004 4.4344811292 1.9150142332 -0.0141667900 -0.0180948200 -0.0054976200 8 0.0000000000 0.0000000000 2.7455989880 0.0000000000 0.0000000000 0.0385647300 6 3.6632923218 2.9429928569 3.5234382143 -0.0135140600 0.0000000000 0.0474424600 1 4.1217372822 3.8173721376 4.0041671350 0.0041293900 0.0092160300 -0.0014698300 1 4.1217372822 2.0686135762 4.0041671350 0.0041293900 -0.0092160300 -0.0014698300 6 2.2226933862 2.9429928569 3.5234382143 0.0135140600 0.0000000000 0.0474424600 1 1.7642484317 3.8173721376 4.0041671350 -0.0041293900 0.0092160300 -0.0014698300 1 1.7642484317 2.0686135762 4.0041671350 -0.0041293900 -0.0092160300 -0.0014698300 PRIMCOORD 3 26 1 6 3.6261483797 2.9429928569 -3.6217029852 0.0304644500 0.0000000000 -0.0333218400 1 4.1209172824 3.8194362518 -3.9927553384 0.0186535000 0.0325356400 -0.0091719500 1 4.1209172824 2.0665494621 -3.9927553384 0.0186535000 -0.0325356400 -0.0091719500 6 2.2598373342 2.9429928569 -3.6217029852 -0.0304644500 0.0000000000 -0.0333218400 1 1.7650684315 3.8194362518 -3.9927553384 -0.0186535000 0.0325356400 -0.0091719500 1 1.7650684315 2.0665494621 -3.9927553384 -0.0186535000 -0.0325356400 -0.0091719500 8 0.0000000000 0.0000000000 -2.8317230187 0.0000000000 0.0000000000 -0.0053133800 47 4.3969697251 4.3845580767 -1.9020655889 0.0107442400 0.0156938800 -0.0007178900 47 4.3969697251 1.5014276254 -1.9020655889 0.0107442400 -0.0156938800 -0.0007178900 47 1.4890159829 4.3845580767 -1.9020655889 -0.0107442400 0.0156938800 -0.0007178900 47 1.4890159829 1.5014276254 -1.9020655889 -0.0107442400 -0.0156938800 -0.0007178900 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4890159829 1.5014276254 1.9020655889 -0.0107442400 -0.0156938800 0.0007178900 47 1.4890159829 4.3845580767 1.9020655889 -0.0107442400 0.0156938800 0.0007178900 47 4.3969697251 1.5014276254 1.9020655889 0.0107442400 -0.0156938800 0.0007178900 47 4.3969697251 4.3845580767 1.9020655889 0.0107442400 0.0156938800 0.0007178900 8 0.0000000000 0.0000000000 2.8317230187 0.0000000000 0.0000000000 0.0053133800 6 3.6261483797 2.9429928569 3.6217029852 0.0304644500 0.0000000000 0.0333218400 1 4.1209172824 3.8194362518 3.9927553384 0.0186535000 0.0325356400 0.0091719500 1 4.1209172824 2.0665494621 3.9927553384 0.0186535000 -0.0325356400 0.0091719500 6 2.2598373342 2.9429928569 3.6217029852 -0.0304644500 0.0000000000 0.0333218400 1 1.7650684315 3.8194362518 3.9927553384 -0.0186535000 0.0325356400 0.0091719500 1 1.7650684315 2.0665494621 3.9927553384 -0.0186535000 -0.0325356400 0.0091719500 PRIMCOORD 4 26 1 6 3.6344116345 2.9429928569 -3.6594260080 -0.0065320900 0.0000000000 -0.0316080000 1 4.1305046184 3.8368802684 -3.9951958965 0.0171866500 0.0246789900 -0.0093213500 1 4.1305046184 2.0491054455 -3.9951958965 0.0171866500 -0.0246789900 -0.0093213500 6 2.2515740794 2.9429928569 -3.6594260080 0.0065320900 0.0000000000 -0.0316080000 1 1.7554810896 3.8368802684 -3.9951958965 -0.0171866500 0.0246789900 -0.0093213500 1 1.7554810896 2.0491054455 -3.9951958965 -0.0171866500 -0.0246789900 -0.0093213500 8 0.0000000000 0.0000000000 -2.8522888900 0.0000000000 0.0000000000 -0.0020063200 47 4.3945132632 4.3824564100 -1.8997668713 0.0116549200 0.0170592600 -0.0025166800 47 4.3945132632 1.5035292921 -1.8997668713 0.0116549200 -0.0170592600 -0.0025166800 47 1.4914724389 4.3824564100 -1.8997668713 -0.0116549200 0.0170592600 -0.0025166800 47 1.4914724389 1.5035292921 -1.8997668713 -0.0116549200 -0.0170592600 -0.0025166800 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4914724389 1.5035292921 1.8997668713 -0.0116549200 -0.0170592600 0.0025166800 47 1.4914724389 4.3824564100 1.8997668713 -0.0116549200 0.0170592600 0.0025166800 47 4.3945132632 1.5035292921 1.8997668713 0.0116549200 -0.0170592600 0.0025166800 47 4.3945132632 4.3824564100 1.8997668713 0.0116549200 0.0170592600 0.0025166800 8 0.0000000000 0.0000000000 2.8522888900 0.0000000000 0.0000000000 0.0020063200 6 3.6344116345 2.9429928569 3.6594260080 -0.0065320900 0.0000000000 0.0316080000 1 4.1305046184 3.8368802684 3.9951958965 0.0171866500 0.0246789900 0.0093213500 1 4.1305046184 2.0491054455 3.9951958965 0.0171866500 -0.0246789900 0.0093213500 6 2.2515740794 2.9429928569 3.6594260080 0.0065320900 0.0000000000 0.0316080000 1 1.7554810896 3.8368802684 3.9951958965 -0.0171866500 0.0246789900 0.0093213500 1 1.7554810896 2.0491054455 3.9951958965 -0.0171866500 -0.0246789900 0.0093213500 PRIMCOORD 5 26 1 6 3.6406655678 2.9429928569 -3.6879761562 -0.0316616600 0.0000000000 -0.0313677600 1 4.1377606639 3.8500825279 -3.9970430003 0.0157467300 0.0181431000 -0.0092768200 1 4.1377606639 2.0359031860 -3.9970430003 0.0157467300 -0.0181431000 -0.0092768200 6 2.2453201461 2.9429928569 -3.6879761562 0.0316616600 0.0000000000 -0.0313677600 1 1.7482250441 3.8500825279 -3.9970430003 -0.0157467300 0.0181431000 -0.0092768200 1 1.7482250441 2.0359031860 -3.9970430003 -0.0157467300 -0.0181431000 -0.0092768200 8 0.0000000000 0.0000000000 -2.8678538890 0.0000000000 0.0000000000 0.0002295900 47 4.3926541284 4.3808657879 -1.8980271219 0.0123614500 0.0181048000 -0.0038624700 47 4.3926541284 1.5051199083 -1.8980271219 0.0123614500 -0.0181048000 -0.0038624700 47 1.4933315796 4.3808657879 -1.8980271219 -0.0123614500 0.0181048000 -0.0038624700 47 1.4933315796 1.5051199083 -1.8980271219 -0.0123614500 -0.0181048000 -0.0038624700 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4933315796 1.5051199083 1.8980271219 -0.0123614500 -0.0181048000 0.0038624700 47 1.4933315796 4.3808657879 1.8980271219 -0.0123614500 0.0181048000 0.0038624700 47 4.3926541284 1.5051199083 1.8980271219 0.0123614500 -0.0181048000 0.0038624700 47 4.3926541284 4.3808657879 1.8980271219 0.0123614500 0.0181048000 0.0038624700 8 0.0000000000 0.0000000000 2.8678538890 0.0000000000 0.0000000000 -0.0002295900 6 3.6406655678 2.9429928569 3.6879761562 -0.0316616600 0.0000000000 0.0313677600 1 4.1377606639 3.8500825279 3.9970430003 0.0157467300 0.0181431000 0.0092768200 1 4.1377606639 2.0359031860 3.9970430003 0.0157467300 -0.0181431000 0.0092768200 6 2.2453201461 2.9429928569 3.6879761562 0.0316616600 0.0000000000 0.0313677600 1 1.7482250441 3.8500825279 3.9970430003 -0.0157467300 0.0181431000 0.0092768200 1 1.7482250441 2.0359031860 3.9970430003 -0.0157467300 -0.0181431000 0.0092768200 PRIMCOORD 6 26 1 6 3.6602039996 2.9429928569 -3.7771720696 -0.0944414000 0.0000000000 -0.0291519500 1 4.1604298853 3.8913288235 -4.0028136885 0.0092172700 -0.0057608200 -0.0089876100 1 4.1604298853 1.9946568845 -4.0028136885 0.0092172700 0.0057608200 -0.0089876100 6 2.2257817143 2.9429928569 -3.7771720696 0.0944414000 0.0000000000 -0.0291519500 1 1.7255558286 3.8913288235 -4.0028136885 -0.0092172700 -0.0057608200 -0.0089876100 1 1.7255558286 1.9946568845 -4.0028136885 -0.0092172700 0.0057608200 -0.0089876100 8 0.0000000000 0.0000000000 -2.9164818075 0.0000000000 0.0000000000 0.0082867100 47 4.3868458464 4.3758964056 -1.8925918111 0.0146380500 0.0213080500 -0.0079571900 47 4.3868458464 1.5100892965 -1.8925918111 0.0146380500 -0.0213080500 -0.0079571900 47 1.4991398616 4.3758964056 -1.8925918111 -0.0146380500 0.0213080500 -0.0079571900 47 1.4991398616 1.5100892965 -1.8925918111 -0.0146380500 -0.0213080500 -0.0079571900 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4991398616 1.5100892965 1.8925918111 -0.0146380500 -0.0213080500 0.0079571900 47 1.4991398616 4.3758964056 1.8925918111 -0.0146380500 0.0213080500 0.0079571900 47 4.3868458464 1.5100892965 1.8925918111 0.0146380500 -0.0213080500 0.0079571900 47 4.3868458464 4.3758964056 1.8925918111 0.0146380500 0.0213080500 0.0079571900 8 0.0000000000 0.0000000000 2.9164818075 0.0000000000 0.0000000000 -0.0082867100 6 3.6602039996 2.9429928569 3.7771720696 -0.0944414000 0.0000000000 0.0291519500 1 4.1604298853 3.8913288235 4.0028136885 0.0092172700 -0.0057608200 0.0089876100 1 4.1604298853 1.9946568845 4.0028136885 0.0092172700 0.0057608200 0.0089876100 6 2.2257817143 2.9429928569 3.7771720696 0.0944414000 0.0000000000 0.0291519500 1 1.7255558286 3.8913288235 4.0028136885 -0.0092172700 -0.0057608200 0.0089876100 1 1.7255558286 1.9946568845 4.0028136885 -0.0092172700 0.0057608200 0.0089876100 PRIMCOORD 7 26 1 6 3.6235452214 2.9429928569 -3.8952738094 0.0237050300 0.0000000000 -0.0369198100 1 4.1877853319 3.9294500978 -4.0117861277 -0.0157672000 -0.0467803300 -0.0047545200 1 4.1877853319 1.9565356102 -4.0117861277 -0.0157672000 0.0467803300 -0.0047545200 6 2.2624404925 2.9429928569 -3.8952738094 -0.0237050300 0.0000000000 -0.0369198100 1 1.6982003819 3.9294500978 -4.0117861277 0.0157672000 -0.0467803300 -0.0047545200 1 1.6982003819 1.9565356102 -4.0117861277 0.0157672000 0.0467803300 -0.0047545200 8 0.0000000000 0.0000000000 -2.9723939181 0.0000000000 0.0000000000 0.0143148800 47 4.3834820425 4.3754433674 -1.8896671957 0.0170421600 0.0243222300 -0.0098535400 47 4.3834820425 1.5105423347 -1.8896671957 0.0170421600 -0.0243222300 -0.0098535400 47 1.5025036596 4.3754433674 -1.8896671957 -0.0170421600 0.0243222300 -0.0098535400 47 1.5025036596 1.5105423347 -1.8896671957 -0.0170421600 -0.0243222300 -0.0098535400 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.5025036596 1.5105423347 1.8896671957 -0.0170421600 -0.0243222300 0.0098535400 47 1.5025036596 4.3754433674 1.8896671957 -0.0170421600 0.0243222300 0.0098535400 47 4.3834820425 1.5105423347 1.8896671957 0.0170421600 -0.0243222300 0.0098535400 47 4.3834820425 4.3754433674 1.8896671957 0.0170421600 0.0243222300 0.0098535400 8 0.0000000000 0.0000000000 2.9723939181 0.0000000000 0.0000000000 -0.0143148800 6 3.6235452214 2.9429928569 3.8952738094 0.0237050300 0.0000000000 0.0369198100 1 4.1877853319 3.9294500978 4.0117861277 -0.0157672000 -0.0467803300 0.0047545200 1 4.1877853319 1.9565356102 4.0117861277 -0.0157672000 0.0467803300 0.0047545200 6 2.2624404925 2.9429928569 3.8952738094 -0.0237050300 0.0000000000 0.0369198100 1 1.6982003819 3.9294500978 4.0117861277 0.0157672000 -0.0467803300 0.0047545200 1 1.6982003819 1.9565356102 4.0117861277 0.0157672000 0.0467803300 0.0047545200 PRIMCOORD 8 26 1 6 3.6284456435 2.9429928569 -3.8794863673 0.0033769900 0.0000000000 -0.0375815900 1 4.1841285474 3.9243541787 -4.0105867234 -0.0122847100 -0.0414977600 -0.0045491900 1 4.1841285474 1.9616315352 -4.0105867234 -0.0122847100 0.0414977600 -0.0045491900 6 2.2575400704 2.9429928569 -3.8794863673 -0.0033769900 0.0000000000 -0.0375815900 1 1.7018571665 3.9243541787 -4.0105867234 0.0122847100 -0.0414977600 -0.0045491900 1 1.7018571665 1.9616315352 -4.0105867234 0.0122847100 0.0414977600 -0.0045491900 8 0.0000000000 0.0000000000 -2.9649197735 0.0000000000 0.0000000000 0.0136636300 47 4.3839317081 4.3755039283 -1.8900581485 0.0167102000 0.0240648300 -0.0094847400 47 4.3839317081 1.5104817739 -1.8900581485 0.0167102000 -0.0240648300 -0.0094847400 47 1.5020539999 4.3755039283 -1.8900581485 -0.0167102000 0.0240648300 -0.0094847400 47 1.5020539999 1.5104817739 -1.8900581485 -0.0167102000 -0.0240648300 -0.0094847400 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.5020539999 1.5104817739 1.8900581485 -0.0167102000 -0.0240648300 0.0094847400 47 1.5020539999 4.3755039283 1.8900581485 -0.0167102000 0.0240648300 0.0094847400 47 4.3839317081 1.5104817739 1.8900581485 0.0167102000 -0.0240648300 0.0094847400 47 4.3839317081 4.3755039283 1.8900581485 0.0167102000 0.0240648300 0.0094847400 8 0.0000000000 0.0000000000 2.9649197735 0.0000000000 0.0000000000 -0.0136636300 6 3.6284456435 2.9429928569 3.8794863673 0.0033769900 0.0000000000 0.0375815900 1 4.1841285474 3.9243541787 4.0105867234 -0.0122847100 -0.0414977600 0.0045491900 1 4.1841285474 1.9616315352 4.0105867234 -0.0122847100 0.0414977600 0.0045491900 6 2.2575400704 2.9429928569 3.8794863673 -0.0033769900 0.0000000000 0.0375815900 1 1.7018571665 3.9243541787 4.0105867234 0.0122847100 -0.0414977600 0.0045491900 1 1.7018571665 1.9616315352 4.0105867234 0.0122847100 0.0414977600 0.0045491900 PRIMCOORD 9 26 1 6 3.6171979893 2.9429928569 -3.9283877309 0.0325712900 0.0000000000 -0.0296082100 1 4.1869806945 3.9143517689 -4.0174257116 -0.0118707800 -0.0353202100 -0.0074868700 1 4.1869806945 1.9716339449 -4.0174257116 -0.0118707800 0.0353202100 -0.0074868700 6 2.2687877245 2.9429928569 -3.9283877309 -0.0325712900 0.0000000000 -0.0296082100 1 1.6990050193 3.9143517689 -4.0174257116 0.0118707800 -0.0353202100 -0.0074868700 1 1.6990050193 1.9716339449 -4.0174257116 0.0118707800 0.0353202100 -0.0074868700 8 0.0000000000 0.0000000000 -2.9665470888 0.0000000000 0.0000000000 0.0085060900 47 4.3962537130 4.3940268455 -1.8957906191 0.0111044600 0.0165871700 -0.0075909900 47 4.3962537130 1.4919588566 -1.8957906191 0.0111044600 -0.0165871700 -0.0075909900 47 1.4897319950 4.3940268455 -1.8957906191 -0.0111044600 0.0165871700 -0.0075909900 47 1.4897319950 1.4919588566 -1.8957906191 -0.0111044600 -0.0165871700 -0.0075909900 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4897319950 1.4919588566 1.8957906191 -0.0111044600 -0.0165871700 0.0075909900 47 1.4897319950 4.3940268455 1.8957906191 -0.0111044600 0.0165871700 0.0075909900 47 4.3962537130 1.4919588566 1.8957906191 0.0111044600 -0.0165871700 0.0075909900 47 4.3962537130 4.3940268455 1.8957906191 0.0111044600 0.0165871700 0.0075909900 8 0.0000000000 0.0000000000 2.9665470888 0.0000000000 0.0000000000 -0.0085060900 6 3.6171979893 2.9429928569 3.9283877309 0.0325712900 0.0000000000 0.0296082100 1 4.1869806945 3.9143517689 4.0174257116 -0.0118707800 -0.0353202100 0.0074868700 1 4.1869806945 1.9716339449 4.0174257116 -0.0118707800 0.0353202100 0.0074868700 6 2.2687877245 2.9429928569 3.9283877309 -0.0325712900 0.0000000000 0.0296082100 1 1.6990050193 3.9143517689 4.0174257116 0.0118707800 -0.0353202100 0.0074868700 1 1.6990050193 1.9716339449 4.0174257116 0.0118707800 0.0353202100 0.0074868700 PRIMCOORD 10 26 1 6 3.5975448868 2.9429928569 -4.0138334197 0.1046073200 0.0000000000 -0.0145701700 1 4.1919642679 3.8968744906 -4.0293755223 -0.0131432600 -0.0268628600 -0.0130723300 1 4.1919642679 1.9891112233 -4.0293755223 -0.0131432600 0.0268628600 -0.0130723300 6 2.2884408271 2.9429928569 -4.0138334197 -0.1046073200 0.0000000000 -0.0145701700 1 1.6940214459 3.8968744906 -4.0293755223 0.0131432600 -0.0268628600 -0.0130723300 1 1.6940214459 1.9891112233 -4.0293755223 0.0131432600 0.0268628600 -0.0130723300 8 0.0000000000 0.0000000000 -2.9693905012 0.0000000000 0.0000000000 -0.0009374200 47 4.4177840379 4.4263920700 -1.9058070021 0.0004696500 0.0026252000 -0.0047813500 47 4.4177840379 1.4595936321 -1.9058070021 0.0004696500 -0.0026252000 -0.0047813500 47 1.4682016701 4.4263920700 -1.9058070021 -0.0004696500 0.0026252000 -0.0047813500 47 1.4682016701 1.4595936321 -1.9058070021 -0.0004696500 -0.0026252000 -0.0047813500 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4682016701 1.4595936321 1.9058070021 -0.0004696500 -0.0026252000 0.0047813500 47 1.4682016701 4.4263920700 1.9058070021 -0.0004696500 0.0026252000 0.0047813500 47 4.4177840379 1.4595936321 1.9058070021 0.0004696500 -0.0026252000 0.0047813500 47 4.4177840379 4.4263920700 1.9058070021 0.0004696500 0.0026252000 0.0047813500 8 0.0000000000 0.0000000000 2.9693905012 0.0000000000 0.0000000000 0.0009374200 6 3.5975448868 2.9429928569 4.0138334197 0.1046073200 0.0000000000 0.0145701700 1 4.1919642679 3.8968744906 4.0293755223 -0.0131432600 -0.0268628600 0.0130723300 1 4.1919642679 1.9891112233 4.0293755223 -0.0131432600 0.0268628600 0.0130723300 6 2.2884408271 2.9429928569 4.0138334197 -0.1046073200 0.0000000000 0.0145701700 1 1.6940214459 3.8968744906 4.0293755223 0.0131432600 -0.0268628600 0.0130723300 1 1.6940214459 1.9891112233 4.0293755223 0.0131432600 0.0268628600 0.0130723300 PRIMCOORD 11 26 1 6 3.6190380359 2.9429928569 -4.0526278385 -0.0266015600 0.0000000000 -0.0060020500 1 4.1892603004 3.8723891257 -4.0453027564 0.0052200800 0.0049040800 -0.0159027500 1 4.1892603004 2.0135965882 -4.0453027564 0.0052200800 -0.0049040800 -0.0159027500 6 2.2669476780 2.9429928569 -4.0526278385 0.0266015600 0.0000000000 -0.0060020500 1 1.6967254135 3.8723891257 -4.0453027564 -0.0052200800 0.0049040800 -0.0159027500 1 1.6967254135 2.0135965882 -4.0453027564 -0.0052200800 -0.0049040800 -0.0159027500 8 0.0000000000 0.0000000000 -2.9596076681 0.0000000000 0.0000000000 -0.0113984800 47 4.4344019451 4.4513922878 -1.9161863502 -0.0090878600 -0.0091830100 -0.0016844300 47 4.4344019451 1.4345934143 -1.9161863502 -0.0090878600 0.0091830100 -0.0016844300 47 1.4515837629 4.4513922878 -1.9161863502 0.0090878600 -0.0091830100 -0.0016844300 47 1.4515837629 1.4345934143 -1.9161863502 0.0090878600 0.0091830100 -0.0016844300 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4515837629 1.4345934143 1.9161863502 0.0090878600 0.0091830100 0.0016844300 47 1.4515837629 4.4513922878 1.9161863502 0.0090878600 -0.0091830100 0.0016844300 47 4.4344019451 1.4345934143 1.9161863502 -0.0090878600 0.0091830100 0.0016844300 47 4.4344019451 4.4513922878 1.9161863502 -0.0090878600 -0.0091830100 0.0016844300 8 0.0000000000 0.0000000000 2.9596076681 0.0000000000 0.0000000000 0.0113984800 6 3.6190380359 2.9429928569 4.0526278385 -0.0266015600 0.0000000000 0.0060020500 1 4.1892603004 3.8723891257 4.0453027564 0.0052200800 0.0049040800 0.0159027500 1 4.1892603004 2.0135965882 4.0453027564 0.0052200800 -0.0049040800 0.0159027500 6 2.2669476780 2.9429928569 4.0526278385 0.0266015600 0.0000000000 0.0060020500 1 1.6967254135 3.8723891257 4.0453027564 -0.0052200800 0.0049040800 0.0159027500 1 1.6967254135 2.0135965882 4.0453027564 -0.0052200800 -0.0049040800 0.0159027500 PRIMCOORD 12 26 1 6 3.6157744350 2.9429928569 -4.0467371528 -0.0074130700 0.0000000000 -0.0071875900 1 4.1896708771 3.8761070715 -4.0428843061 0.0021525900 -0.0005081800 -0.0156153100 1 4.1896708771 2.0098786424 -4.0428843061 0.0021525900 0.0005081800 -0.0156153100 6 2.2702112789 2.9429928569 -4.0467371528 0.0074130700 0.0000000000 -0.0071875900 1 1.6963148368 3.8761070715 -4.0428843061 -0.0021525900 -0.0005081800 -0.0156153100 1 1.6963148368 2.0098786424 -4.0428843061 -0.0021525900 0.0005081800 -0.0156153100 8 0.0000000000 0.0000000000 -2.9610931312 0.0000000000 0.0000000000 -0.0096373400 47 4.4318786242 4.4475961643 -1.9146103135 -0.0076203500 -0.0074155200 -0.0021742200 47 4.4318786242 1.4383895378 -1.9146103135 -0.0076203500 0.0074155200 -0.0021742200 47 1.4541070838 4.4475961643 -1.9146103135 0.0076203500 -0.0074155200 -0.0021742200 47 1.4541070838 1.4383895378 -1.9146103135 0.0076203500 0.0074155200 -0.0021742200 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4541070838 1.4383895378 1.9146103135 0.0076203500 0.0074155200 0.0021742200 47 1.4541070838 4.4475961643 1.9146103135 0.0076203500 -0.0074155200 0.0021742200 47 4.4318786242 1.4383895378 1.9146103135 -0.0076203500 0.0074155200 0.0021742200 47 4.4318786242 4.4475961643 1.9146103135 -0.0076203500 -0.0074155200 0.0021742200 8 0.0000000000 0.0000000000 2.9610931312 0.0000000000 0.0000000000 0.0096373400 6 3.6157744350 2.9429928569 4.0467371528 -0.0074130700 0.0000000000 0.0071875900 1 4.1896708771 3.8761070715 4.0428843061 0.0021525900 -0.0005081800 0.0156153100 1 4.1896708771 2.0098786424 4.0428843061 0.0021525900 0.0005081800 0.0156153100 6 2.2702112789 2.9429928569 4.0467371528 0.0074130700 0.0000000000 0.0071875900 1 1.6963148368 3.8761070715 4.0428843061 -0.0021525900 -0.0005081800 0.0156153100 1 1.6963148368 2.0098786424 4.0428843061 -0.0021525900 0.0005081800 0.0156153100 PRIMCOORD 13 26 1 6 3.6175324780 2.9429928569 -4.1268220768 -0.0081339700 0.0000000000 0.0065186000 1 4.1988386486 3.8801883061 -4.0586064432 -0.0040519600 -0.0082962100 -0.0211007200 1 4.1988386486 2.0057974078 -4.0586064432 -0.0040519600 0.0082962100 -0.0211007200 6 2.2684532359 2.9429928569 -4.1268220768 0.0081339700 0.0000000000 0.0065186000 1 1.6871470653 3.8801883061 -4.0586064432 0.0040519600 -0.0082962100 -0.0211007200 1 1.6871470653 2.0057974078 -4.0586064432 0.0040519600 0.0082962100 -0.0211007200 8 0.0000000000 0.0000000000 -2.9957334176 0.0000000000 0.0000000000 -0.0016798000 47 4.4282152179 4.4470986575 -1.9166833331 -0.0053143000 -0.0060410500 -0.0048035000 47 4.4282152179 1.4388870446 -1.9166833331 -0.0053143000 0.0060410500 -0.0048035000 47 1.4577704901 4.4470986575 -1.9166833331 0.0053143000 -0.0060410500 -0.0048035000 47 1.4577704901 1.4388870446 -1.9166833331 0.0053143000 0.0060410500 -0.0048035000 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4577704901 1.4388870446 1.9166833331 0.0053143000 0.0060410500 0.0048035000 47 1.4577704901 4.4470986575 1.9166833331 0.0053143000 -0.0060410500 0.0048035000 47 4.4282152179 1.4388870446 1.9166833331 -0.0053143000 0.0060410500 0.0048035000 47 4.4282152179 4.4470986575 1.9166833331 -0.0053143000 -0.0060410500 0.0048035000 8 0.0000000000 0.0000000000 2.9957334176 0.0000000000 0.0000000000 0.0016798000 6 3.6175324780 2.9429928569 4.1268220768 -0.0081339700 0.0000000000 -0.0065186000 1 4.1988386486 3.8801883061 4.0586064432 -0.0040519600 -0.0082962100 0.0211007200 1 4.1988386486 2.0057974078 4.0586064432 -0.0040519600 0.0082962100 0.0211007200 6 2.2684532359 2.9429928569 4.1268220768 0.0081339700 0.0000000000 -0.0065186000 1 1.6871470653 3.8801883061 4.0586064432 0.0040519600 -0.0082962100 0.0211007200 1 1.6871470653 2.0057974078 4.0586064432 0.0040519600 0.0082962100 0.0211007200 PRIMCOORD 14 26 1 6 3.6176344879 2.9429928569 -4.1314689543 -0.0079503000 0.0000000000 0.0074708000 1 4.1993706002 3.8804251168 -4.0595187117 -0.0044014600 -0.0087480000 -0.0214809300 1 4.1993706002 2.0055605971 -4.0595187117 -0.0044014600 0.0087480000 -0.0214809300 6 2.2683512259 2.9429928569 -4.1314689543 0.0079503000 0.0000000000 0.0074708000 1 1.6866151137 3.8804251168 -4.0595187117 0.0044014600 -0.0087480000 -0.0214809300 1 1.6866151137 2.0055605971 -4.0595187117 0.0044014600 0.0087480000 -0.0214809300 8 0.0000000000 0.0000000000 -2.9977433983 0.0000000000 0.0000000000 -0.0012553900 47 4.4280026515 4.4470697927 -1.9168036191 -0.0051778600 -0.0059676900 -0.0049838500 47 4.4280026515 1.4389159094 -1.9168036191 -0.0051778600 0.0059676900 -0.0049838500 47 1.4579830565 4.4470697927 -1.9168036191 0.0051778600 -0.0059676900 -0.0049838500 47 1.4579830565 1.4389159094 -1.9168036191 0.0051778600 0.0059676900 -0.0049838500 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4579830565 1.4389159094 1.9168036191 0.0051778600 0.0059676900 0.0049838500 47 1.4579830565 4.4470697927 1.9168036191 0.0051778600 -0.0059676900 0.0049838500 47 4.4280026515 1.4389159094 1.9168036191 -0.0051778600 0.0059676900 0.0049838500 47 4.4280026515 4.4470697927 1.9168036191 -0.0051778600 -0.0059676900 0.0049838500 8 0.0000000000 0.0000000000 2.9977433983 0.0000000000 0.0000000000 0.0012553900 6 3.6176344879 2.9429928569 4.1314689543 -0.0079503000 0.0000000000 -0.0074708000 1 4.1993706002 3.8804251168 4.0595187117 -0.0044014600 -0.0087480000 0.0214809300 1 4.1993706002 2.0055605971 4.0595187117 -0.0044014600 0.0087480000 0.0214809300 6 2.2683512259 2.9429928569 4.1314689543 0.0079503000 0.0000000000 -0.0074708000 1 1.6866151137 3.8804251168 4.0595187117 0.0044014600 -0.0087480000 0.0214809300 1 1.6866151137 2.0055605971 4.0595187117 0.0044014600 0.0087480000 0.0214809300 PRIMCOORD 15 26 1 6 3.6150031299 2.9429928569 -4.1596275787 -0.0063221600 0.0000000000 0.0086688000 1 4.1978766023 3.8691089440 -4.0823302620 -0.0003629200 0.0013597600 -0.0209960400 1 4.1978766023 2.0168767699 -4.0823302620 -0.0003629200 -0.0013597600 -0.0209960400 6 2.2709825840 2.9429928569 -4.1596275787 0.0063221600 0.0000000000 0.0086688000 1 1.6881091115 3.8691089440 -4.0823302620 0.0003629200 0.0013597600 -0.0209960400 1 1.6881091115 2.0168767699 -4.0823302620 0.0003629200 -0.0013597600 -0.0209960400 8 0.0000000000 0.0000000000 -3.0111051209 0.0000000000 0.0000000000 0.0020295300 47 4.4230353705 4.4435725006 -1.9222959768 -0.0028928100 -0.0043081100 -0.0052785100 47 4.4230353705 1.4424132015 -1.9222959768 -0.0028928100 0.0043081100 -0.0052785100 47 1.4629503375 4.4435725006 -1.9222959768 0.0028928100 -0.0043081100 -0.0052785100 47 1.4629503375 1.4424132015 -1.9222959768 0.0028928100 0.0043081100 -0.0052785100 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4629503375 1.4424132015 1.9222959768 0.0028928100 0.0043081100 0.0052785100 47 1.4629503375 4.4435725006 1.9222959768 0.0028928100 -0.0043081100 0.0052785100 47 4.4230353705 1.4424132015 1.9222959768 -0.0028928100 0.0043081100 0.0052785100 47 4.4230353705 4.4435725006 1.9222959768 -0.0028928100 -0.0043081100 0.0052785100 8 0.0000000000 0.0000000000 3.0111051209 0.0000000000 0.0000000000 -0.0020295300 6 3.6150031299 2.9429928569 4.1596275787 -0.0063221600 0.0000000000 -0.0086688000 1 4.1978766023 3.8691089440 4.0823302620 -0.0003629200 0.0013597600 0.0209960400 1 4.1978766023 2.0168767699 4.0823302620 -0.0003629200 -0.0013597600 0.0209960400 6 2.2709825840 2.9429928569 4.1596275787 0.0063221600 0.0000000000 -0.0086688000 1 1.6881091115 3.8691089440 4.0823302620 0.0003629200 0.0013597600 0.0209960400 1 1.6881091115 2.0168767699 4.0823302620 0.0003629200 -0.0013597600 0.0209960400 PRIMCOORD 16 26 1 6 3.6103229200 2.9429928569 -4.2097112302 -0.0042712200 0.0000000000 0.0087847600 1 4.1952193342 3.8489816961 -4.1229034661 0.0072179200 0.0198647400 -0.0202232000 1 4.1952193342 2.0370040178 -4.1229034661 0.0072179200 -0.0198647400 -0.0202232000 6 2.2756627938 2.9429928569 -4.2097112302 0.0042712200 0.0000000000 0.0087847600 1 1.6907663797 3.8489816961 -4.1229034661 -0.0072179200 0.0198647400 -0.0202232000 1 1.6907663797 2.0370040178 -4.1229034661 -0.0072179200 -0.0198647400 -0.0202232000 8 0.0000000000 0.0000000000 -3.0348706301 0.0000000000 0.0000000000 0.0092795200 47 4.4142004396 4.4373521233 -1.9320648366 0.0010417100 -0.0014591700 -0.0058043800 47 4.4142004396 1.4486335788 -1.9320648366 0.0010417100 0.0014591700 -0.0058043800 47 1.4717852684 4.4373521233 -1.9320648366 -0.0010417100 -0.0014591700 -0.0058043800 47 1.4717852684 1.4486335788 -1.9320648366 -0.0010417100 0.0014591700 -0.0058043800 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4717852684 1.4486335788 1.9320648366 -0.0010417100 0.0014591700 0.0058043800 47 1.4717852684 4.4373521233 1.9320648366 -0.0010417100 -0.0014591700 0.0058043800 47 4.4142004396 1.4486335788 1.9320648366 0.0010417100 0.0014591700 0.0058043800 47 4.4142004396 4.4373521233 1.9320648366 0.0010417100 -0.0014591700 0.0058043800 8 0.0000000000 0.0000000000 3.0348706301 0.0000000000 0.0000000000 -0.0092795200 6 3.6103229200 2.9429928569 4.2097112302 -0.0042712200 0.0000000000 -0.0087847600 1 4.1952193342 3.8489816961 4.1229034661 0.0072179200 0.0198647400 0.0202232000 1 4.1952193342 2.0370040178 4.1229034661 0.0072179200 -0.0198647400 0.0202232000 6 2.2756627938 2.9429928569 4.2097112302 0.0042712200 0.0000000000 -0.0087847600 1 1.6907663797 3.8489816961 4.1229034661 -0.0072179200 0.0198647400 0.0202232000 1 1.6907663797 2.0370040178 4.1229034661 -0.0072179200 -0.0198647400 0.0202232000 PRIMCOORD 17 26 1 6 3.6103353395 2.9429928569 -4.2606641413 -0.0048436600 0.0000000000 0.0080982800 1 4.1994477301 3.8451368014 -4.1838454552 0.0067665000 0.0222250300 -0.0180152300 1 4.1994477301 2.0408489125 -4.1838454552 0.0067665000 -0.0222250300 -0.0180152300 6 2.2756503744 2.9429928569 -4.2606641413 0.0048436600 0.0000000000 0.0080982800 1 1.6865379838 3.8451368014 -4.1838454552 -0.0067665000 0.0222250300 -0.0180152300 1 1.6865379838 2.0408489125 -4.1838454552 -0.0067665000 -0.0222250300 -0.0180152300 8 0.0000000000 0.0000000000 -3.0560238342 0.0000000000 0.0000000000 0.0141769400 47 4.4054454757 4.4301824841 -1.9467005449 0.0043654600 0.0009954400 -0.0059551700 47 4.4054454757 1.4558032180 -1.9467005449 0.0043654600 -0.0009954400 -0.0059551700 47 1.4805402323 4.4301824841 -1.9467005449 -0.0043654600 0.0009954400 -0.0059551700 47 1.4805402323 1.4558032180 -1.9467005449 -0.0043654600 -0.0009954400 -0.0059551700 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4805402323 1.4558032180 1.9467005449 -0.0043654600 -0.0009954400 0.0059551700 47 1.4805402323 4.4301824841 1.9467005449 -0.0043654600 0.0009954400 0.0059551700 47 4.4054454757 1.4558032180 1.9467005449 0.0043654600 -0.0009954400 0.0059551700 47 4.4054454757 4.4301824841 1.9467005449 0.0043654600 0.0009954400 0.0059551700 8 0.0000000000 0.0000000000 3.0560238342 0.0000000000 0.0000000000 -0.0141769400 6 3.6103353395 2.9429928569 4.2606641413 -0.0048436600 0.0000000000 -0.0080982800 1 4.1994477301 3.8451368014 4.1838454552 0.0067665000 0.0222250300 0.0180152300 1 4.1994477301 2.0408489125 4.1838454552 0.0067665000 -0.0222250300 0.0180152300 6 2.2756503744 2.9429928569 4.2606641413 0.0048436600 0.0000000000 -0.0080982800 1 1.6865379838 3.8451368014 4.1838454552 -0.0067665000 0.0222250300 0.0180152300 1 1.6865379838 2.0408489125 4.1838454552 -0.0067665000 -0.0222250300 0.0180152300 PRIMCOORD 18 26 1 6 3.6103674534 2.9429928569 -4.3924008134 -0.0059543300 0.0000000000 0.0052714400 1 4.2103800780 3.8351959885 -4.3414084661 0.0055834800 0.0283735100 -0.0128982100 1 4.2103800780 2.0507897254 -4.3414084661 0.0055834800 -0.0283735100 -0.0128982100 6 2.2756182605 2.9429928569 -4.3924008134 0.0059543300 0.0000000000 0.0052714400 1 1.6756056359 3.8351959885 -4.3414084661 -0.0055834800 0.0283735100 -0.0128982100 1 1.6756056359 2.0507897254 -4.3414084661 -0.0055834800 -0.0283735100 -0.0128982100 8 0.0000000000 0.0000000000 -3.1107145799 0.0000000000 0.0000000000 0.0235148200 47 4.3828098868 4.4116456759 -1.9845405692 0.0120874100 0.0072806300 -0.0069994700 47 4.3828098868 1.4743400262 -1.9845405692 0.0120874100 -0.0072806300 -0.0069994700 47 1.5031758212 4.4116456759 -1.9845405692 -0.0120874100 0.0072806300 -0.0069994700 47 1.5031758212 1.4743400262 -1.9845405692 -0.0120874100 -0.0072806300 -0.0069994700 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.5031758212 1.4743400262 1.9845405692 -0.0120874100 -0.0072806300 0.0069994700 47 1.5031758212 4.4116456759 1.9845405692 -0.0120874100 0.0072806300 0.0069994700 47 4.3828098868 1.4743400262 1.9845405692 0.0120874100 -0.0072806300 0.0069994700 47 4.3828098868 4.4116456759 1.9845405692 0.0120874100 0.0072806300 0.0069994700 8 0.0000000000 0.0000000000 3.1107145799 0.0000000000 0.0000000000 -0.0235148200 6 3.6103674534 2.9429928569 4.3924008134 -0.0059543300 0.0000000000 -0.0052714400 1 4.2103800780 3.8351959885 4.3414084661 0.0055834800 0.0283735100 0.0128982100 1 4.2103800780 2.0507897254 4.3414084661 0.0055834800 -0.0283735100 0.0128982100 6 2.2756182605 2.9429928569 4.3924008134 0.0059543300 0.0000000000 -0.0052714400 1 1.6756056359 3.8351959885 4.3414084661 -0.0055834800 0.0283735100 0.0128982100 1 1.6756056359 2.0507897254 4.3414084661 -0.0055834800 -0.0283735100 0.0128982100 PRIMCOORD 19 26 1 6 3.6130848292 2.9429928569 -4.5443172597 0.0051918200 0.0000000000 -0.0047729100 1 4.2290870794 3.8424590618 -4.5522633660 -0.0078228200 0.0133170600 -0.0042970700 1 4.2290870794 2.0435266521 -4.5522633660 -0.0078228200 -0.0133170600 -0.0042970700 6 2.2729008847 2.9429928569 -4.5443172597 -0.0051918200 0.0000000000 -0.0047729100 1 1.6568986345 3.8424590618 -4.5522633660 0.0078228200 0.0133170600 -0.0042970700 1 1.6568986345 2.0435266521 -4.5522633660 0.0078228200 -0.0133170600 -0.0042970700 8 0.0000000000 0.0000000000 -3.1432457656 0.0000000000 0.0000000000 0.0227611400 47 4.3759707220 4.4102049580 -2.0411004617 0.0121932000 0.0056911800 -0.0016092000 47 4.3759707220 1.4757807442 -2.0411004617 0.0121932000 -0.0056911800 -0.0016092000 47 1.5100149860 4.4102049580 -2.0411004617 -0.0121932000 0.0056911800 -0.0016092000 47 1.5100149860 1.4757807442 -2.0411004617 -0.0121932000 -0.0056911800 -0.0016092000 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.5100149860 1.4757807442 2.0411004617 -0.0121932000 -0.0056911800 0.0016092000 47 1.5100149860 4.4102049580 2.0411004617 -0.0121932000 0.0056911800 0.0016092000 47 4.3759707220 1.4757807442 2.0411004617 0.0121932000 -0.0056911800 0.0016092000 47 4.3759707220 4.4102049580 2.0411004617 0.0121932000 0.0056911800 0.0016092000 8 0.0000000000 0.0000000000 3.1432457656 0.0000000000 0.0000000000 -0.0227611400 6 3.6130848292 2.9429928569 4.5443172597 0.0051918200 0.0000000000 0.0047729100 1 4.2290870794 3.8424590618 4.5522633660 -0.0078228200 0.0133170600 0.0042970700 1 4.2290870794 2.0435266521 4.5522633660 -0.0078228200 -0.0133170600 0.0042970700 6 2.2729008847 2.9429928569 4.5443172597 -0.0051918200 0.0000000000 0.0047729100 1 1.6568986345 3.8424590618 4.5522633660 0.0078228200 0.0133170600 0.0042970700 1 1.6568986345 2.0435266521 4.5522633660 0.0078228200 -0.0133170600 0.0042970700 PRIMCOORD 20 26 1 6 3.6145755073 2.9429928569 -4.6276546602 0.0124525000 0.0000000000 -0.0115940900 1 4.2393492493 3.8464433954 -4.6679328529 -0.0157026000 0.0046350500 0.0008511400 1 4.2393492493 2.0395423185 -4.6679328529 -0.0157026000 -0.0046350500 0.0008511400 6 2.2714102065 2.9429928569 -4.6276546602 -0.0124525000 0.0000000000 -0.0115940900 1 1.6466364646 3.8464433954 -4.6679328529 0.0157026000 0.0046350500 0.0008511400 1 1.6466364646 2.0395423185 -4.6679328529 0.0157026000 -0.0046350500 0.0008511400 8 0.0000000000 0.0000000000 -3.1610915182 0.0000000000 0.0000000000 0.0224249100 47 4.3722189318 4.4094146176 -2.0721277493 0.0123475400 0.0051592500 0.0002190300 47 4.3722189318 1.4765710845 -2.0721277493 0.0123475400 -0.0051592500 0.0002190300 47 1.5137667762 4.4094146176 -2.0721277493 -0.0123475400 0.0051592500 0.0002190300 47 1.5137667762 1.4765710845 -2.0721277493 -0.0123475400 -0.0051592500 0.0002190300 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.5137667762 1.4765710845 2.0721277493 -0.0123475400 -0.0051592500 -0.0002190300 47 1.5137667762 4.4094146176 2.0721277493 -0.0123475400 0.0051592500 -0.0002190300 47 4.3722189318 1.4765710845 2.0721277493 0.0123475400 -0.0051592500 -0.0002190300 47 4.3722189318 4.4094146176 2.0721277493 0.0123475400 0.0051592500 -0.0002190300 8 0.0000000000 0.0000000000 3.1610915182 0.0000000000 0.0000000000 -0.0224249100 6 3.6145755073 2.9429928569 4.6276546602 0.0124525000 0.0000000000 0.0115940900 1 4.2393492493 3.8464433954 4.6679328529 -0.0157026000 0.0046350500 -0.0008511400 1 4.2393492493 2.0395423185 4.6679328529 -0.0157026000 -0.0046350500 -0.0008511400 6 2.2714102065 2.9429928569 4.6276546602 -0.0124525000 0.0000000000 0.0115940900 1 1.6466364646 3.8464433954 4.6679328529 0.0157026000 0.0046350500 -0.0008511400 1 1.6466364646 2.0395423185 4.6679328529 0.0157026000 -0.0046350500 -0.0008511400 PRIMCOORD 21 26 1 6 3.6160743140 2.9429928569 -4.7026884515 0.0026492400 0.0000000000 -0.0057795400 1 4.2390351615 3.8466093448 -4.7234075290 -0.0147527700 0.0055042000 -0.0010384900 1 4.2390351615 2.0393763691 -4.7234075290 -0.0147527700 -0.0055042000 -0.0010384900 6 2.2699113999 2.9429928569 -4.7026884515 -0.0026492400 0.0000000000 -0.0057795400 1 1.6469505524 3.8466093448 -4.7234075290 0.0147527700 0.0055042000 -0.0010384900 1 1.6469505524 2.0393763691 -4.7234075290 0.0147527700 -0.0055042000 -0.0010384900 8 0.0000000000 0.0000000000 -3.1585890278 0.0000000000 0.0000000000 0.0164043600 47 4.3855317595 4.4247864916 -2.0890458652 0.0069338800 -0.0011336200 0.0024145000 47 4.3855317595 1.4611992105 -2.0890458652 0.0069338800 0.0011336200 0.0024145000 47 1.5004539485 4.4247864916 -2.0890458652 -0.0069338800 -0.0011336200 0.0024145000 47 1.5004539485 1.4611992105 -2.0890458652 -0.0069338800 0.0011336200 0.0024145000 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.5004539485 1.4611992105 2.0890458652 -0.0069338800 0.0011336200 -0.0024145000 47 1.5004539485 4.4247864916 2.0890458652 -0.0069338800 -0.0011336200 -0.0024145000 47 4.3855317595 1.4611992105 2.0890458652 0.0069338800 0.0011336200 -0.0024145000 47 4.3855317595 4.4247864916 2.0890458652 0.0069338800 -0.0011336200 -0.0024145000 8 0.0000000000 0.0000000000 3.1585890278 0.0000000000 0.0000000000 -0.0164043600 6 3.6160743140 2.9429928569 4.7026884515 0.0026492400 0.0000000000 0.0057795400 1 4.2390351615 3.8466093448 4.7234075290 -0.0147527700 0.0055042000 0.0010384900 1 4.2390351615 2.0393763691 4.7234075290 -0.0147527700 -0.0055042000 0.0010384900 6 2.2699113999 2.9429928569 4.7026884515 -0.0026492400 0.0000000000 0.0057795400 1 1.6469505524 3.8466093448 4.7234075290 0.0147527700 0.0055042000 0.0010384900 1 1.6469505524 2.0393763691 4.7234075290 0.0147527700 -0.0055042000 0.0010384900 PRIMCOORD 22 26 1 6 3.6171335437 2.9429928569 -4.7557158714 -0.0038084600 0.0000000000 -0.0026796100 1 4.2388131952 3.8467266289 -4.7626122479 -0.0142518600 0.0059575200 -0.0023705900 1 4.2388131952 2.0392590850 -4.7626122479 -0.0142518600 -0.0059575200 -0.0023705900 6 2.2688521702 2.9429928569 -4.7557158714 0.0038084600 0.0000000000 -0.0026796100 1 1.6471725187 3.8467266289 -4.7626122479 0.0142518600 0.0059575200 -0.0023705900 1 1.6471725187 2.0392590850 -4.7626122479 0.0142518600 -0.0059575200 -0.0023705900 8 0.0000000000 0.0000000000 -3.1568204783 0.0000000000 0.0000000000 0.0115292500 47 4.3949401205 4.4356500089 -2.1010021328 0.0028455300 -0.0055422300 0.0042855800 47 4.3949401205 1.4503356933 -2.1010021328 0.0028455300 0.0055422300 0.0042855800 47 1.4910455875 4.4356500089 -2.1010021328 -0.0028455300 -0.0055422300 0.0042855800 47 1.4910455875 1.4503356933 -2.1010021328 -0.0028455300 0.0055422300 0.0042855800 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4910455875 1.4503356933 2.1010021328 -0.0028455300 0.0055422300 -0.0042855800 47 1.4910455875 4.4356500089 2.1010021328 -0.0028455300 -0.0055422300 -0.0042855800 47 4.3949401205 1.4503356933 2.1010021328 0.0028455300 0.0055422300 -0.0042855800 47 4.3949401205 4.4356500089 2.1010021328 0.0028455300 -0.0055422300 -0.0042855800 8 0.0000000000 0.0000000000 3.1568204783 0.0000000000 0.0000000000 -0.0115292500 6 3.6171335437 2.9429928569 4.7557158714 -0.0038084600 0.0000000000 0.0026796100 1 4.2388131952 3.8467266289 4.7626122479 -0.0142518600 0.0059575200 0.0023705900 1 4.2388131952 2.0392590850 4.7626122479 -0.0142518600 -0.0059575200 0.0023705900 6 2.2688521702 2.9429928569 4.7557158714 0.0038084600 0.0000000000 0.0026796100 1 1.6471725187 3.8467266289 4.7626122479 0.0142518600 0.0059575200 0.0023705900 1 1.6471725187 2.0392590850 4.7626122479 0.0142518600 -0.0059575200 0.0023705900 PRIMCOORD 23 26 1 6 3.6169335262 2.9429928569 -4.8121071364 -0.0057004900 0.0000000000 -0.0026810300 1 4.2298548764 3.8525316677 -4.8232672365 -0.0122108600 0.0036552100 -0.0014721700 1 4.2298548764 2.0334540461 -4.8232672365 -0.0122108600 -0.0036552100 -0.0014721700 6 2.2690521876 2.9429928569 -4.8121071364 0.0057004900 0.0000000000 -0.0026810300 1 1.6561308375 3.8525316677 -4.8232672365 0.0122108600 0.0036552100 -0.0014721700 1 1.6561308375 2.0334540461 -4.8232672365 0.0122108600 -0.0036552100 -0.0014721700 8 0.0000000000 0.0000000000 -3.1506335275 0.0000000000 0.0000000000 0.0073659300 47 4.4014956222 4.4369880752 -2.1145777579 -0.0000892000 -0.0073757600 0.0063617400 47 4.4014956222 1.4489976269 -2.1145777579 -0.0000892000 0.0073757600 0.0063617400 47 1.4844900858 4.4369880752 -2.1145777579 0.0000892000 -0.0073757600 0.0063617400 47 1.4844900858 1.4489976269 -2.1145777579 0.0000892000 0.0073757600 0.0063617400 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4844900858 1.4489976269 2.1145777579 0.0000892000 0.0073757600 -0.0063617400 47 1.4844900858 4.4369880752 2.1145777579 0.0000892000 -0.0073757600 -0.0063617400 47 4.4014956222 1.4489976269 2.1145777579 -0.0000892000 0.0073757600 -0.0063617400 47 4.4014956222 4.4369880752 2.1145777579 -0.0000892000 -0.0073757600 -0.0063617400 8 0.0000000000 0.0000000000 3.1506335275 0.0000000000 0.0000000000 -0.0073659300 6 3.6169335262 2.9429928569 4.8121071364 -0.0057004900 0.0000000000 0.0026810300 1 4.2298548764 3.8525316677 4.8232672365 -0.0122108600 0.0036552100 0.0014721700 1 4.2298548764 2.0334540461 4.8232672365 -0.0122108600 -0.0036552100 0.0014721700 6 2.2690521876 2.9429928569 4.8121071364 0.0057004900 0.0000000000 0.0026810300 1 1.6561308375 3.8525316677 4.8232672365 0.0122108600 0.0036552100 0.0014721700 1 1.6561308375 2.0334540461 4.8232672365 0.0122108600 -0.0036552100 0.0014721700 PRIMCOORD 24 26 1 6 3.6166969039 2.9429928569 -4.8788196018 -0.0078349800 0.0000000000 -0.0039045800 1 4.2192569289 3.8593991971 -4.8950238009 -0.0098201400 0.0008910400 -0.0004813400 1 4.2192569289 2.0265865168 -4.8950238009 -0.0098201400 -0.0008910400 -0.0004813400 6 2.2692888100 2.9429928569 -4.8788196018 0.0078349800 0.0000000000 -0.0039045800 1 1.6667287850 3.8593991971 -4.8950238009 0.0098201400 0.0008910400 -0.0004813400 1 1.6667287850 2.0265865168 -4.8950238009 0.0098201400 -0.0008910400 -0.0004813400 8 0.0000000000 0.0000000000 -3.1433141901 0.0000000000 0.0000000000 0.0020889900 47 4.4092509696 4.4385710397 -2.1306381094 -0.0036789800 -0.0096102300 0.0090828200 47 4.4092509696 1.4474146624 -2.1306381094 -0.0036789800 0.0096102300 0.0090828200 47 1.4767347384 4.4385710397 -2.1306381094 0.0036789800 -0.0096102300 0.0090828200 47 1.4767347384 1.4474146624 -2.1306381094 0.0036789800 0.0096102300 0.0090828200 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4767347384 1.4474146624 2.1306381094 0.0036789800 0.0096102300 -0.0090828200 47 1.4767347384 4.4385710397 2.1306381094 0.0036789800 -0.0096102300 -0.0090828200 47 4.4092509696 1.4474146624 2.1306381094 -0.0036789800 0.0096102300 -0.0090828200 47 4.4092509696 4.4385710397 2.1306381094 -0.0036789800 -0.0096102300 -0.0090828200 8 0.0000000000 0.0000000000 3.1433141901 0.0000000000 0.0000000000 -0.0020889900 6 3.6166969039 2.9429928569 4.8788196018 -0.0078349800 0.0000000000 0.0039045800 1 4.2192569289 3.8593991971 4.8950238009 -0.0098201400 0.0008910400 0.0004813400 1 4.2192569289 2.0265865168 4.8950238009 -0.0098201400 -0.0008910400 0.0004813400 6 2.2692888100 2.9429928569 4.8788196018 0.0078349800 0.0000000000 0.0039045800 1 1.6667287850 3.8593991971 4.8950238009 0.0098201400 0.0008910400 0.0004813400 1 1.6667287850 2.0265865168 4.8950238009 0.0098201400 -0.0008910400 0.0004813400 PRIMCOORD 25 26 1 6 3.6138190526 2.9429928569 -4.9294337098 -0.0034272400 0.0000000000 -0.0023257400 1 4.1971977602 3.8697215983 -4.9419683341 -0.0036881400 -0.0015728600 -0.0007647300 1 4.1971977602 2.0162641156 -4.9419683341 -0.0036881400 0.0015728600 -0.0007647300 6 2.2721666613 2.9429928569 -4.9294337098 0.0034272400 0.0000000000 -0.0023257400 1 1.6887879537 3.8697215983 -4.9419683341 0.0036881400 -0.0015728600 -0.0007647300 1 1.6887879537 2.0162641156 -4.9419683341 0.0036881400 0.0015728600 -0.0007647300 8 0.0000000000 0.0000000000 -3.1365820148 0.0000000000 0.0000000000 0.0036574100 47 4.4094197090 4.4242360110 -2.1318144996 -0.0028343300 -0.0059588800 0.0086098500 47 4.4094197090 1.4617496911 -2.1318144996 -0.0028343300 0.0059588800 0.0086098500 47 1.4765659990 4.4242360110 -2.1318144996 0.0028343300 -0.0059588800 0.0086098500 47 1.4765659990 1.4617496911 -2.1318144996 0.0028343300 0.0059588800 0.0086098500 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4765659990 1.4617496911 2.1318144996 0.0028343300 0.0059588800 -0.0086098500 47 1.4765659990 4.4242360110 2.1318144996 0.0028343300 -0.0059588800 -0.0086098500 47 4.4094197090 1.4617496911 2.1318144996 -0.0028343300 0.0059588800 -0.0086098500 47 4.4094197090 4.4242360110 2.1318144996 -0.0028343300 -0.0059588800 -0.0086098500 8 0.0000000000 0.0000000000 3.1365820148 0.0000000000 0.0000000000 -0.0036574100 6 3.6138190526 2.9429928569 4.9294337098 -0.0034272400 0.0000000000 0.0023257400 1 4.1971977602 3.8697215983 4.9419683341 -0.0036881400 -0.0015728600 0.0007647300 1 4.1971977602 2.0162641156 4.9419683341 -0.0036881400 0.0015728600 0.0007647300 6 2.2721666613 2.9429928569 4.9294337098 0.0034272400 0.0000000000 0.0023257400 1 1.6887879537 3.8697215983 4.9419683341 0.0036881400 -0.0015728600 0.0007647300 1 1.6887879537 2.0162641156 4.9419683341 0.0036881400 0.0015728600 0.0007647300 PRIMCOORD 26 26 1 6 3.6108541771 2.9429928569 -4.9815783795 0.0020452700 0.0000000000 -0.0015105300 1 4.1744715271 3.8803561390 -4.9903324546 0.0024863800 -0.0042454500 -0.0010383300 1 4.1744715271 2.0056295749 -4.9903324546 0.0024863800 0.0042454500 -0.0010383300 6 2.2751315368 2.9429928569 -4.9815783795 -0.0020452700 0.0000000000 -0.0015105300 1 1.7115141867 3.8803561390 -4.9903324546 -0.0024863800 -0.0042454500 -0.0010383300 1 1.7115141867 2.0056295749 -4.9903324546 -0.0024863800 0.0042454500 -0.0010383300 8 0.0000000000 0.0000000000 -3.1296462611 0.0000000000 0.0000000000 0.0052698500 47 4.4095935515 4.4094674914 -2.1330264706 -0.0019781200 -0.0020232800 0.0081250800 47 4.4095935515 1.4765182107 -2.1330264706 -0.0019781200 0.0020232800 0.0081250800 47 1.4763921565 4.4094674914 -2.1330264706 0.0019781200 -0.0020232800 0.0081250800 47 1.4763921565 1.4765182107 -2.1330264706 0.0019781200 0.0020232800 0.0081250800 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4763921565 1.4765182107 2.1330264706 0.0019781200 0.0020232800 -0.0081250800 47 1.4763921565 4.4094674914 2.1330264706 0.0019781200 -0.0020232800 -0.0081250800 47 4.4095935515 1.4765182107 2.1330264706 -0.0019781200 0.0020232800 -0.0081250800 47 4.4095935515 4.4094674914 2.1330264706 -0.0019781200 -0.0020232800 -0.0081250800 8 0.0000000000 0.0000000000 3.1296462611 0.0000000000 0.0000000000 -0.0052698500 6 3.6108541771 2.9429928569 4.9815783795 0.0020452700 0.0000000000 0.0015105300 1 4.1744715271 3.8803561390 4.9903324546 0.0024863800 -0.0042454500 0.0010383300 1 4.1744715271 2.0056295749 4.9903324546 0.0024863800 0.0042454500 0.0010383300 6 2.2751315368 2.9429928569 4.9815783795 -0.0020452700 0.0000000000 0.0015105300 1 1.7115141867 3.8803561390 4.9903324546 -0.0024863800 -0.0042454500 0.0010383300 1 1.7115141867 2.0056295749 4.9903324546 -0.0024863800 0.0042454500 0.0010383300 PRIMCOORD 27 26 1 6 3.6107473171 2.9429928569 -4.9706239827 0.0006083800 0.0000000000 -0.0010482000 1 4.1744128969 3.8781540221 -4.9766977048 0.0034639700 -0.0018989100 -0.0014577800 1 4.1744128969 2.0078316918 -4.9766977048 0.0034639700 0.0018989100 -0.0014577800 6 2.2752383968 2.9429928569 -4.9706239827 -0.0006083800 0.0000000000 -0.0010482000 1 1.7115728170 3.8781540221 -4.9766977048 -0.0034639700 -0.0018989100 -0.0014577800 1 1.7115728170 2.0078316918 -4.9766977048 -0.0034639700 0.0018989100 -0.0014577800 8 0.0000000000 0.0000000000 -3.1270074101 0.0000000000 0.0000000000 0.0073257600 47 4.4066260920 4.4053553142 -2.1241385128 -0.0004872500 -0.0002992300 0.0065702800 47 4.4066260920 1.4806303879 -2.1241385128 -0.0004872500 0.0002992300 0.0065702800 47 1.4793596160 4.4053553142 -2.1241385128 0.0004872500 -0.0002992300 0.0065702800 47 1.4793596160 1.4806303879 -2.1241385128 0.0004872500 0.0002992300 0.0065702800 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4793596160 1.4806303879 2.1241385128 0.0004872500 0.0002992300 -0.0065702800 47 1.4793596160 4.4053553142 2.1241385128 0.0004872500 -0.0002992300 -0.0065702800 47 4.4066260920 1.4806303879 2.1241385128 -0.0004872500 0.0002992300 -0.0065702800 47 4.4066260920 4.4053553142 2.1241385128 -0.0004872500 -0.0002992300 -0.0065702800 8 0.0000000000 0.0000000000 3.1270074101 0.0000000000 0.0000000000 -0.0073257600 6 3.6107473171 2.9429928569 4.9706239827 0.0006083800 0.0000000000 0.0010482000 1 4.1744128969 3.8781540221 4.9766977048 0.0034639700 -0.0018989100 0.0014577800 1 4.1744128969 2.0078316918 4.9766977048 0.0034639700 0.0018989100 0.0014577800 6 2.2752383968 2.9429928569 4.9706239827 -0.0006083800 0.0000000000 0.0010482000 1 1.7115728170 3.8781540221 4.9766977048 -0.0034639700 -0.0018989100 0.0014577800 1 1.7115728170 2.0078316918 4.9766977048 -0.0034639700 0.0018989100 0.0014577800 PRIMCOORD 28 26 1 6 3.6105733510 2.9429928569 -4.9527902316 -0.0018748200 0.0000000000 -0.0000599200 1 4.1743174498 3.8745689700 -4.9545003391 0.0050396300 0.0018621200 -0.0020544500 1 4.1743174498 2.0114167439 -4.9545003391 0.0050396300 -0.0018621200 -0.0020544500 6 2.2754123629 2.9429928569 -4.9527902316 0.0018748200 0.0000000000 -0.0000599200 1 1.7116682641 3.8745689700 -4.9545003391 -0.0050396300 0.0018621200 -0.0020544500 1 1.7116682641 2.0114167439 -4.9545003391 -0.0050396300 -0.0018621200 -0.0020544500 8 0.0000000000 0.0000000000 -3.1227113666 0.0000000000 0.0000000000 0.0105267800 47 4.4017950715 4.3986606856 -2.1096689247 0.0018406100 0.0024909000 0.0040751000 47 4.4017950715 1.4873250165 -2.1096689247 0.0018406100 -0.0024909000 0.0040751000 47 1.4841906365 4.3986606856 -2.1096689247 -0.0018406100 0.0024909000 0.0040751000 47 1.4841906365 1.4873250165 -2.1096689247 -0.0018406100 -0.0024909000 0.0040751000 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4841906365 1.4873250165 2.1096689247 -0.0018406100 -0.0024909000 -0.0040751000 47 1.4841906365 4.3986606856 2.1096689247 -0.0018406100 0.0024909000 -0.0040751000 47 4.4017950715 1.4873250165 2.1096689247 0.0018406100 -0.0024909000 -0.0040751000 47 4.4017950715 4.3986606856 2.1096689247 0.0018406100 0.0024909000 -0.0040751000 8 0.0000000000 0.0000000000 3.1227113666 0.0000000000 0.0000000000 -0.0105267800 6 3.6105733510 2.9429928569 4.9527902316 -0.0018748200 0.0000000000 0.0000599200 1 4.1743174498 3.8745689700 4.9545003391 0.0050396300 0.0018621200 0.0020544500 1 4.1743174498 2.0114167439 4.9545003391 0.0050396300 -0.0018621200 0.0020544500 6 2.2754123629 2.9429928569 4.9527902316 0.0018748200 0.0000000000 0.0000599200 1 1.7116682641 3.8745689700 4.9545003391 -0.0050396300 0.0018621200 0.0020544500 1 1.7116682641 2.0114167439 4.9545003391 -0.0050396300 -0.0018621200 0.0020544500 PRIMCOORD 29 26 1 6 3.6105024308 2.9429928569 -4.9736694137 -0.0010894600 0.0000000000 -0.0001469800 1 4.1751085671 3.8746597378 -4.9759438929 0.0044787300 0.0012859900 -0.0017778400 1 4.1751085671 2.0113259761 -4.9759438929 0.0044787300 -0.0012859900 -0.0017778400 6 2.2754832831 2.9429928569 -4.9736694137 0.0010894600 0.0000000000 -0.0001469800 1 1.7108771468 3.8746597378 -4.9759438929 -0.0044787300 0.0012859900 -0.0017778400 1 1.7108771468 2.0113259761 -4.9759438929 -0.0044787300 -0.0012859900 -0.0017778400 8 0.0000000000 0.0000000000 -3.1143858381 0.0000000000 0.0000000000 0.0095962800 47 4.4029531740 4.3984024499 -2.1072116681 0.0012398300 0.0021625800 0.0038742200 47 4.4029531740 1.4875832522 -2.1072116681 0.0012398300 -0.0021625800 0.0038742200 47 1.4830325340 4.3984024499 -2.1072116681 -0.0012398300 0.0021625800 0.0038742200 47 1.4830325340 1.4875832522 -2.1072116681 -0.0012398300 -0.0021625800 0.0038742200 47 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 47 1.4830325340 1.4875832522 2.1072116681 -0.0012398300 -0.0021625800 -0.0038742200 47 1.4830325340 4.3984024499 2.1072116681 -0.0012398300 0.0021625800 -0.0038742200 47 4.4029531740 1.4875832522 2.1072116681 0.0012398300 -0.0021625800 -0.0038742200 47 4.4029531740 4.3984024499 2.1072116681 0.0012398300 0.0021625800 -0.0038742200 8 0.0000000000 0.0000000000 3.1143858381 0.0000000000 0.0000000000 -0.0095962800 6 3.6105024308 2.9429928569 4.9736694137 -0.0010894600 0.0000000000 0.0001469800 1 4.1751085671 3.8746597378 4.9759438929 0.0044787300 0.0012859900 0.0017778400 1 4.1751085671 2.0113259761 4.9759438929 0.0044787300 -0.0012859900 0.0017778400 6 2.2754832831 2.9429928569 4.9736694137 0.0010894600 0.0000000000 0.0001469800 1 1.7108771468 3.8746597378 4.9759438929 -0.0044787300 0.0012859900 0.0017778400 1 1.7108771468 2.0113259761 4.9759438929 -0.0044787300 -0.0012859900 0.0017778400 xcrysden-1.6.2/examples/XSF_Files/1.xsf0000644000175000017500000000107011712736221016335 0ustar tonetoneATOMS 6 2.325243 -0.115261 0.031711 1 2.344577 -0.363301 1.077589 9 3.131708 -0.909527 -0.638930 9 2.736189 1.130568 -0.134093 8 1.079338 -0.265162 -0.526351 6 0.007719 -0.041269 0.244204 9 0.064656 1.154700 0.824420 9 -0.042641 -0.911850 1.255074 8 -1.071578 -0.152842 -0.539134 6 -2.310374 0.036537 0.022189 1 -2.267004 0.230694 1.077874 9 -2.890949 1.048938 -0.593940 9 -3.029540 -1.046542 -0.203665 xcrysden-1.6.2/examples/XSF_Files/ANIMsymb.axsf0000644000175000017500000023465111712736221017772 0ustar tonetone ANIMSTEPS 29 SLAB PRIMVEC 5.8859828533 0.0000000000 0.0000000000 0.0000000000 5.8859828533 0.0000000000 0.0000000000 0.0000000000 17.0000133966 PRIMCOORD 1 26 1 C 3.6747591817 2.9429926038 -3.4931030359 -0.0216686900 0.0000000000 -0.0573247900 H 4.1219902853 3.8167349741 -4.0076897956 -0.0004783600 0.0012041500 0.0066573100 H 4.1219902853 2.0692508222 -4.0076897956 -0.0004783600 -0.0012041500 0.0066573100 C 2.2112266146 2.9429926038 -3.4931030359 0.0216686900 0.0000000000 -0.0573247900 H 1.7639955110 3.8167349741 -4.0076897956 0.0004783600 0.0012041500 0.0066573100 H 1.7639955110 2.0692508222 -4.0076897956 0.0004783600 -0.0012041500 0.0066573100 8 0.0000000000 0.0000000000 -2.7190121211 0.0000000000 0.0000000000 -0.0502422400 Ag 4.4481473101 4.4498925040 -1.9190116984 -0.0228129300 -0.0291236500 0.0075538600 Ag 4.4481473101 1.4360932923 -1.9190116984 -0.0228129300 0.0291236500 0.0075538600 Ag 1.4378384862 4.4498925040 -1.9190116984 0.0228129300 -0.0291236500 0.0075538600 Ag 1.4378384862 1.4360932923 -1.9190116984 0.0228129300 0.0291236500 0.0075538600 Ag 2.9429926038 2.9429926038 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429926038 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429926038 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4378384862 1.4360932923 1.9190116984 0.0228129300 0.0291236500 -0.0075538600 Ag 1.4378384862 4.4498925040 1.9190116984 0.0228129300 -0.0291236500 -0.0075538600 Ag 4.4481473101 1.4360932923 1.9190116984 -0.0228129300 0.0291236500 -0.0075538600 Ag 4.4481473101 4.4498925040 1.9190116984 -0.0228129300 -0.0291236500 -0.0075538600 8 0.0000000000 0.0000000000 2.7190121211 0.0000000000 0.0000000000 0.0502422400 C 3.6747591817 2.9429926038 3.4931030359 -0.0216686900 0.0000000000 0.0573247900 H 4.1219902853 3.8167349741 4.0076897956 -0.0004783600 0.0012041500 -0.0066573100 H 4.1219902853 2.0692508222 4.0076897956 -0.0004783600 -0.0012041500 -0.0066573100 C 2.2112266146 2.9429926038 3.4931030359 0.0216686900 0.0000000000 0.0573247900 H 1.7639955110 3.8167349741 4.0076897956 0.0004783600 0.0012041500 -0.0066573100 H 1.7639955110 2.0692508222 4.0076897956 0.0004783600 -0.0012041500 -0.0066573100 PRIMCOORD 2 26 1 C 3.6632923218 2.9429928569 -3.5234382143 -0.0135140600 0.0000000000 -0.0474424600 H 4.1217372822 3.8173721376 -4.0041671350 0.0041293900 0.0092160300 0.0014698300 H 4.1217372822 2.0686135762 -4.0041671350 0.0041293900 -0.0092160300 0.0014698300 C 2.2226933862 2.9429928569 -3.5234382143 0.0135140600 0.0000000000 -0.0474424600 H 1.7642484317 3.8173721376 -4.0041671350 -0.0041293900 0.0092160300 0.0014698300 H 1.7642484317 2.0686135762 -4.0041671350 -0.0041293900 -0.0092160300 0.0014698300 8 0.0000000000 0.0000000000 -2.7455989880 0.0000000000 0.0000000000 -0.0385647300 Ag 4.4360751004 4.4344811292 -1.9150142332 -0.0141667900 -0.0180948200 0.0054976200 Ag 4.4360751004 1.4515045729 -1.9150142332 -0.0141667900 0.0180948200 0.0054976200 Ag 1.4499106017 4.4344811292 -1.9150142332 0.0141667900 -0.0180948200 0.0054976200 Ag 1.4499106017 1.4515045729 -1.9150142332 0.0141667900 0.0180948200 0.0054976200 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4499106017 1.4515045729 1.9150142332 0.0141667900 0.0180948200 -0.0054976200 Ag 1.4499106017 4.4344811292 1.9150142332 0.0141667900 -0.0180948200 -0.0054976200 Ag 4.4360751004 1.4515045729 1.9150142332 -0.0141667900 0.0180948200 -0.0054976200 Ag 4.4360751004 4.4344811292 1.9150142332 -0.0141667900 -0.0180948200 -0.0054976200 8 0.0000000000 0.0000000000 2.7455989880 0.0000000000 0.0000000000 0.0385647300 C 3.6632923218 2.9429928569 3.5234382143 -0.0135140600 0.0000000000 0.0474424600 H 4.1217372822 3.8173721376 4.0041671350 0.0041293900 0.0092160300 -0.0014698300 H 4.1217372822 2.0686135762 4.0041671350 0.0041293900 -0.0092160300 -0.0014698300 C 2.2226933862 2.9429928569 3.5234382143 0.0135140600 0.0000000000 0.0474424600 H 1.7642484317 3.8173721376 4.0041671350 -0.0041293900 0.0092160300 -0.0014698300 H 1.7642484317 2.0686135762 4.0041671350 -0.0041293900 -0.0092160300 -0.0014698300 PRIMCOORD 3 26 1 C 3.6261483797 2.9429928569 -3.6217029852 0.0304644500 0.0000000000 -0.0333218400 H 4.1209172824 3.8194362518 -3.9927553384 0.0186535000 0.0325356400 -0.0091719500 H 4.1209172824 2.0665494621 -3.9927553384 0.0186535000 -0.0325356400 -0.0091719500 C 2.2598373342 2.9429928569 -3.6217029852 -0.0304644500 0.0000000000 -0.0333218400 H 1.7650684315 3.8194362518 -3.9927553384 -0.0186535000 0.0325356400 -0.0091719500 H 1.7650684315 2.0665494621 -3.9927553384 -0.0186535000 -0.0325356400 -0.0091719500 8 0.0000000000 0.0000000000 -2.8317230187 0.0000000000 0.0000000000 -0.0053133800 Ag 4.3969697251 4.3845580767 -1.9020655889 0.0107442400 0.0156938800 -0.0007178900 Ag 4.3969697251 1.5014276254 -1.9020655889 0.0107442400 -0.0156938800 -0.0007178900 Ag 1.4890159829 4.3845580767 -1.9020655889 -0.0107442400 0.0156938800 -0.0007178900 Ag 1.4890159829 1.5014276254 -1.9020655889 -0.0107442400 -0.0156938800 -0.0007178900 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4890159829 1.5014276254 1.9020655889 -0.0107442400 -0.0156938800 0.0007178900 Ag 1.4890159829 4.3845580767 1.9020655889 -0.0107442400 0.0156938800 0.0007178900 Ag 4.3969697251 1.5014276254 1.9020655889 0.0107442400 -0.0156938800 0.0007178900 Ag 4.3969697251 4.3845580767 1.9020655889 0.0107442400 0.0156938800 0.0007178900 8 0.0000000000 0.0000000000 2.8317230187 0.0000000000 0.0000000000 0.0053133800 C 3.6261483797 2.9429928569 3.6217029852 0.0304644500 0.0000000000 0.0333218400 H 4.1209172824 3.8194362518 3.9927553384 0.0186535000 0.0325356400 0.0091719500 H 4.1209172824 2.0665494621 3.9927553384 0.0186535000 -0.0325356400 0.0091719500 C 2.2598373342 2.9429928569 3.6217029852 -0.0304644500 0.0000000000 0.0333218400 H 1.7650684315 3.8194362518 3.9927553384 -0.0186535000 0.0325356400 0.0091719500 H 1.7650684315 2.0665494621 3.9927553384 -0.0186535000 -0.0325356400 0.0091719500 PRIMCOORD 4 26 1 C 3.6344116345 2.9429928569 -3.6594260080 -0.0065320900 0.0000000000 -0.0316080000 H 4.1305046184 3.8368802684 -3.9951958965 0.0171866500 0.0246789900 -0.0093213500 H 4.1305046184 2.0491054455 -3.9951958965 0.0171866500 -0.0246789900 -0.0093213500 C 2.2515740794 2.9429928569 -3.6594260080 0.0065320900 0.0000000000 -0.0316080000 H 1.7554810896 3.8368802684 -3.9951958965 -0.0171866500 0.0246789900 -0.0093213500 H 1.7554810896 2.0491054455 -3.9951958965 -0.0171866500 -0.0246789900 -0.0093213500 8 0.0000000000 0.0000000000 -2.8522888900 0.0000000000 0.0000000000 -0.0020063200 Ag 4.3945132632 4.3824564100 -1.8997668713 0.0116549200 0.0170592600 -0.0025166800 Ag 4.3945132632 1.5035292921 -1.8997668713 0.0116549200 -0.0170592600 -0.0025166800 Ag 1.4914724389 4.3824564100 -1.8997668713 -0.0116549200 0.0170592600 -0.0025166800 Ag 1.4914724389 1.5035292921 -1.8997668713 -0.0116549200 -0.0170592600 -0.0025166800 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4914724389 1.5035292921 1.8997668713 -0.0116549200 -0.0170592600 0.0025166800 Ag 1.4914724389 4.3824564100 1.8997668713 -0.0116549200 0.0170592600 0.0025166800 Ag 4.3945132632 1.5035292921 1.8997668713 0.0116549200 -0.0170592600 0.0025166800 Ag 4.3945132632 4.3824564100 1.8997668713 0.0116549200 0.0170592600 0.0025166800 8 0.0000000000 0.0000000000 2.8522888900 0.0000000000 0.0000000000 0.0020063200 C 3.6344116345 2.9429928569 3.6594260080 -0.0065320900 0.0000000000 0.0316080000 H 4.1305046184 3.8368802684 3.9951958965 0.0171866500 0.0246789900 0.0093213500 H 4.1305046184 2.0491054455 3.9951958965 0.0171866500 -0.0246789900 0.0093213500 C 2.2515740794 2.9429928569 3.6594260080 0.0065320900 0.0000000000 0.0316080000 H 1.7554810896 3.8368802684 3.9951958965 -0.0171866500 0.0246789900 0.0093213500 H 1.7554810896 2.0491054455 3.9951958965 -0.0171866500 -0.0246789900 0.0093213500 PRIMCOORD 5 26 1 C 3.6406655678 2.9429928569 -3.6879761562 -0.0316616600 0.0000000000 -0.0313677600 H 4.1377606639 3.8500825279 -3.9970430003 0.0157467300 0.0181431000 -0.0092768200 H 4.1377606639 2.0359031860 -3.9970430003 0.0157467300 -0.0181431000 -0.0092768200 C 2.2453201461 2.9429928569 -3.6879761562 0.0316616600 0.0000000000 -0.0313677600 H 1.7482250441 3.8500825279 -3.9970430003 -0.0157467300 0.0181431000 -0.0092768200 H 1.7482250441 2.0359031860 -3.9970430003 -0.0157467300 -0.0181431000 -0.0092768200 8 0.0000000000 0.0000000000 -2.8678538890 0.0000000000 0.0000000000 0.0002295900 Ag 4.3926541284 4.3808657879 -1.8980271219 0.0123614500 0.0181048000 -0.0038624700 Ag 4.3926541284 1.5051199083 -1.8980271219 0.0123614500 -0.0181048000 -0.0038624700 Ag 1.4933315796 4.3808657879 -1.8980271219 -0.0123614500 0.0181048000 -0.0038624700 Ag 1.4933315796 1.5051199083 -1.8980271219 -0.0123614500 -0.0181048000 -0.0038624700 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4933315796 1.5051199083 1.8980271219 -0.0123614500 -0.0181048000 0.0038624700 Ag 1.4933315796 4.3808657879 1.8980271219 -0.0123614500 0.0181048000 0.0038624700 Ag 4.3926541284 1.5051199083 1.8980271219 0.0123614500 -0.0181048000 0.0038624700 Ag 4.3926541284 4.3808657879 1.8980271219 0.0123614500 0.0181048000 0.0038624700 8 0.0000000000 0.0000000000 2.8678538890 0.0000000000 0.0000000000 -0.0002295900 C 3.6406655678 2.9429928569 3.6879761562 -0.0316616600 0.0000000000 0.0313677600 H 4.1377606639 3.8500825279 3.9970430003 0.0157467300 0.0181431000 0.0092768200 H 4.1377606639 2.0359031860 3.9970430003 0.0157467300 -0.0181431000 0.0092768200 C 2.2453201461 2.9429928569 3.6879761562 0.0316616600 0.0000000000 0.0313677600 H 1.7482250441 3.8500825279 3.9970430003 -0.0157467300 0.0181431000 0.0092768200 H 1.7482250441 2.0359031860 3.9970430003 -0.0157467300 -0.0181431000 0.0092768200 PRIMCOORD 6 26 1 C 3.6602039996 2.9429928569 -3.7771720696 -0.0944414000 0.0000000000 -0.0291519500 H 4.1604298853 3.8913288235 -4.0028136885 0.0092172700 -0.0057608200 -0.0089876100 H 4.1604298853 1.9946568845 -4.0028136885 0.0092172700 0.0057608200 -0.0089876100 C 2.2257817143 2.9429928569 -3.7771720696 0.0944414000 0.0000000000 -0.0291519500 H 1.7255558286 3.8913288235 -4.0028136885 -0.0092172700 -0.0057608200 -0.0089876100 H 1.7255558286 1.9946568845 -4.0028136885 -0.0092172700 0.0057608200 -0.0089876100 8 0.0000000000 0.0000000000 -2.9164818075 0.0000000000 0.0000000000 0.0082867100 Ag 4.3868458464 4.3758964056 -1.8925918111 0.0146380500 0.0213080500 -0.0079571900 Ag 4.3868458464 1.5100892965 -1.8925918111 0.0146380500 -0.0213080500 -0.0079571900 Ag 1.4991398616 4.3758964056 -1.8925918111 -0.0146380500 0.0213080500 -0.0079571900 Ag 1.4991398616 1.5100892965 -1.8925918111 -0.0146380500 -0.0213080500 -0.0079571900 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4991398616 1.5100892965 1.8925918111 -0.0146380500 -0.0213080500 0.0079571900 Ag 1.4991398616 4.3758964056 1.8925918111 -0.0146380500 0.0213080500 0.0079571900 Ag 4.3868458464 1.5100892965 1.8925918111 0.0146380500 -0.0213080500 0.0079571900 Ag 4.3868458464 4.3758964056 1.8925918111 0.0146380500 0.0213080500 0.0079571900 8 0.0000000000 0.0000000000 2.9164818075 0.0000000000 0.0000000000 -0.0082867100 C 3.6602039996 2.9429928569 3.7771720696 -0.0944414000 0.0000000000 0.0291519500 H 4.1604298853 3.8913288235 4.0028136885 0.0092172700 -0.0057608200 0.0089876100 H 4.1604298853 1.9946568845 4.0028136885 0.0092172700 0.0057608200 0.0089876100 C 2.2257817143 2.9429928569 3.7771720696 0.0944414000 0.0000000000 0.0291519500 H 1.7255558286 3.8913288235 4.0028136885 -0.0092172700 -0.0057608200 0.0089876100 H 1.7255558286 1.9946568845 4.0028136885 -0.0092172700 0.0057608200 0.0089876100 PRIMCOORD 7 26 1 C 3.6235452214 2.9429928569 -3.8952738094 0.0237050300 0.0000000000 -0.0369198100 H 4.1877853319 3.9294500978 -4.0117861277 -0.0157672000 -0.0467803300 -0.0047545200 H 4.1877853319 1.9565356102 -4.0117861277 -0.0157672000 0.0467803300 -0.0047545200 C 2.2624404925 2.9429928569 -3.8952738094 -0.0237050300 0.0000000000 -0.0369198100 H 1.6982003819 3.9294500978 -4.0117861277 0.0157672000 -0.0467803300 -0.0047545200 H 1.6982003819 1.9565356102 -4.0117861277 0.0157672000 0.0467803300 -0.0047545200 8 0.0000000000 0.0000000000 -2.9723939181 0.0000000000 0.0000000000 0.0143148800 Ag 4.3834820425 4.3754433674 -1.8896671957 0.0170421600 0.0243222300 -0.0098535400 Ag 4.3834820425 1.5105423347 -1.8896671957 0.0170421600 -0.0243222300 -0.0098535400 Ag 1.5025036596 4.3754433674 -1.8896671957 -0.0170421600 0.0243222300 -0.0098535400 Ag 1.5025036596 1.5105423347 -1.8896671957 -0.0170421600 -0.0243222300 -0.0098535400 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.5025036596 1.5105423347 1.8896671957 -0.0170421600 -0.0243222300 0.0098535400 Ag 1.5025036596 4.3754433674 1.8896671957 -0.0170421600 0.0243222300 0.0098535400 Ag 4.3834820425 1.5105423347 1.8896671957 0.0170421600 -0.0243222300 0.0098535400 Ag 4.3834820425 4.3754433674 1.8896671957 0.0170421600 0.0243222300 0.0098535400 8 0.0000000000 0.0000000000 2.9723939181 0.0000000000 0.0000000000 -0.0143148800 C 3.6235452214 2.9429928569 3.8952738094 0.0237050300 0.0000000000 0.0369198100 H 4.1877853319 3.9294500978 4.0117861277 -0.0157672000 -0.0467803300 0.0047545200 H 4.1877853319 1.9565356102 4.0117861277 -0.0157672000 0.0467803300 0.0047545200 C 2.2624404925 2.9429928569 3.8952738094 -0.0237050300 0.0000000000 0.0369198100 H 1.6982003819 3.9294500978 4.0117861277 0.0157672000 -0.0467803300 0.0047545200 H 1.6982003819 1.9565356102 4.0117861277 0.0157672000 0.0467803300 0.0047545200 PRIMCOORD 8 26 1 C 3.6284456435 2.9429928569 -3.8794863673 0.0033769900 0.0000000000 -0.0375815900 H 4.1841285474 3.9243541787 -4.0105867234 -0.0122847100 -0.0414977600 -0.0045491900 H 4.1841285474 1.9616315352 -4.0105867234 -0.0122847100 0.0414977600 -0.0045491900 C 2.2575400704 2.9429928569 -3.8794863673 -0.0033769900 0.0000000000 -0.0375815900 H 1.7018571665 3.9243541787 -4.0105867234 0.0122847100 -0.0414977600 -0.0045491900 H 1.7018571665 1.9616315352 -4.0105867234 0.0122847100 0.0414977600 -0.0045491900 8 0.0000000000 0.0000000000 -2.9649197735 0.0000000000 0.0000000000 0.0136636300 Ag 4.3839317081 4.3755039283 -1.8900581485 0.0167102000 0.0240648300 -0.0094847400 Ag 4.3839317081 1.5104817739 -1.8900581485 0.0167102000 -0.0240648300 -0.0094847400 Ag 1.5020539999 4.3755039283 -1.8900581485 -0.0167102000 0.0240648300 -0.0094847400 Ag 1.5020539999 1.5104817739 -1.8900581485 -0.0167102000 -0.0240648300 -0.0094847400 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.5020539999 1.5104817739 1.8900581485 -0.0167102000 -0.0240648300 0.0094847400 Ag 1.5020539999 4.3755039283 1.8900581485 -0.0167102000 0.0240648300 0.0094847400 Ag 4.3839317081 1.5104817739 1.8900581485 0.0167102000 -0.0240648300 0.0094847400 Ag 4.3839317081 4.3755039283 1.8900581485 0.0167102000 0.0240648300 0.0094847400 8 0.0000000000 0.0000000000 2.9649197735 0.0000000000 0.0000000000 -0.0136636300 C 3.6284456435 2.9429928569 3.8794863673 0.0033769900 0.0000000000 0.0375815900 H 4.1841285474 3.9243541787 4.0105867234 -0.0122847100 -0.0414977600 0.0045491900 H 4.1841285474 1.9616315352 4.0105867234 -0.0122847100 0.0414977600 0.0045491900 C 2.2575400704 2.9429928569 3.8794863673 -0.0033769900 0.0000000000 0.0375815900 H 1.7018571665 3.9243541787 4.0105867234 0.0122847100 -0.0414977600 0.0045491900 H 1.7018571665 1.9616315352 4.0105867234 0.0122847100 0.0414977600 0.0045491900 PRIMCOORD 9 26 1 C 3.6171979893 2.9429928569 -3.9283877309 0.0325712900 0.0000000000 -0.0296082100 H 4.1869806945 3.9143517689 -4.0174257116 -0.0118707800 -0.0353202100 -0.0074868700 H 4.1869806945 1.9716339449 -4.0174257116 -0.0118707800 0.0353202100 -0.0074868700 C 2.2687877245 2.9429928569 -3.9283877309 -0.0325712900 0.0000000000 -0.0296082100 H 1.6990050193 3.9143517689 -4.0174257116 0.0118707800 -0.0353202100 -0.0074868700 H 1.6990050193 1.9716339449 -4.0174257116 0.0118707800 0.0353202100 -0.0074868700 8 0.0000000000 0.0000000000 -2.9665470888 0.0000000000 0.0000000000 0.0085060900 Ag 4.3962537130 4.3940268455 -1.8957906191 0.0111044600 0.0165871700 -0.0075909900 Ag 4.3962537130 1.4919588566 -1.8957906191 0.0111044600 -0.0165871700 -0.0075909900 Ag 1.4897319950 4.3940268455 -1.8957906191 -0.0111044600 0.0165871700 -0.0075909900 Ag 1.4897319950 1.4919588566 -1.8957906191 -0.0111044600 -0.0165871700 -0.0075909900 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4897319950 1.4919588566 1.8957906191 -0.0111044600 -0.0165871700 0.0075909900 Ag 1.4897319950 4.3940268455 1.8957906191 -0.0111044600 0.0165871700 0.0075909900 Ag 4.3962537130 1.4919588566 1.8957906191 0.0111044600 -0.0165871700 0.0075909900 Ag 4.3962537130 4.3940268455 1.8957906191 0.0111044600 0.0165871700 0.0075909900 8 0.0000000000 0.0000000000 2.9665470888 0.0000000000 0.0000000000 -0.0085060900 C 3.6171979893 2.9429928569 3.9283877309 0.0325712900 0.0000000000 0.0296082100 H 4.1869806945 3.9143517689 4.0174257116 -0.0118707800 -0.0353202100 0.0074868700 H 4.1869806945 1.9716339449 4.0174257116 -0.0118707800 0.0353202100 0.0074868700 C 2.2687877245 2.9429928569 3.9283877309 -0.0325712900 0.0000000000 0.0296082100 H 1.6990050193 3.9143517689 4.0174257116 0.0118707800 -0.0353202100 0.0074868700 H 1.6990050193 1.9716339449 4.0174257116 0.0118707800 0.0353202100 0.0074868700 PRIMCOORD 10 26 1 C 3.5975448868 2.9429928569 -4.0138334197 0.1046073200 0.0000000000 -0.0145701700 H 4.1919642679 3.8968744906 -4.0293755223 -0.0131432600 -0.0268628600 -0.0130723300 H 4.1919642679 1.9891112233 -4.0293755223 -0.0131432600 0.0268628600 -0.0130723300 C 2.2884408271 2.9429928569 -4.0138334197 -0.1046073200 0.0000000000 -0.0145701700 H 1.6940214459 3.8968744906 -4.0293755223 0.0131432600 -0.0268628600 -0.0130723300 H 1.6940214459 1.9891112233 -4.0293755223 0.0131432600 0.0268628600 -0.0130723300 8 0.0000000000 0.0000000000 -2.9693905012 0.0000000000 0.0000000000 -0.0009374200 Ag 4.4177840379 4.4263920700 -1.9058070021 0.0004696500 0.0026252000 -0.0047813500 Ag 4.4177840379 1.4595936321 -1.9058070021 0.0004696500 -0.0026252000 -0.0047813500 Ag 1.4682016701 4.4263920700 -1.9058070021 -0.0004696500 0.0026252000 -0.0047813500 Ag 1.4682016701 1.4595936321 -1.9058070021 -0.0004696500 -0.0026252000 -0.0047813500 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4682016701 1.4595936321 1.9058070021 -0.0004696500 -0.0026252000 0.0047813500 Ag 1.4682016701 4.4263920700 1.9058070021 -0.0004696500 0.0026252000 0.0047813500 Ag 4.4177840379 1.4595936321 1.9058070021 0.0004696500 -0.0026252000 0.0047813500 Ag 4.4177840379 4.4263920700 1.9058070021 0.0004696500 0.0026252000 0.0047813500 8 0.0000000000 0.0000000000 2.9693905012 0.0000000000 0.0000000000 0.0009374200 C 3.5975448868 2.9429928569 4.0138334197 0.1046073200 0.0000000000 0.0145701700 H 4.1919642679 3.8968744906 4.0293755223 -0.0131432600 -0.0268628600 0.0130723300 H 4.1919642679 1.9891112233 4.0293755223 -0.0131432600 0.0268628600 0.0130723300 C 2.2884408271 2.9429928569 4.0138334197 -0.1046073200 0.0000000000 0.0145701700 H 1.6940214459 3.8968744906 4.0293755223 0.0131432600 -0.0268628600 0.0130723300 H 1.6940214459 1.9891112233 4.0293755223 0.0131432600 0.0268628600 0.0130723300 PRIMCOORD 11 26 1 C 3.6190380359 2.9429928569 -4.0526278385 -0.0266015600 0.0000000000 -0.0060020500 H 4.1892603004 3.8723891257 -4.0453027564 0.0052200800 0.0049040800 -0.0159027500 H 4.1892603004 2.0135965882 -4.0453027564 0.0052200800 -0.0049040800 -0.0159027500 C 2.2669476780 2.9429928569 -4.0526278385 0.0266015600 0.0000000000 -0.0060020500 H 1.6967254135 3.8723891257 -4.0453027564 -0.0052200800 0.0049040800 -0.0159027500 H 1.6967254135 2.0135965882 -4.0453027564 -0.0052200800 -0.0049040800 -0.0159027500 8 0.0000000000 0.0000000000 -2.9596076681 0.0000000000 0.0000000000 -0.0113984800 Ag 4.4344019451 4.4513922878 -1.9161863502 -0.0090878600 -0.0091830100 -0.0016844300 Ag 4.4344019451 1.4345934143 -1.9161863502 -0.0090878600 0.0091830100 -0.0016844300 Ag 1.4515837629 4.4513922878 -1.9161863502 0.0090878600 -0.0091830100 -0.0016844300 Ag 1.4515837629 1.4345934143 -1.9161863502 0.0090878600 0.0091830100 -0.0016844300 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4515837629 1.4345934143 1.9161863502 0.0090878600 0.0091830100 0.0016844300 Ag 1.4515837629 4.4513922878 1.9161863502 0.0090878600 -0.0091830100 0.0016844300 Ag 4.4344019451 1.4345934143 1.9161863502 -0.0090878600 0.0091830100 0.0016844300 Ag 4.4344019451 4.4513922878 1.9161863502 -0.0090878600 -0.0091830100 0.0016844300 8 0.0000000000 0.0000000000 2.9596076681 0.0000000000 0.0000000000 0.0113984800 C 3.6190380359 2.9429928569 4.0526278385 -0.0266015600 0.0000000000 0.0060020500 H 4.1892603004 3.8723891257 4.0453027564 0.0052200800 0.0049040800 0.0159027500 H 4.1892603004 2.0135965882 4.0453027564 0.0052200800 -0.0049040800 0.0159027500 C 2.2669476780 2.9429928569 4.0526278385 0.0266015600 0.0000000000 0.0060020500 H 1.6967254135 3.8723891257 4.0453027564 -0.0052200800 0.0049040800 0.0159027500 H 1.6967254135 2.0135965882 4.0453027564 -0.0052200800 -0.0049040800 0.0159027500 PRIMCOORD 12 26 1 C 3.6157744350 2.9429928569 -4.0467371528 -0.0074130700 0.0000000000 -0.0071875900 H 4.1896708771 3.8761070715 -4.0428843061 0.0021525900 -0.0005081800 -0.0156153100 H 4.1896708771 2.0098786424 -4.0428843061 0.0021525900 0.0005081800 -0.0156153100 C 2.2702112789 2.9429928569 -4.0467371528 0.0074130700 0.0000000000 -0.0071875900 H 1.6963148368 3.8761070715 -4.0428843061 -0.0021525900 -0.0005081800 -0.0156153100 H 1.6963148368 2.0098786424 -4.0428843061 -0.0021525900 0.0005081800 -0.0156153100 8 0.0000000000 0.0000000000 -2.9610931312 0.0000000000 0.0000000000 -0.0096373400 Ag 4.4318786242 4.4475961643 -1.9146103135 -0.0076203500 -0.0074155200 -0.0021742200 Ag 4.4318786242 1.4383895378 -1.9146103135 -0.0076203500 0.0074155200 -0.0021742200 Ag 1.4541070838 4.4475961643 -1.9146103135 0.0076203500 -0.0074155200 -0.0021742200 Ag 1.4541070838 1.4383895378 -1.9146103135 0.0076203500 0.0074155200 -0.0021742200 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4541070838 1.4383895378 1.9146103135 0.0076203500 0.0074155200 0.0021742200 Ag 1.4541070838 4.4475961643 1.9146103135 0.0076203500 -0.0074155200 0.0021742200 Ag 4.4318786242 1.4383895378 1.9146103135 -0.0076203500 0.0074155200 0.0021742200 Ag 4.4318786242 4.4475961643 1.9146103135 -0.0076203500 -0.0074155200 0.0021742200 8 0.0000000000 0.0000000000 2.9610931312 0.0000000000 0.0000000000 0.0096373400 C 3.6157744350 2.9429928569 4.0467371528 -0.0074130700 0.0000000000 0.0071875900 H 4.1896708771 3.8761070715 4.0428843061 0.0021525900 -0.0005081800 0.0156153100 H 4.1896708771 2.0098786424 4.0428843061 0.0021525900 0.0005081800 0.0156153100 C 2.2702112789 2.9429928569 4.0467371528 0.0074130700 0.0000000000 0.0071875900 H 1.6963148368 3.8761070715 4.0428843061 -0.0021525900 -0.0005081800 0.0156153100 H 1.6963148368 2.0098786424 4.0428843061 -0.0021525900 0.0005081800 0.0156153100 PRIMCOORD 13 26 1 C 3.6175324780 2.9429928569 -4.1268220768 -0.0081339700 0.0000000000 0.0065186000 H 4.1988386486 3.8801883061 -4.0586064432 -0.0040519600 -0.0082962100 -0.0211007200 H 4.1988386486 2.0057974078 -4.0586064432 -0.0040519600 0.0082962100 -0.0211007200 C 2.2684532359 2.9429928569 -4.1268220768 0.0081339700 0.0000000000 0.0065186000 H 1.6871470653 3.8801883061 -4.0586064432 0.0040519600 -0.0082962100 -0.0211007200 H 1.6871470653 2.0057974078 -4.0586064432 0.0040519600 0.0082962100 -0.0211007200 8 0.0000000000 0.0000000000 -2.9957334176 0.0000000000 0.0000000000 -0.0016798000 Ag 4.4282152179 4.4470986575 -1.9166833331 -0.0053143000 -0.0060410500 -0.0048035000 Ag 4.4282152179 1.4388870446 -1.9166833331 -0.0053143000 0.0060410500 -0.0048035000 Ag 1.4577704901 4.4470986575 -1.9166833331 0.0053143000 -0.0060410500 -0.0048035000 Ag 1.4577704901 1.4388870446 -1.9166833331 0.0053143000 0.0060410500 -0.0048035000 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4577704901 1.4388870446 1.9166833331 0.0053143000 0.0060410500 0.0048035000 Ag 1.4577704901 4.4470986575 1.9166833331 0.0053143000 -0.0060410500 0.0048035000 Ag 4.4282152179 1.4388870446 1.9166833331 -0.0053143000 0.0060410500 0.0048035000 Ag 4.4282152179 4.4470986575 1.9166833331 -0.0053143000 -0.0060410500 0.0048035000 8 0.0000000000 0.0000000000 2.9957334176 0.0000000000 0.0000000000 0.0016798000 C 3.6175324780 2.9429928569 4.1268220768 -0.0081339700 0.0000000000 -0.0065186000 H 4.1988386486 3.8801883061 4.0586064432 -0.0040519600 -0.0082962100 0.0211007200 H 4.1988386486 2.0057974078 4.0586064432 -0.0040519600 0.0082962100 0.0211007200 C 2.2684532359 2.9429928569 4.1268220768 0.0081339700 0.0000000000 -0.0065186000 H 1.6871470653 3.8801883061 4.0586064432 0.0040519600 -0.0082962100 0.0211007200 H 1.6871470653 2.0057974078 4.0586064432 0.0040519600 0.0082962100 0.0211007200 PRIMCOORD 14 26 1 C 3.6176344879 2.9429928569 -4.1314689543 -0.0079503000 0.0000000000 0.0074708000 H 4.1993706002 3.8804251168 -4.0595187117 -0.0044014600 -0.0087480000 -0.0214809300 H 4.1993706002 2.0055605971 -4.0595187117 -0.0044014600 0.0087480000 -0.0214809300 C 2.2683512259 2.9429928569 -4.1314689543 0.0079503000 0.0000000000 0.0074708000 H 1.6866151137 3.8804251168 -4.0595187117 0.0044014600 -0.0087480000 -0.0214809300 H 1.6866151137 2.0055605971 -4.0595187117 0.0044014600 0.0087480000 -0.0214809300 8 0.0000000000 0.0000000000 -2.9977433983 0.0000000000 0.0000000000 -0.0012553900 Ag 4.4280026515 4.4470697927 -1.9168036191 -0.0051778600 -0.0059676900 -0.0049838500 Ag 4.4280026515 1.4389159094 -1.9168036191 -0.0051778600 0.0059676900 -0.0049838500 Ag 1.4579830565 4.4470697927 -1.9168036191 0.0051778600 -0.0059676900 -0.0049838500 Ag 1.4579830565 1.4389159094 -1.9168036191 0.0051778600 0.0059676900 -0.0049838500 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4579830565 1.4389159094 1.9168036191 0.0051778600 0.0059676900 0.0049838500 Ag 1.4579830565 4.4470697927 1.9168036191 0.0051778600 -0.0059676900 0.0049838500 Ag 4.4280026515 1.4389159094 1.9168036191 -0.0051778600 0.0059676900 0.0049838500 Ag 4.4280026515 4.4470697927 1.9168036191 -0.0051778600 -0.0059676900 0.0049838500 8 0.0000000000 0.0000000000 2.9977433983 0.0000000000 0.0000000000 0.0012553900 C 3.6176344879 2.9429928569 4.1314689543 -0.0079503000 0.0000000000 -0.0074708000 H 4.1993706002 3.8804251168 4.0595187117 -0.0044014600 -0.0087480000 0.0214809300 H 4.1993706002 2.0055605971 4.0595187117 -0.0044014600 0.0087480000 0.0214809300 C 2.2683512259 2.9429928569 4.1314689543 0.0079503000 0.0000000000 -0.0074708000 H 1.6866151137 3.8804251168 4.0595187117 0.0044014600 -0.0087480000 0.0214809300 H 1.6866151137 2.0055605971 4.0595187117 0.0044014600 0.0087480000 0.0214809300 PRIMCOORD 15 26 1 C 3.6150031299 2.9429928569 -4.1596275787 -0.0063221600 0.0000000000 0.0086688000 H 4.1978766023 3.8691089440 -4.0823302620 -0.0003629200 0.0013597600 -0.0209960400 H 4.1978766023 2.0168767699 -4.0823302620 -0.0003629200 -0.0013597600 -0.0209960400 C 2.2709825840 2.9429928569 -4.1596275787 0.0063221600 0.0000000000 0.0086688000 H 1.6881091115 3.8691089440 -4.0823302620 0.0003629200 0.0013597600 -0.0209960400 H 1.6881091115 2.0168767699 -4.0823302620 0.0003629200 -0.0013597600 -0.0209960400 8 0.0000000000 0.0000000000 -3.0111051209 0.0000000000 0.0000000000 0.0020295300 Ag 4.4230353705 4.4435725006 -1.9222959768 -0.0028928100 -0.0043081100 -0.0052785100 Ag 4.4230353705 1.4424132015 -1.9222959768 -0.0028928100 0.0043081100 -0.0052785100 Ag 1.4629503375 4.4435725006 -1.9222959768 0.0028928100 -0.0043081100 -0.0052785100 Ag 1.4629503375 1.4424132015 -1.9222959768 0.0028928100 0.0043081100 -0.0052785100 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4629503375 1.4424132015 1.9222959768 0.0028928100 0.0043081100 0.0052785100 Ag 1.4629503375 4.4435725006 1.9222959768 0.0028928100 -0.0043081100 0.0052785100 Ag 4.4230353705 1.4424132015 1.9222959768 -0.0028928100 0.0043081100 0.0052785100 Ag 4.4230353705 4.4435725006 1.9222959768 -0.0028928100 -0.0043081100 0.0052785100 8 0.0000000000 0.0000000000 3.0111051209 0.0000000000 0.0000000000 -0.0020295300 C 3.6150031299 2.9429928569 4.1596275787 -0.0063221600 0.0000000000 -0.0086688000 H 4.1978766023 3.8691089440 4.0823302620 -0.0003629200 0.0013597600 0.0209960400 H 4.1978766023 2.0168767699 4.0823302620 -0.0003629200 -0.0013597600 0.0209960400 C 2.2709825840 2.9429928569 4.1596275787 0.0063221600 0.0000000000 -0.0086688000 H 1.6881091115 3.8691089440 4.0823302620 0.0003629200 0.0013597600 0.0209960400 H 1.6881091115 2.0168767699 4.0823302620 0.0003629200 -0.0013597600 0.0209960400 PRIMCOORD 16 26 1 C 3.6103229200 2.9429928569 -4.2097112302 -0.0042712200 0.0000000000 0.0087847600 H 4.1952193342 3.8489816961 -4.1229034661 0.0072179200 0.0198647400 -0.0202232000 H 4.1952193342 2.0370040178 -4.1229034661 0.0072179200 -0.0198647400 -0.0202232000 C 2.2756627938 2.9429928569 -4.2097112302 0.0042712200 0.0000000000 0.0087847600 H 1.6907663797 3.8489816961 -4.1229034661 -0.0072179200 0.0198647400 -0.0202232000 H 1.6907663797 2.0370040178 -4.1229034661 -0.0072179200 -0.0198647400 -0.0202232000 8 0.0000000000 0.0000000000 -3.0348706301 0.0000000000 0.0000000000 0.0092795200 Ag 4.4142004396 4.4373521233 -1.9320648366 0.0010417100 -0.0014591700 -0.0058043800 Ag 4.4142004396 1.4486335788 -1.9320648366 0.0010417100 0.0014591700 -0.0058043800 Ag 1.4717852684 4.4373521233 -1.9320648366 -0.0010417100 -0.0014591700 -0.0058043800 Ag 1.4717852684 1.4486335788 -1.9320648366 -0.0010417100 0.0014591700 -0.0058043800 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4717852684 1.4486335788 1.9320648366 -0.0010417100 0.0014591700 0.0058043800 Ag 1.4717852684 4.4373521233 1.9320648366 -0.0010417100 -0.0014591700 0.0058043800 Ag 4.4142004396 1.4486335788 1.9320648366 0.0010417100 0.0014591700 0.0058043800 Ag 4.4142004396 4.4373521233 1.9320648366 0.0010417100 -0.0014591700 0.0058043800 8 0.0000000000 0.0000000000 3.0348706301 0.0000000000 0.0000000000 -0.0092795200 C 3.6103229200 2.9429928569 4.2097112302 -0.0042712200 0.0000000000 -0.0087847600 H 4.1952193342 3.8489816961 4.1229034661 0.0072179200 0.0198647400 0.0202232000 H 4.1952193342 2.0370040178 4.1229034661 0.0072179200 -0.0198647400 0.0202232000 C 2.2756627938 2.9429928569 4.2097112302 0.0042712200 0.0000000000 -0.0087847600 H 1.6907663797 3.8489816961 4.1229034661 -0.0072179200 0.0198647400 0.0202232000 H 1.6907663797 2.0370040178 4.1229034661 -0.0072179200 -0.0198647400 0.0202232000 PRIMCOORD 17 26 1 C 3.6103353395 2.9429928569 -4.2606641413 -0.0048436600 0.0000000000 0.0080982800 H 4.1994477301 3.8451368014 -4.1838454552 0.0067665000 0.0222250300 -0.0180152300 H 4.1994477301 2.0408489125 -4.1838454552 0.0067665000 -0.0222250300 -0.0180152300 C 2.2756503744 2.9429928569 -4.2606641413 0.0048436600 0.0000000000 0.0080982800 H 1.6865379838 3.8451368014 -4.1838454552 -0.0067665000 0.0222250300 -0.0180152300 H 1.6865379838 2.0408489125 -4.1838454552 -0.0067665000 -0.0222250300 -0.0180152300 8 0.0000000000 0.0000000000 -3.0560238342 0.0000000000 0.0000000000 0.0141769400 Ag 4.4054454757 4.4301824841 -1.9467005449 0.0043654600 0.0009954400 -0.0059551700 Ag 4.4054454757 1.4558032180 -1.9467005449 0.0043654600 -0.0009954400 -0.0059551700 Ag 1.4805402323 4.4301824841 -1.9467005449 -0.0043654600 0.0009954400 -0.0059551700 Ag 1.4805402323 1.4558032180 -1.9467005449 -0.0043654600 -0.0009954400 -0.0059551700 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4805402323 1.4558032180 1.9467005449 -0.0043654600 -0.0009954400 0.0059551700 Ag 1.4805402323 4.4301824841 1.9467005449 -0.0043654600 0.0009954400 0.0059551700 Ag 4.4054454757 1.4558032180 1.9467005449 0.0043654600 -0.0009954400 0.0059551700 Ag 4.4054454757 4.4301824841 1.9467005449 0.0043654600 0.0009954400 0.0059551700 8 0.0000000000 0.0000000000 3.0560238342 0.0000000000 0.0000000000 -0.0141769400 C 3.6103353395 2.9429928569 4.2606641413 -0.0048436600 0.0000000000 -0.0080982800 H 4.1994477301 3.8451368014 4.1838454552 0.0067665000 0.0222250300 0.0180152300 H 4.1994477301 2.0408489125 4.1838454552 0.0067665000 -0.0222250300 0.0180152300 C 2.2756503744 2.9429928569 4.2606641413 0.0048436600 0.0000000000 -0.0080982800 H 1.6865379838 3.8451368014 4.1838454552 -0.0067665000 0.0222250300 0.0180152300 H 1.6865379838 2.0408489125 4.1838454552 -0.0067665000 -0.0222250300 0.0180152300 PRIMCOORD 18 26 1 C 3.6103674534 2.9429928569 -4.3924008134 -0.0059543300 0.0000000000 0.0052714400 H 4.2103800780 3.8351959885 -4.3414084661 0.0055834800 0.0283735100 -0.0128982100 H 4.2103800780 2.0507897254 -4.3414084661 0.0055834800 -0.0283735100 -0.0128982100 C 2.2756182605 2.9429928569 -4.3924008134 0.0059543300 0.0000000000 0.0052714400 H 1.6756056359 3.8351959885 -4.3414084661 -0.0055834800 0.0283735100 -0.0128982100 H 1.6756056359 2.0507897254 -4.3414084661 -0.0055834800 -0.0283735100 -0.0128982100 8 0.0000000000 0.0000000000 -3.1107145799 0.0000000000 0.0000000000 0.0235148200 Ag 4.3828098868 4.4116456759 -1.9845405692 0.0120874100 0.0072806300 -0.0069994700 Ag 4.3828098868 1.4743400262 -1.9845405692 0.0120874100 -0.0072806300 -0.0069994700 Ag 1.5031758212 4.4116456759 -1.9845405692 -0.0120874100 0.0072806300 -0.0069994700 Ag 1.5031758212 1.4743400262 -1.9845405692 -0.0120874100 -0.0072806300 -0.0069994700 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.5031758212 1.4743400262 1.9845405692 -0.0120874100 -0.0072806300 0.0069994700 Ag 1.5031758212 4.4116456759 1.9845405692 -0.0120874100 0.0072806300 0.0069994700 Ag 4.3828098868 1.4743400262 1.9845405692 0.0120874100 -0.0072806300 0.0069994700 Ag 4.3828098868 4.4116456759 1.9845405692 0.0120874100 0.0072806300 0.0069994700 8 0.0000000000 0.0000000000 3.1107145799 0.0000000000 0.0000000000 -0.0235148200 C 3.6103674534 2.9429928569 4.3924008134 -0.0059543300 0.0000000000 -0.0052714400 H 4.2103800780 3.8351959885 4.3414084661 0.0055834800 0.0283735100 0.0128982100 H 4.2103800780 2.0507897254 4.3414084661 0.0055834800 -0.0283735100 0.0128982100 C 2.2756182605 2.9429928569 4.3924008134 0.0059543300 0.0000000000 -0.0052714400 H 1.6756056359 3.8351959885 4.3414084661 -0.0055834800 0.0283735100 0.0128982100 H 1.6756056359 2.0507897254 4.3414084661 -0.0055834800 -0.0283735100 0.0128982100 PRIMCOORD 19 26 1 C 3.6130848292 2.9429928569 -4.5443172597 0.0051918200 0.0000000000 -0.0047729100 H 4.2290870794 3.8424590618 -4.5522633660 -0.0078228200 0.0133170600 -0.0042970700 H 4.2290870794 2.0435266521 -4.5522633660 -0.0078228200 -0.0133170600 -0.0042970700 C 2.2729008847 2.9429928569 -4.5443172597 -0.0051918200 0.0000000000 -0.0047729100 H 1.6568986345 3.8424590618 -4.5522633660 0.0078228200 0.0133170600 -0.0042970700 H 1.6568986345 2.0435266521 -4.5522633660 0.0078228200 -0.0133170600 -0.0042970700 8 0.0000000000 0.0000000000 -3.1432457656 0.0000000000 0.0000000000 0.0227611400 Ag 4.3759707220 4.4102049580 -2.0411004617 0.0121932000 0.0056911800 -0.0016092000 Ag 4.3759707220 1.4757807442 -2.0411004617 0.0121932000 -0.0056911800 -0.0016092000 Ag 1.5100149860 4.4102049580 -2.0411004617 -0.0121932000 0.0056911800 -0.0016092000 Ag 1.5100149860 1.4757807442 -2.0411004617 -0.0121932000 -0.0056911800 -0.0016092000 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.5100149860 1.4757807442 2.0411004617 -0.0121932000 -0.0056911800 0.0016092000 Ag 1.5100149860 4.4102049580 2.0411004617 -0.0121932000 0.0056911800 0.0016092000 Ag 4.3759707220 1.4757807442 2.0411004617 0.0121932000 -0.0056911800 0.0016092000 Ag 4.3759707220 4.4102049580 2.0411004617 0.0121932000 0.0056911800 0.0016092000 8 0.0000000000 0.0000000000 3.1432457656 0.0000000000 0.0000000000 -0.0227611400 C 3.6130848292 2.9429928569 4.5443172597 0.0051918200 0.0000000000 0.0047729100 H 4.2290870794 3.8424590618 4.5522633660 -0.0078228200 0.0133170600 0.0042970700 H 4.2290870794 2.0435266521 4.5522633660 -0.0078228200 -0.0133170600 0.0042970700 C 2.2729008847 2.9429928569 4.5443172597 -0.0051918200 0.0000000000 0.0047729100 H 1.6568986345 3.8424590618 4.5522633660 0.0078228200 0.0133170600 0.0042970700 H 1.6568986345 2.0435266521 4.5522633660 0.0078228200 -0.0133170600 0.0042970700 PRIMCOORD 20 26 1 C 3.6145755073 2.9429928569 -4.6276546602 0.0124525000 0.0000000000 -0.0115940900 H 4.2393492493 3.8464433954 -4.6679328529 -0.0157026000 0.0046350500 0.0008511400 H 4.2393492493 2.0395423185 -4.6679328529 -0.0157026000 -0.0046350500 0.0008511400 C 2.2714102065 2.9429928569 -4.6276546602 -0.0124525000 0.0000000000 -0.0115940900 H 1.6466364646 3.8464433954 -4.6679328529 0.0157026000 0.0046350500 0.0008511400 H 1.6466364646 2.0395423185 -4.6679328529 0.0157026000 -0.0046350500 0.0008511400 8 0.0000000000 0.0000000000 -3.1610915182 0.0000000000 0.0000000000 0.0224249100 Ag 4.3722189318 4.4094146176 -2.0721277493 0.0123475400 0.0051592500 0.0002190300 Ag 4.3722189318 1.4765710845 -2.0721277493 0.0123475400 -0.0051592500 0.0002190300 Ag 1.5137667762 4.4094146176 -2.0721277493 -0.0123475400 0.0051592500 0.0002190300 Ag 1.5137667762 1.4765710845 -2.0721277493 -0.0123475400 -0.0051592500 0.0002190300 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.5137667762 1.4765710845 2.0721277493 -0.0123475400 -0.0051592500 -0.0002190300 Ag 1.5137667762 4.4094146176 2.0721277493 -0.0123475400 0.0051592500 -0.0002190300 Ag 4.3722189318 1.4765710845 2.0721277493 0.0123475400 -0.0051592500 -0.0002190300 Ag 4.3722189318 4.4094146176 2.0721277493 0.0123475400 0.0051592500 -0.0002190300 8 0.0000000000 0.0000000000 3.1610915182 0.0000000000 0.0000000000 -0.0224249100 C 3.6145755073 2.9429928569 4.6276546602 0.0124525000 0.0000000000 0.0115940900 H 4.2393492493 3.8464433954 4.6679328529 -0.0157026000 0.0046350500 -0.0008511400 H 4.2393492493 2.0395423185 4.6679328529 -0.0157026000 -0.0046350500 -0.0008511400 C 2.2714102065 2.9429928569 4.6276546602 -0.0124525000 0.0000000000 0.0115940900 H 1.6466364646 3.8464433954 4.6679328529 0.0157026000 0.0046350500 -0.0008511400 H 1.6466364646 2.0395423185 4.6679328529 0.0157026000 -0.0046350500 -0.0008511400 PRIMCOORD 21 26 1 C 3.6160743140 2.9429928569 -4.7026884515 0.0026492400 0.0000000000 -0.0057795400 H 4.2390351615 3.8466093448 -4.7234075290 -0.0147527700 0.0055042000 -0.0010384900 H 4.2390351615 2.0393763691 -4.7234075290 -0.0147527700 -0.0055042000 -0.0010384900 C 2.2699113999 2.9429928569 -4.7026884515 -0.0026492400 0.0000000000 -0.0057795400 H 1.6469505524 3.8466093448 -4.7234075290 0.0147527700 0.0055042000 -0.0010384900 H 1.6469505524 2.0393763691 -4.7234075290 0.0147527700 -0.0055042000 -0.0010384900 8 0.0000000000 0.0000000000 -3.1585890278 0.0000000000 0.0000000000 0.0164043600 Ag 4.3855317595 4.4247864916 -2.0890458652 0.0069338800 -0.0011336200 0.0024145000 Ag 4.3855317595 1.4611992105 -2.0890458652 0.0069338800 0.0011336200 0.0024145000 Ag 1.5004539485 4.4247864916 -2.0890458652 -0.0069338800 -0.0011336200 0.0024145000 Ag 1.5004539485 1.4611992105 -2.0890458652 -0.0069338800 0.0011336200 0.0024145000 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.5004539485 1.4611992105 2.0890458652 -0.0069338800 0.0011336200 -0.0024145000 Ag 1.5004539485 4.4247864916 2.0890458652 -0.0069338800 -0.0011336200 -0.0024145000 Ag 4.3855317595 1.4611992105 2.0890458652 0.0069338800 0.0011336200 -0.0024145000 Ag 4.3855317595 4.4247864916 2.0890458652 0.0069338800 -0.0011336200 -0.0024145000 8 0.0000000000 0.0000000000 3.1585890278 0.0000000000 0.0000000000 -0.0164043600 C 3.6160743140 2.9429928569 4.7026884515 0.0026492400 0.0000000000 0.0057795400 H 4.2390351615 3.8466093448 4.7234075290 -0.0147527700 0.0055042000 0.0010384900 H 4.2390351615 2.0393763691 4.7234075290 -0.0147527700 -0.0055042000 0.0010384900 C 2.2699113999 2.9429928569 4.7026884515 -0.0026492400 0.0000000000 0.0057795400 H 1.6469505524 3.8466093448 4.7234075290 0.0147527700 0.0055042000 0.0010384900 H 1.6469505524 2.0393763691 4.7234075290 0.0147527700 -0.0055042000 0.0010384900 PRIMCOORD 22 26 1 C 3.6171335437 2.9429928569 -4.7557158714 -0.0038084600 0.0000000000 -0.0026796100 H 4.2388131952 3.8467266289 -4.7626122479 -0.0142518600 0.0059575200 -0.0023705900 H 4.2388131952 2.0392590850 -4.7626122479 -0.0142518600 -0.0059575200 -0.0023705900 C 2.2688521702 2.9429928569 -4.7557158714 0.0038084600 0.0000000000 -0.0026796100 H 1.6471725187 3.8467266289 -4.7626122479 0.0142518600 0.0059575200 -0.0023705900 H 1.6471725187 2.0392590850 -4.7626122479 0.0142518600 -0.0059575200 -0.0023705900 8 0.0000000000 0.0000000000 -3.1568204783 0.0000000000 0.0000000000 0.0115292500 Ag 4.3949401205 4.4356500089 -2.1010021328 0.0028455300 -0.0055422300 0.0042855800 Ag 4.3949401205 1.4503356933 -2.1010021328 0.0028455300 0.0055422300 0.0042855800 Ag 1.4910455875 4.4356500089 -2.1010021328 -0.0028455300 -0.0055422300 0.0042855800 Ag 1.4910455875 1.4503356933 -2.1010021328 -0.0028455300 0.0055422300 0.0042855800 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4910455875 1.4503356933 2.1010021328 -0.0028455300 0.0055422300 -0.0042855800 Ag 1.4910455875 4.4356500089 2.1010021328 -0.0028455300 -0.0055422300 -0.0042855800 Ag 4.3949401205 1.4503356933 2.1010021328 0.0028455300 0.0055422300 -0.0042855800 Ag 4.3949401205 4.4356500089 2.1010021328 0.0028455300 -0.0055422300 -0.0042855800 8 0.0000000000 0.0000000000 3.1568204783 0.0000000000 0.0000000000 -0.0115292500 C 3.6171335437 2.9429928569 4.7557158714 -0.0038084600 0.0000000000 0.0026796100 H 4.2388131952 3.8467266289 4.7626122479 -0.0142518600 0.0059575200 0.0023705900 H 4.2388131952 2.0392590850 4.7626122479 -0.0142518600 -0.0059575200 0.0023705900 C 2.2688521702 2.9429928569 4.7557158714 0.0038084600 0.0000000000 0.0026796100 H 1.6471725187 3.8467266289 4.7626122479 0.0142518600 0.0059575200 0.0023705900 H 1.6471725187 2.0392590850 4.7626122479 0.0142518600 -0.0059575200 0.0023705900 PRIMCOORD 23 26 1 C 3.6169335262 2.9429928569 -4.8121071364 -0.0057004900 0.0000000000 -0.0026810300 H 4.2298548764 3.8525316677 -4.8232672365 -0.0122108600 0.0036552100 -0.0014721700 H 4.2298548764 2.0334540461 -4.8232672365 -0.0122108600 -0.0036552100 -0.0014721700 C 2.2690521876 2.9429928569 -4.8121071364 0.0057004900 0.0000000000 -0.0026810300 H 1.6561308375 3.8525316677 -4.8232672365 0.0122108600 0.0036552100 -0.0014721700 H 1.6561308375 2.0334540461 -4.8232672365 0.0122108600 -0.0036552100 -0.0014721700 8 0.0000000000 0.0000000000 -3.1506335275 0.0000000000 0.0000000000 0.0073659300 Ag 4.4014956222 4.4369880752 -2.1145777579 -0.0000892000 -0.0073757600 0.0063617400 Ag 4.4014956222 1.4489976269 -2.1145777579 -0.0000892000 0.0073757600 0.0063617400 Ag 1.4844900858 4.4369880752 -2.1145777579 0.0000892000 -0.0073757600 0.0063617400 Ag 1.4844900858 1.4489976269 -2.1145777579 0.0000892000 0.0073757600 0.0063617400 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4844900858 1.4489976269 2.1145777579 0.0000892000 0.0073757600 -0.0063617400 Ag 1.4844900858 4.4369880752 2.1145777579 0.0000892000 -0.0073757600 -0.0063617400 Ag 4.4014956222 1.4489976269 2.1145777579 -0.0000892000 0.0073757600 -0.0063617400 Ag 4.4014956222 4.4369880752 2.1145777579 -0.0000892000 -0.0073757600 -0.0063617400 8 0.0000000000 0.0000000000 3.1506335275 0.0000000000 0.0000000000 -0.0073659300 C 3.6169335262 2.9429928569 4.8121071364 -0.0057004900 0.0000000000 0.0026810300 H 4.2298548764 3.8525316677 4.8232672365 -0.0122108600 0.0036552100 0.0014721700 H 4.2298548764 2.0334540461 4.8232672365 -0.0122108600 -0.0036552100 0.0014721700 C 2.2690521876 2.9429928569 4.8121071364 0.0057004900 0.0000000000 0.0026810300 H 1.6561308375 3.8525316677 4.8232672365 0.0122108600 0.0036552100 0.0014721700 H 1.6561308375 2.0334540461 4.8232672365 0.0122108600 -0.0036552100 0.0014721700 PRIMCOORD 24 26 1 C 3.6166969039 2.9429928569 -4.8788196018 -0.0078349800 0.0000000000 -0.0039045800 H 4.2192569289 3.8593991971 -4.8950238009 -0.0098201400 0.0008910400 -0.0004813400 H 4.2192569289 2.0265865168 -4.8950238009 -0.0098201400 -0.0008910400 -0.0004813400 C 2.2692888100 2.9429928569 -4.8788196018 0.0078349800 0.0000000000 -0.0039045800 H 1.6667287850 3.8593991971 -4.8950238009 0.0098201400 0.0008910400 -0.0004813400 H 1.6667287850 2.0265865168 -4.8950238009 0.0098201400 -0.0008910400 -0.0004813400 8 0.0000000000 0.0000000000 -3.1433141901 0.0000000000 0.0000000000 0.0020889900 Ag 4.4092509696 4.4385710397 -2.1306381094 -0.0036789800 -0.0096102300 0.0090828200 Ag 4.4092509696 1.4474146624 -2.1306381094 -0.0036789800 0.0096102300 0.0090828200 Ag 1.4767347384 4.4385710397 -2.1306381094 0.0036789800 -0.0096102300 0.0090828200 Ag 1.4767347384 1.4474146624 -2.1306381094 0.0036789800 0.0096102300 0.0090828200 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4767347384 1.4474146624 2.1306381094 0.0036789800 0.0096102300 -0.0090828200 Ag 1.4767347384 4.4385710397 2.1306381094 0.0036789800 -0.0096102300 -0.0090828200 Ag 4.4092509696 1.4474146624 2.1306381094 -0.0036789800 0.0096102300 -0.0090828200 Ag 4.4092509696 4.4385710397 2.1306381094 -0.0036789800 -0.0096102300 -0.0090828200 8 0.0000000000 0.0000000000 3.1433141901 0.0000000000 0.0000000000 -0.0020889900 C 3.6166969039 2.9429928569 4.8788196018 -0.0078349800 0.0000000000 0.0039045800 H 4.2192569289 3.8593991971 4.8950238009 -0.0098201400 0.0008910400 0.0004813400 H 4.2192569289 2.0265865168 4.8950238009 -0.0098201400 -0.0008910400 0.0004813400 C 2.2692888100 2.9429928569 4.8788196018 0.0078349800 0.0000000000 0.0039045800 H 1.6667287850 3.8593991971 4.8950238009 0.0098201400 0.0008910400 0.0004813400 H 1.6667287850 2.0265865168 4.8950238009 0.0098201400 -0.0008910400 0.0004813400 PRIMCOORD 25 26 1 C 3.6138190526 2.9429928569 -4.9294337098 -0.0034272400 0.0000000000 -0.0023257400 H 4.1971977602 3.8697215983 -4.9419683341 -0.0036881400 -0.0015728600 -0.0007647300 H 4.1971977602 2.0162641156 -4.9419683341 -0.0036881400 0.0015728600 -0.0007647300 C 2.2721666613 2.9429928569 -4.9294337098 0.0034272400 0.0000000000 -0.0023257400 H 1.6887879537 3.8697215983 -4.9419683341 0.0036881400 -0.0015728600 -0.0007647300 H 1.6887879537 2.0162641156 -4.9419683341 0.0036881400 0.0015728600 -0.0007647300 8 0.0000000000 0.0000000000 -3.1365820148 0.0000000000 0.0000000000 0.0036574100 Ag 4.4094197090 4.4242360110 -2.1318144996 -0.0028343300 -0.0059588800 0.0086098500 Ag 4.4094197090 1.4617496911 -2.1318144996 -0.0028343300 0.0059588800 0.0086098500 Ag 1.4765659990 4.4242360110 -2.1318144996 0.0028343300 -0.0059588800 0.0086098500 Ag 1.4765659990 1.4617496911 -2.1318144996 0.0028343300 0.0059588800 0.0086098500 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4765659990 1.4617496911 2.1318144996 0.0028343300 0.0059588800 -0.0086098500 Ag 1.4765659990 4.4242360110 2.1318144996 0.0028343300 -0.0059588800 -0.0086098500 Ag 4.4094197090 1.4617496911 2.1318144996 -0.0028343300 0.0059588800 -0.0086098500 Ag 4.4094197090 4.4242360110 2.1318144996 -0.0028343300 -0.0059588800 -0.0086098500 8 0.0000000000 0.0000000000 3.1365820148 0.0000000000 0.0000000000 -0.0036574100 C 3.6138190526 2.9429928569 4.9294337098 -0.0034272400 0.0000000000 0.0023257400 H 4.1971977602 3.8697215983 4.9419683341 -0.0036881400 -0.0015728600 0.0007647300 H 4.1971977602 2.0162641156 4.9419683341 -0.0036881400 0.0015728600 0.0007647300 C 2.2721666613 2.9429928569 4.9294337098 0.0034272400 0.0000000000 0.0023257400 H 1.6887879537 3.8697215983 4.9419683341 0.0036881400 -0.0015728600 0.0007647300 H 1.6887879537 2.0162641156 4.9419683341 0.0036881400 0.0015728600 0.0007647300 PRIMCOORD 26 26 1 C 3.6108541771 2.9429928569 -4.9815783795 0.0020452700 0.0000000000 -0.0015105300 H 4.1744715271 3.8803561390 -4.9903324546 0.0024863800 -0.0042454500 -0.0010383300 H 4.1744715271 2.0056295749 -4.9903324546 0.0024863800 0.0042454500 -0.0010383300 C 2.2751315368 2.9429928569 -4.9815783795 -0.0020452700 0.0000000000 -0.0015105300 H 1.7115141867 3.8803561390 -4.9903324546 -0.0024863800 -0.0042454500 -0.0010383300 H 1.7115141867 2.0056295749 -4.9903324546 -0.0024863800 0.0042454500 -0.0010383300 8 0.0000000000 0.0000000000 -3.1296462611 0.0000000000 0.0000000000 0.0052698500 Ag 4.4095935515 4.4094674914 -2.1330264706 -0.0019781200 -0.0020232800 0.0081250800 Ag 4.4095935515 1.4765182107 -2.1330264706 -0.0019781200 0.0020232800 0.0081250800 Ag 1.4763921565 4.4094674914 -2.1330264706 0.0019781200 -0.0020232800 0.0081250800 Ag 1.4763921565 1.4765182107 -2.1330264706 0.0019781200 0.0020232800 0.0081250800 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4763921565 1.4765182107 2.1330264706 0.0019781200 0.0020232800 -0.0081250800 Ag 1.4763921565 4.4094674914 2.1330264706 0.0019781200 -0.0020232800 -0.0081250800 Ag 4.4095935515 1.4765182107 2.1330264706 -0.0019781200 0.0020232800 -0.0081250800 Ag 4.4095935515 4.4094674914 2.1330264706 -0.0019781200 -0.0020232800 -0.0081250800 8 0.0000000000 0.0000000000 3.1296462611 0.0000000000 0.0000000000 -0.0052698500 C 3.6108541771 2.9429928569 4.9815783795 0.0020452700 0.0000000000 0.0015105300 H 4.1744715271 3.8803561390 4.9903324546 0.0024863800 -0.0042454500 0.0010383300 H 4.1744715271 2.0056295749 4.9903324546 0.0024863800 0.0042454500 0.0010383300 C 2.2751315368 2.9429928569 4.9815783795 -0.0020452700 0.0000000000 0.0015105300 H 1.7115141867 3.8803561390 4.9903324546 -0.0024863800 -0.0042454500 0.0010383300 H 1.7115141867 2.0056295749 4.9903324546 -0.0024863800 0.0042454500 0.0010383300 PRIMCOORD 27 26 1 C 3.6107473171 2.9429928569 -4.9706239827 0.0006083800 0.0000000000 -0.0010482000 H 4.1744128969 3.8781540221 -4.9766977048 0.0034639700 -0.0018989100 -0.0014577800 H 4.1744128969 2.0078316918 -4.9766977048 0.0034639700 0.0018989100 -0.0014577800 C 2.2752383968 2.9429928569 -4.9706239827 -0.0006083800 0.0000000000 -0.0010482000 H 1.7115728170 3.8781540221 -4.9766977048 -0.0034639700 -0.0018989100 -0.0014577800 H 1.7115728170 2.0078316918 -4.9766977048 -0.0034639700 0.0018989100 -0.0014577800 8 0.0000000000 0.0000000000 -3.1270074101 0.0000000000 0.0000000000 0.0073257600 Ag 4.4066260920 4.4053553142 -2.1241385128 -0.0004872500 -0.0002992300 0.0065702800 Ag 4.4066260920 1.4806303879 -2.1241385128 -0.0004872500 0.0002992300 0.0065702800 Ag 1.4793596160 4.4053553142 -2.1241385128 0.0004872500 -0.0002992300 0.0065702800 Ag 1.4793596160 1.4806303879 -2.1241385128 0.0004872500 0.0002992300 0.0065702800 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4793596160 1.4806303879 2.1241385128 0.0004872500 0.0002992300 -0.0065702800 Ag 1.4793596160 4.4053553142 2.1241385128 0.0004872500 -0.0002992300 -0.0065702800 Ag 4.4066260920 1.4806303879 2.1241385128 -0.0004872500 0.0002992300 -0.0065702800 Ag 4.4066260920 4.4053553142 2.1241385128 -0.0004872500 -0.0002992300 -0.0065702800 8 0.0000000000 0.0000000000 3.1270074101 0.0000000000 0.0000000000 -0.0073257600 C 3.6107473171 2.9429928569 4.9706239827 0.0006083800 0.0000000000 0.0010482000 H 4.1744128969 3.8781540221 4.9766977048 0.0034639700 -0.0018989100 0.0014577800 H 4.1744128969 2.0078316918 4.9766977048 0.0034639700 0.0018989100 0.0014577800 C 2.2752383968 2.9429928569 4.9706239827 -0.0006083800 0.0000000000 0.0010482000 H 1.7115728170 3.8781540221 4.9766977048 -0.0034639700 -0.0018989100 0.0014577800 H 1.7115728170 2.0078316918 4.9766977048 -0.0034639700 0.0018989100 0.0014577800 PRIMCOORD 28 26 1 C 3.6105733510 2.9429928569 -4.9527902316 -0.0018748200 0.0000000000 -0.0000599200 H 4.1743174498 3.8745689700 -4.9545003391 0.0050396300 0.0018621200 -0.0020544500 H 4.1743174498 2.0114167439 -4.9545003391 0.0050396300 -0.0018621200 -0.0020544500 C 2.2754123629 2.9429928569 -4.9527902316 0.0018748200 0.0000000000 -0.0000599200 H 1.7116682641 3.8745689700 -4.9545003391 -0.0050396300 0.0018621200 -0.0020544500 H 1.7116682641 2.0114167439 -4.9545003391 -0.0050396300 -0.0018621200 -0.0020544500 8 0.0000000000 0.0000000000 -3.1227113666 0.0000000000 0.0000000000 0.0105267800 Ag 4.4017950715 4.3986606856 -2.1096689247 0.0018406100 0.0024909000 0.0040751000 Ag 4.4017950715 1.4873250165 -2.1096689247 0.0018406100 -0.0024909000 0.0040751000 Ag 1.4841906365 4.3986606856 -2.1096689247 -0.0018406100 0.0024909000 0.0040751000 Ag 1.4841906365 1.4873250165 -2.1096689247 -0.0018406100 -0.0024909000 0.0040751000 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4841906365 1.4873250165 2.1096689247 -0.0018406100 -0.0024909000 -0.0040751000 Ag 1.4841906365 4.3986606856 2.1096689247 -0.0018406100 0.0024909000 -0.0040751000 Ag 4.4017950715 1.4873250165 2.1096689247 0.0018406100 -0.0024909000 -0.0040751000 Ag 4.4017950715 4.3986606856 2.1096689247 0.0018406100 0.0024909000 -0.0040751000 8 0.0000000000 0.0000000000 3.1227113666 0.0000000000 0.0000000000 -0.0105267800 C 3.6105733510 2.9429928569 4.9527902316 -0.0018748200 0.0000000000 0.0000599200 H 4.1743174498 3.8745689700 4.9545003391 0.0050396300 0.0018621200 0.0020544500 H 4.1743174498 2.0114167439 4.9545003391 0.0050396300 -0.0018621200 0.0020544500 C 2.2754123629 2.9429928569 4.9527902316 0.0018748200 0.0000000000 0.0000599200 H 1.7116682641 3.8745689700 4.9545003391 -0.0050396300 0.0018621200 0.0020544500 H 1.7116682641 2.0114167439 4.9545003391 -0.0050396300 -0.0018621200 0.0020544500 PRIMCOORD 29 26 1 C 3.6105024308 2.9429928569 -4.9736694137 -0.0010894600 0.0000000000 -0.0001469800 H 4.1751085671 3.8746597378 -4.9759438929 0.0044787300 0.0012859900 -0.0017778400 H 4.1751085671 2.0113259761 -4.9759438929 0.0044787300 -0.0012859900 -0.0017778400 C 2.2754832831 2.9429928569 -4.9736694137 0.0010894600 0.0000000000 -0.0001469800 H 1.7108771468 3.8746597378 -4.9759438929 -0.0044787300 0.0012859900 -0.0017778400 H 1.7108771468 2.0113259761 -4.9759438929 -0.0044787300 -0.0012859900 -0.0017778400 8 0.0000000000 0.0000000000 -3.1143858381 0.0000000000 0.0000000000 0.0095962800 Ag 4.4029531740 4.3984024499 -2.1072116681 0.0012398300 0.0021625800 0.0038742200 Ag 4.4029531740 1.4875832522 -2.1072116681 0.0012398300 -0.0021625800 0.0038742200 Ag 1.4830325340 4.3984024499 -2.1072116681 -0.0012398300 0.0021625800 0.0038742200 Ag 1.4830325340 1.4875832522 -2.1072116681 -0.0012398300 -0.0021625800 0.0038742200 Ag 2.9429928569 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 2.9429928569 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 Ag 1.4830325340 1.4875832522 2.1072116681 -0.0012398300 -0.0021625800 -0.0038742200 Ag 1.4830325340 4.3984024499 2.1072116681 -0.0012398300 0.0021625800 -0.0038742200 Ag 4.4029531740 1.4875832522 2.1072116681 0.0012398300 -0.0021625800 -0.0038742200 Ag 4.4029531740 4.3984024499 2.1072116681 0.0012398300 0.0021625800 -0.0038742200 8 0.0000000000 0.0000000000 3.1143858381 0.0000000000 0.0000000000 -0.0095962800 C 3.6105024308 2.9429928569 4.9736694137 -0.0010894600 0.0000000000 0.0001469800 H 4.1751085671 3.8746597378 4.9759438929 0.0044787300 0.0012859900 0.0017778400 H 4.1751085671 2.0113259761 4.9759438929 0.0044787300 -0.0012859900 0.0017778400 C 2.2754832831 2.9429928569 4.9736694137 0.0010894600 0.0000000000 0.0001469800 H 1.7108771468 3.8746597378 4.9759438929 -0.0044787300 0.0012859900 0.0017778400 H 1.7108771468 2.0113259761 4.9759438929 -0.0044787300 -0.0012859900 0.0017778400 xcrysden-1.6.2/examples/XSF_Files/oxirane_homo.xsf.gz0000644000175000017500000212113411712736221021311 0ustar tonetone‹—·B>oxirane_homo.xsf„½ËŽ-Ùr$6?_‘€ÆYXïÇlB-hµÆüÿ¿h7÷eæQ€&@àFeæ>;"|ùÓÜìç_þçþ_ÿÏŸŸŸõãÿWþZ§ÔRíþ–¿ÆY£®øïÅÿÏ~³ÆoÖ¿j›Ój¿yV]»ÆoÞÖfÿÛßüýü¦þõøWâŸ>Çþÿÿ×íoË׿§}¾}ÉѶþõÑæÿö7?¿yø›û”ÖË»÷RÆÿø×ÿõïÿÿû¿þõ¿ÿçû?ÿëßþåþË¿ÿÿø·ÿêÿö§ÿÛýçÿø×ÿøŸÿòßÿëÿ¨íÏçGÿõï÷ü·ÿ÷_ÿþó3ÖÏ?Óná·ÿ5Æê÷Ìÿ}{;uôõýïðÆÿ/ûš³ÕxLøç¯:W_£\ÛÜÍQö¹x¨ñW¸ù¿Ú­µüý[.Ö=õÆEû«Þ~u±O?#.ìß_gö¸ÙÃÙþöqó¯rûÜñ£ù×½öyqa߯×ú.ö_ÇžÙû„ó×.³½‹k÷v×yW퉶«íý쮋qZÓEÛþ6>aÏâ?ñ϶ûíë}Üþk÷zõ…Ú™¥ð.Vé«êfÍž®¾êZþLîϯ=­2øíì=ÔaOÓïwüu·=ë¸X­ZÞ³û=¸‰Ïî÷þUíÚ¼8çôý>÷7Öô»øõû[M½¿›µ?Âi¨ü„^Æmü‡fo}¼Û­Ÿà_h÷Á¯:ÿ:eî®ï]μ(»íwÑÿêuÅØÇ5û¸úŠ]”SÏ»Y³š2{ç…Ùàmz§±ùXÍœv¡ ÕRhj0n»u¾Šk'j¥ õ1ôþ`’2»¡¶i6۾Тײî¢m´¶¶.z/³ýÛr§lhÌí_5.ìodwÃŒ.ú<½ê³ÍhŠ>®ìÚŸóë4šZ÷.Þì>ƒGÄþæ4>ÕŠ7Öæ{àþë ÓÅû3[ôÒëàÍþâf¯¿t7”¶æ,¼èvhG|;»c^Y—Yñíº˜åÝþèÎzta.>?»´•WNé“&9Í  ­°Þ}ô½íÍNÙÝž}Êî̇\«={â‡Öuíþ*/Ú:COhW=!3¨ÙoÓcµÇµm¨WF³¡aÆù*ÌNÊ¥ õnßâãlJ—9Ô½ó=ÛKº°›˜2¨uoÓOÌGž4‡ »‰Ù±#\óâîÉ?ºÓìXŸ0zÉÏ^æÒXû­úQµè8ijöb㡸¶0!nñb6=ÈR&³½ {ÞS5Ëš:ÁfÕò<ãÖ#ƒÚæ¼dg·07s³í™Ý_íU¦v︲®Û,ÆêjM‹\kõü8;/EöÙ[éú£ÚïX´;K;ÒûÙ#^…v7ë=K7ÛjçÍš»£4ú¸jOò ÙލôÇ£Üi[ñaž°pJ–(>XȽ…nÈÜXK74o 6d¦Rôjk9C/}®Vd7,×/,d.]ŒÛ }—¹csõ›?²Óܦ.ö½²»y.Õ>¡î©³OާŽzö §ãô"£¶PßÅúø$üMYcðÙ™¿,{,jO”kšÍ\ãȺÌÜû¹Õ´¶ÛâÅX%N\Äž:ÇàìTÌš•nÈ.ì`å'XøÓ¯™éWWÆ|ÏVXÆ–uÍyûýØÝ'ßÅï}Ì«íï~³–ÔE·êòq½]¦Ýž‰Å¿g]gi.:¥j6­”ÅÜÐ{vxúu,YM[½ÈjæhïpðÎôjwIƒwvн²û^s7>h(æ>ËŽŸ„í[ÄÓ¦¥…øIçE»­l}\G¦¶Ö.t…öøûiŠ {•%ï׿¨ï³·Y×ä3±—´Ï‹õ8¦g/gsxÝÞ:­«¯öqJ–¶ËºýßæÅç>…;7Ë{æ€È1iCv{>wü‹;ŸÏçâ'võ ÍüUÕÇõ¢Ã¿Ô»ŒÚ’ã!+´hºôU·å¯º§Nù;{¦—Æj>nÍõ"£9›Ûú¦©™ßx)”™š¹zÿ‡`]ÈmÏ »fPfü´.3¨ofc7ž™‘#'Ræ;¦þþ,a9iCûV½t3ð*Û0Ûšï ÕŠ«˜Þ-ÙÕ¨ýe¸(QsÄïM‹»ü¸k68e„U¿ÖSæÉoW™*{Æy¯n©Íó’G;=GÖeyà¡u•Öe¾‹ 1r¨Õ2”YžÛø2íü½Cû¬röj„Öíiœ•Н„±‹f9ÊåÅhõ¥pwå…E`Z®=˼·ŒÕ|i—ᵌ (Ñ¢Ú Ûß妛ÝQsD ­eÓ³Ú² ó¸ÝÞïYÝSw45«9%{BwŒ#ƒº%s#«0§Ü•¥ŸM¨¡¢æ…ù†Eï`wÑ^béÙ±Ý`K³YKe~ƒ^mZ ôlÚÍÖÉ›x¬ï8ÛE›—ÑkÀr»L²ÛÙ–åÎs¶Ò³ÃSïÖeUgQÕiÆz>Îݽ²j©Vft={ rPv ›Ö…ïÀüy—ÙªÊ(Åwwwd0´*s^¾s«Rè¨aC£¼Pí%èzwa¯Ì¼Õܼ07ô¼6~Ò?ÛòE kCg^uÝ’YTõxFýÌ}(Û³4þ*8×öœ»[²ãLã,‹VeaÞŸ Sk•Ež—DŸTIJQÔéQ±GnÔÚÍWfEÙÒË,³¤³©–èÊ ÌÅÙAô~Þ«(ï×^3mcÁ7—÷„ð#«‚ÿÈì‰éº=ýÕ‡ÌØ^óʌ̪#¥îÃb\Ñ·³ªîex’v°Ü–Ó»Û‡½ôÓOpêU ‹Á/¹ï8Jž¦¶Qº Í~ÆkpXvlu]Sz¶î™z–î7¦á0ê^eCu½t6Âa˜ÄãÚ eö¸,TlýÄÜìKR°î¹2¼nn»ÑÔì;ÐáÁc®tq_O.ÎJXZ\JÏúÁÂìÑ…½ˆ£šÃžpÏD©_t”ÜUÿTä¡îeNŸdñÊÞ3ófœ²Ûe)µM¶¬Ð´W{{ºe ƒ–cÒÀ·¯Jwüƒ6Í\ò]Ó~ÔØgå÷Vº`Å|œLÈþûX ÃrÑcµÊI^Eu†2+a.£yÙ›%ÌŒJ'\¡l騹‘Ë 4ú2'Xw)M5gÕô*–Å?¦q Æz¿!oÉw™ 2¶¢±Yé»ìq™£ž¼˜VÎðfQs,¦Zö K=i¬«¤_¬c¶ŒºfjJð¦=ðL㬀ÙzBV¶VEÐÝYFy‹dO¾?ÜmrJèKˆ¬þ/ʼíþ¶ѶD©É£X~Ƽ wÁÀm–²pb{ì+¼W†ªßêX}•cÙÐZú¸jÁ^oÉ|óPdÜh·ÿÍd{ëÔ/ñ—ÆY¼²'Ì£„ºnFsvE‘™éò¾¦å˜é,ý\|\hc+“´,NGión™ ŒuúÇy/fΣ +{Z\\s—ÈBÎú1Ö~îÐ[j…=OÂjÕ·C1ònö 9¦#³§jöÉD Wëè÷Ðó2ÉqNª-z5 0wy5sà‹×ÑMÝŠï‡Ùñ+ƒK»‰®[j‡Ý÷P‡EzG)ðÌAN•/âš•J‹æ`þä2”t%yN¯y¨Ùóé[=³øÀKÙ°âÛɺ,·¬Yëá²Búªcåè§+YËû8oD ZÑ~‰ÆÓŠš¿E¿Ò4û9æ½üóO°¤‚F7?Þxö‘'ÓŠà„i¶:yaO«è'øçæ¾êæc°šÌobýy&éOy"QjSæmîå¾ Ž¸6Ê6¢}Z¦/…Šnj §»¢Á¿yþ.cÚ'¦ ²\ó‹¯%mAs@‡ö…²wœãüÅEÙý]àêÖ¿jÎ4ï¹´*?„œ@îØÎmÃÜìz6äæ°¢)âvÂÔ<±ÂiwýhÎ÷ÒQnYÅwdw߯a~v³Z®V#ôg8ÁÑ ^^µØkÚ¼¸«Ñî0»M?1Òž#Ãá©îÏßÇY1¯g·çÞ7.6<ð–W»öþ”/š¿|2¬k eõþôypÔ÷æEM‡ÑNýŠèaä.ÚfÏ}‡ÑUÄÚóÞª ,³Y².‹î7‹<‹î'ÃÍUôÂ9å$÷W&Ð|’½ uŠðP—ΟeZW!Á|Òlºè³eä˜Q·ú³³§PÒ;ŒáYïóg·+g30Œ mÔ×ÍYþŒßø/Ì¡–žËŠþ÷þìñ[‘øÞ\a‰)áŠCÛÒ>ÑAhrde=Sûñ¦yyÆ ³1÷²uý®Ê³kAî›ã.2̸tçf[2Vä•»ËðöŽ©;<{\yk)¬ ÐX;EíÏÑÇ¡9 ¶F¯7îbÜ«œ ÷]ejVÇÕ4µýE÷wöúé7~‘*³Œ‚©O¿Ä‚ÀÎnÜ,›¹ƒYa=G¯Ö’õª…ŒZ£áµxKá†NZÍ.‡ç¯¢+:fÔU¿gùçRd´bw/`«Þ•;4´Sÿf*iÙK“A‹)ƒ6d©ÉP âfLòb†9cvW<Éœo8Ò݇Ϙ×õ©?ªÏçNoK[Ú+Gf%#ãš%è#ÚFëOàbD·t£?£ø>Þ³‰‹ŸVêt^XÖß·Ã3~WË‹ ÕÓZ¶Ï˜i_È*´C¿hgb*kÚx(i]ö->¡Ù¢›·<¿ˆ‹RG¥^>.®Eã0Nf믂tS3'RôÏZލ>åôŸöõìšJ9K9¯»˜Gnõ*Z¹çÊP¾OuÝÚyþ0k‰‰ƒÿÈFÆÕ]½¥gð¡àרKÃübù\á/ê‡ú’dãL¿VÛ{™^{…Û1” ›žQÜ4 ¸Ÿ‡²T¤®‚}01Þ?„ŸÌC#(## ïïÛözäÍh滀߱z8Ó2³í–ÁŽ¿ʺŔÂ`É̳˜3ÅÀ8².ýĬ½,^˜E®ö'žþIóè•>®ö[`ðÙ‰ ²º ëá™Ë]º°êôÊPúŽ>ëzÅM¦Ÿ­µÊTÞ!ªSÿ‘=Ÿ•Žì–¥T MIu2˃ÚEøÛ1k‰[²àu<Ô]æ0ìëÉPæ®ãÙYn‹n€Û†ÕJ¾k!F•Éß³S?e’@¢)œÞׯ˜øB§ÍŒ`o½ó,•ÎV>0 ƒÝ=÷z½wÊw!UV)0$/R`ó’YäÁ?rU²33Êšjà\ d/êúéAGñÝ’#U/Y˜ªö®;Îêfᔾc²u¬ú[ïýyõ=ߡŭ—¯„çéýʾ—F¸áh(hΖˆ)þÀÍŽ‡~4ìbðîKý²0”!ØfS¶nï•ßÎÇ›1'zÑùØWYlbF]õ“;^¶‡ ·£¿8£f¬ïgN’îªÁ¡ßüV2è³­$ãiƯ½ ‘±¬“f£÷‚ž R^´“ØhÌŒÚe„æ>»9Å— Ïj ž9 Y¬u²…w¬| õéB„ôÒiwþÄý¹AY‚±²›3N§±Úi|f?êg©Ü„5›s°¢ùÜÖ[£9¼R_—n‡lÓ,[`æm'øÖ—*£.7ç/ó@j9tÌ,¸NþÞÊ®ÐÄ•uæ¦O@kµ-åävs=ÍyešÍŠÈáÑ˼>ãß…I6ýÄÞË–mÔûôÁÄz}Fý0Ÿ…GæÖ•¬Y4‹¦f‰äÔ¯ÙÍVDH•OŸiPe<ƒšh€³ï`Ò µŽoßM(ÿé»nzWÐ<«ì4µ>².°ôsgGÐ.*ögÇó/«¯ú¤Ùž‘H1.=&ÊÛ€ÈÏ@TžùL¼€ÛÐȸ3fOC6×0y«ì/"nÇ”)Êw‹4<Äž×UöºëÑ…½ò3d]„+”­2Øq±|Õ„°ØSÇ’ÕØË>²ÅÙ’- y »©èŽ£r˾[ö,¼³¼…CWÛ0¢èÁ‡u™³™†oeM  ©× ðTr3€Úû›Ñ%uª7êÌñZ@ÃËÄøQûðáˆU:™‘Yî¯ÚéKï¯fñ9ûrJ¶·¹í,òÖl²®ö*Ú05³ýÄJ7o­ŽC˜%E~v+Ûg?Œ­0‰®´zifÄU6m^ÿî4‡Ýè_6°U¹­ùf>ýã}ÈË_CxÊÛU uìû빡«µÙ5@µ’JÖeuý`û˜‹ÉÌ{øÖF£A™»â$É̤ÝÙ²3ö’°‹¬÷f‡®»­¥¼ROßœˆì“þèçYÀË]˜³å绑A7[\x³Jµ,ÈÕ²•(Yeâ.`D ÝMŸuí¨|ú̉ ZŠêÆÏ®5æ‡Q©–Yå7¬ØŒŒXx`uK tVÔëQÇÅŽùöûÉ|Ž¿™4ë}>§ë£·›!ïžÝe]Vü1ïÚøÉPz=˹ÙÍiöG X¥žž­ãM–x\k2ù¸¨‚Ù>C³øõpÿÄ`w02"ª/‰ŽØÃæl÷.CŽE2¨^û æ¡,ïZ2¨{GÖåØEÒ)Gu²”r³I]û–©Yèɳ1UìåmV„o~ÍõðîhJ*ï(¬ÒгQdœ˜êqíRå»ì5¯u­YGZW-Öeñå*«¥ìƒ˜Ù(öìq7oÖ¬«^öLñþbÞól¨Œ´®·¾ëÆZÙó]úë2¯ÏT Û9±f1£Äî+³z‹§ƒ?1gºþÖéƒi¸§-³Çg1À¨q‰Ÿ´¹õìÌ6Ø¥¹Ý7C‰Ô’ã¦p:Ðå?[zaÔ˜fkt:PgÔt)£½)/RNËKÔPÏÕƒœ#MÈdyûí&zü3“d‘gë²Tu¥ø`ßÁJÆ´š¹T÷`Qjg!m_µè ä¤I !k¯Ì¿çýä86ަ£:4Ŷà̼ EPŸéÈ.Í\Å–©Íúyàæ‡ ê¼5Ѩ j>@]×ÙžM>C7=Š)Z;«+#cw椥˜c=Ðio²!{ªùk¥¯¥›5YÅyû~ϺjNš- h2;¤L;6^†¾·eõüv¸Úý%)^×5&òݳzÙçneÈ>Í3€^v¯ßØD³2䕃EY£«8­ïT¼BV†pWŸVÊ­)»:­¹¡6{>«ÊÕoû5±]§²Š‚K¤†•xöš|í£ñ–üñ·“®pí­€Œ-JÝlÇt„ÁÂâöЫØ=@”ïϹôÀÞuÑNp!¼ÈÑ›¼š%-ß µÞzÝ}>gd´¦Ó³÷Zz ö÷Gu•™BaYýÊÙÀj4Q±,•i ž5‡ª{ÐX½Ó¾ÙGÆä´ó Ã¡gšŠtvÐãl¯+“Ä œb&v2M¹` uô|¦ }Ý‘Eúd§ÏSŒK¸&XA&±vž®×l¥¬Rò¡¶,w…q¤ž]Ñ {ǹhŒK¹[6˜[× ¶z-§meäOÚy_Ác9–x\wÊ/Ú™h #–ª1_³}5g}1›íO{ÇÐ>=³«[2©­O¹Bó'LL±ô "pzv$,Eìªë0ײª§©Þn¯×´£Êˆš°®1F‘SšGîØ[W™~ÒO<»ËZŽú•Þ ²Ì¡¨›cáƒù8M¯vnÓ¹²Ã¼u2\½¬Ë*Ȫ 9ëÍÔ1+"Ë›ßúçkPõZ”VØCÍ~‚¹Ü"¿a~:}×»(â™*,0l2¨¦ÑÛt¾|±=¨0RÇ ëYꌪ xðÌ2ûŸ(¯þ¡zéÐÛ¸ª%J?|à¸Ù}·œ%ÿ9õ¨H øÒç ëŠDâlÂÜ0Çé\ñs¨äœ9±`¯á–¥¢¹b–½^ñÊa)ŽÈú 8ìA²Èü`M±·­œRXÉÈ^Œ]ÜS•q‚—„¾kûž£}Kè¨8«r̈҅׺3k}xEB¹ÙÆXùp`äY}Ròû™_ÌÆx;* ÷NïÐ÷)²®;_öÞ깡˜bßÍ´ÉŒ² [UÝK“uaçýÚvÜ]G°u£¼8c}²ˆ%ËCÏÎu5™H}²¢µ—s“2ßD:\Šº ±'‹›ýÈ>ÞÐãA<½_iÿ;!O˜ g‰†…iÅžsŽÜJ~y{$Öµ¼Y¡Ž.ϸ[¨æÇm‘*ÅOæº253ð‘I¦¹œóÏ­RÇ÷5*"`Ç3GBèPKle8‹C9?JÙ$ë{Vý¤0Ÿ ëJXRPÓÈÔ¬8ÍÑé¬-£’ýïªÃŽìæû|IUõt¨y6Ÿë®º°‘‡>Ϭ㠇Fo•/ÝÁ9Sµ×9—]`ÚõíÐ…*]¦fõ£JÐ^uš‰½é\™;žr…öèˆÒYoª&yðq  ItâƒàšÝÓ÷Uù°Ï¡#ÃŒoÐö}Z£Tkcçž/ÓKÐLØwk2µó5aw3}×BwF=á޾ƒÝx“#ë—€3ßõi´iÏgÆí~‰mttk “c àó…2GÒ…;ÊçlŸžÒr³ÔiC鵓Ü´.Ërè8ðj{Æ¿Qf‘AavweP… QŸ2½LÙ­ë á»C²ÏlGÑv%åý֦׆šÝŒŽ’êpŠÞ€êÖ:½Ä܆nà‰g]ÎÜrr’`Ñæ k¹{S~½‹ú±¾ÝePx\C¶aF˜ýË€–ºvg ¿vœ–B”½ßE…Cô8×ÖÇmàLÿàÈê#3ƒªª °f£°Oi¹Æ'+<+[ÌwªÅŠMsX×cözÖÕw—V[Lfœ)¥êb)w@ªe*ñ•¼ó?oïq(QB›TcY4OdPØ]m`×5KåÕkœ—H+@Vg×üz’¢>yÉžÔÉÚ+´*±æØyôEø‹ÓW”,òÊlJÖêÙ‰Ûjmo­Ú'«×ë=óæOO\ýÓK;š`ÁÔÖ<(œøí|’¾Xˆ:$„íÅŠ -À·›’èuFÕEiíã Í/¦ua¯sñÛY¾Y½{FÕ8ÄŠÓO5¹Û®ÒOÔ5G–)>›€‰žªù½LìÊ>VoCî ä[êç-F˜ ‘+ü›áoöc]§edÇàš– ´®S¸ï€æúå›=9ŽŠÖ,7Qeiå;%ü‡ð*û•¶WþÎ|±©È—xÖYè±;r³Âž\žŠÓå»UìO¿Ò<ÃÍ€ÉØsÆe‚æ+uÙ¦ØGVcy}೬kw-)a#‹E:ÚKƒ£)¸¸¢ï uçA÷ü¬'<Ù>ø»>nvelWÙjOøäÍb¢~,|xZ×è9Xª+2Óg]f i]æ¯dPöìOú®~r¨ÚÓ{©›Ó(X—fY—™$KH‡ÖF˜lr6õræ`˦nøö}feuD]Ìsõ;æ;¨ ÷‹íS$½¥(3VV›[èI]hí•åž7·ò8ŸÙª²ãY×T~]Ú XVNY—9L¾Ì‹‰òæëõ‘lÈê¡­BÌÒ¡¢?¸G’X™Z…­GDQF)ÕÂ>².ó—ÙPÞÙ5~@ËeçÞÌR#Õ=ÓùÈH#IyŒ£‘Õß­nª}×½«"£9‡*`)ñ¿õòU ïÚ?`5›²ÂëÆ!ƒ²‡Âï€õ¥Õå»úR ßÕsúWNÀ5ŸuU¡ðÌöïÊ^¯7éµ-ŨúvöDr[¡pJñ¬«ä~¸€ÔO2_™w[£Ê¬>¸—ò@j"þµ)ëš›(.“=YÙ‡åšá•Q ìFoèy—%Ô *ÚwÈwõ¦ |ï]|sU¾ Ž:­Ë²ŠeÚ›Hë2§– ~´4rü`/Œ^ƒŽkNØÚu~º ªôIø¶22Žy»2{Xô/XWX]fžYþa]Z怉Zfõæ‹ ªÜ–a³é'å ÍQW}ö¾ùq(Ù T€±Ó¿ÀBSC ¶åW½e'j¼¼ýû×Lß…È(ëÐ_/½`»˜7_36Åß”âmŠúFÀ³ê¢ŒNgƒT«¯, G{åŠÎµdûÁ´¡š1§L賞–H»û¨#3«n*6Üs(ÞÍÕgÍØzêFY9#²8Ë[r‡ì?¾žœ§”¬ÛùB,c§½Þ"Pгu%3f [ͯõHk¢€ì7WêPƒÃi7nZW¢¸Âl†¬“X•c÷.ïg>$?»ÏS2ïBH{1Ø®îž÷y³žÕŸ ¸ôÀWeöïì[7ó.@‹å7V›i–ó&¦¶²ð'üÐÉ2quYÀq+åîØÛ‘å‚hZ!ÈŒlŸÙ]Cû›«,‰Z„¬Ë*A~;ÌøjÉ£„e-Ùª(YØBtìôpÅÖó—YwNCŽ #òOÙK&a­d¿ ;µ4V§ÕbÕ)z¶Ò³ö®Œìþ£Auú–uÙ³kÊf6gÑâ*Ÿpºf VJ4u;ÌÍÒ«Ù„>CÏ[­¤ˆ3§„óñþÅÍVnQú@ZÛz“}N‚|I—¥ŽÃæz¶IAÂ’Q©€ŽÄÜMŽÌþÕÅšÑñ8Gfc÷7e’Xñ“ Y‚WU‚¦.¾•™*A£³¦2±<ž…p³GØTËç ÷Ê‘¶ÅúOd™w6!vˬ¾U-ás Kt”Ú"ŸþÂPæŒÔ‰0º¥g'¬ïšXI ʣܚ*m(³Á.½2²þ˜“ÂÔVá ¨ÇEâÇ©=óë~ <AËÉŸXÌœú„ý8¶ü¢>Vа.ôÅrl™U F DàxNPn––àÿ› ô¹Ú[ñ+uèØ]·ÞßÊ~º}‚=UY–”kãX±fÜÞ"‘uÁí«ê,—spüQ]ÁÂåS‡õ¿[—Y{º«UfvµîºY&öù#ž‘€Ü+}WÍ®y  {S˜´lƒ&y°£K¸´«^)ùƒ4·¡¼ [2¹ |[²$Ô‡|_îÒ#%»;¡5vrA¯UåîXŸßÙëé§{mf…8ö}Èlúä´VØfîö:r(PÊJi1¥åœjŸ›N÷õL†ìè:>áê«ZöÁ„à×Ilñ]ü=ûÛùôý\1™Á(že¦ xÁ`ðôL”p²Bó‹'+¾J 8þ(½Ÿ¯}P¯7Æ–V v}!{/EnvZÙ©æÂ=ú‡@3´rd5¾c°·Ì-FËBàÀpΈüºrãì¢þ°o­™Ö"ÅL+¯šÞ p¡¹ünu4bÔ–7‡ËÀñ)‰¶cžÝËöÓ‘aìÌÃv€ŸhÓ¬©ŠÁ^ì̽õŒº-Ûî#›Ï‘>ÖáHëH ã,ëÃSsÕp±ÇO|PËÁ<²uËV´´®¢•ÏœzÑÞ£y$ž?"Ÿs³ÖŒ]2Ý M3IÈ °Œ™ö2P0™|RÉõy˜ZÕ:b爪ƒ <MÖUuòƒºæ$å2Ç·¸8ãcŸm'ªº®•¸´s·zõÍYÙ-ž'wOfU¡‚¡FÁækÿɳ°Úg—T¹ðÐ[†ÉºÆÇUÔ–¸eô¢J99›>vùìþøÒýþš<@õ™quÙ´•2 g{Qü«ó³qf­«ù]²8÷ˆ@ÑĬ]ŸKBFÇ?qøŠ-‰aû'–S¹-»Þ^.z¡çÔ'%…4žZ;Ó³1>|¨%‹¦fÿl¡W;+¦›êºFîb“*.RåYÒá­¡õ³ñËnÀiš$ :Ý+KÕ³“/M–ìÆí™ö »òöcãƒæDЯ‘„FΪ¼ôf͌Ӊ€QGæpVv”,úeÍ¿GÛé +‹tüÑø´fßS> BJŸ4|µöýQGN¾X¼!…zc¡õÖù Ä®ŸöÜOºz’l§8Ô£Î|B¥(2â»òÙ ] ×Q˜Ú׫- À&§óÁ‘GÜú•) Æ·+sC«Om[«GÌ¡~Œhd²}æ€älrÚ{Îmg;=Ù"±CšÛ&[EþÙsö4V»sš$ÖðÙ—j˜G7‹ÒR¾«¼|*˜NùÀ3gE³¢Š+O?õGf’Ÿä]q† mmàþÆ’9Øý¥ ÙýµO²]3Û# Ëkká»|Y„´hàBÁõv.|µ° ˆ‡ÜX ŠÎL2;ø<ªN’l7ßÛÜnÌê½ÊÉ(0fòRà×x±®ˆÿ‘«U¾—Ûh ´ €:U™È+ßßnâÕÞØçYœŠ„Ó™¯6Œ¯Ó¬)/RêH>l—˺J–²t†÷cG¤°Aå[5™RÚïüE0•È£ºÕ9³¥’„Å YŠÁÂ÷‡ži]*£,ã$WõÆü)Ñ­÷u;V€¸šHkœ‰"÷VK[Ù(…+*€ãl5/ÁVÞIZƒµÜXÍÔÿèó(ÊYéMƒšðî‚íó|ª–ÇIæËfTÒŠ·&ƒªZû\ë/¾D'Òš ,öÓÜr°·j½«uù–¼o;uaþ$zy í(Ö­[EB©Ö¢`ëàź,Äœl}¸Q,ÅOs€zÖà{6Iöeà›G²<Í1?$ðûÒjÐþl_Zƒv˜ —-á¸ú½•È—ç7âˆìò‰`7î(øÎû8ù.ðÎõÊn9I1ØŒ=­pléR>|.zX“umí%áþ]„6í©_~¶¥`$ Œ`Ñ:g2ä ‡ß=ÜM«¹o½3.oþúxl«„lGîÊ"ÞÒé±l_ê­ÁÅuþ~ U¥¯&S«k§–d!ewð’‹³²h¨nZ—«—üÔnwâ×A™±_;%p¶FÏêóÈ¡<÷iŸýæA"w·ˆN½éZh]þXß«…Aõr”Ìz’Ýv&Õ-œ{*a\GëB¢Ä^aì4wÕ–˜œêeBÔ³ÊîúÞr" Éhì{;*Äp žQ·¦‹^ë‡,p‹}ÖG²í³3ò ÁU¨kP.W4½ní$"t)Þ"Ú³ÿZǵÖôP%`;uͽ>!û’B¹¼©=î¢]OcÐy2šç§y‰Ä Ds{ÉΟ-©{®ÿýŽo ý)oJ2"«?[f<ÞFÝŽ¬¾Q§+pÔøDn»’žÚÊw Ò¢®›)x¶#`|öc§ŠƒŠXçм|ßaËs}rãñUcB~“yÝÓ‡T4êâ÷œNøR7ýX~ï@¨,ÅÖYJªƒYˆÚ+õÑä?á0)™ùO†>a’\ÿà¸×¯™¬´ý¶öÐ¬ÌØïâJQ:¾w[Ô Z^+Åë khFV)BŒ¬|6?¹5%±ëzÞ2ð6œ÷{¾ßsŸMì£RzùîÔq:Å*ª!8êz·lh”’«î”¡>í#qm˜‚ ÎÜBA,£ l*ê¢Î”dì@1´IeÞûì©£„®ÏG ²úv浩N `E€ñݺì—Ég·KLÕC*ýôNƒ‚Vf² ˜£– ™Û§Š˜³žRì(„v?öí†ðT¬Û^…Âvàz Z¼;›võ] ¬†±ž9Ò ·ä¥ÐŸS¨níÎrGw'® %®=ì#ÎS°ŒiÛ ‰¶ô„°O5þ¦.v½sÊ À:¼è”(äq¢Úž~/L¨}œˆ=“ КòwôÇJÿãó,ª¤aÁ¤¥Hö~ª¬¡Û×¢!*Fe-ü‘95J°ãâ¦bv½“ŸÝ¨ºôÙå™ñ3Ö;õÅÏ[ò|B³&y¼£´èÏ)Ô}]ðÎÕŸ@{­ç÷}è8†¬ ¢V7 eU]€ý0þU„¨Y(è†,ºõ'ªãSM§)óAQ@Ì"Æ’ÝÝÓ‹LmÈ7ÂXÇn©ÛmÙ%s?õgØÝm=í®µt…˜Mž÷q”úàH÷Ìí>RÃOÈŠ?¡jGi]”%,OÕ©(PwÞbÚÕ{™£Ž|IæáªÞT¨ôj­HAÌ‚å/^ŒA hWV“Fg £öø4ödí¼‹±i\ùHIžÚdwc)X`p=ö¯|—¥Iü Üñ¦V86’£5þäëèx-ÅM&­Ó(Eèo¶~mhwÙê]ܧ{uM‡ÖÛK e¸óBAE(‚7ª×¹¦ø¢‹qùÜ2ÖþU~¿`Då…½ñ”R¶°ºØ€”¤ÞCêŸ(õGÃs¦ÛÁM Â"ëYÜ_à9Bú1ÐÆq®»*7²2¸ÊjÊ>_7þ.œMé'õ_çK`‰UÒÀø;©; ÐÍ.ºè¯*FXÒì„PJnv2L‚Ú{ñã\[¨É+ õíÆÛ(Û÷#Á¾$¹ä¯3OE4ÍCÐ YW£¯ð×ës…ˆ•Ê©>¸ÞTõ„mœ¤›8o=24êa}¯Öá8,Uqç›:]#ÊPâ3õ¦HQÍÑß>õàã./¬ÂN}âÛK†j;ôC.Í“.ë‚(¹|\›<ÎHãF{‡Ñ÷ÜæW»·+êóT¥Ê{öÔVo­5zÌå*Ì4há¡Pôjw-_³¡C¿Ã «LR$ Iï8ÿø>1eg×_X<Ðż›åGçä ©«l–öµø×•’G §Ç ô}‡ƒè§Q ¥šH1`²®Òo B›1¤wg¢^&8Ée]óÉy…mÜ€iìÈlÆYÞJ¥ ÌC$ëeÔU‰v¿UÔkmÙ‰IÉÔ¿ÔÆL¿Èùóç ¦2µ5ºjÌ[w—á­Ç_¦v;‚Ãàre]}ž¡gl‰ ›_͉”QC\Ǩ2½?àüÊÝSõꈳdCwÈ¿lï.¾ÌöLýbœ!mÒã2ðt‹%d…o&¬«µô]+(Ò—BïõCÑQ*í>m`„Ó²‡KÜü_ªÍ ûZíîý®Z#X<¾—Htw4POLòê•w°¬©)…šòûÞOxµ¼Ö,&mÈ2Ö¢6›•Q4c4Ÿ× â.ýШ ŠmÙ@‡„ ¢¥4(Wõ Ëœ¾‘¬ ‚ Ã³Ž’ºØ`‰ÊšcŸš^=ûSùžÃ`×/Y‹’èfíõz6aP·¥‡²¯s”­GX±¹˜í³ý”.ÝN¹ŒkX«tdwþÜ,Òœygæúwç=È=£K]l5B\‚½( À¢NzµØTêbŸWƒz|ødÞ¯T¾ÙÊlHŽtV[ØV—6·Ô„ÇTNc!t%??é‰Cr\8!G¼jRÁÕÙê@qB}íµäŽ{ýðõbÇLÍgLW™‡¢Š¦gÞêö¡NýÈ­ÖE% ´VKÕc0‡©ší]IDx gIÇ*CÁθ©ÇŽ1=ÎÊM2™ÕíɱtT5=ö"JÒxÚ™%Ùû§\6š¤ƒÁM÷´m®—?r÷˜ãÔÂÂb»*O&Ò¸•Eì·ÊÔË‘m+g˜7ãŒÜçtaP•~u(ŠÒr«Ì‡í÷L_HÍO¨¿D>ÆGcn™Í,“’iÞžÿô;9!ßþ¯²#ˆ…£@cœm2 arÎñ*¾˾m½¨ØÑæp;8“Xìû ¸äºp(H÷7G &‘,wIä¥ÕDaŽªÁb‚Ãa‰gPšCébÍb—ü8 ­ô„®E‹A‡WZ¿ÙíïlK;îG¤“J¾À…8øt}âôÚÐý²»=?<W’×%æé»ö_ãi‰øÙ>{ EÐ9ëùÔ£/ù½ˆVRò¼¼!æ~[ÑKéÐ~úšaPg®4”RHÇç£ï]å”°k.Zgä…FN§/šëL¯(8N¨®÷ÑßGÕ„#š¾ý iðgè¡€ý çãjA¾:zb\°ÑšlIïï¿Ô¼‡tçg9ovùò{ÞÅ<~ó€EžG¶%Â(°wqaíš‚",ÍD9amµðŸ…üäIïΈà™Ûi²»òhíw])¿´KÏrû E1s¾þwlçÊ9cí­ã[ ‘löc PÜö¡êfûŒ=«2h¥j¤½îäK]l=»ay³¬k×B%,ǂޅ>cF22N×;ÁX iŸNÊÝÒGuÊmΉkY)9YŠØB§$Ñu·’U Ðþ$~p‡8¾a^€Šù]€¥KI è¢Õ`ý씣›…qÈlæ¹¹BbDqïWr=¤Üå–vLAoIY«xL±¸USnµÌNIF_à0q:Œ/Ç–ã-ûøã:«åÅ]c­üÉ®º°r4é¤F­¹GÈÄæNzSÅPJÏdm¬Ì»€bVük#£@+ûèÀ@jX¶qJOtfÆÄ¦6'&Q*ÙYå]Vn[uá†8£… fß*òÌÕêKÈ©V… )À.ú*cÀ“» W$Æ€`uñç¡Ó“ÛÔŠ2R:bi¿NÙt´ÓeÎ*ÁBVQq[kˆò A¼äò¦=”\ë´°–þÏ•¼Wä=˜÷> •´Ü? ’s5¸´^†ž>à÷B«ð)aVK°¬U´éð¬ÒI…¹†Ê—è¥)#³°³H° ¿~*"ªÜ–´ã6ÖË‹:J×Å;U÷X¡šÜ×Óþ)Y—U3]ŽºÕ•œ)}äßÝ2Ñ=-9* $ØÎkª0о*6ý£¹ðvº*ùêatr…HzíÖàk=«O’Jø¸µh ý%q„úò;±Å`ò©)`Ñ'É0œø¡,Eô²’ Ï—èRÛÒWò¨‘{; MšTN[ØTßO¯$:}³±~Ê­‚I=öräâ€cèE/i¿¯Iæ°Â"ûîoA/J9«ŠËÕsŠbyòÂNfÍW"^Þèõcjõ°¦Âêlý`\ iøæV­÷NÑéo4¼ö騫T×Ñ_º˜þMYýzØpO”ÀòÊ ÀØG&™(‰ÞE‘¥€L½]HlýRq'ÖŸj¹IÇ`UŠØý *W—¤.³ï’½+÷-mNA7Hâ¦9X½MvÍéògò/ã¸à$ÍÜ)q 1:¨†—Ësâ·ÁÓÖ ·…$ÎÎõ´Ï^Nw*)Qü}; ¼µË;ìë)Ÿšd2ˆqݹ@Z%ñá YRÞî$µ×rWÉÊ<жn;ýÔÆÐmœÚ—v⣴ܽg—Ç"AðZž†ã°ò¦Òlî¥`£¯obûÍ{R4ïby“  â*KÉL¾‚1j’=žFÞTMIìÖ‹Ødx)O؇J#›j+ ›‰©Ýë¨pÂö®V3ÚcVXoî¦ X³£´¯£ô¥·Øò]„<µi ìš=›#ˆ< '‡ç‡õ6†V‚šãªÊabD°l$òÔ©ŠDëó ã¨–D¼ÒÑÕ¢SrÎõ¿ñ¬\~i”¸?Ñಖ7[?úŒýmE‡tãƒTŽèyïä¥ì}fvÖ'¹ÂŠ.÷áÐ=ùl —'‰ú?g*èõd&qQbFrzo‡ux’bA€®n¶¤©aJ¡m`è¬)f ™aòhè"I)eTY—=û"ë2ßÎMß(ø4÷ŠH3†‹²°›ƒ„¸\…Óýd3 µM92¨Pçw¨§dÁµ«-ƒ:ÜÖ -&a¸ÙÑUϬ1ØQB;gÍÄ7cÈ«ÈÔ£0ºM›H^ñ‰&ÑtI6Ê÷ƹýç ^ ’9 h|úxÆï郣 õçf§Yê}«_Ôs»òp‰>‡N{Ð/*=Òš6Ê,P§Œñ˜eÊ ÚP{ÄøZ-=à‡¯g³7S²‰Í­%WX´³†û»-—¬ ΜÇÒÅh.ü t¹¬Ë§LiÊsžð"¯ Ôytã5îÃjb=y­ü£ûVåÞ'ŠdÄœ_B{νD1<­ªX.|°T»Ì¦'iûã%¥°ŽÚõk÷u\Âî—zX„.Ò­½FÈðíW ^¹=É0®8Û~|üÃÁaNr$”¾6h<¹"¶,»ø“;ÕC £S²¨Ù|nf¹-›kØ–}[†J齦³é››?(G(aâÓiå]Û÷’´/fÁT»ØØÌ>ŒŒØ›ãÎŒc«¸>ìw¹$ˆ‡Ÿ„1¥S ÁiÖŪŒõ³ÎO8¼‘2±û©ó¹A™CyNÄ'<á^ºº{ý¨• ÂŽOØñXCu¶ÅÐq„¹÷dµÄÿ®âß9Árè…MÕÍ‹~cç).JŒDÃîÞP ¬k=£ˆ­§P?ó‚JGæK¤F·£|D4ëV‘ÐT;GÈ–—… ô Å•²¹€*X=jìMrÍŠ¥ïÄâ'Ç›^`ÌyFÿ(—3ÒÙX™ÂmYÔʽ@Kù“ëŒr9Ç)O%ŽsOÛu ÍÏ>Uúpÿ•ÔoZg¦øõyP´°.«¢’OÃNÒP\ƒ’’Ìá¶óL¨nF<öÒ5÷*(šë#r5 êÎÀ¥1#{æà‰®D!&F;­kaÕLÖÌÐÁ‚T’Zjs=oö(wo¾¯"… ?9²ýæÆk^Ù]­0«wµÍ šµ’ï‚Û¨´®2i °<¶Rù¶Ô"Fq_výÐ ‹[ÑøM©Åñå!°7VT-CQ…há7Ó\‚f+‚Vu€ºÚ’i {Ð[¾ë–šžgÇè;¬«HÍ/°ˬޭ«Ëðà [Z×½ò‹½2â9v“‹õNëûåú·¿ÏøgOq͵ìÎþ{KëÁªÖe>i¦ïzg;|× wêìídtf_T@³ >ïáŸt6`þŸ9@œó$Ó V4³˜Òu±VùØ]/R¡ ÅúI·6ÖåXv#ÍYY$ô¢®ÈìqÊ Ú¹9@¬gO9]PKé"Ù„="\b&#Ù(ÍÎ#Ò¡/yHù’4ŸEdK««AåÌê¤`À’|ùÈÉ>~ã—È¥`ØF‘0¡qíEÆ63ï#H•ž}Σk3:í#ºø¬vÐ<ëã¨}EDƸÁ—ž‘ñÑM¼˜9^ȇ¬Ë¢vS(³6ã_ƒnSsÞôìöiåsf/k%ôb S`¬òa³K²U0Ô ÎùѺâàÓ³ Òì9D÷Hg5G?[{MJ9ûg²m„t˜ƒAp^,N¤~– ;‰ùQ?ÝâKeÊ'Ó™JöCÙ6'âç³ïTæ,wô–=èxf%0×gÎØ7å P÷ôd¦—µäê[oEÙ*µ§W„ãoö»îKñdj­b®›‰Gx‰Ìò¶Ÿª²(h>-®Ê¬¾º(`¶'V@ÍàÚÌnê|’*a]lR­\Éω–þ3¨ Ïw #Ù!HÞ²Sùî%…Èá“þ¹m-ú‰E2àæ­ãìôÝK!O¯{ÊÔÙ¶T-ùŸP®i8‚] ‚Šð„fÊkŒñÌŸGØôœÍL5 HTà q8-ײ”"‡¾nŸyQ{Ž|9©ŒÏ^S$¿Èþgb$ÖþèE@¯U1³§æ=°#[¦àÛº²®ù˜sãGo:‚a™45ÌvR¸÷Â§Š†à‡BúÀ‹|Ôi÷lêjÙ]rCSE¬A%»ö’³ú îk>pgÅΜôŽ:J£•$—†’"£Õÿ`-!.zŠæA²©ñìô€t¥;òøt… ]$~‡½¥Î‡[ª †T¶Àû§i†UìWª–šªëöÎS…Ê ¢¥~ÍKÒºœ¤¹)Ž`ÍPżÝ+½ß„(.™ÙPæŸìDc9‡ïÏîö’Û î•쌖ç&Mw½”LsYUDÈ$LJv¬n*—ûGˆïÐãëƒY©ÚO™ÊI©°@?¨+JÿP¬¶½ ·†R¨“Œ_[©í7;·žÐv–µDg¥ª5”¢Ä=8}J³W‹<ªñŒ¥4„&üM©örN’K£;¡^6„™õaã…‘œ³ëºÆþcš)YÃ;„‡à.J*}AX.åŽ•î ¤æCª,9ò*ºã•‰“Ôeñ줙¾A¿]ôÀ7E=Û¸E‡ öìò‘ï’åq˜){1®PÆéôpm½|®”¨GÊöØ,,|àÝò0¦>Žß‘í u&üã¦îw+¤ôs%NÖá¢Hzª 6r6ÐÓðn—ò Iö:HR‰}F o B’Bß$éšfðf÷%äÂí“ ïÁÓ£ü:_6Å =ìR8¦ØI”¹kKº:ðÏdî`>éÃ=Ÿ(5”[ŒÁN¾\²AŒ]4½óóXÈŸ9 X­~èB9mœSR,£º|à± wt1^xð`qçHûäªqÔåæmÔõY]ɘä{¹b8CÅrˈ;·ûþÖå·¦ ”åÓozªÝâ>«¾³¦7ŒºhXWÏ'Ÿþ)ó3”Û:3¿®³F•W4Ÿ£¤èGfœN™oí(A5éïÑèéU½™??2µÙS¬ó5õ¼"f>`w¤qEêåN±slrÖ‡B¥eú®U[¦ëØñÌÚ¤„õ7i÷ä`¢µC%%×ù•,݆á v"I¦Z×ù×&/¬ÌϦ«Ä¯ÿÄT ¥$cÛtõ®~¶S)ê É/ƒ4ãÃWo^›^›ìÔ>.å³ww!GÀ²o]Ág¹ƒ{|p³{‹RgbóŽ[§xú5Ç ÂV‰f5õUfcùb íM º9Ø?Ê—Y3!/fÕKÁþ–žÚz·I“ú¢©¥ö'tTwŠŽ–Ç«¹C›>\!U/Ý‘ Ù† Og¯ÉiSn tÌ;·ò3€1djÀ&ç4¡'\ßU‘Ѿ]*e˜CHÉT ™5Ô0wUÅ¿Aõ—î éKç›=U‚RÈYûT…Ê+Û×X8ªù£‘ys'çpàÕîò‹Ym-'TáÍ›ªPÝÒ¥›ÙU&è,É­'\e:›£7ä×Ògt ~RQB‘Abx®ƒDÔ?vÖ¤< ã¦ªìºÆ`޽Ìd‹¤µ©|±>lc\<¾»È$G€F|\“&ÇÁ‚Bf¦Õè —ã+#ëíS£÷ÇÐÖ5Îüð#Ã8RÁb}Àܪͤµ·ÊØœâ^j.ì{SÚb7I¹Î¯¼+Oß.w…¦œR['ߟU==+§>Y‰ ¥ÊºÚÓÈbƒq É}镟°«~µ–g„ΛÚ>ø<ûì<§-jþ62®Õ»RÔÊ< ÁB×·¸r=r‚:W']2Í‘àñ-ùÊ=}Ò…9¤^y¡·;Þ^ÄJƒjm·¬h'ü>E}ºzuɺªD·½É‚6©»§S³Ù… fæûبü䬕Ïî×ÁzUîÊ,òÊÔð>Ý~i!w(jE#¹©Y]PY×Ù7á৬Ï]"˜ßî‡äE,Ø|„%È•à†Q‘ŽÉ¾Êw­r° ¤\GÆÌßëmŸžtZšÚ:i„¥GsvD ¡¨&v}Ûl€ß²ò1I¸yöލ Æ,Ì­‘³{z1_øþà ½°AœÈ ýg!`性*?†‚|Ž‘ÖÕëÈæ^CÕÇ= ðg]C£}§K™ÐõÈwa‡U¡z­–û*– ×¼Y{ËÙ¦‘"Q GJQ^‰­êœÄ¢Û¡¦§ªµ§qE‰ü¹’²C"/½©ßµ½¡ Ýþ„°$Ð)žlÏÛ;*黾§vëÈáHŸ7»’€ (‚Z.Sòâq×=ì*ñÙí˜h+á@Ü.'ÇÓsOÚR Et~ÏÕlù=ð}d]Ë7ý•l[1Ÿê«gëq®š¶ñTFrv®œ£ÚÍvù.»Ùtd}Íåû„@ƒ‡uíhŠ<ëš—}¿«ÁÙ|õŸPmþXÕäR3Üwû• ;4ê¦t£•ÇÙÓgMvŠ(ø}fظ(åšTâ!IsX× s8?„¬ËLMŒðÛ‘ëJµÚl™È#ÝK˜ðžŸ|êÜl_·{˜ÏºVIŒçx¢kïbN¹+ ¤#;';è Ê4ÎŽKƘ^ÕOÀòtfd–”'*¾´,¾íÏû§…ÐÅM'Dµ+x-‘³ÿe½DEô¬Kø®_W6øø®G÷Iëª3娽«Ý´®Re]xê\€´VßÛœ¥ã§ ª=Aðîó]óCKÉsl‰1õ» “ dÞÊ»ëejÖS˜Ü_ÍßÕÕ­rýI!p |º(Êé… P^ zNT\]~ l)Æ'ïêO7ãµ¹gBA-ýø®Ù>ö¹o!n<ÑŸæ†k_HIÒ»K“£žs§Ò‚%gS~ߪ25¡C¦¬wF‹J4ˆ{¬«ô[ÓÌIÎu=Ôç®fâ²û«-_d$ªÚg`GVû×Z²÷NYÐäOÅmШf4‡9T3Ž£¼ à3ö»P}?=¯ [Z‰ ·º)Û¤gd=`¦³V¨(Lî«¡#>û2Ÿ‚XU]z/£¼qdЊÜÂüe;)ÆcGvônI}ªZö–³±Ü‘`R·”qd…½Þ›ÖÕ‰âÂE Yø„¾ò×*ñÈb!çTEÆ»4˜Gcû¤dÚØ‡-’™»Ló1—ÅG)€µÏhjä üyfÞsŒŒŒ3ˆ`žuÕ>Ò úpV{&òmm|ÜùDÆr´‚iéPõE™ps…G§Â^Q¶Vë¥tµ#évA1A®9íF) öDIõH'(Ù‘°$…ég늄“uy²{¸äöUÊ#+ ë*¹ º’ar¦Wf°>äý-0¯#F8™Íxû=¯€Ìº õÀæ0«Ï±žåÝÚ‹À\¨Ó¨A«AKkë(Ù«üä]ëÔOÞuo>ð-í\P®ÊY.°áŸž„è²õëNS;oªY}?¹`†—&iµÍÍìê0¼{™X3LB‡Æzñ–n¦Z"ç./¥±ì„¸p•»²@@N¬îeGݸ즞••ï}M¤è¦2?Œ M\¶GmÙ*룡*m¯5XFù¢†" †?‹ o!zâ` I¿ʵËhŠ0Rfú®úX8ÃlÆJS«ód˜¬}§#³3ñ^Eaq=ÿlá·O£fW|¯ýô“7{NžŸ…ù>ÖÌ>ë:öàäQÍß)ëéQ©è'ŽÍªÜyÒwÕ7¯cý×>!ï®Ô±]ž>\¤î'‹¼ã{; †öT³ a÷:d]–h1yîµ5ßFXãØ‰ü¼™j›îÊÜâ’©õb”ÎșźŸIž9Ý&Gf±‹;£`Ñ©9gl\ ‰öõ˯™ÌÐwy'¬É«A¹cÈÔvO)»ñhµçK”jM?Ô_ÁVxïÊŸÔ™UTœpsÎèÿìG=©Mœ³d§r¤:Vq|h°8Šˆã|o‘ï*c½¿õð_‰ÖÙžÇò´î€ÿFGâÍØ;8Ñ »i…!AdÇÏF§aÏ %XÑ¢õ¿Ú\ê;ìÒ³#Í{Ô9 âçïêôÇn4ßN¡}b„U3lÙÔRÞÕjùL‚jŠù:uDNl塀&Š!¶š_åÛÛs|tͧ´} „Q]ɾi]Êwa÷„Í!—à›Ê Í8$ÆìuÁlº°…ßáB&gD»s†â¶1FÆm ÇíSŽÔXçHtˆÕ]Ÿ`•eÒ`•¤~ƒÝ©Kð@ž„.ÜG×3ß”0 X—:ègf1zõmô+ÃÃNÂ’I^á&ÁàF]^0Ιè”ðÛa'Ap¿é¢¸ê™VUe.µ8è€AÈ1röje]IßÕ5vÆhñiÌ úøæÜ¥÷½ÍõVÏìµ®dÒ¡|Û»¼xµs¾}*£³su”™As´ì‹õ|³Kœä~-'eC½7yVý[‘Ù iÕTTò'}eÄ[c9(xžOVˆLžß΂ÍRäÜ=Ÿ›ì8.…Ö‰weCŠZý:Šr)ŽÜ~8'ÆðõÓQúàó6$-Ònoe6¸¿•ƒAËÎ2¶ZÖĺuûÊoZn=9†D2=+¸wKf…XPЬzøRùR7tôýfJ\¯:†^0a‰q V†gfœ…ù+ãÍNêÒ„·ZN™FB.Ýøq`„/YLØØX_ œänú¸V—Š„î©Vv‹ï̪¥‚¦„·do/¡’¨ˆ¦oúB$©¦®$¥³×|”¿€"&qR¥&¡9øT¿Â,GiŠ^·Ít…v-ÿˆØâÈšˆêôþ[¹YsÌ4Vøæ™M§5gÔô¬hVu£+’kñëÕŒÁavb>¡õfw±-k¶E.’õAÏÔŽËkãºÌ•ÊÓà–þ˜Z!­l­÷ìÇ‚"M«÷-WqÏh25ìD«±¶ÊClÇ>qÛé ¹z&Y7½²½»>eÆÉ¡„™w9ì#7›,Ýï2(s/I[T¶²·ÅÕË‘ºÑñÀÛI¦”È©ƒ‡^®¢–²ˆì˜Wá)çÓQu²:Ov-Íf½ÐÝ_“·±$³BÍ"Я4¨Bˆµ{¨ž"î¨Îòo (ß9…A? ‘>a½BÃ=#c‡à>ãtù,-f¯·°?º¹Të”HôÎöùiýÏì}gŽì±HûÑmGJ—IfßÙƒ:ÃsáNÇ÷%»ª¤ÑÏ,$(G“º½Ì2oUì2J©2ÒTA ËìŸnx=3Ñ×vÙyªâáÁõ‘mM èbïE^ï¹.TfIfÙm­rr3Ü¥#Òúù4~ËaE„„jMæŸËùP ꜖ÔÉ“å.¶ëŒö硆¿ÌESC±[ejëÛ^÷³Y×ÇwÙCÉdmt!uüiÖÚÓs ¸0pñ¹´Ot;r ¹/šŠ·žóÑþ@ö¯ükŸ¡ê¹=9ü ¬È_{KæÀ½k. ßA†øƒÉUP+ì% <î¼ç¶óún¢e*벺 ù^Çk¿½ˆBH¥cÇV¦CC_+iPæ5Ž>®<¡¡p6öˆsk1ሡxMwU·Ö.ü>d1pxLïAó¶2ƒ|é‘×uúŸzBõ‘¶G¢ô”°‚,pZ75ò#Á«UZ8*jjR›â·÷§­=›ðí¨qzô49+FŠŒpÏWœ¾å÷2d÷‘ÇÅ’}"*}@ Çr?™1v7?ËÓkæª>µwWÛÎ\×¹ÆXóO¥ðÙYEK‚y„„T‡‘yKZÈ%åè­Î€:ˆJõffs5–ýõûËE›Û9ùu®ê„°î®Œ ÕÈÒŒÝYé³ã ¡/ý8ƒ…ª¶Äæji¥ÑA¡¼e cUE¿íU'õ—qäVÊJ`‚õþÈ£Wa0„©‘‰Â½Ú fºPR€#WýtÚ~ZП›Ÿp|Eõ(:zeã ÙÝÓ‰œ®òwùœª]ÙÐØfîqÙ±v«9ÉÕa‰_F¼¶oOëFWpFóû7}ónÉ|ÏYùUvì‘A="Ÿ?Q V®"¡gºÈn{÷V„^¡lM¨\ML¿«Í%—XG¶a÷7°ÀÄ,ŸÔ•~„ÊúÒx&ù ðOb<@eÖtÛb^j•ÊêBRþ:géÕ)»}¥Co«ç¬l×ÇVþTõC|KJ“ Ù¼€‡[|úkî÷Pä=âcʤ÷©Ì­w{´IëÉ4®¥Ç¼;'5t)jùúã¡j-/êÎÜýϤR‹½¾n;²¹~2yà}gr+šA]¥Zöid†:ÚûØÏ6´)J²Mâ*(ž!S;£^æjtD8dåÊÅ!=ËPV‹VÄÅœ™7H±Ðóv%g¤~LlÞÜÉû‡D骔 r2(ð « ®$ÙvX„eœƒŠ+÷7õµƒÌòzm§ &g©KÆFF`a$ää/]ïÙ³ôêy㜂˜ìpèÕçì+y¢Ð˜”Gq»Ó¡ÌàÇk^ó-Â_/{½Á _î·åÑV”ÙÇ~çê|$'ö¦ë‘¨•?VJ¯€¸ñ“€Oséf¯ò®…—Ö€ít5j²ûY‰>T—·!q(²Å÷ç¾2mšñŸÀ;$­9¾i¼xQ£xü‘òxÌ~ÈÙ†>ëåÍ¢cöTÄâ µ‘Ì­ßÛ lnC¡W? óv ZR z]0RÔjÕ– Pmô´p;q!äæî¼²³ß’ì@·R {;ÉýûéÈYŠê´9R2 ¿öd/=¡Zäsv[ªÎ¢€l”ët+Ja‹2¤¾C#Ëî¯è,n¤êº¹€¡Oس¤”Ý*3%>Í—J.ÐK9ªEYùÏVݼ¯Šå¿X}võÏrb…ãÄÜ:KÇÍÁÂCª®÷§§R ó¼¯ŠƒÞëGÓ¸IíØõ5¥ÞŠÍúûtt¼¶¬”«†€²_ø£µº.@£«_3ãªiûàf—Ó=tJCkT}U$n—åM\ƒè¾M¹˜¯pò†5x§ŸœsLý a„Rþ¦êú-Ù>±y¾øXН4(¸ãÓd(äÚÇ„šTષ˜õjÛ¦Fä‡g(”èv}7êK|Í”ê|BÞʼ4V¬Þ§®'Y¨Rè Zô“y'uA1çxz»¡‡j\ñíNÞÅKvÀv¢š|ºØA$É阺ØÒv²²Tx„XGå…ÙjJj‚jóðÂòdI¯ öª©q ˜F瘽ô ûíȇ¾X-yÑÞ®VXzR²ð9?"Ù ¢u5RoŽºØèW¿åÍèOPŽtŽÓŸA-µP—~xpžua%$BnPwÍ'¦ýT‹OßtÊu:ïí–i}­ôKr¹?îgSÿÜܵ¶IùÌZ&ý*†ESªvýI£ÆEI‘ìÚ5á}’º ý¥/OÐíÞô’÷»áLg­:=rãoÏû4žÙ¹t2=Ùn# ªÝª÷\©gâ¶Ñù¸N\økèÎ_JÌ{Ôé®°9i’ÓITuQñJ|B£æè¯ó(Kýs@!—r Ä™ü#´ÙF“ÿ´7~uæ Fž—·oÖeÿèøø¸ût$ÛNO¨'j;;­]ê»O°OÛ¦®´-ˆKS³lØRèb·Ç—ñáí%Åq6³[¼€¯|R_“/ nh+ö +2ŠüËžçiMÁJ£Dòv@ä3µ@×M^€}ë=!€ñoeüÆSÞ(Ä׎+ fÖÔø2aj7ˆßjþø‡vîÍÜ$€JÂì×<"©áYWp¨<ëZò/ˆZÇC‰ÖcxžÛšlc´6`ÆÃ{îÈêï)Jz,§r±%/Y>Î{Ûx1Ë¥ÆX7‚€(Ûë7¿vSNÖ qx1üˆÈÍÞ1¶âv«‡šâ¿ÎoœªÏ–í­4µUS=²¾}±H”Ö#G ƒºTˆGÂÑ¥ ‹d¦¤Aa8²åzpøï·µÁóç‚|çc6£5e6–yW½ÌòÈL¢#q¶X]ݧpy2‚ÕuŸ)ëÂô¨ñ_³Rpº@.¿v×Û72î¥ÈÚa©7eõV0Œ—wytÒwAt]Ù••^™áUïo-Ft¸«¶–¬ËÌs?ÏŠ¾¦%èzK¥JÒÁÜ)ŠPoeßhIëâMEõ6˜È; š`g{Ⱥ–K†6„6›|n{Ë‘‚@X>nû¹ó=Ÿv'Lm7iœ9UñU¢‹cÚiP»öTpÞ&1^Ygòã ƒÆjwñØhB2ô–ªnG}dîy°«¸xØŽ`l”>ò h¥:­¥ä©ýˆÉð»Ø®¬ô ‘_çŪ°ËÈh[8„È?W¥Sòu¦á×+¢Kƒ2ï÷²zß « ¿_ÆG[½4yÁNu?»?zÕP<ƒŠîh„~Lø®¾OêÄ‚m7WÀ-æ}:J7ó°U­=e]˜EôÔò)§Rèb¤6ä Q ÊÅz¨Ç^µN¹2GˆI2áôZÏ u‡£R]Ÿ2ªo>l-îÌšNWzW>ééSí3i+;eï×ò&üMQG0rÈ 3›¬ËŽËmù“*tîGÿø®MšüíõQ– –àeÇóLz÷é»Ê|Ž‘g2ŠÞ£~ï¸6[FŽBï‡ÖÎâ¯ùtó¹—hŸ½nŽûÏ‘)¢—GŒºö¸ÆŸ¦ÌòyÄjp`ÒX ñ¡ê­ .ý:Ûg6/¡ #œ­9TÖ¦6>G~ziiw)¯Øa&éˆíFëš.Ÿ5èÖ ÿajÙ/Ùi](‰ô îEWg' E—1žé“ &Sä“(_ÿVó[ŠÏ>Sa|mŠÓ`(0¨¥åmÛ‘ªã®‘¾«¦~(HtF\9•é,V=J¦»uÎ9\Ù—c/œ²zr€a©äGó”"g“c+vF'ŸÉ^¯´Œ¬âHÈÚñ9ç°#6u±vI±¸6z•£ž+Vƒ£u¼ëè:#sö,&î–à üþú"3ZÒw}sœWs°uüëòDW¿‡…Ùgµˆºµ² Œ“ÅØ— •NnPÒ*|s›Jt³”y—ùé)šŸ¦ÐìsT쥧Õ`јO'}§ Ç™+5Îîúˆdß%¤u¥¢t½[Z ˜øM6c¶ö÷ƒ”pšá] îú’ ÉùÁrq©ïçÒ”\vÿÁ9?$Zˆls즤$/h.Y$TçŠoúvÜ/ˆYÄØ9~hSª—X>jKȬÿj`»8}ð³—ÏaKÿ‰îãçŒpÚN¦9àFÉ)è%##XÈe6 ”uשËîæ¿Óë  j¤qh¡o¾Šž¥*t±ç•W£F”Q§Ü"µ+ jMÚ¯Z¥Âªù—TõÜoÓÿɶÕËÑ"r:B‚¼bØù æ ªì³?±¸³ƒ8Λ¹C曦„ÎÖr8QUœÐÉ®ÿš|Äæõ…Qr„mÊzÚÙù0‰ôÁ)À&½èŸ,9'²j޳œvÛÉÌ{;Ñ»V3&öIaÂë[÷ ßUös)¾`©î]|:¼ãDS*¬Òéj ˜»›é¨K?4'2OCý"‡î®û|cþpq}k‰Y¯H¾vÌcûú¼ºqãA Ÿ.öWÅ’=û¥4µ rá- ¾Lø$ üm!Ήƒ…Zïba22"o®CN ì¨Êɱ—$Õ.1fΨZžÿD¯þôöÉZk²®;”; YH[ÎÄ»„DîÁžæûì?‘Œ¶T#™WD Èy>+ÄÈ®ÓÎMî3+ñ´ñ‰Ž®´`ÐÓ§°cãFbßk+ZaSõ¶Ì ʳ¨k¢N×úÑŶˆÀŸ$D¹¾£¼•»ØŽ!¨¹&jÇ€«,Í [±FÛij{P@Öhùø}jIÆh±·:xã3íþ½•|”×\X1c 2u±[Ïúa×”“Å–a6àæþÖüç$7í)+m£ÛåyÀ'-¸ ´6e]+Å1|të|eŠßû¸Ÿ`éµ7"c¢:'•^‘w“ìúàÚÜÚ‡šèy¯Í½–ã »Ú†2C#Lß[”•|ìM\xdæÆÖ‰åȬü© ýô?üy^2ÑÓ—9 »:?‚½6—ªà™yWm5÷Ø¡q¦½–óóž#5·û‘àê”§jö ’rþ `Ô`™á¬o›¦c!F•±¹Þ[» Ô®-·Õ-cíSßa¿ýž0¨,å\òçʆ,Ã+º°`ŸèA‹Í‚éOL”!”¹×Ì?ÚLøŠß´Ç—]eKl;ò"PË© eØò ÆPU ½–¤…ã’W1=~ož“´ ·R43ÌÑ•žYˆâ‚I÷î<¡®Û¼ûN®0€‹å¢?È ²K!O mwò_XLúPá•q“»¡ƒ¦få?]!vžæG²é*8£!XEp èÉœYÿ5…2hLðÔ{G¾Έ¡*wx~}•¸Pg•`ûÚ{õ‡ÈDÀ©ÆGl³Æàéb·Ogæ£ Û} H!½•˘ihR·‰î¨dX—4ɲ.ÏȆv|6N[Iýaý(QÂÆÁÀ Ô"ûq”“Òp¢HžXãzÌ–^o?öB· ª¨<\Iž6(¬n}Bï­÷ês³Â¼}8å£þiÙcŠÁâ./ 'ôL-Pe[?9gÉî,ç ®Î‡ú?]¿?tijµ Á} ð/7‹S e¢°ÅL[ÝÔæTÌš±ÛÉdNtAgÖ ÅsN˜@®“¶ÌUÓ>Í¢”ŸAn^ ÆRNƒ¥kª`V<ä”ì`=[/–[\è¸ æ]>翉|žg ¹+³€Ì-ÝF;î&Yç­:3>—íIVm)ð”SZ%Z}ãÍøÈ«íø<’¡“è‰§ÏØÚ{Ï¿9@|VX> z[´EpbÐ@kG ˆ0‡ÁïàCÿEš`Œ|©påijOS[¯Þ~êg›D§ž™Rùý'´ã;/°öø¼¶çWª/u‘žxrÜÉãõZ  ý-Õ§kŽÇݳ¢1*«‰)h®¿äãmmdq8‹UvŠZûÔ£v·Ÿ4¼÷„*׳»œR[î Á’Bë-WÐ#‹Ép`‹wN¤ŽCª÷üLʧȗ=êrj—-#¤,= Ó°È ³ÁŒoÉPî~~ÿÐkÎKpòŒ˜ÄNÉŸAÀi¤ŒñÁ4¼û¤±?³–’+ˆäòæé¤t‰H霜ç"?ï O‹´·,²2$…CoŸ@û†[ž¹ìüê‚’r_§g­â‘ð~erWVhr0±ÝO¸lÊ ¬ÀâWv¼ù¼Hm¯/߬¥Ð=_ó¬œø‚ó¥L:Àz\qýW.!#Åè÷jçðØgwN¸¥åÛã̹Z…ŠDÞ{J2-KqšÚØçAzý ä×þlÁx¡¬¬.ƒsYÊèÌš€Ý¬Ô.ƒ^Ä”ïÂé) 8Öð®.,½KÒ6K>¯¡/÷w’îƒ*n}¤;Ú«-Çã¢X#@ö•̈ÐÈ"Ñ› ºí%S3gp]]¸µ6—ò3+Z’XÙçû5çJ]ÂÉ•íð¬u¤Ø&Ž’;·“•iø3Ì$·~ÂæŸ oªœGØ4˜ÈûŠ?Û³B…2‡G²à^¸%®ˆWTÛ²ôG¥¥õìù½Vó}Ò\U}¯¥¸ CTî!•hL=¹2çð]Â*µgôÚ‹þKÈó(z­vy8*E¼ü+ëL¿g™2 ý<Ùú‡ÚûÞžâãÍjÛ²Ô§¥ý'âŸü‹ëEwUˤWCšz(xæÌ$†µÑxÂǭغ¶R|8²ña–Ýs*LBûJ¥¥ÙtOße p“[³üœ¨xs{•Ì÷ëIý»ºgQjKÚ÷`ëʼáãÊå'`­³ñ5ƒÅã =þ<2:H¯Åµ3vKePG½BZïò¹ã<†ž¸¥ä޼A-W)>·¬K:"#¼¼Ë‰ÞNú®Y•y»ÚJ•‡²*¸Èó`{IVƒî¢çióÑo{‘€qOáïÝ6G~ÂÔg##;Œ­©QlÌ»ƒ§d(ƒ<‘œR+ ´NÁX£‰$ÔÌÅÉî Ò”Öuªh<}cU'ZèçÃÔ¿Ibí(IÉR†HO~BüJ›þ0ju ¬þh2(K1“sT-½A÷=wy«ÈØÜÔfÑ’’ù¤£4œäìHøˆÃeå¶‘pª3ҠƤ ®¿Ì^«õ´®ÓG:ÆS¨ž±~ÆNŽ3ö™t=z«i]ãvÕ–‚eBe¦A% ÷¤„6Ta4Ûî‘ï‚Ê]ŸixEºØøê)àU¼d·®ÃÖÈezIs°Rà9S—:eVè#mq»˜ö âècÍÕ3့>îÞ>4Ñ•”#³¯|ÄæÏÁ·Srk¾2«oã0”ÈUI ~â¨ð­$&±( ®~ ýÈŒšÞ’“›¾Ë•§…B8®8˜êí¿„m4ÒøÈ~¦ûð87æ3Ø;›ùU´˜ºíu-²-mþD¨î;ÙÅìö8q,L¡ 0Ú»›€óèi]K},X—Z¦ óŠùè³®-mYßçoŠ ­Þ*'i¿öÔa]·æÂn#uyX—HšÇPŸæ6¬ëô*G¶ÞZnX×îEræ$Ϻ֭ÊÜJíuöÇ^ø¸ÔËÈrIaÇѶ=kŽ}?ûࣵœÄ2ý|´5å³›´1¼Žš¢n´“'ÃŒõ£ö𥠶d¯g¯¾´™Œ½ïkÜÿhR’8"ߨ‹´ € IÞÅÿüHËõÁ“ñ~>²¤ÈÈz#e4ÀÞŒ/L¡0îö­æûŽpw=Ù~[SƒúbSÖe®ë¤öre]öú†þ¡¹×uM«ÄòˆÌ«ö'¤ÌÛ‘¥Xù8e]üiP)¥…ÑNë²Äa§ïÚ¡5JлŠR­[ëGšd•טqÞÆ“„wxýÌ,ÖÈ~P—P)žÝPŸ§;\zó'PÖÎÆvo—ðÑÅ^(hxa“íAÈ!nµ?«dPóË|ŒœÂ‹ñVÀg7kèÂÞ%Í!rÛÏ£œd¼o{äXöJ™ûFAŸê¤¬¹{ºãÒ[6 ödÖëíÁº&í;|ÜÐ\+“°Û˜7#Õê1ñͳºò®]fV ýÍÊ¢q?Ç• ·G¹vô wÏVÃíý¹LŠ©øªÆÏOöR®fgv¤+´tŸEÆÎ§(«Ÿ—²f‹è™ß-ÖÓåb$܇C"?“nd嚣žÑélPä޽œ˜ô#â~“R§¹0“Z·hç`ËrqïRßu¶©„ ´„rWлV0D“³ñ–f_ÉXÇ£8ˆñ¤} ný“îjÕÁãÛ^9+™N…Õ°5ÇΪrrÇ­S:'¢®.ÌNXä…¼´:Ø(h²®Ö•w!‘ï'Ó¸²J6øÇà?u©EPÃ_6µicÓ]u¤CU•!¸3[Ÿ^Å•F–wú.Ó8Ÿä¥‡ºõ«Î¾%âªÝùÆ 5¦¶4ž ‡ªè™*èa%qÎpò‰Ã‹9[W ô’ìμÁe’‚MøÙ4[rÜ9x*3£ÑèSã“ÒqP>’»wÆ>v–dz&4®"#²è–jX{¼ºXb™HR’õí®õA×­®~WsHìûâ£ÓdñoQxÄ’g뺰$®ÊÔZ{-ݞuA½ú=¸ÂøÀZ‡b›ðwƒŒªÛ¥ÇuØ 0(ÇGýéU€¯·ñ¢f‰Æý¢N êÞ“ Ôz™Ó9qªžÖ—v±£BÛè/¢Ï—d6F9w|t±­4IòúQ(ªóëýâKàëHcµÇÕAg—B`õµc¹ ׯžÐ–d¨3:ÔôPÜårDŒÆ^þÕœ°ÎUEç¶tg(¹Rù‚Jr²;MoK­ÊrçxF ŽÞ’?ýLNÛœáE4žÞ"É–þ} äêïr pæ]β–SìûПƒ‰„:aÛ¼§Zã–S”Ï$¨æ×8™Éžªøp”ôkSЄ !ŒŒ¾ZJ‘¨­Œ¬©Î'«#Û˜æ±]Y¼õßå»ûÂ=p(ü=§nIÝö¶Ô„ðæÉGxcu’]Ř½9—¾P«3S|ó!ƒF"˜¨Œoéý¦hž9Vr :oñ•ƒj Š~·OJ(f•’Ò×e£6íN ûzÈfdtÓ•Ì6Ò!¹íê óó„2¶š“,ÊÕÌ©­W•Åÿõ5Q—¿MñLŒÆ@ =ny‚—¨«ûÖ,¢æ?»$ËÓ¨OÊ{6os„Y­Ë'9ùƶÂ\y³ Gѳ³” p{tEæ`G‘é56O ¦Hë:ù¤NPÊPûÉ”.66wÖò¥‰ñ“Å"ôˆ\Y?øM¤t Ê&ÙYmgî`^(U×I¹ÑPVìJ1Ãu)™æ -]æ€îEœE`$û¬ªªk©…ŽŠò‘!Õ§(+"{(Ò½º‚¡$!ŒRó̦éU”§¡ñç ]0$`СLûåchUÍqR‰Þ|ƒH~1Q9ôî€ÌœÔܧ’·@’€AKȦN3¨½?ò’|/£1³ÙØz#£êÅ|-…SÊÙG>×üÓGî,V:=н#^Ýœö{#X¼½¹g…jùâ2aW 5c@ÏC¾ep»½! ®ö/%vYº8o'ïeÇÔóFE{¸âÓ‡/ò¹eÞ™ÉÖþþf)°J‚Õ-uÌôHVe>ONÚ7h¦+³ÂµàFím|†Ïm·Èºú[û§dÚú#0— 7y‡ØæÁ~w(ø‰\æu±¯ÂȈºàS[šE&‘«¹ðÔc¯Ÿ2„4òXXIïðŽ~äÐ2U0„@’]àüÙ«÷™vêÌ馰]{ò`ošñQµ†bÅPé…¢r?¾H;ôG–°dìéõ«NÛ(?u¤Ý‘";°·|àÄ«&'«}Uöb\¦™ &˜5r8 S„úwPJûìÎT%ßåC=:EHtvr rË9[ßÞÿ Õ÷Êlì˜O{@ûe]@†Ë„Ƽjîùji×µ*Œ’ks³Z¾¾Rä$KKå*@eé÷q³TD‰cS˜,í$6 òÙ\·*(±h½ †v*¦úP׃ù‡êŒäjqv_ø®ìjáyËìégE4ÖÎ û:KF¸No ¨Ã6›|—e9‰Zug2c5z¦ÊíÕ)h×,l‚ÙrfH·ƒ¾T¨ÕåžyKÇc9È÷uã@?:>:A«ˆpÙÉ5x‚—³Û*ŸÖR¿ zÉ £}ìa€6&~í=Öèô=YžwqRy½x<Þ„g}Üx2tx‰¯¬UMå‹mzWí±^Û(øŸ±>Þèi$çGüið÷S¥ÏèÔB[•!š_‰ÃÜ’[ y=ð[Øúæ¦]é3:‡ØM¬Èé)Il/6##wÒÃP ¨!:­§u²¼rZi6xerdöÀ\ÜüÙê°­³ oÈÇíÒ³n5ï—Ú²PµN\ 5Uá7RA:E9BX|»\Ù‡oÙê¡D÷˜Ñ½só5’ëÄ‚úœ²”ó æq±N“uA¢\Fh)O¢Í"5örŒÄGĽÕ45]6Z×_¶çû«ç•¯ÎL˪!Ìùz…&Í4I÷…±¡Î“ÝzU# ªòGÖµõô½ZNıkÉtòCõqá¿`Øš j¶ÆÝ'}²z$Qè)Þ*K¹ó¤Æ'(ŸõqDÍk»ä?Ôcôöd¶KÏÊÆõ¾ê» “5|²ê¬ ©wÄ,8T×U•ï.“íËÓã!jæÀ[)ò]kFšÃ9ôáÞȺCtñ¼tQFz5`ÞÒºð§+¬%õ³‘Øè³­’ã¸4Á’F@Q6rijõö¹Yàê’·.ËÄîªëi]O7úY—&œœ j°–J_ö"¦²zK7¸v òÐþ•Òr]Á|ä³±}^úÇ×w¤v,ÙûXW¯]diÎ>Ÿ‹ŒºX³Õ #œŸÝ$íƒ Nb×NX–+'0÷™ûÒf[Må MÜîbjü~ÊgÊ[Ok DàÄʈ·4!wDIÏ~ :xi]òbï­O¸õ³QpÊÜŸ0øú®“)ú†rduH=ù:ÿ“Ö¨øä»æíã»úlJ —üiOH tí“wÈ'³ú—FÞU ³+H´.;¿© ’‹Ì»€'Ï5™Ç~þŠÁš@ññTkŽ#»_ë¢üÙó]«& nÍ\qÀßdÌ,7×'À(Ö5¾Õ©åþÔ­Å!úÚ·NoªpŒÖsAÉG>pÐÕ ˜:EÐötºÖÍ7 y]œ·ñ¬ëùŠ×Þ=EžÇм¡³ìú~¼ßlùÙ­ü¸1oÑY8>º¨ålù®ž°p‡Ü¡¼ W[7[ö¼ªïÑðJJR`s‚Ï–Öe‰ÉT1Í­Ä¢•Î%:|öÉ åÝì…‚à:ÜÐö™ù>ÈÚøÿ4ˆî Göîï¥PëÓ¾>õ.ençáãâ®LãÎÛVO˜'Ù*±åô|×ùdxµíô] ‚²®ºSÔc”ÍÖ@4üÍZ:E­I¨ÉÂzÖÇwõó‰^ýæÅ>Ágû"ãº' ïQð?ƒêi(À8¥»º%£©Å¡OëL"ÙÆx\êQ3Îý:º¾þ¹™­o0ذa½p^Nö»Žð3èHÜ“îêªKêû”ëÄŠíGAö–öÑ £êŒöçâv‚æ–u”Ë"á ÑšCH‚g¿ë|r#ÐËé'ãÌ›Ž¬ö’¾k?ò³0›Ý³k§,]á~’F¯Hø®Ö´àD~ÖÕj–ªˆdÊ» ø©Òòiö4И[Y…å¹ìºB‘u™Ù¥x‹ÝDfM}}"ãœ3S|Rø½¬~í"³Ù\舟ôtW–×d˜w¨ŒÐBÅȼ«—Ãˆ­êö›é§é›@ ×§„A¬2Ñ2&k “ê©Ç.Õà?ÁWPð G6f=zà}K MÜy3LþøæÖû„ 8UÒÂX¼ªò/ØôH(¯™d6Îþ$J–4ÝôCöLäýÖƼìj¬¬Gÿô*ê·}RzõcÍ:9IzW W¸ÙRh¤œ‰¬žëü,Þ>1‹ù¡ÈXfI7„جG»Y3>Š˜7§ê!Ô64g•Ù¬vs¸e%BÖ‚c}"ÆY[9nýv*e]µKð h÷Bý4§ â@Ó¡hR]È®ÿº°ýÑ––Tfd…Ÿ½$¨Ò%Š«JÈõžù>T»•õ¢ R "æ]ðd7geshŠ}QUwuñ¹…þú¬efãþñ?½D©×\W0—é:è&Òûí‘éÙ(õóÙ'Äd^G¢rÚýãS9®Á⌔ì¦ZVñQ?A°=Ž``àlòyÕ‘˜‹RoQ¢¥AÖô™‚ÏþK”;qØPa¯Ð»©+KÐQWV½­Ï¦¥tùqØå-4(óqUH³lT•!¦zµïbråÝy–.8¶²+pó­3Ï ‰‘Xý£q]­W/Ûê”T%ŸÛøÞ«(T¯Ãjp¡ô‘÷Æ}ÜöY‹fÕ{k^‡YÄHu©Zzv«ê£ zÎfÜŒé­Õ,AûJÂ~îúŒÇ£±„ö _9R—:.wJ ~_ªè±Ü”›D}D¿K>Î1÷3^i'8Go¢ÖÉ"¯­Å~IÔu Ú°ûËR ?™÷GeeÄ;åã Ž*"´ŠfñÇi¬5Zìj^zG~L¹«úâ6çT¸XV}d,yQzËùÙïGPqäy@÷„MmoYX‡Õ•Ðë²0à~%Â,ò=œ¤{z6–èM‰^æã棳 Ò½7©”çÁ[º¹&cYEæ]vàr±¾”"c=Nš¡„±–¶”JZFpÓk?¸ƒU«>ãžõbáŸÀ)rFë)þ‡ôd,!8€YÙ-•No5­«>¾—g…·ËáÕ·?ñþ¨e>Uj ÚîsktãD®DÓl_шg4õB1…QÛ B\QæfÝò ¬ ~pWû“ ¯–ÖÕšT¤]ðšu9KÌÎ^ Ý•IJé~ÿçí!0!ž€wšóJ¬RÊZ”:ÎÍwij$d †V)™ð|@™…IŠCat*0¼;C¶±Þô(âö¸\× Õ„£¯BÐ…µoV-vZ’|¹î)Ô¿‹”ÚÜBZÙcd¯ ¢6äDÀ®9#2ºÂëä=Ù-3ûéçH ûú.}"kv%Œïø¨š¶¿Ñ\_ß„Šq{¢ÔIÔêZkˠήYÖÙ$÷Øü”!Ü}>ú“M½Šê]üDÀ•¾ößWËõݽ4gÿS¿2µ}úÐA·ïM†,ØÚÑ«ÿ6‹Ý× z¡žáü <=?¾‡©@ øÒN…NÔòºG’¡4™ ›n™±¹'Q+„ànåªoç0 äGY7«¼ÄWÒÉ{aà; ޲ÉÿdùcXÍg²æãáy5ÿM¨rÍ¢_¥Ô¸¿M+Äý©“ âê{³…pk— •4ž Ž “#P9.õ"ºCb¢`( VÝù=êLßUÛNI?H+šsduÚG?ú'4 W2˜BÞ&7ÎVùÄÌÙs½ÊÅ:è§9xlmô+ßå¤JìÔÆÆµ†â€š+ç9õ3ÃìurtŠyy­ŒÁËUŒäR =pȺ̥x<χŒ­ôr2n·©""=óJ‹Àã› dÌìG‹[ÞûˆÊU‚mQWÊ‚íÏÄIõ•^­®uÔXO/ÌÁ²Ô‘øÑä?ôû;úû°*ƒju%§¶Ï²×[©ê3ö£Ž|÷]-5Úº •´ÿ£Š\Îg:‡‰ž7CÖE‘öªO*Å™ïŽãæ>«÷³-{ ôG‰Vkî»Û‡¥Zµ…`öÜ]¾rlióÓ>[ԼǛ]‡æ&J};•Å[lúÛò"mî!W¸Çâgc‘°¤` ÊNÊ%ïߟ§Ê25«ZÿÄ@Ì’?•³÷„y›Ç¤u-Ì0E­àKž)d®÷·vßr£«—í{n]¹Ú[Ö…ûëG–byÛÑ­qÒ†’Â;è¥f]ËÓ˜ŽýÉ¡J.™Uq·º‡ZEÖÕÄámۻؠêPßMI¹Ù-UO}W!à°™½Ûº>ÏÂÝÔæÙ»©˦˜ yð\"ìþIJHî}ÌíëŸ x³à –ÝÝ“õhm§²õo¯öì%ï7gÿe¥±NþQ,ž\O¾£kÍ"8îßÏÓÀŒ$Ó2j ÔMß{6©O˜i<ñÀ‹Zä7{úTÞ|­G¥ZHS[r@îÓ¯´ŠT?Zo.\aÛYÊYúZd¹ ¶¬f“¼0мΞçä}èÛÙÇ1sf¨%7´·¨hÍ=~–WsèÀ\çZ¹4¨Ì P ‰i#mü͈Q‡”]úojô\/4›¼Ú9©< ¢Å\³0—Ò>¯lgæÖ÷‡…¦.,ÑÚWÉßåÝ•¹‘ÅÅ4ÉÕNnÍ¥BÔ¨ñÊb ÁYö–íCEZeua*f[„zT¢Þ˜áVÖó‘l—›BÖ{óÙ§m‚íø jâî„ÝŒ-C!/a…Ø1’³i's#<é'£žO[ÓbOŽdz%úN©ÝO‘W¿9ù-ù½×ÑêPp&jAÁìn&KI9$©†µ÷äù²¼›t˜ð˜Kìšð"ƒ”•ž.$!4cnz5!„¬Ë–W«-7€„ø(¨ÏÛˆÏsXÒ‘A™{É"¸B¡Ù´|ª·9e;U×È5Ý¥þùk«í¥eXZàKŸ]s¾%ïÈ®2Ã섬‹Øf;D‚Fé1Ô{n÷GAáÐJIS»ô¬ðë|˜;'÷ø<*õ–UÙÞç³uSTñ9ÝnÎZ¬|O7¥ö\ÎYšñyjf#dîÈ£È5_-ÆMeëX9T-±¯t×¢x¢ÛQuÖ¤½is'kf{c“Ç=XV\†ƒ¯¶˜‘!€®ÇØŒ$úÊî@’Þ>Ò+¥ÄH Ч+.™y4¶ œþæ>eCΩ>]‘Ze¬pè;wyk)Ùœ½"ÿq¡Ò›¶o&[û½®t³»Lò“y»9)BÁjwÿ&aÚì‡~(¾?" mr} ãÙÕüéQ,yiŒ=Íe=ePUCþ¨WÑÄ0w>úËP¦Ý½øB%sòšÈÒ òP’×§ÓxV³|¹‘Gi:ûÈ J¡^?$ªc6Ñè!ÿæ9µ8ôþÈ™ozµzIBí_{Ç{‰^h –­Óð<:'ý½UßW®Î=_sÝiæBÑJ©É¶*_ýÞ¼<´?ÁP«_—Ù¬÷Xߟ*ÝÔ‹AG—o®}>öP¯9f’•µÖ’ìãìG,°CºOß*zôÑ3­©Õ€„´»{SvÁüª†â8råÓ󾂱ûýe\3Ëoú„Qä !êQö7QúΊšC®55(M²Ö^)”•MdåŽÕcàTÌ´!hçÞGÅåpÔZäÂÅÌ+뽤|ºv¦6Þ¦ÿc¥äÁ‡‚d&t…¾†N¼…I,ísûI(txÀÙ¨|åŒ^¦R¡Ïœº¬ÊlêbUöãdzEîª>Õçè³^­¢éJŒþÙÕ«JR˜GNTc}¤h@´µAšÒxàó6ÒöQÐ3/™cü«“µÖ{²™·bÎêíùš1° Ë$Qä娲zÀ=&·ðÐg=äîÚɰŸl<¼ rc´¥ gæ>MhíICñ¤îPc ‚«²ç-nß ÒºÐä $Ë ¤@èaœ§éQ)4”0´˜î*º°ØC:g¸^”eªzQã³a4L]ìî‹Æ ,¼”¿ŸÌZ¡YÔŒ¥SÖeŸC«/šë-eéú[¿Ñ˪ÏÞ[²5Á”Òø…Ð¿é¼ «¾²m;EÜ-~²ôÑð7{Þ`PJžÎàF=0ŒPï·¼g⽦•ÂvÞ¤‹=0ž¦‚:îo=mK\´“b¢öŽ(d ^)ú‡Ö[M ¹Îv©kþëì©Ý9Ð*¤°ŸÌhèýa[ÈÈõð¥O²iðUüú‘£ÐºwãFçj#tíΟXå¬ïáýåŒÌMŸÅ ó<luüoÑÅÜ1ò÷W^"ÿËoÚ$›ta>û=}ïqR¦Ù›ZCJ `¢8ü=u¶Œlµ¥˜6¤ ª>á‹Gè±ÏCm`gp»TÃç©o•Ì›'3%æçi¹;î|çázŸrñéUoÉJ¯ÔÅÞ§}´ekÔÄ!yö“ØuÓ÷U£¹^ÊÓ_vöåN%3oÁ^ýÑ…B¥®Ö1u{(2VK»ì³œŽÖŒt!ÏA1XÇÞV~¤¢;¥7}RB6@•ÛlÅÀhÏ£O˜×6ÿ!³|©vƒaw§¹ÛãZòq½·g?N*ñdT½ž eôUbpk<£USnÕRÖ©—yÖ¦ŠÊDÇ¥ÊPì†öó]Û·¡h].“*š¸ÙÒä*¬‚y"à>M¤¸7>áH†sã]Z×rJµ¥ûôŸàÊ©Ç^Ûý(ß¶{ej —{Q 7Û'MÒášüB^-S÷Ûùàh’Öã“tä:¯öߣåApüÓ¡‹žè½?3.zlw\jWoGïšÃ™•ÕH¯+5G‘üW.O»í¯Ô–µ3Ö²H8mê'Xy5Çu‡>ø¡¹Ç¸W;Ÿ2zzo92r4íXÀ§Ð3FS'¤ŽÓXÙóæŒ“jGî›k:%+¤evú® ÅRÑ®S=Ú*ï€Gœ%è¡J“§Zå(o.–¥ ´ai ‹‹Ï¦ò-øßú|Xá¤ñYRÿx¿¶¶Bµ¾ªó‚oÚ>¨6[¦€+EJ.SC‘Gsm„«øÐƒ@!Žó=[iÆu:ÎfÅÔ+_¾ÓµÞÇ9Ëh—ÙÔY2³)cgë¿î˜hÌ/úÌÔUŒÈì:ŽC#ÑþXÞ$ÕòÓNsú€Œ:†ôO.°—ª iO(EÀ×jG¾¹¬Áƒ0]¢uÐw½2}µ2#öTª„ºöN©ÌÕÊs¦È¼GÙz/õ©îEsÖR–”$îý«ÿz¤X€‹‘Ú²½Ÿ”ø´SßK”VýXa!Û®±+âåm&JæÂ™\(7~BY¿¬Zð„Îen4|;‹¼zÒÕCúQ©Ã|”òOSüì®ìXàÊ ÐHd[½öP­kâÎ¥à” &ÑC<»2õ‹‹[uSj1HÈØ\ÇŠQYiŸw¦äݸ{êš:”nî‡Æ™X ]ló[_ܲ®£g×ëâOœOºôÃqDSuƒÅv2¯CƒšO\ቄªqïik¦³¹¼uXÊKsÞDå σœ¿¥˜š½fj ÕôéϺzýDÆzè¡.<«,`%ºàzPˆÂ©¯={6¡HâMM¹c³“|eíE¯`¤n³¨¼]ûë¨ûë¬ÅÍ.Æ5Ü…$5=ù¨U9Ń)Ï %É%ëµ÷‹Á-ô+‰ù´¡:S»Úºhwslòë*¶Ÿ›--?°Â_Ü9pèGúŒ>g<ü¸ëUÏÇmLa–*;ó©‹ a_éÐUºŸr«23õ&ç¤uÕbsìqÏtCeœ,Õ2‹ ªï’"Ùs6Êî!îT…lßAº+7Î4VËKS0¹3Uµ´.qè<5æ¶±…þ#×ÆÓŒ³%s]×3ôGv¯Ì¨9½*Eò8ó\aÊË›…†p§uaí¦Æ’Õÿ â¸P[zbe4•SÏéÔ¨ó™Aî‹6P$»ËûÂÆotÙR_lœ¢^/žñe“ÓEcþ¨×ÛôGVK¤ŽÀ¹¦ˆ/[±’¨å(¯¬OŸqŠ$¶ð˜èÆ©Ô8÷¨.o9ÅvZŸ¦P–/)P«cê ͵Òl¬þx’“¾+y¦ì𧮃~nº€úd¿ž>j©G…Ê|{nµ+rlñž5•å2¹m¾†€:Œg¾î¡Rq¢<‹“Jiy ’<¸7¬O޽ ž¥SVöü¬©-A]½"g`­ßXî»òã¸j=¡ÙÔÍdÇe…0L €<Ûõ¦š:ˆIÓQž%ë²2ó0nºO”Jþ¤>B¸pq¥~¬ à—,b'½6Z«ûl%kçÑÿ>]ìÅ®H„¼tJ³•ª$ú–Œ#–Šd]ûIçÄq¶Ü‘’ioNš V!vJ°ÏÞ— ª])n4Yöó¬ïÐný¨ÏLEÚ[’ãÛžlìuTWÜOãŒ.§~Të‡~dîõ±»Ã) ’«Ï„u½—7E«βWJDŒý„̧Á?i“³-üÍ%ËLT7Ü&EX"8Z;Ê›?©á¶‚:yÒ‰ ì .˰®ýHYÝä›Ûc­}T«+€®Ç(¶Å0ã¥qu§ZÇ ÿ Ö¾NSCï‹Eº“Ò}t±_×îy¨›šéýé7Ñ'¥Ä<ð,ù²‡w€%µÏC™­èÂ^à3À[6•ÇR¿ ë í#»§· ÜÂ?5¹:>¯'\ÓJ7YÚ9„t9 ¯'h €Ha\ìë‚ 5•ãblYrÝœqžŸ%·°ÕŒDUŒ9&!žNC×>2Û$¦ ôÙ%XÏKlIµ”ƒ—xÄý  :ÑGަ–Á 5ÙÆÀ”‚å.¬ŠÕO å*S³jTúŒ®¬}2‚šGÑ{éo9<"ÇÃö¿"ïÖ¥¤çT ÷9¤ù¤‡Y¹Ò…~wÕý¡²àÇáÕnæP‘+w‡Þ®bã©›žH”êiùí–öQ‘*s»Ã¹iO®²ØIªâ½[’šYzÒèÎA1Q{±Õ׉rAÓäœÝ«%ÆŒ¸ r+yo¿M@ë§.Y]·Ë=jྊa†(YoZ°tXûTàêI%jwWåðÎ, ”ÃlY±»" vBØ+ô%³3Ô“²WyU¨œqèyPÞÞ)·×*éâ¨ä®°¯&‡‡±žp‹WLéµ}´6 ™9Ô#îƒj-¥°ÍɲüÞm\e<Þ£uÝ<0¨ØgIEwûÉU†ªœ÷íÀ›sk&™Üÿì¯\#C_ÒtØ ¤"ôºªçRY’g¡=¼î[~ß¾K*È@„Œ³-ñ€„,£îSf˜âëÆNÉyãÛ‡ÆØÉ€Òj¡¼F•ø9’¡+oŸÑ—í$×¹P×q} ƒ%aãàâV²‹í-ý l î”ü8ýOìªìÝå®ì¤¸‰ù4”ŸÙ##UuB:t¿øqP4ÒˬOg&ÌSNe‘W«¢¸=Ÿ”1†LW£ ™wYÊ8±]ðL Œ‡[ *×"\4ÅD½‰TY·bW¤ï›]¹¯äzîµX¢D0÷qáD¨Œ–Éc}HAÌS$oHº·¬ ×ù{wS ‰„dF£LL(èk0ÎÇ4­ÈˆÕ¹ZŸI^áÈþ¨ü<ÛxÜ=­ë'P]˜‹CåÎ$B‘ðþè%¡w§A¸D´’çzƒÚ§r²@¢dœ·˜#‚PèÔª@Œ/v±i„o}пXa˜‡m,‡ÂvM«~³)¼8³] Ê輆™‹çè ì¤äœg}©Æ¤q†‘áª2÷•ÔÂ.°*6}ËrÕªú¥œR²Jïz§g…§:µØ.µÀ•Ü#8Б“©Õ§2]‘^$5ìÛGCÅ.8y>™Í˜¹DºçàBÔO,¡f¿Ò÷ª.0·ý»]ÂeÜ¡E¬B츻úY¢³"#)-ò“Å*xÇd(÷5ij'oœ‹åˆaÉ}=_™ïEH%ÔmÿʫѩÇ>¿B‚ŠO)I4Ïsž» ìÑä6Ó/îäîq–\w—¹².ËK¯¬ÐNYÒØAHVÐr¤N„¸~Ó"[yDÆ §`¾G¡ì‚ ƒZ“n*¥«Ú²Òk3³ƒUˆÞuSÛ™¬ð6ȉ<@VX~rW÷Ô4(0ª¨«lqƒ¿v\ElñÂÊúɬ>¶7ß'€S¾-x»¸¿Ù¦2êSOjdÙ¡ T4šðwÑl¼ ˜RuˆâÞ"þÊm£¾µêPÐk¯§1Boà¦Iž'sàÿÐýñÆ¡WxLJåâŠøÁ×H¤¡85yºg(À¯]²«àÌŽTÿ´÷*v1Hµtx ª¼¨O€$8~V¼$ç8¨]1óœÏNBÿŠHßu3kŠƒϸ)’Ýk¬0® Q}°1 Úš cV¯ê‚Ý«2×Ðà$8¾6(V ’íšPs{&Lñ/h¾¸Â¶òT\Ô™B>«59BW!à}ÊÁ¦/ýI r?,Lƒ#æíµô%w…• yž{¤5»Rxqç!ã(€d!‡1þôdýˆüÆajçR-nh¥0E•dLTØ$iF; Ž^¬wm¹”fŽcóT©‡©žåbSŒÔ k],ºcß­kžEÂY Æ*êyÀUfáŠX,Û Õ–k¯¥³ râA²jíÓOxËc^+¯™ÖuàɨOl¯ÐušÚÎõ‚$VPÆójŒ"Ï4FBfÊH¡u3¡oóY ¤˜÷62‚ÖJ¤‡'Ü'Fi©ŽÒõÕ(•hóµžlÔS ‰·?RÃÇìiÓPj-LÐaà…Tj •âI’°é×WƒI¬†ŽÄÊÈ’+ú.Üù'×^o—i¼ŽDaÀBGâ02úŒ–¬‹ èÌÈ6€âÌ»6(Y$÷8Ñ(éÖæ%½1êµ^ejV»%±º9úªŒÌ|CcÜî>ÕùlH»³9>﹫ë?9am+eäZyœX1cÏn#'NÍpº;}×ô FÆí · IœÕŸÊr@Dº€Ú¤eM RžÏšÅZ¹›Øß±½Ð•òY÷òã{´’thß §~ixïäв.™Ã<âì†Êaâ}VÒóÜF¢L0оñƒÿ8‡:íóä' ç·ÊžÆ©)Ãy)Aû'XòNS]×KaBu4…Omœ5#f#»Éî eHW¸\ƒOn­½NßKÖ^~3Ú–"ÙèØèãІ¤ïÂ~cÜÇåj7ÈU²ÀÚ;w±aZÀë‘.så…_šÄÔ•^¯ÑYhºNk yÐz—Sêï±FqJ@=ö®ÔG¾E\°µ-Y³‰d&Á „x§g:z7g|vЕQ[zpél£&+CtfVS\Ã\P¹Ñ)TjŽJéœR£ëã‚»=Z\‹âÛñͲ®ó40? ¥¹‘Y„¡ïrkrZƒž£° q±˜ÌÀ¥åE¬"¨œº›ÃŠºá},q_(^hÔÃI*'¿ÃyÓ¨`Œí1VÈR% ã‹ ƒÝ~h]æä 0¢'œ»õ#µØZbO_¤ôðX.ºaH‘¦66»Їy—Cg»œ4–d6–{0þE“SË©–ƒm9(êG*iæêãê‹ÇõÖ¿6›,çâ2xô2ï™,£|‘}4C‹¦”¼[ :rCV€TYÞì‘uí˜=ëº1ï‘cDƒ£‡–c³ÇÜt¦³ŒO%w·4²ÀyÉŒWxRMfrd¾ßÊMëZÌEá$GÕ«@æöQ"öVs~L£Ä®ÒRh¶ùf~ÄVòwÁm×$ëÄ~L„T…¯y—¥ŽÄ?9ðGsɆ,uO¡uHiFk{ò€€-„î•}ù˜dŸéã€QÒVŠú«¼ëÌ“ìbç‘t…uÕÆTħ„±/ÖÕI Ñ×QÂÇ•Å_ƒåf±?â‡À†÷‹ÖU§´e'¦m)L1©ðèçªE;ý%Jë’¬ú|{~"ß#"DäëZUvëšåŠ>}C%íª(s0Ðü³Lµ¼iWdÆë¡ÆGИUQ² ¢å&|0#rÛ²9UCìk>«ÈÝMZ Èi]í*¹Qn>.Þ¬Þb+3/-v<3þ+¶y9OŽöï Û€s‡ÿ9Á&ÆÄœÉìÓ‘õÝ’Õ w±1ã£í#=ËŽ„k˜2w®_¨DÞ*ñª¼ËÞ+(èýg6FË€ç»V€Þz´HIp±S"“DV¸S–ˆ¢’eÌ KX’ñ¾?ôõ#ÔŒÊ÷T4ÀãâÑõ˜Fñö"ãŽõº('ßj÷xPW&xh—¡æô e‘ãu«d!hÃÑ‘…#5H)7z(Ð J› þÄ(9òE@–~(ŸÔöTyd²ÖßÉ|¤5¥e”kõfN~š†¯Ê$z«ä© ÞÔ‡]‰D·2¸A…¸¦ö#6røz:¥„•¦¯ VÂl®›Ù1`¡4™“ƒÅª •‰å1"[oš3Â;< [Ïêa(¿wqù mPŽÔÙ>T·÷SÈ…Sy-µ¶ÓÈ¿ KszJ‡ìõeõ= CÍuM‚Е´ÌÄA S?ž>åôzWÖ…MÆ_³Ò^×qðâ+Œ=³zÀ+7/n½¤ð;OÕ6{ô¢aíIˆã±’P¦ZzjË¢ƒ—~×NØÇ„Í¡’i–º(׊tAí›§`ƒ8èÕ³[gl…`ëMEwÌù…BXõ&¯è¸_Ò(ð…NZ—‹"ÿ2½MS»›:A0”+A°ƒÄm> þiiQÍØ»J¸Š•=õéF¯©6ù®áÄGÙ5¯÷( +M„3› Hð¤ÚæŠL~\}€zøI¦~oÛ~øø—Ðô¡ž°ëžPi ,’iÀMÀ÷Œ! (¢SNG6Ç™¯KªWÑñÒ“ÿ }r¢Ñ{¾ÌC²²?áë[RZ×Ws³ö`î5ç¨öÆY@‚±JuO%áÖö…¸É È™È$wc¿Ë±ccÈãûðü}v)?°º˜ÿñì …¬ b>ŒÖ*ÌÊb°£pN¡x]P§þ¨½ñØ^5æìŒ¥Ï«ÜÁâ•Nš‡25î±m©¸õO¹!K¡$€&3üh©qïêŸWf zjåt žË¶Ñ.Ÿ±³=†%gcçà¥q>“‘(ÒüÊ4cBGm(D„;Õàèt.U†  לŒOrdöL?)ÔëÏP?‚y»ÚÃÈR®‰lÕ5PR’qš?–©Ù1'¼rOÙ §Ðäã‡w×'8ê±É‘YzðÁWF×ýü$T7ÉÁ!-#ƒjK€:PÏß’iœÅí•cŠ6R‡Å¬8KóçŸ~Ð\ –ß·(‘|çµ lh$`¢V6À½Z– ŽS©qÎ8@gÍ!˜eÄ…?šµ.M±Ï•0“ËŒ¦W›É†é¡udl_!s#ûGé_º«0jнžÂŽ_XÑÊ~ÈÓ“L¤ÀçÛ‚=åCTÛf&Jõ ^"‘x“„×Ú¹ùuÞÛTªg´¼(Äø(±Éu옔•,ä–oH \ã*s3‡pnÀð*ßµÚ" ¥¯äÓ{§AÕ^>¼Ú»²q¿I ‹ƒbg˜_‚ò-Aoxà– zVhåûg)¹?>TÌ»Y7cÞŒ½¤œìb1ñZ;õÖÖÛG…±4å]ü›Ò+v~C·•(ù$oß«Ïe>[-*·Ì¥ˆMÒ+&=GçÏJ%ΩЬ3W=3Mlêl\ÔuDkJSAFú¬ ±ð* l &{á™3¹þË#бPß)Eˆý„Ãcj®B„[Ø:=ô˜•¼%{¦ƒuª<»œÞØúþD­öúh$Æ”_§LHíÇz[Ê‘ÚgŠ(LŒÊæCP–ÇQx79­­„Ù25³vy€ Žå~iù#¿íªÖ—äFwþÁWÖ¯œz;_Aá™p8¸pMbáÔÔÍa—ûiË®Ž£™gÉÊé‘pF ÝÂ?E‡Ôì?ÁõÏ~ÉvFq ØFéYÁ>“¨‚!ò¬î”˜ý@^–*rþæÒ2š••yóãzÛ fÛUl¦˜ÐÝ;œ½Í¡`?ïgÖyÆg4u¯$Óüq¥>–ÚÓº¬0LeþÞ¯|€¸½¦~h­ÊÕДÜ*ß=ûØ‚äY‘¬æ–`ð(ug``͈‡Â™À^»¥Zu^ö»0'žK¾ ›YFQÓÙXJ°ePkî\I¾6WçËñJ9k±DRsÉ!bòqkí²;Km‚ïýÈ=b ÷±ýõQÚCYÀ˜Ò—$@:’ÕµZö"ÛØ5¶Þ›E•,óËÜÊý@D(‡`%ÚÈ×¼:‘³N¹N6ÐÌ&K1Û§à™¯¶Í¬h[Ýò]#U¨`jRðòE“:Ž@÷Ȩ­ìIy$±a]}g¾oÅûLßeIç‘èúÌ, AÏ"ëßyŽnÀ(ßµ_MÖ•ÒNh=v‚´}N\ÒºnGûHaƒu!wZ/2‡ Ö!Y×i5s<8ÜŸÇгåð֣Ћ‹¡ŒÚø×XÛúÚXyUY!2ßGö;[èö„˜dN—%uÍÝ5j“u­¥ÒÖ9>ª;u‡÷&T9V󧬦€»¼oeÂd¡ªýæG•·AM»«êô¡qØ™¤Dç)e¶4YW+‚aO2ªÒÄñJã³­7–Ö?1a•°+£§uµÓÒwÍ#Öv$pZ^L(2î¶©2±~–†÷ä¬%Ðl©¾Ù\Xz@²®Ùš|’ÝßHëšA…÷¬ëÖŒŒ À‘uYñ6ôqk–ü8+o».0\IëJªwFonô˜‹ägCd²åé9]›¸Ø~Fø'X7¥ áÃY {ÖÔ?‰Òjé†Ú[~x¶ñ›òy(L§óbÜ\QYK³Wœ«1ÒX{ù<ë*­fMü(Ÿžïê© 26]àð€4¢çÍ®z32žN­_pæò»3âžÌ»0:UG~nuµÓßÉ»+õ³‹»Èm“:ÊÊš±«_y×QVon1 ~ CÁÀAžÇœˆÄ`a6-ÝšUË_0pI¸&œuè_nê¬û‘ª½>í±»è¢ŽÍŸ,Ÿ?  Êuµ¥1dzàöäRHÝÏ|«¦K)Ð0•´µÒóŒKÏ ³1ãÏe¦1ÓwA¢%­ëé°DdÜc~,wÍOd'wòN©@ –ÜUt!¯=!½d(S>©¾ÀÕwŠL8%ÙÌæ´i”~¶=%Yˆ5Þcgó}W5#ʵˆY‘³(±¯þÆWTÓpô_ÆwÅo¥Êë~ÖUÖxÐzfëÀ4ÐqNFÆ~ÒÇ!f¦Ã»«ÊÅõ!Ëm¬©Âº:×ÔðíÕí³.N™| ¶dÞeU Û¾|t2ѵßËÈØ:“Ì_@h²Rª]°jfM·®ŒŒ¬Óï!Êå¸6w:¼¶2‘·dhêoêcÒæòæg5x·žeâ8ë»O¼SY» r’œ`'$®W…4øP²½[obxª%õÙ ¯ÒzsuEeõ3™þ@$­Ñº€²É~W=Òv퀄¶ÙWý8²Õ3*Ù§¥9”§ï÷œÍ³È?ak£ëG`è‘ÎZwÔª3]¡Ö½|¸5=ëùjЂ'*‡¥ð -ˆ¡7E~ØSFƽW¦"–„YWM˜¾ ¤ß¸uä¶eÝ'sò¾öJgca$}æÉJµ°ëª û¦»zÒ@aÆc¬Ïk(„¹×•¦Öo_².ûBü˨Oe>µ1*“6é3p‘ïÛ ÜÕ™g(3ºõ-Ñ­DÉì)¹Î!¨ä+ ÷#[Éð‚‘E¥N—÷êWS;À¢@æ]ó;–Ý}®,òÞÐêÅÌØOëj­dÈ3·[A$’ÙÕ©‰®³S•퉻_iY}k¹ÕË\l›¾ †k@{~ v ¼ï².,J©œ$Â(¼Ãî9XBî!Ïê³t67À»¬×Rª­imCµs3LÖûñ]eröt6O& êö•_èÜqÇ&µìÂZC(e%Š(&AçñR>¤Îœ²®9+5lü }ŒóhÕkö7,û­9…Ù]š¥bôvˇ%¨<â±h®çîÄ;ÔÁN%#4»Í½ˆsƒ(e°_™fƒ5Q™ÐÉéývËZ|àúìóxÿ^멲@‘è߬X+kÆ»’Š à‚DÏ!ßµÀ¢Êº¼ºärz‡ÑҺ셥ÄõyÃkŒ'ÏK”Þ*îëw±æø þ®Ä‘…÷ÈfO3.·¦uQeò}¡VZ˜Ä€´žíÝúÄ€æÛÏã¶‚aáz¤ËìÔ=µ‚}Ê»c”sFñ¸t—Ï6w™™ïߩƽœªò}d9ô]×7{õbÊú4×›Æc>t<‰0Û?².På¦9ì[³3jøc6û&BFú‡PÃfSļOÍqo¬Ä£}Y:rÑÿäMŒ^¯ü~eqó'zЇPóØ›Ë0yÏ'ÍQÅàYK#ܧ|VƒÁ¬EÞ¾i6gœÜ<mJ~Ü$®ð××4TMä0¨{?«,]m tä5ሒ*8¾}Ý„D?ᦺ)š{\Ÿ©|ßÙÓó.¤œ‡fƒ&RËáÝ ˆ;²^8m{¡Ø©À¾UˆüqóøÔ–ÂW5¿šŽ³ƒW––ƒûs6ŸYn{dŸf iŸöÏìì4ôõIýJ¦q¾ˆÉfŵ ½ç,É¿ÒOd6êH€úåƒ'¯œ3"û¨‡Ãe,Ž®²hpýŒÔŸIóÉ×<ŸL× emžL”FO³Y•)† Ù-~£êtPíaeF¢e™™‡ÜZsê¯\qˆ’oÖ)K®H°ï7.ÝúIüêÎÃ3”ùJ³2«ßS°Îà«öõn¥(fB9@ T^4VTÒ×<`%à…ï<¥2¤WrJ`Œìn)XÀðÆú¢,v £öœ2az›­~ƒóýDÆ2…ñ°‰M—¯¬–Å*W£¬bL™Ã5ÛÌŽŒZqä]\ [YQ5â¥åʦ¹….:jO¶wZŠ%ÙBèç¶Œº½~>nìšo´OÍXÚàˆ cŠ“š•ÔæÆX¨Ò ÆcŠ>Vw²«!¥6à¶Z éZ%øA>³Òy[+50í992øsm,¡«•1³v úûKí3È9梁w¥l"Ê÷Eícçãïrqgôäb½ä8Š„¯ªû&þÂÊã~ò'=C0X>ãž*øÅå·ïºÐ4üéN'¥¡j­ûj)³ßÅ­s&ð.&ߊm8„d¡+¹r°$€·WYÑzÕYZþèªkî÷÷ rm$¨̞ÌP؇$6Z•Púí Ô.ƒšãà×$A;°V2ü ¡Ž]8á¨fh9öëðgkãë»ZªH;d;×€pÐEÞŽ™ÝkF0„T• XF'Äae@ëàÞ ’Â>Ð^å ó æ§Ô·«²Ì®êt?Ê¿¸eäJPýZ{­ñ¨9öiMè~ ² ÃÓ¬zÔ{ófG#X˜á›œÈu^JÕmÒ$ìŠí`{Âaú]®Âò†_L[rqý± >ò“"q¸OViž³‘o4fÞÈš. ü?£D ø Ûä¡z¹iP?iP+w‚ÐHÌiR.F?¨%eÞýZ×,-9g­Ð©|à€%‘™¦öbé‘T¾¤$ …£êLòi¾³sÓ­Í#Õup{¯ãƒ'J.5Ù]ùÏ£E£9´¸¦LÒþ>+‹;JrGb\'Tµ¸ÂƒA}˜Þî+òü. rÞt³S6†¼+›Ò–uî] »‚ËiF ê~”Ì´Þ¹âÒ…ru±žxùãÝ<÷¤¥H¦ù×ï/ã0ûÂËצÙòrñy¶?± ÿ5 zictÕºðP›Æê‹[¼#ÌÎ+5©½•Ò“bÞÙGn3—¢ÁEóžò¯ôfל9OÍyÏN˜ZÍJ¶i]–8„^`KìX{²¥ÑK+7Û¶½ß4ÂS´„W»¤ ë*¶Sö‰ý‚Ìš, ÈÊ\]Ÿ ¹k~;P›¨•Ò¡66•q‚çKwŽ¡ªR|;ó¤¿ßÞ%%ÜxªRó¤·–£·ÚoBºÐwȵÕEñyà=-úkp”‘ìš FÐ…åj[~h#¹¡mɶ6zÚcmxŽÛÒ jcöá ª>d] Tù‡áò)´b‘PÑ~–˜ýSIEPŠJ·.UÄ"ÿGoG[aaj™“¯]S“$WŒÆŸÈË[G/mt¶þ»#üÒîTÞO{É@‹6°FSE)'pÙ…Ç?©£ªæm•Üg_Kq‘‹&‰sªY5Ft;ÛóVê6}ï[Hþê«mí#샥)t¬Ï+Â@¿IvwûÊ]BðÓ)*AnÞ÷§ž†«&ܼ¨=w±ˆ¤‹qïÖg×Wϼ¬ðÎľ[è)꘳:j²ØÉL=o;C> âйžeOˆ&Y½W/ÿ¹¿zìgnŠiãýa:ù÷£Dê½R¾ÀMT©îÕ”Ò,Ö vRߎ„(ôShR‰¶­ÜPs"¦Œ­SY˜Ÿ°=¹ŠLš?éyÆuž¶exÌÛ—þ¦s=–xÆÊõºQjrvCÓX¾Ë2Î, Ë[‰uþ ã¥u¡½¤tý’iêAnz‡±·^3´wrõ™Â oc»mN“(½ß_Ó$ÏÊ÷¦O§çò4ÀàŒŒÁ0(§‹ròºÖPž)T=Õ—8ƒÊ¡êŒÚ9ŽÜ¡FS¸÷³¥%=$®wijÍrègj@™žÙ?ÔIeèeAß9 ÂòCF˜Ò›bë]'‹„ÖYÿÄMFhþòCKq$ ÛX7[$æ5šüç½+TŸÊ=aßÿm-?®öaòÑêzøæœÒc^ûnÖ‰IžFˆï=‰?OÏ„Ûθó“ÚÕè‹É«/¯p³ºVîA ‚/¯*Kâ‡Xj€[ö™Îæt²òþ:ÌÙ•ëf^÷J±÷[[ Ø/rC––|„ºçJ¡F‰AúzCÕJæU4Z…a@5ÖÉëÛñd]®©ÒŸ¥ ·-$„èíP‡ ש‡Šo>6aTù÷ñGGÉ\\ú8m˜ü„Ò‚Þì"|ôàëÎ@[“¾!éJ¶-±™y1ÖÇI• M"¡aÓ¶] öKÜ|N|T”ûÙ K!HûÚdÜvÛ0øc©zá]­žaœÈ›ë½çÆÒÕÈé×gì¦KšRí¡ ¸¿½ÓóÔÅ W‹T†  ¥Ýô ûôu.¯ q©CñP cÔN¾eW ‹JìA½ùîÂE—OÈÜïMë*)‘„“@BiïÕï§éý±K;"»_tqVÂ|¤sn¿ÔÉ»°ÂOÅpjšš•ß×\¦`úVSú%Ä3÷[Ç3.fò‹vç^í1Š"ž¥ÆbFÄc­èV×]ò‡DµhO”5ô½Ñ¦Û4!ËQÛÔ)äæ»¸‹¬ Þ†šä׿†»»8 !q‹Qü3‡Þ’K€Hý4^ô¸åFcÎä=êO*óí±ß™ØÆòÄ´Ý)Ù!%.êV ¡|++A˛ޛ“‡j£SkÕ†R2y4‡ƒ„Þ+]ÖùQ]GåŽê¤ü9ø–{ [:%]ìîcÞ÷{PMØT.v²ÜZïµS×{|›uË5Üúû8ÈZ_Š¡/ÄwJÚâ`r/$’Ÿ_ÜÑX۔φÏ=”rõOJž;7ßzúŒ>a¥:ôOȶ]~B}4¥O×.bOh¥@Õ3þÙ€ÍQanøØ2>ÁuÖnª4•qÍ/æ’I_¯Pá÷›â!¦"Ä ¹Ã“9D·ãÌ©œJïfagòã@yÑù¼Ì ®r÷ñQܹow*c[!ˆ Bßoßû^ú›$\^”£Ç€5µî‘ã¼ãÌçà> S Ý)ÜSu,³z½ÆÖ[˜ÐŒE†{D*Ùùbv¥†7@S—rã.&ú½ƒ æsaÖThK 4‡‹t l×÷'*/Æfº÷ckçEi±´ÿt± u*ѬX2Öáüy:=+K²Ü‡}?á¢õBä€b/Ô¾ï«îœÖµ}‰ ëé·õ¾Œb9g{7[ôcƒ"»×¦ß[sRp÷T-Ðbúìr¢»rmoñ~pšÍª3¤°Ï$¹­°—ºîGu}ö‘ËØz¼˜Oö$Ę×sP1g¬5’Y+]JóW±iPè0w¾ ìÚ¾$3§Jßµ|l)º¨"Ù¥w™±Õ6) ^a­ DõPcÐ3·›½^ËyR°ÎÎÎTnÔfM!d«LZ¶U^ÙŽú<éð~ƒ2â.`ÑøU}èAË=^mɺ°GsÀ.袆"TîÓŽ®¥$¯³èè½ØCÍÁR=Ù%è©á2’ÛÒ²*À ­O¬â¶…®™ûpå”;™åù§;OìîP0›³VžÐÞèf±¿=åã&…t={ŒyÈÓY«²®æ±ªø°e] ñ—K¶å^ Dm†ÞŽMÇz„³Á†m‘ ížRØ“mXòøh¬|áºèbµúQ1ZG„ÞÑM•4KÉSL{î–¦6$óû“SÞWsôA‚kgAJmõõ_;¸¥núEh1mZ×hC±]»ËgŒÆï}b© ?ÁÝ9Jê]·s2I+V¶_û ëüäØô{»´ÔÛ^ÖÓÒºŒpÜúé—XþRôGEš~¯t ·ŽËAÉÍZz=ej÷äQÂ<™Ú¡ÓuAoaäpŒÒ­™(Õ¾·âCm]ìÞæ–AABJáÆJ ôê±g¦³idÆÿ‰BE`ù]bཕﲬ$…°,O’tjÆFi5_rjÀaçP&iCÚ™ÚÒOì­H«Á•¢Šš,½,ŠÆ¢s·¼6ž:=íá‘OLßñ‹9ã[IO¯«Ë;pñ•îjÈÙX¥“â×ö>Ö½yU§åÑÑ>§ÄE£Œj¤~C^íZÊ™Öe±é_š /¾ÃY5G§JDSë=ï´íÒo8•h¹ºY+Ãf¦q¥PêÍ“j²‚Gp,å× êW\3×Ü ʾÜVÖ Ù†Ý– ”úÑY›zBxB'ådÍc¦öxäî!´·®8ƒ]ó‡N T›”«ŽÁçÕ?d‘gʦíü]µæ,TÔOV¿ïRü³3K7;<ýT-òjÀÏ,=ðѤ-‹™è|AîPßÏ“™V”ÙXÉ_ä“öXl0âñ[z&K±3Òek·ü ¨iÞÇuxPóÒÊIw wS½Ü^ÒGƒ¨}ºÿhúµG•9ëˆ]´È›O-]É(êtì+dKÿfsá¬Ì*p³Êv‰Ê@hXô„îªò͈Ùl3?¡= ø+ÞbUôÓäã@wÞd6²_覵H°¤$µê&ý‘§\LýúØ7ZC¿•N2']ÈDJFݾŸÞg|»²©µq°bĺ*“‡ê­Î—]>eÔa݃ڣª QOÍIиuÊ Ìê–ÜöÅÒºÖSK‘ƒWQÃ4ziTßí.Î^ej³}¬ËüÆV²6ÆÊ¨{ÇfUV?ú1¾žuxfc ÉŽ «G~„ kûböÙÓ!ÔVÔÇše4¡ÑOÞìy¼Ó¡àÕWS{ÐÊ0ž?¯&©1Ö¾õ‘¥±c¶ý¾×`*‚g,¹NÔ0uƒ*#sžyòÈÙOöÇ ÿ“L;‹r²!‘oÖµGWÞµUuÑëK- رêH;}HÊýPqÍÛÀä˜ñ½œñòHãf» šûì)ëêO<éM)bߺØ}ý£”ÓK`"Ó¡rnú¤Öèy ·yK.ž´rR¹Ki¯Ø_ †ÐúÛ4¨>P·Ÿjig°?Ò鸞¶´!°jäk‰|b\*Xºx±^Ã, O æä œS64‰`Œ]BކÑMTÒØ5ør¸„]¿¼ï?Ž¥ S?þÕE»C¯°&­öÝäåû$3©C‚ZîƒA0ËŽ™±µÕ,AÍÐXo{œÜtÇ”œ[ֵ˪²»!W‹¼5ç‡ý¶O·O»ÊЕ”#Û™&L­¾DðmmHuÝGÃW–’OE¯ùV‘ ™C_¼8o‚Þ\ú=;šìIáŒìì…Ö;¨O…ÇжBy%ÌD‰#!¾iC{’g^m6ŽöðÓòæqÞbú. šE((Ú½‹ñÑI*m$dšÿ¶º¨ƒö‡âhs ̆9€Ø{-äma@Ž\+('´moGD™ŠD?úÙb6›úM§ðôà³3Œàõ× eG‰Æ^ÏØµÙ"juÍ´»¿)p‡G²­"a7¹+o‘Œ¬ ZW Á™e§ª=?ùõ8§ËC5ˆÒQ£ë ‘¶Ôd#wà3  -eŒÇSo]oŽdåÛ  l€ý»7ê„üçРßoBÀ¹®E›ö²·Kø˜i"3ÝAñÎÓ&ÿZu™Ø·ý`†ÒKâ „øš¡/N¨«K¯4½t°yk§¤ßÏòæØñ±úgŒœõom,õ–úÄgn,Fþö¦ù¼2÷;G“©Yí¦ƒ^A¬¼Ë,ò£~]oššÔRÆ ,¬Ëþd¿dhFní-ÇE²VVÎîÕ9ê~òëAÉ;O”仦³”^Ø-1L¯[4krý².ðøÞUf ÀR£ÎfSÕ‚Ý1Q^`'ˆ¡l¡»ôã?Ú©{ ¸ÇŽùèJÖ>ë%Sø T×ýì­©P…$ã»plc.wÜu>Jzh/é|I£°u,þ  ?“”çô$š*½K¹í€ö!‰½3å¥Úš„s€ùŠ‹“Ž™Ò–/¼Zt€j|²<Ë6 €'ï' Èàˆ€‘ªÃÒ·…ÖíUaí Œ¬[÷üèÖöNÿé½úS²ª^¥¦‡º=…i7Ö˜IH%YŸYÅÞõ{G\®’6ÈÌæªÝI%ÚëúÐð”+]ìé;‡›¯v² ùxóeMkH6 d;•ê/ÇÛéô]˜T®4ÖY˜Jú` }ÀåU칓ý§Ô#²²©áVtã¬âË•ûyiIfÎ-á/µv‚¬ÜæVæqjšMïwfçðT9Y3‚þà0‡Âfop{‡AíýZŸúûàº}Å)øy×SRŠ!Ê a‘ä×Yû6hPS}Ø©ÌJ•u¤KƧì—s–®l­)JfY½WD=ðO1î }ÆV`ÒãáY™«Þ)*Ñ©}éH–Ā@E¹+}`¢†Cß[.…¹n$Ø=»éŒA=¾'õ/aBwR$›¨ãñº$kñ;©úÏo· ÷ù}Èð¡O··’èùó¦Ñ1›$jø 8wJ|,ûQ’è\žFù^ؼ UÖÁ~ª3ÛPÈRUô‡.дíÀ‘´. WÚvÞ€ÄçvA)Wå2 Ä(â ñ¾PÝ ˜Ú>”kõÅÆç”L:ÔÔ&IŒ!)½Éðd²“V(¯.Æ[ˆì¯#±¨‹ŽDä~!4kßîý€Ô-Ip j|³åía>1ØR?\+3v3zt$¢Ú£`ü¸è7bÊ£i/•  (hÌ걞UØÓ€ J­²®ýÂH°ÿœ%’QdÇ›u¨|OÊ!>ªjÒ Îñš¨£ùŇ»˜Öýדzµü¦"žÉkºúèô^vÖp·§}gò—œy¸gŠžÆNÖÚóT~Ä— ܃ïôI©Só‹I³g©HVràÀ%qF ÔÚÀ]ý‚¶8 ¥:Ò/æ[û÷ Pá]Y—½—çEð{; ÂÇ=¿î ±F;!Çz)~¨K]FF(oœT éý¤ ­´L~æ+(£ÒÔî¢j·Ç‡F·q¨A2=Ôå¢íwÕT¸2'”ì?§ÆŽoWï*'!«¤6Æ\Gƒ?ebÏÝY`]jæ½9£DÎa…­(‚b ½ËoŒ*5„Ž‘k2sÜ$D½­%ƒ´18v'£x Œ˜J‚±âÃ;=jem‚5Ê‘ê׿ ’ùt“‡Öñ%ú®‰5Jfè@í$Ó«#¦¥á¡ÆJ7„9‡¬ °óŒŒxx2É=>ìhçûÉqRžËo·JgÖ„ÑÍ ¢¯©¹«qFÃýø{4.VðžE¦6#£îolÓüš'ðé=XÑÔ«ÀF–äÝ1å]©sçV‘páêskxœýY¿nñ >·ßúp+–‘}ä1¿ºØØÑ•wHÚ"}*Íc.a ôRä‡VÏPÝ[ËÖ½„\×®é{—ú*ÃþY¸¦¥w”v²œ'%ïÌo= ³×CïðëRµ©[D¬¬ {Ð2¨ÙvZ—ú%ë­Ë›H[Öe!óêÂ2Dz5PÓôªö„U&WHÜÄwîiS‘¥ÌÇí6ôÓ»gԭ䯙”.#œ1ë`BVXûÝ “©d†:¬OR0z–deØ‹IßÕÅ#è›[=£4L;öl:vt`ÓÅû„u-’…CÉé¹wÉ•ôþðòd‡«]•…y«œó[äI¦›>kZà—çtr!x|¯[´×›dÀûÁgð){l_Gã©nÒ¹¹¬.éa]妞W«á2ú¡_XM«Ï£86îeZa]}EƳƒ*>áñe»uͺØXs°^WT™ÂǺNh1…u]ºÌŸXÒm²®ÝÆøÉ޳Öµ"[xÖõè9ºÓ[±å`{J ·(u¦XœåŽåù}g ú´R–ˆâΙBy*RePˆÀÙå®/Wûtƒ;çükí®õrˆzäžw›ä-öa„ˆe0ôdXÂ^ÙÉ¡?8‘5YC¢røJ !#QsŸÿ>õù˜9<Àœ¿föréJë‚›%;ã„ÌV Á|_QË6@‡©‹ý "á»z°ãDd¼¯õÖUKÖ–c Ï­ M×ô]b‘÷Èñ1'Ù䇿˜ŸøgÉŒ~r÷ÌŒ  \%aæ?‘ÍgýQ9L%½|öãLø•ó£ûvªÈÝѳÑV-šdª 1Iä"º¿ù$ع؋LùÖ´®sÈËh=#è½ä–r(“Ô[1"¨YªZE›1 Ý8´¡}™]iãìÂLrPyG‚^ÒÕÙkÏ0¹™¹a,ÔZ~¡QwêEÜ'u:ÞpK)Ùö»P Ãe Èùe(€¡(2îÇÜòò®ZŸñyO™-?!–°<ïÂv–¾Ð¬e«`Õ_ÉØ³ÖMéˆÜ]™Mi(vßõè'è‹É"iÓ‘?ÙÄTx’mÃmçØ,:›¤·HRFµ’í:ðAkeu eÞhÛ.2ô8ò’î ±bL±)އœ ôÒ¼ìi8SŠÈÊ@Q?Økj…˜¹.Ò6‹C¤á3©æ½ †2§öãKE‚îÉ"Rn”öyæ&“Áñ>ùúÛË´tJ˜>ðë²Wß1!øuùfÞ…Ì›Ãwd=y9•­Ï'VÖ5áSä®ÖÊ¿>>†yÉǺ ‰¤4‚Y{Ìð–ÂØ{Ó‘•™-®©/­  – ô]–>ûô`H¬S ÈY‚ÆV¥z­Áñ*Jß %ÛŽë/3®mt;È0IbÑE4ß®‘ï_åbH˜æ¬¥ýSˆù>¨Ž Ù}:š¢\Y;•¾Àž}hPXžî´{ävCãéò;àÈí–D¼V`QùYš«fú'E<™ï[Tc¿aé^êž €Š®æ=wuNš±sX“ê¶ö‘YÛÑÅë¤2ÔJS"…ä.3^7• -éM¹«ó¤£ß Ak°B¥Ü&”6TY†–ì¦ÞÈš¢›zŠCÀ·˜þéCÎiîlÏÛ-é×ÐI!¨¢|BŸ\šâ ª]U€#~í|$ØïäP>î˜1…ظîë! “1 ¨ûq|:ëVP³’‡¸=ç”AA«hÐPÎmW©»ÅÏšE}zqœ{¿é¶Ÿø•7¶G«©—l‡”­9 î¿Äö„8­AoGr« ¼/>xûssp ]e–Q¾ ·(™öë»—5s÷TJÜX.¾ùÙã|(ÀWÍ) Hé»| ý *âôô’“ ì*BYðLí:žU“ ;¾’:…A«áÏœ7åÑ”·l~¡­rRjÏɱ‰nêG »ŒÖF;©˜]ÇÉ_ƒZîნ@gɺî%Æ –»nù8²Ãp ˆgßé»ÎõÕÄ€”X4‡k²=Õ"%R0½«q_ßZÙ£#¬HEÎÊç?u•‘')c))×é$éW€­‘”58‹tÉØÆŸS^ {DÏP9LþÝÅ]â»¶kõ©õ¡ÇÍ?²üš$ðݹ¥d]Vffcb°>iÞœAŠ÷2‚nÝè‚(•¿ftUþ­9¤úŒ5„Br~ŒnJ–Úýh‰Xp/Êš š¨ò¨¾qU×ÅDñô?Œ÷èËÕc@7‹¬Ë“ Žffõ‰ ó.É® “ö“$²³Oì~N+Ù g]Iv ü…¬ëöþQ}¾wÈjúK®ž|ÙªžÃn%¥-¬ÏǨÆc»|t‡;Ñ/‚£w$ÓT{¯ÆšB¬Ðíg¼>AL¾)ÛêKÌñP†í|ÆØX`ÐÙv‰óå÷LÔ)âCàÜIVs𜴡Îź—øDôÁÕpU|X½ú¸Ú¿xŒ¾+ÁÜÞÅ`âí<};™,3¢?ã !×T2;­§~özYajçÞôj»¦ÒBy™äˆmÙ§æ4c…‘’?Žk:ÉmÎ…ã#Zìqb‘–êÐàæf n¶vÆLŸÄ¦¤Êè]sþ ~¥Ü7¾ ŒRÝEàP®¥R{ é[~ÜÚY••Ì>Ѐ+C9kÛZýº Qv«,ïÖLIM ­©rgùT‹±ÚT˜ü_\]Ù‘#Ë®ûo+Ú¾‘ûbÀñߥ— °æýM…Ô©ŠÉú+;U £JüÍÍF$'AîyZOýIR’ñy÷T]_åjNlKÈ'?n¯tx/ 0Aû³'{á³Û®4€ ö›¡ °yþ®É3\^ŒR(_€­·“ü€ØkЍ1Ìøñd´³ï±ðsUϼ|‘ ¾e€D¿ˆ/–[DÎo1x'²{Ø[”‡g½9IXRZvÑ?Ö5¢Ìwû¥§I&˜ ï¦<ÃX7+ñV–´ÀoE“¡–ëD”iè%eõÃäªïÃûð¢Ü½­–[×\¹l€¤"sìÃ…uÝ“`àVNjÏÒS[}OIW.5Î: æ®Ð²«¦Ãnx:„˜ÑºÝ­‘ÞáE֥¢Œl!LU†“>]¼[Ç%äa e‰ú/dt´Xç–íü.B–mÐ{{¯èÁð²xÐÑ<)‰ƒ1k³!Š:ÚÆuŠ:ž5¯Š›Wñ/¥XÛ‘©=«û|Ü®¥é%(|äFÁèSKG¹Œ =zºpÀg2ЖƒþgƒÏÅy]ܦÊÏVGb¥±yÔ)j!šß}²öR°l¯>”(UcÉÓC9z¨Bqëâ,A°@cÙ^wË`ÑO¥ õ¯$#VÜë–åž! 'näÊ4\ñéYg/F1ÁÝ!ÓÎýx((`¤×Ž=aŸs„òt4Û*êÝÒ’¿²ž•U'ÈVå†^6Û28c/IæpSÈø›ij¶MC\6ÚK’r2¨,ªK¸8ç‘emÀƒäãÞ#J…«÷cÓÜ_DȆõ;U…¾Ë,ùGà¡kôûˆx'{è:0«ŸØîH¡õOªõ¬kèlÛÈ~ë¹¼›È“5ÆÇw=·‘Ϲ'› ËÔÐþä¶æÐ ×”PóUz6ÊAD!+„’Y.I4éSál—“.L*å ê“[[ó|´eW%ÎÆ6‘RAï­ ‡û% j)š×ÖÊ­7ð[e:4ÎÎèu/k›ãH®ÓÙÏUf ±El0Âû+gtáûç‘ÝÕ{(ÓìS¡`p92,{ÉöÏÝßѰ®£¡œuÖš:Hg‰-^¶çä(Ÿ¬þŠÕ¾‹²³†_“,ä¯K-ê¹¼”.µ;WûǺÆÊDt! †/å4›#3­¦¥@5¶õ¢1ãÖu¨=näõ%×iÞIPß»wÙËîU~Q÷ðüY8]™R¿ò±dmÒ*õm©!n„}kuã iLß õÉ7G˪ó%Ûi]ˆ2‡"@–¹!Ù>>¼žtW¨ õ¾=%‹~‰Öæ:ÆBKokå+UûÌfÈ  @#GÖ‚¼>Rü•@\dƒ†5¬+çuÏQKÀxñ[«XáhŸ}âS¸ûe[âDÆ~È .–;ó ?2T"AÈnêËlS”ºµž^‰›ì<®‚äµBA£õ½Ò–Å,% jö±òbdÌ|ÙTÕÁ3ÛW‘±™è¡¾‡™= pÜ]§ª§y¿ÍZ ›ðÑòö>>RØïe ªLíÊg—iÞ4¡±»†ªX³Xé¡ÐPJS럺`VZW-ŸÏ^G‡uµÊiÄÖ¾ç]³ eõGjΰ®Ú󢱚tv*(ºýiÀ+Z84†É"¹4²Á¥M)ªU7Ж wµAn“Bž'dbdKþ\B”5cÏ4¼à§C³ä Õ+ò—|RÙ%!%ÐÒæœð¥ÏûV°šûE0m¸ïZ7cfßšþaÅMßµ†ðÆ…óŒ@Û‰Ö…•‘Ö=ü0z²„š—5³E¹‚ËÉ­kö¯u±1ê”3]Ïݩ׋e­Ni­šño5%èèç±|7¦éuõq/'øfõ壬ýR£¼x!3a˜û+G:¾ŠËuÇÞOTÕU5c?-µÁ–œepí3#ã ®¤ÿ™Æªnj;Ú)¹ØÕJEâ:k*ÃŽrJFƤÁ‘R—4µvO¦áØŠ—9gnyPô~²úVvüÊžlD޵sµß•¾ ð.9ÉÛ›jFëw±_‰Bs1‚âвDóó¥²®—Š$ÊU2÷¦œ•=æJévOeôW÷¹!°@fN<¼n]PýJzÏ,}\ûL^dÍ騫¶Âßy,ÏÉÛ©Vÿì]5• ÈlΑAõYSrWü8LAGS0¼¡ÿ3}[¯Uù®{> ºcçf/6À&wYɆ1_¢+ßUæçÔ·¦ˆª,–ûí¥Wz}Y=EÕƒÄMm}Ë¿€—ïÜ´!ÐÕ)ûoµgl­AYâuùÌ ÒwZ6’eP?èâN­z¨}6Rù9A HKX¨GKZ”§ÕÑôŸ>—_Ÿ~BŸ##c B8·¡Ú?Åàúì —¾>5xD ¤í)h FÉ÷•¹Ó öf‚ðg4m7Ç‘c¤žwynˆyù‘ð‰¾ˆ}0¾‰Cª*ƒ–œb?·A³Ác7YyM±_ÞÍ·]¬¤³´tÝÓìÕòOUvs·ÏýÁ—4"3ÐßUú~˜ˆuîã`^NuLco*9Åî+Dl³Å¨20œäæïS­…3Bl*FN÷ãÈFï黚~ú¯‘¿¤fúKæÇo´ìUÔ1®âÕû "·ý•ÍY´ç³9{OöÒ Ö™ ^;_ºú©9nç·•#3G¢ur=ÒÈ’îGihßa,TÏúq¸íù赌ó 7sÝôå³b„BLcUÎ9þŒ8§ôï÷ YÐ*¹ñ9?¦öNÅÔ+5àÛ1g<3­kœßÝU;9¥oÁâáîªþkÈmm,S¡Òè {…™.Œ³Ô³¹7XÑÜ;왂×/¡&zØõ™@ÊÀ”2¦ëF_gkQŽÝ€6ó³[Ž:fë°¯òkc¯*GÆM2:›/}ÌØSVØB¾À/Þ¡—© :‚W”Yá(2÷—Ͷl­Ö–{úPÐS§owñ ÅŸ².01éÛ/¯ùüf;ў-õ®_JÓMô«3Qz¿ï(ó~¿o²¦‘î í„ÜÖ+ëÓºê.ìãÖµ´géúù´IÇùÔ‹îB/½œŠ¶µid!w¿lB ÓLPõýØ”ê[5çŒ(&Ø´”šx—h)™‘õËjÒDPJq(ƒkèÁQVrzÔ‹6†âŸßý4µZñrFFç'ó¥¹ùGwö´Ï[ï‘_µvýLAÇŒ1 Cô¬àÉøüØVV. CnµóÞµ35ŸàJíêQN*û>CÉ‘!y}ÝÔÊM|° ÙQz¿oËÙÜÙrÒ|[I$Ĭ‰ñq¯:ÒÛ^˜\K7ª6^,¡êiP[¤.S4â 79¨ê¹@è Îøß¹"d쉜ø.åû¶Nå÷_W¬ËÞÎØ¹µ1ô?™ÆÙmŠ™PiNtõ¶Ÿv1_“[]VöcOM8N‹Õnw"«¤¡Œ-‰E¯Z•=sºq[¾Ò>o›Cõh5V×4V ürÌÜ#dà¹^ .öþÚ6i:¨Û‚þðÇ5ÎÊR å‘pð~™*o~!s"=‡Æ“[w6:=æynÉ^Z«MsŽ4µFšL­³SkWïÌ„ªÌ‘6X.$j².8@ãì$ß+nùdMãì£3Ú4ƒFÜ.Ÿ%‰g„ƒ5£ R6_kh‰Øj]-™­R’#mœIVЉ=LQ‰‚Pú2?Bº/U7ÔV¹Àg4m.ó`Äœ¥4I˜ä™y1fnõa–Ÿ½]}0–xZa=ÿë­$TòlîY‚ðé#™Ê†«ÄÊ“ßðÓsòN6#0X;i}Ê$׃=óýñ(QE¹9@:N™we4¿3cëKÏg~BQÌXí.?î+ïѪě‡jEªs'Ö Lk§*2šæñ]¸ûÜø5x1ËN£»Þ|d½×$VëUÃAF–ðûV>ü:/qïsXýÃÔPzΠk]7tw•}b•)þæâ 335ƒâÌÂP¢ëC*xj.ž¿#ûæ÷šZ)àÖyÃå÷MÀI ˆÀ¦J-›»ZFX>!Ï4¼–~³•Y?&Y‚s6Ü Z€Èï®ÏFROÛǤYs*0Ýä‹7¾wÝB4 ßx>u7Uƒ½•’Ë©ð‹ªgž©}”EO£\®=˜švô™Úêgj¹œíkjuª˜gi{˜øŽš³ØÌï¼€~…ìî=#z5à‘WòÙ¾ 9è m÷‹»¼XUø W+m]ìÐÖsäТ¦*:)3¨½Í³®@>»Óí÷È7ß«S\t'‘äóOÁTl³Ÿ-]s4Ó´ð`Mêô;ؼ½õXúT=Pj£ÝAA˜™ ~ßaªŒßçëŸîynOvŽÑ4V‡¢t#H̱ûãâezèÈÉw"ü°v¬nUMícè·¡ˆwP!ëǶQ®ÜñžÚƒ†ÏešêP õêQ½bÉB/YŠUr—÷$£?°'9_ù¡34„ê’G³v3V=ɒ׺üâÄÚ*Cð™xo¡7Ðh)F¨ÉMqS1JÈèm›,˺qrPÓQO]}!Àïe]uÌñÊ)Ìá“vÒñAÓ™w”´(e­0ítâ—k20c6gmä{¶œÈ I€(A—Ô…ñû&¹?—ÑìÉXß=íú8 ßÿÉк¦`¹^ä=”5}–Ì0/P[ÅÄR:¾qí /‹ ðÎA-±*Ћ`»‰•RH(‹¦&ëýCo¼Ï®ª°µÁØxäL†d0¯êùÍàGb=šIôûÖœ^˜ÙØð@%è4}ðô[À =Tw±‹YSRëu¸­õȺ^”«úï…žÉZ0„„Bà “6h† 5²l#’ú˾•©¼dÌÓóa®€KÛc¾+íîÕ½7‹„‹á_ôqöû82€mÕ'”Zó³ÑêÍ%ˆÓ”üBu¦Sš% qÀ ¢¬ &çeÉ6>wRý½r„ÒèÕOJ™TŸ¬Ë´NS…ñ92j«Ã¿tjãÀø.¡‹d÷¶IíýS—{|éYèàbÅè\J™ot%[|Ô•Õ®YääÐ8ã?jd€/]æÞ©ÏXÎh·§TŒ¬§1dûå¸äÁv–‹5C+ õC¢n§õ¹ü}&¿D™J&ÚÝ7)P|ïòµe €r¹Õ¶C}×TF¨#Œ oºfz¹”—v¦ÛLãJ`tÝX_Í¡FT»ÓŒ{§lÔµÕŒÂÿèFV±½#QWJa¿ì3¤$‹Ä{Š;8ש¸ ©Î³ÅPJ\ÃKžNx$Û>¥w}¿ã?.f¸çÛŸß-'^²½ËŽ~l q(¤9µ…@<òæÖ¨˜4ÎWüùÍP<Û.r¾C¿Þ¼ÃMÉÐWæEÛ-…<±ÞÌ­¹’úÙ|Ÿ‹TEã¦HvgnäÍÙýÑU.sPöÿï䯨Áç§g΀vºwX‹ÜèÎ*ƒZA@³£ŸêŠ˜@Ê6š‚•^¡棛ÕÒ F´—üâ™C†àNÏúçÎAokÑÒ¹ÎÖ¯¬ð–EÛÀ ³m,ë…ªÖ ®0ºÍ~|$êGéV§àßÎ"GÝaDþHñÊðni˸ ÞV°Ö.9¥sSó~ÅrMãsÃößCZË…†ÂÙÄΨ?ÚJi Ãæ|œ ˜¦>±ç£w}v§|lIýyóøˆiŸµô H+e]{íÏ´¥¢}T¢ÿ©Dô²`¿J¡£¶¼&Þ‚DÕîÝ u¾ýÕ[Ù|dmH¿×v¶¹~f si+X]ݦԑæµY!˜ &ÃM‰mKì!ú„qSüú9² Õ“òRF ¸dÔØÖ+ïw3…:VG9àãóÿ±£!Ãk«„³18ãªòjÏjFxwߺ¡úµI\Õ¦ã\¥\ X¶˜=ÓÓCwÐÚ»³©¥é9¯ÙÉ…o»'©­þ‚i*fc:¶x1N—¸B32ÙË—æa¡‚‹z" ø5%ž’ŸÝçÉÿu„úزê¿5¶«ÈšPµìAwe„iõò÷±¿¿ÇÏoxßß°ÔÂïÿy©#s€·JÛ¨5¥Âê¹üvFZJvàÀ å:›i¦çÅ*Go!rî'%[¿. ´Pñ“u­RÓÂ{hDºÝu)W],\3«0 ÷Bw ¡ˆ˜¸|Å4lv˜¤é­®(÷žK­tJaUŇ`\‘­]&•ÏïÄDÅŸó=Uüù…XlŠ l|’…ܲmˆÎ­¥èoÞÆpÁÈ ÐwýÐé ê®#7)çõk4Èõ“d®K/iÈ¥ÈHi§È æÔmØÝ™`Žü¾ÁQ S­é G-òcÕ”¹µ¤ÈòG¹øÏ¹?ãÑ¢Ÿpòâ 2ÂãžÔ”Ø­±Ií;ºÛ‡¼K“•#0‘IÖN™Ã?»C ö:ŠBëK:Aˆ­—ú¶\+ûð—³²0S›ÁPïºØÏÖ˜R¿T¤ôšuFʈ?ƒŠxàÏ×Ã|å[@p=«3³d”Z’xd}Qîm(Ÿ¹rãžUÖuæ#56c¤Ó9wÈ$Ðê¾ë„z²yÌ-.Mè,gþpGMñs~3µcϹëÞY=znäö†àqçýSÏ*0™RÎ ê–ËÏ>ÇÇòý*¡uÙ—ŒŒÝ‡¥ë‡}Í&³i£¨òRò.ë:ÒT5î,iCõOö)èùGuÕ4jŒQe’=†þëGj±ç`¤>¢‡Êx†™)Áþ\…"ãÁ¤¹eæ'xEÛiP§§šz+ŸµöàO‚Y--mÛø8´ç)¥ŒqäK,//F¯ø+}Øn¡bˆMkZ—徊˜ºµÐ°i¬ˆÀüXBGÞÒðÒóù=+,Š#¯rÞÊl^³GÞÖ‘Lè7¤Nw-^Z—‹ê ÍFIi»)µË³¾D>³…Wè|îj¬ìŸHÖ2h˜?h/D1Q¶=¯æ%† ºxY@¡+ÄÈW£BO‡÷¢îÐg£žQw¼Aµ:¼[8^åAÌ–m °ÁçðËHÃwYúµ/Ö§u¡¥‘uÔï2B¶V j®4¿¢PŸ#öÜ‚/5L(,å³OPU-×­ ¯[#GS=hí,ÿœYµ@ O™ éònìj6¨^r(9‰OˆBÚÞ×j¥Xê°n\æÃ÷¤4V-6÷¬[2ÛÍh)t[×ô"È ±Ñ›ÚáX¥Üáȼ@‹¶ ]-:Ö zë‚kmÒd4Û5ÔQ°sŠf¥ÎWéä¦X vÔéZöu(A`´ÑÔ^>ÝÒwõµ8ÂZ¦]­9΋Ú5]ýžE®ûº@Ñï»Xêkî ½Yñ(Rù}S8u±k“»{¨’èÙFj«¿CÏBÌ„i‘Ë`nÈE'—ãg¤[ »cmòkzóý“"Þ†cüù<0–˜4Í|K"Œ‘šÃ×eØpåF6`¯#™í‚«­—Š ô°¡-Fÿa ¼ßóÍ9Á:”¡þqF­B€?/Ë 9f›P‘cégÍW.‡ªE‚ä:§­Ï +Bn7¾n©_.](gbÜ Ä_–ÓØB0¡`Æ¿eijçÅ?Î…ù¢æA5ài3”#fkû(‚öÉI¬ Z6àÞ½¯i]3€w+j†¼ËìÑRŒV¥6å5tß–õêŸè‚\ìUR‚À4¯nvc‰v0›yR«ÁH‡ƒù·MÈÓÁNÞP({ž+×_@„.L;¨¹1ˆÖ› |`aI@ò r#2¡ÛXov9(L{8Ú‹8a “û³|»þúDÎBTPË+ Ê’²È£åœ4¨ù¯†ØÎ4Ê=»„@¶í©D Â7+æpöÚS™w©zåxbjºbrê¹îâB– Ò¸«FÝ0Ò=en­ôtd/ù”LºyMÛ;¡õ»R[½ÿ£H\åÈ òIÞ>‰²(u•œã´¹UľÒk¨<‚8{boOœzkáª?Qjg$)ÐàºbMËïTÔvûµ&c]Éä|åV.<¼&q’í°;`o94F¾¸——6ÈÉ%ÝçP’£Œ¸¹\>ì?³œ¦¿iU¨~s}÷UìÉZŠhf¡Kô`tsõXªÄ §ñ¨&^çã»ÞÍg™ˆ`Q>‘£Ô–)”-|d_‹òÔª,:úäYhÞÓ¿ºØ½1&™½h`yR©3{MÕÙU˜"‚|ÊÇwÝR‡Â)ÚøßÎLû4z˜ÛÂçNQïBãåhëÆfIÉÉòbë’ ½;¥«j%mŠmãR2ªsù}œ8=žÑ$)H‰œÀM­¾2 C'=ásŸ êRI=ÌÎÝÆãâý¯ï4O^<;á%xIФWð`ꕾªuÊÇA5CûT/—!Qß²½½|õÅ@;LÃÛep°d]vS¡pU{ =ÅÍ‹Qûä°µµê'‚²ÁhZ0…¢V`èÙÒ–5]ì¡ ùÅ ö²·…2y¨—UÐw]¬·rÖ‚5WªqëêÁR:Ô&<¢Ôq/öé pó3”½R7Ù÷ý°) , í3IHšîÉ=Ó%¹µzÇ”ä Ó´ú?a XìªÆ‚åŸÍQS™G1ùŸ°£{h6·Káw¿9°it^€§òm¯œ!ˆ©P©Æh}Nbñ\Ë+/߸2µr¿ÂÂá‘ïB™? ‡‘¤Z«ÆŸÀBÈ=&ÑhÈ·=jà/ZôO¼sS»¶Å$̤x³=Ø×žYä½ÀÁ åmîæW»rÉÌúÍÌ8Mc‚ó–evbÌ@HÕ" C *‹YÚ+wJžÿMnÅ—ÑQñÏêV2|"ÙžÜjŸèÒ  ó;¸1xlq9ìîbªNQ2»­[f3JI•@õ=c8&çgõò•òRC@€bïvïD„D^+éáœ$®6ybòÕƒdí’,Ð*¢ÃELl´)S;ºñ@ÛZSÌÃËæô ûEßùqUŽì{¹ÆuÅ"g³ˆy:ó){TÁcú`‡º¤5_]좡*vÖ2QZ¶.¤&àÜå¤AÍ;L>¨ÀzT:ƒƒ3w‚@I¶iüïØ³H3E­àŽOù°Ç¬™à˜Ée(Ã╳Y…Tý܃¤ô¸—Ö&` ¸_hƆ<1¡Ê©'T× ðÔ}Å”÷»e%¹ûî]lÈ–ÂP\ÜÇúàùìÃ]j?Êb¦hNßæE­•ê‘¿¦îý‘P(¢Å߇á Ö  k\Ù~}‡àú/Z€”þ°‚¥Éž)~Ä>*ß_±üá1^LÖõ¼KZKíìúÀû]Žà^¶º©à ÿ YÞ/¢¬‹!‘> BƒÎƱU»«Z°±³!. xè®z×ò¦‘‚$íÆË讲&pÓwá¶nr&ìç OR·€$vɆ®§ø.H gMŽ­«]LÂ~\ß– ÿo ûx_¥¬äQÚ­fÇå}ëì7÷­5'›i÷ªê´7¶i]õÆ5ƒAs1؀ʂ­FIàÁ¨w˜†#ëIõÊu¹¡gªsðâÕá>¾½úžníΙJ{sQòÕ¶˜ÏGÒ¯Šü@Üõ¡¥ÀÖé•Ù¬BÈÆŸP©5eÞÔŒm¦H\ø7gû°¦­§"áãÞÅ®+Ù<’¼×uÃ’/”ë/Akpg äœZS z=ç®}£ñ2¥ •ž#‹g6ýu˜Æýª3i ê^ìC"ùšä!>|D4 u›ÃÊU¤_#ê£u ËWï"ÊÄókCÖuVKÑ<0MéXœPï–‘©D{Ùµx‹QМ\~ÞlÊNŸi(g3È¡}í îÜD¾kçÖ5·Ú{@*‹|Ü-%åôZiTÌîZy^ÆÌç×—tòLŸ¸U^<{¢Æ™‰zœ¡‹æ±§;‘oËö€ ¥:îN1QT·ñ f`’@-±“ýç(\¡-­k[gT ϧ$ãs¥S‘q_ú )Ö…ßÇC|f!ö¼Z¶@X˜»Ø=XÛcQqäO=ä³6MI*Ñw€“= íÊh†ÎaEÜ­põ5#!“ òïÓ×—*7ý‘¹Õ’ËïýSÃ*…=¢×–uí`àëÎÏ✺=–°J<ç?cY ÝaÛ ©}Üc¬Ð}Ly×Põ#[3Sh½™"QáÅi—Ú² Íô]/ÍmzHJÂö};U)ÙîžõFææ1ÝWÒÅ®b¼GÆØ3oZ×K¶ÙÞEýpмC• µ5!Nb[Ð\úŠÑëÂö¼¶RS~†¤P9Ï«ªµÓ…ñ­8à̇§A½D$wË(C}•ºG.-¾ ôòã.hGt Îÿ¼cƒáØÍðIèw‰%kñ›:OÆ¡Ù3zEÂï‚×½ ]Ì%ënB-ü†M¾]²Ð­«·K+ì&²$“cSÛ$CãÉbä”BÁ&™FùËnòyÏ´D//úXU¦ÖBòÎM­úì§\ì# Ši¾"(:O‚¡zY²µ ñ,e…تúvX‡‹÷¹:¦œÈ‹ûœÙúR•Õ@†<^±œNêŸ8§Ÿí-Xw£VY×ûj!4±‚„Sš;mhm&òhQjŠÖM—^ ×h—¤+Äú³Ù+wu-/‘ÓmSZ7XD¹dÚÖ¡dÍhEU&TP'’³©!Ñîʹ—ºßv‡ÐÅc6ëš½3â9·}ÞÛ•â¯1©¬ýªà1ÑÎ[ßæú:M‘iPÝ·»ß!)£Ó7BqÙ¶w£ñ¡ÜYÔ–E ¢ò­e,¾§ï’¡­Py!QÊÆš×éY€SïãÉÙU$£¾m¹vnQ¾d,ÝÚ~›`âN-œLðÌò0èʜ繇ì7÷M‚Û:•¬p½ªh‡tÖ¦k ÍÜ¥áj32vKY @d~>C†8XáY;…‡‰²lZW-!é´0û*ZÅ)KܺV ¡`« 6ådÁg{§ÔûAs¦u)í•©0ùŒ& Èì“f]W"Ù¶òÔTóÛª@•áH•u=³“»BÞ%Sç6YW –[תuèã îµåu –[W|Ðâ™*8+Öóî¹äãj½,°àŽKQ§œ.zåÄŠ_ìÊ=ö?|æú.ó‚« ©pÚFe3R%9¥÷Īlè%")c<°Yè'_Ò…,ĵÆÁ.˜ŠvŠ P—\[è7Ÿ¤7Þà6“.½áÓ™ÿ™‚e•9”]3w_ÚÀží­)ßÕÜ—ºu]‹^zÿOFƹ܅»uÅ´¦;ñƒx¢·uúòù¶Qæ°£5çñoF0áÝØôÇ#+Ae¾«¶4(H?Ê FìTv'ºdBGkn§àö²¢…Ï=|i¦´šåÍ-;E›ªÁ6ÚÉ~ùĬ9ôn K¤×3É F[WŸ¢±ñX²XxuÑ ØÈ F¯œgmt¹iBØF6mŒ?Ô^ód‹d•›þ,d“ÖUæÉ<¶;Cðz&Þjñ²€s˜ÌØ6ßÝs‡ÛTñÕ :uëjEÙU³5íË‹žîÊêòˆ^h‘Èöm¬ç¨²ðAZêÅ`½ÛÊT«¹(’»«ª kúbÍhã÷¢`øîÏþöc£Og|ç{€|w2ƒŠy¨½JòÙ`‹$@)˜3Þ«9Üøž¦–éV5é = )4<4B&ïÝIšñ^YŒŒÐ£Ñò»#K›œÒ*l­nCïFÌ“¶!/Éœ²ð_SñKuv0d«¶|÷žý.ŒÞ¨´``=IçÀcV Ñ@vþµª:+6vÝ‘sÕi€â²Ò³½¼‹ï‰dãîð¾…&„t!ôÜiŸ/A$ý=ŽóØi]³(2ýÐ)G†JU}‡w¾.noYähÞQŠŽÄmL¨à¨{×–Sãã–õå¸\D™¿¾©šSPNÒÝÙtÒ):XRÊVn&Ç‘Uxé^±\l›ˆ)ç9 #ágCD1³DZ×0 ðÄ‘…5‹KƒÚ±ÕàYa¿<0¶ÏøIEà$sš?)ˆÁA¶|Üš¹kW7a× å àɶ”¾ n:0ÑŸé+#C"cfL £Wá©­[W/é™Û©GMˆ¼©>#ªëfòÇ=XçŸ#­«E+Ó;£‹=7˜ZHvNkÔg…>µ: ÷:¿[×js«L|Á¹º«~o޾Ÿ“e¯¨çt$ù4ä<—û5¡îl^i;Û„ Å_š“B³%ô¢õ¸Z40>j%É ÚìÉ UB2fk¥»‚Ø»€“À»\z¨—¹}„Öï ´…±Ç”´.¬Êðf÷·é%£ø®¾èÇ–ur¸µêÒOŠy±›jõ[°p’›š05—ŠÒò Ê)Ñ·4î,‡¹AµÛ•Óõèút#¼jÀ#yö¼WÕ-Á u]gVojëcwl‘Ø+¬%~]ûªËº ¬ö|‰"Ý;í[RíÈeÚGédlú}twƒê'´sY`;q¾o#€ƒ(ïæÖ¿‡áD@n<þ ¶dÃi|ÊÈÆõ‘vÐñ…,«£wo%¨,µ¦A•ï-8²0[¦uíÛzykK9õ³©1h$ÀÅ©È5‹Õ.õýl±Hv ”Z##ü²U¤MSƒzV×M‰jÙ­&P¹n]}×Ïhñ̪æ,zºRýÚÁ^[¤æè¥¥˜(°h%á5˜úºWÚÝË­2Aç÷Ó\î¥nc˱%ÛöÙè)99cæwÿ~d3ÐOPSüà®»ÉjÍßÏ…”ëQÔ˺f0gð0Œ« Ç g*’_Ó]Ì|c\`î¶Èƒµ&õ•©Ês¬Ž±e݉›<+ïêÞø¼_'H(³Í•cŠ>Gb Zp»ÝÝ–s~ì£fî0ëX¹(\V gâ6¨èû|pËSP CUÓÙ H˜•$ÛUë72X S@}÷a$ú©ãQî’6é4Ê'!pÖôÑ1BªÎÓÓŠ~ÉÛ{r: ç¦ÆjŽ›piPáé=KKôîŠk÷ú.h蕚2Ï)}µe?/÷š¦V[*7ŽæÈhÍM‡~m¬ÞèÈê+}5ç6›²j(§LLŒ‘=·>“F¾—Ò*œ:J·G˜ü ³9ªafŠ˜h^ÊfœñAMOoëÕ×v8k¡<ŠáPD¦ˆuÔ&v»žû¼¼ûëBXÑÀQ Á†˜“Èç ü=o+6v7UîÐÀ‘²á1Q¹ð^ejcd¤ÝÙIiߨãa4üLU%å ±?šiÜ0i'rlaU›rÕ •„è¶¶³ÙÀÆ kùÚ?•ÌÚ7‚Ža|å„fîÌØNvëjcRþåѼT[. ßx¦,%—.öÝA:Ttƒ Ô´®Sfº«BI?Ÿo´.°y§ÙÜÃTËÚP|Å”ñ((e»"„Ã`PÎÊ­;ä8^>å?±m©ÿh”ñYj3å 6¥`ü8ßš˜sîñs(9.Ÿõ|ŠØOŸe½mº©ß7óÖvÿdÞ-ˆj#'¸ ®ÙŒJaò9² C—®«å©ï—…SìýOù~9CT¢Ë¤s´(…öüg‰nd¢ôãÕ“Ýû¦³©«©„FÝ)éÝ÷JÉ;ô djзMäå–ôJ§Š,%ì|å‘4}‡¶ROá•Ç|Û4évÁ?b+Ú8PoW‹¤\òõÚ.¶¦mxÌ3_Ÿ“¤¸ ª·½S±ê/ñ>Tâ…Kèç ¢ ˜÷eµe&ô²nç=ô{V‘;žµd{ð´™BÈ·Ý`Œ›Öµj§†©Õ©B"M²\°sè}Nû*=Û±ëÖµ>â4/Çd§è_èæì!6æÖuZ§jÉ1Dà8/Ц,ÏX3¥-ŽÄ(qÃòIê­C6TRòÎ`©O|K-Š)­Ì­‹—bÊw¡•)—‰ydËD÷CˆÛÝ`?Öý]ê3Öàë@;$¥|Ñ*âf!š¸#ӱߕîªôÜ4Æ–6ŒèÈ“ëßèáµÙdÉv*ežn¨ÞD&^æñ>§ZÓ*W>´Æ¥ÐiíÝ!ÏúÊļ@zVôq'SÉn$¸ “PÉÎÙW†É—˜(LîÑWA1±–’ÑrOBÍÇ·Ûÿ’5A•—Åž´®ÔÚ¨ÖMÍ5¼]îǺî’y9½TÄ ä)aP£í´®—de_;‘—ÀMJñ|`çb¤u½Sô>ìÛn½¯õ£?jçÙ8ž‚_>v?ß®œ¬|ïwѦÅÓƒ]¬Ñ†X£ u1scɸÉù*¾¢G„Jæ<ã£ê éN¹¡Û¦Òð‘/5ΰ‰+…Nð†ËwaE…ú[x[QøƒŠHÛ‡S}ÐX*ïÎ0ÙËÒ·›{¦ÝÕ1RhOgö Q«Â¼ÄNR ÙbÿÞzóÖ–n_•#†?ì©®x_á*W±fYŠkìÁ»mÌû±®›­Ìi‹˜ijS – º;]ÜûF eZ­eÞurñÜ€…-¿]ë¹4<öl:eÎ k»ìIX×ø¨ø½T’îøþBYýKïFú®ÖD€qP•5å]8Á¹“èAïH,mrvl¤ïC1 6¯roê‘aBÛ¤ÑøuÛhEY½ELÉ^ ¼å®îÒê³(Žü„y\ƒy'¬kM¦’Ø÷;+ÅsYŽo¾¨ÅúPÀ`7 ¡»ÒºÖÎMÜÒ[¶æÖl< ¬.°:Œy/3[$`¿×ûrùÖHkVnáAüLÖõJ“‘‘qå ÂÜòPûÖ¬–ûªMeâ7wí^Lúˆ‰>O˜müR8ÃzV×>dž@ zX ‘ZÎK8V¡ZÀ…ÒÞ–#kAçæUõê©ù ¾Ð´.ddJÉvQ#ÒÈô+2û^25))f¾‚ˆ¹,¥î+õÜbÕû^őֵêÊOÀfM–Ìé̺޳Èe­™Þ<#; äç^ªÂû¸„ G6VÍÈø’ÿ,óA6ž«C;kÈ ¤ ‹åpirlL|ÖëÞ ™]ÕÓdC/´–OkŽ5•q‡p'ÈjÆÉ^áŸýØ´ðDRáœòÿ|o¹«wL@­ZÙ‘¨·~ôÁ¬à^Þý7ROMIbÈ÷ZW-'98ª\¦µ'n6p°œý.€ç{ÞƒÉæv2Ù^ªQ:ßO5Ù[ÍÈXcïfÓùZEr“¼jO «ë”í=·(!dœà¾dPÐ!Ï?‘Ã3ΛŸÐ¹7#RVÐÎr«¦¬¯Ù”Q?“ÌDþ¨@6EÍJ1JKÊÕ“ÂïÙ†p_ÿüÑ‘å‚yGsŽýÉ»0¥Wvµ¯ÌÝà8&ѺR™ˆ€þE<­O¯¾”Ü4^£suƒ³™bj¨½îê¹°¡MJŠ#2ÏÖê  ¼5î[†‘r&Ño4†'üs$=Hk2UžÔÎ5¨ÝÞrsµž¡ìYdƒ·š±Â Ž’µz½Ùe;÷#â~gÙò¬¯:rÇÏ•6%™e272„_KÊ ô22¢•’ÈÒ²Û´$“è©0›]u¸;JVAîld{“_”™­+¨Êr_J—ͯVSuyIù…zÍì Œâ9tý䜱ÝLŒÈ@{m4¥öü©êÚAG®; Üë‘F-ñ¤N,;3æÈzãÎfe1ø GFÝSÃM.ù.ÓJÉáOÉ]e4zvj«¿d4û±h g]—e0ŒciæÔM @&9ûJ¶ȱk¼‚MG¹ÂÒºd¶ÿÁ«8uRŽÕ_–£±:ZÿÚdY·_ÕŒµMIÞ™øGΓ±£Èø‰OšÓÆ”A•Ûzzµ©æží„ëqÈöüôöú,èE‹d?K걃јפØ_¨æ4ñöÏ|{õû›½x´¶<+@}ë#99;uMºØX°Œ=}÷Kî sT*•º¶z:²,OîÈjK˜Í{|ŒÎ¾_Pä^–ÊÊk3/Zpxk`ˆiÃà~Ÿ40å‡Ê\]¾ à—´¡œY'ºébq²èKå3:…î¢~æ8¹@Ówªy7Ž©õ¿%·ú¬p”OßýœLˆ…2´¼9™¡‹Î¼À´'áFÏfÈÃBǧAÅ­7[ßmŸÑbS™ˆKâDë¿ßDqÝõAq%W¾wï™jACS£êuа©ÈÝ?‚ìï\¹«E EÎw§uµ.ROK©‹Ø «%ä×}»ÑÔV€ÞÜÔVÿ.ïÝe]º œì7»ý¤¢t'rÎR4}Áù;Xj'Íjãê}@ÑÊXA—­ ¬üæ$a7 ü·§d¼êH|P=Bp@K¤$¦d˜ÂõÖ²Ô«G)>“yµÅŠçHßÈ:Ù^Â~º¬ëÙzËP¶ÚÊÎÓšãd^n2ô½«OxYIÖ5{ùƒÚ7¡JS{'î#³ÝkÑÛJ«U†…“#Ÿ×àâ+:3•Ó +|"ÇýððìÞ’ÖîU“ÜÅF #9` ÄZ˘9(˜åü]‡%(‚Å'h¶`–tæ§§1ŠÒ¸3¨nÑ4‡±Ú=¦¬°Õ™#È~åEùà~Ê]Ÿ†|°tXÞlŸöüj9‹Àž[®Blªzþ(…KXÆ?C¿‚I¢Sk0F/8„6õüv¬Î†©G]Œ>Üu ùU×¼ îó[/­åعÖúÁÏìµe5§îÃR®gshyÖÖ>#ˆq«1ºZ¡ƒEá•dÚ4þJ¹«QV¹W:§~è‹~êÕ[›†ÝTŒNR7±b-`pŽº“² ýžíÅø})ò¿â»+ý,© o%Ì–ƒÚ[«ÁÖ \W%Ò!~æÆ,GÚëfUÖÛJ’ÃÑ÷‡ÕuÜ›Þo~§LØ&Mcm'+¾ÞwöBAƒ•-„r5â1i'òe›ÖTîaQ úé25Ì×.© ÿ\¶F>üž`ä;™¹r¿GeGÐÒðšQàŽ“éìK ¨½Šå¿‘"¯à$èòjë r1MÂD>îEbö7Î6­Ë ÊW4ÅF€9+ pÙB¥¯p…lÿûvU.®f5™úF¾„…Q[)ïŸMÕòK†R·öE]R{_ƒwž¬wãâ†'Ñ4aIÁ5a¬Z´y™m"»ßWȨTgö»ðû4¶ß—3™³N¿#ߦb­µnz‘Wø“,'_œ–¢AµhÓˆì2A߃ÛBhÍ-jR[B%Ê-àJ™:Jýæ>£­qEò!nj‡äîfj¢›èð~É0ñrèÏÈ*BCá‘­.Sk[ÉÚ6½y]ÀUœÎäàfµ²€FÁ¼$½è«Ð6ÐB ÂÈ‚3waPëÞ:Ó³b²(ƒ:ôz½ýØwt*°zi]¯ýwܶrÁù•“¼Æê³v•·jF÷ö‚ü²9û~ÅKF+_šk±õÉÖÕAÏsI`ΪÚÚÀf±UÎ(N¡õiè3á_tøÈl-í7R_ýXL-eC'€œ^-‹»Õ=¦: ~¤VŸUN›ÊènjŠ7ôQ=€¶Å˜bìj΢J)n}6qO(º³å“]¶l #\Ý!ÈneÎ\ì­ÍL÷ʺz¥Ð.4]Ù´ÃȾ²¹Žÿ¶íÔmŸÑ›Þ$[W‡ìÝÕ£¯ºV'´ÿ ,Γmц0ïѶ³ X\å/».„]vú5š~Ÿ*ûm À2›vÊ徚ƒ c°<}bç'Ô²Q÷¾Ã”A½Â÷CaÛg2¼O^ ¯äl9özÏï*CS¾¹»ß ¹¿*Zìp :‡×ä»LmÉ ,€’Ñ®pf·Q…^‚Öoævg ßùÄËð·üÆôÚ³¹¤$³9ÕfºÖöBƒ‚CŸ5_éÚ¶œpC-mº 6¨§ÈžêØ‹1ßœÌÜÏî¸z9Lƒ(Ѓà!81Øâ øå{©ëހƇ UuŸGáÎ…é<Ìå–í X9¼›ýäúàûB º»ðÉb~ßÔà¡c×ÀxÑ‹¾]¹œþÙбçÊv];³ÓÏÖñ˧¾,]b7‚R%E/¤I\äÜYy_”£8Ù¹Ä tóV­›ZÙÉl Ñ5õ»Q;¾˜ oDž“±õÝû$ÎyU~V ÏÛeN·w"g eXd)Ø–•}¶Ú³ÌÙ±ÜÐËÁºR¨*îY YsƒZ-éøž«ò]µ-#L‰H³A6ö?Ãö_=˜’(C4øI»ñg ˆÙz·+Ÿù½>ßvs@CBþ¥½\[öYˆ !v‡ >IÿÑ(ìF>€Jwä yØœ•Bgõ³ïW²ÇmÂJ4àÌ ¤Ö‘ƒøÒâ: Ìû|õ &õ—¬RÊèÕ×FáƒT™j9ÆÉš´"Ò«nRÞæJ•wAbë+3N–³5=óW•U†²fe†ž3¤I”û•ËÁ.D…g½zíй.èÑÇuä{iP"+3ly] 2õ„;žT¼ =¡Šaä™#¶~$0ëԓݵì,½ºO°ÂVÿB҅Ȩ·þ¨®¥Pöž^vãf ÆJÛ£%ûä•ß·Ö꡹£nUx·-í¥¬ðYñ CAR7 Ulm7#ä:m ¡RÉtR]Ì–Xé¡è¶ÅµB¡Ùn=á¸0–¢·@Ô©‹mµ<õmmbTB›ÛÙZ쑹ÂqPá9AëØ$2Þ•åŽ`K©áÃ5 xI¨_ébŒÔfÃZ‹>îÕòT5÷‘÷<8ù.º-~Ÿe@©^÷ J«G?š±§û+ñìÛCªëÉ·Ç'üÙù£Î“íXW-ebñUEÂŒŒÚ]áª;媎T©ºÚÉ êE¬À['ëé CžØrV¤‚¨-®(å¶“øXÁ´;ßݧ<ªI¡¹šúÓ|Ô¥Õš‡ôíÍÆ?2 7Wõ®{CgÛ é¾£²¥k…d(*¾qy÷¡[ëík7¡Ú?‚˜Ï‡Sxý¼–²—sì©@ûîÉÐÛÞc¡¶€,þB#ëJË¥\Š1SxQcQÊ?aÖt³'¤†i¬3Ó –©AɵðôŒM½k³µ¥‰5Ú7|An¼T,jøsÚF6—Œð¬ƒÞl­%ºuä/å{P1„ÖbÌ i¬èè’‡˜t>{|ŒuýO–J]´{ó•Z¨_atNMkv÷<Êæ…Àƒ÷¼wt.(·j¼\qLÍ™ºÿܑ٠Š#!v)s3¨S7½=’϶}£‘Þ¡†à‹?¿=¯œÍ³Œ*s¨íRö²Ùðàòbõ[uG•u½‚”â†wHS»ç2+4úß”r]Cê!¦<}š¾Ý=µ¥“DÄoÖ=–ÌX¼Û>ìö‘Ý;Ìèé»¶”Sv¸Š%W±$'k´)ÔŸ4lÕHEÛu%La‹`‹ÛGÀ¾óWàâE,™Ú V^—͸gê?š±®Bº£7™d‰~¹w‡Lr֛ϡÙÝ«õíŽT²wäîG¦ö}Ÿ4µwæg˜$Îéòž©9¥ç(cŒ6"]ý¯±Fyü%„m¨Ó“ùê¥ÂÆDå–¼_=…ÚÜhy;q;«ò`²fjþÐÝ ‚.2òæ’2↺˜yƽCX£©[@íKæªø0” þ5æ<´7Á˜nk«Gú~ÓØ5õ¾R˜õzG‚±ÕH*ofnSÕäă56']?ôøFãMÙ&ýpxþpzd(·–0Í2úý*ûˆFØ;"/±ÝßåÝŽ„ðâÛŸöøx_W… õÖ`¼wK))>ÚFÄ´¶ØŠßgZ*;á•ã=T|5cÕÇí¹™¹™h,íÓp1ý‚%W½äÕÒº^œ5„¾ä¨1¿ø˜ÚjáÝM¯å*ä­Ù‡2 <>=²uÛ–ê½¥)Ý•2ÂÙÌÓe)hº*Ü Ÿ°x1½¶‹V2'ÇÀhHWÙvR·Ú&úv€.(LÎë[è!QÎjÒ¢MÜ/òNÝz0µ·&W1SÓîqÊP—53ã|q¿æQê_w¼E‘¬‹(g,AÖŒüðª9 «Ìçw SÒ•ŸÖÓw § ¨Ÿ‘- ×´Wjô€t8ü>r£ÂÈ3ØQB?V©ˆíÛR×ÎBp- ´PvÎ4n®½2œ¶žÚÀ×ÔE=ódµBþÅ *ÐPvñ²Ù)ƒâ4ßýFg‡Ga‚`æp‡h¼9ûìi2ö´@‰.?軃ÜáÇa€Å¬ÞºqôC%cŠˆ»ßSàeú“:WåÔœ°‚Ø- ¹Æý¤³‹ÙHg'ÇNÞ e#ô<¼×#‰ù hb–ÁL×à ô3Rëù Þ–ÈËâ©­/ÿ•Йqy~©íåì2¨ÚË?ºvJÃ1KR£Ðé¶/ã|®ò~ÛÙ›¼[\nê±—%¿akè7ëæ¹;«–Ò?M–BfÞïùu3Ñ 9„ñ==„ßÌÚœÍUÏ6ÔÓ¡ e‘*Û@i"ëzvWd„5†Æ~¶»omDÏæ|ô¢Ã&])“Ž“¤>90ßjl39¶ô˜°$”;ÿÅà ©Q’"tŒ2•‘ÚïÝŸöî(©p<ÏLñL3:/ ã!ÜëáRƒÜV·]ƒÅ^/˜oS²·+$m_îèô(Ë”²ý Mª0ÜýÆR-.мbÖ9Kг—³i5ÇTÝT¤qc*kؤ•©½X…æû¢=kþ9U¤#ä™Íf+‰´@iã*@Ôj²gˆCïì Pwšºý³¯ûêjP½;”Q ÌeÿtÙUFý@2`[§iœµ¼@tVrz‚&JP˜~;WƒÁ4uFÑK€iâwšä'ºq¤mš ®šaŠsªwL^÷äúËûoµâ`J2BsáÅC¾·JÁ Í}e’cö”Ωõ|K‚Сí^«žùW ôËš¼·Ê»æYSå__R$œãd m#Z6–ÆAWK¡ºªGÐU&ìj\Å(Ö+w¨u„š<Ô8é_f¥òí¯ï5™Ðñž[H¦ÝI‡ªÍµ îq캆_,Eø© ¿jÑ.½ó¾kUu݃ó·æQü+£~hfŸ õ¼§ÄDÑJ‘ #êºña ½üŽ ó'R³Ã¹_"8ŒwE#ûýÿ†“«äŠà±Éð²È †W^OÄZ\@Äzò{²Â€¼Zž¥aûÄ‚ œ³‡¢noB‡˜¨Õadã&ºUí²9‹ÖÀyQzÊïlÍçû–Lã8ñózW:„Õ¦J÷ó4 ²îÉ'‡zep§Aõ5zT;á­±½²mô¢ö.V¦–o‘ߦò¬V2Ùf:øßTqu+aèèrYÄæ¨%Ñ»}Ë6^rÅ}TÐ` 3Œ}£Ø2ôÌô®ª—XÊOhç³È×Ä?ƒN´Øá¦í¡týØ~¸Ža)ÆIb wƒÊg“säVÊûûäx‰ešMø-—\0 û¼F¬.0p Ò6´û$¶Œ‰:îM’Ä “XC`Çj6îË<™¦b‚,(Zdé 1=Ê9cðÕG=Ú«Lmõ&åb4‘6Go s…“Îæ™×–AÉ&zõ_è‘Ú²FpµuþÞÍkrǯšŒ9r¿}¢@¤<Ù=¯‡ÉØG›Kžhýï¤?x ú”€OS«¥çÔ¤ch'ד¡Fr¯^1¾þèy‘¤DÂÔdБAµ[˜EdŸ 7êZ&4@ˆ¤ô«‹¾I‚‹hÚæGØgÅæº‡‘º’Òq”–>n×›Ü|‡Ä'@q¹¥~2¿´.¬æ«„y.€}‡ƒÆS¶ç±r¯Œó•xõ–VƒÊä4Q÷¶(@PŒI'9lO‘‘q§€Òð6w” ð9¥úÌÉë=¸Û8ªëVø!z¨ ¾p¼•b<¯È¨Æê;A£÷š1dN¼Àü"~ £—ø5ããOrâZ‹6@È8¸ïÀ§èL*"Ÿ4:E“Äø0‡2s¹êE—%ˆ;DùFj5`¨ʾ#²Æþ¬æ»ô6´÷âäm\•ƒC($G¹/û˜É[ü*ÁM³åý/HéQëõ¿A¼Â³õyn6¡qÿ!F(ŒrS+­)§{.€ªÏ(ÄN©:70üqdâ60~À —OßG:²¾b¡ÇÃH»©-û~EW B¦Ö§{ÖÐÅnìÍÙOßÉùÜVO²ã±VòƽxžÇ¹÷& >î£A4ûåáùÉI.£–#{q›Ì–öÈZê™<ž¥ê9\½4¸Ñ&6Vs—\”\؉F£‡Û^6ü™WiÎs/MvGýsÆÃŽ )¨W]æÙÍ}V®šÂã•E¢¥Aßp£¦Á }Íœä!pº«Ö6‰j'Üήœ¦¬kÔú½ö“>îj­5å_z0 „äÝ¥ú™±AKürƒáÔ†(LµLºä¿nóß^è*. §‘”:hwÈR^ºÒjXgÆg£#1φÊ.ÿæÕ"…¾ I£³ñ³4ºB—H>rd—âÞpdKúMr‡ ^6fº©VÕge˜ÄfÅÌŒú¨’3 Äàú’íw‰‚W#[Ì/à}|Üäâ–¥¶í³é«·_Ómß2¨;·´±ï×rù»"25gç0 Ostå?_bÖ„Y˦#[àLn"ÒœxþªÔPk»Óç¬ îoO…¼÷ÄrÞú¾Ð‘uÝÀxúE v|0ÑE`ôwªÉ®²Yøeë L •ýtÙ>deõ ‘ã»–‘b°s­&ƒÂã›òPw2ÕÂF$eyj¾ÂáÖÔcçK/§£Ú°åð-¿X ?{£ÚJ (Ñpþ*Õ¯‡©0n¦¼ƒ€¡L^Œ9š¬ë†Cÿñ9Üæû`tÔ§€³‹ö “Ì$QZî.éÌCnþ¼_ÇN­!pRÿ›Ô9.É‘²íþdŸ:2_Óä»Fù´®ÀûÇD ÖåR'þÐÛmŠŒïwY׊9¸[Mcao0Ó*õOLuCöæ¨Pml 2Öf¨ñJëj[\Õ¶Õ gÓm)ƒa•r1¸—fhsÛ|­Ç1!Ï^tѶ??·®W¡¥q#޳[W"ݺf)ò]µ*ù_ïMõ»ë““ôÒ)©‰‹pãËcw«=¥E±¼Qý.¼T‰PF±,ò‰KºO_½Ìi”áóØf3®ÖŒx3G†µ~hE s¯‹¾‡ØáìXYp·ÎH_+YAŸ[dV¿ÀµBù Äž.!k vÂV•\'fIJ”ІºWÅõ,»x)Ø`†ž¹ÓÇíÒ‘eãe™“ÖUFÉÁË«F‹<ä~g)]Ÿœîj†PT[ŠŒëVÚÝDÎÊo‡`±ÊȪSGɘ¯x*,2ÖìÇ–qBÏ.àukl4Z¡Xx÷{( ”é ¦¼Úß( µÚ À<)ƒ rxØuE;3fNÆ5BÍS²æêè>Ç]Ô&\Ÿ¾{È(vͤ¿7>›$›Ã¼<þ[›ä24u"ÕšPV#£1Æ~þ"«o'Z@È÷^Ùwh‡ÙÕ0Ít¹3Ö’ƒ"bÔ­kÔÉ~þ;Õ¹xç }×ì$³¼ ø¹@Ø\äÐgN=‰&ëª!Çæ©V§·edT‹‡¿+÷sc½5º_FK‘u²®qðÌ~ 2Î6³#Ñ‚UÂS­19â±Å <ÙI2 o»^`'§Ø­‚-ü {õÓ¦ô]ŸÝT>:M"Þ™ºØ0‡•F/Tdã>µ¹½©Ì‚!&™¹7ºSŽ Â¢ºØìJºçY$1>hÍ•ìH€ûLMz‘ˆ^u§#Û§gŠ?×”©íR?‰}êU9ù‚EÖŒ3p“ÝwäGäÍVÑÖ´.ègÍ8Û»¶çm`wdM¡ K¤5Û¸å¡FûÐÞÔ¹® 0Žf­[Ûg8òÎ çüè¬mŽÇXO“âüæ­¾ ç÷&_U&1Xd§9Xݳ½ÚqÅ‚î`çÍô µîà+Ý”oÙ‘èFá0èuòNg·³LÏNÉ–7’X•÷ôìŒ.:SÛY[ìH€µö6Õ‚ï–ìL®ztwÙ bÞeŸÍÖ*š7ÝÕ ö4÷I{~HÛÑ¢¡[‰w°$÷’ jŽ’šâÿWCË)èZ'}À»]~Õ1«JÐØi_è÷£ÏØG t¹ö·Š¥^?úš3ÝÎYZ H­}6>Âac¥pØsjTáßž°D©ëŠ£WDÃ7fãˆÍDEB¹ eúË«í£¦k7*ZuýcPóÜŒºg1ůçH·%~msÏwر—ä™wgbç‹)¾uIÓºÊ*Ùù™Aè2³«æsâö­"aÉð‚9«§%„Ú™ÀÊÈUبëóÎob@n0''ëIV×ÙÚG[:áß/" ùNƒøCdë‡ø<ã_û°û½Ê9 á^9“Ö5ÐÿäÅ–˜š­.ÄÙŽñÇ,Iа›ïŸÉýîPJ-ÖQ’wó%F"·ýò«š:ôNÎntæ4®BÝ*H?¨íŽuF nCz_k*pFZ““¬9r2µŽ”æ®»‰Mß4GÒ¿¼ly<ëÇî°˜¦ò¯BÌÿfN58Œiã(]Ç j¼ܦT(Ü¡‰1ݘ;s‹M9 îýa—â¢ò¢ß–rl¨[õ¶÷ƒ¶Ê÷Mâc“÷Ê'hJÓáÁ¸d]kDƒãÇ…§ÄG„´â#VÜÎI½U©1h#miôXc›‰NcNŽØ-MÍ(]&xÔÌܰ¦Ìôæ^„å]%§Ý¯Bº“5È,Å¥~— y È"ßµ‚ÀÄ_ŠÜ¡ûɼGe"a$FéI£å˜o·"ñ«jy³¬½Ü …2^Œ ? ‹,.Z¤ ¿ÕGFùuÜ!H´²‡:›UY¼alòß½§Ö¶|uqæ½â¾Bõcj«§Np¸WÖ5Gÿ‡ÿ—ýJêÚP˜lmh„R Í †_ÐÛóEÎHVÔ\㣕òJ/:%Œÿ(n­ÿ“ʳ¤ê¥Ð¥!~“F×xJyäй`"h”—¸B¬vS» …t“DùiM¤qcàlÖ$4ã`ß;꺚©ÈTD07T%ý€fÚ ¾ÌÜÒAÂ1ìH Œ¨´˜fòÞm#­eVìŸ~ÈîÃLuèU[âG “³A—&áÛ÷PIÂzªœÐ¸?_ øLüÓs©ÕåA ÊŸ `!M°-)cA}¥»ÿœÃǺ0"Èb°÷O0œ÷#'›s*8Ó•›àÚÉñë ¹d°ôDjyÑVMmÙÖ$“g¼$'3Ó*uhs™‡ ¤óÝäý³6Tnm`»Gp±Da×ßË¢Š´meVì‘®7}¢D29¶WÁ3†Á;¿Ýó’1d°ÑâýLò¤Œ²üŒ®ûêú4¡yæöCö|Bp‡G©Í–.¼'ò£xéS¡Z6Õ·Æüø}©´ÑÓÔ°R)S[cåE=âú·”l' õs¦©´n0Õü³±f4ù‚ô]¯|L¥¯Í!²u^¥¾ÇÔ’Ë ÆØ(TªÔœ°_×§ jÈ™:û“ðCÔTW¼kH… õ{+rx÷|d_!ö±ýU3\C:'z1듊•ØœFGh¦³ Ô¼û@3j0±ûdƒñ×$æzZÍÁ ZÙ9>šD‡8íÆ íOv¥Ôo~Ia ­×!-P œ”¾W›èà…µ{û¥·™§¬)‚¦{ÐÕ£µZRƒêºx¹ÚGý}Ñ„ƒ÷ÚC ¢L³®ññ]`•k»¡wsç ‰\˜;µRF¬—{>5ÏLß®NÁÁk™#ËÄç%u¶¡ ¬Nœšò®] ,Mt­nù€$œá»FŠ5‚Ö0m­)ÂøN_Ë~ÉsW,·°>X-ƒï…Uµ3ÆÚtˆÿ=)C]‰tÈ}x.¿¯þ%ÿh¼`‹R»L}Ž#¿ÖIgóB‡–°*7 Î(Åí] 7ê0r¢ê¥½mK&Ý䎯¬kÎ’èò{z®¨¼÷QI}(={ÉzIßo%w5Ön™â÷Fÿ ñë-]ì+í‡Ò§Î!²Þ’`Ï¥ Ô=·õëskjóª[×f+îJ²_0”®õ¬‰|c*›­Þ/)Tº´ñæ½ú£;fBFß÷¡Î,åV­ÿ}>¡ìE›¸C†¬¹ÄŠr-¾Ã12¯pWÖZ¥’‹õØÍojÈgù4¸Ý/{YIUTjÑçqtÈ]S¡ìÜ&}ÍicÂ0Tö+3ζ%šgŒ‡-ßv¤G‹“y¹‰ÈÿjK!4׸}ÛÑòÛTë0𽥋w?‰3Q·®ýÑ*‚xË uˆèÁ …ãžy×ù»Ø0ʺ.Ópà·kæ`bfÚM>R9FÌñÐ׿“Sx²sµiµ€‘9€Pâe@QÊ™bbKpØ]Ù©!…q– üR×Õ1.…¹»;e÷ ß¬¦)«ù5ØØÆg»"cž  ’AÍQ2ܼšQÕ.›ÏÀý”Ê3°Jå[˜Mê3ÿ!Ö2"IY&¹Zz'î|>.*ì`XRm‚cC0ĪLßÕÓº¥­›Ê¢n]c¥ê:ì'2R¤‘qAf>Bëp2¨W¨fÍx‚‚ŸMˆ®ØóÊÛdm¤´–æ¨P1ÒF2&Í»}}W• BŒ%è2ú¹5ˆóåšè8쥇€M×ßÜ!÷¡ö5æ­77×i ¾Ù>ÊÐvâ÷ÆGø¿è»À¹Òº[e]G¢€FçÆÕ!gßÊ-'œ¤\Q™›5›ä•)SÛ³çÚbù ‡Í!ã^ºT¬7©Þä®fãÝGd n¢È»VÖŒ{|ä³-Òì¹#­«p9YýU¾ ÌÌLÁê²RÏ ÃÒ µ¤8Ôû쓽ݩȸÛÚ_&Øä^œ‰Ò+`¦|Wé—ûʵHp•Ážu}J“A­JŽ‹!| `s@´ä³Ã:«VŒŒ]Œ Üøv½ */ ϱ‹]+ FcþèÒ BChg)‡fÆ¿T/·õÈ\ì%žuÄ„ŽžõϦ¼S ïz÷%3KaòUªé _ÆRôÙï6ð ã¿•¨œeõkÉ]í`®öšQ§ÞjXc—©©Á’_¶_P3öÏĨtùfã×¹ŒŒ@Ó° †u5ù3¥Ü¨ÁtÐ_àÈ–é$v32›=T­€•E¶¯R|,âÊ¿¼¨tt¢Ì»Ê¼ìú,SUdì±›áÉÚýëÙ\|µÖ@¿ÙQZ½äÍsÙfÛ£¦dÚê½§ÏÍõ,Ð`IºÃR‘– pÈ*koàNŠ®ñøÌ^·Ü6¦/Ed4jØP€n<þ J₣ɵ޼¨ãî¬W,ôƒnÆíq%ȇªŒÆÂ»2² *ú ¤ÏQg7uvšäE0hÈÑ ŠÓ ¡7w¯íüª€|göÊÔ€ËÎ^}k¹…Þg•³Aà)†Þ›TÜÞ[¦ö¾[ÆL) këj¯ebbÔNOmìHÀ†Ffnï„\• c3o¶nG$n7+=ëì-kËç&Œbòä”8öô·›ÐÆøˆR?šÙÆx÷N¾ ªX*ÿj•ûÔ‚—‡2´vd…g¬ @‡þh”‘uV?Ñ.¨aE†š‰‘ïjMQ±§¦ïzK—uA3{õ/ ÊêQó«ÅõŒ85±£K@Ö²!mL‚Žñ() +—-’_FË)6¾ªÙs!3­kN©_wƒÎʺÆi)q D—hÍÉÔ^Tã`Þð±_Gø„W¥Ë]µ~²8½P£äÅœsfVˆEÞf+ÅÆ,¤ÿì÷U]”oÄ{§*Ûb@™f¯ÜÐÙ‚==Óõ[û‘A½×u®@åSkµÖõ¾P&ò%pÇ8¨6ïÐËKDü@«d/7tž&$+©tµE¨•éâÜú¥¼;t•Ÿ­X*qS»ÄÙØFAÉá&ûÙ¸µg¢4kMú˜¥ik«:l‘!Óð¾ªÞö"‚>ζ»Æsʧ/VUÄ:k{ÖŒõƒÉœ=—7YÛìk6#`—u•vŽÙJ– °«Ô¼A0¡ì–ûñC…á&¹³«~ÈZ¶–ÚA}]4v2_ Ü ¿ßéf_”Ìj%ù„cgæS¯zø(ßÖCzŒ7OYŸta¥ -š_ô`!­òæE…9HWmnËZ]mé ³WñÂ+ ÍÌŽ}sK=ýW‘2éÙéÕʪ²»—<*2žu—|\¹5Ùê(KÖUvÍéæÙ3?nµ¯ÍÂuF@›rrÊNÈD æ<†Û¼‘Ä?ÄëS¤Sô™¨> k}dëµu2= âx·®wþÒ†Pz)¶¾l¶ë ¡Šo …`Ìu£Wa½Þ{kvFW0¯Ž˜U§˜ösdI’7ÏJ˜Mãü×g´]§zóe*¾¼™«ÝȨ÷d͈b¢p¿_²Öº¶:“0,±RÔö®Êú„‘Ëž ‚æû_3û/ŸÎˆ¦ˆVo‰²¸dೇ¹£ðõIÞ)W/{^T@*ÞwŸloЦm‰€ÞÁûCæþ<ÀÊTë,^ KÚ)GŠM¤E/dÈÊÈš3Ü%Õž•=( ˆv6Àm’ ð§L”ðû„VÀïã`ÉÒð’£E*z[ÍŠ^è$C ÎLÏ:W !¿Jµêb *Ö®°¥®ò+êmÞºÕ™¹k¥Üqß5ÕiŸW,DÂø5 Bu#uLäû£ÿºzBéßÛ¶Ò³Jµj§Vè7‘:+y2Ðí/ÙíUAÆR-èRo¹yðr‡«?zŸéÞ½"ÅjÖ¸×+èª'7á=n‡¼›»«ö{ïý°µº d¯•ôv+ó.0ù¦ÖÏ×Lž¨1„V€CX3{í-½Z'/ɻٌãGtïÌœîfšƒÂ©$dfeE—{¯ü¸ºv.Ãܤ“‚AÕ¢ÜJôiPGù/Â__‡n@ÎË=}ÔGJmÃdb7ïÐZf·®Ò´õ‰ûMdžÈ0ˆ^ÌȘY›¶e/BÏÁ.ªe]£ð‹Ør%¯(¤Ë@ñÃ?½´¡4ɶšÖ O¸Øó/ôŸMÕ„«t(ÚÈAµ@l;ñÃ쟿o?¯†¤¦58p€…y;¡…n`…w.©i4;WjTNaè©} ›²D½=…Âï[XÙéI´8FI„_ŠsfMé1Kqn·hP…S|¡Rd]Xb–ufoÑ æÐ šUœÁˆu¤ )4ˆ j/ñH˜:­äVÍq`‚‰Ø¬rd¯ò¢Ô"Öw/Ùá–mê™âÃ,¡žCñ±3?ÃLTCñY9`wët½rj¨’šÝ= ´%P€je‹$ ¿Qfô)3Þý›¾g™Ä-p|ÃUu7é4@ÿûݼô“ 4@‡"/­‚”Üê…ºi2Á´;²²ŽLí=²ä ¾õÖt6%ä5ÜRZO’Ø÷ûzƵ²Ò !ñVÖ„ñZ¦á¯jM Ö«2’"ôeMü#lþH$y“Ó%îûŒø ã>©Î^RÖÏ6}@S›ÊÓ¶â>åÈzŒx|1{uŠùÂÔ*³Á\vj DÐÒŽªNHÑ>%(}ɆZhGTZGæ&ít6ØÀH|lé‰àX­¦}Î;F ^àüìW»]}\«N=H±MãÙ—ö1rѼ°­ßd:/ `dŽá.ô „û7;ž—ÿYššl³o¥?û}Wï{¿¯ë^á› ^.ƦdÅ÷ÑÍ4üyÉ$P(Ðlò 4¨fî\¼xNø=Æ–›±~ ÏÐ…VЦù`ôÐÖ͘çC²œïÕ­‹mçÀ'é+ÖP SÛÜt6ì^45¬ƒ³ÄaÒáao å¼è*à÷ìn¶#Û€¸p. Ó—&ùÌ!AS[3h£ûLÌþ³é$~xu…¨.f-±OŒ)ÅZC¾y®'[{J&™1kqö´`/§V(3L;yE_¡ÉùkÜ­ZQÁíJ Y-ÂHÙcMg³×É‹Ae(h²%>¡­ñ1!5‡LãSRµõÉÍn0Þó•‰ÖøPÅwkÛº@'zëÇbaI Y…r‚ÛWÉôs­n+6™:fŠþÂÔ/æ=[wÍ=]€©‘ÍYLòÔúG§}f‘ðRU‘ЇˆK9Ý™{'ú j†WÏ90 3ÈÝÊ.ê:R>ï|}܈å8÷¬}“S¦J –oÙó«¢¢•um¬S:IÊþJ 7q© 3Võô1¡Óòßj'¥×ì1_ZŽ|[÷JºHD2½ŒªùGUz×P9¢û6ú_ÆmÀªk®ø¡ºhP£IdyË]WSwãy±%¹âÝåñÁ¨4*F™~öäïBݳ“*šÛê;<¯FéPþrËÕzÒX—Ú%“ŽÞãYŠ0ï0ò0Ë%mŠ ®GS‡)áäàš¹Ú]U/lÛ’š÷¿îÐ×úU¢„šž £Élc*G¹q[Í—6ßœ;ä¥ì¢¯ºw·\—pJu•R”Š jɬ·œÔ‚y¦š“D¥9µiUYßG&ùœu%Ò•ç9ƒÎfa$ÚdÓec³/žÓ² u7m=¢w1C!§µìÛÒÅ«9X¯ý™ŒxRªŽÌ»lA¹ô!Ie¡ì·©“ˆ×‘‚Âh#ª›úRÛdT}…ôÔ£h7ñü¬gÊ?¢ó¦ÙÈžªÖb¾ÊéVÿ`‹K?²}ð٠ʣLó"ªhŸÙ5Å5PŠP¥…²Útkÿh¥Ô+ (€´•j™«ªFÓ'2\ÿû“…t­Å%Ò!ãR›Jt_(ä)8éîR?3ÚìQPÃуAáH²V»Þ7ƒïuú>IÖ<õëêÆÍÐÌ‹Di÷̼g€jÝ)¢rm'h'YÒ;Í|ƨåÃùüÊÖUXþŽÚ*•–1HµÿÈW_º4ÊQ 6jmÛȺ4µW‰%èÏ®¢éš³e }4ÉæzÐÞxW²ì’êẕ(5½W/ZŸß\¥ž¾ð@VlJ§Я©q%½1ÔHõÍàuŠöËé5ƒ}ýüŠTj^땯‘)ëkßi]-ø©=XÜ–ìi+øÉ˜“úÚKEèÖu>yóYi)5¶2£EY‚Ázõõ*z½ÔñêôêÙëEÇŒ¾P/Eß®ÅÞœï:h­“ÂàŒÂ·ÄlIÝh2¨šrÇ ˜¤M°ª4Î: ª®c*ç4º.’Ý[(¿Ãîú wl©­k^ÛE²c?vEÞ)dõk‰5ëi†àp«¯~uÑþÑÅF¿kò¥1J<ç_ÇŠt^€VT¯´¹Ss»Œ-õH5¤¶,d%ô…ÊèÙ¶ZSõ¹_«]S¼zûÚ•‹k4]Ö3F‹În[<\Ž5蔀¾Ãæ+Ö©ucÏlj¡h~ߤC€奶l³…y½ ‚¡zååÒ8«VÄn~‡UZò†wˆ?ò)k\€ÃßÃökO]bž­—Â^“rÎo^ʨ61®…Üj¯¡¾kô?ë†AA§Ë)ÉL¿·Çú’‹d¯FùsÓy*i]æŽC¡l©miÊPß|Û«n©ÏØÑÖt±Ô#®Ô'~¦FáLë—PtÆX»Þ†æ¬>{Ç–hë87-üŒ”~èk†Æ 8üo©qš(î¶“™8u{Uó;R‘øªÖ ÚÔîÄ’Ë)²®ªc Äòæ£%n„¶‡/½›Äÿø±Te5˜þN²À²VH;[_"ÒÆ}]ô¤–¾Ý(M“Ñ´¡ô#À5AÎÚGiíFürPGLJñ";ÆÌU×!<ÝhPï9‡˜¶9¥BëíÊéUf’Oº+Ôù~í¢ðx´«¦.6V*e“Õ+··²h+’Ùv´ƗžiІ€„¨© Í Ù'fr›ïL´¥o‡±åãbÖâ?©_êO^£¢<´®Ý¼o÷®ž&ë²ìcêYìS¾Î†Êᘸ²š9ç–u½¢@ â¿ßHˆ9‹òÀȈÍÔ+uñ®Â‰¬JmRNöx–j]*»âËnwk/92°X_9à"?ž´Kù³ ÏÈ>Êh4µ5†”‹±„¼kF¹ÄRÏHëÚÓô\‚öô£¨´b;ù€êã£ÅvÎ’ÄÖËüžK ÀòÊžº˜!÷¬p7 »âB¾ËQ‡þ¨v‰‰¢Ä®)ü~_•qòÛ'ÂéÊ+×€3¸zÞ¬kµCE[ š7u±}Š]óÁ@ìlÆÐÊ=OUìAò1‡ å}X§uY*BöeTÕžô„ÎS ýBÛ8“¶×†‡טÝufÔ€í*Ñ™Î.ï÷r¿#s/±ß[I¦AFþLš’Œ¸¶‹ÝuKì°.—ÀtÖL×Å.·QŸÑ–ÈÃÏÆPN½÷™ËuÖSÒ ÅZ ;HNê9¿ÇÇdwT ù5/…f!U4©}µ žÎ3•®÷½š‚‘mSnÜä³ÛǺžÿ•CH9##8Y宿>áLìÏÉ®¶S€{¾DI˜U‰>Hß±Úí€ÈíYo¡Ì6ˆVÓSB‹K¦öÜÁ”çyçe¦u­µ¨$UkÇõºÎÓüìŠè(£¾»Q“Ó’cª¨ ½›ÚÕ¸C—ú¯+,jë÷ÓÒî`Å âû: :–7Ÿ5(¯„Ò©|\Ÿû¦©µË?‚A’Qã,ŵ1ZQfóR‘ 7h´_>Ì“Xw63¥]ƒ¶”Ûh6 h9¼ŸQü¯P4¦q y"ZaSͯ¼†|Y¬¼7óýýO>1ßvsxT94œÝ”ç*¦î] ­°å fç0òÄ´;º`Îɺ¸s¥q ãϬ0FN‘ü—ô'à÷álÊ=2(ð˜T~ë¹½ÃSuñ%&WÇ8pi] ©‹ýjNÚ'ª–›~ñ MPãòjkÝšiÜrºFîÞäÈ †¨{×c­Ú­ë #æ=ž(­Å€eS¢¸v…( {üW ZJ¡Î¨Q „FÖòIPšN”¹™«ÛIXú¸µ+õý¦qPeºÞZ‹qoÍ&š€~œwˆLZfФþðYœ«Ú úbàÆp«¥~!ywá1ظ½êçÇÞvtq;kFœžªˆŽQÙ !]Ë#jËØCÑÊíYýüˆmÎËtè N™ØºY8áp|Wký8A e¨M4ö™Ú«Ø‡Lí¹»’!8d‡ÜÅuŸœzwêNcÕÑM­¢R®4Ë>®¢Ü‹¦™•@ÉØ“}µò͸¶{êbƒ$5ÿ€ºØ°qˆbÓÄÃ6FÚ7iXo¹|Ï[õ£ÂÀø–©2Ülgl,dYµ—ÁªÓñžÙ ¡ó2êÖ*yuufc|À4ø#MJJ¥jl£:ƒ†ŸÌÙÅ“ŒŸld/mÞ->|6ŸsÏt|†rϨ?P»Ê €$ººÝvò×Ås…IWßz²¥.²yÿ™kQW« b@,'¯C‡ e˜²¦ƒ3·é9yVpÊOZ×e*É|Ñy*s{YNÏ4¼´–YÊ»©[I4¨çu[ûq&7å0¾BÒû /ðó®dtžüâ” Çh¾ ¾×,òJgû ¿b¯¦›‡&DÎQc/ÉFù $ û•ˆ…C< ð'å»Ê‘Ú^Yâlž'ä'–Šr5ȰäìɉÃÁlq{VÿCã³~Æ AhäSŠ}>@NŒ4iö‘¥%”Ú9´íŽ\í·¾Îé+œ(FyÀ?Ã`ÑLs´ñ'–U5ªÓÍIìøx?[ñ[K0{Í)Å{ÛG-ï@!Œ•º¢y†r•û*¾1xÕ±Þ„tùÀ! 6EÛW h¸›æp?„ïMl !3GpÔ+åbh˜î´Â½çp›î e:¡ý6=—BY›•OÖFß»*7jÙ«·ç’½ú²{~ï^yÔéâ^Ü®™Æ=ÿ{AïEõè Hï¸ ŸN‡.v`è–Ÿ²>ePï®ÆA½ä1'bÓ·Ô¶}I‡¢é/µCàîdÉ_é€þ—] Æ/,Õ"¨ö`¯3§ô-Æ+†ºƒ[}FjF ªY±ÀfsY2˜ådïE·Œ[a \Û\/Àܬ”b “³³N®¨|U0phuÚ¨ùõ8ɪŒ®H- L{O™+*ç v+2¨&UÏf͈[lqy({®¢g¡B¹x§çÅ©vWUâ1Ll³]kw(Míµ¼qdá}Eqã°>› êºt¢•lÛœزs0Ù6ÚÐ6Pßà+ûN"¶A¨¢¸ ÇØäÖºñ7ç¶Þ½)W†Ž¼! eöZé» u#ëÚÅI]"Xœºå»° ¤+ª-T•~šgC¹ SבuJ4Y‚ÞáîÂ’”òpZŸöAhŠÀÛ¼»ï$ôHt)yg÷xP… ÒâÕF—t'HtöþYÙEŒâ¦XGd>xwRô–Ðå ¥¨B›Üÿ‚Du· bú‰ …!+ìõ&íÆ*kX2ûð{Ü€x·~X µÏ¤ÿ±„ Ú7¯ÄëI«Ù}}8e|8³h'`Ù’šï¼tu;ÖŠÖœ¡×äDÓ0äD·Z½}« eŸ“åß­#ysvhÔqx€¼rìô]«Œ öå”–‰Ò¸U JßDïÚ¾;—  e7?»æMb8WsÊj^À£¶,æã+÷x}7*8Ÿ')zÍ©-»ÓáÅBËP6\»ÌÍ2Or)Z}ÞZ=[;tOz¶ÐKÆñ;!ñÉŠˆÂSÈÉ/,!EØsOø·Œ­U«m¿¦ª4¹DpÑ\'ûà+“p£ÁQç-‰Š/=ë™— } ÊGI±âÔÞžŸmÚ†iM'lÀ¤WÒ ^dMª¸þÙÒQU«rzg$[Wk ‡†‚f†N­äD¯ØÍöË.;)=ÞÙ ruª·šà|ïÊ»j±±o]pÆáȦ ¨W^`{ããЙ‘Žð÷%õ³Ñ·Wl]K’T/8÷›¢Hàüž2¨¿\™Í®¡peÊÓ‡Îû’Œón*㣻¸À—ì”Ùî£g ɨÂ$ä²»—‘¥r16Å£@6xÏ/~+io~­ {Z!‘ˆ%Z=±Âþ| æ&”¾Ç–PÕ-tygÀÜ6Ópctà: ÌF².Æí–K l¶q6¦z/«`͈fèùäˆu‰òé}öÜë4rðtWx|¹’^‡›õ ª5ŠÏÔî¤ ½“D9=ôy¶Ñ‘Øz~Öõi]X?‹üÚÈrï–å¶>ùqØü,ß'Pd]è5ZÊè5„ÑŒ3xÌ|èGJ.èHðTØØÒ›CÝ‹¼ÑRiƒ‰ASC\hjµô÷ÆÙæUsd#&§AãùŠA¥d}®øµÙ²É‚ºGÁdåBý?ÓŸ¹Ï8ÏÉE"0ÎäÞÇM^ m[N3Œz'=T/Ú,ƒ[¬³ùf̬².ìÚ)W;ﺾC]'S­ÞÉ$‚WvK¾ìWI$ÇA9{)çÙA/çÖ…aþäCGX´®—PS»zÁî( ´Þ¿ñâÆ=é?®#·¨þ ÁäKSAy2c,È~!ô ²â{ž¾k؈UÐ3.¦Z}£¨hÑi¨¬G þ»™âo ÁUÖõª‚Tx|î|*Y{i*ÅŠ H*1ó®‘ Ž~Dk0?¼Ì6Â*IéQ³Þ_ †9½}ÿä­ñ:]ú.¬J_PúIR%ã š;?áfõÝ”‹d6¯Ϻ•¬û3Ľ8áÁW™ÊÕVh„ï*-'£”ä],AÖSÌ}wò[ÙÃ|Þ®§ïºÝ!WœHÁëÔÝUuWgì«”IMGä%©qv°•Imõƒ@•æ£üb½%{-äQ]†óôu½“ÐÓRšR-@|EÓ¥‚¢Ð^Ù«¬ž¦æ¡ÿøFV½ §hÀ)L‚¦F…&>:ÃäúȬa늞uš£Þ´®›œë80¢ðCûú³¤Šú„¼Ò‹QiÚ:fsn[v£ß–uÝà1õÖÕ<Ô»÷Lñ±Z*R €nH±•) T*û]VníO9Ò6»UÝVl£ GÑ’4ª…ièßÊ~ÙˆGÊÅ”÷£ìê iw‚ –®ÂøøWþh!tæS·áÐXMSŒÝþc1X$X‚ÔžxµÍgÊTü̆«p5KÏ»@]va¸|”wrOñï¹ÏªÕ¸¬GÍß}­«ÇDÌܰz•ÖÉIù®±Ö”ïB $WxR6Ê ±ž„i@Ãe*r'ùk]DõBk¨"ž”=ù3‰ò”“½•ü€æsÙÖÄ0ªW¿laL †UÏGxã”ìõ¶+y C T™Ú;;3¾ƒM±I‹f8›¡Ú4áYÄö¸‚Å? ˆ"±ß…ñŠØc3™uT3b#KŽì}ëùIñ[æSXËe͸1~¿jd¡s|ä cŠÝpäN™;¶ª7æ3ã‘Öõ2£lB”}ª’°^õ‰AåÔºªI Ô«X×™õÜÙ¼B§*¾q*«¯ÚŽi€ÝïÉÿuÙ§ è¦2sã³o*°½Ì/T}‰B3Z2ëýÒülYXždŸ¥‹Ê賞ôvÛ‡e¤ÈŠ˜>d›MâW°¡r’ÂvO Ãüó#¿Ã¯©f9òþÓ°@÷:' R™èxöUÕ+ÒyœÿLe¢µð¦L å…¦vÆ`zé€^­ÇB÷»fmÌ»\f6î_)‘Ÿý’Gš1X g–ï};äÉû] ÜŽçŒdíêjY¨òâ¹ó­WÞ-Yj­®Rd]€.Ì­6>:f2¨)wlsð•Qw]ªü˺OW8g¤Ö›¬ÓFÆÖèÍ•ñ”¤œÓ¶¬ kÿ9”{!8uÛ_t'¯á5¾‰+Göî0­ë ÕÊ9ã{´)ÉøjïOW¤‘®ÕrÛ2tÑ‚`0†#{µð@I&+xW)~­Ê 킸СñGrò•™'ËÉ5°l§’]­nZ)éÕçÄ‚«2ƒÖ8I…Tm‘€ÿU˜*(§K©hK&ìƒÁmàNGVxqGÙJÐà×¼x¹##ê¯×¢9Zž]õ>”P{ø x²–š ÍN1C`«–î]+_1ûyR'ûî— ÕÖE#BÅr™=?Z+‰öía¦Hv‰5{~7ö„2œ¢ðMrÇ ºYÄÞ¶²5÷¼bâz±yÖuѼâK·~4huÍÔÎ`|7I²°XY <4²J·FÐÈ»©íÆPJÁ&v)‹„n¶9žAØÛƒê½éã^å[ ¡¢"W8{eéOÓ^ RêÛdP/Ø'ƒéº­ÊC±•b3v*ã÷…S pJ*¹¬¾R¼e÷™ÛÝ(©óJ*jN«F²õ¿ƒÏó³LDfz¶à8§uŽ ³åŸQ•Dà칦¼öƒ²r¡„ÄÕ„ä¨ñcm½g%~ÖËŽ'‚Òõö±Ü_›±ùe£á®ˆ‡m(ZæüŸ¾m=J÷°%Zc~Ì7¢V²Ðópâ«ï¶P,ŠVc{Õš‚g}œ”u¹òZ—ÓëGfP¦0ù<ÜÊ%ž²oòñÁ¢­4p%©5wJM!º>ZKë:s¦ôJ[-¥Wp¿¯^9=#ó~tk[uó¬%¶Š|¡£RÝbJH8ñŸïÖh–ÔCÑ.žy†â¯–H“|åqÎ{ž ¨ª&ÏX¹²BšÄkù  q2ëQ9 옲ÿ]ÛR¢áF½ò‚MQƒ’k,À¾LÀµ±3žÙ×)3ÈÉŽÏR橉’ì¸LÑtàNÝaÓ/¹ûÁ°M*p×ä¯NY™,±1”l”µ€†,wR8ÌA$!>àÝœM'!_A¾‹Ôåèw]Þ;ÛOÏ_þ°-8Th¸)«æH zKZRšíPfÍõžòÙ í€ø±àm¤ZŽÍq¸¾d²Cº]F‰D¶n’T:Wg…  ïS• 4Ï+NEÆ¡‡ä%öÎÊ¢î¶ú#gïeM³Î¡\ël².¤ñÙdÑà¡§@=(ì­b š’rãê|^©RC#ÎâÿŒKãÝ7á\d¨)çµ¥~æCÕ"Mx›óKp#,ɃY°HÑu÷! ^ÕYcßÁó®-Ù`[ W#–j§‚@9'õ·À›[7ï˜/y‘^nнÿ¨È†@m¢õ‚6úÈ–çÊG7Euˆ2;×ëPYH&} ‰NøÕ?·á1wX×=)…ýå'^%}W%êØ­ëî™Q|÷-í¦´Å\—Këü`¢2” £3M4Û–¤Ø²¥Â Œ†ua S–.^í-5„mÜåú£õÅ ƒÇUo^Iþ?óQ1‚èÖÇÑ b=yæÎöócl>ƒÿ©'Èw…”¹ã&ûòMˆÍUì ÌìJ¾œ‰ Y×Hͽb'/ÝPÿ¨P¥ÚËxÕR¬.soc,•hÏÈ…¿1ÿ½lPÙîÞ’Ib®”>®~t•Çê)Ƕ{r’e:QQ(ä'XÍÁmllŠÓcùDÆ{Séëå¥)¾SúÌŠ›w:™­0Ðâ˜Ö.}FÛ]ç'˜g Y·è…ÚÅsÆ<Áèxæt/r´ª%,kÔ1nC° ý¾hÎów²»wQœ×޳ïÒ·ÞåE -”çj²À2Z‘›Ð`«å¹@ºÚN@9¢³²ãµËG(xQsÛvX{SòøÂìIgs¯ °«Ü¹lù—wO2¢@±?—òiMw¤Dgެ§²h’¼áxÝžy í¹ã¹RfÛn×Qd¼½æ®òûoód´‰íÇèûä=î™j•²²u…]ŠŒŒkOywˆ²~|WÆ¿™û=A¸Ånx¹Tˆ¡—]ø@)·ŠáAð¦ÚK{ž¥ükWv·%5l}ò"»ë½ ~×j2¼“„á­««ùà^V‹rö’ÓÛjÇA²=Oêk‚Y¬œÑ&úÚ¶œ) sh‹Ï|%g-«]«•ùU5ÿªjP™È9­Äøíã»N…u ÿ™ÑÍpjùÆÌº ®¦$¬ð+¸u¥|–‰Z¥JÚXç#Œ:á´.ùYëÈSÓá×uÖò ¯•ŠÄœƒ{¾1·4ꌚí*ÕêU»ÊËHŒÓwuê/Ãw-IÕ‚Ìë¬ô]»¯Üw¿K‚ŸÇd÷ôG«´´®çŒi‘ØÕª÷2äðÀ)ß3k峪–ÒTÏLCPEÌÿE£rª¡ËËÈ 2JboÁ¾­'Û^¦­”ÞûTÍñ쑃A˜ÍE/]‰ôýÈH¡`°JÊîê.©xþ²a…2SY.Jµî¤†Rü® gjÎ[nvJìZ{bKAÏØ„RijJÂH/yñЍu‘PÓkÆÎÜÏ¡Cy¶ûàØuèèxÍxÚÇw½Œºª$zV˜OéÄxÅS¨qÒú)Ÿšªve…˜ùnäcéÐâÅéL%ͺô…€dÛŸÝ”ÕñÊ-¿ÝÌø-ÃlU:&CµPÍÃȈE¢ßÄ ^´¡iiE¥™BžP9 Ï…çé]íA‹„,芴¢È¸G˱ÞìæðÕËrå»°‘—¾ ™û«9‡ŠÐǪ¸Ò΂ÅÈ®ÏKŽóÔ¿[5c7bQµúÞ4›)îëò(Gµ`¿—Cµtk—~£‰T2? ·¡²(k¶­ë#ƒj—P«35çÇË™¨#»oJ°¿È˜ú¡`Iž#¥ 1Ìf”:ç“·•ú粊JWÇ(@´µm_…iøN#ÓõSF–‰kÍ’-’>3;T•wY‚ÅGwU>-®Û˜—ØÒéG1ûU·©Nû~êÍÆL þß–m'ÕÔÀ¬—[Ì©«l>W”Hˆ=¤fF(öiÜž|§³Z¶Æ}Ë‹};ÇæÉôÐ ¥6ô0ÑUV˜¬÷f‘÷"ÞÍÒò¦ò2Rdeè̺`Ý-ûÄš›\áj­ê”Ù>C:›“„»2ïªiîèæÔ#ŸÛS)N2I‡l•:·RF¨E!&0²zEÆe`=edhÌüS3®ì.¬m¼òr5ÚÕ9½µ#¯“­×MÊZîW«¾Ð÷£¬Ý.]!8ý#U{Økr *uS'1»©˜@æûìr¦÷:r68S´ZÀÐTj±èeT;åÓ ã™µétûT$ÑX=³=hÊèåÓ(¨‡#[ŸçÈ ˆßɋ̓¹äÖêmL è¿dPïÿÉ¶í³¥Ôïåjp¼ÿöödA}—‚ýs…M9ܵKÍuáKz«Çò{«Ù*zoËT¹4²Ã¡5Ç•#›…3ZxµUF¦áÏuTƒ·l(È뇫Ÿ¹òã$dõÈÂ9,üUâ·§¶pDøÓl¯EõꜜÞàðwë¹Q‚Õ_òïCøÛ$ljÎS G‚R(æµ?,%@ꨚ|®4KKHÚf’²¢–ð9™ìÕ{m™Ùí°ô¬êù¢WѳcXãýÊ«½/¬Wé ™d״͸_F†ørô¬ê'aÿe¤ûKK†:g‰Ÿðb3¡æàÚD/Ù¤r}Z\£geyiåÍ bgó>ÙÖ|YnIgC?wxTP÷}M6f¬â9p8EŠÄXkLøÏE&ä¡çWºrÔ¬„IÙº{kJÐ1ÀJ|×ûuŸ%Á¥ÈˆNJ'E¨ ‹´ÆHÒÉ Õ„N…9ô /Ibâèî¿\ý#^¾SIB³•bÛê{d~6?Iô«ê>ND$]¦,ZYFýšCÏ缚jFpýW:²aâò‹ýh1ãžõ!Üz e¶±Çž©Ö©ÚÝrW˶D黀ëZÞD‰­Ie3íÎl•r”‘½ìøÈ«ÕPç‹x5©MŠñ_窎i”þIÕ¹a]3h Ê”5Ù0j¤u}6’‘Pµ{5^Né_xÏòoŸ“ ®1ÅŒhÙ•zúS BAà˜Gw€3N3lê‹Þ–ôÔÔá|~º+#ƒD Ϭš-OŽr›z4¸6PÊTì™›2â†üÚ Ôi£¤©áÁæ{ÛdŸ/ÌéO™utwަ^ – Ðã£uŠ+e¶AťȿWOíã2ûÕÇ•z¹%j~“æ•x©O|Ë45Û,3Ž͉¬Q¾â[“<è‚Ôl”ß!—‚ß'™t¨À©5`„#t6XHžf½3fæP`ÖZ|E¬‰U±%Œ†ç‡ë±“bƒ‰—HpÓVçÊý´jY[h™æ¶ì îOÛMþ¢©! qÿNÓ3øÅU•ïwÞU‡<­•”VgÌÜyª½'BlÔ³u±ŽÆ‘è¥Õ’ÖU3ê_c5à]¶w±Yš€º)|‚õàÕàðñ´¾ÝˇSáx‹•58vhn%‹øƒ«­Ï$è•&”MÄ)›Gϯä”×è©3*½»ýé†ß¥šÑvò¶2ï&\”õ!áÜ­ÊŒšvF$Ò8ç°ŠVf°å'¡ÚçCNü *áÏkYW ™<ï—¼º‡´7(ó/¥@z½„ `Résk·®Ö'kF§n450dOš¸5:M ôrâ‘(ëK:„>k¢[Ë`oí³›ãò»ë }nz5Ðõ&ÔuÞa)A‘±-'¹ê}6Îþ¸ÏIóoœÍgÞ³“Œ´ŠyÕðÙ¥Á¸µÔÆkÈüú OZ8ô–ØÍ]4gDƒ£åc~^£~ì®ðÛYéæ­¹¼jMÏ“Cë >»×äd ¡'™Þ ~¤y+ÛŸ­²õWðˆœ”H¶š›Ô›î m?-f—&1fsÔÚÚ0&W.Ywkoš º—¦6o-ZÌL•Wkž¤Q?é×…ì’[Ny¶ ]×½‹¥ý,AÕù zŽDU£¾J ÿm™“ß ¤r÷ÙÚLzˆ(°5'jÞc_ºh5x"§Û*n ‘< ·QµÛ–@*É:­I½ôüúªMK­[’rŒVNoø¼g†2¨W€&HPÔKãý !v=‚\™e‘ õù Ö%ê닼™,%@ žô «Æ^ ›eÇUô-´6ü¦¬ô#£>¦¶9¾5Sëý³²½–¼šå¼¹>/%Ï/¸¸o„` 4”DçÞ€ù»ÊÍïèæ¢Û3´œ‚®=WýŠÅ/ò Ølk|Ȇ>ûîŸNísB7ì®É~9o™Ð]U„iVæ¢é{,UŽ¬ìš€:p~É;¼Ì/Wkæ9Ÿ~峓¦õ~_ú—¥|ÑBðIË{lzÆäYaÕDÓ’fn ¢W\ÛÖhg*¾JÐÁŵ󠸮¥¾›ñ“ Ý¡ºßqœKø8˜Ú>$·©MRi=nšèýuÐë?ë‘­“[ßôCÅs‚¶í¢÷3ìJòú¾‚/âuÕ¶±iÐáÏyËû½(’YSÛ#m£$䨅ÞÿížMßî‘9££{Nž«%‘ìk$±ø\4¨FéiøYÙ²BsÑÔÞ½ïºá/ÔgÞ LƒYk÷C…×¾úï÷åš!¶627jJñ„3­«Œ­ÑÍÕrx´wÑ“jSªÔVä“îe‰é%s¨ƒk¤A³…œ}·Ÿ °×áæˆE¯Ö•C½ 4ô>Ì«y‰==€¶)SO{áÅË å»°RÇèìáô¨HxÆŠár²»Wl]œîÐé˜Sű÷mËAåð_sè$C¼êÌ8)A£â¹-ñtò¸˜¹ß©æ^ÕÄj!;žüªØÝÜÿ‰ÂvpÎa示µAú}d½eQÊÜÖâé* y?èâ@¤åI¦ {Ž$R~Q„´E×]-O·[«Ìx]©®5-“ØÐ ‡Ÿ5g)\d5µðjyZ ù=ù» …j|¨ºÄcLEIC>î¸:J5Q$@²ê¬YnÛr{âÄðâ2?8/gŠ›ÜXë ­›!ñDç2õüN¯©£3¶,À¶˜³R]%û%Æ•³ôœÛ‘"ÃF7§ÊX_„êú¸ç~ÉHV­¦õ:ël÷ŒGŠîæê[þØuо*Áfj¶á² ˜3Ì«T¯Ê¨W´0>¡V¹Š1'-f?ÓwsÀj¾,¥o¹ü¾]½À«¦â ]‡ÿÑ;|‹è3“ÆcÜFWyt„2¸eh$£·Ê'½j&/^¶Haݬªn –´|Kv•é,u5„UzªÜÚíÊÔZkòjd–Þ«¬((RC@¯~QI µsM‡‡a†*rBúcŽ.†a¬g¶x•døìs]ŒJ b¼ÒVšƒH͈fdÜ6Ù¶šø~Dɰs¡s5ÆJ²2¬IÅZë¡ìËD‰ñu)ó¬ 5Ò;¼hzT`éONêR,¦ ‘«*u‘ë¿DF“Ø9x¯¼è;Up°F9®üÐ3ÚF3.¥áØO—A•:ä†^Ò¼†¬«Ï•UbxàQ·–­;Ôê‘Ôð@÷Ò"ãö±žŸ%É~¿Î¾¸©®£­2þ ¹Õø)x†@ë ëP]?ÆêúõƒDæ¾ïà­+‹vÇÕ»Tæ©”[µÊ¢½ïÅí¾uq7уßÔ÷þÃYùÙ¥|T»_|§¶¬µç©ƒdŽšRµØ;ŒÛÿƱÛA\ní¡\<Ú ·æDôA›5¨/ !wß„‚Cú¯KµÍÝf€\z3ܬK;­9õG£oJØ šRSf5.é Ž˜Ã¹†â줨G“¥PÈÓØ’C¿Ð€€“ -–/~;ûx£u»›õÎŒKa7o„lGåzy´P·|{;[Ù¤Žª±”äÝÇ~‚è.Ò¶„¹»ç‰çWZÜIk·Ea!s8MŠîÃx†*/^]È;d#ä±õ> å®.Z-zDÑ“cΩ·•g''µ—¢o·g¡*²µ1âüÙžTˆªÚ÷^÷λ¬ÈÛqœûÔ#ª¬ K²È”ÄcÆèFš£@U7†›ÞZ¿}Rò]T*Â]­6ôq˜”}6¨#d¬à¹²Â»ya*wCß{TjÞ[·£SKÛ(Yz:jh"¾Tš„f·‘Þ¡¬E®ºþ²®Pg·Í-9[n쩺~îHŸ„3Öxqb‹2žß,iÀQ/^¬yi](v[%ÇÓÅ-ƒ}ðãP ªØ‚ÑÄ#Ã+»Åï3ŒÄ¤ ºUÔ/D˜¬>Ð ÕîXÇp³‘4—ñ_Ô#wÜ$Ø1 ö¼Ë5G»oÓ¸u=ÿÙePèÕËóÌ ¡vÙ¯»©7`Ë›bX;–w@Õ9BŒÙªC9Y€ñ?"Ù/ëÍP]ŸÒÇ­•gè—tú8³ã.s¿­çWím§Ü׿BÈ3Dz=ï*cÉ­½¼„g½¦NõO ×¢wÇNPHûÆÆYš p #s©ãüêÌ©uËélÐkª|´#…fm; eXýÒ+0hŠQØ.:›£®¤Kf÷Kw…Ý¡báèVBCY–ÉrÑåúv3ðk¡3:©{ÚLN'ÒÚu÷ÐÉ|)ý¼°®@!„°ÈHWñR”-—ò²Š.ë:Ê–A[<¿ %3:܇“ ²ä´ºèeëmL“™Ma¾-Àv‚jçw >•Û]a± £ÛNPŸYÂŒÙ(¥Œ®ÖǺÆÙÉ7Y›÷ó¶2h& ^€ŒFNòEÖO7B mœÑ½.œÒuzø#°|+½d¼Ðº\ó`éô¬ö©–ÛÙò¬µ9zÉ“ÌQ"[À]N^¸}5—ÛT;Ã$ˆ—Lí×’ïj‹FÕîË£d{eNËäKmQ&ý2:”•¶˜È£%<9A¾Ïk;{“Wà ™HkmMS»÷cw/2Šr•³"¶nžmsÔ'¿Ð †UÖ…]šƒ‰Áä ÞYóTyK,É¿·Ü!”³•Nh‰¸³!¥Ür^ôÒåK°ä9vlÌ,AA@”àë@×…TôXÙƒ [ÔuMÜ&sؽÓjŒ¶È}bmgÉÙ@)“í²Ž޽îTvüþ£¢ØóîªenVÜ€^€~p£s3C¨”Ü2¸]ŠM)îÎ0Ò[d…ŽÍ‘&<ˆöY÷ØæÏžjââÐgàõšP*©­ùâþÈ"¯†NWÌ©$£jìÌܱ¾W?6…í UæÂ"ž"’É­u¤…º‘­ ÀײfDõæ*½Qˆµpº§’\5(–'ín# ßêbìÞVÖŒïW4YJù¼ÌæRÒÏŠ*ÚÅÊÆ} ^ r¨HMè³³”½ÐzÔäÈBAà¬ÏÃ|wä£Ó…ÿIë­¯êiºû­-Ϊ1[*Ÿ‚ò­JÐumëúpè¥ÉûA¦9{]@9ð_|ñ%½&­ö‰·¬¹w¢œÜŽ;U‘‘3™ˆ='§›=–Úý"X}âÇ®–-ôwSó—ãl7šÚRµ>ɰ4Y&¢Iß5ál> ²XìLSÛ[¦¯OÍŸu9°ï«èØŸ{˜¿€UùÒwAÄv¤êÔ[»ÌáýбuÛMæ¹ÙNJ†¾$<µ‡8îíãŠzŒ{wˆæq|—çyy‡0VX©ݪ¸«Ý>€Ö5 ¬®Ðe4œM±bß6¨l¶EWþ .}8£Âc“ õ¨& (U5½EsO¸¦n?BsÝ}¿Ê©§or   Òw=7Ãî–1g×`„.Çèûe }{“¿¯”%‡×‚jÌ]ÜÜG‡ì¥Ž—y€#%³ÇW>ÐïãÀQ‘ðÒážeÔê¨ÞXÁ JšØdŒ)³ ŸÔGÂï_FÀ~³™ÍrJïYnYÖ’dP³<ÛõÕ…êÀ¾ÄˆqÛ$/ŒIJS—ØéKs˜0ÞÈm‚YºC—|ÄÖ³…HSß½l1ÃKhÝÈ0RVéeÔF5iwºí·('ͳ¾PYáKC«¾ï¤dWýØýU3ŠúþT;‰ìif¬ÈÎ*3¸ëuâÀ*šØF,6©¹¾.ƒ€ÅGšÚý u^DÉ‹gOZ"8 ¬NAï¯ ¾ƒ‚¸uEn´1Ÿ®4¼ŽË0iŠ œž’Ò@=P¹n5å|èÀÐMUü;}dHX»n]¼B:LþÿLÑïÓoF«YÙó˜G}Ç^ ßÁqìÞU‚±ò›Ÿ6ÀÏ0&oš'c6Z‘N¯ïÉ;@k¿óÇ–±skjöóƒ¿`¨Iú³ð/$h$£溟‘}Ì"†ÛgÉÁÄK¨sèQÆI¦w`=Ù÷”÷§AU{wÓQ2'™îjÇ>‡»¸Õûç®^ –L| ¦[+…Ý,}_Z8:‚]ÝðyÚh¦á` õŒ r£¦ñ}(Å8Aï7üÅ€®(‡}ýÑ‹…ÄŽ¡К¼ûº‡b”Cìâ<Æ=¨ŸF@ÁØ_ìI…«çlrå ƒ‚š?¿*ÕudÑ;7+Àž&°Þ.ÄÕN*—öWD~[©ìÉhŒ òæ>ñ+Ë •D‰=s£`u!*Mì/‰˜ðÙ‰Ëw|6á÷Gýè‰0c+¿bN³eÎZý®ú`©íþéÜgÐ壭~×Ɍ촹è$׸k­Æ$ˆ(oquµæú+T˜Õ=ßo¶æ*ßd4£ž¹âÚ­ý¥¸‹Ps+ó9:ý5ô']8ô>ôcW¿œ•¡ÁØT†ôQñœ×Ü2¨µKnMí¢O´¯µ†€nj¬ï:‡ÃýPZzHNdZü#C8l™ä ü„ƒM“Gd ªl4ž²tÆÑ”Ëqeïäg! nxËF0oˆ5rà 냋˜°B®_;‹y¬‡Kºˆ+œ´øŽO½˜",E™³ª…°÷:cÇz+g%.m†ß_YaB/¡Ò‘}–Ð2P^…¦ÁZ8€ñ¯Z27:=S¨[K†20øiŠ fÚªŸt7å‰ ÅžéŸeWÜ­UÕªßø^¯žók\°=‚2áÖÈ6€3"B?+òîP\[e&L Btøg¶|%(59.ð]ÜVÇÎ=ªpWí$}"ƒíÇ~U×·v<»uYˆÂÊÁ_‰!èÒE@‚\4¨Ua·í£j‰¡G;O¨@?qœcÛdpÏô¥•µÒ¬Í=‰1N£`šƒÃ vη[È÷zqÓcÕ50ÙY? gõî.öõ'ºØ!aâÕÛ­ ‹8s0QÄ¡4Št¡V›H]ܺV#$g„­0{5*\øæ•pÆÕ¹Š=©MÒóî'EW¨cºÙôš$ͽ4êß!Ú”ä¨ÆýYe]/B‘†‡±’äÞdA‚`Þh.ÉXióß’”J4ËrŶwébÃkÏ”P€€ºL‰Ra›xSMùÚ²PËÉp†öD®ïv-.# A$’«A‚yŒ6Bî1ªÓEÔu5U×_J¨ k¸¨‘ÑÃY×Þ{êbÔ=tQb~ºØ¡ âК¡ÚcY&Ѿs”5Á]¯ÿMëºfP9/¸7‘&*…Úõ$Ç]+› €¡l1œ¡Á?‡2ôºù”,)h”¼sÎ0([d˜º˜Ëû Îùü*Pj|6c5ú„Z¶.Z¹)³dA¡ ±Ü)ñ®Ýý18sµ•Y“ t`zÛK0H/n;%Ô÷ûõt¨§áM tx?6>nã'¯k:¹¢áßnì½ëêé7jÚûºbðC8¦¨Gé“ .=!$@7ó³gA'· Ÿ‡’oå û\µ:=ƒ/T¬ÏÅ?Eú–Îòf?öÛk˜úQ]'#‡}ñûáø9‹ôÆæ7‚›!°áYòº§§mÔAÉŸ¡ÃáÅn>%t¾ú½)ê»áø:?Â2Ö=„¦9÷̨wç>*ÌáÜ4¨;(ân`6:S,eçhrÉŸ}©ºg`!É=6 ‘I¾Šx\á(Š­5¶õ‚¼~äjð;ô¢5À)›Ÿ%‚½“™ô¥2lÁ¢¥¨.¢1’u…ɳŠÏq‡úüø¸Ñ²H;ýÆŒÍêb³`³ö ‹ ÛU^‰o®«¥A= ÈHçf“¥Gådîê½­'Xv-.¹ “¹É“aò6©TC(8BYé©X€ƒuiÏîÈ6~åL‘ìgù©[C'´6ZO1Ñ‹n®šÐ÷Gk£Ý=4m½’ý„w»Êš±X…Ù ÛI˜¼¸±&ãZ³P¬Ê±ƒocËÔµ6ÐÊ–á•h¿¸›ƒ Õ(luñR òù—žíÝ™ÛÀk5Ò”‚¨OŽlØœã#:lvÃVes¨¶±²M³”æ Y»Ù„9ªÜLصÒl^ÊÃÍàø.S-枊Ù<´.Èx0÷3iÑì×Mò |¡Ù¹ó4S¯ÅÐå/jæ…O[¼;£ ªSÉ“ôA%3€|gŠáµãêÎ@´¨¾nw•cKôvyãe^ª:!º.SÅgŸqÓÚ¶sãè"(“;ÃXtÔd“p[;Ξ ø¬eΙ¢y/7JNyb<Ý]˜Û—\JI]ìgùž|ø¶úTh”3wŸ¥êì{dgPkÔj¨]†¶_èNyûìn:%­Öȯѫد†Ù¤Š„F•4óôcP=Ò k“*TËpnϹÝMetPZ¦ZÇ6YÂîÐ>óàå z³PžÁˆÎV E‹KÉÚÚå*#ÛSRE¡­gWŽ$à‡H>aí³NŠì†œõÓg-ƒ1³à qÙÖ›3_: ó~Ï¥ËÔF—d¨Ñ$”%§ô²®c˜ íP+e¦qVër4eºhÞðYçó]9b}¹qv”Þ#Ì1°¬k¬¤ ÈÛL”fÝ¡õÅc|Ù…¯ ù_4µ‹-í´ *ñJóŽÄòš£91B¥x ÖÏVjn—R¯>áÙÝUNÞÆýHÞ­=S[½oIa›>Ž™Z‹Q¼¥-:¼0'òQ.>÷R?ãÍKYHÛà…­~Q»Ù›Ò³^}éÆ?nH Èr¿›x‰j̦ g*kŠ]±VbJñ{„Ü01Ьkq»ÃüÁÌÁ ÀÜe)ƒ.Rã–rÓû~'w}Và×¼A<®ha0d]°€ü¡‚­bºF¨MÎõ̦Һ°PÀ4îªæCÏ2¥ÇÖ,ò¼F­Š¯†Õ4Ç>8 Å­ëedöqÍGÃ|èþ”euÍíþ•#mt¶Œ¯D Ï.J̈šÓè¶–½Š¦ gi¥"#æü·ª…ðþm´¹q°¬_\§7ö‹á°šš%aÍ›ëÕ÷æš3Æ®¡œî9Ì¡Œ ôAJÂ^@¸ù´®ûQe±ÍƒöÑèIæN¬>÷Œxо µÔZƒ`_vØÀæÊ½YáÊŒ : i]à:Þ2¨z™jm”Ë\îG£@°$,²b°{ ãyÉÑJÐíâ]Ɇñþ#ÖkÖM¥¡ b¨Œ=V×¹Izvµ&lúÙB¨!KàÕ<Å·‹—æÚ‰sëå¤á•tdÀ]Z×Ý;”ñŒcäRÊ®ã,>¿YÄV~ ©ïµîåÅ8>2ô‹È7Z`ÂÎIë:µZàš*z°žº¨c9GÖõþI#ô ‹@~ç·/VÉý ,M߈Ië×û,ݘ®ò`Þµ §!Êûªô¥&vcüì¦"w¨M…]´pJÇdàµýò.N ¯Ñ<§‹+K8f\ »º•³@¤áó#…}ƒÃ­kŽ¢.T=­¤ï\§u¡û©9N ÁÈA.N½¡,<кum_Íwëz!ª§[;3ßX\`þ£ÁWîM aÐìÑwϳ Iy(è¾u^¼Ì¨ ½Y¡áóp#­+(UͺVïL¨àµÙ§3Ƽ’‰ Í9ˆmK·®y>Ö5×HŸUZNÈ÷˜ ™Î #µ¦mÙ ¹ÎäÅî´|ÜY•P´rEÓ˜- ·Mll~ÙVQêS¡ª¬¨cAEF`ñ‰ï9‹Ÿ¢è5%¥õáÌ/‡Ý„,µJ¬ý»u­&ÑX|Õ5T ž¶r¨S±(«yqRj`É3}×ôBŒVX22hºï*·ªÌ@oV­Zö‘†÷q–êsÚÁ¹&ƒZ´}kà8@Ó}׺ßȸZxV›ãŒ¨9,I”5¬&ë:]}ÖNÚþ"†ÞNKšÒ—̇ÇZ A;©êùoi5àKZíùÅ}™Kf’R€Ø¿é×FÚ'ÇBêú(3k$ÔºxEËàp .“äKFÕÏ6ÆŸ5‡ÈB²9ébc6Yi]€S9VÝ­«¨HëzOÝaOPDÚnŠW7-æ8'Yl+DÞ¥jägNoäÖU<4ë¥Ä„çÏØ¯ò.è g‘÷Œa(2–õqJƒËw¡«™IXõ ÛÉɬLÓò°«<é2Á6p‡²ú³nH˜z"Ü•GÝ~Óö»dÍŒìQŒÛ&ôÌ`ˆcæPçUü9y{åÚ‡Cå¥Ð)ÉX§Ð×8ÒŸ9V™’GâýM¢¸wɾÜ!UgA6ŸØ¸q«¼Ú»#¢ÑµÑÛ”Ó}±k¨Tm»$Eöl-™Ë˜(…2¬Z@6Xš+†Ä€²zÈ\fÞ ‘ŸS³mxÁçÖõŠÉ+ßUË Ã;¶¯©ÖêšLflŠÆºƒÃq^3¾gÁ‚í¢p²fŒI¬›Zñ9£Ô*=kÆî¬®ÍEŸìö/«œ.ÝÕ 8¿êMuÚÚ–á>2ãý’ƒèa°U¤ ÝŒåª[~T=Ѳ9²®mndÁ›ìM#KÏ'1Qòu/väQFI‡8¢³ä»nŸÉˆÿõÓ.RâiÆh$܆¤ªrĘ|»ø`h x9·önêm5 ä¶i·Ž¸ÇÉSc^íÆPµC  Ȱ0"¨¥éFüXŸÅÈÂû]ÏÜsú7Ñϯ̪j“NS›«0”¡lQ1 <Ä1íNâèXËp…Á-lîj•vò%ÿ¹–ÆåÖº¢–6ÖéÀ#Î=¾3ÙÅÆÕè­™ö•.z_zÕ"…ŽÀ‘þäŸ#¬O]lš_€¸æ¶¼õFëÉuJ'É( ª¦‚%š"`ŒåO2öó½½_[åð@è ¬ž„~fwX×Ah!7çÖU×æÌ°Û®¹÷+ˆ¹zðÂfcô=Ë•`šààð^ý+uò}ÏåVuûK½,ÀC0›"cm'ûX`Te͈©ñåxT¢c!`è6›dÇhžñ6ìs‹‹q±9Ûš²«“Ø:žLðîdëǧ›sóŽD‰@}%Lâz!Ô6x¼[¯@m@¦joú.!Î*ßµÛ‡(óeŸ'YoÂWÂðFÔÜ0lq• *™Aœj+Ϊ|{¨H/¾„ç§Ê÷å]LãÀósxЗ´ç- 1ËkÆŽù¾²ÿÞvΈDWšZ¯·¤‹ šŸ3VÛ«žE~q¾*AãrÒ6˜+\¢@õ¬i²æ‡¹/Æ(LƒçŒÓ5eCh#o½2í⻥Ñ d®¦ØXeQvõìóª2D³Q½ ´v` Xpuïz¯ýcC•!#ÃII*Lè>g@¥©wðí¥«úîpÞ½4þ#ëÒçôîPÒöAˆUîêeû´!K¶ÉßÕ ždRÁþÚNe*ñŒ ÊAæ•yemá”’»òegþ¥U5É:˜«hõ‹Ÿ¹³&zbmïÅøÈp»ü« =6–|l9øÈ0¸>œA[¢ÓØâ#q¢d)áû0Ÿ¡ì¹ó,ò°Ï¨¡–•BÙ›¾«¡ÙÔTÿÝ\÷Àfùʺ£¬wÕz¬+—F«i »(þª?ò{§]¦¶çLn$è<è@©•¤~V¼ôß‚ÞX­×•è«2>Á°äNîc§ïºÑDò5„ò±l2«[K¡p&z›)¾ ¤àY9m¦}Þ¹>¾?¸úÕÅo¼0â¡&€IaÇ`º®\›&dÔÉLÃÿ ¥Vò¥ïûê>9üâ’°ÚkªõÒ‰Ëþõ•õ5{èÍ{£àÝdyžWóoeM3ð w{@ívÂVßñÝn5©‘]½êH k] en¤ºnë°†r¯ J<ù>‡¬®FVFý4„ž.˜0î]¿²®ÖKJî^RŸ ê­_ŒÊ®Öû_3¡{S˧ÛðNÍ“3$plË› "¨­è0¥/ÜŒËbÇl™Â‡.Þ“ø,?l‰1ÛÒÌÈRu_ÒÈÝYY §cJôи«²¦—ú6gä7*(ÿ©çÖnO`EÌ›;Ó«Œ³Ûzë'³Ù3µß‡1¿v6Z Ö“å“úé Æ.³úeÂv:Û«×”ÓÃWÕ–/´1Êt&mc5þQÐ{%BÊ¡û²ùGwOŽ¥ÌÏò ¨´4õ’úÍŽÈÁ(Dît`)´~¾D®ÿ«Ÿ¿zR4ï ØœTEsH_°šw^ 2Ò0i¦ÓµáäâvÕ¶æåäÅ™äE·)SOôçŠ|Ã5ÎPzmþOØòÕ·Ar–:«‘ãOË,½TC°º•Mƒ¶TÃR­|˜ä$ÑJËT6‹tޤ é³ûæó–ÃIqnº}G¸ƒ»³™WjN†¡«r6¯| Ðì‚TtBy~oúb]²QH2,Ô£3EÜ_|OtÁL "ü"©u<¤›¶\êßáȽC¯;t%+ì8š°®±>j9½¦8Æj5½ž4(„¨#gS‡\!Æ›…y—ÉzÝð÷ó>؈d5 lÀbëØM$‹½îí4õ,¯çgÏ”¤j‘ÈûAØ=÷QûnJE°pô¡ûl_*æ)¢hk’•­ ì¼ "k éÃUÃWª#ø¾hË9Õ1AgCº‰?d¥¦#æk\€rò—!sX5wž€jü8,Ê%ò2+í¶Ê"vž¡T¤Ë&G…|F ŠŒwtÐNîë:'I¨¼TÍ8¸%ÖuRo te@ÍDó²2ìtÇ–³ª‹=>uEL±qÔ¨(©‰ÅÉÚdPàwÔÅYêy.¹x*ò>ü*Ü”®hÇÒgc§òmí#x¶Výè*×*ØàrhÁn}Õw€sª» Ë­"=’ìCÎpú©z0¥Hýsz)*ÝqÑA§ÁØsÚg s 8¢Øƒ%τ̓‘´\Þ/8±ÎÍ;£Êº^~÷Q Ý|.F(öÉ»Îa˺ÖJÝa%U¹+Ù¾wýYBÍÙ­ëeÀU)K›'×÷Ë?šc hõÒ}ºY1u-a!YYÈÒé Q½Q¡ ·¡)”™}rµÔ4lÈ.f½GêÒ[¹l"awè0X€ ¯³~l©O&´Áö!ÏZ¶ºqø}÷fÏmlV˾y  ëKSÙV¼f4ä¿kk½}¿{•œ®•1õS¸Á˜D‡¼ö«?æÇwåŒ[Wfxd|…¡²z”Œ=ƒ´b´T¶Ÿånꡈ+W]%a˜ÄG¡‚vN¿´!€÷QB…?Ò^ç+2R°§­KEºN?sâSwZ×¾ÐÀw¾ímnL ¥˜ºÊžá©Ìè9¥ŒwßrºÃªs€dlÀ¼Ýð—"ò£Z^¹ˆòb¾‚"ú1F=¿?P‘íK=æÄ÷&ò8ÊÐ/öÎ]»”3a]ei ö ñÍšñù®* lâ6áMÎ9ó®õb°¬k-58PÂ8ž<~,Žh]/Å<2¨Ógê±÷½¦ŸO§Ðú÷Ói?7µ;‹Z£­ÌÕT­5ó®O)°ÀPWäÈV®ÅŸÐ3‚œJ³ —HëJ@¹èÒÇ&­+H]¾¹üpMøi¸­5¤òûË€Ø<ÌýG¹ñj›ÙžPI6I¸ªùM?t*A£ ða(7Û¿–´Þs$zÇgN…nº«Íž¾½Òs4U 'Û*u†Ð—ç]C;£:j3Ƙ˜‡"c_“9Ð=#ÉVÈDGâœ!ßÕÖNÇ­ŠÏ†Æ£¦uõ:?{ãï˜å𧯡0ù¢sJΗ©ê}}jÆV×”uÕÕ¦¬«ÇÖyª0ùn~“W{†6òÛa¾–fso6kì5ÙæÈ¬0JMßu†<ë±eyÖµæÖ¯xFœÊï;ðÛÁº¤¡aÖUó8¿ÚtÉ´¥UC©ˆª×È`XvXe‚ÍlÚ²VGI Èm7Mrp›íÏV¶Yñ!q›;kFPïLÔ«f¶âö7׳ž7HëÂ×VÍØÏ6)x\$'‹±PK=šÕWΉ± R#zÝsÛŸ®l¯ã 5ù®—u]ÅÌ ±ætµˆ2 ^ ‡ùÂÂF/­ëù½z›îó"‰V7üš¹gÂ_ÇÌÚKIƒª“Û¤ :GŸýÎ[ËȈZ^_æ‘ñ+»·c¯eˆk˺jx¤"}3™¦ü.ï€S7àå+=ëºqhw×îVŽn ¦­øWÚM&ƒw˜²«÷(Y¢ÛåtÏŠ¥þ 1õ{ 5®ö TÄjUÍýf¥Z'ñ]³õ•¾kœ ©;[Š:¾ò8çÄne¿ùûÔV§"§Vàð×qF£H½Š«zÛ÷=[@®UÁ†2Q7—7¡,*”ŶÂB1ζú»qAŸ;ê\ ß¬½w[—*¾WÛdë£U£gõÏ'Ñ Œ+'wj0¼ §5 |nßK‘±ÜΣdû/’3îä®Tùu;¬ˆiGyLX„ý®‹à%×eèTÛzÇ6Îu±I¦ÔDvÌ aá%¸S;×Bû4÷öI±ÛW 1…²ÉÆgŠÝ$"ýgÜD©ªÛ³ybEì‡ic÷ñ¡Ä=å#K÷’Á"^TZG&lÀÀCÔ ¨œ}ÖMD\…ȱ 7ÂÝŸ[éõs6œ|o£ÆäÇAÞmøs¬Á!¢ºw¼r¯ú Ïï$Ù–i¬àµßl‘LíEøyF§›Q ÿ |}Ìï5#ÅU3>ÿ›©r‹õ¬ð‡Óð`ßìH`›‰ÒsÍE68ŽÊæ v£xNeëÑ` ‰ïÚc'¿cÿ§7yïpjp²:>¶Pà)K°ÍÇ¢bí vÞ3%5ïêÙˆäƒï:d‹0½±ôün¿[¦6vͨôžQ•©A})Ç–9Ͱ^Zïy ¦î CÁk8“oÛŠÇ­;0ø×Ö¢±v›4Ë¿¬‹Y½áÓ«¾Ýs!œÏlTª´³[bí€}xYóÕ“Ý­U™Gu±©Qÿã8·[dxؘÏÁ`Öu` ›Ÿ•6ÿ£³Sħ§¤˜öó’SÖÕ‚¾Â¾÷>5ûXPþËNC0{Øxá¡õI¬YÜnA+bÚKÒ/«ëu!Ke]ÐòM`“4›-f®l•`ÜvëÂrœÂ)€…ÊϺf¶ñIÕgÃæ|f˜/Ô‹ìÍ4)yNK\r«i‚\ÉܾLSá nùˆ¸Ÿv2V 0àŽoMœÆKf“}…Îæ½+µPÛ7\c/d½[è:ÓÒêÙó&w«£_NWF}f¸ w6KØpôzùUÿlÚVU>`•ðóq3Í`Û¬hq‹õ°¿ÖdP{_•à¶UÖtÇ* @=CÆŠry Õ&w4Rv*)&m D…Ö…§4É_ 0÷á‚,úÒ «V-§ºpßê-ž‹YWId¾õܶ|Üžåƒ=Ù©:Öç™cMsV&¦n–:&]Õ» êe™¾âíè]6kÇL{¨Pyî8—°^Løgù…ZHùbhˆ¹uAƒOø¼2Z‚õvÙ¹uÓÔípFÎlŽ´\iOº£i”†×¡é{Ç(·æÇIoÞˆãµC5¤} ò‰‘4³½|ôØšÓÅó\U†ªºQÑβ”>Û¢Œ1Úg…ôÛ˜TnÉuã°­ ”ª“œòHˆ7É,å¬Ú‚Ömzµ ÍðdÕòXçO<ÀèY$€K]%ÚiÚµ3MÇç˜íÔmG.+ ²!ÊI>Ã% åm?éY_düŒìoÍ&îì“ù>æT%Yû€Õ>œÃ‘u•Ù’’óUQHú½-“•GÆÉZJº¸yHZÆ!³½×4›P_ò?ê‚tuHÝŒôIk«ÁapâÄ7×}S¨û…¼l!Ì W ƒš @}‚Q ];9$ŒM‹D(C.7wÖ¥ïÂÞK¥Ë®1ƒyßÔ¹2_^ HU϶>cË^o.=’©ò¥/²]°4~k6ÖÆ(ŪS}(&FÎØ÷ z9.J­i¹ûÓÉÌÒÇauO©äËŽõß‚zÇŠ„Þ¥Ú¬Ç)\L ø½3R¿l=ùÉz›YSÚ[ý9꜡`ÇE¯€â5kþw®Vz¿±šŒ„±zež™0¾LÌv—t6иÎÂàðÕR(ZÛÔéz[ –nsPÐÆÈMHd-Ô;²\‚´ÈA*Ãn#Ñðîv4ù»£Vy‹wÓ@èC¦öŒšþ‚6uä¶,„tePírd£ŽtÀm)½ô.·ÔžE cÝ)gƒ §TÊÄE‰Ø~µdbú$KÛ`Bõ?ý"à-V^-Qµ4¼¦(óу¨â;75µ¥½ˆç¦§¼CÚ~÷jëduÔ§³hzÙ2fҠźJòWÆw_ßý¬O¼: [ÿ/aQû]âP¬È63Ì‘è¬R8²·‘èH‰ë=¶EAZO ’Ü8¢¬駃샼KÑùCÇ"6¼šHT¡Œ×ù(:E¥ ó4 e8€ÝŸÕîK`šÕ£åƒêÜ;â`ný`‹¯`Ǯޚö¹?iø=}Ò\= 8²„y?#\z_©Lg1²A)îÆw”ÙØÔq“¬Ó” (½ß¼’Æ _NGýX@HéKª½È5Üæ>ÑB³Ù/ÆýìAß½d5(|•ú½äZ`RF]ÚúÍü`aíÍ4>‘*£ ~ÌøjË ІVŸAÒÜeP_I¿‘užÅk¡S™ÒöŽCéäר6S-þt§Û«Ž.pëÁ@‘A•1duSõÙÄŠUY§É¬ÅÃ47{ã(«QI?vQ­Çrs®nzu1ÎåÇà€,7Ö—HtÙñž'ξ]­iûÏ%QwÈ6S[+“( ‚á¹{ÂÕüP¬)὆]u½›‚ßÖuâ”ýú¶³îþ*­Èó O>óùm¤ôhÀú®m–‡2øRÄï€ H¾Ë˜Dèl.ÀÜñ“ìŸø-Oµ…JxÌ]7tžVì”Ü4÷Z ñ“jjsß‹s™æ@.l×öNívPÊ-áyœÊçL„­Ë~UÇ›¡ŒNMø?'éºñü®É¶…‚fØA§”^yÙú˜ô/ï——Bnà»|[Öµ-_Ö;e…/\Ñr»+üìaŸpø#îåC²^o?ñd­7×·¬°„Ò‚«²niË:·s5ùA9¥¶¤£ÚDîîñ¡RòƒÝº©‹ n©¾òùí¾òѾÇø(}|W­ÿRSÆái¸qˆUÕ–õýö„sÌÞ•(!1 }¹ä%³©Í­zÆIÍfì§ëûló÷Au½ÐºPe¤uÕMõAXW/TžŸì>rfP­ÑP@ßÅçgõíGÚi-&Jv}]/ ’ M]Pû€!a ¨lI…\ê‹jcoŽ_hYù§S1jòw£z³ÊíK÷é21©¤ßÿóܨкÐÌÉDéÝ“”}ÆÈÈQGÔ%åTxA"nn(z\+ŒU64Z“Ô`÷›žÙ´£‹QYËÿÚnøHëÂç}%E×^JW?È¡În 1oí¬Ï7ºB; ö@­­zæ7E¡zM¿ûÛÑ!ÎQ±åÂÓÏ”:ŽØÑ ¿2µº"¡2G6fF¼wH‡Ü@¢i]uŽì¬a³4«²àá™ÑâªzÛoìs»„)\¨[†‡Ã“ݸà"ñ5§N-t[ª=ù½`-ñíLÂd*ÛUºØÍPãijÛ,ž( ¬Ë n)JY0„Q\ÃÝO‡°©Œg|õGRµÕ ô²€wN³›:ÁL‹54r2i®{òb¤¢W_ù>¬è}ïvQìØbÉ/Cüºeaq¯sำy¦K—¶rïÌxB<çR+!h€… %¦ï1ÑE8Ý6¯Se£nYU‡ìåz©ûb@&èÀK”x~½ñ¢ó2å-s/%“©­èÁÛ–2åÈvP=¸uM,ë¡3ãV˜”jsµHF¼'Û0 ô]‰™«æŸU'„aGšš·ŽýÝNae«ÊæQvüNðUn4$³ãžìeÇæÁäÛÕKëìt6RËÔnüG¼Hxìiƒò!f’ÑÑ%ùßv“FPºý¬gBøÆÅ>lpü™6i Äaó 8Mh¢ÆæÝÑcþóQ|ioŽö±q¦žMØŒ-ÑhBØ$a\ñç­F~ÜǺ¦Ýp5q¹ÏèdW}rSöMñë»îçÖõâK»ùûn‘I¾³ý!³ì%õïžà/¿h¬yªØ]ò¬45ž`@üÔ³æ?ì; `“¶:8¶Ü»A­•z×/®å]»­t6‡#r»­C píjçs±uÃ/ÓoèúìÇÛŸÏŸ³úîæÝ'oø Ù¨éZ"lŒÓy†ûÅ[ÿÞQzIx¾ôþ&ûA¯,g±ÛòQá=†N§1Ó)?ݨ²S»úý;[ÿ05½r×Î)Ú«äÉÓ>LÝ8$33ïCû²É.øÌœÄ«1=ú ¡œ›¼T­ë§Nl-,ò½âFÖXqó\\îäÄÛ5ášPéM”Ó«+~€ó_âê vrA¯­štgм‚ãh¹ã×ëI@Û{_6ð3Y¿ß áÎ(2ïC JJ@[Sruyc ÆÙ>3éÉ&ü™ûÀŸª‹qÇ’¶v3#ÃZgZלôÍ6øä$«,Û1}+ö’ØÂün®ªF`|Š`Óÿ$J%de5k(³±¹PIA¾y[~Âišñì:§i#"özºc%ôd·ì¾T™æ€$ºl‚ö5Y0R+!Åô(tcœe4ð»ýCš{;ïï3õƒèÓg‰`5Z ÈÏ×Ô¦üþðYù=l ¯äøŒá’àÒËe˜ÕRr’Ù …•èmÒU›¾ÝË´™ÁÂÊ(*å^ÐL•еÙçq\}J-≥©Í;²}è•ïz9ýÎ`q ùê¯Õ£lYßhë¡{³…yÆ4¨*Ñ f{Bí|~’Aé×ÔK­hJˆ'»²n}Ö@Ø{YÓô)…ÃFëMïÞZ»5/ÑâHk>¡/€6=Ù÷Xc–Úø+—ãnÚºÀ‡pŽ‹<)Á×ÛÄ— ò nœ™î”ã~ ËÑ>Šüz©äêÞìÃŒ¸„ë±æWèbûð'"gŒ…RNöVQP*÷£¼ÙÚI)óòÑ/©YÞ–Xs ]ì½³ yvœ…uÅ¿ÒÙO;Çd[¹v%lÀÿ'?k­¤°ä9k*T`Fô¦kÎ~¬QŒÛ›¦€HÐðÅfEJ°×[¨Pfm±ä|ՌĜP Î/¶RvÏT~È%³‘/.9²º[Ra@ÇPv ô-Œè²E=YFª¼¿Oî‚÷#Ä=hô#¤>/œŠ«‘_Ù¨àÓô@[ïW«—(aV^0Ò–¬”hÅʯ°9ÝvxT$ÜÛE'•Dß3€ŽUÝŽ÷#Òºz)=k~Ðä+QÂO9ùKÙÉD hT]ôE™QX×0b­›&1†ñåͶdPØvîü¶–$±÷.r£årƇ´­INÖz!Cmµž|mR”Ì ’W¬¼ïÕšBȽÌä9ãäÞBøÙ Ð”™ÒNlco‡d¹ÖW¡ä+ê™’×Ï}æÅ FçM½m¥uaiQ7zm2Ö×(»€MÎC¨$6ÀëV7w¡ßÿunv™$ iÝý½Ø^2²$î*p3Ÿê†øÀ^à—áûé¹½€—ÉÚËE¥†èì]*册!ï®#5Äbe£êRd] Kú Ÿ'óO|½¹S››íkÏlrŸâRqÑÔÐ.=Ѓ=‰;vçóƒm´I.³O’.tãÎj¼Øëˆ•­-$Ïñ¾ëÄö XÇ‘u=wNv#ÛÂô78±´)Þ¬$³¹û&8ä›Ïj>ìõ¦Ôb•Ñà|¾÷| o§~Úª‡$¿LLòaÁ²}¼ZLaüÛ½:“[™€‹|Ìï`¦Ö8FÔÚiöN_sµUGöS2Y;§e8Eõž¥@™Ÿ4üÕ­‰|MÁWþÙЫg('b'Áï=«O00ä5£BÆÖþHc ºrÕªí"ƒz&tÕ'xNöÒªïÂPçÒ6zоuï´÷Ä4ï7Iƒ51J’ˆû„ e!§mé Ô&ËŒ(¬k¿ ÒÙø„ࣺ~[%9Š)µ¾É)zßÿ:÷ÕE ºþæL‘8_}Ù{ÊðÞG‡V‘¹Âž Rï†g -Q¾×øè“ë‘Ö»E-’5z–ï¦|”a»kdù”"–@¶‹h ì¡ÿ[Wv$9¶ëþËŠr nœ}1 ýw騉x£ÉJµR¢¸‚@K·,OžŸÅ‹à1›D².,§ CǯøwK!z"ç1Ó‡Ò3Påd o‘×­í5î&G…Iúõ/`÷¤çЍ¡,Hº“ø3Y×®3”¡yYÈ@´Lt¦Ê6NÈaü8x“j(úáÁ4"W9¼¹åHm­l¥)‹Wgbá›Ö…}ðMµ*°Em±¸ÛÁË ÂcYKÿjm,;3… R>c/2µÚ>i\õLÙØ^š+‹iPl­²¼2¸È‘íÞÜÇÊ2ñ™ ,£˜”êºñÚÓwaøs˜òò£ø:®Ö,,þm¥ë{ž4¨ç„ØÂ{s(2Ú$ïÓg•Ë·H>¢£ÊÉö’j²$¼â6WT^Κ:˜ò2QêÆ™?Ó &³+ð1\êm°Ú…˜5×?ÙóUæ“B»:’Óu‚æ™:û¸”PxyÉ”¹X_  Á?¡D ¯acÀ Ò™ e¥Åú½¶œvlXÃÈ. MÑØi”¸S¦V)F‰TäPÀÙ •L˜YÆŠ·§&S´#äȰ6®Rb7ÝóL‰áϨ®b ˆ#—Ìz]]Þo^§ÍD4™†w³— õ¾¹›Èqs¹±‡ªµ;²óÑ£!ç "”Ûñl*Ѷr_¿\ úÞ'5ÎÎð¥áPÐ{Uþ¦A•²·<V‡ oHæäë¦"q;¾šºØWŸ(4Ý6ïÔž)ËE**ëÚ—D’¶Eé†âó·®$¢/Õ—<]Ö¬ÍS³¶t ¡n˵= pÁ³.]ek=*ï®f8]U*Œ6rdó*8c¹H” ¬È‹š€âà@¾(>wŒNW¢âwãj”5µKh¬æké#Tr›€¯)×n‘qúšÅ{ÎìwMëÕëà…Ì+;tí‘ßéó^¿D†wˆf:››¡ n™¹B‰eÔu‰ûÌʇÅÈWX»¢Ü‹³¤…ØíIíj0œZÍs/­óोæ$C[ö4ú.¯LYá» =¾„èµBÃVP;Óë®å¸üA¥*BF}i6ãž8·u$¾}§m?Žêl/©ñZͺ\áÂŒ}(fîÓi„èÐùµ¥ýóip¨„Fw|¸¡{£BåYMW.3ƒ?aúÍ?"üÁ˜¢p…L)wÈ‘aÜ“˜ý¸4‡<•Öuº6–ñÿ ãR:gìfîZ?ÃüÐûXQ:5‰W^¢Äm`Û›ËåM,„d]Wj—•zDöˆžÍ¤»kûÌ®VmÞMuC‰TÒ ž}yð.‡ÏÏûKa¥«ñàÕÑ¡ ÀçP˜l6xQ„!(}—Ñ §>1RåÁƒ=£ù„g¤ïÚ!ÝјÆ]YW)‹ÞK¨CÐQ· v;P$¨b€¦j£$•ɺ|Úg ^9´Ï• zVbsAïØò‘*>èÙh‡ óÌ»lŸ*WŒ^âÖT.×HO9Î×d†8×aPµ°ÓŽØ8>ÒÝLÏŒ¶œb¢#£…p“Öõt òÁ6$õýgKÑÌš0‹htCh̤>#nJYrWз-rWÃÛ¶î¡ÖHë:¡ ÙlÒR¹œÐõ&™C]éãh’¿œfŒYĤ@µ ¦uCL~hÍVd7’š¢€bû'ÑçqS;Û^m·.P>Ë$_ËØŠ)½äÝÝTi‰Âb,%aƒ]ººCc/3n'Ï‚iÇ×´®!žŒf鵆r½;Üi ^E éx°¾L¬QÛlu~ mà±®Ú¶È %Á粋ò¦É BΪ±Ð‹Pª1ØÉÉrú`þ@ã%Ô×™Ÿç3"ϨK!_½¦I½'k{o‘²D¡9Òjæ ðç:O[ÖÕ‚šÆ oŽ´ÏWMn…IÀ‡±b½§2A7Ƨʎ^%ê¶ÃR¶—:ÍÉ'&“0ÄÖ¶ó“æU°›Z©T¾µ´©wj¹*z+[nhVv\¬–¿)wõŠ­›W7$ ˆRõ•×Õù’齬žK™Ï™²#…Á¬>Òð$£•ùÙÆ¼ 7êJÝ_v¸u9¤éJühå\Áo¤$©Œ¢0Dzg7ù®m8aÅàq'‰@pM~93‡ÑŸßOßµCáíëe]I² >"Cy+Ƚ$lÈP^=ZdBf4îOz(LœÍ/írëŠ`ß|w¡¥þÝ Ýá°®Q§BÞ)÷c]¯Ö½²®I‰dã¿©ÇþÌ©/YתûÈðÚvy†Â} †Øgô8·®q¹uÕ¯’Ęâú‡pQI}±$Ûè0C”Îýh~ˆ±Ð§±]V²ÃA)³ñÉbÝ]Û– ¦¥u=ÇøüyN£NýÂÕR>E,™|~ ÿ›è¥z»Á´q{Ja¿¬‹´‹P-9‰qÕŠ¬ë]iWÞ5k´¼ƒx¥¤ ñ+ R 'i%\i]Ý©ÆÜºº[®[è9†¬«‘öÃó`¯¶å»fû´?‹{íÎ’«Dþ¹$šZp‹ªëøWoÈ»;¥Nú®çèWæ]s­4®dÆSü2¦R|¨›ªWÓmZ×X¾¸Ü#S_‰B ”Ö-WC:îG6co©!à¡ßoU6’óùEV²‹Ë™Õ_„~vSáŽKBÛ°t£ƒ½>¦/³ù°¿:ŠL S„à“•¸V,¿‹ªè:b†vïi]`Õš²®¶Ù,4i’’úwXo•³@Zµ &‹ijÛ§„‘wµšYýÙŽ@õ3´Ã`ˆ{·ÞÖù 3j 'BüÚó®r¶¥–*ë¸m=©•½Š;\Ä-2_"ïš53·Úÿ‚×#Ú/(ÿ–Ôi4–­/O§g}ýT9Ý9Ûøê >ÓUN êû#Á>¶à*¦™ÏïX)Á^¯DlJ™ <—ŠX¶“ ½„“©VS hpÓ?_„ÿÈu±tœXÄèŠ|¨ÔÈÚÞ{$]×nT¬çW¹xÛ\m¨WL,YWï3³&L:3â%ß…,ºÏ»òbZŸ [ÍøbOê‚bPóè7±› Õ§“æ—DyžW褡ìP©ðƒæë»ÑžŒÛ O”Á躾ˆ®æ×+ÿŽù÷É–uÕèrw¯G£ÏjQ €¬hqu£nI8ÜàÖ”ù}‘×£—=ɧ‰tŠóÙˆ¢If‰ÄHGPC0€uAÖ,{<òP/-üÊéõ£±Þqû£:+m/_`;T$Âjõ3gì…„wÛ$tA¯j½2µ‹ÞMå±Ð ºrdû®-0ÍK‡|WOYv„u•u½ª,ÝVO²µÚ|=²9÷îH”E­>Ÿþ½€ÌIɶѥØœ Ô÷V”lq•QdP#¦þ‚¡Ç­«,—©0wõ»Z˜2±×k꘾àÁp—Ô„ÇãÕM­ „»ú(ö«GaÓ[òúŽ3“5l×@Ã9KɪI uÇÌ$lŽt¥„³9U×pR‰æ>d]ïµHúæ6O;Ï~)õíKXIç6±ü/ºÅ­TV¾Ý8¶Ò‘ÕB«Á ‡_wL‚êâøoà£4µs32¨ ´•ÉÿÜé“êoåݸË~º™¤C3Ì]=×Lñ°F×­Ní:+å‰î¡wX¦à)ÙEËΓñDeW«}{õuF‹ÄgD¾ÞÓÌXG¨4ùDú”­to•[dá/Ñe¨F¶GLNp—ìîS–õöeW3\¡0™ã–¬ò!Ž©ðÔ2ï¬úc…ŒÕó{©Õ•u|21JÈ”Ó]}µ˜ üþm‘oÙÈ>Øš&¿ÌÓ!1¡VŸOySªvwj›dÓŽ=hc>þRë¿â;§Øm”„ÖÌÎÛämzçªCØ?ä<êÀ>[Ý4V G&A7£)êí¬L×}À6RsÿqÍ6rŠ}ëd³k°‹8°)PPÑròU5Zܱ¤dßYkét `õ©êtÝËqÊwåî¥PÜ_þ\¼µ:S{äWÀ-}„ {ÉtЕÀP|+†«Pméû/Dì… ÔœI‡‰a™Úg¥ïzõÚ‘Ô=†¬koyÐtZM=L¡¬tIIæzUÍ 0· ýÝj©“‘óª·§¬÷ËY_ëÙ‰‘@·ªq¤ ¯ÆœÕ«É ÌwŽ ±sJ@bkèP³3£6Û«Þ¶ÌMü0B£qÉâf dwŒK#õÌ& ÈxÚ û€ Úÿ¤•«ï€&ƒ®ï© 5¶}´ò^àSuJöêoë\06® ¸ô °iÂhò`œ‘*m¯´.ô}ew/ ÔÕnxKªwnBœ8'Ãä:²G¤î¹£ÒfWvuOËø·Ga{¢7â¶É¤ê:në&éw´h»C R̬|Ù脱ú`ƒ€l²¬’¸åšì´h0ébÅF׌1¯w=øŠÛ¢bâ¹\Ð\?]!‘‚È÷S¤b’˜q”ð¡‡ÉÍ&Ù³':²”ÔtŸt“Ì_SNIQÀÝðð~eé¹µ¬ ¼¦ª¨—6—ô]­P¥\/F¼[Üuð‚@SLi©Z 6Ó*½®¤Àó³N6v{ëËú\P—ì6ؘÇYîNÉå_gï•u½Û@ ÖžÏnj ·ÜºN° wü… "ßHª«{›d–Ûè"…-~yÒ gŨ'ah¿—ü±Æˆûá- 75„ÜGÌ êÈíK`³ÍÖƒ5ºGšº2†M;ºµ÷”]x/EÏŠh´–r, KÑC¡Ú3ï2 GµõÁ*7´¢,çØy08-Â(> —-Â,J$‚³!¬æJ€SþHaCÇ\¦|Ü,-˜WðQ}bœEÁ3Œ SS¼Ûð<Áê·¤â èõ(ÐêMëze EPŒ_u)Õjkfü»±V¨^Pb5¹Œ­œÖa²Ÿ£Ms4‹%R#ü…χ·¨ôºØ™«Uqý;x%%³ß¬#oäÍÆýßš!/—JN?i]]òÃVîs3fSÅÁ8±šH·1$«ßõn>+ØF=¹y°ƒª²‘EP¦þÚ>\‘a¶ª7,Õ¦Iâ&ÓûõÖR»³csL†¤°»1:Èö¯|Òœ&b SJÖZˆÄ|¨îç ~?©êÝ~!/%0áiiK CÑg–0Ð'V¨Æö`ŽìWÉæ^ß3ÓOyc8íÜI¨Ù¤†gí<Ã(…Òóß “€'¤u -oZŽ_ÿl3m+ŃL&p¹õ†&çÈ„JÑÙÕ:û(ÕBßHÙœµ¢ù²’ž‘ñÅE'ñþIËÀ¶¦® âlJ`{í¹â7êV7¼Úh_¾ |~:Z,¿Tjº8È%É/BÓ‘™5 ¦’ (’|{^2Zä†ð#íó%dÉuŒÁ‘£¤RÔKºl¨_ÙÐ ©ì[;32›ñ9ˆ›Ãh½æVf¨²vŸt±#oS˜•kýžuóñ]5ÜvX×út¢§F7 (œMŽ ƒÊ»n˜qDÆ=>ÖU)×i3¥N0 EV¿[®ù¾ °§q¨H„"hô”¥ƒ0Þ'ï’̽= é@UþæÖpi#µ«¹~æÖ¤ 1P‰ÒË»qê;Ø”—óHù& üUyºwÕY¾·åxÈ€ûmégc~Ï~³DŒ«fžÆ>²=—|A,†lT=Ô@vÏ+vöKàÇ2zUGì¹{DÆ5r9üU7}\ß)ÁÞ—ö„á›g®/‘D®sÅØ8Ë Ž^„Ö¬ëelú@q¹Ò‘;v>iÀè5 ŠŒe¡ºu2¯üá˜^x‡Wä¬úˬÑ©íLä1/˜ÉðµGéÜ¥«Xj¦š#“¦1Þíݲ#±×ÇÔNýbÃ×Éáªsb;gZ,CÉîÚs‹².P{€ðm±A6“µ•„ÕF £MT¤Àfùâ§y õ¯––v¨ÛïÅR¢ 6ýô/!Åûÿä]=Ö܆f˿ד)Ôsõ Ñ­¡V×7òŽÆ&[îjµ©ǽŸ¡Ü‹jlŒb 28ÿ5Q•‰çµS!p$Ó*"êš{°¯i]X&TÀzµÕщ¾Ã;SRsw Ú gs*ý§y2.YÃ!4iÐboU½4Ìá.›H×:í™ü¯r>Î&ÀcD!dÞõJÓÌÈÀ†’9Ý,Ÿ^ÓŒéŸAf@˜¦t}¶Ï;2Û¶x•J¹ŸžÆ »Ÿ!NÞðrÕ?ÐÕÛL¦¤²ï‹qéý@«ö±AÛ7ÃûÏšSËön=­§‡j=S-hŽjñn¬ä²9jzVÀgô"t¨ñº{¬8D{~fÛ¬’ŒŒÆf’ÜgïMᢗù}ÔÝJäîzO¹ÎÕÚ ]™ï¯Õ2#ëïiª#X½ø;3zd@&*ö ŠèÉBQLéðí9k™ãæÕ• ~×þ¬.͆ffõ¥ÈÅ]‹{™ÓgNU$é7¬Îži)yu½œä½mT<÷Ñ[cg͆(—©òõu ±ö%¯ 8)åú’c­Û‹•;OE¤'8è—ƒy%5¦P×Úƒ%ÿ!§qq†——û³ÈŸªº¶Ä3SJ¬ý2¨[h †‘f½÷*feˆÝ¨-ö¾õ“ꪟ)öK–Ǩeû÷bù®÷º4™ÚËK2ߟ¬%|»+}— YÐiÍ{ÀøËá+êLµÝCš›EÂq@6øa êv´Mù'·™Ã:rÀÛä¼h]à¤|¦:¡4—2ûò¹Ïnmd•èÄë¼JÖïïÏ2y•Ü•#k…3Z„¨!H‚³È³*C?ý²Ð„Ù4¢¦ØW_zÞ˜E,~ß û„`–øŸL†cÔK¶« ê¼R®ðàå`]Öõîi¶›÷®L{«D¿ü¨¶*]èƒyËö†% U?¬ß å ­kJ.÷×¥ºb&ƒÚG‹¾ •E/ª-ß»ÍÊ~Â¥$Sä U¯õx3‡ï7o bb°t8˜‡Ã»ªhÁÈI Lgj2‡d²î1Ã6L,ä€kn“.“Ó#>ȉ>Ez-¬Ê‡+IÐúþú.}Ô!»ƒ&ÓðiÛ© eýhð9 ÁxÓ/–ôIP_ÒØòÕBà€LV­S¬ŸE@q1¶â0?`š¥òÏfN5eKKbÇ o³?’~¥‰¿ë]¸(å–Æå€ +8'éÓ‘äÝAôšäaÕjåÞܘ75ÓI?âO¶•k­q ü¬×t8¶Ä£½W¡ l|²Â¾dèÌÈÍ1Pöéö8"{ìã¬O¡2RáøÎ5³×»nž”t±`¬EÜxñ„ƒ¡ á´7™Ú’SOö…€ bÍøðó¶X]-‘¨ò~}Í¡¿{éÁçK…xO;Ý© ÎØGΚêŠr;òÒÔ^N¸ñ^©”­«>÷ÈÈøŠ›lpLªÏ;2ø³é’û<-D¤Œ ÀÂà‘¾Dòì~ä5jPå„W«˜þ{2¶¾gtNÛwÅh¥á¦3“ÌZ¯†âh³í¡Ð„O°ìÙKö9zÉO^n{åY!ÚEß…Þ&µP…'™Ôð 7u•Llqà”V¢E]G„ÑŸ¯—' ®°›ÏV‡Ìá½èK/"z oJ ¿Oý#ê벡篜d 9=·éZ訞ã䤹e5©öÄd>Ÿ›´ý½ÏüE…M;kp¬@cLGU‹˜tŸ¢XÓÆ&#¼!!#ã0zøES{Ž‘¬®[bÓ3ºÜéÕ {Þ>«+‰°_9yõüömiPM Ù]„êðw] l0‡“uëŽVƒŒ’6ô~y.˜<:wç&þIôž^BšŸ3-*žIë*±ÖâüA5ÏÂÓѶ^•—ì©B̶ŠF¢¢n8~^ *|§&™Þû}ýcŸR]7˜TËÓUPaBõf»@rê‚ÆÐ ¦ÔD^®ó!ê›-]åäÀy~çȇ÷½g„ž¼ ð˜Ázú.îb#:®Î Ïë ¢œÀî'i,¢´FÈ Ò“=w¥ù0ûÙ9ÒF¤þ¤qì£r%Ì¡î\R«O­êI(!²3øl9 Ve¿¶ê˜Ä*TÃ[R`ôí$ƒÔŠ­3’& wä¬#•)JkÙz…\öƒÀLúA¨Ì\­)ATƒY Úï›™Ö>è³™ÌP&7¡šØTkC¥êlGOŠ4áWДZ¿¤ñUÂìõ.¾J–Û’nà IDø*²”ìå+ÍÁÊ»U‘<`M™Z¬ ÎÀwQ×Iæ 6! â&cD–Ú¥Nu<›’µz5·â4ÍáegRÛœ*ÙæmiŸÏ¡ç&¬Aöùêã’ÕȾ5‹&ȯÕ/¥e|IòJIEpÀε”ù*bQ²@Oá0%Ûô¸©õÒ”Ì`×''%µd-?ÛþÔüó~$hP$È  ›Í˺{¶ÚçÏ0cøÀÅÖÊ„ª´YÕ1{©6ߊ2‘ß2¢†CU†WØ“ø®$ì­k¶|åFYy‡Æù4C\X Õí%E4^U@ƒÂé¨ÑƒŠï%dЦXlÊ"aßVU$œ6‹Ò¸sÉ:_líT°´¥Ú‘ÊeŸÖõ2Óõ1É’«—àpÈÕõÓÓcb D |ì— +9ÉÂâñoò…y®¾èÇ‚.™[J­ûØ9wJ:ú±¤¾²VJÖ娋Gî—ž 4å*Da“úc·ÅÖ÷ûrÛ¹ª@6dÍH2¡RoÞhSí1°¬lè]ÛUÖ´ Úb'ô¬‹Ñ é+»½/ùc!{yiPý=Ám¹Ká ÂIq {š)„à¬ç y›KSëm¿ ½ú×86©cÍé×uNK¥œ¥Ù]Ö­Z¢Ð´=vãcq’Na·Qé«€CŸ`pnðŒSµnÛ¼ &îx²Žàˆ¢”(²í…¹d»¶µcrZì9«óõùéwAs[ ?vµ.ÙËXFð’mÒoùw %bñ@­G˜Ã8Ìlðû:Pø}´ZÀÕ·)3~¿D§Û° eh’‰ Âú~q»l”R„V‚~‚œÌ+ø²'{õÌê­W?Ò ÆGƒ¯„.¨³”´ýU]¯Ôð¶Ü(޽WÿU]?7”E­Wß%d xAû¨®ßb¾NN´ã“iËÅqn´˜oÕÁ:×Ȫ/þÅ—œƒqê`QFÜjŽÐ—vÌé õ]k­ú®Ë¾[–bWW)³ÝQ‡võ¯IIRݽ^Ï7¶ç%^|‡rq!#n}‡NUr0ù kAÅÏ€]nî.+ÔC*ÅDÑ„-ä¸Mïã„ )Ê hÞF{wè Ï…›­lW]{R¬¦~4á—+ì,o­–T]GI\y€–[ûGVÉ[:õ ÁøQœšÍïén®ºþZ€‰“ò‘a(ådÑÀÙ©i<î¤øµq»æ¨·?C©ÔmiÔ·µ^ÚàÃáÈI?xžÉ{‡nÀËâ'½£ñ¨žlü]Ùë-äE·jìg¯&u ö;%¤»Ñ\õyXx›!çl\ñ}æÛ“ »îtYÛãš³A»ù^¾ó*Ò•ÀxÊÔ6HŒ) R£þݵžîÇ—ú“%º îÊ"ƒ~¬³EøÊ¡m¼s_)@!Î2ͶÏX«ÌýôâóHûíúUb”F¸Ý¤\ŒÎÌ(2¼šbïÎþsyðlKºØÕ$Ý o+ð‚SN) y.Å»Wú$äS‡é„"c<¿å­—{Û'XÈ Ñ5zf…½ÕŒÛ=Þm?y”øRû豿¸ö™mMÊ­i¢OKÝljdC‚½Rb¸ÉÐ4\Ehð™uµx3]ˆ¼ÍK¾‚ ™-gg*ƒºû¦rñ»«,¥‡´RŒ'µÕ_¢•Ò\/ö¤Äu¯s²Šá$cs›*TÖO§«Ùq«²Âe”ûÏ0]Ñ/Åð ÕçDLþcA±%ëzöM1_4÷6wéÁþ3y‡lAv9%()ëu®³Ò«¡cÖ3äÔwÀÓî !È7<í]ë<élÚ)[£·% ˜‹ýJÔ‚skNeXÐÔVßåcC,Ôôý]ië+¾S²Æ¾Š§5´´Ü™¶žarǜ߬ RZ Á3øê7ƒ@× ¯Q×EÁ¥ÂêÆŠß•Y±>èaäœòI×IëšÀºò£5Å1é̈-j‘®Q³R}Îjä$a”Võw/m.™6x7¯{íJ-ß%Q$´Èê'ÝÚ¥+¶dk4µ^¼ÀZ1¹å“(-ÊcÆ>»l¨dÄC5²ª2²²n4LúÅ2· rCgº+t}ÊQ¥ZNw]3Z‘“×SÑUuZ×ù!v™¢[eÄãq{k{×Ûó™ êe{á†PÄ^§yÞ¾VíœÝÛʨè6nw61Z´ÛJæ@íPà‘qÝ•¯OR¢-æŠÄ1¶£ËC!XÄiPu½ÜHí¥—°4¹Â÷N¬<Ýi”ã¶ž§0þnë µžæŽm }\EÆ…Ê¢ 9êÕùûLƒ®re>[^?‘yŸLEÆ¡´¥ ”1†…3E ‡ Çüò$õ»LÐûè9ß2ŠlÕwVe¤÷™rà|fdLX™[לW¾— †c¥æïÝÎÛèy×òzf{(ëNèÉöœW/¤~¡Ó…ÈÙôꋯQÜ8ë†ß;x*/¤´.WßûPÎú~]-<ÝsC z Æin}÷P`^¡ ½Ü?ÕëPÛLŒõцzyÒGòŽÒa’c(ОYRjñU­GöÙSP£Ö2ï®Õ·ÎªpúâöIS %OñÆuhP =Q¢4j9òPÏ¡ÔX÷#:››Ú²HÐeøwdP %hyà Joè‚IR§«þ¶6Ø—§§{wë'õ˜sx=³>rï--ÙBx%Uê%ÝqŸÎ‘Ö“µ}mÉ*Êé¹ð——4Ö˜+8qUÌ#ëÒÁ³ð}ó÷í¢ßWÁ~s*~lïE¥Àûw¶J´gK½¦¶Kªv¿ðIUkã©ý ÏàüdŸóœÉîMâÍXJôËA¢:b{ì½w¹µ‹!»L­| ä6|4Òðs¢5ÎgG¬è§_¥C³¬O'lv #¦Åy –Ú‡lü6¶¡\Þæèà¶²Z•¼­ oìt…åÎÔt€žWg jiCÀÌì¶`ñˆ¶æVÞ| {«¾Qm·ÎΰºU7œ+¨îƒ•Л{·\"/·‰{ÅMq†ÎƒÎŽ qûÎàIgc[}”øµž7sÖi²QVæt!…}zWFf¹6›{–~è·‹”§ÁFª™šLí=Ê,,Þ;ö±.(8ë£Úùûa[dj+˜…V¬'žiøšIÑ‹m`eÞg«Ü4ÁéyjŒÁ=xGj¡¡pupJ*é™4y@Œ†¼eýÞs^”EM¨u ®Ò¯ðy]µØVÏÑ›•ؼ€¬l'òò ¤¡5Rr3– ˆÛ›øØnŒð +;+—\nPùú'k&ܨ‘{"!¢ÀD³æè´-Xú`W›d9ê<—õœÒìÕóӠ^åÅØj °Ô–…,–Þ+ èâUú3®ø”rÝã&ýè­äÕÐÌ"¯K5ÁÐ '«·Ö•`P³0Lv4fèÕ –º$õ ò3 h ,yŠîÜ+ÏÅ;•·/vqRrMf”?É*Ã%ºe^ØÇHb :ŽNR—m“}"¨¶aþÝ­:¾¹ë’I¯±ù‘8H'•(\J’/A#R+ÄÛ`;…#d†Ë&>@Ü)Œ\í6 ãL»{I=ç¨æž©d¾»»BOVHW-_ž.̺-$ «ô¡ôyÒÔ¶—Ä¡¼ù¦ÜZm¥è­_s¥Èy[ƒ²{†5 ôË0.ÓÆOš5§Ø-àFnP§2L‚Ù+hÜpÂì;Ým¼”›ì@Q†g-é†jHçÄzù®´.(Ãj…ù5 ªj'ÛuÝ-iZhÆ>ªèܬŸ †A&:1 †ä¤;í~Ø®o>3™“½ ÂYºNRÀä>t%õgÏUHzĆ5·Rõj}éýîÈw+Tho#jÕÚy‘~ý#×WK9Ù>/;fDvþÙ@¬Ïhú2àÏÈ#ÅàÜ×Þ¡šÃ>BÇÊ8U°@‡/)äÕJ¶yC¯©4  EÓ¤IWØó.ÊÖ8W ã®7{… ]Ôvp:‰ëmU› Ò°UéÐZ5Á+½~ˆ«>bUèú\26ÃX½ø’ß*Ib#`OÂÂ-„XÿL·–·À׋"šž(íAZ Sí¦Ê«õ¤¸¾Û¬£ÔyÞ-”ßø±AÉr?«Á/jSYÛt r+¥ZÁÂÃ+Mí9ME… ÀÆs²•ÈC9gÊw-…×3XÓæA]±.æ/zhs{ý°•c­zgG÷Ôª CO‚nnÔTµvìCèæÓÔ A]QófÞ ´Ý1Gº»îYË]äªÒp´m|²Â/WÇ>\~‡o>©X°Î [ÚÄM/ŸŸ/Û‰5¿>*Œ3P=gÿ·¦¶|{4’tÐlÉb±×üK7ФV}2zÿPïî-!dlWU2M°0i ÀJ¯Åóç]¸4Œm½~ÒÔšëá“°$pøÆg#§ÊæºÁøºªåÙ$B< QÂôìyHûÓÚƒ¦znµGËû'ÚPŸ"oÍ„AƒZAźÀ25l4Ë‘U¼Ür…½Ôl!`éMF½B®Ì3꾓ûˆfyµv®æ[ÿe’1¦Y1ße/¹´€Wµû SÐE~£Ý Ãú~S*iX?kT.oãé²Ü—²’­Ü¸ù²â{¯¹xPÙʨ £$ Û°½š°c¤ AŸµqißhéßsÖ^ɧÎ[Þo÷ÜBçòÏ)“^ÊEô ñÞj= mŒÏòæ{¯N¾èõ&G™+ßj1ÃÖÆfª…òˆϰ©³©÷Šï®¾ä–”.!¿ÃF7Ù?;áiÀ½* AäûÆŒø7ÉmŠ”¥“©ÈØmoæÍue¢ôJªÂåw´¹ç–SšÛWg»kW“dÛVŸ{Çÿ"X ‘žN²9Ã6rÉ Q®ül"¢oCäÃÉÔk2N£Û|]Ú)ÀkÁü²”%:ÀBtuX-]ðp›ßÎ3×°Òð°á>ä û<òj M•WC†vwAO6Y‚Â8¸¶ý­ÅŸg’ó*®a¾ö¢¬qTZ×D#’}CÝÌÏnËáÁ‰·"Z•Rí¦e°]ÞNé‰ý ±Í܃œ™ô´ð÷¯¦Úq¹@Ú´7‡nã¹ÙkšÔyB壵1#ƒugs6CÔM¹:Ηr •ùÞX.äªë§P¼ X±òbcÞëÖîƒ{*L¾—‘’xÞ… sèÔmÐ1*,w)­¤Ð,„¶f§.è}ßdÓ`Ñöz{åö”›J€̨ijȳ–¸ÉN…ñæ`H‡2úÊülÔErw+O&/ò(!6±bA.à_NU;.yPHýS‘×….Ÿ²ôFÝcMΗy·´®9éÕLœ†“ `¨èh†£Õf(°zôîW¼e~Øæk—ò´i†&œ”˜WÝl#Ë¿çº?L+gªŸaõ²ÈºF÷d&ô„VJ†–HÖš…êKÿb›*µ*Ø[Rþü^-‘„¯/¢§4Þ3} JUÁPü ”ûô—,t‚æ¡tøŸÈtcøJ¦’Ht¡øBë:“oܯ‰øQ³øy¹5 5„Ï>UÍ&Ë4NÖ¬ 'Ç©Z"qNcvþ™›ªëXGUÌ<½ A5 Â!ëÚ[ø¼…­áÔ4¾“Ë"†ž]…áqvêbúšsh¯å=о’Ž»Ê™Q—›It)K¬Ø_’Htt(Ù‹¨¹6ièb{ûÓµËÆNõ³•\ôÉÛgÃùPBðs„ÚØŸmw„mÀrË(Û ©•ò8Õ#ñü¢ÄöÌ{õ’Ùð½C®ƒwæ¿.­ë™Mèûô¤î°Â[_fŒÆÌbiiâ-ɒߦc¾ƒûìœ-W|.y¶IY‚c3†œ°ž5å»À MÈÅ6j!MÛÐ4—ÎÑsãó…©b½|ç*ÙŠ`1`÷²q¿‘:Ã䬜‚šš:¡ÊVù&áùˆYgŒWI¨MT.Z@6kU¹ösô’^19çšQ®9©’›Ãúè3îHF[ÐP ϶D]æÐ;±å e¥êú®>Gu}ªâY®-»¨´€\æTJwü:hªË†ê¡’™MßCûÑ'lú×[$²®9AhËv¯©Ü­…Ys2½råȶ:)ÈeÆîj}ìéæ Ž}3n¿¼„ RhdqKû×éÎ’p¤WÊkšK ÖŒÖ æ`i‰‘Ú‡þk+2ºP‰lh…°M=N«œæcAv¹gèÁ™8rÖ‰!vØ)pSí¡ZBî ( BëÕ­ržË›ÝÇλ%é^ÑPaCÖ…á{£ÕôÁ¨dÏeܺÖò¬TJ"\PaGÌ졼éÕ$#ãB7à¤wxñ3µÕëò ¡ù`bÓ†ð¯žUò“zôIÛÎøäÖ…”|°U‡µ:†ÕYÑ<ùµ\»É‘UÈëê[µ†êÜ—JÃÔù>Õäød,ó4ù¾cÌpÙ¯d`д9Ý–«fUFNzFÆm(-‚añ5—¬Û Æ r‚Z5͸K54óÜ'¶¿nžceOÃÄË衼ªžÔí—iø2TTP~¯¢öæ«îlVí2”VnŠCïL·ø>Gó­©2Òw ©ƒ*…!4[¨ð8LˆN~ã%7½Ã®.Mi–òÂvH):dS ÿj_òjç•ú³ä*­Ëv¶SÇq-:jk­ªÓ‚Ÿ¬E¯Õ™›þ&fØxu€Öì$j/‡‹"a%#àx–¦=o€.M‚p‰œ-«&³ó{1‡J´±´ežU *¬54vµªÉÒå^ཹ©ÚæÊ]ÂB&¿Åη¾«ŒdkyYoÓaúž­«²H&kª³ämDꜳf]¯–øµ—ÉŒa7k(O[·¸¹+„ÖIÏS‹‡`·®ÖèE< ‡þ¹á»j†É5õ ÛEË~BÀïÃ;Ä‚¬{¨ÃÓÙŠCµÍùGMS›£+LnV#ÑØn53·Š{‘P;MÒæ=T´]XÍœÕ%‹rVNÖ¦¬ð%Md46rþ”þ%YaŸ£jðwsSϼÆOSƒŽÇjŠ™;ÚF5švFpç¢)8±_R_Œl‡ KHÜZI¸í¨R#1J¤¼ Ö+u‡ W8ÔiÀdãȺîütS_Õ•ç»Òºî=éyR >iÓP¼qÏš¤J»§á¥êz3½ù.àÈâϦ ¢ Z’ÌŒ=·~‚á÷È ðÁ’uÝÊ·>_KqvŒ“oZW,Œ¹uÝ•‘ìF›Öf¨+ëºm«æØm¬ëUåÔ÷3ß•ê´m“óÒ#+»UöûØv0øX׬%KpûŠJµs4\átjb”DT[M7CKb·ÄŨj»’É÷jràX ¾[¥ê d4áÇÒŒ¯uìÚ¤«°¹¾Ð‹é點÷ˬý}åFØâ’çȈL 8ˆ#õ~Qú®z×u•>f&aõæ¹_ÎË@ ˆàa ‹ûÉêÏô8â¾kÞ*ƒ*×_ç0µ:uPZ™ò]ÐOïi]õf³,%ò]ÏD¾ˆx êþäĈŒåS3ÞYYhhÜSÊuŒò•®™D·]SÅaßA’Q‹J7à3ŠØù’"ÔJ¯C:L«{ê•ÙÌóajx94)»Lƒ/¥Ð°w¥˜¹{‘>#Òu-`š!ÊX8ô“Àƒ;¨ÿ〒lÛíbfj4ëtüæ›Ov«°…~hÏ7ddœÃ©“Ñ]©®Ã`†S0‰´û鄽šš6 cŘ²ŒÈ ­ $:².€Ú•„=Û¿JäñŽÜÕõ¬)r5oX»u¡Ñ*ëBJ$˜ ­ëTµ'Úé¡d·>Ww¨¬½-m|~è ˆ4æÝrW·Ôd%l”v|×\é®Î<‰Ðœå$éWÝó3‰Í¤Î€“ûC|ÔÉdÈ6R„ÚZIƒ5I\ýmĤ4î[JXK3v¿ yr~xSwx€KýDfjL’;™ká»mà Î&k‘AµÐ™i>öÚÌ›ax›áÆvêþTŸs·ú›‹ãž¾»Š.'kõž5cKN Ko²¡¹wÃ1åÕ åÍ“X-½Ù‘@‚§ƒ—žEµlXuÜm`´§:«î‘¶iÔ‘ŽÒN­rýÅz1•O ýo2®Ùë×E©ƒ ä&Ô®Ž–…»’ôÏ‚8¿äîjÉ†ÊøÐjÍqR‰Î£Æ ϱ&yýóà$öøðÔ‰‹Ä-k;Zß¡#»gkìŒÁe¯ ‰dÃçú>´'ü nj‡%š¯gÍ%ë•¡|>/¿´FÉ™·bkm75cAƒœ5#d2 ï»ÊlÊ £öæW ¿hŸxÇÅ{d-LÍE• ™`ævÑm2”½Ú‘»z–›½úw¯¹0¥6rÓZû%ÙÅjð&³8Ÿ§è› ÍØðû»Ê Á¬$ìùæ¢s¿4þãlö”ž3iòáÝ7)ˆm¹¿0bzÔRƸÇrášë?JJÇ ÒU£î%©C4ûJ0Í-¡Ví“ =9M©ÄYƒûÕòls´þÜ“c¡w  [y2(nÅø¨²#qÐ@¥Šéí²#aB³ìÆî·¾ŠDë™ ‡Êš°ª}½7.ÔtÞÆƺãêlůfe8%¼mT8‚_<‰YDŽÂ¡¸á¤HÄ (oMü 5·ã“½³f<ûÊÔÐÉfÞÕ ˜nmˆ”ÇÐ×I6·æW'è%6]æðÒë)ƒzE>÷ LÝ›½Šaø'9¨F>boýO `J8“Ùr7q"›ù÷YŽ´Ï¨”ŠF‘· <@õY½›Ú* A·¶¦˜amJ®L¶}uY×Ë8‹Â)fXʇA(!6GFJ[¼,‡R’ôX¬Ê€E«©2YÚíò<¯²ßJ¡Úý&èãŸoßèõ¢Û¸s(“ç¼Çè› hmØöJÍÊWJ³1Ã-™_kp° Õí— ¡yS÷sFéS 2iè uö(°Phx¥¯$C|Æ0•Q‚ÐcqŒ´Ä¢½ÜaÉ]A*3 ª’ѨH‚ôÇß2éX-ÉzwõýUç£è…¥g`/hÆ EbQN²_ÆqGI¸ażÚ˜EÈîN¹D8ØÀ¡±õ`Ñ¢§âÆrˆÔÁN^eÎY™Wª¥&bôÆ6†{‡{%IŒj¹°y ÖöËB*Ä€%‹pXJIQ¤¼“>â©H8ô“õ|R•ž¾S¢î…zµ?±À&½2Ì { o¬©˜òR© 58Kµ 69'Ù¼ÍÇ)‰Æ Ž0.æ?3ﺘ|¦…·š‘ñ–›«,¯L5 Ð3`ú´y°Çü*OJ.c¸…m;@â#ìˆôqd¹£D4Ë–w=Wš<{«TÂq¬yIw…Á|OÛ8·ÓÔ0XJÉBÀ>JV§«P0ùMé*Dgáaî«|9ü«f-ØÜZC)ÔH37êƒ lH?%h3è¡ ·ŽDÉ %CÛGö?>r–Ï2rø9Ĉ^NJ ä‹¥¢Žö&Ý ðyêIÕɇ‰‘áa.c,ù$U焈˜Y×ɶáèy¬¤„fÒL”š* ÏÝSx a—#C¼¦S Èš$´MË€Yý1ÍŠ0›ûÑqÈ_ç*>T·[¥¸‚E„™Þ}í9Ó¿Ø£2¸Ô‘Ú«ûR Ô:÷& ºû@Ì투Ð]á„tÁkï”|Ý«¦0©rQNÉzûÞ–èy(ÿÅâõÁþÓõI ¢L7¡ ’‰BoôPïFΖê`/x%ô :ßyƒñ©DÉèR\ï9(ê‡^Ôò™—`|!S+)i4“âõ'ˆöÙM…ç9© w‚À“°»?Ešë2¨Ü´ž»‹¹Ú¦¥”¹G|¿ƒbN¦?¢¬þb!çcPsf·¸îžR‹Ïçæî(ÀõI¥Vq`”Fj«ï³Sâcœ’oÏŒ•C}åmmºÙ °ÎŒe:L~€GK0âK€Ò\™d™UÈu8ŽÖ.9ì=*Ù~Õm*.×Q¦%Ð}šC‡4ù¦§ 4uãRS_Üyªý+ÖxOþØW2æï«³5KÛŽoW[ ÏK.û#y7*¥_£ÑÝ™¦¾˜™¯ó,í£ŸDôë]%3`žŸ¼îÝ>c4,Œ•þêùµ½S‡eõÖe¬ëªcm¨²äj§|²Š{ZS"±¶Z;p³#¹Ô_@Ì:è‡&zÀ£$C”™ ðz ºqüZÊc¦š›,åԟݬˆ@3òP‰ýrí”LkiŽ#Pí ídW)m$ëþ;…ahîžâGYNëúHã¡Ú’ïªÁ¬çÖ%É-£m5­ë\2Ë‚°ÓéÚ{zR)¬>*°Ð5u½DdÈjö*ßYKhMùG÷#ºîM‡7[/¾ƒè³@35Ùx±FV´Ï*ã|7+Éëû[¹õbŠ2›¯sP"µ“qû¥¯ôŸÓHTõÈX äy@©*Ü áY×JáE„j™Í)úH¦fN0J3Š]pFÕ&íÜ®scû:ëí=ÒIîl†/TâÚ4tÉ—Ã`…É2$ ÑLûñc]µ—ŒŒÒm·e™Ú4 )õzgÝ_ß5”(aç°Ýô]òáÖ:çc£*XìÒÒÅ`¦‰YÙ¢ ¦AJ¨tiY3½ßó5©i¼ÇHËu²f´±—ReÀOþ¤w¡%ë™[ÒûÛ¨ÑÛJ ilÿí•rÀà{ýd…3,»ô’Í„v~ *Ç^à›P ¦þ9?+S¨÷2§W; u­@òºu‘ï%™[ŽìŽÜ~ŸÍ¯m¸BY ì£{×N–„çQRÔ²®çdÕB@V?3ï*»åK{[ qß©C£f^‚¼k- *^ XNV­ïF«oænÍó]+mκëÚ÷c]wmåÍXLSÒÎùI,@¹©A_Z¦6‹ª2~;™¹Ìc¥œ^¥ROjBÔZ=jPQrd®ùa†)›¬ô ¾ÖCÉõÔ“Å*onìóÙå-gR…ØŸ <—Ï—Ê•}¾—¯è“Ö°®àʉ”Œú¨ÆóÍIÉÅ0g9¤Õ°°4,Ž yŠï]Ú§ÛÿI€Ûʬ©–º©ï#ˆ}~ <˜˜áe˜Ä6°Rw8†"ñð{êf”Xõ€*?n]Ý7›Üºêεø}¢qèÖÕ?],þ¤ï:ƒRذ®žk¼déÈ¢ÚŠ4nΛÅÄÔˆî"ë]².\¬kÎ’â3ŸS…Æ’÷JÍø×ÛHg³j= QÏ_&bíÆ¦qXWÀ®ˆÞåŠJ3uÙÆ-+c枥ö£–È»‚,Э«¬yWþ FêžþßV*ÿíðôn]˜ ÈwͳÙZ5…«£œõÙÉÇw=;f1š *žã¤ŠØ¸_íÎF.‡kJª«,Ra¼@%J ±LлFÆʬiíÊ;äƒÝÄWÞ×jYÞY¯Îð<\VÚSŒ"áÓi­rDwìRå¨ÁÒ–ÖÕÆ§-ݧTÄ ”XÙ¢¼¦{š@Ü3¾Åi›:È•m›¾›ÎæŽÏmh®zòïzæ]ï­ÿ¬ösdB/ø©ulÊù/Ae[Áp^!£ò©‚\måÒiß•º®6$jI-ÔcyÌ+öó‘Ý» ¬°GFQ@ßMüèÎþIñ;_­=±ÒºúØ”¹·UÃy$¸½¥~mŽ,Vk­É]õ½ošZë5¥£}·”þ!ø@LÉÌ ™’‚EÀO÷~kºBl³eï£1öXÕ©ž7&%”²ò–‚|6Rë#]È] >%@ •ŸéFÑëýÑNGVn‘#{ƒ%ÏÂæ'%+¹•¹[/úä%Þi¬ãö«ƒþâZZ×s¥9q€‹Ä;ļc5†qWc`´¨ËkSÇ•õ6P².<¿Äæ<›Î9ã 6)¨ø<æg/iè FûLÊÅ{­¢}ô5áÉXᑾÛÖZ‰{ð)òzKõ>ï'”蟊aÝ4µ^GÑh™Ó–)êñð÷aR¹¶ê6âE¨MÙú‹ÛR@„Bgg×ÜT(e~±³öb½3; n”jHÞìH¼›™wß3³¦Øbë–å¾úê( {?¯}7^:/ë’% Ñ‘¿;,g$ØÁñÄ$—’°ˆwYÆ’€—gû;±©ïõËÝŒ½æ{H+âK.KÙªÌBFÖÊ00A€µ%F×a!\ìÀ>b›k¦TíË8KZW-$ÜÂÁT™h ™ 'íUª7õÝ‘’§÷ÌI8¹2O£S(eèUj)pŒ·~¦ÆnV‹ƒ™Ol$sZã«Áª&{íÙM-³e>Þl!ÔÝsªî•Þ¯Ž™5#¶V³ü+Ì`Ó¤ úñi"éU ½t¹@ƒI^Ïi"hè;­«ùŸÖ5æ”úg3±ð)wµfâ»Ö:YÏ´Õ%ûeüþ]9Æ *G»Ït‹¬k¦l¨b7Xæp4 ‚ìWhëYÜÆ¬pDP¸zGFÉæ{ߪª–QɺèR™Ò¨»_Ÿ²®´S^nÍÊdÈuUeFµ¹äâÎ+2øülù%€&»æ)Ô•Z—2âs“rñÊ*ÿÇ©Æ^Ó8Òt©ý²ô2H½¶äÒÔ~6Ç+Ú«·±§CÛ¤”ˆüeå¶£žZ)XfdØËöÙ¼7i±+ï0Çê2µ+Òî^¸ÊnðÖt….¾£úáÕ%¥ÐðO@:ËX¨“²‹¦Ø6ÜêGÙcgþéãÖ-®±ø2bù¯ÜäÂÇ<ºÿÓœñYƒR‘•óà­ÒŠ ˆ@UMZ[z¤Ý…º¢;›QORMN•f³zÒÇÖ^’·jßÁ.´¦;9ƒ‘”·ñÉ¡†F7ò˜ïÃCœE€‚CÍðˆðêPÌ×äæš<+Шw¨Þ! p€ Y¿!xÝÈnÔ¹ö_!OSûì@¾ýÓúaí? ê´![bÍ'û2ÛÝíÅ ,閭9 ÅAß›:Ê“á|üb9dƒ¶ˆWEÒ Æ’ˆû‚ÉÑOº³åâ] mÒ0Â䌆Ïk$‰µRî•Q0Ù¾¾‹+sâ¢Ç am…¨—vÉwaCa$ì¸Ï•€sèž¾çénüf‰~‚g…ƒ–“³ãb ª‘RíEðtKÐ?è¥>G"àb§1B«ïPgæ9¨)í\Œ#»Å ÁÀ&îÁÑ"É,±µœôj“3"tâaî¤àõýî¬Á7'€¿×P?jy[ˆ:ÂçuƒÖdWdŸ&“Uá´›tNvKKî³÷¾pŸØ(BHm/BÏmàÙ.±·×Dêã—C  pCK)Í™ný†N3,rpÔ¦m%]Ö>`¨ðô6”Uü™~èMgS•æ 5~²Qð²ú“‰RxÖ0¡oþ<ð·ÈSndRíÌýl|”t @¸|à‹aõCÓ[†ùFÎRÃþ¥¨ÇM+çl¼_æ$‹å¦FÉŸe``yµ_ÏÕæ¢šÅ¯m´f²6®Øï R2•ÙÜÉÝÛê,[Qš 5g1<è _¯´+|v䆿]Wg»fÄ{ÞJEÀ- 0VÙG% $›Uà'UZ׳ÕP ÁüS„i}Ô¡_S^ò‚JNy¡0§d¦×žMÉYfIsÀNž>ZãÓ^šw,9›!¥…?ÓAJë’0wnýP'÷A990¬ r­µ¢?+µó­86¬Iúóôäìž¶ü§ ßî˜aŸE•³ÒG#ÒévgKÊ®÷#(å ôàdzuÌòtŽÈ—<œ&‹N5 ·»£šß‹S…¨}#…Š9UIûDÙ*“n$ãÚn9;? #¿FSó{½ªüêt¸«êõÞ˜:ûÝd"oíæ™¢O¨ªnx%ëé]ƒrÒÔNÏšjb§mÎÈ>² ¤›XlñdTVúEȤç‰Ý ?Ýçá»>ÈçR¦¾ÔöJdâówœ&‚–‚lÞ¶\šR¨µ¼3[8’jõÔ„Ï|W•.¶„’•Hç«/£ÉîÀ¢;iwÏû5åj¥ø{å„M”,4Ã{…!Eó®1ЦÝÕ–à@Gf¥:º|º—ûC÷" áU·b|ÛÓXßHþ l®ÖC²ÇkÜÂzaVYº,OÑ¢Ô–¬æÅžÃ×y@‘ˆüÛ«ë|·/0©ÂÁ—ÜU®m)³¡àæpZ250³ñƒÝ3®Úr©ý½Ú¹© !ÞLám)ÇLuÚcïU¥ ÝqHLQç~ó0EF:ꔦt¾ú!nhÌkÏ;ÔŠô5½W?y'÷úÈ!¶˜tMïÕ¾Û`²_I<Ž•t– À°RHí¥Ñ(лÓó;¶ ,»+{ÓŒ/0í#mÿe6[Ö•4¹+HÑ'¶ø|ÀÎEl­`çˆo¿¼b¢éêB_zaRÉÚJ@€?sÕçsE'Õ­Á¨$g¡©q©}új[¡¤œ{¥¿3Lô‡eæ…útkµ”tJE`(H ±}Ÿ³i]ÿ Ü8ÆÉ"e%x)Å_¹¬5Wx݉ʠÞó"É êÌ#Îg« ‚`×Ò¸ŽãZ'”÷êÅÐb§$±‰âRŸÑ¶;¨=nƒ”1îÆßFÛ`w?:JŽ)qAÌëIAŠ¡ƒ?Ï‘,®º9ù 9׋ô½ˆFÉI &‚ɵâ©:{Qˇî)PÇ{ð.ø,…ªòË •…¿¢oé±U*E²¨s©W.¾’î:O¯æ¤®9vf| v9høP¬æÒ–>áRnî™Zí”Ê´¤§¦Bç{G¨‰Oî”_?NÄìÑŽà\®!ìœ n(—$Ô0ð²Sr¤-ExÖÝÓ³ŽrS8ó%ˆMŸt ]ÚÀa¦Pé»lQ_ÓüI ?«éWì˜._ëˆÇÀ½¤ê:Ö,fÜðþÎ0BfIØYÔï=à”çó³]»²áæÅ£¸[lì6¸Nð^¤Ô¨Ãú®\E_åêt@öËkðH,p“Ì Kê>€S5ÙÝË€©œ À‹T8…iz•@æTý®D×NJ°·ésFû±»Vɤûråmm± áNiUJ°cd8hËèåZð1º³btÓ†êWjø½Ú¬GÁæÈÖ.šçšÖuÆdŒ2©è$²;¯øþ|é4ûU‰W–‹Ð“iÀ+)ö~ ᮟt¢k·<ï!–ê¥IÉ{7œnbý¸ÔÉ,òP#ùnPµ¥j«g^2¥N-¦4¶qò—Úʆ^a8e…XðÒ¬ó¨)iÔR¨cù´®±êGÁòºÎùÝî^8Ö8A³gv‡±| "è8!ÆlúÄ#„¬MŸêR[Öt•]7úÇ)lÎP”{–‘œän®iÜûVôª­ñE7é•rÒÙôZeϸ>ê|geÇìÞ“2ÆÏ—²Ež$· gJÖ};G°EgèŸaé-=(ʨWWØUþM¨²[W9[/Ù3ã›n6¸³<¬A¿ð);­kìö†„øˆÊA€Fþå½é npƒ…âfûÚZ ƒ‰¸[ËOBIÂ3êÛR®[2<¡[SåÈKYá¬%-Dµ‚—¤Â¢éâ] '¢Ð:p`5‰-Y[qï¬çìF®>£àQ.žŸÔn=ÒY »O§¦8\ÀGÛ ¦ìH˜ëéÊŽKïÜB6Ñ:îG1Ê·2µ[=tëºM󂆪sÕ6ÜñPH(µ¹¡vÚÎÐ-ÔÖ³†ü¢ï²w)kŽ~ÚÙGÝ(« ¼ÊòæÁèœäáïNO]óìÓ]õ³(-cwh©)~„q×1 0È ³B‡.”*s2nWï“ix5Â4åûãÌ÷îÕE/#(ƒä÷o,é. 8²mùôÏáTËCÔºélÎüø®ø?êÂõ’è»[Ñ'cö¥ƒw¥‡5£‘º0Ãk¦ÕWuîhÏ»ÝÕyäÈÞÏKÏ:›oBøÕµÖèð.ÆêU÷îEP†SÑÌCße8·þ1¨y>ùõIôh°äyÊèTr1vÆÂDÉxN¨Ž¢ã¤~Úú Ò8«O@uõgë~TŒÀñÛø/WFF2Qµó‹IaPž¹é½c‚Øô’F žÑ“Ò ¹LF˜˜ÖøíŽÏ *Cýüô=õcÇÙ)ÍuÖN)ÂyZ¾Ïg×ßojyÝ”ííÏIÅ,Î}ሠji#¢)Ù%Žk˜Ù]Xµe/|F:÷Q/Æ£n“›}¹q½².Lƒ[_©z”¹­²£°GÛ/Ô[™†ûLÍCÞ­+“íçÈÒ ¾>éýCE÷s¥t63ôݽ+ù‚\áåÔ^ê±~íÖu5êFÊP椉zèâÕÿ"{Ü{óu†§s_ú ST²°¯õÓ¾®µ&Fé…2¢°s±Øm„–ÈÍTy¿$Eúš¶†WvížÎŒ`g5ˆÑºw§"8Ï&Ç–è¹µ™ÿVòbñÕ»‹ÊN6!/TýƹGëÆ+ºøÑ‹<9­”Î0ôd­Ç¢ŒÌü†èˆN¥ïnR™]Hk•­cƒòz÷j;yº)+—Ý ^=²ò¶¶tC5zRv€VèÖBÞ¬žþË`AÞ².»åsÖÎÖU­5£ Gß`vK¾=Ï«Ænk2„«4“˜`ÌJ¹UÛ˜˜Ü#qË&ËšÝð¶‡rð‹)"VüjKÛG}œH¤"|èZ{n+àQ™±ÂƒR¼x‹‡JYAÃÞVÞ;SÌÞÊ+Ñ£V¢ô ä-ß5^åÄ{‡¥‹Åº‚ƒ'5>W»+#¥-žéWá+MHnãÍ™“®»©jmT.À gé/¸fü»·vUosDRàkÊ¿œl! pÊ9#7e÷ •¦¶ïRäèu|Æ–swÕ«;?‹§’Ït»ªjTrìbL!Øt¿… š­¦ÜGm×è§—:…d¹ý$e&oš4Ïñá0B¤xŒ±P²$*ÍzW¹OIеdxéEPìi ³õhÙ8 dÌ•ƒy„?y?ô„… ¿;í{âÙvè¡ÕÀ4`¥’çé âvS.ÃéÀÈ^}Ÿse¾º„~ºû~îÖZÏôœ™átôÙ³HGÓ5çŒu TÙ+ÝÕ)³Êó@J+Mh^åVœñµ®!ƒzŽ‚-. ðvQ™±ÎÙò¹‚ þÂàE¥@(Xè:°ÞZå„=Ú³½ ó¬dèA0,•ü•m¨\“Á0qÑîžÓ¾rd¯¬èr6ïåû@]_ÞFƒÚÖ`Ôžð,’çrÉÏ‚ö|#X(]`6ô5¥Ð XË$­I´lÙÝ{Aˆ›´éanE;Ÿ~WÐ2yЬÄV9‡ ãÏÙÍ1*’]h_Q·2[¡Ôu«0¨GoZÁÌL_|Ÿ²®w©'óë9²¦÷¯²yi`à­´w9Åž†’Éøì¯îÐ'½ jÎÔ4Á5<¹òÔ=л·ä:ÊÄÜhÅì^gn$cÍ-WŸG!qŽvK®Ž ˆq†Îå¿cŒy¹\5GR_Cf=)YÐêM È•H¶^’Ÿlï›;º»ŽÏz럨7Ü­PÀÓ Û<¨? 5°W&ŒèzE ô¢ÔƨµgdN#×…QÉš ìó˜ÊHžù.6 R‹Áçd¿d‡Dòt4ø&Š UWj¼ä]™wKL4<Ô X#Hé.­kY3SãÊé wß éÐÒÊiFT[#øŸr_å] WŒ\)‘Y¿9W¹ªc< ¯àã» ĸoR„Z …}ibjxá8Yf^îŸË©ï¥ ]Wƒ‚jË syŸE¢´É€it/…dP ½ ®—ÍWl´Ú <ŽþlFÛ6„}FM3,$çVf))†÷%½à*—Í$øj÷J˜%ÿ‰u¡ÅGЛÜÖlº)Gb&{ÓºÞ.²Ïçš‹ž,º©*½; 9 äÛU:ô{+­ë=ËPÖ¶í‡JcÄ÷Ôt|ÁA³óMfxè†ÇÌ×AEä$‡‡*­(7—Þá»ãÓŒ9eC Ô‘m Ú hCËïØÉkÜD¶WÅa„Is'ù˰åÛÅ3¼›’êÉM4‚ÆZËJÀ¦êG¤˜¢m2Hõè üK2C ƒŒv¬BâãO(“ =hõÝ´ÂgÉqp¿ªÈ}t2¼˜^rÒ1¼Ç2yù"aIÇV‘”j½ú#Ж—°y H×8Œ¦NuÄÈh=ÓHsp#›:P×­“1³.ù.4cÔÙ6ž“#wµ”²@EÎ +]þÕ%É4ÀýN^먊ïöÈy÷aò¼ÛÈSHx»³igÓ¥½8¹dÎ:”¹Ç¿§ë¶‘M;—î¨wÑ)ãn“•™wIFU¬/ÅÁÐ?wyg~7‡íŽîœÖ=˜Lñ…´7Àõ’’*¯®HÅ×vÓcÅaó#ÛwçéP½R’¡8í©—Ü§\07]‘q˜œe®9Õ¶ •³RÙ)‚ïš³ëà]ÀlXE"öïÏ6U[æg«dÕÙÏ&lÿRkYù‚ÑA¥\‡n›lk¥è“;ÖUrõÒ¸OÏíù†’ U™$vÅÍ5¼÷(Êô2žä­jftݾÉRbû/›¤.ØE«Ô=€Û’·ñy¿þá~yo¶ë«~…(™õ›&1öþ0N…à"Ÿ,$¦ÌDvÉsRKrT¼2*ÅС/¶ÿ‘¢>‘‹á­%q,*ŠýΟsºÂ}«L­V–&ËNBŽºÉ=üÚülÖ©÷R` b§‡ÙE…¢l§àY=Ú ß¾rËП‡Öuoïrd€Û2  V†ŽVö¤A•s–¬k×Àñs6Ùi‡J3§ï üèÏ=Yä=ï™j5@o$Óc%‡nê …»…²uälvHNvoî›BõÖŽ+ÃJaÇ d÷¥¡ºƒ8ÿ»1 kgy}ùvJsÛìÀYÝ ¤{ùhÁViCϳZNîŠk…Ȳ >ïÒ°øýµ6^À uo„¼¤!Ç{a)`µRä‹HãBCЬ‹ä‘°¾m!Û‡Í.Guš5;f¶üGÔêF¥3è7ÀnT·¶6G(s[‡“<;CUƒ Uue¿yÙöX§AáùiÓñ•-}W_K£5²Aì(ÊÜ€š#—”TæÏÖ>Ôó½¥hƒPBX×óŸm“âå`sä$ÏÂY) 4Ž÷K\ýl,j—´ÆaÞ퇳 Ô3iª0¸U)V 0T¥ìB3Þ£Ê'‹)̇ô$Úf)sJ~†Ú² UvîHIŽýï0ïþ+n’¡Ç¶ÞÂÔlǺ)ÛÀAŽì¹é}tu ÌŸ´O ŒÔë}uy.¿÷ˆÇž IYðä´®w ÁKi_@Ž ùbîä•!¨òBbÉ]ìUeP rê9›Ä ßY8Gµªz§ag3³«:³â+c$µÐ{IHe›d DX‰õ9Ž+èa5C>®âîÑfl†ÆYI)ÐÖ|íß…ÌV(y¯¾ÝÔ8{¯ÈGY»¯¥Óµ±CåÇzŠ›‘Ñ*öš-„g…;<†¯7t•Q-cæËƒµD|â=ÐÒv Yhœ¡?(×Ζ+„öx|²aIE­aÒ'¥Be²X8ºYS_å•Ö¾Û’,tò]˜ec!ÂX/eÞæãÔX{¶_¯ÐŸÛ¡»Â—îMüÓ‚ ÁÃgOS²6|É%0J‹\ȧmÖO°Ú¶"Eê7É[Œ}£¸'NÜ‘m(„›š¡ì¤9ìõÑ»ÆdªÓ6^¬aì±°{¨þi3µ2+µF2?¾\0Ìn PB^ÞÙ? Kã MƒÖqø.¬®T“©ks0ˆÌ{å”\– "+œE¥Ü ¤@‹}œ&ëzçž™âï³XÍŠ–T`”êÈì¿Ôp6†¿ïŸl×À ‘K´ÆoVeÏפټú/kFˆ¤Ýµ•Öƒ³ÛÛ!=îÖ5fËŽÄ-Ÿ~×Ë´Øž@M¥IÚ•’Kê¶'Ŭ®^ªhÞLsF½I£»él,Ä‹>| $E‘0KªIë³ðÔ;÷£¤4¯´6¬‘LrO•sD B*6íT]¯³P4Ȫ2’Fá~…D Ï³6Yt]µ’]»¹ ÇÉÝ4q#«Ÿ°ÈAë:Øš:š÷<ßœý®uÆQ(CY öÄ{²]À"2«yV˾ØIƒ²6÷ÌN-ÇG¾Ëq$¦c¡Ø«~evSÇmÙüºQE‹kgÄEº>§~jFf(þ½€žƒ¥úîC§»¯ŒÆBàf ÛGÁîxùèÕ—8 '_ô—wq[ÖrÓ‘¡¤ƒB¶¿™½¤zä{þ)Á> 9»áÈR2Ô<°h°r˜]¡H§z²9ÝAB#Síf%vÆKd[Îä€C¬ŽH—~ßýðâ½{dž< È] – ,:T‹»  KX`o¬©¬b]VSËwd Ën]£Pük/Ö+êžÚ¶¬ë¥¶'½ß‘š'NÍϯ¦èucý{ 5fö±(Æ‘|—é%}r÷áo½å[º†[{éâ!’…¿3¼wéSÐÚÎRTÚkçÛËâˆùF·¿r‰`"2&Éá©!Oü†Gà!!Rè:EƒØ Ð)é®ÊõÝ!Ÿ´“D§§QŽó÷ÌÄ äR&µVÊ$%’‰[~íœ}ÍÙ’ð gÊÈ@a“<+ùBÏG§’,„,O‰)Q´.tRÚQ¹nt¡~–{ó£à{ñ‘v¬ Z™ ¿À^³oªÄ|}•Ù\pÀ±‰d{¹³Ð6VH[xN>nWÖô ¬Çr–’åû –â½ᮺÃU䡆Q–³ØÚ¤gÅÒ~PÅÅ>‰°È•mìa6!XêEuX Ô@€Ë“•}•üœ;ÆÃaÐ4KþgMß5—Z 6ÍDµÓ™‘AꛌþÆÄ,ë‚ÆYQdp²3Ðn,²wY!¤)e¹=ÙØ­í—ˆf(µ³#a×DÓî7¨Ò´,)P“ìÕœ©#€ù…|R=êWâämæh{ñáý°i¼‡ŠX¬žh$ ri=L´Xè»–­ }@7+±0Ï]¥P­Íœo£å­ðQ,ÖŒ 2”‚ó´DpѨA=¨ø×vÏáÁ+a@X‰¼D ÃØƒžp?ºÁZ†^˜—I¦¶l«û¤ÝQuîýaåVSmZW2*Â$y¾­¹)»g=·²f;¥ÆGpµIYLñ7 4B¸ðF ·!ØJaW(¨kŽ Ö©ù9øLXû]&'”RµØr9)hzû‡›ï5gI ôèTë6,ß@;:ábH%[Kc‡Žd@ñxÜ5ªuÉDG¢²†{W˜aD ·!~$wC½ÓÅ\läØòeUKoŸø·ªžìKÂÙx2þ®¡zíE¿ÂW ÛU5E‹]¶«·§¤fÄ$ä³…# YóWh…ç¹ÉÔÿ÷<Û%f˜QäIC±’¥Ë¥¼[·h]Ipí-<*ÌmÃNëzÕiÊ÷ô*œ[5q“\†¹¥©‰´À*¡Oƙ߼yÓX±‚Óšl¿VJÞ@º²|°˜kÃm}äVÏ8à^r‘lK:€tk§à’¹Ù!¿GÖjºµ¹? ¤£~ÄþÀþª{²Z—WƒïÝzk⤞ vUD%˜Ç*²s—éŸ+ZmQrË>ª¹…¤Bgh§~€rEÚzAœaW—+ËJãlØF¹6_¸¹i]犙Ô(©ÿ°®&<Ä?fê\¼·/•ñª¢³-24ñÕZ¨ÊR@Z«»¿ @)Wt`þ(&—ÇP–÷ñé¾_žÂSØrºyºêŸ¯À¢¦ñ1ᩌõQ|G¿¹Õdg|…á–_œƒLöÆ" Å ÐEî Ù˜#=ës"¼hŸiÍÐy¢.Å™‹”Àn~ùÎ_=*‹’Zhë´ÄÝz‡<뫉Ók—6>Š¡md¶÷Z çº ‘ˆ>©±³fÖõÞßa„,Èga3òfûI²¶¿2C– K+¥p«¥u}´|jc1á” CYSN± ¾iÆ¿–sñ\¡:í£]ÝA·ªYªüŒ=ˆd‚^B!I» ]¤µ5[z‡÷ò$¦}Æ.hH¦­Â޵!{æ~CLè6ŠrÔÏÜ“tèÝ,"° ˆ‹ii½Ê_*šD§­Ÿi¯ÚSÆø¥FZ"ÀÞ\ÍÚù½pt6ÍV£d]£Åš“}'‹ìª¢µÁ`ûk¯©Nû*ŽÔæ®kjg»¼Œ&Ò4ùcô j6+柲mu$±þDÆyóýWuÍÞgú®ÆNí¯å~ìÕ' +[FÏ`ØïÈøw¹æã£*Ci•…!Lh¸lFd6}ç2 °+ú;,[ê“un®>7û9wñ]ìh_÷•„ZIžЍa¬Æ+š¥ Ô'tï&ey~\ NÅ`ôõüÞËø ÁU’w¨øè€R`ˆÛ´»€ë¶÷•‹w«hå×Xº›jIßõîÉ’¯~ª\á‹õiw5TuÝwÍîÀ÷ZEo2Í™ûíØ9ôÈx{õ¸îµ¾Y}KÕ’Wg²k‚2ä»Zp/Ùëü‰.ëze=-ÜÁG-[@¥¤B'´i2ÖÓeõ¬\ £²› ³ùº+@öõ%ØS® n:«‚çP>( 9¬1^®K ¤uÒ†8„ ûhU…ýzyNö»?ë´.0þhd )¢àÜ•âw•CGÈž„Š€TÔû' ›»åò;ºP™jøÚ#^ßôç+GŽþî¹±¦`øªü–¦Öµ à Y²ÈY¼±ÆÁ µÇ 4µr£§ÝÍ%A@ò*·ì­¥?”Àö}Y!%›3¡Gà¤Üº7zþ_¢ 7³^3–îÅP†_qŽ>z~£¤u•’¾ IŠN‡íÝÌÈzû(ïˆpëj…•¡‘ø³×aFŽË ¸IgbvëZMsâašêw½ËþH°¯Ì»Œé&‡?}6 3¡yY2LNÌ6èÈ^Öt•„;(£1w[Þa¬Od\wgÍxû2(@1”!»êé»fŸKV¸zÊÜÞ‹°õÉœsÊß©GÓéÞåd‘·‚K=.Uùâ6~GÍ^!ήÙ‚® ¤sRò.±vÞ‚Ý,m Ú²õÿ2à eó4-àWœ¤(ÀzOþ]‘Üq³±‚²úšK™ÕX¬hmá!ƒá¨ã#UYæ®îÒÇäʘÕcØiíݺe’uUéÁ¡¯“”Výn6ømVé®°öߺLí Ä“°gÕŸöDOíÕÓrüà Âêa©!FÁª}‡¶ô˜_uäÕèfdDƒC6Ô"³™#B“Úÿìž©@[Y`yÞµkº+໲çÖwšh78a5æÎœ`½¢Z ø¸1Ô5hÁÙíiN¹¹ËtC{µASѧ ì‘OAÚl†ïJ§ô2‚±–ñŸœ®*…ÚµŒìH@¶æÓ„¸íãÛs¤ö~9#ÿ¶–é¤u•@òaL¯C¶¸Ô@…*]N‚^:•yM…¦r]ÓšU¨>h8žûN¿h’M¾rï=›Ù%݈ñÎ67x@rAýY”žìœgɉ ØÊ"ï¶sàyJOUvÍi[Ùsg -+S¿3Ãøœ8ú±a5 `üÔ3ï­JÌ÷:¿†³Y=ÝgÓ)ôÜKQ¸y©ZQ «­ƒsç·Ÿ°{ú®rʖὑ¹ÑËÛÒóœØ±ös_A™,ü®·¯ìi@S¼Ó ÐœtW¯\Ë-®½ 댉Wcëß$æœó’ã¡ÐFrá÷úÎňçW8“iÍøh(–’B¬%u]­§Èµq[Ä`âÇ•§oÒS× ;ã#“ÞÊüì«,­úêPît‘ix£C·¬igëcï•ͯ][ºÂyFIcES2q¦]t@¼’쥶mm›{¨"zqˆHbÆe°ÀÌ¢&•a½ ö† ^éÈVÜÙôúY€zQ)­pïO a—›§[ÏePÏ’”€<µq(/úŠ×Ù7+¶ÜU[ƒ :fI僑 æ£w{*A–®ÈˆP}“rïèÎûó-5êêªÉÁˆ¥›ìBì¦6zg®@–€c$æš„~YÄ ePZ3½Z¿é»^Üž2µvö'”Qü#2·~ä”^Ù“Æ Ylá™CzLL§õn1ûè2¡rà±ÃôQÕ‘xõQ6•F¦+…ξmÂ5_ˆ[‰K+- êqS'sÌ@Öü:ò(ʽ¸ÖOþ]ÉÑMßÞ-ös¯~e‘/Ç9yºR5 UUIemÌ<„‘è¡e`Öõê, [×$Ár÷’*“ïQf¢Œêú$5ö‰©hqd¦\'H÷d]Ïå•–§H1{Ñ;Øï™ÜûXHS«ò³ÝUˆAÙžcD¥[ª`úï)—ô]hõe]R¼=¦0™ÆgõÙÛùôpKhæd¦J¹xÎTîjŸ²”~Ž&‰~^''$úX§tÝð»HÎ`äD5Å|‘kßïö™C瑺L¨‘•ɃcgæNDÕÏ;+ä Ë"Ëz¡[cÔÁ«­„*A7MøÐÙìœNƒzPÙú Š-ŸsÜR¶ò϶çTN€>¤Þ?øÏOƒê–”ëœI§ˆ¤ §©ÍuÙžïÖ2•©]NX}Îßx'Qh ü`M™ hg6gÑAÐ` Ã[ž÷kyð7Ë]•^3œ–ÆŒÅØ9q?˜µ?’ÓŠ¼l¯ë‚*KlC=jŽŠnG¥”²ábR8¥qðÇiÑÚÑk_nË}g!VÅ÷ŠÔ•¼›¯n¢ß÷yòÇlÚ2(™«ÈN.çT{3½>h!H[Ö褭—S#1 ª›r5Ë¿½„hî¶ôÍ9#‘+¡ ïþêûÝ”c«­hŠõ뚊=,·<ݧȺj/EtÝêÂQ%þ8÷|Íe´UuŒeUM.A™ìà•Þ¤d±^šš³`J™G–òB6Bú] ÁLèt…Ø¢,Ìö6´å¨Qì¶Ä@BT%Ì)ÙãÍ<Ù~£qÌ–§:£´®A¥h,Šôñqãr°kä”IG‹²¹8ð#1ö€PSbèH›Hعo¤;C‘.€;èáWºÏ—åpÛ 9Tï\%èTrêC¤<4¨·BúQo~º©p6_¹ãÛR·ö¹ƒ)GÝÁè’…Ðv®´®òj"…ɾvBä_JW”ü×Õ Ô±. Ê+î";6ŠzžÎø–gfnw'Ðw– #˜Ó¨•4¥ÎP—!xJÄ}™ø¼"ÞiCƒ ”#=Fueá‘?·ÐO#ä¸:/™õ6*"ñ[xªŒjŠïÆÌ~³uŠ6}$á„Xs'æÍËèÕ¤R8¾U+õ‰`”·3‹²®RJÂ_% a€ÞD0L½Ux€çD¾œ³%e8A©0òÌÊáÖœ=CA³§‡'3¡–ãáôý³*Þk:Uœ¢ü£uM["—¾çWd6@Û6}²//u"f²æ€û,”¹Gå›#¨Ä”5Œr²Å5$dmôy‹¶¦-ô!î E]Ÿfs8‚Ÿ§'‹§¬@©>Ù]¹G í':¹OÕüfŸ=CpS‰ýWªÅbmɰ“¾— ªoÕH¡v u9“ÿtÆûyI¿]%‹5tÒǤ³î%C›Tâs k†¡ÔBœv?úšwfÔ—èzŒã€ók6M~dò´ÂÝGUæVKI#c6}²C…#í9ìš›9åAP_à­ Õ}[,$3éY;‚–JÖì;œSrE³¶‘ƒ Œ|®ó®„tÎ9 Û)ªZlÚFyw[i—ŒV1ÅVVÛ'©’D ÑT–&<8g;Ub€ÀIv£…3ÖÎX+) ³k0çÆô]8€¬ r šÜx¨›þÚ{ÊO"Þda$rXCm!GïBØ\>®ß 7@Z¥Ý­šì“JQÞÝÍ}8[«½À(¦ƒ¸n?(ì;$lòÜ» ‚öæG˜-º«WS=‡­ ÞT´Ô3ñt¼‹?AÞC’X&WPm'(ÃͳýoìYYËïÀ‰Heöñg¿/³Þ{^e(»}Ø0ìN˜Æ©3Óðž(4wö„_úÂ/aO9À""ô8_ý¨²®a`uy¨U:#£Ay“Q ŸélÖ¨¡‡7}^Šc W_šLíyO’÷ctÜtqýîö)N é?ß^)—ï„ÜqP–&'JkeÔè\}ë‡[ ý‰ƒ±‡L²Ç6©ŸA³2œ{J'ÈþÙÉ¿ƒAí¢Œóåm)º†‚/Ó€ ºñð·STÎø²»þq/ß탇žLE0ýìí›æð’Âôm0ؾp±ã•ÞF¬¶î‡r&Ñ/&ë¡ö©&aC{’9wÛDAî¹Rªó¡KS’ËÒeá7,©k)&º‚ôËå5FMÅel>Óà?½ÐtÕõÞ>ªëµ‡r8úA1!ú´~œ(ÓG¬.™!o9z‚’Ëxd»7=?Ü!¼Œó+„¼êGãºÌ7fáAö?(u¬Ïþèb/¡hR†Úõ½Âé?o¡8 ¨wM ò3$ jÐy#ß3w!rèÑ @2ƒ÷¸‚¢@†RÎGh]Bº6·Þ·üŒ¯r¨Q> ǽÈDêA[‚.T[®ji¬c”ãn¯´<²Â:és/Vüê¦ÝAb ÉU"àÓ¤ ex%r“¥+w ÙÈhÝà­“·õYC[rJ^ÞB`˜ÐóVSwý žÏo0>8@!ÕùN,XÔ-³UUemîLýÀŸïŸ79óM-nê X‡ÒÁ«ÑÉUm`¨%»»÷ÎOpvu‡¯´pC&¥å}Vû}ó:YÒòqHñ·ÞY.¢ÔqÕ¥gâlÐò/{2Ðþ¹Vøá¸³9 °IåGxãô¥y¤1lêGÊ®KÜ Ö[¾ËšC)g‰5]Ðü.¢¼k¨zž?ЦPa‰¨d)Ù\E>nøðÀ¥°·µ«®òÄU××¢/4¾žs7 ê"t(>0Yó¡ñM'2ÛlùüN)H[»\E3jÊÔ§B-q÷WYÔ)4CûRŒÙV–·õÜ“gØcê_]˜8tðSú*ëµgå VÂuÕɶ٫×ün]µxàwëZ;õ³Ëú¶'^î®GvÇ.2l1+Þ=:µÑ :É$òŠwz¿n§¢Oö™ú³šºØ ‰::VYÄ dâLÝö—Ú¦A½„,õØ1±Hw½´ôöËÜš^-7šÚ‹ÍÔcHÃùþžÕ½7çQîC¤ ŒÛö¢ßT7E””³y÷¤0³±ŽÒP‘py§LY€þwèà¤ÝY;ýÐwµý’Ê¿ë†ú×È›dÆkíÔÒ.±šR§…:r?l7—IŸ¾æ´¼KÓ©™l‡£r·ßpg§òTäõ•qdWG–†äÖzJ”ŒqÿR<uë:› ^fC7t£­Ì_4IpÜÕTè,Kz»¦Zšö é3B’Xfö­ùùgûNðÞgjÏakUvVÑOëxSêÎÎjy÷Ë‘©Åë²B`ÉöÌ~Bÿ†‘W=20ȺV°…LúhMfóR™øIÆZ;iÃôýt€¼2HOížµôhámØ¥¹ƒöm§È2²+…àUÆQódõÈ#Ñõހ߇»h½Š©Ü›ª2”WE…» ˆofìS-ïÌ8ÜÏŒÔÞ—Áb…ƶô¬ž›ç®?Ö—ÌÒº€OÈêm>tDÞgÓŸ:x^–fÕ•5±%J½ÈáÍ.Fxf-øòÍT¬û=¯Îh}–bkg v ÙNi„WöZ—y¨“™÷¹YŠïã°0«6ù¤}©xn쌎øèæ¨o47ůLÌw¦dh¿mª§’xñà•ò2VàzQÐìí&œã•lÇòm|ó/xƒ§bJìÒSˆ\o:(ƒëá$½çõvàÎ-ûÕ˜Âä+‚[þØÒ{¶iT¬É&>©—r&¶¥m¥’Y¡S—µÈ¯ÑY[©Œê¼n=1“‰U9 •ݸ>Z“u݈k¾>©ˆqäªé Û\Is¹¶·+ƒoy®¬9Ö•›5åT*ù##Òð‘ƒëD7¨MÉP[{,[An†ì‚ᯥ ]ìÞÓ†f?ØÁ †o/Ű}î^EÆUÐÁíQ|øMfÄå9FI­·ñRe߯ ÍjëÕ‡ ‡Je×xÓʨË)ï±ÈÔ^á»eà*ðî÷o²”z´“W¿Úˆ6ÙêÓµRÉS{m½•í|¯}̈́ㅦøG²Jž7¯B7„Æïú´?ï– "PN= ïÖÂÎÅ4h†ÎðœH ƒ­@6݃Ü6{ºÂì™*ëΚc‹ÜtHÐT*iÌêÙXut9› ù3y¨ÂRœBMxÜëÖEÔlPý¤.>H©%‚`XD¨Ud§[ò4ü…‡Ï*`¬ÆzrO.™ŒÆf£´´g¹"î0!ëZŸAAÚ†%‡÷ò .í# X9ùÆöÁˆhõQ‚ÆzÂÛlZLºA £¶>¹·ê€sñ|^åŸmÊáaà§MNÖÇ?´PX0Æy'mÿ D/9NC5#hò¯ jîÔ]„¤cå' ûÈ"aO5!Ы¯CuAߟÆZ_Ñ ûqUˆÂȸífûó%JKíO›Ã±Wq@N‚Äne¡â]Éõ)ó;Ûlp6ú£ÓWX¼Á Ú§x ¼59¨Hi\ûÈ6^]N.P²hд¹gjT¢Ú¥‡–hì4FøÎ3`2,Ë=£åjißäÏc6ZØ›·M‘(uŠ@mR®ÎÂŒÏMѼçj’4£4Ÿ¸uµ²WÖ^]ÜRÈš ›_ÛÄþh]¦åš–òügn$¿š:7+^¼šâzã]ÃN¯J]lÁÆQìÖ.ö$™¥±%ó¦`ÜZ:y-[¨ŒŒÕP2¨é9Í¡GëÊ ê~œ XfÃ6†ñ³ÐwAœÆ›¡®Ï8Ðê_j#U‘_ÞFÍmp>“µÖœˆÃ5CŸ±jþ`Õj¤rq ¶?˜;´ÞV{È_tØy:Ì“' 2²®M#Ô%a˜—(ÝÃJÀÊÖÿèb—Ôg|•}“Ib1FûT%Jlwûìô]K¤ ¾¢m[«é².Út|?C™uOzOƒZ+WÄ`v¹ž¼Z #ÐØ¤ö\“éö.©…^Ñ)ç5`¹?û • nÖ2Yäqqe]c%§„í¿Êƒ½&:Ѻši5¯-:8tlÖl¡±Û|CaýÝ8™[·Ú+¼ªÎ›*=ÚK.û#5„¡ÿD½6“0üC-E²÷++J$ÇqºAá>Xn홟½Ôoë OWirõ3R5j ³µõϤZ[Šð/ÈDz¹»Eºàðí@tëçà 5ë­ŒÚɧÖõâ÷ÝaáûÃR2÷gìÝ•ÜÕº'×?÷®Êý°N3ÈÈa€Öl¡¿¿"û»­eg-ø¢öVG¢\/A= _ÑL 9Yo!¸¼”gñ²‹†‚Án¥ =ÿDs€—N+\&w¬ø…2ÅLPd+ «ª]®¬:>¡ý #ãD¯—¢y6+ ý4Û7’Æ™QÆÑDY³z_C¯´®÷ƒŠ’µ׎*h,Åé.Ž ì1gµ5®ÓÔ‰U2§Â=ªñþÊwÍX>жXaŠ¥“ªëKʱÉ)Kéõ{z'—§{¬:º uî/Y©3òȵȺ ¼ñYj™Ÿð"¹ó‹Ò«Ñº°”Òh]-ùÜQØß…Àæ`ä|Kî ²Q eí„൮(€¹wi] ûéÊ»–¡1&?Â]2µ˜ÂxÌ<'eFÁ2£E!]·®ÐÒæä(3#1¼›aì¶2(ÀVUÌDû,OÚør‡:e]¯¶I!Häƒeª|XXú¦¸Œµµœu‚þ©Ñº0®´B¨å^YW45° }HFk¨À‡uÎÍ­+ÆÎf]¯v¦ !Ÿ*Ìê¨+PǤäR&ÝJ†~”PÕÊüúψsöâéžÿ(7ŽÅ¨™CÀU¢±Kkö.WÝwMS+ ´æÈ(žŒôzFhuëÚ’ª†§f=ú†S’ŸjŽ6zOÿùÙÍRõ9gEÐWIJ#Üv‘œß¦¥ks¡¶ˆŒ×yö¢…0º¬‹< îlÆN!ëEÏÖ­k…ʲû®˜ß»[wäé2Á3ɦ› ÐXqY# å¹éä]YÃßÙÁz­¨¶»¥¾æ{å’{éÝÓÎI¬©^¤‡B1¡t=©ì¹Õ‘B{à $ù´.È¿\Î Þ É£þÙWòsÖ9àÕ”w½{—ÜŸ˜Ñ¦uÍéïˆ7²ê`"NíHuá—iÑ홗̧ú‘.6lí|‚æ¼CVø\áɼk´ì¥=_3å*ÖõùL8›Sšr÷÷ÒWŨroä‹-–zd]-4ͺ°LZd]kÔ­¼ëDôr—¹f‘AèZÞN]uã&*HY׋P5kÆ6HÍŽÚr$ê‰õ:‡j½—1ÒfôYû—hqi4lHˆ#GeØŒ™dtüñ„QËï¦ýÀŽ„UDÉžáPD;e¯È©÷›ÆMâ¤hU{-ÊAútÓ*¢š:BYãô›‚ÂÖËàq˜†û¶¬L-E¤-LúÖ›7!&Ók˜Zðì»u½z¶¨f,ýÖO0ü”ÏC1¿ªlÕÉïrý¦(òʦ`‰€m „¼[é_@!ÝŠjÆçyXM⮆ð{ye«f|ÕrŠdŸH}ÊÔ/]܆ßÏIÂZ‚äé£â÷BáÒP¼õ’* Î^w—›Œrµleõxƒ?|õ ^UγšrmM2ú-Zc[µ} DÅØ[‘m>¿míÏœµœPóUSG¢›_ü”‹m1tX€X½Ö•Õ{-ƒš÷.5î_ZRU1_)w5ïN¹ˆY5g4hæ/Ç2<Áýs‹Tk‚PŒY&aŠöÉ!ɨ¹zqc“·éÈîW®Ï´®s{NÒA)/¸íý½Ò“ €òRn£¥ +Äæd92¼qö—ær§g… B5—èºÓJ” ùºÖ…‘¦ÖÊl…1awaºS¬ùíÅò4À?šJµœ¬E!¸Ž“®p$X/Ù Þ€M3¾Ñk+?C¼[æäß9ã /ëóGgùœq¶§«ÁßÕ©Ãòo¢šüH½ÅÎE°¬f–¬ÝTè|FH-<¿Æöç–¢íp9YaŠÎJ:ô'•ÈQt’!RYtpu(C€' ªìúQÿ¼'yo1–4¨çB¨ÏAhu–’USá½cɾŒ­aÕïUZ öëK…þFÆn”Í›ní•^„ûËɪ¼7+>£#b' ­Çv²}6CdÂÇ–›éMÑ¢¯,zLɦ̨ ÈAu ¥Ì¦íÉ`hŠ!ÙiŸß9ÎÛw\R¥ýtºé¡žoÍôÅö`‚Žôì íȺv?3Íú9 ImõkØ[ ë§?{nŒä¨Ž¸çÚ²,ÿ4“3»ô+—«nW8µbë4¶ùs·¬ë™d“zŃáCçÖ”AÖ÷³W®SAÝš ©Da‘8·µ(_ð*ö[I„f ."gÍ‹ÜC_µP-ÀÓpõ4^!°äâ€NŽO.ÊÖKä3Ô€fL¤í£šéÞý*„‚ŠX ¹×Z¾ w¨3³ :‹&yE¾lµl²¶ñÔNîðÅ Ôx‘A½Šˆ’[5œ­Ü 9½lˆÜgŽO !p·ê'µ Lˆe*­CyØžù¹i]¯>bG Ú¾?ÙÿJ—ÚêIëë6ù®W3®M[ÇçµR‹Kž†Ä{Þo°Ø'ËàW‚¨Üš·W½e«•Oµ$ª=f´µê†ïÝrkñ¥9[á’ÆZÀ@Õ¢Øzº0§Ø„ß„kúMi™áî­l0.ß4Ö¶kNXÛªRÁBG'üA±újÁïµÙÒ^D8tøñÇ6›¼ä}è{É Jˆý9.´Ÿ$"|Á0…Ì&Ç!Þ+lßvOi™wG¦ó£ ZÖä„®ù*2nTDI,¾¬ëÅæ­6Æ‹IÞÛ¹¥LaøQ²*;roк^‘Q2âISÕð•C¯3¸ªFJã­AñÀ_“:å‹Þ xPyPƒ=Ô?¹ãS÷œ³˜c˜¦wk Š:dÈ+7½ßû„Žcç˜zPiœq¡[O#Ð7<øP}à~ 9¸,×gÎñR¾=·Ì©Ÿôîã×>Á>é.|q}ÉK<ó–Ú˜!¨>¶£ÓÀÆùhʧ·/{ÔKV[¨"“aéæï«éª,Š^‰]s×6¡4C‹Y=`ìÜ(G>¼„ÜÃ>œÈÏQ|—ÊÍcÆÏ¾c&­ ‹Ž².°Šßu–CQþÍ’æ0´Ó…< ƒaP']}¯‡êŸ&·šYŦ¦££HnO@ù.Š­F³žgxÖyå_l¦å"ÅðŠ:3k2wOžè÷ªñ;†øÀ§A.r½®C§á¥.埯üÑÍË5C<в?Lï/Êo¼ÛØÙÜsêˆBK™­Ò:iÞ Ð`ç'e~tk«:Iýá&¹wÚÐ:É´W¦¤˜Z]#­ ¢¥ìw™ÒP—u‘éÆSüV–ºP£‰»Õ¬‹m ³.i˺6?ÁNPÏm` ür$±a]÷ƒ†Ú÷öÏ ÕNíÎ3›¬æ”͈€ò]ÎYa? ½$HèrŒô%kèt·1®á:žèÜï´£¬p,ëÅ5d=¾a <¦5`Ù|—ѵª+ òs™ vû•|Yª®cIAü¹‚ImÁy]}4ægon EtTÕÑtzñ›ì0Â4ÖΤ ŒÙÚ H^ «ô ÿÝZ¼»({ÔïÚ ïaªëZ=­«RMýï£ÜûŒ'ÅŠ_þúÑòIzx”‰$16‡p?$¸uP§Ëú~ܬ0ë©j]…‘ø5¹ê. 8çYM›ñš2nök:ÀÞ¤¾töÝ2µ¥OeOìðêÐYëGÿìsJ©Ÿ6/×#áÕ¥ Ùý¡(³| OeÇJ=2OvžÌ o[S†VmÁÜPð1ncó§ñKhãSùÖÐ׽ɠ^ùWuºz>+§x‚àÖ5‹0ÌpïŸK]‰'~zÉÔ*ä#i]=†n]`Ú”u½PÿÉ=•†^äùDÆ1Ëïš±ïYýÝg»M1eìž & DÊã%÷àˆÇz…õÊ¿`aWMÀ3X¼ÙŽàÖºÏe¥uÔnÍ“`ÜöƒÅDÂì®ÜÜj¨¥¦+¬©´‡VæÌbBf:ˆK„„S½lô!?`àÕv>¿ÂåF”GØ[Óé:2‡gì]nrlîÙ$kNÃú ²®懴®Â¥ánbG黦UÃwíÆ¼WÇ"‘q¯¢0‰è¾+äZ̺^$œë’0ÚuÈwµ»²½ôŠÓÅÌÔÔrˆSÄ‚×GŸCEÆš P+¨„Aíû'«q£»¸”¡¾[QÉŸ™B­Ë÷Êù­zú®Q¸qfk̃¹«£/½¤9œÆMãî¹å×lDðd§;.ò¹2—÷À<û<µPgÆà£)é)¡ôÖµ§ê‚¦‘ ¬«Ý£O^ä¦?l­â+1Þ«`2œö@Ü»_< EËÆº‘w‘FÀò®}#/XÁºj¹ŠèeIëý€övfprcÛ–£ÉwEN5c9±â“ôµ®"c5už^!Môhž+©[ ^7>ý®~æFwï³ÊùòëÏó“ú u¬{ª©}2€žç+Òºj[Ÿ½ø33?{¶±ä®VŠwÛ’¶sh±ÐQAA%úUEž=»"eܩӽ·ž°¡m/.2|DcŸOʇ>KI™ô{¹šhSКÖJ¦áö+ºœÒì¥êàÕ)iwÏ$OÆ#Gj£„#óšqŠÁW¢§ï{f˜lõ†?·ÛdãÉÔ¥JgGÂБßyäÌ&ÄAxþǶÑÙò]xš”¦Ä$(M}<]©‘l|½•k$Xzâb¥Y¢dè¦Þ®yа†#cÊñ‡Ù„hm%«{·Zá|²«W´ä"ß³ŒÑë¶tWàËVøÄ%O7×Ê"ö˜s²w1aå@̨dØEÂŽEÞõ2e=¥÷ÖOe@-¸{Ü¥Œ“Ü(ïQæ®Ý»uƒ‘¿Bºíx¯fF]qŸcʺ€¾ÎÆ}§)÷]²QÇ:°¬ùMW"a-,Ñ­¢L³Ùjæ<@f[ú}Ÿ¡ ™i-r6ÏpÓ ß‹EÂ5ϰÖ-é $ûáþ .è”ñQÏBs`[•Õ·3“Ùk\_’p5‹ç1©U­ˆ•w82wk |Ö ž?¿ú¤o¬ûìüHɶ¿2µg # jÖL¡nlhF7u•œ•ƼÄ|ne‚¦ý£eN«UêèÕS«ïCÕ¬’D2öêñÓ…À3÷M•»J_fjïßaÕ‰Ù‹w"‚0¯FÖÛIzåQ’kŒs›>y®0'±'¶n8‰Ý9±E[%1J·fÕÙËLv#¨Ÿ)Á+ÛZ£9ÛëÈáAéS„Fˆ°›+r¸^€Kc'î('ù jÐ?/=ç?VúÅ%‰mD êÓ‚ ”y™ÕcßvqÎè@GÔØ¥lê^ùž®Rn:²5²Ï ®U“}h¹ca}°02B$„`g㛘Éñóž_®× H-ƒ\*î$‰Qºéðd*§CÈ[yp>åßœwŒr{´?{×—Z0½Y0,‡ =èwå¸Õ€Æ;ßÌy*N¬°.tÌzöLÛ9©œóÛ¸PÆ Ûˆ±‚›Æ›ùÑÝ[æpÚZ:Ý®íètgs¡¾™fP%»Ze‹Mᚎ€ ê•^Œü 楶à “”›CR°ï‚xº)¯öfÞåÔ ô]p‹[‹xí[âêÏYI yB OÍG±¨9ê<.çveÿXÄT“ Z7Úû¨!½©<€ªà§}tåîlÚÌ%—÷ò¤+œ!ù>idS¤Ç'jŽzsž í@u\^NÀNßø"*­í¼†`eæ`0ï‘‚×·ß|–qóɶàÞÖøIv•ÙªàFö“Ò¿LâÜì Ö®O0H©õÚÓwÕ3زk8lý_è°L]ê>R‹óÇ`‚.î‘ .±ñýxRÐ4Ñ·=$ôkOðˆÓøµ%ÝÜú>§§u¦Md{‚a¿D] ð?Ѻ0õèUùÙûw>³$)äl§§ gîÍ̲iõìûIãvïxQÖD¢á0Ö•¶¶BfKC+¬“¶|ˆŒ¡œý¾Ù嵫1½kãeÎìw¡Ä¾„µq{Š 1«°‘áÈ¡1þ[†2T†¦ù˜äfVè¸É¦/ÕÝ2â½€Îùý5zÖ ÓÍl€SBÛJõäqk"kæ()3 :T¦@ FF â[¯Ò–&§U §dd¬ç³Ï8×gã¬T®vû,0U­S Þ°áKuàoMnm&ç@'Ø ŒÛ2µÖ;Co>LÇW¦K1ÈoyϽty¨æ“ölÄÔ£zà«d"K©Î®ª¦w¤–Ô4~9}QÕþµÀ'Œˆõ6Yí&l $Ø„Ãè*@7„ñ_R9Xzæ°Ûþ” MÕv6¨JiCuÝ« 8<€*¤&ÈÇfç j¨Gbè i\SÈ{fW¾•òÙ{JkIþÖ‡6é(‰PA`”uAK-!A5dT»É=FAŒXg ¶–@vGz& *f烫?T©wPÊ"Q;–߸…ǔݽlx«Hhó ŒßH‡‡‚̦µÆœî Uæ9¾Ce_t«/çxÜnõf·ø™ÍÉ^L/©[û\Ê•ö¤OÇÝ… SêÄv€7+šÐuò(GÉ àÍr"ÏhšB´Ôh¡×8¼;ÆB¦R®ôÑ3QZ-ÏP Ö3ŸT®t±':‡Gõ>IPB^b7oÏ5 çÁ"ÿJ/!8ªé\È  ]-Sk¥|{ê Îš?¿¤b.õ&cz¯¼˜ÚnSÖ…µ¹ôj³ªfì¶u£½÷šò‘Ù‚óÒÁ–¸ñ;öLã°=ÁÓKX8€³ù ¯ Käl\ÀZµRÄiu ­ Î'YFÉ[na)w.Jê‡N`úˆ=aÅ`åZ"ì`Ê´¹gê B r/Î~ÖÝÕc¹±^çÖ5¿;±/õ›2(Lb/ïPµxg‡ÃJd,dõ£_Øwvä¡Z“¦6jS%P°ÒÏ‹íd„3;µPLçàÓôõb8s¨uËRJéUuk ü¯÷Knýåærqy:ðÿÖ¦ìêù'Úg3—¢Ñi_…€ €´/·±¯â—:cÛò³®ð*'fõÝZ *ßâÊ‘ïœ9Xzñ€; °ÂVèRl9ŽÑèN€ÕCLhLÃA©k¨¡›é9ùd¿Ò¶GRB@RNÖ…z4}Wc›ÔA¾‹|FzB•Š IY O“B%ËtÈVšZ p÷jEé٫䳦ÂÒb– 'ºáÛ—÷êùÍèF=:rµ­RåüúmºÂ]n•³9³OõKnÐ%û'ýd'eÍ™ÖC®3ˆjáSx  *VeñJØ®·µ ~ÄÛ?²‚ž.q#5«*–ÎáR»M‚(õm”:7SepÄ &¼ËàòŸMšÂï+) rzIÒ¡• ÑnÌIé>c(ç‰Ò©Òæn†»KÒ…—Ë ö=dxöä jè%[ëx—E*_+‚SÐà83—ÞúÈFa±"¬ ¦¶ƒÈÜ©Š]÷ëT\nŸ–kS,ÕÊ‚*|žÑpˆâáTý®«dÔì®æŽîèƒXŒM…È}êxôÑ{EJ†²I›÷Ü¡ƒ[‡l¢9˜h•£}ëÕ×Ô2èF™Û Y³Ðß"ÁÙŸáÄg "X”úói=²—!¦wxg¦»j;{²,Þ;CêìŒQwj¬YE›[7§sÛ )ðì²iˆ0v®ö“¥Ü‰®² cIùÚ¹I]ûHÖ·WÁ¾JÓî5=Ô]]¯žXçz× ¼Ë¦ù©†ðJq*T?„#ÃéÅð6¸ÏH€yÇׄk¾w,ÙLž;gdtªF¬¾Óî0•߸;KP´Rê’AAç)CYÙKMȬpq Ý[ÿ•ÆjXФSìƒíOƒÛŽ$V‡´“¼6€œa]ÀþIµÛ)ÜSéëý³C•›Ò;”qå Ó•‹Ë·ï9œž,€PŸWnTShÝÆŸâ-`DѨŸÌsòC£ô¤RkåÛšk*ÀÄ|(ÉÅ´®fZÊrhP/!£:_7ÎÄ¢;Ô‹˜-«-3u¾§/HÄg¹%³¹S”…DZ.5uußJ‚ –‚´ ÔÍØü,þ˜ûLÆÃ1«fìXuìW| ~ÐJ2m¼Œ3³&ŒùÓ„Î>i]@~Ԥ•Ñ7*[$Òu·~SõòÜ#ù‰aêå §’ëÿÏ9§:áu02LD²8”ûs­ ZH†Êàðrý³­ì¥=ù!Ò*Î…;Aûæ~)kU=z¢* %—²h\´›’%bþcßíNaÂz:•µ‘q~„¡ÇNgÓ¬™ sX±äBe{äˆFV¬hR{uA¸!Dl­‡äã,W]Ǧjü èýL£'„µÌ‘­ÌéViÔ£­&åš®ðô)¤ÞtD/œEÁÁ_—âÕÁŒ¡j¨vÇ—‡tòÇZOcwjwBh¥"j¿5,Ú8?’ ‘CÈÌoYßT%Ç“=+cæ³V¹¸çµSßEWˆèµÉn[ I–윫O€ÂÔ'/õ§æ¶i}jŽ€oÔ‹ŽÛ~ìÒ[“@ÿå0µî<ËE¦%¦Ë_¥È»–£Ï:¿„étMÕõ6]ƒÏU×{°‡Úm}n¬É °KiC/å1Ïjªëøà¦ •ýy~­¤"¤Ìe]Psªt’ |•Çdqð`Ô!™m”k裗.PƒÈ¨3ƒ?«)4ÛÏHMÀ—¤~u±‡„‹ ¤=eÔ˜v+ã|Þj þ¾Óæu툙+ÖdJKƒZ;ŸßL­°j£oEŽçø¢â•N´ÏÖHY:С,”“_šMêVš}çU‡‚Κ6Þ,3¯®ô bššÍ·)…vÞ-v‚3?Ñ‚5õÝQ. „T¦Ö Â&‰ý:Y«Aé+Åì!/å-æå"ÒŽÝt…ÕÑÒ`o9­ëåPôPxÓWÑsó™ÃK®¨Ö̓ó‘Y£ü²cS{§VC7áý݈Á§ñ¶Rù¯œ¯¼{?'“Ì^©Œn~‘ò6þV¤|È^“âó–•Å{çŽô8mPÛ5Ǭ² àêÊÐÙ ‘eïHy?d)7ÅiPÅK.Ç®DÞåÚBžwMŸ€x°8 Ñº^žTÒ!Ô“Ö5ÆGM½Õ[ä†î)Ô‡Cs}0:£ï>©†@ô´’mh„ª½ ž®ïŒ£4Îà=­°óîÛð§^™ä»©t¦ãÞÙ~å¸hwýƒEP>¬í¦v‹Õº.6Ø_õ?žBÏPdÌdfÑXÑ^êÔó¶•5¯uÝÙ´¾ºú3öÛis&ÑKìi^uÎɲp±!s@TRô¬Ká>4¶GÚÐ{a>éÙ)™ï ¤ò«ë¯fœ´”]|YĽ{ï‘¿Ge0ÄöQ˜×æ—ÙþÖå45«uó}ãVì›§Ûh=”Q‰×}×þhW·¦ìÙFOåÁI?;˜»“9ÉóE†2È»6 pu+ýâÎŒÌüþÎxÜÖÐÕôþÿ1жٚ|×8GpCkVfž™‰ÑZûÔÉüºìª¸Ve‡œˆ‰é˰՚-gÓC{Üû±m•èf¯×0¾ Ûl#ÅDù(ܺЊ–Cʩ؊íùCϳ¢ ìR}u½¦ïûÒv6&©×þ½}ÌŽ‡Ž\~ [@q/¨ç³„1YŒ¬pPEÓ¥–Üì«G³qsPúyƒkºÐ—wçW€Ig•KyAœbqÓŒ j ©Üö½ë`ÆJ—·?_xHÉ»=Øxú3ŠsCÈFqïgÕž—°jZ€rjB´3—|×ûå]^D7¼CÕÚÅŠr¹Óó{yR“u½@¶óF޶äDvIß½+ioíyÍ¿: å€â¼ÈÔn(`L—‘ÛJãÀéA S«Zúpð„é†o…I¼=÷+wÕƒÙÄ;JUàì]õú¿Ú†_‚ÜUÉ$eN%ÿ¹Ðê:%ØUV‘Ðc/"Zsš`mÃÖÁË6ò Ô.ä¥ñ´u¥"3pþ0ÇÈ6$á5VÿLܨ*íY… Kž©Êäà&)ïðgȨ&3¦²“¿q1ÃŒ4n³…·vOÖ­¯ÈKíG°¹1³1h7Í»'…ﲦO¢ôا—=gQ({‰`¡9’G#´ñÛ`ÀºÖK“©Ayк^n4ô¯ÞuŰÃóc9ù˾ê=‡Bp¤W*!È] e>”Û¢ùsžR}´ëg… çÙŸ5õØaîz+Nàb&KlâìUWzîüÌGïN>FHLhvg#Úº'‹gø §à ž£Ë«A=$ú C¥hŒ:`Â­ë¥øì¹]ƒ»šÚŠÑTä佦‹ë'U=!yÝÔ笘ýÂ4Ü"hm™¬µó¹C;x‹½Ü N3(™ó¨ÉsØs©Àz¶uòuîÁY2 Z9¯ƒª5ã;›–¤×Û•î’ æå“Ð!Œ†o²aÜ(uÌž±³—ÆÌ%² m•%ße²‚‰´Z¡ÁçèºÔm7¾ólšΪÖÿ«gµ j‚´ Fœ§°» %*ì+®>ÙEÈÄ SY—h®¬ðݲ¶ÛN^âƒJ¿ Â&Sq ÜiÌê±ÛZ¶,¥–Ú°»^?.ŽªÁ¶ëàȘ­SU$¼Tæd¿$˜¯¢.p [Ïzèš{†P û `jE™7ú‹[t!f5XjøÌûúéϦÛç33Ž#ë™ÙXgþ™X*Á¤¶*79±u/’ØbA• Ùr¹ªkißé¢pwÐ[bÇXÜ[µ^(÷"¶UË×ss½àåLbc? ½Ì`ØbÕ#vžÆuPÿãŠl£Ÿ…ÜãäÙ§`˜¶í•ä¶/%È)Ú¨Ä#[;¨Œlpœ`€žÁÅÅöF‹'çTÉ ~Q¼1Å?&>Ïšìpu«ˆí£ ïÞyÖ÷G]ìÒT&?Z™P!{Ü[!¡.–ØH¢{c¾o²_bå­†ÿÕNPŸáÝ/èÅ—Ì ï`ÆbRÞœ Ò¨ysD÷¼{®+¼Ì=Y dÉäXr‰ÕR_³ˆÁ}əָÌ%Ö²FnVôZÈÀ\ ùƒl¾ÝHöh6´H›br®x¼áá à6ä:8ù¤}ä;nš$d±´ðj*J2Âáièß Zü®_áKªu¿ånæ]†°-9Òb½õêIÓSM®pÛF–ÝÞOW~v×Ɏ˾Ži|×XiPu²sa»Š^Øè¬aBTÆû5>âyõ“Ê$JÁbΙ¹ß.[oÏK`éy€€›Äÿµ 'ö4¼O. ”Ræ¶ZJR%sqëƒx•F(УfŒ¥§Ìë)â>æNc­14îÞ¸ ×ôq>PÉsR&}aØâ ß®Ü¹k%vo¤+ÕÊ•˜¨iœqÝhŒ™Û–'ÖcS®¹¸—þœLðJá¶å¯ äæHðÙ.'w/'[·$¤ëÝí—¿0)0â…á±ÞÞääÈž¡-EçÈÙèW66’BoêW?g–0/e©ó‰„;Blñ¨/Gȯ>ÎFf BŸ„éàa`¯ºö‰a’\u4~«ÎÝ=ü -2L¬“%aáarÐÊ#’4ã¦ìAß…ÉàînC导œ’âÕ¤á©F˜Î}8ä~=…_ êzèï§Ò†lsÖÄÙ o¾£´nñ:²ÂV?\+/>$»Ê³Œ ´íÕ6Sç]̈˜ZÕ¢0ªœ%--¢Øf¶çëù¬&ÖõUÐ+mÒXAòKu«ØïVÕù^+©.©ýyüjÓØ"Xî¢a˜( çûG S¹:gBÕfckÕ€“;ùcIüÚÞS>é•\ÍÇsÞ-ÞS”âíþ*b…äÇØmÌ¡‘bùÏ(ƒ\¿ÉA)£æG%–ä›KMú®‰\´BpOV&‰Ð&&Þ«SIùdTqÉ^Çú0…êǘþ]%K ÒÙªÓÙÆ•©í/4ÓhËýØ~‹¿º6¸WXÚ{^ˆ‘q[ƒ*­+J/G-¨k5vªx~À.-ÚšÌTÌQC²š~$Jíÿªä_ ?s¶ªåv 7¯ ƒÙàX¼lt-b¾Ÿ”H¤ðX~ïGiÎØ® @Ý›¯¦î½r3´”Kñ”–‡ò¦ï×t°¢á¢V1Fs²ñ±C×Ü1X<÷AÒÜçI ±ÜR¾ùrèÜØímSh&é̹..ü ~Ð*õ9 Ìæ² ±Ë;B ÅÒhÁW8*)¤€ÆüĤВVûÕøõS$Ôö‰Îå“̼púD©ìP⮞:/q—îPß*£JîÛ Krx¦¯Íyƒêå3ª>?ÚÆHÈhÿn54pqý‹ýSvE@1Ñ?x.^Ð1Î ½;ÒNÔÏRÄ»ÍQWÊfMÚEȿȠ€ÑÁóÍ¡ô…ôìÜóµNWMt¦†h³…¨•Åí h*O9¼ÕRªï½çäÍ™ÆEºôüžŸí2¨[;U­mô=5ÓœÚͶԶ¬ D §úóÒÔ8“WC-(SCš£Âb× ^ Zƒ‘¡°lÁÁ_$Kî¶jW¾ÿRBä«ÈÄÕÛ*Kv¡nzèÈÞWŠ2²=¯ O‹ ‚‰{fPõƒ[–Â#¬ë´ä/9Á,;I‘HÌddî­Íäœ}±‡Ô-.  Õ7ýÿ ø“¬ £–”M<§¤¶ —˜ÚäÁÛ?*¹´ø}®N{{ª®ClÉámêß¹¨Y 7ªe©ˆ¬š’¯x´¾¨êŠÞ1s5 µY µSu}7op´ Œ™EÆú‚aJ2özèð.ž,ÉZ–-nM:²uS /‡$âVuî*GÖΉÁ„è· “m®Lž«™é»Æú¬¨`“¥@ª¨`Üw™Ø êÉ#˜éÙþÍO€ ÿì­¡$l¿Z‰Ö…8"­> Áæ‘»ZϼÒ] À+»P{Šj!ØúîòPWâe˜ÊuÂûµ-«Y½¦.(qê?ªP‘Ñ%CÇæ¹Ñ|V0õ_mBPºÒ{ß:M“¶¥ËKÝÎÔpD5´ÙLcâ¤h’ãÁï¼'¹G›äk[_ÁÏèæxæ¶güröÙeèÓ[¦Á}VWêbƒÐoÈ$ß“Hù\ÙÂ$G†ûîÌêçMÖ5‚ÐýF§2ž KÍu¸«“«dƒºCöÏ®“¬ô»¬ì«¼¼2OÇ¡ËïÚ_BÃd}4"Sò¢‘xÕ‘zMè-Ì’^™-¤7­QЇâÚËè('k›Ô¡/fÍÙ¶äyZ›ÌlP[^ªÜÙÁM©vèúÈXßÝÚ²iL•BÍø±!d½%ï |³#¶Úè¦P•ÙôÉ{«øgضôÕn?Ýów4I“ggŒéÔà³Ñ)„î‹Ûí‰W¶Ž&a 48î—¶&YS¹ø%aMI6^rØÖRk£j5Ñ]E/5ó³¤èEƒã²Ð´êpwÏñb*Ï$Q´'Œ3cæj¹¼œœuÞ Æ —ùÉÝûÚ$Â$¡²*ÛÆõ¯ð׊3M»u¢tÝë-뇶Ñïi²Ð8p­ 쯛5ãFä§Üã²ÁµÞ«RvðQ=ó­kZÍée÷Іº”ÁENÞN$xÆÓÞ§ì®Æ–Lˆ¸ F"œö“¢VýìžuÁ:)Hôž+õÓ –ûåœ}'+JÉ, ëÂ6MOÞ£ŽÖkYi]s6÷Ðó.—ã[ƒ ™ UG‚|Þs›'™ÐNHÿùæÖmy $ŽÙaÒ—Ã?›#]Š/–jõT…Xíkc·eºðg•T’xá¥fþîÝT0|ð‘»:}¹+¿Ë 8®k^x ¨Ùè 6aCSŠX¦×Ò[1T©~|m—G™‚|¶uB ŒëãR^]N9Y Î6$>™\MlïNæ]`Ji]AsÕMYÐEêÖâ­Ÿ«ÖC=ˈúYy ®9éÖa¤.cdÕyw—u¡ù• ®Y¤ºŽ{KAÚ2fv]ß­[²;ì3fs}JÎg|é³úòÅ¥~ Úé²®s[QÍq›¯ûæH5·úZr„ZsýÓº:dý<]|¨æŽªÜbãS²‰´7[U®Š¼ Mø.ëzé5-òØž7û]í³®Ü¾Tí“;S‚ýÄpËãñEÉU‹µãfÝœÕ*§‘}‡W^™“¬AÃÊØ Ñ%aFãŽðk¯¹ªÎÓÖÈâtÝT]Z–ûB}á` b·ôÛV÷|4ÀGjÎü‘’Œ;˜`§o[zµ8»ø+[ùšÍ›Ê›siœaMæÖ4¨Ús&º[MÐiÈ‘½‹#o*H3§ØæÞÙwh¥'7-˜½Ô¯¯þè²®˜?¹uuéšÛ£UôB¹5™yÛè”nø_z³E=Z~§ò4JÐ^(;‹Ž§÷ªعz¯w/yÌ^&‡À“Çæp£}®R²ÔWÕ–Û~õÕu¥Zǚϲ®IŸû[}K‘ñÇ[Æd]7ÜqÌÁ™â7ƒš³&)Æ©žì²9™Ey×§md-SòÐcå<ÑA ñߟ 3ïBkge¯b†`DÝúÙv.MÝŠ Éã9°)ýiŸÒò|®!·öpMÞþf°pdè–«Nûìœ{*7­ ².Ïù¹ð›¾+–aÌo)d 4ެ Äe<Ý€üü” ;iwìt¹uµø’M•ÚM²CFFúÑx5gjð½B໫ÜIzËý°\€¸3IOÀ¨søQé"›Ã`'™—t‡} «ïdϾk²ï‹úÙ;ÑKpð¤R“ú™uSo'öÝè©vJì¼bžÀÈ3L&òÛÈ„‹i!hãY=xsôœSRÚ°í£.\fÈÂã“hgÞ!KÃ!‡¬ð”Ù­Á©™w½\T ÔC˜†cÀ=ŠÇskSê„ ®´"Õuè~«µjtR‡¾ ¡ŒÑÙ@o#i±¼"ëÚóEFÜüAc}÷›Â0°Ï¡±:úÍ…  ùúä/Ù}% D­-i¢Þ7fZ׳ By1©f‡JÕé)4½gS‰Âû5Ñ'6P-³ùhëõ“ý+ˆ’èîö]Í/5fö¨ O/z-fè¿ú¼ç*#[ˆè)ûõ^…24cnÉžéqòóæŠ!me˜¼¥ª ±âNSCÃ…%(l0‘7[ v •½4\÷®  /MY33#Q -{´H$äEêe™‡^*õØÁ‹WY$ 2Ùë5B±‘ýØ—„Mý³É¨Ýâ¦D‹Rðš°ýu½Ê‚Š6h"õäË~VØäZ²WÿÓG@vn1,„^SyN$ÁÀûfãiP(ØYfîf†nªHô]Ø£ɲ†—'‚¡5ˆ§µÆ‰¯|&ù*¬ÜÓBzt~/ %E¡z®·G7<\8Fm‰dÛ8KÏù½=]é6dj¯2\Š™M ,Él…¸RýJf”«¶5™›ÃŸ6.Ðr5ŠzX‡¹ÐwÙ"[\;G6ôÒ–¨9##dä­Æ”Ô«7]´cPl©2¼Ð†°-¤½h|’Ê(K.±©ØÂȸŒìX>#¡?¡J§|ÊÅ4CÊ¿ù Ù Œˆpw¹+ÈË ‰MðüiØÒkõUžãI*à&µëc|øó†³¬¢í´.ÌZ±ïË:ò‘¹]¬z¤œsÛ;q[ó|ÚTæŠÖ¿Re[ö4¨³X1\«:…Ày%U8Àg;Õ ÇOw6!O‡ögˆ²<„°”5íµsT=_ˆ¢ïB眬 *u‚Œ=ífûó*]w¤%ï÷¥jçö¥@cPë–Yd{•·ø¹¡™ ôQHÕˆ YWÊ ‚²­ðaBûƒ“ Ôêw¡ µ&DG=¶§Qi+uXZsj êb÷T])kªPaº’ë ·§Îè³ÁqDtê9~Ï~ìbóeb« §ØY“”Ý>!µ(^Ì=lΰ÷äñ–­ì mä~`Kn©Ž Òo TžÝI=‹Ð“¿j\«ä{U{¶V_û´Å6„7ÊÎÓέ ãÉ ÂÁð÷[)P¦ÊyV½lPùÝÊPªêWÌÕ¨c‹¡©\üÞ¶H²ñFžùÕ–ÅÄ0<TuëP˜Ärcîñ5ßð4üåwSÁIŠâÚËkÇ9زϧ÷Ô4”¾¿Z)g¤ HgE#ÀTÞ.h»©øÌ{åé0€’ßõé —¶éÈÐe; ²?CBÏú_ªGbp=*óX¡2ÑvJ>Ž)\=*êk0½'òÙ¬ÜÔU½½±ä¨§ä Õ_©®cn]K†²ÚGæAº×ùüÀT¬âûY{zíS¹bd«'‚ºþ9lUfº%-J¡}¦áÈŒ®–³R|C¡/Ý8í¶ž¦ì¿~¹[u‡½ç6GWeþíFëz•SŠ?uÓº‚øÁ}ss´ö©› ÐK’ä]ÃÈ>•¢žHí²3„Fòï ª®ï”cý³gpEÌÂiyAk%¹{­^8×rmížò(s¤¢ËY ²ïíK;= Lº®Þ²%¡`Ÿ¯}¤Þf‰}{kJeöÓ>Wâ?]ÐFŠÎs¢rívUÔ­=õØ¡ Ïz»A +{Ù/¯L±?ˆYÈw­`X G&5n㬑ìÐÁ*'±Åˈxãk·79²NÙÆ0$ÒÌ›‡µ2Y׫™w™¾;þsf'eT$u¥¤ÀØKÕŠ êý3U¦võ^¡Ëö²¥©»…ò¦ÇíY(y‡ /Ôk‡’hž‘åæêöêõqa7ŒÈÄAÙ°ÌPSf¼ƒÝÖT…,Š”óe-ÝpŒPWk‚ŠÀM¬ðþe¢C°>)¹…”e”;>Z$òGÆœ ‹l®;ôJ=ö^Co0ˆzJ)`¤îÞ½%¯nçZçà‚¥ýˆî»Ån]wi´Þ/§@€­!HvM–®¬{W‚tÁºH­ë:¤Y‡u ö±`]·å6Ô8»äóƒÐ ´>é®Î`uƒ>H¡¤’®A@[Æ#±rë6 žaä[«ÂÍóŠ¹Æ……Ï<])-õ½#é2×¼™¾z†Oä/ëÊŒ_Ü^*Ö¸¤†³uç# è‰{‘6²uüÞ+útã&Ç^®{ÃP†(®fm‘¬ëäæ0jv¡\i:bº²?b¢/«léýÎGîé§Ùž37^°ÿ«O@rñ±®}Xó›uñ½šÈ܈º¦&CïnÄNGÖ5ù©MSeè"´™ØÔºgW¡‚­Ç,ÒO])ì ŽžÓNÝám¶|(²/ÍÈ~FF$Œjç@¥%3+űq6,‹ÓÒã­÷Wi×Óží¦ÂãË€r£g¨Á/¨µ’ùFk¸æ{–|hBô¦púþ†`À¥-ë[2¡Ù%·L7ƒúË–ÎüR›Yþ³~,#:ßMWøüØb¢>– `mÈ5™®m½jre¹Ÿ^ÚÎÒ²:Ë­ët5Z )@6ý àHÖŒ7¶Ð£¹x#³.°ã(2b‹$ìûTäY°"h^=ŠAU:Ï»T°íF[ XH`ûx§N™ô¨ÿî˜ïBõ]íSGÎzÞLFaP¡Îçû9E™Í{HCµ<,èã WOÁkÊ^zîWZê§Uô¿l0>ß™(ÝàIô(×6U­m›þå Kõh×û‚fMõO0Pe ¦Vjšúö*@Ф‘å"¯É=Ìèc…ïªsË™‚Õ.W×רJ2ªÎ¼k2çùó^O¬Áò]kPGÀ4ˆ6½»©Å“3÷ø¬%ëz•øÎŽÄ*ñ%`ãÚNÊ ²wv\^©Ts[ýå‹[…‰­ÆR(3Z´®ØƒVù.ìÝ¥9̹zú¡*uö H•µÁRB™{[:½Q3â;'JK?]a¢ —Yk"TvßW?iÅ[W‘´Í?`àgwWáæÎ™ªÖ~´4R>أÇi£²“Ö…ñæ‘ApË+ßÎôÓ¦0܇«(,[màPd].ߢ¸ý‚\‘ ÝPþózæ–ìw·žÅM[+³úWt³áQ©. ³+Ò Ÿ“ ȘPá=½ “覶¸ Û›Š^…’È̤ïº'÷ëB²ÐÃär6ï“«g¶ÖÍ$,p=ú%ƒ~È(^º²«ÓnF¯— ±§hÚó÷;A) N–ÿì!¡à¶*…îŽïç_m!€`w+3 ~ö¹e]¯,¸ŠQ3€½j›òj+ ÜjšVÄl¼RòKÀÓ)þè!¦vdƯzÿtR–s¶¹u½Ÿ>3ÕÚ;Ån1¢•u –¬Ï:ø+VIïwÍUˆžŸF/ê—`¨‘öøVÖõªòÔƒzÕíQµ Aa¶w3 «Á;6ˆa¢dì¶Ÿº\ÍusdJWT9²SûgÓ¸-µþ»iÈ^õö‰ ¥%9C/ëc»’6ðkZñ³‡ÎÞ€Õ–iûï%5M˸8VTDå^tȼ Û²šgAÚkñ` ¢Žÿœ‚X¯üçÁ’vÚP]uê H?å® J§Ojç>c̶Һz@y£ Q¯¬ Œ:Jä1xÉWÌ׺õ f*_¢ª1ŠÓÔ†Q¼jΈu÷!ë‚ߤë¥]Ùž¨Â¢,|,æŒSì?ò]ÙïBoG¾ ˆ‚DÝ“)>TüÔ5@SRŸ<Ãíi@¼(?ë‚ÂP^.#z63K~r·>y/Ï`d4q¡žÞoQmòò®”ª-§Õˆªˆöl;}(8ô”Þ[_õœg¨ïFs¶|¢0t2”³4T5’æž6Ôø"XÏ­Ô´Ü~Žò©]gÂ!JGWhØ÷£t}÷‘Öõ®4³«gu[îj§„éFSKI&ˆöT팦²R-Ü”°®fûŒŒ ä|œ÷à'M¦Z¦Ä}~ Guȶí©Wñ¼,5ñ`îiò½Ò‡ÿºn­žßË·œªj5.žwѶºQ€çßÁÇéï^îÞï^Þ.ú'¡ÑîÙ‘h¦’­ÿsrð*_ž3¾Ðì»uKYÅ‹’5­«”ûéyŸqe]/Ý+òjËqÖ;¹žd`í3M“¤¢#C=ª6F³Ö¿>é¡cM‘õB‘«r(lÀ%Bs—”‡BKrˆ~ Þjí˜èì’;ÆŠfáªG7„­ 0³qP›Já>[– £•Kë*Ôê3ÀîØK¦VBºB —GɾXIrðþ¡ª˜ù~Q>ÙWqdÈÜ'®kd× Wns$A2ÆpC%ûXÏ>‹,ò¥á‹yüKIÉlŒ7eûu/†`£ÚäÅœJª—ÝÊ#FFàê/eYMV0¨þe(¥¨ÈÑ=õãlŽJ›gµ­ºîÕ–KVør¿üä•^IcFúmwP5ÞEß-D>ãêDJgñONòàÎæÂÆ®r&™èº32"ÑVÐý‘ |eWg!Q¸Àmã¿™;A«ß´®÷¢åû=š{ÞØîe(ù_ûHjêŸ,®Nû¶¸)9¹gÈ‘ÅÖ±ÕkM[S˜ˆÍT¿>Ñs+7ÇBwöä·:G«ùè4Ö=fÔ‘ÑX3yîkjz•Pö¨@^¥‘¸+}d*2Jå=†#[++ûv¶\ż-wžÞÝúdC¡üçæQ@YÀ¥*zñ*E²w„¨8÷Í,5®­Vu Ÿ¡ãÅ4‘iøFŸ.YAÑïRþE•0ÃÄõô–µ~s»cÜ™`Œs´fa™wË%³&±w[ºI§ÕNS›©þ9mGžÖÊæNXì¨ZxSwª"³‘Ugå>㯠žåøQ™Ãsj#ÖÈMcð2Ërg!Í¥GZ× º[u4"·¦ #>—ÞŠ÷Î'í¥¶”L³~zMÒ(Lnð2øöتÀɪ H¦´»¡ÕÍšŸ@;o:¥R™~†öqWýe¦²®z›Cv r+§5´2[.\}³Â÷ +9pLZ&÷w¨qÅÆÄH¹À 󃙪 ýh5߀I€˜Ùk&ÿমþùÕÅö^ûÛAW¥ÿÄÂÊ{5/íŽdfwg™edÔŸ¡8„ȳ”k¤6±FÈž‰ŠÅerI$‰wvjN¬–7AÕ8Šòʽ ¯Á€ÔªbOñm¸™ÃT¯ÞØ{S»|ñ`ŽQ„Æ'ÏŒ£qÈ“ãäåálFO‡÷^¤•WEùdt`ŸŽçjlŸ!V\ éÚjðý„¼µ8PnR-ÞԺ‚m¶®jˆôÆÆÙJƒjë É ræµëǺ@‰”\$e,=ç; ®›²ÞHÏîsº5[‹­>oý¯IÒ/Hÿ­àPAfs õ½õõ$ÔÆm |gÓs~‰ + #Ó«úhM}ÒgM3ž×ia‡­ˆÍJ*{`<‡¨˜¡3ø’aõ²•d< ì±ù}M낈f–Q{0ëŶPÏÚ •Ü¡ÝíCg@ È éY!M©§W½]%™ïÖ%QðkÚ((M=×Ü'I3L„C", bè 3³Ø$[µ"•~ßÊ5Jj5À»o¶(ÍRèð¶ 7(Q‚XŽ2o0mÊ}V¸yëÿÞíד›?uLÓ-‘—O:Áç>ÜžÖÊùÝÇA)ͱi÷M†%(þÔâ¬RúBÅWC ÆÑJ¢ö9WR–Ü.½rÃM6g±ÌÔ? l‹ãÍ_ï.>ÙAÿérB4?'iûÓ¦5r…wô)³yé'° wy©i“ðÀx@¼žµ—¢«[yAèõ®rkÙa,âü‹ Íw5d§ú3‚n@ÊS‹jªs´4Œöü˜J•{ñ×pu¢X&5s¸»×,ØÚw;§¬"Ë}*›æm7ÂÅÌ„ OlU£Ë4¤@JD´© ¬hÞÔco›!Ê~Þ`¯É[Ç©¬ý|Ò’ÿ|µ2iXt f`”,QÎ4Â-ªÁÔB<нÚÈòo–’pÍ矴µ‚”|(Ö­ú$k{Õ<€îéæDgåQ^&Vl zºÂW¢7Ùç IÆKí¹`Ùû©:÷ ^®¨¬ôÀ'ðÛÞwسé'½ª€Ö…æì JÅ4âÿ!ëMY½µR¸áîš{óŒì½z!—W^Ä4•C:>[‰-žýf'óeͧäéZ6ž6×ý|y:Yé½ ˜ËÓÁìå9y²í¢9Ô’—ë—Ç,Ýã¤Ù€â“Ò2ËÞúË;Ô‚";DÉ¢¾u²óQùiµ¦©Õy)zè䶪ØÑ|Î4üdéãöJ:ÅwÙGiÜ»„ñ)NÏ‘‹«e‰9U™²”ò`&)AžUæðbinh@pdû`¥Èø×Ç—ê}uRÀÊ¿Üpi\ÊÙ\•"rŒÒÐ+¾oú€Aį1hœÜ3-ûãâzz~°ýÉ3ïtþÆ Ù ¸ýäéÇĆ*++¥÷ºð è”@¸µ%Eý«ãº~ ÙBÝ*œ—0¶‘:kg(Ð%Lòú—94ú.,ÒNêÍa¯zQaÕ°"@Àéùzƨ©ÊZŠ`àI'ƒ­ªf4é¸ä$ÑoÊŽZ9À<@c¤R=·fË>2I5Bµ·,ÊcŠÛ­ïO Ã9±Ô¹GWW×ÎTëÆÚ¸ý¾{)ióC‡k†Š«ÿEÂß)±njÍMøRwò{°1ꢽĪŒß×™7`iè`..ZÏm§Çì…ÉÖXll{ç)v±Ô.5€Uæ¸ëÓ JMÚðç É·ŒÎE£(§ÑoK‹?‡bj8¤Tt3Ä’dl;”´µ¡ñ¨2µÒ¥.嫳.n-Ÿ k9)“þþ»fßhŽŒ=Ÿ¼ ˜ö“‰w·‰W9qp•wáý›i¬ï>æXýÚ\1ZÐBÓéF»…AÉ™¢|?].dÊ Æš)ˆ‰>AüX @¢ù ?ƒ¦CägÒ˜½ìåó˜÷>:É ›³Õ2Se6ï÷u™¸ùäy^½—¶Î'Qšã›†÷³¶ÚPÏ4>â-C|îµ.5Î@ï_(„hxÞ¶ý°•ߺóÂw¥ ^Æ*]l GöÐGÐüi:èýêàù€’gxÞýsîBF!Ý2•ßöáÖ3)𑫮ϊõ'$c\u}ÄumÙ}R½|îšúÒ·P-Þ 0‡¢:¨ˆ¦Ä`›ý³›;(mѤ§àÚ•ZöÖx’H(¦›­gÜ>»’~¤ÚOãÁø?ª®äÈ‘$†ýÛŠv #ò> ÿ]ÚI€µ¿­•F-U1y‚@û|»VZUM ¯}ü¹ _ûG!Ý÷Ð{¼4±Ð1ã Î3DPaj&]u}ŒuF¼©Û zx‡3šêúÜ350k ­ü!Í}Óºv,ÍØ£}¡žÁxµ)µh,t…`Þ‘ fç×̸ÝOMI¿ç€™á‚j\ö6Þ;Ãì·#»{eýGÐmìQdP€±ËÜ {ÿ"ò?Sqˆ|T¶âÌ^Z×5±TY×\;uÍAø#ƒzÇ—^ M¤ÓSÚg ¥Žh7º©U5]Î.^®ÝôJ Û'â7ÖU×ÇŽËJ©á{+µe«±$Èîú•lFb«\u½6_‘6-˜ç†Bp×tJ&eAÏé}W]¯½‡J/F7kŽtJƒú~¿Ö‚-:õkŒ¥¬·„xD<¿Bmç_§Þ2›yÒVÜ-Û+ƒ¿Üpõã£b47%¥Q&nùŒ˜ó˜zëÍÃ&Dþ¡ÿ;êØgtïWj*ƒ•B¿ïeWU6ý2‘ÚyïÐÖìÿ( ë©G6ëÖÃ\’âub‹¡ÌíÄ”iú G¡LóŸ#g_B3gäÅ¥l" ÈÁ0aRÿDÜ ã¶ípdnô,mÊǽ3Ve’=z¸þ#Ú2µÝŽ3œRí¾ùš;6S{ÉÞ™4µ—UšÏ ÕõædnP—¦8ε]y¨çŸšžK t¤]@Òhêù~KÛ²]fs£—µ¸ŽÒœüHÓÙ’çdE‹%—­ÅEYA¸Ù#M\hn×T †´SýþÕ­ofÄ*Û—.½•·ŒkV¯)'ù*~S´„«‚…9…2€{29›`—¥ªð e65@†žÆ­àž÷¤§7.º-[ ÝzeÌT]5~Ó+À0ÐSÇ”±> OQ°]ëÛad‘§¢ö}ÿͨôg¬ßSG©re’àZ (ÿx> JLjr7CÞ9£(z½;\ñî :ÛÏ…¬t6PðÊç¬F¤1¡1r ³i+Óœ».ÇÛÈÝYs`#¹ð9oëý£9èlŠô¬uGÛGUð«¿BÖ­¤:;øŸ2+ )úé ø†ZþËÅm‹Œ/z‚ =·(³å…Ò¡5ëÖóÆŸÜøKl£u©vc|$õVèXU†Ó-1J¿Ø•v·ÑþdÄ3Ž5õqX²—ὈÎ~‚mZ-¹B¨ˆeÞsɺNËýñFëX²®J5䵿 ´À,òùU[PwáÖ‘yóX7Š%§¹d ÜBsðù=ßÕÒÙ¼`e³Q¸ÏH¶çGîªS÷iÎîtq èuüšëÌìÐgô”™7©$ÁGÖÆ'¶RÁËÔTûå§g¬—0Öºò%¥åI´h–Á5¯¯ÍmÿïÅ,§D*3B‚­G:¥Îž&)ØG•º)úyåþΜi]5Ü܆ÆLÎ瘙4Ù·@r8Sâóý I £_²›ì³¯ö uEz(ÆÙdw³ï ´¯*Xi]Ïòô¼C1T ƒ®>½ÚíN/£öÍ‚íTS¢T±ÁGQZOÕõ«Û`TqÎ-åÎæ™g—hM’i ¡òk°šõZã„õרr ›ëhâvæPÛ+ãNë” =g“‚ƒP.žþ˜Í$„< 0ßy[KcÂ¥|ôj‹LW{Ø4!«‚õc±<Ý»‚ýé3³Â*~ÞÚ¹ÞZõ455¦+sùrÎbs=ƒæó‘ôqmé”æ>ÆÀ,äp0óŽóç|6GVX‚*Î;íµ }¡g(S÷”5,@áþ‰­¯®(*a Î SÛ»¨HwœMTWÅ>´/6¹¹•hK©»"C7l&ç#;«™šåt—8Cf°Óî„1 xyÕiNAGg±ôk¿¯*$,ð™þ‹TÓü,uʇÔê¡ßõÖ›}i칩óôr&^¼e|ˆY‹ûÅ, œ;ôûf0½yÏm­O¹žTð]¬hïÝ)¹9ØçZ*4×vÒ/&ΦuVKêu0¨ºÔÔªm}ä j¿Imò¾*g쥫L EÂDÞ–sº&<À'p¨:ÀˆsìO(z’¹ZVËÐæBþI±÷_ÛŽ›J•Ÿ}neÔ€N+Èí9Økº€@Žt…ïTLÝð—F Ýc¨ýé•V):cÅéHPÃõVÿ¸YûÊD÷Ö.5kÍ ò{°DXrEF7ûƒ¯|4a­‰®Îv*‡\ ‹órÄŬEãw¤d{a‚L¸´Nn½íýwÊl·~N~ôÅt‡ Φk,u‚¥„©Ö¶>²ðA\PàNÉ—8gTN*]¿P-Ø‘>ãÈc¾,éfÜF?]nMÈ(Õ§DkÇ˨5‹BÞ ­Ò ÿtSuö=½#ƒ‚ì°*çK…q± ì^Ÿ©4„ßš¾«” ˜2y”^udnÖóæŠ=Q>ô5nRÆB%MøÊ—±Ð PµµƒˆPã[°•$±–¿\ÚÈ:'Sé‰Ä$âqmÅÎÌ0¤ zñš@Ü2÷©.º4œ$`#dóžoÖÉLj ´“>®··†[½JìDþÈ Rþ¦Òê~ïvÏñ4x°ó'5QØšZÇ?7¸Pe%ø =ƒN¥²Š3vöUæøtñÁƒÍŠªÝTnAÔJ!o”äà>áÉ~ôQe(¯p¥Ž¤‡ßÑâ»Ý Õ* •3}?P·K¸˜ß˜œf¼šjƒ|‘&ܶí™;y/©ÿrp*Oÿ9ەПK4‰¦>ÄÀ(Í~,ÈšŸ+î:Dñ* .ú±ƒkãF,“‹(¯²HŽŠ+FÒ^¢ÓV´7‡£%{Ì‹™\ñÔ^˜a;ÀÜXÂ/_:™TÚMù¸ä®F€|ÝÔÎØú¨¿ÊîÞ—ÑÉU·–,3°C~· tú.ôH”»CvfÇz£× ¤5aP5ß{æ l¶Æ|Ó]Æìj@ç(7z'8û%·Wb2á7ög0ß&gøéçïÈÚrSu N ˆIž,A÷ŒÌ7ÛÐ>æ­—›1¶‹–;˜2i±~BÁ’nÚ¢ á0í¶Í5“4 %èä´> ªÖºv8Ä?-ìBÒK1´þ‰âûL™û•`϶´€ˆ¾ŠÏËWðf{¾óŒ˜©ÝõÝЙº©áƒÐÕZÜî@{¯ò³<íÓ‰|¢©üã€ä‘à‡r ó.«@’ÌòUÁ (@]˜hégG7|œÏ¯-«'-›ì#‘P½1DATçP‡Ty|–°j%é*ÚëóåÔÑÉVŽ^̇©aïä,ã¤,V™÷³ëº¹g¸PB ~Mo°¦9ÜÖ’ªWrG_öL"ÂWr×èÁš;ä_1XwŒÚ›{ùY²3"A—_Eu®žìµV&)h}(¯ì·¤#ƒ°o޾ÃÜc>Óº…Ñ#IRÇh‚™ýÇÀ41sw5×·å¶ vU¿Nך*–¢»ÒÈ¥©Dàs‚w»ÅÊkÂhäIY³îÚñ¤„@æ]/=Ï6• ròMþ¼Å—Ê9\4…FäøŠÝît’ïe({gçÒPÊ‘ÃÖÜš› •"¦”crsÏr} ¹Z“ï2]î< [6÷ö(/žïJ¯6¶-ö+ ý¾ý#…‘ 7•Ÿµ Ç&T­6ÔÉõžˆ{LÌ™(‹Z­â’ ]¶ÀãÁ£ýèb¯‘êŸý݆¬·çHc°)¤©½|˜‘û=…)ç»ûu¼bò`܇ƒ“Öçñ %¹0äN( H ‰šñô”®*ë“Ba_¨ÅÐ߈+e´.]ìjr¤ù¾ÑBØÇM$(_èæÖÍ9õC¹OºÇÉܹÚý5Õªª(­œ|Ö”`ïe†Ž‡£Ê¤qvM&¦¥á‘ “®]bë)›~Ñ–†“ ø¥PÚ§BšS>pÍ~˜¤,kûm†‘÷»Sjœ5‰+Ü㣺©a½¯­•**¥’Îj*·pd®¢`øŠïD–Ž]3w__lÕ ÷“wy¯C]kÍ1èé\‚DEKVè-÷ØGÿøÒÅ›Šbp+zŠW>t4¶/m íÊ Hât^¼*ó+;tæÐûÞ£H)ì½\“#ú]É)ˆuiQê q˜»¼Øç— ÍÃO0(Z¥t %þªC¨ „ä*DÒ<«hûcxU‡ø7®bë:"ÉÞ)ySms½•,ª4À\3æµkdÕrA›¥˜9gÏöÙË"X [P™Ù+|iêGäuŒ¡Œ S&‚RLb`~Òðž©ÖRœ§ÕŒŒØóÎŒ¬,æ]è}”ÍAÈ_6» Ÿ[ñïîòa j…zìÓ–ã¸@z€%LâWYRÃ䜧?%6MªŸfÓ(­n]üÜ#mõ¾÷µéã°pšì­ÞøC˜ÿŠ6Ô»lAVVwjùôî2®†ÐWjHAhaë•ÒSA¡q€[×MY3¯ÿ–L-è"]'¯qíEYK¦öÂÉ]Ðçï‚‹Ë„ûjöUöZ¹³†Ñy£#{éY y‚«%·60Óó›\•ójëÓÑ-‘Æ>ãé[jÜ–ñ<™ ‘—|Y—LíÈÏ€ ¶ðæ7]7Šúä-Þ7ÅP‡´0èÔת§’Ïg*z­)*hi}DƒÞ'PkzÐ=/ö.ÒÚDeÑ]!»)Õþê£#»{…u™`d¤î:Ò¹—Åùª,(°/@~u1w(.$h¤úKëÞ«h$Œ¡t£Q·\Y׌´†õùH¦½âmÑAan]ôíú½¹5 a yàÛÜÞš÷“﯒«‰@ÙÐoœs’uX½œs´•íÁÚêgÓ«ëòPH?Û²‡ôâØ™ù”‰ïIJ¹Ù ç‰öY'„kå%›v‡ì»Þ¤éž[Ì˪‘ð]•ü]°Ê@Ëä@U—1î3¤sÌcJ[ÓšÅjš°Ï ëš¶‘ÜùÒ˜ué½#ü L­”pC(bãÅ“èÀ ™ôÛR^ «æá»@†(ÙÄi [o+T1²<Âo$G­ëyÖLãîÞN_LGvA‚˼kS#³Bx²A¾lã²H¼æÍhnÒÔXóùŒlÏEõ_6×?ÿL´$E穹¼Òfjm8l\N ¨NùÏÚ7+Ãfj@™wíÝôJ…ÄÎ?Î:G™–9É“”9p0’©õ¨æ'K´ÁºZ3£×û°ôº®­‹û©HϪlgÀbëÉȈ–°* „tmÝôyH/nF]¾ë¬Ë¥ýk„8†Pq¸¹EðÜçPvüyfW¯Ê§»ÂÞÀG¶fÔÍãìlB®åê4³—žÇZ\[nuŠ*>¬”Ä¿Á^KhiÛ$èŽ!³)!­æÚ²µ‡ß€©é‚bcÉVþ̇sƒ¹¶,¦—^äD=Ú²pmÙ@庶ìØÔÖCq*1Jƒ=öðÍÆÇ*¶Ž#¢8Ùj[¨]}»mä~̻ƗºýæRäÈŠXí¼ñËqÈ´ý{ÁlžmqÓØV‘jò(õÒ> &cf6Çú¬Éœw÷d]mî®`øJþT2Qv&ØLñ«·þ]u}×Êò‹ü짃ùŸd¤–»·”zÅQ²¿Ÿ·é»pS6y¬vJ°£§O—b‹Ë%ª‘¹õaq­´ Õ3jsŒ&…ýêr;š~1›ÏL­Ï _ FÀæ »¡[ëQˆæÕ˜ˆ™Kñ‹íâBv®ã"SÛ=]ÜË*(ŽbðJdJñ ?Ê`Ø)§÷Ë ©—ŒÆS•ïåÚÉ&ÙKµ>jU©˜mhþªaÛ;;SÖ‡ÂÖ¿óìiä;5§Âù[3{(©r´4ͳLpp*äÝY¹ ßMàHo«ç®òs¥#±áØâ’±H „÷}T_Ìœ †PjS aQ ÚWü*%Ï(Î2ùKI¡õ`.´¾¥@«ÖdjÔ.f`5c§Ë/‚-¢úü×ù‘ª³*ÏT†=Û §% ‚«ê™·o…UÏÏü0†©9{S ‹¬þÙ(ÿª@‹‡™)ÙŠ­Y×+Sº–Ie]3€ë-¶|)ìcôþ’—ä´OŠ¿« M¨ø©± ‰31VhùŠ’…|(¶ ÃŽD3’m%a7@°û˜'ƒá‘˜¶ÿ¤"š«¦A¡¯ÿÚ¹‹+bx«åÄý•è7­kóÙ(Y)Ü‘ž•’…áñ)ZXר[ÖVåFr­´®̲f]ØíP Íð‘ÖuœÓlhEs¯F±¦#;.D^q¨gnàdЉþº(§ÌfÅVQ~Â’©½€—.îÅ€"ëjÁkáÖÕVgÈàe˜$TÒ­kìš%¹´Y×KÏ(Ýaôþ%¹i_æž²tµ~4À½d§á*ÈÙT–Íc—æF²½Df6xµÀŽH$ÄÔÐl2!ƒzG‰‘=áÊÅz ¯[Â’@y™ ”àÙç>ñL;~g© qh‘Ø)ë*NuäÖõ,(­kÌÕ•w½cÅ‹!æU÷]UR û;Ù¸/D¢ïr ¨ð]þÈâÂáFá»ü«Vç[ÞÌɱÛZZ×KÊÌT25PʤS­Ô˜Þ¶°»—(1Å7ë*!Œæ1¸­£n¸œÕ>kñȸ;=ëÁ®ÈÝqþ.ƒ¡eMTç»+KB»÷Ê6Àû·iBX=áœã1MŒºÙ¾f˜Ï¶&…ždZש…x#x¨_o““ c§bd&s/#ÅŸ_p·žÊÑâ1IéÜjï=¥I€Â‹Të`a¾©e:¶ޏuáŒÈºÞIgO @Àv•ÕŸÑ»ò.`Ããmt]eOgé¡®Âä«×¦RüÞËcʶÜýÓ\Á«âŸwµüb9ÜÏó®â¨UË»ž¹g^cÀó®——Tå]uŽ¢ÈÖÌJë*ë¤bv±Ûè³úÍÙšÕVÖŒ2&/ýá¯\—;ž8JÏrs»eýb]ÉF·Jr»¡|/s)f¢ Lë"¤°:í†þœ´¡[zÒ‹¿ìºéâ®Âš:±kîi\%ý=¾Þø¤{§~d•ÊlÔÁZîN â"¨1ºcªÉ Ø£Ú¤g4ö»L ¨«f|Å{„Œ½f´Å~œ~ë°sØq‹®$ *¶\ {8‰\‹²5[¦/eUV¿-»š KkM&ÛØ È2\ÊâPÀv{ôKà­®ï(yGboê*Ûª•CF½ùU[êÖî—:hþTÁÝÊ{áO¬ Ø'þ°3‚$ËÄÉŸ³ãpJ8M…Jw‰×v*b&Ÿ•„*/wLÕõ;³#Q¾%„*O#ê°i§üˆé-‰Þ¶IâDÏÍ:JÚñî UFJͯs (@yký„Ie6VAŽvõÕCDz“Tš#{ŸÃc øõBëXÖ…5µã XÿY_ìÖšõèÝU™jùº KP¾¹K)Ùé‹Éö6a‘¢WʤO2Í_špUûÌb0ßg`õl܃ºN©ÖµªRŠ0aÓ8!Ù‘@°  #bðaGÉÁ4Id÷b=é±c}ÙüÚÐ8ÓN‚}¶ŠFÝN÷ç(Zfd3Á¤Ø]¿™]1¯òy¦’ º/BüSY}éUÂ0Çèï ?îÃTdÜ­&˜û¥¢ì¦‚ž3ZªnM±‘µª„5 P¨pÆgÃâ”7‹Ò³—¾…gºù”àðêhêÕ¿ªuÈŒAÚ'‡Î•/ýyFFìÜ+¥†I.Lß/œ¤Ù‡VÎø{•­ï扒O‚n ù"»ºÙâzñsËw•ØñŽÙ­l;˜P©jFk…©°‰ðÃjée/ôØJú§Wß¹^p“*ìÕ¾?J.»²ÐÄZ³Ë^ïý öÚ^?¾ù³){iG.‹Áu{|Íbèb¹”56À@Û5¤õöYÝlŸYµÌ&™QÎpBHÂ"#50ÑM¢VMz(#„ëjPõ5ÊÉ‹Î>·ÖÔ¿yÆ)ß…¬®– •*»*áê›É5BàJR³ÏXjQMd>ªê>s<ý‰4P?±5Ö" f]4‹‰~±õHq:]™ÛKÏR¬ïŒŒØ~øJ¥ a+Z»8Áí# ÔA= I>Xê´Ÿ2EþÃ;ÙŸúAŕ؜µ4'FÙR¥1h”ªÉ‰ nF/H ÊÅ­qä†ÞÛ»©l=Ksç?¼ø ÏZMšä‘Ÿ%¼ÃÙ5?}´Œ /gûs¶êÜлvŸëÒÑàèœS¹=ï1¶R&©¯AÉR>ÄÿgïÏñj®£wU’a©›ITNi wïˆ2ˆgŽM^ù0äÄâòHÞM,âʺ ƼéÈ0]Ißµ:9ˆ‘ež£_Ãq´Šå“Äã`%ÔXa,´û(Ôc3”SK%`½‰ñ V× ÷­zæùܳ,¸ÆÔµƒÂ•ê‚ÕÕ,6(r0Fw껉ïÂŽgÚÐ^™â?K£¤&4=Ë @éÕ:wëÇb€H÷_gSФ¹Þ3tJ.ãZ}y¾»„÷›1ž6Cí;°Æq»âÚ}^;§0wQXÄûš)Þ‚œ wæIá P|M­§±®CåÔ?Ó®&ŠË÷Le]ï7tUr=„F¬hnÖ /1”¡Õ×ߪq˜Nuo;Å÷B+¥}t±ÛøH¯`/Iƒ‰w²Ÿ‡jRog0?ÎI=«Îéì‰ez‹[EÕh¾r#vžÌ!|Ä;„áÈbe1‘'¾y˜¦ñÕ'ìlË›˜{iªù»­‘Ÿ·žNØU‘;Jgêå'#ѹ,Òƒøa8–¢Å!s^fÒEšøO\3ï€:_@$¬Læ¬V‰'géYjl‚*͸¶@‡ø¬¥„à¼÷+/Ÿ³ ˜R>zìµó l)¹ Ç_i…gIZÆ*¢.룀ÜÕj'•«^<øèÌ<ßœ-ÊçB¸è• ÈFÑsãêÞ².p&¸°ä©V-[Ö5ÊÎÐÓ0bŸñÖ† ônuŽ35<³©]ø¼ièO9„Wnsš±Ð¹àmZ‘ ÜD 2V´¼”²fMsßùq¶ŽÑ•/–1RWìª*¾ßñ½ ¨kåNY Æô0áQ䆀–“)½Ü'D­§<ëËâèájn<ÙÔÀ™mpèa ^4ß &6)7Gà 륊ŸuäsA=7·®Ó–Âd§f×OÀ©ˆ;?¦Ž)ëz¹_ Í> ßyþžCi]ƒ>άkæ6>T~sç)4ݺÎW£®5½ñ·Éèž]ý¹BjHaELªÁ`›Õ¯gb¢z+ªê~¸®°m=R»5³ò‘Y¯I[†&¿<ÒX÷¢–eœcdª<}´èÞïÔL䡲¦ým ¹KÒ¡IÉ;ãQ:ò/笔¸F ¬å£SûRûH>¿mÝ“¡—Ö]25ÌÍ:/Zì;¸©•Tí3®’¾ëöš MG á´·£‹ç?gú.Ì¥uùì‡Öµº¬ €Ï)ëÚsêü½”u°AÉåj+ï÷‘ŒŸäyd¼lPY×§U9²g·å“(ÝsÒº:O™YWÛÿê\Šx ¦ÑÃ<í_‰î³Ô?7feC½hwǶÙ./êè¬T¡Ïxkû¸=T?@p°¤2Vøõ½1oW™Jy5O^Ìýf6g¦Ðz¿T‡³)—‰øÉ ™IŠõ (Ô„ÿ³D—Ó ÈÛ”–VXf~ܬ«ê­ØOwëZk|êíYÒ6ÉÜœÜì+3ºò}ô¿åÈzl¿Xd¤r*"㤠"ãS¿¥Ÿ7;{}:òXº‘ïjA´èÖ%˜é¯-w Y×;¤ŸÒ„¯»–íl#yÉUÜ-ìѰ}…?À–™ÆaÍwg¿¹7™îþf6¬C0º”94•ŸÑòã@¾tô—nÍú‚\—u=Ÿ½eÓm¬d ¯å²È³‰CKeô9ô0§ÞÉ ÞóãÈ~#'à+  š28at‘7·¢„ñZV´s_Á0Ç)C_áyæO÷0½$"ãG%!%­«ªùÙIŠýµ½µ jë]¶O*<Ÿ›ê»#ø4CÜ$§:ؤøÌ9)Iõ\n y¶]sôe©ŸÐK³þû¤A•qLíÕ©G~c¦Ï³¦]v:›²))mõÒ¶)\ɆÖV¾¿ÁêZå»ZlÂG Ýì\X{÷·ï©NÛÏÙŠ­¯|ÿpqOŸ…ïêL2‘lŸÅõ¥iÊ”ÚxÖ9Õ<ÁxæòbAÎù#ã‹<¹óÛ«eû„Z•„AÔ1Ê_â•î³4JÌ£kþ>]ñh eõ}d÷nù$òí–#kÁúæ5ã,Ú z¿bK\þó¤ïzíHßÕš6΀p형%ÓüF¦ø‡R’Ö­jôî¿¶$ÈåwËK’gâ^DBò ‹ôqGƒfO”Fàc=‘Ÿ³èböS½È®âKaØœÁ¼yW4Yü/ÍšÊÚÐ¥W"ÿž?û•èªË ÉÖ öz·HÞá cÜZ™ÃzÉ¥ï*eXœ—¢@‹/>r9(eÿ/ /JµÚi3=æ¦Ê½©ÍOdljÙÈW» Ö‘HÕYl-~ú]#eFk›Êê:\#­\«HØœ{ µŠŒ¥’µ³eÇG]qJ  êî3(ÕÊ‘uÒ18L?ÐÉö”R÷Ž,ÛÞž83ý 3ÙElÊL‘y_JZiNyžy[V“ûVþU4÷ÊÕ+€½}ÜûÚK’Ä;¿P'þÉV÷š>á™'‹o£ËâPAev¦CýÃ`ƒ]niܨN9›Ù¤™>±Ô'gƒšãdB5‘yQ˼ƒÒP-‹Ú²ÝvøqÀŽTO~©èG ~Õ® 4Y¡v^@è‹‘ñà;p )Ô'ž.q…nµ ##ôh„Ä¢[Ož6 4Å^[›þzE1³•„¬Yß=›§¬"ëzÅ_æÍó¨ÁeÑ›]ÒY–ŒµÛ—Üàò!î†ÎNºÝûüD]‰ùþú>c&‚‡­ÿ_—]PÍ8¢qÙÈUÁÀU÷Á½ÃóÀJ¢Ç¸é_ “¨jòEzú $½Ž™rZèÞÈûÍX1rcÝŸÐ6¨-6Êág7[<çè”y š®l/ƒzÉh•ﱓàîjVºOà•¦tf60ºÌ¦q=¨ÅÕ×Î)v/Ò*¾«¶„tÕÒ(Ë3±éxdjû\î¢A'è°-V“=&ú•ë#5¼NJ ¤-SYOÐélº2A÷nøžNç®SiÜ;öìit몱vÊL(x2óã0·Vü[*Åm»*¿7¨²W1(´gú8у¸£LfÞó˪ìùOæÍÝ5Ôxz•ÎÒ#üýt/)Y0"_œU𯨶”ïÔÈ¿:‚XÖ­«jÍ÷ÏúÎ쪜¡ø×ÆH @!vÚ¼Õðü‡j*ÌÙລH6Ú]qaÏ+¶H‡ªTñ,¤òŠ~_‘ï6¶Ñ¨-¥\ëjRгiÆÔSÂÑÄèݬ­ªó„̶{µ~XÉÙzݧ9 :èìkž•\/—™2¨ªWºÂЧ걫ղ¢}^6_*±ä߮Π.:º¹Ö¹byl¸‚—¶nÒ·Âê'[«u®¦‹÷Xr$ó~C‘¡”®šW›­ckÜïÌšÎX9ÇyC^€Ý1 |NÑÌ ZÓcÄ3³ ¸Cl8Süc²æJ å~¼P) [íWaÒQ>ÛBssÅÖè û]6¼c{”š2²2¹—äT@Ä„mTrR.¾Æn«6F æÿ#º2zHÞyš£4À¶ŽŠÇb×Ç–aä»°e¿ºìAÙ^a ·\Hjʳ^íTš¹¼x^NË³¥©‘Rv¯Déб…£Dz„=ûFÉs‚±‚üKëŸþ>Ž›ëøw)ÐöK&&ü£Ó³ŸPÛgìŒk5¨vp‡pý½œ¬‰Ð þ.‹µPÓ¸ð)€è«5R¾ËZãKþìTx¼¥=Ñl—"Gow}î$vº­«I-Ú4øÕj5Ó³@Àñãm¨É ‰±zM&¦÷+² Í 9²ÑW¢vf°ÿä‚ÍPǸܪ÷á'%† |z½gÔ’ zYôÙ,õè¥Ö[‘»zé 9¬HÀ¹ ³õ*kF­7"9¯-¹¨/*õ D³$Ôô¬p/+À4?Ñèò/¯r¦Aa%½T½ò~Ògì¼ØÜû3’5¶ñúÈ¿ ê³<†µñYePâJ®^üD‚Õ‡S:ÎtWc|°c ŸHëDwÒºêWÏŒGÆÌ6’ÄøJÅÌANoÖ3äÖ^Xã?ìq¤ÌvyOæðЇ¢ l¸§9€¶?“í¹Ò¾ ·ej`¼Õ`=D½Åcþ‰¿Ä¸m‹ÙGÁ„ÚW©PbåW}–9+,7–¦ü8—ðœ—4ÁÀì—­å÷zéL hU[šÃ+ÒÆ™½ªì|_OPút²ÏwêstSûø0¼@×.þ%)ˆÇº9ƒnA]îyå©L®PÏüOªö+w̽áýX92„àI@«Ýþó!ˆ›’ÄØt¼¹˜}–²z¬­–LÏž_%®3#$™e‹¿·Ï4VGsý Öb܃Ieˆg™æ€zZáXKõè;Ù퓆p/kÊ{iQ©.û¦Š-†|…¤˜'Só×—„lk1©t¨O Qƒ3¸67BZÝF,¨OšZÓÆ‹åjêUØ–6ÓƒO¬­PæÇ~tgÇœ¬út¹Uä=ßG|‚Å횪̑le¬ÜÍxa2Ù®_°!¼@–ðVÑ:þh× n«™ Ì*õV£ü©’W›•m™ÚÝéâž5¤Ä5v@Ðó¾P“¸g%WÎ>¢p_°ÏûyÌ$ðvvªÁ;¶)ÐÆ;p4jº±[ ¿ØDdUùYdÓ˜ÿÒQc¼ø¾ °&w -ÑÂß7ÎâF„ÖWÒ”¥AF‚yܬ©žJf^òÈ^öA{‚P»ƒÀ/ Þ>Z«,ºþ0”—ã0SFî¹Yaúj¨kD‘Wõ64wÛ¥›µ kU/ô}ªˆ]æ£[ÏέZ k„Qê­ywŒüùõCµ?ˈ2„©µ1dwïezÖ¦8¿Œ·˜Žd­®\u„  öæ †ÊÜ*±ÑA'Ÿ4ü](Ãú{ËÜ—Q>->tÈ éÝIõ]ü›.¾sÛé’í£É²™P™:{ÒtcYD©X2ò¯JÁlâvˉ>2ÑCúçà›(¤2V^n,-ª}¶Ûœ™Æa¯S&Y©(ñJ!ƒ­/qqdé¸ ú.¨Y[l[)5w]Ñ Wƒª^‡xzħ¤ƒ¢¿sv¸Fö-ïÝÀsiÿcîÎù M_–´FV¡Ú˜™Z“ua©]^íy—$•¨½ÏlpÌuë†kwÜ,PMÌ4®öä-~¿NYá´™Œ¬°7J™[([d(€Õp ÄØ9&íM×F.S‚¼iP=XÝ]µ™CÕ1%À ¯6ÉÕ¹l£ü#ÞZ­¨rzFÈØþ§VåÕÐìÈMÀÁliNwa7‡>f¬~ûR:Ô´gjÛÊ@4 Ä¥‹NaoŸíZ”†÷«1 é0 .E¯¼¸ýÑ‘_¢³±æ^Kâ8La–Üñ¢6"̽ì´"†Àid¥‡©y¿kºWkT¢srpU{£í£,h_*ÃËÓNWú8à­e]¥’®ÇŠÓÅÏYD„VŸSm-Xbt3Ó–­o˜“>áý„ñ±éK‚òXMƒ:;Ìië3éºÚõqLZ¢r–cdH¸ °&Y“«xöÉ-ÅN⟪¬KL¿o¦I¢>Îæe¯CŸ0OOÚpH²æ@_óäj)œûä¨åyNì{N>WRÀµµ¹´V!Ÿï.2Yráã8Ï60’ÇpW˜Ã•K5ÒŒÕÂîðq5`ìØ4.gÈî JÖð¦š@BèùF$qÂ_ Ç¹—¢î‹è…q Ô3d÷’ŸÌº©3•Nî!%‹m5´dµ[¥}h ZºÌjY“ÜUŸ;÷5_=DV;éYË`d¼À$$¡-Jå%à’Cx§‡;6ákú»WcˆÝ TÖåÞhÍ Ø•ROÐúB²>n„øu$J·'+ým;Wü–vé­ÑSÖ­uU#X‘§£~5ñî”ËE^¹(Ȳ+©!˜×vâ\ïÕ—C5“„£´!8~:•7Ê­TµFùç *ö8ÎæãnÖm•ö 7+½ßš5 Z_¥“Ìs÷v• ‰Vp“,¥¤}~™RêÑhÊyñ”<Þ"*›±·,a@.­ºà•aU?ä*:=»tª©ÃX… g:¦¬ t{ä¬z˜»Þþ±;|ñó¢¬s¨ëKEdPï÷Myž—6yÀ­½îªy±ƒ,¦ µä"ߨö˜0hr½,•sœ&ŸtcÀ•oç!l`£Åº÷ç½ú*3`|^`ªë£^j«oöM1úšóU×%1o©Kvq²§”ù á)—;.;…ÖŸ»¢ì(ˆwÑÛî½Ò8ë¶½Rhûè,^ô²CËZc눼›EÛîgÿÉÆL:=²^S¿b¤„7!>msÕõî÷ÎU×C¤×Uס‹—lü@RÈfÃWÝð—ÕóԛΠu;pâœíÒ‹ðGVCçÐ^Y—ÊÅX<Ÿ”ı(ŠÀÁïG–ã­ÿ¾»þ,ë5uÛ«)-è¢]ú³ª>-Z-nFiå ˇ¯•–£€Üº–CžÎ˜‡)¦í©H?4¨ˆ{{/Í¥@u5ýš ]Ô]°)á¹²€W½QAÖëSת.‹Ä–S¶ÿŽ\¾„-µª‹õÑ·ÅoÝŸOزÈ}*o¸ác/­°©LU]jçZ{)ŽÛôU×ÅŽfèb—Iåic­åÙF'º¤Â\ß7úÙ‹Þ< “B¬¨ë65Å­ê¼CéÞ;À ÆnFè<¹Bàùp©×|âv½„i—¹TÑ J¹Ç¦’iGJt€û¹Œª©®×Ø1S{>ûÒº@_QS:Ý]µ'úœy±ëmò/u”%7ôØóq6}=Ú,öС¥‹}65Ð-G뺣ÕõÓ˜áqd~$ØïúJ°·¦OGu QŠÒ«ÞòÛõØ^qgZW×Ñ|vÔå·aùìÇG2n]+ä{¼ÑÔl}iɯ2ò Ìh‹-OE\YÍ­ëEǨÛâ(™K‘\õ{è[ŠçF_™¢:7d"o®‡LZÛ:Ö—wÊûÙ/ßzDÛ¶>®mª×ÙˆçfþNõ‰1¾G/ïþä䥙ÚÞ¡’îYaPqMŸ–&£¶;ô §õJjØdSjøH6ÑèêÊVôzw!ÃÍQƒn¨\Iw§üâÞ‘Ÿ%ͦ³À‚œ^­ÌÜÀQQ醀L Udƒ\Ü6»JÕ÷É”’„M ¿oíy±(nV•©õî5¬»wïò'!Kù$‚w)LRGÀìö_îÉÓ•}ÃwµÖaÀУ`xc^7½[EcEÆRvür3”ÅGa ˆ›aé"÷Kmî£Â—o;J”®‘]U}\ MûK½/Æ?0œ5ª_OãìÖ©@Ê£Ô±™ß®Ùn”Ò½Ž‚M¦vGÒ÷X€ Õõ;ŠRL32ᨕgÛæW¨L…21mæ~¶·Ó#G´ì˜gfsF^%—uÝ+òo^œý…‹–åäóVÝàŒ¬®Â+u?"“±…îšíˆ¸W~‡= ¿–\<ïZNJàø¼å-}‡Âl§ò^ýŽmgo1/×­%¬ ª^"Åòô òó+7MUf6¯ú~•}‘PÇ9ÏøHÞ½;ôYR:í£H”äÑ š…ì“ïÛCc=\§+D¾XøíÞíjéâ‚£"T×Èéátœ,¤_]÷ñjÀAÇ o&~¬`ÑBdOµe§‘J(zÝå“Î’\®mwPÃÛlh“8À—#ÑŸâ€ZóJnËLûXa$á<ØtdŇ55õKL_…gvÙJ: "$§î< ™—”’E¸H4üy/² ÏE/JU&=¦›!gÚ$OQ÷U‰Y©ÎáéÛáb•q.%àpæ‡ÚZG¡Î•¢O=h.ýb·TŸè«“UòÏÓÓ>O_êj•±9}89Ó¹‚v‚zÖ A–[»MšÝ8”¬ai1Ë(PCÉ Ê:7 j°îÁð.Ö[Í'Õ-ÅÐ+†‚vO¬§/Iiô»NÚÐìë£Á×nÓÅ(ç£Þ öPÍ“_•ßôÈF£3µÞ¢LóBåfÝÓŽÔw+©£ œlR×Aä%9úRù÷rÂ¥4Ç`¢dÎT°$ÓJIØÎ>3uºÀ¬¦2´ªH]®õv™[ÏïÕC„f`B7²…Ð*稆Í$£©†ÙOß…­Ìì™öž¼qê„Õ6š~9IÖüèUÌ­2ª”š€ 0ð'j'*¾è†ÏOß}§.=XyËç8wuŒ¾’´›ŠC¸Bð6„Rt%ÁhqUb@l>ÊI $áÈLcRkeûº4j6™¤ß&¨ÁVÉ8m32½Ô)—ÃDßÐ>eð'T¿š³$dÞ†ã¯vn„Ü/¼t©úŒ}M?Œ?“.‡Å6êæUNŽç÷ÄÍtÔ/uùf […ÁÚû3}%P“}¢nÒ+ïèÐs±|›bÅ/Œt%k'È€§7í¢ðõ;4Ô±FMÜ·J´—Ùf‘þLð½f©òI%|q¸‰kmé\¢C18?òY!ãfs´“‡ñ_§©ôÔÅl<NÓ½ùR=÷"Ö]IÇ·kçâ+ äÎïål»„|„]±è¯]ɘo»X­æÝ±+I ”^±‡éÖž¹½þÑ\CX+Álµ”0v„ÔÄvÔ²hûF2ZÞãµ22Þ(Ä|lÙ¤e`úbé»0ÕË@ Â{y?tIƒÅ˨‹ºcz®íºØï\å`°Œ‘ ”ÞÚgSì…Ž‹&Èï“tW{¤ï½Cüôeõ¨~,”÷}Á9ó/×&#µ§ É…0 ýlÅ­Î윛ð#¸œma¸BÍ­ÛÏÝ=`S;ů†Úþ¡»†H‡­êž¼D„Ü‘¶m¹ ¸¶úk$Æ—Tcï›rÛŒâ<(œ´ÄÇX%k[§C;yÀVå>UéI@;WýÈ ÔÙJ8 ÂæÏÎø°CVÉ'ä¥çEY‚Á«ÍÏ£˜¡½àœJœ 3J7 >‡Ö _²®ÁüÔuudvزÀ (ù™©×Ï_çù?ÂBÂôÑor°•Õõí^ñ—ª{{kfl«W’ɾö ÚÆ¾;3 ÍøHwì¥õdtÙº"#H¨Oò«–Û[~B«Ü÷Cþa}tådÈ÷:-E{ÑþÒ¥·ÝÔ:ªR-ððV^`…ªÊ6Ê”L:à¶mRQM£ðY¢ÃƒU<Æ:ãàÇá¯2IéØåÝÊ>^’2U ôQˆüg¥2^½*ðÊ©™³>ëÌûy¡O›mô„îÃáê•CáNêâ•h©OU:7c ù\—L­…H}dõ­l%­u»—\>)ÙD΂¸ÊQ¯3rãó…Oíä:T¹1Áü&ËmÇQÖTCÞ½… §"1&±Aßìç¯JûØ€M)³ý< ¥;6 ´;AÕj7L#ÐU%å“1„"ƒ•:%4á­ãâû¨þÊ’þ2­HŽ¡Ü ŠsL3Þèò~G eØXš¹iŒOîIí)úímw=¥—oÒC™^DrÎbK[ë=ÀÝÉî€1ÌÈxƒ¨ÖY, F®'²íU#=á~-zÇî®FKìß ÉW·¡W¡ fú>l|ÙZùqÏk'—­”“—÷åÿTfR²¬Á}1Ô±–ä¡ rÇ*òÎ,ɧÑÛ v5Bp;²2¶@PoàÏ(®ÐL ãðízRvá½ò‘1~?\´7¦0Ak0PÌÅ£y$â#:ªîze•+ëºÍùƒÜºž³Ji¼w‚)¡p 8rhj½”äÖxe ÊS-‹„gî¤ô¿ãüîÒWB• A•Ž Œ•‰z j€×§ê|9Ã$œ_âÙÏóBep ÏÈh¹ÒÚ°5Ñ&ëí»:´®¨ =4!=ëè79¨Lî8Y΋ë‡ÁYXŸUÀC¥KÃ(Ýx²†þônxH°¯ð†[vQGP- Òbt:èð€ ©:»‚ Æ%9&©“‘Qßàæó4  JbÙw.\®s-в „¡|k¤mÉw¹T1Àîîò~&”Ãk·S\$âw+€‚٤г¾ ôä¶Þ»$ = ](J•G#å p;‰*ZŠ6¨«³¸u½p:³¨'[ÿ«ŸÄM"[ÈnøKsÙ´çÏ’Ù¹K5?ΦG5{ðÒÓÂm««:ÅsN ?â5¨rò õ"B* ¤73sº»è¡¿ÇÞš_=5kêbƒ¥ä¦šz§²¨wSÇ 1CPQÊd*¥š•–ñ¶ ìm2ª¶ ¸é•.§ä /—¯Ü¢¡ µZCÏÛH¼èV|۠áõ9RAv÷ì|R¼m›:Q¡ƒÚ1ªŽr>„~ãn½oìú)½@GG†U -¼ð¢­ \qg>®~2@tÛjͪz­š iCjlÜ]_Öu³´¬»RLÔ:J‡K Çd™=¾ öÐ]Ý6™­Ca¦r1Ö5ÊòfHJÛš}©°by:T¨*uX°iµ(ÎŽNŸÔ[±¬5 ­ :r—±Õì®ìKÙ!ï†g(‹Ås%{=27äF·Ò6°JæŠ=.ú,< r&3…O÷!¯[× "©À]B¶Ôck^Øq®ÊéÀB¾õæA2<ÙÈžÆ.ÜÄÅ·{3ZýtñÁ%ëZ[:AƌӭÕuÒ‘•’µ¹c:æþ³s[Ý–x>K»ÎÔc6'×,ÎG’ª­ElªÁrIehùˇ e À²«NI™‡~ÉM¢EpŒÐ¬lIé•[[Šd#èÚF­”(GÇ%p1® ‡äø¸ .„ȯ­WßC–îÏ„3Sf»¯RÊ÷JZÝÝK¸BäÍû„Ø-v¶_¾>xNØÝ1À碳8í‘9ô- ìÌÌ©¿ôŽ3•öl•å#sNjÁ€Èàè³OŸô] Úäê0 Jw`%ý殳3Ao”²åÆžyÀ4ê\¼`˜Û ÐÏém?†%¬1ë/Íè¦z»åÕÐ Y€Ì\Ì Á³OÒ±†ž#¬þ!ºWZS˜¡\æ]¨Øç§i~¶ôÀ#gãLh yDv‡N^¯iP÷Ð a :A*+ô_­¶ô„Ñ/šošúçû¦UfŒV\;ÛAQäÝŸ` ì¦$± p»¤­Oö³¯˜Ns÷ÐQýÐb/b¤X#ôÜ”¬¡“©A¿òÊŒ‘…ýc¿¤„†ip¤v;lÆ@’<#®.ò<ﱤOB[Œƒ%S~'› Lí£ð8ZMY0_Ów5£KVÈÛg§Œq AÅánv§û…ª³¨–£ñÌBœüK#¸V¼5.hó÷ÃÏYjh{Y[Å×_ܺ–¤¢=¡*ŠÏ?QhÖL(uMIIÕö˜Ù‘h‡õÒÔd•//^|¡êúDŠQdÏ®O‘Ë·Õg`×cõDÉÇ&.c<}šá¦õ¦‹ýÞÆ¬ð×–¬i6&»WT Ì!Ñ< :ÇVF†q<æ9õCÎÿÒ½!ßuÖHšî[ÚÝ –},P^ÄãÃúËÖ$¨c—0u±kh6»#Û5E²_Ê*ŒK3GÍÞWm¹·ÚOú®³z®·¾`Hßµª½¤aj@ªæØëC' ~ä%-‰Q`e-¸ÇÎÈxz¥¬'ðA¬ØÑi/÷*óž×¡’.…ÝZ—Õ@t¶Èºöê´. eðBȺ¨¯²tÛ°æó:Êy^l¶>Aý —–7ëíÊ­7yµµ=ÙvMãã‹ê£\/{<ÐÖNíxtjgûè8î½&W.x¾_¼<ò$,ä Ü^éµàÉ–’ /8*4A}¬Aæ?Ûž¯\4 àPܨn§Âä"ÀXa÷ô]¯@N]ì\c>¥úíá¤Jdo²ôó&o*€]ßa¯–Ð6t?'­ ió”uÕ/Þs(Ìš0eêTđیQØ<èL¶ ŸÀ ë“¥áeŽ"7ôjt‹Çn]gú5êÕÏiu'9C@Ýâ±KEWWŽ›MÖõêëD»u½?Ú& ê¥Z¥ñâxŠdƒNSa²‡@uug³]!˜IkèO‚¼`¬”{Jtʺú*3À( GVbÙÙ­ë%Jɬ²¿5Xíº÷Af¦P}5vImßhѺ†m6‰|âN­Q"ȉýÇZ;ƒ5Qqæ] Ð×€}rmùU£´ãüE˜\ŸÊ|pégÃ;Äpy—ŒŒe~d몲÷Zæ];¶$<‘ß—éú4¸Ÿ"#Á²n]µdøëï6¤u=KqOfjÞˆ^^•­WŠ£’Üw•Zä*Þ£lßë î»B6Ê}WäÍî»Ö>é»6ã1€ǹH£Hh“‰üDór+ïz…@ª®P¹ø…ÀÖuAº¯nÜ4MEÆ%v8[P8D¨{t¤ý¢.“«a/´.ì$ˆ’lQar%‚±YÛè;ÚK [‹"©¡¢ix|zåj€ÙÊá`GŒé¹»AÍ1‚ÔŸ]ý‚ØåëãâšJ¡Âä«fdœ­5!^*Ó¡þek@LÏåmC¦VcË·ÿÚ‰èeÍÞ”âã)Ň0sX„öÛŸýÚ¾¡Ônï4›³]ÛÒÝUl?xÞ:kžwÕCS;HL;}d!7³+èšï¥öD‡@­«u¹gõ·îì³BLÂd'ŸûóÓl­Bg'm²C¶·ˆ–†¾Q²\˜ cª½ƒžºØ ý–#«ólÕzÉöô, *âá-!ÈU…¡mÝŒžW*y°\09‹ÝO‹ rˆ…²‚¦Šœr£”OV_—ܪ–K]l´IW¶¸0:tdÀœ.šÚÜΆé5c‰t”‰3âšµmêj5ãËÜùqÝXò? ªèbÄ`°o9%ÉfÍX}íÕ¼¨Î;6i(àó²ÕCÙ˜'ÙËžé®nS¯ÂÔi.@HVøq=°ÜÞïÚA.DµÔ¼7ï'©EÀ[²7Ì/ÜA]¢ô@¯ðA ïðn뇹l%SÊKµ/ÍÄ++µ6À#³y[ ©ÈA5BG„Šo8¾„ü•ÿh”Þ—\vmJÂPzE¾¿0çH)×—¬ï즾 ñjf8ggvàÖ‰€õÿ<²ÙÚdjm7¦"†O?#k˾X4•9tXÈ ·¼ß5{Q½vg䎻ѹwlœ¦Ø –¡WÐEŒP¶Lv!¬fâøiÎh[þئ=rWëdv5cŸØËÄ]ÈG<­p¢ujº³=ñ’i8Tp7m¨\Ζqæjºx©‡|×6ªM _¾eŸw£dêDMcçaˆI<öndB)Àû ˜Ù§Óû0ÓÝ%‡D- šÈþûÊ¡c-#[ú÷d4‚ŠÖ$ç=Nž6‡:µ/:¡'^ªÆ>ÈB0l 0¥ûìÎ猨4«~–FGfê¦-û §w%è#VkÌ„žµ­k§ÙÐK šâß+¶¶ºýòÈp÷’LÚ Ÿ:™õê¡_[DÉT«ô”dìÀÃéŸÓ”¤ FçÇ]ÌÁÙ3E©3R"âåä4V#Ã’‹ƒ[Áð2¢|òÄY­³¦~ ²ŠË‹Ù×çÀìNMœ_s§ÖÆn%it߯È#÷Råœ$Ôãä¡¡Ó…ö¿ˆ ó®lc”.œ òæÉ`hLq93b˜ÌæÞ©@‹–©<Ô î¬-ž+¿¸oaµHB¡°Ï¯µ;8ñ3ÌþZ¼hûd áÅ𡪞Õ}Ò˜œ‚:\…µ‹„ÿ(ä=£ÉÂsj)èvùBEàŠ¿Ë¥(yg[ áúQZ±ÚæY﹟Ó2õÖIX„[®á‹FÖ5ÚٺرºØc§^Ë;²©­>S¾)Ôå'Ø3ÿ,2ôB0©MóW‚žI’ìÈçª2¿“mÛƒ“EÂû>‹y—ù€“!¯O– –ýW¿Ì‰ä£8‚È£ÿ¶UÞ€ûåéÄ 4ïˆe×Éêi`™Tiø v•tÛâã7‘lŠðÙÙO‡ªîþ0F Ü}Ì?$ky×ÕK/%#öÖm_¿ïFv妖òîp…[b”HˆW K.ŒŒh]kV6Éù«xo‘ý‹ùøS‹(+š©þÙêÞY€ôÊ|Ñ–\$J†rù#ޱ'ý¬PΕj¥0…5g %4…É~™[«3oøÙ¹$QŸ`'ø¥2Ww¿‡ûôùým”2­Bž¬­’0ýÚ>jN5î]÷¡øa. Æ®«ŠÈ@Ù ¯éW@â%M°†…?—¾·vÓÙ`õD‹(âˆÎìEr~Ë GгßS8RëÀ¼)2}LÏßWÏgÉ好ÚVhõ.¹«“ǨÀÚÓwê(^º&4«B‹€›Ö…Íö»€ÑŠ4½×ðÐs»,ÿó̦;„}ëªÇ\×JßõBÙNs؛ކBUrø¤&ÍØi™žEnv±`Y˜ôø`ËeçK‘£Tõ,àsã*óRÎú%3U¡§øÞV¥D2ö„ Ò6ßLá ©•Å‹w~è"!ž$¸mý£BÕÕT†\Ù¢à‹ KeûÓØC³ß<ÛР¼rÔ •ÐzÁêëª<Ç WTð—vêûÍç­dPw²qoƒ‰™ÍÛznëM†¨@Tú.:œ¬:ë, Á&¬A“6ÜU}¨+æ6p¡‰@ Ý:ž{ÊA=B!y›‡Ì“îê.aaJXš.nFF`«tЗ‘ ±ª†0L/ª Ö9Äñ¡æ§¯é)pç­q˜à™Œq­ú8ð“éÏ>‡N ð }ä®Þ¡ç'}¶¾Ú²]BÖÆGï‡C£6åbiùlf{„]Þ•è˜Ï›Ÿ©yTÿ´Sªª_í»;ªyòbOZ¨€ÒáéÛðÒR‚ýý“”Ū–bæ\ó£\ÜÚ¨úâc×$Ç2°"ãû¦5ó®—d¦œì¡4æ ¡¯«Võã»&w Ñ.®ŸÖòDf]Б?ŠU’wh¨H`B07 ¤z6Ǧؓ6tǧT±eéQÝÄ´fåÍX)á^Vuh¶¸jšÚ*ªßù#Båö“äe½_É»?=܈#:Öd™|‹µ—×ü¥ª©Í™R#+¬;kâ²:Ñ‘ø †¬Ñ#-·O.ÞQÎYJܺÀ@«R¼Ô[&n²®~¶bf)­É‘ÍgBßÕäý®á4T@¶*ý´‹sFÜÖÉñ4 M*7 2–Év['+ßÕ(mEP¬–ºuuÊ­Ú”‰rζÊ"Wˆ TXª²ú¬…r¹¨,VK‰òǺ rÈ/Î=i]w¶ÏÛkFK©U•h±d ÝT˜3H¬Ê+ Öúxß¶ôÏ0äaš¡wý§|Ð÷iPsrà`pª²ÓºNYsÔ–e0Öþ£g;]\¼ÛPŠdÒÈg³®šEÐKs».ê®C)þ,Ÿåª—näBò¤ÀxDFÄiÄk¿ Ó§öD§î”*kù®WʧläÕâjàŽà Gz¦Œå}ïÍ~NB½™è…S ¦F¢s(ÍÁÄA%ö莭ê±ñ©OpÜ4µ»ª<tX@˜vWž½ÞV¶Q‹6ï[3¢‰Ô{þ¡ýQ€Â&ü7³émõS‹êVð|«P‚·1*ÕÂnGµAWîÃÕØ’pƒÚû||WÉ}Í4ò=TbhÓøÒwíÛ–ê‚Ó×R=ó i Ä7#’g}%ZÖŒ#€œÊê¯â;$ÀÔ¸?íNYWme͈v±¦‰À˜Ed„,OK¦:W­Æ&öÏQs슠ŒÚ««ïéÜtc,™8%š¢Òe>lÌU"îP êô"Ñ}ôJÑñoO5Ê"ç×E­"ö¸R)¿ÝaaÍï°çRD©ºrâ“ÜDï ÏìÆI¯ ˆHoŸ›)0°cŸ>]oiBëplé>.¤'ë:Œ§¹€ap£•; 3ðÈf]a(ÃîÞ¬2¨)e_Ã1”#ßõŒ!kÆŠÄn]ÁøÄŽÄ¦ï¨&¿ÇK§H]>Œ‚Ÿ †a8SY×û¦l­bIé$§|Ùô¬¿Î$"SÛ}ÜŒŒõ¨övìä¢iÏÌ ¼Ì;ËÄr ?näP Žm§ñ¾c;kZ¡Ú“ZaÈêˤ36µä¦…)¢Hè+íK™úBè|ú•—ûÒ+׿zH;»u½Œ¥ëѾœ|«®{‰[ÕA¯‹Záà¿Ls®íJæzŠA]Ê®0ïQ7îÙ]–g*…Â“ÕÆ™§K¦Zã ×7ïzqídäŸlyK_"îÿë¦bQª-õ»0œÞ´®—ŠVÞR‡Œ3ÑHñ b¶Ü?*ç÷0¹«j~lìö®žÔè«È!”?x¿kñ«ÚôVkñÈ÷ÃŒ­#ÂI¹ÑÞŠp2œî"½ä-Þ#Û*lÎßÑgÕ,Fù½g¡gEÙ>¬}ûH®³-b¨f|¦F—‚êUµáƒÎVÅ÷jªä‹·í¦(äqõÒ£n/á÷mðRóñÛy·c í‚¢ß,9nÌœúA½"1;ògÔ4AuÔclrY «$©½¬LÌ`:0M‚ ðȼ .jœ?"K£‘ù¾×Bqv+nRñµßˆÇ1 šK­0¬Ï+LBwCì|fe‡3è4‡ wE/‚ƯȉО—X1„Ѹšÿk¬ß]Æzc<ˆÎfujæ¤ ï»Ñº‹¸ô~Ó†q2­G-'ëj1!ÆÃ¬ì T¾MæíNBŠªh܆úqù³‘ÿè¢q¤OX¢“ÂæÈ.rWB–ƒZå|â6öqÔ FïR»ÊEºÑæ®ÄÁÑì WY]ÖÙ(q·BäõƒÀ¹¯T¾kGv@Ö+aˆM5n>”aÈŸ·‘"ά&;£®åû^tRøfÂÿ¢.ÛK¶“wt±ÆG&½Ö™]îUêWÐÏ‘»Ò>á j0&{iåõ±Vß*A‡±ég?½qôfÕˆR-´©™nF¨ÅP ¶ 5²þL,•ŽD„ûè9Ï[š¼4ÔM}Á}ËPnß<™†d)é ßÏ~¨˜f0r8:„^ ÍâÌ 1m7Ç}%x¯•‰àŸ¬º?b¢}7±”<§[$Ÿ…>Vÿ(S¦.(x«ß…}wÒµâaÞ’a²—‘²‰h~ ]+7ýË\ e¶“žSì¹eÒ 3›VxLmªæÄi¬Ýô³eˆrx{yžgªÙ­zv—ÙÞK÷çÖǽ¼&{õ«±ÿ5*®*w\C†ÓóÅY(•98 G7¯êª½ kg3µÙ‰~ÁàùË]˜¨äŠú•ä-¨6k.ƒ»îÓ­bˆ¬Zî NÕŽ¼ì©Gü+­+];jÂ"†€œ†_JÝk ÖBL´ßìÈ¿o@Èa7š=AotiF´?·eñ+V mdjûˆ{9AÉmÙW1r/é׉EõȺ†#0µ9†ìËáŸnÿÈõºgœ”¹·pZ¦Lò¥9SQËl2”{ˆÙ·±ÞMæýŸà_«;'÷rðbepý–-·I¦Ò¶Â«ˆØ+´gQ3ey¦‘“ÊWå3Ü)AQ½ö·!s€6%ü ¡ð”ÊTÖ´cyÅT³~¦„wç¿)m¯LÃÁž½«RS½­ñé—¼JUÆJÕ‚·§. ‰{(»êeçfÚ;—¬ª›™PNbCÑ.öÕΚÑÚM¦ZXžÖ¶bfOÝá÷q"ªµFæg%Ã&FÐ{C= plå”÷$ÆÅX3ÒÙ`ܪPöꦢœ«:y‘€,¼ÌŒÛ'ÜÜËGĽ‚žÑ/€ÿm) † m¸#/ýÌ»¨|­3Úa^Î&Ù¹Ÿ ù´9F àÓÐûZ"ÛÀ×[k:ÉPWôÏ¥|vʧA5uìÕŃ:lð£øf6d’?b5¥ï"ëBŽÑSXò•­Iœ³¯¨õñûúÇÙœõ%G7„ê:ôjè…î”r}Ïÿ*ù¯\á°š¼§)·†u“4µ~‡Lí%ÇG`°ÑcÁöéæ°ZÉ×®óüYŸ´ƒ‡Ç/ÊÉÔožÖ2n÷[sâPCæÞÜÕKyr_¥äâyµn¸ü~«¡0à‹ ks‘áÙèÈzeCþ˜U毫‹Ýœ;+œÍ‚$Ïj69× )z³Ü;3”5òuV:Þþ\êHÝÕ1ÉМA_Ba¬– *«q9ßÏ.á郵sO–.‡sL.çT[îØ²®—C‘ØÉúîS¦†•ÊAS‰£b&ÊLÕ™¥Élƒ·¸O•P¦ÈöÙ$§µ­ØödÞ—M»;¾iÜÖNºÈápÆÕš¬æå2EÖ…&÷—­ÌCñ5Éäcû8Ü(膮ËowGRU=sÒ ·úöÃTt8Róô‡@øŽòq"Ú†2ÚÕŒ†§JØÕ³ÈÙ4(êëé“ê$ Ç}RË¡øË hûKtGßÕŸy(¶5MAˆ4_Ö,.,ÿ £TsÁkŒ\øç¬dü}ù´æŒndØe!=A5?ºÃ­§î0:Š™…pÞœ}iW¡áíòCo›ŠÙØç×ø±–ۤݵØ8 ´7TYÂû}²¦2÷– •Á5ëâóùáãÚÜè`ªC§„6÷f/ÆTu9Ìo¶¹¥õ1>Á9»cÂoø{èÌm¡F¢5.GÞ¡­A£µ[ŸÇ܆üÝsC¢a5Övú.4×µ‡/69 ÔÐS FÈn'!S ÁˆÇäýŒ h¨žy TUÍÑÎ òsk²±s‹K1y¢´Fù$ü{*ëm ¶‹uXÂúERE½gžLôÝØõ‹<Ï(;ëµ¶zRee­¡@ëÀ­­/T¨£c-enÆœHo'©w!>˜ûŒkŒ”?Û‡º®–qRy^{9z‰g•ZS¦Â˜²t-ôÅ\ãl­Èm‘è¾BL´Ô/ +z12<Œá2Ѿuµ>\êÏo•-Ä6ƒÿ)³Ü$©êáÛꊌ¸‘¥êm]”,0¡í"½Ñ~¹÷#J6NC :ÃX8ÔDŸóÖð,ÒÞȯ)û…_¾?â;m'IÞ]#½Zk{Êß½x}Ì!øî_0áï»{gàö¦æ%øusE奌Œ¦ ¼åVé¡úÕgcø£Šï‚ 8Å€îð1xhœMŠÙ;‚Ÿœä(Fê‚ÞøI_ýgÉÚ2P{Œ—5á§ï»¯¸ûTÅ‚¥ÞlníxdW+Ð æ±±‰kçù”°ÜŽÆhê±ÏAef„Éá¾kÆœ±ñL1åH;/>ªžïôôN½dĵF1_sŒ‹²5ÈÉ){i#ÑQòÀ\*<ÚÀÝq[ËS(ßStmÙ¶JJ ÜÛ™}4 YRh¶ÕÜÜ;¦ñ‹,=+Ôå5xAgý`{Þ¡=‡Wn¥¶¸BÔÑ‚áɆ?ï¼wVò•ª‡¾Çìúv}m~œóˆR«_ÔyWÝQŸFOÀ’ ¥°ÁFëp×¥_žû­Èê=h.Ïê}ø³<û ®eõƒúŒ†í§(xÕÎǺ¨›|0Ø{̇>W¨>[5ÙhHF/E^±_yHeè¸l Mè%yÖ³vºYºè·m}ö9W%Ì{d­¦.ösÕõ˜1IHÍÊ*ËrNåÊÅÁ’àunig´ÅØÓêãÆ©øsÍÍYªC)ÁyQý§ÉšQ†ÎáFÆÛ"7VtÌdÇïP};´Lew§9dõ•¾Ë<}ç·C²}©“WE©ãB¥ÅA)¡~­Kªë­\u$^àŸJäwWdl† Þ¼Ø]òÙ(@<÷ gSÛU Ýõðãçß©˜ýÜÿê2Õ`e{/¥û¨®¯@⺊íÝWÈË設¾ è?x…}ö3¡Nß¶ˆCß5LE,éY3ÙñÁ¼klã/ë(…¨ü †¦©F}U–üËu¥9ÜC©Z@Ìx¿“šK¬ ø±—& |^§‚t¡Å/ÇÛ V¤O(› î&FâŠà¾Àvµ-=Z©r‡zM¦ŽJeM­ê¯‚XÝéŽýù¹µ5&•µ«©LÊÔ‚é»”Sý×TüxÃ1O®Ô—F‚´ÎG\¦Î6$ÀÒÙ÷UÞüj“Ì»öYÙ@}¶EžoÈå/ݦzDo}‡“cgPŒ¨µÚêI›.7ãT­°e•½r‚[ÇT²¶Ûf)€ª³˜@ÈÛ;=Ze–¼]X®Òíz³sÖbÔPÙž/³¦ŽU«7‡“mkÂÓl( ˜y¢%EWHŠcÑ©d'†.ÁˆŽçŸë]«}ýþ“C°b/©À™àó¬«îµ(Ç94n˜¯ÈŒK(™ïzž™Ù£ÁÝ9>T• a HÓM´_Ôø'dþØ—Ë0؃Q<4Z-ó^š¤»Fˆ‚Ü-%›³õº’rì”ì–Z‹õ~š³ ‘©=ל”ä™úQlì'l­k'èÖµej5Hé½Zž¾\5å^aa=@UoæÍ`ÊÉ \nëò'™¥”T«êk}¤«f/2¨ÞÖ”±’XÝÏöÚ„º:Ò1+_À¤d€EÄíB0,‰.èýãêßS&}ºc\¸sѵ›úG/Ç ð`ZÅ1eêÛ!´:Ó­ÏØŸqðŒ.6†n $E§Y@ÑP±_ް_Yt”0ž–r*–FðvhÆÏE¬!~9ûžÊGØç¥ãs`.‘¥¶q–­ÿr A†‹+;ùÒf¨GV¨C‹ ­ª}Ç”Ö5M‘ѦþU½Pù*·m’¶¿–WfˆBoH>©~(uPFõDˆq+3¦53!Ö¥×öIÃ5Y–Õ3ØÛÔ‘à*ÍëùÙ.äÂG®¶s}âUÑ-×dÊý0ð½Œ./Þã^ÎÕH5î»Zä2OKëìàºh—×&]Ô6Åó¤+Xçˆ%Á ¥±ªƒYg/3#Kä¶èƒðžÀÜïiJZ ÅÉÜ:rÍu²Bd9iwµ™Xfå÷õ¥› 2\+wÒÁüñ© yiŽ ÂqlPÓ'V7µöø®‘Û)9:ÁÏ-¦H(à3ŒŒPãjGî }ºMÅ4Zåã7BŠÐ‡#Ut/÷Í„£Ÿ™¢VàR Æä»&®•´F•Zr? å–V!ÞIlñi.κ©Gª•£Mcä9b„ÇxúàA 0_Rj{èmÐJÑ.S=^ÇGVˆƒ°·/­äÒð¶ù¯FöïF~í°|‡9ÄšŒ»«£åiìÈ—Dq½ª?­b2h[»’ØbÖò´õ¥gÞè3ל0v–“œ"1øv^Úˆéíɬ°…4Ér?T¾Â“õ *LÀ9J‹ôº@†’`+î‡qt•¬ˆ@CÖU=o”•Y ¾øy3á˜#µe_zd]—IæOl…}¤j¯0û¦_h>Àëò ž.J¦5'TD¡:ëKX/=Ö)8›¶Q‹H]À³0è®@Ò5¾ä½]ºØ'.âÙ“¹>á˜AûD!&ÔñH Ó›—9 }&fu§ÝH(v)Ã34?ùê6…EÀmã¥õd)E»l‘ë×fòо\& €˜É0ò\\®ù¾jæÓþZ«y¾mçi¦‹[«®O‘°V2œ1».^öùÙW©}f¡ÒÅÞ­j)™5±£ëA®Þ¢ˆwWed*°~RïÙ@EˆÊ>7ÏV»ÙµÆ 9¬54mÎtª6V9¹$ŽO ^ ZßÿH=>ÌWà‰Þ².Ð…t½„a'/Z“æ6ä€ëQæÖëJò×÷óDV=Dj:àF'ÏvÅ‚IÞi>¯¬kî–ìb/k:dè±t:AÇN¦Þ„B€¿í…¯KS»·P#Ëyx˜’áÀ|„§^ZŠ­h†‡›*9ó}#=áz$¼Ã¼ÉƒÕjKBŽçÏÙ:Æ>U«‚î³¹-Û¥$·e_²–iÎ •­ámÛ÷½stc†7åVå’õ­räe³œÖt[-ý´'úÎ"ïeFôŸÈ_Ô=±VI±þ0Ë‚´6×?÷‘ú§‰¼„ŽÜŸ(,Ô ö¸ÑìíÐJ1ƒCS{Ërv•æ<.±Ñ‚;™ú¡&5eŸ'XÍ==+’²-5² eÑ©¡¸Ñ‚ ¿hì¯7ì¯D Ö„}^à äF¹M¶¤Òdxmˆ ÑÓ3¡1¨‹².ý⮟Š.ŠÖõÞFš|ÀZn:²ì1ÓñÖ’5ï6gs¨ËÓg;`§r1pÙŸMÇy²Èc…R­3?Ö|³.öø,Aí1Çν±›ê•Eäç¡’ÂLN•î k´ajÃ(¶qn¥áÍ”°* ª6)™ S[‘‚–Ú¥Õ€°)Þf܃›ÖeËÊfk&šW¿åÊém$+=›ƒ B†Ë–›Á{öP(CkÀ?Á‡!3êÅ}U—d\-ôL7Ék¶6©OŒtaR% ˆßyuñ"?Ó8Si 96[ø=/ 7¥dõˆJ 8óѪácSS3öÙª´e»5áµ¼ÙËiò];ô"ç™-‹<(¯dº^•®ãã÷ ‘:[x/Æe ¸Ð©ïÐ:µÐIv³ܤé6ÜdÏN{‰$Ì\—¬ëY{3Y‹K*?XÿÜŒ™ÙÞ”Âü÷£ Tcç"Ô?»·úªÏržÃ¥@ŸMÊÔúòO¨6Ž<›reX瑃k·ýüœ©ñ¹Â/ºXãön•›ÚÙTj?F¹>ãã tyIcmà*:<;è+YpU{ ¤-àOÊê1œ¬$F@TÚí3šÉî‡YY.4õàAbugFÆ{g‘ïzEpŽ7ïÿòýçÂsëf‡ôŠ;¥²8­d(•a­ n¹àÈ…šZà9=ú{ÏÌ¿47[”¨œÔÉ|Þ8iºë:ɉŒŒºÉºÞiÊj9]Öµ®ìn ²ÖÂXK¥¡`o²Ëº€¯<ÿBŸ2Ô“«ÕT]ïÁì\]Ó‘ªÝñSïÊÅp~á¡à›/%‰ ݺ®ì.ÄÐÝÔ+ÿ£.vïä|¶&üaOcâ}+]æû¼MëÍ¥2²¼2={GG2Û@æoò[ÓÉgkpͪž˜ðäyzêÌE¢7ƒ­Žo;¸€î'û¿9˜ëŠQ½+n@9B³È †b«‰ªÖÜTíãdG¢ô+@$6æÓ=«MØÇΨH7Ò…”>jýÐóØŠŠDÉÐLsÊQ^ ‘¥æË’dizÜÕ*ØŽ*$ì5ôàÎg°ÈEdÄFù!êx¢ç¶U3žÑKvEÞý,óÎTRBƒ1£`ý’uÑ”º—V%5l²Q]©~¹Òðˆ ­ [«j ‚×p˺¶w«j0d¹6°ÙôæÂ]Y7ü(¾\}7~ÂíLÏìÉ:H»zfóêèBëºÕÁ+Õ>ÌÖ¢)ò®Çð¼+²ˆ ==ÚFÊ» K®"…¾”éÎæÞÁÞšdu(«‡¦U¶þ×=9r:”î@V?«z½¦ôÕ•w=‹L¥“]zUÅ@q£ôZ’®çåÜc´f¶é×Å0éed»¿œ7YNe›$‹ Ô÷q¥¤A¡.Ιú‡^é[dsƱ|Tt´a¨Òñ°~×ÔQ2ÅóË 2*.!k{ÎfíÆ¥u  'è®¨Ž²8µÝß½¿KÖÁ¥¬»‹ÓøÄee’×¾½f,›M-ˆùö|ÔŒ«†÷ƒ •ž¹û¼bŽD~·Lµz˜»ï”ÄìÇÁˆ½ri+¶T]7Vì¬kùŒ-_U@»31êò¢x']ñ2KI¨ä{bɘþ8 Ƽ:™`ƒªœvl²R¨5­ÀY-(þ5ã’‰Íß#dtGS82›æ“¶ÁP«Sm‰–·v1AÖhq¤Çlò¸¯S}°ßžD /¯afêÎf*%[9ü1¾j«ÃçJwxí”ÚÏkTºBÓt +¬bõ~Wì­V×J©4V#R.ƒyÏhºÚÅÙN$Äñ"6BÞ c5â’°Ñj ±¾|ªf7u×Ñä®fù¨"ãT¢¯~š_‹þ$›ó^i¬þ~gN>OnD¾èœ€ð{ æ@Ç&G*Ë#d͸èÈÓ`%‡äõÑ *93Dg[”Žà"™±Æ`¹ˆŠv¦Ôð3\5ˆv‘儺9I·ÓSRp·¯’:GÂ0¦7ïg!¬u$“ŽákÍÑ"6u3×.%½Ú,QSádBŽ4¬ Xƒ}TuÞ‹wïpF/ÎGåM(ÍgjÄcÏ-œ3‚ãÎéø¼/&sGk^¤Ma([ýÊX­7~å¡f ÈV•]a{W¢gì±õÁÒþ\¤B LƒeîµhPÛùKGÖÚiŸ|?|šÑ¡—ë–îj®\Õyù9挾‚£S€M¾j¨ˆ kQ›|¨ç_ÆoWM†úÊÔfœsÇ36Zý§7/¤qrFåM™Z‰Å»äÄÒ¨ÁÇLªÁŠíïëíë®ØO‡¹Kn·aúb¨÷¡Qëâf(C‘Wr¾ýÒ©-κ0qÛPÞì(å¼gF‹5¸iÍ ÖœêtÓ¢ˆ.éÁ¸Gt`Æ"—¬>>’Ä/ªåpä¹Â¡¼Äeêr?÷"¨‹®ÅSòÜHÙ?E¥#«ÁH«‡#rÃ#þ5+—$~íÉæ¬-™ÂOqdTP€‡d}4ê(ŠkPÉu”\ˆÈîéáäÙ½~´RF!œ5ñYlÁ^Û¸nyG‹FLˆ Ž]‰4®5Jjš"ÃV“ì9›OO#v}š£¥ûçÔ#úûjÛÜ΢‡j†ŠÏDé®ìxÞµªþÍ ¢ OãÐÐÍñtûJÂÝ™ØT ¥½rÁPIó»D°G*ȾÇGÁ,|»z ¯XNåâ=FÒڃ؄‡pgЄ|V¥AŒt‘¾ùpë ©ÖÑvÎAü«2¨’ÊáÈkÊp®9> /9&ä eTOÝŒEOÙïÁõàãl½Éí«‚1Œz9›ɘl¨—öò;j,! h‰8Ĉ–çï …ÇtïbY„ÃtZÓ'<Ï“ÔÞ ÒÒy9¦Ðƒ8™’®² \ø@ztBé-c¡(¶d=¨,ÅD­Ÿ¾>*[u/%åžÔ<UõP¹©»8ö‘¸‚‘é½Tçg'áå~W¦Ö'5ï‘| öYÿ¬­Ÿ$eîyÀhкP2ʺvO üš†°q°~¯Ü¥Ç:GZ×])Êœ•&XïÄI… ‰¼ôvœ[qñü•Ö Ø}ѹhßܦ#EŸN™².hMÕ‘/- Oáµü¸gÒ;³5ò ß{¥†plI^ͽòò€žX·*“”¸öXmPc/(jf'zÛÕˆ~å–Ùç3CKøÊo¬þQh ÒhâbY]“ØT†>–Å©.îØòç$u±‹öÂÒÑÇ#VÝÆW,Ÿl=¶ÆŠ –ÒÔj=W¦‘ôô]]âI–¹•<ÁçŠó´C:A hËüœ¢‚µ`_s7ê¸Ô¤~Õ_N°°–›…Ê¥¶…–ZŠrõZdPkQ<Â7õïnPð»9´?éÀ“¡Ü¯4æûæf90ÂÚÿ©Ô&µJuгš–iÈØ’˜“ÏÖygþ£Î÷ªÉ4µ\â±íŽMÈÚ°îBÎd‡ŠŠ¥6êU_³¯ž£«.ÇADîážô¼ÙôØRÔ¸Ä&®5 ^²?¦¶¾â +˨ç +3ˆ cÏ1^Ä}¬¶Õs{‡žE¬• [­ch›$êdÔß÷’¨»Õ3/×fi•&©ZoÝ0¶iFýH¦½BEÖå‡Eƒ!•<ë k)…vJçN‰}ñóQ«Ú‹žõ€Û[¡Þ;úڇ~Í“DµµÊÄg]åc];×dÆ”|ˆï×-,è¨AüŽ}Šœ£í¾ë˜–ˆ>ûÝ“N¸¦qÜí¥œ+ž0ÔíL•·ÚŸ)œíÏ9®ZE­ÖÏvN=]ŒÔrÔ3üîßuòù!•ÔfÚ®+[E ÓW‘€ Ô{S:¨c“Ø)iÚðü4T%qÙÏïpözÁ-›z—dÄ3t On|‚tXÁðÞP¿Ž-í”`YåëÚ)¹…&Yž«`˜A‹>ÒwõÛÈõ¹ãñ±®ú•ƒt‡jFlkê± ²ÖF:p”¹‡uuÅÖï`õWÐ~ÖâdΦ|*¬QjÔ³étCØi–AA|'Mmmõ+Mxjëa¹jк^Ê9¶-Gž«Õz®vãÎÏŸßøó%¤7ÝêÇ æûW‰_ ±8o«4÷ôa]ënH*5ÜàìƒÌkÿµ«4³iÓ·{‰ «H†Þ¡ÿäê:F¹eëô´óéwÛÈÈXr ” ƒÖõB’.”0€ŸX-¹Ô^’KJÐ-’KÑðæú†JRz=0÷=².Ì"¨àl¢œ'UݵªÈxjËjkÞI©è_ÃæL­÷žÛ—6CT ÙËî+w Q÷¤±bG0›H!hÚ\0«o•r`ŠS=󒙬×úŒjäÇé9.W»Á’ Üȸë2®órë*¥dó¤g¿ßuÜtxÏ“ÉÔÞß)2µZ£.8K)%iãÖÊÔ¥Û¤†úgª…æÞjŠŒ'=«ÿ*?sºŸÈXoþ>dÊýˆ¼ôšñJ‘Á¨n9œD4vÒÅà_;Œ)6†ö‹:°Èl!ì£Ý(dR®HfèmŠÍå6²:‚{øÀ/ò®ñY“>!Ãd0nGÞÕÓw=ò¹(ž³†+Ü^$];[»{^ÑbØ¢_¾ëmù]g®›Ñf]IéZ–lãen9ø„¬d^¬h‹yÞ,AáýæÉ`¸k ’“ÍIíxh±®üv«çÞºˆjàôCb ÔŒc¦ïzuNUÍñîÏg=‹ÛÎ~”’Òc Z5ãKZZÈ„4Z|©-ÛóézÒÞ€#óÚM- R$ h À“u*_êNêÂ@löY1˜ŸW%híé A€qRò5•̦Ny|»‘1ó%ÿ jÀË4®lnœ™l©ä¸—Í0åfËóÓŠŒuÞl^¢MÀç7 ©°Ç»ÿŠ·LRž¥•tCEÛ&ÆKù©[íA_Z’uA 2(3¨½ðd_Ò«m½2NÍowöLwõ|óRV_¶Ý|2•Á€‚³?ú~uJUÃC,Å3êZRÓøÅ!n Ó ßõîqUÍx¤ñ¢$LÍõÑZjwž2´lÛGLYš©Ï§#ûŸÄuS§ÈD5¿R#–ÁFæ|aEâ;`»Üo²V_vÆå#ù•Tí1¬H²}Ü“,ƒÇÞ5Ü}îµ¼2±Ü£ªÁˆIº+&Ú4¬Ê€VhyÐ_(lº8‹ßÛ¬ÆW|Æ~¯,yÙÐÁ’ý®$…2Û ¥`¯×jØK¹@dßGÖ5jÏÆ=hò]XST­‹OËIP€D©ÀF`‰<ÝПµvrнKki]ïirÉ­0uSÑèÑ^Òµ>–FÚ˜®äXèF·Ê'A¥&µh°Ô‘ÇÙ¼xy~c&/¦1ªf7Kt›æPºÀ–¦dÆØzŒpD%èóCÿæY¤¾†Ë,·è|®ÌýyM…ÊÜe(+ìç³O ÖŒ¦žÜUócX°hËÊeVaƒšÆï«÷V>T½:=h€Ë€µ°tzÿ^`dƒ |¶Î õ‹,ˆé¡îÿ²Ç}R0òÖ’5ÛHS{9§0pÇÔ`7 ;ùP÷ìÕ‚‰9ЃwJn} ®—2&vp^Ò‘O¾d-¾­Þ ÇG@r^zàóVvñßI:ºØêÿÚÎøB¨µ8‚AuÁ Gq­¡?¡‹Þ®š ·æŒ}‚41Û»ý2ëµO0Ô `SìÕczÛWƒ­÷HÏj ~qÄÌ2s°4Ry]¨íÏF½ùhpÈ¿ 'ŸlCMœ)…z™-ª.9(Gðã 唹û¸5“Kp›zvHºÜU¯©¥]d±)Ú+h¸¦ýªå«Ád]z.AîÕZZ×8dÛ1­0 bNìsîÐTð¶£Ü¶C!»©Æ“Aó™dÖ–uͲžûä‚:4ó:/^-øá0BëQ³ÜW±s±Iã¾»“™äEß]ÙÞØ9‚øC¸Õ£ÁánvlúEãNÎ$ìݬ¦z™-­ Ý…‘­¢Õ™¹ÙjiMþ§—dÒº e¿– e£xP²lvEÌÖ4Ö,ºÌøÅóD/½³ÍW0¨,==ë8{É]•Ì»l9.[s/f¦æh3eFß©âò˜!UÇVeøL’«x.-e±^*CQGk!êpBbçpýz²Ð‘ÍJ„ç¨ê¥%ŸòÔ’ê ŽËáäÑœßø–»\Ü+¼–^Á-ÎÖÿs„ X=© ´ï. %JèŒË !ºËrÁ™Al#æTJj3;. 9eº%“°ç€?è¥[>’…Ïw =¥;OU_lf7Üh ŽêµQæÇßÝRÒÙ`ëM³ÀYÕ·åÔ­OW®|ÒN2(P²4¦æ¡(çlÅÅlÏ›¾w½”·–0µ|ÿŒ°‰¼h¿\¦P🣤ö#:WÉPûMëšõ2䙀 ¹w(ø›Lm¤œ,bf­2µwœµÚmã¿L¶[ðúº©ÍÏ` -* <­J žÐƒvÈEÑ‚:u'/v` ýb”©loíþ™$\‡FÍQvR"½,'Ùýúà¤Ä2·J8úy”:µ™­5È"SÓÁÙiŸÚkuÑo¨§x‰BÔûšbãWÈáˆ{²ã9Ó]Á†úÐ+ØKS áõ®§á`Pü{‰w2wB¡EP‘så›A6'f/ ‹h ‘á‰Úýò¦P–Ç7"w“¨\溓ïQríÞAb¾Ø⎵͠ ¹â!;´´‰Í™¬ôØVW£nf6%¬9É›£'Ôç…æžÝÔ³[ª_¿šêÓY5Û­‘ݯ«Cf¨À6Ž~²‘õ~‘*Ã;ì‘ÌdÉÿdHi…þROÒ(À©ôœGÝ kYJÌîÚ‡Õµ]ÎØ µ·LòݺÅë®C†‚Y¾>niæGS5#@ Ÿ÷ÕÑèð.ê:¦á0¨ž‘ÿ•‚¨V‰v‚oË*žÛæÏȽ¨© uC„1h¬K%¾°²Ûej’ÕµØsJû_z¦J`ùŠ¿Cü=À\ßEeÿüK©OË¡x«çû̃YƒÁ¡dZöi’û|/FúE ?Óc–¦IB•¼M´1ÎReˆ= Ñ<7ÄÉ>:°üEþÚç8¿b'ظ/Õû¼3›ªeØ]¯U°ÙÜŸñN™äË¡þÅþâzÚ]>~¹o ¡3%ƒM]ªø^-BZ¶Ë¤]Pôª¹€ýZ€þ£è”¡í.–’š$€>6¡ï‚iÉmºoO1_ª–ŒXÿäÝŒ½³¿–ÆøYÆRèžÖê‚AÉy0;g-qm—iÜ8D!üà:-E™¦Q€Þ*רüñ‹„˜9 € @* ±·â–\ž›TcƱ¥œÀdéCXÄšë!²ü°U2/‹\óy?Âv.þPêa¼`Säâ*‡žÆ øcÚk±^}fMµÖô‹Ð³Ñ ½÷C¿"¯ Ò ‚¡Gì1ØÒ>Äc£g^•½Q³ÙR¿Jf6#Uê"ÉûYŠ^w$£*ôi6íN>,ßjt…tÍÔøàÕÎa©Èá.6’µ¹–’µÒ¸ö‘So4¨Nd"HDžu–{ɹn$ð$ðúS憒ÂUÙ‘å‚Å:Ýgi@H2mØ.½¸…‡Éš‰ÆìÝÖ­o÷^¡$Úî&ždñèÚ‘LÈú”1))fÛ(w)*HMs€é¤þ¸ø³Wïƒ>|.‚Mm‰ÂŒy¾QÖ? ¾½W6´bÜsò0êámI½äW‚&yï^´_ʤáyã)Éhúèz¥Ô"ë‚…w 3œª}M-qõXq—#k½'_áË¡%“Ž‚”äuÎfr3ÜÜrNA+¿ñ¢.ÉvPšŒ9¬X&ôbâP†rÊÐ%m¤ Âr•$Ð#µpÐÂ|XXžÛO)°º*n¿Ó“=@ë¿ÐW> -.ÇjwŸz0/oŽdÍt<6o8ú]Â5°²m´‚¦ÆÍávê/¡X=Š^'БÊ¢¥èf|ÉEêº}¤°E*(­Ü)­Ê,ô²K®æWÐÚÑ ÐU‚ŽVm)ÔJ*ûÞo^”ÄŒ¨² ŽÀ©Ž` ÁëE%3ój”^±š"Ò¯â#³‰å¢ƒi\–)ÂiÏp3 ¥`w‹**ö˜×”Yûôt…ÐÍL“<ÒÛ$ƒy¼²ElaP¦™)b]d ²öYIž¨öÒYq­ô}ǹâó3* FFؾó¡:#üŠ}~ÏmÇ!Ÿ»ñçe?è¥Ã|eÕ‘ ïíAUVÙ¢4½¥üº&.~IÖ¬mÛ§.Ú‡t¡Ûfo¦áeoÙ¸¼”“£E¢¸ÅP¹!0P±„1¿¯‡:ä,ÝØÒ¦ê,ôG¼eê:A»I‹Ðr¥©•@>‡¬Ë¾™èæÔ.æÌÁ’o\7>²—}4ÓGÍWΩÙi¥2€¢»Ûe]ýs``’!máŠõùdMÏœšÌ›Viû·~ŽÀˆâHÛã+3:Fòß[S zžÐ¤öÁîý, BVAz;2µwïÈ–Œ]ŠßxÅ[Ms8S;ͦQ7UóCøM ÔÝùqLR¬5°¿„1µf”ÁbåN©­¤èÅF‹iãÜDdml]™x µ1G­•2¸ØwpNòé4¡*è½ú˜GºN쪡ðˆDéöH8ŒKýPéëZ[lÒîê—ù¸›±õYF*è/…f­cfNLžŒpv±º‚‘ƒüéFþRJ^Ìž:'ð Ãû]5å>ÆX-›{Ï[}Z ýäŠJ“²½ÍÎ¥h 8ªÃXCî‡÷¸á†œMý´÷Èi]–±¤šÅ,5UTvqÚiòõì½ß×ôQëí«{·¸ó£K‡&®’í—;¦çÁcVy ¶Á\0¹Zï9˜@ê(A¶¥,Ö¼º§¦7 Ú?FFpájYBl&Ëëµ’¶‹ »¦µÝ ‰ïr µK®Ú[4Šïëf6—fŒäxñb?„ˤS>Û¥%‘+TG©êìúÄÆ”zט`m—§Â##B?¿P ­—iî«*'Švóm/Á3«Y¾“àéêŸóú¬Å)GÛØºÇ¯¼"Õ-HbÏÑÅ+SR5¤+ž¦¼'Õiûœ©ºþ’ð-WL{ãÇaÝhë1o¯G]cé6i“šüD(ûbb´¥×l(°y•‘Êó²“éŽúÝ ~F‡Bò Ÿð±órÀ„sK-+Ò{ñ™ýrœTOµ8VìÓ[”“rˆFÚw¿Ì.É4¸íÑôœûW‚( ÙÆó©}üŠ>Ùõ2ÎJ¹\Î-ÿ‰Ñþ‘3­ž;LgÄ­”Ò²8/Z,ÿ¹±BH ¿ÝØC¿¢îžÖ†;}Õ—ˆXÆâªëÛÛ±T]×s·beöµªEƒB²=>ʆ«Pµ ŠÙ•2¿(ùbÖ2@x¥g£é¢ì"ਠ‚DܳÂêw7ÖqÇ’ž uå[hõñ{C×|Èî‚fÖ.ú‘(‹c)Ru}¼rT^ñ¥ÑÔž¹›¸ê:ûv[¡Í&B»kòâ—8r¶ÞÚÓó@gèêù=[ %H£ÆX7ú´.ãDíq4¿Feê‡éÊfUfrêí£Yʇآ”£^Å3:2ÛT¥&à1š½.cŒ¯ÊÂ÷ ‡n:œíê(!wP.z_¹ÖeËÁÂrS|xrÊÙ …Pd! >&±„êFIhEÇÇ]ÀÝûµ³â3í\æÍZÀ5t>ëÍUÆ f¯“VØü"X¬ŠìnÍTW,Õò ÝTÿ±+èøÜÇ…~èt>i¹U•…ëi¬øÐEê‘ÎÎ9ä6¶7ù(@›#‚"ÍaŸ€º€‚Þ& ש,j0Ó,A‘ƒ%¶‡â«ÛþW2»gNn$Yäaæ¯>Ýû÷G”Òýù×¢ï«uÅVð½ ýòÑ›~D_ž“»âqŠ=àr|dh§³™›ªÈ0w޳ϞKµõøô(ª²ÅmRK‡êüäF3•a_˜Ì¬©Õ9”O½ÿ?òãÊ»š$¼3²õíÀ¹ 2hþ£±ÛV óÎKÉ cEÐØ±ÉƌًÔRÐÃŽ#­E¹ÂtÝSg¼qŸpS©vŒ–wÄc‡*o½Ïîdfõ­•TÇLY‡R|ä³ïYY$`Nï[ë~.Þ³ÐÇÍ`@ñÏ>#kAÀzi]нMM•0=³BáQ:&¿CÐïšïÑ?*hãÓî Æ5hw-À–Ñ\¨:Jà€[ôP€äí §çô«4îA-kÆ÷wŠnë è‚‹d‡bÈ䊘ÚbÔˆ4ŸtÃ…S2­å4±Ÿ&g6gçn2lL¨ü+ï ±ABÛ²J¾ÔÓ NÈTøÇ}uÛGl¸ÀÕ³£ôkºLø*rY3ïõdN™Ã–GÉUT‡:™wa`«ÈUìˆ0ƒ¾kWjú&›v°zwšÃ7%m!ò¢^Z©òjÍÏÕO¸APî…áNé£È‚œ@öÍzHi]ïŒÑºùUÄø+1<­õlÏóʫ={"d-hX³úŽÒé:H¤E«¤öÕÜ•cYèÖîž©ÈKê’_n kÀÁ§ñwÕ<Átåm¥ÔNv*€[*:]Õˆõ†ÞvׇI»ö<™X@$),÷U BàšZ ý-·{Ó'ݽM‰€N |îR(s2(ý£WsúîçJ^ °ì„yÏ®Ñ"JÕudj£­ºàÅÏÍ4Ðü’SW¦Sš£äØ䨙Í“ª³û }®ä–¢Kåu!ÜÕEå“ís,~öÄ”©²#ˆaxèóð¦€Û­ôØkKBJuW=‰-F|O ühWï{n(—°žgåŠ\À¢ Û°u~Z—=gâïq„K8‡Ø[ÀLoøo]‰‡\1è lc[ËÓ2H|I™döv9Xº¶s¡@;B’*¬«PlÓ|ø(25”£LTMÑ<Ðæœª­X³G±â¬N×H ög¬[!Lá ØP]?7)»Æ‹=jCÖºâÚ«¼rà‡]™rmÞpƒK¯ ë69²>© ÿkóGaäÔ‘R§hÍ1wM~]Ÿ<à~̦‹9ÐÒ8®²¸Ì¡öÞ™_Äça¼¸®`ýZâöGZæ<îÈcVÖòúù‘i.gT G­­LÒ?DS§J\c5cSkcç–›ÆãHýÚär“0­ŽBc.»N=1(©éúªD5¨ 0ìq¶Uhú“³jä'½ÚóúijÏËÞLãêé»°º ‹>nj˾l£g‘‡œN…¶-3)PMl)”ÞÖñc»Ü’ô]Ï$S%íÝáì'ì “X½‰Ú¯`k*pßž À岌6´Ó5¯®ôXS ¤I]ÄúÆ ¥¹:•†´hŠDBK<5ù×®!Ÿ?Øœ Ðô£´&ü˜uÆ^§µ1ö&>î…ÛÀ†x*2”rW!ywIk‡QôÆ8Û\ý5b‹‘ŸMÚ³ÈíH^ö»¨D`‚K ©ÝÛg£çžLS'7©ýß iœa¹²H(¡4ä¹Ã–ê¬lU•™٧̯s)`¶OfÞ§$‰ã,;³Yˆ’}–okK4Ís­#milÿêÜ(õ諲*óPö,—„w.~%³)ïËiqùDk¼{p“/ŠŒFÇày×;W"ôƒÆK«osWÚ'šÅ¹ž\.×rQ´ˆ0 èÖ{¹U{L ×pê R šÄªmÖ+$¸Æè”°øÐÃàªÀ°mÊÍÕ¸Al2Ô7m:ÄŽu_¼¢‹{~c¯TÇÔ.½2C‡Úä5ž+¥©7nM]ôÆïmr¥h‚3Ll}ÜKq`fj«ŸíU™ó“ÑÇ O’€ï´Iw™]ýì¯:2h_e7õ¶!ëzió‚Ã0JMo–:äÈ c–«Çsô›{ß™†·³ ‘jkêg¹Â¸{.þ@Y4Œ¥wÂæ–1¸Éež)‰ˆnÂhñ Õ@gk»ûÚ?U¨jÊÎÎ{—,`v½‚/tB 5c4~Mÿxë‡ì_zB´7¤úÛHÂÈL ªœ:rŵç Í´}þ0–’ÐGS¡3ƒYçöõ×ai›Ê°à¶ñ^½Ëa§ÒÇA5aê϶gâ ßCcÅðêÑS仌²+ÙPnZaŸÂæ˜î[&ò/â¥ïzX‹ç—šŸ­¢«õ:ƒ SîØgZ£ dÇÙP ‰ˆá)âÉTë%ÞEÿ¦qqÒjþ>|éÉ&¶·Ï´pÐg`W)¿Í]WËÉ‹H¶MœÉ6 Ê‡”£¦0ÇW&äHöTç¦Wé#÷ÜX_6” -&Ò~2•Õ‡>e2›¾eT9¨~úŠC¾¯ž.%˜]…±ê³–¢ ‚™Ð:´?&í®L±‚=[>Lö2ê†R ë9ÖdŒ2Qwç·ÁÑ{!u‹éµÐÇ-Àù»R­3¸fɱtAÐŒjý£Àº)øY® ¤PªG‘5ÑŠØ4ª)‘ßw³ï‡°sµôe¹ ðµþ T¿rÖòRNŽX­‰;3¶IƒÂ©ŸIºPfÉâíÙÉ¢³yßU÷Ø~ú&Q-ÖÏ,¬šÜÌ÷åfL±jÒ{ð5T3äªÍ™¶ÐîDº°C4Ö Íšéó“ÓJ8|C3ÒðYlèBä“;hèj„Ó”`uΔ©Q7ÌÕ?1´.[—Žl 'GVÊPÕù~]Ü5ÄSà…ÄN–Óõ¦æÉ«ÞsRòÞÒ>&jÚÃ|èâœWšå‚;²§r1˜w2LöËáä¯ëbk³«Øò]7d¨‡ë‚Nfõ&÷xd]/k½¼9Š‚aè—·Ðï!Ñ"Œ÷jtS7Ez}ö3èl,?rWϤ«ÜÈ©"”["AÕrRuþiý£rñËâvÄ-$‰mgÔ÷Ê*§Á›ŸPÇ ùlD¥öäc¯ ­©¾¢âÁ¢zíMÖõn7õØQëVji£hñ±+Ïq©…6±û•¯u{Fçuj‘uí¾S.¢P'”‹ÏJ¢¾}>ü,Ï%1#ƒ6ð ܹsƒ±1Š,5(F¦ßû] L#ÊÒœò™až¢õdÓÙî².(kžË‹{GÕÅ JÙ¸X!\ä¾  á\Ÿ“,,há ò¸`Â3’Má…à™©{ˆZy‘÷îcJÞ½T’‚ŸÐ7šLä É«WÑ‚®:"Ï#µ[×hN?R}£õ„Ê+>{ú”°º_Ütd¼tJ\ü·ÆÇÙú.é­¨Ì45hswš¤Þ¦ì³µš…èWxVÛ˜ yØ÷[G¹î§ÇvíØ§³IÐÈà\k“uÙ,"IFoÛÉÚ‡’?GSc±°7jè$ؽÄêýø9Fl±wôOmùiŸaë?›ë§ó}æŽg’¨W¡]z°Ú^`4¥òy¸“‘±Ô–Ã嶤TƒÎ¯ô± ña®FÈLëQɹuõ;ÒºÖ Á:ŒxÆŒüÅäôf*´ ðð×B@Öû]ÇÙÏ«G×¢0ƒzž¾„Ib ÏSåê;ò!ÆŸïÕ²°LZîÖ¢uPúrGG$¼Ÿ3c¸u½•[8”ý¿ò#~Rà>›ziçt¦Zï窋ñBOË@ AÅEë~X×ÅXsFDþ“¸ú:7Ñ!ËØô9”[¶9)ëcfÿ£wY×zy8kF ‘(Õnƒ79àFäÍùiÉ’^ 'ßà:NA¾cR ‚%•X³wʼ¹³íŽÖ•y¸yž%× Xc0tÆŸIëªwQ» 4÷#óQ÷]Íñ‚á»êÚ²®—’×#ßU| i¦öÎó}±í-«yqèк|ªÐºžsG¾«Ÿ.ë¦Éº‚cË­«{GÉ­ëYûTdÜ» %a˜¼)«G†/ëÚ;”µ}öÓf «qV†Ö@#/ôÞM¸Ø<4Ë&‘ϼ^G; ì[â²xñéõ„$Uª®ƒ„£P·ZÏgI•úîS-€.wé$Uvì‹ÀyÎ*¿6!=êÓð+~;©ðP¨ÊóìéÈ!Ï» °ª&Ä êË»VÙŒŒ¦®XÕB(195ëוuAs¤ÐlžEÒº ÐeP·ø wÅìØ5ˆ¸Vшô(àyW_”S‡&uÉdí„ä–K°Ÿ¹•âCéücÞÕF§‚,œ©Ïª½{×'«¿w(ÕzÞ˜­³•¬wWG¤m1ﶨšq‡ºÛðm1[‚?»©<`ÍhŒÍÉÂòn~WÇ Y\Z×É&½°Lܦ¯XeŸÃîÒ¤]feyc‘ðBžØ>ÿ–Ø0zÙ‘Ú]‰ø“òùË“£›^v‘uõç×Ô&ÝófWkÄósµ€ : Q¡¬Þ'é…fsjºÀöµ.¦Z†À)Ìl ñ9ÔïB}»Rh¸P]ì9ÒC MÔõ~‰ÕŒ­„·òPvúQ0ÄJ³jÆ— ±Wñù¯KrÄÛŒâNs*䈢al¯h,;ú v*›¡ŒÄm½Ó÷‘É ±#g¿•À–36®‡Ó§ï Ëð‡äíÏWÕ%9Ñ9‡!áf§fzk~¾êJ*Êóµ s+ƒSUèüŠÅÃR–ÜIX]ÔúH1Vb«ÞáápĦV—âs†¢ä$í‰A¯éøÂ–¾I:tÅÌ1/E­l°äZ7^ ¾W=Y¸+È.LöÒluï~ O2½ßõÞ•ƒë߫܀Ž5=”¯/Uçd¥£1¡vãàlÔqmÔÒÒ]í’ÚlÀ“/º«—‰&ò«îú‹½Â0³úÙ‰ÏöeçÀÏy–ï/ˆT×cƒ1†rå2™ÁNºÀˆØ£°e\†MK‚̹L×1ÏúÐÂ@vQc…¾WÂÜÀ¦‘ƒ]N¨6éáð‰XÔp¬•R®/Y`ò7JÓOjÑ;öY5¸þdjgFMe“ØNY:p––Ó$ÅØú_u¬lBN ¼r'5ê@ÎÀ@dÓM ¡ü+Ê›­§ßd)W-–ULjÁ³J$ÛÔ{Šò©~½ÚòIDÀÕžG³?³«vS¶­\NXáïÖ S¿Iþh„2x§³¹½Ð]!:¯¥¼ 5yµDLΚù*´®W‚ØÇ`„ ÷ËÌׯG»~•‹‘†kI¢´Eµ#hê—L¡?‘UÔƒÅ,Pz-HnÓ}û”I¾2,A¢÷¨Öm6ÖK¸_ƒ²<õf›Û:ž+'¯âãüÐÔ¸:°c8oœ ÏÔ¡ß\ˆlÓø0÷Cë‘5‚ÀZ‰qÙM3ÿ©ñ4T'ͦTvãP–—Ëò¯K)Úôv¤bdÎf)CG™1è¡ö Ä¼ÑÕIbc½[d]ï˜sÚüUšìdÖT¶ÇR¸Kq‹ëc]HðräÛÚ& õEeÁ}8ìK‹å ÕHÐÚ{Uý\—r÷WJäÖé‹QIÞ)lç-¼šlÞ…ª\K¬Ý>BùbB¾’¯þœ•JÏO§>#°^<0XÇè\OFæ­û€~×9:Jt×:r³l¥økjœY{þ¤ÚÚ/*&Výè¿–wó4jó#»pƒ;€ðõ#‹µÎMÛ8c÷‹`v&¾«êªJt…`¶¤"*¾r?€ÁZ©¾ä²CÚˆ|ÙKòDƒ¸Œ~Œ#-å5î˜sÛŠ_²•c#]¯à‘+INŽ`¨j9yŽWÆ$ÅùAE›$¿•t Nü@öz‚]íF!žä½AíîêHˆµÙì5ógoZ!h}&e÷œÃ¯ñâÕŒùÊm_ÇÓ[z÷—ØPüªƒe´ÈXßGç ÇBü>(ÞÜ÷¡qzW8E &Í覗7|Hˆua‚EtHµ¶J%t¿ÝŽ}ÆîSÂYõÊ,%eÄë:”ŽíO˜7ÀÉò/è™ê«J˜0ï!ø6ø/Ю<’ëDk|mý>HRo^tÜ"™Úª µkƒz­8~!%p•XíŽìX$é÷˜tu žu0ïBÐ\ǸPµÊ­Ö„´=ý”“-)JtÄil.$yÜz`,QÞZÿA¥4î÷­Ê»æUµ…l}%D·ÕBô "cäC°Î##ŠK™Ú™M¦Ö‚ÔÜ/J쵬!ëzEù ¾ âI7»©˜ÙËw•AASËKzö»vn£A\j¶€nH(x hîܼ{IA®‚)üБaðé'„P¢-»f¹fjUpùg9µ¥©½»Ò"w' ÇªÎ–Û¢÷ÿ"ž¡³×´"3øYâîjd™ŒÊfÞ ÐÔ¦è!²Šžžü£iw×SÛ8zVË›g"=ÆlU& ]”»†`8¯jè)Ò pÕ¥`* ­ø„Zñoï²e]u¶ô]ÏÃéÇ…m×§`Œ¾Ñq¡V Fo;LÈfe³IPìÄ– y>’wmÐÜíav«¬"âjþoîí˜uõ²–Ú¤ Žì|~m}H^™BWˆÍƒÊ~³%‚”2‡¹ŸçØ*+Go/Ú4]ô2s«¡Í9³­¡ÛÞ|ŽZRBmê…¶Aíjoû¥ëYWƒ]þ3Xl3MJnaî`uݬr6Ïó¤#ëÜ£õç®ÞCÞY3¾´«(»!çà_rOó‹rn]å+U‹Íù®W1ÔØ%¡v·¯ì±¼Ä¦¤uÕMõ9ƒMXÉM4­HëBo¼Þh™’®÷«ÔÝö¡®Á¨;óý}¯:æÉ®R–3Éöa”jr+åÔÖe'¸›Íuë Tîµôƒš€?s¨ÏŠ>äÞò]ïk³fD¢¸¦ß’¸ìènˆ+,™ûóIl²tÌëhÓ ¥X‰åßwS÷³éÅØƒ­ñ¢‡>{zµR?ûšïAdrŒÁ #ãU*Ù}ÓXŸ ŒÒn2¨’1nP!<Õc“E2éXA=üG˜ûòtL‚JŠÝÖüÞˆÇZ‹·upÍ9š˜ÁpHŒªÂô $Ñ-­kTjw˜Êô7.ë _˜]üQî7ß×ó3yÌÏ"Jë9o½g’Ê"—L­_2xµÅãv=WUçÞmÊÙô­}ªýnÊÎW€Ó™Ÿ·Õ£[uUý%´Vs¬[Ú=h˜Ø$ˆ5¸Ï.ë2i>gìû]F˜‰)oº”SD†Iœ_Õ¨½«ºáåŸß†Ù$PüYçR u^ý¡ ¨Ä*üÉž~| }¤æmßëÊÆèYã£,ú’Y9j€HØ‘øj[_rÅ<‡¹ ’ "Ÿ1عìS’ýŽŒ+¶À|Ï«rYê…ɶ@EÕÚq‰‘è%Ç+`ÚPÇìåÆ|› Œçœ±–&©áat‘çcxE%è”°“²¢Åä|;ˆ(~û¾³×[VK&­RçüÀ>F~d]Ȳ7•SmjMò ŽøAGî¡nT8e ‹Ü2”⬼1º9ud‘×X|›ˆ-©#l½ e{¬7Ùv¿G, 0¨•Ëï=ÖM<þ•Ê·óôD´½RѶö– ‘ù&¥/›‘ÝÏpõU²_X#%µmŸ!ô³i2¸¡¼•þ+Héo²òÖ–ý.ö&–bzÕ7‚èšzý¶ªW€Ð•©5ªZ{û¬œ©"áj¸éýšêÜ A)6êì]7Oû¬É($XŸu%xýÕk‚ c:­%,¤´.#¸^š›ôµÙZÅ.‰Þlv^®º%Ö¸Üï®ÊzðÞÚKÀB)®Ô)3žmç+¨Þ3A/.ðöY-ëcP#ñ¿Ï…7½ÒÛIÀ ž¬šàKÏ=èW ÒwMÍd¨å|© é0ñh÷ý0Ýq‡o\ApÀB9„¸Ÿßì«T¹-k(1ð™ì×R# $ÆJÖnÉÏÒÊ©zæ³8²»Ç·± ãÙ}§k#>ë‡ /™ñ“¡Ì8TêÔKh/%ò²XBN7OÒ$¾²0)Ü'LlëÁìº2›—¢°×î†`Û•¼|˜ÝПlPÙÁJÃ˨3”Ý ÷wªÜõ±±óM„CëSä7á¡>¹{o;}W-å³[;¿;¢ûY%, ¸7 à3­O¼ÔCÄÆw–*Äøï΋w~S”óÞµ•üs´1<ç)Tñ3”ÅJnèZ k1‡ Œ(»f¾ò"fB]qÈ>èÝvsãà¸l¡o’š+¬Œ™hyîkð8›Q‹ –⿆ÿ¥©a9 ¥tÇMܹIn‰ŽÏ¨|“@=²5ÎÑ”lãUŒ%ýÝH¨$~Eÿ¸Bn`¸±Ö"9ÙÄþ•šÅ)¶Qé»C•õ yý3p߇¥ j¤ò«ÿ3Ÿ‚B$·6€Ë‘¹A%ðyÖJҩWá„3‘ÝÔ×¡Â©mÙòÕ†¨ Ó8ô>( hüÆ7¹Ÿ÷KBY}‘S×` ³ J=>V8v"d4ßÖn"b_á«åwPê¨L4 £3:ÄøHsnì±Û ½¥ª'¶#sùM²a‚s>„?µ§2ú˜ª× lÒ”Ù¼·ÒÙì¥ö—Ž˜;Í/æ¸|N¬ÏÞw«A€_Žn^™’†þYÔZ¢¹Ü–"v”¤RÐp™E8÷®e’HÒÔ,ªÙ6Ú!PŠÒuhÁ*$̹’- ñHÐäÕv—8Æ4--AÖ"Ibús(€^SM‡æ‰(0‹Y‚¾Ÿž½þjùŒºsr–dµsZM€Tw‡³°ðÍ"öÀw‘AqÙò‘¼öÞós*ÎG7›,\<·tïÃk_n2—‘, Í–|Ò­Þ´^b*ëÝðI¥]Ô™¹QÈÀG§¶|ÆÉãÈ*ýoºô©T5l_Œ !ëÌ+±¥V“FéìÐ-òÕÒ¯ª ‡¿Œbw7ÍÁ„}®Îé3¨´®Ø45©6|&½ÿ Ì›78Ö½U>à¥Fìi`yšìphÄMq»+Òx9ââö@‹¾»¾]);ÝÕ õ¹—T*׬Å%jýƒ¡‡HšÁ‚¤o÷ ê~(Éžm%#¸:s~±|qÄ¥WúÐâ¹A%›þ’Ú² Ø£ÔÃs)rqClÉp¿óIãZÍt«Øj~½d­éÐ2Õ"¶óu¯G=n×”h±í£›9ù®\âÙãLè=¤[k䓊ŒÍt`0»KƒÚ57B°ÆÇIÀÜž;_ýH½giw/³Ïê[ ‹Öõjy2,鞸1Q½Ý”ŸxDn°‰Ÿ´ «ù”¶ÒDzÛ4’•á­.,È’á¯ÌÆÂ]ÒÍXodB"+R€õ êT*auëKþ>⃼žÁTà_24ª*ù /®Ž}ûQÊR‚åÂGoS1Å~ÁP³Wî‚¢ßõb½Ö{ÎUéVÑ2”õ–Û^{T>æ…v2MýsV9¥SGr¾$'ÙQß¿IŽsûʈÇSÐZåÃ+ÔbÆY”“\Í÷h]É径jü ­:}¼Â7(á,5…ÃήŒxà®+ZÁšL[Ÿpº’¼~ÏÝå*ZR—[qJ›ž`øÚ©©/ÇÑrÑ*¢&€½BEiçý;¢Z)%5áÁ 1’[qÆöØðjR¯˜„ mÚ0ÑÔX²d ![¢TSðŒZ0Ù)údP‘œÃ½ê–.M­³øü¦iÔé}§ˆmt­4{+ô¼<BŠIÂúйÁw)Q—Œròç^Vy³5%èõžäþ'}†þ¥Éºjð¹AMgaq¹Çw±ÃºÐ¢ìÔ®6ý×PȵÁ®4ZíãR°®ß“|üÏ70÷³%³ÉºÀzõY1¼òɾ¢šöÙm•Eµ0ßô¬ÃÒzÎ/VLõKz¡  ¼ûÈ'•Îse;ò[CU e# ªÝtÔ·Ô#¡¨©/9¯ú/X<¨ÝRÑ­¥äy Mß›[dȲ% UehŸi—Þ~^cdÄ‘ëÉaÔƒ”Î!©ˆé¿Î/óiIJ?Vù4×BõAþ´¼ècL ÷P¤×jÝu2X)™Õ;ŠäРP¤wÔX—:Aàv+ôî._@1X›+ÜNSwQ_Ú”µ©­gz <õÕÚŒ=Vò%þpï›á¦LJË$ïãý^¨OaìoÓÙ ;$3lœÕäÌEþ‘}‚ëAŸ}ǧ[õ~¸Øôáë{jDÞŒ¨&iûü¡T´¡[5zLºÃ•¾-o^³RM–:åJå»e,#óa,ë1¿ß]3«u•‘‚žeÔI‚{W›ò˜{·üC³of¨o÷H}Æä=î”ZÍ]l$W2( UŸöUí>±Ràœ¥k„B§õ*¨úŒ^ïËãü‡y]}ÀTסª¤Èø’õ¦Œ š¿‡7³ÀË‹u}VæÆ YºxÖD©îmÓÄ"à^hR“úŇ—¹U^À-fÜîãRûÜ|#X3©~ 1Ê_ûåÔµŒcÿ\.¨êÆow×ýˆ—M¯m­põ®e¾,5 ¸ær²²sR˜°ŽJ v Û¥@ÁC°¨:‹ð7¨Î·´+éúšsx7Ü…¬û¬ ȯ¤¢úÒÔ–Šî/QÚúlàX˜¢¡@¹\ó‹—Ÿ x:ÅçcK4>Ýã¶ËÄòñùNIÑO÷Úµ^`b_ÈF¾'î5×/EU1Úh©w§´õ€Ó8|Ìà—£ •ïCÊŨ@.Ô'@Ãô~ èM@øÅóÃEñ4Öƒ~ó cEVØBü×ëí‹RœZßEÜ+uOñÙÃÕÜX_qCÉ-М›¦Æ_á@ê“ßûùGÕõîë­žÕï¥öç nCÏ×7š`¦ƒwÿ¾Š6$›<ÁsWø %üˆZÝYw–0à14( _dj@È«ª.'\½‡²—鿼dPÏÚŒ 1 Ðd‰Ä­Ê¬·ze6}T~œ¡H(6}è­ÑŒË䦸Y{ÖŒ¦¢ùÑg Ñ ¸8#£s»å'XŸÝ»š{çy(¹ÂmÌÿù+šã²íÇÖ²B?¾ îºØóÒ: *…ÓZa²¡™©ôæ½~ìMÅ×w{Ø~ù3Ž×›1j–Ïå(ÉSSï^Ÿôú0W3Û—ÌöÅݧ‡:&”Pøí.W+u„„0²¦LLÞð¬Þ,Ø>¶|Ü”åÚ,bM™Úu0°«®¿D¹É NÛCÇù„)ƒz çQ¸Ùk†ÿ4Ü]H)Ûó{Æ• Ý¶ê¢ UÍë îw3sƒR”Ìa†þAÐß×úÑÈ7ëÖç(r}‰úwþq{ Y$€‰Mé­—Z"]@Ô Úè£e‚ðÉ¡ °ByÚcÏÀŸ¬ŒC¹UèK"Ó=Už'kùÉ.›ÇžRREl¥ë3kz5YJ°¿?42 ¿îÂXçÍŽçû>,ò.d±âlTë“OíEŽŠ¶zÅ+AvÔ3rW ¦SÓú˜[×YŠ=Pù9,ær|’™3ä“Vt;Ì„úþŸêzé—+ë9¿ïš ð]>Vóâì”ÝÝ{?Rµ€H„Ù`I·¥ -0EŸCK2(,Ðdsá,õ»ª5×sk¿Û»Û‹%O mÃüâî:™gy×o8R|=¥RG¦øïñmù—~zJ$¯N­ð?Ó<Üi]÷rpf%èmºx¿œv‡_^>áYÚ”Ý!iÚú¸µZ¾ïùö´Â¶)6æ¡,ù—Þ1È!ôøÉœ?AƒÌ ž!Í-¡#³2꓆¿oGK¾C+2ê-Í{0QÌ­¬<ªåáÏóù5ÒCE^Ï:œêÔw¬²€<'µ¯f¯]ì—¥~^:;5"Çi©ï÷\a^”gà3îä-¶ñÑM…\tð²‰{É|l²m7ÅÙË©I Ál¦áÃv‚ô,VW°xè§õF^¼4.Ë¿r|bpŸ‘ÁÄ$­È @×ú¹è© ;ËZº@!°ôqï¿GZaeÇÅ~E¹²®ç€—œä«FRYô&ƒíôzGª®“3ßM-4²ÜÔºï7G;‡nPó¤êz+¾¦æ÷¸ß„  Q$¿1w•N­ý£º~¨“gæ0’$}Oµ¸Pbú;c¤Ö¶%®¤ lCvj-£n2µ>˧uUXØÿº¢4‚­«-Ó÷‰§‹ýÕ&w5fcFfM${.+hµoÖŒ/ÿáq†ßïU- +Tnj±Å졬דn¨t5¨šÔð¢Õ@@«ѺО –©ü|Lí¶.È Ð^…Ãeo=ʨkyîðÊÉDpVŽMlì5Õ/Áª€D¤_±tN–·%”}§oâny 8"Ö^ ÆëY@bAýäÔ Ç*ËMš¯ ôè(› Th¦Ù¬™è*xy7µu&J§m$ëü5´åÑ?‚¨uÎØKMV‘|Òä$Ïz¡ròºÙUÑM mnoÂ7\{ áÝÉtWE§MoÕ+ħ’p8Úëó˼öÝ7Eêk´ì{?—»˜Ù  5È_­7 0¹Dùgú?ì⣑@<Ú*“P;ƒ8|ÞúJ}Ö,Ô‚ÝÚÔñØze]·Tí+¯j“Ö6Ýñ•:Ÿ×£wé]´;²®kíänÆ»?Ôš2mÒžAnî”`ÇË)6äÏÒ† “QSIÛ¼Çаad wéßRË9#RØ~ræÊ¥ŒÚ™³BCqsð‚ÖÎ&ò.ÜQ«Î[üÞÇ(€âÍÛõnÊjñËm^wÎ7'_ú±à3"ÇDg†–²MO!lü%‹ v9^Áž÷’?.®ú.Ë6Ö$£[>îùýìȯØÈòùaqûÞ`dÍh÷˜s*[\N9ÙS‰0œjÖ¦áÁçʦû\åSsæÍVìÖlžÔ%ôè–<ˆ³È»[QnœrÒ  ÈÛÚ/§Q¿Æj—RhÏKýC>ÝI0,õ„$`o¹ç+õæ|»|ŒØ3½ºCÈÛ¿P¬KÃàG…"A‰Ö¸Sv#ñyëêŠã~ÎN)‰ñ|FÛz ¯Ô=>µ&² *‰^*Áâ»Q#A‹§Ÿ:‚ï57‘Îòb'ÃôY%Õ”2ÆÈã<6Ÿß´ö úé0µô]u³¹‡ ¨·öY!Iå3Ì}?ÿ¨‰?7è3B6‡AcDÉÚΚÂïº(1)‰2*²¼Âš¡YH`È NÝUA`t•6T嚌IWµ©—Ž&¶xù\¼œzì]Õ¤m FKßîÐs/¹L©ïÄxn-òáZn«c±"98F“²Å¢Ðq'w² =;I)l@ÈsGþœdY¿u~¬ëåDýCÒˆD’æÂÅ0ˆ¿*¶Oh0œTS?뛊^µ¯‰±åM†:`sùá´¨nAjîŠÄ¥+ @Ïû£ä %³‘+bnŸ—þ¼bâ»Þ1MpÎËÂÓw­Õ²÷‘ µ#G_h“f¦’J¹©­×TÄ"âu­Ÿa*#ãD™OhÍ”2º»«¥4UgÓéa¼òYY0›0•Ü\ãB Zr¹¸MmëAØ®rÉDhÔB·e|¯ƒä÷Jë­#Wpö,¹ÄSÚæÛðdoÍl/©í”iy`—KVFq ¸Wm„L+‚tQïÒŠ 4 ÄÅwhI²ý²õäD~þŽØp/ |EŽ.–J÷]K’ÄÓàÂ_Ü1>‚Ÿ£ýO„±0«ÀöQMø¸š¤›êsâ A+’ç‘êW¾¯·”l—"gƒèE # ¥µ«zåƒÏC5™ è>NüÂÍP0|7(g(/ eGûº\ñCã³O  %ÁWæjéݼÌá´Ï‚B™Ÿ]zh“ÆÎ=Ú9“–»QêpÑÆH8?¨ø¶sq¤weNœ¿¤ä|ôCx7?¬ ¥S¯œÅÅ&ãw.ñ˜ZcË]Þç¹Sâ˜Lí«€é&·MzÉ•‹¯)+qïÊÅ»3{î‚‚D^¤7ˆ«ýɾ~e Ëͪ%¨w†‹ÉlÖœC‘#ß9‹0Q¬DHcë{ò³g§¬š±‹g+[è/‘Èø·×H¡õ¹;¨•>KµóÌ–¾«Ö“HÀ—¹çˆµVvSZ¡e×àÝü"¿ñL£qó`†…Ï7o¥-ØdC/®Q4Y”(·ºÇá-ú•‹:ŽÍö„ejç¶þ552³™Â\.}¿Â¼·0ŽänEg´P±Ç!);:í~Ÿ«‹WI¹Ø8g>Rµ‡”•@‡œAÒ  œ–îª1y´‘Ú"%p(Aãé–‚•žQå“E"QIb›âÜaEíj=“AIëšwåN8sãlo™¦Ýw|Û4iPµË« “ËmŒ}9áAˆR¡Æu”ãiðXË龤Pño¯SdÞ܃.­l–Q`Ó««*Ù† i£¼0”†‚¨{i¥H’ì{Zdõô"xiû²O¸}ìüì¾HR uLõ™·Šå÷§Q ÖÆ );%Ï`‚=7H•p‹;uf UV?â ÀþÉá^(Ýapª)¯öªQšÚ4-oÞ»÷ÇöG©*3ZkG¡¬ÔÇŸË,-›{õq¯”Q¾_¢“-IÙÙK{)þù8ÉŽ+ëÉr¤ž\%wÒî`á—‰ü´È‘=›£}p8¼ËIžË©GûiÎËýr²ËȹNÐ;™A+iJ‚>T5ÿRbk¯@"Ë?Û¸Ég4tW¢VNa#Ãkõ$lïôÍÖ復ÖQŠ.°òtoZˆsÕfù’.æåz"H —U¢@'êížhÇãhÓÍ•’ŒU:­ëÅýÍÈØá”z6 ‡šë¦NK8JìòY“T­½‚êh™Ð¨`ÇÍ–)&ÝÕ³®$ƒz÷îä>ñqT|P‰vù!Ìq(ªjÝœúÑšŠ=·æËÅ‹B³×–«2«¯±{Y}H[CåÕ y3ÑoÞ{)sCyTèyÞ? ëIÓsna…5àŒ.˜l°¤Üx*׸!3ŠøÎ§q!¬tk¥)?{Á09=_†Ÿþ`c÷XÏò~ÉÙy”›üar¯›ÍÓwKëêžÄúˆ’ vfLâcU5BÊK›3ß ÿŒ¦ÖÔ`7Zœ½gͲ9*v–8o5`Zн¿º,A¦„E- és¨2†2DÐUd]/'7-:֬ʘAWò-&ìÒ\!àªÈ¡ÏØK ²ƒçü“>ãº25—Ògl9?–‹fNœ†ë3‡aº>ãvñ×g 6vÊÉšåV_÷¥"×g|¾áÛ½2µw÷“‚¿¿ÔtҺơø®©²Š81xË š‘ÛDy‹@¤h‚KUÁQi]ÏnµlĆE)Ù{H¹À í5/û‰õ,·ð9É–„u¡›!ïY ÷íù-] ®¬¾!0)0f-=ÈÉKÍ)=¤ìÔäºNÙz-7ùlO÷~³[× %»£)z=±-„3§BYù ååû®Èø¼BÖ°Üí+à¦-[Bb¾úWõikËžCs`ÂwB[¶û—kË–Iuö¤ §¶lÈŒÚ.ÌÜéÕêXaû†`™¬8i]¨¢6­ Ò…ÖµV¡Ìx 'EɬõX“¾ÑX›ôQ¢¯ "¸¹)¾ ÍŽÄBVÁE¢)A“§ä76FstSÇž OgÈÃj~c¾¿ÁqšÆc(K°²ÆÁîÆ’|B¤íJµÊWÚi¤4ºUòl4\è»ðÈ(”`㱕îªîR•BSPxNå“vu›®Á2SC®§¬zÁ]½Þvºd»8ÁÖZÙ+¼4¡K£qÂlÐ5ßñq¶ç½ ×Åî5„º=çI=ÚÚŸºØÁ„fÖõ^8ªÞ—Û*4Ÿ ]Eƽ¼ìIØP c½ÞšÌ`õ‰6p '·ÞÞïK>p¨‚D˜Ü†bdÜÆÍ®òVvš/çI±ÍÛRŸšN§4M³ËC-r´\ÜA°ç°{™®y–öjÙÕÂN¬zn`mPcô•_Ñ™ž¶q—³¬‡uõɾÃ0ŠÞEëj¡ÎלM¡$'r›Þ>s뺎‰vëb+³úþ‹SݺÐzð¸TKgléFñ¸ÆØkѺ&6 © é‡þQg_“bÚ¦Õp仃ÉÔjˆÓºuµ:3á?ãY׳“¨ãa‚`!ød·+¯[šhŽ>Éܹð‡ Á6¥ŸæâtÚÄâ”ÕƒƒC F °”„A Eaò¥Ÿ=}×)"ÜZF(-¦†W{MYÖ—Â]] £c‡0E«Y$¬^²è“¶T«Jrr_½9@l!Ûxu*k~˜d´ñ=‘_¥Éw }ѺÆ8Ùvþe Z8šoú®½˜»ßåñ½zî0¨˜ ÊO1ª9=¬ÝK÷]/÷Ÿ2¼䦬ëÐÕå»êé»¶‡w·® PôÈx©ìÍóŒ¢&Ùó„EmÛ,Ï¥°È1ð †%ç‰J*QPf·¿©=ïÚsÒ°JçÐn#LØ^"~ V¸EmbìK)þŒ¯Íõ¨ÌºVR'#Î ¹Æµ$8x§Òš…Ë|xxVKV‚‹˜Þâ:›¦†Ï&«– ܼ׭ë™$=”Q¼eõÏs1LndëÔ@A|ødëÀ…ÒºàCîy×{[£©=ß5+_@¥òÊèÛÞ¿©^óÏ>ÎpÙªëÀ°¶­Dþ…€©|¿ÏNc…f¬·Ž›Ï{kÊ»Êb§Ï(/\Cª^v$Æ•»‰^ˆd^d¥êzÒaþšdÓðKÖ‹˜n5_{÷tq(Q¤Ýäã^†±äÈz;l’š¶´.p& ÚV¯hßøä‰A™n’¶ÊÖÕ¯öÄ(ÁÖEÜ}’LÖ à”ÐdaŨgÙ…OGâTJÇ¡Ûè=áæÜ´R†]…qts ¡ñÑk!­îL«-%ü{yGÉ Ès‡ªIHÞÅÅ´Qg¸Š{GQ2Ýøsvº^÷xÍXy<ùÏÛ –¬ýbÛ²#q$šg<.u¨L„ÊÄ{K ¶˜‚Zƒcí!A0Œõ¨C†nêwøSîfNnû÷9²ºNÍ¡zbãÞ)£]¶?Q±÷I¨nW¶Ø*CŽnÀp}ªâß«¸hcý ¤ËB÷L@¹YB3Ïw‚Ú$<ä(ž« E²ô¥ªöD­Rƒwß7˜Çà\'vÓÔà®Míù_fnIØÔ\UW²C˜TÆ£uÃë³+‚ÖV¢Aew«‡û e«OÊ`vS/(ó²7PGëjBÔ:ÂroÞÁJïÛz})üáÓh]hŽ¡`1’JëH[õ>™³$´ÏHjnäÄUR™pÛ#år¢Í‘¯¼Z`@Š.Žô ÍÍŠ3Ô-â´¢YÚHA\Î[K<Ë„äØ}•aî‹•5¾¬§çÃ|aM¦†aTZ׉”Ì_ZYÏzÉùl*®lÿ+/ÇB¦-*ÑjdÜJÉÖÙäuQ~©[0hjÐAVõ]á²ÑÔ ¾BçS$Œ¹4rVFØï`À +'A€F+Ç1å¸å¢n•ï§2kÌbû ŒÔþÄÚ T¾¸Ñe¹³Q 6-ÎKÇd&õç ÒÚÐÅÞ+×(Æ`÷ÔÝePô¹›\U¾ë¨’úF4«|Ü6‘ÞOƒ}¬ëˆHQ5Úaü¨åã9ÓjNŽNk)ŸñÃ;ŒJhnvœÍDÀAUBÈË÷\†Ú/Øôçl©8Ù¤ò3bE¢IÖR–®ŸEý&+ :KFŸÎü nbnîõºÝBÇ YÅ Ô0¸ûTÞlàŽ- `ç ›ƒJXˆèmÈ Ò2…jDEDs–CÝP'ÏøÜ?i8&žkçÇž˜”‹1çÌ¡€’)Éý²k‚M0e:‰Bꧡܺçã»ú–Œ!ÉÉjû÷Äç-ôdƒ z4ÑÈ2:Ó>c›I$ õë„JNöÌž.s?Û ’òt·­öÅ °ÂÿûÎÕÔÅ™‡òÙ&*@%ƒ¨ô<šG"ËæðHÑkø‹A *~Ä´zðJ½µš­L²ÎŠ/˜U¿ï'x™N‚â´DUØïÒ>Òç~è„KýÈbÕ~ϯ¹Àêlʆޡ_L”‡ÛS'øy€n0­”>õË{&@·®4BÍ%‚n,3™è‰—Ùòf‘©í}R»—š4¬¨a™Õ#hÎ䵃ÌÕiÓkpLaSmÄšP˜bkkãUìã~~ìG²°é8qèÍunõÌwÏR&¡æÃªjÁ„_ML/*ÕÊ9¿qY6z¨²LR€o#`?¼Xk& ¦„7œ ÉÝ Û8Z–Q³ˆ•ØþÑeá +;>K°ˆ®¬© -ËÞmãEÏïsÊÒ™b›{Ö£C°*Š´á©¥¨Õ6±Å3²ŸÛ×9s•<=[{V‡¥޳i¬–Õ¥ó‡Ä4A¾mmÙ'ð‡‚JÎqN:²zfFÆ—Y×ó<Ôu®‡ð]Ûz… "‘ïäŽ4åð©Öøè‹íÐFtìíª)c|Ëj¾ÓmcV&½´…ñ4Íffn#CZÓ0A°ß£¹z«`sj#b)ZÑgGû³:¥á¶¨ŸºØcu±ËefsŒ§F¦ö²Þ-Ä=šU‰>+c§ÄÀ+ù©P曂ŠëöTÐD)1‹¡XO@ÈÉš#úG/fÇÍŽÁ‹2\AÏGw0þ3e{šÍ4Ù“FS\E?i¶“r²Ïy^Y×KR¤Õ`3§–yÉV~^oê„a‰€½zÅ3—̤(þõ£ƒŽûЛ|W_5ƒ\ b÷E®ÕP3%ATÿè`V=e¹‘è™?gõ™ƒlGГ÷È3ë}åLU2)•ïÏhŽZÏmZæ!«(驱9éVX ûFÖ~É^S+RÿD7'ŽHP"õ–màÚxa禆Á`«ªFöø¨®@ßÎGïz$ÙV?b5×+/:²;œs+˜ל–%£ŸDb¥uí3S¹ø§ûŒhH# YáH¨y¯%­ ëÖ5]Öuꇳû¥á †/ ävÀGÓ@Úá”`µ‹½–ÍÝ/@¿î yïÈÑr!K÷‘/xuôJôR¨„Ôp-»2”“dÒ› ¶fF=>Ø•~ÑöüTec¥:;!-5¥«ÌÛ ¬Sm¯õ¦uaL%K)§Ôl°«Š4 º Z0E0€s0sºûÌO¦¦ª¾y§;ˆÿ?™dQ|°ÝÈž"P»Ê‘:&dðû [¾ëJ¿É6Ë'2î~?¸ó623EÉ¡¸ýÒæOV[¹ßµRã…ãÜyzé9t_PŽB.­«UmÐ@‡ŒÁÁ°ô¥df·½ŠwЧóªÎkáÎtÞ²®W£y¨ìT-ÆzKÖ5£çá>þ¬·Èû½l½Ëe¾"öÓºŠE0·®ÁðnàÖ¾>eÔ%U»}³]àÉOB±çÞWÖ²ÀÙ·XÄôOXµ«Ó÷Ê‚¥`ly†à^OvðbqÒ›{õ6¦áÙ׭ܯź[×®©pÔ¸"cÛç£Õ°{ÏMã^‰¾†ï ž ÷]Ã;}‘wò¥´j5#clÕ²«ÅlÝ×[‡¬«NªøýZ 5A{“9yÛŸT Té»FÏljÎ'}×%ÎÔ&±+ãß Õ^÷ËB¾À/Šo‰²£T—"ã "OÖbgÔ­‹m(·È–kPì=ºáíðÁwµÑÒó`ŸF¾k—©ÁÚ[^„³ w·Œ —€A+Kº+,ëi1kÙi]¡ÿÓ"+ìW ÿ™lQˆyµ1¥PÓõö“kÇ/Åüô»V´€<ï:’…„«ã½M Åa[]$jÆ–“/¶rU ê­(‘¢YŽìî¡IÊ‘›úÒm¨3!ºLäÛZ²Ü÷Äsf1·[×;[™­Ÿ-ÛXÁUÝ‚z Èº@í-dÔs~ÜÚ°,ìRv»ækëÏ.%Jv˜ŠÀŒ•ذ»Q›Ôºý{É‹¼Ÿ—ÖÕ×™òí—E¥¯X…(ä®;ebžÞ·mK:û›A°X 냨VެdñßK¦¸Q2Ï»B‘g†S1Ë]þ€;d¹í>ÞZõô@`L¹6=Ü5è̓4[ Úî@ ænêI€ˆdˆ%v¨UmwO>œU:ƒJÙ윞µ4ttéÖÐqÙ¼l`o=QÉ997ƒ4Œ¶ â»âGcÈ]eîÜ¡qcq ¾zé‚‘.ÕYLÓGyuéC]±gÃÔ{R0$æ»> ’‡ÝmÎýI2Ÿ‚áÐN†?¢6éÁ&LëŠ-y<1D©Ò[6}T ¯#sÖt¢éÇwËû™ÊM"Ox·õISY$(—x1b×Ç“ 4Õî ^%•øK-,7qš!”:1~ÈžuÖ“|݃=¢—`BEpØÆ’T-r¨½8gV¶æ¶”ÖLÖÓ¤¥ÇV¢„oÑf÷ª'~½ÿäÔœã²xõnœ±ý¹ :%ËóPs«Öyáó<Ð>™It`—y$òS¡ºËýuš.ã­~Õ~!ºø<* â•iý §L4ϱMšdj=í6ðœ¢ÔÁ`¾ñGVZ!jŽn¯VKš¶»=\±Fß…®OÚ2ÉгMr—ìŸìO¿äø#¶1P)º]_r…9öæÞívð½f~?  ?74z´ßß òç>³,0—0†`T¯BŒZì7V•OBø¹—ëlPóéG« ÿ»Ä‘ÚÇF'CÕìäöǺ°ú¬;ÀktÓj±*òÚíãS— ãȪ£Ô¢½ÛhPe}¸ð!íÕ¯,åðè­O“þ+šðÉò'Ÿ"ÈR‹Ó¦v.H‹š›±H+S;¹»•7OÆc¨O~< ÷¿ý{ò¯eÕaž2¨Smy’Ð^|/ËÅ3ã–·³Â *ÓlPœ&.¿#ÛÛÉ´ò„ Úm0Z+¥…º°»>CB; ôs—c6²€s–»\$»<'5¦V{’¨ïß}쳎Ü×NŽè¬©VVD]h&®šU´o3äv¼V=¨y5ÇRPHþs£s1)ȱ+‚©_U50xìHÀ³s¨skJ™#Œì)¯}*ÐֹͪÁUÒ(–ï=lýãýI^c‚—™ÙÞEκbH¥}mÏã“e;²ìâ4Gf£ŸœÂ™óQh· ñn.¬„t :yzðX¹ž{ú"¸BŠô^ÌMÒ?ž‡ñ!x̆R–ó–36Y@Ï;·ïJKÛz1j0 47t!¤KcØYst zé¨|v™rÒÚS™q-oø-@}âô"2¿Åw],x‰œ­FÁ%ØÆ…€ð—¥TäD„¢P;©›¶IÃtc»ÔvÓ°1ÃÛaÑYE¬BÔ¦Wòù†²™ªÜP­B/ÉÙ ¬Žg²Nåäi;'_à 6¹Š…g§qØíÏü d¬ÝìFø~ëÝõyžÙÅù§L*f€-ÅÒtOú´a9RÌ~ä ëJÏûTÎ+ÓC€_ÝÓ¸ ŸX‡Ó?*èžþ"#Núx‚»7/éïš©)€æ\ìÕØðý¡>êUV¸Ë´Zha/z¡àmq-Ù]ê…ÒG»M uǨúûÜLå?kÞs«4ÙeI ¾^ú¶ÀRd*\Ŭšv §Œþ{[WïÙÅXgˆ“íÃi=zê~ek}„}ZªØAQ¡¨tòdé<…ŒŠ…5ÀÏCMþ¥ÌÏfܦLhö§0p' £™ˆ7O™±|0;ïfK®iX¹ñDíDc]àe†€Mc¹«hŒR|#‹-!ë¢8LrܼKêÐ#æÇÝyW§$Ü•ª]ÿ¤lø~ç¡ÛÓ¯øw×O‚}Qôê‘ÆŠ ²¸mœÔ¥ª“¢€Áò”Þ 9ÒF¡nl/ßáxÖ¢?´^ûì:ê=¤Ø‚Ãhó[ôêëo£Ž#ÔS< t;)㾿š)LXƒ•·ê¿%þ6À©›9±Æå02J–l ÆLíj|?õŲ/@o܈F· `—'»—.ÙÅúmýËubà°xÕËwýEJ@‡*3°ä5_”:)H‹0yhÆ­ù÷x?ú ôü” #¡§@Aâ^¬L¨¯F1ß+Lh1ÑöšÏ7ê.åt`ïÏÜ1v^TfŽvìlv…i~´Õ¡¡è• 5£šdùB)¦ÜP{ =Wµ»Ê §‡tOÑ|îTW¼’?µ¾—«Î7/YÙÕJA»ùþN.J=š‰Ì”ì+¦czú§p~á/ö¨Ë=©iù:ÔÄ&~HYm Þ2CøŒÁ_…vw‚qN¿Ä\ûÉPß&ÄJüÜ'´!»K™Ô‘XPxj–9û–ÿ.9C×¹â~TWÕY¿Ñk$À²CNi^šü~èÞrCùÕŒW6[y¢_ùT‘‚8 4enéËÑt‚é–9œ4É&Tß”ðZ×qûæáé •&ËɶçfïÅCïÞ{ÏNõÖ°B&ÄŸH]ߢíù4Å®bsG•±tfw‘u5qÜ=ƒ|e;r¿É_Ê­X‹¢²b¿ýýűI [¿Ò›êæüE¢;Ê,¸„ÛÍöƒê5E÷ë£À ­†w}¿î¬é| Jõa }L¹¸ýºl«Ý/*E{þÎËû@µ¦ªzåªãŒ´"1ÂÔhDÊ)’ø?$ÿ¥¾“­«²ä†úÛž¿Æš\ס÷1öÇlrvš£ª%ZmV†]³h’ù%–[·TuW>RwØ£øv«NÿÕS¡uß®å5ôï°½$SraÈ‘íÛO¿]š-=Z@Íï×=ƒZ W­jmTI_åéYªÓ³=-sev”О—T{ &-•rÇAUýögœBµÑdw'§XI·C_Sÿ½Pý;,2T:£›êÖÕÌË“®æælÀøHRHÇj}b¬4ÛÔFg˜lP0)Ì»À!Y½ƒÊ—ƒø¶V‡ò’ØhÝÎyÆòþ6Öôéà‡êdž†Þ3ÀG󣟶ÛÒO «öÒ1;>ð ¥ \¤Có#³ÝÄj^cœ%¯†%f;²iåÛˆÁY¾ ¸ã׫ê…hI‘ñdœÎYçût7ïÚ,ªîæ6Àon[vU Zm|䀿"š”x°T©+qÁªMmíî 8gu]l5.ÐòþÜ®öÞÍmþT®ÃKŸºžZÀ="éB.Ü(¶`wLJTcáEÅMjñ7 ‡EªzÞ³ƒb›µûÖÅ~㱕rçs¨¥.YJ­¢2 ¾öš.!€:žØ¨ÔOŽ›þà²O¹E9Ò&üá½]VÏJ³q†‰ÈX»R|èšÓÎØ¸~fhT%ÌC¿à›ë†XÂúó>ãqÉ0fdZ·ÞÆþ„êòã^âq…ŠØxlÐÃXcÔÿË6FÆæ.ë:GÉ àÃ1¶X|¶¸˜D\ZôlÈÔ$Ãâ¤ý¢ÆzA™`tV•„0Lm¿>ëMãJv Í{°ë ÆÊ^kõõ*~.$/:òÃ8†ã¡<ß>ïÅAX`eM§Æ×zdˆ{½iåîW¶îAm%)Q‚ÖÏX(·j낆° /=,Å뺒Ö'€:Ù»ßfµŒ–ðR(‹6MÓ“LM`ËÐGuƒ±6IÂ[ÙD-g¯·„éivwûEá ú©hÛf"é€é:sÎëD^Gig »Ï#ø¨+®.¡Ë˜¢‘m¾‡ž0}j“jµÐÿêÞ{,¶`ѶIq{5uQOà^=Ô‰A=© ú B AµyaOuým)½Ê^®!o[ êuz{÷!'‚­ú.@·…a¾©34>ê!¥ÜuÑfS΃þ¢­«ÌVä%!õ­"oÎJnÌ÷Nz\dý•²¨nÁk¸–L ê6‚Ì€¸ÅÛ^'T0ïêÑË®ü(åu`ÐÅðô½4ÛÝ)š¢éz‚7«O\ẵãg=1J”šŠâfd£À´¡827媑§]mP’L jå*¬xìŒÝ(9%ð½êC/¢ó"ÒÚ‡Âã4"ö$ÀŸ4®—¨h½i~ÀdTqŸÖÎyÿdTYÈ9×ëuõ9VÑæŠ;êòd×$0ŽxüÈ{/¾znrõǠČ֑]@ê ˆ4¦èT^¢Ñh¿U%™ÐGu\[MÅðG9 f¢oîqÁšq€~kë”aWG »Ø2µ5–ÑH2=쮃툠£*¤ŸX¬xH¾ 0‹[jY¬vG +«›Â—D'¬x¹K B!”ÂãÜc‘V`üS°Ñ ±“¿Ö¥ÈWŸÔÁºûâØ2^ú8y*ã¤NÙc]е&±›¡}l2=¤^;” U ÀàúYØP7÷Y…+8géËBºz~$·æ"š'Ú¨«šÑ^d~IÞ“:ÿèC„6oëêbÁVgüZÊ\Pïá_dw˜ñit“ú6`¢`{EÖU”ÙÀk—Ä$, %C¿t¡Í«%›Zz̈/+œË¥@ßÓsÔ”ë§ZfÕy±Å{6õÚb¡ë Ù>P›Ã#Fë:O‹©$¢@ »æ¬M`]»%™5Õus7—ï N¢uçýéK7€z¸óÌõ:0f3‰ Æ=CWKÀ{¬³V¡ôÈl–öÅp®Ä©ÅìùÓ±:RZá ¥læÎþ¨Ùî67ðļI$œP}ž„ö·è"6Ý®YP1f˜fm*÷aoCœ¡:¶¡šF7m.!g£kÇlöÅf÷®+Èh è)D\FÎé~ÉJƒ ãîÖ\í2I´¤Aa¿!JMô<@)-}j~ñ—œgW—#^›ý£­×Œq˜·VŸô¬&Òz¡?‘&¼²‡r ¤þ¤’«“á,Ôˆò,.èÅ@“ØÍs9Üoqòölž(îçù^&²ÿ9šîÝóg«ï<û!E.ßÂ¥d®‘€­qoûÂ`"n"­˜þC óÁ9£:è*k÷ä„+[œ|ƒÈî7;õfO¶¿ÞØ$:Oª .÷àËflÉ‘­¡öî$ýŽ\mM¦q zILÖ°s±=VNÝ8SwÃÛ1I4ê–»™PìHFwS\;áå6>»”\&|€UB±øc‡—2 ,¬_õÁõêŽKßßmç‡gC ãµ¡:¸ž…Áu¡|¢é0ïQ+Oÿà²&9åïˆÎܦ'g¢ní Œ™WK‹cñ€´"&Ÿ’¼³v,’DôHt':ðWÉø{Évt}\R²&œ¸ºP»)ï—&ué/.›´È$'½ZÈJÈÙÀÕϪ¼«.ÉÜîPÎ 6){µóYõ;'ˆw[ךû£dö¤-®#ÔB¶í›Ã]J«9Ó§þ“ ZëSäåmõÏ‘?@ãš-&Š&nc"f¢]MÎóì³ •ÕÝ-ŠO+~ØÚàšLHºs¯scË"6å­——­wÔ $Œrèjæ]£“pQ®FBw›Û´©M3Ùc¡§ú5›‡v,!ë œ4¡XnýCö¶ÙîOR10Òœ÷éno®Ê$Ï×£4^Ð6ÙÐùܦ8_£}H)‰sýFþÛõó*ÄSs 6¿fìÊ«}ê™ žŸ´õ)ÖßÜè¨kiSùþxÄo[v¥Ù•šè-oËæ<˜(Í û¨¼èoSîZþZ\ó¡{nö¸'‘HAÿkâ•ñdFë•u)⎠ͯq•Q(§‡õÏEbB>dl`½é´ ˆ_ïg]h"Õ"³ÉcXs墦A—íý!ÄQ #,RâÁŒ}5™ÍÉKž±ÂÇ‘”îN°æãŒ‘ÕCpâÚÕ¸ìbPãÞ´®ÑŠÅ[І45W?ëB»y™¨ïœÌÂ@{w„ÌGHÐè’8^0©¬Ø±ØÔ¤»8@rHA©€‹¥o©š t<Þ“®Í…$ |PŽÚ]Õ^Ý™iCã¿Z7Ú¦9ñªÊºfÙ\d·F…øX}nÃ9bá`0&"ZåÌæž)\ácи(’9,®7ë0‘äÉ›—lÐ[Y ô{¥–ã*•§ÿ‚®Žfƒ‹FG€kþ$m@ðkdˆµQêÀ>óûKñì&Ù›’*.”Ý:xËlÂ'µ½úww'áMòž’Ëhò‹§²ü2R—§ƒ"Ò‰[xìþˆêœ¼f(së«:r¤ÎÖ@ÀK—u'DZ%6^êG¹¸v.ňŸ •x’“Ì´xB'vUåî§Àrn´8¢» z^ †˜T7YWŸ3Ô‚Ïw-L*ª:`’Åd]*ÞÀÑüÂ߆&î`dĪév¹ÞÍ™sgôBР"&‹Réšg<¡ýøøËK8ȃ…ŠvZÄÇJN²•õHcS|(QB£“x ê&Þ.F<æE?Ï~'Z¤¹ô‡NãºK Y·[]tD‘óxù=MÑj]ïp8ׯgE¬”îyV †ˆ¦ÎÝK²Î̬ÉëÉ£µ ò)IÔX„Ä{ä%/  ë&É6 hÍòõ¤¯uÍcxÏCź*ÄRùl# M)OÌQ«äÊ–g¬7’rq´?kâÅÉ“¶ jôÛ4¿¦ö”ñ«[ÖŒ#”µ•ŸoT”ŸùZ¥H~e] ÑQ˜ìÛýˆÔ/«Y?V”„’Lë‘uÔ©äÿä¼Lš•(Ì"ë:³+Lb OÛܧôJ epkÃŒ`¶TÈ;î˜{+ÀÀÏ]í`)‘uõ¶‹­ë¤’L†›znçUš1ýIRZÅêºéýÏûê]Ö…iÔ¢»ÂÌIÙfâJ¡ÖkK?^Ñò”§ÿ²6&®.všÍÊų>Éóð‹-?mõ Ž¿º’ב՜ä†V¾¨ùVDí Gç t¼¬ ùÑMýÒn÷ûå›5Ýæudùîo_]lp^(?+Oó>¬k>ÿri¬ ëÑûWê;@åþiþþÜÏæÁÒ:Õ zÂPCôü>®G‚tAt6Ðß*”Í2Äî~,j “yÕe]¨:‘²¤ª`ÊCgW­p¹kÁPO&¯ÚˆçÒíNšó©MvŽ®Abs!›,V|Šô"g3ÇV‘ú e@-ZÌjLÉüÆÀ¨Ú>s¹,ò/üÝæZ×1È)ß‘lÔ¬Ëzì'Ì®¬;¤NÝaÜàî‹å—†OÚÅ’…ÖO:<§YMŽ¬Í•&Û%%¸Ö‰²Eëø¬Ëº›{±Z“¶|×É*H®p³ß…Üä(‘¬ ·`u-¥P@xj«$€jýŸ¸H1Ê¿;²ß´®•›g˜hûÔn[ú™Dêè®R`ËjlÎ9/I)bçìoKk8‚ó'V8õóÐä,ä¸kÀWšMÖí¦Ö˜—Kö©®CsòùM1ûHôT†êÕg¥ŠREÏwõû$¯ïʦV/yê1ì¾ÅR~ ÏÞ¹uœÌk]åQM_ßõöá®ïšÙµŸ„éÉ^/_q‰"ÍÀÙZÊüDë:µwS5Ùr±Hv÷P`ÞÚÖÅ­öÇžV8¥òˆí…M–"ƒÊ‹cšEeˆ­¢‰xÕH&¶;šYy3ÒzY:™›Öuü»©Ö8H[ÊÍ–Q)Ø‘4ã3trá |”cFÔi]éí»ßÚ{WÍxÊÛaßU{¥[Ô—2÷aŸ›yWŒËI¤¼ƒ[Qa²<êÝ—w¥+ð²«Ûà¸yW^S?x²ò®óä²QÝü?å]4öîVæsW× Ý¼+_ßÍ»±L¾ý„Ä/‹‰íìäEoÚG}ÍÙM%%|îibõZ¤2rÇp´®80T Y¡Î§èuÂö‡ÚÕür§žÙ‚Š Ö³±%¶ûF‰,]wp– èÁ©ŸBPÕUverH †ÛˆçŸ™d»IW9NÏWê‹“šåæñ¡?HsN¥ø'ˆsœ  ;‚Ñ?ÊêãØSAK Ò/B¥~!P…0ìb›Ú~Êá³{Öášñ!¨îÅL]Çjöó]-ÔÔÕÔ*oýåÕŒý#´ÞŸó‹y*»*ù–á®0P‘9¤y-òÖŒ¥ƒ5„4K³›‚¾åíƒ4ÕŒ(ù]3"É\äÏ›mÜÝùÙ·=çÊ*íU#w~ÿ*†×Ø^“|ü ÷cǨŸ$l™©úàoYh²gW{TÅ?‹Ù vIò¹Çf¿ð‡e© îox^/GP­ÍKIg'ä )TzÉÿm!lõ0)™. Ób)cK 1ç hLÈ/3ƓΙ…ÉÚ>E=ýë¨Õ1.Û=Ü2«œH—gø†²±¨©’ÙéÍ’‚yN#m´H–›ëcV¶:Ò¸Mß…Šhl¹ï°¥Î÷*î˜íÉ‘Z ÁïÁEp”7Œ~üMð#y`»Ò²ï:ÙP“uõ¦±å_H /ý»ãÂhÙ9}’0ïEÌéyÙÕFƒßÖuŽ•YéÏaÜê—L’šÝ#"Vóuusï–U>„“eR·våšlÿd¦Ý«‚IgÈ ¥ò\Ãň‡-÷ÓJµ4Ue9¶Õ5ÅN½{bTÕÞ‘LcÅÏβ ý±Ý@ yõô›Æñ(ƒôe4¶hLsˆî ü~µ³Á1{¦Êh%Áu ³¤:‹}ªå$eQ4èíÓ³vŽ0 ò4uû±ÊšÞa°gúŒfm?_ÜèÈã –Ì!r®#'ØS̤(£Ö–§>¯Œ‘¦>õùX"n+4$À}¸‡ÈûyB¤TF!±dfËñv™UêøIö‡Ü»Æ:*]!&¬ÉkÿêÞ×Wú\ðõr¥2pá$/š,}|‚EbÝô§àpø¥´•^£§\´ö)þ.°±%¾2¸5JÞIMˆ’j=ôC'/  Cgc=Óä·ÉO‡â;«p`QnË>ç.ºHc&')à–á•™«RüÙ?“ÊJÎË‹€kœhÆ4j[ »=ž¨Û+ÃZ'63«ÇÆY—NP¶Ÿ/à€Áznƒ·›¢ˆuw½ÌµdQªvËÎBÒÅÒZþ ªIy‡Þ¥i ˆ|ýH¦õÑ¿UÛ Wçw¬@ ¦þ—7ã­­7{ÒîúIE0âÃë-!ÄúœS~±:¾ Á‘Ù”/¶±Ú×QNµ–<˜8ç7©@®é+V\yþ.w–L­fÂqÂQoŠQ¢‘U(2£}"óc蟸ñ‚åÆ:@OÌL “'c™Ó_VZ7QN“Ÿ§Îõ‚ (ob&…§^^~ÏO¯åU|-«fÜs¹+| åS-­ô +ò ³è®À:ìlžÎYÏ*²®ñXà.S½æP3Ë-ð,‡Rc¦ù/˜ •QƒùŠE^•ì×M©—æu%2X£f§.vì}dyÂÀî?YΔ9¬ïÀýäç´$ÿ‰è3¬N–­àÝ|ª?wQ?™æ¨‰K‘}V(“Lo:}½ßNF}”vIÈ.  çÚ8Å.ÁÜÐ+WeˆMÜõIÏòLJãÀlù9Jc¸¶l–>BÄ9è)ˆ©à¸mžmx'//Ë•Sºd]£uëb÷4%ŽáV±Ti9+þ/D÷>šUî° ¿±•áµ®–Û9€uV ~F¢K7ÔB™Òóߪ{ã¢Ku½a’?&Ù‹|תŽŽ<…¬ƒkœ BœÌ*åb<¢ƒcD*¯+$ÃÁN]x±^'ìg“>c 1ŠŠ x(¹Â“ºW]ó´ïš3yµS>Ê"‰þ¬ œçÀÊ0¸C˜»_9–Â$xRTM¶Ý>â À¦ÉRóG ô!î¯uÍ"–Ðan“gåú™FõôÙݧ"#¸µD€Ö»© ¢y”?C›tX¬¸­íÛåJÅúÈš²›ÏDZNGphSStÎK—çÙmOY×)Ñ»Z'W¯¾x² ׺@X!c=…t>(5÷úû¥øFCZ3ô+Ö¸Ðg QOcguƒ@˜? l#;)ØÝ‹½Þ in‚ÛNñ¿€KO92R³‡A­SK(=;a¤M[×xh¡ÛõQG’iÍIØytü~°®ES‹èÓM=?(¶®ò “i&ºÂ{ú^/‡µjŸ 1ô›ÕÝöj±Ê{´-}|WJC֕פRØæ¥¬úàUItÙƒ³ÖÇwµºä®Òì߬Y.è9R•ïš])¬=7[W)êxE™§¬ #v}†¶¸btÕX¾ s èÜüÓsKs)2¢ºUüƒûÜrW=ÓA |™úŸïZ’;¾²³[ Lts˜D1©`¸RN*,N.úMíõæîعlY×¹°ê,ñÍ72Vj'nr³õ¿$ Oä]Ó çÈòî©8´Hdþ{5>?óžìûúªzB”ÌKX.ƒcYÄ4xZÚ÷[ey{%ÕOãð8t[×|m±'“^µ®€^Zu\›©’°óÍ—‚á±:ÛFzН7ïl@©ÖîÚºÁ }Áf©úCвwÆB¹¹[ä4e]µ¬$ßVlå]¨¶ÔÞ=yÄòÅ“¹y×l³ÈwA˜0ñÞc|לj¶|6ÊžÏPõ‚ÔW- ›wqMÓ ‘™ …>äf%ÜgËŽzöi^ýBò o¤ÜÊqî¦ö'­ÖÞ Ú$µìO¿«'kÏÕD‘åXj׊Þfýn$³»w·…]!xE«ç÷è¿ÉÔú[^¹5#Q>e"uÍc§$…É㟖hUT ÔÕøtÃwù`Cjû>û)´ÜZ~®ê¬¾`“¯ö¼–" èåâ¤n\ËÙs€ò88Ê Di;«?å‘·RPfè3Gý¡sнU™Z†úõ»Ô…3s(ìbSÞ&TÔMEnB¬7Iˆ‹<¿½ÂÑÕ€C/¦y#ùÜdì‹ÍÏbz˜‹èÕ×:‹L­< š×¯¬ìXG%gUÏù¤Ðêó‹Z>HZÒC^y»…)S³#ëßmÒrµD^G¢Öä6w/¢ “Iïð{õ>d„Ç G¼|çÏÎlàÝZŸÊ Ö¤Â7lºêUpìBž@–«¹IÛËË·и¹PGÕEƒ—{1;¿lÔh]ƒk)…ʱš¨šñd¶]ͯd\—OªUºÝUP‘z·¥‹,º¦ÓØTÅz½úæõähT}ª£aß…Dðý¥ 7ØDOÿѦÄ_‡XLò ·Ç8ÒÈÒµB<ÂŽìm ?G––óý~Á4O ¶k¦VBÚBÙ?ú<:Š…ƒE`Þû51[Á ŒõqŠ'5c‚Õ›Ù9矟´ „¿L ç±[|ËŒÌÏpªD‚…e‘•~’.ë>ðÖÙ~‰fèrfSæ&_@)“Qiƒ®`|N½¶M‘dzh! –‰€­*­hð»*sÅëugGû³ëÓ!ˆ+¤÷·|{=p¡ª/3³›Jóþ錕ä{6Z˜2X?`ó<›>›ÁªÖ“­¹ m›Õ/Áé)U5Ç(äùŠ g´‘¬Q{€Ï: ä„Ë(ÐÕo”÷·‚zkþ]ªìî„!vÃg¨ º9TŒq ¸Ñ” šciŽsâ C0‹™[rNY¡<Êî‹‘€M{€¸?Ù eCkµ$Ûïé#@ ™ Z×L˜0öKm¢³¼¸P;RÁÆÖ©|oïqÈ‘õº¼V 3Ç̾-!Œ~‰­ ËÅò]ÕÑ+ƒÌŒJ€ejmª¥ßBކ€ž{I‹æóXñ$0n }ÜŠ×j¦à~¹d• PUq{¯íƒV˜/~­ÿÕ±E[O·ö1ÂW²%Å"Qqm™WîJ¢÷ƒ°VnC©Á1¦ùÇP6V«îÔñÉšdî1l#ÿR(R9EÄ«…‡Jà ՛‡Üt½të*ŸÂÄ€ÁSR•O§a3Œ„VÑ®ÊÝóî$ýj!­ö~RcŠèÁPÌ2Ñ)b«y$¶1£´´©A¢Î=²}É—ò¹Ñ¡ÿÆ *=OT|ŸB,xžÌ>k š/ZW•rí«²ÁQÉ+î'ºWÿä±Ô žýs»ÔýgWînÎTÖUzÍò¹X¿×Ntè¸@ø.â„ÂS ½´BσYÙhµ@íECI[Ä0É,úƒ ”)Ë%Û ^{ìœXØÿÅʶ0%j~9¥µ>‡SuªuJïöiŒ.CèÚãL¼›þÔ]`9ìæ;ß›¬§Q$TuSCVÞœòX•k4µþòÏ·G[­ÿZz§äÈ"†˜e£ä³:,e]½×O²–?p*lË«U¾—ûéR2G„XÓ5™zRÛt‘»(nÇÒbõí ØcsßmèüÚû'å±ò_§æå˜ÅÖ•²ˆ2ï#™¹*ÓZîbÔz´©§ds8™ã_& ]”´G÷EjrC YS·*ÄYz›²tAk·è¡:€HL2±Áß?[èëò ôgôûˆ“Ðtç[J•ÃIxIÊÆ®«éï“é4Ðòˆ"öÞ¿«'uêã$…ñ¯3ïú!‰­]êƒèäåÕüÒ—7+Êë¤ÜJ/)FÚ•®îÝj…YÔž¾89a%¾+k=ùžÓGULS+25ð-^¬VÈßýü¡ÔÉ–€‚Àœáãåè­GËæì°–áòáÄÂé@Û³ÔðÀe!™ôPfý»ÝSRÍqN¬ã6ˆÞY ›L…~¼qõ¡ ÐôýÀµyD%YWZe¸fDÃ'Ýèrt$˜¹…y¥CR.ÿ«³IPq¼ÂõÏJ ÿîT:S¿tŒ%ŠØä‰ìN&ÚP£-¥áP|q‘·¤,ŠÉ°–öƒN#É'aÙ«êËb VKP1ÒÛIã³>÷q„WÁëö++ÜÂÔÈsr½šÑ³ oä¾?’b­~JP0ŽÊðfÛ¤Ôg°Xy[,(Èo´%WØÓO¼ÝøÉþÆ2SÄàýA[UìŒÑ%•dap S =MÇW#kÐ>±D Ù ˆlJÎ(ÿ$½²fՋ삺>µ‹K[°Ò8C·J2œ#0.6‡ã¬cK‹ êÉËÔ)Ögìé©9ÝHúw¡±ôƒ=GŽQ+~$ »«UvwŽ))¢Ÿ`™¼óÛ®ðxÙ&WØ_íuíóm¯ÜŸÌ=tÑÀ›Â ˆz02–蹄yRííµæX m QqDE­ÀzzǨ׺Nhµ"H Tj-.ÒA£æÐ9ËîrF ˆÁE’•ôœº©Èl°(Ci%û'å¡5ÛíbìäDi”žô£Jù³¨:—XéchlŸT·øPQ_I€½úרî=cÞª#×CH<¡Ü/2ã©P½Í˜0àƒkzW1{d*7Æb4­à¶ÙSÆ:V·˜hÏWƒèêg¿õÖ°Ü‚êûßÓ>NiQñ|¡õ!åÛ“†×»us-ÚU¼;íÁ®âÅræíJ¹‰D,3’iîAmòþv%?*P2ãÉYâ£î›d>m½!mY,û¬w» [Oõ½ìLEw@)ö~YSÚT6Ütë¨]áð]7/úKµî/PÎÛ÷òd~ƒÆlɳÎà·êú@[w€tUJúܧ¢ürè>‰ÁXºÁù~Yôß/ÅŠØÒE›’;¾Äÿ|àØ]¿{ÕýÒS•® %VÚa;W1{v¿$pî¿Ú›öê´½ó=ï'‚r£nÎP?þ¥¨l-DÝ‚h¬#`©¢ •»ä1oÿcŽÏJ3âFM6ê6ŸL:LmçG:SìNÑ<4‡.6µß`‘¨ ÷ÀWª0"‰Ë64>2÷©ô&¿qÌÓä)8ò XÄ2×CmÓþ¥>ަûK“jã1 \­½Et ’Øý ꇕ·¬°­AÅåk¹ƒv‡OjG½’t±á2 ¥ÚC˜Ž ݸ2–žÐÔ/ýÞÝn9¥T*…Öᔘ¬!³y á†òLE¹ZT”×ÙœRî‹hô©d­¼òášÃVÛ6öLmB㡨óD½À_ë Ü‹úùÉ”åoHn9+ì­.+z…ž–®b þ©ûà—Oô¢?3.~¯Ë}…È!¢™äEz"ËL¬î™[ "82”“ñl¥9Ðévf³òG6³eŨ“ƒm]Ìž­ÿ:Z·È$°S·«æ ‡v+ÈžËè AE‰ GÝ ®º¨çïQšyñßAù¶O™ÚêËÊáÇ9$ÖŒ@€$J›&*W> Ú-‰§¾ö=}¶ËÓͼΦt¿ôãš½‰;†d÷2dA,÷‚3§×'צu!Yk–ôk)w/º:f%JËá;PÎ ÷.]i²Âf¤†Žn³*Ì…RÍÝçï¯Ý\ŠÎl¿²WûØtU³"¿9U¼¿¶r“u¸O7zó[å‰ÝD©¥Z]$ô¶•ÆAMu]}Ë©÷§×$!ç9ºƒòqàBPOªîn©S Ü•­¯|ýþ+/YÙý²UÆê†¦ªñÆ'tBÔ u]ü¨ ê$Ñô]`ÇILñA¨™¶ ê„5[MbŒÄ‡œaë+á¥s¶±S•AÍ6Ýí8éyþ48rµœl~}Í{1‹•µÑ3M¼Ãb])T×è&ÆGÃ^Ý5qgO õL¢«Çï< ÇU¬‹¯ý6½6i®¢Ûó€ A0²• –u§ šš…M2|ÙfÁkÐ%^|ú Hä“ËÖ±…)Â$ -3§±eû«w«+bâüV8®‹ªÏÑz|2é·y2NOmC¯]»¤¬¾V²Ò NÖ›ž íàS|8Á°ëU4‘Òã%½•û÷þj²AaË/}r@í‰jíÇÞ+/j[âPR ¹»pB¦kF,¨ëv [U§2Ûn;¼=©ûéÀµªoqJÕ¬ÜÔ­š$”GpÖU+_o—ð¦á$‰½ G•Øf˜¤kþÑÖÇPô€‚ÊiKòxŽd¦©“°¸s-ÕŒ»M— œ3Þjò­ÛÞÛei¥ÄèfVõqÆÍδ7O°æÛˆ|.®~t±sæ¤át䥌ó<†ÉÐ}ょJÕåÖ9¬ £š4È=@e,kÖO([C`D`š‡“%Q™ù¶¸>­ñ´¶.°$¨n Ó44²¶E×Ö^Ô~D0­Û^DzþëzÄÿ÷#¬ºüé°6'§‹æ¬ :%`[Ö¾«f+Ú–wD®ïŽ¶ÓºŽ ½²œ‡s6ë]·Ü¿ ª@ïœX"àHsÆgâwJ4K /!£îF$Uƒ±’~)ŒÚ«9$ÓŒcA)zØ]âü÷/¨iÙïBY×Ùe ¦¿ê@Û1É §oBwM-)wÀÖÆ“Á^ý)¶rŒü´˜žA5×^'Å·Hèy™YÇ5gÄ jûȤK…óÈ5,z<¦PÀvtRˆA úàŸÛ5ø(kºM­Ic÷'€®$RÌGû²ï:Fmë:Åþsu%\Ï´¶?5ã ýqÞDü£ïЂÝo:«Ç2·^Y™«É rYõã ’:J«þYccP'äy¨³Š¼@(–-OÜj¢D9LrbÛ©éÏ®½­ŠŒøé>ë)ÿ”à•·ÌÍš£O¥qÀ—¸/–(Ã$¸EyWðÌzøÓN9"wžô3¨í.éÆ"-_fŸƒtn¡ºNñ–˜32¾Ã†¶Ä…zn4(€`ÕiæG©…Žj‘IîɺüBFÝvÇOôQáÇœºg UeF,VKu9䨕³`¤l}©øŽ ëÝ.¿í—òtOúû]ï¼××ÜÃKï#)€ŽÙ‹Òð=Ts_Èðˆç¼tÚF´ÏX&¢éÓ,µxŠ k´)|ÆêMÁ0 ±ËÞ/e–À,~ckU<Ž.°>]èÈe»µùaóÆ|ÆSú&©ö ì*G¥õ³½&gMÇm¨Ÿ…y™n`g“;ç 0‡¶¬lƒ ÀDF#’­J\#mÁ>b´8¬Ùfî2ê“ʸI†fj÷J4¡BÁΛGÙ ÜíRNÎãºî¶fX—뙽©¯‰S–GÒC9)âÒC9ItV*Y÷²8ûZ‹@l+\5ÒqßßW|'¿ÝÄë¡F±Š ’&?Ý©%( ÅСû G›df€Û-¢9I{ÏD"îWuÝÖ5E9c¤Ý¬Ñs’ðÏr6öÜ>èävsŒmwuN° ª=ŽŠkPI\«`–’ßœ¹ ÏZNf– È c&zõmÚº¦K=Ì]Õz6 =›N7„%HA*û¢ÎL$Þ—aée¦å^*˃µ 5þ]r©ŸŽ'€Á ´ÇÔ„¼DD¼C4ˆ‡A‹¹M“ %"/œ£ó†±e«6Öú(ó^g´9»:ÑÙßï”h¬øf€ì£Rz*ð·ÈÃfaæ¿æ-É>Go±G[‡\Üy¶»\¬µª”µ±U;«òÊT>ÄñÇ…7Ve@:cS;Êj¾Ì2(.2ÆÒ–¦áл6 f¤Úm¨íµÜјàŸÕÖu»üš,õ_võ?aÒ¥]Ý`,¹]‡tÊhwÌ“ÿýÙZæÊK Ê >Gû ƒ'—”P•ÍÆj1³ ?»V‡ÓìäÉ(Ajæ}•<ÍÁ‘[1úì÷N\6 *²}UˆßS¾Å÷¸tniè1œˆÀ˜ v±ÇCÿóÚóþÑñÍî8—¡£´T:_Q–Ägx—Ÿ»RMÅT@¦߬^Ú*99Ñ=ßuªyÞþÄžÄ2KûÃîjõECV 9`¼’y4QSeÞ{´õ`]y[·Ši #íÑDz#(x OßÚyå$C™…Þá/“È.¦YPs€N3áî ƒ&65UŸÜFDܸ«5>Å[àY‹öáJÈÄh³i±.b—pó é­„†wJß®lS+œ"ˆ í O¿¿õº˜ÖÀ£ ZMmEŠõ+pDÏ.wÍ 7_yL+ S ÑalÕm©«¯25Æëv¬Põ15¼ÐVÁÂ'þõ1õ•N~^ä_Fçh¨^µÀ]¬Á#6vÙ×Ü –a‚‡ äh bu¹¡sü¨33 ­ø¡›²Ô±5®¿$ ÌM‰ÑMù P+LQ‰BÅv -‚íI’ôHÂÚGžAô¸HðÊÝÄ}„?µr«6ÈÊh]1É#bú¨äâFäoDh(n´ÔP܉VJñN®\³@7nugœ6¯bè±ßÅ4`/³3„$r~ò|ÃÅífãá>ºóKEnÞ C"¢(ÑðDŽ 4níV=©¡6ùÒwÞM)ÔIRØÇ‚PwçAn‰ 8†»E¯‚á¬Ý‰™ø‡"Tç*ØÀèS'¤"Ñ«Åf¡WŸóô–=Èmµ$mu-Öç·zò´6ºüþh<ò¬@!¤É­SÒr7æ8R6D.Úµ^‡õÝn&Ÿ“™yU‹.ÊãY¸?ƒ,ä1!צ8àîé-pG žE¦6¿´0ç ÑCó¾ëdÖ'ÕwkÆÞ5©ÜÐkI²®cì„îO9ùÚI7”³"hî­Š‹êèB¨ÔŽlV:¼8#ü¥ð"Í›?mvW|è¬)…Ê9OðæÜéíR'qÀK)jp‡’=þS¹ÃÛ[7ûüÿÊ€ŒÊ|é Œ†|=nÚ·‘ÌïÑw£;lãì’$ɺÎÍ{ "¦ISkc enç_uEgÇK 'on–æ%%ìÿ*<¤í¥DÇPã*JÂÖZîÇž3¡žMPï˜Gâ˜%,÷göÉñJ‘uôl»ÏÓýoä]³±‰*àËS«a5\ä¤| +3ï‹…ëCÁ_žœóóPÍ,k£ðeÂ6Z§Õ zuêu,NJLGN*¡½Ð¦‹šf–ÝQ©¿šË^ róC6šG¼Òq‹»Rt-èP&ù¤1¿¨4µÈ$EŸŽв÷kO¸<<¹mnÙBës|Y{£²·¼ÙÉÚÕnE=³ ˜Hiyqò+V`S®4— %Q»:0Q·ŽH#§Ä™Ÿ;¢ <èUx1±üÞ•]ÃÈæþ¡µ?ɇ¤W ,9×g´¨Í&,xIÐý Yå®ÀAå|ªTñ¯¡.ß& …Ÿ=Ô¦0a¬àìLJz)YHƒ5BëZñÁŸI¢T¨…¶Bдòë(\›~yÉ r—ªã *‚sÐ¥`còâdœ4(Õ’F0À»£É"O'­†`÷֞¸Bìš“ ?Ps“Œ± á/É‘³Ö”»Št(èz’^iS^Š¿?arVÓW&RþÜYõ¨jc@ÛRãÍÑ«_ÓÖu>œ{Wç»U†À”uõ\<<ÑÏ” J¡;^€š»c¦Íå» ¬)p(•g³²>ÜXwdÿôóæÈ¯;yµ«€Ôåžž•dPØÛÚ´h nÝ«ªø~W…ñh×E¾dsù†ÐË·œélÄÍæIµßœüéÖâ"Ýmî§O|ðóÕ6‘>f“Ôp­k?,Å ë#' ‘P×/ïzw¥ËIB¾ðÓ›êiŒˆ0ŸŠoÛº€¤+§d²2àŒÙÍÙ@Å1C>KUpVÞX*‹“tŸ¤% P ©ŒÃ¨|òÃ=xê:SQæçÕ®u¡ëjUR€y³îÏ$ bDôÏR;Ú§´.lN¶ªêÙCÛOºHÌ *; ¨h—)&Ó¼N2?j…Þ/ßè|“í|M×ÄE=éú»€sï$ר‚½Þêñ´éWÔøõ®èNþÉÉš’ì.åIùì3è·ƒ±teny% ‹” '–uíqûßQlŠ ÞMmÙëI „žÍ0 h5e±kž›|שT-ó›SUµÑcdDh&Ÿ8OÕäÎ…Ýð ñÞqÖþR`sê—²k¹œû•¿ƒ½‘‘ú¶í :†>xuséõ¤NÄð†9[š±·ß•óræ]({‰T²LŠd K-Ì”j7‘d)·VºÖužð^´¡ýh.¯Œñº•}¾˜ö;CÉÑœÍ$¥µÿ;²ŒÔëžô+È>ž‚úEåÞÁË5µrÇùfM›¦ËÒjpxY)YOÕÊÅ'ë2õ5fDÖ…©÷Ï@1y79¯uaÌø¬ M–I°3HA¸vŒŽÄø@º2€²®ñ”°^öÏ ‰ÁRw×¢ä “'TcËÊÉÁê`ÏÔÀúÍØz=”5êÊKs^<Ò·flT¹Ãà£KøËNµ* AxÐ8… ¦†ÅUš Ãs\(¨ˆ32˜„ ´®èÕ"õc4 ©·([ŸuošdPùbûã‚W»º84×›ÙZOÀ›ÏXc…jÑ]EGbÈÔÀT¥ÈØ÷œ]ëzÛ Wûõž.v«EÙnjօÝp[W¥ÒPøE1õÇ€¬¼¿‘™r¼¹° Çö5$"ªñ3igsjpv{Ïs¬ËÂS Ú$.4ÔëÛ@ ]܃à—Ë5ììzs Ô4(À>djXh²®<)‹Dâ”[Y¸r…#X‹…ð`âȸzvd,R‡œ[a¿+D4¦¬«ÍJ¦w°oõ©¶Ø üažù ·Qžßàúã»FKŠ™«Ô—5`b°ÔìÃyשÐÖ”ïêÏŽ£Ÿ°o!}­+•bßõD!òê4ÊFEnô‘q€&î¦uÁåªc–j²’ı!°qƒœÁ‘ÈgΜ@È(H,â{²u¨H©V³N6¨ò§Àʳøx™‰»À_dÎ0;ðÕÖÕ“ˆ¹À6·¼·ƒ)…‚áyËö­•“¬«Ï,þµ ãcÐ 2/ÂáŽ?ëÉçË’NqDÄÓ‚Š ªÈ1¨òâYÖ•w²øÎ¬™(´áÓyWYŸÈËDêûÒäß$l^V»›wÕÁŸ‘$;Á^Q³¬ Û^JµÆã|¾õXtòkrö—jA¯<œÍ Q7ï:†2ä®vúèû͹Yý¦÷O¯"*—-ò©Òý<Ò=’Ä‚ã O´É€ò¨Æ’µËàFÚÓÆÐM?:É:geØZô ,rs$ha4~Íâ›C)jÛ]­i…²Q¦Ãä)T’­ ª]¶BKRµ ÿ,l\GŠÁ¯´AcöÖ‚b¯Z\çÃu¥ø§£üJñÁ¬Þ˜}|ósžÙ‘Ø VcçÐÍlò½¸ á½Š’ÝÁ®d¡G)'ÓÙìXBVŒÊ#}²«r c z™T'2‹G¹Àî×%½Cñ)ñ¤ þϲ.ÈÃi|ôtb[Ra Àœâ>ÛHÙ5˜±Uä5 ®4–…ȤÖs/-<}ú(¹€ÄQ?‚¬™òæóŠRü¶„BÀñ#)Õ‚SR0dûìÊ–l,§Z 4™ 6:3"ì ʼ¡ü tÂê*c·Ãè³Z™wõغ±u¥Nvð¨ë ›œhlKÚ¢BC±É«ÕÅ_¤îHĦ8EÉOÎ{Bˆ•sF¬gO*ûà 3àEixÜœªëXÐëlĸ*`Õ¯ 8YÝMí‹r±DÇžÛïUF—åöÞhá;´Ôâ:yˆ]@랢u$ÛîÈ·/}y ±_§‹Sà {”R÷ämžBÌíóÆ>T†=ò´b;@PlÐWÚº†¨|#'¯¦-kYãld D­Ô?†2¦ÝñlÇWÀ´~ö,ÔÛ ÝRÒkuÕr^…¾ÒqJµu‹·ÜÝvNV³8cSí“‚gÑX»Ðéòóeû¸ù5ØÓ@Ÿx¢2·‰Ìsa°Y¬%:¾Ã|DPs"ŸJ“uA úÚ¬ {ùä™™7ziV|ò9»b8Ï»«gÓßÁ¢=jö‡ ‚r- l©Â6”õö˜‚^ÀÀ'/&]·£´h¡d–háZ>]¾k¬Dû„Zü4õü±[J¦¡·§Û»yp@$•yªw½ZÆ“ðA «£u…B|’÷íUç*‘l°@dq×h]v‡]lüÓb“ á´B†¬âå•cÓôIA±ÜÇc²ÖµÛGþ,g÷ŲÅÔª¥}Ô€ˆ‘ë(6·\üQ³È ¡âÅIY—rò¹í»ú’½´É~Þñv…ˆٺأí¡2 „?4„²M`Sì~-9%¬²lÚÐÎ,ÿ?:²ºçÐs(gʰ{E‘Ô¢D!6Ý 8o‰mÍ IôbZNÞ|¡®KæZW©[fsj‰Ç ¨]¦AahµŒLÄ1 \Šò³4—¯4œ ^¨ÎÈç(ù.€þ/ÉC· ü ‡#ËáUõÌ\T_£ËwÙ$È8ÿh½•ä#é¹$ëjI;A¨n¦ ÓŽ0ø¡[+ -’–T3‚ˆÙ›Vo±ðZžq¡uí{n~]’5Êëô]ëÚ#Éo”ÞØB@ɰæ–œ,Ü…é­Ày#NÎ;ejìf-»U5›')ïê+%EFLõïpž#ß Šï¥ã „_6$ËPj³ðœêDF¦Pȼ…‡±-Kcí¡l¯ñy¬îçA0D¾k½ër[W±Å³ÅDsÈw‡`Ñ5T[*4WúÈC_U)þE2Íh…±^û ÒšïÖÛîh­¶2Ü‘8çÏL0à•‘9Q‰yîí!ëš}fù®s↳úÍ8ŽcJÉl­çàu9žãâ=?f¡ç»üÒƒÔÓ‘qV °b$ì ƒÕ™SsGÆþ”í/V+øôíP ÉIÅV,7ºf|LOz¥6Æ ÅÐcxÐgVëÿŽª·¼Z[ôè›ø. 0 +‹Ø¶Lù㻨XÉ?û*Oª¾«²[ŒÚDÂhÈõ¥¼k¬AY—4¥ÊêûnÔ¤Ž¼‹.åb ²ó®$É­ÁÛ5ã‰~†Ìd·¡Ðž/®ëNdu¿kX#²úOÍ8­¢‰…¸ä¼k¨&޼k:‘?•n—ßHOyóZ64eìnÚFNô¿qþ¶L­”OøË­j/¢éƒ°NtS9¶ÄjmªÌJX÷®[2œ+Ë©È\«#ˆ§mGöx2®*·|¿135vjá⮨ÎͻƓ^yèÈi©ö<’ ª 6g£ã™9ˆ Ôêg*a·”Ö•Se™ØÁŽC(}1‰qw5«µGžÆš‘-„˜vsZs;.txè(åÏ$µîŵ-˃y¹š_Ç¡eõíɤߎDÿÏiÿèŸ4õm…Ýó,@«H‘¢z³Ç8·­ ñXMˆó2—M­µ¦ ˆ(#;ÉuÒO°ÜÁ¼+⟧:ÀÕ@S¥xÐzW-Ñ­lˆ¦Ýþ4[ý¼ôâ—Õ¤sò±‹M `ÃwKæÖŒ³6ß…º÷) »|p½ †'û à\"Ø!†®&gí• ² ï„;„Š_‘u¥AUÖ ®KŸ£Ô–U×k©dSØP|%ØkBñµ›øá8LµÔ.|sÙ”mÃKOƒJ¸WN)Gͯ$±§lå–Ê«¿N¦ë0êb·VZsO ÝÙÝy} 'ÈJÐ÷~Eg+À›Ÿu¯jEwðÕ»Ÿ¾¿ò`ýïV>u9 š‘ƒ#FÉ6 @^mNâgðþjua˜úSSÿ¹Þ¯M%T½-â&‹¸#ïšeÊ Zþ.˜¤ÛººK'E!äw„ø•¾ò 5!À<ðIf;(î>¾ Œ£Ê»JQ›fGª¬)ö~$é#1ë0ØùT[–×Èó£r×[ý ®sv' bÀ†Û¶Âí± ”Œ1È'(hŠÈë)Ö JùìÒ"^7uÐ)áýº|†Æ±ƒyÚjÏÂC䱞,À»5ã¡Ô®»*ƒ#Côìùœ_w!ýÈ2 €¥Âb)޳{¡ç4Ó¥D¯Ð @ò4Š/OãìÁ¼gúlÔîKÅ?ÝÔå•_â<#ܱɬpNqÒ]õ:é”@6ÝM=)ðr0\ɪ³€æxŠš=ƒ¢kV¢5Í#ë%Ï…¬W9F>«dý£O<‹Gosr¶|ת7Îî y>*Go80RWD‘¾Ø«O†°c :Z@OåAû6P´Óˆümýߋ٦’§¶nry§M“è® †®ƒÐÚ6܈ l7XìAå[$å•‹´DOïêží‡ô¸Év*E‰Òù¨ÜDŠZ(¼>½«»ºƒ¥Ü§ì.—´Õž?eáTø†i8¨“¸[p€^tFFj„k£ªÕiOñ—8™{w¯=ïÉ/»+ö[á äm«,ZWxÈ«§Ú9—Vd5"îã™>Žì£y%ú.ñ²ýt¾ÁAUœ‘¥Wb×Kª´X>LøóÄ"aáø|ü¥ØÙäZ¼X_BìYÍî2µs²Y¤Çôq˜äeb@€ÍIœR µÊIIü!!~Ã'qy3ê:Á:'ÚÒœƒÃ‹LÉO¼ò8òœ7³\ óÈš1ZEÖêùJÚšs ü{{õ ¶¢¬p?Æ ûéN”ãpò-v^$µ¼q`æ2òäDÖ­/ÛÆ«î§«l! }¶ dEBõ³Ž¨{qG7£J¾±O†#ãrwòud‡r›®c [Wâ:‚f†µFH0,b¥b¯V_sì§sü[.Ëîãˆ;µnʬÀèOIÍXKêI•j}ˆÑúó0 üàa‰CU<†Qì!Î.€-† W‰€_ò[€Â}ÑÔHÆÊ~BêÍbÓ]iºPdݸ„[CÑk¡Ÿ^ì”^ºðºU¤ùŠåÍýi.´ÊÕÒ0¨fMx,Ñ)]o»fÙþö6)æòÓ‹Ù¥7M±‘“w‹ 쓱þI˜M ë6¸/üÅ’…åaÌ.­VE1sîüA­æêÈqJ¼NsÈA0à¿·jK´úÄÅrª»ý•_6šIb°ñpÎ ™>3Ì>äyÊŽí+Èíú^ÒuÔ™ìÕßê¶ýWh>w¼ •ì±ïðŽi*R-h3{Qþö­­÷œ%ùœ¥,Þböê‘Lù`\hgQ]‡Öjò4­i f¯ê'œÚÍ0›qŽ,%x¨žÿN¬§3µºð½-'5[K;$0bÐí’×þ ²ÆØkn3¡c}—ÝÔ ´¥I•Z%âåÙãú5]IÐ"Ø/ëFƒöÛ²¨a†»ý³dnÕF?6«.h}¸S{32t\¦t±kÈŒÐ*®-+tóåx| n¸ßµÀ´>·kw¤'2ñ²Ç¦1`6v³-›Wl‘33Û×±š?ý›É|íñÒâÕšN™Î+šZei!©é®AIîIŸºwÑó¾u„¼ìiÍÖ‚Ð5(ÇíÚ§÷ýrú@}€yÑàÓÏ èÜ·6š°wšê=·H_²¡à² e Èʪ '›Û¥gçág+fN‹•!y.=Z²îð9I_ UÉ#qâ0§Kž9!¥³÷}(Á+¥8kʧ>ªŒÑ\s€òÉžu䮊­0õKúæM &´žuyô]Aˆjuác¹¢ ÙV!†I‚1.oƒ¸Þý߇K{v»:Í-Ùó@TWžçØàP26ýU8+ƒ°!æÑÍ¢oõÒƒâü¢ÔµëSÆmk^þ.r+¶» 1-&Ú ‘ûû8%¬ë<Kï·îu©âFµBçΓ..piäDÅ0$Ž=…BŽÂÐÜr-R¼h{úÍBXF¸Ÿ¾÷Zú‡â¥(ä¡Õ§8´—¾Ý¸©¬)°ê—¢`¸6©ÅäDßUE{rVf ˜€P-¯yn *Îh…iIþ¸÷æÎù3>}—ö°aÕèϲ³%|‹]e’ÀÕ«TEÕ"ƒ:?ðú'¾‘‹¼‘ÿÓB¨pGÿ¬¥A(L,èIhµ«Ê¿µíôÏ#„³žÂx2ÊzK.íMÇ– HÉ'­«®eÓ$·;A6åN˪Á‰Ê@w dIP8V4i…€t}¨Ñið¾Qþ`s{Mñé„ÿÔÕ@ÿ *_Ô¢Û^½ËÛ™ÆíjëŸòT¦r÷üÖdâû­!îØ×4Ô) 'xl˜!ÅD²ÄN~úb×U¬í}‡>Ø+ŒŽÄ²Ünøãฮ0ÍæPÖ¦ã8òôÏڗźœ×âÁà9WÝl±äÅG­£ëxÆ{4¨s®¦"Þ©ùfc’@ª[œ2‰êDú9É/” d×üÞ\Ueé±LSked~u•®"QLÑšZÿhw42¯bûO¦ìŒºÁgîÏôTŸß;äË7Ð.‚¹c@£áy¨ºn=ØQ·|S?„mf…¨{VÑg8¹íëÙ†G/þ¤?Yn¦#ê]lìH‡D4Œ6â’@@4—¼R&^>à*9E š•wŶºqŠÀëºzƒTî`ò×@ýWdNY'é•(¤—¢ÜÈi*{”—§å¨ñj¡ï ¢”ùÜPÔ2åñ¬Ù5GSU þn[ ®ÚuõÃÛ?Ée^M¼©ˆúóß÷•b…øCÇ~rúæÌ-óú"Ùs×ÄCÒdI€yÊŒ`Õª‘26HyH ¹Ÿ>ÀêbxਘŸ(4©õéöm´« ßIV†òv7EþÖ6U8bí‘j'wº ëRXFÕµXOÁ{|ÁíÆ"ê/KÄàz ÚC¹66ÐzL$Ð_Á=(YáÁýCóŽoíqÙЩ,²B^Ê™tKX itdX_úˆU—ô-gþ2n—CèÅt”Zú pÎ ¨~¦fÉ×&E› …¬„ÈÕ’õÊçänEÉW>>nݤždX šK‰Uõ³T EŠ;%hÔ‰z` ALS›!ê8ô“ULäs(Iž Î mgt$ê̪Zj? –S÷GŸÊªòq¶) DÉ…j]1_Hñ.½˜×ž¸>`NK œâVƒ~‰›àÜ·˜IgÈFÉÙœ´¹è—@v¥_¹Ò'¡C¹—Oç‹ËÙ×åZn¼7 ycès—G´xsòÞ-î ´-ot×üJ16)öÍ­-ençÙÅWzZ7+QÈzÅV_¥©¥1«xí¤ Ff³¤yNÃäƒ*-`¸L%AØÝT\­Xö¤Ìêw>z‘(öV»M~äK·5W¤ {q6.@Rîºh;ó8ÃÜóúÈ=n)߯Væò¹:I´"ÿyçO÷íîÙÄKêRG‚å@¡+Ñ­AW'¯–z±vY ·S4•$€Ç™ä¦ ÞÛ½ålHUÜ®ÆÙÎ3fb­N™æà˜\–/(kOÙЪ™Jnå-«ûˆ|Òy¯¤¼ kœ¥» ƒZiS[áúÜ'“þ–Íûí;,Šd#Qºôð¡­·1P¿Ø?˜@ÅOÕŒ ø(–|c³êÑöhÚí†Ó¡ã5—dwí³±„E†lQG¨å8÷K$u \ájúÉ)hk€`h! JÅ ¾¿˜õd]ÐìRú¹Ÿ÷ÇvUÉ>OÐ2•l«É)p“Ct³!*0óÇN(SU¶Ò²ôÑI>‹ú• ÜÒ?ÃðA‰Rzô¿OاM Ò6›CˆùZûðQYMëÃAîk{CÄíIuÅXÙM5ëx*–@Úuõ?¯Õ<ÌfÕJíñÐÉ£XqÐÖÉ‹“Êðwpz¶Œ;£ó‰ÂƒùqRù=nVNd–ÛÁàBìï]Uõˆ TÓÕeêÑÜáAcª+¿Ô™Ù …ÙÏ‚……Ìø1‹¸ ªPÕj.ûË–,ÎÝqÇɃúpA×z‰jûƒ~½Ç…Êþi˜ö'm‘^lÝ™,¦ ™ðàëk>ßW[;¹ðýæ‡i‹Ø¦$ÕD¬/Õzä)u(,y[ “øÄ¸Zø¹ÏÇn]¶±ÇûæaÆ—”þ¦–¾ EÅú¾VšÚ¥Âó>ñî—c9 +ƒÏ¸edh#v*} !wù;h½¿`]‰Äoüú¼åt'¾X%¯éJõ¼²%Û8/IÂ0pŒÒS¸l;tF¸8T?96=”/·u»ãf‡ ï8Ý"S;9Ý{é¡¶’©DÂT³È¡ÂAßy›KÆï落O·=^úG½ã—C¨sn]´}­ÿÑ-~Õ×Gf»âè €î*Ãh»æˆ®ˆ¥d )Ì y” In„@g§ÝA^3ë˲ò ÃÃG¡©µš]÷žxœCKÙª7 ?Y¦H6ØZ.V¿¥×.‹g›¿k¬Ø:• A’Ã/½5¯åŽÚ¼+°‚þÙyÞÛ¡,­báÅó–‡âZžÙ2ÛèV)Ÿ¨¶e¬‹%ö5V´Ä§[Š Ϙ^ $ÍÅ¢yãi¦ßù`ìWˆü¾Uõ¼¿âº¼ô ¹¢yèdE‹õ¨ŽÚƒéïö±=T,÷[LûËkì'ÔÆÖ@rŽMý»–êø˜{úx¿·s+Z;2Ôeð(!6’}\›ô~ˆÎÅO¨¿}±~3›~ýâÓï¥?¢Å"ƒ:ÅŠÙÈ MÏ«…t”¶,åxcKÕîÞÊ0ü!½xpuL§9 ö$áÄ—¢w¬ÁÅÄNb†Šmg[ט£ÊÏoì¡Û ëFäæ|ê ² CÕ»µñT×Ë‹ÛÌÕuheʺN=ZõÊæñ¬Ê÷O¶nIMxpeC'ëRdDV(‚yà²E£Do– =6dR ÀPdwÇ:»o—û´>„MˆS·=+ª-È*¿‹ý¿ÊÐ-G2ÝtÑM PŠÅ'¦Fú.ô¥÷³BD¹tI÷^¹§NpjË!ª¦a]¾‡º©(æ›ùJ/ŒQÁ1Ò*×ê²<ÜëÍÉSw éƒn-D׿ü^(ß‹Šõ¡’&}‡™]ᘟŠ6ËÄãõÍéyòøVh] 1׃n™yW¬!8«‹Ýâ˜3VWöØêTG)?q…› çFÕgäîîH?#IÍŠCsêŽQ¬;Üú§[…±¥³z ‰4 D«²ú¼’‰xWë–"ÛkjÏóÜ2 bMõ|á5(ék Æ,Š='v™Ðñ…i8æüÓ´Õ7‚Ä’Z\K#Qô8ûrórR‘ñçJa³Ž‰¦¸ðÑWá4?_’#íøÔ~„PbýÀÆø$kË‚É9–°\vÅÖ`ö* O5©DÁ°4çFÇßéežØ‚U¦µ(€Úyï%’9ç@3t&óÇF¾ù6XoW Öõ@=ºG6šzõQs°W”VÝÞ¯SoþÊF™¨¯O Ûã¥ú馂’E>Ÿ»©Ei´_‡ë¦áu[Dã$~Æçü&¹:’‚ÔÁì“öë³þ<–®ÏÒ˜ý$£ê§ŸÎ@{³$;7 wbQuÖ°s_¨Îšt’XÈD=öØF”_Ä:±»©XÉÓWÅu¿ìR‚·1tt=k[ÊfKº¼©¯ßÕ³×{ÔªœüD²eë¢dáeBìBõÒÙ “­­qECZã$/ÆYÌÖºâ7ͼ¢Èˆ“)ߥš]djØÍѧÛYm±8JÍ9ݸ¨2Ö飢9›{õeç­®È|jê׺Ênž3Î$©áLvº8Õ×Úœ½¸Ö?ô÷©RŠ…æâ´-” sò ¨_ î–h¹hI5 Á‹þùwyU'OÊ’åÕzVÂÖ3E'Ó“ì!¸nÍ‹¿´¢=øJJÝÃxÓÏz… Æ}O×õçv‡˜™†"Ê]Wx‹Ônw7B¬,«©÷ž%“®I64NjóÞsLKiCQ×±=ª*u`AÙXo‡S`^ËS~q¦úÕ'^Œ™X°ÜÛ=­O‡rKn ­^•0#-´OJ°>¥õ)åÎíò7ä99q{tSz“ j¹Ðº„k™O4ᰮкð  ÞÕØ¹ J}ÇNÐ4ÿÜF+'ô$ŠÔÑm ß„»ZnýƒÚe+! ×XÁ¸|®æué.R•3Ò%îȯ I£»–ûNf!ð  ’ûM‚(^’*ö´_#ÞKù4×O¼“Ô0ÀÎ’«ž’mk!Þô§x#$+Y3¶>ôÄÃHh<öV¤?cËÄdí2¼x4õxž©½Z÷b[±ê: Êþ÷ n+Zxž­·\Êõô B!B©rÚÙR‹ivB)Ѐ{š÷wù–5ö•’èÖ±:÷vû3 ¿ÙÞgÅ(õGIÖ5ºlhÜÝ©VŒ6ˆ˜<>…×1B§uEÏFé, 3³êŸ€ÕU{¤Ü¶¤j–õU“$æ¡4=cGHï¼/žlÿœKÏÀ¶ }òû—@Œ±Î郫;%YØýôfÓû¨8>úpÉ;%ˆ»ZRho\Þ@wYü«áÕ&Ÿ]TDO(½Í´Ûy«ñæ–T{àÊ› ì­k9IëZGõ®VP(¯9t½C—§F_¬wÍA'%¸_~ø„w1È(œ¥dfÄþ5(M±Ñ ­ãŒ7+Vr—»ìBù‰ Ïâ‚ztûÉÍܬc^wƒê|¶Ï!›£ødž<ÂZo­Ì‚1%c¾{Sß¼äjùì“qn¿Š¾[S~]º¨Š¦5lc _B‘Þ_÷ÕѸS˜‡lýÃm:6—Evè¶óÁÎÈöšm>†úWÑf!!Àh…$3±¼éÙÞúJ§:ên=ù‰[n aîø¤P(œˆ ™í4Ï^èåÓï‡ÈC l êÊŽÏCcÌm(‡LãͳFðãª@nc׋؇/{=(ïE®ç-ʼž{«}äLxìÁ­,èm+‚·ÌÍæÞü0ôEƒBç)™á,£ñì$ÊŒLä-ç¼x~XJYÎl†Òð0ù±®’¶@†yOÁôãûôä'¨ø ‡Û[¾]o ?«˜zþÔ£Û~K j¥.t„Ï,—ÖuLÁþ7x ²Üöh›º`I賞ðçU—TÏ‚¬]„X×q.µÌ ý’lòú"†žÛáâ«¥€Epîµ¢b÷dm/Ÿz›†¹6·ÕQ+Ý:úQ¸—Äý·*Ùm±ø:L²½…Ù%³²\wÄþÒgûh.1ËvÈÒySîÔòtq=z¸ÚrÊ$c»{ìã³äâN­×õ‘­œŠ¡‡Ò³5º!3¹v.@z|@Ñ»Yx@›Ú”¶,´(šõŽ·jÞ ÊO—àÍQª¬kŽºìÈúÔÖ(©s÷Ý~ƒúV™N¢ÇØÊ§všBn1ßó—{•uÕÂmà˜'L ’w‚‘U4S·bsÝèÝS¨dUÈX0i4¨Í½ÇÈšòg)ú$n–K:Æ*þ¼H{Mp\.‘ëȵ¸ ¢i‡P÷øp©¿‘ï[,´pÌï›Ø®ÁèX̺Xkã7Ç&uõï€í:ëv§È§wGÝú‘‘–vJòØ«Æ&µ ®À6z®t.¢ ùcPhµÃ[ÝT\PÆë|@ýDW´è~.½Ù‰Ž%ºm°Pypœk]«jk#¦âM™)¦hŠéœõƒ1Óœ8÷[1¼½ˆ×ªåÆYµïÊ\"¿Y}Õ©ÏJŽƒ=­óÓú3‘¯ß‚±'˜´=äØV_ŸÇe:¾:n;ïîÒƒ•I¤5¨°LSES:á“È—ãr²}ÖX·å—]x¬ÿkà\&Ÿ”L6×êþHÞÕeNÏ\Ír“½|žÖ–©4ÉëK+ožY4ä €ƒkF+SÖ•Åù³®ÙeC'~¨çÅÒ  ²åÈZ¯LB+lº³8£‡½x¸uL?»ýIÞ”›7—ÉTkŠÑø¶NàŠx~¹¡7]yÖõ]â9©LÕÓ/C~íbNw¶–9UF!Xέö4×ü(ÕTòw])–A4µÍn”r•NPP_‘Ä)kÇ Ží.¿E`Aª•,%8~ç¼x5æ.ƒZ˜¢ü#CÏ£d¹Ü`/n_Öá1É…•«h]áêµW(Aj}7˜W»r:$)>À_²À9î®ä±V<ž.ûó.¥lßužÜúÆÌÏ#.ë£\| ²ªÞ Zެ¨xû mD±”€ýµpªƒÍ ŽN¯ð)‡rPRêd!;âåúYk9{Ýëb^ÕIÌò-±."“½6˜MÚfî“ýQÒͤ½ù ×#©ü ’m*´” ˆÃë!õù×€Ê4›$i4pFëS–Ù°­óTœÛ}äž´¡±Iû\øÕ|¯é‘ä]Š;‰ý ÙïNÉ#+û’ÉÖYi…(»©Úêæ‚vâ§KlÙü\X5[ã/%û¬ÀM‹ù"øì¬}öá2•"«ÀÑ~ÈI$«\&¾¹y$ÞR&‘낃Cì#§WÊð”÷¤?Cõ6ˆÇå»ê˜ŸãÜJ3a!>«¾úN壺^%ºVBÞ, uQÁQñPŠ9ÒÀ›³iÚ" l'ÉÝkH22‚,~Ðwµ <úwm‘ ûÄÍ\ÜÇÇÇ_ïð8ƒ["ÐuíK‡YÉšÙ‚à:ÓÔæ”BªÉL i …ÎW8]m[?­Œ›û•KHµ™|€X}Wô¾‹²zœžFPßBÓøCˆGÈ N¶÷ÑÐøÊä)Ç,%§HdM¤X^`ƒà²šd`öfdDC¯³f!Z©~:‚³a“l·âs>ÕÒÎë„›?ÊVÔR¥®&K«Fk`q=/ãKëÓ>:±ói]góVŸoôz|å¦gÓÊl¬=Vå,ŽI‚TZ¡i§.gé®Ia²¼-ÑûÎç¦+DϦÚPG‘@ö&„²NÞœ"‰¥GN2Báé»jh@ËÖÞ†¬ Ìñ §§Ê§.6 ©,AÅßBõ•¢×¬3ÇÒ™…N‚3²5ÍnF— ©’2íÝ'‰z§Lo©ývûwÓòtWÎT;ç„ Žxv شܘßêì«3EƒBNè#¤¹"#ˆIÔÛÉ-9 À&n¢»:uêP¡R‹x$Âm/‹—lˆ²fˆ=Í2ÆiR{R€aµü¥¸+‘™.Q¥þEã7éâ”W]&yB”é"×ca)͘Ÿ+ åÔI½2,böçýb>ÚŸ¤ßo3‘ ;Xƒäš€\Ô9e]«(9W«ÝÉÚÜNÖÊä©ÀlÄLïØFLl¿D¯—\+¡a:ºž~Ѿ­k|ØvËZº(«±M²ÁŠÔPÄ?Ár³ú]á­šÇÎ;O/ Ž¥D~é—­k•/GL[2¡¶,Æ|ó®Wam¤áÏ—¹Å”÷œ+Jn¡_9Hk˜åh#J§^Øñ’uµGJpY•sË2¨¼:ó.`*ÅpóF}éH+úS¾ÏîiWÃÔž<ø “YÔ­ŠWRQ† δ[Ëé6óCˆÅõÏãjÈ' øý®òw°ÜlWXçS7 ²ãù¡xyêµIÏ êÚ!¾?)p)n1oetÖqw¶½~îí‹ãÔ†:¨dô–Ê˨#LHIкúÒ" ÎRÖn úõ -Êó^¬“|Wo©ûÀ=¯®ÏLÕ°Ç*8UtúGðó %¾‘ÅSº+šƒ «Ùl5D‘NÍŠ˜¤S¬ýØN·b¬—t;¬ƒ/TM—µý^”®©åölQ·HáÎfJv(¦ÝOîø¶Â]±â9â ]S{ýÊÂnvPÌ—°RNÕ–Ï™þ{“«Îâkfìˆà¬an]\s`WR:Èï>+FÅý¼&½Ö¿ Ýp¾–-Ń \`À5vé¹ ~¿+2¼Ò yÂW¯Iî ìÒNµö² Ü‹RwèeÙwõ²Ìgsœ[ã+V¨.;úXäˆ.ûÀ¤u‹›k§Ì§$1ŸÍÖn…2HÏuº«T)ÄŠCÖ&Å`#$\“¼5¯]\´Gsy­ëQ‰†uǃ].HíF›g]O$_W±è®‚M!Žý“1¾ ˆùf³B>IæÛo¾ÖµÛ|¥* hiX«çÒÇÓ »ôÔ)1†>ÇN|V×1@y Ey×ñ}–1>9¯;°íÉš¿ÖOEÿ.e*S¢îÉ›Cèb/ÍG0[%ãœÌíö'Ö"ä»Ào%SÃJžÝñ˜ä‹VØÇÇ-ßcU‡,VØA.åÍ,1_ø®œ²¬k<ÇG/*m Ê2ó}°ˆE/óÉ_ëz›1ù¦W?ô9²;I¿Ö•º}Wys⛓&6Ü.gÔ³ýü:a[?¯E£u•ñ¼² iû®óHqî®ÖMñ÷4ùy?F‘q³óà¿1JÐÍ¿t= Û:ÖI¢ÚxÄÍ-®ùt¿¯Ýõ«9z­ ÌÀúHb5+;Á‹9Üqâø¬Æe$ò{Å×T±{e×å3u¤×ëv¼Púˆªö7¶|D飆‡¢ïð ›ïµon‚Qœ2—íjÒºN*Béd,c«ü[U¿ƒM–& w°}|Ó¸+Œ× ú]MÌ‘ü¿¬÷Ç„öV½t=7ïˆVšwuöT+”`Gt®KyW®•ÔåÁ0!úô&ìôm’=åéòXÍY‚FŠ‘”Õgõ¬+‚¸D¤Qo6!v} Ì6Vwu“>NýøÄÌADɵ®>óÂ×B¥Ÿ ;X‘&d‰Ò¶®òDPÖöØyUÑ”b‹ËƒÝRµúŽz€Ñ²û!VS˜¬Ô½¸¦’|`λ˜êHœ˜k½ ’¦†Å¥øýÁUÊŽPã,feìú“꟡E1ØgíX±u§JQÄue‡@Põž»†? ®Ôµð¤uõàîYt…Ç“fõ˜ \”èMµNp•»‚¬«ú¬)§%ûÌûÃÈ9{eGâïŽÈ¿øQ3#æ,B±àúߺHÆ—äè¤82‚BLV˜W3aaé…Ø¸€3FFtŸëƒUÈ-üšð rçÙ›Hk?ÍßzyÿnGð1Šïd²À!YÝàhš_NrQF‚#Ñ ‘Q<¢\7;#4·ÝOŸ¹ÈÔŽo·ÂN†Æ'/V±ê:˜`ÿ]Ð<7]œºÐòØ¡{?Ù!Wö™meI¦Åԑ⸷´Áµ²’~‚á¤ó©õÈÝo°ôdkÖnŸìJVä]ö ô§ÏÓ¬!UR +Xf ¹\ÃÜK®&Û4tÕÒê›ÉÕÛW)¶¡>e~.ì¥Mô‘…M]AEi¼Ãüàøêš&ê›=ouíòƒ*_JtŠwêÁV–Ì*9&QqìÇ´wÝ¡ï<Œ+¤ÍKÃ)…}-ÀjG(×s8AÜb¾½Q$þ®=«ù¹£]‡4í¡ZV]ɦò ýt 1 f’‰‚­ûƒ£ÜÒ¬z§\?£ÅÍ"ØMjwFs¡ÉXQL ¶Igðª0Ñ–%qò§y@cJeÆÉ¬r6G‰Äq`¤ž$¹GÍþ¥ÞŽL-ç¯êz«¶.˜¤»®y–ÿ¤Ê›Lò]0i/ž÷äòiB´‘wíÃYú6ÜïÈ€‚°.ÜMr^Ÿ‚æSJw»Ò9‰J¸BLÑuÍcN•è%Áu”­&³z³j÷GJÌL€;€ùKìb±ÈGg:bgÍÆ6¬qVj³˜äôŸ]¦æý# ¤|V¤qÉFÌLI~ÃnA‚N!`Ö·Y/éu6ÇW˜(úX¸:O’B¢L¬nfÔØ(èÄuÐMHjÃåjªéñØmëSÂ*úC8“©ÍI%|­ 2ž­nšÄ4šÕâS/õÏ5E8 ÐŒÎêµ&9²=— ê¬Îw*KjÔE—ÈKH°»yyjbj×`}“çù Œ€~y}ŸÇ–”]f¬é±Â|̹·iy©õ^Yä|,Ïåá²ç3=YóÒŸ-æö‰>™ò¦m`¾öª­L@°UV¸¶@otä/Õ[ 5wBëRméŽÛšÃí³“.g,‰¶´öoý,¼{îÉ ¦%wK2ö§=~ô%…2À¨SòMóƬøÃ¶•»³[ÕJå¼.¥x°”çÈ2”öˆñ¯uAVW°ðI©Œ:ž¢Ê6NeÁá5>z´'ŸÎŒ= p[ކ±õ‹=Ô ¡\Æûnc}Ø£7ݼ‘ñ *öíÌíü¡Ê„œXO_4B,Qªiwª÷¬zl»ªu|ʨ!ûÄ~"ÿIsX€ÀËGã¬TzÐHîJ˜p)SÞÂEêU”‡€»Ž,5§øýi—]ë:çÀý®ž> øeáH”¼Ó…Õg[WEÁp<ûKµ$PÇ 2xÖ¬ñCCoܱ§mIa#«3“ã5+™´ðb=ÈŃ ¤4åRÎr’BÖKyóIÏi5àN±‹ÆÛA]Ã;06·ªÚ ’F8<%¬ëG¯².T.N9i)ìöPN厦U×GÊCõ(h@/r¿‹Ws¬Å®ÝÕ&•u!WÓh ÜŸâ&ÑöµóQ.Nç iŽš¦p(#`âž'ç]h{ >–PÇQN ­÷cÌþlYÖ5_§öm {δŒæ¾±õ’ÖÌ¢¼kW•ØDzsª ¹¨”ƒ”n;t±·ýb±m„ÒЖOB eû•‰0¨Ôåyö¢Ì}$º‰"t”¦ûðOlP °¿R24z4jO[îXm(AGõ®x5÷Pƒ:Ϊa]üK—-³+ÚÜ †çµE¯ ×tÔ±Ïx»áå ÒNù¸QûüFÝrN Í’EൎߦjXHÒ­ëøvڥжÐùCs›ÿ”xÚxÿLŽŒ§$6ºO_ûõTϺúÎÊ»ÊøÐtÉ3ÜMÿ­Œú-M©ûyÉĘ!)OR¢›1Z”uíÎõº˜”Ô-ß… 1Y×9!’ëŒÍsbÚÙu¹P2Ñ´Œk˜-Sˆõ^0ö r?`Åí6ºŸpŒ˜÷†“¬ÌÈv}P“r±,™—ùüʨ Í8õ¤A¡Ÿþ.‚1}:dœOü&JyÐwu,ö̆ˆ¾à¥¡>2Y·¦#æ°¼^fa ¾lJDÈ71þõèeoZ×ìÓÂ0‹eëÅõ¦±>Ö5Š}צœ%¬k=Š»¿ÊÅ á‘Á¾ŠÜä¼”w,`(2‚¾‹lX¹{SÅ~îÜåêCˆ]ë9èU×·£4 ¡'ØÛv0ÚJgƒ¦$ÎKãKÂ×+w!ùZ×I4w¯Ý=©Ô?c=ÃLgˆ’¹‹ØTë&JùÑN5N£¦EœÖ¸dPù.öp¡LòDå. nP–[×qõ†bgdÿ´®úæp׳ÖJ¸XLºê’uµÎš*v±µ¤.UY=¦ ö]kHã ™÷°žPËPWäÍŽŒ£që&Ø'[¶u½‘öµ®¼Y±ƒjŒ-ò.(Óº°rÈ~W¨¤qgê¦Ô·'£(QŽª®;.‰ z*‰æ”:ì‚Za²pKÝða˜O¥ÀRd<õ‡ºá]»*ë,PuÒ}0mÊœ͡,7Ku`Ò/Ƭfw$ÎÓ"ÔuÆz¹L-g¥g3—Gh[hž…/»|ïV&Ñòötìñ]ßµj3 n»c\ÍY9Ö‹åþÄMGˆTbS¡oô Èk]e[„mcX%„C/¹ßµ™JO ›vKÈJÈ‘Í& E†òÉêçfOj~fÓºò#Åz€žo[º|W~›€7ï:Ùgsý÷òÊÊò4N „™æÉæfÛ²®ä|‚*ŸRpêÞéW®¹O!šáÇÆÓ÷Kú<ðJåÖÞrd½®lSÛk)f–· ZÛ¼Ì!‚áRÞÞϤk¹Á1`ðæ]cy ÷»÷ò®ÑhÇÀMÆ?ì]I## µÏ‚f¸fäžé­×ÿëH|æà'ñöÐñüUEÆ…ý]³*§Ý­ÄZ;÷»Ê'LžŠ€ TÕC ˆ §*Ÿ­©!Áºë´4P~ë!·f|±Û zBò¯fìô·ïà‰ q?E^Û. wj.€°Ë(„“ÒQ¬8:Ö[ÝŽDlîu/Caö{Iñ^À…á>÷çm!ì”djhw©#QçÍŸÔm±sášñTåî\ŒB)z„àþE÷\•jaË^ÖUßžþ«[÷4 ¥÷-°©:éÈ@¦G±¸˜%‘‡ ú]û8Ñêk&8eݰuU¡|d1m„^“€ñÍÚÇq|FS2Må]XÂ2˜;my? ¡†“°2jSŠß7¿w­SIØxde׺ғë¼ASí¥Œ&»+3w×:€ƒ÷ï/æTy¸~XÕu+@¹F®Ïòéƒôe <…¡æ¥f7Z÷Œ|3öOŸ5—ê)hËÕ@°Ôxc©<Îü¸Ä#ÿT¿ëïÚ¡¥¡æ,Ú<4VH}kÄéY@ŽB¹«Õµ‹§ÚŠ.Îáûž»©¼«høŠTr$³‹AS‡yÊe1ðE}dÖÚs´³ëé§µ*ØÓ²põà8—Úvš7Ç–Ç‘MŠù†*òê²\„µ—jz›.v²ÞÏðî³à…. ì+»Ñ´òí 7¼9qÊÛÅÄZÝ?Ûˇ%üÌ=J‰Êw\']sðÃOLJöö_G¾ çF£;”µ±¶.úÓ ¿EBJø1žæ"QŒD{±AÕî?TZqr¾P÷êOHÉ2¨õ–°êíõ2cù»Ã`•‰ç$yÂs<€Kh Š|â²÷ ßu’’žDµ¬Ž²”Nß|(ä6½¤5;çåùö’–ýo<1m ˜gtFPyË tS§û¬},„˜™‡GN©:”þ0˺à ÕÆïï÷n itƒU4W }©ßŒâ š€û}6>ÓGEËÆ™= Wº‡yå‡à”)ŠƒHY[EÇ#m·?WZ¶šüš®w’÷¤ãî/ĈPÊð.ï^] ކkF¥]&å‘áõ¼ePkŠA£ _rÝUn-ß.é©÷ØÉü‹PfßuR|'£`{ÖuÌxVEF¬_«›ŠÞãzHD¯)šn¼ædSëÚû:²º)$ˆ‰ì5ô“è>]ä<» ÅÌ2;Ñ=àÅSŸEÞdüò!FˆaµM¡¬ÛW 6ƒ¸ ÊÃ4ãéIºÁØ]H².à¶ÞùÃ6ÍÖ.6áµÂظŒR3ßrŸä;GÌìÕ<Ñ€†v±Gõ¼g®b”EnÃpéS{7• {³@¾Œ¿ŠÃð:§Q¨¥èÖý]äyˆ“ºV³rS<ƈ¶øv U1e*^cnyY¨ð_•&y¶€ìÎÄõFÕºò—óô J©Y¸£„ÍR O±‚¨‘æ€*·c¶Ü5(Å(™S£s$[èœSÔ.ÓÙ” mÆŒ‹|Ï ²§„Çzu6ƒ3ˆžõœ*©!€ ª®;Öݼ¾Pž´®BÆæÛ¯bX ’î3B°pÓ1†rS¦†µ–MS›)“‚?l­u—eù8dÇ*s2µ²·Ó¸ñ!€xË^rx¹Iá¨ãFÿ,VüCøÉgN•ÓÛóþ¹ÄL‡bõõ2V)®,Ò¶#;ïÿјÅzÈ»XPre)ëékÆËD…fȨ» Ž(¼Ô§{sMäà¸Ø(²¡´iû÷vM6}NéÔ_-o#äµ?ÏÓ÷Æ“qxê³ÜbMRÜ.‹ê6!U+õÁ É×nä'僷ØúFç?Õ«GïªPŠ ?®Líä?ÄxvpÀ‘ËyˆƒêšZ®R@Üh"™³ûøðÏ÷ù±cíÃÑ4=ÐD<Ø ™Ì¨JãNͱÔ(À#‚£Õ1ä$ëÔ°Áyv{Ö ‹<ÔHåCy±*½ÚœÊDíl>ÈsJE0z€eJÀrâ’ó—U(“²XÕUÙÓç¸F¸3wA/uËÖZâÀ6¶¡’ÓpàgäyNEåÕ|‚ÙB(n!”ǪÌÇX¨'wŠ·€A -…«‰_ŒŒÑËæ’Y¸LËŸð‘ZcˆýÊIfHË81ÙwlC U`Õfë3_²ƪU1EjÕ#mì™Ê jožnö”¸D xh½W?|£îœkûbùvÐoþÐÂä䬰îí5ß?=I8ÁÐô¿'/%õuŽælå³+å&@÷8¯ÇƒÕ.Q7ïfIÍË­5We£|Hšgíä>‹fE5Í|b÷:¿ºCúnR‹/;jŽG$ò&Aã£Îž“ËŒ‘Ù·&hÑͱű ]lú` bÀºZ"¦JÅŸUÝ3ûS}‰ÒöûØ4##f´”Ü Sk$Çp¤Ù ¨N©À!óÉì…»럟ÓGˆ5²ãaòÞS`™q2[-sW&†Áè;l;¼š³ù–±×dŸ4ò'+Ly%• µl‹iœ¥ï7^Çó~ºž§¶|Çkéßã\Eê#'ŸVFŸo=ò.oöü"IÏËÓ+ç>êhúwà¬þwÓîêÔJMwÈûL¨ÈX˜|HéÉ 9¶F¤{"~8e¢i±Å¥ˆ`p–uÅećlJ‡/^`‘Î&ò8÷°9«Çzž=Ÿ~P®YÀl=z³}éÀz.Y>àDÝå÷w _5ÖÎÑNNã¦À×8Wy8ЖüÑPb›GûSŒþÈý²±ò;ì>{óŠ 2 *¢z°o%™XŒ©ü²'ú¹8ž«ï·é³¤Qw[Ç>鼨 ó°w˜ePCñØ]-$ZÜè’rÅ!0òÔvF›4Qr+f-b&E²Mµx@éG³ çÈ>9:cÚöä¡8Ú¿9yl]­uZo—N1Ëõ¡ÒPˆ[Ö¥e›ÿbi¸0«_±¨8þQk±ë¿¶±,ùºmQ<ýZZS4]¯&~%hÉ|1ްç†Rîuñ¯Ýåö¡¿Ï_‚º>…œÞÍaM÷äz'º86Øå1ëeÓ  âØ €òLùÔþ¨øíeUùSXvè$…Tì]‚s\1ß2÷{ÛËTLS+€óyñ•Méï~Wk^UVå ƒX†¤.±ÀMšçÁ5ŽÑ¡ÌV®š{0*Á†V¦æ4¥Š•8³¦P?³ÆÙ¬Ù§R-¯¹¡ZL7ÁY:eji6Òûƒ.dIosQz…ïš4µ´?ÌÎ °QE÷E^í¿ÅGÀ'¬ Ž­aÅV¨®ë²§òØûQSôt…Ø®ZÛ&™j×K¯³Sý¬ÇKÆšÞíÚtiÓÍ=˜ÈéžTyÈ]ÁÙÈkŸDi+ã<µé“ÄˬwXzU¨FïK)ÙHû+›(‚dô4>±çÎKv—Èþ1Â_¡&R}“ôKŠ5Ó”ç m±‹söR+Ò0ž–ŠmL§ÌSP}î6R’»J•êƒÑpIŸ¹ÊYþ"›ê[”O(=QÀ«þI†Á+'Û/¢5~µÐÂÔu#]°6ð9ÍjýßQÉæ++i¹b@‹+ÉáY°Áe…«þöL_ý)½ô£5%ËS£_éŸôaÑtçeBõÁh¯ío“óGÁæ‚ÙY9ý^"W§¯j ³ã(t8s|%å%ýÜZùK:žG®âø. yÎ’© s˜{èßq£ ½Œz(zE¼gŒ ¨=÷wÕªh ’ò®ÔVö§CŸ;õ©Â·±Ÿ_1…Ügéz  0ÿ'¡ÙÛí'ÔM(„ë¡®Jo–Ìý?¬Oö« jnÇêú¤|v9êWLÔö %³ÕäÇ[áíc ÓjŽJ¯pE pŽwJ6ŸñMä]–Å#*jÜL!³HãN§±_M‡Leæè§?AèØYëT•Ç>À]á“yåë¿ñ{\h®¯VAÁ?ZþI‚}:ŒäÖ,p|N3=ë¼XN½Z +äÔ?uZ…#÷ýÞE¬¼Ñ”«†"Jcöˆ2q0Ø@íJ¡¡@ð%ÑPŽcíC_¶>ŸþZÿ{ðûm[†“¹üK¿â~ów¦Ö/ßK¦©¡2LK.î„í¡—„=ôb¢'Qz5|Àü`öÓöP=)™ÃIRÍV¡6f…0¶«ª¾¨Tr‰ùÓv\›iY뛳ö¬õ­"]ÃKí¥CpÔoEó~ÙÚŸXêï…äM>U°NÏ"`Ù~¹œ®VßÍþG¶A5Ò;ÄÓßú™“eÏÃçå/Uû¨Z§áÆÚüMùÜûd’5„“†û/a-“<á!x"oEâœî«è7K².4PïÆRç’RæCYéåÞz"Ù?·™}åñXÓã¡{N©P:El¦¦ñ›ý](ÕÈ;D ÁÌãç˜:œŽñ\¬EªÍëú® qê=E‰ô EÒýK=‡` [•BArÛYa½äË/n÷BƒBg­[ÝûØY l:n¥Ÿ(u·äÓÑyBäu6—“;9/éÏ«µ ö’Ìo ŠP5¶OrE!݈^•"ø~Ë‚u'®m%JpC r¥Jÿðô;½}Æ*1ßh¥lkœD·©…p’6P©>íÎôœŠ_’p•ÞË…^»Ý`åÚe}ò®cA´F   ït¿Ë—ˆé•–Ù)>úöL”àz>~h÷OmY:‹ô›üOY͹AQ–ÞêúÍ»Jg!v„蔦Rn.†?Ltq^¾”šU t/Ë SJE¦ÖFnrdÇåBÞ^Ùzd¾º7=bÏ^-+>œŠjÛ†R/²¡þ Í—QKŽ-ÖÒê–¡d­. ‚R`4%k'ÊÊÈNT#ß2X $ó;%â|F ½X´ëøúq¦*A‘ºO'ai=Ê‹;Ån—»üj€×hjÀÉ%>¡ãš™;\ÎgžÓ ”LÉ4¨^ë §7®¹}ÝÓð{9OX²C‹p"?˜¡ßìXcKȳ&þ tM­i½îyÇp—ê¿ÖÊRƒãd³ìi g£2À×6B@«Ø>A„„ºc)ÁòRk.Så<²îp·¦Td1}y;]©É RÍæãç¼àÚÆ£a½‰ü–D$Øæ—tžZ<}O4Ç̪:¡§_‚8Š~r’¡¦Ju¬ñiž?kWø)àçGýº&³’äs?4‚‘áû¸ÔfVæ¶çÜ6µ5*ó.Т¥¤ ö˜¤PÚ2Íe_ÕÖµgþD¥Ç[õ†â;o9 TÜàwÌÄ4XªÈ-ä,Õv€ ¦[ÿ}'ŠÆö µÓ¿ƒ˜~Òû²ˆ;ègÜ‘˜Uý.@ž–?d=åãêÛ5gVøiž¤[ƳÛ'ÿd°€»Rƒ*×K_=ϻچJ–Õÿ­¶ÃÉÖqЩ҄¤§«› m6ê‡^ SZM¶Ñz×ë­¨¬Õ§³B,)éGK45l–f™Ú unú'{¨Ç5v¥ÄGÌr') Á 1§<2–o !1‘Çò´ú hÓЇÃcn*ߢ2]ÐÄšäz°P :£Íè3b7ouûœU¦6ú«3oûeþÒ8¿Çh-gd‹Šõ8ÛïóEgõ—†“·1Ž=å¡ö–1¶ð Ñu±m›€ðþ«Qw|ÿê:*ìDŸu3Ü£3f´_˜ï‡ú!º-9uœàƒuÅî@Û•bàKÌ圮•±]Ñî–Jö}Ãg±ó=·#q’Ù¡ꤳּ?G»ëâ„fÔˆü_(Å9=îWÎÔìEzÙt#¶Â4^Éc²¹>±´È¨dÆíÇÿ¤¾†âY]­…ñŠ5²Nà`s}Qdjíés\WˆM.3³÷xHš2‘¤ç¨wSŸ'×Ëïq­k§Ù” #©ÉYÍ* :”ea Hþ ¶Ï˜w-ä•|é+`˜Ë¯Œ“„˜aΩŠtuÚÇ™ú~[ÿò:‡Q®°j¬@²O¶ ¹sº™Ó§æ8Å¥"(²¸O©º¦½Z™r6èŸ%?Öó„—²¦^Ó²A¥í¼ù¤MO­,¹ÎŽ,:Ù¥ uûC÷{É6–1‹!»PTM&,SüÓØyôJèÈ^°LYK `IøääyN®ž ý|jÎ׺2ß_4g)«„/;>ŸÜ koל~¿•t;a·WßÔ&-Á¡©¡ã9=Kîjhp†w¾‰ã¡Ö•7oÌDÝw81ް«x "Б½Y *©OLa⥬ùÆ ïÉ@øQ·uX Ÿ.S;_œ`ØZŸU_¶¥ÏhÿTâKõh£FÁ-ÒK³‡ª{-¥³XS’²UL„AmæS=d8é‚BºV¾çºŠÇÎX-5gr"p ÓRh§Fü°bŸ|ÃUr5WDp¥_ïõ¶®jc‘-ô%|^úêŽï½¸{0÷U0ød-xkâürÖ@UÖŒ€k^Z´W3¦mSi+BGQèÖQªf(à=ö$/½~Þ?¼9ÿ…E”þ‘ïiÓ°ˆS@šF°C.Ðp,±PÑë”n¸¯ýÙ¹8žÞøø†ä"a¶ìVÊ~ìb·+æZˆ[\äȘ”}¬µª ꤹVe#Ñ£rÊôI™&¡ì¤áG1ù\8•Yev‹&@†Óà/q£ìÐG2  ÓíÛµ”ëãÓ¸!8ƒÔ0Úp7Ã-Å(÷ªýyœ•ûAåå·*+×c¾>òè7«8©êË_³åêÁsZew¥.½²4‹GÚè Ð;œóWä_7£“ký€nZ§`\p#Ë„,_àÄ,åTŒ,ªckY³Ë«-”-ö¹K¼›Áûç9x¯ÛñóidÝÒyl*Ñ5¨Ù¥<töó‚W-ñAž‡2tÐ1ùË6åf¶ˆ¼>´µ5c‹Ï#ù¿aëɨ‰ ÞGñÎ6âšL-e‰McÕªwW´›³Û`üÂ:¨ÁÕAÀ \Êæ ó¥"ŸÖ#•SテmŸ¼r(äŃm ³<Â;oS•ÀñˉR®¥(™Ië£ÿzÜ´¡Ê3‘#ë[ê^ô;æ৤2°0çeS;v"¯6·fì`(S¹Úʨ‘¬Uv}ùwñȾ<Ôñ™ýJµ·üÞ§¬ë¼˜¢œüøÙ¥g‡%dÅL,Þ¤¦Úg08;›1ðƒž. #`ä3ÌF?Ynâe…¹(ïÊMì½hª¬©îûìîÀ¯©5Ž>Ýc§ºUõ®fôŸiy‘áœL£?“Ôb­ýtÊv?l\ö·è³e} @|`jöFHÚyiõd³eÃOW”(FÉóÈ"\=d3Å$ÐTF>CÇQ_v´íÚÓø]–¹õÍ9Ò¾+p{ñ¯N”ïÊ G@íäÏ“3|Úƒ-y[×9d[¯Ÿ ]M$0Ý =ß÷ŸÇ{ÿ^EiƒIkËŸÇú¯¹÷h*Õ¸ßEÿðiÎçêïíÄ|…¦Êür)6 ‚+Àkx{7"~1Ú'UÂŽÁRRÌUµ¤oij'•æÛØÆ“… R¢o+Ôÿžý³'Ü% Q146Ðèã#Z²m•ï\ÄXoàîÖ`Û+¥OÞÌgÕªLmµ¡%«Ÿ-;Û‘õÔíÈ nªŸœƒ+F˜oeõð¬Ý( ñÍjÍ|/Ø6©Zâ M¸®e^ŒàíÏ~¬ÄìÇtú£H\H­ÿBYrü;%Ý՚˦vŽ!òÈQìò—ß¾Fþ ðæ­°úí“7oÝ uVÝ~.O‡•oc.˵õUú€“W­ˆ¡ž³Tƒ—uß]À=™{s«¨Ç¼uòbJ®E…/Ör³·œNTKB -Lxòs£âO~mmËôxȾš¶å»õÉŒ¦Þz !ïvbå½{ºð‚²;´4è W”ª-¶ftëRÍG–­þ èÑlñPØû€»jÚÒÆÖð0$!jë:Gé“(Ö厰æý^ÜInr=e†L®Kô÷ѵûlÝ ŠD¼H¦K\Áт‰èbÚÀBÕ$¨}RŽ ´ðÍŠŒ ¨ßÎl ä-5¾óÈ»0ÉKô¬Ü÷b«tŽ‹’&7åVìû½C,¾Ö,vkõ&ê‰+†Õ|ògz&öÊ‘íËJø¬k‹Ì2¼,²òøˆæ‰U+ê‚b‹Ì¹ [4ÔÞÅR»úymh°åe`x›þUÅ p´Éý„<¹Ím¨œ?î*» ÕY-_ÈÌXæžßã³û•jñÉ<é¬ÅÙ›É{ƒ™ÝTäE5 bOâsèQ$Ê)Ê,Å›^á{iv'Ddè‹Ò!f?ôï ÿ²þ=²+¬knúÅSíl?¯’/Ýë&;˜;'yã§1ÉëtwJô“ô2åÇêÚ ­ä٩ʨÛ^北bŸ|cWe«ÈÔúHrÔð]Jµb jñxù褦º@ÇÍ»"Üð‹W±ê4.{ífß`ÙÞ—ò®àßf…‚´vÃ58ÀˆÁnûÊé­Ïl¹~±¾6 zûÖþ0Þ§fõ³™2ó}yõ¦ZÜŸŸq.Ÿ÷¹ÍºÒ!¯g‡n–´²'/NîOºØ,M?:ÆJn¾Ð))²;Œë®Ä0X’[ص+¹ÀÒ.<ë±íŒ"ž¨½Iˆ$Qý —é¤N¸’Ìv4Y¬…vêÂ.Sëõ#fêLs÷¹` átV o[éq®W›Í;éÙ‡˜dv{íš¿¢:XÃë|úØ5× êàò]'³U¯¾Õ»†(õex7nõ½d2¯vª oæ;n}û¨5 ª&ï‹ôÛûbbЈÁR!zéîxzù§÷mƒÉ'}Ö$¡rÖF wlØV“»ŸH_ógÑᢚ&6U?¦V7ùlƒº¼¨°è³~–oyN)𳿮[--ýd®lÆß¶¶e¶ɉo° ¥B2ô)S¢ô$'ãq¯ôá:n¢˜åÅRŽš*oÔ£ò}¦Ö¼Ü¿vñ1#H%öøràT) m¼9†Õë“Û¹[7PN´. ÅU ‡çÅåép^œ`è¦Ö|•À³®™Èõw•?5cKn.[¥4§.¢{КÛÂ0(ƒË‡þ'͇‚‚^¢mœÃÓe( ôMò<ûýäç!Š~ÄU¤Ë¸ŸâË]‘Ÿ0 þ_~ØÅPLˆj:àš%«Ad®‹y“Ê‹üȳÙùcƒ¾%èú„ÓöË•‰é¤íëÃôž+ëQµ\¢þGSº~‚5ÎN(ü”Ø•~ðw59 #‘]åAS©Óa{\ÕÜEl` Œ-—7æ½5±~¡Õàæ(!õŒûú´ÝWmÅ *tÌÔþÜí#cÜÛ`Šß ä$¾²^0w"ª¶½‘ GYÀ ­I…V“ å¯G¯k2YÜ‘†¥wx¥SB‰|ú¬ÔAIª(Ñ$Éo.*ʦ5ZƒJf¨#Ak ‘‹ܤê‰4®kìÙ7‚ŽiQ¤ÒDÁ8ÏKªV?Ã~P¦guKACq-Y#òg'ò{}„ ŽƒrÕ9×tF©›g]Cœäáy¸Ø{iE„Úäø¹|DÚÏÂà³4ÃÔìyª)‘P6“y­‡œ½UuJý›»w“œW¶NçîJFw¯äÅ |Wsf ¨–Ò¡óAÉï*ÑLѼ ÚH4”LªÛÈÕÆ£)ý¹Ò¢bÎEÁÆüN2}èáAkXøW¡+™él ¤ü\áoð(‘ÿô8"±Þºhjûð•§ÚF’Ø´¢]Æ :†®¿ôð•בDþYWÉ3r`)³š»àd©¤°£´»Žòm öÜö`V=†bfÊÑpS¼º£‹õòg…+h 4K:AîOmB$ÂéøÈéµmnÓVª e˜™&2-Òñ]NwF×ì_ñ±SA!I[)í ïè/»ã\SUvhq¡uã§ÜU«L¡bðbõ¶1ÂÊTÕ¶,ÅÿJ·W«©š™tÌ>Êzíqêm“3ÿ¤dEño†4²¦Y…¬Ñœ¥‚ÂÀI¶&ÏTàpUSö’cóŸ:||œät܆vÓðùù¬’Õî‰Ñ®ûSM–ínêz’›„µZ\$Ô!9Ù _jíôž0:¡°ßÞ`uÔ”waÉÞ]ó¡¢í=[>–¦2 ík15DuãÚòî‡Â¶i¬‚dFS üJ^îÙäùñ"ØPª5…20:vZ×|ká“RIâìïôâ/Ø"ÓNT|9Óº† ¼¯\§Þ9&²f2êo!ᦷkˆa Ô ™ÐšžsÑ4‚½C—í“,êDd!Ë,f¶<ßÁͯöô¢§8ŸþÝÕÅNôâžfœäÊ¥Ü<_C_«m×weÆžè¸L¹ŽN­8“ö1´«%V Ü+UÇ6·)™Iï;/Àôú®ºœA†Sý¡CÊM>>ºÃÀË/ù®r ¤žïJ~C/&/Ô¨ì¤`Ár‰ªªc¥ë#‚º·¦ØšÓ`ÒñÖŽëÝ ¦Ã~’þ3ÜmøU´©ÁY,‘ã”3ÙÊÅ@²ß5?øíß Qù”‰;Ç0R3“ý.ÓÊÌ[a‘ŽrKj¡7÷qÛ…*“Áùjã .°u´\3r?¬ëäVœ¾O@‚¦‘ë˜,Ùw=¼Ñ ÎôIµ>dhú¨!¼ ;˜Ö4s ––­Éqê0'¡ü­:Ç`{°Ø‹{Dœ¢ù5?”±íøÝVªJÏNˆ£~S‰ˆ÷ÌõÃÜÖ‰mh÷óâ%«9J*ASçl2h¢æg0Ñhøyõ£¥ea˜uÓÙüÏJ‘ ­<4 Šê”·ÛÚ«¾-®Ì¸Ê ‡È8ÙÖÄò˜…}°â'šg´ÙÄó»Ôá1ÕzÄbSµNÐ1§rñX­Z¿ÀŠ*NÖ ËÜMˆüÑÅ®Ëé:híœj R„^†¥$S[µJÉ­¢m·½–æ=}’$U E÷¤ŸôE4Pb8‹°ËÎLöf¯¯®Á˜ ]«å¼Ž×®t…h³«–,ß^[ú5xßõŽ;ïÊKЈfE‹€,­ôÜ:уA·ÄÃ8þkŸ½Îª¶ßq²D! ›’©6«˜úccy·×»ÂRŠz…õÑõ¼¼«gKÐ@°À¿4‡ùXHÉ_¢|æk.ßAP§0‚¢óÓåÖ@saE³ØwAqY Ô¼ŠÁ½søí±¬ wN&G†±qFÿ ƒÊÅ$ðçc³=ÑC!pñù\x±Ÿ$ctÛ~Gäf…C¼á I—üË M çÄñlŸóR›a§íÌlðʶUviC%Ú©¶ílj“)yöÿ‚;r|\á“Ø¹ÑùÁ"ž8T²RÎÕûI@AY¯akc©……&ÍDBùП¤ÌŠÖ’usNº/¹N4÷&‹Ap4 ÝŠmR•QǦûGkÊ›25}غÀá§çЄ~ ,Åp¯ jzÄWîÑPµ”ú[~©˜ÓXEÖ5z1ÛüI§(ÙÇðÌPF›,Ѐ#o1Эûƒ‰>¬Šô€»ŽÓÈJE€øu¸Á©•¡äa¥öÙ§ºáá”(ÃÖa)¾`o€M²ÈÖ7E²c“³+šB›í3 4 Í@^¥{§¤bG\Õ‰í³¦¸]ûS†½3ö9’Û/I÷F=Ó§,·>jŒ;p¯”º eÑ&%Øç Ó *t+æYm]8\µ#³±•EuGbϨ?*æk]]P»#_öê¡•R<ü91ÊÄcÔS‰·”JžoÞFF+ªñ–ºáK¹HgÃ9]G6 ¥¼±gB—=¦¼ÁÒ,ö/s²H¿€ä΋¾ÛRz œOzmÚ×ÝêìýqÞ"ïü3U|õíÖÜiMf{)”$6åÑ››O%ûJ™—¬FH+ìw\l% Å"îHs+¹€Øi7MºvN]Ya»òÊ錳¿ùay“}*§þ…އ?À¯mv«n‹YSÞ6å$«ú7ßïC€žP]wGâüä£\¼Þqõi‘)%ÈH'·ú.àÓКM%Èß Bg(þQ':$ÄÔM›Þâ:k Žd°û¬`Çõð®%{žô˜´ßèm,ªêxF²Ö†Ê¨üxöïà%í7ބլ«ÝyÛŸX1Òèæ<ð®wï¥Âl2V4%iûA$r“èk]çý³T gȺ8g6«£ I*á‰6Bl>Óº€Æ`þJ(xàŽŒE!¸uMéÑ\¯UÖ……VB4Eù³àWµêzÝ4³3“èЖ® ¤'BñÊòr¤ºà$£” !RÁ¡m6WG4,-àx(ËÜÆ€¤§nZ/[ä£f¿pÍœØÝ÷çäÄä=BÀÝå1#£Ú”RËêì†ÿSRÀÊ-º’y[AvÄŽÒBG¢©9y¢°û,9õóKàšäl‚Ä6T¡²hÌøŒîÁˆÖä%^l;+”A'hÓ$Õ*U ŽSóOõp×x ³0ÖSX0C¯…€ž :-œÒ—Ð@Qó$K+F7_É´R;UlAo,­"ˆ56륥T PìÊ0 ѪëjÛsðQªüÇi³°¿Äêß5—©#N¡c¼©b)N0“QXH´®œÀA¸a*h¨Ï\ÒxßÕí»0—uõ§.¥á£WÓ>ñuJ»ÓºVpËÀ]‡/›o§èr£ä[ ¿Ýš¸UbÊ¥§^¯ùD‹ÍØ¿c¬vã1ÔßPå 'ÇÜ[BšDo6=¬Á…\Ìë»r\ä»m™oV Æï;¢®H}ã¿;²·7:}Åcþy2-û®š4¥ßÆ0bü³^PN¬ìÈ«=ZGÆs²—}Wiëac7Ëwí«x­«—jŽ´““»WB8GÆ!˜wý¬à¡‘ÆÎW ‹¡[»ÕÓ8ÇÙ²‰PʼÀƒTd„Ì(ó®ØÊL †–[ý@äºî8cgnˆº™Ö÷fëêš×P ²Üµ²<ðZèÞP×ôÃÅŽw áõPâÙtd»$û<þ£Œw›ò ^×óä ™I³)¶æIxßñàÎê£Ö턊`$úÎâµ®2˜û¡qO…$¬÷ŠÅÁºrýÍVÊEÄòXÚìæ r*û›ò®’’Ë`@ÚÙïBÍø/Ï—w{Újqe+ÌÜaË‘mŠáÝȘJ’ï:wßD¾Ê N²—\þõÚºï»ÉùFoS³\¤ÔuÊÙ_òn¢öÄŠ/ô iw;À‘Ì»&€EÁpôÆü •´?ÑyL3ÒîzªØÑ¥uÝúOãÍóðÙœá”4!_‰00„¨”‰zŒW±g¬ÀU¹ÂºA‘dŽét4J–`.SdœØ ‘u‚åÈ-µ¥1(Ñ‚jS5]Áý"ß5ÇL¶®4Ów/÷˜Èƒ›:¨ç&r=t?*Œ˜Ü(«ï“JJ1qèvdsËÅ·›: /KYý âlŸïW?H$´(öPúá&ѳJ¹ýæ1m5;ó>…ÑŸ`‹¨´šÃ;]ŒÙÊ~Cz%Ë]õ©žÆ 7FîÍ>õ‡Ê]'3?Öwœ‡pŠ˜¤³¼ i„6mjÇSȫ̈` |º'­½ÞsʲÜ:}ÊêAѤjÙžaÞ-ÛirN^rò3¬HµÔžhÞ¨ Ö©¡ÈØËî²®s?Èg’øß~תãç\¹HœEç¶BÙ@5#R¨O¯~¹W¿»5J¬ýkÂscâÆr£D8*¤†u8{b9Ø1Õü¡¸¼•5íÿ vQ*B'ÓØâÁáO¬H§)«Á üÝ Í2Öj!ކÁ]>\öœ?‰üX!ø™õ7Øwô¶¶[a³L›ÚL%k ‰µ'vÿ€…Îé.šåd+º>[Ö•æí Ü`˜?ÈY@X=+WxúZWš…ÛÓR"pB~‚9y 96eõè=«›Š™¸ÁPØý@î‹ÑzT’hEfp–xÎXS’ÔQ›ÆÎÇß5EƯœ„ˆ‘1Ô ¹¨âªfá°öhnÙª£òÁ“Ÿx<>Pó9»S²®šuëjòjím¥ÄÅÈ\ƒ =Ñ+Aç² {ß›…fÀæhŸAéÑuoûè ƒ•×Ç$â†bkÒÄìià•=•Šëâ–ì®ÆG .»†n†œN…wJštÀб},ÿ…!}–7Óðج`VߥjB€ÂCÇ>¬ÎW°Rࣴ‡gç•= ÅÄ}F@™ª8p¦6{/zp.Ë`YÏС’ w8¹è–©ÍyÝñ›• U‘&댼½úº?rˆ#¹Ž’{õ§ÆÞzé{f[]h¦I„ <ëZº8c¶±–%ËÊâDp³þló]g}âol2¨‰~eߟT$M·Ð·âÆRtäÝB8æPd‘Ø÷ôÆ0)ŸÞGo¾]ªKuÁ¹ÙT0D¦Ÿœx°˜wÍàДAíÑÜ@íµqã¬JXäÃênêñ4ž J FŽéÑ≒ÄHªe3Á’šmÚËl-9µ$ß…JÀÄ£;ßöˆ½ú¯‹Ö…Þ€ʇJS›E9ÝöÏøÊÔ‡TÑÆX›ÈÒèõ–aÏSSV=ºævëc廼Ic­Í]‘±üK)w£³>jÜA™oZ °j‹`¦Õ:™i–i/ã,/€E¯ãµ&ñQçp‘w¬¦«sqjo›M딘>Vò½¡ýøþØcŒ«Gwr„)Ūʮ9Ô3Ý£zøs¼¢¨s A]ƒ‡Ç›iÇ'±˜hÀ=ØC“Y}ðÞ¾eBD¯ % w±Qµ¸š|K§oùvJ¾«p/€‰é®k™¢€D9Ç ÁMT,”xjïÌÖÿ,“GE=} g»ÑuC]x/¼Í~e 1™ŠàÞ+{Q$%ò¹çqˆ M=UÌ,ÀÚ¾?cçÖ?ZvîóšCê]¶Q³¦G±Þ>-„Ü»~±b™$ÊÍÁëjžðœØLŸ„QD¦rjôc3Ò9èc¸«U¾Ê¢='óž Æç¥WëbÇF+ÝÚËrÎç›M˜»æoÓÀóš?Ì_ÎKp—{½g¥®äÿe$/¢…â ‚©¬³ÿ*]×>é-SËKãÈšÆH”!žP0°3ƒVCŸYi\o›k¬‰Ý €.ϺbÒ%,ÌN‰ŽWÑ­˜úC÷µ3W÷â ãr“:Uö `o|éÅ»ôðÍd2€mèÑÍ7Ð6«0b^·‰]áЕ7'¡ 5'oAÿ;åYaP³Û V7ŽèD‡"wL¡¯ÛÇÍz´•zì·H(²Ï –2ô*>bj³M[WÁ ÚÝde³v“í 6²†žèõBԺѠ¦#á$j…䦚uy"¾ •ý—=t‹Ï}¨üqæÿ†Hoa͈FH1þäY~esšvãämcTT[Ó¯9/¶ðÂðÔÓ@ÀJ$ý‚ õIì¢m@ƒ/;õe©û%' $õIÜ >®ûÀ¬Qõ‡Ê >l£6ébÇ4Ã×c OƒÛî[Ûd§@=u±Ò%B»Î;Jƒ?=‡»IÍu`2köÊë“BµýižÁõßñ„Ÿ„ª~x ¼ô6Fg½öf“ÏPB0’Î&Ø©dAp¨UŠ´&ÝÀ[±J_¦¶ßLô‘‘’fûTeòbÃ[}éøö6¢µþéi<­©›¬ååNm­Õ@2X±WŒvÁãZ¶Y‹B¶wíç fµ8ôý²ùÃCPi4ºn:4f„=:EúÇï—1l]ùIÞÕ –ý¤ÊÇót½Ù…¹ÍRáI¶‘²¬«†v|åŽ4œ©Ç¯½YÓªºž1>EÞ©{?!¯ó采"êøÔ’Ab™ð߉©S¨`º‘i ²9¹«!ö­Ûö 2ÊåEßUC·Òº³Ê‘·H€4²GÊJoUùH cK`Äsh u…n˜áį^»oví/÷Deƒ8P¤?ˆÚ>¤COfôyžQ]Ħ=>ÁÙ¾+ZES6t»gì%5O°Ê¹z_-7‰9¡avÓÏ»K9 ÓŸ ƒ†ÜAî  JymwxÖóe3ŸÃz+~º‘g¿Ä³£u…Ú˜5Ú£Ih—š¦f92,„d™Z\{ˆy’3°ˆ%1¬vS‹éB¼bTró Î<äâ *oJѶ©MN¾ø¡2LÕN“nÁ°ÓÁpf.çsB,ÄZúÛò½£›-fÄ67/äûY >þÎóßö¡:š# LŠo±?´Z»þºÜŸ «9±ðƒË®_Z¤Ÿ"¶xyhTTMÙœÏIB¬aO÷óàÄ83nc->ÓîòqNãú‡÷.Úóˆ»2¼Ù%ޱ;žMeÔ/ŽAšÕç8Q² “9ƒÖOë­M+ˆl©ž™»pmie-~àùmÿ]Z4˺ĜØò«HñmÉgï`Òf öìÌÛí`Ih¼À6i•“ÌiÊŒÏ󶜖Õy»qrÖfz 7 ªd‘4·ªÔx©_{c!*o^ZÓR¬Çàv·¿<ûémiß)6XÛÛ? /¶µdj'LZAh-ʱýÞõ—΋“cÊX±&%:„Ó<ôþ¦KÐgHDfd›zMͺ®±:k±é󸦬+SéqP%‹¡§öQZÀÑàÅF%Æ×ÜZeq 4ñ-_sÀºÉ–IžÓ£Ü¯Õö1V{5d…¬ ÌÆ%»ž5M’šEÏmZæà|·ŽÏSMút™‚ƒñ2KÉÓ š­ê¤ºýþÎg³wÿè’Ý­ôé½9ÇÓxb¢—ê¶fŠïtEþ¸ #õ½Ý` B®è|>PIIu~úÜl¿ÄER良7§ äÚ’õCS/C9K=¡L寻Äó$"úƒÌ<¥K$JÛíêe¨Ë’’DŽÕuÚãš—^ÙI´š¬YºÀö|ák>Önu¢^ìvG·lÔ‰³M¶±õXÑIÙË2£óü3Ý !t…˜©5«¶,¥½`ä §gè}:ÀZnPéo§r\C‰ ùèýÂh{}çæPȺ#7ƒí7»êï—® ÕÓï} ©÷Ï×.I×=)ë”}¶qÛc=‡àÄšã7(/¼ô«OÍ‘·™ÛÞ½¸½<<àj÷½ÃÚÃa~U»ç±¦CÊÊ” Š«ü¨,ž¸Ô ,A(žóÙE÷ë+XþˆÿûêìÄ_‚Ú±^fÙû«Ç~¥ŠÚc™I_õÅ~%¾_µ9@EL?©¹s’Mj5Ü ˆ¢k+ü´€zê”èl@™ßi(³Ý ë=Jh½/*Tï EBŠàh³= ¸½˜NÁMQb ÆÎw9¼_9à[Ý\Åì´†\ÜÔp%Ø÷{I·*KÓ´(¶BkJ?éodxýFáH4¯“òT…Û.Ém¨%zêè( a;Žß·pÜ·›zo•&üûb^‰®ÏÝÜ/kSƒo¾©ò%²Ë7zBär; Š|çWÔªÔïßÞŸ|8Ï,Ûí4½4ƒa|?ëÖ‚ÛV9Ï9ŠÕ·k$&½` >»ðCVÖX‚Ê QÉ©b˜Y*8h^ÔNØH¬Ûû²À¸Lª®ÿhzU5…¹O(Ý¿“ RéR‚¿ïSïlƒìJ"Ù;4©—Îö‡Ê0‡X3m6TJ¼ÉZr˜<ç€0/“i8Px*ùe2ƒ‹¡\ôàñÀs£Öêød…€Ê QXÈû¡û¢"dBþü|?Z (¶nÅÞ£› ìÊAjϳÞ:F{[a¬ÊB ý#“žÆG_ó9“ó¯1’~i•býWxc‡àÊNQ4]çðíÒZ¶®“9t%TÇ»d¥Põa«®Ýej6‡øõ`TŠ5'y¿X€Ú †Ç7T?¡|—«^Þ5-%4„g¥S:é=;ø¤²œ—`ÿWVƒ…;›sú–Þ3ò½çþØ ®9ìݔٔ7ù¾‰ÒóÚ/ïzB7»ªÃc”kºÃÜÙ¢y˜aêpäÏØëá»®Q?†È{ÖW4Í®å[=È–_Ùsû•½;ï:µ²ÓœóL·+ûVÝD:¯¨+Ÿ­KjøÎáÜ Ÿ„«\®jOòÆøÐûƒoÙy¸i¬£^Ÿö'‰ñßA¨V†í©™Ü½”W:ß¼+Ý„?Ò€ñ¸ðoÞUûWC/†y¶ÚwQ¢tÎì’S:©‘eîÏ'0üþĀ⨴ž{¹6 w. ùÔd69¹€„:¦ú±ÇX­¥=øÍïjþ) T ›£6F.Ÿ9UÊ}¨LÄoϪë³_jŧºž¨‘›…iòë´”È7[Ô8öi}Íóf¹¸üR t€5+$¥±ÜX¥ jF`;Tœ‚$˜æ*ÄC& N]}Ô%ŒöÝ-®”Z•ÝZšmM2j8›Nf}ÙÔÍe[£¸2ÜÍ‹Ùíä©Î_vc§=×®å!GJïQ¡áá±*2‚T©S×¼jµð¼†jš·AÉœ5«³ƒVÿî$”¸ÊYÛe¯ø ­:ýÆsÔÒABs;§µ‚|¸LÔ‘˜¯}g¶<(“t±]Ê/ËŽ×Ïj Hø  ŠaÂ¥RØ8gp’`ÖJ97ËúIllÇË|pªèblë”`%¤2Ýk¡*Wˆ]v‡UIñsZl„ØK³u’ÃõL_Ùãyøüæ3"Ø‘Àæˆ*{”#ÛEúz¼ï/ŒP=9¨TÄíîXß÷‡½‰æf_,Žý–¡œC¹Gô ;o7¤b´"z·ÃV‘TüÉ«œW¨^ïªzÈîvËÊêáÃuF`6Óö°Ó×?É»öäÊÚ³.,n]ðüí¦ÖÂyA°Ê‘Á™&Ê÷ ÐEn=ý\†›ë»b pþlÉì^ålf[?É«Ç0¡ßË‹4Y%a…’,>Pß"¯‡Ëü¸Â“huÙè‘TKÌž§+?¦ö¤Ì¯©=ôçKÃû°¼Æ\õ“l§æ4üäŽC Ðx’w×'õ»Å|ß_í¯ìÂv4t„œP³9p†‚`êwné¢_î§K_¥½ôdßEµÂ#ˆÞ¤r‡\Yçj¥jñ|‚• Øe>¡v!,󌡈'yq½Ã`g6'[X y•Ïá¢Ë›©Dw›41À€f!)Q‚hB¿±<žNã#›‘<ŽÄŽ5zÈ]¦þk¬§þK6¼·ÙtÍ= O2Gø%ÊãH½´:l]sñÍ­‘Ùù–ªŸIl™óc]`mwû3«U„ª…¤‰¡S²=Ôé§XVÎsNHcd¡¡h?4 ˆ,r&9LoóàNš[2 ¬œ Á‰“˜NYBBTïT^BßëB45€Y‚bÙ•bÅAC9ç\?ôº,$˜»’uíAG|!Ó³´¥5ïðçzž·^~ÏvîHç^?™ÑÍ¿vj¾OF`q(ÒúÜ‹ü!ifIL%‰N8*œn1,bä¾djÇ›'ŠZÓ’©a=‹í3k +Èž¼»¨bw«Û/Kã‡h"ÑÆøvL 0¦ëé·Ç²ö ŠŽæ×gì:Ï“Oî˜u¡ûmsÃ*1-%«®ŸcþÕgœÃ –'ïþlŠ·=dw­uýAen”eFjÐxv x¬E“®h[é] ÞÌêDãT”lë:Ϊ+³™ã³È°ÀâO•ëª:Û¹~$®ki‚éG·¸ÊºúÓÒº»Xq²3 yžÈLÌ'O¢˜a´Ú?óÇh¸Ü¿£nM45ì (§ëUÂá„ÊÁ­¹'Ãɬ °ž[xO óZkJ˺őB-TÉËX–Õ–ü¥35+òØ¥¡'ªsm£V›´ËeBëíñ=˜þ©óåÖîɺæþŠi—úÝ)Y¾w~‚uokcÔ®ªsÔÙÜé…¤ãÍ›ÃùÿoÌÛ·’»yWÚ½¡…P“ç¾Ø^ZÉpHÐÓךÔ?aF7CÖz\N÷bu»«ó‡¬ç=wò]cHö$ _c}¼ß‡Ì÷›¦v^Er"¸ºEYZ"(~´q¸…DBÐ u²Y]!]íÐɶÜÕš{Efº•×±˜ÕO)2„ƒšDµ¼®ùáßÞÕÌ«'Ô[zÚ[˜ÓóQ?|Ò/c!6U„¶±La& ¬9y/é•:Œ8h‘Kí ûîú²¥K·Q©0,! Q*7›/߈ïýÕ@¨ '™ˆ³žäíJÿJl_—PÊPª|r+šÐŒd' y{džÆ'Ôïm GFû¨têFßJÈÙ0‡TlP/«¸0èüYÀ8À0hÐ êŸa?ˆy×õ¬²ãUµ,‚|ƒ1%¢ó2î5ío®¶î¾ø ŒøÔ_¦©aF¥ô¤X¤×ç3xåDçDw5Ÿ8Ûm´æq24”ÙÔǪõ¥Œb^K¤%¶½‚ÓEß ¢¢f>éSI4û®Y›×#¡¡¨;œªÀ˜hˆ{}ÖÏzUñžå –¤#»*ub-·ÛÙ<²öˆnªh™‹y×Õ)¡¦8à~Û‚K©+ãDUÆöÙ_TÁìC®8‹;£ß%Êßð>RÒÅìÛlós’d-@@] l%Ë…ÌÏ%'äõ(u®©U²EÂÜGv=ÏNìp (ت y|S-à&³[ÇóQÎÜfvW£yÉ줒4¨HÐ?ä½'›Q j[Bò¿w7WN®Ý6t¹Ö,¦8î3¸/†¦ä ½£›>íãZMFHƒˆÉ Üç4«ZN ý·Ô[¼¦>#Üx‘+£NRúä ÆÀö#^æbÍ£TÊgÍI-„ðÍ_š=ÇT„™ Èýæ¬ãy'æéñ+³é¯t÷Ê@y/ªÁιPù*n¿ÄÖU÷ê2Ét¼égý¬[S¼•Xã©ñµS‚½cY×~›M–"¶:Ιâ×wÖ2>Ù’m†ï# éÂtì8»£Ò(ˆ•žÕd]ûS(;ÿÍ_ªÚ¸[a«z6³Ò¹¾ëDFk"_H| ñ“Á/6C%Áÿ¤§ŠÙ$ŸP¿Ö[wÒ²V IFùBaÂ[þuƒ(S3›>&E‰½ˆž¿P4ÊTbe;uJ_úØ"†¬¨¾]žGòQŠzì½o­³LD§}¥â‹*þ§³YhtÆÜîi?ÞsU«…Öûëö¿Ö‡8îð‡çoÁ¨ìx²Âäxå·ýI™‘ÛÛ™Ã;±§ûô^Ÿõº«U>:,套†wÓ÷•LC~Š/Èf+öhòlt«XóCü±XEº 2¦£úÞÊl ”ñÙÛ9Æðác|`/.ß&“óñQ{¨yYjx¯i•‘Õµ‡‚]Ù~»…\Ø{T Uõj2µÑ>ë×ÇIVÿΪÛG鸞"ëZc,»Â$ºAàF¾{´mº=‡âS$ä"9Ù…)ËD,6¿‚½‚ ¢àß^^¦˜s{kã„z³ž‹²\nZEÆ=Zµ9œXè5ÃÙZÓqNsûl—)ÕY`$¶-ò¸Èå4nõw8¹¨Ç`WÑ &2ãZMJæp€2B“wç¹µØîàj>Û*ó4.bÅš©ÊÖSÜÈQ÷¦|§gñ€åíÆ¤‹Í½+÷ïû4½vÇ@¥ñÙUÌÁÝqÁõ{™‹ KUÖª½~ýe=-}IاJÔêFÐ<ÌtƒÎ¿ÂiѾßm}xBpbNfpï²Ín©ÄìÊáv32,mN=0Ò^UÅ`z‹Š×‡e9½™¤£ŒDY_g³†,„¨Ÿ7½I]ʧL<™­é& ‡IWÚÓÆ8 š¦Çu¼›CÀ¹­Õ¬ê"è<’ÍE)¾Éà–£§Øy sù÷ˆúNÑâÖši‘1T•0S4g§w*±øsok’Z?ª2RÅê3écC7SšâÉ$¡A”ÉÕi÷ÐZ*iß‘º7ñnÄZ8¨ÞT  '%fg”ÛY¸Êd¬ç`nyíñ8kÞ>H»åÐKfs#™ì¶“i5·€fâ";¾mþ’s]&UÂVƒÓÔ]“lKÚ¶®.¡˜Í©ÿ ÏÓò³ë.ü>M-–S•ŠT© ´7x™òPù‘ÔgÛ>µråbÃýn?†¬>MеÄëûݸ&SK“|ç!ÔF:© ¢ü„²S‡™ŸsljðýÞ䢋2³ìî„p³‹aH¿ï§ ½Q@­ƒª¿!ûå=}Ä –@Ò-S£öÀ}vi«ccmEfµdBLm]û3e:N­Çt·wÓJÌÏVN`”‚øz €žÛ©Ö.Ö†—uª5ª+9ð®ò8C…ø?Öõ¥-ÊÅeâ´ÜU‰•m¥/míÏ" 6hT½íI“DäŸËUõI§H¿ ÎdKŽ…JßÜÉ(b÷ð¿kÓ ‘íÕº—˹֡|ªï.ð»è}]a<‡¯2ìZV1|Téu\®EÎ'{µ,Þ õëE£.µš2áœ7rlm ‰82j5gõç÷M›’È–tñ]ì]të§2ª)Kæc}­ÿ:ìÖ²•°ÀøYe0@aìNlIxët”¤ ôârWYS˜Üå£?y’ÿ­È‰º¦½Y“Cÿ»÷èŽ|›Ù½í!¶ëmPÏè´äÆr=ïòek©ÕžÕ› ev[×xR—™4åJ^æ¤%CdÈl¸szJ MÍêäê¹ËÖ3Í’âÏ6à76I¨/i嘸ô“4nÃ¥<Ôÿ2ï&¼ûó‹ ¯KB áU´uß=ö[Ü”.þ®[Ê]‘óÒŸŽY7—³ÑÄ7 k¥~¬kí‰øÔœ ø­€­<û.,© ¿!å)ë:~L¾ë— é=¶éB é~Þ³mè|<{¨óöX,•@Q*ëלÒÝS¼¤CÍj”+€•P‡â w²û$tÚ—LˆZè/Гå‚bò"÷É ôé2ï=­äØŠø×Â)‰@ÔBcʺ ÙÕxq¢ƒ)^wÝ^ía\Êë+†`Nõ,w⌨ø'uúÆwH”^ÕÖUGus g²¡u¢©‚á1Ó¡”ñaÇ9©9€~DHÞMtÓÕø€û.ÚñMä˰’KÍó£‹Ý‹S­”§©Ô*ƒÜµ®µ—³úV–|ÜI•ï§§;üžPý€…ÞÙ~Ü‘sZ‚8îH¬6äyNîøqWcZƸ´»ïw­kì”ä»PUëß“MÙ LT v'B”]x]æP‚¿YÖu*,“ŸË·Ý!€n^ä"A·X{”Fà¹}ë‚—=bRR*#Ø+¤–ƒ=ƹvM¦ˆ8)ŒD´¯-s°HDüÍs€š¦Y™vÝÉ l øÓ M sŽAŽ(`,EÆZBÏr2œJÑ9rÖ•U—§™Ýãlí oû³OkŽ—tûú|¿%“„ºÔ3ãük:ç( Ö=ý"`g$ålëê{ËÙ¤RmjÇo°D¥Z¥"†¾¦~ _)]u‹ù"û<íSë@3%—ÎçY)”a4Ui›wU6tŒ½ê'§f!§5šë#)2_úauÝ©ºH¨†õ’Pïaö»¼>,,©½¥m¹Î”±Nµ^Âñú±Ë"Ù'›r Šˆà>+5/‚£|iSÖâ½7ØÊYÑbô=´"¶ð8| [\çqzEþ\·YµÎÙ!FéfWŸ©Îœ¦¹<áñÕE¯ÙìRŸs3o«Ca"?CßÖ¾yô­È8GO¶Çðò©ú‰Œém¦=‰¶NOQUc'/s¾0¼/ô²»Ò©-»,eÕn鎴3é©‘w}䳡‡¡‹Üï\þ1R÷í„ÿä×Lñ'Öº"ãñní@n×'³_ ·—we2(%R'î5*ö)ßµrq¯¢õb‡¿ê~&‹F’•>•„¥²¨N”,$,ÄóªíÓ„ÈË‘üdF8£ÕðÒž&ú>ÁZaY]ƒ/ØüFêg|àá_ ufrÍ*¡ÊEí ü¡fZôõ8»o{bÞ^Ó«S±l[NÏúömïaÜÅÚˆ'sw¶~\¡ÆÎ°B¢H‚•¾7YW}Ün7ß_¢JEÍ1 ëŒ^ó8ñAS[õ%Œ=ÛgQ«cæÙfî7v7Fݳ2fÆP`wÆíQ¤\àªÆÜ¯šu^@‡üEôƒIIöš@r˜¨Ü+ðÑÚ@÷¥Ñ !#Ž3Íx?±œë ÏÜtdø²ªOϬé/ö„UL€‹¾Ë H­e/fõÍLü£sTµðêãá¹Ñ«m!ÆVÍQqBš-º>5£@©H‡ò»0Ñe6£9´-]l ¨²k¹ßPª\“Ï­½†I]já¿lÌ‘‚˜ð¬›Â}±"–Ö5‚¯wäÅ.)½¯½G*OGÑÒ^¢„Šö)‡_Ѽe)4 Ê®’S¦¬T!WF#\•½zø JýEÏF’¶k4Í©²ýd]ÚG·¶ÊA#ùdЄžI²_:° †ø¨µ1Lzê°èÈ øºÖñí[û4î!–ÖuêæÖ$mçGxÊŸ·š›*TØ•¬Ò8ó’Øh]^J˜¬k7jãBØN¤©á©~&s[O“4‡ƒ†mŽÞ07)…fãÖ Y3ÏÕ_ÃR¬ ý êÖ@èÚó=Ò]£¤#›è Kfüyªø5¤F ªÓ°ÖÐS61öª_?1êI¶»§ßíÎÓ»4„¨NÉ»8Ž ß;Þ7t½4†`àij¶MCUö-Ç^'öý˜dε*­ë´#Ù6›K/&ùì C!AyŒ°Ô«·ÓåÐ[¡JÚ Q–ìÕ¡ìã=–°Zù@f:ù,"pB\¡ç$Ȱ2¶NÏ_(´~¢|תι•ê­œÜPX¤CaGÖ•ª,·£ôH±ž õÔ…Õôl=ZЊtÊ{Äíxà§AÙ[žŽ `;fÞlYr’'%’#.#‡â!–Z‹±^.åbO§R’*ä{Rhô¿ë©ê-Å DÏîºè !Bx™Úîù“P}¼OÈó©¶õ””°Úm;ëtao÷ú”–Ðöò²¨#@c­À{‰cÈÖh,ä>Iyô0ºñ§Y5Gé®ÚÙBg•Ç$ÒŸ×,‚p²°$B‰6Òº<^5V ½šôÅÖSݻÑvu£Ÿ¶ìÞ9wJ¹b®ÒáatzR1Š“©†õ¥ñ¦01˜@3•Ã;7Õrí’H†8; Ã>ãȺ.øšÃZ#奀L¤5Rb‹g¤@õB–"Œ rºÈ¡ë ûl‹†ïÎ^ï¶c §§dO#P¹K7öÚi]­¯l1\ähükó0#óà,ˆî®¦Ù¤ÛÉúXלꦺϕ;fì–ÖÕê _ý ­ïJšõ°®Ô*úáHa½V²òæB@ÍOªå!S›åa‹o0ÜO…ñB.V§uÙS{ºØ§Ý•­”½ 6““SeYÓ‰‘…ñâpÎ ê%s÷I.„võýèÈ@×3Õò×,Á:[w$zCä€kšƒ-KϺݒ½4l¼p4ub$Óò“€”˜‡­µfrk½¥SBñ½óv=`ÞtdÝŽ|—gj¦"€,þY7Ü´»öOëò2ì|zÙN‡uíI6}X×ÖœÑc½ÖZûˆ+Ô±H:”áG£-ª­Ô 2gVòöB½øN@úXãÓBÀ‚^¡uÍõ©ù{‚õ~o±$üÓiàB¼­¹k]c®JßåQÄ”³+ÐR4)7–7ªQtÎÛÀ¹ÖUŸ0Ú½ÃÉ¥"0 p?;ï ÷©™nŸ±¥W=é”F´ç“F¸Öµ>$(ƒW|ºàÄz‡Ÿ«Îžñ=”Rr2†ùìü†VuÒwùO±nÄãc]•Ó|4ê(ŒëútúªÊDP¤uµV·Õ\ÏŠÈøÑ–õ:¥Éw•ÑX3ž%lêÁgÙqëYfÄ`¢¨=ô®ò®ž™ µ£¼«/.±Ý“:€¿w%¨«Í%ßÕv¶ÐK³-낪.Óõ~8¯ †Ïôj >º\$anuijØé"zðNT^× úî™DÇžð2ãgç“‘í&ÓûÔqž5gÕQ{õìދ‘öBó+»"ajmÉ«õZ‰mD8Ý@Ñ}†Æh—ö1Vº8éÝ„¬«R—/}]Œçõ’ódª5£Á¿(®£±tµ<†W;Oj Â'iw(!±dypÛÛ«ß½~»©-ƒa@¤~×NŒYœmö8Á¸vª"#d Øõªe2ïê½K¹Ù§fô³#„J{¬SímŠ·Á¬~·Ö5€¯|Þ‰|«›‰¼ûb]@%&³z¨¡1»=­«Ž“X-M½ëØñÌ}dM¶Sg&KÕ°ðIY[º§Œ™kŸÅôÌ}ûdz–œž·H˜½¨§áõŒz³íÂÜo=°ÂÍ»Üû±fôò#U &¦•v `)q½Ð2dGb®­"ÏK kFÐÔªWæúPìúÚAÛ"­ 윙waf1ÅßUk‘ïB>ÌIб¶×’¼ûìv$¦‡ààc¥±n$3¢DªOVé†É½2ׯ`°,ÕŒ "!¬Å¿ ^èdæ6"€2ÈíÚMW¿]àös©1Ê`+l¨.ˆñÃ'‘ï+½ß4ÛFí±¬¿Á®5A3¹ÐpòìÁ¸†6ëÈ Ô¦4•­«Ÿû{½ÑC!/‘»*¦;4ïKÔî,÷(Ã今£ÿ<…#m¬­¦nô%¹Ï|]sZ×èëƒïr“V¯Þ«!uÊÈ]ÂïƒgØPøHacŒJÿ’êg7 Û çˆÅŸ¥II­$/@Ž?J&üÄqï›#$U$È2¶ÖM©¹ÞÆG&]•S˜Úþ ðlÉó`Iô‹g<ÂVa+)}W´¢³m1éÒpy$ ú7x”>^­åô=lcmçf»2¿.¥æð<˜…`¬Oëæº¸=&­Æ K¼ÚiíIôY‹)ög0¿¤ºnã£ÇŽ=>õ»êL˜pð†÷:"Õ¢u׿À^€C ¨Ú Ï=J{‹CÌ}©È'¼–Ì]l÷*è­ å‚zïç#ëÙke{bÖö¡ ñš˜¦¶lÓw)w²«5âGEŽÌ$ì)â§N{`-ÓpØZ|éç´o}àÏóÕ¸ u²¿®°õóA+ØÐ, À¦wì~•Ž@¾ ÛL̬OÂ{g˜Ú^¼MZ ˜V˜5Ù„<Ô¥áµÐêcȉêÖÇ/Àê³;d…5I‚–0©…К+¥ñŒŒSå®%‰²˜eJ?íœö™3z/.§:IµÁ׫ÕY{‹[æLÑE,«õë³5,”ˆ’k_å’Ö@áqEYjnÌ_ŽŠìU€•‰ºgÒcºƒc¯>ÞfЫ|Ül“?X±²¦Ñå“üýÓâŒÔÃ6[g‘Íž@Gì)N‘A¹›ºé™w!;6qe}1jªLœ6eX ¦J’ÑÊ@¿Í;ø×ë¼™»C‡ÙúY¹˜tȇ¥Û9¹ŽŠ¶Î±xãÚ CÖ‡Ùú²Ûš{;AÖEØä T:¼ eJ¢) ÁìÕ£A•¬!íTs«=$Á;óý6ޯɲp/) Íõ*ŽXê\¸±7šZ'OL­¥gÅÞŒööKV!\-íБa#Rï‹Hï-!òÑcyeÝÏC @6~ÁºOÀ œ6ÿjëŸmäçäl·¯ ‰›{»š“¶ ª®ùaol¿Üm†<Ï®—Ú‹½ TùEòî«“ÿ»©{ôPãL‡b&›è¤|„üíid˜Âýy«uÕÍI剣„µÜ[MZäÄ#±ûøè+rd£Jxª<ªÆ›‘½Bì5]'##zÇ&±i´ƒ¸q†ãL|W{ÌÕ׫µ.¦±b`IP±öÕ[O&1Š—ú'æò­ð'Å·{ЭKRíë°_‚Z·ç½cQhî@åõï©y@"‡J4 ZD¸Aë` ¨KÈ“’õÙw8OdòÚ>òÀÝãí°™hiCǸÎe=­¦m!·ou%AäÄØ+©ªÐ©µd Šù€Øe꟥ÅVÉ›͇Ti}øUÁ©Ë`˜b©× F×6F}½ËË×FI}FCÞ,‚òNæ@8ÉuYž¸É¢D Œ¿§„I$‚_⪒?qÀLGÅ×Â"¶öa‡sÿ"*f¯2fzù®Å´–漘ûåZ …ÆŸ¬:#§Pu”š..„EæbU/â&qæjbBHÊ2ÙšK‚(¤‡$ØQe¤ïŠ‚»ÐºÊNJGô“êÉÈKöHþ’7Ù]Ñ)Ò` Ò°#Ö~Tu‚åR¸W›Ÿ^Úâ0™h)0ÚPo s#QéhÆŽ^¨ºq{h‹²=íÕëY½´TåëY½)*wSüÑR¸0¾T¢AµBºz-„»·mÚ‡›§¨?^ ïZÀüi×Ê~ÎÆ>~hÔñÁ ‹jì*xi+l|hX=^}[Œû6¨ÎN¾‰èL%è ‹¤AµZ”OPì}ÙÝTz¨µW“À˜xS›{—Ì»jñŽ|’cRA[-å'€³ÙÁžÕ$yкåqy0 ¶‚¿IûÚêj 7Ÿ§wBf€Q<­ ³xÓ¼±BÅÄ^ô,®×E aUºOOŒ>Äx/üÉ⯎GÌ Êé©}Œ0I®Õ»šûp†Š(+§àmE×Oí50[¤Ý‰B¬†¢61ê‰Ã:J‡€ÐÔ¹~Šz ¯­Ùo õQëhÖRtÆ€4OÆX Û&¥z´w¹3SÚÎWœzÉ‚X¡ÌKŽtW± \ijVŽÉÔ¨‘éËI>÷ÜYé ݳ@˜HsRP’i–ÞXÕ™R¯+<Œ¿!•É"/:º ´íŒÏ.o3 o «3jÜî­¨ÜÛv¬cÀ]’õàG ÂÜKÏ’tP³îämD:ÔF*ñL ý“yuC!é·ïÔ‡jü&è¥D­JO½X7)âáÙ=éc#ê^8ÀK”¨HŽƒÖ¿Êø0 ݘOß}—ÑÔÖ¸ßÔ<ΞôÝFªˆ”I•Ï|˜}èçØt…èíì­bb×üGG©ðb½Tä H\Jß–q{…cœ4¨žÂvøÜ…º’¢,¹Œyýº {“áò4vb+OúÜ"DÐå›õ,5c+: u²u×ÕÞ§ <Δ8â~úÒq1kÑ?òó—VŸûÑ ò°‘ !AÉI%,t (¥ŒªsIY»Ïò¬M’T§¯ _§˜}´‹ ÊKØböKsî{® ̶gj_¡à!"^·ý<èp…ÉÅýĹ©ü~wb÷'œŽŒ0€ X6Ö,˜w˜ÓÑäDÆk®ßI‚gõƒïÕÛÊ ?ÛªhÛ+ ãûðÞh0ŠMƒÏ‘tR#V­x`0ìfÇ8\¦óѽ„ Õ|¬SW Áï]øbl}e]:õc+¬«ê|äÄ·¹ÇÈ4n…Vçu@ï2z¹A=Ï~ªÁ—.kÍô(†ÕÒ¦4ôÆtJ&)ìàNûDùp>Ê¢£IsÔ5²}P¶{ú'­µSBaƒëø*§þ¼·ùdgƒ c=ÉÐhº©^Ï|$ÊG;45w\ E Óa@rÀ"ajÁ@G`çË„daj¸Å>κ¼0ýºó3 Á?Ô/éoyú^Ô¤GÖ4ó̆Üc§uÁÜËâgÀøoÓ7·Yùý¼Ü–Üc}ÌvÁÉ2sô<¦ ¦³³ÉuŽÕMÍ¿Cj Ü&D¥éüt±€8S’ß/Ñ0”Sõ?²°=&Z6-»!þA·†ztæíBR,u‚‚ÆÌ讥Õx̲.¯¤îѰ¥A•GßlWáên>mÙ'6mo‰GÚ²nÓ25È.üae¶nÓŽ­§g¹b6¨Õøþl&I%Êü²dw«÷¼°7ÊM¹ÎóèfS姇ÞâOVÕÅÜ)—›ÒÅa KBžˆþŒŽºX—\R©OÎò¢®ny­«•e<Îçͪã-´fç›õW!]ÐaÔgÄ×ãQŠFä0ºBtúÔ¢¤`lVìÙã'»í¼£Î§b„~mèYW&ÎuˆñÂJ¯LБÈ$Tèíi¦ÇŠÑI¡Ù-Ö“O si]-D+í¿§=çN9utSÌ5Rq+驹ָ¼ÜDWLD§ï÷N°Ÿísõ*°RBܧ×"—k_¦qÀÃ=΋( Ÿªü½°TŒÒ²4Þ3U|u“N*€ËúQ)3%@ t»vi{²fQ$Œr¿DônEt…È‹Qˆ<Ö1R%4¨ }ØxêýÙ¥à š•‘߯ ¾çä…½½JâD ´€!á†ËkQx»V†Ùýå,S‘óÑK"~}óS”¶‹¸*#—8`>9õÛ3­É¸Ý‚¶Ÿ™)x­ËËÎ:Ó ¼äh|Æ uiiCµ[Ð…p“FxÀt;ÓXcëÛèÖÜS¾Lk[¶±zÕ`ÉÍDêe¯!gãÞo)Ý+¬°;d’¸KÉÌ‹º²Ó)”¥y4+²gí‰%©o¬ ¼{ÏÐIØi]žØŒžr½aé"‡€óÊÇZkrv³Hx Ӗ數®·òríG‰´¥QןVÑý½½>’¯Oðl<žš4÷–zdH}õfó$bL²l26o²»^.ë%OåÃmßu¡05Z>¡¹ïK²;iýý^ìÞÜ!’³‡­»Q 4¨œ¶¼ƒ¥ì8c½ô’ Gt÷È\q{Ò³†tGWÍ& Ú/­+œŽÝÓ8Œ¦òý! åPî ”ƒ¡WõÖðnf3[F%h¬"ïà)uæ×‹PóûžýÑúJQú‘ åêUõGðzl¾=×þÈl7“Œq·[Ü;ÁÀ«—£?¼;[°àig"Xlh>êßnÏ´®þÁnfƒçÍ:0Îd¬w u0 Pcûõzï”pU®Gª_r§‰öQ]o$»º“ÊÁ_CÓ€ØcÈ¡ø¡ff…+dpé?A=ÈØ š/æt^R©–ØoñËú'5º5Œd8|õB¬2fŽ·Zš‰­êmx–Ãæe=,óÇg–ÝðžaóÃ’1jô] .+Q«v>ø„5„cðÌF‚|C{-‘6ñ¼Mç¬CšÆct-Nzê·…œ-g‹”´ŠÎ³-¥¹X1D[Z5ÿ,/R¿)öÙtWëP4ö€Zá9^Ø„çgSng\©Å9èÕ<|¢éÃì#ÑY›xJnÌÜz7õóÜX?èÁvög<ÝFg*‚¾s[8]ïP1ÍñlŸ²C'TrJgHO¡‰ :`-5̾´Úæ™(Á¤(åú¡ž”?»GžÍáÚÔŽ%çìÏmÀѺBå5]æŠ }s;çØ÷èzî1ÍZþnmÁ9;:f,æAþó›YX¸¦9ìV¦|×C ¾s†ÌÆ?N¡AíÓDgZ®æVx»ÑšÐƒÉÄØ WÁåé½Ê'ˆ×1ÓÐ:6 K ?:3E¥À†$x^Ô9Ò»£È›³Ò @éAwµ*Ó,ae"PƒþÉßUëѲVÝr: b†–`ì…(’€û=|ÉmPí’Ë"¡N+¥=ôo¤îó£Á‡¬Œ°ˆïú~õƒÁÂf0CÙyÑþzðRWœk~h)N=™]Å—MT||YZÑzë£Â{xÖ9u»Ú† ‡Àm)¶ŽõáGÚ[˜èbÜ#¦¡ÒQOtÌ‚±úJý²NÅÌ›„umàëò±zn”‰îÄž~ö ¿”Ýœˆ)ÔgDf3›¬Ëº@}§L ž˜„/}¶ÒБ  07´Þ5 ›5å0žæH}[.`x’)½g…R´ää¹½Þøø'õhøå²g˜¢i¾=ú9ô]ø©‘…ñØVÐËãŸQ.7¸‰¾Ë9û ²·'%yØN—(´i–.NÌ£gšúM±I6¤PvêWãÌ(Ç>® íïH"½&þ.”%-÷)ÒŠÝ6B‡ê®K¥€5u‹“óò¶À¿ÍøšK–âþeÖ÷ [«­|”j¬|ÓpÐÙÈqôÏú™«LÃ|Bëƒö"ûÅæÜN{Ïö§– û¢¿ïeH- |¹ë<²JáÃÇJ¨k$Úú6íüjýc¡€Y}¯Ÿ|Ñ.(‚ÅI xûV•õ-™tP0Ê •’A.x¨ ?‚ÓúÃèÕ§uá%u-¾¶B~@ÔuSJßcµ-cG/ž=lãCæOqŒxÿñ¹}jå×N+ˆöwUÐ,Ußa=­P"ÖÆÆB÷Б״m—Iƒ*þ-Xˆu­ÅWv\Þû«]ŒþØš*t)Û* Ês°ôI˜¾›ñÂËv$°¸Ó)Y°.?.u0 ÊFP@§JÊüô®MÇú/×I¶–òt\Ê ½ÈÏ%H@ͧ‘û)«KyQ)PsÔXŠ67Ûó‹:AãM¤xî%ò©Då^7t•§± óY}^Í ’é†,@°´»º)~}73ï ‡®Úõ0®cvüE±OÌä_EêЗ*Z´OZ×1Ëè4º±ÐÄžTæ]\o-*zÑ!ð ô"µ·Ó‡|—gÆØS›e ñ¯Sˆç47àRÎG6Ã%9 `aÞðL† *,S°.ˆ`_i…{¤’z¡£É«á1(ù¯ßŽÄy`çÛ‘¨}óµ”·¹Ú­¡ê>3áÁù\ù\ƒþž­"$ÞjqqSî®>oC<-…¿µIØdŸÝ´†¥¦Ê ÑJnsWIYÐ òÂ=@jŠ£®”5ë8ÁR|÷2MÍ$¸Ô¸ësYÊèÜ^ï\â‘Ø}~ÖÔzSsúéÙ«ŸP¡ÊC»±à%ÕuWѺÆ0é A³’Ež‡SìÙ“28pWäùÂNóù8c—Ô"ÜpO¬S™†cŸ¦9L/ò,‰Ì±|4e] ÞQæVsÖn¯Ê¸ P;U¤¯`«`]ê»(4/äé ¶Ö‹¿pœ‡Y¼PI|%ÜnÞ”l%èfWÕ¤ÿçVˆªg2Ÿª«°›j I?4ÑwÏ~ ڷ­  'Î4à/âÐG}p¿%º4§59²·øzÙK2¯#“ÝÝ–†|hè˜W–™ÒN€Ò[o9AU>ó®+ü *ZÌ ]¨!€ `8ºÄ¥$ï§Ü*fÚsÑqøÁ’¶³%qù)-ô]~\:M¨Y­².Èד:¢ö’+Ò·ò®R”ÓA š§âx†!Ò“]†®=5Òœxõ;¸~ÈÒ;Ö³›ž}"ãnWLæ"/×N·†žÍºÐ…‹Ð|‚Âwd(¸°Uix"OÞ¦ÿSíîW¸o‰o¢UªÉL —ewþDY¶y¹ÂÒ¸‰\$Þb«h—÷ÔÝRçë‹Ö±}ôÇÌgøæÇÞדּVZ4zÓº@ªD$ èÅGU?½ÍÉ|ʳýMïàið[‹Õ[®i_ `H¸êRÙi‡&@—o©ä  ù-*ÃQ©c…Õ¶dAë%µôçiŒ¦½öœbG«(±>HˆÃà¸tŠ—òi¾ØšpŽŒÅ]ÍÐpd•­DÂ]Üg´Qrõ7–¢³éŠ^!¡0-°ci=$„fšèä”ÌÒoXa0 ;;™¯þ.ò䓯¦” É#–Žd¨.c(Å÷LÛ4!˜-›CÑ$³Ï‚e)]ì³²žµð‡u­r>¬ººÆ­ITÕS-5‘`¹, ±´‘EÞeòadÄy1šÃ ¡…¶,}—¥úÙzÕòÏhæ #h™–d¶ùðþR#+¶ {qÑOd!zúäÑDƒŠ¶¸Z\m(»ëZtCcrí/Ôw5ïñÈ£&Š‘Ïpkj$Zé6Fç!¾+¶Nõ-Ú¤ò4Ô—H£‹¼9#BÃÕéï°ëœ‰p|]²fH+ÙÆX³‰¢Þ M¼¥þée”š'~ÞšjÝW >ë:[ø ÞŽ$Ø1 |hÁ qŠ 4[ÓÄÖ‹ÝIw5zU˜«ËÄ6›˜¯¼Š®ëZK Î ‹P‹k¤èÚoÅ;a‡ü,A£ô>Âe)9Ó,æ)•  ö‰ÓcYgb,Û)À1ÏbI„œ6iêg(^êGH°¥†ÛÅ:ý ­|“Qv‹¬—‰à†¬Yöb°ûNfD@̨|{‡çQ¹ó‘ó×RX`˜¶ÑÏø…-šž1¹¸0 L½<ÈUåÈ ÐÂÆ/JA^ÔÙ?׫Q{üüPêŒUùôÏSö½ÖvM¤Å¿†bi á°GJ«Ýon5xÕÚT3ºï’.¶Û±ô„ Õ@GæÎ¸Ë­©Á± …ä9[7ƒ=”E'ŸPÍÆhÐÈ3røy™IP÷”“<4ˆ“h8°›ä-†–AÿÐ ÷•P¼+DžÌ'™~ß’¢¼°#G§~‚7ç£Àœ‘pÚ©2µâÞ&­Ë¸ÎvußžÍÆ~Eó˜ ÆÎá÷»KhÊðr|ßÂLucÍèG;¹—}Õ?‡þáLû‡¯~rìB‰ßµÃÙµ.«ÁÐ {¡0Ì`^‚ü@“¼f)hÔlíã»Îlƒ"Ûa¡ÑwBZÙº­ÔJ ÿÙDö8KMÜyäî"`‡L}óØD¨ÀoÊ­Æ*Yv§pfM!ÔÝ™ïÏÂÈq×{¸)$“¶-!zÏÓ³Ú’BR“.ïÆ÷gäD1Xø.¬;ÓºÀ¬ RžZ‘ƒ›?ÁmÏà ÏÉ3”áAšà~ÕJUìq?Ôøj=R?¡“u1úFýðó"µêlòžÆþ%ì Ó¿øCP͸¶ÿfœõ^Œ·¶s;àKã?‚Ø/°tÊpêQû ýU¶þÑZµ¬h=_…0ò<é£BÕ?œùöÂäƒ*ϵ™wµV¥þ‰aÛ?ZE% 1yÕ1.q, Ês£ 5¶—Ð|n*ö¡JÌÂЃsÆ…I^æ/HfŠbª["K À© D#»9¡™Þ?ìp -Å¿â õâU®¾m¡öcpŧ’ p E?O»2 ¿ Ék$iâ%¢÷>ó˜†{ï?(~†ÁcBf°YÁi÷B«a1Eô˜›k#nË‹^§1ýôz¨ä` Þ¯ŠwÚÿf™ë=¯V2iœyzV„ˆ}“›‡ËnMr² ‘ï²¾˜Š€Æ:HlêZ~w®+c SvÂ9b5ŸsFxÖ•€È¨ IÅl b)Þ*e‡V²¦Âþ¯–xêÅÝ=ù‚‘ƒøtîémãmœ]Û8T† \ýˆSq›ýWÉ¥[‚åÑí8©o :JL]š«ÏXöçAž;¤¿Ò+VÛÓÏþ»»æ=/Àl2ó¢QŽ4ÐÉUÒ Ëšÿ¥Vyíó, ­7ë)÷pùÜ+u·žUpÀˆXÑ® 23Eƒ_Þï46ÓîüA6¡ß`ÑîÎÛ”»Æ:ì®–^õë–¢Hø³e êŒ--{üO×ÔÆå¸¿gËKÆVÈÖ0?Ûß.¾O[Ú±P aÉ"Ñkjdg«Äö¤)‹t”^…„ihm¡|Ñîb:»ê¨ô]mœÆÈxÀW—Öµ'ŒA—œ¢£¡<Ý¥Ãâù¢V8*ÄDòýaA¾ ‹VF매9ÄÌBå4Cl3m#ˆúRNÈ…Ùé ±sŸ‰R€÷¢©:Ÿ³#Ûu*={4ºí-ñXz€IGêÄb±ÞMm=úƒ'q=ž¢m`ÿîÒ[»#ÃK…вÈKAZt¢»”ö<]0:¼>í£Ï8F #[xßèÑŠPg4ôÅ6ÈÝé»6QÑ «H¯·-Ë%êzMetXWË9NP_?^¼k]#٠‹Á" î%ˆüJѵ(KNÿ‚úc]î‡63o¦s0-BmR¿‡ëVª>Ç Ó†¥ýBz»ÍÙ’Î&­ªÛg5@¬¥ |6J¦ÆóÈ ÜŽuÎ)…z©€Ú-A[áËô_b¢Ôc­ÁÒRzYé»»ÚO7¦Q–é>PŠ,ªU;eÒŽš~¦V›bëèòŸ9ǹª«wfd¶æG;Û=­ Ë3­Ë+ñÁ ¨´.@ºØMÅ ï³bô¨…®uµ¾hjCÿ+ÐQ”Ճ˒ý.¯›d•ïšÌ÷a]©3ƒ@Tß01¬Ë}xZ!èÅê¢u¹ï’nm‹|7 Ÿû0üõ·§%lMÑ¥€yŽžÇ‹¥F`Pë¼÷r)óSZ}…tGºÂ ÐFzIc…1ï2J Ã7ÏË Yýy<÷GýÀl׺º^:Yv­kŸLÐÁ^Ñ/ü»¦#ót.šñêbC‹®ÐU§#ÃÝX$ ƒNGæ•—’ÿùHžždšGÚgá Ï>R.ÞÖ4ó“=×:ª1ýø®nZß…¡FÚ•LèýzÌB·f|H«—Õs¸\NjcèÁ$ì€cR¾«³fÄÄóÈ…"/M ºÆ ø­kÏ£zm_Fê–p±¢Ì»eMƒú…Šoi5!e—¿éÜE÷ ‡—¢Ž¡º.¹cO›­ y×È;ÔGkÛÒç¸Ý4|cË3­ m±‘¶á!¸ì45lŸ4¨EéxŒD×Õ »Ö啸)hZj;G]—Bò1Å®ƒ¾«Ñ™üϧøú¬‹r°®¹?ªëmK› Ùº|WïÚeòÞ²ßÌlÒtð㜷«±œúÝ·¥>#‰ú‘u=¾k] µÞjEÌM5ä]ý¤ÎÚÕø\´.¿uÖÒjŸ‰§r­ 8|³(,Ò‚go2`×&½¡¬·Cëªo'.Üý®Áùì “³ nœËaöêñ-Æ`ÍxÊÒØÙ3ÛË軀D{ç/þ³«T†Ì»z9Ž ŒéŒ™~çAÛðìšÖ…O7²‘Õc‘håŸEŽ1óئ¯•ìÕCõù †­«xiÈÊÐã¤#4«Id…Lñǃ@Þ¬ðÚÚë;=Á¥C{ìp¯}V–²ú3²úÜÅ~Y}öŸ¹kgm—Ï0¿¤$N¬Ûv.°©’&Ãêdê¦uÕñ¨iú@Y)ôà^þŒQ…þÓRÕ'ÒT®¿”ÍEd)39ó‘„õ!2K´„…\_©¾È“*™CHÁdÞ…5{v$Fìurñl9ûajçIrÜŒlŒ ak]×»œl®£¯9%lÜò}Ug)ôwà=Î~~/éöyhÔ¡ŠJ²$¿ Â{f½Ø¿ Ç_å Æºm£K9kÓ6êÓ¾ºÝªZ?c°ÈâeLV†…㇘ã¼À³fý¡º™žaª7Y z7¹+ãÎ`C›Ž½ŒAë2@šóeÔø³{ S{.ÿåTޤe†{IY—‡ž·­Ž0¹ìãÈÖí1WpÍÍåÍÊmæ]hVtÊ!.¤Ƶ4tt Øôjîï;†±sËØcç]™õ=›|œí%ϳ¶}¬fkè8geƒ#fÕ*7Úå#&Ä */ˆî¬E ÈkæíªÓt hnC›ÑËFWn4߾صšG—Õ¹.³±–9A€ìm1þÕaiwðÔ­EûE,%wš]-¯œ‹@ƒQ}‡1…‘h%‘'ñénÜ~#ûVÔ@-µ'4EzÉÕYpkÜ)ÅÝôóõêW.—td£©´º5#ò®Ål·”úøD®"¨Úšà¨ 3e̬…‹¯‚€º™¨–‹Z[LožoTÚPµÙhw^ ©9‹%_Z6»s°$æÿ0(ðõžü «¥Tf´'ޏë’%á>ðÝ>´"³§}(ûÖ¼8P.ÞLRjÍáÁ›LÚ’¦AëoCž{‡Jë*oë-t 'Yf@á/¹Ôß¶ìÜj5øÛ“¤­žâ- ÇGÝuSwl Òºüøe8Ý`LVsÔå3Eg,D!²f vâT‚8i™n¾/ÙŒ2Rµ;ºUÓt¶Õ‰½.™…ÌA"Ÿ‰žÚüñçPäÕjÒ½DS0ýÀª}âl†¬h7ŒGÅ©•ªçã#~€žSÓeb§™K˜@r=2ðyùQw¨c Æ7;Yñ•r/Þ"Xp£=2ZÀ©y®þBS.‡Æ!m‘óhu.™í j§w0«ÆŠo2ˆ7ÄŽã§ÊôéÜp ãßGŸ8âŸH%Ü‹ai–dÁ—]5Ïcó§'ÓÜUß¹?ýÜ Š¥èžY=f¾)­Âv=­kzØåŠÞß•hmëQ¡ ÏNÀ ›‚‚“^ ‹Ë¬:½Í‹_z>`à=óv`¥ïÚÙö̯Éû­{…®rÕ 8x­GúãVVèY—>˜i´€Q–ˆ-Ö$•(–@Núý¿`­ôníâGZ…ÞžlKçWׯR߇+b3âgEBÖŒªÄÞeÔA™Á9ðò¹Oû%‚ˆuhQq~ð3s}|WKÊ·%5ê/äŠämQ³Ù‚ãà]@– }´R°ºÇ̓±É‡|=¼Wk)Þr'<ë4’þ£.<ª–\ÊZäóˆ ôÔ& ¸ní³|»ÖþBF9KBõfŸM\3-°Yáj7jþõÁ6®G+r-œ˜ýÈ›˜W±‘®ˆ^r…ãïÊ%=¿‘Ú9‚¸HöÐK߇ëY w<…¶á±†`ÄŒ÷.ƒWíŸƵy¨:‹¥ÚÏÒþÎÀq=¥Š£°Ô)š © ƒZý³UG£›=½SbÞ‹Á™Œ¸0÷J‡Ž}•ž” ¨Ø æcš!q (#Ì4µ]Šˆx½²—©Í\ø1–B¥ð{KS0ýi©àHRÅ¡V:‰9mÖ~+~•ì¤ïAgÓJ2nÿ†ÚЬ¦•²é†Î!Š$àÒûðÏÖC2¨hskhµ^s!ðòëP*l0‰BxJ\j‹´!˜•ø<ì}T͉‹5­T¶fD®÷Ð/ÔšánéýP+ Qê,;“5– U“õB•Ÿºð yUü•^ªª[UkO& Lnª¸5zä³èÓ_죦L3`;”ÜB6$s@Éžº —hòb?5µKŒ0©. ˜i68`j¦Û¿Ý9LÖ NëŠë³ÒT$¬Ö> (möO÷„O¯²ªþ Ð÷¦¡tÿN‚¢¤cR‚“Û²(v÷ß„‘Ýö‚`-æflÌ ÞòA‚ !}׊E}¥d$Š™Ì¼ Kk\»,Š»¬ˆZ³„àGßž¹‘|"âu»mŒk@ß‚ÜÞ²®¡Ñb$ŒŸæú*"â=½ˆˆ·÷ÔlÎçñ!¸œŠÊ”† ²Ì=SLÕ#&`ÊB"`•Ø&vÈw^œY½šçŽi]€ –!‘¬ù›H­ØF£8¶lp€-RiÜ´äq‰!ÑGaî²éýVoµê¢f‚‡g\Õ<æZçíúü°òÂó0ûoÕò1ŒôccÆóÊäAƒñ!îqYÙKg_Û©-{eèÀE*º‰µ?à }û¨SÈõÕìx™CqÍæø0¸õ%÷ÙŽ¥ÐòÉ„ÿ L)P\“S’IÕ)4¢û %àM»Çf’•µ2ÅáAQ(É‚©“Î!4>éÈTÅLðGöÑžø°ÚyrÅȈ¾-—77ÖþÓ7c¾Mem0Qß§Â$shó$6îî>§áÍÀ-×|ŸI‰©->#aWÆÛt¼‰=´Ó… yž±e]3?S˜“k(ëj£°ÏŽ®äNšâeFNÞR Ä¢€TÄ[EÏ=R ±Â fJ³6aǦc§u !»©v5g„R)­—‰©Ø[ÉšsRD­¹A:°`kIÒ!ì•Ü™PON5‹Zåžhx¨®¸_™5zRÅXLøR”ì„êuœuا+ÛkÝŽ,ÏZjþžG”$±ÁøÛéÂ'"Q~:?o©©ëÄ"G:d™pûV¦,Øô_ý„ñqqææþü¸‰v®8`]hŒÔòÁ¾ÃJ±b”Q)Eør4ƒE,ˆw¶þЋ)?W j&)ÈôFeOªµÕC}p3ò£‡«ˆ7ŸÀÜ+‹®¡7Àœèô£4ž”ò员çé£^Ç¡I?,±¶ïF¥¨p…GYï~Ÿîç•|Fÿ¹òýÙNuÌ`„·äd êäÆ>Öïóv€¨ÌÒcRy + h,Ñ/E4òëÑ`ÝjdRë—]%pÔyÃc#YœÖ`:½š=›¶» qÑ=O㬖la¬Î÷‡];;¬Ø3”]»;'cœ»åò_Ä(êäáû•ÆÀájMhÔåjðÆ%ã"õš e ”¬ÙGÙ#v«v^øóN÷Øôϲ[%Ì%uBº1¨—9‰™ÛYWÈÓ~îÛ¼Æa—•~¤Ð,r?Ó–vŸ9=èXÓÔÊniá±YQEÁN¦q` SÅàkó5—9Ø™¯ô©©Ò‹ÿ鋞ÉÿæO60Ö¯‹C,ÉØîŒ}œ¯AÕÂ4À¿ßйzkã*$]ô™]Ó ä´d)‘ú§½yò¸{Þ¦ R>,ßg£t(¶Þ!û¹:Ô#¾_9ôvû÷G#ky¦Ä(物$رDõÃ÷ŠÝbZÍLÅ·¼YT pô4(/nžf:J·ÀfwÛyì'û(¼ËT^ý-zµRÚ #à s5{²JY$ÌBëoª3®Ý±¨–ó§Ø·Í:t!—lîÉ=Júõˆï È»§C¶Ø’åú{]¼w;ïé?˜~K§„ª³jOxÕ3x”0¾çG=î³.p]pòµ.ô„k>ðmKYï˜UÆ£ÈÔkž+O}— eø~gñ÷ü ú—5·4gù„2·´ÅÛ•}ÈHÝB O¨Wñ–ӿ²Q)±uf†|½3Æ7n_¢áÌçÒ”†A­·Âh·Ow™/÷§Ÿà+ÆšÓ?\ öÕŸ m9wJEÃ>ïØË.!ÇJ™ûØ|½SÕk’½‰;¹ž&ícO‡D±ìN¿6ßbÚ5ÖÕ?"îAï°ëG3}í©öîõ•ì3X²ö*¸)Ós€•8(°(m`6ObÂsŒ(s‰Áb8É‹QŠT×MY>ìF »ó´f½ ‡9Õ¹sð«~Ýn9iw y•@îêyUWj! j¾}¿ç”®CÅìö(ˆoòo]adÔrT‚"Ó¥œÃI%Ú×”¸Æšo~%xÌB…092Øß"!s÷àÓP©j’Å*ž¾+fËêÓùa4EFÈñÕ^¿ªº´ýƒÖ³ÒŸ{½-ý~yœQ72–õ!>"kŠñ¥¯Ç÷z£×êª J§ŽÎ"çuÀÿªb°Ó?)ÔLðjÉ|1ÚšOµô«•iú@U=©Ó«´ÕçëÙ¼~ ßÐ;éY7@ÃÏ¥ Ìh}3Õr{…OhÜqÏe ò´vÔ´Ë”iw‰gÊC5j‹ÙÛȺ&TµeQ·ÎÊ”³\5gÛ–ö#Hhžd6„MUÝnD??ZÍμ;µØ–ý4àÆÌÇõ{'th;¸Ñáí}&/jýpê6qšaoà †Ø…/ù¸Ýpc‘CMÛ(}Kؽ¶±qQYÏù$[Ñ •º§/ª ¨žTa· ‰üP}Û¦.v˜¤¬ú½ô‹ómDÞÏ]y»Ð§êÌÈ€SU õ,,Íý ø®/bÙàþžÝU+$hÑZ›J*õH ¶?2Ë׊ú]€—(^Eâ@‡Šº’³¤–$fЋ/hsli±çÆÂàÁ܇‹½ÀÃ&™ZxAFº2LÎàîy‡CïT„í&c]cɨ÷«n®©µ%úعÙq¡ÑíQßl¶\{ºÖ…UG&Ûå±~ß2q– r#šœj^îT‹ššijPõ·u32ð â2©ÊC>ß&DO¾×Ç©”Î&ˆR®•o?4µá9ݬMJi5P'7Z×9åS3š×T{ ÂQO0ËšÚ¹¬aWu½Ô!Îulòƒ%&32™êK4ÿzlýcw¶59›>²[£®Ùw˜±¾Ë Q¸£y9UŒö„ÎèV§Ý_ò½nÔÛéÕèq·Ãø)m49 ?P9E…æjC^ ½ ¶ÏºÝãlÁÍÐïûíwÙ˜Ÿ÷÷D–ã=C\‘=©±§„‚ýiå¿ÙAø“‰R¤³©¯øµ,A7²ŠLñÚ*9Ö[Á‚D‹\oèøÔ#W~?| Ö›\&ªo:¼ÉSÑC¼œ^m–Å4.X>ye7õ¹wèôj^FÕÌêÑÆ0)y®úí™Ö£æÂ®S]{ÌW¯[õúXwŸ•f¾˜Z—^:(FfšPÕLsÀ´Yó:‚y»èüjHäùP^ÀˆoÙ]ÜÂÚŸ‡.þ¸rPoê´JW*„mu3ô˜™ûg§^}˶ØÝÅ® åEƒjXfW3Ž=ÇBã1ËÞƒ>ǧm”_ï?L Ò‚–RKº{ŠlÎ Ç‘1¥ÑX± æìž;Ãéô¯´:MíÔqäY÷RÇ 4ØôÆ<Ía]s·MÃCºÇülÊr/L8ƒ€1©ãV;tWî’ƒœÍ%Ýè\-}±ç°È‹û|KØ;.YˆÂ컓>üyáYɇ•›M´!pkpÎè ¬Òþ“`»ÿ}†ŽBŸ•ù¡Mñb>%æáÕè${0œi :‡qgßèçâq¬2zyž1*¾lÚ]¥˜áÛ¦Y"*ro•ÈÙ¿ ‘BçEQÿoAFAÂ;x Øü x†o $¡Êþ* ý§Qä!¸›ÊÀrÉC³KžöŽÒY*výŒl¦qni…™›Å´c¿g¨~÷¬D!Ï ZõÓGÒÇpÄzg\sûfìñ“>Zf6_ÉX@ÖñUZ¨UŒðƒ`àZ}ÁˆËʇ›¶›–”6Q$¿Á#0 îF‹¤˜Ú5Öõ!ëÄ÷ISs»Ó—p–)>€5zû|šëò²+¹ƒ“)‹{z±x@M(™Þ$¶é©{ò¦F?–ì¨ +[bUöÜñËj>5·còwcHk£ý„ O8\P_“ÆzEiij6â¼+ó“ÆyqcŸºu©H0ûôbN·OûÚ*'*!‰nTo2¨1Nc*²9@Tʧ£TÞ0â:Žj exƲ¡±ä_<-T ›d‰ÀA!mmÓš+F ]LÍüä˜äÚš’Í(S@êܘ2ê^d’ÐÜ&\Ú#ºútžKC ([±¢YøXk«Âxz¨Ýφ¤"æµ–XfzÙÜvF#ë#»‡}#í­Ž]øZmÉÌ‚³¢ý{`Så ½^—uy‘g´pQy¸€6xDÊ“Y»¦V Õú»Ÿª¥ªž©èÝ©1éñ„˜PF„CÙs‹ˆ—úpw‘¡|ð3gË;¸ïÒº§ŸFƒR‡à>Mð{T^ÄDÏv>Rµà=âÞG±&õk?‰}GK˜†œä²H¨’7Þ®—n4(P> ÛØ’ 98Ym1Aµ°Oµ˜Òpð…¨~ïGPÐùOÚÆ©åM+šR÷ÌZ³t“Vd@ú½öƒ;€å…-î\GêÃEÉ×´€¸Š}øÀûõZ™°G9óBÙQ\[kJãſݢÕÔ’©ßtÓÿ?86ÙKC†AGV¶6ýgŒyÕæ~Ü»¯'Å}T4YŠÚš«~„7€„Q¾¬Iuc”g©›.¥MŠ&`Kt'!ιb޵ÎÉfâõ¶êQOˆ÷ùK%©æ£'ù/‚ü.βÖ:íì¶LãüU.úÜ5²…€3Nc7ÇóRš&î\‘¾HÀÏ.ö’tN]\Ÿ?A¯ºóâœËùü¼C%40òU€ù6¸-‹Á)ÀWÛsÃ{(Y$7¦Äõ<–rqöOZ×lU¦VÄW‹M[%¨—üÆo±[áÑ>+MkÏð—¬Ë+œ©ÔåÔOƒª(þ è8äŦFd´ ¹0éí=r´]lÐ…*FA€™§'$›oô8Reñz-Éœ9Æ ÿ-Qåøç)´;„¸ˆÛmî8 Åµ“" kÜAÞLŸèUL†Ûo½'¼ €.‚Y=-ÇZðz‚˜cäH Ìõ?òH´‘œÏèXå½ »ó²nòõÑ$ÉQj¡ ¡ùÁm"•˜)osÆ–ÄwSí3/+>%h?G=7/Z?ƒ'™‹Ž ºß™w!ö°LÄ^Äú¨®÷!v8¬j}šH5í.d%òÿôRJf "èùþ<1ÝtW€e|Í@z´t6ó­×½ èÄÐll&!òÏÚh]îè“ I%¿FfÒßË}Í;€¥ä] ‘*ÝßI¨Ò…*ÏŠnꃋ½÷üÙGÅŒL7Í ¥ŸöH8£ýyÛ/׺€¥uõ×G¾wh[Dae“ä®pæbÚ ¢S¥qX;VÐlõБ•ùaXJ6Ú¬u‡22³%ß±?MæÊöX ºfso²ò.Þ`X죋]?ªë«|HT[IY¬@ÌÔð,ŸÕ|Û5“ð1tézV‘aÕÈ7âõw€¯9”—'è•6duŠ{izÀ£©M;†¥r{i÷vP\¢uµÓ“¿2d*’(ó2¯ê(-òCô`ÞÉTdýÛDª¥I¨÷‹ÕÖi5€ñ'ó ºÃÒ‹­×ðöE·ûè}¤>ê  ‡‘c~ Yã[1Q€ôRÙ¿ÍnÇhÔ»ŽaâQ˜<å3IðDY)YKªhýï®)“;!®ˆA»Ãb{Ⱥöœ †€NÓº:Í=$犌؄§ïZ§–O0ä¼ga…C²Qg‘'Æzíãlúát3hj¶û?¼¾ƒ¦ Fþ›õ4ïïíVâ¯t“” ÕxºLã’7Í…•IôˆŠOež$_z"!®ÙŒóÔn{I†‚¢E?yÚlϺüAðG 1–u­©‹V>µ´¤æU"ã6Ôrß=(9Ùž³¬ JµlünŽZà¨Ïúä]«ŒW@­Y‚žO>’°ýÑÅîõc]•Ä7Üèb?¦þk]‡d^@tUö+‘jÑlF æ­kí¼C´æ²*ÛAnËìux*ñ„ïú°÷¢Q×i]ý|x)÷îtWëÑ(]¾B»›,I”¹­ë¤áÅÅLÞÛ¸÷xÞ¡ë:²È[@%}d¿æª¢}GsãÅú¬ì“fUÙë›§û¦Èè$•4+yÂwM‰©ÕU/JmÉJàÆ¼HvfЩMRíSÔ&H¦HÄ=cý´þ×\ò]plVôÙ5I/=¡¡ÍvrÅU™°0].‚ÌmÚ`°H¹¤ÛÇ*‡BÖh"%‰JP,/‘¨žÃÁË‚CH¯¶CVéÝûê“íë;in4›6êü$T뫳T@"LÊ«YMï64óv€ÑÖŒºAi•rW±§˜C0#Šø¿î':s‰ŒòRíOé•@/I”,ùÉÝà‘©Ù9ó“wíoÞ5’N1²ÿ. Ï»Ò/jÃö¦×ãñ‰EdÄÚN£ïSD„sæÐ#(êk&a˜¢Îj$¿:J»š¸Ga IæatöJ´"ô ú ÔS´Çv­kä¶:¬kMÑWºïkÊê÷>â:ZÛ³úu(I5CãŒ}¬Sº’0w’ÉL ”Ek-4« eµ·O ÕJçOz39²qÎ'Ðz>üaå5³ÿп›4µÕ?f\¬|Ìaœ”îˆÉËNÝ ÿGËR4(`ìþJê§½&/°#˜·ƒ£®*ÀŠÆ‹òš³× ¬dTÙ\Ÿô¬/)ïšTX y¢ú%Ÿ„:5ÇVЬËìk]cªvbü ¶UËÍnÎz­ËþdVÁ„z¦½~|×ìbOPe‘ï’5f-Mã¿i©û)S‡5ã¨+ËàGköšn@‚rœÆü¶@c2¯#nN §š‰¿ïW˜<‚gQY½µ<ö1VØ’ø˜ª&1Ý)H„ÖNÂÅ¢È%PNMÉB¹«™Â0À™bý®  ICä-còÏ*îÈ99ïPµŠ•ÐVU¨®9V@GÂ&ñ]Üú9âñŠ}™ø•9 Ô6þn-ëÊ‹k]Ó> "+º¨•Ä‹¤e‹éû£º~²³†W1L£·³>J.^Ï~ÆuûBt“έKBȲwuéÅ‹¬ËëÔDÉÌÐdòæ ­ÈŠßcûÓ‡­D»›øC‰¼ #*BœÚÛW„¡ËáaŽÖK˜äëÅÈi': p•ÁYË%ñguÞ¼î¥ø½ËóPyÉaã㺒TxxÉFìó3 ÇWJÙ¯¿ 5Hß_6ÛŸüùSýâE‰NaÌâ?õ¹•ò"£) 뫾,¤ §}À ÈÏÀRˆ÷Ï’5™ñƒUY Ïã5òÅT¾«ìšÁþ7ôL„c7-­ &Äi"fìÌ÷Q”Ѻ Õ» EfSU»AÎÐu›„‹a¶e²\?¿üt8Xc° ®­J·¶—=Nke˜Ä¢ ó. š!5[ù]xa讼Ô‹µºF‹Å+Æ+OyH!}¥ÿfþhwþ#ÏÇŒ¶-…S&de„þÏÉßeA„Í¿TžÀC¿t˜«ÓwÙ[¢{Ö•@X×Q>ë:Emü±–L͌ɼ˓½NR5P5ØÓTŽÕƒJ´ ¬çA:An«ëc]fél0ž®2tÏhûA±¯TN¾$Y¨àjTý^›5mø/Ö¯ˆmʨ†°O/]·{ToÄ6Ûä0Pèâ·›>” øexW&•§qN)a¬µ›Eº? Ã€å‰H¡»!ãÕzÂÏ6¹½ƒ¡'Ü€N[yÚLúõ‡:?Öu¦²zÐ,Tú.ª×ÁwÕ:Ù‘ðm+2žõR{Â)¡õÜ*ºÖ%Š×ÍŽÙµ®^>Kò­™ðé¶—Z\…ó‚ÈKÆGu}¬©nª§MêHئìžEë˜/½ŽÌLñè÷ƒiEFÛ¬:‘´;½ÊtJ>¡pP)d\ˆëƒ>+£«#áuXc0pý%òÁv-ÆÃY¶&tg\ýŸ—(¶ñaV|PuQOªæh ˆûU²å}7Bòv˜h6£I‚oYéúSa¼Æ:’ÄsÆÄnÞ>y%+/ä'ºŒµi¼ ¬öžÚIÁPŠ®´o¿ë´)õOÓP¹-ɉw¨–&z'xTEƾU&βŒÁ #¨Æ)º]sbèé>1ÐÆŸt6¨3 ×$‰8„7’ûm¤>HE¤øâçO­øêâCv˜†h/<Œ|º©¶‡~ÏSmµ`g-Ÿ{o3FF 3TØ 9%ßQýŸ¤‹e…1Ól¨qïq[:,mOÍ5õϼgH¡;…‹"ÐNú}ÿv*J%ÖŒÃzñb¨ Û‚Ç…?Áþ/Ó3ÏeR#+ºáE-X(Új°4ÎQÕ¹?¢AåI¯\„µÈù ’QB‚b¹1rà+%´ŽY÷õt!¶­·ú)aöô k¹453«ÜZyØ{Y3"8˺¬ &\ûI³‡Dîíí;ü\îAjÉYû˜aZz(°éË'­"ò§5—œÍÈñÊo,%<ñ¹XÍ·TÔ}±Í O^tšìHôØV?é”<}^øå÷v«d¾¿±MØÈ9²ýy™ ž9ÄrcZ@¿uþ¤Ž)u·§IS0£óv·Ù´Bkª:׬›BÝ곎ù™o7K©ÓÐSØ¥€Ç?iœõLj{Süb‡¾Ë¿„†Žvî§»@j°Ñ°j³}ò®Óì½ü›ò](ä»%00˜HŠì@qUñ-ï²2³AEÛˆ-FøH— ¨k€D)]$Ñ£Šæ¹ªÖ€™Á"F7üQàÜ*/Ö°Êè…>­Æ#BŠdÍ•‹Gè±½È8‚aI•!¥Ìa’ÕR ô"즗¦„ÌÀX-E©A´Hÿ‚{·ASC£åÅzëuíò’ÜÔöÞ.ÃÒ5<«ÙMEë©ÏŠÝ[z5¿ƒKuw~ºƒe׬9Lm2L.2ú_Ù¶Lä;d ÔMõ•u˜;]ap ç”é–ÎÏ>OöÊê±'ßµ¨g‚ÜáhøSÏR¢‹Ê‰¾k=Zßk]žæJ|ÇÓÜ„EìXqWÛ}¦„Ð ûŒm*”µGrp êé}\Ïsf"íí”IÇã:©˜=‚ÕuкV™Pa–;³ l&ò‹géS™ lѽȓkÍJ  {R¬qÈÌ LC:òØqÚ+\¢°{»=[ªá¼~§²vcG>.*Õâcò½5ùþô{Š€ck±ß5?YA†˜Ï@æ›_P¡Ê¡8°" §5ö èÈ †GÀDyâåϺzQ¯¾Íb†uqc “‚žöÒÿñǘ²mجG ÓUêb0Ü{~˜_·ã «ò)ô.3 Ý¡A?„á]“A­t6Ni‰’ÿçó¨Tßtó*·Z­pTy Æô’wÀËÜ9tÜqâX6{38ÈÝÕ,¾ ó¬g€A[F/À¼wú;ô8©ÚÐ…’èA<֜߇lÔJ$Ò€.9½½¶Ê‡îVZ8*žáí@Y°s†¶'–íCß5_úy­«³9ôwLw¢:#2Îý½ž"cßã£dfMþe Ž;3Ý|†‰èAT¶?!qÅ%3 Œ¨¨qBöRûü ʼÅé\JÃËMñŸr1áš±^Òw]‘ó“6äµDÚEŠÏ LâÓX!ÕNt+Ö1zB.°Ú¶$4 þ.öêÏ׺ü…-å]óQê´/®þYW;´.O Y*2Ÿ˜áÕÅ.|õD¼œn32ìÒ]¹ëîrÂiûцÊÏà¥xe7nFü㊑§9S퉲?¾ëÁ+ŸuÍ¡rŒœÔ‹Y)ˆûó±.O9“š&J4ᛡº.ë5w‚ÀzjÙzŒÙOûø®Çÿ{}ױ݆²hgÔm­HPÑ­Å4¼æ#~0}KÉ»2¸;mcÔœñýýÁâÅzµ{±g‹€óŸÂ¼«Ÿz˜¬µS„ž(•ÎÔ€«Ï."„)ÎV¢ \-ÀúZ “vvfõ†}€4” M?ñ¸ÖÒBÝ{3hz€1U 3¸AMsŒ1³<·WgŽ,úŽT×msZñ+ oÀ…ÚfEbX>Zü²°}EFb\¢ßU²ÐãiáÄd„ï“kZ€;êl€Ãr»Ï€¢qÎ8»Ô,FðÞªïn£(2Ö¢&þy³ÉäªôÞe]^qZWcoÚFm„;€è”bÅD;Ò`¦™ã“wu"p°ªZÒ>wh•ÎJ’  è˜²Ç M–o ˆ*&b“aÒ]@ÚP‘:##”$ij~È2É a´ÕÏäí Ôó.l‘02Bk“5ã˜7×ÎÈÈ  ^ûªádµù®óQ]çCìy¶Ž%£}[¯°%ñ?DëjkQAyöêk͉mà»8… ŒuÆÌ¸Pö»ü•o­·J¨ùÎ^(´R¨˜ÖxËœ'¶Ój0Š¿yàkP­¾™Af”‰¼=‹kj#3›`èrqý2ÙU¾?¸+ûÜ ËjÁ U†:så’èïßrÀïB/bô‹ñ–ª’°²mÑ'ôÏŸxr½­«Œ~è®ÐŠ¡Aí¾;}W³Ý>½Š~hjÝVÂn+,Q°¨Ø?ppµ°ù… [m µ#õ¬ñø»óAMÅ 0ùòüAcIÈçm”h©! ¨Ø=>ØÔöÑ]ì‡L ´á¦ŽD%Uô»(°3÷_©"CÝ]Ø¿^|Wy2Sv£;«¨#u"&ÿfLÐÕ{ý®±Ôà°“á¶>—®ýv¯ö•ïeDΪãì¯ïÛ ²E 𔥫üë[.Î?i;ºØ–E_»²«½f"PC¿©)Õ2ËÛÁï×TmyNò箩Õ܉ B±Œ^úÏl!ôpÀlqM™5¨¿ùÛëmEÁ¥ ÷á¼jMYˆÝÒè.TA¹Âe¦“„~Ñü’Ô"š_Ì»ÜQ¶˜'…Ècнr?zÂ…)¾•TfTkÐ=ˆÍÌéëe_ |i“m¨2š¨žƒenÔ¨ páìþÄ¿y"Ÿã-iHtÞFÏuWkæ½wìŒjŠÝ›&%ûµ>r±iÃUíy,Ô}÷kÒjæ!65ÿÓzÿ¹‘èÊÖ´·û% *ïÕ„èM#'Ðúj1í%)·›Zz® ÂéŽÔ¶ ljüb–Ú¤è×IßUžNÉÛ Zë#pT²ü Ù½žêŸÁD½,É-÷û &S|H# JøxÑ_˜LŽƒxú3,¯ú€6·ÚÛËíIúE\=2NÂýÊ:BfÔ^>K<þ Êg¸4vFÁ'Ïs¬Ñ'•ïŒèœYt;dŸ­¢’¸å›¤»‚ÂŽ)E<=%Ó¡2Iˆ òY“)™t{t(·kàAS.®ž “ø¨W=䆲3Wq&k¨Ó;q·Ï¦#÷^zž$¸–è ½X^ôÀ…¨Nät/¼ß`Xj.ÄNÂGîq´þ;ï“PW¤Z#y}g Æs[Ö<-LÞⓤÛu½ô®áœdý¬ŸÕFäsˆhØ'áÙüŠ6b†SàgHY‚Xòd„îTãz$†D§ÑšÕÉèe /¾y ØKç¿Hûc¬Ý„¬u<Ï(Ã*ò PïÒº ¥Ì?¬ï>j³ÜvörRX˜Ø +ò/«UeÞ'‡ñQM-ÏüÖçUãE«Sñ¯Œº¸¨=SN±á赋íqHä(îµ%::K×­ Ï'‘//Ö÷ç$?¼›Í ö–îj=Èýån}™Ûåqyª×ºZ£ïÒ1©ÐµšÂ7x󳆹µP«åu¸^ì™Úi.}*?óAûkp–„"} Yã©WŒðÒ‡:fã˜(å‘i1»£uAƒ?)O1»=˜~ÍÏ€%]ª„,KÐÞ¥ŸœàÀPåd¡:s°‹È¿>På}Ô¾>ç»âpšz¡õÉ/g‘WµHë9¹Öþ‘(±*+ãñÖžb@ñ|ìèÓ¹_)Ïü6á÷#„»æiÀžÇµ²QO‘uÕ2µlƒš“t àÚˆÀÁgØâevì¡ØêUެ …I€IÕÒ¯…;Apü&ž6=öÇ*–®µ»V¶mòÍ¢áÙØú•ö)2¼Sr-Š í¬Õ2sºÚ èž“ ¤Ñ¥ò;ð±Õø@ÛÈö‹=-˜[{´™í¨:χ bM uTëÌÅZ`Kæ]¥-"pv Qè®:iºÑÏë9ª†M[¥Þ¦¥í™d°ƒ×¤Ç÷;Oe ix[¹T‹å•žJ_®u‘ÅøÍ’>³½DDÒo–Öèbeª©wýsÛó‰-ÜÐMCibkE¼ÊMãØ¯¼ †{»±· Í{j“Ú—øÉÚÚלoå÷ÓqW¿’Žœ(òrã3¨(MƒÐ¼`}6aìó5ò¦ “ªÝÁõu+JÕÒ´Ä3,é^bY¥¹í!|˺ÚSõ¸ÅU–[ÞJĶ×*2/~jŒbwì-ņÉJ}F a‘•ÖåµeÚhjêGuͯW&¢Udâ ­½ÚãöB7 ÅœN€M2 ¡uÑöNb.”QGèÐE²9[[Æ”è¥Ù‡ètŽ#ÔíŸHË"…ìM ,…NÒ¶Ìtóvã-o^Ïê?áÝ è*—$k ®d=´Rˆ<Ö ;O:šC¬-ÝXs‚RŸ]úÑ*­Е´.øÏ­E賎ñ"Ëü{»³?ºí}ø‘fkJ”<{ɽµ~¦í.ØG™)þ{|âM-ˆ{YyéØ*bª…n#Hw@q@kLZ„nh©ÞÚƒþ ¥©­Y¤¼yl'Ó;dàŸðÆ,þ!ìÕÐeVÿ²/æo½Ûâ>c4DØ[{öó¢T彃9WÖU¹OÛ&kɳ®U>L6&ã{YŸ%¥Ay”8$þÇk¶Þ@ìܔ̒…ìÎáD½Ûê,ÑüÈîÜÉf¯ΦýCâÀøâª PM7´öùÌ–&u=k$Ý~ɇ׾4Ž´á¡¨Ü¸µ3é¨j`¼":V¡KºÁ ~uÖ·e± ?¥ùÓkKv¸›í45÷‘©ä‚Š/%v£âkÔ BÉ7ò&±Lã@'¼%ãö]˜æ´Ù5#êg~Ò8«s祢îhj‘Ì~ÄF2³¦H~#äi+¥Y]‘ýIÍ7’¹|õ=ŽñìúíÒÜã f¶wœ1RKªª(°L|½ý ßBì|´ É´í,8x´¦hð•„1Û[,H}žN«i½çÉŒê´|xjæÎŽçi®w`ñ޳Ñf>eOÔãª!LÉ=¢ñ4“œgÄ>‚´6h˜÷´Ê (25ûOmS^­Q@…µ‚××$±cu¦X˜@æûC›&Y÷1!8M¢ zÈwÕ‘\x¸8çР@IFƒj5i£y²?¤'krÆüdÍ=FYž‘¹HpÝ£¦2žŠv‡vßìùˆÁBñeæ[RÏ÷çg'ßßã}áÓ/ç“^×÷ð_G©5-8{¢¥ÎS=åÃËìg„è…s$3–4Îv±ítJÝšdAÚÙ“…-fæ™›jÖ$KŠNÃkÓÖQZ•IfDO×õö+ç–®Ä(Sqmוû¡®˜´ö¨F–hîAßG”ÂFWò¨ÛÒÓîf¥²6ÌJ¹+°\<}£ŸËDHy¢ƒúÈøÒ>üÉ\“å-À×¼÷ùf`Ñ»g?/Öӳƶ‰t‚ vËÈvêžÖ…Eã®þR–{Ò1³ÏWvÖÌpºÀ9›Þý’sh„kíÌ*b ²§HÏ 1X:ÐX³n}3CÙiT;^›ÌÛM°ä½ƒZh'ïHInÙ#™;¡ç]MÔúú²õ, %ôëT£÷Cëj¦ä$ºCÍždý35z‘.&ûG‘‚»ÂƬ×k›š¾ øQ“ô¦<ë‡Kß`Ä-ƒ²ÌL»+OËàšV÷h’ ò÷vOáü¤[ʤπÒ'E)³BTö™CÅÀ=8±Q>Ê'Õï5£#±/ÕÑ•[=WäjœÕÚ‡^L/RÐóÔöðÍ"€îô¨F^X¡dSĨ–=oÌëÈÙ=c ØÙç½=NÕD¢ЉÁ˜Ïõèœâ”Ÿ+]@ ù3‰ Ç’°HÙ'e3þI&öm ªuÂ<*]‰ëŸK«u6íRÅÝ#÷T­«4>=W—:æì­ò'ØÌ÷‡’/åráãRï*ìn¥ ì®öI»ÃB/P$¦uEgJý,r|é~¬$:¡n ½¦öÕÀìg¥ïB—"!aPÒ·móÑí6$b»wI}F™ãv®>£'Ä’c6¾2HŽðežZ%Ö8ÞP<.ÖG×Gnz?täé_!žøG½ILÔýN§ y˜ÜYÑMM1CL_ úÒpV|7×i(§®4µ ðKÛGU¶ÞÒ~ðiÜìßîåml_1íz/W¹ ¤×ñGßáv¬í%Jvÿr£:Sh=èÅ3ÈÕ iÎP»Q¤tx£”Á‹ÕjZšC]òÄniUæ0ckL3*íÓ£ZúO<Ȳh#£}f««@^Fåwl„¤Jo +SăqëÓ»Ž#ÒRS,ÝwÇúZŽ…‚Å:K¯Lº®ÈXÖÇîÚ–6â8= ¬¿« ÁÍu²EFÝÓ¡1SGàïâƒh5î\L‰Ò4Ké1t.êáE)û£wVå†L´.´óvs…ZG°¿»ÊOp—bÚˆ7TÛu6ûÖïv[™íéׇVÊIíqˆÔ'öüH)‘|'ßõ‹È›ï4ßÞø/KJôÒxÝ€.WX‡}Bð˜2Ö=S.7Ð ¦å¸cësÑR´2:í¥ð's}oVa@À»q/ P6ŸÐs,w\•Ý¡ê “¡)ÞöŽƒnw—þAkBÔ¿ù©ÇA[×”Ó?)p´ÈmƒyW|¿ÅWëßO WGšÆÆÇ‹õº÷½ÅŠ×ë­©7p=OQ([#Å1\xJ\/^RGàÏëÈìzV—ï9€º¥=ÍôhÍ•Ýø„ì"/íçïî`7 ÊMw¶|ÆP§ ˜t¥#§Y£ •š_ A¥}ÀˆfKiœc r¿ÿ‘&-tÄ—¼] —É´–é^Œˆ;ÖmÕþôtÿ¦¿/ûäÇ’ÕòÙ(ƒ‰þ4ín¡§<8\E½}V»û¨OqÂnn›ÚñqF¤< įha®ˆ|gì‰ï÷‘js)”•"muÏ´”¡/CÙê™J”Žô‰ÁPw¤ÐieIýlü‰g½ª%æiÛÏÕÍ ÞÓ ²7ÌŸ´;˜õý#ôvžp¦Ý$ìêèØ“¨ŒŒÇnþJ°²é“ ʪö™Ç‘ÍB³NÈ1gì•‘qWÊ=vò?½nÀþ(°yH(*ŒbÅQ1LC?¿1¾™8³ŠŒØ“¢IbV&S;%kÆošæë7ìeM%xÈ–ú—Ýfç{>æàµH––=R|5%ÏË$#2.ëño=jý{ÑŽê:õ©[K߇ÿ¦Ì6?Æ:(›Ûê2ê²ò\ÅAH©Sø;[•vW7_ƒÙy¦‡bÈ–ý}ÒÔúC÷ܬޓŠL¨67f#´¡d‹¸¯b×Áô¥dˆz³–*¹cÈòð=÷¹ePØKz†‚.ÆH'Záì—„°Oú¡ÐÛIwŽ S·00Ö£ áa¾5Kë¶&¹ÀÚ3M S«Ÿ/»¬°ñÔ¨× þ >Öåå­’22‘&šYÓI¹êh\4J°c·x'éÂ_lë¥uáûõLãðýZæûYÞ¼€eçE}ŒkÏX¿F íššçÝ…Y!Z ÁM …t‘Ùd]}*k¯PÕeVï‡q¦umUE Œk^‰ÙkÏ«@S‹Ó#иd( lj¾g”[ÜóF18Õ¼La‘ÛxZKBèçæí ²ÒCl•– µœªŽÄ~ ßñ Öi(¨ØËÌægG†×ÜÒTY¼=ïבøÌ"Ú¹å­Ý.é…¯eG"]ax†<ø¸•~:UZPø\y€y³‹U'tú:¼Ø%‡ÁAQȶæ½;`Âû” kIýèNK×ÛxÕäÝÍ^;ÏKõc]žˆºµÎiFŒ[gÚ]D¼ý2Ó0¨ªFÏPU)ççl[Ÿ §AŸäÇ·' EUU«¨–Öé_{…Ѻb˜\¨œ²ßµCv(Ía£»ð3Êb(¨È«%Û/覾$3î}2ñuSkW+ ¨$uS=i:ùýÆdi 2ÒKx»©ë0 oÁqÇFÁ°•y|Ùz À²¦^¨×ZÙÚh¸PL Ô–Ž¬}Ë”y÷”G:Ô²ÿP‘ÅiŒ|³*i#ë?û Cï#9Yg“'¶¹7]\±Ô¤þ ¢áõÉ+³×S³ÄË_Ø7ýQƒv-jì1ò’·hzÏv/RÌvWØÊú`s“t¦dÀì×|éW§K%ÚèÒñcn4ðòÐg9 ZÓöbWÓî–òDqQ>K Õ>‚Yþ€(÷xà5~÷ ÿ9Ö'scHû<Áõ`i]È»Ò0çÏeK'ü1iþK’`/kQˆ> ´^ûÌ ëH}Yá½èŸ-{èí¾Ÿ(‹r’°‘ Ïs5qýÄM~îžUõ݇›‹Í“ù8YßQÚÓXs´9–êÖa›Ž =ͱéA§ä^H GiÕäú©ÌlܽHàØó®xP™?ÚÐg³¹S졵\ÿ¨…†‚ iYW‚? Ð3kù,öz­Dƒ>F8J%w]˜d® x¡¢pº©¬<0½›þö:ŸÝ{ý'ö”Áìc«ÜªFÔÈpvíj¹} Ÿ‡î‹VŒ¦WÒAÎ/„F$¯D¶Å{~5‰zSì!ÞM{Â"×ö’w3¤x3cÒÛÛyݸ'juÝÚ|óž»lp }×|¨²›†Ã°È;o«öz¨Ù 3o¯2¶‚ÜÆ÷âA·jùöÔQøb ÃñAà|•:5®¤Š'K¥ÆYìî%ÙÀd@(ì|”a‘_À1˜p?Û]¡n‡´‚ Ðî%yTÓ÷[ ú–0ÖS`¯êš%¿ÝT1?>›ðÀ# î°?»ZþK‰gEEô…ûÕ¶“Þ‘p¿ÐXQ‚Ò‘- i„{$oc|†¾¢%ü=¬‹qÛÄKPM*ý)TŽ Ð!É"a Ð*6·1‚®o8u ²,£Zl ²Œ2cƒèAöƒ=˜µ<lh7æÍè~ ‰ õF"Þ ¶Ñ®Krˆ€`ñn?!3þ6-IÍ¢ÁŸKÑ\˜¢Øýƒ ÌöÄ…È{@ÐNI¥n¼öžŸ§Â-_A%‘m@]ÆÔ}”Iô`ðìmZÔüô/ œ%öÏëµNƒÊ¥Å¸p«#Fßâ¤I¢®k‰³ Â;™¤•½†î½„ +í-=8û=X«6©Aë#”Åü²äŸ£hZÞÊS¢MspqÙ~é!ë¢nR·g=Ö¸8•óÓúŒ1\ÎBlLfÞ€Ñ*È•Gq~»©Ö>ÈçÞEvÆ´¡vŠŽ'Å#~¯mbS1Nrß ÿIÚxÖ$ ôY)çw ‘‡9¬u]Äþ:šmÚµˆ¾F2CE[Õnc-˜¸°©í öÌAk\ b"ò;‡¼À2—oW{›¸ÐS¦Ø¥Û!ÚìsáA\.γ}¯Ý ‘‡½Õ¹¿æ.À„7„+ôª¶ÆGÍ2FŒQXëdŒòL¤Ñ ÐoæûóŒU›:g®”Ÿ@×ÀHy8éfãbÊ>AÖÅ]e‚˜Á©´y;k ×챚D–Áä˯tVOË… ½¬b±æÄmšv‚ì¯ Ô"É*z\,çpylͽ3”E×N[¨·-/êëèÆíŒº™h­Ö%²¤ZØÀR¹ƒ‘»3‚Ã̬«ZtdæE+Èl§u¼¨«ÕŽåÄ€ÖlþÅÍLZÙµ Â-¡U ÊŸ„fÇ›%½ŒFô'>¸)óöyè*lSƒÍšzö9W¿›LJ²MŸIʳ£ÐÜyá·1nCtÛ$é.íT~?÷zøÊ›„b¬%ªŒ¬m”zé@ýÙŽi¸Gc)¢õŸ»ô!ª#fn wyÿ;ÚtÄ4yç*§H\¡ÖVŒZIÈ=L­, ¨×>ëåKuÁ²ÑUšì·zKÐÍ4V"jHRú»~–=›»ê ·'µŽà¥|²¦ËÞ|J¼©(n[±b´éF¥¢VüŠvÁîgùšmð5¯Tü4¨VÕ^.$¸Üªp]ì%>ðJÜh}ôéI)5 QAP?dPu‹Æz®®ž†[¢u[϶XËFH8rÄ £»nÊSF¿ë×£=îžð5éÓÿ‚Ãï£VUg2`FŒz„w!ÌP˜ æ!‰ód n -Cä=åTqÀµq¤ ‹5oÕõ¨¼EGB<ñ’Ökñ;!+„û˜‘yÕÊ­ àc[v}v.søãe¾:™ÿ,Ð`<ÜÜk%2[ÆDE øˆj¼j¾Ì>˜ža=ù³Îï¥å‡G¢ö*ÒO†>B³À)æijf%y¹„¿þ.y$º~ÏãHòÚÇ„µò œÙ¥Á0ÚVñË]|SÄj½­à@fíK ±i(ž-ŠTÂRŸêŽ-ëz¤Q‚v‰ZµiÒc/&8ê¡Pàgrµ4¸wYĆÌoS²fG;k§ÏC¯Ö¾ê!++oƒã+ äu¯h üií¿Ì’ûÄ1èh‰ã;ȯsxc-Zá&zÚu§åšSì£6¹+wjJÃý\e2ƒžF~º*êVÂÞ’¨6JÐ-ë‚­ÒlÖÛ­¹L7ƒ"ÄAöøÑŒ_õOð?ñGcž¬KI5 ät‡„*º’êúy=øËƒ}pfÇué{Þ´®]L†r&©¡Qöܱ×ãÀ©GoÝî|¤jtq^"$…x$Å.€V™ûaCŒÉZóZG%èI>¿¨uK:(|Ôóñ]ñSJæ9´ÎUÏÁKô[Ž ËJuº«®}÷úÕ.‹lVëüGò!ÑÓOöó‹žÏ¬) ò A´˜œÖ¿—Ää öGk©2­k¯<_A Ÿì8ÁË•˜!;ijxªy»è5Ú'’B™Ú*)øyèÕî险„ãïè³ÓÕ§(‘Üp“õ¦‰,°÷dÃû#¡J\ÌÉoŸT¿n!zHcÝuHLÍ_³¨œü }$Ø×¢FÖ gÊúÁïö¡Jm”Fº é3®½EˆS_"÷áLÙ¿§2ÙàÃÄÊž †ªƒcgì!Xâ‚1æ ëÑÅæí¢|bñü€Â> H¸ óî_­#5„â•ý¢g“Y&%&g3‡$0¼§¼»ÜÁŸl¾繓Ø9¸¸/ç×ÏÛæ>2I/ÞäãÖ‡]+#ï°_%Þ¯¼tÿ°Ã¹ÇLæÜ 'œm’*µ`xî Í/K²$l_×-ëB3Žwñàñ|MÑ2¹gU˜„Bç'fÞ†àe‡s‡™K3ÙI_QÅ;\Õj«¸?Æ@e, ™n­¢¡°¤ŒÎ^šPžDkß]c"?NÑÆà±œ7®Ü÷§fñTÃă…™³«¾Rú齓5úòª1DYíÉÎîê|ˆ¾Ë~š8¿!œÜnuOòw¬>ÅBnow™-GoI“˜÷Çáͧëú˜çV†I”“0íêé¹^¬dȧ€=ºº@Ï×tWh ã…½^èý‰5æ]õÑå(¤îw4F»dŒ½«Lã°ÀŸÔ±è 658΢œ: AC„µ,±ò¢z ©â"oªZaã ‘¿n?©1åÏßj~«jdy ÝiPÙÓ¿©Vû¦Z½©ý µ\o…$ãP«ÁŽìW.„„ÃÜ}6‰'©€„[¾kŸ©( ©MwÕ©†Ðƒß±ç…ʦïB2”Y}þÈ­¡$+\©;ë®04²4ãës0Q <©6aÜ—Òº ûMwš!þh7ÿM}5ìÏ3ÉCƒ‚¦Ž¬kTå]»¶ͳͮztÞ¥·k]°”–/Ý«ž¢$ìP ÆÌØeú(èòÙå=åÖÎp¬´.õi¹;È'³f •ò`±`iRreÍ 7bõ4¼Í7‹¡ãë]’f-™_ƒíú#¼ÑÛÞ¼ðè rpÏÖ ­Ë}5XJ& ÊÅÄMš=ÞMø®Çõp­‹bGxÍílzPUå$†[]ÖU5<€F¥u=zê›âCv]ÖeU\°OáˆÜhÔÏ«›‰QaVß( yËÄÁ`Xv×”Ð#r¶õسɚ L¶ñ-h±õÿL Ï#ꈲüˆDYýì[,•ç;®#Íeàc¥]†>³&¨ü¤±Å\ª jž¼…v ñ¢-U ½Í%ƒ“¬T³€*‹¥¼”5FMƒmH)c×¹™jõÝ> -]|õ¨jeÂï–Ûi6hq©§±†Ñw©K!êÕ7ïZM…»Q1®-V;ˆƒqðéÇê;,-_½õ•Y5‘ž¸ç„|e‚|@$\÷Í…¬‹jja]2š)‰Ïý.EF™ò]c’s€ÔÖ þ’Åzà:ºŠö¤`®u¡ÙÄ®¶Ç˜+¦tò}φxqjߊŒcÔ4ÖefGûT]¾ËÝÂ{üF¸z‹,±Ò{"­©RŠyì£2ùßm©€®²úº«ˆx¡ÕÀöÄlhÈyÑ‘yÑ™Æz°Ö’­Ç;Ìî„»2FF÷\bT­ue†È˜Ìew¨[yW*}]ëj&:°ª4n‡ÈëǺ&ñ¿¡-Û±fȾCYGP˜iD8\õOEFlc0ï‚¥´´®~(6 ^ʤ㋆| ¬Ì‹/IõÏ)’fÀÕ@]Ÿ6ú~4¨R« ÃþꙆك>Î«ÛÆK §ÝŸ7Áöø×î;ŸF]” C:yþ½ã_+š 1¼É‹F7Ñæ4uS½R=4(KQÜ0([Ra¬ìôݦHvÙbvGëZ!fÀš±ö„òÞ yòÆá Ƀ)U‹vÓ¸´®þ}·- v,Êq‚åŽ:©MB…jŸï:j¸Ÿ7Ÿ¿ôu5ŠUÁ™îä¾Jt¢Û-%#ƒ ¢~¤?×JG¶S7zõwŸñq>Ï#ŨÒñ¢—¢NØxÜŠ×Å•*žh/M©µ’¡‡V2gZ¡Y:„XsJÖotRøëQß÷w ¤ãi6þÁ'+>¯ÿe]e¬OÖ4wáûy;äPCõ_[CDôîwd’eÌTçCèIáðÀœvz°×Bò%Ð}ŒˆÆý®,á#™Õ»§oŒŒPEþdõsˆäTL<ˆîk­nöêC[ v°ú0Ù–ÞÕ}àÙvÇ’' ¥ëÛǺJË„Á.àùJ@@ ËŒŽì4K(!tžJÒñÅÎ=«Ó€ÜKvÏøb²æ784(ÿz¦Gï™7ÿ†¤Õö[eyÞo‰ ¼?¿aÒ#Yf³¬’KÜõ’[«S²‰‰Ž¼qm~zðÀrÓ \%m—ÿü=ëÞZ•4¨éþ“iÎzÛ&o\>9vïíÈFVTØ‘‡hå´®MÕ`XWi"Pë˜ú]Ç–ˆ0dRd\å3—EX—ïÚ@rÒö]뚺pK“N?“™Ö»{BB€„H–Â`“–µ€îö|wÙ>ƒumA]K*y†uÍ&+/Ñ%lm!#TäµþÏ9 ´~£+àëÉ‹2,çOë%uk(¹,2Šã3téAYÏ ù_à&¥åÉ{µž@õµ®7}ÖuDr_GÿZ¥;º$Cꟷ“9EÒ,V‡Öå>ûȺ¬+ÕJ"­~QD•ÁºÆøø.ûÐAÛCQ¦uå?‚uÙùú®©n*"#“íY’s="c·éÔ¤¤ Ìv}׫Êî$¨¥vnlöIƒrJUd´HHDxPѶ4VTûèaœ: {­å3ÒžF«±‡P¹&t:û];7ñÚ¯7˜x3Ì:xÿ8Ö5*»ˆ‚ÜäzkE ÒºÖ’Áðc5îȺ"ãkygd|SǸ÷6U†žh8évÒ‘µÔѹÚ-ø.€ÞÊdd„|[\«Q…±_¶º©µ%2¶ç“söåˆëú0ÆÖ7E{Ö5¹1Öõ©Gùê3SÞµ>Sl ä‰:ÆÆ¡zõ^“¥»x#âlÚš‡ÁQw¥AÁÀ"Ó*êH´>?°ˆ²ëg¤Ý•„ùãVO»>/®E5’’…1œ<µò3+cõ.M­¿)ïŒÖ"ã˜fR v?£Å) ºSW“RÃÑßÿ†w]úeõíë ß[º>n}¼_+”ª!YÁ¬Е4‡Á’ÜkN5!öY‚ãxzvgˆÀ?¿Öåõ“w%Ó{XW´ðùƒ¬k'“OXWl¡£ V͸ÏVÞ%Q?Tª!™ßS­þ²úßù$òm}"^Ý2÷;‹¼hEÍfQ˜éަ4#‚j7gDøì„ÙÞ[Yý|Ä·;·f˜””wÍ=Óº°‹Ý6sÖ’ŽìG–)«‡F{¡ês,„Ç5—×¶ì“ü_ üëH â¢Å%%—ùH^uJã¬>–üÛ‘X$wÇLæÕÞcÑÚ‡þ¾wé3¢SGBÙ:º©;ûä°®Ý>ªë½Odl Õ»‹;‰r¾¾ëCuÛºÊDCÚÛYAäXöñ]c¤¦QpGÖÌÏV ÏZº«Ú§<@Õ«š™†Ï+ŽU²N§Ô×úŒnʨü5/3«%K!ä6±âJ1ôèU458@hôn§>ŸÈ'¥Äsh›–±b¶'ª¥¾Ñ%ÎÙ¼¨­Z$µ;o7µoiðAAˆîÊëµN‡‡Y/ E!8Îy¾èw¡„!F‚|š3ž%}FះÈ/ÿß¼ë|ÄŠ­ÛøÖŒMyW™Ÿ¬¾ú! Íç—F¾Ö:è»IÒ? la]vR¶ô2¿“0ý-Fx¬ѺšÏ#ªŠŒž¬Aµ,¢v©0&£øõ•sœÞ*]!f,zˆŽòvçN^ëÚ'Í"ËÂþ`Óƒ¢r˜ M=ÉIX„†ò¹˜›Í…À½~DB úM±Ç¨4V÷šƒQŽ9]Vâ7€–#Ä!Xȳ=ÿƒêËIþ0 ›#%›‚´¦&aÀÓ©›zzùø®³?Y=ÑY·¸ÑœÑ+¯#못ˆp£ý`p}´(ÊG’qä˼ükÚ]¦cY ̘ª¾Ûí Ð¤_ô/^Ù\€Æ3jèdÜó…Ni¾‘èõ<ûÈ <ö¤\Æz«ò¢¦lû­hWï4I0ذ#Ê)ŠºÅª0Ö„h^V>;]uÌšf™D²§¦„[fƒ­ñÖ…‘8™àÝæì¦@n·¤-kãhÖYÉ+N}+¡)ö±’υݨ\?³àÀadôC6é»À(ßåY¡ ä³·æŒV·Z«ÕÊáš½á»Îù¨®{ ¨k¹Zp^P^ÊÎŽ„­™=·öYJµ>vÇ’’R­ÝÕxò`˜ †rf7#žÝ4ÕAg†³êј“‡>j‚G¬p˜ˆR¶þG̳äãÞÞÎŒì|-|$Ž!˜|S=$ÖùÇ?£·Oî^f¦ ò9±´ 2šT ·Ôï^ëÚF„tĨÁ"ÞŠÖå‡ôÇ©Äý°{¾/ûšiû+¦Ì»¶—å…Ö5²éëZ .º/K_–2é—u_5cûl›€ìË2Ó+}—…Àé»Ð °}Æ‘¶;‘ï*VÔ‘p§«ý¬YunlVh‘¨¤‚ì«å»@€’sFØ>þeç€ûŽ Û¡©A.™Õ6÷±+23« ÿâú àg d¾P@–™ b=JÚÿ2}y2¸¹í|T b„arÂýFì}LZW݃?A~— è ­Eï:– bÅP÷Ò|Û¨ñ‚õ,•šØ8XWMïë*Ì®FT²®b9#jd¤&Gû¶Ãr !Ò½™ö¹!vD*ÑÃl-jÔ•ýtôý–vÎèÒņûg×õM ß•nâpb§Ä%`…ôg£ÛP·Ê¿+çŒ({šC¹fq‘Hô]«´.G6s ¨ˆEc ®?YHéyoÿ÷Ÿn¿uÞnïª~×’^A×à“¡²}F´rd§UÚ§¹‡Ñô<:›k] ÆSößSÎ9bT¦’‚Í)("£UuÙÜÓ[fõçH`g:Ý!ê ¸##°›š-j_¡ø®C‘ áÜÎWhÖØ©Ek¼’™«rí³dæy®põofÑïØ„¢y±Ô™Õ{(4å]þ]³L ±âª¿² B€»«flâüú³>¸zè #œ“Žl aÁW!ljo‚ö ÁwciQ¹g䃫ežV8¾uA›‰) Òïõ±®^Z§ñ´y3”y¡3™]yܘOyd]E‚ü²ú·èvÝÕ¶Höø@ºªëOóu$†Â$^XfõˆQDøÍØWÑÖ(Óº¦gxÜgDuÄnª»®ïrÏ*ê·Ûì‹}$óê„? ÁüD°ï´.pü0Åw«“øD4ê;[ú—c$·6å†Ilœ>ñ ùôsÁ$¸ðËg-·(QœøºÂ]=+Ïv”–«1ù÷“)!Ø›5 þPXŠ1 S-?çiÆ+Ô³T-¿éôíõ“­ã¿Xô6Ƈ^¦Øë‰]ÛhS BîÚµ:l!I6•¡ŸöE€–òÛMÕNP+õØuž\@ÄvNj¯"ö6™È7cò+iy,Ž_ŠýÅÒTÎøðgwûè~÷‘+¶à†¶THœÿ–®u¡byÁV’ࢮ˸ßXÞlÌšö#¥ï$jÜÚè1êb£Õ+ûÃ$Ìm0{QPqF‰c¡dò}Û²§É ÐO×$hvãh wh³3ȹãùìbûSÊ¢=.üvyöÉ.]`}sÐ}žþõ(w’Ös*="Çøàl°%HC953²Í=_ü,°õÏÖbLÖ`P'w‚NIJ¢1Má§ó4 Ë]Ùé<#ëñMÆWòW®E ÷I“ç…û*7 è[Ë›à¯\ùgéz<efKë Í´”©XÈã’ÒcÉ\¹Ñg{~µ‹qE3 _I~üH‰E ý×ÞijPÔàòS$,¸—.ŒÄ°÷ f“Ìþ=[ÜÚÒÞlÜ#¢o­÷4;Ÿ£Úw޾ñbFγ0VOàA€nš¼vÃÍó©ºß!\s@ãlª£ÄU¤"ã|DÉæÑ­¿9Ð…f(‹}@§{jÚ a ®+Ä6dPCòÙž,ðÓA †‚ì¡pœµ ÁD¿Š‹­ÕB|A\ç³qV7©w ¼q’æÁ°%›0¸—Z2ÇÐIT uö™Ü´;¸…™„y6ô¥‹,:ÛëÉ_ërãotk^¢wš<+IAº4©CïzÓ«µýæ¨?·°œìàf×,ÉØ/A‘°«'÷Y»O:ÜáØ"2„-ŒvÒçÖAª¬^žÔŽÁ–ÞáJ«^,ÀøÙmnò½¢ƒîy)YJÖk_–£…Ǿ¡5%袇Â".ç‡~|3®LÁÈfxz[‚4{*) wbµ›{}R÷^’Ž( TíÞ±ë³Óºê,büÅÄ>8#¶¢_dŒ5‹ŒŒAY™|àp"ýÛt=Gb§OÄ­õäd‰d{t‰M#ƒ plŸ• ábZBY(ÃÂq@í\úÆEM›ž Ì}bÌ ÷ÊI—ñ`Ñö×lb†jÓt«)‚ Ÿ„'ô_2,¹_¬Jøm|ö"J]r)è_çÅÞûÐóøÙJ”Ê> zXJ¿ˆ÷WŰä¹h¢“ѽނj¡žYaÅ¥ëöÙ‚‰ÝªušR­ÑçGrTŽì±h³µÏ©¦ ôâ©TVKfà½U)y¢´ìéÈ@ ßÒ‘aš¡ÆEíŠWíZ³-&&0>eÙauûkÆH•ÓÙ„àÄglÙ,W 0(CrôêÓ¼, ªÓóëÞ) —9‡²B/‚Ä77óÅØW9¼ƒ¿Ëäïã$H—6—Ý4$“¾^y{»ág¤ ~²ECòJú.\­NJþB"BŸçwi¬=dàñúÃôÝÃNT: ¬ jŒžftW­, U±Yóš 1KÚ‹ñ#Àê¯fDYwK“ñZ@;ÕœpþR@ ¯lRË”kNy¨Zsòíá=±ý‘•´”;Ûôqþ*´Í Æ PÄc– ^mç.}€v¡á>FΦaÌIpc£Ÿ¡óöÜâvPìá_²ô’÷ La¾+<5moц£hY´®œ~¾?Q“É áT•=]Ð~7=ò ÀgaU¢vn?Äè4³+¸ú*UÈjÁ†É5 XÚÁQLœäДA=ý­kPmÊK‚"üõ\M¼²ƒ ¬4(°”¼ÈˆCö$’o hÌTň¼KhÝÿ3 ÊBs{¤©>Dnv1ÃOªvTÍ’ÚX…ê5$´¾ê4á™Sï¼Õ«puÓ8÷Ô9ÑDÅP>9Ý#mëoí?³&¼Ù-é˜@jd…¹c¥0•ÄþÌût;^Þ7G'³å³‹‘}}Ïžq’ùÍ“­WæùݤÝõ²>¼•]Ä;á!Ôß‚(™«1¨´¹ë (ÚgçÐsmHŸÚ3Iy%(+ ˆóÑÔZɪ% Š$œû£ˆ èt+é†"]ï),‚œnKЃEr^âÓÝÖÕ“ýZUŒâë‘l_èFfgìX¯´;dC©œ S+—Eà – %ø_6gg[ŸæV8íc}–¾ÛôÖSÛ£ø¶£ø®y”"7êR¡*$+‹IÉTsÈ-Z¤ ‰8¼þ®Ô„yÿ]Þpž{fe@PÜRÝŠr™÷žC4tP혩êÖNïw>’…¡ÖÑ ó)îtÔþ.I;‚Lo¤A¾ð¡¬¯ØŸ‰QƒªîCÀrG[ó=o™Úî•^m,Ëé‘…‚eZp­éšƒšæ¤©¡¯Éº ¸«§ïòs GF ÒÏp è?Þêó3É…µÄ¯Ýì¤Ezaò¹—ù™¬AN’i+VŒøýÚNu©×‘ ƒò¸mzà§~ÔV[mõVµZšK™×îvùä<»™öŸ„qiE@ã±3wغƒ{I#T{*1*ò6 ùQ½²”*2vÌùÝã& ìi¦(KL­jêÌ„\µ”EÁ×ò›iãm¦xR¬‘JQÁH-C?³ 2tS«äëEsÁ(eA,zÒ­AÕøþéïw¥•vWÎù £žÒÉ ´ëÃPW·Š®ð©ì³OáÒ 9¨pQ·-¡rNî…±ÞaµÜVê u}>Ý8Ob7Þì-½FŽÕ虄a UÄ  $XçïüЫ¥2Éë(*j¶úD­îEíƒ6„&kþ°R2 ûT…úŒXä«]E^¥ú'Щ¿£SªÅ£|/ÉŽöêWí’öÚ´*€Ö–ôâè¤Ð¢=Ové{íÅp:Vi §°V îü6ß¹½³}­×³F“F>.f))-³xѯî…6íÿ†´è.ؤAõzŒçÓyÈ@çF=ö‰ý*¬^Û˜ToÅ >R¨ö¯¤šÊNVâ@Sµ4ø­Î¦9´Ö˜ÆW”®ì½w=+.ÀñË‹RR Ccc62…FÛǤ5u j9Ìšü!ds!(å¥ðè/,›{¦Þ/ë)Ôdü›Ížœ% ÊØ‘8ÑœÃøsÅ¡R\ïššà8nàö™Öhy¬ ãæÍwË÷• 0ýK[TÒԼʼXo“úú^6/ÖGª6¦iî3˜ñi’Œ¡úÉîü‰[§4½L!% ‰‹„Eüãl~%`$X'»Q|TYžÿRÙ÷ܵx{pÍ.YºÚ¨º>€¸—LºŸ8ù ÏDÍsâOU6ûfJ=,Ð1{}ºËLZv –«MÈ}r8„ÌÅ´²n×Àöb~ûyÀ°1z™-3«r”Æa‰•妕\<¡V/nÙ"”!ã¼GŽ£—'HyÉuèWNöm6‡+LUO¤"ý£ÞêX‚€œ|™Úy1ž\Y\ìS$H„õz­¬Á÷Œ>s#Œù²RK$tä›~âÇ%T0w[‹ÁìTÊ8{É)EpJ~Ž“šª@F]n©k]ÃŽÔr ÆÍ2ªŒT7½@UÉuæjéu"µ²*‹#·é ׇ ÐöóÆýÉb(Ãx4»qÁ¸-…c@™ä”¨XP׳è“<ú¥BKd{Mí—úZ$aP­_ÜÖ•`€H»!· ¾ÊÅÀiÜ£'ýîl‡©¡°(ij^¯Ÿ¦VÛIyâޤÎ|ÜL}Ôß«NS,­ÛwWù0ΦGñ$,ÕwÑl:YŽØyHªv̹iŸã‘‘Ž‹+üÔ)gõ‘¾¾ Ô#ôŽšAüD:{ *0 ëéÈ_ÞÔRi] 5ã»ð·|øþ@Ç$JKvW*;E‰œ}æÐS*›ö^¼—tÿÑ,R¹+~þøW׋Jo’PšÑº€içGõ +5Fbú>•B%)˜Ÿ©$ˆHIw„Tû?ÀÅî¹²Ÿ×ʬÏlz(‡Ïÿž{;×lì‘%½{Çxåé¡vìžëjÙÿÜ&ËaîcÐáyŽØ?Þ/¥ˆ 1OWhF¾ó€ÌÈÊX™¹µÈ÷uÑMÈ!ÏR§ê”u cîí óËÏÐ~ûT¿¢¿÷=>Æø¶ó""Ç]L»BäÈïG9bÏ C«ñ-'šÕ$ZðC±§eV‰[|¿A³ñï7x;/2”Q®BÛHžýÊJ‘ <†rL”°w×Ó Ír×–;-Mh<Ô€ÝIÂ^©OŒSvg`Wh}ÜœÎîŠæSS¿ÁbÜX9¶6T^ï#™§ƒŽ ç¼Ó„æàò-=[Ë·s,iŸ’2âµ¢ú±Cr÷;3ïšmÚЖ±"®­ÍÛm&Ñ´c Å¶ºz½è=ž®ìj. ­»“”P©Ã;™¿á†æÌ9J»jãqœýéË Æ“^¹/Ý> s9¥¿Qi\\Úu6&É´‹…Q(+«ó^©~Êæ—ÈWeõ~ʤxî•I¦P1åÍ7 ŽƒËtÛg­0s3ÂùïÅN)ó .’ÒªWí§í¨Hð¤®Òðú(~[Œ­cš&ûæš íedwÖ²²Q¸åu˜(Y¥ ¡Pabp'Š<ˆ–¦9XŒ=è»§CÇE BGæ=hØžçЂ&|vú²È›‘ýÓ 1Qët™m•YÓmžŒ5éÈÜi'%D¤ël¥€á“óÈ¡þÌÀö¬*£@ÒÄ‚íXk̬="P+ŒxçœIpÊ é ³7žg¥uaøÃ¨t(¸Ø¨zñщ|Ž!_á0ðÓ º­G¢YÅ9ã?Kßî’š¦Ø˜êZAå“ᜑæÞCÜK#Ñ–]¶h)–dI!¶I'†¯U/}Ûdev“W•F]{ÄÀ9væN3¾_Ó?jk ÜêWC±u!k<´æ„ÔH×G‹X†ùäVãâ€6úäËò”ˆ0 ^cŽSGõ—¤?46¡ÊÁ‹ðÇiàAû¬¢±Ç!­Ä‹ÔL2#çÉ2EBU#Äö›³ïZü+òºi’—;Fãbè>Ê ÷9°Â‘™éµ§Ü‡AQ–À9Äæú4GâZ"¼@c”&äéëGLóÃ÷#4ˆsë&€?Ÿµ\ÄžñùÉæ¯¹oÈ¿˜3n‘FFXÚ»¹ø Þ.4ãyrò3èšØ¸Ä}p¦½õõ…ÎZ‰{ˆq=#AUÅ‹žR>áúéIg pU §<B:R(s¯Vi¹î^2«¸ÄƒŸ®´©Ý ŠbÉÐ…¢©%—úuÔž«+‚ë™¶’¾2ö‰G6Y"¡2cnÛ=г¦Âü‚µ×ErBž—f ‚ƒš©„eÚ ªHLòb’[1TæUÏ=r…”HFä3 –+Z\i…†òŒ™3¢Í_Ãô¨çÅLˆõ½ÝÒ&õŠJ:€E‹DAžˆXô¤vãq¬÷3ºÙE”£måþÂÂóÍ¢wDí½ªå†-z11z!3íˆe ™o9$­ÈîD÷cu7럠ÒWelÙ±LmšÒ¸¹¶DY@'LôZ¬9€rJêùiÞY["kÚ•Ù~ܘ׺Ü;l&TXK²4¨j])”ÕGõZ7¥P؃V쩵ȺfKµ‡ß+BëÂ<‹Îf}÷Àæ›Nß1OÊ3Ðb¹±i¯ì娰CN– …ÍÌö’Âf~6v—e~¡êìŸè–èHdÎ) ~ÛCªºîQ„i·5©†0>Á>Úø5aì;d3¸øêOË9þb“Q.dš/Kð-ò<<·ü0<÷û]HÞâfE;UŒ•¥qÜ‚zÞøé𸴷Ïd¨.IÓ}›ÂäÞEÌQ‘¼ÙÉÏ€¥Ú‘Ž ,‰Ìü™¬LÃCÌ>—}P—›`ÐeöÝÒ.ÚÈZ›œÏ ÷+P%=–$,ÔÑ´£±L±¯ßˆOWIÅͯ™T¾±Úý†![2=¥$ƒ ¨“79p‚HàA‚×KbxX¬¢·™ZÌ(°V£LúÕX²¼Ã(5c+Üq­üC€<Ñc®RDsÙ뤶l¬à$±Óų۱°ÎŽ $]ìá6+ª&A©¬ÞÏŽZÇ£~Ô?¡®È'tÎ[Áù¹šb+A}Hµ¶Æ ‘SªEZƒ8õYÑâl·ËÎx­k7ö&€âÙw@ùgêWV>Èȼ¤=ÐÒB|U*ÄõIW]ºÝÓ& j=²Îv7ɨ”0 ºÂ˜g5þ#,DÊC5ZWô!“z[%¢úÈn([¥~´Õ[Ë4½–"Ć?³£FOþ® 0¥|A4ÀŸ3 `ᑞ‚{€Åd­ÛPi¹MËf‘uMJ.ỏ³WO7Z8ÒÙ¸ë ç¶{—ïBþ©ñæÚØ­èIXGXú/ƒÈ”…ÿm"^€IÕ=»Pß™âG;}ʺ°ÎHß…­>6Ö˜‹UgöÒ^Å÷!0 Z¾+ð—wÓá fÚPé)?åCÙüÉ~›Æ×º°¶ÊßóÒ2Y3¡â‚˜_¬4ãèT¾LOz˳ý(ó‹¸çýÅfv cI!”Q)Ü|”B CÖµmа÷°@F·ª~Ä…FÙ¢(„þÃähFúûØN:LôÒ†(zÉ,i]s.ªØ£ç¼¬©±epÊ‹+Çú‡`{ìLñ§¶ìhMXÿtšz-½ºsñü7$qÔÇZs.EFP_oZ×Û é—ˆ·hßSÑÃŒÚãƒú žÆò®a­Ñº@éH 8óc^ú.·ÇT14O–¬ËŸw’9c#ye·Ã DæŽÄ¢$l/*oFÖKé°t­IKÙgMz¨Ó©] ƒª‹î ìð–`‹Lc—SÙ86嘄(uÓw½åµ®ÒTXô#zÖµHd¾±@# vLAÕ‚Ý;YíbdØÙ~¨gú®à˜TÍè…“†â~J“ŸeHÝjp7;ˆ6ióHzlRÖuŠ€Û8ãƒï²f ˜¾)ïê'.v‡úø(¹¬Søþ°BG†™Ñº1c1¸Õ‘uR†‘@'·MÛXÔüEÖtȪ lêÚ™Pa|D]lT´;í T.ÿ~5ØLÓ;Ll§B'ð]Ù ~«jtWãôJGF@fd‰ÍDi‘¾«[߬-‰UÞõF†É×;>y×èŸÈØ(¥¼â½h’0è7ØÌ»RØgE½­ÁÚäìwÙú2 |ÕÐH‘ïÂÚ‘ríu\žuÕÞ!•ÜŽ­6­+{i׺Öã7몔\ÆLf ±@€Ö‡ÕæWjxÝ>kªPeIéÐGNýÔdUŽPF9!÷j•R [–”Ÿ¸À­ä«‡ß6ZW•å¢×Û%’í~ÌhyMghÕ€€?´ô"†žT6¨F¬vÓ>›Qý¹ÚÓÐø¹ë4BnTeV­¾OûlªÛ9ovÙ¾¬+Òoɳ_¼Cr"Ãî”T‰ÊbÛc¶Ê¬ÞC&›{—‹ä‹R™l+¥³=½˜„ûôm§"#³ÿß»øÊD¾Ù{`”¸Fñ¶9ÅŽÃðV䣠·GZ.¨ËLJ§%Évô»ö}ÍoùvTÍdÇßµx" :tk7íÎF¦áwë»2œ~ô³ª´`*ð4wˆækn[ï"('ØÖ›¯.¸e¢²&Í6ú¤ÕS÷’ݪKK18 Š}ªMuj&‚1 ,‹?éº}±ÞJWˆ²ÈWǼâ/ÐÖ¬i] ¶”uµ5?‘±ŸÆÙ*¢ò­g¦©è!e¿ ~¦¦‰vD8G;ò]•#ßà_ËÑMÕàœ3HÕˆD|t‚¦ç¶Ô Ú±dFëò§%©áö¾ìã«Ò2·W?NeÃÓ‰5V3 íyŨ–)¶?32bÑÍ&KÐÖ×G­£íF¿h=E/¢ñ[„Ïs«¡Ô0;+C`$Za\ƒ ãHÒiŸ³±ß…>V¥Ö0J²ñý”讇‚¦ j}äôÐv÷>‘Beû›¯ (í6²,(­ØZõz¨Ñw‚Öe«ïOV_?ÔPžŸ©#Q÷aáÉMΛÕ{U&ß%µ•PÿLæ\€M¦±€œÿ@Ö銌îÄû^gV¾hmN¢náùÐöGFö\ÅÅÕòÉþk“t•×£?Y‹2éLT¶ŽúÑ–mç4Ú¾ºäÑÿæf1ÕµN隣@NØþìz sJ¹¸Ž-¹+¨›²ÙóUÜmÙMϰ%³©=öóÕ!Û* cc‘ñBOø#·šÏ{Vý!7÷œ2>}W¾Y÷ÒÙ>‘o uköF"¸ÉU*[šo£ŸG ÎØýCex6 uµ*ihÂÁ:å]Ô&Ñïê‹]#ú:˜¶€œPn$vó{u$J¥ÎHMcEÖ{$IÕ„,­°ì³BGÀØœ ù™¯žÐ㿸Ö5©ÿܘ›v·KýÈmÉ¡:í–k¥IŸ¡š}Œ&ºR½zìÍÑlì)X^S;M‰Jb ÒJY×jóc]}OwaÚg³¦ö|-»*Ž¡^S{Ó£7Å~¼Ì7‘Ÿu˺šiø³û\45p˺lçzÖ_Ðs|„ÊÔXÈó’MëZO­ãZW}R ÅÕ¥\ìåûGu½%äâ÷ÊBʺÚYŠŒXæ–u-Ó»¼æ°.Œ",­ks'á7ÖÏì‹OÂߤr“¤ ùaÞôÄÔPÇŸÉ+<³ÉCy¬/t…öŒôÊÐÔ‘¨u3Iñœ÷3Åó]Ê|¢¿× Î–ÊÏ™w+™¤†÷C4SÉåc¬%…‹b¬·> °U$Á^ÔrÛAž­Èˆ’‘Xw<4讼–_¼ðº KKP!Ì)G}ucsKŽ 4´.@ÕïÂNž¬ëÉ9÷çdPåU-i]’kñ÷•¡Þšr´ÐŸNsÜnijÀ®”LãBiÁªV(ë½Ê¥ØSª¹žgtãÅé–:AØÆ0é.Ö³¾cËZ&³ÿ²¢®ç(òju÷Nß5 ‘{¨¶fë|à½}ÔÆ¼ÐùÌÛ)ÌÝ[]Íw!©EÏ`­k?nÌ ÊÇùËüôö–±–S²WïõÚ$(Çj0?£¹—š+l)èíÓ Y9–‹M°®±å¨Oý$òãK׺ºI¹Øæùdõ^AŠ´ÆÓ$uS\PÞUs–ÖEÎÒ3ÚoVß'³úö”)ú[ãJËÝ¡H¬š±uIMµñ¤xß.ï‘Âñzæk… Ô` ÿÖŒG“o«ë(«‡l”0<½KvÚǼh‡"Ù c µCxŸq“1òe‘#>Ç uYMlc Ž©„_›ûS3žòqxÔìågU¾k¤;~Ý£u­7.x5caßabìe<#¥æX/FNUÄøõ; rßõÙ§¦J|†õá$¯O±>¬k¬Në¤òTÖŒ”u¢}Ôsö?ÖÕÝf¡œÜ<T5KПܴ®µ³AŒ¿Zêbr•UÆëwÙ>á™È¤uµU…ü²±%pìáXJí»_€ö›†ú±^5Ú§gWM!ت&äe&ý}ÌPZj5DnÛÍÆ’Ô?‘³ß…$LÈš§ tòÔÁ®ucmœ¤‡WÒO3¬æH•éÕ€Ï@ r÷‘èAÌ"LZ0Ø™™éÈ@LS«TXù²ã3t‰C·HÖUÙÆØ±œ‘qƒ{WÚ²Õ¦¶¢ýØo¦Cn3:šf~òÑÅv§”f‚T᛫”Ì@/~´G‹Q¥awü©>fÒåÞ*ÄõPg5¨VèlJ«9Çþ¯ð]PFóÂhª‘c r߇š€3COA[;†`œÕ¶°À0ASCw¤'².°†åNvk¨BeÉÌ åTá@$©Ù#/IÞAÔJi8&š4¨6ú¡ïšjð·`Îå|ÛÏïa?!áÛϺÎüXvüh]¼ÜÑT§±®Ò”{žô¥ø3–uyùXéy<ÅL…ΪëlÏ'ÇÁ½èda³wy?+…¦æ®Tù¾ŠÚ^Ö£Žåœ1€þÙ¨›þ ›|4zX¨¸óKÛ^ÑΚÑÃûÇQïÞ4 ¥~ä_æÈ.þ‚ÆKR›ü~4Ø#:U;÷лâÅæ üÆ` mé\ |ÞØÌ»€êäœ±Ž™Ëý.NC¼Xo¥sìÖõ2ذ®Ì›Ãº–¥^ÁdÞç¯Êºš}DÜ÷9×úH†ºCù€ì–Å8ùÓ6‚Γ|—‡ŠBspû”‚¬½™ë¡fJxÇúµei…túJ¡Ã³§ô¬«©E)OS½Ë‘¡C’ Ž€œÑkË¡"ãZ¾=ÃÔüò/‘…!$êæG¦‹?tWÐ*¦©‘NëZu'ˆËFê´>Z>þÿkZP'}TÙ«÷\hÊw•Ò”wµˆ"ï×*ó®S«þǵÝ=ÁhÊ»€Uý×w£©¹ú®µˆÎHÔ4ŽÌŠèZ×´OÂïÆªª»Ó´ðd¥¿·›\üÁu|<]œjBxADßåOH]üÕÆdvê@ú<Šå[Uöå•Od|‡[MõÒÜufdèVåZaå0¤@ÌŽ„çwù“úTþ€¯—­î®ŽP°Zu<„ã`r'h±žy[m§>ã uEÁqGámÜŸµ™Õ·Êõ3°}RqÄ,a _J飀ãÌïz+EBCaG‰ž¿›Õ?©›Õ¿,ó•‰[‹c~v‚l÷B¯f©øZƒ[·û`‡e× ó†àFÖ‰MíÓq.e Xø4£ù<7m¨¯%G†Õ/ís¬jŠŒXáP‘ðè¯å®©nª4›£‹¿?c¡rÉ [ÔŒÛ8 µh'ÈëŠÂD± †«q±7TîMY½F7¡¨‘=™÷Û£ÅÖÆ°DàS_vSc÷ë#Ssý¶V ªŒ#ôÄ|´á׺<ÃÈÌ à ¬¼_vä—ÚÀ—7‡{úð—#æu$z×àÚ}û©µ¹h]žÑU%ÿk«fôÈX>“ nÚY›Ä?Å—Mz½sTÜ{©—Ý“Ì@ùf /ª·ì¹E aÓ¡³9Ô‰m!añÝùu$ÊJð¿«‘¬Nm_‡^Öií›rÏý2Ô‘(O ¤?ŒYªÄ °Ÿ›¾ )«I=ËcM®Þï°ø£êþ\ ÔMúXÈwîÂ/ø6˜’¥…fû(@aY+/ÐãÐq”õÙ8ÃŽþsJÊFA"gì!‘Ü…ZmLáÈê¥X~½úºÔ@í³ÜØ€¦ØÍÔt]\þÃE½¼†Ou}~î€VʳÏ«VÜ”óø :¯>°3‰B˜èèveVåÈ0]¡x]4#z‹Ù÷âµß» U†^»©ÅÕW®×E<îÙ‘€x9ÇÉ ÝÂý€ofÇ3pÙÂ.O׉ô´yÑwµÇlÙo¦U¦jF€s¾_6aXÔ èLPc¤š žä£+¿,ާk…Ãý¬8¶zùj¯ú»ÐÙO¼üv”z²•‰*K‰DW5i'ñ38paímáÝ]ìR-ÅS5­z´½¾KC³QJåE·ò™b·Ö´Í]Ç–`Lç6Tð1ˆÉ 7Êpb vÈafÒž³ÜÐüùìó¯¢5ÃdJ»ÓÔ%0iŸeÓ†Ô‘AµìÓΦIs»œ\˜¿Ü!,òB=yкp0i]Ëq`¾º}ý£üç©ãuyÕc †Ö’+àöQ“ók]õL)È"ïÚéÈγ¡× Û•a’±Ÿjò|èÜú+ÄÂð<$dGivj#òxjvî<á#tb”°¦Ö‡Úî÷¿ °£¥ýòèLïÅ:b˜(oõòòH€q„8]ú`²ëZü¨V’´æþ¡,ÒJx2X`dŸ3‹P¿^¬KAÌ~õÖgùÏJùÀý.ü÷A•ßÂCØÐiêˆóf`·*ÛÜè Äv®·b£€‹ËvË·§Ö`ýìdd>¨j¨>{ü±ª@.g ß<ÎHNò²ï“ØCù h%é×o¬"5:2ÿCâs/õC*ÑöGüÚãFçÀR‘XËS¤m5§‰àg陹á#P¢-¹·K¾%ô4ÊÉyÁÂ>qclÅÙæj›ÇEË×fîD®ŸŠÖ 2# óÊY3æ²ß|cçPõ6C³Â|"±Gˆ')^1N>¬ÊVÈgWázTcwyzµ$Ù6IµcrÊ{c†IH;VÑðŒº2Œü]#Å¿µ³«Q«xã`¹ŸÓ³ÄR]ÉL2ÒT)z*:L”&#­«¿î'y·Rû!Z)˜Ð0Mì‹•då­AÉ$ÌS”¾¦‡«Ér LhjÁÚùÐeí¢}Û©0 ª±7HK „~êš5q,ñ4-¹»J»Ã1 Ü•’åTï$À@ãwgV*CjÂWêxô$ÆrG–ú:Ñ1üÙQŠUÀ„µÄlR"aõ™ÌZO%—©ÃÏ«ë6ÿÑZK `½q 3к’ˆ»‡¸ÅÝ[Ö³ý§4t ÊrÁ9ZsSîxö,Ñb.ÿ!hu_Ó?%L¹Oòº«™zÑà BÈØHXˆfá™Rò+åŽ#X”äÔ]±*÷ÙÁ¾f `ŽÓsù=2ïóáìShœÑ; цz]Ôõ‰u¼ǘ•é¼ß¢³YGžÇÊØJð˜qƶsDç#†÷„Ÿ&ËIty¤qœ†¬’)gO¬êN‚XHãý­®ž7–„ 2n†MgÏ›`ÄAiÃøQ"ªÕ|¨ˆ«âëSdI tIshÁÂrÍæäX„W­;Ϧ#[áîr)1¿‚—ù¤»‚öÕNëíôIëÂà%'A-Ö-_‹+xSMÍSµÄæ€7õ#‹ÝÆ•¦†¥©4V4»2%êXµç¨1¶ÌéuMwM@dlNÎy¼ïw5÷â…GµÌÈ¢ÄοŠ)ÌËoÍñ$ îŸUîWc³‰ ž¯œ_àÕÔo˜`%ý}ôÆ—æ!ëM*o›[ŒÍ˜bO‘‚ÔÊð%›‰¾Å0¦ú!Ê´O]·Ëù‡SP9yK Ú™iÂζ´Þêßbª¹Ðs¥¼©£M…¿”yú¹¼©Íøi]ƒ–´®Ò(d~B[Lþ½ž4µSö.†Fû±èí0Yëo€ßvLÈ_ÑêSÈŠð¬Ol…òg5+ eˆÊ0Óµe-ñófñ•ŸÄ9<õ0‘G¢T¥ñ™<úýšrW,Ü>%àï§ìX~ëUÕ &§ÏœX»ôAo”‰<˜`ª°0ë AU3áBÏ“5¿uÜ•ßDpTm´zq«b°>¥“kPm~³×Jý4$xOÖünŠ/ËÈ‚ÔJ‰žÆçs{A5%Ó!¬IëòØ,eQÿÞ‡ßÜ=×È)vPiK ¶´§Êr+§Þhj½fÕ”3)Nê6Ž-!´ÞÒðŠôÔ¿Û`Ënz6_5‹/ :$YäÝê”i\7-“g.üÝD=ßÛ‘Ok–̲×Â3¡Â”—:ŽØ¤ÒYócºh]µV‰–¬r·½îq#¥brR:¦Jæ·yͯªq]ý«µñ€[÷GÛ¾¿7¤yz9íAûçVóõÈn‘7š¥æA€ [Ú¬øÎë„Ý~‚dÖWØd]Øm£»ëèûj¯â(ÉI,|Wö õ½ijoÑtäh³þÑ+ß‹²Q`t8›uÁ\ã0s³½» &±´»NÎîðwß}¸=רí]•¥œ}zne$<HK2’¡GV¹µAšÒ3¼$Ì®¦`¡/Î/ÀTŒ`·Ç9’ƒ‰R©Ò5÷Øšì¡‹÷‚{w<]e å¤vƒJ.ñ„‰2oÏ1åðri?BÙj¬×N<“":”^Yÿ`‚Q®J¡ žÒ7š­mE¼7éÁ‘­«Ø•6tÆ‘)X™Ò[xgO¤çª_? ø3µ”„ ü“¥ •ì…•@YoPy«²’’˨ëæî45Ð}2¶®¥i¹€g¬e‘°Pˆå>D¨Á·ѳ׻À3ô¸ñoæl4!w¬¦Ö1t Tµ<Ê’øvŠ\¸{ýüµ‰-ôøtvýÁ5Ö«q6fI]s8< ‡©c*4+(é7ÊH9¡\jŠ£6)j¼€"y|¶h ŽšúŒ@!PÕfÜ5…ië¶n>Á˜–6ä•|ʤƒ†<% £ÏúÑ2:öÐA•–=<ÔÉß‹taòŒÔIîAD„›æØÏmQ^‡¢±½_Qêkje*>˜DÉBšä°¦‚¬KFF4+W»câ 4n÷&9=¨O,¾æ~R½îê¾¥gµÀ²^€—dë'©<˜Å­ª> ÔëY¡7·ó͇«¿¾y~„äݽHfÔVKyâò¡ïÙ!ÇhÔɃÃkR¿Þ•Ž ƒ¥)úíV?c“9Z¦ÀÁ•3ÞãBÀjcðùCè ef” =áÁDi=~ã¶e)ºÖ~tJ­|ôؽiÊÉG3š;²ò ~ot•-}ׯcHÕÙé9ÏÌó«·dWa=…cìsÔËÃs•ʧˆÎÖê—îìZWAò—¯Ì‹ ì˜…úîG2méÇø‘]4Âó@xãkceÑß.ï½8”Ó`î¼€Ióv ŽLÛ@£‡‡?¿Å™e]óн.|2Í»»T\׺ ¾TòÅÔ·ÂM­nUì ¡§«Ø66–ÇdþÊ«zÒÉ1²`{É£ñ2Ý.…Úà†ÚNɦ—(5Ú§’tJþì/@ýˆç¹Ì¤u8+ßUöÉ? ª¿û- ìa«B[Ö󃫘ýˆ;¨ Ž¾ÃÒÛ]â¹ï/Tg¡úL¯q0æjи˼+¶Â¤<½k¯ôåa ®Ã[³ÑîP騽´ E­Ðèé…&YÁ_Aû|²Q÷'6?RÃÅ$¸¬~%·ÎÑÁyde÷ÀôL8°¾»{~st¹ï„'TŸ×ٲț÷Š”Ì“ðÍ— ®¶€Æ®ò»vµ=ÓšsXŸžw+Ûèy<:WþÄÍaÈŒ› ¸gñ)QÐÒ-ë*}æ?êböxÄ+·ÖmGJí¥¼ôóΩJ{€¼Û“I-´K9c·×{ÕìÂ5ÛØÏ ÀÓÞ“DydzawO{|ÑZÚ¡•· -BA][+ƒÞa°²¸øéÖ®õ¡²8Ij~]!€Ði)õ1“Þ k‹öYëì´OÿÔªG=¡&áO%%S˜ýž0óËæ®¤ÝžÆe$³Û¼¼E‹ýÜrk–ÖUzJÂý]âú€ù`ú7ÜÉÉw>î@ó –Ú‘¥Ô·~}/ªý£Ç¤}o'¶@÷PĽÆnMÕ*ú žnd"Àaïû¡)/’À¨QuÝÈnk·=Ïo~Û×;ŸTä22vćÔV‡ÖuÒw53Ôy€³ˆ™î´Û̧ïNdËw¹}*Y[J׃×w3f"' #óúÃX¯­²rÖr¯‡ÞûÍ,UÑëå?Âô5Çng«9…5ÔÔ–²Ç šQššéJ–•'3ð¬-UŸA*q‡×wy^òžÐÍK&+'ˆi½çÊ(zÙ#UŸáy&;Ñ¡d¦‚­´.Íô³˜7á@á”à;ÿô FaE‹)è.´ð”ܺænS¦6 Eó"AÏÏ-晆ÈE ÚåV´wþ_w`—lfîJž—*üÃÕ3ïÚ!µÓ†< €Ì÷’C«çlJ—˜hŸµÐ¥€ ’¡ ª‚lpŒ¾ÓÔB’jd(ÃŒýH½ö®9ºˆLÂþIµü Õ‚{}mEÍ@ãzyàˆŠB­[Òñ@F1œ2Óïÿß’,¥´²yáÏd2®µ>TZzùИ(¹ÕTµÏê#ü¹ÙÕÃoß –QøGo+åÞnçì.Ø·NU E5~ KEðÀŽ.»ë¯ææTh„ý)I¼¼kP[vCògöôq=Ÿ—­;­ .¦ZÝO"Æ´|àãAÖ^¸Y&Ôfù8/åK׋!ó\Q\fÞÐPÐc¯Â?)Ç–Ø·ýHµÏ>³Tì£ixàa(;)2â´È“5ì݇{tnר÷ü6‹™'{‰¨Ñ8 ¯‡t­ ù ßßÊ䵡5X3¢âü¬)¬øÆ«¶^ Á³Ç–?ZåTþÞ|$ŽqÑí¨´,%ÈߥsÏL²:5²®_<[h?zÖún ³jÆšú¯1KÚRÕ….%n@é[böc©3Íi'µÙà>ßâäíõ®úiïO?9â°”#Cmöê×:iwûäå§wëü4qKWÔ]%;Ö±Úi’0³WÜü]9¨ ex-‡D"/l{/Ú^-3²ØBO‹<˜ÂXšCìj}¾ô®÷P©@TSßÁLóùC§«Wß(sèÕ³Þ†ÝõQ‚ÁÚO¡Fô’ÁùµŽ›ê‡Ó) d›Ö³øü 15f =Ê‘÷„¢š¬‡g»÷¢pã¸3D•s²gƒÎö`WT© †±’wˆeƒÎôÀŒÏê,7.zþƒíÿj¦wÌ|y±†ÖÆ{="òA#LØFàÞv^ž45¬ñô ©`s:O¬Øçœb²^§t˜Ùœàef„)ÜùöŸQrM‚oÖö‡×­!áb˜3¡“+±1gìô€U²F¯Öf~Ô|45@5g|³—^åÆì—Ô¡úa/u.Žbk ôµ¦ØàZa™oÒ–Áµr#·´ô]è§ìrÏ`¨S(Û=“´þO\@÷¥ÛÐÈ{Sð½RýSã.ý]>ÔÛŽT­·-‘ž¬SÄ1íiØdE«7&šÄN¯ñIãÜŠÃߟÀ& ÿ@žNÛtJ£sðJlxŒM>¢:si¦ïZ’sW³Iª°2AküGÂH¬-Bÿv àz0úA¢¢,6¥~] [\ˆº-p€ñÍì—XH˜*CÂHÃsCSE;Þzòm‘ô™£ïßøQ¡‡ª§eö%ZcöѤǎæ,;í;zÔé»N ¶ºKòWgS%™†­ ãQâ¶Ê¬¹ætK†„ŒÞõdþžÕ!¾s{´"÷×l Û¤Fòûe–FÖ–Q»KÂ;`;Ò SÛÓjð€Þë‚3 Ä«}ò×:‘Hã>Ô@pÄõ”@.¾Ë:Q†`bú0Ç÷½EMÓ@ÜÈ{?ö¦èy›Ô·ß5¿«ù#E¤_¢Ä@ *.®÷¬¸I˜Ú×Ý£Tž8Ôuk­ôö)Tâ3Ñ ôµÚ¨°è¡Ê×À|&ƒ\­öÑE+#AEÑ@]Zèè¨!EO À“¨cϤp…ÑO†²($¦íÎ]”‡žB Äñ¹ûgë‘3]µjñ¼PÙ08*Š0™–§þmúIJ{!]i£“ÐËýEÛÜÐy"æÔËõ’`ÒȯÓ0>š Ûé±ÖÉ{ƒjŒvçñN«‰½U®·¶˜‰~àŒE¦­"zµºvîÌu+k €{22"çŸÍïP Ÿ¦Á„jÔJTeTá”ZKT÷á™Oؘ`{Âÿ3¹,Øj•wØRa,÷|¶nF“m€þ‰+¶}׈1òþÊRÅÜŸCˆûM’+³Ýxa¥&%R¬ïž±>­¾ëð<®)TOê%™Ÿ•jÈo‹ØëØyö*†H¯ªóÍb0ؤÇîŽ5­f„Ô”põàó³üÚ43/ FI»;£'þµnžf8/uòvÁ¢Óè?kÿZ×W?¨X¦–A`¡Óè¨c³¢1YÃâë‚1ˆ0 R¶¯Æ(dÙãe~•}M ö{ìÚ ZgÔ'o·¢ë«‰obíZhP(G¹fQž–Á³šJ™t¨9%é,–}z&ˆÎâz˜è5™.^Öžææò{lNníÄ®Zr)¼Ÿñscú@v•òˆ´Æ… ·ì—\ˆŠóþ*mÈcJ²°¾´3kŠ~$UÖ|ëgwµ»´ØqJ)Gæ=Ó>E’q-‡ÖH{¦qhâr•¬ENØée²®õöÓ¯©Õ&!³Ú:u±AW¾?}•É)½Å$H1óÆ\ë:µ›2t/,ÅýX|p˧ ‚ìç\5žj¦áH °{ ê(`=|WÛ^ZxžÛ²ž\g°€…wn¦í µ¼8ƒúiˆß™Ó+w}¢#‘PóßБ›4 ª¬³ Ïš*-+/Á©4õþF¯ZU%ò{1 }òtè¸pQ#:féµWÜgDÄpºcã³äíÎÉâ&î½rý,k¦VíBWˆRœ†×Ë:tdÓFn-b†¹T€`aIË푨Þ~Iÿð†û±ê45ìŠnÔ:ÛײjC/ÎÿÜÀ;aí¡ÆsßA4—e­Of3ÇI+ŒÉ„"Lc’yûé•5û‡dzz¦qÐÈ¢ªG Öh®_£Õ0yqŠxèÝ ÅÞìIÞæžgÿû¿G1ÆÌU$é&¯ a§ëѾ4z>¡Œ{¹¨½6ùCZüV Ëâ¦[]ýqBÞ]ì¶ŽôÊ*%ý¢Õ@QèÒ“Øb†Yé ‘9¤í[@¶¹è–Rí7+Ciœq Íÿt¼@³*WƒƒÃ/÷’ðrš ŽtC±¼iÜ š(&22‚Äa*¡Bà`Ň) ,ÛÓAúÕÅÇßRyð‰ë¡^çâT«òI}T•–îOHXƒ†•[ûnÒIÌ…%Ï[IJÒ?Q ®1?Â0¶?нžd;XÌõÀiŸÒrù·àòT8?4¥ö§}¨˜ý«^̧ðˆI–~miË¢Ð\IF‘ž¸1H…±’Óf¼¨€±°XÑ&?]{¿wÝZ]Y!:ß"AK™sº•·»ÃeþÈË“gv&O®¿Dì)£e_ú KItÞìЊج\,ÄŽõ½8‘22†ìóP~ݦø»9›=“dû$s°×–ôXMDoÙz|¼q%iXÑp¡w¸ lŽ6-·›å¸Ê`˜tÛ—D=2öÊK&”õ#“^»¤š˜-cHÕÒ€«\¹¹Ë°”R—|©|Ä[`txžÞI4¯µd^ìduÅàÌ6ã6Hb˜IaÅ)wÖpz’ª_â\(a.°-©®×™ü€‘‘µLñÃoÔlPöÆä®J›êIyªöY«ÞcÿvIgƒ‘hýð¦z„RB…Õü‘±Ç]}–h‘pÈ]%)ÖeNšOêç‹ð»6$þ®YϺ‚Œ4­Ûå#u‚BÅ(½CÀvLD™Xà¦QÿY_v$¹²ìø_R”õ,öE€£¿Jðì;MË.&“tú Ö Á—l'- òA÷T•ÜÉfÅRr–”ÂÆ³è&¢¦Õ ¤ƒ“@Q4(p¯‹‘”œÕå' 7‰j9\Þï\ÃT ¿®ü]…deAmBýÂËÊK¸>ª “«S¥"š'#+=+¹Nÿرš{åÍËocPò æO…KÁ˜?L7©ïO]þšÝo1­>@AVùw¬N<-hÈå®Òj¼äºÜ^J+™§[Ç[ùin?²ÀÞºÌa›ãòNêyL™¡kNÉ»+Á¾‡QØ~¶ÌA•F]8–„ÛQ*+Ôëç•»¨Aeæ+¬¤ƒ-ùèU\º+„œ‡¯¡*ÉÐDµ25ì'LyÌÑ¿’åçŸ×P îÂÂX–S¦Ów…É(Gë‚òƒ’ƒº;A­{NÕÆZÊþ)×r dÂ9.gίêºJqäÍÙ’Œð¥²®5Å™EõäÈÝ3³ãØ®ênôåÏ cšgpÒɉœ»JVìè dª²A+lG­Sšœ$ìù¤‰š‘ÕäÄë,ë Õ-2¼V×˯Å\Þ‚ïA‘]œ\•ü>oñÑí ù±É¹­i<ÛGB¸aÃüH¯T- á².7Z׬ÕQwåi…Ç“ä|´…öå,}ÖõV˶+UÖ…&Ù¢uA—BIæ)šSÁ5»9 >#NëülìvªU§|ˆÚ£ {}‡nyãw>”e™—kä¶Ã~0°k]§3ÇV^ÔY‹õën~¹S6×u'ßГ…À³zkn] È•Y´ìU¨F(fË öôwZÝ–wù¹†·-V\îë\[fŒ»l?çí$zì"’füôÚì¡Z{Á>ØCupÒë\x¨@cÒ¤†€ñ°[Kox^î®d74ztp¢© ?øÍt)UÏMQ|?±çC½;kâcÆYùÚ•³ÙQ§½Æ8ÕYNä”Þ½~4Ψe]ëCZsLwغúNªéQê'7v${Z•ïÊæÜ¿ˆÖÎÇwäOÒg”¾°w…¹ic}iR¾`„.h§u4ɦ6ßdêYW.¬-ÑO(T81iž4cO+ßǺ»ríóXæ3Ö€t1¤#ÜôFæÀÔó²®–· j>(S@|ÂÖ•›4ÎÂ¥t%aç{,jµÒþˆZ=äÂó]0ýñHP´2{™DÂvºšL©›¼~ª^»ksš$`–”¬\|rÿiHP®œEl €>ªëÇË#˜Ç÷ìöÖ /6bI‚ØŒËçgÖ‚eså]'©ò]è!“{W"Ý•oÞ%FqÌ´[We:aç]Kz=Jlù¤Ò$W6U¨Á½–äðN¥cë:nÊrÑH¼ “¾ÐUÔp…LÃÁÞ;‡ÝÕ£¦‰ƒ“ Q»:¶Xñ!*©0ÀŠQy|€ ÊsÉn€…ÜM­mš¬«vjV„Q¯®Šï¤•¯¦‚©¥ìr¯I¶Ýƒå ½¹UdC'û¬Jã°}ý “Íq{ÏlŒ^™%nº>'µ6‚‘’w@ÅË z¬©f\oÁëÖŒd¬¸EBm&¹‡È«ò®Òªû ÐnUÓµ¾ô«G¶tc®› u˜¶Mgõ']4‚c¤áÖ*lY3Þ&§'Fi¹fDg\S ( qc‘1gû®)Ï3'cNþjìʪdÅc~ëYõ!Ÿ3þpõÌÏ@Œ°·rºcß®øÕ’x‹i¨ÞŠÔÏ#·$¤Nej'   ç§NåjÇcn¶Ï‚Ýo)þÍ"mYÃn-˜9‡§Lõ‘]W1_ŸüNò¦Ú¤q:êAµØwWG¢UÓÎW$¨½“-2uF#*Lä1c_CÖ…-_û®S+Yã PèÈ@¯*èøl•‘aßHYÞó£†pb³Õ¯OžkYŒd] “vÕY:-²„·rs¶»Í†¾ÑG2íäÚN‚K‹SÃ…›H`4Õ©;gEо? z0® eAîX/{„ŠA6´ i#µG‘©aoÙCÇ^·Rwð¸2Q}’ [½!‘#|p²Î©ÈX,,®À¯Ô)4êÝ‘°ðFì5…êºéÜ"Ùæ j$Û&jïn]¡Û!FÜh³ªUÚ–’ Ôþ&;òfg²€]étd½ˆ[”·"fŽMA\PûL¤[aG)"hš²;`…ôÉyûlB©>¿ñózÂV2;µIvݺš‡àG’÷ƒÎŒf(ç~„™Ê¬–/˜£Ûó ý” ¥ñQnå—²&h'#1ÆåԨà Õꊗ4¶þ[ªÍ©;´6Yä!X»”:Ê®ZÌNäÑv0þpOë$œ—ùÓ«?%š™WA§h HÓ2okøšZ)Y—=5gÄѰ wY-.4‡ÖõXÕml_‚ë¿;–U; æüú<ç.sàåý„‚‘·}&@ jR§«yê ¼®Oy=xvñ7È“üÆ)½¤Q2资ü>*–±‡iüaʾ׺×g da$Ú£ ºÖõärãÀÕBô 4"?ªëyfï~¸Xt°û'2‚³M½úóë>ØâÕû]Hñó.”¯-낄ͦu€ÓèÈÖ~lÞ׺Z³lÔ©9-ëÒ@‡ÁƒîöDˆáy:=ßjƳ®sЬ?ÚjOÖ(É$œ¦ÿ=n–¾+ø‘ªwºú¤& ¶m9½Q?2éÇäე Ý€¶ÈÆšù"ĸ|x´xÒs~‚á&¼9ZÇÕÖ½$%òç¹=ùIY×ÉÝMkqh7òIú‡»õüÓûFù9êz•‹¯@ç›3æjŒ €2(´€”âc®kHׯ\ŒÄ̽U}¬‹&!_0–Rüsš’0(è‹ ;lgƒ¥ û®ñ™B“ZAnŒéŒlÎá^èÉκ]áÜÍóòS-[u½Öa½Ñ ï¦g{+//_gHW­¢„Vc³9¿Vž ;²"lNŽä¨êºâî³Ì¸¹»?99&ábØÁ"çl0؈$6äd­ "Â¥Tëx«"w¦F5!vYßõ¥×PâûC4œ§9ÉÓUY=$ÅÈÔWÁÇ)Â6wžJ¶×n^âiYë5v•ÙMÅԱغ–º'ˆŒs½2Mó)åÆ\¯Ub’[@Ñ"©å ·[° ]0T+ST.àrzÁ¼Óm¬' ûÿGIPjjÂ\²®±§9‹ï<"cësàXá/v¿l»uÿ·ý•ZÜù…nÞµ¦¥ñNʳ”]5£¸PzåàgK4ÖóVÔ·^ðså ±Z Ý¨M¿â„”¬«ÛºÒ6Ïþ‰IÝ‘üÔ²®úFÃ׺Æ(ò]ˆÙwÕÁeÉ@à ožWÑÛÎ'Ìz½§ªÛ못~#c±*Ë JÅY}á4 ¨²ÆŸ„Qg­V—Êm|Ô?Ï3JŸP–“¯‡}½ 6Í/¶Ñª³ù1޾¬¾oË=¤3´1X1€K¶øÇ¢÷e¸JIÛÁ"uÍR⇎øþPoOJ ã‚„|Æ'›ø ØZÿj«ò9wkY™€mJðrb ½MºÊó£Þ2œ GÞ¥M¹>ÖöAyÃüg]c›eõþSU bKã»Nl.ò]éö¯uåbùa¶­«³æª¿½>‘±I {ãL 0 )JäC÷´(ÕG—×VÓ%{|‰V½ÆnÉ-ôšÝïÊE°tŠ„«ÀjŸr-[×Ó›¿Öµ¨]ô±¼]ÑÜëŽ)ÐI08ôék®êœü8Y6 Љžl bOª~j®sâRmŸwYËö]QÚºzaã|Ò]ý’‰YËÄØçߪMF,ÿ€ ÊÖ–=ŽÞ@Õs5_]ìZͦ_뎓ò"þD‡’¼ÓxÎ[Dô°Â¸ CåR>ûb*)SÛ½I¾4j@äävÎ@7•jÇV¥uíÆ5™]%åg]«õO†N]óèâ ßUô&ƒ‚Ù¹•…  ѶŽ#Ø+컺´e1òÍ,@°§X¼u“žtµkF%TýëyŽr'¬äO‹ë¤P[¾«¦¢¬WלȃR@–{r+·> p¬ƒ“ÿ YWÛùÓ‘8×ÃMTì^£${L}ÜKÜõÁh±82bÖ?ãeÈý–PB\᣺Þ÷‡#BÏ׺Jöf pœ¶®’2^ýDÆc¹Û»‰Ñù.ß.ù®c„tqؘÞ¬¤‹¼öø¡»d„ßêŸI325ã*‚*@Slx‡iQǹ?Q·ŽÍá$ŠØRd]pûB×ÍÇÌöjFè¨ð†·÷Ò^ÏóÈ€ ÇÇw Žªq>¾+¿½êk]uü0ÖgÓ´mÌÞÕž8~^@x@3Tÿõø±êwõ$t69—›3kÛ)Æ¥yÖu¥‡?MlMŠ¡^›ÍÖU^my©iÒ¶©áÅtã¾.V|Y+Žõ"®uaü® “.°ù{¬f¬8ZWKËë!çv%&JH¶Ùè‰D~º[µÖ§#À¶Ãdû@]‘IÚ°å Gë[ç.­Jˆå1©Ä`Óƒ wÓX´"+P†š‡Ô×ý®éÍy’ ÍTãgj㫳–í3œÀhw¾WÔG8òÚB­B¯Õ¸ì‰!ƒû]h'¨#Qß,÷þ¤F_̲}|#ã±â®T+oí«è†4tÚÉI€w¢•D±´Éß…ñÑGCª¿Rà¶'¶‚7g›øá„¿¢¼ c!­q alŽ„ßÐ)É!8Íû’½šqv‚úÛf»ž'’°“.¸Åur½®¿9)ϧõ?…Ï‹œn¹fuäû°þä)£9vyü7öŒìý¬<ó' ^E¦Ö?{Š(¾½é‘»¶60üù4É1³»šÙÖUÚv‚—j®².ðH¸ßu¢RRdĆm£u%µbW¤|hSj3kØIñ?Öu‚)ŸŽ 2ÕBÛ¡YЦ• £}ûŒ£<ªi„„ÚâÃ1z…Ü-<8ÉЖu¬“ÈgTÝÀÂs-¨x :¼P&9²U¶‡Ž#™ä6|â$ÛVµ†kv¿+Ê¿Ñó?]üõ ´ƒ+2<1“”$ºeàGÒ„.èÅ›Ÿ˜Å%sÞKKjÉûéU¬ºµ|ú £'Í£&¶}bgF¦V·2‘0Z¬­æFÏ:c׎‘16 MK1So.OàVÏô·ÖO¸9Nuû¥öiÚ°ÔšÅÞ^zÖÕÃQ3«G“3S‹ ›½Ù#mˆë >åa¦‘ðhcöû¿ªëÚì ù­æC=r{¹J£©a-~I :A¹ÇãÁ?{#ì®d”ÅÌY^­rlòó RÒc™¹Á°hé½ì¯¨Uþ_NÏÐ5z ©$,uìÑ *îÁÃ9È„ê|µà}~oÎÿþhzÙ眛³PñY}>nqò[gþ„?0Ôw]]/±Û“7;þí¤¡ j.¬òÙ.?ï|÷È qmþ ø6ý±úµ©1˜~S¯Ú2ƒt¦#D©ß$ÁKs¯âX”"ã1 wÂÆ[¼»Ö•%hŠb¾,oÕ£1©Òy+̃!¡Zúçåz92 ÖÝàïIšÛawæ"9Qmé“Ѷ÷܈&¾¤'M÷8øP’ÝÕð`¾„L¬‰-–ûr –ñ!Ü‚HÄsxï»_›æ€FƒínU|ÇlÜÖ‹üe°É > fÈÛŒ;âaPeû0ªCYðs²QW£Å,ƒê DÚèíÇ4Ý/³hÓ8)RdÇvYÛ!^Xìy©Y„Ëd"kMIŽ "Ä™ŽìdÊE¦vê:ƒ˜‘í±›Š™L+²®ãÇL·4Ë4·[ÙÝèVt5ÕßOHðÁôW' J‚iÈ6ª4©ÃÒ YÓÈØ½S2ºzn Ë"&ój;» ‘S)r¦`¥xYŸѻww‡ÃÉ šëê(ŒtÑÎ=Ér6ÇÊ »Q¤q%«øc½.¢á› ·Qñ€ÌPE;w‡Jß|â_Ø ¥*eî£KÚLµyž—9p +É~¸?©>ÌÕ4”ÖªOCê²éôF <ˆÕÄßÍÄ]40QTK¯%ãå±¶šÓð^—¹–Å6Ñyʆºž'[åÈÎ7qŒÇ“qm¿ñ µ1v‹c Óõÿƒ§7ª,µ"Ÿ4ŸðÍÃ6*e ƒš¾º¾»¯»%#ëµ›ókmëb×Xß•ÃëO¡3À5®oyߨ†:ôþüø» µQ½QB7YòWÓ¸MŸ®ìÖôšžšŒ|ç1ñkf]HZòŒES’F/å&3¸—sàï¦HOàzĉº®ÙXOÑb@ÖIÏMüpŸÁ¤íU:oÍ"dgOyÜ”]µ= b.õèšþ­S’ô¢ÕP STM¸L×.…„™`á…”•çW©CcÙ`™Ú \:’ÿÅTݪ.îÖÈ¢?> Ì¶ú)Gíðfß,KmvqoKû¦q=‰ˆV˜·§5«“ª!øíÞ¿Iƒ(’À7ƒëÍ’n|OÕ ¸ -ºÖò°ôÊñ;"ÙÆÆ‹4ñûÿnGÐH–ùµŒN6ŰúA®ƒ£Ð‚'ßóþèKåÛIbS¦æö%}@ ©Oú6{/Ø·<%,•P­ 0Ç=æÖü±±]U”»—D ð 9ü¨gA¸‘ÝÔìZA`îJSƒ"î±3S)š€;¯á-\ÓXOžz¾uÉ­ÕiüṦ½9±Ûg¨Àîæü¸Â]?(Ñc¹ïײGS¹·wÑù7.­.EÆXþ`@ok\j'r(ø­­7¥þ{櫇rê°&@Οå÷6«ÑusTëbïWmÝxu\…­ë†fv>¹Ì§kÞŠIÛN”4 d•ôE½:êÀ1ˆ)¸wmj)‰ž >櫸lÑ™S>›MË Çm’ÜCé&Ú8Hþ%¼ˆ¢\LUé”b}‚uØ’ïB2³È× u”I%%¸µL.' { U cqr;sËùëâúðe}²Q/Kœ•á`}þº2”Q”ž!kZŽxçUúðÕ ªUo, ªUÝÊ¢òCÇ,¥æ{—É9 ¦ƒF…3Ó[³¸©²÷ ƒfÖ-ïþÄVÞ$¯Š)6G¼œÚgÊ>Ã\^R‚Зƒ\ËÖ•³Þ+¹L%`°²G7'7~¢0¨³a>õg_ú*¾”n 7È 4þòѦÄ1P%\j…v›ð¹ÙÔV¢Fº›ÚÉ•íÕÊ V´¹Û#6ÏåãÎXx⟉vw’=SY¤iÒLẊ÷ëëSL|2ðv–ïx¯Z‘ŒŽg-'ÂØºJK¦ú+Æ#+¬>Cêb²ÇœÃrXWàõ«½[öðCG)ÞxPÏežÄ:])7<ê²SÉ5kUµ\¥Fù~¡PéŒ=ïMë[Ö ßo€xéhG^25ô ‡žl­Ôî\AR)»CçÿXð/©û£ãt™Óí|í<ÖÊò[Ø}&TxïÐàp:ÊÚMEÞ^L_"…î'oÇXy’ùPó¿#Ç «r‚Sè0«ò^u$b‡#üÐÍËÛD„€¦*…Zµ[¢ü„ãWF!WKY¤'Anµª=•nŠ…ÃNøÜ²»U ×’À,›Ô fÒ¡ç|n>“mÍ÷–ᓱ·,÷„+2ÁŽØäô`â9´rÔ'˜éá]~È¢£ jc/]êI>­ð†eE:ox@]«Ó¡Ý²ÅD÷Î6ô¨å1gÝvŸRˆx„Mcêê°´áæ¼§îeu·ã¬˜wâ‚[Ÿ¶l‘Îa@±­ÞÚò¹]%ºe]P`¨ôšk/çÍ'¤OÙçù€.%är³N7{ɧÛþä<1¾™‘(Mk|b¯ú›†Å50 (kBïRŸ”–é70 **¨@^¨ò5¨tCõ•1î)\ÀÕÅîm22"w¸8Ú~E&ö{i‘õd]ì^oSòIж€¢ÌOöqø#åtPS ÚM9•©Oˆ¹dát¿d T(®¬Elœtjèo ÊStº¼²/hN¦ ðÍ©O%‚+ úsŒ³n"qUŸËíqöÈ›wëïý Èh²ðq¥–1.÷–v—ôÌçLllß•‰"—²3ÕþB?»ê“Ùø"‹@²éã(ÝÔd•»Õ[V]ú§ÍƒÚô"DjÄÂ7fç!®±ÉûÓà¼iP-gêÒ_0"}"í%¢ïYÚ2M­÷ö¤ÚcÒ•&M­$y5ˆB,ÊÜGçþ¬8™mÕAkjQFñmï‡6p>1ÊU¦`kà›«õ_óÞv’y6OT•¾pU§‹í‡êVC„¬¼™tØÆ(|{ ßü"cp–æ—U„°+_Æ¿@ct=²SÂVéæëº¸Ò­=w^8)ñÄ´†sbü¾õq6#[hd42‡sÕŸââ­.V†<+Z:(©o9J†FÍñö>úm~Ý·¹ÿ\hM{.1øé \ƒªÒ¥‡“¼ÙÐõ]Œ‘AíGÛpÃäš/$ü^ô’3²ôÙôÀ$Áí³¶*õ‰#¬²€“q&Y@yƒ³ë_ZsËmŽ‘>¡ì…ô£zÝn‘ìı:0‹ e¡¾[”Of]ì@›,¹+¨„ò¦ú%¥ßxÜ/:²Q`òm÷[äõ›_ßõÖ…îC=áëRÖØò]P$vT³¬«~^‹§Ûñ/Uj;~fm{¿RìÛ£¥xE^eªm| ö„¹g·æŽ»›ºî¼dwiec’9 fí<À –'Mm̺ä»z»Súþó¥Ñí·QÐ&á”.3é«&§u@ãx¦;ÌÎæÜq™ \¦âß\l¥`à7ÊjÀ„•„­ò¼›†á®ÁIs8c7ßdƒU5;™ø)JÇÀawW´ù­À½DPê×±·j²lU;ùŸ‹áïdÔ%)2¤²ë¡ƒŽH5Û'7:ÕsdM[)~baÝðR«5êÊYé:¨Ï²þ¨ÐǤ’н—±Y§ƒ}JË'v—¼öGíL'R4tÛ–+¬õ¢®ž®òhY>îx”‘ij­] ·0µ“¿òEsývE"¡:ÕÑÇ vñÝ?0u°ÖpµŠe‡²9%†4ÝîÇ4es8~ºñßç7z¨PñtX6`å‹è<$âK S$ô>ôß°¥¦ÿ–ÝÒëÆ=Pí5êcŠºhæèíéOoàV´» ÕŒÇWMú® @ñ#*þ“y³Ì@¢[kQ-ˆÉ¢{}ª£²tßÁïKîVͶ4Ø·&ûßQuÊÅÁ‰lÍØ­R0¬_¸_ á"]÷8'wŠ˜‡kFLùÝ‘8¦»œŸU5÷°1N1;`G"ŸŒ(‚¶uòúú¤áP’”A‡<\SÍ©çâM5 ÐZU¾£[5õÐOÎ|jÕ­À§äø!v‡X.—=ÕOŸ'>d9”0ƒN=Å´uîUu郿’X‘ضÌ_SK.²ºÜè˜å+GÓc§k å]XF#òò"Ø•ÄC×øh„£VƒêÄLöš°r8yuA¸µ8¼ÃžiãsFTš|˜Á’@™ôrwª&^ð'-¨#­+¤ì²¼_)JñQ¤«¥þpí*0ˆu·ßä­ Òt¿+†²Ðf{ŽìŽÞ<â4q»kÀÅì—¿¤nŸ´+[è!uJE‡';k1^7Ø"åM èlÒèyÿ-òüIX¤}¼©]ï½Öø=艀‰ˆf- Çtë?­Ä6Ûݙы°=õËÜ6ì‚o* ˼€¬{j‘Ì}Gþɸ†'ÆÖ#•Êj 0±Å,ÈLhW{žÏÒAå2Kµ±šMépN^_kàÉu¦â âVÑs™+„ÃS2¯ÒÕÉíõ‡. µ-en{Òj¢‘³3·^>“ ~~ J‚×1úv:„yˆ2›S 2A21‰Êp`†a ^d±‘Plšñþ6¨bô¶dç‰Ê-¼bЉjüh©o­‘´Ó*Z?Eß P¶ešZí™5cå'¯ÝZÑˈúïn²6ÛGuýœU$Á÷P²}_QÖT­X¿Pµ>òЇLÛkjüÏÙ ób­Z'û$~ƒ¥!ÒT7Óõ4h6xyxÀõ ±â ¿#r=óûC^P«…ÖË\´;0m#ÆÓØJRNÒèmSØgô&†¬ØFCµè¡î>êä>G¬>oƒIG+ÄÙà#ÁïCzÑäAš\Å)gÊg5?­*“¬SøØØ‹ Eo°¿†ÕÄ•”Ƶ²å¨{€;4¶L©T…Ó´4pÇ{¤ù\†›H`tTÖ”g²A·4+)èáñÝNen;l,}6ÓV±çÉÉŒ÷¹è1cÒµlB‹´è·…P3ã¢så67È5Š·ÙÆþäÃ.VÇ–rL‚L ¶;¼¼-Æœ´ï—ÀNÆz»j8[Ñ«8â­›U>d¤STG5ô®b¥(”áW$ƒ;øýyP»ì£©/šŸèÈëYÑKŠmXÙlãƒ|\¹è›ÚÉdŠÊ‡«€¸(^«öJ(°]¹ÂóüÚV^‘®WÅ?R ´KZ£ô ÝhõƒRúlœâåoìi{*`­×»æE@yLk´sqY¿µ èÊgÍ"/H›i±àÅk@™_¸€}•Ï6ÛÜE+F`Ïæn ¬ðXº º)rQæ<Y<"É›­§)PCl?ƒ ­"™ÃL•ë=Ø^f7Z³rCú––DÆLÛL"ä+¨Ovoê çiªÍ‘§·6òqü¶®óX–Rû¸üA­¢œQ憰ESƒN"­ äm©.؉_¤Ÿ4”x{Ƨ_YÓhаpeŸ™ìw,O«´,i:ÍéÔĽg;{/¢¶ôÁ¾Ïæ}Ô“ [ñ<Û a\ #\Ð&_A,™ .7Ž`É¥NI¢.GÎÚé>qúó2Ô™&8‰ß*‘•‘1°ý\ù…ìIa¿r¤&|¢×.²¡4&w±C.‰tDØzK$Åø}Vµ>§îô]Ý >t4¶+WÀ³áÒ0*¾:Il-®ÌŠåûæ>U8i@dÔOôâõ»‰¾ƒ™Ô‚´çª?JQ'<È¡ÀæƒÜ>4¬(u`§LmvÒÿŽòtòÝÞýuîŸr‘/Å €yj°~Vx€vYÍ®Ó÷{^¡Äǰôúy÷ÊG^\¶»×‡|¬¼‹Æº„÷ V»eC\[±›·HhJã˦-Ò³Dî¬@YTï¶4àCdž “0¨Uç³ež•¾ [ ŸÆ}zñãÇŠÊü<šôUíln°8I½YyÛ <Õë=i­¦gŽ9‡ÍÉf­×rÒ :2@†ÙáF©$¯ÇY<ô0"ËLp¨+†[Å `'öÚ䄲ԻÊÛsO,Q¾Óþ(¹wg Iì[·õ±y eáÁijÐA-ÔjxÏ*ú£š²Õ€ö˜ ešB$ rq§>“‚TPEy–ÚgÇ7/$ë꥽=pá25h x=Â*A(W°O)oÕ=êfÍ8›ªÎ!ô"?»_õÓÉ,ÍËÓÍó êx;‚·*kêþ˜ÌòxžÏú`JõäÈÚpª§W~T¥Œ rï¢Q0IÙUcàx°Ò¢ºr–<]º È '‰N´ljXdÐé0Ltf3íâ™5?õÁr±ý£O^{ ¯Ö| Fê@æK2  ›@GÂå{!‡Øo`oÕQФÎñïÄfú®H‚37´ñ2ÅRñE뱂^˜þ–Æ+kÒ]A½ŽÁ"ø/ áÛŽÇûw×’}W“Fä3¼F ‡K)fü=nˆšÆ`¯.!j¥þ¡´:.·Èº P–içÖ16 dx€«ët6=P4t\²­þ3ñàĵŽÕ¼ÆíJ~?ï†2Ð$y¨4žVC´¸Ä›2ð$© ¥…®ƒ”¿‰RÍú¨Ÿ—š¼ßI—Ù[~éÙ2½*˜ í»Ð6ÚúÚ™»¬k=ðzWŒ&;fèe‹„,RÈ%Ö˜Í)0²%سDY0«Fî€÷Ò…2X0d Ý÷ƒN.»TžLyÀš›œf¿‹‰Q+*å Ö¡4º"“O¶?þ„'×ùPå피¼9Àd– ù”–XâÁÌ7“¼¨ã|—7­Nùç{í£ÛŸœ¹aƒÒ>A/àˆ°% ùD]s€ú©ÂÁ·,vÔi'w$ЫÈquQÜaF¾iø£Ý(·.ÍôËÓ‹ÖUÞPàZ—D&cB~ï^ƒ#ÉKFß½*z»åŒ¨Ä|×yÑMs¹Úþ6å:Ì6±ªÏ,IQ÷üØuˇk]3§]­Ö kJµÊÖb=๠¼OêÐd]'  q~^UÇ䌶®Úœº·¾Ë’Œ UgRdÜ­8Î×s@åƒ-¹ÕX¢›¶Ï]—uÛÇW’r×Nñ³T­ãR M‹5›C­äöƼ€ lwÅ–MìSåWsÄ.ö]I¾«NêXEGý.ø®¾”ï£ýe]jGâ}É—Ÿï:?oèkå'"{”(`X—ùŸÐŒ“ï:wN zh$ó|aMÔã#WlB@ÝÆˆ Éºjú0;Ï2«ò®s©+NoUàZÛ/2f0èØ$·A×|šë$Æê5jdɺX•½¼+óu¾«Ý–SǯPvu’YjhÌàœÕv°˜ÕC’˜ `í[Ö5)߃>]Mîáb®+W4•­ $ðÊÐ×Îô"èkŽ)GVÞŠC¹$k›Òq=™yWd…”5Ã<2»H8É$÷çõeÕ * eåFÕŸÈX¨w:…fñÌ®3œy¾ã‹VýX—šHñMˤ<ÇøG`ÛíÓÖ5žÒ%;òý©’‹¯½( ;%‚©w׺ÙÐËêOì!_iDà„‚¬£î‰Í|˜Ñ%µÊ-÷ÖŒãAfºª›XpÎ[æp26:gIF¸ÓSdŒ«[VÖî1éÒåÄÚ+zÉC2¯>¶ù­ög‹UNYWy †rðÊ» ¢òxÃÃ|û&WOÐæžn9Cm`&T`g¤îw”rRÐ Æ{KõÙÖu ŠåÌ!ëNC]üõU.†¤FOÅdsÛJ.X57‡Jž ´;ZÎêû˜æÀ9‰ YÖÀÇ_‡:òy}²úe HËrGbµAj6ˆ1³Û‹i#ûHŽ=' $;2öBßz«¦:訶D{¢%JD×…©}”\0¿Ÿ Ñ‘è.€ö+<8…ÎT ö„ú×¼Äë7¿4ý‰É\¸æNUY}Qk.6’7Í!ú UA®í½ôßUÿ¤q5w• R4¨ã¦)Ý%ÈeùlhÀ)«¯åu$²fN ü)ÖÅ>W@ö&Èé%wñ{ÎÕõÝÕï*A›ù-¦7Øêˆß·r·6žœú«›U/PR îór¯~VRëdžmá¬3žfâÌô#ÒÅž@ îŽEGµ>Žjrdí…ÖÛ«_™ú½±-ËGÁÁU QçäåâöBë³È[$ìÅ!àb#ËX¡Ó¥9@v‘RÄ9\ð|+³‰UǦØýÕB€6›ÜH]•5µÇsrÿfu$J²ª}v"Þ°A¡YAšõ£ ×òüHRÕ%ßµ£dx0CöRÝT(nZWÙâÆ¬Qå+2vÒj_ëJÝèÈÞ²ÇBç Y×¹15ìØ¹w͘‹‘¥}Õ.ß•qÇ릊|9â•Åc'6ÔÁgü ‹Ë›`=Lľr²u|úä}«#Ý“nîù“Ë$™Ú)ù?ÉÚ»w·.8žGFˆFf“+wí3«³ƒ÷ÏnUHH6¬˜²Zþ°û–›òë¶x9›Þ† ÿM@=:È5éÌ0&Y“…ŸVCΊÎ'GñÞ_¥î»õzWè± Ôr÷Ðñ$xŽŒ@ªW %˺ÚZ©Ó} $C¼¦îH¼õϰ®“û‰ÎmA«ö£-;Å úæá±Ð±“ƒ÷Ü­þ †ö»€nÕh±®™&s+D'cÕJ±×2ô­i¿>ëÏk‘|4g5ήK¹Þu$öi_#ìe9#[Ëý#–“08¬, $„fIPü1œjô¯@ÀØ.ØÆÈÖ!Ûooõzž^ö§.(…²CÙù­ZÇ‚¥œR«5Ù êG€;©ÃÌ^UEÞ©ïp2[öBÁóœo”{'A¥0Qw '—>ÝÔÞŒnÍo×µ>~²ˆN3W¤CØÕ¸ó¶E#°ˆ¡Èˆ,Çí‰öwнd’XfjV.>år—©mèšÉ‘åDÈÅÞS`Røúî!ÑIs,Þòe}rÂdþØ]s Å[Oß…Tr}¤j­Šœ€Ì«Â‘ôcëã.¸Yo­Rƒh×Gˆ@ƒ^°¸†²k±ÁŽ>iO®åΉ[ÚJסH,:ŸeŒs*lÛntÙèy°2“¥Õ€º5gõL=­@·JÜ,ŨêÊqϵ®<œ!¤¦_žÔO`be!ŸVXÙ¾+³‰•ýÁwj?æt/Ýýóš*«zs–ªwÁÑm$}:’™¤õˆÝv Íbª`ë1·­+å"s¨åŠ_=S›SËݦ֟ºÍS¡Ú³ÈðNÜ6( šrÏrÛþ}©nƒð`«´®H•ÝS’Ó(®‡ý+ŽcCJ<÷ ]–Ùk]P—áÖ Õ,SŸ¤S¼ÚÚ<Åò'±©±ßÃ2¢Aù£¿¼·×ç²ÍI¾u™"R¯Ï$h¾—ö¾J³z€‘zeÌœˆW\àF)WÓGxjõ5'gÞ+MCº0÷4¢ùmÁ^ëëð¤u/åš!’°JLû}*åû³&ºŠælñÈ)‚,^–×Ç]albG–‡;µíË\ëBnkëjT3 Wø‰­ bZ´®ž?»'á– %-[WŸÈø$c®ïź}Ç•:9¹‚ôá+–ŒÜ¾¶±¾îª&ƒ¦¬X(·?¼lŸ»Z»<"Éò5ìcíð/šðŒÞ>‘ñ¼pKebNÔ‹­¢5ä»ð.ºÅUvÓ=_Ôw÷⬾ ¶0ÃÜd ¿£xå]°w-ÈBÿ¼8 +{xõyÌ4s-î³Îä.øÙ9e] ¬üXb±~Lµ'Nв”wMÈÚº^ºðR­þ †«´ Õ©O ukSë[ÝÔ,â¿çý¦±ÓÔ£¹ÖÕºEÀïaë*åã»NfºÕÀÁ€ù´ºmh}ÜПnÕ±¦ÌÁRìUÙP런e;;Ãu[†Lïö]§Î´r1fÞš‹y°ò~äNbÄ\ c“ùÙÚ8ÁÙ{àcuB•¼xÚÀ¢A]ì5h]}U“žDðÓZÍBÖU•'ÇÜ»‘ÏXÅUÍX’Ò+㊞qRa]…óûÐûÌBFÍ?¿Ÿ+;þåäÜš¿SH7J¹öõ<ìdž‡J1CÿǦöd¬®uSû,tLþ®©kƲ¿±úda1Àïš±hÅ=®(¹›Ô­+2´•È"@ÈÒ‡û‹{ë#küÅŒJ Ø”ë": ©i6ØÏÉuTýÎê{ÛM½ ¨J(«‡ ©³ú’•’áaå—m߉ä %µƒÅ;AóÊ ªs#ø®íD~¤ñU.^NþOBÖœwõw[o ]Ã4BÒV¿"wæ·\”w›éΛ×ã~•Sr"é@gWuy×g¿óžÒ­áÂ÷®™ê¡÷™ìÕÖ´Õ´ãÐÕ×Á§È›·kËóµYÁ𼤓âÉvrO„ÄG»µO«drW`¾’;žç}–ï:^ш汲Ҕ‰{¹ý’³µsð>#Ô—i]`p“мõ>‚c+&+™!kÔ鎴Ҷu׿#ÈLê@fz7×ÉŸÄD5“ ÈÑ¥kŽîWI^õ€V¦ÜUnÙ©Ö¹RgõuÚAm¯E¹µ A"â€E—Zª™çÎËèõyûÈÿt÷޽uCô|8²öø–Ÿ©m7FKêÞF,õ%蕊÷ÊN2jÕõôf·ÅU«¨uª_‚]Âñ¹:Ô·“uJ·¥21÷íx˜ôû°6®ä ’iÎ»Ž õO"OÆíØ–-ìH@ÎäŽë®u•™A»˜¼Ü‰—Ï2›Ó^ÞüÂäþXXAÝÆŸËçe­GöQ]%’«É¡Ÿt)+éRø»’kËÚ|A©¬oëjWágö#¦±êB,•gè×6/µe..£Ì(72‚zbo§Z…8é—ÇfL¶FëqCŸÖã? ˆO°h=Ò`Ò))lH}“L¥ñÑ>nìIÝíë%߸´¤Õ@ɲÜ&]õÃÿTƇgîm±?lІª™¸ Ô¨V…äj“ÓºEMßJ\jÆ„Šô¢Žœns–z7?`mâY@‰æö':5©¶<~:) ;˜ë=|âÌL2£n!+ìšøÍãwš@ÿ §'ý©2B0 U–³å[ÝVaDN§¬°·‘”JÎh½½ÞG·Ô®{™ºáp/ #o½C]µÈ«a$C‘¨£iÞÚéºÀÕ»Rê;ÒÅ”%u,ƒišó©†âtÛöç®KÖ¥¬ëƒÆÒðt>T “Ç9tº«¦[Cïc‘¹l´bŒ~ÍÛ² ª?/`Û$¸XîP5‰ž†Âä CIÆkÝœ2Ê,%Ť5EtcfŸ¤@y**ÝÔ‘š«œ0‡œ¹³†~úÎ*NYäæ(Éÿ­&¾ÎÁMmà _Bîcz¸uÒˆ¦¸§‚@0Ô׋ß^$¤ÜÇŠŠ×µŸ5•ëG(¹¸HlÎN)3ÅêAGÍ…Þ>tK¨9ÍS¹Û+vÙ`¼#V#˜Â¬ÏVJÉdM-Šc5Qè4T«„Ö<(iÔb͉Èg@¶ ¹“ ÍyÓ‘µ"¢o(ÑU3L¤·Z߸Ž?é7ºÏU>î<£¤¾X}Ìw|”–éÜàQ@WÍ­“—x°4÷JòqY,A0Â\è #Ö›pd¯¡IBƒãéP9ÕýuWw܈Pù ¸ ƒ@t¸$½‚¤`}j/f)·æÏ|~@Ž%ÛHczcãdºB•©NV¸TñÍ$^C@èv’AŒºêzÂÏ´\Ž-.ãºÇò|殼«Ôá.)è׈9FöäÕŽ€lñ+,^Ûˆ\>܃§¤2;ÜqÚ “H‡Eˆgôz3wÍ&¯ÏÆiD|}ŸRÝÊÉOE¿Q ÒýdS®ª0Å6äâÔ…Sþe>lêsx‘Fž8Úø½š÷ ÁX¡óé*A׋WN‰ý»mÓ£¾²YÑ@3\e]*;.•íÁ˜v/“¶µM¶Ö°»nfš4»t±[p >MýdÔ\¯«9ŸÂ¢£TIîAå”Ö&7m4Ö>=ÓãÜ­˜ ¤wÝ+¦ ÏPàYÍ opW0ÝÉÕª¬ë˜ä‡„³/–‰[¼j—©ø-ȶ;¡ËÒyB×'›e ôœ¯äì¼ù”ØINdW‰ÁÖ˜þ9” Täý0QÓ°0ÿ4›´¦åäNû)¾«ù â¿Ð>¶ Õ"(}!´Ò'E”r1š 8Šìê£Lù°W\!7‘4—J´.H\W¯Á-mì%-K ÔZmj €Ïÿ¤nå Eº«è´o™ZoÖïÙ»É{÷S?{EBcHˆJí}Ýn“ µ¬ùS Å϶Éûo?o"í]ó¾ŠIîó 1uêT§žü#sxž¹^g`‹¥”AŽ0@3Êîå_N€òœø¼™"iƯà«k°Ó™7DKlCOøæž»$£Ýç½æúþ¬æc¤­ þWñ/'‰dcu‘à:¸ÆÓ¢jÉ4EIdï È!}W‹ó—7­D‡J®ÓºŠ÷9Z0³%š[x7=ËWÙ÷A.z¦Âëi•©¥·«übOrzv\MS¡‘Íá8޶“ƒx¥ø Ôpn)FÏŒ=¿I7SØ©×ØëhX4ÏXKÖÖ;V×½CK‘‘ƒƒ”ªMê\`Fë@”Ò§*[Ý*+å„¶î¬UA3"ó6?à©”ìyÀ»)ëªCÉÿ#¦‚÷¥1}ô˜¦Ìm|š «VZW j“Më:nƒÍúæ/?F(ÌMäl0ž––]”T mÒ©ä2Í2µ¼¶1YŠƒƒqY¡š» awkÍäÌ-§ê"2#20š|b}Ðg­|¥2µ("õÛæ«½ãÛB› ùõ0Èu“>9Ïúä•uZ±þ$ÿfŠ‚ã[l¾ÎWÅp9[E3×Ïð®<3¾æ0{±9œßÐôÿ°tÓüÿš)gŠªå¿Øöòl9-Ÿn#a潂×pèRÇâ'xEzSäß“Jȧì©!”¾ä®:ÉÆÃ¶mI?LÑl]ÈêÕ3ˆR¦†¸¦ìc¦"ñ¹)Œ™X\ž,£¢FËTèÄzr"¿Îˆ4`Óîæ¦X*üF¦ÆÒ#¨Ûº:WöáýŠ}ÜÉ)¾ürª10¥jµ­÷,å[hªÌå ªš¡…@šÙ`Þéü±ç­Èõ)SXa}Ä`AÑä&µ$q¢}-1¼s†*EéúT2ÖÔ“²ú`Éûèfìì¬ ÌÉß~lQ\Ã[ŸùEýqu>’f°bцÀ³¯KŲɢ ÿÔTñí±©Ç{šÒÚ8GoOì4[%­÷eA>Li] áhÔ8 H[\¯tk€«:Ë«ÉGî¶þѾnQ꜆JP =\$Ìa!<‰F»ƒ›eÜFÏ»%y¿Ò¨¾ C9¡QóѲÊ@³žšÜgU¶Œ]”W*ú缆èÓQ=rïʳ®Ê$øoW…êdZû“ð§iSk£·€JÒÔ&PŒ¦±fQéÎO*uË$ë$C°£R# ­Gvu3ïW‚>*:X‚*…}zpø©'Õ¤¾t5ø>êg¹[s´×&c…Au+ÚÁÓ€Ò©§°ñ(®LÞ%Ê”?û~¬»ZeØq@†(G–ÐêæjiJv[§eë‘La´Z Jã°¯âÇLy”ËWØuº[ª*zAþ¥ðàÄ+J-!ÎÇ„þúÃí“dFÕú~'¾Xv=NÝø±3/§»4ê3‚–â6ÞºœZÑóËàpdÈoä\%=žá›ÆÕ’“L²Îbû„H¯,½ µú¤t@svÞ{ÿ8¥Ý­yî… "'·˜(6ˆ•B?¡¦8 jôO^Y–iÖÛy…wd×é?ªÎÇõwÕ¯Ÿfˆ5.à"äÕÚr-x®Ûœ_;=—Ÿ»Ð1?®[> ¨[,ÖØë²Lú®²Üy‰' h!(Ï*áJú£Yz’9ô$UÈHëê Ã1¬A{¾–ƒ‰àà˜~¯¥†Ñ¥yãÖPÿíB%¯uµÙùÚ£…§ŽuÕÖõyS¯3âäA¬„×ÜØ~K 0®ýQn‘¥¡\½“—D£à£н]*|®<Ô qIÆã uÐÖ”ÜcP¥fy(°OÔ^Iw¨=¥¡~»áoͰ?5„Üijõ¤›¦VŸœóZ/Y^­=››(Í4-IŒ 1=Ìã(Šr:¤"ò»~ú ù1{]s€¬™*‹þtOîÁIö Ixg…-±Ö6n±ýy •)Û?o™·¡È?zs¿—Îö×rÛ÷…¢æ¥(¼Ö•6Ýþ‚êÝúÄçÕ¶rñì+¹Ú’ºÛmŒ~Ò¸“*%=ý‰Ó܃”íyj¯Ë³R 7(‘2÷q"Q¢ÞNôêÓR™±su»pÆnÕn(̫ǂ±5ó®§×Beòò`õ«†0Ÿøu4ˆ¥zW©Û3(ô.§@˜ZÝ s5Û|ºíÀ`Õ›ßhÚ$Ìt‹Óµ9© v·ìðаÔcnZ Ý©bsh§~W:ÔŸ@|{+üIåí)|§ÜÐÉW¶S¨ú\Àm¿ôd±÷“;|¶ÐË¿€ŠÜ¦kü>R'÷Û‰~Zö?TE¿Ë¹í9[u œù^]|Þ”‚¯÷c«~»’©;êè‚‘=¤h‘$Ëufj½sNÕ|A}[Cñ¤(Mª¹pGÕÉÙÞy3_ ÒË,Û/AùåÅë—$v½Û…@»oqÚïë¼n×¼¿€•dj}¦-S;ˆªëS„MW>»%kˆrºUª#…r&Ü4îa7ã`å]t°ç¥ºÖ•ß´æZá*UeF±€:ÜP²}BRU¥É¢¼ûmŸµiù¬SfÐe¢¸¹ÔóýÖºw5±ß–Ûz¯R@§.o G.ËLuÝÖÃl¹°Ûˆ÷ª5e,'ÛPàü˜†ã÷Õ-“<¿¯éÿå±§L-Ím‘×Ý8Vø‹Nß'”õ­FzŠL¢ÿ.ù„ëÖR™„…¨Mh3­+X%{¥‡"ÙU¿;kú¨(nâú®óÒS ùçÝ«î·Mz_ô°¡“ʤ,w•%ñ´Û‘IJ!¨+º—V–Å´±…§È3Ê ãÒ>\ ºâß1W Tƒê”)E¾k[ßåíšv…5Ïá}/µ. ·P‚Þœ®_ÄÚE~õ»é{dýçúÝ­›~[ãÓºÑàÚ‘‡ª{:‰>Á«Ëó@”Cqü¾íø‡E)…IÒÉîöSa¼§«5)üa’ļ sFIچëy—ݬ+yŠS†±IV’5Ö`3 /­»@¦vrÙ>y‡ [û2Ó(Ø.=Õu3ïZAý¡^¡’÷Ql…¼™[ 0rT;›ö¥×löZ2(W¹´,Ï .Fb(­VéJäÑûRº^vo>(Ô2Dæ‘“÷OV_2S–Ëäã™×7L6ªzâovkÊYÑò^ÿ1ï:Æ:–¤~S­VUó£Ó |ÿÄ¡nxzZ)7«?¯ùVVè‰zR§x¾9´¦>™Ûdóòæñý“Õs€H£v"êÙáa.Œ––2²ú¸_ÞPuÌ-‡~Ф©µqåQú…¹ÝWév$ÎýzÍBŒnFg";žI6œ›ÜÕÚÕ!êÜâlïN·ÂN<ÖS:o_W‘wj›ô)ÿÔeë¡ÎÓ§!Šòvëÿ­¡¬ ŸdÒs2bí$/L´ÿkƒêõæ;ÊŒêŠg¼ºþz½7X”+ÐiÍt͈!yž9?•Þ%Êù–GéÈ´d]Iwßá˜Ç+©W"߃¼@‰Üˆ™ 'ò”¾ÙªÅ`a†w[ ¤Feè)¥%™ÚÊIšðÈlÆ–÷ÃDtÑÔæÛ ê·çv‹›þs%¼öóî’îWßÍõq˜Mi†[®ÊÖkÝ@›«»©ç‰±€¥¬‡~sòüAïaΠa¥9L´«ª>‚Xœº®`ÑÉú¤ÏÚÊLÂP]a´Â,*lÇÖþxj^™±|†Üï0±_õ¥[>ô‡,î;¬•Œ.ÏM•ŠÊè`Ä,ò6¹ˆµ‡ šÛƒ%\z¦Ç¦ÎДq†`$¥cƒQÝ“²†{n5/Y!’²æœŽºC"à%Œ†í¢±WH@Õñ(4µUËvYz5²ÎÓ›JY>sþr‚…‡Ž©7¢ž$®2Ùáið&9¬' eÑ‘§§'ßÇô5ŲÑÄ6¾çàCôd•"+,ð‚Ó%"{ÜÕÔ(Í…ë^|èÈÜ ý †s¼!¦„Eík¤³{È)AÊØÍEsÅóúJ˜K¾Üõ&ö¶sÔ‘‹cU€¤5˜Ñf¶?±º…Ya‘0ñÒò¡&ÚkÁ:=Š –Õûr^YW zøO^™œÓõ2š*†ÜÍùŒ(@I÷ÀÐM§ácÑ¡ßE†¥·¾ŒO§½”-:°OÓ^dN¶'0M”n-ˆ-²£n¶.Z¸Ïñ™b—Tí±NƒZí†)6“ŸÇ’™×—9Kq¨;Å^™¿oÕÑ!Ü 0™Ûp-R«(¥¯Ì©ÜÄ»’;öæô(°ç)öÖkÐöT×iwŠýd8Þÿ›ÞÛAwPÈòÒ€7›¼|½wŠ y†) okøRKãpó‚ì  =ÅžEÊÅ5dšÝ"i«»nÕuA[SýJ´sfVȃ3Õ=n)5'JE“’ÌeF´ÍŽ –)ÞöÃíJÎ]ü”J±J̹ÇCÕžèÅ6IC'Ïð‰5»ábû5îÄ:› hý höl¬½&«_ƒ€H§Àòø¨?Ù“×›Uwõ¥s¿׺FOÞ òÞG»1.ɵ<T2½*Tl]ó?;¥lÜ2ƨòPpÀ²¬èaÎWyÒZ× u¾âÛµ‹J–¢{ìysÙú[:½CÕ>¬2Ò‡…lHwž5M.wÇýVÆr¼ì§ŒZOv(íù&®_‡ð"@ð9¼ö¸±È~z¾ÐºpÔ‰oPN„¨çŠR|h0h½§Ê;ÖÆì¹Âž?€ëœÆ-sï¢ ,þ.Œ…Ú–©Ú(WöªÖFcœ’g 5~[ÕŠÎû¶—Þ¡ªæo¥¸—êþˆdçìâ îÓyóN‰K<ˆk’¤*h’™†¼nÂGþìýRà·€8¸ù3‚9PÑ+¡5Ãôý†¸à zZ“¹ÈYnDvìgq«€Íѹm:"ßoKù–¹?ÏoT®cà¡w®ßµ3EÇEÁÄñ’9œÀÕ„Ë&2:k"vÂ"ƒü „ÆÖ·®*ÞM¤á“¸ÞpxÅ›#s–¡è|ÂËWŸ¸»H04<Ê¿Â-û  ^Þ¼Kµ;v<+«Î¦ÛÅD  ÌÊPéUñoL&^]§Œú¾Fc!‹±#ž¹?%fgp O¢“ñ:Ë¿ƒ5ùdÁ§¼äëbx È“.” ü‰Iæ/9±žRS Ãh ±*·¿ò ÉŒÔHkßèTöŒ­ØTõ@ÄÌ&Á–úÉê™5]²NïEì4”ÕC Á›þo1⋼©Õn‹[Äj·XO‘†'Ë•¡¹DshQ*Ð"‡ÒFÂäguv÷:kòA}¸ õKX$|÷ô3gû ‡Ê÷ ÚÀâïBJË0 `ØSÙUÙã³§8¹)Ômï¾±Æ !$5¥§Ðb«aðaž·žÙ:ÂÍb‘2¨ÌD÷÷‰I6¥IÐw8ÞyÐJ3E!pMKÿm?&æ—6 ȤsßÀ;]M5ßèô68ž ÕM®Ö£8ÀÎZ¿^ÀÐ9™É©›Dõä`^®GpFaj“ÆG‰ŸX3¤`dô+s—ÝíÁ¶ Z\‰›,1Uïjp ëÜYÔI[o ð&ë’Wsj–;¯K²³°H—Ù¬ˆ@‹2¨±¤»êl¹Ç“ž$ÓÚÜSg8v›djY<ï·Ñw¾ß©*ÿˆŠd]W‚¦ð9k°Òx@+ú+aÊM€úl<€Í{•þ¢Éòí2›Ø©üèä=.‹GrX?\ãm‘N  ý-nS°a4'k˜G˺ºW¶&Î&¸NÜZ‰|ö’¦Î›Ž k$ “ëê²®õ6Zo1Ø>„¡''p0<±9Û]A4ý¿þÊé}EÞ,YñTxrW£)L†þÖ‡±’ì“aOùe>³s#²m¨‘Ì2(4ɨÂo<]è•}²Vú®*‡þ¬p™dêɽ:°/‹5¢MÊ wT:“P²„1¯£"C€R2Ãd°JÒ"qp3å«q†a°>ÊÖä²Ü¤/:u«u‚N.óáëCi\¨3Fôªrd“ÞR k kƒrz±¼2gi¦ö:9)¯<—½&1ÞöÔÙ =)í3kÙÍ’T'Á'ÃÍ+÷@•qc°ÄjÄÎa¢»|ô³úÜH± ¿ßŸ‚IĵÍßÔÉ(ŽE·DÖÓ=“'TSá² ûQ{ðMEž‚Þ^–{¤ªÎõq™à¿·^yîž§3›]zó ÇÎÚAµAæ@Ì’­«¡ÉIAE¬FMj¼ÀX›8ŸúF”hAëq32â ]Þ¯=üÓ ´ye¹ÏÖçr M£Aóøƒ¢"6©ü`Ah˜Èçx\‡É“z4gõkPC1ZÇÒäÈ.W¼žœÞµ.`è<ñ;AÓÛøß&ç©ä>OÉ.²&k5?ÀEìz³ðKÃZöG_sV²± §J›õ‹–‚y9Ùm£ÅE•ÂK×3” ƒÂ6óø„ôN7àgI; ¼¯‡ÊŽ™o[/¾»"J1æî‰E ék"'`Ô!J¡L,zÞƒòà­JdTEZrû W[6/ E_¬%y¿õôZn8}„17OæáÈnÄ{T†9ókWtFÕà€ì©{¤S¼nvôÛþl["Y³uíêƒóÄ­‹A [Ó¨›j5IÞ!1#clŽ…Äh6%ÒI‡3kÆŽbægÀŠ,kV@ÚPîêøfìžËþ¨®çKÁøBYê–“í»Ò†6ï¨~B‡J™í : jiGx ÕŒ¬~ÒlNùoÉГ—½ÓšVe¬©Mëã¤79}‚Še%y(ˆZT‹Î&¶_‚0’†µÐÏ©yuw½• U¬~òÜõusnÌÜÍÖUß8ëVOEåY×–p1›iÃví´! £šUµ³ FŠX5Eë¿yly¨B’YÍ¡jV5Å"${Ò\,ßøX÷BËÈUÂí— _ø([ÀWëb÷<^9e¢5êÚ[7¹uÝ[À¸Öµß»}WÄÞ,÷:›”m]mŠ5œ?Úzùëò›G “È6°x†“-{J¾ æS{yƒJgUưSQâOiIÿ”r¹èw˜éæÂ“È·qqãqŽ4¼ÌÎ =D²?–›*Oø§á0‰-Y×~µÄÍ Kµ¾;؈ޯ˜è—ÐPÐT¦Z@8ÉTU ¯&@Aì¬5Æž¦¼8¾aË»½D00ØŠA™e-—‰'™JµÊdsïŠæ1uoB>ëª{F±ÑñìCÖVWEÆ¢ºrí^jsdl™ú½ÈšR]êä²)B¼b[OBYãÁ؉2éÀwõÄúaà‘ÑáEæÆ ö&~(Î?p‡c3":½ý<Ã2$=ygù·B¾gÉw½Ö?µ XÑÆ¬eV넟•ï*ƒ*ŒH %cà»¶YÈç˨Ÿu%j,aªóòÊ;/Å­ôf5KZw­käú±®·R¹FçÝwh[2ï‚uMæËKYýyÙ\¸Üuš ãmÖ åÝÔEöPd@3á·£5è¦>²Î›w)ë³WÞ¼ëmw”gÇŸtÝY¶¡dwÁD®ñpŸ“%(\J¡>cTDQ÷ïT?ƒu±uõ{ G<)©×Ÿ_ëj¯.¿¾ë< yä]ή’tQ:Oj¼Ì ·âéNÕªzh-Ê]á9«W±K²u¼Ò]6ˆ+غÎ= ȧ nªM0gTƒ?õíIå[r~“Ć|χl<}èzÊ“g¨Þ°uA§Ä+bóC¸5V&{(êížtpà.Sî֖uåÂVJ,Afgõ矦D*iY¡ó¼qÖ»N'ãÕŒS‘x‡Ý•(ôúh(Yíßàà2Â5¤"†RÛÊ»Ð~QÅÇÎŽŒI ¢iÿp=žök]¹%Æ(À¼'S-àKF–¡Œ5‹Ö ÇŒ‘áåκ5ãn­)‚ËRY}É©dÛÔgÝ}}$cRú”ƒ _Y}_Ocð9?“Ê"Á O¦gDç5 ¹{`}’ÝηŠ–ÝX;‘ñi0\ë: ^ýdõÍt|£î¢¬>·a„ÃJ¤™^S×`°EÒºi]5«Á5®fÀKZÉ’*Y¨0瓸cË–§~°ÿÈÔê¨lŒ‚BŽ )p²š{4 j ¸* ´§.¯:à èK5cYêHÌØ÷sñ=ž|öwÖÑ•TrÔnR” »"‹RÃÑX:@ ÉÆŠ{¢Ü g꺎‘}€õk—‰»¸ßU  Ê Á ?”•ÈïA.õ¨F¤ÐRäüp&v1ÿÝA[W›ÆŽA›ôSU×OdÌ>™Æ' ;ÏÈøŒÕé»ZÐ ¿3 îÉŸ¡±†þQKTãGOAÛ”„áÑÙí›ÝÚɳ:ÃýXãÚŸÇ"Ë×+­«{¯>Jccxä„X‰Rɧù’Ýѵ©©‚6÷j®ë*ƒxŒõ=öôUÉ¡üëÔ™‰1SEuÓÈy2;a˜í.wuŠÛ)S;gVÍrþeªë·‚!ºŸ‚úœ²')2žçj}FèN}:ýÓMmû«îÖÇ– ˜}2¥\àÁGxj~({!‰ÿol½h…¯ÝEdi…£Ó`™–dÄÐqБã* YÍÝN2ÕÔâ)ñ¾¢d¹ò³õé\`h»[Õq­½žMy—*ß…FdÏþ£­?ºkñj‘€éH° ös>¨zÍ¢ž,ÀÄ-•ÌqãZ ÉI…jñÁ©ø¤ä¬î.ì­A 9ÔHžoë¢]ìу±UDªéP"`( RA ­oSmbÁ+¨ƒui[ך½+¶FÀË­|™ÓáÉNÑè®pèŸý‰ý!œœÙÛ'wÜ “çM²uáŒY=ŠJDÄ¢¢|8ó3Y%#eN‡"v™ Õqîì[þ£²º\æyÇžKÁím¼5Ôr581N€,´ðæÒsnKi8âû´Œ1ôC5%<. +kZûîaÞP†-t‡¼ôid5¶˜/X!qÞÌääjöeëJEŠ =˜|F-“Ü`iJäqƒ15ñØkîi못š ü$CV]OM+šA¹¦ `¿ó,*bJÃ!.¤ÈˆúßSl Í>#òx"LÖAŒg‡Ïrd]0Ì €ë$ÇÆÙ['~u]J™/«#[®ìDmÃ"°¯b\ÅXTo W˜Ý©½Zá*M6F£iHCXûónwiœÍÐ]pöÑ>À-ìŠÇpÜÝGhvì5ýÉPÍx÷ÅjÕ¤2òfKµŸ×™Ÿ ü | ‚¬¥æ: ‡sɺP× eXšXé&­ìÕßrM±1¹±£ñ£jgH¹z9®,ηglzн»ö{BäÜ«~1³UËÜgõQY4[WKÃÊÅyj=a‰ W¸íÈÊÛ'Gvüþfs6¶¦>ûŒ›%Z ­æp8]ÅŽ¬Võ±Bž¸Øwólú£\¨+žÑgi¹ ¶O½ÎÇÿjÍ" {„t툺ŸöõúÈ•íö5(+Œ4|T[:Ρæ0è&=®ÿÛ$k\Θ …î~Hó»Ú=ò0ö’0Lˆ›0®¡%ÌGq÷¼`‚‡dë}zÛ²ìœôËϽã¦8ö›³Ô?½Ïê¼ ÚIÆHäï"ØÜŸ½’¬Ð2ÚÈŽŒe, Oí-ÓAÏ’b¦v vË'ÂánÍÑÙü;^Û(ÉpT´Bå“Nîß?þîÕ£wŸñq]w••jAt±žA^2­ˆ~—a/×¾Ï(JK§ÙŠ ZØ6”å¬éÔ6î'€ÿ‘’òq úV#ëüÔçµCR¥[AhŽF )@‹-y×Ct[•!¤ãäAÀ ƒü„ûö”ùJ–G ü(u†·ÞŠfÀh§y7Q¨rk<¥ÓºØ ­1$“²®"3dÔÓÛýqŸq‰§ZAïøiOŒ¦t¿CkŠÒ\X`ËnD¹ UÞÉ¢£)1™ PXv0Ìó£¦^¾¸ÂSzO 9K2 ܺ†B â“{õ¤®êÑ CÅ(Ù‹äfzø”«³¦SS%[HñÒWûÜÍ´4ÿÓtU:[!kFªFpœ”€*8íßFB ï$”ÚÌsè •é2±µ/~ÏŒJÑ„HîûáÕPµdÙ LßÉòA!#’ž=­5UJ6¾«æN;È0œâÏ'vô@ ÓÒNs 0½–j v@òÔ3w=fPOк0W ÞN8›a§tfv˜<É•+¾<¾hé9?¾+/ÖŒ±¦ ò‰Õ}©Þ‡CzöQÿć#=0å»RNF¨@^úk]špV>©<Úwú®KQþ?sbOœÆ*ö]0HM§A–ä«;æôÁÙÔa5™Q5äP±êúùo©A§ÄË·ÇÝy; wv¡o;H…w\Eêâ0B+öÉ«F>ÏfšîSºÓ~ꀬ¼«¥+tqõ{+c÷V*¿ÚÇ9‰.+8ôÁ Ü“Ò8A,kƒ>ÖÏîÊ0S®·>S»4JϺJ™ò] ãw7.K­I©æZe±.îÜÂ>H•µ:c“úc]Ý)~nc~+>ƒç1ñ5 +?¥àûGçµWÁàKÖ@Ç7œÈC¯Um‡ö8¿žuåO±[û°tÔ¸=«îâ1/ŒJ².J¯>‚lUì@ʺ@d.Ú”ö¤|®uXHvÛP™4aZ>ÕŸ³“GÈÔÖãÔ½dîR]øˆ2÷Q@NfÇx{¶uÈZåïÃ%Œ¶ÓÛ½¾k5×­©¦þ±®¯€zâóû½D>_»ãp$|W2RBfŸÊ¢|.züÖsÃY`¡íW証B±ðÈ€¤×y°ìÑw®#Ÿ?íÏÂæ×³®>ºÏïS `›ÔÖ¥Dâ/€]¾ë<Šå¸]²´e±µ‘Ò§L\’Ÿ£6œéµG(ù|š{³Z%e†Z\yPËàMX²Lâê!MI~²(Ò‹u.Ïqž)«Ç¦*'A§>#ÚøìÇ`°0ÅïÀ®dEFÜ á*Æ#¸¾y×ò<ò®OB•ö'ÅŸ‚F2ãæñ.êÕG3­(2¦]¬Â¸„ˆm“ü<Ëìâuß®e1€Ù SiÓAnØ]幇#cz=²k]Çc:ïÚ©9ï8t]%‘<ƒg¡Ñºr‘T&l_=ï[Ra.0<5Ë]/)A¢¨Çþ(@çо™.åJ–¦ ,W±f„°d#×Ñ ZI·'ruTîG'ýiŠŒ ä¶3JZê£-ÅØ*ÄÒÈE$V3ôdÛ7üœ¬t… ›“<HOšY Nè±Aåܽ‹z†L_~îÝâ©Eë*ÒQEäXù³ ”·#cïÙÚ²»O)Oc S˜®£¯¡øUWTì•¶2wcñÑ`¿ |!²Æ##BdMÅ«ùIíëßKlámÙÇ<÷mþ¬Q‚aP“„±ØÕ Ÿ›øc7D–M„vJ¯Ä`²c)%,»»Q2·¦r‘wƒœ£¢—Û²w¿\ž¯n¥Ä‘$÷=ïf뙥¬«nþÀö[ó:ƹÇ¡Ò<½ÏXëþ°«ŒîšñäLìD"¯Úri0Áp½táç¬&q€Wª©´ç# ¹„[_GvüŽÕÁ Q'G¶žÂÛÅîÕ›iø‘½u…{’›—"Tó+=í»š¿'‘H‘ð7ú"‹G¨©K@=r5&è <æÊ q†Áu“)=_(jLc@NM<>_4¾ÌIMb¾56C?ëB. ßÉåÇ[-=—õQêU¯êWxÅ’Ù'«lª ÇÒ“…ðMÿ¸«Ü-A»ˆ;ø¹"R©Éºj¢à`íh'ËqüÚqÚSŽº1¼üEV±”jŠT†ðû寕‘ä]“™ÅJQyЍ`õ¢²!¹«šúRŸúFĦ–K^`ä ÚLŠªÂ‘µ²åÈ XïÉ÷d-ô„–¥°WVn4cÒ%74kvl^ÚÿFPc¯ÝukOŽÛèè­h{Óî°÷AË^^~G¹µYnZC|I<ôd™tp®{O_쑱4Nцë‡)™ßÛ&,€ŸÉ…d&pR„5‹ô$jª,ƒ:Ï Ó& ç_(”9Ÿê4¨Û2­:ÝF %‘kdÇ]ÁÄ«Úô‡Î“­«å]  Ž4©£t(Ÿq9 ”à!´:Û+O]0}MKKÚäT©õÞ+¬w$ŸlVux±ªGoó-ÈÞB,k# ýÊ/†gÊÄÖÐ? 9àWoEƒX]*ÕQÔB˜¦J ýBáÏkõÁ6î§²| ª°ÀŠt}:wÏ•uÊÛI"‘É–6"Ò½×q¹îªU«óuŠ_ÅÕ½ùÌãMm“Üìx0…JQx•ÈhŒ]Ÿœ†LmôüQÞæRcWÙùÙþð7Q5Fì™æ0ÂŒÖ9ÏÊÝEBYÍË"DÊ$ONnÐFŸŸµq0VŠöȼ^Íq¢¡»v{šOºtŠÀEý&xµ>™w¡ô*ämÄËM”ÿXN>tÖ5µõ±c2awëãl:)­/LNhz? ÒðiªÔ“'ý·S"8È-^ʺúÜö]õŸõÖ¦ŠûÄ✠%`ûe¤-,ìQn¸–‰X@ìÔvöïvÚ)½ÒÍ(>Sg͈}ª]•‘µN¡îPÀhgGET5_!¯(·¶ú&ã}™{ßèdFî†ÿC`zªå×*$^mF_Ÿ@Û?Qw˜£ жܔÓ'+\}È jÊ칡=øá´>µMÖ+|Wæ½ë¬"X`3fÓºðœUnÃ-.lyx÷=Øì0ß½ˆüA!ìýÑmß¹¹õ?w1åhÉVsRžÏ`T†ú¦°ÿ6Aºc`ÈÙvep§²u E^ë*$DPŽ|j›ˆ·÷ña²?oÍ!Þ`ë™”Ú,ìóQiª!+¯Ö)+éY¹S˜;XBÜV)p’ú€rÄZ0i’ò":µå3¨S0}Œ7?t¦X¤•÷£~á;`{)ŒU«—ÁŸBJ2ѠΧ£F¿ù#€¡Ž:}e|ˆAŸ@ß…µì×~×b¡õÔˆ?ÄcîkØ2[n¡óEP‰á }ºæi»”kÓ W>>‰-Ÿw ì˜ÅrN×¥N)À ê2_}äþ?¦üÄDOX’‡š-Ñ$‘³f‹ ‡B*߸ýÉ,%'*‘æ2Ь߾C¥;ÆzÒVÕæ,…ê:±G¡G‹áVùr@Öx«hoïyŸrË;`UË9ÝNVÞĶ´»q§Æ¶¶z«¨ˆ-»'Õ'T¸Ö…Ƥ|Ò ™¹ÇIOxK°c¥ëýîÝÅ6ö Ľ@Ðë&xým;ß"ý&ü‰ËUxdã£07§BY4µªL ŸÏfúTeµöô÷ŽÄ´õ Té…àX½‡²óË?6ôè® õéÐ%ú$Ðì½ ÞÍ;V¸ªëóD"ùpð é•k³¾ˆ‡;ToàZ×y)r¦uµuْºÎzÚÇh0–ôndìM{5à8‡¬ë<–¬G }1 e|Z”™nÏo7kR£ùȤ§Yáå'3ræÜŠºY§@8L—&kÜôkî•þ±®ÒÍ¥~Òð.¾r£ø|ŽŸÁ{úfZ׈p“h]H?•—Tò;Æc^Ù‚Ÿ'õ(2”4Ôz ¤Uk¶¡9Ý^:Õ–Uü ´ /‚»LÂNÃdášòPh…*þ§MŸ»bÿWI&úSEÖu®m+þ•':Úïk=iu8ê} ndœoæÛïh±2Å(ÒG¢ ßðô{чÜóÆSeG7ð8Ÿ”ìØ´[‘)Ü«– ó›Õ¬®+kƒIz¬;œœ„arúñj¢óéÊMÁp Yn¤’E‘ôH×ÕG4½‹ç÷o·ñFÆ:kQdlVÆ;²]{ÕÑ–¬f<ª•öe½y‘±,"ˆë¥ò;’T×ÑåNöjcSÌ Ov,Xpx¹|:[]ήfsÅ×r¯2Ö<+ý"¶`/"ö:jÔÇ×¥`è¸/vº?¬2t‡èÕ.‚ª¼ûu±©÷]zNéFñ[@>Àà}s¹W1–cé»(#ƒ*ˆàT³4üZzs—k¬ÇjtuǨ§Í=mƒ¹A%ëš°Æà‰Ê߬¾W&‚' ?7Üeâ¼]àþÈæ”w äˆ/œ"‡³ J²{ðI{}ú¬j†?èÕ5ã|Üó¯ÜZM§´t'¬tµ?#+äÀ¨#ü©9Û±ÄÊÓA\!q¼yÖfÏ­G[EmÛSÓŒ[ðìz½úà¿!2Ñ[±ŠäŽDEgh}½4 zM¯qÿZ@õÓ{̤7އ>’lÄÿj. W?x€,ÀsbP,«I6W§±ö¨Ë5þ;)ÆÐÒØ<7¶*ßÌ€÷°=¤‚{EÅP¦iëö¬'fvÙÝ\½ÙºZ™I®0—DyuÎ}Ç ·gs.yÚÀ›¹{Ì"¦ò¤~JÃ'ì2¨¶&;J5*U{‡1J—K©¥ÚlRRs½›w:Bp«¬B9N̈.g‚'(KÊ@¦Çö>)ÓÍõó†xÆ>ŸŒê5V®ùÞVØ“®¢©ù…ÁFãŽ0«ßAýüþ¥ßrô:oßôC×X6 v…ý®ú_ Ñ꯽736"7MrFs½ò*•:À»¨Ó¡ï¤>+b4‡@v{’à4à/àpMÞ¯?NÁªõÄàâæêNãvJŸªegçtXºi4µóÃóë7‡A%§"}«¯‰ìq=1e× YI£wîåú ïÞx¬]i'©Óžª³äׇ ¹–ï°öôfDaûköË>Ä?ýÆÆ™GÚàtñÏl´}hÞWz÷ËkoÃ;õ Mh¬&ëZÇðŒ0LLÿB$mÓ³åRŠÖ_ðÐÓ8„‘]©ù‹\-š’éªÙQ29õ`â˜4q¯àãOlp€w&=ÙRToà Ëb1Tu· bÛÃØ¿Qsò+R5eª¡.e˜w[šv#œr#fì½(ãÌuoéàµW!–š:Öp™lCdg¾ò+÷.0â áy‘ì=ï¾&+à  ¿ `¢äþ…º¦my¼K†‹åjéŽ&Ùü·þáž(mr‰'zÂÕr»©Á&|íz{vãà%Z«Ûß<“¯3 ÍvÆþ„ˆçÕŒùýÑNϯZó#dÝr6°¢¥mn°:Ƈ!dK·6ؼ< ¼.ÁˆniEbÓL•q©å³sÏÈ&½ë¿V¿DæÍúÄýíº^S«ìE/fh8‚†Ðfü+!ãÑ›F!!\I Ý1iÞŠkP9äé€CÊ3û”hóãý{Øâ¯m´ÔuÐ÷%`¿æ0ÅNŒt¯}™RÞ^à;Øî6|î™E:=·nJ20:6:<(èé…˜Í}ºñIRêC8Ü91h}+ j•4d…Çž ™é¦\Ãú|·©ò¶ÚºÀO®?:e†%_W‘\'~R2“È1¡ßyêÙ¨S÷ ýQ²¢;à8¥(7Æ|1ÐÎöNЏi]¡£³íÖVród;ò]'˜Ö/6•cÐÀ¦¶¤t6?Ù“kP¹{N<°½©È‘'ó±íÌ7! 3}ë¡7‘f$/™E`Máå±knß…žþ0Øž‚ÞE nnGß!}>9~ÚØÔ•„,ÑëUl=~ÈÄÇÑ›åéX†»ý'¹ü«£¨*[Nêînh¼²$®ÑþÜDÖ W몂ŠÒØÔQ>êÂç#³/ƒ•Ð ³¨š^¯žFø ´{¿fï—;Ïcà0Œüºrºú´-‰M]Cô”S`þPq Ê=&º±_ðÑ5#T°÷!°s÷bÚ ¦½ÛàÑ"‚êîÀ}@§ÙêÂsh™NÖÕl5-7™š^³È/•¬„]é K½<6+’ufúPøÊÍU–>_Û—5"×ÓÚ¸i܃ ¬f-ûãI›·6À<'ÇqrÔy椦Á'Ó avÞM¤5RẮßkIúXTôéêðž"fçulÁô£«l…?|% cë’©ÿÖ… ƒD,¼$' ª¿é‘ýù£!G%-y€@vº«ÙÆPÈËΨ'ØQù:<Ï~sØÓí¤¼ØS?ì…k&.±bš¡}[4· %L’¡¬¦Mÿ¦aÄÝýÊyé`×éÃ$‚kç¥õÈIݾ»À6Š:Î;ÆT-óu•DvH®öR¶¾óf_‘Šî«|d¨g"²;0žÛ­4kpDâ(“‰à ^cÉs2¶bªÓIâUZæ‡â÷ºÂD–„hý×öÁN·n°ìS>7¯aNÁ¶“àb ¬ü€ŠVËMèžöˆì®w?î¾ 'Áè <´ÞÔmDšÚª ê˜û'½ÞùêáÇò¶lÍÅúÙ«..jÉ=s£Kf²šµ†ŒÑféYÎSâÿ$!ë‰9YìokÅ»³‹¹ºÃ~qÎj9Ùrœ¾õĽ Žá¥áí‰Z½4|’æânE;:o‚É,ר¬ÁSÓ>ä¨ë:²k"Ÿ4‡~ÊÎÍh|&Ûí ´i6èõØ>Ÿˆ{¦%loÍþšv­îù’÷á–WbcSuÒºBÃí³ÓU—Iš'¡ÌÞžþäßmžt´&mÙ°™Ùò\ª¹1Ï;áOÊ(_š¯Nêr´mß¾Ê݇Ëß ¯O×h»kµÊUú}Pvòþï²>c¼6<ˆ+¾o lc¾]ÅR2C@-Ñ]µ“¦ªŸ€î„× ËG TãʧNŠX{€f·8+Ó Žqq5`ÙÕlP³ÙóœñÒ@^ÈÌT hÔGi¯LþQ¨’û`¬JVÞ’tŠªLÍô›ë–uµ·xeÍÒòm¤ŒXH.ÙeÇrÛ§«ÕŸ”d4 ¤‡q:u0Z§©a7¼J 6vg)Þ˜ýñ±ÂTe]ãá~Or’çé‰Ê…Øfe8ŠVèÈ:Ec¯ð5 µÆÇQ‹û ¿¯JYû’lOúÏÕwUÇ Jæ¶.Ðj«kžT·ÆsÞÞ¤ž›¡:Ò˜ŸŠ½+on±C¥¼¹››1d§ú½ÏÅ­Õµ¯(e™CÚ”Ž ª$³‡Ê¾²¸‹r |O¤[´\ªòˆI gK¦VæGö8Iá„?&@Š²éˆ Yèd{[sIÉ *Tƒ^­† ßÐAŸ£ÄÿÛ“b°Ø7ªUV P8ÅèMv×g7u9·ðnw\Ù"&él‘tdœE/Ìö$DLÕtà9uÞu.!k*ù‰÷G»®“Àcy'èd°„ÌÄLƃçÝñHlõú”;’«QÜB8E[ ³Tõ¶`]æ‘…Š¥ý´˜îì ÉwÝUøªçœ(|§5”;nš1”»÷Q(ùƒ4K‰nÙ½ž*iÈ1Úø¨u`z¤Óåš Pwúç†g‹¡8e6OÙ÷Šæ­MtR6ITÁг#cÃ×Zo.EL#mul§"ëZ¯ärB—ý¨ Gç7a†R·Â$v Õà8^ãClÑ$Âx5²–~,De]ue«®CÃvÑŒÏ#bU(.íŒ"o6¨Þ¥r z:¢ó‘ ,ô«™w1ÐvvUš‹<8ÿzµäÏÉ…èD°æôtínû³%RÔ‡DeÍ0ôOï†_Ž­wã… $ d^O¯ü–0iZ?ô< þQ(%xçŤM$(9ÅHw¾};J§&«òP m4›±©,úv Ÿ¡ šO/æSj¤áà€›:CÝŒ è³J7ÙtNé#H4wq‡/z„Ü6Y“ãdÖx™‰ôðb¦Öô_ù§HˆÑÜ×móË¥‡«wÁòõàct“ÀGë*ùËâa1Ø@årB A^ò]zfÞ…Be“;r¢¯BûÜàG2[‚…ÑIΪ²¦–Cž h:@0H=?cëô.Š7Ë•L-Ñw¯Ò™jEÅ×d]'#¨²ðüæŒaŸ'â± Y$‰ÅË=•ôÅàÍ ýFÎû“y—A¹²£gE‹k,Jf£öZÛç‹’i¼H’­¹²3!ÊÞàÆDp£Z&{Óÿ¢jr7z”·›"ãL¯ÿv[ÿåCœsÞ`Ã9N"aFêžF³uIÒÖõãŒÇ‡rŒi¸1 Nzå]€kÚw5ö'¢ûÐulCe7 †$U0v^MÙú #ÃÖU)€wþ9Ë¥œ¿§€úÄ»mz\A£umˆ¦¿ÓA󀿳™äÈR›SÃp²3ÁC?6›ìñ˜Cåó ”¶C^ÝT EÝ“u±ç”.hè;P®lÅ\þýX¤,£¼¯ Qc©PCH‘“„3m´®S9ï:Éú¶ï*«uYW³çAGW=7àùê!FYºRüùÖ¥ŸuÍáûÐ-]…ˆ·?J ÙŒâ±$ïý‰ÒÛÇwÛï9NÞ¦ÿúøX[@¡ºÎV¬«tjVl¤©]¦VŸìµ®üQõl”Éûy)uQT U¢‹ßùG3–2§|×ëáÆA~Î׺R»]»òD²³2·´»óý6 ÕÏ0˜Ÿöç~ —Z¡ çP­ä"ÏsžŸ­«Vj0Ÿmí:8>©oû®%Ù½He–å&ðŠÈwõélïä.-¡Ýšl],÷q’ç.ëÿE—u5rq‡uuâ~Pš´õ±®µ=©úpÞ5ëλ–L²Æ£pÞõ nÞUJûô*.>èYWR²†yÑKè¼M¹sfã_´-x6›ñAð].§þ¸:^{b°m{UŒ8g„@Õ4عHß=Z\Ôk§Éò]'[wCàOZ 6MƒG@‡ÞùêqAÙ½¦S»!¿÷ú¿šq·0ƒV1˜Š$©0}O!ë|'X÷`ݶtyc¯â@‹^¶JÐZåÕ€|îMÆŠõûwW!Ȱ“³zlDª®ŠK¶q’T;2`÷|RfË £›Ç«vkFTØÊ®@Ÿ^xÍ=àTy*Õ—:µ­«ýò€ºçÐ=($ôU”Bô[¬®50ÃÊêìú±q¿ÖU•Æ…6›¥Þƨ²À$ônŒ§ÿA ¬¡2ñ¼õf ?VlŠIÈ säR§>Âe6ø¡&²Üù²Ÿ`RËFM˜ ÈzÀŠÛ i( 'ùËÍÉ56 (¶´õZ\·Ó8€6ÔàhJ¶cÊË21æK!JôïÍDaÿ“îIiµXSß7EúŒÝÖŒ-ZDzšÝž@îÏÅ;ÌWYÞA9Ý]£”u ωüƒÞ~×ÊjýC«h²»€­ Sº‡±—Z«õÕ3/ß/ÖyÊjŒíëÆèÂɲ½JµêúÞ߬ie¦î`E»Ûˆ/ж>ôGí©Ø¾Ö?G§wFDcEãi¸µšY \lcúC!‘n7uÒ‘µè¥©q]õÐqHªpªb:EhR{¨*8\Œ[‡˜-1~ŸÜ]ˆÑ¢;ž­w'akÕh^æÕ‡Ã3)ÞÓNPÖ€Ä.‹:”‘!Ÿ*4µµ)æM‘¬ŽD­{py¤zR§îe½&gn;ÛOaßí Á<®Ó퇱¾ÑYæ"«‡çŽ{†²;µ"$df@h°Iþ…*F1ÔYSžÊ2ÙŸÜ‘ýµ®œ›UB×㨸çîÙRµ-夃< /!8¿>ªë}3ÑIЮrW³O³F#«ÐH{׿¡#¦LY?…¯¡®slå]Ÿ“ód‰32¢lÑœ1’V“4õÁÙ|Â$Ö?„­ËôæŒE-.€ÞÈ\ *åtØ¢Ì4Vˆ–l³ž¢ë±óÉΪ,à<={KnpœÜÁâìsT[ ”;¶N‡ž¢‡âšãÜ/âé&°GS¯R),abXsYf.ä©föI‚Ân_s|ƒ eˆn!ô ¯¼‰Ò±¡"§ÔÓ´ì^¥:ûµéÁ3ì`Õôà öû†LQË'ÏOÆ`_ãv™ØZSV*.GƱ§Wªe‡Bê”·!lškj± 8Ìr‚ŠaàYp¹÷‡Ü½ËžœO„-®x)´®\w•u¥§Èp3²FX]*?È Åi¢Iv' ×jÝÊþñÌå†NŽÙ×v³{}ÔúrQ’ÿè¼öì;`‘CÿXË-Õõ9>ˆæ¾… ':«.ßAæ¥ÈQ’¦„quIÖU÷G$»®©~Wh°'™$fú•l2¨J]BdëKžP˜'y%èNy(þ-âÜ"ÝSäˆ]ŸiÒý>{WÞ…írO±QòfSïÆ°l)ýÇ9ã¼`¶·º¸õ«ri—Ñ\äAA¯srùW°gší»@Ã#PûªRÔŠsØä\S¦v’! ûàK9GV˜9ÞŒÛê¡“ÛŽ“ß"ß=èÝŽ,³ÀºÆ:•áH=¯ß{S„íè5}ÄçKO¾áÅ*TÖëz´ÒÒ`÷Ô=î¥G0 å-õ=7Tª}D·åýRÓ¬ú”ªµÒ;,l#V¹Š–‹µek3Ay‰xUßá$ÛÁ³•l])q†‚T«&K#`ZþÅHŒOu«LÄ já¾æ*>±ß55àV_ŒÕ G=/ÜRÀê-Ž³Õš‹$¬I ªå…‡S.=2 åÈò Ð1ºPy8fî­¡8”è6C5Z){‡Â\rævk’9¤<9ŽDW4È¿—ì_8ÅdÙ¶!ýìûV´äzòFŠ3g)O‡- Ð €ad¡ÙfõÖÀC"˜Õßæ¦=äðbºÌŠà׌ëä`³-¤BysIȺEÉ `˜Wvî%eåî«5ë)Ô7I¨wBž?ô÷HêÜâ:.Eæ>77É‚­5qM íÆžLþÂîÉ+ ¿;‡óƒ|†ŠðOç¦JE `gAšŸH•ªl .9²Ï)™†‡4%Ȱ¬É ܦE¶±»L‡ÁIBØÝPqz"&_çso‹WÞ¼È › MI>DP½@ÓÛ’°OWɪVèfHRy8B’ô;©ަ"¯2ó‘QA%ëÊÿÅŽ5‘¥AÃJÛ±aÛÙ£Üè9ÝwH”­ B•jz¹ãü/°xeŒ†#ŠÎ§ö&ï—F> DÍ´®¶Û‡ßN@Ö•¦u°z¢mš’¦0¸Ö^å»j’®yP·T…ÉÙê=)Ñ×Ó¤ ÎÞ [ZO1)ëB§‘·‡ðRü\ë:55ËŒ…º¥”ëT Dµ>÷8‘ˆ;ÀúƼXÂÌçÜ!çÅ@4•†ß»_(ƒÕü^Üœ=õž†â;VzÉV¡š¡¢¢ªìÓ^ Ûš=°4ÖÐŽg†+üCØTuÏÔA<”‹]§ŒGþúÀlõãÖNÜ®*&N`$» Ñ- òëJ£›[. {þˆ´ö™oï¾e]€¥1QµjÍÏfõÏãgù0Ñ–––HkÔe»Êá ´XšÙ䞟y°ßK¼"CÑZ5&õßVy¥ó-Wµ÷y`N!.$Ÿ‹}Eݲ2ù!€ ÚZâÁÜ„Î4ÆÎ‹à ²ŽœÌòcõaùìsó™à£UýG€ìË]ÛȲ®”Xb_)l‹5BOʾ ‚/Õ¦ŽU:…¯RÉ“«‚¼’[Ì7×¶uî .‹S–ËÅ…,%àî1­HÇ"¡ôªŠ~de¬·ç¶Ä8¶U@b‘ý.\+÷®Ð*zë õJ(h×5¤2-yWwòb‹r²Aþe~´e»f@zÌ¡˜‰YÙÒÁÒ¨…·Ø&šHEºP²®“Úf]jZÒ¾Zèà™V¤r­ì6×Kg;ïHõ’ÙžËIØ1öÏnTáB’¹i¬@çò)ùÊáùíaƒZC¢d`H–q„æög'h÷"ƒêö¬Á,»å®êâlù/¤ÐÜi8ùÏpV_žæÁM%g[Zà>A„ür—…½zÐXg.*Θ©MZWCž*ëÊÅ‚=hq*‰>“Ï`6Lî´»)Üô&ÂŒ¯Y“úxž;Ò”[ @Öfo‚¦5É NK²Ð:i  m YWmÖ š_µ*ý™¦Nú`@ÊHª%ÚÓb~üU*b5 ?Ú)áؤ»®;>rºâkÓ1[s e+H¨s)K¶5™ñ-´dvò†ûõÈ®uåG£[q\Rv…tEÆâð~¨ˆà®³u¼~=Û'LbïU¾ uÚv^Iëƒhºfmú# ûHçÍûzì³Ë† V-¯–gaê7C:À%hZÉ“„»¼¾h£Fö3 ˆ4quæÀã(cOˆàåP] eè³ÊÔv-^ Ì»wû.,¨2“ï‚aã çžÙÉíd‚jj·8mû¯ «u.Aeâ¨ZÇ|m¹<ÞÜ"¡•ûÛH½{"•ü²7aÎÄcNdÆ£­ƒjxx3;±¿ôíâ—¤2 ZU†RLywÄÉõ¶ë­: KÓ1i¥ªÉÖ¦ÕªíK…*<Ó½ŽÐ/Æúu’©µñA•5Ñ6à¿Usà\´dg£I‚Mh[¯Õìm“”¸¬þ 39›à¼˜z´'mæhïH­ e§.¨JÐ ¤jä“öÔØrB^*)sKC›¸hÛfŸ{níãô  VÛ;ž<]TØ]tÁ=áÖ¨6K ÉÚlÃÒñ‘ ÏÑ’3…VœÖ€N]A Æâ ŒŒí£Gƒ$l'søž–’°ãL›ÃdJ¤ÖÕ‘@œLn…ÕºÝÓ_õc]-u7/SUkCG0eÞni:®=ê–kwãòŒpM%W•»’o5Xã÷ÍuÇí¼<üÁ\Þ°'Ãyy¹îõ¦UåÀX³ØDê£Åzàê?¦‚ÖþO%±ùüÊĤj–àY¾-}ƒáLøáÂ[œ‡¡ ‚ÐÉBë`)QÞUZµAäú£Ÿ6%‘ ˜ÔÖévHç¼ØØc÷ #ÒaYpçœ3"RH¼Î"Dl.Yãs‹·1ŒŸqd#·ÛäÞã('S•Cèm¶i.õ* ~æ Ûæš±…ÄŽ2ïc MçåYŸŽYm*f–¿ëÀ:k°Ô-þ¦T–•E÷Öà[¦ùŠoµ Ô~;º×ºÒP¢ vªEd0¤ö’œß°”†wïÒC²iÛèÁdÈ(ÄijH[;•-D&å®’„t£Kú¤Õnî^‹‚aëàV2z0î†ÈŸ4Õ@´Ö]Ѷ5hPx:#cÊëHÔ®âœÛëQþÆÝ§Ú`s;ñ“´>Ÿqä'ÅGlë:±‹<—˜Ë}1UDÕÚvd¹¨âƒ©Í1ÕéRชOÇ,ïOæÖ›³‘Æe%xm±{ºÆu½‰fƒŠÚš^hû3ÁªI$] (4aZˆ+˜ef¬l|ú9µM y-IœzÁjê'‰Öî~)2›s‡ºrºÚEZJ5Þ¤nK؇ \/ŽÛÝu+&ÒË’¡Kø¼¿2¨’ }.88²„tƒQ¼+wGGbÓ]õ/ kõC² ½äFëªi#™¦Ý7Ó‚ªõG3ÖÑXÇø PG+¦Ø]¤ %„µôdLt£)ØGý¢`Ý„À’gé.rùýÛd\«A»tºc)ÄúÄ"§QÑè1ñJ1'žŸÔ{@W°)®éôiDÎíÌh~¬–'<èÀö©hzÞyÒI}Œèq“®(¿Ë†ŽK2ÍvбñÉ Omó5ÞÉ!¯Ÿ¨d0Mú khûîjØÄ ¨ÿM–.ÐÞ4®õO=tsn¥zÙápïž !wX+Þ¯O~Y„uŠb22²óŽ}¤jóÊfÎm_Ȧ&6µÑMæu^óò©DëëÏø/õæ´$–h‰&T®ðd½:Ý^ƒdœ¶®Y§ êÜÏ’ÆÎ–4:_3ôš’p¤=lñ6Êi¶lðJq3ËLäßJn0ÉÄÑã.¯—;R)~`¡¸6g-NÐÇý5ð½>Ä'XòP .sü_‘ìÚ,A[D‹*c-Âà®U ƒé¦’†µ†÷;@½}%á³%Ši]eRa=©&< ¶utNêÇ>ë ]s[îƒjKðIÛÔÊ0™åèíC"·>¸×œU¤ø/;¶/âD©ïR•†,¯v<;ÉÙ”w8à#´>½±?ŒÎ•g Þ[ÝÈÚ/Èé1[ö¶TNžJ'éa®œQçÑLfÙœ‘!xe)ãWl;%0(Ú†ú0%Rq(+1xQ ḠrÎFý×Mµ‰I—æ8ùX—âÀn^¹D‡æ”>cGô¢ÞU,orpÆÌGáôð¶.$=º“Øåí4µ‘uP&ÕwC•\Z)('5ÑB?•Î'?[¦e‚’„ M`½ô=’-rÖö!Ê„áÉ RšÝócP }S—-i†©_UÞ£NÌ;™ ¾×õ¤xƒ™úŒ¡Ëë7õhQ°X]ŠA¸luáöØ›ê[3{ÌyþF®Ÿ²‰ý’»ÓUäýÀÖ#sØooîÚÐIþì“öN2!Œ0ËÆª£7Z»-¸³ª¥J!w¤›Ó€ãxH°€ZÿŽ«0+/v)4ÍØ{~$ïÎ=1+=QxíÊòPê4@)›ÂAJOV&€ÔšT×cÄJO ø«Kk²w€NÏÊ*§§2òŠ„ÒüÑGhJ7‹ÎèÙÈ/¨y9AŸEØÆT´QŸÌÈs€sxuX“)I3°ãÆØM½ P~k/T‡Fƒ1['(;«Çº3êó^zð¢_ô°©ó3ä;ï‹¥ÝÆ÷ ¶šªðŽœ¼ê?§b„ø/5?…ÀÛiÙr¤§æÈ¥‰à›1Ô^E^I€p¦¹e½d[ÚºN&böìS1ÚÔz’º"ÆêÔGÞ<ª•NŽÍP/3 ™S®3 Öd¼ßAk¯ç—jµ°A®] * 4svôZ¤ãû 1û"‡WSýPêô\å r¯jŸ×ëÈ ó¢§U¬4Ä}Ž{uí#nÒ÷$ÅàÌÙåä H=F<«[|'}òœ&‘CöãlÛ/qðqJeû®bü ̸èBž²ÅŠO9¥42(8Ó.ƒªÛÖ5è æZ¤³¹©U&ë,I¯Ò*Ë:k Î"z0V“K9y€e£N!n™X°¿Êº iòïžÆ–Š 5ÙŠ=#Iõb@üj«UvW¦0‹ÚeŸ}8Œö?V (0Éæ“T*{¡hüNò®ì0 aö.º VgR/æ¸}k?I¡X~šŽWk£iÔå¢QÈÙɺ9¤®ˆ9U#þ @N½è8” „q¸cÂ"nr&ì©É ­’eÆ` Jm„6‰®rŠüc<"ì›ÈW“ó—ÇRÒ/„ü®·^ ã$§rÛ=(N;]cùÉ¡ëðûÛg±Ô@rwGM” °PÒm«a§¤[Nè!¿u@¤ñtÑœ5ádzûšaPhU(…M©û yfE¼Ö•óÀ AcؤÍkøºÁÑ<ï ôg~J{AÚvW‘ú+£ öã¶’ÿ”?RÃç>*Ðù<Šˆ¹”Ì``ñàD˜*—ŸxËí²½ñ“jÉSÐ|\ðÒCåÖû„~#ÆYeɦÏÛÇæz´`›îjLEîz¹«‘ae5t<7U¨cOÔ¶Ä I÷ÁôÄöu,AúMe¢^”Ùtˆýå÷ccôÝ“LBf2´K6ÿ²„jkG1å“@ÃËDé}Ùþ£“º•/øˆhC'EIÊ++ƒvP‹dI—W4ñ#P–Vz`Ò@ö;½ó‚«Ï8÷ 4^û{¯©½ öyµdFÕãà,7wêyìÀ¥$Vú!WÊÖ“í­}êy§ ß&r¶Å¼ÇÑ«‰P•EK²Üùàš×rßí n¢“9ÿ¶ˆÄâ”dæÞ‹~RY˾J7ïÞuôy$S¹¡r¨$u.ÒúØÝ,Å¢SdPä?¯mWe m4Ö eë8b( 3ôLMÕ8Ý´|öz{7n7ÎD¯„‚8åÑú(ïvØyÐçPW¬<ѧ¹·%„ì#Oÿ!øu¹ãµW+õ;ÅNí‰ë…©ÝP¦á”MSC=ÿ'åFêgnz‡{;z~I ¸ßx-,´>ãvt<ÛTF]šµŠ_¼½!Ñ'”Õüùd~:)ç÷dW#ÙPÉÀe;ØŸÊË{Âè6¾3`yìÐ~»©—£é*öŽë;—xšŽé¼$L-ëa¢Ä–ÝA^Sv×ÚPÞÛ¯éÁïc-Ø¿nuE¬ÌÈ åÝ-Á¾K“Ü#º'9飚Š3ï½Ô E‘׿Ç{)ŸÊ5Kú!ð¿O»3$·ñ‚@ÿކûS…”.6&éGÛ‡µeÁp¶©=£B]ll\Äh˜ZZ™°¨ù—E^@^è¾ÑX˱Õù~ Ô±œH{´ýí±”´d“|(¼ö0Xî§CºZVÓk¶ ÕGqwO—¤"s*¾´±µG><žt4Ö¤-â´÷G¢TßK¿E^·€¶‚žì9µ›Cç%³q] ˆ1[úh&6ñIŸY§ëoÎO·Šÿæx;v2aC½oåFÇØ›ròöVgoë¹Ê  þ¢ªõ«vEÀÏÛ3åÃu> @°(ñ­Õ×pU×Ûãî·ïp;Oaj Q•©a7ãÞcT[oDЯªÙó‹·H¨ùi”–¢úaÂç*k󃵚†ç”Ñ›Eº©skÁr?Ê’{°ŠÙôAx¯ÿ¶z7b{ð[oûe¥T–>:A¥OýØÝü#zžO$;|ÒáÝž¥j‚uT%G«/Y¤ÀÙª¬³Jô)Õɼٽ½Šýâ±ÎÏ –Ø1ZY&„®t×é@›©Ê .}¥Ç¾ÿ/?.‹ðI#+É„2ÐUýêw­ï—BÖ§Ò]a#òÎøú…º^xsÞ!¿ ùŠ ½Ê‘½NØud.-J˜§üÈàËOÖ_GIIBõ0všŠ׫>#– …î9u€Ô#ƒD¼(óN‰áAÎùóɤ¶%Lmv÷XNT¢Üjt\>Mø²Ø—Fäß~™çf‘uAácñÞµyß—k]m$ªCÇ`Â-®Ú?ÞANyµµÕ6BG‘‹ò°ô’=TšÍb›(}ºo%nGWíКêœI–¶€ðT¥ x*oþŒÝVˆŸá~(»ëYU@ˆ‰-ö]Øõ‘[k­/y¿œ•"âÕÄŽ ªºkбò)ƒÚm(7ÂÖ±ƒÅƒ¹µÇ9ì-؆Ò`™uIµÏXpfê­‚‹môôßéP‚²E ”ÌÎÝ1/B,¥ˆ;5Ã\ìêÑIµÆø‡®ד‚ø\Rˆ8Iؼ*·,Y£·òŠZBNǹ 5$_0’ºK4ìÿNænxÊÙøQ”GB8ìT)d½ÁèϸˆYaÄè,É¢‰¤\ÔLãÀ…¯5§¨¹¬W$WψŽó›Ÿ•œÝà8ÏßkxxëÝ${˜ÅWF¥>e~Êšúø4/OE›æ¡¬}$ÓÀÝ* ëñ"Sfsjž.è9>†‘ Jþ–'Ã"Ê6覎l¨r}Rß0‘MÐZR¢Üj€n$G ­©íP›êí™;»ý½¦c€wRS ®!ÚÝlCmÂÈ ZJÿ`s,üO‰¾-ùZ;%áâÿ} ZÇ ™ Mú$µ·Å5Ç)ÿ9V_˜@7[ûbè ¯,S›;ÄŒòžƒ½*‚¢Û!ëZs,Õí‰L¾4<­¢r«çìécn3`üHÕǵM%JXòl‚Ñ!» ‘žúà}è"îˆ^Å:è-‘e&ªÎb¦”9¥A[Æí %èþoÉp‚iîéZ+^̯c]¯ Íìú}šš¼î¶§{ðeÖ±f_ˆ†>Üþ$ÄíK2º¶É¼Æ?Âks—O©Î$Ã;¶EZ‘˜˜!œ‚úä¸ÜöQm¬YÖ×&Pð݃…ŠEÜz’Ï=¯’MmWÅkÈO|ÐóL¢ŽSÝíŸ{|põPCP¢ Í O!V§6s[UA®òW‘ƒ2V?WËU[ð´NÎÆ’i}%ƒìW"6<Úé…ük¿ÿ#Âp~‰sÐyZÆ7ƒã^Púó^yé ¢mÆÕcóUáÊG:(Yd;3´-=VØQßÃÝE¯¾|ýKMz˜³&ÃÝÓY`ÔÑÖhtPr‘ºÿ_õC«Õ$cŒŽ|²Õ@‹âc„“BºÑı®nZ¡ìÃ,,C9Ý $(jÁ~÷ˆ®£^{{Žº4£â4ÓQ£ý"Ÿ¡^·i]Ç}ª·ž—#GV{ íùÎÖÀÆb…¥ˆDF®·ö!(Ÿ¥Ž Õ­õ‰ó†ÄŒ¡Ž‰NUý¡¦Ñó‹Æïg×#0ý7Yê“R(5í³bëfÓ«óÝÉ^>Ò¹¯so]¯3¼×ëþÌD´ðªW8N´1‘V©‹û8ȨWzŽú2˜2Õª±\¥íŽsó½§^Úg ¨ÚŒËëõ¾­“ÙeŽj+¬»‹Øºij`LPÍÑ_à¸B«òO˜]­fÙÊ»°PÕ\¿w Òý"XY­2ÿPNÃØœü‡/ö̱–æÞ¦ÃÌcêYs’§:½ÑÓÓ”ˆ;@SŒ ʾLµPñ-3Ï-²ü¤Ë(žHîþ{ÙZ’ö6£8Qþ¾,Š·àÑ®AÙ·˜@¸””dÉr6H®T$Ä¢>½²”ÎÍ&ìt)_D¸éÃ>Õ_Ðö^‘¿¸¾Þø?¬F*ûКz:ÑKC¦ÖVï:(hãÑÚ ±Æ@ÞJÖNák¹Z?Ô§÷Ž.D­e]PÏbE¥Ž_¥]+6¤›WηŠóy†ÔPNè¬éC7Y%u”Ž _2µãÔì£È›\3„Œq7s๑V¡*'‘»:/œÏ?\²®©æ-„5eC'm¦þk¬pó ¼å€ò®0ÆhOÊüžŽÆ hT© ´'˜RÄJ5Úƒ‰Oå]ò²üÐj™þ¥%àâÁy«(“ŽÉ r#Úg—žójœ¥7|çhÙdÇÌÜÒ§Á=ZYVßõî­|ÿ$º‰íO4C?ºØiT‹·4qpÀoŒê]z@Ç\þ­WåG‘pÞ ¶(cM{Ê]äÊÔ©$ŸA"=Yl÷T™C±8TËп £Î–Ó;þÉ¢yPžž<È­Q_3Xtƒ᥷×r]á,ŸÌmR½5”H-Dheú†ƒ_|Ê)Äkˆf^2¨U…Ö¶Ùhj-ÂC’u­·NâÜÁsŸWÉÆ ]s{µ4-;ÄNíW9?Y'~E›&²ÃߨËY7~KÿèÍ>?sªò‘­sPúÙæ N㿌rʦ-Â$;zí)é•`‘Ñ|È n™Ïö<ˆ$Ù|FíµUñOFÑÃì=Y®,U bâ›Z±Sª³L›ÍüÍ®=hÚÙ‰Ç#Q+%Ô#—íëĉ_{jï©d µ[ç¹ëÊTðBëc/'º'ϱþùZ2é5€Ž2¨ù°›OuV2y=R|fõhÔeú®®^ö‰\[±µ§ê0yêBºBXû%<¸iÜyyžÊ$@§dBŠ2É÷n²R>ü:s~Xyí» ùs™ÚqV°<•¼Ö,Pù «…‡>œÎvkQDДŠÌ¶Ø'€èÌÖ.=fÚɹ;¸žÛq‡¼ßÊT΃uw9¨âT$& u˺0èÐC?’TÜ­oÁzk¢˜(Zîí*·@.û#³ó”÷;õÿPùpž Á¼›ƒ÷î¸$å]©#w…¸½h}Ô§‰$ª›2Ž#è·›Nªý^¥G78u†2‡Œõ¸Ì&ë:'° ßÉÈíÈηN— ç ~*“AïÏŽ‰I!oüKõe½!‘œhj˜RtÖŒèôufM Q’ÙîA°x†‘ÆGù©^åÆR·± WÜ…ŒUºÅ‰N  ua,È–—àìªQ>Þo¼Â"ÀˆIêŸV˜²®Y³íØ£)L¢s˜¬ý4ènÐXï»ÐºV]M ðœÈwúÙhFUŽú¥[2 ®µ$ß•K¶ÚCW´ëY×ü ˜Kc3 éþÑÅ΃bx°.I[Tl’Q#ò÷rhÊw$œ¬ ZSù¢· ë3 %@'\}|×~tÞ×w êÈÁwõš gêLþÛÚU¦v¬¦ÛºúÊ]á´+ÜÂhUU“çï™ïǾ ©d uS%ˆ‰rR™7ÄŠ¥ñ‰«kÖÅÎÑ €cÝ•'[s­«—”ìýZ¦œlö„ ú?.-W«j‹A%–iœùPº@ !ëú 4¥»XClL)þøGAoïfGOñ¤“¹Y’ª½ªìYW™Æwße:·ó( šiûÚOlBJ¿,³]jíò]½47¿NEl]ì“°0 $Änò]X᯴.ˆª6j5quÍÔЧˆªîHœèn½vû.Šc<gõsV¯øA6C#žóÒÇ5KY×˜í£ºN{ºyóœÿÃy2KŸælÚÙʰ Sγêd¸ÖU«r#8²™•„P8l(c6Ù]{²X÷ < Ú;Å^­ªfl£¼6~R‘²vÐ\Y.Ðbš€Ëí2jµÔåRVžEaò¤%IŽ K¬ÊÖ¡µ¡ƒh—kÆþšš€ò6¹«§P^dzȠŽ#û´þÛjŽŒ'ß }†xAaAƒUÝdIâÙGò(I‡0ãØ.ÉÜŠ 0YWÊt+mdGÆ^)òòäYnCµ:½5cïMŽ ù¾†rõUe¯#1ã_ÀØ™w gWŠ?[u·£¼uþëÈÖõ¥¯ß5k—[È]çÌÝ-®¬@‹õùÉLè’}ÜŽDiò]XÀ/E÷AAa´HZw/m7 S -ÆAÅr$€[å‰,G‹«,7rÞ:8¡ y pêr¿ @çîmdw;Òrãnßs€\¬Ç~l³ßµá¡¦ÇïXOˆ7òv$²D=p kÉw5r¿Wi™†¼e‘Ä¢µ-rnjuV_ÊùLÚ¢k]µ]w2|$:a`jÐè40.AJŒøqGˆo:²þÞ«ëÈ7Ø{²‰¹Ão¬i[¹ø<çîü¬ ¨lÒ³ìóvŒK'u]!ª`¹«óSé¡PY¬%ë:Žb+£Ÿ[ø(æN¹Õò˜ñ_“³Ù‘•ѽ¡ <€ß—EŽG™{õ' sî~ÜAÖXèdûî;ôÇÆ~{õëêºÞqd™jp,@•§ËÄ"1Q,%fWÀv´†§ bÙÁK®nûeT[Wíu»f Éwå¼< o{þ1Âwª¢ã¹‹uXNØ6ú¥náêgìšKKÉFÁ™–¤RxG¯ãfÝ}‹÷À-}XäC\lãÈn³¡¡ôþ~9ášAöH¯´-D~lZƒ]P³¦Ê ¤‰r)Àùƒ«é“suËq­¿ÿMòòrß}4Ç¿’9<ˆæå¤÷ „‘ÇÉ'l¨A5°Õ@PgÍC§¶ЃiTµŒqoÛ‰’17 ˜ºØ‹hA×N€V,${ Ú4².äÀ “¥4'aV5yÂlv˜\Z7¨½Vc)h6âlP›4O G’ÎPsRÊ€¾QW …뇓ü$vd9kΈ„cúàd½Ù™.(…Ža"÷S’y^²Ú :Ñë£{:ا{ z` ;ÖØºYîe§‡B¸éPëíc(ÉÈ`#m]ক¦=9ÒÞ× }ÑJ’dœ t§¡íò¹º5?îª WÅåaŒÄnÛ˜ý:¥À”Ë5ã)Mcßž÷½ §)~q…%´eç,ŸeÂSV»€ì’¢y{kQÊüƒ½Ó&;êRÏé0™Ÿ³©·¥ß-ù³¾ÊÅ“**w1Sn5ØÊ×GŸ¸S™ùn-Úe#5Î £uÌnñ w¬ñ8cözkòÁÑ?4º#zkndÓGf“¥Ç$%ýÈÚËȯcNlàR»bÏÆØË¬ßxÔf«KZ[Ì[ÍH›¼¿¢ ¦8ø¶ZÕÉhP(Ä$ÀÖ7Åù1 7µæœ„ÚEä"×-"×VSl0"121AèeðÙ´â$Ìpñ%2µ)òó˜ÿ.A•‘Eó… ´ù~ƒþ€3HsQŒƒÁÔ­ºžæT-ðAÍ«:ÈÝ:…OR·nQŸœlÑÿ-§.úûs†:¶ì¸ödÁ³e©>È£€ùhÓ6)"^VdD×à£òš7ºre–IoäTŸ$£›CÈé è)o¦}í³LkËÖA)ÉPÍÆDï,ÏŠÅ­Gýs[ ¢ƒŽ¡*³+¬&~V=Î;kSƒ‹ªOŒø®í­Ìô´¦î¥>tÏÝYk­ØºÒJö])}Z«©Nq[½«Õ?Bf§ˆ*¶®N]žÇxï¾Hk•‘•Feûèq–&S;ÿMÛ²ÁŽj„Øê…[a}é [ÄAŽ˜Lü·Ú´{ñÕB‰ýæ¸ Í©°hÃ)/NW´\ ž•[xaz—YµZ ô,²šš·ìâY|~3võQyÙñ=Un>Å-t4ÔõV´ç{ŒME“ ªYsûjþ*»BÀ®1M]Ž…3÷»Êy+äŽÏïÛJäû¦¼˜eh[âs“´03 ÍÚ—^Oðú&a=;LbgQ^íÔõ©Ëºê”V 3kʺ G«‰TR–#–%€#ÛB>w¬hºõß&uTaj‹ïvÀï{—©¥)ÍísâƒÆGG5ú%j²Fû{U·æx@Ì@tÂ$Åþ®Ž•¦Á%Qµ;8»©‰‹ÖøþLW_.ß³ "!¦¢ þ_nŸ~ÂTîÐ÷óFHžOÆä» {VP ;wßsj“ÄKEß!ÝãÃc~|{rÞeù%$ò™,3!1/º G²ú]XªÜjŸ n¤ïÂå6òë”QŸ5 µÜ¸€$•qõhy«ë:‹”èjl,éa®ªÜJbP¹ñyðd[ú¡óÖ#ˆdçš ê”ÞC'š „ N¿¡Ði¤ùT£ã¢/:®ðÃý’ÒǺúê¢@¤^ÝpàÉ•l .«éKºØ¸îpÿ¹µlPÇ­-!—íì RE^>êÓR}Ç1/ï”Ìœ ­É”ºm6"×ÿBÅÈrz§èôž÷©ñš;ùþ¼Ê‚ü!ÿB™<üòr»À׺²(ÉâM'Ç+fDcd&„zRœµÜ$¬ §ñ*ËÝfm/™ÜÖK¬c›Ó‚<[õÚùšÏP¼­9e]é1_³ÉBŸ!ÍÑrch(Vù;L:½q†F«÷« ôõ×ð#ú?ã¬I±¸ \ŒT¨€¢MÞÝÔ÷еÏÎÆu]=±Â9y.J”"n[vö¤’E éʃz²kyÌzì»ò^ëBÃSñDa†k{â4JäÇØÖñ¨­T[×qÍŒÎXs"·MÈ劒 ›,]yF§ño5ƤuI˜DåT>)~ù‚ŒÖ>¢d'¡¶ôØñj®-w-îU´Y?šÔ1%Âä”2À$îˆ ^ÜÆÊW¦v¨¢˜y2²&W¸qî[\ɾ«í:ßydFvŸŒsë k’Éþrý“Bõ{MM…Ø(å“¥n™X 9ä®0+Uò_ßtóZ× 7Ÿ™ÓØìIá­ÐF ÈÉZf‘0áÐcën¯'ãpû]°àÎò6Ò$·LÇwµû¸m/@%3i]'[§t°VÿÄþÙ& <ÄŠe*β.öñáæC-ª¿þ!˜#ã©2ìfÛ–`?‘g¸šLÄ[ë`fzA ¶®––[ÿ§ðýîÑæ/Þº÷Oê¾¥M $’3»G<Á Ñ«Þüí2µúÓã-ºüçNéc5_rÀ´J®º‡`l\êúd“òâ’žÔôÑVOŸÜÔÞrW§D·“<æi™Ñ± ¬˜N·O¾òIµR1:kQ\(‚áÌn™‚x‡®’à”GAm"Mü¤ÜÈ…ò¨kŸ÷Xª% m«f‹ÈMD§h¿HoíÁ岕ÁÜ!šé³Ü_jÒAoZ¯¨Ó“íy{iDÚ[BàA¥À^*BÝÔÚÕèÁ«u 'kÞô?7hêkÛoŸƒaCÇÍN†rƒÜg( M#÷¼A¥¦ƒˆšLíÔ½UA.o¾~Hëå»»Öu’Ç%‡w^sw«N$û@•+[;ø¢²ÍÐr «D9bs/†4ŸtêC©3—I%êhf6A}Å«ƒ°–X‘jM+†_Ê-íÒÖF°ŒNY×ɧÈ#1€E#Ùc4‘Ƚ„0ùå¶I›ê»ˆ“©µO9Y> 6VŠ‚#k޲ϻûàD¨fëBµ¬ÚòTÕìvÝ=SyÏmVâÑXëÓÖ•ì½t­]W,u‹{â ‡3­dò Æù‘ÎAÕb4ÔÞŒkÈyX€gØPÀ]§q2˜Mܠ¬ZÍܼăä_§K9Yc/™ØBŒ>;¿ÕyW!ÅÄ­ ç§2¬ÚJ T§³SªÎx·uNfËMÿí[ ##ÅûÞ‚=»ÓÔÎs¥4^vW5‰ºG¦–×dûú7øU«}@¯¹Î–Âd’áD_êŠÉH3rÔÕ ÁkïKç9>ݪ“.È Jêîƒì>´±,Z2-ÓI•mûy|FNåQØÞj²ëAŸgþ!ª…d¶Â ÒJe@©7ɽ‰ª¬œ#ŒÔ&}FT7*A[°/ë ɶA5®»YÄ(J®N-¢]lôU’‰sR5Œ5½ÑSw25ôÒ´I†)öKЃ¥dvÝèI)‘¯#™{©ì%|WÍìDëÛN¡u±Bù>"ÙHdÖû½µ„}ú*FælðÃêíó0gþ4/Seθ-ölbqø9·4Í`>#Œ¤~Ÿˆ(,¦êä ˜>ñ•aáÙÝâUŠËàc‚®&ó“Ž¿QÎ;ëäjŽ0{tsk¨Ž™ÇÇ}¢×2œjœ¤—ÖÚêfÁþš¬«>a¦{:Î{®A±é¬)ås*–{œ;Y¹šrŠ¥ §øÐåÕ„§äªWi`•ÝwHé£pU*}WR)«†.3»Šýž,GŠzYWZ’ͱ*ò—€Ž!ű?¨§Tg±†â(Ùv‡ÙrëF_n·åÇXÚY+ÑÔC?> ÊC¥¡¥ïXß2ãÉ…ò8ݹl«®#Ãó”>M&kÁmú–‹£q?ȸ]±…Àœ5æ!ã#[>^äD?úÌZd]p•$Ï“²Ú/ñ+ª /¥jj@g7y=æüÈlŸXó•a¶í÷1òêÓF|Ù c0…–ä/É,^|…Û–ð[ôm7Yy1¤aÅÕ-²šÿ† 7;ß&Ø«÷Ù–#+°“¼þØ›ÔbXC]—²¦`¢p·ƒÁ“7/]˜e QM6$l6 j ‘Ks†J˜̤[oÙØ&dÄêó¦uac×Ö…ºnóNÎÝ8ªQhfšZ‘k¨®“–"Tׇ¸W(yºI–?܃¸ *4ë¬&‘k¸ŒÓ6¨ÊÜn€HËžg4/)aEÞö™ª•‹àê:¼kŽÑ·°þÓïÛrØn™-Ž\7oøÅsȺx÷oeŸ“¹dND0—ó©?ºœ ¬Ý­èµÈº0}wÔì#y; ‡5è ç/¨á9nÀ êT£äM8¹[?tNIÕb¿2‘/ÙÕ$¹û_°³fD·#[2mï-õV€ã&s¨`&¥Æ'Ò…×Ó¿»„;Ë«­UÈåܦ!ÿaL9 šÏdŽGR>¦ÖSý$ÑÝÝ€V…\ÿ½,%ž×j⣱>¬¼cON‚˜Ü/Ù­:+¬¹ØX±hºè®v^öÚ!È +².€e½Î' ó¶.,p3/¹,¿¡¡1TºçÄ穹~Á²²Ï1›÷"FW(Ñ»üé°1}£hES& j–RePUŠç ~ƒ$âhX'ªÄ¡¿¤;Be2Ë Îíb ôeµŽùv£¸TlÃ;4kùô¹ìÈ Õ ä;JþÁ|ÅÓ€‘©lZŽ (½ÔœíoJÿê‚é-môú?EÂP9Z>I& 1Gݶ<=ÆúYmà ±NwêBV† ÅüÖ ƒ<%'E±œPZÉ P£[æÛÜ›Dí >R‰B5¡}déÞzòµ€¼Í©[ɨúó¢—yÃk¯ËZ 4ücŸ¹gÃýR«:ÝŽ!Xæ¥)á©!ŒD»’?“<ûÐ]ÖI•Z•uaò&ëjžÎtuæ]hNÌøÁpçÞ3$ fÎâ˜yîL­Ž”+¶_˜Õc³p[zeMÊq_*'Ëñ[5rnpÀîšä r¨‘x»c| Ai­ÏÁœkÍÌÕöWÜž2SIðh×Z]J˺Ôéë=Söë6÷’nxËÛªëçOÈç>qSŠ\¤ß‹¯få1Ð#ÙºÒ*®ëÒØ Æím/´¡Œ:îÄà‹Râ9Hu)†F]¡’RÌ ä»b›†âÞV9e´$ÓàlJ•u¡ ñWœP¿e]y>¶÷üFVôªuXúÄ$Šù–Èš”èÎר¾¦ö׺à§"L¯_á=T@>Kv Ùk´.kdvEpóÄ PŸv™• [ÂA6W•’šözÖÞô“:´ hC¨ª'UKC¡…c/`«2å¼`¹I|õh ~DzJ£ÄG Gf—WQq¡Ý.ý»·ƒ¥õi#^↛#œ ëfÝvŒåeBç¥`°"IÉ?–ÂZ¡JnƒZs} *Sõë/ôÓDpµ‰#ÿ¹: ”¡º2•[êŸPä›T¡ ï`ªÔ“p~L­§í2j•.»~ϯ 6~#Ìó/írÉt {î­zØ?…¨ôÖÊr¶1³¹t»E|¨2VtÏÀ:¥s¯§÷!…Š6Q'fœH2“5Î0k<%û¿§ýØòu‚°¸¥&õñ˜žåÖÝÈüÚ^wŒ|3“cȨöÅØ30‰m*ØÎ¯c‰6"*<8E§Û»ÇV ×v¾ú°A“%µP-»âÛ”¶ˆå¸–>IæøèÌ@|Î])´„3¥h Þž'–s5ÎÀÇ8ÿ{gÇ"­qvЍåÜvJQ:GǺӺ U˼+´Â²bëyEºL­qˆr‹„”ô˜¡²VäïJg0ÆÎW€ƤÃ#›]!ø$áMsŸø¹y€„Ú­clÆÈ]q8òêuú;D<:•‹Aü$·²ž|dx0ûSS pA¢¬ €aU~jÎb´H¢ö0É6•lŸü ët›ÂLqºF¿îsRÁë.*RD# ôYi8`ºnTÎú$e*ž_ÅnÀÍ?UVS°õu¿oÏ Üq .Ê÷IgÊzBíJR=¯FÑ’‹ÀI²;DtÚS,Õ§pöqÖà š½"Sƒ|š-$&ì 1s1‘…ÂÈp ¹Â“Sae7°émŸ oy`,xÙ]•b‘ehd+ÉÄÙÖO}pÎkBOŸº—¼á{,×ThÂ'>ÙüðÛ ~tíÖ¨¢¿GV¡Ì;È LÓ½Õ)º@²!yò®OÊ[n¼¡lWæ%‘5 ks£¯­ ·f·ÕœÊŸzÌ›æÂ$sâ1ÇOºúŒåiÐ^s¿**W[v¾®O÷ÝijuHÌ7ؼŸŒj4ºdO¥[]‚¶9)!„žbfv¯EVÞ \wÃk«.z_v…¥È Q顟À˜dCX•£w©sG‚ûdkÒG¸hYv¾Yð…¦r}.`¨«àÕ/?Ä%óºÚ²Ðbz†CGË~‡·ñaÖ•>½ì¯ ç¹ß…`Ä#e@ÀD;z•Þíyö§x›™ÚsÑœ½ÐÛöz†%À9œ5­¶Ô ‚¢‘sò¥ÖÕÆÔ™"Äyë%nÛŸ2z¸cÉc”{áW½÷Å&õ  4º>›ÆÓÜü>QÄØœ—‹>A¾T]Ì×”,¡pòÏ©Ofª^c¾Èíõ.Þ”$ï¬PV¶ºhérò,_:numʆúZ¬9¹ñ[¤|;‚«ðUš}P[¶q·?ï OO ¬+«qøœ—[aÎêz&è%TgílФèÿŠ0÷ «¹P‚"[­qôcí†ze ‰RþªÜm+µ`B_Rçƒ>Õ¢Ôé ÍXZZèÉ Êzåøu‡ê}¯®u?6+ßÓ±oÂØ¯ÆË H6¸dî¬úJ°çÛM »›o›æ '-‰†wJ¹w ×îÜ?î9x]Ó2£=Y®€ÎbtÓeŸcUŸaônÝöþMO(T‡Û:>ã÷Ò •„ŒGÖ}[aqÝå•&ýù¤VuÃs¿íÏ+X^nrkË9ajJ>h@Š+í1{°Þóñ/uèÿެحCÙ¼S,¢Ow®íÓû˜™É8‘ëˆ0üyRíý*Ô÷d‘úÍ,‰yPZÝRàª_§Eå⠭ɪªw•wt2eŸcñêF÷«‡q9Ä Ê*ït¹nùìÔ/Év9#˜½ôÚCJKf®UYWÛ,¤Ã6>ºh+¹ÈçswôÚkZNR™öPsÚ @£Ó‘Žb”ÙtÒÀ©®Ö^•ó@‡¤÷2þþ©oÞÈŠEýwÃ!Öè»v¸cõÅÊ]ެ÷bW1'äWi;›½”’…[2¨S8}äwË2¨9©0ƒôÊ=èpW#ëkËÜ]é:$:M­fÊ„†T¯45°†3Éìj#ö+®ªL-µwS.]ÏýI7ïjµå]ýDÄ=>%cQ0lieù$Œ&õncèáçwÎæ‡u ¹”Õ”‘¡Ðü!Ÿû3•‘õr·ÔÚÃHHÅ6Äì­. 7àæú”Mjꨈò‚=0EÆù˜ÿ¯©½Wé:²~¹ÏúEpÜçwßÙ|9]ú…kvúæ ë,z~+I‰.Hš“R­6»• ÁYê%¹5É+A­pzRwc\FßMFØÖvÔ=E5#¨”ŠŽ÷ÇÇõ¦^<ëølÔ=tÏ “eP@=Äi «ûu‚ /ÓáÅœк°s—]ûÝYÅNéi˜ÞD¾d'J`=µ 0TÖµ‡#H‡NM¬Üè$ÀB>FCÿ=2&WAÉÂ~e,‚õ­¬þÄ\‹¸c»N«uK)ñ©1PaÞ…,ºyüPu'o?ÏšÍéGrªš±ï‹íèoʼn`¸”ädûä%EuB° ÈsI©û¤øµSh, sè'¡ŽÄ!¤DƒjoeéÔþääõq9½·¾%'Ñér¼~WmîºWï&ĉîMµ‹ìØF*‡Gÿ® ¼~×m úšÅ íSÖq\™{"üð7IL° ýoi“¢s‘é?A•Z]ÑÖ=>ÉÚ©Ltu_r¿kÝAåëw5IE‡´S‘9œ{j‘óóƒX@‚b™Û ˆ6S$£ÈsVu·¿>æ¹Ûü:^H0vhzÒ<»§„eZW‹i£>)Y‘Ã[ž1”ÐÛU-qŠ›OCž”×ïšCV˜jóØ  ·Ä;tÊb‘îÁ É{Q®zýº=†Á×(jõÚp Âr*CÀêÛÎêV¼‡£ÀÈóàü’𣻫áHtä w*'†çì¥M …²ä4P$Å)„™úÇXÏl2›Væ–Ë \?v·î.`RïÞán]*‹þjþä¡zVv…"½eÙÆÈÉZØàe e…¨Ñêôúüq<ô<3H¿Œ’)…¨cP!pÆ[ö¯¿xkO£°“0Ü€[}¹ÏŠ¥7÷é¶Zs%(/\$œZÉp£ê¡8ªN¶—0ÍxН…§óë6“ƒdÜzÌ%)Ÿö­Î~3Y–6$¥… ¬àxeDc-Ó6N*i!¬F(–èÖ6Àøl­îèºè_“µIµ›w¥N÷»f0ðM^ÝùuE>y„²Bô8uu½ÝõÁþ`RÓÞ!eZá_4phðq‹^-ÆÉSÉÌÉKi5‘À’J-p|sê£!ý&dÞ-ΰ«$ýV`Š>„]ÍYóÓŠ'HZh= 4#kú4gëpN·fgV-’™ÕdfÇBk•é-V¼ögýl` ó¤$º5ᛯ¢» ê|íþ„²*ô`K‘ A¦Róäõ8×ÃþYWv]»®äþONÀ½8ÜüSj¢Hr÷ûºzö‘÷–Š5¢€ã’–ÓœcáÓäüvä¯íïaAዪ2ò6F"8?×exc)×$ `%¹ zY8„t?1ód’².¹D><ÆP6L Aî®|Þrqª\ª…)Ž}ìUÚÛd¹-„EÉåwñù½`"¯d8N¢†b àŠŸ§Ï"a±Œf½ á€ökùPqH–VŸ¯WñZÿ}f¹µš·37Ȱ|º"õƒïU±§m;O=ã´•j…¢{ÕA­BYªFà„`¹ßßøfÿ)W¯ØžâvÈ ê£?¼p¿~)²zpÿT+Ý̼̔mYÁQG_)Éú6ÉnEÛ>²¥çÀH½°Â@‹Õ¯môYÝÛ¬aÒÙ`7g3wýpåŒ\ePuWsÁ>…ï:YÓ‡äwJµû7äô¼Ñ:z¶Ô0`úFm³ålšºÝ1ði Ô“äð&½v´„3372¨ñë+“÷Ѓ­rJk*bOÞfëÂò&[h+7ÂØ¹¥O!¶«<¤¾eP¹òEù>U•uÙ¦ýYp>Áb襷ýaü‰Aöû«º~·¢‘æsTT±ÿÜm/ÿÚ¨&Èé †Ü£ÔµõƒÂ.³LsÌgŸ7 «Ë]( yœÁ@›rÂ$]Î]`aSÏ‘5»ÈÊ…—Ç,˜`R@î©tHD§È€!‡è44£±i¨k¢S¬Œê3É4Gô¢wö< ,,j<öŠv‰Ç—ºq@ªÖ¤Ššr².l&züP „¶VNAy85ÆéÔ\îµÌ_ jZ‚#Mcë û]L»»‰s k ØbߊYY¶u°kÚS„8õ#eŽ‹µH€±3)BoâÃŒx ' /žêOw2 š; ‡½éÄñ«ä*ƒÿ?&ºi +Nœ8âí(ezË~“Àoß2>}WˆëTdYÕz×a~$L*½Üñ&Ão)Ï«Õôq™Ü§ŠòoÙ³ž¬’9]2-ïE@A¬rr‚"aÌ­zžp•ugÌÑ÷OÀ’–{Ê?CÚI•D’2¨ãõñ27YnìÙã„ߥ!ìÐÉóóôÞÎI^,Á^z&u,*nÓa¦'±ód×{"'ç‚$æÅ³ßÂ}~n÷VÉîšÚ÷3 Úò¦ÜIF' þNT2¸¹ ¿çœ½-›µoôêYô°ÏÆä Ï;Kȸa¢Sl;kýl·É¥oÀ"†)ðHd]³nÝ®° ågçMxwh”ퟠ³c¯örµz_øò?AЄÏáKMõ(ÖU`Ìÿ<åÝdPy6ãó ¤dt²&éñ²uAëcž{[7[+üÁ“Èü°Å/,)}Y éÓ‚vC‰RCsÖêìhŠèb5ZËlVŒ ÔѯMn³]ô`+&¥+Ï]‡7¶“µd¹^!L1L5–¢ ÏE”€Aº”s¶'9ª%ÿÒCKäá’_:´ŠöÒ?Âè;ñz|æhÕt(Ù’5Pã^1Ú­y§²=±ÔkjûÏ&—ÿ¢qߦ~’ê(9ks_eÖ,G†”G bàpÙQ xë? !Œ™xÙ•¶7zN½æ}±cwä? Õ¬øÒ¹W}CÙbe‡º^ó0>€ª[潤ì½HË^ì.Æ{HMú.P^T“¨¦×I¹¼©€¢%þ%˜ÁÏpª£³9­A üÁdæ•E˜”Le]‡…ƒhCIS4n›Ä°{<¿ÌD¬ê˜k>¶óâ8šÚ q‘Ýõeº¥šSÕ§Ãy‘íƒD\±µ•bÊ.Ìä¼³Ö†54°FÄ"aÇòû{  MlB¦O~øÜãýh] 0,Åáý¸Û†®AÎÖI8ÿiƒj~/‘BU'JÈsÅ—zÙ²®L·^æÜ‹«ùà>STÂÑ­º_™ÿhƒ…ÅËÓi&3ÙSæ^´M}ÆØR‰‰&Û .WQ¨ÌfšËY’{“´“®9śڂ'J5zuª|j›“}‘ÆKô­”‘»ôPYtSÔƒ´íý#Éw±¡€¨¥ýñÙOÇk~˜èûéúª¶.ää*&¶¥¢5îÖÈ®dj'}ù0ŠçszôNÙJœù†32 ÏØB@a 2q‚e”æàðÖé)g–. v¥ð—÷$ÓFäPi8è9d6´XhPk7fd38ZâÁ‚õnþÈRph/Ž[3½çÛ¡2,Iéã |DÜcúGçeRÖ,€¸¦eJ-w±§ôšÊÉK~ ó7Ñ=…ÏûZxͤç½Xz Ù™ ªçò„tÃU\¢°k]=ÝfÓûGúið"sé' ë?ÊkdirbÐìšÔ/ 1`BI)¹Ì“„¥oNÂÆ£'+ï§Áq’kÏ/Ѱ2²cjÚé7rv•&{¦Ñ/ùˆdÏå%Á}£÷ï÷úäÍ¥'§á |eD¿Ô;ºéK%ämÜ +]Â>HêÖ”uSí²¡Uk‘¡ì-¹N ÖŠEˆjIºÝq™Iÿå2Öœ¤ÏnÈR’ܾ§¾TÕb)}Öçw¯¶¡1lP:ÉÿI¼EÒ+h.ì™e]ljPi(hE,<,¾.°"»;FCùìØNKI,3™‡®¤e~9È÷:fÎnThÚ¢ÄfðgÛr¯Ow°Sgš5tD*yÓ—ÛþÄJÆ+u³ta ]ñï¬ë¢§av‡sªÄ2ƒ>‚>™S:³•Q©–mï€ôeó5××~*T³Ì&-ËéÕR- ¾Á‹ñøîEº%ÌäkÓjjE¶+sË‘NÉc«êäIí– ˜ÕÍ¦Þ åÔ‘~Ž$jù£4jµÙyŒWÑön ¾ÑþÕ±Ùá=7ÙÝHü²ð(ìuM ŠïvP€’È 8gÅˆŽ¼U '}Æøtþ‹s®Üœí_LÄ wÌçp±8™ÕþŒ1Zúäî’dÌ1¥w0”iÀÓ©èÉUi 8P+×ìC©-+þÄ\è®NjôêÔaMêþê°'µ¨–X­Öd6kP×<0<ƒ Ð( ¨\4\št‚JhÇÝ®å®? DyµÔ)½CUJ¡¥˜óç8ŸÜØcçŒMÙP—`dpÛH‘8 ATÂÌ¿ÉwìªR?»DÍØx^ ù®µ;åM;…o¤¾g`»n´.ìTª=ï5Éw­<º2²5ÇPƒz`E_vüaõκ#üiätImÝ`»#³ïJJñ–4\¤cªç`Ø©@–!Fq i$¯ÑÈb_@³Ø]5*ÛÃŒŸ’Ë}Ís*Qº8KuRô!³±9ÔPDy¿†"=3=k¡uaéb6Ýî|sË=æ2ŸŠX 4)KlÐ =fì ¶º­!\S·L:YËux™ÇM‘ã^ìJGß›T•ÿ |]! Q¯¶Þê_Gö^æsdw[öê3] ”¬®½Thž‡U”‘å¤â´JÄý†É4£˜üxfêEü| •(ÄÈ}ýÓ|7ÉŽ p‘ׯ3¨øCÔozüOmë=§¯S‚ØJ¥ ¿É_ÃxL)Tà~]at‡¨ð+~+É‘¥–ôš?]$)Y%Z&ñ=Îå¶2¯$æt±“©C¥å.¼€ÈÝÒEßÔ„ßûX×É´²Âäî¡Ùúú¬×‘åT¿•€ôÉß›Ak×h]sKƸ›ÚÔ1+™}äˆèU¢HØÉ#Õ_ p†›³Ø}PûåTGZ~‡T aIßõIäwúŒnf±xË1O2VÖÀÞ:2Ž¥ŽgPdsüÁòínx®ÃÊ›ýÁá®u‹úre¾wüªRèþÏ6=XËcÆ^+ H´c_h½žµ'ŠiÃfS²&J[×–$ÞyÛjÒj8v¦\XfJ4¨K ªûÔODïñ‰ŒyÛwAÒvÓºR´ÐÔQ×i¸.æîßu¾íP͸*_fä;v¾Žìí)^s8±B¦Ì}#óÇXénÞ»–înGÝýi#Æt3Y)V?pœæÁ—ÞêÍšÞC‰‹õú•7L¦^ejyL~º€*gCÜá#w Q–É‹<¶ j¦j!Èxè¨ñÒSeÇ ÀB:„àÔU°¿¾Ù¾ëý›×Òo½ój´V†^3®9¡R5Ñé JEÆSy݉Ç~îšÓÇM=>~¶?1ø(J C5ãI1É(¾83½jy“J6µ(·{e}«ïÐ†Š¼Ð5¯ÊÈ@º Œ È=]`ӿȺ H/x‡ã(’²úyºjÆòZãåA ­sÑÙÇËêOF,ÿ’WÛºXOþåÊúÄ̧L¨­gjÿ.£ÑGYû„(”T3ž¸æ>këà7«OYi,%®‡F+Ùƒ'[›í¤gUÖuŠº¦š±¶öôÌ÷-®u/óxÍû›Ü½5ãøä]©SI)Npv“se†ñe9p¿ì1j®ƒñ@À‡H–gÄV˜ƒó¸zãGó²îp{Яýù–t¯ŒnÕõº§mäšîU”ZñÖ£ºÆ 6}ý£â{Cd“ÿ<Ø5#(¨4DÞ¾‹Ì²/FõasÈs)QoÛäYÍêwa጑âP)û5ƒûa”Êk ø'õ1”¢†;ÕrXÎ鉞D‹M¤Ùô¿;õ¦‹R{ý$™yVvJ]jrll[Û?Ax |W0âp™"ð£U­å3 š¥™÷¶<ŠÞzO…íëè¦*þµHEÔMuÒ¦#Kr;¨¸ŒÝ™AØÚqÔr)ÇØ‘À ^öjX‘A!¹’ƒ*éõÞâykò’h9:wùOŒ…Äšè‚­¼ý.ìš§¢ã|~PåR |#C9³*È}$®ñéF²u¥U¬º¾ÞºU·ç ¡“Aå–Y>ìhÈÓ ¶Â0‚2±®ÏXhJîþs‘„!¸}ú]Ô`x„?ÕÜ­åñ1ÔKÙU¬F’_Îú ÊK.¬Bhw!ÇŒÖP­"æÜ`%Ú=h„ÏC³tú!©©d +T¢bƬ…ÝâΉ³ÉmìÃ#®ü±€1>rêµl{ž§ðx­¦ÔÏEºK§×Xûëú¼6[iJµ ò."w·g]{{RrŽI~qNËGÀ*wjCµ2<«†§—Ý¡‘Ò>ɉ҉P®ÿ0tTÈ«…ŠàaP…Ylzp¶ Ææ®4<ÔÔ¨( Tb[¨l .–•ó ÿ=%"³ˆlrØú]çôx¤½^övºžLÓ[§iYÖ•%ºöó%“æ×" -ï*©áÕ©w§íN±7åCB®ìÓàP‹‚Vô»ˆ†ß3Z”2‡’›§„çÌ'T}ôâ÷âgZ$™6¨v{Šå®ÏØ­D/"ýìŽÇ; ¾¿[ÑÂÚ,‡» eåÑ =CICX}9º X|’u»e¥Zi>íøXr?}·”*ZÐþ-}º“á}À9ûƒ"`ÇÉÔ¯@<. 5ªr7÷À¨aI€Ö‘¸!ˆÙHXˆsšQ\àV^WÈoDŠåìj; Qù. £äOŽóQÿDîàÓÓ‡­ }­FztŠ?AíÅT°t ~bß]‘L©“¯ê|aRÁþ¶ñ é:6Ë‘ÍZ¬¼ úJ%ÿyR%L­H2mËa¢9 ï§‹ó„™ÓT*ÈfÛ§’š4²&’m«®—R¬Ÿ6ËòWÈ×ÈÄ-"I¸—Æ‘}0Át#P/ÑÐøä¶„û»•‹M¿—$¨Ú®éßUN!/:¢œA}'}Í zïÓP×S³XøkWl¢}VÝjèû£3ƒ‘Q«}9´÷ü¤OÍá¼ë8!Û'9ÙÌC*2¹^×#›åšbÔ²DK_¹) Ã.Ú' ËIǹmSCûÌÖU_ƒø¾%pïкêî^³Ø«Y¹ø8+¾Ù.–‹ U^_}âS|wuj±4%ϳ[uwcHË‹ã…´ÏØ±÷ñÑH> ¬Á²O1¤¾æ—½ìÎkÇeK+|!ÝnH½e¾ç2Ø–Ž&•E½{Ô ö®t ¢o© ô¤š.ôÚ ¾B³95cÀdäì"†üµIy 0§ì -ÅþÑjè€#Rîã‘fý‚èœ6Å“B{ʺZ)_]ì$|óDo ɺJÎ&ŒÉ³82ž:Ü»Zˆ4zðdK‹óW— *×jãa»k±{"S|†·Ã6·Ä¡zI³¡dw;rêãZìç«ò®Þê‘P‘¦v':am˜ñ´q2÷ñf wi1o-a!)hì=FgµšÊ”¹¸ú*ÿ²’d/:ëáê71J!V¼·þQ_DÀ šäÏ[4Õi@Ñé£ÞеÐ@ͧÊð<|;²\’qõ“ØÛ;îÑz¬+ðÛÇT½|{LƒOºæšöò€L©²à`e6îW0)Læôi×9?¢§*pÞ…‹5 ú¤Bób”¬VÞ’tq*Õ­‹¾–¥@ÁÚ®ŸämÛJ\0äÓGÝLsÛ/£uÙgZ{è˜Î—i=£…JkÙ»hù•ù7{éñwíàç”2lUã÷v–p¡0ÖdÏÙ!y3eËΞÃX•]!è.ßnغ@ŠöÙÑMÌ*îî¬'Òµnæ÷àFVôp›9j]Ÿ¶ÃÉÙïhŸ¼ï—å‰yWlÁr€‚· tø ÿ}äà 6Ý 6+ž¾{½¸z$f6è†W#PAëãñQׄømê£Â‘UmË¢GöÁ¨¡Vù®œ4ø„W«îÔB©ÝFèŠíR-×jÁäð Y+™¸h¿HѽÆzkãƒ\óqÜÿ{q¤ª²?ïÅÓà\¦(äyNmÚejµI=2v±µÚ~ÂòÎöy>NðNe1e]ÕÑhÛÁšÈÝKѧ;®æ³WV‹e‡zIÜfCã÷«ºNó!FñP… ilrJǪ†ú'#ãÕ"·9~ŸÍ¯ Ü¢W!ÇgÓðm·ô©êùïZ-J6;7{ƒpdM½Ùöd3êëÀÚ£ä^Ó!‹Á­ýÞîŸRàxV&ò±ÿiŒ¦ÂmçŸ@+¥†f¡>Ð),™Vrñ_ÅR˜Žé±;éU¤½Ã’wØör˜l§‡o^²ó[ž ÷™’[ƒ›Ù—§m/¹ÂÚ…pœÓ±ß8™´@”†¦Ø`ÛÉÎÐOÞVõQ{ûìòž”ÇÚ©gÐ|…¯uuÉæÈÐ ÎŽ#Àz‰Öu’Ö=xàCi!ßCÊt).„µGõƒD\Â);Cx;@Œ>Z‹'S¶¬'r#C]WuF]TzEz-¦ÐˆS¥@³S³KÐETnLÊ'ü¥ñé—ôY†¬+ç½]ùu®Ô7u¦Q Ó¢I¢[·­ SŠBë‚Ôi¢uASGŽ,›r|ÑÒ±IF’ô+kb5f.V“é{%>¦Ö>½¦MBœ׿hg»Ë“Œµ{0X1-ÝÌß…½Çíó€>ºš¼¢‚᫺ýs|Ø>½’Näiÿ»óälª÷’—ñO#}¨âì–#Ëh”Ëîö$ %5á£WØ>®p}·ñYÜ„'O 1V0T¹=@ù‹Ë\$i·¦ì*÷lý»ãeI_‰ H"áÈot­á†FHÕC©âÃGMbU.g¬Šç Ø‘eòÇ¢ë38h¥- @it ™Lø±QW½Ú}Òuk«c’§×ŒõSêôs{«ùÛ –$ϺcÚX!1ï‹ô¿ÆfTÕíNL1½ ey"žœµéû}­Mt›7Ÿûìw*•Z}pÈ)ìúU¿NÉzì$ ÝUwÃÏW5†çT-Ž^¨mdC ×ÑOŽ?÷íÚx¼ÐC0ðãôOü«Ôj ¥òû oÈðÌ»€¿OÍîªfÓ žxê1päû„™^wïFVm]ÐõÙ¼XMb†Q‚’|„iY´à¢HöÚgl¹z62‘8ûšÇþðëœXï´— Á³o+¬)l¬Ï«½{‚ît¯·¿ÉÍ g7ADjdOXvg6÷Ђힰžê´%(¨øÀ{0Ô½Ç h†ë²à¨×Ôò´uµU«ÌY‰Íɇ±>µzZÓW2IeÛÙì[u ‚$¿â‘ÀgXƒê™HPßeïÐ ±F¢7H?4)ÄD…DæWáQGî$JäÂFi~”xÊTÿí-©èô{zI(-燕7½•Ø›ü§IQÀ!ó³ÂÔZ§–¶eEØ´c¦ Aby”áÚÅå5™è†Ai™ BÈd>Žå¸m‚ëóèÌÔŸÎqÎzv­i„ì£øØŸÜ”V`ˆ$çl$ÿŸå¿â¬ dlµÚºj›vJçÂ{PÎùÚ~™Èà; LjŸmô¤8 YQy;u+2gÜiPë­߯hz.üÖY-®à·~ÚZÓŒ@å²#xGÕ9cSÂJÊmg„3”I»ƒðT͈B“”ÔÕúˆì¼’êPq»Á‘§›Ù¯âO—ÿïu6‹]ÉŸ+Õ'“L»Øw¥ÖÙrP–£Û`¨àL àYÎÅMzƒw˜?öA déëÒü»Ã$ð0Q¹U ÆÝÜ›4Ý×í¤Wq’Ù϶3–Œ-NÒ6X¸Óð"¸(^‹™ÝìeèY&ü  \ùt«²ùêW§¬Òo¬ÚºÊÐP'vÍ÷LJKô žu.‹©åmù‚ÀnGIÆ{Ä̹-…mu¥gXRÌá­ s“eIâµ?ŠÇe2öŒ-š&XjÛ®¡š?6Å»± îÐKß%shûÔÀa¡ÛH,ž?o|Áˆ}XûøÄ T°«T«V”d;vÑ/Wo<ý˜[äM~ÙØ:•üv饢ªòV,8Yá‡Ö¾¨õ.™¾é_ÄM¶Ï™Ký„à¶t»S€ÒrÁgtÁ×7+,»Yu´aú¨€Uy¨=Ü­:Nr«üûV[ÆóÄ8Ç¿GƒÜ®goêFòOÙ½XÀ_O˜÷çãɺŽ÷óhqU©+¶å‰ J ¶Ì"¡BzÓ‚×§Hl §¼xvž†¥W*u.ž9PÄÝZ-ŽƒÏO$Õ‡cÚ—l#÷Msi¼™”]Õ¥MÎÐlNŠbËýW’1Œ¨ þ“’‹Kqôô“¹¡Ôz³S´xçƒ%(„jªjþÝqÉäZŒqùð€®}Ð ËúCcY6*Æzæ6…?—A`j̓SWÐ6ÐÍiÉΜRÜGëæãÇÖT³þè@ §µþ£ Õ|Ý…~B·¬Y~ ñ5µQ(aÀºdjõÆ«×>[ëB¤V·Å º8N¢³È5Cg½|Ì¡Ss+†;Ë>Gã þ‰÷×å“Ê^ÕH¿Ì4׳BôbÉévû˜Œ¥šãxµ©S4Nÿïi,§ärU¨€tÔ»˜ÃöMÛ²A)u¥fú¨ö(u,¦À!®ñM+Àµ!¿X¶î@ÏÓÎ4œâÞw°Ô$®&•‰Á‰œ•Bà`)­?«¬Fúÿ^ ÖZhÉBÝ+&A‰Oè$©WZý¾¿'½*Œ)§wNC£gR;ÈHÝ:qÃ;dkùþîh[>;Û 7+³)]ÍYL@$B QF©èHê†3¼Ú“%ØÛWÉìDµ¡ —‹²½ØUs;ÛÓú~Ãè8'8bÑGVöEFÀµ-c‘¡t¿˜ú‘ÂÆN¬Ê÷–­¨ÁJ_O_V8²…Ñ@Ê£t¨žP­iTnÉqmMɬU ª èÂÇöŸªõÍÉÙȺeðÙ=V±{å{Yaû¨ífÕõQæÓî lÿÓ»¾ïïÓül¹Qðì¸ãÝ)·ºSàç‡{¢vI}ÿÄÞ£ Ëܧ¹5…ÓþÁnl]«¨^Ã]a,¿ÛðjÛUfCÈ̽¨Í*F E×_eÓüÚþI®¦ •ôh7讘wm±T¢GŸ|Z±w?"‘k]©.«—s‚•²äóoÔ%}Ô:¾¢OØÓpͽ9›óýͨAÕ8y6Sw2Oô’Õo )(êºõ‘dì¹(Q:y ‹¼.Äèo0€YÏû|jÚH ž, ª.TÎÛ¯¹ß¥¾«- ±Ôû{aj—ìê÷¾%¬§~«è±ý”hjéÁ^ Z%Ýš?EÉÌXÞ¡ãÙ³‹ÓÜÝЕRûµn9õ^ùÕcùˆÚ–AÄÄdæ'¨¸øW‘¥íOwêV·wÏu’‰jDåíyXCGi?aŸ+Ò›o7îÊ­b?O ©Ôߺ ʤ¶˜c“MIa{p×zËÃk,ÿ^/Ò­-Á£$σ·'™_áCÎö5d)£Ö¬ƒp^Q’»Ê‹=‘“ߎK$™©^•i†J¯|8z(kÍ'ñ( ëf¯.6h<Ÿ‡ NJFN>M õ¢©A&Ṹ ¸ßd ÅèMúÒh!t³”Þ,kÖŠù¢¢5vlÒ‰ÜÑM!ib ,ªËÛýÖ˜ïOV]úµ¹‹ÿêyøë‚–¯ jtJ2®Xãšü²ùÕýfœýùs¼ÌÖ¤þ (oyêìÑ^ªî\”ÒÝÅosbÏœnŸ­<¶óf lm’ù#ÁŽ1Žlc2_ó'ˆ‰ª‡‹¤Ð·;UËWÅh[Lû$Miøš—¦´_˜M§.ýo;᪮Ï';Û/Žèu ê­ð"ï%ëÂÛ¬UQ <ù³ÎE†ISǯ\4–MÇ£~EÂ( ´`@¹›½WLûÃkwçÔÊ60KTÅ}\¢Ï+iÿ@Ùò®æŸäO[%w[. [·;I![Ç+6cšÌíºö»-+‰yôš:Ÿ>ŒõNoï`I ÿ\7ŠcÌ”©Cf¿QjZ2¡Z WK#oVößÏ2éçûyP‹ÊÂc:8çGˆó¥LUr| v9»¯¶zNO­ß<í“°*ò¾,R¿;¿èwÅ(ok«ã5ëpMO(_Ú÷ë» &J' 뼡X§Aí¦$l d4¯ì»Ò[v½/f oA¶ÖÉÚžîvtuR"€Žu?´Ê êÉ*ÎÉÏë3Ïþ´Ô"¾laUýó}e é_"Øß>rgݺ廚äëho z}º’™¾ ”Ýö]©¹WßH­píó“«MÊ]½%b?´ »®‹Ç=xÿÑ$þ ·\¥ÿ ˜iùy£y¿¼?.}N»ÍÐ¤Ý ¹ÑÔ ;ýñ]9±v®Á*ëÂŒOÞý<ûĬ>Ë&*O ã¦øãö¤nŠ_?)>Ôëþúºjý{šˆ%d™ÃyavWõTæ ©Urǧ% %d”†£Ã¬FÈh|Áœ”\1`ÏM9]ý3˜Ø³»2İÍ3öG9sÛg£3'@MÕªó®}k‰þïîUÏAÍaÿ‚FäsChl „T·KY†Q eAZõF«.úÛø¼y×bùPŠýé'ÔJžˆ­ÅÓš±Ru¨nÓæî×Ï(ž%ÿol¸7~ÙØGé4<ȱm>”ý¸1ï*W‰þÖŒàY4¨Þy‚á”x¬é»Ê ò£\{©ûl~³SÙþâ/Šl£®>d ¦ñà%5šÆj¡'5“5t.òT9ºdÒkÔuîc•æ¡Ø®±ÎÚ,è]ŠÐ‘9´ì^m˺ ¸¼,Î?áÉ„C°p&\&¡L¿_8@´'X»Ÿ&ßøzI%|¿õé˜u†ñý’‘ë'ýa¾_ÅÐ^F-¸vVW›“t™U¨žÝé!uê9U~Sõ fƒº°ò3Œ7•Ÿõ·7O(?üÓM”Òc]èW]xU…„TÔ^B©Ú“: ljl%J äüÀÅfqÍ?÷´TíqºîwA1FÝTt¼ÕÔ:.©»ß5!òÉa…Jÿòàêxîı×OÈÜÓ"[?0ï 1Þ1pJåqŽloºé LÃV°[‰.bÕ°9ðù©ÅuÒ½&CAi)ÜeéïHf»ý¹ë¨jqí• ÅR‘šdâk¸K˜KE¢Ñ Ö…r–çV§üâLÃý®²†ƒø©¦âvoõ³Dp2&‚lªUiÜ)2^š(‹ËLÚ/ËÌcÄyQ.w™Mý&Û¤E»¡¬í?å¦F{~ëŨÿrësúšƒüÍÿ“ï®"Ô™ÎæøæÜ>šÛ¹²I†ŸH÷®kŽs² j;Ǭº7k.ÍRØÇ¡ÛºV–ºiG½ø w» Æ; ‚öŽúš'Wû´?kgU†òÉùolð[˜¢>dÛ wLs[Õïu‚¯~Úòì| Z‚g)î­~övÒæâkýq£õÑís¤pV8°­EÃÃúË¢©ð©'ÔËÝpïœb»²¯sXn|Níf šœÜÚÀ»WE¥ÖÊbŠÝäE ²,ÀÄXÅbjÍ»"3ú¬†º.Õ=H¶káˆ`aé‹=²Ë¿ÕgÕ@¾š@ž/¡Åóè^—Q÷Çùüü'àÑe“×FSùòÞÞòo¦O¿rî¸Ê-ÙÐyrìxÎØ¼†YÓià‹{*{W0‚VÅ7%·Ä9›¹ÑŒµ´ÓÈdfƒé¦b•»sJ="˜u E]L±uQŸxËMývV¯ýØ”?éœà”Î öãcÏ& Q½~ J€Á8)%)û•ª7®•Á¶B™6Gb08 /¨•-f°ÍDô 0›ìUˆz¼˜›q@6-áUñ3g„òëÔÞ‹Z,À}²ýÂ%Kú@M+TðŸûãÈð͇?Ý…ô›W­É ëÃ#§T£BÛ’•áÆò­ëºôv:ëm²Ü4n‰¡5€iÖÅj”× 7åv" ï\L»ÍF7×?g1aÂÄöXµ&‡ F˜[–ч¼F¶®ùø©oý0““µóƒO·Ìä"}z ÙÇÇ]­ÍÁD$Jk*¦œCj¸ÃI®5gÀ©³@ða®nºµh5PJ2îÐ|QKöŽ58g›n—^ó’èù-6Zö‘ÃÔÚÛ§ºá} ‡4ÎС’½Jã0k±WKõö"ªƒÓM$Dç´•w¤Añ*=ö¸;‡²Þé ͭ¦a­Òtˆ‘Ìúlؾ‘Ì#=Iƒl;—õÛiÐ$ñ%¦YR/C&t¼dcÜ]¿Ÿ!™à:åE¦¬+d“f€ÇGµà˜W·èÆ å>°åE€Þtq¢¶ ývk^žN³ÐQ_®#î=‚Ê·ÿÙu5®~Ç#ûœ9ÛöGÝJ¨+}xx?‰’íX/ä°É¢î•Ø6_ôfìi)É…´#hMž$œ¨Ý jèOz¥½}Tzž*TŠÇG~ êœE9(uòv¶$‰Ã¥«“S:5§¼Nº`Q+P–ÈjàY½ÏØSñ¾ô‡_0Q´nûø,}Ÿäê+ ÒÓG]NqËk¹^ì=¥8›WÄ0•Oêoøz×[[RÞÈLæKGׇœÖÁø»¬³\-Õ®V>ò¶¹rë&ZÇÅ l 1åÅ莭y%/ßž40)¹:ÙÞgN\{ñ"X&ݼ4‹ï@ÕE«ùØÊÕZõúH c8"éÍ›?ý!ŒêMH&zׇíî5£›]¼Ü¿_gûšÍûd‹Täy Få7z¨G22Æqþа®jµðç/^@’CöyT–ÝG˜hÇI½±{n.ëZU뻨HYûrg½ ¸f!÷Óou©»­A‹èÀÑÔZ÷.vȶ”Ò¡ K„&䎿uݰݱ‰U­q»Ã5Ìb¦†šµV¢Œ2%Äô`ƒVCËt¨È E§C1¼ô»À’5qQIŽ*c‰™4$ýÖ‡ ¸vÒÁ¨§‰ìNîÁ:BŸÃßãxïïð/=gÉ!öP|¦6‚-9óâXƒé›Ëï^–™Rè‡PMk«CzN&ÙóüØ]/v.Š>Aa×™¾6Æ §bJÉÁëë}¸š?´áÕ|õXsÊF_ïª`ˆ3’] ¤ô0ûÿžÄ=Xÿü vëÓXzE^ý,x­jëš]T°ò²õ„ÀÔ_mPÅšÆeI¹GX&T¦‚,¼7Zá xÈû½Sy¯lƒ»‡ ²ÐnÜÜà÷àq¾ $w˜¿˜asT¼`Ü!qýó‚ZõûƒòXáK‡\K£ÙÔ·¼½½J‡Ð¤éã=Åß…ý¥4•yc_éPI“÷†ì¦ÝaÛ¤Êß•&å[Г’%YRaÄ s˜Ø"'V[1ßæ^B[šq;p|Ö]ߤ¶RÒÉyÔKCùΚ1fÕMî »0Yîj®O]^æ‡âa”^NnÕuäPÚMDûº³'(}ê6¨¬5BÑ}óƒþ ª*ëÀÂì'·þs=ñ(¤\ŒÔo ýÚÉý?BÈùqý•+>¬3sîöÑIÛ\êçÂÇyõ¢š¿A¾®èƒvÃUYYî€Ã¯ýGi„· @1X)¹àGí£¨1G„²òYÔ§ eÙÔN¢Åœnà™ü¡2œSiˆt‘_‰v“µö‘+Ûy¸—ÖöüègXf Ìʦ MHËкF,:»Ê8—•õÖ?]ƒ™ÍÚwª 1“–hEËœGgÀã€?ªNóÐ/óCÀ µX㣛1’U~z¡`k`)Km‡Jս؄¿ºv·}6¶õÝ¡¯2hj9‰g¥ø°&#¶¾•Ù`ñGixjÛýôcîVãÀÎ&ÛC•þÁ.z0]ì§`Iqö¯ºâ“à»ø®ùË{ençvÔæÞ`Û*|1ë|/ˆ…æÉ™®0 £…J‰ KÊO.7bϦ#Ã.a¥b(ön÷Z×Ò­jÕu¨žÈ‘>uÑN¹¬óµ\}Æ.²ã–!Ù#òŧz=ìöî±o§'Ô§¢/{2Œa¡yawd½æ¨h×£\ë:™$7Òeº],xébN± pWêÎKæ]`Î-Ö–mo·æÃÑ]hÚ-ý¶þ°·¼eé1œ]mÙ.Ѽ"(ÚÕ–…Bë8ŒýéF#RÏ‹|¾Ú²ˆd2Vì¯)Y[`¼ãÈ©l¬KŠõšÓüÃç qÒg*vJ%Q û®] ^`¹qêâ-}_mÙã€- †,]Ô>¶ò.ôbœÓ•´å1O}Õh¬[ºØ·ÁÑšÕª Á§$l £i—?êg…®ùZלnc5žÂ…/ëE  ElñDRGÐThn¹}]g÷Èw™¢>`¦SÖuÌ䣺W!ë:µ%“°KJµÖ›\ëz|…׉¼ÅsÊu^$Yy{eï•Á]=ö»kC©áJ ¯Qe]ýµv®uÙ\zUõNËê|`¥²ÜºØÇ&u–>cx÷,uΘ=ÏlùIõÛG§¶,–¢oä^<Âôk]ÊÉ>wJS·ƒpªâß)‰›|WïÓufɉGé*'ù.„÷EëxWÖuœMVV¿§Äb9n{(~^å´ïÚ"ZD_¥Z[¶–k׺NqC`LàUúǺöG37wÚ뉠괜ŎR‹ÎŒ"#ZÞ‹ÖuêÙ-ëBi¢"áD¼é"/]D3u±‹ ê„LZ@ ­)¹«cŸß5K‘W;iîf  ?›ûÇ]ßõ ׺ …czÔ“š—£q*R}Óµ®zÛ¤×w­¼ ócv¾îª­dßuRµ"ë:ÇÏÁ`S¾k4+7nɾlHù~~&t­ëf~p4Ÿ»…aŠ‡â —®¦a…2¥g˜Ýô÷ÈŠûbÈšüY•Ù:¬«?e ë»šàÄW¯åӄȦAžöIÿ72Žýñ]©q”r²tÇÁ$’YB¸¡¸Á‘®÷FÆt)z_Þ5GV†~ÜñÔˆÐ&÷ƒ—kîYý%Hf‘RæE‘±>àÝÕ } šeÖ¨ÕüêPÀùZ×Û¼{RÃÕªëíIÞ]CÙò<“}~.žZî¿;¢c¨Žì¿Zf­cµ'æîCa²=ìôëU\~¤›wÍT-»7*åÑu­’]À”¢ZÝÚ»º˜8ëËN=î¹êœ±ïÀ-{V¶žhPXÚ9 olë*½ÊwM ‡Ezínê6%Y Ð·åÁ’˜ÿÑúx{eõ2ï|Ô:ÒC¯¹Ž»˜ýjƹ²» oøzmãÁ ®š‘(Åv{â¤é¬¾ÕUhÓÓ¼¿FÝ2/6v.H.Ûu‹²ä?֕Ʋþ96¨lm&ǵ½›jA"ÒßÅ‹™wû‘ƒÝš±¯O0¬—•þµ'ž\îu"uê"=Ók]€4WZ”Iô-Ð[w\–ÙZ¡!嬞@²k]õS3ždÖYýñOÄìc’pÍáÕŒYë;b«’°Âêû¶èfW?lj'Íe°ˆ¤'3ä…¼Û©í!DF áB8edcfèÁ´4gÎÕõ~1X¯Å5»bf)|/ø ´d]výÜnºS dԻ݄æ½)¤Ñ¦[|BC/o®–ŠF³ÊäÎÏÂ##Û[%×:}ñŠÎ j8•´‹„Ôœ]ÄÍ5cÝÃê´ÇQSÑ}±: /D×Å2ÅGÇñd6Y¾«îÚePØuVdÄþ½­«íVö5sgr…òanÑ Ý#&æL²®\™¹‚ŸêH`ËW{_EŒð€Ì 2“bU`3vÁÁëݹ¶ óÈ9•Òì» š§Ì»•äü¬ïÕ×j²÷ↂÜ/Ó"‡JÖíêë Û9¿ÜuœÇ\>©Û† &º!?áT$WþÙ@ê¥çârqsvW|suå]È›?Qîxp»+¸ ÔÜüC;¸žÕÌX`ûó| aãBù6Û öÌ¿nj¶œP{¬>o,Ô?úŒ§5 'KÎ2PÿÕóíã…:kFd‰ƒÝl-Ñ«¯V ».Ö*Uý®S¯ÑÆnâ´rñy’Ö²›™Ú–±8)W8ãeš¸{ ¹ÞHÑëT­¶¡²F±¡Lžíèï7K«#ÚºÀÊ+ï\öû½…EÅ­j;¬õóÍiB!v$0iI—{Š{ºq‚ŠãÚÉkÜŇ‹ÓÅ Çm˺ê ;Ž¡c^rW€¥É  ¤f﯂`·KºrèhP"˜òÀãrãèF=žçÂp®-a|ðõó/R³ã3¼ùïÝXj_v¿ÒD‹†úüH´LÛBŽœçML_ÄAf®HA¡uU}†˜bKð «_êH`Æ^éÈ& ,j;‡Æ5Û1ÒnŽ ÐSTãdnEmwÀåe‘é©Ò]ÕõÕ·çg7ºç¹Ö F\ ‚Ú•*ø¤ì¦.–XÙ££Dí@ç.¶yd³Û£›ôDÉÞ§¦Øi2ÿ¼ÿh9äÄœ<Ä˧ò©ÝÄcÞCu¯èÓ­^­\|nFtÏ]-u0ÌT¥‹9U¡# Ÿ;]3ž”ÎÌÀçXÑBuYãeq¹*0뉸Ýý¬LþØHñó–uàó3†x¦l:¬¡¡·t2N‚0D©–®»Y ûÒ%ÜÖqç?\2|V3ºÅ›¶qbf•¡ô­m ^ò”+¬õyžÛ:N™Hˆ[ZYô§FÎî)Ï ª[!~JY‚<(ž{@Á ´Â‰¦D­¢¥(tvèÔàãïú¨®“‘#~ÌÔàd‘Õ,´~þ›M­¯‚æp‰Õ‘§ÌÁë™È¸ìLë NO‹UT­| dmD"¯EÔ×{utøe]'ë"Fü¸u)Å?/æÃ³°?P‹ÔÿĸU꟡ùS•ýƒàSèdÐ|:ª%ï@L#¯–ë  ÿ®&|®ò/'¿6”ðÔÛÕõ’>€Á«.NùŸ FÜj#^*t:2ñ¼>‰|çÀ©C3x>å¦÷‡¸8öœÌ³˜Ñ!¡Y¡÷2b¯ }î7v®Ù¿W¥:Б K s«¨a IAÅ-}©gý£å¾?îêd3rWdñ¸¾y¶&ëjD]ݱW-]¶¿:Ùƒýu’”s€Gcvד÷bdD²Éá·@0àÕÙl9($3_(˺ÒÊ–“ã¯;ç™(#kmû~l•û!ó+cõÎ4Šùø§©"aTJ6…&wÙÆLC –ç—n·r³Üc*¡ºÆ^ LYL2!y@f“ˆJ^ÂBI–¼ƒ´¡zúèš«I†©ž¦0ç·¶BÙñ;¬ˆpÕ笉î8dŠï½Næ-dꪄ é¨CºÑ#0©}ÃêY{ Û“’¡ˆŽMåz°S8`Ë;k' aa‹\”yz‹ÜÞHÂDü°BZÔ]|iÂG˜ün®J½4 JòîWÙ•m¨&GvÒT T'›a=™C±uÕ¸ Žý±np1¨yhÛRd¬}L‰Z5 (ý— ÖáÊ· ƒÙz!†.‚ø"gÛDI< ‘º˜Ÿ`_R jÓúÄØ»Óy4>»'ïúç~„T÷G'ùP ÐTT*^áØ©Y ´Í**ä%ŸO†—ò¹XŸqµñ‘Íó;ª^Ú¶uK¥$ãÄ6F•»Ú©½ ï…Mm€ítº •´}3ðÛÂÕ÷þ!cƒöµÃäôQL»)æûSÔY»ŽÌBž¡bÄ2šíîâŸ%ž= d´åípš¶­ë¸Âds¨Ã³ÏéÝcE³xM T>yydvUñ¶Œ¼\;qŠö:V¬ËÔ‘$qh˺I6ß„çõcw’ÝÕYY ë·¤ÇnOÊMÜ-eô¨9œ­÷Q>ª{,M:pWÛÂh© žxå p,Þ}Ú™²'hîíéŽ|&ï{¸ãý±.¤ûâIÖ# KdNX2Èþ”Ýa2'ãgê£ùªd¹ q(w.Ò.Êl0ˆ•IEÿ&¥Ùd¹\9–õ]ˆ Ûξةë''ß² D2ム—•/‡[ Q›L¥’¹íŒ ¾EÓ†àÜEZdNfЛ•©¼¦+`Õ]\¯ÍU>ŠÄßE |7Ö'UbÃïfšYpCʧʛtÝl½YªÈí¤K~ÙÐù5/—ô†OÉüßeåÝSÁpT ô0íÑ®é~Wv\£u¥7^¹+[ e ‮կb<éø»qöx”nþR“a;ù C:åÅ×\ý2Ít"ŸQÑ<‰Þ*šaéú—œ¾bÅ‘PÒ»×›úœŸ`È®‡Zõà³|Ú*þMžÌݬÏSl¯0žŒÀk†`À”¥WÅC‰÷Rsßâ³µ8GuB5RºÝyÂV§MCKßEó׺Ž2,0½ìuWcXuö$CÞ *YYôo´‹ |º?Á>™¬´€Õ¦uêÛêHzD…̦Wï3&«M”ùLñ7’ S æðj>hxd]ȹŽl7CòjbmûÒÓÊÅ›…ï…Ì,æ±·º“̦)ÃÖÒËÇ >z´X-uÍq¢\—ï:Y³Uü€×Õ¢ÆùpÞß{›=¦ïò¡´:ÎÏúšk6'ÑPšsB½ÁzÐÆ¡ è: ï]—`|¹+¬™ºü;uŠú '[§Ýõ‘%UèHK«rÔê|C@«˜$û®ˆM§Ë]>ºÖU–HOPŽ,KWAzÒºjµ>#’Ñ%·–Ñ.vïíKöX—ÃdmŸ|ŸøR긆…‡dåéãkœïŸ¨íÅ´V¤ëZ‚5Å+F§Üj²”¯²Âiy‚Y÷bKNÌlÉÚ²{%MAQŠ7‡j8mÏQS#²{ƒ~›Ó1p¿ô¥Yê[®ºÖ•jÑ‹ÁB¹{újŸý†L¬Y²|6lZekEzÙ¬ÌEÅ‹ü’¢{ÑëMýFú¤™œ®ÏÕ­ÚŸäÝuWƒŠ½†MBÈhÍmr8D ¯ åŸ@=êÈ¥¾É¸­i…Ç­@’‘ ½ŠMÆm g;I*£ÓÇýí ’¼ÄöÆ›Ë=}Ø“bÏ  ®Êv§*yŒÓ”G9QíÓœ‰ Îð<«zYäÔ–ëÓO(ƒ*ÚàG%—·µ=M¸û&_fÔ&‰¾ks’¬ : ^j?OÁyWJÍËZ 8Ó{N –#›Ûþ%åÚ E 9'²Íf«=*UÅ?0ÁÊÔšcb£§F7kﯻZE¦vòEû\L|7ÝÕ‰JÞõA;Ž:Ö1¸q¥ýIi™ÄËG› _R‰J®3˜ÌR2½ú™ `ÀUlj,"¿%}±4õÊà L*Q—9pæºK³ •ÏŠQ¨!t™Íñ/vxcïöIЫýâ0;@Ü@„ME›…ï3pêšØ¢²mJ¡a´HÙš‹ý«´®…º‡$9(Éô2Ñ*”A•Ò½àÕöG‘xô±œ†Ï<Ý“«»ŸÐg¯2µ–Å.Á)(Ÿ´¹Ô~û%¥;CÇ~—Ül`Ë5I˜yP<Èæ2i b˜ñ/*v‹ÇåÆC‰Âú(}5jiÅÎh2N­Âæ„Ê–õ K²ÆÙxÅtÞyå©Ìư@8|°©§ÐqŠŸ¥À3ß!˜e?´{Ú$ÁÒ¥‹Zæ§–@Èûq{§mØù;ŸD¾ÞnÄœQÃü-]­ˆkBºÀ$‘óû¾&yÊ#Ï0±ëãð÷— 96} ÚÒÎÑ4E¯)‘Bê!Ë"¡õqø_ë‚ä«rw°Ö6=”±3ñô[vdÄv¹¢ ûMS›}X” ëó*-·U*¤¾ ¢ËßµLKí]‡ÉS¡±5ŽƒÎ­”0µùñ(ãÂLŸ9äíyy2·[›÷»Ps ®áIÂzÜnì—ä]oä—C|¯IçùB&t”||vàd nfß!ÑœÞ÷;UYffên^î'[óOÚc|W5 >ÿ^þ$xk'órÍÊ#ìi–NðúPî¿\Òò_hDRGà’p2ŸBêžÄly šöÑqìVj»Tqò]\˜î½LçcW%asK9²¢æÉ ˆ`ÅþÀôÕû¸Ø¦åÆ¢eÒËÛ¿¯y¿óÞT÷ÀÆðˆ`öí&.fþÕÝ,³nÃÅFZ¢Ë¢Ö{îJy<ãDŽp Ëéò/éAâs³›Š²ht7Öì“Â$êù®æÕ|xµì91xÞŒ Â^ [è©ð‚mòŠIk ®œðûê;Ä2(Uˈè'Vh}R5"Kþ „áÈ•5§5; r™Äo¾êF"ë?<ºØýÛB@ãðû{¾Ã± nÕTLr˜‰í¸5GëüQ0XWù|;°E’@¸Çî»jÁúTîÉl)·VÀîgñ+@x ¿ùHCø®ä,½ô]©»3èd]Çfh5ô®•üCŽÍCñ¡<¶µ›†âÇí“°bãvŸ=·2ÝÖÌe²ß]ód€2¶Íœ ¶Ïõa +• P ³†ø»@°è¡úFì¸ “Äö“Šz“¥ŒVÊÌR³ˆåMC~[g)€póØ_Ÿ©-—–Hݼ$ëÆcj(þ½bª¸OrÅ—ŸdÓ½HÓ‘1%gõ D¦šêÊöø¼ÄE"¡hxs N&W·¢-’n„,AæÐCÿ9uþª%'#F-K¯€“\¾ëÔ@¶Ã0±ðéבÌW˜Ô,í¯ìyt4Élª:OuK¦iÃH’j{àð°©åÃÐ?ì½'¾vÇúâ ‹'O&“Y¬àÿ•íÏÜÜG†ZR‘×îâcAy~êgñε­‡biÕª,Eùgä/}Ðî°¢BìX-¥òÌ¡¶íD ]iøIã¦ÛP=[¬™ÚÇ)ŽÇÖ,îã äµL=¡"eBfŽAÌœ¼«¤:.»'s—ü¶1î`i ËBž2ßT©PQd é÷\Õ­;|>öGuý¼XÙÝÒ¹€Ýy(’‘_=ƒd6`.¼ø,Ö‡\™µ´OªFÞ¿«šPdû'ÑÙ`£|XZæ.ÿjªÈ)ýÖ—E©*:Þ ÔØx± \W<®xãiVt¢|ÀÍ ìÛ׊™ØOh2µÚØs ^ßÁƒDð#½2:•@‚}²±±°l¥ÆÙy[¼VX:_ú |ž³¦JžŒHý$&*§­4 ›[ÿiÆXªö¸é©o~V—î€øý÷”ñú¸ ݧº^uœ1šjSý 4%ÕØ/ïb™Ï¡¸Ž×Ùäù±(<*Q:Žš¶^f*˜àv齚k,߃ˆ¾TÏÒø ¹Î‡Z…B³#ª²®SI $ â%5¯D„LÎ_AÅý6cú%ôÛO?;ºU³*fi¯¶ïØõj{ò3ÄÜ$Må/¥“w Ž!:°}4JÞQbUPžöŽ–$ðAd®6[€…²²¦Yô‡:Øæ§lJµŒŒÀÚ•¡ì±K fÅÖB*¥øm~T×O’nö©®c(Ãw±JvM5å›ãÍfãÎOLQ²'î(M‹Áb#D¶‹¾ùº¡ž“îp2|k AÊà“ß#:gÞzBPÄQ aŒdÝZÐ_¨4™û;²oµ;Õ:•ªéù;Ö4îo䪮Ÿ«ßmü‹Bï—{pú1õí¬©ñÈ UŸøþˆ½ã§LÜ@Àd èV2UŸ£=O=špdÕuüY½Y¬û P€ý ]SÍ®ùûèÖVióý5È÷,—r•ùpÌø²Ý'òÏw»è(ÙöOÕä¡zÎV?©Á‰E>^´Z(lð{7'å¡ÍNv”*ŸvúÆTÐ;Ñï錂øÖÄajíMÒ¯©5ʨþ\ÖEU|Xs7ËjÊŽÑ0ÑD ¦.†R­ /°G9°˜C•bO´ð’üâp(¨õÄžªZ 2&†4qb™iÚ  ‰ú,ë»2•ðÆÒ)ö•c{ z©[ôp¶bÖö°¬j ’ e6@×颕B¢¾hQnç×#1û¨kùH°ï2}»Ù,W¶Óu³7Q:ÅéWÉl:”µô¹OøÑ­]ÙùT~ 4{jË¢jÙO58ÀÜwïê*è•§UüïâÓS¿š?OÔ¦Öu‡§D­ÂÔÒ*TÇ”0”°Îæ!Jœë×Çåi}Æ4RRT:ß|ÊÛ²˜hh|exçAz¬0'Û/1,ÕRæ•Õ¿Á×˺]šÝ´YÒãäÝSi\+…ª‚%‚À{ªˆõO{õ.ñ$ý³–œU—Ïwf¯whÃÝþV›U÷FíÒVó-g3çütà ÛÒbîñi›D¯7K ¤ÄΚê: =dP1È Êq(Šx@f:(,=7»mõI¾ÞèL‡Þb¸5ø„òRîíùñœãØß³Ýo’’)c :›Fc$£ƒ×Ài !£…P­. ];½¿êÊ06‡bë¬Ã Bëu¥¤b°„QË/žÜ#©y‚¦Ìx£Õ Û¥&½0wW-€ö«¡(«ñQ¿^-¯w2c*[šxk³Z(¤õ6Q¸ê’CXMÒAQ¨"ßëßKÅ,ëJŽ­9f|rC«Ïi÷™òG¹kÕÕ(ùâet…¾ÙU ò}#t1nKÿÊ4—G¾t=ÔãÁºµo’rŸP~ÏäMòFÒ9…°r§©êoÓÔò+Ñ®æýÃÝ]½ò§ª{åóN4¼–o ¬72µ<¦û ew‹_7¶„o¯wÏlWØ[’ õY¬­Þ”âÞa&›ÄdÝ:ÎSõÐ&žù”·ïqý4˜q–A:5lbdÄþ˦²=Ø—‹ÕÙSÒVCé1y‡sÞ,VÅü3‡Þ“ XÙçù~ž´õÑ#qõýCcOyÇ܆J¼À)=úô+…ýÝ Läv¹Øœ«º¾k×h­ªü‹û Q÷ ¥»€x­‹j@ý"ü6%Øñ6c&À·n½š÷sÑAERò§HèÔwÇ2aKOÒv××K1Öþþ?ª"§KØt°Öas8gÉ–’Ÿþù½èÕ…¶»¼ß)ßÍ»‚-XÈ Sǧlùê“|sîé=¡Ÿ œd.Ô…ÙŒx™ý–ÄOæ¾|õ{GÙ25F‡°HíÙÝvˆŠÝp1ˆ )S³‰|l5Y Ž]ÞÎ~ÉÂvãôju©®Ãܬñsׯ/ dMöI¬£oûe­õÖo¨9õį4ß,é&å ÝȘs*ò]'ÿy‰ÄåðËÊÈàK‹"ÇLI&´ßbÓ}µÜª0›•oƒøõÒš÷¼O°·tG+|Bá ž¤Ãb·íÜhfU±soõ™ª½Úhî½.gðLì/T¯¬1nÒ£D<ÕïÂébý‡Íå»jõœR.Šs+”]uSùÚ’V»ƒº¬9Cß+; ßd¨»•á’uàõ¨N}¸#q2 jÙ¡“èÈ0ëÌtW¡S’õk'Å´å®u'Ã×X{.S¥êù ®h{ªDb|ßéÏO‘¿$ÕoG"Õôq)LËñÚK{-w š|W Â-w$êSnhoQã+(œ–~$ݪfª¡¥Mß`Ìüà$Q(™á¾Ã þ ¶œ<}oS2ÍÊñÈ…P÷çôÇÞ﫯t…EÚÅ]­ü]•Né˜ä¸¶³£W[͸ ¬¬Ñ;LZ èéN¢(n”V$›Â‡ˆßUÊxÝT-3!:çåŸÃb°=uO7Oðjº÷9"•Ÿý¥e¹øs`ÜÐÑí‰2­û}Bû]P—ºã‚×MM*17™Yþe×µeK&Åé&¢ÍÃH¼nªužðý%šç‘ÑØÂêÊͯóD¶µlÈpº;[ð}Ôüv ^Ó®%Z,';nƒ‰PƒÏöK`1À»++é®×Ý"¯öžåÆl ¥'óõž$ÌIôž³«O€Fßg $Q:z¡Ù`DT²¡žÖg‹2OFS°¦LµÏ:ÀT¨”6ºç¤tŒøIõB9ôG4ª)fìÐu±Q?ò¥×>Ëž ‹¸ÛÒй›œ]{vJ»ºgº5öBYüC "ãž~ëïØÛÎïG#Ö?5OEƒkL“Yu Ó}¸Æš€gMÚq¿¤9ÕyX65ŒeÝ.Õ¾ ‹ç¼ÆœÆ-¹Ù.>«¯ Í!¬ÅFk ¨¨Kg äÎöã–º>imJ«£[œ¶CÙIÏ<“éž'CxЬæ€SUá»Úƒ´šº§†ºžwÎÖÿ ÊäE^Ý„*ÇáuÝa–lŒôLiû#pAöQljþ X³(¶ih=ßÄaV*WB¾ŽÌÇ!¼È÷Àúa­•Ê=EË¡¶©ÁÒ’…ö RÁÁáXA{ш–¾èMõÞØrqÒ…è%VÉ€s4k«Y‡Nűۤð~2 VDÑàŸëNÙ¾þ½šÔ‚螃®Èˆ™šZè!oS”ç‡E» ð© 6"[þ„²¡9#z$¤Þ‰I³P†#¦L.Ñ-Z»0 –Bœý/¾Ë›i$ï}¤•½b„nªRD¶ƒÛ] Ƈïl6ÅÒé ž“m|×,ü¨!¤K¿4‚Ýø®†O$ƒÍ¼ÚØ¿Pä­òéö™ä!Ùû€Iç0Í): i>qÛ0Sà]Ô -sòvÜ N(Èr’>¢$‡wì³Ëáͺ¼ÞƒiáÍëm½£ÔíÖöÓȺ¦öH ®©®Mÿ„ü®Þúr*2FÞJ¶ëâ¬3@ö5+”å'|s½Ã9WÌNMõÐ=׆ªÈv6š'î¦Âå ›zîýÁÕ#ýlí©ßû³ô}2„$SCib êHÕõœ¸&j2Jã@«õ©NUÝ•ïçV³Îì|Ž×AáL'$‚n·lB¿òpi}Õ€3iiÞîh%™2êv:ekù””½øš ëS1`)ròalc~lì7êf¡â¡º—‹ìîøÕÍÖlµ³@Û½»ÉrÊ5Ï0;÷pjÀNÃûörc}Ê íI2‘ï†RähO—þmmÔÄP†îÞþ49³ u±Aǃ4C&Þ :ÕˆwOñ"ÑZß=ïÕÌ`³J1@úTü"ÊD9ò…KçmºÖ“A5ñº>¸ú.xel;w¡°@Zª²™>“¼²r’ç°Í‹…r·õŸm]k-“–ÕâßK\]äž8å£ÓPl„kŠ´ç4½% c ­~ÉÄN#Þø"pBüZmˆÆN×­-5Ypxœ¬Õĺ­¢Ù¶í9M%Zj25ô²»1ÃBØFóktAf¢.¨vJÊÌÏ¥xÍb}I~“–xЯ\ÜÉ‹ hšÊð<<çõŸLqÞóg#tKƒŤC±—;¦¬ðä˜vx' GÛcË…C×GÈ…óyÈÛˆH”? ¬Py¬eoú§Å âÈ›‡Y%….oìyòïGÍú¯µ/s›æµÈÑ„æe5LÛàŸ}ÆúQ`ÃA72?“ƒ*°ÓÓ^ (yµÓô-òê›ú·‹À)Ÿ$«öªc3 Ûè®{'ÑðrMñ«ô2ŒÿôÊš‰Ã„LWkaS˜; "Zhev^´$ itŠ$ÜÐ0üá-RÄ·Mso7ä®jèßÉá¥T1­ñÊ_;ß»¹O¶ÐŸ1~0ÃR3ë)HbÓGEl}èUkJÖLï9iyºÅNåÔïYªÁeZ¦1)–|šÉûÛPd´+DoÎË·){ \Îýw</ õ»Xú%psàœb™UK ý9c¸-¶€@¹–“Šô<ÔþÄÎŒ†r˜ÿö¥DLï*ÑŽ'$…ûõPEN sYW¯]ó“]3Õª18+2&ÿî:Ûä¾4¸ë6IÁxßhwèw5î¬aÎÏhé"ú{Pþ&›d1™×m€›C%Q„8p—~§úàoL­ÌÓ†ýÊMs8Õ69Œ°DLŠÕŒg㫱„«J"×_9ëhŠEžXòåíÜÇÊ¡H3¢£;­WvJ“³óΦìÎê³™íÓÉ®™Æ­€¤«­ *¬kÍaÌþxꃷ…êO¹«dPX§yùYy;{­ºôõY[]cÚwí5>ÔI“ÊÌaPâý«Ak/ÿr\d•9œXÁ}âÈ ƒ8="„®$%0BÏ[„p+¬«ê×f¢Lz(Š‘†'æñ…G+ó¶yT[î"–·þÞß²4ê^¬z3_J·uã6Š¥ì¾&H‚>È`R!ü¥m8”-\•LºÏÈ¡&¹ÝZ¬g5y¨Jªª°éÎ"èÈ*]ôlÈ¥~G WÉå-š^½–<¶ ªÖ˜(QÕå!8žÒlÜÛ<<”Žô¬1Ý$¯S(ߺpâ~õûÛféšØ©Lò'A´ åǹGY—ø«÷¢n ºÝų{Jž7T?Ž4dwøµï_µÃùÜ"=iͤËDï*‘T)DP³Y[Ëš±»MSÅAmœqûÖk&­ÕÕÆ8™m’#+ikt3‚¨ÝÝ…Å­¢Ÿ‘¹w‹ø´\Y”^"~€&uYLòH<†ªu‹œ ¾ÕíM¦«8ùkuw2«PÔý)Ѩrs1cÈï½ü\96áxsÆ'™Ö>ÂS%uª¤­è«(Õªû#ÓŸ®ò)³(XŒ˜Öd>ð1êgOPÄý7ô›’¬f”üDg~c )¹Î¬5íûæGŸ¸¦jIÆœ©û²fÃ!¸å**ÃT›•ÖÕ÷*Aû#5&¬NºüøK^ò¿?j§”Ûú²'3µh^¯É¬„£ד±:«™L·ïBŽA¼ñDEÖ[MõwŽâ|Ç9h%Ž‹ºíWÖR'ÿÖ“EªD™Y­cúó ?Ô²,¥?:Å+^öx}¯œÞ#Q-/õ+Å?yšœ·9ûÔ#¯ZU›Ÿ:+ï=BÿÕÚžÌÈõº›('YuÒÑÜ“9`3_†r"™µõà–.VýX×þ*èÍ'ëòd¥[›ƒÀTÆštü¢ÿVÅ=8ÐÛ™ª,@)ëÚ­›üH;%ÿµN“­”é7¢UÛM¼’F²  Ú>á¥ÚwA†LŒ{5O±Onœ”ÙtéÑܦäÐÅ(ûCÞj³Љ)ÌÝ;´´Ü¯ÄJR¨™»ò%_ÎÄçlÖ•"xjx¾«ˆðçJ2>2¡{±ÕÔƒ‡^ªëA=gµª1ºï]êm~•Ë­˜Ì^˜ŸN|Çy*ÅD·¨\-{*b}é]`*Î Üaéb^ݰ§Ï8›Íf]u1Ó´àY«wÁò:²q_f8²s’¦mÿäñ$„ëñþÔá$ý}¥nj趺%>wz­ì;§åCeŸgQç¢õYï†Ì`[X-ômGqexrC$…ÊÖÓæh#¶½–¸#Q¨,ËšÍLj¡†J¢Aˆó¡µO¯Aüd8g±ïêtï)£'+Ÿð$ µÚ¬˜ ÊýZ«ÖÅ‚qOù¸Uºï}<¥úrQtzÓéUtê°Dv¥Z­gMÀ ÙÐÈ”+ƒ«ÏIÖÕvæQŠRnÐ]†Õrëå¬Ï‘íjGöøPŸ¶ž¼ZJ¡`„ÉÚ-þi†Ìñ‘M¾ùÚÖ7ÂÂm¸c³ídSMƒf6»WÑÇr}"Š3ÕÚ Ž ¬éì4ƒÛùAóq>Ù¨.N•Y8É‹rwŸ”ä“2ÇëÚÉÙÿñàŽŒçý9#+'ÝSÅÒ–°®“ï3aìçÙU«U¸è9@ëÍô¿çfl~…Bć䷿Øk]svEÆAÚ¡ÀFvÆ þX4¨;Þ÷kŸ&ĨT ­‰$çÊêH 3º²ú@”¨2,•½ì¨ ‹ÕùàÁ•\ÕSëŽïZV.Yu ±,ƒ:E”M­?,þýIÉ‘±”›¡_ëê¨úTBS–ïå3Ý,ŒdxÜnÿ."2ƒÚKïù8‘$C9_µÚ]­2ljébžïz4ÏÏwͪül5*.ÇüðS‚–ÖX>@¾ UGÆ18² ¦9¿w'ß põ*ÎyñÅ)ø>ìbàµïšdc¢°eÔãñ—œf EÙ>3CL Ý„øvµFúCSš&±¨ê¬þ|õ-ß5ÈVvù×ßá'-ŸPlý!P¸[×É”d]óí ܼ«¶î¼«,fM±é1uQFùêbìDzÞºwYûÙ>Ýú°FŸd†m@§'5²î*™‰ÿêZö"`É·¡äÞljw½ZZÅ‘1ïž?Þ¯Y[}–d‘ìÖŠ«Î v[Z×q»LO¨' " ˼̥PêûG pߝަO³ÐÅîƒÌ¹5`‚$ÔSãÉ‘å¹ÜÅO¿ä‚Žy2ÝC²ýiŸ †( ‘„İûƒžèËúŒ{ä¬,yÝå­DP®`¤ Ø Â5oˆâq²9çÍø‘FÚk*œ®Hµ†\ܦârT[EÜ‹Råªk@šƒÐ1$Ôœ4ˆdO)·O7<>êbÖ„‰ƒ£%g†=ªà9Š#c~p÷;gìÃSlÊBÞ9#·.äi‹ 4¥ÍIØâþRœà¯ßhe%] óaôg–@YÏÕ[¿¾È5ùšáV¶©´„æÐ!ñá~l}[‹qq‚ÍŠ6…=\Ú•Ô™åk¬iRË.4*Œ# Í‚ÅcøÉ 7>oŒd„_.õƒV¨„!i”R†Ý¡³À‡Úµµ1nˆðƒFr£+ļnõÝ·fa1Q’Œ^Û;¸‚a¢0{nŠŒigO±Oi㶈¯<Å>ÏΦåÖ”j5³A#«ØŸ±c lB`È^‰Mý¶zDþ û͆§—÷ ¾«¸Ý)#P«d3°Ô΃þËážÕ‘ˆÞ ô Õœ®Ä‡ckŸ…*i!Øõ?ý Æø¨®ƒÐA~Òá¤ÊËø †ú+Å?¡Ú‹?t3zð¼2{ø; qÈdw»p,ÔÜ6¡ÌÂ’`GíCö‰ù¡æ8y'«ÎB‰@Ö“I:âÍz++—x²³«ÇýYonZ4˜>ù®Þ?Écé¯B‹æÞ¶¶,ÂÈ †{7öê£S+É»íFm.ŸÌ–ä 38pÔ«8nÈ nç‹{ÙãZ”ÚÝÓÉ]×sJ-lÄš:³YÕs‚R\æû²‚z­(C™(“œ•?©Ùe«BðÝ嵬Ìá£ñy,ÒUKkôñ¦ƒ@â!ˆC±–OŸ‹…3 X5,W¶Ñìâð%¦F7:¥KÁ·ïÌ›c“ßàBØ2(¨*©_‚®­ëç¡Y Z Å*iç;Ï:¬3ÓÊg.÷ªOh n¦ÍÐ=Õzdo\ÿ¼0h‘]è¬Ï€ph½uïM6… àg×'0êÔéúùºØ±âš¾M²®Ø]Âl4~np@ÅO?‚>ãâKO¥wW € Ž†˜™“oWú˜vÜ˜ç¨Ø8S*™ÏiÔZ“ì Üç⊠BÇd_ì÷*3ËU,ë<¯ÔËG‘¸î)#<–ñQ]Ƕ—œRJÍöyNœ…f!d­ˆwr í! ·u¿DUj5‚70u§¤ä8YÛ]"âþì7×ëFh¸Éw¡Kª}Û“O%®'Ÿo»§Ù> .œi]­w“ ò•d!²êå±Srp°‹„?à~+1áˆÍ­ž3ÛW¬xZ” ¦6¥-Û]VĽÂiŸŸœà¡ª¡Ö!¼õy>ÚÚˆuš®‚ëςɴ>UªóãfW2SÃIe¤ä‚nÜ2çÔÛŸ®dÛ†µìÒ§ üO‹í=oB•~,Ú¨Éì*Þ**ÎÜ‚ ‹Vƒ<° g…µgƒSKŸÊƧ؇ä2ñ„m†à0R¸„ŠHª…4)K ®I¯‚ü‡x1Òº‰Ñ ¢W‘ÍžÖ½‹¶³ñ8¸&ç]§€4äý.·¶•¢ŒéN¢ÛÖ¦#Ú/]ºØØ¹_näGˆsͦÎý¹hãR, ½qÙý«ü~’+ë§BF4ñE•3¼Á|TÛÖ… wºÆ'³É{~$ص+æ ¨2ÖϺÀ¤ÀÂÔ¥s™d…9 ?ÕmÆ3÷ZÉÖ•û0œqÍjÁ³‘’§ï˜±»^ ZWzˆß§Õ°É…€ñÍâ-#^0ïHõç~ -Èžè@|”Nª¹: u#G†Å·Å8ÁºýÊ5> ¥{V ¸ŸüFªø}ùzz­Í%(ž‰~´vò¬ó•*CM†Ñü#w‡¿¶ùþÂ]%ÛþÎÕËá-ç¥&D‹›œàøÙ~vÒ¢¸‰½Í°{Òë®4'Iªö7Xß>ÍË·sè.ê†UR(ÛCûŒøJõ3iÞËMÎÖ¯ñ`š•ŸðF$4Yô“‡>‡BEM4EÒÃðé\ |s!c:F2ÉO(Õ¥Mÿx1fwß)›§&µbJþMGvhU¾v 1º± c3( ( …›Pëp¾ŸóÝSk%d ¶VJV]w>©P§²öñ¬Õ«mçû|”‹ëÅô½~Ië–L›ÕüÆ÷­&Kìíp =Tºüþù>$çèIc£_ö#6½$Ì^ý³ö¸¶×'Ž_䧃áµò)òÊNÊé j}‡nËåôýÚôåâU†OFg±âÚvF¯I‚|;‰µøƒG üO«Ë]!h6>P¼¬€¬J“ ˆÃβ.ÍBG6òùV“3Ó«A’ƒdeÁÀ0ÈeñsP^Ÿ_˳¤þPã/Í©¦„Øuo9¨ìów¡{IN©}«Îž©ÉcçV’Yié£þ¹Ç2˜û¤jSŸî$tdª¦ILdŽUocíQ"ÍL|ÙæI š Þôçð5‡þMÏ&ý~lúkÙ'À9¾žÉðŠó®œ²S¨µµÀ†‰Ê°ïj}lõŽ×°bö©8‹´R÷ØP_éFõ˜­-ÛGúêb/é<…é9@ÃÖøÄvy¢#C›GM×’Íî8ÿ2)à! “'ÉñŠ-ºU6µ±-Ÿ ˜›CÙ©N’GüQgߟÈXÉý½HJÂðfײuÍí»Nü3› V]Õ‚m‹‚ŸF¿_ &[ŠœJÜ”VТü‡o?`'ZÎë=ŸÕü5Ï×ëjf¢@ïëÓO ür€`‡‰gYåâ^>Bëõ¤„ƒ†˜¯Í.ƒZâ„Dûe7éÌ„àî–u¥DŠÉ ïÌL{õ>ð.º°©QP³Â³&9²õ$—Û›Ö°Û@ÿ( î•?´7£!VZ1Φ©ÁØ1®„©½¥ÅëlÒ8î25íâ‹ä½½š»q‹³×Û/ÉÉÚÜ5k§$°ýYçÊëÃi6–u ÁÕÂn*h™†ó®ÔäybÅÁ›[ç· V_3{Å(=:÷úš³ŸÜë‘ÆÂì¯.öüìÎZ¦Ì¸s%ý­Y4ÿÙsäÜÈsµÚ²®üt•#¹š{I¡l.e,T^0œ–K:ÿ^‰ Fͤ‚'³1åhkÅbxuJ… :“í 82wk0¥}¼EûpÊçfþ’¢¦v,ÀtîO‘pr`óœÌÍI̦%·V-曘ÈrËTVÜåŽÛçÔ›aéT˦Ã̯AŸ»ÍiúÊ2²(­ºˆèÛå’If_.e:a ÈõÚ‹Þv”ð-–ðOªí&çœÓ†r*~y'§ÿp§§¹}ÇέøGÇá .’É} {t‡:EI&¦œñŽ-Gµd$ΚŽ\ž%·@óH¶;?A·d²S^™Š”Övdã“‘íñXÖ/Ì9ÿ½ ÙEö1³´6ª˜`jɚ镘ŇM­Þ¸î+ÙûaÂ)TZU ú1v÷ANò¹ì ‹Àѵ#×:._)ÉžÉ_‘ïKapÍN­†P@äC aÂÅT$؈`wŸ¨9ù‡‚‚͉ þÑÉkLæ… 7¨Vùl"Í\?ùTþ¬YäW×Õ+i»ÌQX 9=c×5Y d”ZÙ‰% ¸?³Õç·æîšSÕÂðÀÖ©·Fë:•¥¥ÇfêÙ*’æüyâž(½©924Ö‰5Ñ!ìØ4GÅFóëË=øIÂÊ#ù}í³üÑVÇf·§5æù™ds …'ô&5WnÍ1ó³õ%¯Gª%^Å<ÇOWt2ç³ö{œÓÐ2¥Lâl Q)šHŸ¨TúG‘¸öú‘I‡2‰~„î§mh4wÚÏÉ6Íq¥[ÿ&½ÅÉ·S2›5[“Ñ 6S/ JÌ ûÛRç&WûŽ’÷àüèbCÆCôh„¹tÞ›¥ÀOðÕY6j•Fm`ôz?ŸŸÜ|úóîAŸÏ"/ 'i#r`_z©qR–­Bs¼~Ða–b¥ŒÄå•ÛàÀ£¤¥äU>tn©·OÅW :UçWK;kнkçDÛG¬>e]5uûÜãO¨þ ϓȒð{‘:ö{|ht—yE±Ü1,)–Î?‘ïT‹sâ@¹^Ruƒ úF&ÉÝh~ìº*âµW?‚ùE8€ìkᤤâLt1Aùù7 îä—-Ú¾îªNKÎBÍt„4´-/ÆËýÇÓWYW*ÓŽìØÐVÌ,i›Ï}SBñ¢ 5·ðÊ–$ØÁ€)ý×ÑFS;A’‰²`.— 'Iù  RKâšÖùŸAíØ5÷|ôdô¬«ÁS¶_ë‡ ºÊúæÓ«Q3xö7­ í7FÆ3 Gx ;…SÀµÒ¨ÃÜë`>¼£Y¼˜/…z­ÿÜÍR™JòLæ¤%CÆzŽ/9–6ïjVC@’BÎuÔþ¨p’ƒuN=I*ÁÍ­Õ†FF ܳõ®viIm}hÀgÄš1X•m]µ’”5zR)©š<•µ :}êÕƒŠäõAº î¥W6Ëü Ïñ‘«.»ÛUäàIsͽ՜e)§Ê ÄÇŠ¾ŠÒ(ÄzaúTЛ`óV7nÄòtá*œˆ]ôİdͰ@ÕòH¶ŸLÞÔœ³xþ£Ý ëƒÎTov¬x“<ÑÑ0ûenŠ…c¢K´a»©®Û«åäãÁ1w’³AeÿaÆ?_É ŠÐÍT oõõ¡yÞó£iœ²zõÁîWdC£&a—pK§§[5¦ÙúÄ'Ç0íM«ÓÂv'fZC£ÌVœž=æÎGeغŊAœhjç±N%kدT/ 8Î"»ÛùƒúŸ‰ËL±6^©šR¬nÔ#Jg] k¼Œƒ2T]c¯Ú$ƒ[#¶*:c¦ùTdŠÅ­Xÿ‘¯SìÍs,üƒr:醒.`\'ÒªU×O1™ià3dQÜèϺüP ÈI÷i\(*t…àãŸÖ>>Yã_ yT)e+A¯¡.òÉ_Ï:ë´â äæ]Âôb:Ì“H®s„*Äúïim`M-ËÔV5Ý ötA>âkjç]¸ÁUõ4ÅéâD%º€Þö”ÝÍJ®ÿèLk…s£™K“+œKî èÁì‹V«Ýç~æp=km5Ëö{“¼FÒN¥,–ŒÒÏwYzS¿§º¾²õ_¡šèS*#è4r“¤ElØÝy1t…¡*ïüz.…<  §Q@íK9sÒ8Þ˜°Í/ gÚ›é„G¾ÈU®0Ä[Ù:Š9¨ã ©Sòôæ´†>±2˜s ŸÐ©©¯Ôb¼?L»ŸA¡ù<Ÿ&ºU»?‘‰ŸK¢"½çÉš½ìËúÖ¸í¼T ŒÂ# ›$úø´m‘Eóeæ·~ö°•*šàØY/‡BØŽþà¯5׬rpŒ†ýæŸ@¼}ºÕ4‹ü¯¿_éɺí'–ö{üðf&ìéÕòQ]”k·bßY=tëúbÃU%ô+s’÷C¢d-–Ô(¨KtY “ ¥¦ùyy,°ÁXÜ5ØüÑE>—A5) Åy±PÛ C˾‹tÂÿòc¿"Ù%SŸ1BpcdDo§YŸx—FƒšÈLG¦©Íü‘Â>OÁ‰vºKÐùšï•u‹>aV¦Ÿ€£YQ À/×kyI úš;Ë$ÇP]€öK²Ñxpªk¹³YØM( àªúäî…± ÚL6ö>(#¼È¡þÀ&R.F×î[9mñ ÅÒ¾UîÖÐüÆb»;®=»RR‚¥$Z|¿ÆD,¾lBk×OVxrRÛÌ ìØ 2曚‹ò©FÔ‘Ø@^ڠʨMGn¤;ؽ"Ùí§ý­æ_øË•½l›64âØO™Z¹Û–ajç·žda´¼³H~Ñy¢À^YkkÜI¢œÁB–ewu^8zæ0È÷<³uföëHÜŸ¼%¬öæòE ú që<Ô1€)\¶’0ð{dj'ÁWv$@½û„# ?%ãÓÎU±çê›qívÝØn,ab—°óÙÁ gë²€&ñýZW(;'$ûvãC_Û ú÷pßÔ> ÇÇËz>Z›ÚbÑí¨.oW¦ ƒºøØ0¨™ÒÓ¤¹«þT=Cðâ^¯úç,‹O2@µOG5ðéƒRècš'™š¿`í{ºµ¯_9>kjcYDZIö+†wÅz× Ø~ù»GtúÌ¡–)³9ØEl©TŽÁ5E‘žÇ´MçE@þì,æÉ¨£¸jI)5%òPú^<=3WʇŒêäÇ c}*¨ÑÊL~™'f²µd¤¶»=² »’®ÊJ&v3:J»9ê¦lu¾œ¶•E7°Tí²¦øo°G¹Ò-WÊüj}”†ÆKoÄ{Ô¦WHtݵ©}\ážc˜ûV͈BSŸ0µö$ÝC˜ð"Àûݘ;$ u£AWpÄ·ÍO—à òÕR>õhýpƒìm¶–>2é§*` èÎ{¼—t\=»U1qpóäTùn®Ÿ#ÒmÓýŽ…îíÀ³¨?{â ç¨XQ™4(ìµt uƒ§¶Ñ„ŽE¯©~ÐR9™÷-bŸ© ;„S)9µ5mw#{ÅŠ ÉìÒcs›4F‹É@2 Km5û£¢R©žuçŒÖ͸¢]Êšj¾'³_XÄܪZÀ¯“è j¹Å÷U..OóþTÝÓ}Tj Ö u… Åì/iób”KÉÙŸHÁÓ­5™úÒ8€ Wf¢€›çô;tܬ€t¤`$bkîö©õšzùciº›Z$؆2?N² +ÚBUéCWÐEš±E#߯:_fµ Ž5fXºqû‘ç÷ÇµÛ ¿ªëë%™ñbrnÔB[h„0/ÙQþÉŇ•äâÊc {æÐ›õ®Î÷s² YDz?¡LŽØžÿ g©¡xÕ¯=q Ë«Mî¾­L­ª3Ñ„ŽsQd•oO2¨“žOå'Måípœû²uª÷|jçÝyqnÐej­õ­§žpãÅ ­JãY¯ìÜà=ãŸÐ¶dæ6ÐQJ2Âñö¯Ö«÷y]ázq¤¿9Î}ÖÇ zÒSD 4ËR¼G×QÂÖp™:ЦŸó2ÓHÖ*¿ÄŒ)á¤uA´”Ç Ïõߺ¤{ñÊv»9A¿MóDï°½ßïr%6‡7§ò\f,÷—FB_óú¥ú»Û~©½'ªgÈà2+D3-Ñ¿ ^»í¥~¡ZJƒ\f´‰‹ÍL£êÆæ’º²§|ó*ÛŽúÅêái·ô‡ ºøÑ«hÇÑ­Ò«ÀbZãËÅëÌŠŒà|æíB1‹ c˜ÞTh&Aí~.µ÷'£Nîd¶T™Š\sonC±÷x‡V„%ý„Bà”Wk£»5Þ×  dû”/MõºÆ$3v]›Ù‰"I'¸˜ª`1÷­ßï«•H/žqRùµž8‡ÇCÇ“`PÁë7¬!|ÅRõv¾Ÿûä§ÆÏúI]Å×òdÍ_ ¡¬³¤AíxÐÌOù×-"¶i+¹ÚIåÞ¡ìæTë$¦ÎêäÅØÓ™÷.‰R‰Í!zãî.`ÇÙÿHY)~z€¥{»ú  ç?ëÇX·–)PËO·IÞÕÅ9V´’B¦vl09«Ç°M}‡š&Q&Nþ›Èy;c-æw±~Ë)Ù”¤€0M©ÈÎ)ú¬¥9Q7­^í‰qÆÙ2ꊯ-kÔ¼ÛÉ`ßrÍÉBõ»@côYl}” )ÕРÒOÀÿâŽm‡·Ú§HÀ—&•9¯ª0Y _À®JÌ e ‘Š–ÂÕË¡æùÔx:.×퉵¤Ú ‡DÎDßVFß«4Ýíõ* ;¬ ˆ’¹=ùYrmY>4j=ƒþª®çñ‘Á=w›{Aâã²ä½È?³bëI´^CÏf^ö¦›(í݇Ò!ŒÇ R{µ×ksVUeµk¯bÝÏ5ÿI®ÜM­Eù5¥ß_4PÝñ¬‹]àkí…·ƒ’n£kBgµ'xf\6 .2Â5“‡h/¹9‹Ž¼º©ç” 9²Å¾tÃÄæÐÕý.“d;ô]Q‚ZAvoñjÇ¢ÛR/ô¸!#Ñ@W/m[n’!3 =!Š$¶´«QÇ0ÉÏí¶›³(ò¸)^é(‡wlšÑ9Ðîö]'ÙîúW ̘œ$„ 4Ûl ¨ïöq¢H|B35µ€I,òN”kó5p"ßOEg<ô e ÷—w€¥WŒÆ[”º/&±½´iüašìô!—eÍQ È=g Ìqˆ:Ž~¥–@ FØà~-±c6ƒÛ´ók(ïÂÞάúC«ÞlýkÉ«êØ5djX‹×–WdjóQÀ½†îY¼‘ýú.oVÇÖ¤MhûµÁ•ÅËžA}zÙà¡WkOðƵÌNôOP¸sVú¡Ù‚|§äèzéà‰0fWQ LSУ,Äíiô`r”Û(W~J ¢‹ÞU@¢|' 3È ›ÀlxeÛBë'‰ûèž>ÓÄ[úP µ0z[z`‘ã" jhľPæ‹ÈX¶ð ¨×8¿ÙÝE&¾ÕîT–~t¬“6 SƒÂv_]!ª–ÏzkŸ[BÖà¹Ü¦ܹF›&§è’N…àÀ¸°€B²Ç–'irk€†*†lô ‚¸—§Áóe¼ÃH[…XK‚Ú!QêÆ¦‚.Ô`…¹’½Ã¨ŠQûšö/sL øÀ;l4‡œkƒ:Ë[yvï÷ßEŽ‘«ó$|sAOXZ®ŠÃ“$È·gôªÜI8§<Ôêä  nêNmJÍsœþØ+^¢”5 ÄFAš†ûÁ¢ôÀS7^>×jþ5èÌG",ÉÈçþ².åËõÐ?{ŠÐ7ÒjÆùz²Æ*™2:EÛÇFº-P„áñ&DÌÎ/ÍÐKã²æ±±ÛõP濦Vógyú˜±Ë­š?åÖÞ9ë/’ÜGëá…FȲwHvW+ˆ¹„O?¶•dC¹p¯% ¥{Ÿ±îýÝ ú®©¤‰p(&–ÝG¦³é’„‹æ— ›¢³¶õgÏáávÇÄ6£óE÷¨­A>£ š†â•i|éøŠkþœ³ðջرÕà=è‘ÌRœ†x£XòVQÂZïÅ[è5 ~_ê—Š2íB>ÔâvâwfÅÖ¹˜ÚÆÂµ’+ ÄœwG´?[ÃÎ ‘y÷-¯6ˆ{Ô £Ê ŽE |rh/föèƒ^ŠòØŠ= %ßçØ×ñYûÏóË01-€€E\™´Wm]'ˆÓ Jð@.^äÇÙ}/,êq±BÜïþÎö=J¥øÏ¯mêÔª¹[OÀš².«èAž²g1 ÇWŸîkæ2LÛ×V÷Єt#/ ì=}R¼ÞÂØŸµRtô§¼ßÎÍ›¸óí*¿åF¯vGî5Ê<—?ÃIRÉr7Û)q—z½'çiGÝŠjb]):—˜µ¨.ÀlËE^Ÿó[F}@û©*;9AUK_€;ÜÝ\׿׽Æ\^ƒ•Ü8^YÛ&óJß…kH6™G¸-­_µÉþµ¹õVŸf¢˜o‡îþ›´¤Ú]bÖ)WˆôZŸ®¥nýV[V㢭8Ôy¥uEîç*Æ0ZÛ»›ø¡‚+Ž£O“JœŒà³‹ ö‘Åab?ý>zíu;À.2ãÝ‹D܃ËâÃ#ñ6^ Íf)ax¿¦–³e3P{Óä!^"ÂŽ]ÕD÷ÜÊßP+o'/ä ¸9|½{) r…Ak?ŒJ>úbϹ ²”â‹U7z‚[ÊæpÊÄ%7t’9›Ûg]¨ª‹e¶Ç&iž³˜“uæÏ¯;k[6Z$æ FßןnO²Vׇlì©ÖÀI=è÷Cõ‚+bš(x —Eô»>ìpý©gÕKD¸Êjtþè ó|¡¥˜u»÷þ®®†T«“õ®Y,jVÀÇfþ®6«ù΋ô CÕ³»l=äðTó§÷±‹¶¡°x't+ZMÝp Ù¦‰øÇ5UÛN¡›)ìæÂ-GÄkÌ›ÃC™rm‰Ä8ÐYÉüHøÜƒïïÔ’I}g‹ÛÓ ‡f¤œ¤¥€~Z6oê~Üu÷"+Ųµ©Û¡ãÒex'•ëm˜‰¢×Ę.¼)ž\û¸Ez—‚:‚f§©ÕPÏz¯ ³ÅŸ`OJb¢ Suѹá*Ѻb°­œŠ~ÂЦœ²7Õ¨‚MØÔ[ýÈ”¯©õ™åf!]æ]É'rWï(âáu# ¨D¸ß&‹ðéDs­ZB0¹¸ U>Û9»hQcEuêõäÒ¿éKZΛñÀ?ŠüŽaP‹¼q8Î$»ŠŠaYà¸'KðïΡ•†fá’üO,ÃXYðʬ‹Z†.@¦×u;n¾Ö;GmCŸ"y5,\gþÕU™„Á|ÿp>×"’æPwûØÆ(ä_C]˜‘ T´L®°—(Ó ê…„p#æSw8AiÊ$õìЩ-Œ¶rñej;N¤é‹ŠrdCDEðÆçAªAË›®p}VÐUî"׈MN¯Øžòˆ«ÑS¬Þuìl³gŠ2êÓ¾N©tys˜¯¼2N”€ ‡:…ø‡—2 Ó™''ïÖ÷Á— n[ú.p,7æP3jy«sŒ”JY\¼–þýµe–’ >ý¥µ% ‚U&JÑïÊEwè;yG‘Nú]RDSS6Ýïç_n—ô½?H#”¦4§ì,' /©#ò·~Vß.Z¶Ý­Ä&DǦL휫fë:%è‡_uFg@Í·©âvùÄÌþ2Î3µEÅLz8²)Z&,þ|ö’ ÜAôg‹F Æc4dSSØ0‰ø)Lvu|ŸÕÏVšŸ¼Ó1çP“yI„¼YeP@É,T©rCˆqt…ÈÔK â‡MR‰ ŠúÂc¡Øæ­T)4‹Œ ºÂ0»I.~b¹˜q;Ö[‡>êyံí·qÙEgpPÑöѯ´Ä(lÅR²cWÒ\iD¿r-õ¢ùËÛÅ^Oß/³µ%+¦ÃœXlêò~µ}>Bi{9ÐBFÕ™Û›÷Ü ^·™çÐR”Aͼ­- ®j÷KÐñœü@ÇÒ¼` JOmâŽ=>Ä-kf8£nUvUwúàBñøÍKFþží&âûdvðf ÔIeX¢!âÕ††EÎudÜà:r³ì‰6”ÇG èÄú'Ù…Å]°,Á‘Þû»­Ú)ÃË…ª%?±Æ¼OeiUÝ<ÇGö+©9‹'iaÐsœ³Š< ²9»óKE®ºTYa<Ÿúªê>¨òG "[aé]1p—WkNã %2İÕ‹å ¹Ážð† s’’¬ {(nÍ­,54q‹Ûk¶Ž!-CäÂäë‚øŽ8ÆLëúÈñ呲Þ¶¿½¦§aó–xx,  S„àÆ*²ÂÔäÎK®rPs%VÕцÚT¹ :r2SdPسٺXÏ ®›½ç¥°›jµª4ÇÓ³Ze]«|"]ÃÌçT¨…Ô&Lˆ©_³x¹²få"÷žvçÅ“ß èFɺZ]F;¡‚ÚÇÁÏbÁO †M ëpŠ™«=f“;ï3«~ÀG¥:a.oËúp6iË¢ÙȬ¶/þ_¯h“s†ïLjjÙ«‡½kœ‚hÛºú´@@Ý‚gsN§À§Nö]»‚áI¦2Hr(þ¯VÕÂ7»="éPx¨ü‘Ìîõ ‘ÿ„Ô©EóΛ]ŠŒc6[שÛ–u!gµ±JŠÅ@“uy€1$%Ì-–<ÀôÖixé¬ =ÿqW§´±A„L†-'_œ"xȺÎg-rW`“A!%—Iždöé~•“„afÌhélvV1¯iÑ™S$˜×÷¸c¾Èšå¨!>HG ÿ’É]·#`‰Jaêـ拽z—•ÕÇLÔËýié› I£wWÝÖ¬«Š`¾ýº (T{A-.Ѻ:‹¥HÃׇç”f6‡"¹ÕŸ8öC¾kÔ\u1Y –”±?u»þÈ ž¾ûÝ -›J™{7™]nÜ!‘“.ˆ;ŠX•#$4•[çdV{žE±Ûßà?´ìIJ/ÎÏö]óÑ)>uÚÛ±~:Žw8y­kgÊŒ‚q{Ò6ÀëÔyÐ#ój NòJë:Ïç“ï£áÅ©þLC7Û£õ½ÖÕ&Ãéݧ’Q¯Ç…pq{7[WVeÉ6£2Å`˜•j­ÙMàÝJ§ )*é¼ùK­VwÕh]Àˆ6ZWëÅ\¹é|†nëB¿JÖµÒ– W <ƒZvq«¯þùÉÅÆÝÛZl’LӽϯQ$mŒjº) ®¤È0þ*¶®ý±€°²lc̱å“0EÓOÖ›l<ëZÒø wÜe…Çsugnù¾±&S™ÊÈ49½íÏÎRmŒ>¬´°Zr¯bÏdÁ³²§§›s ò!z%‹c}^eÆ^ƒ‰Ï„ý®RœÃŸõeA ërªu¬Ë¦ë1ô\ëʃ2÷°®¼¦yϪ{l,© v¸B몧µïÚýc]-[jбO0ü¨Î‹aßu®ß/àN pM]œÏ`4Òò;&šƒK8ŒÝ¼x@Ÿ¡N÷@Ô=ÝUöÜÈVë–©íU¡¨©ÖÀ®•#à 8ÇG2-ÏugÓtö YÛvWãI$¿Ÿ«ù5BÒŽl\ÜòíwëÜÊÚ×6žšÌµ»Yì»ÎÑβ®ÒëpVå%ò'LÒ¨gu*_¬ó&Fv§a×$Føøtå¶ÇolGŽT‹<ö>tQÆíBÝ‹ýͻι̟TÜ‘Híʶ…»J» %ò€©#AxÞµ.©ô>b'fWõ›»$³]3’`TÙ^õÓ‘P¿ù788‹ $»øhKgÉ/ö!ô;QPBÜ¡î'E”ðs$ºwIóÅ;xšX$H‹UÍ)vCåTåÈN™Éæe â%y‡õɉß$™ÛóiÚºŽ‹ërd([ý““²0«ßXCç¼'°© Èè´S‹ >·,³F§6,@öhëÊM`Œ7ù„ÉBÎ`ô*Ru¯"ÑÜãbéÓÅX _´m`ç´ä*N^¡ãd°Æ‘zƒÿ.”>;ÕšigÅ÷ý•®‚‰|Òv{â2.vŠÓ¤¯” å PÜ,I#ôká$[7Û;Çÿ Wÿ- O1ï$l,y«ÍZ*;‘ZLO]QÐàõf“_f•_ÏWÞŽ H©ßP $vûWpw]Hc"¸V·´6fa[–ˆ;œ?M–™ÀÆ*Gj¡|$­”u&~ù­pÔ jYYïªR<_fL]€6ÇsF¨zèG˜z)]okxø3ª†Ý=(ŒÔ‰îÔ)»ªƒMø¸lÃv„Ý dé'[?²á±„wVˆ‹zõ½Wú®iséÅéM%ßœ1q§2Xk‡é’«¶-Ã!|F‹8<Ÿ0¹èŽ1Å^Åj+½I°°â|ÿü™Ïù${S»îó‚&š4‡š×mÌ]‹âÚùBYFHæãûk%˳ŽP|Qî~¾’ÅDçþ(a¡qèæI^:M¹SßdÍ †˜tI°4ÝÓcg Ä4ß^Ybc3x)i¬˜U—&š‰ ®OÞ%ƒÂ˜XoM†‡ ÞÜ £ª‡Yý~“AA°Î ÔLÙ“ˆÛù}רëÜÎkN9 µzÒë×+|‰– iÞ‹çôÒo7…Ésú¼_ZuÖßöüMÃ×´Œ´?ÒcXÖÒËi´ôï„‹)£SŒ9"¨i±B5¹õ&ì¶ÂTÄâ‘5@TÊÙ\ÕuÞrÕ»ë£î‡°½î8qþ”vÆSõA’?H+ð…ÈÔ²J˜«ºn»ûÈ•U9+®ÕŽb¹±³ãÙCšDŠBÿ¡ÞèQÑK¶uå“/[f’ua¬®P}Þ‘%LOyä¡j^CºÊØKJÜLCªU@ HáÔJÂÕ#þQ²ŸnO/a$*îOÃò…A×ǃq_ƒnRå’Y MaSGÞ…‘1ˆa9gĬ3W* ÔŒ›–SÏslª&óè’ë¼ä/ÆRÌdmàÝ“]E¡lâ%thÍtÛwÕà;“;IŽÁˆe*†âæˆx—äf5ry^ÇóµR¨ßH™Úõ,Ó¦˜IžþA o*²>Ò+ ÑUšÄÌg|”)ªòI¡¬”/± R‰­¶e’y|tA÷ü¨Ó™/ëjŽÎéi¥¡s >’~¹z ýZÎZ_B¼Êë*uû”)út4p¨¯^{hy:â¹ùÓ04^JÂÚl^\Þm[ðsœ<Ç-ýQ4 Ê‘jykã|:Õ–s ë¶î0@2‡æIì]J§5UYáùÿ«²¦µ¶üs U4žÛ5Çñ‘ŸY|¾9:žU%èÉLfÑ-(`@ßµ££«„¿ÍÚ”Ìì¦^S‰ªEæÅ^Õk+_úØk;%‹/ÉŽ¡{'è˜PRù× ›~ðÑ›†wÇži°¿Z »=Jˆë®ê·_¢÷ä,×£õ?ò2±E>®9ÓºÐZÕ‚PªíC0¿Ûgã0áEë‚,ϦuÕž‹ò}ô¤*Ù)¾µ-¢‡šç\Ã3 °¢7[ëÆþTÒ®©uÅ‘¬U ­Ÿvê÷NõgWxTS m‹cÙ(,æG9±p‡DŪÝ%I~‚wÌüOèáêd=ÊmÙõ™¢E˜ìÖ>%Œ7ÎÒü˜Ã‰¹Š÷´©‘…«Ýl]ÇŽ³ì³ù Ür¶ï*¹ûÞ)­eëT¨÷e…ÇZG‘©÷ʺŒªÚôÇ`)‹ä7–xˆÑÅNɪJµÆ¨¢s“lT¸m3ŸT‹0èèÆ592®à´GB‚]O–_}Ã`Ò2¸\M²îªìÔ=^{\3Y‚=õüñ]0cYWÕî^¤áÛ lµ¥rqkž$ÌoϺr6Ö lú@i'+÷ZÜ‹Yó£#pªQù.´¡*CBt?øô>¿b°ëÊ9;W+| w ä‰0\êØÆp9¦5³.YWÊÝ ªU¶81 ý¬€—”2T¿<Ôy@ÇÛÇJÍÊUÂöây/äz@0¬Ó" ' ô¶z¯Oòçz‡.Ò„I‰c ªNÖņ·š®àH×¶Pz=ˆK+2ŸNìkÁæ¬g¶ë…£ý¨3?PÐcjŸP–Òò"mN=)2žcåì y„~’w•£C¢±s¸«õ¶Åì?–Š›]E(†OWhB‘¸Iot×jVÄMU¸pDÉÌ9<ÞöÚ¥~ä‰ÇÚö]Ç%u¥á'‡®ò]Ç'Ù†ö*¦¥XUg!²ü ¶õÌ—=?ÈÙ,¹c„÷fB`Ôƒ¯9}tfŽÝ9»ÚRF0ìÅtu§Ô­ö]Ę]ꈺL:„M¢©b­ÕÙóΧYý¨!„'K²®3m]Ø{tš³´~†ƒ^-ÎŽù§}V–Ã)vä]äuB~qѲۻëë1±¹>u»ž²¶œ)‘Oe}ˆÂR5ÅkoÛŠõ•‚Yÿn“33hn ÖTH?·ëÏùµ#›ê了©Q÷|÷ª«ñç|DÜ¿¤'Z2‹?ĬéV´ýC1Í»«\³²+Èah×' ‘íôóšØ¢{R”] ‹:"N«Œò‘Ÿð2Âä §uPq³oU+7ž§ß–×+h¬ ã @_7sæÔ>o¶o+£7ƒ½BwxÚ µhëÓ[oçÿÿT ]p£îú¬Uw>â‹‘èû³Ž‘³÷ |Tt”v²È2D^å÷ÁÌš1˜Š¬XRŠŸÇülÙ§"1(šŒq9Û¡lŽé6Ԝ飋]ª'ä­u>•§›ë@‚zÍ¢”ñ¡Ž˜ê¥k|YÒ8õ±NÉoã’և𵠬«ˆ™ Á0¯<_Ÿwæ½=ïŸq-V¤Í>yNë<´²*ß-Ç–Hˆ'y¾ ¡(fÒ ’3ªæÚLZSƶÄuÝŽŒÁ÷â&'Fñ2¨¾{µ÷[ù#Ÿ?ǧڮ6V‚$º+ðMz~_©¢ËR©a S_dëJe‘Àý m±bxmÙPÑ U$@ŸÁËɧ›­«¯Uå”ú“·¡÷K ´m‹ƒF?)Mc¯ v뇎·äÒn1Ø,´Ža¢ñ35ð–ÇÖ‡ÕuöjƒÚX áÅÉ«žÐ,ž3ÆI°bH3TŠŸƒ`Y(*L¶”ÌX·užFlž«¶­p+}fIÀ#Ë  •¢‹ó„>2éµ~(‘Nš›e]Çi»±Ö4…‰|jÚî ˆòY1Z¾k…ì¥:.=‹æ2$æ»|×)>¬Ê®àÑ Éuž R +§X’¯}Aî}Ž1¼e¼Ðv‘‡V½ÓðüÙ—®ðº8ù™ ª|úX9é˶ºš—ÈOÄ3dKfÊÝ!<6h]Ç…ÓA5ôà?ºØÇNЬkÔ••j¥Ú²r0޲› ÈZ1ó1J;²Aò‰ÀË×.SÛiš¾r>8Ç[`ë×CÖ[¬•²6µÞBŸ¸q^XûoS8Áç~:o›MÏn¬•º\ æÕmj/ u¢¾“Pl¢ÅLsÇ*˪ú²XLô¹çKXV‰ÛÔ‡»j|K@vëeæÙIе1²(²Ïœ«½ZæRôCP}"èyéÿ•¼]å¡}ƀѱ±Ê^E‘A 9ä®NºÁœ<Ø>ÍmƒÌAÙ:V•Y3¶Ó,\^æÌ¯´Ò§íW-wƒœi2Ë1÷G‡l¦¬|öfGÖªtAaáíë;KÚ®½¦”§ܪS^ BÁ‰¦vŠ[–h—Þ±éÓ¥2¦ÜÕ9JEa2ý!z›Ë­«„ÎÓ/üµ×ýY!v)T›Ì§!uƒý`eˆâf0Œ ¼¿Nf¿M­»K­ ;.Z&ø™\uä¤ ñkæ<1“¶,ž•.ǧN-\ý0 ù kU zÍ,òÂA)QЏ]lûùÕíŽË?² +í¢OwðÓÛ ¸Ûz׺¾Ö[”âZóT *¥‘æ9°·6‡öúoÏÙ *§F(S4%d¼œº£Ò ÎÓåhQvóÚ—Ò«©ä¦ÜUú ­÷ÆzæN°¾p£>-ý”·|è»ä?û¾èº«†Ìéþ²QýNÛD^?ùÀOò_Ûçé[°§ä׸¸ƒ¥A¸pkŠ08#³«ê„¨Õgä$µjȤïâ"¡¦hãø¾¦4Ï5ˆ$%IŒšŸ¬Ã¿w-ÐݪQ‹¬+—î–0È>èYc½¼êGà5T¨† (|BPÍ u…fÅÓ»Bޱ$^$é”d¼¢€NÏÖ²"æt6@iO+¹ô)ñ$kÙ*ÕjÌÞ‡ëÇ>“ØUZ²ñÈNu=k+%ëÓÜÁí—Ô–E–K*©È¢X¼ÃÍyžêzù NY±fÅ rVrB™ó欱%¾^Y6‡^¤l€ïW²~⟸¶-Ýû¤¹?lúe³|ÈEwOØâóÑ\ŸSå×ÏÚmÍÕâÈHÈè౦A!/|BÜ‚Šë£d†‰Ã¤©Ò¶Lm€G—¦VR·”ëI>HƒüsiôþЃ—w€Þ€ßì)v@S]Yæp²zõz!ºV?$Ôm³Û(aµû¨Ålú­/ÿZ~ÖözƒõI2{vÝz‰EPÉ0qµ½ê¥¢êz¶`ù ÇÖ¬8%=O¨Z[3•³í.éÙ¡±ÑÊ ¹Ñ´Nôô“"Ñ’@~‰ÝEÞXÖ™©­ù ¤¼-l€y.N<0Ï~î—ºüÖäØê¤½™4¨>wÓ*ePÔïoRþ q$Q-ØqÖK Z­BÁÏ-ºÁþZRšbããåºð¨¬{ºªÎ<·§›`UÖ;€‘¡ì2Ë$·K1µ0Ú²°O¨‘|"Þ[’xžu7ÏØ€ÓG=%•+†Õ6Ò•c»_o¶Ýµñ«ºj}5+Z(õö‡dû¼£íÌfJîs2n¾kZ #_]À9ø±uqêû¤“ÕWW´¹ w ÛP‘B à ªd=öãXÙÇÚ±ò‚\T¾£Ë‡ÏÇ?zuOÍú•Ów,{õ{Ik8„D)×wh2µ¶­ùÛ+ƒºåÉ¿¾ÇW Mºô1A^I¦6µF‚غ5=l Œ¯9·wË"à8eʆ ´Wd¹Þ6„¼$ÛþÌË?Ÿ‰k˘ïܨ;üü:T^iÒï£þk)윓kªS[ÒÙ\BªßnJƒìîW–9?–’È|öY]ÊaéF©~äÊ[n7 ”vú üÓWYÛˆ¨ä&-ïlÕu0…·ÿ¨Ïxì{ÈCu ¨_f`f¦%T†¬+Fõk Ü'­«ºuÓÔÆXOÒý„<ªrµœo5rKÐSño%ké iãýeýÃU,K\CAïœÏîõB8L?:Ÿ­É$ç¼§þpKxä¬{ƒæËc¯“Gù®äÜ€ÈEUd.ì®:œzviÞ ÏĬÔUFÏt\Œü5µG¥v½ÃüȤŸï`ÕÙñˆ˜H!=úÇ$?w˜­{’wžé’m`ÁV?iµ‰`8ag $Í© ²ù¹/§P(£è  ¾Äö <Ô¨öá;=ï~‘Ý–`Gb“ål l˜i]2($œƒô„žƒF°PÕ:$›¬W^±ŒýKP` ï|V Àì®z4¥dJŸúÈéf±u•UlŸ2ß*'ß·¾_}Ûl÷#ùßÀô‡nŒ®šðyë£4ÀùßÜ•d&?pl¡OébGO£m¾˜ö†“ñÊFn"O‚‹á5ÏÝìDæ•FxUY-Ÿ€Õ¦%Å@Ó-»;Þ¼(QÊkY]¼ÝR³$ÛŸ4EÛyésŸÈÿŠ·ßh¿¼œ'R¨ë¯rq•aèOZ¹øTTO`<æŒÖ5¿[ z’æZWZ•ñ·«EOPBôT®~Å-ˆf»rÇ)=—l¬,Àˆû¤úe‡»ûÄhÞ}y3z½ofq%mëªJ÷Ž¡»ƒ…%ó×ÀØxoâ­Ÿjwâ,]Uf­,MǪ#²î‚Þ¸¶1Õ‘@«H‚åX„¾¹Ñ5µBø€ä-ꕯ ú{¿¶AŒ/™t¨q]dþSÖf§/Ò—[êut3ÍÌ׀‹Æ}¹dP7nCö;ë¥lê¹S¾E§OöV/?îÛÜÖG§ìԣʠJûªÀ݃~CzÂ9^ €ËS~ ²ŠâÃ>ö>ùôÛ‰ròwЦåíBJâ}¼h/ݾßUE®-ÉáµÉ§¿±>ï|¤»'|ÍÍu÷Kv^ªhOéµ³~ÒÓ–B†¯{×Ç9ûÚ/OwáÔàŠã‘Å~LïñQ§›×º@Žz¹'ÆM”úx·Cý×Ç–©Í<˜¬¡iNÕçЛ/½ÜmO\´m§aì¥ 5¨"QªŠ UR¼ÇÉf¤Ö`þÖÙ3†|…‡ª')0“Áñ;Ôý†úîÅô«Ó›ÎUÍÒêãÉÑÜÈè—" ¶n Ÿñ~’1× Íæ>$Dó×jÞÒ¨ Ò¨OdÜÒƒÂ÷›NÖÀ ­;`«s"Ïv MIE 1íJc=¾åÌ= yµÚÓEÖ'Æuu[5Éð@é©Të|ž&»ëOàfõÀ3V>V0ôèl§–ÙZíñõ*Nâ6T@®· wCY}[J·Y‘†Ke~ y­m¤Ç·€D_Íi8†J¨vU·*—lCXRÒíV™UFxRàé4®õ•î¹'¢±K¦¼®O¿ûVõTOÿx‡ý¼nÀz$þýág\•Ü zNþÉ""ýNòjÞ²B(JɆvÞæÌ_•¦ÖËS÷î4OÁÅ ]x’i7?›‰™Û†#+ò˜=UÛÝ)¯­ ¬Ê­:‚ÖF“Œèµ”„a푽úŠÄ²)záXÈ @@¤D)édf¥ÑeBiÎÆÙ‰0f‰¸Íf|Ѓ{/·VÏqþhŽf#80¦è„\.ÛÿhìÎnUN~&¥ºGVŸ’˃yç–d¬£å©z´$Îø‚Ìë––7ý¡ ÍÙ[Þ~Wé3À9Ù8”éš›ÀªßUGq½÷ÙÜ B A-ØóýÜúÞ©ÄÖÍt§ÔsœÙ>E‰ ÅV˜‹™|@¦çÊâ…ÉkwµÂzb¦²BŒ o¸ùÕœ¹%O‚j,ñ°› õ]thϱp¯þ¤gY©2ÔÝ@ÝÅ*T­ïO7øX™ÃÉ š, JSõhÚœNc0¿‰Å‡µ7‰¸_wìöüáw²J‹ÁŽ$™Q Ï¸KoÜmÿmζd+<¥øV8M…æŽåT'i3×uv¢o$rÀš½jSW²DÆ©N{ÉšÕH?é»Ð‘— 0¾åVcIwp ƒŽ.AÚw››†<òÒŠXtž–L×ú¨ûä{n­.†‡˜me£ÏrKÃ%èÉ®ºÁü˜_‘°§ž¶Õi]þl'JPMp)žš×;R êOÅáº!øëýUiE×¼v¿ç%ô ¥rÑ›º©X¯b¤†èÚðèskÃý’ð3-Ú4\T8ªnXOg´ð<Ø[Q7'=²?æ¹ô¹ç#~èw¾èö¤‰_¤-æNžv„‘TÙgð@WzMøÄž¾ ;Þ©z8‰’Q»„ç(Ñ¿ÀÜ+‘¥PS÷¦x­>íž#’íGµÃ+àô A­Ñí€{^L#aäaD±ûøPo2n™Ú‰6L” Ä“=@ÉÁ§ãÙÜ•czÖ‚tQn¨·žílŽ/eô‚K‘Ö#9)A¿òmþ´Hs¸à|¡ÓæPJd7u2qñÛzÞßÕùã *;Jø äTŸ†¥â€¼‹&é‘ûuÝáØí'ž·Óþ8©Ù¥dKaãŽn° ¸Ø\ÄzšR'¿.ÔEà4pròG 6É ìÑ™8¦ÑÇP,{ª°bc©’Œ5uUo/TÖµHWñb$]s—2[N…mÏPny»²ð]h²°ÁåÖôp#TÖÒœcÞ°·H¿Öµ›P2ÍÉ·ë:hC°©A€„ˆttÂæ3"0ty !]=AÅ·*}8uY`±–¶q¯µ{ m(ïÍáh{Q£ƒxCŸnäTÕç9u¸nP.å|6B£¢£ÄúÿÈ Ú÷^Vô‘™†#Ï!, Z‹%žêüµ»q…µ¯÷kZ^žÞêD#Qª¤ÇÅ'å® L˜™ ±7+ÔµJû3©$:ù7$+ªLíüwg pÔáÊTž×Õù5äºdPu)£?YrÈ9ä‡vÎCµ†J9=2¾£^ë›Éà곋„Töô¼/rÊ–ëLæÓ ì-Wg7€‹· –Ê)‡w êø—Q}`ðWe¬cˆMó-©h¤M™ïò/ZÖ Áªœ†AÌ€ »¹Þ×gã %š÷6O²´Â‘òð&5°2VtÜhÀ¸h*0bSUu ]Q—.±u ~8ÇhNãÎGue‘Êì²®®„\þ§ûþŽòh8y7…Ø0JæD÷­¸Vާúâ6t6@ù*]ÇÄašl”D¯¶£'üÙ£ýlË–c\oMæf@ÖÉÃâ~ú^?Ë"„Cs¨xe»¼ªì­=Ú©»~]“cG#0æ*Ðxä”ÍŠ–CñÕèÏÞ·Õrò]y Hœ¿"ý®÷¬JSt¸¦„að•ò‡ø!/6á÷ù»P–‹æ2¸ÆM#˜ÖE%ݳ‘´›%™ÚŒ)½p¯) SqíAv‡ÀŽM –¢1T²a{7á?óûôÙ :™Q“uõDlxPòÈLXˆf Æ“×þkkŠ=HLˆ‚ ºíº EN]ØÐ‡¾ù8mÛFto{’©è®»ÌfÕJù‚g°ZXXô‡•Þòm^¤=¹I%`sSAèO= !åZ0eÆ7ïÂvN52ø<;³µý¥ú›ó³‹}²Bï3žœÞÄs˜R§O  ðEæ-y‡ög×íòîM6U®á¡µšëg§d©8ÅØ¤˜¤r×D¢·`PÜꈹ½ÜXgþl|îþå‘Ó©BBþy;%CAÏ™w¡±ÍöK¬ÄªÉ‚njÊ_ÉÐì}±úˆo_ú«óT1Ðm™^¿xYJP+= ž/6¡o”¸~†nGjú5°JŠa)÷N£8JR.†×n](¿±Þå¸n\á^ÃbP932ÆšEý”)× Þ":ÏÜ6ùé>º¥A¾l\­b­¾Ú†– 5nû¬X?fí’õ‡Ä?®p[xùRv¥)ž“jÜŸõ¥J *ÈZÖp‘0‹5ÕÚb ¦m¨xàlGç)¹Œê}U%T'ͪëÀ-¬%,ð9ØAåýA!䜇üËyxÃ/sõ³éÕÔйVs6¦Eý¹¨ˆÑ•”ÐZ¬¬}B‡\:Ïk&¼ˆn‡â[é¤Z¾‰Bi’Ðå×OðÙ²å`Q‰ú}~¬c«–¥ˆKL7Ƞ΃üȤ·÷šïPœj›w;g›õ{5QGpGVao&ó³"#cx‘}Eͦ6©™~‚T^íDËÛÁÕw.zUì[üôÜNn%â‡X²^òP âõ _f‹8Ù']ð%i#Þ}™/QJN¶û…ã½Ì*Yšd¶ñ¸(èðû!sj(Ò2aÖÙ¿â ¤ŠD©›*uçiré±:3›¨o—À°ò$Wx²KPÑô‡Ú“ª½¥×^_ÞÔ•Ìôv *̼†]Yô/ÝŽ¢Ÿ€ä¢Éºö˜¤¦ 2Æ¿è¦Òð%ê‡)<}¨w ‰èC`·¨0yŽ’éNY÷  å«Ú«|æå\ãB“enWûäF_üϬn~b´ßeP¹|xSOIÌŽç@å%¥êÀ„(ΡNiYå¡Jë&ð†œ‚lã$9IcdQ"EAú² Ï ýb1QË_Vâì=¼Zå¯MWe(GÚ¤3f›ó|g…¨½ŠþjÒ"Ö#-†w˜Ž^Ð+K´€sâ1~ôF7„Æï°‚BI²Q±ÇN´VI®-~Ùh]¥!S;ÏÔº‹1ÐwÁescfÈ’Ó†æIZuो„¹ÉùŒz4«_ñäŽ 2õb@§m¨úHo !a?™îªl™ÚˆU9ÕåH¢?p¿íªì¤r6(ªH­w›dùã¡¶¹â[‚vÎÎÈx>êÛÒ¾jiJîÃf…Ç@IˆƒµÇÒ”5ºÉD©N+ˆ¹F“±žD‹¤'ÍhæÆ<ŽÌõ·l;›{¿¡fh’æ¾µ€ß‚.ц@.ý^3:}‰¤5€4òeãªJÅv¯öÔ?ã½Ñu—ÝßLþ¨c¦q»­ËÇõüqx ÇqŠ8>Žì2—·à»'¥Ä1rVößEÛ€S‘ÔëÅËôb yu}V#Üézn.ÿæÚ[ÖUZsÞÇú´¶ÙÁi=Šs£¯‚б[Ú'FJС,“,úÕ˜] grêþÐZË\øØ¹¡Äâ²d¶’éþK`Ò’‡:/lèsƒ‹¤ñy±ƒ÷r&d¤†»ÅÜóp‹™æ°z&ç3Þd¶>Ñò&?Ò ¢E:›˜Ã1¶¢MÚ˜]¡M*¶ùè"nYnšÔƒ†©½õ‚§µq¢Šò³ó%L”‰”UÁpM©¤Ey늵¿ì>G©5¥dçŸ$…É<È£|&yðîÚj?ig- ô˜FÅ£{í¯Z0—éý!Ø ­2 pò$½Ì)Cé±z)Ï“Öm²\aŸs\È£´‚‹dðâ˜ôé&› M5ôˆØàX  í¸YòËaÞ£"ÝÔbÞ¸ñv<Û·›zß_{h½xÏ V«´òH¸I£bIªüÜoìy´ïý™¤yá L™ÚZÃÂS':3=Cµ•­ä²VWV_±±TU$gõ`ü•M0ËRu=†ùK1³%øÇE¨rç0†Û+š'Z‰ø¡=•R­szœ»c…ÃÍ…VÜD‚è¡Oý%ÇwŠÝÉA\2tÛˆE B Æ/$"ìÒÀ¼jT±ò®Ø¬ •'øy;òÒï½( ê{Ìó½û8<³¼§ž¸#ÃkO«õ"Iª 43Ûqí“Þ!”@È<´6~⢬iÇn†óæ¯|v¢é}c½oØ¿ô´sÁJ_³"=Œ˜S%yÌÖŸyÞ5‹BªÆÈÏ’É€W™YÕȱü¦žÆ«ëËbÿ‚¾ëÓª½ë×Åì½uÎGÑúoêwõ€uŠ$çäܽlIRqŽßlÿšÚù-)ñDP)òÇ‘Ùwa%½ËU$êÑH›Šxý±]ëZ³»ý™mÊÕg,ëI™$hgý¤œ("SË/n_}F$ï-0÷ƒN×Gãe÷”å¨sí.½f]’ÎÁÞUrÈKfÄj©š ñ^V¥Õ–âI\OªvÇ– /'ê*q_ÚÔ›íêGˆ“=t]«Ì+)û‡Œ€êÖ”‡»`ovûl&3¶Ñ”ÆÅÄÁJmswòðŒ(¾UU'Ò…pÓßÑÚ„ÂÛ1©ôªNû´ÆOÊN[–8F 9çÌ·TU d/é*dW±¼¿6ƒ;’y×RAõ¤Òã“*ÏÜŸ*9.Ö[–‡|nþI¿ó©>]‚PÿDò(GnþÍzÊÛÏ,©¤Oa?.È©2cõϾX€`šøUÌ>ïrMÔXÖÅ> gx5ª®p™Ï SÖ?J½QêŸj»#9æ²×¾%h.Må$!Êþ³TĂȧ|©ß°û:êwLŸuJsòû|˜e"šÏƒ0Zàz‹&A=èc ­ë¸V“îa}PÓ¶2ªU×Ga6pœö¡?æN§„ê´µ€Ö”ïÂh_©Ô—ÞO‚ \:AaáßÁõ°öùS6t>[ÑOêxvw1íϺÞVy2M¥@©3˺êè¦o‡ÜÐ.—¥äZ×ÞáfFóÒñï¹”§;\‹¬†ì1÷¢¶êȈfZ’¦1äðÒOŒ~qU{Ì“[ɇ⼩®9Ž}…Ih?Êwõ\­ tŠà-SƒH…›³H*²|³(g¢ëÚ«­ û=_ë*ŠŒ­·¦È8ÛòNó‰¬UÁJCj;œ¬°»~ŒÐ‘ñ”Øn5€wÉwí2¿QÉêŠ'lÎÞá‘Osëù®ñ †ëÏwWë/š>ßµ-´Þ-Ó­ 39»ƒö¦š“¼Tù¤ÛÙLÃÑs+ áNi.„²™Ü ‰ã’ÕÌÛÓx¦vŸÝ³®·Ë:m]}Nù®¬ô3þêìJÂΪßÕ“…AEUú&á¿‘ËX#dæ$ìä¥é·ªÓXÀ7 ÙI?—R|–ŒŒB¡Ï05!úÓéz=SºÌèÁO†éaj_Þ5(á…Öxe_µ×yeâg¬ÝöÅ× úfÞ’½õ“È?n¾›PÕaƒ*¯cý¼Úåɸ¿¶ÒǺ8W(Wß]½Þ­E¶>°¯’\µ`»NA¤>Îê/zÏ%)¿Êé3gÄó©Ý­¦^Þ‚ÉË»ö˜¶®|ý'Süô|Tš$À=C\…ÐÄ߸=-é·–ºq95Ï’Î.Eþ]²Ó€cß¼kJ Ub/ŒÈh]ìòjÝ—Õ/!P'Ö-´BƒÃ8”½ŒOè•r|ÎÝÖÕšÜZfŒ²úówªZè®×JúLŸ¾Ñµ®ó“×HFß}÷0”š“lèäzÎÈNDøèb¿aâ­O­KϺ>]ƒ`%œÖOÃŽ™ŽÏÝzdŸõîbÒä˜t[w¸I.÷’/ÓÍ* 1oز®“W~‚a®O÷;ÚÓ‰üîÍ¥E·mîçÕ]DÑLvûƒÿÉBëµJ!–]Þ¢ùiôà~î—ìÉ#ÙU³Fc—‚½ú®åþÛž/É ¦èÕ:Õ¢:ø³(ÌÈŸŽ„A}è6k÷¶Š¬«v‘ƒw8ô#›[N„ª¼.¬¸3‚nÐ]œ¸ïŸŒ’9=B£ˆóyð`ÉŽ×bü€ËûÜ5Ÿ¤þÀæ¤ÐY+ˆxU3"¯T͈Y’rmˆ8ÐÙ„bËÉ“Ôsð‚íÍq0iÎìx6ôƒ¶2²S@R—þJ«±› ÏÊ2?ö>Úê'öPvhKò©ùˆN¯±Ó·ÜñÉâ\Ñž'Ùu*FÏ]ùþÉÍÔ€žëÔ œF T(­óžnõë’¤Cä¯E.àü‰¸/lvÙç("Gìê'Ÿw€2ó¤¦#:™]‚| Ý£flmdkða‰G¾ë$þŒÚ–­+%XwÀ퀌²U5#6B­ë¦ãnî±AÒQm)2âßȠʘó“„{ÄÉÞ>:d;yx·ÞÒw½Àƒíé4ÄŽ3Ç –EqŒPõ`ºwÂÜž3‚ƒQ?™Y¸-tú’Ä |3¨ê)E7–¢/Ia—Ð4–‹+”“½Äõ£‹Ý¦TˆÌ—èS$ºñnè@å»׊-öاR}ÌeïD/EÞ\<ßE`D€,ºÔ€/amLa•µ æ£å£ :“󮞳»©'-a’‚¯ÞˆÜÃH»VóIî}ì<Ùw•ž­\<’ØQ'¦Væ)³™kÃä{)”!°í%“l)eYWîÙ úz̫נJ6\,±!7–žHÈuW™ lô„ëG´5˲Â5#ä·x»È>8Zœƒ#ÃÐS q|`¦Ö[k üžSº¹ƒ8ÙÜn(®Åï:ßßÚ<ˆ„¿Ž:õX£§_–c¦‘±´¿¦B´âX$ÔÐ:U²ºkÙH]ô“ó‡².Æã>»!øIIÞÛ¥Ç$¶Wb©Tå•à3Xh‰E>„)´ÓÍuËFö¨2¤eÕõó ‡¢P¦BíœÜÊæ[á?ªU99°ý².Ì9äŽW³¦ã(›ÝœˆËzBç%YŸÛYò]' tý$·I´íz9B%±‚#é*µ—®Dþ”J&Vç"J{pM9¥XdOrd}hwS4ñ-ÃI®ê|5ª‘\lª1ž þ—©ÀhôàqW–묃 ”IÞ…ÜC²³y¼ï÷¥>ÖØæî>HMÓÙ^–bM˜{òøáÁ¬ƒ¸Ã|ü 26îœ_=ðX…øÛ•Žï9 ñkñˆzQ;»Éó¤‘5¶Ä·X]6”…Ž„ íº•Bol¡u¬sè×j.J”‚ÐúÄst§ëP64bd!`i. ëmÍ]l*¶ çh²./}ÏýYÍßó#îµs"mCH=P‚’~û¨•1ÒG]ûŒÑböÌWnð×bé±5欷§…¬kÚŸÖ?´`5jõEl%º<à÷é…9Ìi õ rkèvi«Y iµÑÕLõzd{hŒkP«{šNA¹«“T¸&ž5ÖUH‹~Ç–…Ëűn¢‡ˆubϦ„Þ'AEh¨ˆÇ÷™§f޲åÈæ¤QcƒÿäwH—•¤ÆÖ~ùZ+¡¼7ûw£r7#Þyž®3O~msKã‘Fþ^,J”_£Íâƒv’5¬«•î­ï<'P¹ûP^@ÉL¾ …“Ï«'S| 1,a* ‚yx‡êžw›ÕR‹ éR%pB×gN¼e࣠µÝ5XuZÔk6“Öφm™žn‡(nƒ|ìÞd ŠìФí!4»¬A4^ã-ž7ía×'±=ÿUWŒ#2¨ ý+E öÊ­ÎÖ*´n’—û+‰°/ÛîæòûOè÷r°´ÃÕkwKž2‡R³‰tôÒþ^©áñ"_8M.Ñ«òÑ–Å­l›ùv…eµèô­_Gª®%´Uô¹Ï7çÓÇȾT[×9Xä„|³EPr*U/½†à_¯v¿J |¤†Ônõ£=>Úêý3iî+›T:ºÞÅn7RßÛ•”œjãW¨ôr‡×Âûèbcn¦ÔlL íô•ø¨Ɇ0L15$&œ†¯·*Þ^Ì~WÌ ?tDçO=ž“ëÈ(N{ð)HkRïXsR¡ ÁsEÆòˆÇ¯©õú!~h§u šÖ[ëgE,³Áÿf4Ý»²—}k޾™ûÅXÏÂh§”`¡‚œ@gÁ¼j]ìS‹Šs&£AnÃmÐ7oÓ9+sÒÕÎf¼^ÓmŸ•ò•ÌΆ]#çIs+‰ŠR^”§;ÅÁ ÝΗÝÔ¨ QGqŒ€Ä¸Zhv¾êêô‹º›þXç—A’<Ë¡÷ì•tˆÅ32†k]®ÎÛÎñY¦ÓOrdKühšg *í¢àfÿY%(KyÊÈ×{MíÑ\¾Çcz{†·¼<}>ÃüÚú1¨ôq…™âì·æhª ‘Á~RÉÒås±ÑZÍÖšfñN•$®u•×ë½H!‡äP7Ñ)ÒÝk*%l#/M±¯j‚¬«~#cmªëBåÀƒÁ¿,%»jì ¾zÑ òKiûFc)w?ø£‹Ýºy$ò'2b°$0”ïË¥N²zNE'ÿa¤y+ ìBÝ€jÊ’ã]Zú×äÈ8ùB.æ¤Z ™Úã¡‹ÍWlÕ\ãcjÉ9ùù®‚‹!]Ýœ÷Òò@å‹’ ÷Ë£w™Ú‰jê¦îPy_Á($ÅŠXÊ ÎË$•áŽ~~í2i¿MûÀO gG3Z‘Y®ÀÏ:²ÑwQFÄ… %“ÿâßC{y?ä$nÛE^ú´msçVCXn£_Ü âi R`ö‚Ö.-¥ë}S•<¶-ÙÉ„»ÊÌyb ÞÄß…A€–û£bïv虞8cÙº %©EÅ™‹åd ùq/{èGÕó¸Yw`1gæí"V[y+Òz™h=ªØ»yw¿áÏ  ÐrÕ§Kj_Gæ–1KûCË„ àåŽÚM£t^‘ØV €½5(–²ZG°[ 3°ñèï6в­«%ê/ÿÞõ…I ±åÈúåðÖÓÉ?V<¿ü]éÓ×ÜÓŽ œä#–îõÞ—Éæ&õLÿ=(6©¦!Ñ"B¬©uScÍ(ëúˆÍÂG¹x˜íG¹PåÉ‹S£Oç]¹g«á!Q±´û`‘GF&Š ›S¡™Nmç ²ÿ4›Ç·Ûû~C§Râž÷}lŸíÿÉ–MÜA“à’É4?‘ŽN²ÔÁoUûd…˜&ªïpr#š¶ñ½ÖÆõkS£Kü߯‡¤² êXϼ§^&ˆÔ•ü  ÚF¦ù:¯BÌ–ð’ÒÉÛfº8.³È>“¾Ÿ$Ó&˜i¤ÚIssï꼕)ëÊ› ÑßÀ5a¨Ü}~H~Sûäî}˜‚¿}…1º±u Q-è~+Ò&Žuc ~³*ãÖt6˜Ù73炇Ge~kJã€Q vw;fÈÛα"ÙÜ‚$qÕE«Ëü€È_4ݵZ$»Ìöa¶¬O§=øDÖ·X©˜ üølK$ŸG5 àå»ôÐjï^äˉm l¶šõfOš*ÑÚ#Uºôa«n(;Ùõ×lJ“÷c[º]fK–·!ÉÁ´9H¿Í› ÀRý,S¬êiioÃ2ÆØ€Ó,‚b+·¹·Ónt¾^²»*Ã*F¥W“¨"®•û„‚-™757R›üD÷Äý„sXF_¶ëÌcüJ!½™M©ƒŒL=ùö:¯Wkt '"1Qà¶)ÉB4]Òó#àf³ÛöOr—9€DÛååQ߸}ÊDÓAƒžCÖ……‡n¯==;©1Ec—Ï.º_…fYQýÙ-…=ú§£ÔÔºˆtq>c7QõC S¥æÚ c_EÊÅÁ ÁÛBnÉ´Üå^‘žbÃ7ô4¨áx”¬| Âqº(­“,)zs¬ëà®ÒG‘õjŸ•'v9ŸOäÚ˜¶‹3½ ²ó£•r‚ÅGC1ꃘùàéolÙÛÖ+s®^fz+bíb³uÍR“ÝõZxœ1€ÚɉR.= ”:cÙæìnÆånÍÕFù‰  .¦Â›*ÅáŽW÷Ôx÷T<ñùKžnKê2ŠŸÇÜY¯ÔÆàÂ×ã—»|àŽJíqÛ\sØ[‹…ô *:ãŽk룋 J2ù¤Öš‰ÇOdeT jšÅùÎͽÐãðœB­'Fy³õóž•¢ÆûÀªDGï>œâûy(]O(ò¶ýGaŸcº”CG0}E4š‰IN…fÙŒñš22ЋۺÚ[¤½Ùq«nŸ5Ñrïcj'Ófr w—  <C†ÇmÄvð3+êæÖL¹¤}…™5TÅ3._ýmýÐÚ¸B…/»·U×Ó“å¹â&-SSñAŒþˆ#¢ñŒÑ›¤ÌCô‰ pLoÉ44¥MBÖÕòø~ÝN ¤æ2ÖsUÖÔ_".ÊÓjx ªÁÖ#>P"ñÿ5(2 ”&Unhïn’JðÐæãv9’?JtH^î€öç¢ÎÚ]™ _=æ–”æB)wbB§©å'îucfæÔ=!Eyd¨ƒ©õO º\3b Ù˜5a¬Ýú€Þ ­+K:'Ö åã0Gm¶€F\Ħ±«l|Œ†J–¶Ì>DÈøšéªÁ¶;òʲÉ(ÞQ©[W­rJ·Œ’©‡þ3åÝ–%Xé³âÙ(¾¿8vÙPmÕ9Ýñ¸6Ɉ §:Á°È}"çq ,ºŸiVó±Ü_­ƒvó©ñ¡ ”Â@Üôx7om’ Kì£NJì†?úgèˆSÉ |!T«Â>ÎÈS1pU¦6ªaÐ`évƒ”A*°r¯pZ‹´¦0rÚCvwÞÞP·C„F=¸>õˆ†e…}¨uuÑuºœoyK1§ àÏU–;îô– YÚlöÉ“‰=›§ ÊÂÔqžYj5$ÓñÍgåÕrÉÅen û„8†é"ûôÊ5£€:#˜ÐG1{Íò‘ÙÆ­s¨!&‘PúHÕ6Ý!Jfeõ úÒdVÇ¥½Eëª!Æ5þ£‚ÞÜå£ÂøøÀ¯:t»¤týíãP<5…rBr«6D nŽ+µuäûfSêúµµ–…a€Y4¶º’ªNËhC¦Vv²+DQN2K# <_}Æù¤E_vU] cŸJ]àœU¨ÂŸªàïeä\zàçY4Ô˜nnzñ“h¹Ë/.s€ôŠû•ç…eå×åÑNµ7Éë²»Üçv\+ÉúŒ§ÈWÞ…Ñ÷Îþ@]eFP¥Zã,  Öljۯ¬ þ*]ìtùÓ®ªÍ²uäN€¢WCTº^û©®¯MÙK˜ÍȈ”…‚Ð?ÞÖ»Rhƒ…M_öŸÛà•§?!;d9=´¸djõ«þÙVrëc¤5þ˜ƒÙaƺhaõ Þ£ŸŒ¹­˜JgévõÑE^ƒÚ$ñJ-SQ#vÑÒT—Û!zvùÉä=ÕõÞ)Pµ"GvÌÓå{Å2šýÓ€ùfa‹¯¼þÞÄÇ>¹ÿ{•èål0zU\k”ºYaJy`ÕR?v½…ù~±ÝŠË›(âG_ùT×÷ Ú/)é¡Ìr¡hW$ûœFFÀ>-¥›P—©ý”Ãï*D—©WöD­‚ˆâýZ” TíºÂ ÅüOP<Íûpê’â›CÔë¿=sÈËü¿hýÛó¬˜ne5Ç 9Ÿ‚ì[×íNHq öT‰6Ì‘žÊ\FsBådÂ8³ÏK…ëJò¿Ù”“_ZŠpPœ)¤!ï1¨i•_¿¾”1þ¸‰2”a úá+Cu’T¦n¡|àîP*M-ÇêŸÚñ(=-(³;›…”{DÏæÛ'þb륌×ç÷€`ëë|ªëmcöª?u.ʹuA 'f ¨ƒZxç;_ Ÿ\•æ€Íîž?BuDg,ÒwÖòeõ†êoËðÊšGÜžkµžfsv~Áð¹çäéb´˜×•¼1ñÆej¼­c°¶Ñ Fp¤î•"îøœ¿}œùQ+”O¶{ÆÆu‘ÛÎUòÍ~z4Lt!ÍWF_6g[€ŠøÊše| õ×ëýÞÜC¯¹ï##´uõ™ª(¦{žRK¨qˆåí´Ç,¼F¿¡ íØö%ÿ_ûÅÝP:]”-V†ø¬˜/Ú¥àÿÔœÏ[ç7Éûæç—(ÙV±_:Ê#»—ŠŒ¥ÏüбPÎ"vf4¶Jû\W}þË€ÆIœ†aoGb›åâuãÍ+®`?)éG?äñañC¨WéäKç}’{ãBòt8?ô˜U) V©‚@øË7æ‡îùš,óç¦Ô‡9ƹ ÆïשTH-xᕹ€ª_µLï"î†{2ûwÛ/ŒÐt “”i8v¹ÕàÀr8Óõ–RØË$Áî•…²z4~3#÷+‡®ÐŸÖ ±‚–õL´iMYxžùáBox¿pÍÝøž1\t6«evBçéIÂÆÓÈ¥¾ Un*òüþ$´î÷'|‚»—Íl½¬šã,ÿ}EgöKÚÔuSª5×Ür{Oï7¢iÐÒѹj¼Yÿ¬ÝZß»2E†¨ÆÌY Ä gn&òRÖæã#€õ,¾ T·2¡ön¾šÑk ÆDÞý˜KÐjd£ e* ¼<¢O`TÍ&ƒï,pi †äëÓ5µÜ`ì2Ö¶š ’(Ü ÿ蜌è Cä~³@@v:7†›!Í3â¯Ïúäîüˆ¹«â›õÎî.®~.þhA‘–ÿn™šœS=€éþNO1§Ÿ‹?ÔŸ3·>–Ä`O)Æ@kW óKñïtå–03]}@¿Î QÁÒ™wy*yÒÙ£gº¾®xÒuJ£2'¯P_=ŠÉ“&äåóæÏe²_Ùû«DG¤lc qœ¾„îñœU5ŠØ~–íÍ4ÃìHc ¹µÅJ˜¦OƒÃ–LÒ“B¡çs«!ú]ž¸i¶/ϰ] ÁRÞÜJWeXûcVLzìÙÚÙ šÔ5ÇíÕ§¹ŽõAv]ýþ]è55›#z ­Ày^£rŸ+KÿÅíÒŠšÇd…mS€;‚Å¡Ýyù5G2ä@: ‡LÖÐv7càÿ÷0¶Îc3S‘" LYðòŽ|ÛU¦üÞŸõ¢nøfíÈ„År?u±c¹?{œØG ˆŒ­ý­©Žß‘õv ¾ƒË²ö –ÜöÙZõœŽs*8ô¥|.-Åg<ÝÛgg ov¢×eô¹~nâKtÙyÂâ|ĦçÉ~Wì*ç|·WŸ±3ˆú4â9=ûé1ïI8Uˆ–¨› ü›®¶úzŒµÌÇ ÛUF2+gºL= w!yhSÍqîj°}èH&™ì8“u?Ó–E^pfªåIëÞòv”LäkM™æè5-õBÝ8gãæ°ùj½šL, ²Þ#íc`Ãi5€³jŠ]Û£3SlIÒÏ?æ´®ñ®ï¢+Ò‹ð\´ót€\dë?ÈŽ¸ìß2ÚS‡â¶g6RÌ©¤jÁÖX¤Õtc‚øÐó¬Q5Zì%5›?3Q©›”{oñ–Ê«×=Ïþ„¨m4‰>-«â!âPc˲²ßüB‰2wZâ9sLZxNÔek“`Ä]bû%ù:fues¯¤.= ÊZ6›°µ_§¥±Ô¼„Œ­ Ôt6þëwð§5—ò(‹¢ ¡xI(P$'=xÕÊ«ÕÐWöê IÝfç, Ý)±£¶×¤EîÛ øŒÕßß¡Q{Á&™fë]aÒ4}X¡ÜX¨OyÁñ³õþr&¾à–;È¡qÖÓ‚Š+ýˆÕWÞ,ö'ÖŠk¶õ*ñl p·•,Ý8Qs1Ÿ±gc©P8,šë'GSHÐMë=¶uÅzÙ"ǽ½©¬°ïõìžìD‡>• £ÔïâòÝì–=ÓXͯ ‹ÚêX ~FÞîIíx_&í‹Mí+»æáy0Ù/’í›Z åÜz;ržq{M›ÚÖGmEÔú½sš"çñbš!Ä! ¢œš8ŒÞϤaüöÖ×óÀ·-Ø ÙƒÇ ræ]@H-Ú¦,+f´H[4¶¹˜†8K ê93Y>8ê£òÚ’‡'&~MBÖ{ÌGE…#‹ÀÚ‹M-©ÄÃ)vº†HkzÍw>wt:`PËwùg.ë¥<“Êur¸µÑƒ_O7üäŽ ê’!~5íÉ›Áç– ÂãÖÆ¼LèŸw!?_ vx€­®px´nÙ?¤ü;W»ƒ%/èÄ&5w‡ÀÃö¼û´´\0…[®&îÀ'dd„^Y2ì†\nË;!ãPE- `œs`‘LPóct€="¨j–:‡ÑO/‰ÊEm‹ÎÆïâ¤ÜjÈl'[rÃ,¹Šµøš±øZÒj¢9Ë’à¿J ,Ö™ø.DÝ!Jˆ±º``ð;‹7 ñ]MAWNJbN5ŒÏ=f·>Ðia¾NÒG!–•EÀL‡Ö€¦P«#È›Š¾Ñ‘ ùÝjógpc ysò~ã.w÷C6±w.™Õý¬_C¢G+¶Tiú AÚó.“4ÈÑ»J,Sìòö¥¨{º6êúMäÇÝgÌ2*ö‡Òpˆ½Ó)NÈ‘ï,°ÞS"&OÜ¥•R§=Û²­Xª­¿äÔ7ãOj}XOK/ÉQNáíï`Öã²H»DÃq©˜MÒáµKMûñöÔžŸ›» ±^7oɳ’Æ4ÎÏöy)©ùµN‘ 4Và˜5yndL¢Ç™B[+©žSìÌÑ@-Dc»êãøGû(´œòˆ³W©®›ÒG¿ÅÍ{(C ­Á×+ŽŠI*ÑÏ Å¦±'¶U „çy©m“ $½|ׇÃùþ<$ÏÿÙÔúu?"ïÇ$ž}‚»é?rç÷/æ:¤Öt†£mnO$¥ÝYg8p ~ísGÌ@;Á^ÁÌfÌöð+ôÆ-yñ¾)6¤@ÒºÊÓZ>Á;&Ê®^ÊÃÄ<îõü|o鈿rŒG)ªwªu´`? c·ŸFÂôǶ!^¶¸wýýKÔKícÅAÉc=DŸÅÄ/5úF\£r›#èõž§Aµ´[ê UÉ5„ØÎ™ÊK@ê¢DwîFåá“ÛÎðPS„~=¥@âe^õr²o•´¯ÝÄZßä‘h1É£ÙœQĽëFXxv•Ο¬#­wHžÎÌ&ÕŸq“¹ÛN3Ž"a±&ž‹ÃJìaC>‘ÛÌ]Í¡ÕdìŠ%á^E^Bðõvʤ÷PXíù#‘¶ü¥}H6cç Kí®\ ƸºÜ¼»dˆíÐû”& þ„ûÏ øšmMTª&¼7 Uò¢Ås¿ÒÌþcÛK½4]äïûkJIü~O«€íl&蛌÷ÈÉg×™Z"IK!žW †û"×?—âFHw嵈ñÀCfŠù~‹ÞIú…&R2}²CÉÑc—©ñ'k‰ Ú?íÞxº6ú˼Z¤“ç1 2ûç§3`+…¥W5Y.¢X²)—2ªü ¤´h(}4©×yD+¯§qòioÁyH»Óøá/a‰•Þo¿‚Rž†'^ ¤ÛC"^“Æú/„¥“ç•¥HäÊmX÷¯ÝãIV¢ËC?íÙÙ» ¤}.»ÊmP«´®yoýsW—Éî+°Ü¸XFM{%ØKO’ô€\´Ç Ê£ZÉ3µÍ¡•\0;ߤ¿‡ -³« pOWˆöÙHVBˆÓ ‰¸ƒ™?±$×¼­ÿ*õk(öÈeî-Ž&&è™ê4À´.ºÈ¥ì.Û°ºÒB°'iÚF ®y4cšŽV²ƒc±7E»¢”+ÒîÜÔ^\›|…èX欰µò(ÈbUK¹ßÅÆ]:°"*§jTþ;`Þaƒݸ$ ìX‚|ckÃ4§äP;]ûºÌ¯Q¾³+ò’Ë9ƒÞàúp¡ëaßêª|Ég~š1Z¢¨ó?£ØÎh]ÖÉÙ†.~¡+=@¦³hžLLd¤'@WǶo¨î·šz@{ {ƒø!#(Ú×Gú“»Ás{òŸA`‡„ú]µ”F§Ôöê4(=I=é­¥æ/zð©A¨‘šðqáYh¢qŸ¢3A«•T± ;e¬¥$},L­îǺ 8A·æù¬ëÜ]ÞKe¸­«­#^'p§Ý=TŒÈù<)ֵ˳S FøìWâÚ¢£µšÜÐAÎ@.ôó’iã÷ÓbR`^ì°.O“Ä–Rº+à ù2»Q‡EÊ›Èh€×%CrÈ3”GP±2wº‰ e Ó#£ø ®øÉÓaÒÕéãöR²6{SùP÷LS`¢%/תY—uù‡.§S)äæÐJR€O„éùSH‹Ä(˜†Cp¾&øŒåÍ“§;+©Ù£kÀNV»ËM×…øpÙÍ‹OâDò[/,‰¥@£#“ÂG4Ö·A–Dß@Qž³$ ž|ÿ\µ€Ïº@Â!r`¶?çÌñšCFfË›^Orµ»ò./%¯s½C닉Ò<&¡àa¤@Å”PBÈ Žè“6äfó¨³Wj/¬ùfƒ†Žsf£ót@­ÒÇAU—×€}ú\ƒ¨ ’…:©(‘ô˜¼ˆ'CY&‚ b$E=X3×#;¨¯ ðA%ž-4Jš{¨UQQ# ¬<·…,¨G¡½i]v‘·.°Â"¶þÈåî§Ske¨ÁDÚþ <ÎhÎN±÷š‘ãRƒÁ¨ 7ƒ¡ßxæ]p…\pʵ‡U²’Ï6(=–м²Ïa†ú¦áž‘+Õ:·¼ýœHí‹È}]!mnRþmìödåÝ$N i KëäÁjd!ß^Ëor>ƒ¾éH2ͳc…I¬ýÓº€’)y†2ް+žØV½?w•ï9YJ>Ï3J¾tÐt§Ü#&A– ÞGH5„ )¡ 4äOž!w¶û§’V¤u’ȈT Šæ:ݘ瘟}Äë{.D÷†É)pHÆdû Ë0IébïC¾k‹ò@qðjI>11Ê2qGgFÍõy^>ð§u…«¬Ëƒ¦´RÀøDßÕu†UjL¡°e r3Î#Pÿƒ<‚ë•ëü^Ìý%ôl[c™õ(•åEL9ù—æ|D­ËÐçzÍRiÆ^€ÈwÜ]ïo´&½2 È'ÝÕz„X1}¿ÿ Î3{¡`¡ßÇJÈ…«Ä/ázjZ×.”»š‘2#­Ë¿*ª!Ÿ>» ÍV$Â`{Iül6j«Œ¦–pK¹¯ýRé?W¨"³Û_ ¹ÔGTeY3"ûèòfòì´.7\I=ßW?½ïþvÃ%dâù˺#í[ÙÏÂR®5ÒãZ 3èQ°ŒŸyÆÎ­Ñ)!±™y€EjvÚ=ÚHØÛü' ©“§Ûà)•uíV“3XžÅå™ÊxÁ&ü4佨JÏâPüÒ±`bîÊo)ƒ'‹ÑºRhþ)±×ƒ¥ì/$@›…4êQú.r²~Ö%>XWIP¦ùçaÎÝMCc Äœsâ87YW_’Cìþ=«2Ü5óf¼ÙìCÂwy@ϼkå©(FURônèŸwÚP+rbRI‹LުϺʥYÿ|×ÉÇßuºôÓ ¾L3k¸ëMz@ˆMc²ÝÙÄ@Rm lñ><èýfdŸïZ']áÆ$¡ÉU´bHþûT‚g”ø„§hÉ—åä¬,'ÁþÃÌtdHÉ™jyð“©a—7=+¬‹’Ù+`«…ÖµOb;`]oV¿nòEÆÑÖÚ&òîÏ_j鈴óz?[/C{‚¾ À=FF`IU¼­¥‚_Í^GšY[&Û;>,Æ?·ÁªƒC…Od²ƒŽì}Le¾í³£.>8Fxºº’{)R‘Z3QÂF]Í »_½Ò¿ÌÚekgk.”xLz×»ŽÔjQ«#]lOm3”ÓƒùÈéú Çœ¥fõ3E¶¾¼ËbV´I=ðEF¿YW?™›úöY÷äéjŒèxA@’±Å|öQ{J’²®i$® ö»©¬¾T±t•¶ž×ÝWéw\7³¹ÞÈ„öÕ^ýÐÔjÒÅöï¼3«·ÉèzÖVÍèUu¡³9gv–r³–@€£¦Þ5’+öê¡$aCÆŠ½cÙq/“5#8ÒÙZ5¯MyºAá·šÁ±3FSG=ÓY2¶â_ñϑͱej¬%ÐCji8*HJ´ Ù’1NéÛà¨REöœ"= 2êFŒÆ Á8ž&%Ê£ùõªgÍñ(ÊùxšskF4 –Ýeä¸5´ šò®!½2ꦔ‹ÁË~×:#iƒë¡22š½*b^Û,fÇ õä+s\hj(ªÕÖœOk|gù÷IÕ…QäñÜ@lOi«{y+qv~ÓA­BŒK0ù õcÑfc»F-OŸ.ûé–m†FßIãù­ZevwLiC –™æPÏ|ròK[tín§\`PêXº«Ø9lü¥ZÏbùÄ6m+tì³Éüb5综ëÑž`ç¯#‘ò/Ô'¼ð)íÊöYðW6ZºK%­ËÆKxw )­çÇŧö»0!`¿«Ý^áí¦v)`êõ@fÞ™a2½}arÌÆŠz³zì#¸Ý²#Øx—³ñÇjLÖ¶QftƬ“.®têsu̪:بÎ{Y·vðDI¬ñTŠ,£Ã\S… LÌ‚*72s÷¯€ì²«(zµE= pû‡ë.Ì›?Öoþ–\xàùþ¡ 傉<àÍGÎ*N%ºžecò×Ü[Ù~A‘~ S­ÝLLý­ŸÄv0[Rz%t3 }W]IUŒÏ>¡‰<©þHýàóFáØqòÑ%½*ý” §@&VÁ:ÛF3…¬a,&¾Eášg¥|ÐVl-ïï fÑ$¨­^hPXõ`ª5ûÔøÁ3ºÉŒ V>UÌ=ƒÑð–‚ìY‚ƬzJ‚½_ÂÉÏ6æ×Êi©ËQŠ:â»jjdyPReH ; ó”®Âð‚¾¸ 9çøó¨UD‹<0JÂEªUÕï*wAè³®J6oàÀæÃ »O*”Å-B•1)â];·„‰!+à¹Æu ´—éYˆ+˜"£G`ô•i[“º¢]Tî×^*ù¡#ùÏJü»:ÛêÇB¬‘¥šëÌÜÚ¢|6|óÒPü EF —™ðãÏÚæˆì½öV5‚æ,ƒÀrW¡E†Á¬q Ia—1õÒ½tK¸¢5©Ñ˜Y9˜øØQõïêeŸì–âeaw}âTBt™±²±ý*¶ììÜjd=vÈáÈš,÷ÜÐ``c4T¶¸êˆjd‹9ÔâÎÔ§ú0.jqHÉRÔ“P³¥uao€‰ÒöïÝ =`Òn}Ò€9BøÑZ¶2!šƒQ"Ä^8׌Œ!x­Y’'CžçêÌ|f:ð¨ôL.nù«9öJõòÈ ‹àÒÐÄaÇÅsµÉ3”¶%_ï.îAà´kk_þršT×½4¾t0å0zõÒTÉy f e [ÒDz3¡éLº+¬a²[µdj-âqv$ðÁtÁ÷X› •I›¦†5"¿ÊÌ5l—ä!¹í—-¡Yð¯ìUÅi]¥±/ƒf;3ÕÈÙ ‚T ²{ºø—Ãè"×ëy´Qžòý•*ï€M™Z#.æ{By:ì—"Ãó_R?}fäÀÁ2õp±ÆNŸ4·¦Ø±.|×)ÂÇúœ½zôÉT×Çz…™öâòôA *2n7Ïɼà,ŒQ$“ŽÍ|þäÔF*ÔuùýE=ºtðÂÒ æX#bñàA­®GÔê”Wîq,¡zò¸«–6ý1põd7É4£¦J’цM¼Ókm¡{™ò0“º‹K 9|ø&眇ù¾§g ‘{Ì>Ì÷ËÚÉŠ lÖžs ­ +¨;w“‹ó_Ù  6ˆï j…E+ôzO%¨µl>G ÝRÖöB\jÇmŒþT´« 쌀ÅKÅÄ–U'˜WWZW!“ï]¹Oß…žTÓ„íè¦ÑQ"$¯‘rí³ ë.¶]Õ‹/ ¯&c/ëf׆ɠ<á`Ö„F_Z€elhÌ­Ñb³ñèbÛèlÀA†ÖURÁäæŽ1h]£-Á"¼F—r£m²®qçÄã#ÜZǰ‚ȯ>šZús>ëƒ5¼Ÿøoe]¼ïÒ²ƒò½šªæìj&øý>K ^ÉöuD<;’Ó›ûcf»¸úRex½&îŠp•È®L²C»'æ;R÷ ³ ë‚Þ.³+´¼El±Žè©{n€_–™’O°Uê3FÈ~“ ÔÙg1ßqèÝç©„¿¨‰”‡G¦vy¢>SëÏ"v%eëT /îEtVøýG1ûîAßZ¢6Z :Â6ŽÁFV´sžyÏžK9ÁI’@Û¦Èä_ðЛøñÏô>Ö’¨œv£)¿qL0vpêò'»uöêãÃR²:LÿÎ}FDó‰xS *Ȫ¹ÞûOücE‹Oifî·Aù”Ëá9äZº9dI¥¡•‘ ˆã¡8_-ÙôQ™K±ƒ3^‘‚)ÏQžµx¨ˆiO“ÍT9#±ý¡‹Í4c´šßv‘Ô¢KR]ïsj5›þ2;õÙû°-ƒòBG ã1µw·©l6¶Œµ­"1í¢T+¦LRf¶ Vw0Ñé Àۘ܂6…°ÕÖÞõ³»ô}ýF—m@O„r÷¾P¶Ê[ay²¡Õx@2µd6§ð3½ï.c…: ¼9tW cüKmîÏ]I0„f™dbã¬kgÛ}’4üÔbµó4"EãK']2²^2¡—zW± ‘EY¯"9wWë³.Of³ÝÐÈìÿÀ;dª\ƒ&˜ÕZ—ï[ˆŠ„ÑRÌkK‚¤µýùÉ£‹]޲õvuÕîœbŸ ôc°%3NØ}Wµ)Þ?HR5>pü“o©yæ6Ó‘¡Ó.È¡*ÑZÑê×hp¿ ŽÇ0 R×`5×ý«—|¶?9…?ôbd]…böˆ…âe9=¦L)ÐxyUq{åY<ŸäwDÍQª6ÎÜØ­ jñZóD²22"8y°ÆP¾LZ—ç˜ aµø¶µ‹2Ÿ›i#JSCRð@]×kjÏêlÍÑu6OÐì­+LöK´xò4˵À°1u:Ï®²E²±ï.¥½ÒŽÒÏYÆË4ÝD0o)ƒô}νH½Ü³—\ b^Ríë|Æ+Eƒ—¶&qõ¸‹£!Ÿß_}lÈ„o¶” C¹JíÏÕs'!PÚ#Y.BÎ2¿‘Ì–×þa¦nù$ Hv$zÀÿ°}FSÍ¿?¸}y áäwzÊx5¤NJI×ýdƒÉ?º/é»ìU³Â¡&]Sükîj&½ˆõ2çÙ2‡Ú ]îùG»° ÝDÛê²y‚¾²›z€áéláu¯b™ja¦Êûkw)ó›‡`Ðí„k2Ñ—V£u·ŒÄ¬º¥&.2²6dŸn›994 ÔB¨§<+ü¥V9¥Å4VFŸˆg 9NÐW™‚*Ûl‡ñÏj ¶€„p˜Ô¾Š© ÑõyܨHè›å圿Õ@ëj‡,€A†˜t|˜¢Q½]»£|,ö»`(TÿÄ4ÃÃM©$³èJŸ;§LkŒºäËìÆ…R[‘¥Ì¢"Á+Cc˜,¶µÑ“j¹ý³–b¾€}ÌZxuž¿$öüy&QÀ½“Ôå"%£cð½R1FX^„Ìuž<&©Ð×Yé·Í–ŠXiõȺÊd«!ü"c±.Ø•;àLÏ€›Lˆ'ì©Xú !tF×e¼BùZ2_}R.vkÜÅÆÞǪ¬nÁOdGz~GCÖêdVßvÇcŸ#³-2Tâ5­ ‰ c&ŒR{Æ ]l2 †œå£‹Ý“[êw‰v*š­RjÍ´$dèô– × S°?i”wߨf“f:äTsÔµŒ ã¦ôØ·µhL?ݽä1\Ü+/rÿÎýIµñ…SfHsíô£µLfv˜½Z-åiÎÊå¶*­`Ö$¸ÐMËݤ†^\qÈæúADi&B±º³m™TÕ òzUÜÁj>o¶³ýù±²®ÑÙ½²%YŸÄw€$`p½pMÈÈRë[:%[àP_–”{@PhjÝ «NôAØà°;²¸Î¦“Š ê';º±`ù”£©×ëÙ§D²=Bí´.ãÕGLtmInRØþBEºµF.quèb×”~ø² ‰jI|É'ùš9¶Þ˜Ù¸© 3:›bƒi8ü’ðV8W£AõÛ‹3€¦æ±Ü%ª¸%f½€ŒRá$Ž\ÃPœ¼†!ˆ)Š;’Ò3íj ýÜ}[éÌXÊD•øÊ¼êû¿ä<û\JãÈ_ÚãÈÈsò¼ÌƒÖè&Ó³c=Õ“?àÆ–U‹Ø;¥»Â4Và²ça-PÏ>¸; £ÙŒ›+¯!E÷³“³ötŒ5‡…t¯—Jëê}W&^d"è™d}t±W Õü|Ý/>c”&]󵨽 á”udjǰ;íŠ[fÓt±{©F:;écãt9 ޵Ç[Kü|°#vÛže$œ*:íöîTE®bSµ“J“dTW*<⫸Â"ñþÀKÑÓº€;gdu$!]@zБùgZh]¨`òý!h’,H3÷‘‹¦¶vOße¨Fäâ< cÞ…3cKÉdæ7ö®6+¾¾ÎT¶·¦è±w'Ϻ­)¤›ÒŽ?eˆ² r-ì#Ÿ›Ù·i5É(ò R:†”ëC£käì³ZŠÉ)ãnq°ë‰Øóý5 ˆ.¹Ž#Ü9²b‡W»[)ŸáŒ!Ö'®àÙÏgxE´ZVw¥IæÖÔº)X‡}۞ȶX¤“¡dÆìqÜöÄ÷”*QÇqRQ:Ô_ºè‘ Z×"M>:Ö…Š@ÉT"dǬÊN©+o1f6ØM,*<ÛS=ê•@å/5ÑÛt¾Š¿OkŠ•/ä®Gº«zzÊ%!ãü6ínœGmìR·„#kçá«÷L(½ g¡\.l­™‚»1cª<[S/í,’K÷x/4BPô*Û"ËíÁÇOë*òj=À4<çFêÓ b –8"cª˜| ÊŒNY™'Õ‚¸zgÞó,­ yÅ!îdH:èÍž½hK–9\%žÏù…²rd`.ã¤y`w´ñåäýªO|<çH ÃH5žn•=Ìî⎲uëTmI¥Ò˜vÏ•¢•Ào¯üþbŸqZW¶€>y0 /‚¶!õýbõùƒí|¦–;k_z6Øï‚­5•nÅ™j…ñ¡«@Bö” &26ÿ›EΦ\°Õ$1Ž4œþ» Ä¥EãW\þì8c¥CÛg"óÊáß9wíܧ‚åJfõ‰~¬hWP±1‡ ö;M»kç$bÏP!v.nòËÕf]².@)h6«æg‹‚$ ¤¢Õœ¾Eî9©_2j“`r­GÃý oø‹"¨„úÅò=]p&HîÅÍIwUƹږø`.Ƨäâ7‘Ð#Ô¸hjs~²Ý¥è«±œÝ'E²ajƒ¡,Hu=(5¿bŸC<³â“nj<£ãûéÆÚiŸKg OÓw/Þè$ñä¹úŸ<x™ß#ñJKfn´1.¾Ä.3Fæ¬`¶<fB‹d§Š&îüav^ÿ¸Šrtµ$¡ÜOËÙ¬Òe…~¿äNíÕk…YÓpÇÈÓµ2sËÎt釮~*Æ!ô)Á,ÿxÒ·?ÈEÉ´˜G^…²À¦~5•}#ªŽÊŰ÷.ÉBp©•45ÿ\M È“¦ÖzOm!!~¡ìÒßÏftkÈ?n ŽÂ—9;wtñ)ñÍâ™hÆŽÓ4c¯»Í§—i@€½ŠÉr§Éjöë]ÏJ‘‚hSÄà“2¸`°©§¿0©®»×§lŒ¾¯4Éí´³Û8$… H?¬åO¬«œ=xWŒv?Œ­@UËó¬"ܲÕÙ3–úþèRSNéÙÐxe±ÚeFü ªû8Îó©+ßìWs¤d6HšôCû ¶3`ìWèò{îµ{~§ûòúZy+Mm¶ÚijP½d%à¥|JE£Éyùý£.8s¤I¢Íb郵›ãîJ ]»zŸ×Ö#Ïam¹B{T=ÎJfÛ‹e[yÇ^(A š[š€§ov¯+€ðu˜¯ Ç›µsó=ð¾šÔ˽ìyÕ1û£`¶ù2-Å?"š^åÍKeØ©öEŒƒ6Ÿ_²TŒ¸vd¹žHNµšdB2;òË“´;!·Êˆçµ„T×!Ôvß,ЉR}¸¿£ †‘«ñ ÕMõÖëå+­«•ŸHYzê3‚R®˜¼Z­•¦æÕô ð0o1WvÙý®àg/ÊÜZëô/µ›®Ü/šœM¿é3ÉYhûšRxìöhdvW×~²ÂÒØ@ÝAÊs?%l¡§Üj¨=´Î¯Ünœ3zâþ© ~K<%ÕM±ÞÚmÒÔÜ‚¤~Vf“g+v'èqe]è²ÑlüþDÑg± œ ᆆXòÆIëÂ\ÁŠ.hÎTèUÕÈŠ-Ëðæ¹%‘ì^_©S÷“_Ù*éD™®Í'dû£ê°œbwæP«d)öI™ô†¬)KKL±× Wköy‡+™VvÞ ;^yYÈE»Û5%®Q1”BÔÎhkªhþ®<ž§J#ˆN ¡‚ÓhÓûkIÙÅ6¦BgP²´G$»Ï”Ëm˶óê`OxvŸêúh´®Ð üÒ=.àͽÃÞ©Ž þ§ïu˜mY˜ÂjZ Ö†‡+Æ ÕàÙ¯F7dëªZGëý ]íÔÒŠ)¶Ñ†Nk‹)*“‘ª_^®;ö²}ëºÏ $@âWÚyK­~5ǧºî4ŸêºÛŽyó³0µ:ïCù ¬)qŠ;}P†”jÿ¤Jú¸vù?)óµTœâ«·´»V+¯.æ²·QÛ0»ZvAÚ¶*¤g¬FËK¢å¹÷•Tù!Œèê—ô„ê:È„:M-5¼¿thKÌ÷Ìi´»Ì¯T­ÿ¯ÐÇ•¾[O÷¡{ÅZ<8—ÓúkŠÜJçöz)ý“ì}3”•ÒžŸÜ}[»J©–‹Ýþ½rìúË÷ Å&néôÍž (Õš¥æÂ$á{3^æ]JùT×AÙÌìc3D_sedÄd“f:° -0_Ë÷÷í­~M¤R;ÿK4€€ØÞm—±òÓFnù‹ÛP š¼ –It´>zê±[ÕÓºÐ>×kˆ¹t5÷ìŠØØÅ@ÖU/Ùj¨®{z6=¿YËü²Çúí St“^ 1Z× 9<ÿɺ5|Üôqäó 7;¥èáðÜùÑS?Æncô¨§6pè§ñώ॓„æ/Í’œL¡ü¿×´}°îÈ]™(A*<}× ‡§ÎZ¯ª ‘Š(ïj– Ž)ç.Ž|vmË[Y™©Pñ¬¢)ɼ“ô/ê®/Qúò®V‰‘èA…G—âW×Y{¡{ÍWó.lpð`ßàmÎöúo+“Ù?@{ùå¢zÒçÆÀÏÊ»[Ó}œ<À²OQ˜ÜàßÎwB…ÆÚ.@åæ]5[Ìa’g3ï²]dŸõ²éy3j*T¿:yö­¸ŸNÿ²G?J÷ÉÞõÚd¦ÏT§Å,©f} Ž¹Uˆy±ÅlÝËÑ­Z°ÞnñW3ž®úÏ/î9˜]M2OeԸ贉–[gs6†¯9MܱÓES³nw~Ê\tÔµuÖŪß"}Q²~/šM·SŸöÄ‘ uKd~x‡»€xi)Æ’ú˜MYý Ìís)•gÀò-ê%L¿E‚AbQ|³€,‘J»ó³UEÝ6ÒjÐðü” ¿O ú“‡®p}Ä9qà…Î`V?ïjÍÊ@;Ínj»Ì×)Ý9ùY“©2ØÜظ÷¢.•ß‘¹&RµR§…ZüƒBHªÛ¯i>h»ꊱe  ,ÛóÐÈb¯âìÑynÏü4.X7oþNç9Ê#Òvv]¸_*@ òKë2¥áAÀÏÙ+Óðƒnx£AµlÂÇ·mÛh]+õ¢Z;á~¸?âqk±€ÄCÕÖ[)Z[ë z‘pT‚zY 8¿§Úƒ®5á~Þ3ŇàYË| ëg,°bÞ3of#QÆmŒì?Fñï Uµ?Qv.c~í¹èVvl#sòÅÑþnFUÆâåè‘9ôËž“ é ùcÈ¡˜e[³Å´ôÙùRÄœÙ3ü{úÓ«÷,nòtîè3탃±µoêèzÂ)‡çIœt ¼Ò¹­üΙʚڥB¸“ u+\JkM6dÙ"ù6©5ÇH-&AëÑ×\åhÄã÷—p¿›¼™©õ ˆòt­¬'Aö¹úV EXSûlN K‹•4ãMfŒ; #qú8¯¶7‹ åJ+–*ÿ˼ÙÃ{Z!³³7`m-Âq Lƒ"¿\¸!›\¾Å€À-ÌdšðyÀdj ¤$2 !¸ä"Jäû‹£›Ø‘ŸÐ¯œô:Z› L±-rhŸM2¸M­„¬/fœƒb®íÉ­ !¯¾Ni #ÑG?|é»íôI=f<ðožp?Ü·ÂpDUp$;aûH!ÌÝ àíÜ5‹¾|Pþ/4uç¶§½{¶LÍëmÊž@z°+‚6§Øvn¡r³¡¯æ¿H¹0(¬,YÔû0ȵq”™ÔÔá¨g6ˆƒ„£<Ά ©²<³,ü §5 AK#ÝS­»¤eôB‡´ÞíÊpŽOv¨ùèäN‡wF‘˜TÉÚIMêÙê'ÌÉæì_¨ØÊ¿ |×)9¸0ñ{´f‘ÙÔ„¤‹›“¸¿T©ä×6TÀü –Šhj;éî´&)¨Ž¨‚½%è&Fß ÁûMÁq3öÏ¥h䲕‡©µòtûÑkòyXÍŽüÃ$ ºÝ®Ö÷m—W_®¬à emʺÎX颧ŸóžumÃ?8íbCL˜ÓÑ®,¶çÑ×Lmç Q-:ðŸTžÐ[­%­Ã3 Ëdz•ÙëÚµ =8µ^€]´’ùp½Ÿ×E>·%à–'Cr½Yz¨P`Kƒ²À'}²ÿ¥qÛ­{-‰«Ÿ1â™ùK{~—Ù¥šxÀ!Mcõ÷üЊ”#ÿÙg¾?xÖA´`»Ò¸“~ñëwõÜÖ‹yVƒÖðTÜÔ;#úù„ØÙÆokðâuo.`4’‘~™M$ÊcHgƒÎo•³2¼ê{àáFÚ%‚äokÃßK‚¢W°”p'<þ*TÚ3ª34µ”zPãkâA=Wëüz@FC˜~k90ÂXû€d_‘>þ¡…iER怆Ó6šÓ¾€pHϳ‚–9ó.,û´-‚¹ºæ{†æ6£.üÁ#é‡mTônô]È›Ö`-éa´Y8ãá./PKvDsÚ>À¦ŠÖ’a0¼iA’>?¥š¯#QçQ¢kD„5„SF ö(ƒ²$Ê„ ˜…2ÛØê#¸ ßiQ&º×´Pl¬µ2. ‚å"]á‰íFÖužÙjV]ê#´㺛þ8tmân«ŒÛh³µ‡œ¿M™h†žÕà¶iîy²ý.²Ð¯äV(¤[z‘ ¨pRî"3³9èc݉:s´¡"¯Ô¢åþRÉxðPÒº@ ‘ô£˜N÷‡ÊÂ]áΫÃÂÑÑî tx½&¿G´UòÍ"ˆ—QäëÅÓ}ŸÒe·ý"è^ÊÏ@ª®H¹„—dë•íµEˆã‰[¥A•mÚÆØ–Ù,rž6ž]l=ïo Œ ™½¼êœëQZ(ÏMæ¤Ïöï`é[îûa‹X[t6¨pK;•™ïÚÿHfÙ@qq{Ç`B\+-׳"+di‚×¼ÄÁa¶©è2g.ä@,¼%Â!ö®aÐa>ÿq¹IB¸u©PÕ˜Äòßáàùw[4ºu5®@_“F˜íØŸÏðÚ’—¬- M¬h®­ØºÛ¢W3òÏÄ>@mªh‚e²Ö˘ô]îïT‚ö1’–é7öZ&C^3ïñÀÝT “èÙ}{ʨˆ=þ1g?Сi,ĬµB¿XN“”këEdÝH% Û_”dŒeÑ-y1?¦†6ý!OE‹­6®]ÒŒ~Q@I"¥=î G]°hû^&ªmòIÅž:Ó>„èMød©²}t±òCX²Ì&Ü/Ùá‚[jé oñ(ùë“B§×,Æì€ÈX U¶B[¬§H1–H €5QVhCëK£û%X´y¶ž\ è˜ä¶_ ZûzZ@-_Ð7šµ°˜‚µ v2'‡àÒÒ®ëê‡+b0¨ì¢²÷¥Úª?7Ï# Ø[žÇíq¤³ ÖhQ'¹¹?l廿Ôåå9hKT†•ɺlY£ºÙ$›ÉA¯~².€r‡ê™¾ó+¼Ù@—çzùßÇ¿M ðW.ÛæÄ$; ôÃXÝÇ-šÃ¹~ÿûÑê:DpøKþìçsî*îA/°Rc)¼ß±S-=:ˆì”àíÁÆÚDVâ×­3£"óŒkßHK`Sdƒã”+ôs‡?"„+›b`/¤Ð¬BLËêé  ¦Fù ¼¥QÅP¥zñ¹L9›YÄßµv1™ÐeM¹²C{§.v\jŠ·ØÅž<˜Kº}^ K¼²)Ò/`´NK‘T_Uû M»1Ù\t%­k‡”²ºáwÑæ³€2“HÑÛ.´-„¨eä×áON¾$ôpS,çöê·ô>Î6I#xò/J9Ïè:ÿê®ìV¡"·ÁØšG¿«ùý›¶•”Í˹â>;É× pÐ…û‘–0ô¥eP``àIð,ÄdÓpVy:¸µõ¤q—ýºÙ#æU÷Vƒä¶‹ŽìJÆŒKØT²¹g0 j%É=ÚŸ“[7XlñÔ¬ú4"kã`v<(ا>ø™K!}óæVDÚ†UU†2/_æ\Né±-Ôéy†DÜ1ÈÒP´™‰Dh¡Í´;Ìïwò¡B Úòt˜}ˆÃ«Ôú¦C©ÚÆâÌ 7Íe&Û{^Á³/öìT7èE…N8Syͨ¬{© ëí^])¹ì^$¼8v‘ÂU¹jij]NòÎî.ýýez»É3·HtNV{jŽºv´æ½%¤ÍìïÒ5‹ó1Û˜ëf¢„eómRtgÒÌHîÁ+›®àë}’«öÔü³ç]üŠOú D}TœÖ Ê=såËôgwdžVf²nêF§6Ùm¿.ÛäOæåVìôv=Æêù‹Â)0‹JÖìiÎ.é3⯮G~¢^ÀË{z*µEk5£nÌrÛàˆRvg5°•”y.œVhHø¯£E÷] Së•Öuj~/±X8© ‡ea€ú<Ý•§jÖ…Q®ºl³éŸyC}F þËÛœeóß% ÛãÑ ×Iëjsix·Q2!,@Z½²®Óªò®Õȹ­Ü•yÕ)wÕÈCÈa’?ïã›Ý]½ÅÞF–‰’…œåµ.LkR.H­Ð«í'ÃæH—üY_©!:23øåe¹m$ \¤…‰pÇE‰R™þÅöN‚]‹†uϤg×£`˜xS£oÎxòêðï ÙQ _æãÕÆªéºµ™wá Þé”"LU´e«š\e«€h‡¥eIùÉŸ”•4Ï3Tb®Aaßè¡dÙ‹t˜¿_“Œ‰¼•‘£Å\}aß¡nÓ.a]œÝÈý3ö€Ú«O¥ÊwðÙ/ñC¡«ŸíÌT­•ï¼Ê=z †PãuÞ²ŸYŠAMj3`n›§[›ú¥dƒ ôb¨è>WâìÕKPˆGå$Á¾¤|R 26ûçL•˜›k)ã8Ñly°Zïò]óR}V8¬1Lî–‚nx™ëÈ‘½$@ê‰]!^¶ò®ÙªÚuQœ¯Þ—RüÓÄ'íFØe]K‚Ÿ3ðòìºz­,¢hwO”/€u ˆd&GS¡ÅÔ4Ç©w×îZW‹¼/3%4×™…xÙâ+[Eùù®5ej= $ÒX-`eô"€/ÑC!¦©³­ó`÷©˜‰vO‡ T–“s6u;r0øù®½uÆØô]W{õú®Íú¯Ç¾-S-Ï)¤ ô½|—QS˜J1X8ÝZ4Ç–2æ!ÖU©êÖÕm°–XSrQ,I›t^ÞðÛKßü*M2µŽ}TYÃHTÕÁȸ&›€AòÛ™wzE/>†¥ªV(Ÿ…e¢ YýÙ"½ö)1C÷—C5ãº[ퟘ]ì³s¨ƒ&RÊ­ÆVõï ĺR*:Ê *#®åúä ­«¹m(¢J ¿ëÔv*îr›MìÇ6ÈÅå-µ*¼¹ÆæyeboÞ5Síè²ûõ|éžWeM3•oƒ|™jÇ£ê!ßÕúœ †çŠ|gØ4lùÎFëÂ%Ð}úã^él>†:º+kKÝþrWšûŦJŸÊk2Ii¹ëªY‚n¿¿“ü‡À€$P.$fgGŸÕ“Õ§Žñ—æ´DƶºÒs·6pò1|+8©žüüªjd•‹bþ²úÒõ4ÙÔÍèQÜåâyi ¾êM²Q DeÖd¯}âCo² /ةڲÁ“=Ò3™‰>kQ7¸PÚ'V‚î— Œ ÙØÿB°Um¨v7ê¾—ÞKe™XØTþ Ú ¥îäû³P~—IžL2#Õê“e3½ö_ˆ<ßäØ ¤G*¡^FkÚ%M*%¿ŒÑ’#+Ãëj"IŸhV$¡ÊÀs. ýLvÔ‰¸±oZ—_iBµ  °ÄSSîÈ©Ãào½'e£L:ygT…„wuä7'‰öÂ]A¾Û g*%[ùa¿êÜ4µjìiXôóØZÝmM+Jd¿PÅíyÕ€¾~×9O—ÍÓJYü ¡üDžžý‰Qƒ}#D¯³˜(AOã¤Õ@ Xý.¤¬ÊÜF4V¿†§Ûáß) jÚR—ÍÓ—Gîqrš7ë¿D³T ¼¾’»jSP,“N¶ŽA7˜`Ë!‰8÷Ãø{C“J”h“@çVØ ^{¦ø˜10ÅG"¡Å­Ú†jFIEÇðg-º«:Žª2#ƒ=™¹E¾ŸõÚgû;SίµÚ˜Ÿõ‹_û, ¤z+"^§rã Gú=]›ƒÖ¾^PÛÇxÝýjV~Y¡%{âš­‡JÛ9Lf<þõÇ‘ek.ÖþwNaFTË‹v7W&™‘¡If÷ñ4!Ê\O뿈~22ÂÀ¿ÖÀŠ[ƒa“¶,¤¾¬h)ÓŒTËNzV£¶d§ Ð÷^„Jz†'ß幟 ‡ž %úo³æ^ÙÜJñQm=“ Jr =Ñ…gMÎÄ; šva<: áw,¡ãeföÙ–8;Á4÷êŽr#;9 »KïøXJ2ÆOÿ™ÝÕü;¶´-uZPŒèêz7ú®:)3LöE l-MÖ…¨ËªÌU?€dhšÛßâOáÁ¾[”_¢´mIN}ÙT›ÔÆ2(ËK½øN‚lv¦án™”†Ðc1÷¼ ‰©FÚ«åÕmÐ|åÆË7¦uá5ÝZE‹>H[².ŒÈ{Z ¶'šXéÁ˵r—Ò¯îbû¸CrŠÝŸ„çÔŽ ü?ùfÁE£¡c·Ãƒ™Ý€Kzb›^¤œ£ár£zëÇ›ª)¶[»¦›þ)ŒiرUsxQÆìúŒÂNïþ*$q«žg>Dµ^² LJºŽï_sžÕ–åê|†Ò®¶ÞGØ´Ž¦:­ÎÊ¡ØQ·j§°ÖgP„‹Ý3òSúÆêJµ¼‘ ­;›§ïp,gçXÛ!报Í‘’q´xúÒ>ܾËÓß{Möê[øBºPz•457§dm‡˜¯IåÇ¥!Õ`s6Æ’$öpT3‰^l…IL G®hFþlTª¤}ïï$)ퟒRå6º&y£½ì§ WÍ58öeBË6Ta~æY)T©åùgý‘'^W]ãV´v4~w—’¡Ú3Ø3Ô˜¯…–_bî1 æghM=»£ ù<Ê¡«˜µ · @ìÎ(¤û÷QcÐ]•ûŒ¯ 9›möñª[¸-³ÅÑ.ƒÂN,“°Ò‰Ž^BäW„Iö±öØL2Q±—EƒšÜé @¤‰âÜM-Ãi,*N)£½Ä5 qÉm¾|ßÍ‹­c%—zLaZn|~ ˆ9©ŒE\2‹Î¯Dˆ›-­2*™]-‘Û>cÑáùWöX‚õ~c𡍠ŠiÚØ2ÖÞ8ª'M ˜ÀVµ`¥(îÛ"«dÀhGÎÑä¤0!ràg «òºcx·Ÿm [² Oý³ýKy¥Ú!>ÿÌ™»±=„|Æ’“lzGf[ßZ`[MºØþÅærÜŠ^¡›ú£3ÓºÄDQ}S¥jÏü,°· 9 WŸýæÈ>Žáûy`ÐHY²¯'‡Ý1ç¨,-Ϛ̻Vü\c r*†…fyfIu<ì#µñ2mdõû%3txB!„Ù®' ×ÏF«}÷š”@Y÷(>`.ß~L |eÐÎåúµ‡2!ósìk΂φ/s6Î1Ñ|üP]f¿ž\\ŽŸTá–½’+,­fÞüÂeOx¡»<'øFfáýÁN^]½ßöG£tfÞì_àh_ –Ùn_»Û|Á(oG÷y¸´ÒhCc¥«°×ÒOªQ‰'=·Ç8ég×6:ÅÖÓÏÓ‘^ì->ðURV)šÔCúij>ÚК¦A ñû-D6™*9êQ¢A"ëÕèùNwɾàÜ'IkÀ‘6eîX>b?¡ï^™»«|꜔ÓCNmËÐu1iœKïÕùFšüÁ$_}ÜEª²Æþ±]Ù§KP%›ù•¦¦£MS»´))Jv&_ Pã|ý$Vìÿ_Ò@«4 Yƒ!K“„33$D -ÿPŠâ¬’<7úArŸsÎsmQCî~-Ýð©¶ØTÆéñ@‚˜°iÏ/Y,Á¡SC1ÆÎÒò±ÓcOn³}vg“sâв[l6ùý ã‚û{ŒÕŠN×Q+ÏQ¹÷+$˜ŒBZÕ¹Dw~¦¬Ù ªÍk5`zÿæÛŸNf–ÖUfŠ¥~C*k·hždÞŒ)Ê ?kùX?­†¦Ö/×gj“] 9¯Äç‡ïò˜wíó s8˜¬íy‰ñ£w½ÆÀ3鯙ç<Ït,uã<Ï5Ö­³ïÇ'ÙåÅhóõ¬£Ë Ý·«9;úJÕî©$­«­>þÎe•¼ÂLWë»ø’ob43nÿÅ(wÓ†m¥9(,2³©$—º–2%x=¥´€_*åñ\ :‚éáéZYd÷œ<[`øêÂá€;=ZŠ3e-’L»7 ZŸÕÿÚ­ˆìÛÄ=….ü\櫺^©Ò‹6é’~/vò6Mm/iþzÎt….£½d)?}͔էžÁtÞüúªÄP(t¬äâ0MVÆ'y¿Z$xb5”¦2£%hã+ÿ‡âpÏ ö;¶Çxk”, #lùÍÂr_ÕuŸï|1}§b=:Ö—Pó3µÖÄ v4›Üº‰ûÛL©!J­ê­4EÝv‰Þ2® a¹Z›_>ËL5<´Ð{*èaèaÒU®VŒý„Z¨q†–ð T-&~5±"­”Rn!êÈI¬ÎÍh]àêdu^j¯ÏÔî®ùgj½HnUº§Ñ ¨Ô–%Ö”Ô4ræ꟥/6Ö çeùš±`I× Ýq˜ƒIü #vº«ÒßõÝV´F)4Æí½K¨!ÔTjÒ˼‹Ù)Û€YòR”ÃÁ¼É?çÌñ¬œJiÆ âFÓhj~m©Ê2ð©Ü‚ù/n_õÏ6Nò¾Têþ0ë\[âÐaù‡:ÿˬÐ?úl¥oxš;FS³1…ÚÕÒ bLÜyЬ¥(KT‘>cõ>¡p¦CrÇõ´,B‰õÀû¤°w~§‘†gÂÛ]"ijeƒ-„r{Q$ì;^‰Wæ> „#í>Ö w8‹¯(ìƒÔ9#÷¬©- ½KUd(ÌlÍÅžpÆctR¶ª/ ©ºHev…ÎLkÌ8mžFëò¼$ôB£'~'T×ûÕ@¹ªë#¼b‘Á$²èÕüR{u¢‡›šŽP/t…¸¿u+tȘùý&Ûåª5`ãi<Í›K<ÇrünXäañµæu¯»3óI-^e§/â•û´¾¬°ô.~GS·žiÙ³ —(Ñ®êúi)´~Àøc2µ«‘õ嶇éš ÌÈB’ã¨H8—£÷óq}ËáÕ[VZ§ß8`0M»™"~”Hk¤g5´³ç6‘H,&‚(a˜“{¿ù“zw¬?ÏŠéßÉ r%ÕuÀ9 ýÔ“IØìŸ»úT×o»ùª®[ªÊ£œl-m#ð•ÆxÞ5™OÙ°ÌA'²2‰s8Ç$ùŠÒ²å¿í&»@Jò µÙäBqlI‡4ËàÕá¼nO€S(w¹FŸ´Ïiò¬îáÒw…‡ÊT êÉß e^¢è0”OuÝê§1?¬Á·a¦Öç÷Ùªë{+Qòeñ`ßaâU]_ìiÄnpeN~j¾Y¨ÛÌ<_!ý]É4à#~(ùý!Ù¾›âŸ}Ö³™‚H™íboí[l Ö¶Þ¼òðR±‚ä©fŒâæ3¨Htó[¼[7mкê%ä¸uyIíjä¬[oÖËÄ|™(Ë-uyC±§d‘÷Wi6c´©Ž®íƒ:r5†24}”(ù­ÙÐJíñ˜UI°ƒÁ†Îgæ‹HWŒ4w$eBÔ¶oDðéÒïÏÙÌ;kùÆÓó2…癟(Ë—¿Ì_ÓCœÆh]dÈöYø¸ÇðÖ‘ua%®bLv;‚7®óà\†»«ùs2ÙÆJ3_z¯Yê•á.<¨%;}ÑZýz…W¦yõÆ BòØøÁ¬ŒHÖÆ×íŸß|{ÜÇàßR¥u•«Zb¡Ùù2Iàç•E.®TcTª£åP.ÌaWþ(É n´ÒŒc—¾ÓÙ€€–h®Ûþâv©õ¹ Rèyö]mû®»§È]`ÆâO<õ£r1DοßüfÕJm~ú[ßSýžPùV÷æ‡\­1«làÀ6Z«4wBz/xÆtCØéÊ4ã±&?„5{ƨ5iw`ümƒ¥%8K™\a5\è3¿¿ÌðPu®ÍR`­žÛ¼Kv·1ÒÔ"I©hÁ¿6Sù¬Ømð.<èvÞ(F˜waßóú.<ð›B}‰î©ù¥cð9 k¯yWp"È-"O¢›âóiÏÁø×ÒöqpVŠ¡Ç6Ûä/µ½%‡¸&³õìC}ºq«wæ]ž¸eÔ1m&a^ý&}w©©¯Ìé>0[¹ézø¸Æ&Ù‡9z·–Q˜ó÷IëD‚åþ©ñék–-}ηGÈå>yóÕÛ‰sÎhte±=¨Ëý@jj!ËiÆ·¨‘ –!^öôBûxXÍß WºÆ™Ÿí³è™V^!  BMw (áȸ}Xʼëªæû|Â6»CÇÚÛææ¶½¾§¿‹jAÏ÷õÇÑŠT^Áî/ô§ÏÁ¡ò4!6{düà÷Ÿ±boœ]-¯½sŸ«+÷k¥ÒîÐydD÷¼´mÞ¬ÿ¥Ášq4þ;6i ¢˜|º©+ýì‡ÎZ|ƈ¦–6ä9Ϥ²K&ôUeW÷s6?³qþš® “î¦C™Mg£4еQe]³•Wò•Pì€3&®0&±ÂÏØ¡P)š—+©(£3Z·- ȯÇ膢—ƦTŒ>Ì𗆻5 ¶Ze2/]PóNHPtÐË3ð«=…)p´{"üâþtà÷§æ×,M˜vpK±‹Ñ/¥uBfªövŠû+aöÛR Š„º¤ÝY?…þÎãKË@-ƒE¥ª-×”©+>ðY&4(ð§³b_3gNŸ*ëb ÈFöÜbcb¥w×ó6á‹mº/L¶Q˦©íCŸ„ ˆqÛ“X2¥‰T„íïeé M.°µàH£ÝAŸãAp´^iÇX>¢–ž‚˜ê_“ 5§òáUFÖ¡ƒÛùѺW\4(è7k#k7asÊ•ôûÀz{?úšm7iÔÞ,„Ã|fÕÐþàбô.cµ¢š³¹Tyr 66>ÅQXB¶nÙ4GÓµV6÷‚ß±1 ‹5Aÿ`²Ûš¡Î~WÉvz¨S?0÷×mG™M±•a2öÀDí…8ôðXMÀBT ‚ãÔg›ÍØG·¶×ô(-ÖÅÐ’¡i±©Ñ™Ñz«¿B•íãºßàKmà0É"¸-¶2…‘X9þ‹Ì­l%aìõû[Ç£xë÷±—Žvº0z;ÉÅÝ"y¤ Qíø‹=ãûaSqmÑ$÷1ãÁòo–P¯¹N ¸Ÿ‰fל5ÏFOÕWá…ouNôO*éÞ}Œ`µBS›ƒØœŽÆÅ¾ ¢¸4(÷„ÆD ÞAóãŠC¸zõÉÑ_LUŒå‡¼Èk|é³7Q xJ®MÜ^—DüG;<À:±põþa¦+D8m&S[CÖgj¥gÝ —¿gT›K=S óePö.Õî#\Œ{Ö¥P6öúÓ±ÞÊhP¨ù²_+êW‹X™(™¬ukW½K"îëHÝÓ ëáä{€Ü–•aŸ2›sê UÊ“š„t1â@ÅCU×gSõþúÕB®'£…·rk¨+W¶²'Ìû#¢Oü¨=+š¡70µ8yÊЮ;ÖD†rÕ’+\FÿÙ£QGÿé…¡Ö€úé[BÀKÙ^åNlíTÅàRû+o3²„±ØÌUÉ« ?†ÇQªìnlР‹ fZÇ–w¨£ ? š ù<Ø‹YS(|LøÕ= ˆî%¶ŠZ¾EÙsø“M9 ŠÓYúlŠ·GÙMc)ÐVÒ%SµUä©LVì+8uµq†¶;Aí͆p˽Ö†Z@áÁÞÄÅ`W²¤˜aÌW®©…4BÆ5$ÛdUžùæ b·`SÕìr¨˜^PJ”o¯ Õ=D&Äý«štqA“Ö 9­«]«ˆ è;±8Eã0­ë€ÉurŸ±G ”ÏÄVÕ–ú½0({0<Øäœ?¸rR#2ö'V7“|e“ìFãCóåWW,~ƒ\1£d=§ØÛÿÝÈø·Ñ7Š[qú¤XN}9TÖþ¤ç<ÂöoÊYFùÀ¥Ú‰ÆŒ©Ÿpu/¶¸U©å'LÏãÙhCîr·µ –¶±Á]ÀÓíˆüÔôÈàlqãÚ+ËF¿á÷—ÕäDéçn7fª _àõL±±PX•ŸHm|ÛúâòmìŸi[ÖNUN×Z.?õÀ7p¿‰ò4 0cà3.ci=Þ³Èw9q—Þ?˜=ʦq/ž§Šäw‚v0d]Sƒn%a@EE^içʇ›}d¶±yrÀf<>Á“vM#£¶±”ƹwîuïòp©ÛTz/ÂCXëó'ëV Gv‘ µ];Så.¹¹Pû8y.ÄÃ/WîÖéwШ†pB™-.Ô‚9©±]Ñ\§÷ë+7> ü³—TŽPÿ»ñH€r/Ñg˜s<|ÁªGÏç¨/8’GË>§$FpàìBª­ –h`§Ò:ÿþ:”_ìñKxTÒ.\ìº˼ 8”:X¯òçE[줂ågûYàœ¢Nj#ñì-i™Ö—ˆA…—8nxg©2¬+±Åp¦õ¨Hð·wè roW*ƒì˜´E¯_È颅)½‹¾^æ–,éJ´^:·ÓSD#¸Mßg“?zݢݓD™'†Ý™(ažÅpŠ·ÞJYÚ·µqrÉ iÜTÙº’ôô+VVÞ0‰±Y¢Hn èÿ}!a´´LÄŠh.çžÚ‘ŸÅúã ®þù й»¿¿rrUÇË÷Éåþ˜T.zžv©H.;œÌá[¡ÙØM¿ƒ=ÅŽƒÜ–¦fÍħ »&cí[ÆZjR€ PY·Ž€±k“s÷Eë:ó.ixKœ"¢Ü*;{ön­äªÆ‡Þæ$ÜQ¥uÙ^¢ì²MQ« Åzä:û« ÛÞœzF ‚ýŘ"5ÎN°SÑÔvd3¼ŠRV8.©ò@s÷ÛX*dÀDߨª+NùÀ7­¾²Å6¦Q*ò&™½P×å¦x¤P$ÄAVñr9Ž j']]8¥TÙŠWVD íÞ³Òjà¨e]ËŠè0·{žá´6¶(¨ˆ›ŠÄ¡]7Og­ëÏzýžâB'hûøÁX{‡»«­9ÚØJÃ;ጫOhÏçÕ}`(QôbÜJsØ{<Ì–X‡ã/ÚEû¶û‘ZÂCç^e—qæºÂ1ä ½Ž¾= ‡ô¬ ®K´p¡ µ–ëY1ìâÊ©'•aÿ¾ ÇNí¾â4w ËêdvuæHsè/ »òçð²òÒ aNl\³d»VöPsî2¨!¢7/3_óZ‘•óÖ ­É"èSÇL&˜ºæƒîêK-L?2eÖÛêæŠØ?)uè¦ÎS >å¡–$„ÑX+ùšc“z¦uõ ŽküQ?Fw…|Cv×úá¹Ajþ˜ÚyÅ·-)ÈÚ® Ƚ½š—çSC8=KÀ’.–0è&“È_4©Ó]9ø³¾['¥xeOwašXÛë ‡_Øq¦Z‹Û¥}½¦›7[‘ì¬y®EG¶/¯á÷f[RÇH¦Lº¡dXºÂ>)Y0M¥žBÔu)_€š£ý¤=úiãjVö; ª <,W7–^-÷á|Fx>gm=™÷!ë~<ã%•»Z™ja4U¥º‡¬ÓºæZ•?rw•šé!í$%³2 uW~?¯¶7‹H˜4š@OÈ‘Y—¶z+%µ`އI2’­ØÌOGMÜ4(<‡L”P[®hbÐ(_€¥‹.wåþ|1·‹d^€j%°›eI‚½\GváGm¬Þf³Î„º”^RÃåb>µ®ÞõÇ#AÇÖÿ¤Z†r)žm÷ÔXŠ $Ûhàª!€‚•EØq*#Á›’i¬g€d“:EÛžmg ی«3ŠDÉÆÝIèâ~&ÁnHV¤¦8ŽÎ,´!ÏðMmI]ÕÖ‘²Ú9E™e”L‹4@º è«T©úm÷y?àè²e艆n!ÃÈ¥˜†h¥Ø›p | Êz(ô´.”ül®¯A*Ñ¥(c-ØF}øÜÇÇZ{[5ýc|d•®¢ÌRä7FŠ'ý1BaÄkû©]É»B¥(,ÉéõÆNØšàÆŸË4.H3†\!–Úù—Ê«Óæ#»Ðï]ü³S帳Ù+ü‹½\cÀò;’çi…r=Ìø¤Aµ:’mÏ»¥í‡Ý”:-zŒ žOuž.cÏçÏ*Jãæ•ÑùŠ„YÔ¹À…ÓÍú½nz5ìÈÓî  TÓº<|>Â"g=r²³¹‡)SJ« Ë~ˆN‡=\jfSì“G3¾E ”ñih¡³ëZCÊÅ~6yîé¡YÏýé*ܬlP¹ -Ô&tWˆ4¨¹Æ¦W›mHZÝ_òY:ç{²ãÖT ôË1ù ¢Ah™šZ¦X ~à~cL:[³ñ¥C-gÒC•-eØÑ)x†‘ý ï_U6‹?ÇÞ‡g€Ð:}2eº8·ŒNëÚ·×›úŒ,3Úó)2qH\¡Ÿ,ߣÓÞä_65t.–fì¸R¦ø½ -±©±³•bô]ójn}Öuª8KýÎ32à“ò ´dÞ\c™ÉÌ:Çè®ê¤Ðz¼ŠÁ4¼Hœ 4Ÿ,Ág‡Rá®lÑ‘yf#)ÐEÙ¯à>…ÿ $¿E§›Ù{ /™É6œi·¦~ eé‚&Ñj‚݃‰€ŒN‰æyðdW£uÅ¿ýø. fZ@ƱкËÐð°@‰]Öh(LÞÉÛ&ýÒXW™“ùYq‹¤A­¶ÝÕ¨óȺF>»àÙ_äM«+ùøƒù1ø‚ka‰óã»ÁÀh·dY‹NÓp$¿ŒŒXY£uy|ô=MU“Aö$1ÿaö%ê…Š C»•wí=e)žD/”‹©–_Á¡9̾‹¼Ø£k]¬Þ>¦05BúY_…g¶ƒÆ /ZWï⎌þÒ`d;åØâ¥oÙF¹xùÏ'ûX#È0ßµò¡„Fuš¤?c¹«u¦¢®u;@õ¨¼kÌÕiûÀêɺêVkbÜLϪFèï÷D^ºü fOb·›ÖEæGX×%z»ÖÕ¦x™­. !âÑwAÿÀÒºüw„ÆÊEz•uä»<RÞuº|—_ÏQz}¦Ñw?A¡ 0¾çr(â5™3hPcg‹2’G3þÄ=\yÒ¸J-˜@ª—æ5ú£³êd™q:QW©,ˆ-z¢¼¥¿õ<¬øP(ïr¯¶dj½ÊºÀ1B+ìwž|ísWÖàOdÅИoD[óÃËß¼ËóOf…… ŸÏU Öƒ¸ÆåÀHÜßA{‚tDˆŒ•û!†o[̈Òøî<ÇG©ReÞÕ'‰$Ã>s¾&.¡0 ï}}W[b—œ:î¢J$ûœl¿|[ƒõÚµ1ï‚T‘BÙ#<…·DÝö [•©y*)wURi(~ç.”ß´§–]¬:>=· U¹¼T !ØñÜc=Ou?4È@Ãñýµ¹õžÏšRµn›¶qZ3†¿Ú,ešƒ¤4T=]îjN©ÎŽ{A_{ŠtA§}û£·f\G‹d!û¬ëî$ܿײš—M)2¹ƒ-9»©h¡÷ì¾OòÇ]ý„k¦÷ûö' Mm^’ʯ®[³ñÀz‘8ûj¡ `Ò¥Ì ”º´¡!¹G¼±ª9€û´Ç}®’_fÌdŽÔªÜ¹ë³õ»ìh––R„@öô»lT‰+`)\6jÿn¿ 4¥êÕûÊY5°5Ià-8¨8ZtþH眞sÆCˆä\l³Z×êÌÈb3æŸ)a§G-ºšë@KÓ‹Ô¶Ô‘o›²{¨œZ¹fDãA1uSc¼"…c>‹žˆækw~KåhïcKÁñØÕõÚǦwXÌ#*RÕñÜ©b ©§eŠöK†2ÜE}¥Úç ©•M•4\PSøSœl§‚Wý÷fv5/]Ï—j•=øp4±L´EEŒQU3NäŸ×a3÷üsN8NCVH%— ׳ÍAöQÓÔÞåàzì#Á¬yçé"p?ûQdj¶ÎƒcèMyXòejãú»o ê‰%3·uáKŸ»`¶¯.(¦<‡ìvÌÎáNÞ»<ëyõm‡;ôkj|õZ`cˆ×Ó6¶€À4Dçf½> €šM–X¹Ÿ›¦†ÜŠÎfÛW`}Îsk9%Ûåå±úPnäÚiv—þ*¯µã†Ýœ;‡p³“K߸ ‰’Å… m²Ú’4ž5n“®IšR§°=1C#+O:%Á’7Ÿž~_›i6˜D{-/¨2x¦ô`[™î:5¶!œròq$4 +ÖéqŸý’ÆÕ+ÌÁTxZ`Û]èÁdê_fMŸóé;?ÚÒÒœ”àeÚ34ÞCýJ4¡¢Ö]?KPÔ ±ÍþääUØiO¥ÇŽ=)ÚHbôàœ2(ÐÏtã^#·6€HßêçYrcFaØÏ# É^úpðñ“³µÅI޵\áê÷íkÞ£­«z"Oë‚N%c¦»ÜüIpó= ˆî]rѤ5],cë*fIæ Tn>®ð£ÐºÇ‘Wë/È0á£_s¶¡d¼4‘÷³™R§a¬7wÿ"^È+œÑÞÞÕHƒZ§K)R0tWeidmÊüÂ[­B,àêbî~®.ž[€úéý*¾ÜŸ<ÛBîÝ%³íEÆã ·`ûÈZóñ*ã‘ÚCd;xúBÏò¨®CœŸýî&ÞwÿCé Ô$ÚŸäUG7ªåú±G[ý.é~WÒ¨_D¬d¶k™9Eû Ý\Só›”ôÃÖ[)̮څíŒ/¹"¢ßt±ORDÇ¥%,ye×¶™åÖÛ7S«ò¹“¼Ï‘q§2™eŠGÉ:Åéæ.¶é‚fI•esÝáëgjƒòÙ!Ý¡±eÙ­ÏÕŶ!@ví¤ö/I ª+(uýbßrPããlë—mΨ­4( þ Þ_[)›ñ"¯I_ómЛĶs‹ú AìINvA¬¾“ÿ²`¡‰ï ÊCu ÒwÕ«e§5õ1OÛrP£äâ9 Íõ¨þ›ÖÒŒUˆ%P‘Í\¬À0êÒ ~É•m’žh’®êó¡ÞñbB‘ˆQù.´Üh]«0”ƒ|&M ÎV¬ÚiÇÚJâcƒ’ZÙ¿g½›ÞáYfÀCPF\Fm(à/ìaXÂF¹2oë²®29åÆÌ§Ð€+Rt÷<—ûp (’GîñéX­EíGtH›Uë‡/Ôov˺Ú|6·ª¥Ø_8²žÞ]É«_Øgì"é*·<Ê%“ ùý="ÙcnÊÓ ÀõßóAAO †y¹ùÆ'Ôý Ô<ÑZôPî³3¼¢¹Ðºú弫ÁFú ÅÇÅDQNÐÚ5” Uæxº† 4× Ïh“uù˜]< þ© KËÓaø::B¿¹Ã—ŸuŠ5B›Itèb7¾LTry:÷q5y†PÚ#§ÞçÊá*U’™llÝä%ìØ3Õ>ÜÙ)†I×1-™ÃAü%‡Å º>©ïAîó~Ü«Û\OÆŒö ö4Bë×Ð…Ù4µBº¥à;?‚é{~[=J¸•”—ص«QE%ÝËÿ¡‹½¥oë×Ýÿªx$0ƒ¦ªg ~ó©ÓG¾Ùh?[‹{<*i£µBßUÖKZSÊ#V k.Ã`:Mt9(ؾ^¦öàðÔõ,®iº@‡!Ï¥Mô-èâ¶ö¼ÁAÍE”ß Ì;´”jMRØmÌœFaqÒ2ÐÂX)ñ Æm£dúÍ3›{ ˜¶çk¾—ê Ùå¼éPÿ°9W».ég&S òJõXaIl¤XO7«0ép¦ÎS©3ó÷—d–'ëCØ 1…B‘˜æŒËêtWM_°oQ«_EøÏÁ%´"í,aÐ\(ZõÏjÒw¡Š¢o¶dN ïà…\²‡Ó¢ˆ@ÅË‘Õ99ú^âlƒ>§ ®Vºd=k›ƒùÙò¨4G›¸’ ™šIΦeƒ^„{«èxNk´!L)‚›ÊÑšY÷àÏÖT¶Ê0Ž3Ÿ•ôNéx‹ùÚþï ¢=±h]íµ.´w•¿ôõ€¡ õÊgÌ’¹´TuÓ pt…¸¿¦3øï¤Õ@z¥)'÷pÅÈ §Ì6.¨‰-âxâÌëîkJLmKf-ØêõO­j¹¿Ñù×\éYû.”/@þÙ“9>Hg&±ŸN¯æ±PÌI@Ñ‘Ù*/CÖ›n ú½´.lð“F-JÐ…¬-Dìê– bdnErëºlàà,Tó@$cÝIÙz›ŠÛkî\7vlÌ'Õ*’Å 䤄¸ /ýÑgô²NГ"8ä/©‘…̦³|7LJ ¥ÌÛŽ½Ë·sÓð¼&ÞtJÀï ÔÎ#³=È)hRÿàbýš»Ž<7ÜLíϳº¨ GöBÃ[•“Í…X¡Ú¤Í¦Nœw>!/‚¨þ ðÃIø }šZ¦³·§Ø¢1 “”–ìTwN|”Ÿr…š>2µµ„·ž})€z†ÁŠ[ßoùà/µ:ùKhüò'Pq`>…–¬ ÜR¼:÷IRÚ³Âm¨ ÝД£ˆk]3 +­kÕ)þ®U¦è²@{£Ì¦?`(wõê†{&2Êp¯Œ­³ég»›69ÿLÚ˜Ö»±¤a…AýsA½ÓºÊe¢øš •»Ø_§oM{áFµŠ ϳ¡Å¸mÖ ŸÐX_kçêbWRi/lN¾²1¼ÔÅ~Ô[=´J Û#pcªŒý :‘^Rù6°©ƒÌ–!ú;ø#P ó…¬ëfgñ†œ¼mþ!/¸S‚µ­t½ö™EB,XvTÛÙ…Bø;Sª³6H ñ5êwUZRÔÐÓºBéä‘ÎiDðñ7_¡„Oà7µà/¥#[Xˆ£u•9D• œ8½Ô9ÃôCêÂÖ‡Ú¶{T¢ÏFLUi6íªÜ]—bâ!Ó-ó©BötÙÊ?0Ûyt±ga‡¼²èëÁÚ/3ã‘ÏR§².Ua ¨HSó`1hj^:k«Á«‡Cg®¹ô¸?¦Ô¸¿qtPÛÓ5èûÙ%Üu0ŸÉxøóa}¦V¤W/Ͼô…t… ùGödëláöÆàÅ ©÷áN2Éd#UNêk¤£§u}õÃ5(Ô­©ÎŽñôe Š˜‰-¼–¦Ö@«LSÛz@9‘'Ÿ’¡J㦡H60XSìMýò˜ß"¡“Ù–ÒãÚ*&’ÊImà š~Pî4V¬dõÆkhV¥ã8U‚LoIüc·“YÅâÿB낸‰F ÛžáÈ\’|ݶ+CTmÒ£XmÜ¥Çý1«û«´O°†ñ'ãÔÆ>Üç9¤ôˆ‰ûÔø½ÏÚøï¼ò*ºîVÄúæGjÇuÞQË×/9K" žŸ§ø•½û‰BL{”‹÷¦Ö†…ÁHGfÇ’•~Çãêi] ”£#kkY—ÿʤدu•Ý'ÐòfTr‹6¾ó=ÖÓà(mª÷&5R]S9]m¤¿GšJº05ìœóÇŸ=OŸ^¤š€ÍvÌhi]X<¸_&°–J ,ãÎEó\Úy9bŠÊ|€ i(¥JPQº.·7° 앞K.´š]º:è6ÛgÿõvtA”;Ž} ܱÎÏIWk$Q…¸%®1G]%ÉÆg›NÔ±Z>!ló§ï ] ‰ãÓ¤#ó$çŠ"¡æ/T.Æl‰ ÓƒWUû¬]]¬ñ¿LÍë QBëæàæ=@G•uÐs¨÷1IȈƒó´H¦å,¿ÓRF5F‹®0XÍŸì±o)2@e[ Ô}RbS4ªKÅdÿ•Αv@Üyeþâ¹ñ–©íòx5;K¥ #ºÎf.‰C¿‚¿=0zU?é©N9ù:œ$ ¢5ÑèæÐgP»Šü¼Y“*2df8cïJ¦3¨¡Nº+ÏLS?4vÈSºñ¸“•Áb¤,ZSÂvóІ lX$”¢û“*Y$ ™_ð?(YÛãÇØÏ6·g³jÛ‚¾Ri\µùÜ÷%°P›ùe~ö9éýP(Ÿê“ Žè«”\2ã6•5#*WxêSCh;åZÀõ¿2«Àzr5©®ãÎùÊ«êp&"B/òÖU‡eV\[r Ž™†·6„-®½¥©Å.ŒúâJÃ稺†ÁÜá/薞溱|Àlr/¶_ÀN•ŸV×Íš›šž'°©i(Á6ÐSM/æ<9åjŽ|âs§§(Ëb„kP3$méÕ¬}ûÉ/¸dnmåg­¥9ý éaøÙ¤˜ »>híõpÊ{O¿Áì§E2¤ð£á?ótñaèé@Žäê(Zè—ľ.~jÆ&¬§ÆD”–ÄDo.{…€EܽÇOxãì§õ8–þÎEÔ™X­GB9Ž^CBp΂-'9  Bp®s©A…MÚ×3¢ ‡{i2¨”‹¡õý@OmL` ™’“€ÒTgG2sRYþ`Söë[ÕéüWRö2êºë÷?¡½TCOª§€,LmQj8ÄDShGókÒÔÊ|äªGo*¶#_Â^ý·÷Aïçi®Ú»(4iP`ES Åœ5š ·Ï“CÕ赜+F|NÝ쥳¹ó‹GPc£FÝ©oµ¥uèãt™Ú~¥:©aw¦I^ÜŸzàf¿l ÃŒHïÒðõIÂH€ì±¥AÈyRtf#w¿ PðPíÃw]¶yŠ„Žà‘Hß…b~Kuh¿–å¾4SüàVÜélpKeñI YGŽ˜º®¡˜©HìJ†Ó1å:#‚nº5¯÷¤´P/ÈþÓ8;©ûµw=²œ.gž§œZÒó=TC`-9) \Åù~¸ì»tnK¡õÌ’.ˆ5^*ð“«qö‘]³ÝŽ3G§8%5ø0zK"Ò~fÕkþ¹p $îO!Ø~…²:VåùX6^„Y¼T\ߨòÜEá«5eƾ6YÖmÁ~Z"Yñ…=í2u³µ´I5:%"à (G#m *}Sa†nWHàKgû©¬œl§èZ4F{êèt™ßØäkp¬NmYÃP¥wðøfŒŠ–ú¡;”)U1ÔN!ä Á÷¼Z5¶H ƃ9)AûYîÎÓy-È¡*˜|†Dó¹ÀŠV™èŸA‘Ö±i]Õ •§yš…©Èê©‚£¾2¨_S(xæt¤ÝõV˜ÆáþÆÕUAvz‡¸¿T”"…èb£u¦ÕÄ|_Ò7¶¤Æ..h~é—“Ÿ  v«ð½˜Ê?4³@ޏf´¡ÓÇP‡A&±F@A3«÷ܱá'…Ýó '²¯T¡©ÝªÌr²˜¾«è›uAŸ£³.(—ä>¼²OW¹«ôÍQ·±}Í¡¥èo¨Üe ºq-¿ „Tyº…ÜèЦí²s\™í~®4Wç¬ÌÝ{’oÖ2‚ð`A ƒ%£ƒªõiî¥ Ø×~¹Ò+ŸAÍ•½ú Üd|0Ÿê:ôhÚW ø®ASkëÈÔì›ã|t¤îwÌ~ì)Aýeª.è—8ç+vJñþYµ$Ø÷íÀÚ‡ ûf´Ÿ9¸y¦~(ˆ-¦´Õý½¤˜è§gŸ€fª¬{©?ÅD‘Â1°Lì;`$C¨„aØ¥±öÕ)Ÿ¦xÿ¯êz­ ;=ŸX^Í.Õ>ÝèÌ P‡ÕëüÂ6¾gšdë ü‰ûkü%»õ¶}rBŸ>Õç>÷‡Ä¾‚Šwuý» Õ3+üäQhPØÝyà¯|ÓAùõÌ»¢æO%Á¼¢Žœ‹ ÿD²‹=ªë˜ú×ÿ®ê:à¨%M \Ü5M­îÒ@ÇÊæìoÐ(ee6Gönvuwh³}ãoh¦gdì–ïòt¡3ûðè7ø2k?jcxphŠ=w`ûµWÝÊ›Ým«*óû“»ß_fMèè6‰mžK*aw:aä/¸õËÖQ?›ðf´!,LкÚf 1™“§ƒÞÎZ4(0^¬4¨rYµ>Õõ u?)P¾÷‘±Í•¦Vnx~9ùçS+ý[ ·Û·É2³È;,A3e8eÚ핎^sãFx³¡»šoé%ãqu h¬ušä¨eó'íŒçÜçŠ'í—L9?ƒª“îª+ÌýÜ¡Üg-›¯ÚšáÖ‡ ˜‘(Yù&~_¿Ûb*b“å{ ‘lÙÝå'»µ¼ýcé¨c|TÏ“•NcíWFõzÌ®.mÑL›êõ‚U™Y²kÔž­OÏô{™0ÿ«¶æÇ#Ñ©>áÏ÷ ç7›©°‚åB¶¿Tò‹óßeµŸþ©sóeö½ïü\6o»ØÔId¿X¢a/"eà$j±…$u᛽@tÆÌº áb¬:aCšS-öAf$a¬@PŸÖºÏ~Xs`uvÒûÙÊ$ y%…t£ð-÷ËÜnw=sÖh®×ÉÌÆ.¿•]hº’Ï”wbo CT4û·²z/‰Ë›ðoVØ¡;ùK{ÕÛ 2ÄÞ™„íSÒ¸ÆD7´ zaÔ-wüs’›¾ cË¡¡Ý>›J“ÄŸ¥÷ó×ÒX»­F)ð9›6¦É¿ô£€:0°LÐûÕ³K—õt$Pœr(î)bŽ-'²«›ãýЄܳ’ô<'ô5Õ‘+ˆZÿµ>Ë·­ ª\´zyPeF†}£“Uu0(Zö&ú*•Éš;›, W¡g]ÐÖ‹êìªÌ¦¶T•¿Ð¾t»ƒ—¯×t±q_ ÌÒ†s²_B5‡“q©A÷—ëƒÀöÏT >ðû›í ÌÛe¬£° ”LÞR¥ÒÔÖ¨‡ÕÈé]#ÃV¾vì]"ðN·°‰8°Äm}-¼£~ת); ”œØ`þ vµ 7ÞòU Ôaã~æ‡Îfíj´!ÿ£ùïÐÉ|̸ÜÖø×þœMCÄYM‚ŽãPë² BFuä÷3Z„”=í<7:(ܹêáNI‹vʾ›Ö™<–µóôÕT•aËiÑ¥”^i6×±öÂÖ¸†Æ7Ûû:í}=úšýÒ…”ú$v¬²mô´­Á’' Úå­ý­†F1X´VŸFÈêìvD°è´;ÿ˜7¿ès¤+ñÃÎ3@¥¢däGN7Ë“~~—›Ù4†<¬’cvìy|‚½›[•f¦1^y ¨i¬÷dvm uÚpwØÆÒA‰½úU…ïBÍ4ß—†õÂý&‘½Î³Ë´·÷Sïï7àKÂo×ÉåM75µlÍÕ«ÓeweÌyZ?騣…P4üÁ~ ?gt”ŒË|Ϲ\-‹*ûbÏÉ%ä¿€3ʠܾ…’Af«åpî1„i˜´ï>øg=êj£ÕÓõÄn( eÌ\øš³=vóîi]‘Ù¨ò]Ö*­kŸ^U>\òó/QòÀÖåb v#Æ5O2#Û sS' *¿zx¬|˜-ë=O“²'{ÉÖŠÌ{´]¸Þ‰¼$_­.!ul¬ç'… BÁñ“3"è7u ‹@² ßl)ЦÖIV7´…‘@ºÏgw6÷©ò.©ÒgP½hßoöÇ6üIL{ º3!F®k~±‡8·ÀÙL ÖYiÂÙôÛ/ùN穤 >ö‚I÷hZb57á?'Ùi’Ï’Æ‘l;,ÐËU!pÜžæìêéo«rdçRH‰R¡é¢#ÑN&Ñ3œ•¿ôÏ®OÚÂ>ôÞ¨\Lõ±¡g»£î"„ŸGS™Ã)}5ìz€ð^L&–"ÆùK,õHdC{ót)§wõÛŽÄ3Vk уçÊ8~M»Y‹ò’ö¥F7QjC³ÀYSF5*Ã" À:#rÚѪ‘´®þBîÑ<‚£ú'—Ûø2ÔÞŽ' Âæ€@*‘ÏÑj­ˆ§tBzHQN‡%ôàÚûqq5‘{H×ÕÑE8áPìNS»Z W_¥í[Ë"\æPù©>¡.ð熲>ôþŠm!Ÿ‡g…|™»ä$6úX]ÄÖ—@ÌØéË)v” i¬è=nQ>yFžómðiس2zîÿ"_ì ׌­Å"PØì]Ð ôµ™ÓUFcíõÙI(«? ÆÞLQÿäôdO| }<¶±öÌ·Ç­›`L×BG¯$ôA~ÎE"åMœnKlÌ 4J¯`ìœø'\P›ªö±¹ð0;hG"ò"+Ü[qôyÂÕ—j45°Þ°H8 ó¥áþÆŒ‹Xºaƒ±Ö­§ Ÿþš¹)ÝùÙÊ úËS挣\ÕA„â»óIÚ»ÓZH-Ük°Xâ«§™Õcù– èçê:ú ­’8`€X>®Û‘sÓ¸±rË>´“–u=È>å»ÜWˆZaN"üðÁÔÄxâ«`‚0áL€@9ó-5|gHй›86Ñ­FÖý8¨^nsŸc—¡¥Å~g“Ÿuy6”ÅDá ­0Î3Ÿ¨»S,ëØzqÛžšÃš˜¦ÊÌVlŠïYÙdiESl¨CÏ!,Ì2ÁZ<ÙtWÐÆA“éKÈ!>²C- ®ÂÕóÈ·&…+ ŹÑjW¥)ržZ´é?±7žÞoF^ÉmÙ½z•ê’¼;ÄÔ¹|ë¹úL ùV2„Cí{ôŠèvŒ—ªAz,ãŸìõ~ ð£Pf;Å!ñ‘þ ßîé*&T¶òw°)Ò4êL‚ÂP«jy°ºI@}‹§+%ˇР{èÜüõ=~žyú#ìS·06FM=­T ŠEc­ Õ-9gÿïA)l!œ Ûe†Þk‚j‘Bù0{#Gl›<;òûlYØ0Ä#±è”ày¶lÃë5mãcÍ›ükÈ’&ü;XºNØå}÷\ƒ†2¦xö|Oßæêm4<7öçCX¦Š² Lñ1$d7§Tò6ÜØ÷jYúÒîûÍa.²€I$uka¬îðe6`‚áìNÈÇ—ó”\]Ø6ÉloE Ã?Ãͬ~O†VlgɸP“™ôj»6­ýCÛòŸ%Ê›}rèKšZ»”OQ`<û•1±Þ–)¿ö¬·1…òעܨAc>°9”æŠ="Іš¬å[²Î ¸sÚFGÏû;8–4ÖŒt¦T‚ü:fMìp¥S·¬h¼7\Üùǰd§ÓÇA†Et7cÍOO3FçŠÖÕÌXó÷ȵf?‡ü‹ç2bfóf²*r™M)•â5$‰ãèK©Ëå¸ £yp°ÜŸ†‚æì^<ð˜™9kH¯0ÐåTmõ‘¥Lm÷N¯¶Î³|[ü'Bý˪ӣ®¬Ë¯Má´¶•èëè<5AÒ·‘gËM¤ n¹b‡óŠ]f.*aP *àdÉ Ô4þ¡Ó öäéÄÚçðXó1?Þ±e—˜6B ªÍ*Q2Àn‹ù£Š»˜ánUöcWȤӳî‘Þ=dȘ˜Ú™±Û8¼»ô…êÐ?Kg g3¶öQKÉ›ˆŽgëi»óµËg+•\pðè¿¶öy¹ÎæuxþNÜ›³¯BJžÖ¨C†¡q—W®ð“ÄaÅ" ù®ó²Ãá»Ò¾‘Mµw{êß}-„>µýWíåQÚ¦fëGÄP"d€Éäû%JV ØнÈ4­ŸåfÓgs‹S·í“Ò9Ñžo…ÖååŒØ{A"þôÔ.‹% I$£n¯±æ_r@Ü9@Úk?Åi4À(À"-–|kÙw@W¹>›[WOáÚP“F`(4…©«üèùÔ<C“6$BÜWëüg-ÃîÆ×/¹®°R ÚêG,Oþ‡Ý,`Â#M­.w žQû \9¥³.˜£=Ë›ÝäÈÐhPƒq_JÎÏ]ÙñCiB>ðÒHÏlŒ»Š“§[øì«úFu«¹^Æ£Dàuèq»%'rÊ•ƒúl¿=V¸…ÑBÚ¢WP”,–‹7-Ò³pŠZ¡•R_Ì“jÅ JP”Ú”³ä/‰Õ¯MZpøe÷/X3µWÖÊôcá!u•A(Ƙ‰~ÞÉžè‘¥N ²«¹õѰĀ•ت¤—¡œZ%Îî.ü»Ô/oÞä@mA1AÛ€ž Oç%ìC ½®U»¶—ä·=ÏS²T펚‰ü5´*Õy_Ìô+ov}öÈô<ÈþÏ)ôÚ⊬ËSr­Ï—¶ÅâAi0Xœóð¯µq¤:»î®È—†{6ûì÷x$¢éÕ¤kîi€ôE¹Õ@¿|­«Ok-ÓfÓVjâàºI…£ßI×wЃ2¨ÈXÏML.Ay¯¼:t˜ïé&ÈÁÕÅ?'‰ñÍÚ~$ ÏšÏ$Ϻ<$–èlPX¬´P·<ÀD»Ñº<'LfŸ¼áAy!îrú¤Õ`çv‡]ù.¨*:¯öhM­TÜ2}.JPÒXL°2«–âdýH×Ö>¸?QÊa{IËïžðKÉ¢k,£ÚHRžèWfšú5ž2fbÏtæ`>¦ŽK«ÕódMýHãD’2¨º$ŸÈÙ+ì³Z£AÙHÃXûÒL‡’ÖâA/Rõ—êïëªâµ_;£l¿•´ý…yO¦°éä@Sr‰0íÀªëƒL„/"ç´¡Ö3Gó’×hiôTíŽAÎNqd6S²žàS9´»F…ô¤L~qÏ›séïïŒö”Wù¸ºžt­‘¬aÅ©˜GÞùÏ×ÄM¦Œ\bï-”ŠfP”,( T ŽSD}……¶Æ——¬¶0©i]çâίuíT;ú 9=éxü“Àʾ{W7È, [ÄNšƒmÊu‚¬Vþ;·ïG…jÕÃ/Ës»ÝRµ;ô Šínó©’o9`Þ#)î0[îbíƒø‹P¥,y(¬µÐÐj¢m€všžgÍG& ÕLÃã.âbò]˺ô©¬ïÆ?Ôî(÷û«õ X~ieÛ`ûg<*TöhË–A¡6½u±fž+ˆr' »KNé'›d^%jd°&뙃á´Q™j­žº V0 ÍB`œ`=OÁ8'ê«Iƒ‚€½Ã¼0ýïÍ–-Q2Oñ›œMªÿ\Ƚä¥Î^¬—0í;8-ó}L±§Î}Rú3Öc’ÙªªÎÝÓÍb5ªes6Ôm4ðóJ'UŸ?àV{²«%Y3~vypdj!µ˜¢H8:%½Zè]ê`GS+CéÈáh]ÕSŒ<]ÈÛ¨saw¸u³ÿ>éð0Êe¾ïIôR¾ß/Zó£5MýX÷}ÒgÆ&YPRz%DܔȯYEƆÀqÒº¼|È‘ 'ÉÐì»ÈwÕõt KÇtÝóOÙ‡ S>µ‹™í¯Ê¿úŒ‹&‰^SkA<åVcÅhɺÀ[ÍŸøûÊ~eX 剼"Ï Uyö*@YJ 9‘Tî«Qÿs;Jfܳ%T–yå'Þ²õ;€mÝ´.ìò6þh©„‚¼ž^Í뜪˜É3l:5å¾ÄÚ¥ãÅ÷£ã1§D­Àô~Ï}ðUTZt§ÓQ‡ÚCöLxE•„A¢\½Š½ y -×ͼk—$×@"ßM©¤kZÄË{ZWv®u®„jô§AåÙµBYñwÉp=ô<ðç³ä»N¥\'¾t+Xäv¥#ìÚlEî'Ðz~>[Ý«éCð‡òtÔQ˜í‹æW—cç¯`¸Ù­>9ùy­Ë²¢ Ð «ÉÐL·L”Bª]n­³ˆýY•u]^ØÏºìè eò]ç²°Ü2£¨9 ñ,ø®´.¯Yþ­#æœ*(ø“8-ôœAúÎ~Á5§°®M@Cd¤þÆ2Õ¦øV™¸'õØÁø«úOÞ5ÚI¥D4û‰Œût&Jí †^Þ.…2 ZJ °‡Lù®qÆó“^hj ïj<Ýj[‘Ñ 1uûç´ì˜A­ã$ºî3!ÖBi ’øþÖy3ïù˜šÇÂ.ßÕÙ\‡ íì—R'8A*Ø ©\­†ït-}$aóÑ–½lÐ׺.•ïg]ýlº+ˆ+Å%cfP˜¬«Öòø®™CãØJ©…ô~ºø+—¾÷×ȱգ9Òºv=RÆ àšq ÆÔ` ´ ÊêÏ,Š=fuu«zÍmz«ë5‡½Œ~º'rJsLÚòçAQx&]á·ù•0•Úê¡ð(é*»ûŒ_Þ5W"Û˜óCÏf µ-ÿ>å ¾%ŠQ3… £Ìò6¸'ZƵpdK¾«UËRwQh=R0\½â.Rª³Øx‘uyfó´Ân]÷Y×­ë>몖âì0>Ë»­­¬Þ“^¾Ú" ¶¡æÃjgw:–Ÿs¥uaÈ+„ƒµ”Ââùªô]ÃtZ ëP8]W÷ÚÐ’¶¬ÇpY—•‘2÷qò”M„…·œ×áC¸Lýa]…k‘.Q,ÛX„Ì >Ï5 Î+BÜö(4(³¦Öªç¢3³ú(—© ~§'Ñ4—àC“ l_ ûWH÷žÆ Õú²vQ!Ö¦)L{‰ÁÉ×ìª ãUÁT¢äOEûéÕ×SŠéŸ=åß™–Ÿs¸ÌÒÔ@mEcõ2(w<Á²xë(÷bÉ»Â>G¢ª˜Ý±€V“fÐRõD<Îà·ÜÁš1h3ÝUe‹9†?uðÜç.ßZ‚Ž,0}]‰‘ðžÃc yò˜½^ìãÌÅ`X—; 5޽F0 Ý:LäüûÅN×û‡î{N-2€›í Т±µ:¤så÷G£ô]y:¬/nÐ8Ô*„ŒÊ÷k_*-%­Žâæfºæ0—ªÎ=—Úg©EÑï,Ió'P0 =‘}Ÿ À0öKÜ¡gÔ>ˆò ŒŒpSJ'}÷R_GoèÌŒGGç´'ç±"uÅ5†\ܾàYäu5gO…¹‘û%èë’ ]ƒêJÐýÌCÖÕ¨>¹{‘¨ãX9k‰½²™y@±WB ‹MÕàØxS­>rY$ˆ¹ótèƒÈºPYTå(è»ê.N“/÷" ÷©àÈ6õ"B°µä:xx²ô*P3¾·ãÖÛŸ9\zœkx[ÊÅ(ëäæ?ŠÙM"¡c}3è«‹}L¾ â‘÷!!užPÏÌ\ïùýb ­ ;j_£rŸq ¯S/³Ë†ºF7Žáéq–Ì ÿbøÚe6žíé  Sù×—R¨Ñª¦›m¯Gf»Ž–Ùÿ ÆÑ—j-ñÈpW«?ƒkÿ☺û‹eû¡,¢ÙBH÷F%,øƒö4×çÊUN„É’’¡ÑÅoR.žT§Å²¦_„#øážnB(!‡+.…°¯ˆF•¡3,²¾9ÕEºßP8íO·cÌRt0f<ÔÇŸãk%’ìDëŸ8¢yޤ«P2òR݃kOÙa ÈŸÃiòͨ§#³5?gèoËÔJÕÀod{â eÖ¥~VƒP\­¨uå6-HW³Þø¬üž®Ôlbãzr7$‡'‘Ï¡Á—É#¸ù’r=–Þ&÷á::÷ÝxÖõ,énz¿`Ö£daW-¦á¤uù7òjH%2O_⇄\¸ñCH._Ù¡¬. ±Í3­‡”öŒ#ëÝ#ºæpLHÀ†ʃyŠLÒú_W‡ö^›¦6ö6 ÇóY"ÉÚ\âGrW!Ù¨Ö¦t±wÛWÐÇf¿Þ%&ŠôZ3°Þ­ p¬‰ý N T†‡<èŒ.Éz–«É1n¾ÿ¬àBŽñJ›‹ Ûû•°åÄýÊŠÁ‹ÓäïÂÇh‚!åZµç¶ÆiªhÝV7㟡ÄnýKPQlrZW«ÔóF÷úùŒ®ÈX¬‰ç°~îjžüzé4¾]ìƒþü¹Üÿ6z¬î¡Œ¬ÙaÌì„‹!Œ\åªo[<. šH+9_‡Î5ÿ3!‡hÂÊ{z½JJé®°_¢ªÁ=x´Ñã_sö°Ò<mÃí‰-véIØîÁª%36â^:T¬GÕ2“©?ª-{(ܱ]Î8bµI”ÓMß{æ%±úZ”ÛäQÜ1çòfìOl9›©*"“à¶P¯{vy/ÏìÒçu÷-!Ð,°„Ù¶“:§’¼›ÑÛéâ"ñáQèt/ÄØƒÎ*[”ÇŠWý$^ì~å¾û_Üßà¿ 7+ŠÌºÔ=…]Qê@ƒ–ypgU‰Ýš˜çZ€ÙØ õòÊT –«'üõKÊ#™æÈb¨^m$‰M‚yl ïdDÊÒÄØ ¸™Ç5)¢‰û$ÿï/X%Œ_¦z³Öü^æwšÚ,ÜņTÉ5'8T21òkeM¶jgWQ—ØÉ“_֩ϺüÏjdßµDS‘!â_i¹q$&ºå«3“¥dç«uKåÕì… ~è#ÐK´ …YsÀðÊ~­0¹V‚ â,z(ŒyîÓ¸Þ3b\žæ. õ`°,7ãCØŒ´Cg Üa6ŸœWÆmƒ §QsÈv¹,>—ñ‰‰^aŸU“¥k…–Ñ‘ÕG*ÚZ§uÍÒD`ê…/#c <k¯uG¬Ÿ©©£¯ÖµâWšZès,yH•‹¨“žÖ?ÞÒTÝ*ý^^µ2W;KžÐDU†—?ïË+'374]‡D–Aø{##däÎðäŸÈ¢èý<Ô¥kc~$CŒ–÷9ÌršœÍ®Õh6~™_˜%Ñ Ù)•§ë¥à¼`ºÂüƦ J|^|ç0»òÈ‘6 Ƶ„`EÛ¶=K­½Ü­­§@›´ñˆ­ ˆ¥›waªÓ¥P暈Nk«¢ìòìEt•EÌ|Ka)Izlk×S³ÂJ.à±K¡ C9Za=όݳ}q4¹“Ô¹ý⤹íßu¹;V|i¿ž½Ó¥ÄÍRKf˶ÏÔjˆyOöó¢Ïø×²ÿRåù9åÁcµ¦äŒ6€s0Qjc<„5„~y!AžÈOž{t[i¬ýÑÿ Ú ë}>”Ë$ö7û‘Œq¿w~áF“?;`´…îêª'_þ®J­”ÀìÏð~¿UÜžŽ J‰÷äËC^­Õ®I >L5¨°0ÏÁR¡JáoTþÉÓû+c ¦á)&ÔM·,Åò á€ÜYaCÙ-Ž^èCA•zküÙ3ž^* d”±õ±YyÆž,òh_KnV8Õ&]Ë–ÞŸ™^¦? §*k‰^‚9œÉÁFÃéꃩH¹x^Žï—véô‹èÀ2È·1Oj÷ç‚ÄQXÄ ´Ì­+ÿbÕEgõyÜÒ]µ}=šF²Õ +Kù|éµ]ZPð[ K5‹\+td£×‡m׊óJß4‡>`W†›05©_»÷|›ú~Ú¶sRP†Çæz8<5Bª£€?Do^rØÓˆYú.4.®äA<ðe5%0bü'IâÒÉ_ì1“™;úNS+m±…÷÷^ž!muÏQ„O(•ºí€³m/TÐkÁ}­ ½o©ó¡3Àøš=Mß{ËFëŸQ¬:vª¡Y·Œ >’©¿ƒ&˜¼©PŠWÆè fVo1(éÈš‘)²IOMóñOëjšh³u–ù»äø¦6†\6ÄžAú, ´ÓCMrÕýÈ©’%!eOñöBeÆö.@ù¥Š“|ΧuÜÃäŠ,ZWÃY>;äi];Šy6Zý—Ä{ ¼™XÖÔ­Â %‡p/eÐ÷·h’~¸€ „†b§ ð2®òØ—Bµñ”Ÿ;²¿Ô&‘Z Ëò%#ãÆWOmYl7®¤ FG‰’T#˜O>!7dVÿít]ß%¬™Š=Ø8ÛÉ $Ä‘F‚øIS½¤Ìýoi FP÷jL@*š €Ó—¬«&ñÿ‡>9 fñ5+‹àþÔVX¿*1ßÎ0þé¬9jl«+¤_ñˆñœ2ç Æô‘ô±±I–\ÿxç#µ> Œ¦6~'G ¦·G1s—'‰öÛ4µ–´¾Ÿ³t6Ô%wŒû#£8•]0ö²š(P÷‡J “TƒJ`Ò@>V†åTMܤ¾:µ_ëãÒ§tW¨ÿK>çÎ'T®(ćMm”ƃ;N¤Êͤg’€Om¥QÈlÅÀ(‹€¨fs‘ˆûÃÔ…×”L¬#"¯_þ.rl;ƒÒñüwgìÓª~²mŠã~žÃæ,¢@Ñé  Ânÿ6RÔ£Él!ĦS/ €ÂL¯0áǪÇxXäæ–&µõÚˆ0ÊåOvf©Ÿ³™\™ˆûSó^ˆn(µŠÒ'©OÇ£•j®£2| *;aàÙ_™“/°)&ñD=SÒw \РwçA¹1åÊ¿ÌÌðq÷š©Ajª`ŶJ–®¯íŠe^C0ÙœX_ëmà!·v3¼­À4ñÝ$´îþIhé‘t(_ç…+ÿ¿>é¶Oä’²Ov€ ’îðj¹ÉX5 –BœÆ‚®Äuõ__‚Y·•\yÒt²ß&&͵ÿBGæ/í–GŸ±¡$Ú’JækŸ.eƒyMo)7äyðñÈ'Í%Ëíc_ɺŠdÃêé'`q¥A‘poˆ„•äàQ·ÖÔpëÄIÙ·±kR#9õÃ¥]É»uÒ†€ï:• ‡§ˆ‡^m¶rèÕƒ¢6FÈIf”âõ‰ñßE¾ú Óز®.y0d]êÐýRh|¢Af™Õ£.hƒºGÂGu}”TŒiÍ#(Ü=®ÝsïP¶g‘Ð."ö{™eù®2H/k9ÊÉë]q¿?!Ê)ÔÉm@)&u•w\Ð̫ۭIJÙó³Æì\#û䄾±s¨Pam|ë÷’Røó”UúŸ™õO{æÃ'Øø¡»§8ò]@'Ó üþüaé“îÊ]R¶mOäÚ;Ï Êîœ‚îØˆ¤‡½'Xƒ>òP-%Ó8¿Šò©V),#ÈFëfƒÝS-Éc»5M\¸z¦ %¨ˆEÕJS[©L‰§?óR¿^…a*#h½À쯗vg˜ŸàÙ{Ù‡–ž‹/J„2‡Y©H¶µuK§`d3ãDóÄÒ; W#k¤æ>„“Rìî6iMuèߨ•®"ê÷f)y‡YDOÅ Üù\ô€e³Ûx.§õ'Rë-Á en YPP$´èX͇-C+´¡™yŸµdÓPêËš$£=Ó¡@GªÈ;3“诇«ŠoÜ}£Oÿ§_éøŸÛÓ—Ò#T'賓·sßšý§ÏhUÑË#Z\Ð fÌtG}èâöú˜I¿¸1 _Ù*òqëR,’1ÕHV  úÏ"!¸“;½_9)°ˆ~hŸÅê¢9`Q£æ¶n4öB‚ñ½ÏÔ‹ˆ]»:yç”âcvüwõû]çŸw‰§K {P9<0.Öé<ò¤Aa } ín—ÒT‚–c]Îfµ”åÁýµCê±4º!l³O€öiÚ>¦0”¼‹åé´Bì‹íÁëFˆRÄ»ùâç › 0¨³.h°˜.xd4†`÷¸ñ ç÷þFI9Ù<{¦6ÛcjËeؾYKÕî;ŦZGÍ;…ÓKÔ÷Õ£wý,°“Póe–6Ëc£¦Ö"HàûáÁ,Ë×ìbÿŠÏï<´ýè̳+eÿIp¿›u·ÈK…ËýžIìÌŒŸr±ç¹™GOJY/]Ê_ÚzüFÙRëÕÉ4³1¥ý/=î6QNšñKŸži§ßœÆÈ‡®AÖkAK±ÔdñǽXCTÏ+¯<¦Ø¦TÒß«’L+¦'„µÜõ_ª®C1òK+ZM±b8êö¨®_öïé_(ý×jÒFÿ%…yaFB£‚°bëÍ¢¥A»3Û™w.¦5™C-)~5°)eØ~0¾Ÿ ú®Ä<Ý<ßZÒçYÁw·ó‚pãD¶–}‡Ï…ë0­|ŸªÄK1yU×kVD‘Û)ía­ºÒ;ôRøš×JÝÚÐ *SUY›ëÐR@¦ ñÊàP`y6O·=¯dk`¨\NÔ¸F£îIÃ’áOJ©8F+[Ïj¶Ý?ôõf<¶]Eâ:ýô©æ7‰ý^Òü&Aûsóûì?§;?þÊ’1ÓíóÔ”ÂA¢ÁWÑ‹Ô[Qc7cb[;|™ »bÞ ü/Ü*›"§1 ‚¤Öé [ÏTžåè ¶Ê WlzV÷ç¦Ö±¿°¦ø·W2ν™û­+mªëX%¼ÖÕ¡òNd~UÙùHàçí.,:„²„ÖAâÈŸìYR¿)ä —Š„Ö«Ùa}FéÂÃól™ñÞí>¸¡QRD:lhɳºm,zžu²ž‰Æ½<-­<(Y€|EÂîºùCul|y:tj§[sÞNQ8ÑUø½**¥Æ4Σ)‹„ÐT1%Ûeª5!3þ¤Ÿ§Öm¯ûô63›oð)©ï±Ë+TÊk˜hlÏ’ŸÒž_®öiŠÛ÷’>ÕuÁm§u!<|e–(ÚŸ[ÖU{­´~+†«º^–bÔè=î¯ÉI"O¢AUJxG;vNa=dN–r6ÎfÖä¿?è® 8xÏü]㺡Î}ü—ªëÐ¥¯iPn॥AÍýE„yç¨Öh]þP2þáá}Þ¼A%íÎs£‹}ŸŸ0Å×ï S«W]ñqŸÆ¤»BÖ_¸™[úi½ÁŸŒUÆc„nE«óäx\ò<ëŠ~w¼b_Ÿ•šðØCYOs¯wƒ0¨‘žþ?h^Èá`N´ÊÊgþõÌ꣫œ†·z‹Yçgj#åÁ£¦šÒ+·Yõ“y®öã5‡ÑhkSN=îO.ÅÃÚÓ^JI¿Ûß/>(zÌ©,KÐX¯–×íñ³2ȹìïÍ"ÛÛ@lFÜÓ Ê®ðÆgP¥Ýð@¤•™)ÆÓ£Þ\\vÆ£¯™Îô÷{(|ØæfÄëWÕóŽ-moÆ(w˜‹ÙÄîO‚¡'í.ĸsr·»Ô¨Cîn''~†E”¥Bs4åû›"çHñšðšÔY‚¢ Ÿ-¾ž«eðEç«2òÝìžÆKõ'lŒ $»9ë_Ы4&3žü+äúÎD4'÷Í¢’ë9® f!Âô-»ìiœû^ìã΢\µÅ÷G8£¿>cŠï5g|, §ë ò}ÖÎxRD+  »3«÷ ¾ž¬~/ ézª–Ww€¥0£}^i„/”yIeôì¡ !ƒbn„õV¾ŠÕ^ê{èý•²SÊâˆÌþËÓ_£`¯Æ&„%c§Ám+;Jp)}æ_Ú!°Â®ÄçÙœ­'›Ï±´?3f.0ô°HÀFk‘n™´Üó,ÚǸm_Kx\G¯~ÖžyWPœ/¦á¥žÍ&„—ù ÑdéêIùg~8Ö;Ùùv‚FÏÜ}‡dïɃzÊâ/aÃm÷n%»U Dº@–/”]íÜï‚ÊÈÜ=Ú‹åíž]½ ÌSø½$rö‹ÛnßGÙg©ŠYY[Œ­žô–ô]À™¥"þ>ã¾²+ük»êUÌìQ*¾pÅÈàý¶3„ïŒ=ÖFž;˜ Òºfe‹Ͻì#d]Σÿ ïÎÁ5(T^0©pËeG0Êѳ¢ïÞò…ô‹@8°L,ó±éu÷Ø¿^ý0¾¿àq™êŒ„‡zy¦qß–}ad,âFvÈLMŽÐ/¶ná<7J°WhÙ?û¶•ƒ¥ƒŒ3KØgåˆ`a¤–³@àfk<>„!ìƒW^C]Œs!X_¯~MÃk6­k]‚Ö/ ¸ 7Ñ=¦üÚß¿šðíÊÄ|eþåCý¾úË/É+%g3vWבƒá¦TJ(Ô`•äªDšv‹5g›Ú²Àä²A̪©U„Ÿ´=ê¿÷–ªÈý¸ŽqÞt«mMØ£j³2„ßP°h;AÈÏ(ÓA)Ä2Š0`ùÒhq?]ćÊÐîøaܺ@8>{WŸ=’¾$©4üゑÈÙžcbÄÚr`ž®°Õª½pÒïK_ù}JžÙ,uÌl>5‡­òä‹FõÏ ûïôPnî9º Æû¦¸6ƒ”k1º!€r³…®•zhPu=ž§ÛÇ:³™/*‹}3åÏ<òg¢ËꯔääâŒÒiwîŒ4﵈’l-߬Ӫ2·{ºLÂô G/¹O¢‡kØÊ‡äŽAëË-XëKVƒ©ˆþYák=‹ÙFÝZü¤h1»ÕGÒa­Ëñó¿öý£Ðb¯•aœf=ÏÐv¨ÁL¸zL±pý e…ÎÆ–I šÆ<Ø›(ÒŒŒØÅ~hEL‹ŠŸ÷ù1£år£pÚ°uNÒ“*mmËŽSÝ2&ݬ?}ãðXÚÅ®ï¶,4ˆUì®Äÿ¢“²[aW¤­o:ýéˆDÊ¡&E&0Ç©OæÍâh~M­YP±þΉ—x$ÖI'ø?àâë9ãYÚŸ¹ƒ 戻£ôñHxaÿnõT™ü°[?sñ+b4Bà¨3«7”ªSfsÀ_=Ew¾Wà×L *Oåvj?NMòž˜UçŸý mçMs§üµšóÊl}>/ß2›.²9¯½7æár?†rÜæ††eø3R0ÞÕîU2YÁD¡õÈÕ¤~íÙµÖ—¼òªü^Š@èQ2!=ÉÌ}ÍO"ùž.ùÙ³‰1aïŒArݶ‚\-CiølCü]nßdXBoî!ø°‹¼o‰D™`Ú`· P¤L„µ ËŸqËrrG ºóÀï/-ˆrù=8‡–ÇÚ¥¿ Kgp½¼‹¥|ÝœçþT ‰þÈŽiPþ)>*i3™«£…žü1É4 |ÂN:ŪÝꬵR ­‘Â`ÉOÒŒØI‚y€[“ß#ŒÕÎã%[i«ÊÚ•l$"\hÚe1X3¹fZ}ÚÆ?AAyI°|¶3 ÅßyÒ´ÿ«Æ¼=©Œ8l5ø÷‘­WãéŒT+øC¥W?£ç¶é2wÅ#{ä6wd{*€¾çù™—úóB.B¸m&ò ÛJÖÀ/Ÿ5´7 j‘%–X©“€º.3ÎH¡:›QŒjAëšæ0± #ù—άâÎq¸Xß{kX¹¨«~{õçj;LJìÙ¿ŸTßäÁ|¤ú-ð;}å¿äM-ô./&kJ¢ƒÌkfc W÷áG;Ïòôê¹¢S öð/«šC[k«ÅLÔ»5•e¾¼ùRù~?ZSŒâþÊS¾ Z@’×(Å®Ž|¨ü¬\¯»¯äaÝA¦æÑ‚× ©)FôÖ¸˜Ö†’¶„X•>¸û¤Í¨¥´Fbö6ëÓ?ž™j§yw¥À™¹}9ùÉ¥ö“îôî‘6u©„bšÈ¸ÖiÈOè‡>£Á<º~•ÖÕ.1ÞU[©)¢‚ÆÄùÜç:4¨^u©V{2ÂG^9® fHÐäb=â_-"¶Ø}=‚!åù2!Üøy¬½€¼ä?`ŒUv\NÚ>ž~å ü“›´®N¡î8¨ÒOÿ+<ƒ-ãO0}è45+ä|†^Yò;†©‘}" O–¸YÆLl²°_â)ØC©ƒõV¦dÊö’¶Wª¼Y45kñç3˜¡7r!À]þ½1«@Ô‰wé'X Êóî\N·iyÅw_=z1M&4M¾kXªˆ} ~É=zR(GæÆ*6h—L¯«Óa.Á_B2zÿ Z¤«%Ôê¥J/d Ë”ÙÔ’ìŒÁ³°$Á^Þ—Vó£?šœÖ_aÛ­ÐðlQx“ v]xœaHCÊëú#S»…á%ù%6ÌÝ2Œ ‚Ö6ÄÁ–¦6jmOÌ”Ôi4¥~½†‰ºV£ê¼*[wÛyÕt6A=§žo>pp6º«9”“ƒ!O‡YuNb¶¢Æ}hP+ýÈ ì†?»™ÏfÔÙ=“”¸ÐÚ«lÉ•¹¿TdI÷±–%¿jãR½1ɬÌ 7ñ;³Š¨Ö?¿\ü>{Mòê®É`‰®”\ð&h5À¨Ñº@x È¸.CëÕü9’9X—Œô;C}„<Ñ¥‘¿këÑg¬«,:<¯zRžhGv¥º`ä.h” äÓ Lf=Ìm º5‘2?C‘ŽlÍÆ†#&´y1J_?ÈÊÓ¯Ü)®k2[åß²JÙ¡­>&T«›&~uTi 1¥uåúõg&™ôX°” ôZx†³¹²spWãeu:2·»GÆ=Oåé_&BuxXµ‹ÀCýägê)iE‚ãµ*¡j[Φے–ϼpéO”岺~r-ãê\Z‘GPÑKÅ¿}ÉŸuÉî¹»è0æ¬á2·ñ‚j±Ô±:1^™td³>4¬‹_`ÇyÐ+\*4Ûb› Cg3ÿ,ÒCóé§÷,T"æ‚:p6‹è€Ù¦ZÐÊÉӡ䫪:Ë(’d„4ß쨂Þ,}>æðîªPݱ~'~©ÁÛ+?ñÏT²fþ ']Ü1ébÇ´MÞo¼âBeð—PÞ. &ÖžÁ}s¶€°öä ,§A½7´‹âÚ9)—„˜’v÷µÏn‹ò TÍÃéÆçHÁ-M*TvYO3«ÒÉóȳxAЦ#ë{UæûûU¡²M¸J´j—ºÅc³ YYOÉÙÝÇ2c×ÑÉQBjœ±Ÿî3}×|ùꡞ\s¸…ñјꘕÓÍ&y¾¾7»§Lmž"‡·:…Ò+-ïVš§R8v¿3i]xáÔ¡ùÏÊùpþ×k¼«SJCõÎáz6à¹h¦ù!¼²¹þ<êí Ø/¥ë`û”†­¦×«À¨ ³_­ԥ”h´Ð¼Ôá/•þ(ã½MS›ÐÀ¤uA–€ÿ®^žìŸ§spR5aR³I£Dëg]ÓÆÛ¹ê\`ŠÍÚ:û•Á!ö4²lHãÌ?²d 2 <Œ|¹Š~åì5¬køõ=Ûør±Ÿ@9u“ÆòWþäØ•Íø<ë导Õ¯2®Å¾ƒ„ûEà\¯öAE®+l]úŒX Q»¥¥:ßÂVåW YO1ƒ6²ÌìЖUOÑÎf š³(r 7ä.\"Œ=ůïÖÆYúÑí§_+œR]¯WÌ)¥ÐôW±ª%ßå^CŠD^óKh0Óû*eKñã´>tdh!ÉwªŸÖ…WFƒÚ›´)¡løÒñG È¿tÚâ?‰n“þW–ø€ŽÏ+.X õúhj!¸A>B³«IAï\ºž;%Ò¸î@DÒ Z-:”5kÁ_B»6N¾ëØ«þ ­kSßo¡¢×•Ù,ÖÔ\% ›X²fôrÏ|?%8›:weÙ üÌuáŸu ÊFÅ”|W»- ëý¦R-°ÐA­Ëà~KÐrë:[JCh‘XZ—bJñ­S„qÆt,Ç–Z>¢ä\)j½=Œ±þZȪÜ­Ú`›_ÆškãêjÍóø®›|ÖÕÄ¥ÒÌýbÞ¥ñ‰ªš clz5ÿ›Jñ!=e]W”ú3jÆ’Ù²®jGarlPNöÇwÉr»êÔ®ZÙžð$UЍ¥²“’ä;‡ï]ÊÅmvI°ÏiJÂÜ3§î"|×î4”¾ å:[èFÓ ûnC¿´hP1Ý4¥qmþ!O´ìõ]G²Iw­«§*2Z°©Rß幚^F“ï­0ìc­%IÔƒþ.­«HoŸEQ"Ì”"£?ä’ŽìÌäÂGÖ‹Í×´.ˆ³g÷A»e]eI]ƒ³§ï`’áÌYü- ?yó®}ù–½Ç/¢O©Îz&¢|ßóîÉ\­–ù4g·m‰ëY[UyWûÔ¿¼Ë¦øuüyWsè—wy ™e«SPðÓ¥œ;%¼Ùú’´:xÚe]€—ðßù§”¶W6<}QÕ‰Q5MhNjŠÃº2ìÞ¸­Fˆg³™nt³Ÿ‡)oÎ×B¬ÑÈŒˆœ)ÆûU-r?šZµ¯ ¾ÖU^BÛ’íŽØÍèi(ˆº«Ò‘Ë'ý Tæá$×:´Lƽ²ú±¥O<îzH¿M-邦+¼Îfç§ùû)3þÕÃz7Q$’]{W‚wö§º5ã%þ®¡çx—j»Ðº:#.ÈÿŸPãÊê¡*ÏÈXGU?¢]ʼK[²üü^ÅÇNõY—ßù¦»ª¯~¶Ç(%òØ:V0ô‡JëÈiÓºúÉ6bÔ[ú¡¸Þi] i]]d͸Z!+/&±OÍ;##ä‰ÒÞõ…û•"…qЦjš¸Lâžî+ ›w5c|«5‹¾ ôF%`¹ìp7ö, ý+•»²>TZú-”§È³¢&¼ÇÂEë*ýÉÝKO¿knMv{{õ³Lu$r{%ú] C¾¼¿Ý¡òä½’=1›“‚v±ÈwÁ44âÙ£0çñW©ù!V»Õ\Ø;{½Q ¹µÒjUüCýX¿ºG ÛÝ­ ä¨i¬”þ™T–ÍT rÂ×]m±©–ßë ïÂP'Kp­PNâBU‰¼û4A¬ÏZ3éIźo´øÈtî< e&¹²”ëòDÈç…™“†?˜•ÉÔÎcÍ–z¡£.5¨,m#w±+ä¡^‚Ÿ¨Ã–öÛÅï?™V†ò.ˆ²Ð¨ëÞYu‚h*µR‚NcÊwýNméÒ—¬ )ñƒ’hlõÉýJb&€iW{ô÷%»­†¦3¬µ׿ÝçøÜU_úgnÓ©Ë‹khM£2ËS&Ž# *Gw„‚R¸“íªAÐÂÈY,~rã¶€.z¢gÝŽg1øñ1<€º¾èÈüÂmy¨X´.¨P˺ÚL•åàvë.6[xQMÕŒÀ¨v "os½Oæ¥EûÜè€Àƒßè5=µõíñ¥.vQ™á%cæg5PB­õêb›*¢2wº œâßî¨vóƒ&‘æàõLåk¶RU¼AúC¡lΧ…0m>ÿ®¼ºØuèŸõó¤ø˜ÂɺrÑæsW=‡Æß¶I†² ̷挞5§7»Ã¡dš-á¶3 £µ—âÕ“è¤Süý:36¹/•NÞFk-­ Î)>æÏX¨gî u! ï+'9rß%¨[š&Íu>³å_]l ‘G²Ö&sð;˜öT™öXî[3bßöZ8Ä#(Ô (hS€ZB;º«iÜã6¸³W?¢ïÀÑ0œÈIG†u~Îõ.‚ÝY`êÍÿ…C}ÒðU•Cáë ×ƃnÏ` 1…ç®·I]ìš³¤‹˜ÌÝͶÑ]uŠaøsqðgD£=_ÉÇ’[j1ƒ‹”égÎ î>ê (?«h«!ÉÊ>N§Ø²Šv)PÃæ$(èËÉÒ8ØÈ`ó8‘0qÏð™Z¿ÅÛçlêV”ÃÝ>SÂsX$@Ì^öÙ?V¦žM‘¬-MqphÙ=ÓüÞæÑEdϳ›O°Ø9T}þúÈ~†Iôãlª-#1VÈ~n©7º+÷“îʳp5P¡œª|ª®Îs{U~2ï îyÅ¿Ss[ëÃE äîC¢VXeÛaÛÇðY—Ç€Gi¯NíüîÙ¤K?jy8î1µ"íùO¡#Ã0˜ùþ&}z ÝE´óž5‹ÃžT2T ©˜A q^ öùx5dè´®Â/ø›Öh^ûVsj–tdسtP{ŠQ¡Ú4Â*½eüƒ´áê´./Ñ$¥¼Í’}$üÛ×]C°o*WGvjÚÝŽÁ®†ÝemeCût»¡¬?ªë~fY&S‚;ØLз_wã:Ê  Ja ƒÂ03´½„,õß7ÊÛ=x(ürÏv‡å‚^Dô.òH')ïò2Z™7\æ³ÑÚ57N™›Ó¥Ñ³Ä1,rU H%(¨8-ÄÑw»5ãø$Ø_Y‚2ý‰º`§àn Ÿsâ7Ôj#Øyý‚ßiGˆ{{ ’A’ŸE´¢ˆ„²‹›¹R5ý¸úzŽÖÔ‘:Há~¢E)·³ÅûnÔ&Æ7øQ‚¦H/:°G`DÍ,GÐÆè ¼ûP‹¥€ÜÊä¦Ñîæ¬9ƃ^q®zxv½iC˜¼±–À:Ž6zîpä‹Ûž–l^Ù“WB.Üë=!»WK²² ôCŒÿÊd–â©væ]!^™*£ãÉѰ‡‡ÌÈVD%9l¸3QÆE-ô Dú‚Ü¥cøNÇäØfkl!`/‰•Å O{^`©íî_ܳT»RF5f;±UßTà‘š[¸zq‡ÎxùÜ8CVnÕ†#ëZaIJ2²Z¤PV¹òûétiã ênÄúG«6ªÚÝnUbÅÝ2IA'³Þ¢óçãùÊà°”$ÁÁf cõT hÿn2ckKq{K«¯Ç^®¶RN“t‡ûËC#<¯0“—Î$îˆA€ÔËáXåÈÆêº‡¦¦$Åð]•ä!@8­»1”¹g6z¿kå/ÕÄGNNv€`»ªhÝ­ xȧÓÎù(¦]¤&ª•àFápЧ*»ZGJCH›{>¡‘¼¢þ.jÄr¿õœìª¢Ë€BäØCŸÕ¡ž¹ßGÒ•Ÿc¢L‚`Aí '6áB±&¬"¡_ÈÏRfŠ¥"жÑä€é£±6 ]£ø~²Bx›äßo¦ˆx¬ãÝÅžš¹Õ=ºØ—3w±¹Äâ^‡¦f{šYž> vŠìc1”ÅÖpz¿PV]bKÚ'& rg¦Òw kçT#(c¹ ë^ûкÊ1IõͺÄ€‹#¦Ë Q šh#³Óg‹ì…àœ• f†$‹ öˆS·Ô)uEÿšÍûb¢’9Ù?ý Šr ½9‰ÁB‰Éš—üFïPé&@ q¹_¾"ËZŸÃ›ÊéÖ£\ |3ÍÁ@ßD3žTßýtŒŸÅ±¬ªáŽçQú‰&™ÊëKE¹¹iüŸœ:Ö}t)Tײ´[³ ‡ÐŒÈ(¿½,ì?¦ù#¿¡§QpžòÁNÒD}å. rgp m“ m­ã°â›ÛÒ/¢5Pµ·÷`–]®Õq[ÿ¹< Z¦a…}Pâ:È:'ô@Ë4“5H/“ÕÛ™ÊÈêz N•*ë*7À| †ÑÓÅ&«Îµ¶xj€ë•9Ìš€ºB¬?×ðdPXaTN×FŽˆŽ|’ûì4”vFîb÷Ø äÕ`€ Êê±wž®€øßåÀ9íŠÉ||/µ¯1øøb\¾TÙÚ#B|ª*RJQ(«Jø¿ûc£nƒ§;WÇãy]ª³£U¢þÑ *"_òWé®ÜeJ¹ø\¶ä/[WK?öÜ#È,G°h³é®ÆNÖEðd|"¯—¨ö$q°.L1˜ú÷›ü]g©˜ÚlÙB=*œð¦•Þ¡ìþˆÆ–)0†§ ‹Þ¡´1˜«¥FÎÆ³+ ^OÈ®óÀø‡‚E[`8cðƒr{:‡,<’‡W{¶M’¿³wª¨ŒÁ•婢Ÿ1ŽØQ˜ìýƒLC^Í3zð(«Á1k¢ëþ¾ûS¢tÅlhP^ÐJ1ûéj!ø´µßû–©•ÌmãºKÖJ_øÓP¬ÅyuíËtH?“îÊù­'Ô ¹;|á%0#+Ôyšè™:²>©­]ŒGDs½ÊÅà˜d„q§Ý˜Ù”]5eên\|Íó%zód¡¥±ö Ã¤áÕ^eCu’n ~¿HÞýYðÍNNAãÏJáñ´G${”£^/¸þkZ²n¿+’Ç™¾ëj.‰È×Ó J=›€z€O´D¸…âTÝpp·Òl* 9¾¸¦­7O†6ϰó®:3²®^ŠøåüMˆGiQb>ºUã‘1n]”ðj7… ½«–:33&FrWm'7f'ûÈå4*è Âm?îÁ;\þ¨â‰xw¬F)ù/…<±½9XÙ•í?„ƒ6qË•-—¤±Ö›œ Æ–¬ë@£¤ž[çVX$[φ¬Ë]ÈÖé@@CÛŸ¶%HÛjrGâfy°“ãYï$6x™·hä!-÷„÷§T¹$¡X`NLÍVÞà}ñÑz½Ÿßƒ–$ ³öŒdH8šÆ%’GÐl„|›“ y^ˆä·y"¯-_æ¢ÁÀ_)F9ƒï¼¥»¥&Qtä¶Ò ò ž1â))Vóu9B£AEa&ôz){Lf›Œ™P¸¾eÔ7'÷`ïK¥€‘¨õ¯ºÀ¿8¥×åp=²»,¥ÙÓñ´*»ó’J åõ,¹ÂRIöˆ?kUBÝ£­Š&™íø2¥¿å‰r ‚5¯.öJÅúèúTíbƒú…®b×úêb3¹ zeEéÐÿçêÚ®$×uÝGÑ ôYzRR;ÿ”.A‰€çþWM¹Ë6Í'Œ×')ì^›VŸñ"È'ivŽå£þ¡^å³±4¹ˆrš é34!(äùŽqÖHA UkSüƒJsIƒšRBÓ ¥wõë–Dôˆâç1´Fù>32¯MRÃY³Ó‘/ò“ l-g©!ëÞHÆ5¿L 1€.n—ùq…þj:º|íÃlªÎpxq†GtúZWäq‰?{·=gV¸ƒ‹^»Ï-Ú~|%ï»\ŠÊAž/ek&wªE¾?$( ~k¥9óCßìyî?ÎæÈCùõÉÙ€èM*2òË4.·§qþZ^Ú pöÄnoBõôÓ  QPÒ es¡·n².Thôá€;ðÀãËòŒA²Q±ð—QË 5ͦ‡zäJS›eKôÂÓϬƒÇ,I²ñ´×#ÝÚz=kj-ùc#Y«Ÿœ§~ˆ2gïKΦ/+²QÁýLè„q‰ëSç©•*“ôëÛjô®TËCkeÓ--¼‚¤ù¤²#;ž€x¦ÈùÝç—ö£u*Úb­ì íÝöY͇k¾©=‡PíÅˆŠ›}[Çóáóª˜-çkÞbiîÌ»Ð5ø bξdj»Pº,¸[ù‹IŸØ‚e†u;ÝTÞ„‹KåTôpÏ«Fîz¤{c>gϧ]¡?–T‰9H¶' jÆÓ¡žYaä©ßÙ¶Îwd´žÂ"À>ŒÊ·b®+qµË¬YW驈~úÊŠ(…§†“Øzv2Ä•t!tü®¤ô_ pf§}bë¦òKƒ P8`ÍØ!·“Y!>j&Û`gU|cIùÖ E–¡?YŒí—Z+U»[¨P±„9³K^߬°"Œ„»ƒ¨Þ®¬YjeF2³,u]ƒOCbÅ6S,¦6¤ä´WëÊ_ö|eFà )“n1Ø-y`6ÓÀWH1É<ÆmΩõ—v’g¹CÍ^ï ïΈ続4ºaP3­ ¿,u¢§?ß«:GfõHWü!»€¬§_xo¸ÔÚ¥“|F¤Æ ´nZæ%+”Sínªõ¿Àä“ÏoGõÆ/AÐmñKuHÔªv*Úb¦~„÷üh$ƒ`§Ay±%Mcâ*ÿÀ`Ë}>ª±§BÕæ¡»š§|T¨Í=PÇW,õb$üÊGZW͔Ύ¥˜éIfJÞÁÔNþ7ätOåa$>jUpŸôþã:‹Ï2¡D[dÀ>Ukh¡Ù'7¢f:¦¥c³²@~Î.pjÌ'§—JJpÆ_ˆ<_˜ýv.îÅö–ý.̉©œºÐ¢ ft”&­ ÏY- Y c&š Dà妋«Ó®‚­=%‰ãú  #§/µ"A>OMÈÃ>C0{Ò j§ì0–â-ˆx™Ë<Œ› ¥[Ï$3 RåŸm¥|î| 1t|LÌWuÝ¿SïG¨øŒbÅéKÚý¡â¯W“æo`ö«Jбr^€º ¥øÚ¶‹b›ðÀyïBî#E1·®3vlõÉ@›°À;V+$ªå³è“<+ŠxÅXs€Ö‡â4ýßwĽv†É¨%:ÿÛéwã,ÔË[¼ÖåoEf6ˆuÐøÜ>å{•Lú,Sz×Û°JP/4¥»Aw†2¿>õšÜwƵ9XþˆÛi—ÕU?håX9y›ÒÉë{Oº¡³«4GýQôô]cØü¨Ôf ¡ÝUþ{’¡£¶g]x~íiÐÂ!ŒõÔâ‚9÷–×Ô&Óp”Ø«ðQ˜¢sÔ)9Èü#ý4óOèýÎ#¹vWSS5BTûL@ÕùœõÓB±0<³HftÍ£òÏðG Æ¿1ú‘o¦«¸h~I½•ÕR{ÄP®Òº–Oø`+èõ›`¢f6Ó-Nd—“¢:a…³2ójпøõM~ »rCcnžÛkÎ¥D 8NÚ;”Å"¯=J¤›“ÛP>5‡IíÑF`67ÜÍŽ ¦ñ•{¨N{° YcŸ¥rñd—©•þ„C4a<]ÞÀæ´ÁнõMúû E“hž§œ]E‚×W1åhhüôž9Œ®I‚g%›åŽLE¬Wݸ‡k,|ýÖu®?ÐÆ|°ˆÆ«èëLV´mXJì ’½{eùIß…,ìšî-'÷‘.6ú7MÞ"¯÷L9‘ÓÅ`C–.Ëü¸¾Iσê–NòxÆ3,¦Qå§%l¨S‡,–¢_/ÿ'­kôÞ4pØ)>ýá;÷´$Í(òá'u j_dÛÕ4~ùÆÕņRéMZƒ–é‰nß$¥ÓÔê¸ó»Ä$·Çiwáú&xOu½ÍF‡àé˦óÌ]-JO´RB8¨(7£©¿ùÂüƨ¤ÒûA‰Rg"ƺå$ë£á¹§+53Ó@Ã`?ÞÆüuWƒý.C¡R{¾JÀH¼{‡éßß^çÝm»åd[Ƭ×ß*ïàƒ’™±*=J«ÆGÌ{Ò;7Ñ¡}¶Ã_‹3΢0¥¸ Ž—(ÑØ({oþº¶Û¦Ý•„ÛÞ­¢¬ñ0 j·¿o¯H˜ÕÒ æ¹ÝþgP·Ì°;Ìê‘¡ßίÝuŒËßuU×K*Ö£ü[–7|bÜÚJÚÝYF©Ú;£3 o?q»­«"SƒN—sŸB÷`Œ*sp/ÛøÑzº'÷`ÔÂ3¬·:˜Æè>Ç‘jw,Av~ $,U½vë|¯ &ÃßUÞ»Ò¿ªë½Ý™¯Ý]ì ”»¦V{çÃì£o•ï`#¥™wNõ ®•l•è(øåÕ¯EVš=~2áÏK”¬ªÍzj6Bæ,©­¾C’A£wQù;ݼªë}Þi%’lÑ ú~êN3²ªÃÍ>ìbÿîhßnP¹J‚òìÆ ù¸f™}ÄPgVºB]áAä¯ JÞ»®Z^ÒÒ»C“ïV4ùS×kí¬ë“ý<±ºòÁ5ó‘ÕIà/ÙèùÈb#kЫµÂŠö™­+¡_D9Äè³J(h~ZWèæš+[)!0vþÔó¸r^Þò‰*J&t<¨^l=5ßž?…Õ[S‚`wéÛ^s}güôÍÞÉáyfÏ»ë+ƒoýœl;Ä$¶)oƾƒùCÈaé&J€Ù0Ÿ:­%$a…š³³WÍ:±† ƒ¹‡ Í•P˜`›¯“Ÿ' ~ œ;‹Ýý¶ö_“eª&ölx°fôjû%¦hl¯»Xx³ú1çQ”;S‰¼¿¦:€äë³Ôu´.¿¼údF_ Á2`áú–±¶´e\÷˜LÏÜŒM5ã–ådFjfnVŽB°§ø‡ÆºÛQ¾™€¸ ÃWx^»ZEçy8<yél‚`çÓïò|O•á®[èµ_fóÉÉýÞƒ!Ê9,·ÖþˆM÷•’ËQ>Œ4B(Ç•Lþ'àl®cï1ßà€3²½ v£L8ð‰i½{èÉ~Iƒgfƒ?»Kc³Âïjgö‰ƒª‘]³f„oNç:“¯sHNÖu­C‡w„b¾3”Ø\Ø#{iÑA¿ûŒ·ß…9»ZžŸg× ÖÔ>Ƚ=ÓÔfy€Ãl!`ª ƒå.nÐÔµzíîpoµ.KÐKͧ@k«hJß¿¡ý¼oƒØÕ›û­ZÉéõÓƒ8`ªDós³x³}¡ØHÝ(È¥Ä&¨+ZE<ØO± rìÈsòMLíÏ4ï,4Oôƒ8 ‚ †>«ôÖÓ¦ÝÖäœÊP}K™yžL¶ìËR·º+ÏàgLÝËZMUÙ®"G<¥Úã¡×”Ý[ )ýôàŸHè|£@öêq}¦‚­²ªÆ'}§©aýšS˜¨\þ¡ÑHû«åSŠœ¼ËܱdýyzekZÓl\ ¨Vƒ£^R¡}\?½3¯Ä3û•àëYʯÏ1µ¯ý-ÍIºq½|ÂÍ'*/ÓwMìÎ.NÑÉ`â¹Ì0tfè$ %Ê隸0îXCÜKXŠA™m4ž†èÜ*€Ã‹hñDV?iÔëh$:¯$h‰:åfÖ4>- ×¶B—Rjz¿P/ß“†UfMžiåjiL§»@  W!šÆ¯/Òq}B&« )öÙR€*î(r[ö쬱ºç¢AøC\H•†v.Ö>jÍyø}3Ö­ šR8Ý,…NYÁ´¨ž”=µŽÛˆì]éPŸ¶ùÖÆ [ƒ,H¶ðB ojìÜÕ¼DåkbpCÑ곿H…&46—°`ûëHÒÖ,<å™ú„›þÈ ÛßÕ e¶£7güKEPú3vûG/úÝíé§Ý¶Ñx ·¹¾VæPD‹š”øcþÊ®ÒÑñBL˜vÈ&6Å`m´!à²éêE‚u3!k7‰¦Œq¨ZWÄ •ÌÂ¥Hσ¡ÑáÙÓƒ¾¡zÍÁ ^svp7–ïûM“Ï §µUZ—×á鎣2ìÙwwƒZ6™a[h§AÙ9ÆpSñZ0íÃIPls'×Cô²¥6Z•z+öBi(ë‘>ô r1Ú9)sÿò¢I¬‹b¢! ž ²è4!p S’ghV4¡ ½Òyä©]›}—®±gÐÁ:õ=³ÅUÆN.‹Ri¶–Ö¸üîKÌ Î=Í×w$¾€&aÐ^‰w”1ÿPNéîµ%z)L·J®³ï"zjhÏÞ‡Š§`FSÕ:êëRèãš%¬%È'2âÅ@ì|ÆÎ襵³˜_¯§²Õ3¤GÎÓ«âš{L®æ‡ÊÝ¢Ùxiù47…ÞÄI6h.`ÌÒ–¬ ãVí÷X× ¸;5q¨ ¹âˆ"í¹›oòt…ô1˜ïÚÊô¤0MÛê»ÐŸW¥á¸‘…ªëó5²ú¤ÞNeãðÚ†} Å+Ú$bB¬xÞ?¹.Ķy îH´—š5Ð f¿ÍÉÈÌ«F+\‹B¥è¹Á¥Û邺bÖÓÔ0!Oë?nQm2«Î:dÌÜZ)„û@ðs4lcfMMý„ƒ^“ÚKuv¡?=¦|à~@:Òºâ|Î59óa­|–¢k.>˜¢6κíÏ¢âÉWÍðññ“=µ-Ûë·‡ý(’;­zTòìÅ‹À¤ûCm•Us\ý„š½Þhs›8Ÿsg{¼gQ©­QòaÆ–v25àò:éï¡QgéR‚,#(bÊÖj7ÄROWMûF^?NY˜nµq- *TŸ3KÏûŠÌÆÿæÕ2wJÀ^X:3·Ó†p“%Ô|tô“y>j“‰n©DBœ2| ªZ ºƒLsÖì©„+=&/2(#ŽöÒúp²Byš‹Ùîe%yFåšÚ9ÜËÀЉÂ}drl áók˜<7¦Ói]»'"&ã/ÙÙõ£âàE Ïà7+ó ¤"‹‘1”Ìr¯Ñ‹´Zó"MpPÚÆ^:/|SnÝp¥ë¡]-‚ˆÞ¹ÏˆëËÅÞ8ÝÑòíL^™›†¯ÜcWXÄ)?J×¾ IeH}˜¹m¬ïf2jAÛ ¸QkÄÕ2šÅ.²¬jJX%Yˆ!C—Oò¹è†j.…ýÜB³Ká¸ôñ¡‹¬uÒ¥œ”‘D“>€Ô+7ýgœün†ˆÆÉOãDœÓGÑ+§ˆ„¢â€U´õ …$½T%ÇÅΕb\ÁË•E:(ú+sOë²Þ› ê5"àžÅƒe'í°Åç[iC36Êg X¥Îæx¹‹†—¬’] {ЦÕîQ?ä6§sÓ˜©$ºûpÚRC'Smïë£~=ŽÑÔ òCS®)Óp€sÖb±´%ÂP *™Û›uÞ¬épÿöôÖ~t!÷{zè_ÚÕÆÁ:¤Š›¡1AÛðäŒ:3¡ŒžÉÐÈŠc šë©œ,vfžëÒiûàxµBÃóSw^ÅyµûöØÉs‡†M¶°‘u ꮹdPhPÉ z²3w$·½ÍQL¶1“ÿ)ƒ\î‡ö#÷ôÁ½´DÐêYo¡Ýa6iyðbÿ¡˜Q[Q·}v*=Û!Π:.¯¬O êy[W‹d&oqhÂïô] ëô]Ø^™šùBÙI©ˆ}HšÏþlã{i¹>™McG µ>’¡…4¥ÑK ‹U´ ÷vñ,š,i }ÛE[a;‰;â­à ÇÂõ%ûVPʼnOÑ4ÖÍ}×-2¨9¾û¶ué×y2”³4Ì4ºVÞ”€¤w‘¨¹/m(±3ï2 ÎĈžV:›?$B8O€³HXHäE Œ(Mmm¶Å€äÝ4ÐNÑK^À }\µñᨨ]áýj:²žRa]¨µ¤´‡¨R1 &Ý’Ùá$ï¶Õ*]»5»v1 öÒÃô"é ¦tÖ‚n0û/xí e>—X1ô¨çc\,ܱ”™ *Ðèî$8ã'Ϥ¹fZx¤ˆùëp}–ì#hk>já»'ÛA0ÒÔê"eIàÅYmˆ7µä¦êíÕÛX|~³²öÂs€(ë–uí^TV¥"÷K9RôÉd&¡þ’‹ŸËÕ|pïÎ̯khÙá*ž–Á_}yoý=(3„pºšæÓ=#¹w±Qž¢]øÝÒ°‰78UFÐú°ò¶µÈ‰êmˆÁ À¶B5©^†˘ˆÃüº•Z Ññ¢²/ó#&êYxÊFy :GjÜž¤4a³C­†–þJ -êlUÜu–ÊÓw~ò§4¼ˆ‡Ào±(ø=·ÒÎï”äH8².ëêöÝ‹ 2Z£0žþ¥´lFÓõui"öŒÊB–½È˜¹­»³Ó ÍþYžºnüGù‚–ÊöQÊ}tX<‹ûè)Pq"0<ûcjSâ ±Y(V=èYçZº>O`³=à½Õ¶Þ0òD0d+34GŒqÍ“ÿI p;Ñs)»HÓLG“Ö…-~äõ¿Dc4×A-’FpSM™X°]ï$H†­òW‚É&mßË™ÃÌ­UR> <óOzV&¥‚mGnÍ­SÔHLµ‡¹E£"6 †çíuŽH΀† Õ_äMÜÁ¶¬ËMmÓ  6iÓ š{L9w›6‹m5£É9ÄJï‰ò¡A¥¤ð`ôÑ©q…S?ZeŒ†Å2[ÿ†5 Ñ-›8”Ebçú• ¼Ï¢3éYoÆ~CÙÚ"4ò3H’ ü‰<è½ôd£Æ–Ö¢‡5 *ö²äÕüQH%¦b^'7Rb>Ö¯Û‡lüìÁ"kI#­ ³ÆL?X¬Söƒ>²¹]U jZßÖ4¨3‹ô 2a² ×üäîþÊæè™‘•êè’ â Ë-d·È݃þx¨fS>i‰¡ ;4àè‡ÆX².ÇÆÖA•>zë‹´Ôˆ¿4S'ÆÖèfÑö‘„%ÛnØçTбŸ¤Êã½]©éÂÞÆY˫׻í‹„ ÀæF74^kî)¹l«4¿$ɤ‚Ÿ’ËGð j&´»Ún t­Ë+Ð$ÔŒyÝf]0ÐOSk}‰ä·¾õ›üïB¾s8ô©æ¬Õ)B1W擳äg]úèCÒ wˆâNÖ‚æ¥ [«îoÞüJÐ0¨+/âCYlp”³6- =1§kvמ(ÙZ…6¶]~É UgqP¥Â‘låÏÔî„<]a—VŸ[xêÛ"ìJ¼ڒu³¯|ã­gݪ 3ŸŸ;ÝN+,kO¹«Çzz ešœÍ|§BU>Öåi¥ÜÕ³Î0%xÖû9 “ »+<ëƒm`e<…E¬ ãï ºãb$’†5Û4“;]EÌG»Èvü•ÝŠŒ»´—Úª‡ñÁë^ù.làðÝÞ« C¿ùdUF|oªÿæ!+}H´HCÊß* øä“3ÍÓ8›`Cã“]¹W”}Ú™ƒÞÏúÜ4ÖYŸÂÕu…½HZ­œ’’T= ö»6ñŽõÅ>zWÂûÕü5§Q±ÂßD?R±´M x¨¹g(wéû ™]Š»þ·ŠÔ€ì©É܃^•‘Ç)W‹ÔÏÚ?a˜V3¶‚b‚r;–@è»ÎÌæ%ÂäW…{¯Ùà;q2âÞÎE¹Éšzþš"cÂÊn#«§øão°ÈI¹8÷‰o§¡&½h¶?! ?¤ó´Gû¨øÆG dZרö‰xï5ýyX Iãa0AZ/Ý˃EƒrS;üÖ0û.²B7´Ï>€í “>üO½IŸÑƒÜȼk†ßqý’müÝë£ 6¡ÌÊG»Ó#p².«rxh~Ñwb’g˜{*=o›û¥gW”åY×´¢”¬P2 '™ìW¨“R¬³š\›3Ú³mebû…­ h\>H ëZTDA«–z&Ó †~‚$R®©tf,­—-ëB§–ż×å6šñIµ¼<’êz’¨>ÅìþI”ì Á® 5SȃìwÿlaÝ2!pÛ~Ò¸s$i[ÇJÍíL%SqùZ×lŠP­9´®](>õò!DˆecHxʳOc[ý¢æžuíñùh5…S/ëÇ>ç'#[ãS$´Û|ÖeûŧuNM²1?Öµ¾ÊGcا@¶&a€¸xSúÛÚ¸Öõ¡pGÂ??¾kNÉKÕ5»¬«' $ ºª­zØ •Ôw>›ö…& ÅSå¢Tkl¥áÃS%JP•—»ªU´žŠîï4·ÿVd\Ó>‘q}¦Höfº÷|óg¤'!¨A))q„t‘@'—~ô´¡èÕ‹”ñ¬|”ñV{:òÏwm©_Ã7ÓlìŒæöé•ÃRü/JS‘P‘Éw­¬ "cÙLÂÚ[ï¹Ö5ZB} |Õ?÷h_Ž ¨Keëþît6A¾d².Ažz¬’±äÖp˜õ~Æu˜”´Ôˆ X“8”Çà,ÄB½z{Ø÷Aïšá«-OQ·N“å¾ص®v‰W_͸÷ËY¯j·d÷ ­ÇÖ*–õØüòw^ø OÏHPœÔ@8bUêì»f2Š¿~תÙ5oѵß`ŽO„Jv8Ý}Ó™„yø¤êz,‚e›•/1‚'ÚˆlÛ–×µ{)þG3¶?rþבx»'ÙÕ²O1xäÈÀÿÌO*uï¦ñëw­¯@àaPoE‹DpŽq:*ämñ ä’Áã£3ßiVN9¤ÿÚªi¨Ó¿m÷±.üþšÃ¬û£Ÿ]Sê;âßþtÌöW {×ÂO꼤Ϻš½{“Ę̂ƒ®Ž9yð:mú®^LÖåEÂÐã•@väcSU5cY[ &óÈo/B2é€÷XÚ€œ[¾«/Ë Ý/ú¢ï‚*k LaY{a°KbÔÂrdç|òýóñ( .ÿ8›óIÉ À®^ýó¬Ïá™: ½WÕ™ø=r…îJ³}¶,”Š ¬–÷úø.O­4ç°sÒQ_–µ š@Ï|ƒ±}¾’Mw+ì Y·ói­š©Èƒ/U†~š²«>/M”‚aÝSZÚ%Sü覺ë™ô¬Y0Õ»Èù( d¦ZþïFërÇj})'ÇR˜ú±³}&A¥È"AWŸiôhª4áÝM6Yvý©©r‡Aºð]HãìS¤ƒŽã•¶r°„‡YLŒ¸XgÔÆDÛC©WâÍÆìõ®ªR|OfÕ «o:ý´[öêrh*èAÅ–uÜÕGùvNzдK/C#>(:\©œú21‹ÕMo&9ÙõöÇ}ö§ßÕu[‘’-mV@ožàªè†- Œ…çåµ®&ù³ VÈ3¬ÐIàXìþ„±»7Î@ŠÄ9:ýÍ-u]¡[ËøçÖ.‡,ÿNÇqÏîƒs*K\1‚&|Òá?Øþ²—Ú*{|5æH0[ì–®ÜM €„]­hÁ2³wþÕ(Þ.à³ÞA'¬(×¶^}¤f÷KcgæÙlºOÿCo¥ëb$°YJ0¢Ç¸ÄR 2\ƒÁ°Ô‘]`p&ŒˆxµRñüïÅÕ÷{Ëס÷¦å# ^Ô‘pï ʼn9»Ô¡ÁB.ÈÓ£úûÿ½ 8²EVe"Yuâµ š@ÃM€‰f4càbh]x˜ä;¡bËYÒž]K¥T AÄ|?,,@UŽ ²-ç=ÀÚ•L‘Á*‚EÙùS—”$b(>d]µ¦tÇ%ø\§'’‹¦>#†¨Ma{/›ôþb=Z˜g…7\òĦ嗠pŶ;FU÷B\=0C E4 ;ô‚ ±¥ìø ‹³ü‚ˆ ¨ägÑÍ«7­hÚÖòš9ÊêËüî­î&IÆõßiê‘ÝÆÕˆënü™jA †`õ‰ç¼ùd!ÂA'RÖ´îb#]X9€ÚQ€Ð$Ý9Йt10Kq“и.ꙎB ¨C[þ†ˆeìÃ{Z„y‡jÉÒÜèÎëlÓH‚IÛëí©ÖÀ~Åœ=o\_•÷³:ótàB¨ƒ–ë¶ÕYX@ê=‹<„jjD‚«#óf´ú–ö£¿¦wUM˜èU.ÁõCέ`Pi»£˜”ö¡ \¬’‘{>ê£ 7ûÿ,ý³ë³µÞƒirš0ò-CЬEŠ ³d ²I9Y õVº¸=.}ú[îòÙ³ÏA³1cbÍÅI´Gîóô€6Étnö|S­ñ‘’2‘SúS>r-îO¸ÏØ>Ø8¼ö-·RàÈ:Ãä úm†¨õä"n'óS$¬ ‘g ÝÖœ4ɤzíO®&úé:•‘‰l:D"!F£0w‡ ÑCasùÔáz.o =k¾•Ö5N—tUõð…Y/3½< µtQQËë‹ñ­I…qq’{ÐSÊxf’ñÑXlc,jcà6ÈÔèÝáDv‘H6Pé -–}h…î‡>êì–‹ ±ÂqšŒuä4#š$ÀÂ{ºã6°tÖüvKŸ „ÆÊÈD2 ϺÉaR§ƒ¯}k%ƒ#`ŠLsêÌ{8l[Àý´µ1µY4ë‹ÿP;BéýÜ“>ÉÎärÓ'T9fñÂ7»[̱G/†pT,¡«œCm‡²K*oFç·k3ÍÝÕ‡EÀËüÏ @å¦(ÄKã³=@òcY³Â09sã:JË}´§Øs×56ÎVª5äШ^冕†2È4ýªÎ–½Š=Ùë`Ððú¨|èËo+ƒœIstRšë™±%Š$ÖH> ³#Øb( x_±å£ú¼Æ¤u¡ý™‡`Ÿ \ê-Ÿ,,,Ñ<'Ïn8È®y$p}C{e˜×ñKfÜ2šUÝ”7›ÔÀ„ª5‰'?Ò¸Ú]vÏ* ®‹”]ÖGvhpÁ+æ™Ì„"ÃÐ-6Åskþ´E`Ú Is€$e ­ŸyâÍ,\§³Áf}ª F~Æ@S›Út„ž7Pìz˜¢VE"‚6B°<Ði’#XXø‰ öéF ºÒö;Æ+ÆÚãH!Ûê”ÜPDüݨ·ß¦1æÖ›gñÊIð³ŸÞø0ýýMô̤)1?¨eÜûëX´®b¼´šS÷‡CÅúG2­q_Ù•Ôo­Ä}âõjÆ»‹ÝÄÔØ?iHš´S®"UÏQ>š¿€¡Èwvšn ”VêiÔ¼á {u>?ŒˆÔÉÌþÛ]oÝUKÖ\×ûz¨–ÔBñJ@_ã.ëò?«n±—)Z?eŠT¢öSx/•²f6碷‹]¦:ýŸÕg·'öZrYDz6Ôòd|v±©˜u‹„ìæà ™dékÓr=ˆ@q¯nÚÀG?hd¯>$v5pé”°s|4²žà˵®²VFÐíi¤¸‚Çí–(¸CÃ>ò³îÜçy:2ä•#y” =Ó‘ü7ÉA­}Æ‹…á, ²í<­jßv f6=>h])XwÍÌ´BUžÇv•¦±Q,˜¡Žœdoà~ãöøÐW´þ‘ô3Ééa’@öŸ‚‘¼wí­»?²G¿ì+CM1ÑXûÊyÚ“ »æð°ÎÏÙôú5®ö D~2V6¶ƒê¨KY%ºZ^ˆÝ~%Tm‹TbÕùAÅ·.ÕÒ:¥gº5éýc§²§ZG*&ã/‚ÅÌÏ×w?i]…\éÈpÌÓ—ÆÒ²|ûûmdÚL‘°²ub;ia@§~b¤Lˆé¦ä:½V—Ãk–H?ꓲ¥õ~æÔ\jÇò¬þŠÛïQ`ÜñNG¶Ááðe],É6ˆ^ÉIåкÐL¦°;íþXשˆnfVr ÐöcËÞá^­Ðm«ò ˆ¤A­d¢¸¼”ZÍ‘ëT‹Öñá—`¶;VW§¤SÜeòSL2W~ötWmQÁî¶>wh.ªˆÅNžhÑúž©þ‰T’Š( ó¬$Ž*°ˆÚ;‚²®^?r²¨•˜Ÿyiònãƒæö™?=Ì5‡y>óO84p÷bÐxz9îàmæw<"r¶8ļþЬºð­X¡KOë*oz4oúRSÁ §MÈ(£4Å^Obà>ÙÓUˆ¹±K„8I~Ÿ³Ù¶e6ê†7m£¡L뢽¥ $êõYW(sWÚ–~-Ú§¹Ú©l–t!O´$™y±·UÔÒ]A–‡î*eïåÄ ÷¤‡ Ê PVÓ‘UKŠ×ˆ™ëé}€`p‹Ê04$›ØÛÒæÖì9Tý½ L±´%S/žBYkã³`Y˜( R¦Ö·Ì35!<«X²ýõÚU×]q•%J˜­n$cYܬ•j¹xæíi…Çë\k;8Ü‹ž¼˜Ã™)*õ-20Šçzk ˆåýp}45l‘è |0íå‹ûÙ{oY—ñ5¨" VÛC»®@ñqxà¶’+¸Ø’Ö`b?¥; ×R¤33ç”Úƒ ´z²QcKì83­ËÃî¡#sç7˜üÃùÍtde”Ôéœøéš¿RÀö§êìZ´b!³=rþkw‚øšÃ)S1Øã¢¤@ý·©E&5žaÛúŽ”;ÿ}#û½å»À¬±:ù–ÑÓ¨GÄø³1ßÀ3ç½ Ë{ vÔ.Õ‹–+ü3ûùд%šË}Tä…³‘÷óëÓ‚ó±½… “d‡ò/¼ë³:ÿ_[¦^hGʼn.ÍNƒjü Ëý˜˜.uÒÊÊIÚþlLÔõ6©-EOûÄIæ¼b(×òw¯YýbÖø*»‘ä‰Ü¥ˆ*•Š!÷E¸Â"QÜ3ßÓ£‡©@4µö–/£x§”+ºá%%'ÑÓ¨I¨B$¯¹Í®ôjUÊxr~Ö1š>*ð´®V»ZÈÖuÀÁÄo¥rãuPoqëB.êHi§ ¶Éi "Ð*FqxVå•ßuÅ_ò) æ‘Ô¨[þÊ‘d[Kß׫­.‚m¯O¿²vi«CK‰Rù,Ö×¹$´î9EöA€^ÚµB°OW8£~:~÷Îßí¥`£A¹iHdÒ3ÑxÙ¼ ´—Šhž·Y F"›íKixrL^~ã™Ò”±öŸ²Q¢¥R êL¨v¥uÕ>Rc0”XGš fjŸº`Í]Y‚bØ}ÒîÜ’ ¨ÎAª{«rxu‹®§´£ÌÍßÌÖäh$°ËN5’(GRÁ¹û¤`2D»ªš‹å@ÖR…*6ÉŠ^ç:¨dXçI,2Sû¸Š~²bÇÚãÊø„TQ¦qq}òC¥QH—J&{äyï‚'› .š¸…KÑCĤ‹móT”4Îz@%y€Íç|•ÔÙ³#âûHK+‰ÞæË~ÔüÇ¥|Axê~ï²tW ™ß²7ëÌÑŸÖôEà´ÙTuZ‘†°g••O¶“¦;DZVÑÃ¥íCÍiæGh§ÈÄo”Ë‹ zot’¥mÃ+/¶_ \mßk¯îÃ.èGá±ízøV@a¾¦u•ôô?M!ó—€È•ÏoØ’â9xJšš)”¸C×\Î p¦qž`ä#ÃõEBç£çé ά鼦ë­9ZÉ—6ôÊÌdP…JC¡9ªƒvvZd ‚3Bê#­¹ño[¡»ê…fŒå£+:c®iO˜÷>wZ×°’Y¬l:²þ&A×ÔÚ w‡-ÉÆ{4 A±°Äº õªzäš²»·IvÍÁë‚l³I¤¤ÿ„À U~,Æc<˜;µRB?æiÆÞ±×8Y ǹQôôËäK¶ÑÚÙ©àµ#Ahÿ¥N—´¦úa6Â>Ù^$q­JüŠ¥Lóßå®c7¼0r„Ù”t…˜) µJYˆ Ü~×­9j¡è(¤«Ì蔬`Ň=©“…•Qfënž5m?ªÓ!ƒÚ&±?·™Í·¢äò_JÞyZ’Jf å¡¶l¨¨,Õå%¥âî›Ô[[ ]ÞYˤÖ”tí#I%¡YÌ RÌEBÍÒ ã‚¶“‚éÐ,›ù-IgŠ-ûÚXY`ÁYæ0Ù\€ÑÔjì«`¢²}óœí|š–1þ´Ôå…~á…S]3¬±ëÁÌ5øÈü§ª—í©Hö4f ~¢¼\;*Aí1MÝt¨Q¬xƶ/ðá鯑MC„#ÛŸÁ ]蔌epDô*lK3Ÿk8Û*É—=_Í1”]aïƒØ+˜+Â>žîLíáuŸ‚ÞÛÝ‹Gžšš³”sX$ŒZR‰“Ø)e<àyÒÙÄ£=Ê‹ÜK”Rr+†¥ŒŒ(Û‘ûlT@ÄŸmC¯Å:©_ÆÌØã “ÌYžœåíQßm¡§ W>ò`í+C FxºŠ9ªœH©ËhwPPPÍ?ûQ|î3Ù¼ôëk´!,5ð“BeÃX³(Ÿ¬½lý 7¹-„z¤ÃâÎ¯Ñ ¡—)Ôè_@L”+÷h¹Gtú22^MœûbÔ«|ÃÔf;)ø 9Ònòjç#Öè½¥ïŠ×Ù˜¿|T¨Z |™¹I¿zù»yñ]ÏæGo>§ye›hæ#¶¸5ÇYúÄŸ^KëÂÔñlþ†Fªâh¬¥¤&ꂇž¿z»ËR`<|îÉÈk$+^3‹ïØ™©òj»¤nÌ’>yóH»rš,ŒO²ÏU>_jMu‡L…²Ó'Ó¸Ðäø49ÈÊŸ X[xž]}ÆYg}ô¾©qv¢û2„EþÊ+ZYvj UÆ÷/žße÷»úÄ£§ïìñ–Øv¹mvŠŸ@‡,šZŸ]ÖÕ­w&k_d…{šT­áº>]¶9i„î ˜†ÇVæ¡Ù…î*–”:?AÝCcµqOçÞj˺ (̼b2Â|Û+*†’ÖU_7Üî¼¥ua%äIûÞ6Ô”®9t§Øªû# †»oÞ\•7ï’éB+ªÚK~}…Ÿ˜í \6SÚtÛ›“@‚(A@AßôPþKÓ»æ45·“Íòa¿m…+Žyr§A%Q,Æ3‡mÜÈqu±í)‚]ÉÞG tM­¬N¯†Ü¨¤©`éÅLh ÞâÍ^ j‡Û45»Ù¢—?Y§«5YÂŒŒ¡'Ti…•¢O}=h]¸A´®ò/צ­MÈÆº.¦ ] ¸U/Rî¾WÅR$;¿¯ìù»lŸyáBõnÿ]è8ŸÍ´SSN Æ#1CtTØ[# !Š„M+¬TfŽèõQ]‡mãÔSù‡ G+ô™H¸Ïk„ÜñÉçeð>êiØÉƀț/AGŽ8nšz j­§¦~ñkù ÌýVË׺J™O²¦ÖoÕùԡפWëo×.î~ß+Ô¹¬Sös—ûç{ш”_aUÖZýˆØªù€yh¥|* 4²xôžõI]UY¡ÿ<¸'…Ù³¹-XãÜÓçXÛTîÅžòn×mö»Ü+Òº&¨úSR]­žÊÓ±i¥±P¶ço23Š‘{ÅÔ¶ü‹±—’¿> ^[µMs˜H=_K¿È µÍ{lÇI®ÓëÇ´Ï••¿Ûÿj ¨è¹Ýìiâî´.$Ä;3´ÂúøÔ-ìMÒ{ÖŒ˜{UE¹c­1$Ì>ó @oïúóŠôÆÁ)w}ð ^D=!rÔ£ýîí„+­,ڛϯ”Sh]XÍP\9rx^1ùÅl5Üš#e¨£W?õIÉ]×Û«ï´}û©f˜åïF‘~A™÷±¢®êzéçëÕ§Ä|ôê{ ­£5žïzõ#môê«L­>bîùzõD’ÒJ˯Ovçïe•çY'Ãd¬uf¯)6')´¾þf““6²“¿Û^Ón'l¥tüEl^,èÃýÞ½ö~+ÄwšQnÝúBÙ©O=&y—ÙÙn¢4Ó†€»»ý<»Œª#_ôŽâf¥+Œ%³ÅpŠKo 7`¯O»³É@´Ðp£³"ê õjF5‘j$kªÏlgŸ"‘ó¶vƵ®Qîu…YövR‰î ³ ˆõ^šñ“æ™Æ­ÚÔ„è›P4äû°Ðzׯ q6-6éÓ³4cÊL;ž€¯’=å±—â}—…ú'_{åȼêQ¸é+g´HÃëéßòïSäa›Ïï¼ÈÛâ|‚äw«ãééBÚ|ó FVhÁ,¢þ5`kµ{ÂO¬eÞ…7“•𿯍dÇl³Yu–T€”š=\4¨l0ÑõÂbȺ¼&ž´¡ù´DîCÇÀà 'ÕµÕ0Ÿpü‹?ûƒ ò»šÉZŒÔ‚õšIXìE¤6âÍf~ÒFM¨ÕçñƒFë¬ö:j ˆ‰Ðîê)´;­Ž²Â^Çgß«–<Ï×Ù…¸kÇ7öìz¹½owaæŸ §´µQV¢'°•©IÐá`>ªÎZøhk©›6äa¤Ð6üE´cLÐAxßi]ФªÙ¹XH8òK!Ñ™“Ww¹'Ïàu“ñtU’w±Ü_Õ„wko´}P²0÷;½Út"‡nTZŒñ‚E…^ÄÓ µI­% åû6^'CT+§Ñ€]ESlO³ÈóãÌPf¡‹ÍÁµ×n9ÐÞ¨a½³›†{i’#‚FÿÄ1„à4ÿ¤³±vÈF§óð23n/´«ÒöaÔ=g ,u½DËnÿ ¥š÷f†JLl$dt«mY€—‰…†2Í2âíà5$ž*dÙB@7ÈÐ kK\_O‰eÁ5 ëÄ_Œ =a’ Ø›ë¥2ƒ+3SÀ'FíÌŽÁ ùA>ÔÁPtÒÔÀN&{£Å‡|^‚ÚÚZórM@j  „|N²‡|6ñBÍRPz« ÚX‘¦jñÕ8´‚bo§î×¥D8í‹ô™¬ùå6ËLÞͺ ¥9†ðÍ*ASX?«é“ÖyØ•GØ4ÅöÉþ·LfKXM®®Gy> B¶ò†‡3mÒYw‡êYÒ·…:„¼Ž––$¹ë§V-tô¾DJ±PìI…MwŽÁ>*†º­ÅŠ$ر”IgcçC¥vuͱãÉm½hÏ“ ®/é"ÑÅ?]_"iN×í³|”ôŽ·W>”œ¾jɬt¡ªKM(/òʾ2Ÿr¿±JS7N¦©¡¿U?™[#ú òÍD øûœZÁC¡}F#3±|k"3A¢$Üy-‚r gµÏ¸¾¬™5_Æ7ßæ"ðºÜ$¹šqmÿK½³™IÛÆó¹…gðSþ¡¾¿ l˜hŸñt éB£~¦#KÝÌ7e*•©{³JØÀÆ‚lFÆÐYkt6øuÜZ¬ãh¹jlüàZž»‰‹r^±§_¥¢‚U.7Žq¾’*­êt¥ÈÚÇÇMÈ„ÒÔög«È‹ò´éëàZ€B"A$ÙMg®d 5ç¨ë)ë y5q`AEY”}sÃ`U-®Ö¸µÛ'”ÍÏ>ã™”vjÁ JCÈ e!…âW‘æÐC Ëý£æ* ä®z4ˆg4²]£)b›Ú¤ðá{Ò$¡MCG6ÇI“ÄŠC¶ÆcK0 X™}WðnÎOôêbÜnuOÙÐW½µH*¬ãÉ’l®‡8ÛÈ€á>å/¿”ìšwÛkjKÛÅÉ@¿õq…ýCn³Ñ«ÍcŸØÚÆG›ômr^î:«9Ë…×¶Ä…†ÂãJ– ÔT´^9Ì¡ÐYSõVRªU†dÁìÅ·Þö ý}l;×ã˜Úuuƒü¨Ä´L$ÆGñd€½zî‡2:9Ä è6¤³Öú ]]U¤5RÄëä_§%à/}Óe:­]I® ìƒj *ì4œ=8v®± È%Ö2›Bž›“²<'uÄjE¬Z@ çO¼è¢óFÇeçGÆFƒ:»NÓé’ ù䯱mÁÂñ§öB:° P¯6?ù¢}ø»0:¥[k\ÁAWÄ–JP‹KØb0Ó’¾ËwD7 ÓðÞH UÊJ+GÖ5  N§d]|!½6Iw¸©‰9©®ÎÅ|ÈÒk]˜›¼3`h|ÄKYß®äý¤Ñó ŒÔri¥ûZ¸5èãP;ÓEÂRmiš;vÿUÆf©Œˆü4¨±vÿÔ0™ƒµ 7#–¢[€<Ÿß ÷¥À-'Q4šÊû#u×¶ÆÓ¹ßÿpƒ7®ò}‰–}&z?ÚfC² ŠaQ1fñ)eŽí£Â5 TDŸæÞ¨ ÕhM¤ÙLͯ֋ jòJæ³šï™ kþ˜›äÆîpßöBééÕ–ÑÜ‘/­ån«ßÕî7£}«r<ÀšÑ=^ ´’Þ=ÚM#Z2: ËÄáE¾) Ÿ)%‰çb=i¬aP-é©¢ÑZ$Ø:GÉÊpÃ'=ÏSÔÐØ{Mß…±3É€Cÿ5ù‘VìòKža,à•µ<¨…,A0ÝNÒKÀŽÉÞ‹±ÐVÇìÔ&^ñK¾¦÷n ýé¾ñ‘A “ÏÍç’0뇤¼›4¡õT=Is¥³Á¢Ô*ü’ÿÕ̰b´’¥$ø=ò;€ß¿»õðA%‹ &Øí€©5¶RÄ e³©æð‡TT‚ºMOuã ÉODñzжeiÞ‚¿¸Ù¨ eoÙçyÍ çúê$<ØÀc÷ÛKaÉ#žRÝd+÷šÿŒ|˜ª³¬×€šKßy”™Mh;'{v0ÞqÊc0_ò¿™‘Ä5å ‚@¿&ùÂ)‰\{ˆmêíQÔäijŸÊ­ýÓ¾ž-éZ¯4Be\k‹ü•ÈKJ¡Õ ¹šy°Ì¸-‹™¥7±Œv2͉mü<7¨þȱµÐÊx&mR©…YyŠ–ý’@æg Å>Ç>Ì KkªF<+Yò]ØTU)0ª"¨[¹|‘օ |zROÞí¹«ó!ÜÂ0)öÎÛ€YÛ¤ÑÅ uvz(7cš|džn¤±¢¥_Ò¦#õ£±Æ £²”ÈiåA•ní ÀîÊ3ØÉ÷¹Wj;ÇiíJi¢è­o yßžB™J4÷LkǵòÞbL:oÈ'‡JÈ£ôF €ÒСÕsòÙþ¼è³‘OÉ“QIw`±iæ°á[vÇhºÓ—§38Ó[Küª{–£øÎ¦2ŠÓý¡áð«óbaí´.HeÒº@Ü)GVtÃC˜éC">ŽŠ¼B iÜp‹UX —£;Ž,eÉCù»~±•ÄGø±½´ƒÓ³æhÒÙ´EQJ“h¬¿eO-à7v•Sû1Æ‘•¦æÙÞÌŽ0tSÜÐÝŽr?¯ÊÕÆÀ “tnÓ1{O:¾ PL¨Ê´ÌÉ-ØÊiP^e’â_É4ÃÄMþ.\…Ik£´òÄR‘DÏ!Ž‘‘úš—ÖžL¾×¹+Ðzµƒ=‰45Ïâij?KÎ/¢eF†æIåœ*¸#Eó 26qýl¾Þ²ÿŽPQª"{R^Ϫ¾Hë×Yœ^ÎRæÍeM2u$Û‡b•/ -ýÓžnÈóxò¦FÝú€/ ªºM.”õUr©¦¶l³×»‰§º?hs|4±-[ùörB^2í;ôq8kÛæm ±F=gÏï^NՓ놲¶$›ÊÛ‹xJ.µ ZWM ¡7Ç‘¶,X™]¾ ôW»è³k]‹ŠKá?§ŠØÍ¾ùlõbiž ¯¼á#X½¡-ÆD©Ýù:ƒx®Ñ6z“LzKaæÛQz„1OiïH¬Ñ³)<‚,—vW^Šå„R`î6×=„®´.ìZþTÀ›ùVŒN¢ÌºÑŒŒ€Ýe‘àþÅ“N£0d u±’a²÷¾>Ö5MYý©SîjH’1è^D‚‹ÍæÃˆy:,k 1DBÑÙñ9ì(ꨈ}Ë çY»õé3¾iiA¼Òº€iuñQt½ètóùé3–ñ‚JÀ9LukÉÞÀ¥Þj~•¾¤11÷¦ÎS†ª7qZ¦ZÖ«/~†OZ‘l¯Ñ?¾ 4º´ÂvŽ<”¿JöñjOêû:2KyâÊL¹?†¥T; y"RÊ\€?çÞ.üJm¶àføZ×™êÇz† Ç®å‹Ó¨¬ùC­QÔWGt¦¨œØüÂp²ds!xxÒÔ@tsª|×6¾ö†™SWv¼Y1X€ÐY˜ØOšC¿qûY—¿ÂrJ{¬«n)÷úQto©°zábå£\\Þ ã ­W“Œß’[¹5!Ä@(® àQÞpšäŒ6”R-—ɺÞ6þ“ë¼ã¬k5ëö žúg_õ›Ù¼ÿ·$âÆC®î£0Y/5íUÿ3MOëÚÃÒ6°D­"°W”ÅȈERë –' Á-¬`èÁKœ‰}"álà<$àõ]§(XÔG‰t­k$gp k*g-`"¤bÄX•í u)ô]»ž_ûfMýn¼¤ïºUÐó]©y¾kïJ©èð]K"îuÜÂ>}×J¹ãdm¦ˆÅØ€=üÉŸzeÍh]óH~ã?JÇ…–ÊDtte]~‡hu*C±–¶ƒ“åŸ0ùzúϺŠädk­2Bÿ`}|×è²®unÔ;ö ¶ùÌ"Æ÷\†¯¨(ë‡þÞšgfEäÚ×þFF)yá«)ïꦾƒ×k ´COÍ~%èꃱٔi •¦È¸u ‘YB VÖUnYÚ²sʺƜz{K<)4ûîñ¦’ ­ÏA½¼kg~<_ED{Ou\&Uâ×ÉyÍŒ…7ïÒTÇPuVo£ÌrÏKµà£rzùÔÒ¿Èh[ ³ÓûP²æ9ùùT“wãìiËyûËj¾ì¥éA<û ÛúhËŽ–Ž::Ì3Û/˜t™(øÁƒ%t'Gj~eSëçh$k` ÇGŸRÃÌ»VM7{gw”ÙÆÜd}ĦíÆ-ÑÆÈæ×¾²2Lb”ÄùS™—*àYW’S÷ ð1µ:U¶ò9¨ó޽^{âU[¦_»zn^¢'É=Ä쉪îAMÞȱÂݺ&/YQ–›ÞdˆS±µl›_CÉ9rüÒò<_ùˆ?¡Ò箎RüÒ/‡X$ײæÀ^çTO¿·Zø"4‘KO ÜÕž@ÖÄæî£ú]»Û¦ïòŒEØÛU?1„‘l!ÀoW+þ P¡#ƒ,(}—¿Ûù¢ îÈ@;cСdfôì‹.ö‘|EüSþТ€Ô` ÆñÒÞ×âÚ²¡Q&1’Aíš"Ù8]£d@E™Å"»Z «k‚‹Õž¶ÞdwÀ»Ø·:À4ÐØ`?¬’Ô=!\ôqd—¼þÚÆ¹ÛP¯#ч$³=c-Ÿ&ÄI¡Y¼#ƒ!¼q¾Íh¬Á溗Q-³Ç˜T’_CñÔŸ ü}.ê*‹v kŠ|—§˜Â@Ö—èÞd´™h¬ÛcWyÝÔV…Ð4*íó#>`=1f€<íìëá=d†Š`8ã—¢P9lOLƒ¦6†I$»7²gã•À'Fõ®W™wɺ¿&Ù«ÊB&=ÅçcAèÍž†[aÜö‡”M–®yþ LxLÖÕÆg¦%Täöê>¥zZgŠï¹Çb˜l‹I˜»Ïy$_†ù.÷~›‘±<>÷×Õºbè× ,AN°Ü kü!3Âý Í͉´ÃÚ˜jÍ\‰T˶†ŽîX¥ÍæÎáÓM…±ðÛ«p=kâŸþʀhÇa}¶nNm@r[Â>”fRe]eÒÙŒ`óâœI+f9Lñ-d9¸Æ®“ÿ1 5áïh‘nÍ3ºB+œlîá!pF+ÚpÿþÖ$ú“‚í@¢“x~MËØtq˜shÎ8úçuöê]p? qh]î6²XP .ô/Ãc!÷nÞŸ%Jš3Bq‚6Ô8† ŸÔiPбføó,0¹þ?ÚÔÕ‚h,?%59n•ý<C“Ðìþ”0‘j‰wô8jBœ#é‡2ÏgÎXZSdìcHH²'ØÀHi‹¸ fÚ!éNëòÿ–(<ðÚ—œ&bè8Œñ;QÇnj§J£ÇRýåçFP %l,Òf¯7¤¢åýÐ4 AÕÚtº‘ÝÝŸ›RxjbI^@jOéäµÝL:ª-îjÅÝÊ}¸`Ò: Œ‰ØáÜ«K&ÖkÉES³’ ’PPX4ìäY§ ¡ÁQh’m5åtc Tiáoã`Ѐ:Vüë–è‚èjq‚…+‡î ´ð7-[¬GÒº €Aëò'¾ù"Øæ?Z˜Ç­ÿ¸dæ¦uuX½ŠEgÓ@¾,ŒD©L%£˜Ï&ö›:à¡ÖÑèÈP ÒÔ<ÌRf{ë/÷{PlÁqlRP1*í\¸HÿÓØÊ ×d@]ìÁwd PµÐU„.6uJNzruyÜÝ}û¤C€.6û•˜E޳ü.Ô°_Ò¡ €6×mrB"¨ÆÔ›qy )Ážê߈'ŒÐòå‡8ýîq>ë!î®$Ú§Pÿ±]õÙyZ[+*îŽÞŠþ „Ï;1dûìÏÊRnÍöÙwØ]¼Åh»t•F^ Ï*•æŠ,Ç®ah+Z°\ ûdn9À›4Ië9YôY9?ôR×d]Ø=¡¹×jú©pJYx^“uôÄ0*—°)[²éãu~ª ÷µ·,‚Aµ„­òè Œ•Îf”–è¥ËÝäð:eÍ.`Õ[ÛC§ËÕØ¦ªïtшàº=ÖÓÛj˜4ôšˆúÇ6;Ëh‚Žš¹{§næ§ãòÞŠõY~¯}IŠÀ‹X±) &fF6û– Ø©&¨]ÏÜE>×.6ö¤ØÆØ@@è÷r«@.7‚}¤S/ƪëvIìfìR&výÿô®y:t2Us€OŒ?Ã6U-_äóô†F8K#öœ™~ÿO„?÷µTöÅÆüð`zheÎãýƒ«H9¶p6»©ƒë›él&¤s†¾ÔVÑé<ù`p^½Ñg‰°ë‘‡Ü¡­/-J¹¢Ó0‹´¯@šqm÷©2l-lï·&s·……Ñ–jIÞw@ÛL¤þÔO÷rM P'”ó¢ e!™VéÖ„i_kÐÔ@eAS›ó2rf º4iöZiPþÊ T)ì²ù=¶‘F8¼(³ Z˜¢áVyT¢ Âbæk]Ib\_´.ÌÁ¹ ´N6%ƒ‡>5qƒ°Pý3”ß³+ðHÐ)­“•ˆL±#˜Ï%£Êºkï±d s€V’ã ôU¸ÏéžTK !eéÈj*¾Ü¥Éw%;ã™FÉÉX”Å)Ryug“ „ÂQ14>šÂøíf¢ëBêÛö¾¦¼ß¶M“T=ó˜wdÆSY}M¹+K´ ÜñœZà®–‚›ˆêRÁ¦_´ÏˆušO èþðølÞížÊ1JºtK¹fÁ~z\Ÿ€1ا¢+¬}hùÈ›R(/ r'áî­JÔ÷Q/Â#q¼ñ¯/VØùŽ ×âò-znµ³Ìð¿“É("zI:)€(;y$@½sRýÓ¶–dlPRÊu4‘z—BYë];lŸ©ý¹«uº5¨0‚Ž•Pì iKm°~³5€=¢ÉŠ6ú•.¯öÙZôz{2C«Š úäNÞeääœ ½ {Û¾úiPh£|~ê¶#âŽ~FòGbgBHmãRµ"½OŽ-£GÆØÓ£í'sÀ¤†|ÖT×A:—~qŽ%cõॕׄéßîñùA“?Èï·xN $Éjd{þN:}Whi%µ× ú“µzÉ-mä<5i™b"ý+®{‰IËóÒdY‹šß˜‘•¹õÖ·tÔ—Rg!Ý>­ËOvøÈúI9ËØvæ>¢éKñã×côÂËÈE°Kä*û4îuÕSË"!þì§ žU<'XÓçÒýtJ!⑘®ð‘ Å wç ÎîÉÑþ[¥w‚£"1mj^–!}ÆÀ¡H »USæ ‚:}©eM›$AѧKÒŒXT\’;FšóᛨZïI °Û\ý3}¯ª9 ÑBÁO UOîbsî#4 E†I²Çh÷'ËÚÀ®k2Á‰xr¤¡5`¹:tî`ijµÌä¢ÌýK¢,„G5ÿ QíñD½nÇÈ%¬`ÒbîÞøÃïÁ`8hísy,êžÃÓB®Mhð™M­—·–[7@ý—TS¿D)²®Vä»6¦rIf‰+ÿ GÖ¬ÒV‡|ˆö Ï‘Át3Óp\» q}U‰R)Y´àÄâÁx<Ø7'oý«‹}¾5ÇGì¶6á–ÛWY´Áó:A`­u›þèbo®ÎÆÎŇŠšϺl's'2ê5’ˆÐKJŽ˜…¶´ÈØF»õè#iîeJ*r¯:µo„F4»hÑ„°u£PÖz"à`)5ËåßX!Þ<ð¢s+oÓôáätúçýÙìì“'9Kâ (Éè¨×îX÷§>V =Ôr“¤wpÏ,‰kðhÑŵÇV—Ýð®"Á¯ïx)Uö‰%QZ„i5žOY×Ò$=ˆŠ J€ÁúÙ§Š~^OÞTèúXŠá!])ÙãVœijˆï+¹ªñ"hÓE^¡­›´ôïü‚R[v7MÍë:©+–V“0-ÄÄD¡„­9@-‚XýAš:™x˜¢ zõÜûAa6M_xŸn•5 xQV蹨ÊÈqà¯Ò¤×îeÖ3˜¢ÑºÀÀ?ù:—µ“2Ö—Ä‘ÖVÕ“=§Laàrqž̳YåS½¥dv»©5XOÙxòšJn´cjPoV\¯pg‰Ì«‰ñ~#EîJqH׺J%3"j/^9BõÊ—,^„*ßåw(s÷-¼¦6{RÁÆnÆi¼û^^I¿p·ÁåÛYn>˜š*lpÔ:T•µoÌT Œ‡™ÍþK©S—Ž±Í¦û±Y’}ôØAQ¡òv–"cmÖE{S¼’cƒΜ÷„¨Ur–F^Ù'ßç()ͦT«Â¢"%Â!4õ²ûWvì|+þDëûú•‹»C¸>®Áâú¶lä8ô< ·å¹½Øú¶zÓªŽûJƒòŒL¼›îðD 8g%H òb¡gRIëÔŽPÝ%ýpæ-£žl”œÒOêyà!Er²ž5UÞýõX nzvVòØ™%(Lt˜˜47iñÔ„¨•¶6ÚSHJôYöC æ#…KÖ7È™–2Á*Iò[üáò˜’.s37z¬®Mlå^LŠàºœ´…m*ßFy:ßôÓ?j­U2Î>BÖVD9ãe‘×§í‡d¥¿9Œ/Í£¨ÛÄë„NŠmµ¹àø¯•äsYd7ú ÌtWÐÿ™|94×Z*o¢}Ö†{÷H²ÀØ£åpk©&ƒs>2*‡4dS 1ó!àæ%Ù^ÉóÔú)·+ü'ô ä=ƒ¦–R¼·.Èž÷CJ9öAÎzu«`è ÞÑA#2ŸTÑÐùZ˜ýA]s´ð ªVÔÈwdŒ%ÞT/aªßâT0¢¢çlÊ‚¸µ¦0Ù<ýÐ>êü°fbDDtXiûìíèU£‡ZmHÒ;ܼ„*|E:FI$üÁ’g ¶FǬIïc[Fi”Cq“ƒÑËŒz Ì³Ì»ÀÓ“*de]rˆõ­ßö™{«¤” •4©¼u¼òÉÚn‹™F|˜Í$³ Ü!É4¿Å*òJoj.”JîÁƒùvú$lªÒx®î;ùƒüµ/¬–ÁVÇ&ÖÜh„n52CFm¼áuRÖÜó½Ò!¸{ø±&.g°û¯<ÀŽ K~}Ÿ5µÞ¾“¼i´!pí<ƒè×PÃÎ ²¸5Ç8©$´OræƒEç z(pÒ  ËðׯøhdÍ3òthÁšÒÏÇ¶Š›·ùx$¬vú®~¦Ê6µ-/û¤èø¶ÄưSù¦G·¹¾M2P'¢©Ùù¨ ™Ê·uZ*Ì¡ÝWçé‘ü>,èµÂÍè´‹¦O:i¢€À±ŒõpP«*n#:Ó]µ5ò7DÏ;%’£x˘E2Óºü1×ÉnHͧT©÷óúšóá:ÓH9¶Ü(N—~}iœm–h¸>ÊFùž9OиˆH ì‰à°À Ó³ÎN~@ £Zå?å”gè‘Uô4¡õ6¤áÏ:Rx\5•}c¤}TÜ@­?õ©!L{ª3ˆÈì|dÙžÇzÒ³µ?‚S÷©!Ž. €H°íb2Nòs^ÖIa¦Ø*²<ÝŠ)(]JKÔåèPrààÁ}Ñ6Ú«åS a4Æwìú(væ]h‘P'!ÔRT;äOìç6F2ÂãÊ{ A!rŒâϦA̓m·×ôªìãú’%(!¤¬ †s9àßè“6€[ït3–% P£–«FÃçNò<òw~ÖNaÜ·ç«te‘³²è¨ì¥ºÄ6t‹™!­ŠiŠÛ³dæñ¯&ýÒõ %¢¸)OÓøç>¥‘*½¨N©\,,"·pï~íÒoò|£¥³ ‘—ÖÔ©ƒ ŽöpË÷ÉzndùüÊLY¥ð('3› 0exÛz&T(&¶Øô÷Ûz»æ ÂˆÑ“©H¬Án©v»Ëýˆ‰>lÎM*Kç á”Hïš7xÙ»á)U ¤)ö~!éNYgHØJ'Œ¦íËP6BïJ㕺–̦O…2àó4øÄ'€1ÖRÛ2šœ–_ê1ú¦SrgUXñ¹éwú¤}F~³­ÆÖqð,T&Œ¶k:t`Ã/àJRM)èÅ%¥ÒeøYÉÒµ'@rMml‰mb|È–é<û“ÆzÔÓÀ”‚ÏϽ¶†w(TY$¡I7æš´¯øœýʇö×/Öݪ` ’.ÚxCkûg}“Ñ·çU¬•òK‘‹v½(ì_Þs¸TöVĶO«“¦†I3]EYSºØc§eì£î¥ÔÓæ%KÙÔJ‰ëÛtCžb¨“9e„=ÆYJ”ö>Lžý#©›‰ÄÌ{‡êmÞu¨+òòvÍoM52‘@ùnMRhÈlh(¥Í*ëªYòÅÁ)›¹®vW t ÅçG‰`Ý•§™ƒ¥Â %¶rr¨^äÁØEzÞƒæqkƒ=âhã_~U» Øb¼Chl˺@!u­0v.zª_°;ÒîP9í§ý¯6Ï–©ÕB‚r¼Î½³ê-…ONgÓ'ž ªPÖž<÷KkG ?òb«Ð$Ñ4z@Õk¹s}Ú*s}<ëæŒ¡mþ L 9éòÌý ŒÃÛE9… 晕g˜›l TA‹yçƒññið”KŠ)¡MF¥¾Ï”9@X–â×ÊÜȯoÑXûšJñÄïø{¹ótXÀ7©G¢‡K7 æ+õzí¨ lõí:¨ó´R.ÇÏÈû€Ty=)ÞÈéZª›"ý|’p”rWzì2ݬc45[iw¡ø-êº7#º¹šÿ·ñN•^;¬ Àò̇ÙÞòµ»¹±å óš|ÿbfxŒl@žÇ>¶á¹Þ”Çì¦)¡gÍ,«óÿՋƽõÇêì^´®YŠ4ÅB¼á¥ôl´%àP_l¦Üc@†šC«îÎ@´ß]½æ€Èϰtž*닺G¶±ÇQsÖ}³Ñ„ Ø#ëB—µGkwÒZùëN01Ÿ4¨9ëb‚^£êÕÅ> e0¨yžú.^¹ùïz|šWAÏFIcú0hj^õ<8s§AÀö4µâ¡:­ …´=ã6ÔMÉ®:í“·yv·?èÒBïã 9›!%,øðœ:FìCŸ”¡ƒ²å1¡ƒ¬ÓUh(܃Ëò*VOÌ>fÇÔ¥™5_çF8yÃ1&ä›Þìò1ØÝ»:ó­Öú§9”…Å-ì3nGŒ:S)uùèÖb-¶J•»Ê’ÿš§<².4ÍOÚÐÜ;ýËêù6äïKÊ/Orý_‘ì·6þDÀWêšÃ ìzÖkPOÔñÞ¡¶Sªý7qT&¢Ýijþ2K¿J„-Mm½ö‹] üN¹ÕßXs: §ãµñ¯ÈùLÍX¿^²»¾NºOÚ×G¾½ÞÝå” _ðÁ_d°¸Æ*ïyp·±à•‹UÕ²XÂ@થ»ò$gðúJ_/Ÿ v€Û ]lLÞpµåƒ{5ú€¶æs…!9yVÚš,d!s¨oÎx–@5Àë– ‘_‚¨6Ý}fÛáD®¶ß¯ÛT º?è­ùÞ¬i”Ãßí?õ½WwqËÒAMk©x£Åý,ÕMçjuE²ßÒâS]ïE¡¬?ª8»1ê¦9öH%ÖƒŠÄ£ðÜ¡åóC8=ïN†êÅÜŒ­7*]¤WhÏïÊVØ%û•¿—Жé^·žÞoGÇŒÐ+ËÛƒOÆíö„ÚžLsEÁþqÓÞfÝñʽعÓî,H8˵.hL\ÎÙu‡#;eàƒ;¹¤›@®§ÝÀ&Öó1C.p¦Ý•V3«@#Òv¥óöãÀ÷a½ö´ÊÓY•¼;¶‰³g¡–Sòyv6˜†Û(Aîé¶Ïêy9F ó§Ñ üÎidáy÷sõ—Aj=߈îÅ6®›7{Ô] ;_¥ÐbÚjc¸åŽÝLR.—^ 0‡¶°êæp}ݽv¯…Vã/Y§ûť߈u¡žæÐƒ¹åA+Ä7 ·“/BÕYbd±øë‚¼)¯¬–ˆ=·mwÈfØÆúytóQÎÞöŸ]ÆfëŒkö(BíÒèÖ4¡ ñ<‚\tO@U&Žªtx]y•šâÑ'Èû7†¥&ôÙšK­†m-+¾¨Mû{dšŠïbÃö³Œú ÇÉtoYU{¢UAl‘¡ ެ^˜Æ{.·Ö½ÎI9S²~Lb{6|Ûkc¼Æó©€7.vUpXÿas’m û:ÝÒ¦—¦¶»»®›ÄjþR]°G—ªõ|2ª7sm0ÐÖÇGüÝ™ÄhJîoÅféÏ/M-ÄVöáë|Æåð þ’ÎØSöâë a>—þXÛçój¦DéÌÞÙ»ê%•ßcÁ‹‚|AéuÿÈü¢ÞwêÒÝõ_¨*!¸dŠ á¦ªÛSÅ¡ŸvW_ûì¥ÏðJöcÑšû´VËfã·3){…ÙÉ|ÝÔ‘€€Ímõ¼`È4<úäRe…V¸æ3³´l®ãúLíy¿¾*(¨t48ìÆÒT½ÞÀ½$sUµRöQ븎±u„.ÓðÐ&Šru ÅUög ¡KŸ Q£NyO¯^YOn|ÞÁR)´‘bÚ¯â3¶J ´’'û±©`«!­"óòD+££›L®°5UØàðGÖk£WíÍ-Âc&(K¹Ÿ¾*+ñÀP¹Ø_¬½4OF'´fÌœT¢¥¯>Ö: f6ÓVâzQ&hÿ¶¶x¾Nµ4ÖdTú$Ð nã¹!–®{s[°t)×öÞ GµE=`nG*O‰‘Àð€:yØ/hšEÌÆßPc8’¯s(Äkü‡íO&ÑXR±-dT÷’A ¼½8º± e僻ffƒçœ ¤hC£|\+Âû³\Iü„îIÚ­ý?€œø‰WijæÏ¯Ll!®þ¸íÏ4ÖèOF]à%˜¹ÍöÙÚHyé{#1÷‹=ý#ØnÐÏË ËÉM²K™ =¤¢ÿKä3ö› ŠöëÙªg(ýèÒKöñ¡24˵ø0ݲèRF!¶qÅ,‚ûèÒÍB~‹vçßH²¤¿ëRèã¼RýŒN.-ÞÁÓðXˆ”~É„Ë<|·¡K¡4gZîú ”-ÂýÀsÒ² ¤•׿¡e¯õ³ÝOnÝ„£î¹øÂm¶ƒ"!}î n0M*GWŸúŽé» ,™èÖÂ[J Ç.“ˆx=áœür.\ûwrÛ)µD­b«AÛ²^1Š´ ¤ÚÄõ©]É„¡‡ u±}”{ÞàÌOU]DÝQ²WþþŒÖ‹–£W©›i»£UÜ¿ßê¸xÞMþ®€æk‘¬û¼ÇH÷˜5C çF*bŠkþž_ÛUl³é§AG•ž°-1LœaS߇â ÀI•ÁÜÈÔÌ>‚‘`,!q€—"yÊ}€·|{Rø¶RNáyF:²ÚM;žYã;[“#ú]uíÆDM=çB*5„‡ž‹…Ñ“Jî%4¿ÞjÆ…é‹–0®¯ÐÔ€Á·‰D¼J½g³Â‚ _0ÚF8fЇ-l¾µÐeÈ+Üù ¥(yá&¦}­k/wr«U8 “ •Òh­¥ÚCL(sÎh/ñs'¥ÆcSÌsþÈ$˜åéYç'`éÉ!ÿÚï?<<èíì,ÖLÖöhü61,Ù£zx`à2”†ƒG‰}‚φæÐ·hÚ<ß—¡,L»i]{OÉlŸÜ·ëÚ%›hr’PãþðæÔ!òí|(»ö0E]qT`õ룦>Þ†ô[©¤Ìo@%¡ü•Ô¿×ÿ‡1ÓÓ.ZWˆL¨U.R"T<ÇКLKAÚ‡~©|ës§òÑŠÔ&ƒòzTD¼»‹»§)zÎ)þ®ù?”ŒÙ\¿ƨ&, “1¥³Åè.òðÜ“ïUB3T\G1”Kƒ =“¬q}”–!TJërc¥Ö2o ^㽪vÔÖ7s?P‡Ð]-[G´Ÿä,b·d‘Lìäúõíõöä-F»q³#øÇöuå<2ë:¥ÊkŒFPû%J6¿T·³|œ G°_@i Üã%¹GÏÛR‰' ØÉU…Æ}Ï%ùXëÉjŽ–>¹mPUSªé$÷gLÒM:yPæ¢3Œ–Õ°¤4VH‰°y -2€½‚Öe-Cõ_  mªž4¨5›øPkŠ^ܼyö š¸>R–`óg‰7µ4#¨R»Zû[Þ|®p Åà~Ž~êi¦ØŠÍ6–€ÈÓ‘yBýQ]ï½ÉQC"ë]ÅŽ¶«ÎZ ñy+4l!¬¼îjNñ¦ÎÓ­ëìÐÞèí{ZSú.ϵŷ<{ s.ý:Ì3,цšKìàž¥ˆóúTŸOLv·+E=Â"¬ àþ:Oy>t`ûCŸŽ:…ö¹–ia$OZÂá20Ú XÊéÐg­);«I«}Y‹H‰dQ2¼ÿ‡ë+¢yMm¥8Ô5BjCa,´I0—ö4þ d•¦ÖggVˆ­cÐþôŒõ¦"aÖ­Ì "õ¬:+7©áÈææ.=¶«zõä~-qÉ ÕĈ‡ôZÏ¥õ©D©­T*tˆT·±KØhCe7Y‚¸¬fݽ–Ë(>7iX p[™Ú!÷ïÝ:å¦Hé YÛgI«Ñ)¹‡[¬ ê0Ѧì]E.Ý!È›ro=yfþÞaO¦Ó‹Ðö‡S~ÌÛ|RþÜUÀ|Gâ)-ý?0i[@OqÒî#ÐKOàB•çE=ø i]«›ô‰ë¾ MôjžpR ¤䞆çV(:0O¡³ ŽÁ9Ÿ«.ZîÏöàuWc}Tgí#’=Æî<8g‘Ù²ƒañµwï'wuzé´.+©EqÕ’p7rRØgEýÀFÀ×–KYàƒ²ù2‰ñQGKu}Æ´žèøî¹èÅ€[ùS±Ú&ºYÂþb'áóÈ…S€´2ië ËP²yWø^ô«†àQüè)2Âc‚e_ª§H Jµ•–[uf#RjxÀ7´¦êœ¬9Æ"aEP'‹þÐ-ˆY!êµ¢æìøægµ×T¡Ú •ø‡¤wåîg¨Ÿn«Ë†<ª †%PÅ7ú–ï:¥vzS¿râ·¦F^¹®.ùd`RäÀz9hõe!†áä¦ío¨Àed6uŠ—«¥0ÅSMv.@;ãö®åSë®-¿èÆ.v*h:fìiÜüyl˜ÜU¦{állf\ b‹£ŒåQ!Üšͯžùu/þ?ÌÅÖË÷'ùêãÛš‚ú]•ï½Z鯓ù–°(t z öZ% 4à¡ ·™{DÕõŸ—ézÍÿjMÝèÈÉóÁ¿,ËloG75kÆ»l§Y`25w(IærzÙÞÅ£(íÇÆ¼–²Š~f â£}ôFJŠÝù¶¦ÓÕêG[¶xrËv™†÷Æ=TƒÖeh²0ŒìÁ"1]…˜-·é W;Õh]ݪÒ3«å£q¶öÇ™#Ïì¿jHá½Z².ÑU@B’JŽbÅì‹aéF)þù82”·½a¦&ë:C•ÓéU­G´€>³–¯ÔÔX&ß5Ë‘úgo™!D ¡I’ÑFÙú~Ëq׺•ŵ®VzZ!–©| ‘'äÊh„ÉúvO×^Óçç¢ {¥ÿ,;3Ó¨h§†“žT žž—×¥ zÖeËh]ìÒw¹ÙÌÜÚ;#PÿLRÐAÈÓa;®dGéÕ4ñ]^4Ú€mtd/àH‘Ño«±˜ð¯LZׇ½ѦS| ~?m±‘\ñѬ˜j…yU'ÅQ¿Œ¿©´ð|×¼2öw$„d]nû²®ɻ֕í‰ë»vU“\–|˜îjŽú 'Y÷a]þ‹ä»úÎÑüPÏçõV=®u5§€úl©ÓV¯b'}×”6)BGû¨©õ%=!”&—Ï!\+Ûd] 5¸Ö5š|€g©ß5f—KTÞ„ÂÜGâ³C­C¾ËrD›[)Äúk2&Y9Ƀߣ6ý¡²ýId棞-„  ‘šŒ|™<ö@}°f<)õv­«U±¿n•Áh] £W+Ö¿Ú²e|f¹ìÇÈ0F]Èžp¬•å”>°Î•(ì‡Ð]Nd¹ŠR“,DÑg2öX#Ánä¬ eú¶“N cp:2÷˜ŠŒèß0ï:s‰z·}º©+x”ØÓß+{Š¡4´è™»Kr”–Øxúþ•¹Ÿ¤z=ÇÎWά~¼Å×ëlÔ=xÑM¾ ÚLµü•=ô]î+ƒá†²OTÐÿðÍËÅ}­Ë&1<èÅÌþ„¨•ün4* ±Q ¼kÔOVß¾|çî™M­¯,¢‹_(û[kjÂwäßP)ܼá-cpÔŒó¤ßÀ„§5EÆV›$³‘d2«_¯U4ã½´»´…@µÒMYýcÐðN=Æ`ˆy=”§qCÁШO…¨»SE F½Ø¬˜1‘>ùSÝŠ%ÿ2Œ²C 0˜w•-m`̉óÿE™?ŒÏmnæ]µ,©cÂï3®ÙšS¾ ºaòP–e j.“}Ž: QzéY£>ch[Nº+ðÊp|´kbb¹ƒ0E ý‹:«_øè«÷Pî¾(60Úü»êgÊê±é¡ibP_­ÒªìÆÆ`±×Õ™î8¦Æ«0™ñ7SBÁ~©uA8YªÂ$õ›®Ll“u%qÜre46! ™ÎƒÑ{§Bóž~¥W^,àîDHÇnÍG=r5ÁvÜÜ}.ÚÈêwUëŸ~׊Œîü&“è9ÊG»sÙa˜üiÐóÌ•ý’»[£„j>þÊÿ<«§Ayjdl~ ¡ª-T!•՘Ʊ¥Ç ¥ˆs6ÉmxÓ<€úlŸOsÏŸ¥¨Öº€§››ò/*gH{BBrï#´~©ˆy–še²°Ê€…0™’…1\>RW\t³ÁÏŠÜ‘%ué™_d)&d)€ž©ê‚B•ć¦l*¸êÕŸ·w<®RMÑÐj®ýÁ½ö¤éŽå²‚FÎ%”:5s£Ì´®ZϦuÕEá)‚ìLÐC‹™y׊Ý!~tJ*S¢.ðôšÕO[4(h0u÷“ÈKl´f÷äŽ [§»BgœÁÐ_8c™xèµÿ.g&AXƒf0œyd4ç‡p³ïE¸sFƒjzZWíSÂ>&3²mM¢dî {{”ÜoÔ®I:B+5ð*µ4V0½'\¦VwªÀÁ8µW&4ïi)æ{?1F]7B =ïê².Ï€Ú'‘OaŸ ¨_òÚg›NÝ”vaôGO}S‘ÞôÚÒÅdƬUú kMýôþ8g¯mxa˜æ€ÀF,®®Ñy«—¶Œ%h0c(ŸZ&™í Å:rWÍ+Ô×wÅös‡Ž­y‰`¸úþ4!š4ÊJôÒ~”‹÷wã̳f)öt £9«9\-©Í G¶F‘ïàp|ÄÁ $ÓœµMmM­Œt=¡¶k]î5‚rÜž¹UFF˜d7ÚZ¿òR‰Ëvwµ?Òggk<°éª5èⰾ˅k´'¤ ?Ç+¡â÷QyÝÙ³¹‚˜jšûóËÊ€·îJ”Æ,™¹Å¬zÓ USáKe*{Rh+Kì€ã°‹á—W+•o±“°ä®ünuÃÕI‹–b7Y$GˆÀi_:·zÊG¾Çínï*L{/í£‹í¡?­áHAÖ“A¿ÑÖHä3ÆÉ¯æÆr«±dýJ^ûÌ@u˨‹+FOI±(,&Po=UÁ°/!=¼N‘2³ç%Æ_7¾2ª»6.OǬ,û-™Ì¬úy²~©ÆôºìÕéÕfÑèË"©vÏ#¤­n{.žÁ¸t±ËÞƒ©ŸÍa²®úèˆÆ%œ$;T„À±T ½Ìˆä3Ô GßÚÁ8’E¬g“wh>bç‹tï'°sCÖåwë³>è¯#‡ß…)¾?ÿr1rrú¸½2Döß¶ Êîf•ücF+˜éÜy‡B›æºÑ•9y9çsPsI0Y9_ƒ=­FcŬºn»õí]ÝšxÍï±´Áß}Š%®>¨õÉÙ oépë‚ã4#ì*ØvcæXESl,iì\è꣟¾Ôþ,e©Aå¨Ñ Üyª¹à5'….ROvW£5wBƒÖ…ѳuÐ hSà”rq[T÷Æb/…EÐÄ¥(ækà`ü¹¨ˆü¥J6ªJ™Û’¤Ê?fdàÊØƒ„8ß`8/'éÔ[ëc™y­¢öª>n”—óp:la9(ߪÁA)I|b…!êöÎÓúA>Ï=9gÄ*K^¢y2 ƒ¡»‰Ý~:ØeZÒ÷ëç¡Z.ò¹²TÝØÍòyõ–„*ñÖï¬t¶sQÑ"û/ij€Âí¥œ|˜s?0°òip@Ò]k†kWFPð ˫ͪmŒjSí3¬í¨HÅ­p%l5̦o >×êʧü•k Î{2kÁx¯qçÄ(G:J#êˆtÞ»†‚Odôbð#½9Ž¶Â ñÉ÷OƒÐÙ+ü  Yãú²9ÛGŸU\?ª ­«oSùWKË—ðPíƒoSñÏŸ¥ÖÏü©¹0ÖVS«=1’7Ih[ÒGÓJ’À]É%º>ªëž¹k'¶»§IÅÙš‘Â)è)V#Qêjl9wFçèöWµ(=xÉîÆ#¸N¤naÇÎìSEBí[3§6³  ï×+ ªqS5X¬·ÉŒS^úÆí9´Í ÕÙÏÆY&ÑØ8[ÔÈÂ[ѵƒ ””"£ç¬zs§r<¿ÌÜ'µ…iß»hñYœBY›)1ƒÓ6»pŽ¿»…ǸæAË–ë~wt³s–?¨|6vëGÅã¦Zm•q@ÜXˆ9×ðP€œ¤Ý]Ð’,:Ož¾+|Eš êÖ)#®Éƒ®]ª=oÎÊO"ÁûlËö™k¾Ñ1[ v¾=HÖNéÌy:›CÑK+\³ˆyòf†·ðšÑlˆ¡‹Z‚ºµ±:û™––pÍø³íƒ_+S"Ù^fªÛ1ÖFQ¶k¾™Ϫ~ÜùŽ€ VK¬6ó˜¦åti>Îf-™Í.lBàúš%Ÿ]L ÕBH(á­hûªìõG¥ÙÌ15ìÅ$3Z6S|ªÜaÔ%=D³+ðih1{-©=´Q><§uq©¹$A(‘’‚¨Î¤.´¦ÒÔ°²&0bU+7|©§1©ÉÚÇÝ:Õé©ÌBHü¨s¬ƒÏ©Í‘>†`´­q 6n1' ø³K})ûÞ˜:fn(ÎÄz>Zû«Qç.™ŠÀ3´ä&Õ#P°?BÖO›æšƒ•"ëêóè#¿¾ÅP±#Z2(í‹•<1øîLнÿ^dPí»öÏXäS%ábhÌ4¡…Ť# ”EáϪ] ~K>²C³ä'Æ2QºoNb.H예Iz'w¤áí· àR»‘Ö†§•ZïmëÉz).ùs³,oãavbSÑ ÎîP„²­F¸,>9ùüœas ]cUCU()É]5ËD ©#~¹þèÎæË+­ Y“–ßë#[6¾Ûm|ÄÚc23™<îΔóLhGH«¸>…2«¤:{ Òõ[þUtÆ ¤¾ÁžN©O0¬•í]À0“1/PÕ3ó)¼d‹›þè}t1(žÓÄ#^/™6¼âè²®r(´²—¢}›“y¤¢S-濟ýí½.—ó[1š©Š l[„~É9{ŸìbV|PYÒì½Êüù«½kû¿„Â^Ÿ|Ùq¦»®ïf6ñg›²BÍÙÓœÍÖÅŽ[9°–tPçL¦¡{Yó¶î ²³üÀ` »YMèºA8À_è@9 ÁieÒ Pl-}©êtî5¤ÚÛq[ã“P•S¹¥z¨ó^·j˜Wç`"P†b‹€¢4Ý•}Q$àäQ([IPvG,ùÛ3…tJOMÈ4SƨG¿jùO—»~¸—̘7ÇõuÚ®O+8uk5¿w‚ð¾|8FÀ»*ëò×*›ðyÉ‹ºØ©_L7=UÒ&6zDtã:  ‹½äé]yP‰áÌR-àçÂQ‹Ö¯A34ÓÔÀ]0ó†·Úd]Á+ ‰›Æ:c+“ \¹Ï!¬ðû45¿y5Œ h)VõÐg/Ð^K)ýÐÔZ]b¨Ç¾„pK;ä^Tßx**}Ò|G §að½:Á¢ƒÛõt±ï¸õÞðU?D§ÈéÖÊW)Fßõ£¢bã¢üœM!J4®¯Ñ$± ¨ƒñ!~(k .¶=ô¤gERN}âøAÿ,Ø'ÙO0 º¡Û·ˆ°-J̈K¢Ì(–º§%"ùu¿¸2«kÉÉÚ[D¹Åvò`•´O4_€™5ÈÙ…€z˜¿ìNšn®WOÖ¯(ÿ'¤)½o}ë ”š˜R*ÇG5@:([Èg4ãzž{-£NÐ À¼åj½æ¯E— ©çÙ„-ÐÞHÀ/®éu®½m¾é‡tgÁÞ[¥.|Èé Tüù˜‘«µ$¸xÏPՉ뜸$ÞEÜKY»Xªê¨SÍ!ÈV“ÃÁçéâ¤Ay¡3ØO€r5­«µAmRÌ“·ª›ÒRF5FõC¢ºI)ók´.l¯¬¿Y) èúb³Kü¾4Ö¸¾‡Âõ ™ÍpãÒ—€aÍÓü‡YÓùT´2¶¦DÚØ8ÛIÂ<í¢Jõß&µÜõ’ÿ·xnÔˆDVØä޽M3Í-Šcì1U/lœa'Až¦Õ€ 8ýgn]’Ê×>#¿cèbÏWF]]ìÊ@Ôw>ŠØv¦Œ#út›s*‹?ÆVô, «¬OZ™4‡%Wˆ1êîŠÛ£PYSLµZ§`dTöú©¼R»l‡l{ý/9Ÿ˜òÁ@Cj2´•üVÀðØ¦©õN3,V<ÛHΦٸíMÒ«ž¬GY+:C¹æŒ= ym’•>t±ÓöC[ú¡ÐÅV?átÉj¶ºØÚëmgͺ؉‘бQA/vŸS+žz-šZ›&ѧyÆäx†ij£kù¶F0 ØVg ê%GU *EzìçЄf°-š¶wùÑÙI— ˜þd"»’‹[ò ®½äYg%«+x¾Öbä÷¸/w„ƶŸµöä"hu®¨ÎÏþ4 Lühjû¥ë÷Éóá ¥9¬Gç~ÍÁ¯/û¶q}…ÝpOmÖ›ܺnt !ï·Ò5ߨ²d’wŸŠ¯‘p«Åd¿åAïMÒê ßžÉR"ßU9Ÿ1žOR,è–nðºjµß²Ý ryž‚l;œû>éFCì¸ås)u5Y—§½â$÷tÏ{Úc°™—õÍdj @ýØ‘å8°#²\”&txž—dDœ§Ò'ùÿRs]àÌ»ú'$ÄÞÜêz)lUg‘øÇî-ÐñéèÜÞí£ Ûêæóƒº”²ãE^µË+–])Ÿkg•M+ôòÊ>95@ª”2â([=7V³Á~ ÐuÔSèQÑ)-K¦þG{£ŽK'iØí㻚ÕÄûµ㕳7°½|û’J\'¨ˆÝÐ&õÝÉØ,ìO«/J¹"¡ÚG‚ý‰ýÝ4|#™§F•>n‰ ?pRµ¯ü»vW/Dðñn[4<΋åYs§÷ÃdÓV–ØhÚ jãÏ2zݱú¡AAŽ'(¨øƒ<[‰­«ùµóYàE§°±Ômôw[Ì«ž(U…¨‡Y|åÇ6ýTÄÙG*I¿xJ—b¶Í¹é  £š£”.¡n{ïH†<É‘žÖuîJ%%Ù÷«9úÎpŠ…€‘"Ùºæ–wÈKŽ”®Š’/¸xWžÒ^ ÜgÊšã ¦ î~ê”ÜÉâ—þ¾Jw8D VÂÝ¿£a©¨¬‡ô¸v—*1?IzI+ì#eB£I'¨ó‘…9|Ê¿·ëç1?*F^ÏLÖ3zò…ÁÆàH!Aì.Ì÷úÝšê¶'Þ ,7ð6äó«F²UtÏáÁ±ò©ÊŠ 9OyÄ?ê×׿¡lÐ$A,K3>;øc‰çBûõß:ÝUõxŬiÏ%’tÆâï¥Éw•B¼’“™ØfK pÜ¥ºbÐsnJóø¾Åš…¥"!y†Ø,)š‡Á³hjþXÒÿÞ¾4œŸTÙEãCq‡¢ÒÅ –ð`²«]‘öVƒ´ŠlÛáÁœl¹År¾Îwê¨øgðuÞ±ÁÛ%­Ëý]êßÁ ]#|‚Šs}4Îj¦q¨©Æúˆï”£Né|æó0nÿàLz˜ÒXq}úÒšªëF¥‹ déÇÙx–8ÆUôÔ¸ÅZ™5[eÙêy7ek,†Ë- -Å’î B—|ÿê¸+šWPû/öPs*ijX’¯ijÏWšÚëÚ]íÕY¨-‹ŸW€#ÌÜüµÚÊÜZí»;¢CÉ4¼1‹KAÚLW˜š÷`LI°CZF3h»\ñéY÷”Óm ÈØ²ï)%9)ªsÅm§"1,÷fÔ÷†Ûùǃ‘ˆ > þ!‡àYnú.lq=OÿXföf²í×7h’~}“ÊŠ–ñ.›†@­kîºå”u¬¢9«^(X‡Õ1“êºE;ö¥PA¶žÜjŒ…Ú¦»ê5#îÐÃÚ›3î´!ÌÏG»Ó.X/M-c&¤R¤sÆó,÷6¨ü…y&x¥_Äœ‘åëÐo`Ρ5¾iœ=ŒàµÂRÕ"ñB@bÚIYrÊêq¬þqo»PjƒÒ@ž™Jêt|Z\á§ñÞ•z—Úï où|Ŧ¥þkŒ*Ÿ_× ¥’…åEÓJëŠë“9¬Ç³pÿß©RW´Vun%ׄ>œÁîè·1ëÑû¶ï’úAÆŠò¨LÐqºL2Q Òº?êˆüÛxå…”³ñta´.4ÖMmÕçýBÖŽšç Åúî{£_¹2Y[Ÿ”>îõUÂîŽg²»Ò$ î¶µhÛÓ¬xÎ&»Ê8èK¯~©…9y›¿XÇäÈþD£çäªÝÝÕñ÷åðbW‘ºiiMj>Ù{ixýHÇÍúdTTRÙþ¦gí#q½jýF¥9‡)¸XgǬÆ^™’m+ÊšêþdMefõ niC?¨®¼^H2®aq9‹7¤P#ï‚MøéѾ¬‚ÉÁŒŸ_Bã~¥wG}©ðžÆ†öŒ£w¦³ëzyáFšäQwšZý¸ÂØÊÌ”ü¸55#c+Jâ–y<.î°;0¾&=m«ER»Ì|ÒZ0))XtK{ʦ×Ý1³7 :ùŽ`4 3ιxIÈy,/“ »ø³î(ðé]¿IÐ\Ì>Îè‹AŨšd§¶'Ô}'Aïÿˆ¤}Š„šž5&AƒòëË¡ø ~ˆ‘g(¯qÝç.ùdƒåÐ Ò|<W¶±…pI¨™WbÁÄò ÕÂ&HÍRc÷úp½r³ç—B%fêùv7„®ö›•]S+­Ò«•Þ æË¨ín0>eæÛQj©Àýv±YzŽQ[×)rn‘"ÒO¿Ô¯×ëνÑ$Ÿè¡]uaSyëÅM§ÇlÝRqd#ÛŸ±žpyÒƒAqdûéÐlüÝ`7žÿ=Õõb·­yU×=UK!k´ðê`^rFºpôB݈è*ÖêŠJ,©~®ÄÀ…ÅÇGþßÜ[<ç=-Oì<+9xŠ´.¬rŽq‡ÆXì«´q ©ì®z˜òÊó4ÎìvðZ>ÙÛ ›òPºí±^ !y/híÝ¡Øg¼ôëî3>Éì£Ê¤ý}ÆA'²7+Øg4¥qË¦Š„ý‚Luô¹;]ë­¿Ä3¿ªëkîLYZ€ñùÈrÒl·ã™-EtI{Sf“ò3‡=Ó q}éLcì|òÉÞ-®ÊÓÙÉô:"j+F¾=Í}±}˜†ƒ¿‹nÈÞ|Íîl«daÕ–-Z×è{1Ø×§òcwŸñ‹»yý\öÉË”¹"zõùî$‚JiùI4@ûº]Äëâv§+¼\ôèÙ(ÜLVew]¡ó1ÛP-±Lq;°>ïN^¹ãÃ2Ã_žªOú¥!3œ'p|S¨s²ªŽ%ÕXÂ̹Ò>ƒNªÑº H\ùŠÔKµ¹ž$Δuµ·™–ÙÇÔ#Û»±HÏq¹½-C%ÇgOÖü±*g ´­p¼9‚ÉþðKó¨·JæAj~·oÜvw0XŽØšN©?¹¹›†Ý׬2šF6Ë@ò6iÔ‰î2Ò º;¿šwh·+|³nG×|m5ú¿û~cíׂØSò7` ^©ü‰m¬ÊÜkx *A}úÈ)6棣i\¾ˆŠÖ²o‹¶©UVjJÞ¡yÙ…àÀ£zð{p½yeÛŸºàä4ê`4œQ7@jšìûÛ³hBÐÎT/ã=ùÍÝ­.fM è î)a½§V²u;k©/ÚM6×ýúš:««šÇ +µ8£¾ûhU?èÃ\ݤψ7¬MÖ)ûu¹¯gekfɾ:¯‰{ïPcÏ&|E4¨3Ò¡#:åS`•ì)Fz]4Òn‰j¹`Ä=$¦½¯ö}è­¥A,¥¢áDÆHÌ~„Ö,£b™ð$ƒE3`e52ìÄþa§kå'É4Ò§ã¥åè²ß ß¼vvjA]^òb[ÔÄ 0õ%x?·²ï“¥øØ[r²P^ÑhØSwÁZ i)®¤Êgt3›F<QòtAÐ* ñ)«ó ¾bŸ2‰m‡ÊT©š gÏ܉‘ˆ>¤ÔÔë65.Ì; dYŽXL49ü¹K™ÝŽw4(Ðj³Üòòvð ®u ªŸ&}Æõ*Úçl´‰F2·ÙbFsÏÂïq<K#š³D+x4Mœ ”ºÔ½<÷YG"Än]5]J@:¼¹—óÀìܧƖØ_«y#=É©JE07“ò¢Ÿ…nG‹mw!¨ü!Iœ½<¹Î‡\/ToÅõ±É¼ÌBBÀ©q´ºW€ú¤.6ì³l:< ö饷 â˜r³}ª‹ß{% G Úù¦Å„¿dG“ØlŸÝ¬¾f“,ÛVöqš:žR~pcÚôèo±÷Z—öEÆr¸ûÒT§F¬y¦Ûç7À T[Œ¬~[͉®HÚ'°9¹ C«Ä¡vìä„ :$;]!²ú# ‡z¹LÍsrFg÷O‡f<Šuö  FÂS÷)ƒJ¬ÏÍ®F§mŒÁ@²ˆ.ùóñ6ˆ/ç@òš9ø tr]DO€îL§élþ!¿Ý%í@)gt…n‹uÍ@á@WØØ8Ä8òQ]ëòÌæƒÀéscí©íç9ý̪ $é]Å`kûðu†¢;#L©CnÈ+4©—E ‡¯Ø[ØT/½:Í¡´®.{k«3BpËUX1*\1ZQ¾ÿ‡æl†ÕŒÝ~(ìÁÿVW®uYj/q» AbG(”ñE~xUÁ·mvu«öuP·ä×'ô ½éyÎë„`˜Oô ZÔÏ6°Y9 ØêÓÈÌè¡®’ Ô€öÑœ Áù›R½‰Ò$>6\Ê’_,Ÿ¡¸ÿ7ãtÓSüZ<ÿbæíHÔ£48)€fÈîuNf¦aP­ÓCYaÀBö¸ä¡ìµ`¯OÚcÐ •·§½Ã~¼ïóÉk$’"ÒuÓÆà¹!€°ÓºðüwyOh;3ó¿Ç§ÚWÀ]—]|,I 1€û<ó.PòúÀƒ•ËÁU]”"ÚÊÁn0Š÷½¡µ3ÿYdHî³Ëg“99ÅL¤ ë ~Þ»¿GÆ€ÿÍ #†a©”d ŠuŒ“!ø^ž§ÕÇÎ5w—׫ïš?Èoаc³äFA8¼œßÈpikÃÿÓTç.EuN ª“ÚÉ«óÍ©îéªB[ʼíÍCæ¼äŠQ0ÓУ ” s…ÌÏVŒ7¹~éZÀ\CƒëB¶dÄã9“tè:Ó\ÀÇXè#:ê^ö³ d6a¯hµÜQËH*Ñ`¼?Úñû=y‹ï_° 횃חÃYkzÖèlçZ™o´1oÅž;k°¢/ƒ;Š·ÖSÐí/${“R5®OT·Í–6νøßCc[&s(y­œ¹€ˆõÖNëòªgÒºÀ‚¬îþÙE³BúûúeuEbŸ]ìVÉWQÅ-åù¦Vüò4rjo a>„‹<@¶¹vé¥ñt=i.ƒ2H«³*ŒìíÿfõC©c½ˆV û¨ZÚï_u·.þ!l/ÉX½üKn)"¹?}i¹#QÇëvW¦ïaÝë2 ðòÿ0œÛŸõ3;ŸŽÒxôFóé•5ÞãzŠhü«L”°ˆ¢Mÿ¬øî`°ç’nŒ— Ìý6ýÛ—ln/šÚ®#¹?aûÚÅ‘$YÐà˜²ÏsÚ‡gÿÁ¼ïÊvŸd‡ƒëirk­bkyLýórš}Zss’Lû*ƒ‰5É—²z‹v’œ8FßC²'šEèàþ¥)¥D¿¾É/aËP_*KkùXäüй ³Ê/5O µFYR*¶-‹²½µÙÂÉlJã 3Ê  ‚A†Sˆ&¿Öófàc0äçÉÄÜWÙñ„ÀñÉTd£×4˜ A<##^˜-ƒò´P[ÑPËá'»iù{•ÛˆQµ|XJPb“qÄÓinÔT¹›#ýCfRMd;µ•%ë 1½ß,K,%žT¤å¢î釯V!h]@Ie Á_ûu>2ghOî!õrL±É1âî`ЄúuÈ^Jb©›½~ÈÛ‘Rÿ* ².ps=Ò]Òärß,c­c|4ŽMå‹‘ðH36û¶{¹Ú*Z#—N±Ò‰í‰2BÍÑàš ö9Hs £î‡„œ‚ÌxH³Á~ºÖ:ÚçÈÂhCØ¢ûXt.ðäj~è Z×éÁd°ð  æü§~8éÆî2V¼W/YåðôȰ6>¶ ®íÍØoGi?°Bd6h13$Œnâ0Jìû%­#.ÀPSâì;©H~nÁöQFGŠ6Z—›ô¦}c}à^Ÿ×¾­ÿ±Ä£äéTÒí!6%†×1/§©Qä.¤%Ó Ž­œ¨„tGÉ÷ ÑÎâ4¸¹âú¯ª¾'k@MãJtDuú‹4™Dû骼ƒí¢D ÊrJ‡œº€üš¤j1­yŸÄ(ð#UÛûþè¿Ú;\ŽÕï'óÃ=ˆ ÀƒoñoP{É QÉ‘ùÃ|Ÿ€Ã ÷j'·ËÑCÊ û6—)䙿q4‡X–äd/aÌÎƤ³Êk¡QPŽø+Ç0ãc͉V^ë#bºE^ï®°µ!z/¾?Ä9îty€™@€RÞé ™pÍXĬZíö'{ØíXHÝð ~º«±GÂØ¡núŒº©6> O¡Ä× ³¬ «¸ŒQMœÒ¬4¯% 7HCñ˜;e]{õü#–°*žú=¨©–ƒïxVhw]ìñÏú‘‹ß[\9É™@.‹Nsìw3¥¦²f œ¢8lÏú)×)Yºú1¯Õ$/ìÝE«)Ù59Pq})ºìù¿4¬žÊ¤#ƒ(ùþˆcx<)å¦öaÑñ\AaÒýª˜¡š‘·1Ðg©QÄ9lÁ†Z|ãûgC”H`KjD~ZEûp8xúªTy‚¯‡Ïå-…½ØS÷àó3ªláÉÊ60³¨_Õà|¯Ñh¬M,5Ϭün¬¸Ç–Ý>Æ úÊ<Û––ÖCꦅóQYhŸnÆNÑØ\<`XEû·¨Pv>ü•Vv‘¡ì“D7¸¼[¯=‚ùrD1GÏìO𓾨ÿŠÓÑ1[I¿`Ò饇«Ãpê̇D•¤.Qs4Õ#Uén ê¾ùvÙ >»Š•׋ XFõŸ[ëðI¸+J)GøKqšÛ#Š=cS éБOhÆ#9Ì$:ÆBbl¶iÌ»¢ÿ’ Я•EÞ·ÛÖ'#ëò`¯  ht'õý°?X?1ÛZùSûØ¢‚eHŽëgܲç&Ùm!”£d{BE#Ÿ³§¢÷Ü*ó®xE$P}žÂÕÇXKª í‘]+y7%wä]ÜÜUš±~q”^Á²|iX«˜çÜg‹Õ8Õ{ˆÌêüôKü b9,µç•/úi¸Š˜ŒŒ€ê k°äK úÒ †Ø¾–»úŠd»¿ü0“zxXt­B¯ƒÐ:¥\A“X%lPßù“^±ö±›SÆ?´?IXˆOFÖ3´`xnWµwš ÔÈk‰ šdè²ñ§Ž'1?Ÿ‡QÊᕬ$»fp/ÙÇCIÚ rI<› ·"ÃÒÄ—Òlp}S"îä¿ôðO÷t㈼ÞãP†‘ › šÀèò×y\,*3úЛÆü8²EÕuÔkEdµŽ”LÛ‘DŸ¼ChÕçØ ´¹9(§‘Ãåàÿýô¤jõÝ¡’R€we]°ÉÍÅiU'ëƒü©›tK(œJÍ¡x€³: °ž%Ñi´¹3Õ±õFëšÒžƒ*V¡dšƒ÷{θ¾”’¼™ÍSq¢°# "7'‰'ŸGx­k¬*Nr`ti]îLuëø8àþFב5 ò­Ae êµnRë4÷>s€Q™ÕGõýY…YÝD0,ÒÖó_ú©¶ú’uùßé»0›".Þàòo93… ¡/¶³fŒ ðÃÓJjÝ`À]»¥æb组]ÏYejM2Û€EÀgÐN©H8g2wGm©^E)‹N²Îd¯å1ò6Æ:"•ÑÔ¡ðT¬gUŵ“g0Q¤L×e&eÞlQ ÔüÈÞªjÌžÍç@Ï—EëÚmdC-ï N¾ÖååÕ¤áÕÕTLLQh">‡é&]“„þÑ'noW2¬kï®ÖÿØ“£0Š™Q¬ìÃZÕØöÇwXþyE¥·ÞÉ%ëBo]ÕÛÚJ×=¶~¥Ò-À6…1çŸlPâI³>ÎfÖ%›_05 òY ¨d]žWn¦d + ùS½þЫ´wÒ7+ÓÑ6iÛd¹¸ÑΔÚÿ_§»»8 \l´j&«G:,¬ÐáúZžûî­ò ~ÿrºB•§9„D’Dóº}$½UÕYíSZZÊPß|RÔ 8>û°kö£yïq$aíî \ëš}jc̹ÊmgѨDe]çÿ«´6àt·Ê­d+»éºßW:¼q †ûíy» TÒ‡že~¶ Â=±©Oõ,X™MÛcÛ}iœ²˜ðDdÐwµqÔÂóPÑX>€û¤uÍöHò.ú³™ÚhPÑw™‡&J^³ä[oÚ¡ƒÚs&9?XºzÞpì&ÉÐÒ‡$ö£Ýµ7…¹¹Z=%ì% ¬ÈýØü"‡ás?â vLÚ²5ÅiߊJWçrål˜ڹ}ò´±Û6X&Ö§…v­Ëf c8Yd]½ž¬&Q€œ‚ÞP~†rkIlÓl(»j'¹þ Kª›~è¯uˆ+ƒò°½ò Y oÍØBã…þ ¾úŒk§ÚQèAe_%ð£›W~ŒñËK¼uýX×Ìü3 ¿&ßåÏ0z¨–¶tè ÚJút@fXìâà 宩•T#u1+ŒY`9ŒŒkí”­ }FSƒ jºYˆp(¢ï LíG¸¡¹þ –V¾Á±õ-S¤ÖÒº0õʬT[Kòµ­O™È&àÐ}Ô?KjsG>\L‘äŒÌ®JÉÎ ¬«g;òJµÜró©~jSÞµ+•†p{ÚçCV—ÝÕ&寵WaFRúuu¾0¡þ™§‹å¸Êœ¹¨|×s"×wCJ¤Pÿ”æÏô<‚]„<>tkl/a¦oÚÆ^³ÊºêdצF ©êˆÍõýIÂ6MdsO;éZW§‚,ò’ÓèfÝ<%…íÙB¢, ­²•¶?Ö•åVX×þ˜Z±)©ïbgʺúú ÖR%' nSæ]»˜‚a›õ3Ö›FÕu0V4)™G00žJŒÑ!¸ÓÞ|~ë1Ê]sè{ò®ÉGä%UÁ=›ø$5Àbm “%%0oÞu–¬«·¦‰(ÉÕ¸?{ªæܥߡˆšsÆXR’è!ÖÔÕ’à<æ’³i|E`(¥}²ú³(=¶b}žå9¦¼ß\fŸjr©ÛaoùZWÑð<ôÓ -}µ'NÍòK.Sýá:ÛúXW+šGzÅ'"s/Ý22. 4O‚ QÞE¸Uæ ¯?ÈèÍê»IE fõØžW7Êïtë1d݇9¶ÄðŽªNt}†’h™[‘ˆfæP`l¦ Žÿ|>‘uõG.}ýb*)ßšqõÃ"V[ÔŒ£™¸ëRÜFªFÔ1'Z+;1Ps«B}Þh]å,Õk^Öm:2hÑjʇ¯Þ¸Dðš)h ‡×›¤@ÏüätþþÖŒž‡ôô]ØG­šFíÎD~tÅ*jj~aEE¨²¹M¾kÚL…@€j ˆ<¸Ç‹w¨>©°k]õÍ.$}$ÇÏE+X¸‡SÌDÄÓ å­g=ÈL™9Ù²]ØŽŒ(`ñ W1÷Q‘gJøÑÛ™¼ö‡>Øà€â+ÿÛŒÛðV0ñÆ–çгz¥3åçÎ8©².ä5Þð¤AfG ö9%ø ­iöêçF·ùÅÑM yÙ‘˜°¸6$$v•Ï}ö¥~—GtiË.´Ùh]M RV¿«•¢Üƒ,ÛøtSw<Òð­‘}”i†ìBM²N8àCþ5—Iˆ I¸©Áu-ë°Œ‚&'±déŸ9ã\C³êò8åǃÌL~‚Ý*V“£å¦Ví(”Õ¶dx½'¬%šð‰ äl ‘JŸ öØ×º lÈY§{wA]±ö(ôõX*|ëØIÇÒk°KÓhdÿ`¡ÁßàEG¶FS¯¾~ÌüÍ&)ì~(<ùâ–‡Zå#c<ʧ©Õ'e¶Á1ÙÕ/Ïæº«nƒ©Öج:ChVêg¶.¿üµ®Þ)$kÿ9ø:ÙïP}‹‘83èb­HÁä Zíµ¿w{|PÇý$재}PkŒMƒªžIhÆçy³’ÿ³;cfo˜øsé¼9ºÐ*Z:ðä‘&¹]Mß©|ã66ý ,»Ðµc¾?êP'ÌÝñÌØƒ55Vöå=ê\ô* `“v'H‡Z{Y•³©­¥þyÜIM*{ï2I´Ôe›Lþ{L°d]^ ¶j=ÛŸñŽ,uS1‘aDãÓÊ{W<Èe¯þrc*>Mf)`¯Z•©­‘GÖü#:O §`º¥©µLF/òk©üó»­ü8¯¿ÿsÙÅŠ)þÍ”[iâúÚíÖ䮬J[¶Ï–ûT!(< ј!p*1Ú*²’Øðß‹öع$]9Ö{öwYŠ"#8ör—Y=óé2ƒètÉÔN‚£IfR]¯}7Æ«QëR‘`-§mzœñÖã…ÉÈ)36É=¤Kþ.Áä`•ê¿ÔŽÀÅUîS °x´Eëª6%^æáï#ùÚ,ˆæVX¢AèRÈ…Úsc)|çÉ•£ô(9.@…ùTŸ[ø. ót0¨% õhíÿöR µll^„ßǼ«ž–m¸«ÎmË;M$ z­&j}Œïe]åCïæû”¦ÅI.j¬öá«/O|熑¶³ný Âót6€=¦y0Ø´Ê'ëÉYaγzk´HV4‡ÿ}:ž‹ÉvÿÎ·Ñ ]“Ÿ$]Ýó˜ǪÇG›xO5÷šHSWÎ^Ûª)Ϻª"cá`â/dš }—¿"›ù>Ô?éâN¡ 'fþÄõ´tmÀDu<ç’÷«-“”à9ùÀ›m-©[ÈÖý "u>Œ ÿèµc¥’÷`¨Ï$å酪]ÍFŽP’•ôîñÖ§¸P dޤñ GS;mçz«—â-é>QZÚILÊ#¾+7™µ†g¯¶é”JºÌª?ªêâ­8Òï}}t±×ë‹Í;zìîÖ¿=oæFpál¢^l®Çõ-šÔruP(x†Y`‘ÕÌz> }ž.åŸA5¨ 0 Æ(W÷þÄ&á‚gZí®/™wü@ñ¦†¶ŸQutúýCóåz(¶'3²ÑSØJѧƒâ›Æ´™¶ó¿:éȬA.víƒVÄ6 ¥¾^o ]yÐÔVÑè[]èžjÕÌÖËæœø¶I?“®]$U[¸3JXSLèÛŠ¸m†ÒÆY2,ݳ•ÎôâÓ?1Ó]8MíTõDp~£ÎëljÆcë–ÙœOC'óÛO?tŸ€w)QZ‡àý ©KàùS¡pýÎ ÕÙÄ4Óæ!»˜+•4Ô™–µügsKÛ?!-Lh|JSÅkþÌêQj)ªÆ:,@.œœíÐ?ж¬ëG¬xñ¡‡ü‹Dˆgš7çÙ˜þ¼po dÕ%+SEžÛ¾6ÎJoùlÏ÷…K³³–ß +oüAP¦ä¶lŠmÞÕ¨·7p·eåæ`¶uÃ;ÕªbŸ~èá[‘‚,hÚäÕ ®@s˜ÇÊÊw ã×÷9x‹õïK[ÂIš¶(ÍKFY×,UrþƒêÇ Vš$تVýñ%‰á9Ô‰F] ¬œŸšˆïÜÒµxR¸Pze»V­ÎZ¯ÚtÄ Ì=Z,êpÓÑù»6è´÷š/MÈ¿¥@;Ÿ½Ï´%’ ªmú{¨¯²”fš$¬'€pê”AÙ·ñ;Ù΋Ûå#Õ^fÎrÑ‹Y[´L€_ðñ·E4Xå Üî5cî]m¤9¢¥õÇULi¦cÍ”ŸpŒú&y&õk¿¾¹š ņ‰À=Ò‡E Ì+=K ǵiÐZ™¿Û“””ºr†¿± ‘GüÛ)uWà$»gseF†@Ô3wXà’RT§Ri¬gõü$V¿$'»õ®£©LW Ö,rk#Y °b;š$0Ü—ª½Ô8ný .„óIãÎÑGcVu <É‘¡xvUñú£;KUd¬åô Õœ•‘Ræ÷MßõVÔóQ³¨cé†Eœ…&nj´"3]‹Ž¬z¤çñäSñÊ=øgyzÌDQFõö¡ñ¬_ßCmÍvL;P˜´TTdˆ@ß"A#Y–ÇwŠæAoÞݶꆃ?H´"Yá_\ß—ö¦h£µúwT×m¤æžDŸ‰˜Âüi×u-.¡2Õ­TIµ?:3(Å»8pFËò/òJ¾WðŸ‡d¡1/ÕuŒ6h]îK3ïŠâ-·…°<¶’UkÄ$H  HZ>²íÕˆ¥©­U:éUÒ A’§”3é ¼ä§çVÏG½'Šä÷¶^;XrétŸ»N.@…^KòËYL4ùŽLiâbÆâ;hû™%µw rMÝpöGÐFL~2¤,›:,X]˜ÙË>!L·lÐ××d6ý“y{¸Éô *ÏP%§‡XQ“J-zRíè-ŠÁÂCéy¯“Á>²¤+ÙúùH¦MR´.”bD0üçþˆ’•™—EÞ‡Jt¥»…y™cN\¹Ãf®'ÃÖD8 xAU²æùTe]0*IäBw8sžP9(ïaÁÒǤy`-ëµÐm“Ÿ zg'ųJ&™@¼¬ÊBÅËQñnî/30``4¹)òîE7Ü‹Î%˜í3‘ðA;WK¥Es¨ëñRþ\X5e=wHÚö<)ñ±´=O‡Mn{¹mÌìõÆÖÔ˜úAM„p‹IJìyç-FÇ¥Ù¢ ­"‰ùøßš6´¨ŽP]ë£Q‚ÿì·Oþt±ëLY³„š4µÞ°<8…ÚÕHÏ–Èm½&#aS6EPP«çÁêmóÉv£Yèòæ2k–Á—çrЋ€©æA+[4te“p+2ÓìÇ’DÒŠ„PB%˜ ZZ—g~GÛèâð\z²È£h¹}‚§‹]ê䛎/¶€¬tq›¢ fÞÜß®Ö|×d÷‹ë e-í8rºMÏsw h¹À`Ó|÷J|Þž**_/Þ‹¼cT~G·¿,&èkiƒú )•îjP£îïj( _YnWäi¥LrÏŸ„ijþÊ*#›"© «Ån£éK ¸Oæ/àq¥wp* DàGâcöl1Iä@g3CÏäk…"[-`wç'õýÞK3Ý«å%ËHÑû¨‰gê£ën‘×’uu˜ÏLÙ bWJwÄðg=g‹ÙÛKt6(ºhCÄë®9œIeô¸>Qôžšï,âÚjZ}†Ñ„ö“%xEž”oA>Áò¶‘2sr°Dñ"<¼¤ÇÄjÔùhdÍJ³ >?'úéý¿ÇÊ{Ðêéb·‘òKª^PÃe¥ºÞŠúX6¦0=ú±…­ÍäðCïÑÔàh›"àÕ¶x·JSskJïp?« ´“Ê¢×ËÜï´Ì¶?Õž‘75ˆšjâ1“®õKîM“|¶×TO?ÞÁøfÆ¥ŠF£}>?pó±|ßž;°SÔÂï…¨sT‚úõ¥Iâúêdn„GÆN&¨¥h¹Pâ'%YÖo‘×§Bv*Yñ­9ÔOÍ7ÝÐéü«Áùõñ]M}χ]ÏU1ª#ÅÔ°C¾¨þ”Ô©ÂèWK¥(ü¯Eùdggäè6¤ë)"³úàÏ“äkWÅ€u“SôdOÉïè9p»;SÖß«AKA3޽^X1»q9”ú+7è>Ý€¸¼Ù±7 §9yMÜO‚b°Z©Ãï`”ŸÀø¨V>²d̼=ÈeMÕC ZIôhô¸¾®"Á¯¯ÐºÐÕ—ZjQàt«j ÓQÑ+òªÉ ¼*™s{:riP¾úÒÒrÑG¾«<ý»›ûyQfé®ü)x°Ð“å¹i8v!þ{&óÑ\Ù6S JmÔ–ÅêЧKÚßNÂ-< †â§ÓºÚÃsÜ';[§÷Û½ËUxysôZåG Õú˜äÖF_©m)TUVèQÓØk‚xƒN÷[‚Ì.0Ö¯ß ¤Ö}ÎMëò»¯V¤Øu­g,`¹‘9O)ì(õ OË4×gRgÔ¸>“æAó´—ÿÍ#ŠŽW’¬ÝÁÒI°^D #¨â*ãRíÏŒ¡-ZWB}nÍaµJkcI€d"gMu7¼0w/â*¹@®óºµØÛ©OB!–XkêÈ­ÆÌ45(ªh'Œ1ï±lqá‡g^ï0²9ô{ÁP*ZW=:Û ÖF¤C²B-Äw¾«IË`Ù–Õ€vƒ§•Uš,,u¢Áß­«MK¿¸€Kÿ˜ä¥"ð¬FºÌÿÏðpåK]-ÏÈåÕ¼¢’»W-E.ÎÎê4l#ÒvÍtá/®oñ þ'»†ÿ­­G¹þKw 0”5ÍaE²Ë¿"‘e@E¨I[og[*ß•¯œ—º…Ö••ø“¼;ãÉÎ"Ñ]ó!h.Oj…a}"37Üýr‡âO®s~èïÿщ…´û(@›ZÒJ†›kw5•o£F›dU#¿„ë£uxN§ö‘ªõWìƒ>3ËcÌŽÔª<…’„w±¦.þ~µ„ÝŒ33 ˆñ_jð t\¤ðˆÍx‡¼0˜´®¬ í2ØœT@D:ÛSÿ4¬UrBž§Ý-Ä«ö^g48v)¬:?=ýè§7ú ¯¨+ {ø ”-¹X Ó§‚¡\®pH¸h×®s¯GvuϽ^øáƒLÿ/Q@Ñ$k}¤ [ˆ:¦×Fó¹JQ{ -q}úRßR[ñëÑwÜÐwEm¢±z]_©ÚÚ>äóJ@ßšøm,Ý}—|²Ò®•å6%ýZ dxP«"cФ´a ­2ïê¡h#S³6x÷7pRÿe}@Ç';´Ê“,üÝRcæfm·O‘P$r# «O =ô5È{i6 I×Áè:»f)-W(cEg†]W`)Z¾0~7¯ü´’ªº0B Œ#šžç–g+ë/LÆø(uAã"•槤ìÜ}~•xfÓGö’m¿>é§õM‚ùJòÐì$.4œÒ쀂¿ç‹QÝg`(ÖÄžü§©¡i÷o ê 1}8pË3±•Bõ¹%†çY—t±­îl]E?¯KÔØí)ÅDcE¬óú<ò YWyJf7 <]gjKì `hyp:…ö°ÞÓRÛ ð:R¡ÝÊPCRsf/ ü;»lˆ­-5GÁ¡r8צ„ºý9Û_ôúªËÞnÆõ˜{½\;T~u± ü̓5ž‰]Ê‹ž‚Ÿ—ìqäOÅm¨i]žÅ—ÍJy–â½}»>½§ µEëŸýX`Hhw~¶LR[+Á5I›ù%\_/š ª×Pì¤øõ‚˜ÅJsÒŠ¢Üƒ}\ÀŒ^·õ±$p<Æ–Œñ.ûs±mPH>ÔÝÆ§ž¹d÷íi‡ÊÓ=©8ź¦vÞMù *Ã÷¥ßPS+Lϰº~ò=Ímà²èÐyb‘àÉìdë´S|ÌXòåÃô´dä¯0&ÛA?ÒtȨ>·gw†¹ |¿ ä£l)ûËh´!ì»w]¹Ç8ýÔ6®ØæºüAw5ꪮ{t—Ø4VMm/ Y£ƒÇæP)¶•ÀœœEBÛHôp?½'Ü×S³²®ÿV˜ßJî“(/*­§ë!½3…ªûYøÍÉwŠQ¶˜säéds! kl1#Üym¿áWèù25”Ûè )lèš=ktÎG û¤Ä|ì˜]Þ¸[$Œ7{>®†S÷Æé‚U2EÎGìíœ<°~Y‚¯+ŠRÏ('uËîƒÎf¯–ºØXÞ¬7´îZÒÛ <(ùÚi]N©g º¨êMCñ OÊ&嵎Ÿ:æ‹ïÖePo3fÅЪ_¾åu7ÎüÜ÷#8Žy_眗³äA€t÷sEÅnòRCß@뙑õa™â»—üðXÚ]5¶Ïà›_FýófÏS#Ý;ÓèlÀ-­Dp Y.Ö>ø –ws0Ûø[%LŸòÍž—n^Ri³2ýŽzúÐöb™¸ŸlÆux»©Ò+GN-Dl3ÃU=ŠÁ«OæF~2£±b‰gð”`ñÜÃsw5÷ ¼Â$s¾xaz}gX á¬Ï…#>\ººõ6^h];vÒÛLøé_nó’ÞAŒi‹ø@‹µf£}bÍ©äÁšŸšRß:Ýb¶‡†Ùeè¹§ó$àSìî¹X×;žË¨%ì.w1ÛG}‹"è¶úÖ徆·î.oÉ÷“’ûV¬7lz=,My‘Ò7»øPªíˆúnŸZ~¿ˆ‰S2ᬳî¢&ÄZ…MÎöÈ n aΜAãíiDàñŠ”Ñ¡7Ï/™YðáŸÆÚd?(Jâ ~PɶTu–Rrµ‚6…e0”¾ŽzñžuCYé©KüÚÍS¹í¬Újöm~õó™§âm6kì;Øxrã7FQÈö­‡§Ú‰ŒÝðýÙå…Z~„Ö#kK‡4ƒ~›ª·šle)8c¯~Ī€mËD⎜›ÊPµþ‹Çàeç•´Ÿp[”·:Wa-?ÇÊï`,ô|îk!ìÍçשþ59—à¨Ó$DvŸ^ý™š÷ø½;<è%±ÑÅ·$Ã@ÇÓ$q}ÖàÆR0œ©sánMsFÏÇRÐÔ¢ÛÁŒs=bçëDŠB٠ʼn•·µ¾í€ûÐ%Ê#öhŽƒIågú7¿4¬EØžÇY#KÈÓmð',"@¢ê³úƒ¥.vÀ òÏL_Ø?Œ‰ù‰W‰í@ÙÚ¼VÍ= ¼ìñ¨.ßœÎÆÝ‰î*ûSÊÕÉBl>tù-óÇšÊKFQ³­6õü¡Ø ôã¨ÚË:v”Z4‘è8¬Ž.¡XÊÜcܵYá.ñ3Ábp£Ð׬’Ù@åäA÷thäA2ŒªKç.SBÖ ç·Ï*™m­UÞ¡px]P°‹ µ:&Ow]Ê'¯l‚\€Èg¦©Í³Xó_ú”Ç2z(¸L¦ÊnOEiÎì‡.ÀmfÊ;Xïr6ãA‚æeáø/ȳÍÁ³Å;ïPSÏ)ö J¹g]˜G6É‘Úxˆƒ±JÚÝ ±F¦Pí³m¹PFet¾D惊/-.v‘às91kÁÚvÏ"ÔI«óùÙøh1Uî%ÁPºeìÙ@=f‚~4ß¾FÛθ>:¥T†3ÊÊj9ˆ´8 Uëj·?æ8[ÿGå®-¾Ãfã+‚ûHWôf^–‹ÍbwŸ„‚^tÏgã¬<¯v§Ø»K4ì y¼„Š÷ܱ07Â~Ÿ ÃäÏ]a™!Ë9?lèq^ 蟨[J»ƒ¿V)æ³ê u%à]Õ‚ìSÙº}‹ÅM5eîñg·M:¼Á­°`²_º>(ÃÒ¦{ý´FãTäøcó‘amõóœ-ñ]Ll ¤‹})gæã¿Ýð2*?BXøÿRðú»-YJ åv9Ðîý&ÞLºëÜt…k˜¶-±œCÏj£J6µ¦g’%)+`ີS5IǶëQle]{TUo˜S1kªO*úÔªZ³8óyÞ^Å( e^ú!¯aäyNɪ%Z°MâÍŸæ€A^¡u¡ÃLÀ˜èçÑÔrۙ̈Úô?ƒ$¿áz’ôë Hü¶a‘¡1¢—Î}FX€©×´V%¶x„ ‡VÄÎLuh,WA…åé¥müÞ†xF¿³ó·é¸šë£®oŠÚÄßÙPDÜÒïãé< 'mðO¥1Qr¯ŸE +LE$$¿ ´Æ´Ådíw[Ìùö€B%ì>3$@*SË0P©§‡¦ÒÒOö›lÖŒopæPW2fÓÊ–mt;ÉÊ‹$ú£[k³XJÀÌÿ·ÛÇlöãÉx„MS<þ DÂ9wýœ®¯­mnO“Í$"¨ö’Ng'%¨?Œ©ˆ—ܺÁø½Ï+UÙ×]+ jP"£&J¤5ËGo„Œ;?òZW’¯»~ jõ-Y£XÎE’,ðn6ñ7ÔõaGE«âèÁ¤Ë ô`Kë§à`Ü'mÔa5JKžBÑÔX©ÞYË™ª¾ç˜Úu6wFŽdcÂNå1 ·Õ²&ù—6G“KgóÀÄ(þÿ¬DÌÊ0;¢aõÂ7Ï›)~¹º¶(4=Xˆ—kŸý¥Ô™C®ÐK d¢Ï:&6À1²7íE¸“å.=@ ŸP’41žsMA¢¿KÏ þ3j~ÒBÛ$Í­ã&¹VS5¨)—„ÖÇ&“=r™ëéÚë#dm Cà*[¿ÁkØIcEK±ÓÔ ù/LF?ȼ1‚¢Y¡U¤YóKHÐ÷V‘‡¹:뺺Îa]7 Ë|Bšº³U“%žA‰-É¥Ñw­rÄy ”p£mÌšœ¬-´Ù­k$«K$‚’õl$h¹Ÿ¬"½ä1–¨wÛxªt?7¯ìÒøœç‰[†#3šÔëÖ`úY¸¥Â3ßLàqÊú€Nz7™´–Ì¡}ؼÑìhy™íCë~ͬv£u\ÇÓ¹£Û.HÖi‘Kr…)\{÷ÅèG/¢IôhZùßJJÅZ™MR²€Ì’Û€2qIÕŒáœFFq´«¬kDð‹Ç½ƒ×u*ÑöIù‰H¯Ë”wð?*jì$0`Híé¡Oé)@Ü”«¶¤±F v”{e)u>¯ô¥óÈÊUêÍ¥'áTr¹£Ol]bË]¦“î1s›-6–´Kˆ¶Xú.ˆªrc>$á½¼ˆê|è@ŒÒ€›¤Õl>ï×Å2ÚGª½PèlmÎsÞÂO@8"»O3ï¹Â¢ØzÞŠí£ [›ŽÌݯÀ<OcE¥ª¬~¡‰¤ƽC¦q 8'Ð?˜ús½<ö[ØbŸQ}#PA AZyž‰ÈAõä³}±'Ó…pUj˜éÐæ$Í3†?-uíb–J.!ï&nèQS*s‰•ôží1œ]»Kžè»Ï¸©oº* „Ì÷¥ƒ¡€ØlVQ‘€Q.­«>ÆoÉG³¢šØQíážÕP —רq«ä-ÆÁLªÍØtœbƒÆ,ðt£ÉsSõežt»QW¶¿÷VqŠ­cfd½Q=+p”{Äz]+ š¹Ï8ß>£XyÏ“ƒz *1Ý ¯ÙÓuð¡2û€®ÝöêžK/Š=þb …ì…›ÊÅñë‹ïê;³+8²•< Gb•´L˜¼W!¦žœÉ /ÝÔ¸¯õ#§çΡóÀkS|~[òùBVe¼X”Š~l¥Ì2$ø²+e¿®²DÉÐ:¿XIeW{Kz~ñë®äl@:Lšûd¿f³“·8v3¨ý8ƒ•ED¼ØÚ ý}lm¤tÎÝù=4?C£ïòWL¬ÑþX*ÿÛ±A$8ü&u§­`8$… ¥ŒªÜèj¥w·¤ÿã™ÌG ¶–¬§;Béä Ñø¥žÊ8]Í)h;©Ë‹üì|¬« ¶Voû“^­iXÁÃLridÁ¿ô$«>ÿC%ÎY<€#ˆuÞ¡PÑ$¿1,sêëzøæWvñÞ®úQÐ+yïnUVm ¶Ô£ :”>Yñíó¨g7ƒœÛ •\"Ïù¨¼¶.áE˜‡vçî\’Tǘ“#f6Ëš1æYƒÙ?jK^…W¾§­Éc–EÈd8EöYŠt ü‚”Žnã{Z4¤­¦¿|ãçjÐöLäq}U²žõT)ºƒ)Gt0 &å½"o äHAÖo¾Ô:<̪£;ÚT¿¤Ôò‘¤ê–’MÈÂJæ¬Ñ‚¥~èÂz¤hȱ³˜Y=D4šÑwaºÂH9½ª±½—²zO÷%(åoé·æM‰¼ÿ% ÍB ‡ÐÇ'QZ©Óëz‹…ϺÃüêMv‹ï'F…G ¨–mgŠ0Þ"¡VUîáÔ1¥i’îujW"Xsé;x)ë?¦¤¦J4¼J[YS[Šë-È^ëÚª†AYvµp}C’¡môÁOJ‡¦“æW,ò‚npѺQª…Úm”‘akUØÙëǺZ•ÒVó ­Ëk%ywOäe]—u€¾k~Æ&+…EÂw­|æ1Í`ì ‚¤Édæ,“>ã`2 ëroÌè…IW±Ú¡Ö^îl__Ý Õ…˜ ª1™ïÚ©s•@7EÆó€ãaU€€œACñ‡n½¾kw¶I n¼Ü]MÎù‰×ºjSvUkjŠÃlJ„8w)žuMÂ"fàê&[¡ž¶`Ïa0Lº¥k]s&}ú…8¨÷ÑÜýù®#¡u¸—ïJEéxy^Iü ä&¢}·Â‰‚Ó:a˜—‘“p? ¤«± ÑÞÎÚµ.b(÷eAJ§Èè±GYýÊÚKK®¢[—È9ÆÎô/ª¶"'ìw[¶²=mÒ|{b[ö¹«sÔ«ð¸ÓÔÆ›R¼¼kçŒ5J“ø•—Øz{ü;LþÏ&²Æ°}MŒDÌ’Ô‘ðÈ£&§×)Ò-• -ÕeÓî Q—½zŒWò’b[6‡á㊔·•O59ú'ïò“g uEüõ“Îh¢˜/‚›> ûÛ<°Òùë@¯Ò4:-…" ¡«È¸×•ô{5ãÙ‚êÞ¥JC+æ‹î<¥t2k'>°¢ì¸­’é:š{”5‹á¨“´1³úbmŠ û“¬Y¡î0¶©Ÿ†2‘SB¬l—&ßÊQõ»Ì¤´ç±ù«’¶?‚D§HýsL !‡Ôiú¸CѧÅæ òE­ˆ[³ße±cÄ$ ²ß£-±ÁÖGÌP¾Y}ùüçU>¿oB8²V¥ÿ:äPMöuT‰!Ï=œ"hŸKÖåªÐÅ•ý[®Ô­½cËùõJ@€ °•Ó{Ìü(S›æR= eõ½Ûà#Cµ¥‰ßI8G<æœßÑ5ö+ƒíz©›Ú©$ˆƒ™‚nÁ™2ð´üž®×ÃsÏblÎÞ6fWëÉò¼`øässú¤ZöQ¸êS§ ÒËl„@…ò!‹nœ¹Õ$g~4"œsÛJñAÐJë*£ N ©09²S?ÊÅ^Gofõ˜·òª&ã+Þ¶ä‰Ým4µÖ©‡Ïùô­nÿO7Ú§ô\O´ãŵ7gMm¿m¹«µ?Ø “y†2ÌÈ`Š+üÝí?€±¦­öÄ[Ž»Žl×MS™‰œMj¡ÿÜ0g2.üø£îz¸ìgPGsÆV'A‘»W¹«vÔïªkK¬xkƱ^*F^©²9‹íF2ã£íN  „­kZa͈v@²ŸcÿÅ‹o­àtŠ’Ø’#[CPåÑï¾Ñ“¶)ƒB;‡)~Ÿåcj–å{˜Ú©ªä°¨Aër×¥Yˆ¢i’˜è O-áPhwžz½”>‰½¥ºnO|DNP’¦-vè¸tŠÆo;ŠŒà®t¯s¢Ò>ï_ðC°ƒG9óSZ–"gÉPÚÐ<_)lOKè¡üždÞêc‹»{p±s¤3ÚvŽ|c´¸d]öè–®»Zì‘]ðnþºêfѺ<N2Äí—‘w¨ÖóÁwíD[^~«ä…•Z«¹‚³c´ÿ šªÉö—®uÍþÑ!Û*òZ¨×tÓW“ü9H•4ý³×¾»ØcTÚPµò‘j§pliý"[¿±%ZUÑ‚ƒ¿Î 霡 ±ò’vp rýl,üÉ3¼FVWü[“Mˆ€E|t±Ûù†%Ï*Ù$ …:ô=fÊb³$Ñpx“^pâ45/2öꛈ{ì;´#{ɹ>Ù]ˆŠ½ñùáåÑÐxóÉÞÛ ¸_)ˆ Ã[] Óµ¦Œu—Õy†5Ï⹀蒾j$9pT¯bRí›þûÒ ÙKîÑÖ1µ´èo,% ÁSµÓÜgr}Ñ™æ¸Q‰†T™vç K¾™×Ç Ôà±çÐX×<:;Ù£JÕC5M­AÍ‚§ó§,É´µ×fB5¿ÊÅö¤k—ôw/Bªà„ˆMª º‘\ êò¤{ þ’Ç£üRÌ#¾“HÃ-û¿ª¾%×veG®F±'°üg²Yö»0 Ê€Qýšÿ,ŠÁLFèô®îZG{I¢ø F(#\_ò˸-ká÷s(둇ɌgÔ瓟¢B³–.v1ɤ×Ç9ûœÍ#…|–ò•SïKê×D4;o¬•®§6püÙõ‘ =å#ÈwVvjWäFlûU´µá/)ÀC[ ¤~å’Âö 7>È/Ø H»O=”ëÄõYg”}ªã ¤9­ D¼ª%F¶æ"âÙ§ÈÛkIÔq¦Nå­FŽZ\µW);%;ñéØZlK ‚ß’Aër·¨Møñô„ï G¾1ÒºJa!†ç7檫cEÅt๠Õ?¯Ô·b«F‹¸¾‚¬§2Škg|…­NY×Ì öþ ¾y€Üo¦A,ù¹!°A÷ÉlÝÓ@ªa’PTÝÔÖ³ ؃מïÖCD ƒž07ÎÎj"~,kñþÓé=E®ÄnLÑf íSh2C¸{uáÖ…îœÿÆÃœÄwá~}€ÔnÒŸIú6iï·½ úú,ß‚P¾ 6¤½ÜÃÊwÔrB¢|h¢f²úà1o*ÖG:ËìË›[ÖRìÙŸÕD$’½ÎüH ï§_xCÙ¶¯H¶Ih}íýñI~ô¦PÝhÑÿl½Õ>²_‚|± þnÉ2¯„ßhj¿ÌTÂþsw¶?î –Öò¦ì2¾ ÄP™ÕüGßjxI—…mYÞpàPJ~‚}¿Q¹Üááý³K߯üˆÆö¡õë³ê"ºÇ¯[ €Öí3…Éž·-[U×3µ¦6ŸZÇýdOm³å°ôÕcª_âM£»ÂºíÉ«XÖ?ÊÌ€ ð§ŽgÛž\<¸Ü³ˆdȲx0üG`UVUV»œÍh_™t¼¦ÊJÕÆ5øÒø däh]P ûl’Mv$ðö˜ jžšëKªº¹Ñ³bㅵє­Ú&e«I;°ã£t.CÖ…vÿNëòJ\ ««ÑeynŒ™þÄ3Kú»[–½S[v‡ú5#(8kXôÇöJÐR˜ ;[‘»Zßm‰û¥j£§õ­n\Ý[ÁÙ›³H+öa¡²FnµcdQ‡^%°Ãïü©Ð‡Ãz¼¢í£Q‡]o•x–)Òº{Šdy*ß X²®ö$ý®¥ÌÏzdëG9W‰2µZ¿9y5öê-”§òúVȳ¶ô3wÎ".@s¦ƒ²§Âñ›%—[ȈӠؚÒ~ô辘È[g‚‰ËÈB£ÛVyü]ÕŒçL’¡Æ‹¾òÉbë±¥©õy=Šß{²ÃÅõ©ÞÖ6@¹Jÿh6Maüïˆø%z:›Tx´ýÕ?ÚîkêÇ ŽX zñɧÅîTÕ‚zF%Lùðwõ‡É|ºØ›*ŒV^±¶·Ù„‘ðÚFDʶS5ÆudJ¹.QVŽ–„b?ÅMOöt1VšðÖ°»¯9ìGç}íÊR'$ýÈ¡21ãÛLWg<ýŸ÷àxŒ8·&^ý«‹}Ts@ƃ$’÷?¨¶Ì[Ü<]lÿ„ VFaÊâõ‡¨â<Áëôjmg/ !ÊSüô]q}‹fSDf‰ëK˜Œõ Qvê¾P‡Ìߘñ¥}"E¤:_¹*ƒÊ*?vц¸ ÇÑÔ¬ýS¨œ3ß=EIé!î”þéb—4ÏÈýÚ£+dfK¿°“„wdš½Ð÷V\ô D±sŸÀŸ»xˆvMÍæpq£ì®&ñJà “?6ˆ(y7UM'iâCŤ¹é÷}LBŽ[Ü­¥¯lî¾k3'ðȨ·ÂOÊ~E/ærˆ?|×’u•¼- KíÜ05Š’á™·/‡Ñdƒcăa:„\†ÍK«lC¡”+âôâÝè ð(+ôT{èŒñ½x4¬³¹€Qüj<˜É}kŽ9¤wuÆNi™‘hJ½aT}½öÓÅž#u <Ç'…}к²ÔÖ‹ò6³õQÕíZå£\l–²—±~f²Â]ga·£lB}0ËŸì'‡xÍÁÏ–>¢ÁHòÿ\údåÈ>²¬>%A 1Óž"ˆ€R4/ ðõKJoj̬’$Û©•ù fnÑt›%gp¤À]RØØ¹ ©žcK`;Ò;ÄõÍ¢4(lâê•RxnòbµÊ—óy½ªú†¼Í|?øˆ¥Ü84ÌÞ@ìÕd‹ÀòXU*d¶OÞ¡í)Ï{ÿ‚öf=µ*„%ª¤Ô–øz¡d×ÒÔj«If=øÃÒ[VèΦ³p%êyýÆy@–kwa4 ë¨Tí§j¬àÑa«_²ØV‰ù¶â¶¿ŒSž”ÁüAeqæCÅï}bh‹Ie §æ½C'lкʘ•O WNëòòê¯'+9YÏD³ql¯V58:…t>a²BÈ¿°“ ' ªÔÐ,†zyºK°Ã‡M…¼}D°ëˆFñ½n±Ú•äb»CÕ½R f.Iı±ÔR\0©N§ÐåIe,ÛM)ÌaBWÓÔÜòƒ¡H¡¥öBÞÛ«­dÍLzäPc͆¢’{c½æÑ†‘éД¨ñ>KbÅ ú%E”Õ礃òô¤éþ †žÊª*¡¬æëõ^±£ÙSöôâw-7u±GÍèéKbà”Zdj{¨õ8Ö’9¬dt¼SìCV\ßýÞŸIÞšKç^`ñÀ_ƒ«k]ì“ÛÖÎA^ߨ$ûÔ™REb“»ãµ?iP uá+×öGßÈË£žÖÇ‘J{–Zj€aR¹žX*’è3S&vcÜ#¯æ™ÍGL˜nõš9F” ´ S»5•»O>L÷¹ZІõê:˜iÔQòԯѠ  Cƒòë<hßÕxeÓ6β®DÉsÂ9õƒ>|àm}ÒEF<”&Ïj6&‹)fmüµhPÐÞ¡AÍ7}¿Z)&zQ%%Q–Ú~š˜¨©èÕ¤[„@‡2˜Æ÷¶49v‘ µ7™jiÔäcöjFzìËÊg(îþ\d« ÔÕÁI¢EÌO åñ¡ÓA­:ެ ™7ÿ’Ê|à×ZIwK¬Åg`í'ý~ˆ›œ”2¸cqCû?ùˆ?ó  d»»ãMÇÿ(ôvh‡;ò1üpÒ-uÐcßÜu`ýh«ûåmžÎ½Kþ#4Özòñ£RS$ŒŽz„@ÀNƒÚµ>­¸ÙU%Èç5Ðjt6çIº_Õ’Y¤O\Ÿ8ÍÕ^­û+î~™ùn/ŒËI…Ü&Ñ_°—^{šZíC˜} =X$ô$V¿æ0‡2¼O öbty†Yª j´£s{؇§«Ý·CoË«ð@tèµÝ—>©Ìèî'¦vÍ¡lÞðµK~œò©¢iÁ QèÕögèØ;¹#a¹ûȺüúô½Ü7šoèØé !W®D‰´·10¢0E´¡XuBtf§Ôw[J-¢›š¿±/öDÎÞÎb’ÙƒÕÕÒº æ iP]b˜ÄŽ”®ú "e‰ÊÙš©; LKß…T²¥Æ LmyµZY$L@]S8½ËÓÀa¾O ˜a“ÝÕ"Rì2—=sXû£HT«€1hð³ÈkeLz5`Ô>ûVÒwÅèMU˘íi£žÙeÐkc½‡=Àþ:Ìû>ÙËÏ’úš{ñÁXÊp\AÌp‡ßc~umÑÙÔuU»_Í_)ÿ×'r¿>ù®:ǤݕS MÈJ-Ê ¡LÙøƒJO¥¨&tåä‹òÒÑíHÅóØ9Ô&E¹e)„§Tr ‰ë”Ëð@}Í«×Âç Ít¦³¥ÎÁƒ„]¯æéµåÆTé 1¯«*Açkð‡©ù5äóÃðg¤åb’— ˜ðÔͬаÂ/A>²O•ûu‘Ÿ³¯0Jz}ÈëYÁ÷Âøgu º«>zfœ@¤¯|+°^p1‹ûY,¼Pÿù%ñÁ¬·Âx‹ôVòùmÀUò¹œ¸'–vh@Z°~×å´½ñ{sÕÁ4/§ßMhZjôÀ)#ƒª6¤[Û;ƒxNªôC÷hÙÇìüéÚýypF£A¹÷”hÞx4‚/ý|ÊÌ6P.ܾ!ë£hÏÉÄ–ÇÐs¨ä³±3s¨kÞcòð‘µÔpšW’?;Ug¦mÙX[ñÂd‘€<À¤Î>œ1V§çÁókéL¡þBŸÂÚ™†ãÏ>eŠøu¼Ý’c½WÞø–ÎývSCÛ}q4/¯.vïc1Y§¼ß£á2Ô‚µ¢Z~šÊ†@í¼¨ôç ¶šRêÕy:\Õ¯C0$í­&ÅlL|sNt²¥2z€*_„z–)'ïŸd=s‚@Ä–”Zü½Û^Ìf)•)YxµnÖeíÛ÷ù•÷UD¹[ßÏÔ†„À¿¦ •ì|ž(¥zrl-ŽÂGÖß^Ùõq9}Íœ?a€ÑýtÌ¡—Bû…Á" ®m(s›–šéØ+;ù0aw,Acÿ~ña–Ö»æàÆ•v t$SD8ôy˜B°•­eñûõQ]Çtš?ȳ¦ÊŸê¯¢.É#õ⯃Þàó]Ø-¾þàZ—ß­EëòܽÑ€÷¶äÃLœÆí6N TÃnÞµús__¥+„|Óâ?š£êtsöºÏqák7Qò²àùðXn‹ã­B¬ ±îRSÇnÃßxl´×º<w”;ã+wÆmžÄòò1‚×Îmç} ¹í¸)K˜¦²7Nª÷ߦVcM…>rZWV&?²¶;}\k·ÏºUNçÁ)”ˆ 9ÖÁ±Õ˜îõU+=Ï(l!óÜV­ë.…çÎ äµ}¯YP¡¼TÔ£;}3·}K¹}·|/ z߇y÷ûõꋊ¥5,¢ª‡‰á;{îWež‰¤êst仪2¯É&=OÌÈ:6²T¯™4³úüÆ›?èÑW\§´Æ¦AÍÍ/JìάxæP5ÀcòPžìJƒšwËþÞ¡×kºªëe·§ÎŽ£<ñ -º°}—ïªU˜Z›ó¥"·âËB%ê:68Ð`üC£'Åìáðöm¡¯7’™Ìy°Ñ¬núb%?°VÙ'ûtx3c‰µ\“¼;ో¿îœ¦Ñé|/Ìí;©ÓX½Üµ¤}›Å×—îÛÜ+—. jG;oÊ>çðÀÓá–æ€Š÷éz?ŸÊðL&èu—ÉÝP9ÏéýÛïò`=°}äAãŸl™ŽÝÊ®ó}¶ *3¦}ú](nÔžØûÓÜóBõÓ@ÝŸ:´ð~Æ'q²˜Ûî'œykªÒ7› cÐó`†™ùÂȾˆØ¾«>™ŸÛ†²úéy—>ÊGjÏ¿]ÐG&l 9¹Ê‚ƒÝŒ6´ˆ  P—²Ú<¹Ãs#¶Þx†&É{°!þ¡ÁÄ|ì×ç>ÝèäUÜ-òê>£ ªÃŽRpΪýéy÷¤9ŒS5îYe$6.ƒ#q6q}‰p¸Kt<Ý´Q5Ð4nô܈°xºÖ¦:=•ÌÑ7¦%[\U¾ÔÔ;gqêµ÷Ô$È3÷|•°Äsµn_]žÕž"c¶ª†?»sÎkÞpÌ{v†ôbfjÞ2ή¼«jL³iUþe¶}h(žíw~ͤ ‰åi# «EîG„į5Åíwx~—. _ªöÌ´xŽHTôë—Nl¢Ò¹æ‘”Sª[­GnábW2£cÍACA.þ'LK‰@­“¸å2¿ *·6¿&â”û¸Æ x­Ð _©0º›§g}uÁ¼”OÓØk²6²Høm=²ÊS1º¬“ŸÑ¼œ¹šriwABƱ3®/s‡ß§It®¯åÖF,.' Ûh„ݤFo‡2ép)yïÂINá»–0§ÃÜS÷'¥õ°©3áàØK`¬o–s*Dôêå\Çf¢ëræAÿ¼ÈY0Ç¢û˜Za„¢ßP"}Ìxeshùm¸àäõb'Ò6µÏ‚P%úeP.pÞm¯™Þ!:í$››A”ÉõÈa”ªÅõM±kÖC\LxrGM×Ñ>Û–vºŒzb”—Eë­-vž8«C¹»Õ£š£“Îæ÷²$p®÷6X1@Ý=ƒÀWίA}âõ‰gæT ÷ÂÃjFãÖMhÙÉ¥¸nxbÚimØG·¶üC ³»Ä†‡3Íp¢œ–0è@î‰6Åf*Ö£5WÉwªÝI+Œ÷[k¾½|€ÔØÆç«äöúXîÉ¥ïüâ6¨¨cü˜ÞŸ³¿ç‰œ`­Í¯aœ\2¹Â«Ýɲ€Ìÿ‘&ð.ÚXB¬Ò>!Ï0µ:q¢Ìê•(Ê î¬’6ÔgÃÜèµhëÑ>cË- G©cJ%±Œÿ©2¡¸©¯Er·eÏ:yôªÌû Séã#·j0>°žî Ô™®Çz²VÉ NÛh½ÉP€Œ"ŒRèé»Ð Îí?xÖ^3`hžð ‘\íÆN kÁåÉ‚Œ]6™Mç;tÉZ?ÏíÓmk³u…IB&JÈñ{&T0ÖÄŽÝU²ŒŒ z- %ÄzK#¤6ÀÑaÍ ãÅ–'‡x[$–×%a?ýJ¬Ÿi=yí*{ È$ bcܤ^ð¹Ä³<™wÁ Ž¶n ¬f4(w6‹6Ô(6p*Ý쇬yT”mˆRÎ3ÉævýHËœwîìÃ§é• e¶¯˜}¥[“(¢WÉÆ=Xé÷ü7+ ÓB->wyÑ`|úËòÜgWº«Ö¦Ñ m¢)]o´q™«´eq}S´o~}rdç´Í3œ’7ò¶LÅå¯|ƒ§ñÔu[\ãm±Ó~¢A¬nxYëÐÙ`Á‡9æ‡Ð‹‚á!Ñ0¬æœ¤´ú‰ 9µ`ðÇ8ɽ(KNù [Mi™»Ë?d¥}"ãz¥[[FPC¡ò¡¥x„M·Ÿg¦ÅÂU¾T¢ûi…½Ê‰J'ñöˆæÒ_˜I °1S 4ÈÙ݂ƺçGñ›üÞi鮂ó²Ðº ¨È¿ :FZð½ÊÇQ|çÁ9”Ƶ“ÚWŽLr`¨ÏšqbÓX5±ÖV9T´` qZWÿ  ó©øÜëçÆÄŠá ª­£õ‰RIÖ±gȺü×-…²”HºÍËXUyƒÁk5ë)j>Îó¸WÕbvöø0y0ÎÑA_' v‘IÊXáŠ4>=,™ò³^“žŠõMÓM yÙòº‚Êź*£Úë=ªT? W ÒumuKþÜS«dFă)=å5B¾@œÏ^Y|¸ðO+<ƒ?¤´\L™jû¸Â‡ë/ꊮ5kâ›¹í¼«—È®1f"€fÞµ b«ª$:lïž¶ÔG>¶³É»Ø}Ë]5[rW³5Æ?wÆÙ„0èȩάoà—Œâ&*{Oㆠj6qÊÊÜ¿‘!=$êòtî+Œ¬ß-æutd‡„i?w‹™Ÿ¬Ù?ÂïÎ-]áCë–.v”¤#íMƼwŸ"´ òu¾´v¬œ°*Gïpø’…O*¶öZ ZúƒÖ…Gë:½š f´OpfðkÃ>ŠÄ-©?ß.ö_@&ÂB0föJ1¼ ¾ÞLÏü½$ŒÀ‘u‰·  HG†=ý e@€Ÿ¤Õ‚´!yè‚îlœÀ˜±W}M•hãI޼¶/î¢2l – º¿$iϵd £•uA'öY8FZŠic`™ w2œÛû¨!¸Ñ˜\!hߘ’a?ë“ýÏô‹'tÍÉ/€¥ÍqVIþ§XÕi\Ïòé'ØC/] ¨ÕhjÐ襩yA¼2 Çõ}UÒªI·8”õ)jè=ÖWÄïò'\ëj³«~€¨#}—WJ¢ÐD‚þCSùÈÐÎã«´ÑsË^/˜“ŽFà5¤u͵?dÅæfÂÚ75ÀY D'³‰*®–OrܵŠ2³Eæle‰Ü«€“Aë–†ROêÒǯH?´óÁD~Ú͑ݭ×ø±I÷\W~äe«êV,(¼3V/?„*o©öÍøZΩ¢›J©W¯›¹Q}PŸëlj‘8»ßÕBjOåþ‰’’Þ×7¿ç¿ç#†·?Öe»*f&ªìÑßC¤‡?h|’µ3FS ú(zoFfmÊ‘¥rΟÛÄmRA]ì ¶´&6è3÷‡0 ûLµ<%¡_7&ò$£œ”˜Hßq"å]`?—»j©$Ýþ”œŒè5%Îî‰n8Y±ƒé¦K‡Ó_«$€ÆFO‘Æ ü4¿Öå1‘V…a‚ô¤ðÏ€óév„:A;ß8LßÛ§”2ÆoÛ¹f:A›þ¥?v£ñú&Ÿ4ŽZ°ç–Î5Uo´!Ðññ{³MÉšõ½"4µó¦L©Tä2ÁcFƒc‰ÞйÄëÛw××êã×y:AƒHü¿ “nwƒw¨U½ùþhªŒ½¾îJÂSžÕWÙÆËéž "õ’ijŠƒù “Ëj+&ÈSê|­Þqݵ®C•» =9Ê ÑŠQ·¿|¤;Î&óUh#Z&ºhÕÖÊdæ<Öè—®'=uTì=›ë`Ñ©’Ïž« ù®]‡‚¡ß ÎÈ$Ð>g;R?ë…Rµ )yï`Ô%5Lº¥Tƒáîå&ûltd¨ˆr’8¾,a6PÕÁÏI.‹ØsË;L}E,¨9ѺLLö¡$¡æBc„˜ÒŸà­ÊƲ®=”jÍÚåÕàC>¡lÉÙŒTÁ¹Ë·kH ÖS0EP¬Ê»Ðâ¢Ý­Z¥9  å]è‹-:SÚÆMñ3ˆ#â}”ÿl®„ Œh= ýY€cÑf0Ž]¥¯ FxE¼SÔš–ͽØ~`> Ýz,<€Eò @l+f–¶1œTî7šœ)’^µ1¾â ci0´riX¯u!½ÓºÈ§æ_mðÁxŽØ>ÅàŒJÐDbóGùQݯqkŽR>ÂoyŒ\㨉mÑwA@Ù»Q !öÏó.!ùÑÔõÊ^)"ˆ øfÎ]Ç'2ÚçYxÕ3è® •Bsðg$uáQi„ð¹3åàš ïE4p}Uát‘©§k]çöòýñÐõƒÖTƒ£¶®~ɶ¡Ní8)Äm±J]lçzz¨±‰pDþ^‰ %eõëôÄÂ,Lår²±Þ*ÒèiŽ3?ʆ³ÛRd<#%'Ãw™T1 ùø®ìúÄFÈP>ådʻ֦âK0˜*«÷ì¥3œž·Tû|—ž»×ñÑg„î7m¿Ï©Ônö—Sn•UÌþÕ–õ¼$Þ«Sä*vZxø®#«Á¸ŽAn­=U3bwš&é¯é'LZï4¨ÕÛVd4šêÌ[¼¥ïÚîóˆ¢2 ­Ì»ö©ºO“¤ÜØ^ëøYW=‰±ÆBÌ»üwY—§¢².¤ø;­ ¤í'­kïä-–’éY [EÆr§·Ïº¼<¢w¨í£66VQct“m¸áîO-XR§ 9Ô™ÊÝÁ¶K§¡þ#î_)Ъ.F{ ™g]ÕÔ$kþ&©5÷ªå—wÅWÄ-ÒtïÚ% ʼ룩rZëŸ&Äúôdæ%JÔLôÒ7ïê¬ÿ0k9 †»4šsÌ%ëªù»ƒg¸¤+lÿ©NuûçG[vwSŸnŒ»¿õÔ™ñ¼ËZö»°fؑ佼C\¸5£55Pƒi]ô &ªæ‡PVV?zjDÂô®¼ûŒjq­&¿áÉz§W³Íq$Ìá%¯×û—~öèµ¥.ŒÕçó‰§"U5ãþ¦ë9c¿ÖU©Š Åz&P€4‘ƒ·Üx5ã9òã|úéu´emËjr±ðƵÞ?Ö5OQ1 šäåÁqº3þ“Rë£@¶Â“”h~¥rj >‹Rü~>ï 6~ó×™— ¶ Ò¯–ds^3¾Ð|RߦŽDñ²1-ÉCª=ó}, ­ˆyÚüA¿¬‘]<¥þQг^ŽJ´ÞÔüš½(€bו‘Ñ}_Ê­ÂÖ{·ÄtÝ-ÿ“»OûKuVý.È)¤+”¾UúÏrJW¿Ë£ ‡Žµ™¬kÕn¼xŠŒØ¨a|f2õìÂÐÆ©j]994Ô‘.M6TÇÇCM*”õ &‘»*ûðíÙ?ƒ%à·5Ñ\G°âêH€|K‰ò¸—µ>ý.tEØMõ'§ÝàÑb7mÍÏ#g¸HŒþyar.*EkŠÜ_IغȨ™iƒ§]“î* ý^ÎÓ-`ÕöÉ÷Gùèb—öéj¹Sß¡bŸ­HzŠ<@ÿMÖæîÖs0øëg9.d”˜!ήIЮƭ›@ 2Š^=å<³*fz9Sé“ÊÛ!ÊÅݤ~qä'¡ÚßtW”§‹Lðæ|ªÈž»’…—úéja±PŽu4Ònov\A¢êu˜:6“uaÕGØþR’†Yá_ëš}}t%f‘–_&—'0“zr&l· A審 5:Ÿp‚;Ì®ÒLšNÛ·ýéUÏRçi™Všüâ™Cº ^wZî8‹êŸAꩾÊÎW3Þ[ù‡b:-]lôö¸ï0 éïïr–â5&Ò‚ÌÌïÂl’Öå¿ô3Ǚ͔(¹Õ¨'å×§áäy¬ô#ñÖv{ ¥äjt¶Zð;jð9>‚‘X„LÑ“M‚jŠC#žöQ.Æ ™-.¿ºDê ¹â60Šô¯Þ¸ÆJZ—ÛÉg]¡˜ÏÞYZža*pœ/˜t~t8Çù”ù»~@Tª´œK‰þ¦ê#aõƒ‘8KÖúX}²3ë½m[Yn{Ì4Oªv~ÆêÓªâ»GŽ+„daÂÜÀ‹W¤eàŒZ)بZ„n@E2Ó$5\ª J³ÔŒ‘ök¸ÜæúÙÆÌ{U6×q}µÑXÇú »AçN몵e ¸ØPßÝß5~ÇÓÍ|îª)«Çˆïáó)¤:O’ ©£ÞèÃÓºüõãfñ+1‚Qµ$Ü})ˆzu~ƒ•Ë9È ák5·<ô|$ØÿŠ™m}0Xu-Uç+“ŽLRà;2ÉÞÆø´Ý¿ž=ÔëµcGí„®2±§Ìo´ý>Ú²À“sÔ=BàÔ²Ê1¾j¯3%r¾½>VŸ¼ZúíA]3”Y¥[ëÄMøa(þù.²ÜùPÇzìߥˆ€âß“·¹µó!Ÿ'Uá­Î¤úS*[s÷D‡ô æZîÚW÷ûZ×8'a]û˲vrÍp"wß45° –td °I˜¾¡'•‹ <” õž‘?†ÆãÛ (òj§­OëßT3Œ͎TŒN=èjdhÛíuI»©¢O ãÞãÛ [-&¯ÝGa ã%lNocÿ—jÈ>(Žˆ+çè Ùq–‘7×>átmcxê÷;—:ûÇ Óã ¤<8þÑ‹)ÏrF7€Ê ùŒìQ½+;25¸€wC§(± •8‰ïZ‘±¤ïšÑLÓ4±6‰"ùÉ=‰«GXši]pd3“0´úšÄŠ×à{†”9›®î/¿ºØ~[™’\SKDå!“RÃI#C@ž¤P¶f.‹D¯©¦ï‘—pÿÞ“õ|¯Ja~†í®0v£j°…ØëËüìú ú)QjÕ”µ§µq¶iÖ yFF<C2B(`¤ï²`¶ä"í–ÒŠ ²<¡24ébïeIxÛ4w—¾P¡s±v¾aפ½ÁœcjG¾òŠnFÝeÉ÷òr#˯OŽÌë¡BW9Á ¼ÙÈ$3x”ÚÔšÖù"±”Lýó“Ýù „„L³HO&٪ǎ– 3ï y½§^éddŒö§ôï<[Hv£À€ÈÔ ´ðr¿Ÿ eÕ`©ú4gG6‘öÿ£37tù0W?ÙQ‚q´!ƒ*« U]vvÃ>?ÞÏ£UÎq,êžüuÌ×Ì+!c|ݱ›ÉâKvÖÐjw+ST¢mR2 7ü¤zä#s^ijØ»â&uóÌv§©ò•ù­'ñAѽlB'ûõ Ôç×'0F©]Û²ã©ü,kIk0©ílrBv$:  ¡uhÒ]¡dë Lé»B§Š_ è¯_ÀQ»}–xlŠ@aŒªœü¬*.O*Ó3ÿ=F¯FÍí;Xj)·Šæ¬UÕçPR +÷éL/LQ2éHkyzŽÔ5‡ržŒáÁb×à°ù‰û§”kÁ>Ü2yV¤qÊÝEG¯˜ïàž±óíÅŒ.©) £*oøî.’þÚl·Ô²îÁnMåž>òæ¢u~ gU×—ö‰ë«öéÌøÉùn£ÇY»0}èZ³›7q 2“4¨¶¤‹]×¿Ž§À™„°ÅäŶïŠÊ^fD· I°—ä¼E^9ëÃhÌê#ÿÕ_òßôl”ÉjGĘ•±ÜBÕI¸4Xé@°¼À_;Å€`wâDÉÐ5øô’#Ï Œ& c/4V,JQ->d¨IØÒĪֱ‡ÙÁ`ˆen6!–0fbw³üóXJ<&w$Ÿ%O^FSÇ$]Å~›âó=óAS+㮳°›f3:e]p}¹ü€”Æ8K/lð×Fs@ÍÑ’Ë?(•)òÎTûÓ3‡ÏF6ý±…й‹}5²˜]·¹õJJ¦”䄌ÃH–.CŒ’¸ÊmÖåîÇd]…<}x°·fQĤ5ÎÎÁÒˆ}ÛÍ'»æ—Ì„ƒ—ÜŠ2ò«~ص3 ÷§,vÐÕÑcúß¿N›-už’Á"š{üÜÐs™wXº´…JäwÌïË?¤ÑÝŸgÍBî*)#;™üO$°Z­9õ°æëKú‘¸>mãƒÌ™™·×W‡–‹®ôglRÔjÀl±üu^2(¿C<ð u+È®ò×Õx3é¡Zá’§¡=ÿ´ ‚°âbŸ.öI š`=-†ÁYD#Ø{“ªçZEÀ©åókäí¿ùËný×Js¾„³ÈÛRð,T¤¥ˆŽ®6vÝ3‹m Ì#¦cªÙàéÜ7ä¬,`;Uìbe÷É`è1I-.÷—Ù‹ Y ¢„¶Ð½Aï†êòÑ“C Y¯j_cÂ@4(bûÍò¸¾&uö2÷Qn$ ź}t’þnk‡M;ÕžLzÖ¦4`&%E„HÐm±@ð$]aˆ:vÖĶV²Ãñw¦tÕ$ÐñébŸÔdŠ{Гõd„ôÌÔZ󳫼Kê£F_så/«ÉÇÁU0y!.]ó‘¼Ì9.9ØrxUúÙHŠ*‹ròFjµ¨­âFCWx5÷€OçUx¬ÐõÕ¤”»ãròw¹µ¯»[ü¸wÕ#C1¡Ð<Ù±¿è©WälÑ¿MÎV. úõ‰}ËæÈX[5n7“OZ¤ôˆyÅj"Ôô|LŠËþ$D·žÚͧÀOMë„ç]šdÍ‹=Z‰q¹g½ôªž.¶—<Ë”šX‚ž©YPL2fz¾©!ŠÔ?J½”¿Œ*ÉW¨1Y™¾J´ÇÓ~ínͤ´úé_ò·ŠŠ‰QMÿ¨¯"¿Xÿb†j“IfðìiQ±ˆN*t±ÓC{‹XݳëìHS’à:nx2´ÞF¹v¶1ãÃ\}ËÅyr&sGæÐOô~à Võ¶j¢Žƒï|3âÁ„6}ÒºíØ›†{"&À„™†#´òwçtóTÝÐÅÎ_ºØO|àWíÁõt±‹üïå=ÿ$+/HÛŸu¡Žâ&ðqÉu]I霠"ôjõI:$XûˆÆZÿ迎ϒ ØÅijõL,w}Ë®[Þ-¼XïÉû[aÆ_ÏsÕÁCVxºòxNnû¥,©'·Ù2fnä‹)®€MÀùQ}>ƒò¯+å¤_yŽèb´h4¨ªèš"ïÅòmz‡ØL“>1Ö—d63sÖß =´Üñ8å¯OZF‚r¤,Sd^R}ÀB£ê§zÍ)òóòùn¥ê¹Ñ3”h’‘Ê>ª²'t¤_ís‡Õwã)Q,¶’¨ŠY#Vèäõ4µ9N²aB-€ZETŽž_/VúYL^mWF/ óÖñÈ5…­0¸¯I–zh]MC+̶ڇØy—,£âÏ.•ÁÝL À¥í” ŒZJ þdŸèL4}úúÞðõŠ ßKWÇŠ}5Ž'»çaˆ*uˆ^Ü“^Ò¹áúR÷ûnDNšZ[¤’5QÎx¦PxºÒðõ$Z^‘·$…ÝVÿ0Н“ÃR4ER“:¨ ŸÐld…P~¯iP³ó cÆ É4wŸ”/†ÁTaX¯=ñäõšöîg­ìÃ'µ–½ÂhCÍ¢Á§ÙG¡÷,æ=ƒ°À*aÊ]Z|ºØÕãßöôºæMÁ ß¿úÊŸ0Ón4º ]bÅõ­P]a»~*c&6áMíqB>]l«©5Nò#ÅžR²…O¶HÈÚ«Q£9`ƒ_iÜXíãýêVÝ /Õo£ñkƒá"tº:Hˆj¡£Cß|fMÛ`?XüÝu§TQD¼‹vºØéÉ¢AU²›€‰&ù ¬4+³ySìgw3Ç&¿¡³&~¹Ù‡¬ ×'˜âXƒ_ë_=vOWkË2ÃÀYšAüå +>èúlT¦FAOýÔrïÆ’ÿÙ’ÖåÕ»D¡ß;y‡ÖåQ^”r&£€x oÌFAa`sFŠÁ¢D+iB˜$ÔT Å6·gu–n­¬šZv'èÞ' RÛ*¼ûpÅ×F®9œO)×zgpKž¨8hýËC0dÆEcçZ?©ö¦›”½D›mnI2ö–‚­1=O5Ìá¦îï†{Þû²@ySÅ-ôi© |‰èÕÊœ]räŒ! IšãúÝ•_ŸÚPH¼×ìÈßù œõv¬Y4©ÓZ³´ §:fD¼AIýh?>Ù@_‰:ŽÇWpu‚$Fƒù¬ªïƒIñ9¤”õ¼ÂvÌmQ÷4šÚI5™è’jË¢Aµ#Ìz»ôWºciÁŒ×W¹:»L¡=Ò¡h'?ò9Û[ãz®™A—7u‡AyQSh‰÷éýsÓõÔÄA*ivøÂŒ'Éx/v¯Ãz”žõj— öêQßfÏoz_))¶‚ÒƒÞa?]Âõè›SÈœÁ‡:O`¨+/áKá×wR "î%eFƒ)ÝçÁ\7EÀª|ÒÂ¥†ròÒSòh÷–‚YXØ5éb×ÑR}ƒë¯88=wxO7ƒ€:b¥Pu)A/Rn„=ݹ˵®"U"çà[Ú~+OèùÏã"¹Z¼ážÇz)Kÿ˜­^2Æè!]ÆÃk](bixÓ†¼¦z;<(}¤°ÛGä|Ûv¿“äÚ,&ÀIN“|TŸô–ÈŒ=7Úôh‡c/ÌdªtÏÃ;¬‹©RxDQÆÈïÞá<ßuÙ’ë?©-kFà>˜™M2ôÅæè|˜Çz>² ˆÌ'‹Á m?Ø—k—³éÖÙ^jo}éæF;“ãп£Õ„*CÙˆ~ÐâJaЋý;AÎF)4(ÿÕ›)”IÏ}±AÏê¯ù7ò[ê‚ævÂáíûüzpßåþ–êŸQ¤§ˆttE¤J¾Ðñæjçr‡Ü´Ÿ•Ù†ì-•öÐ-’«^§¿»ÿé´ß5^¥zÍ¡ IfÛS¦¸«LZFKñk¬·î™Ifì4WÈ{w]ÿl´.z?uÛ¥öÞ×Õ?¯l)Kq¬+¨ì¼òØàO/ø‘󿫪ÌÊ’R¢?°t#š<Ãz»v÷tÐ%  •‹u¾qªºÆ4ú*ØÒnüÝ¥ä'@oI«{-?4Tuoœi” /Ì; ÊoC\lÜ!T:ïÎÓ1¾8ãÉN&‘æl5PÝgwº8ÿÏ£"!‰Çn„ypÍëãjUÄtqH§˜Ó>˜w‘£Jý >tˆŽ~²ÎaN>ÏúÄíǦøš{RÖ¾„š4¨]›tkATÌ0i½=­pŒõÞÂüµ.·¡Ãìã<µ•õb¦ÄŠÝP:3÷'Ò»^]ÍÙ`ò)´Ï#Y:\_f…±¥]ãZíÏë>må9š³»ð7`÷}„I•Á{«ièæ§­RR18pf*Èî çzå.¡ß¾Q÷ªTìÇUŸmàî>øÕ'ž·¯¦¶ž|ýŽ\{7åjußíz¥%XˆÅñùaJ¯4nÓ¿ Ÿžåm ^.áÖ5âÈ3Ú'©ùBñ“݇T×1‰ï<]¥¬àO‹¨5‡™»Å(–ß•‡‚I}¯)&P·ÿÜ šÛo~²³)Ò­+Ûô˜[3‡ËOö~oÜÝg´ª<É4ÚÆÙ=ùظ6~m¾ýæë†Ö{># BßFkÆÖ;MdüësÊ ê#g …¶ô r@Õ•2ÍÀ¡\ÖÚûÊ5ËÌ4ÖÆgú.ÔGûIµèô‚-ÃÔæ¬/$ÃoøÆ ³=‹Ä¼à*è]!äòÈm®óÐ!x±eJãzÝ<8p}­ ÓnZ\…4¶MŸ<ÈÅÍ gæÑtm™™Æ”ó,À>vÆ¿ØeŠº .Ö˰yòíqËèϺð0¯³¹Bä~©ƒådYåãÊü{yüÛ«\ûƒ¦¥çY±3SówÏGô>É‹‡YÒ„£Âf\;¥)·õôµ1Q:³¤{ 0yÐ÷c)¢Žva™¸0rªìVA é俱YF…`2ûb¸]ÙÀ‰)SÊ4£g:s<†¡À˜jŸAÖUPÉÁøð¢âWq²‰ûö¼ÓrCñ(ü¥°ý]dX#G±(•ýdo5jÝZ³#„Ʀ–—GÙ~ ¥¨&ÿ²_î·.œxe?k$ùÆátLs›_Lô4ÊÔÌÈRuä÷hŸ^ÅTyÛÇ®ŒÛø›²ÂºÏR)PK§¹û_ÍZ×Ð ¯&ß…Ac”ÍÕ™¿¤<Ñ­½T3ÆŠÃV7àå'˜62ºBHc ˆÎÆb R“ ²W:]Äwá¥mÚLkei¿5n½Eu£3€mP§“ ·øgÑ»:•M2èÌ|š'–ÍY°Ñ–ÒÓº@ž–ÏHGªCϨ9øœDã|Á¯p%/Û›‚|¸Š­‰4ÈQô=3a°@Ò%ÈÌ&&:(üVÚ>Úø9'Ƽ`§Èyð#c§îÉ9ã_“Ó˧Ùx±eΪúÁŽœéöÍ8 ›ë`p3uF=ÿ¬¬ìýýMß5‚²dä£_Mh?ãëlбŸn±Ì«èUZ"î‘̘fÐ`+'.f¾Æý#–Ï{=ø‡¥H*¼(N‡V¦¶`ø 5²¢•"ûôSKãÌB†.ó‹­Pæ÷*uyƒ«ãv×U]Ú«ÊPì;ƒ~ݪ;¶Ù5Å^R‹ëKýl\_ÿ’Çg}ât-zmc­Gÿ¨|ýôÆö<ÓNbS΢¿kd»q­–œæƒAqªT|†}Vë%{nÉ[•}£5k‚Ãîm€ŸeŒ^LÛiBžä| H¼5v¶*uvà^µ¡õÁK®!˜þ¨d‹ÎE®Z ü%l_å¿ö÷ßÕ«ŒÕwÖô”Ãs£Öçgn©3Tø‚ðP襼D챊õ1O6™Í œåo Ä É>¢üÀý¼T¹ídñÀA·Ä¦θ„üò$|ñÜÕºÆ:)VŒ” Ñ5í‹¡Ä牄†ÝÕÞ[¤Jm1¶zÙc45/4ý0Åe‘~i‡Wàg;·ÃŽF`°Oæj­JÈ:J>aa SLßµƒô‹(›–v|~0µCl8 ªÊdÛ]kbSÊwasÊh1739(˜“ðy^fJ?Û“ãÃÏehÜBGކ‚µ@-ßΑ`àXâ9Ò·5J™Ç>ÇÖz•¢Óy^š¹ZM\¹BH6i+³v <ì]èñû¨j<挙ÈKž<øŽÔ®ƒMG>çÙ·€ðH+µ>¸G.†ÌáIl*®oä¶lbžÁS:qGbG—_ó:%ª! C |´`…žûüˆS¡ª¥Šºm ~ßF#ú Ëû€p:N¡Ø+Ôê¼5ã-£Ü† 5±Šù¹Ý†Æ|ë×NÒ“e”,Œ6Ff?Ñ|Ör£[ñ–HÕÖWòq9¿³™°q€3·ZEÜó.uˆ®goZ×ðy“ð'Y™’aA¨œé>Ÿ3`å´˜ºÛkú¼~å*Àü*²€FeíXdØÚ ƒªwX=mki¸¾ùÙ83Kj\_¯<ƒ;Ì´;¤ˆGJPæÊ­ D¥!ÒDO$½8‚A|¥3¯[h§‘¾¶¶—öùýi±×ËBÁÅÎìÙsC`6µŠJoŠkàâf\ +ßúú†×'š{-ñÈHeˆ4®Kø¯Åì}¨i !ä¦õÖý¸Ýé  <ëSŒƒ1¸ @ÁÜ<åeËÓ™§Ú²äò-\ERVÆ,é¨ÐÄ ‹{nÀÝ1ñ–“¼Èñ7ýK-G‹ŠþVI\œÖÜ–õÌ=ÓkpîŠ+àúFÖ¸> ÖáúHà½"Aç?¨ÔH8â?›,¸z‘ULÃåÆÙÇ7ê~v™ÆS©x+›®½Þ®õë¶Vf…àqI F6 j°Ð£!$¯˾)!m"~´®%ÎK¸ãI àcí¯Í×D¸OøY£ akÕÐŽxŸ ùõè .¾«%\¹_-hÁ*ÙD†x5áL²À@4·ÖדÛ‘dr±7ØÊ•Æy! Ë­­&ÕÀÓέ@hfÞ |W± øbh(UJCØÓß"cC3 Ía‡3rü.4þ#¿¢Ì¼1A>¢¥(\ɋНÓÙL ´Ó†flCÍ4µ~Ž6"w1±wüôjè³j M¹µÝ37¿Aù"d~ J©Á“¨jMmnÁù1ÈAC‘o}µ­kD¿Œ=h˜ìCƒš}а-Š'qâÀAßpç¿ç\o5lƤÃ3ô2ó¶àÉèü¤0«·`Loyº¾:‹p5’C,,<"h5§^Ûˆç˨@†¥ò†Û!%vͨ—¯L¡`;£1ZßzhÀå.¶¡o›L¸¾™+ÒhÂÓ?*連Û3üí¨ò×A®sdˆÜn8LµBúHkãÐ2T¾8µ‹Wi EÐjåÓdùl„ÔV˜Š`îµµÕ篒6©±“®mo£A¹yvºÐ[¥9L G$;¢v:% 3X•-¹+XÍüy Kq“‹²O*æ%’yÕ‡zŸTiƖDZõè–:ØN°Òǹoè4µÖÙXÃØ‹¤AF#ÔÜg58ä †¼ƒ;ÌNÿ2¬Ë6Ü‚´œê.W¬o5å'ï$hždGë¥__R1£qØE.]žBç#©¬4‡”r?hÎ4ê¤G§3€ðÌéf!eIḛׂ̀€]ep©j„¸ÑH¼AÎçèÚMu”5ÔME¾•†ÆLÃ':krPµ(Q”°åóó8›Ñ ÷ø³œê÷X¼\µŸý}¿³RQ&Ùx¬P5þ#¯‡Älé>2uûBÁRbx~G’Â=òÊ’6WÄJ®Æ°ä®´ÐC>>¤C/IyÜnö!",ÔXŠÝ’Ï <­\úGŸOe~/øâéro|\8?W»±¯Âµÿ…æúf׋‰Ù«?Ð}•Ü>A¦¯ü̾»ç¾·…0Lȹºvé¡CÎ4¼•þ}ÑYÉá×mrm*ŠQ ·Q¿rœòyè{Óó`NÅO@*1h³}Q½~`2`ÆOvR¸GÛöCDè•À’±VREÁÎ^=(t±;ÃMŒœ†¶`Ï+ª¯uyœ•ì×nU©HiMlGÒÙ€¾‹æ€:ù.÷.é‡âú¾¼¾í± ÿÆ4ã£eP)ïÕGu½Î£ßà©C²÷º©=ìôõj5™?"ÎOÅPŠt±|íŸfp†—¬ Ñà˜VÞæwœî "šl/mVDQä}táŽR¨§û}éÜün-6‘Ü9ˆ·RÂ$œMû@—*®qlTÍ45´”SªèOK¥/|ÍÝÏ€ #þ¡¹j’l‡÷+G.³Pþ£ï^˜„óÔ)ês«…0w²Èá‘ÙGx]Iº¡A]É[æ+ÈívòUƒ)]–Q+ÁtP—DY0Yä(Ÿuºþžì‹­–ú~˜4[¶'@6—1QsôIëÚ¥QÐm„îs[a˜ÜÓÄ6à~•¼©í3¨Bý·ö—Q¼u ü1Ñ]y U™“ûµ’ä´9èˆtèC±Üû”˜6æ3|̨œéyNÛ”¼ Õ„L]éðÐf+)lû*ÞÏRûøÎqn½FW8ù½öØ.f%m?FÚ峉ûò®›oØ[оkcfP1€¹ñ€ÚȉélÀnÌÿ¡©‘€T»_ŸTÒ¼ð* †P•—}ÕùŽ|É®­-±Ò·çf_Ý)¥lhðË‘F¥ØR«œ±£Á˜ýÊ«—”}1,e½Øû´?ÝIªŽ5fWèb°yyŒÌl;Dl•õžZU$` ’Ñ T yË$Œ-àŒóÑE“Æ`ô¶ÔªZMÕ’˜|P§ðkP0¡±Z$ß$s/Y—§9“ßCöÿ΀•ß­}Ûý¸M祳©Ìê!@Òµ€_Nÿð2÷xø >pÉgƒùj¤ÕøÉzæ]-^gZW{¨ê§š0%;T‘§òtû|Ôjݲ.ð€òÏŽW>nèÔöŠº Å Q‚¶¤L¸â×=“Ì’½jâ–™ì½1Ñ|tfÓçG&ådr¢œì õ–eŇ}ŽO¶ R¥Z%Û{T¹«¯ 5P\r6fÒ ª»§¸IÐãÔÂú›‡\½––²'±‰ôoÙM:AåÜ.ÔS¬]nͽš~GÌäõ]YãØë<Íû¸wh«AÕcvEýœ™/F²6'ݘìi] 4ËP|=i…q}Öx³LíP)¯ßÓÎ S›7y|ô÷žEÓðæ›Å?VsS¨®­ç‹p…S”üŸC†0ÇS udÍ 11—ùMÝÊÀJŸÅ°íLæî½ùÜWn”£Úê]¤ ¥Sß6J>ûh¥¬">p¬íÐîüKƒjC²]²_1XZnmN&òÁC ¦pÙÝãC}þ®R2-¸7›žjK‘Jí;­ËŸ‘"㇚4.ê†ïPÂÎfL)Ñy¶ ë2뙓c^%ã8Æ…¡< Ù%‹.)mÈ\ÚìÎR”¯R?<7²ð ´À Sßé¬é× )7F¥S•‘Ž…`”~Àð`‹5ºü-š×Ô«°ù¤@ÿÜòǺzM:´6‰$ÑšËNtà–‹Teïú'X%Uʵ©ƒ½>~Ø.ÜÂB"¡~©I²}›¸•~ÈCŠÌTU † ²g˜œ¾Æ:uºR? êç¯oøûC•î1‡ÆuU-Ý_ñ–ª€µ[öÜ~¯ô- ¯\´“e] A²üdWôqk£IÎ~¤Ÿæ—:M!«ÈhÃÔ>C A…æžžòW[åTŒÞ×@fÒ“Y/áFfÿ3@oœ2•ý¸—ÞMÐömKØ\fdôìsÓºZ2D¾Ö• ZàPîNWÍ&°¬«â«å£ò3›´eEüÿ“.¶?‘çLÉší¾äðpE‡­Ï0Z¸ûÂ0-(ŸÔÓ8Ÿ ŽÂIëB\ìç§‚nÿ61‰ô'ªzænŸ`Øí#PÝ–Ô¥V[Ù/APñ(ÇÀŽJëò Ûx†UR!0–§³„ Ø“ÏÎÑM£»òº®ÒÔfòjí¤Dk´æRIØ,߬ÞLërÿ™ b Ý©Ó; œäõàHãĤfl“‚ ÖåV³˜j¹{HÔ3Élá–¢JÝK¥ö-eeók± l rÙž¸Öµ>Rí{µÏÍ"ëGaÚz:÷ë<ë:[3`U€Œlr:Òrض¡£íÅcÀù…þÄ–¯ù“©$¬kÚ'® SêŽrÛd]ë“]mÇñq…«Wù®±šÎÝÞ.á³.hãÉÜ?îÊ=³12ºH[¯HsÌ^Í>Ö•dXשêº66Í$¸f°K¬«'u¬«÷Œ™ØÈJ1Ñè’r~m#&Jxƒ«)³Y&±ÆSÇG®Œgl„t)fÓìã»F)ò]£6†É½³r ßµ·"£-}­cYÖµ«ú]Iþ|—ÉwJd…ä[⾦b}ˆtÞ<•?LI2ÖÑ”ž"¨×PêǺž<Ã5¨MY³»?Aƒï í£-~­õýq…ÐZ”¹S•<|×§Ñ0דï¢ÌöÈbªýHù®Á®k¨z p†‘½|W•èˆåwÍ -Y÷ÑË.9eBÞå§MåÍ`%Ps½×BÙ.ê'”Ç z­«}<û¢šqîOV¿2­ƒ*KMÏÎT3zn¬^…gðÚõS3z½F„Q±OãÞCköY±öx²ßô%õOC¾ìÉ—POmK@fZÏÈù™7<  GZ‹^,Kls•)Mjÿ3Êš`í25»³–×ïê£}Ýš¬Ð uñGý4î¡®òÁî”âõ»zQÍ8¬.šZ¡D9gcŠBóì©õ ”J ™NIí¬Ý·kšæF¥cÍ>ar+…ÊÅÉ×ïúÆ¿ñ¨RïA1µ'z92ÖºªäôlÛG[v?V‚×€û´¸ Ð)0F'hËq5©j©I⤂ “4Ö€š÷Wumìw]šn‚µc'ˆ:ì>o®léc'¨.- úSR"ö >?–»ž.üçäÂƒŠ¬«®'5’1G lÀÊrΘ4f/‘ªNpLªDCŸNÝ€Çì•ͯ#Û˜¯;øv‚¾ú^ “ ¶T¯~ŒCSÅÿªFЏ‡ j¡…ûÓ«Ÿ&D¦"¿¡_˜$ÐuSêDµ¥;0u,Ön~ö»@’§iÆkú\ëšÝrƒ¦Çf¨’°šø5ŒÞÞú “í£×Ç ±†œ¬Ñ]Õ¿ƒ—,‚•ÆTËÍø3ª^Ñ•,åS œÌšPþ5uÂÐ"QÔ},÷ܧ-Õsv}ÔuÛ-,Õ雫°&Fƒƒ`Èòêu†zp6åӞ礙¦†é;?±Ýi¸>ûˆŸ*UÆÒPáO~±/ù¤õÔâä¢äp$ÚóS| ¬,é®ü~çôŒ‡¹v B€Öެ œAöR‰üüÂôÃÉ(؎挥˜DåÖJššõ&á0á…Ž ¬µA»Õ¬÷¼YcvàAÛ_SSÌ]ȳAœUÕ9»:íÀ¨ÛñTî®A;¾ñ¸|0vÏPGÉVº«ì)Ì+Ç#×¼ ,£PU·D>hž\íáAbYÀÓy¥åþH Ÿù‘dÄlK£ËC•+ŒÄ:ݬ³êtýÉÒב—~¶[PÖr0Šzj0`¯~}”‹—΄ï:Ï™Þ;4ŸöÎ-£z;#Òß5æw·FŠÄ3"#ó}ÈadëÿD7œ}±1rU bf•Ðzë«+Díg¼ ÛçlNÊ­F‘÷.êFã ÏÉsÏùÑ– Sݸ6êG%´Ö¡&D#ª:3²®&Q²ð‹dU†ÆÒʬþÄXV#í']•5ÿþ+fªñ´÷'QòëSææ×'ëZ_„Tàe¹ëtþ¡þ”ežTmY Õe•lc6\‚|»1k °^cS«=jÅk]u³ß…¾ßì4(è›ï•‡úúYOÞç#Õ-8˜©}Líô¡–þΞb '¤¤ôsIg™ý·5Ղͺ'Ûœ¢ÇgÞß^Ës6g«¹î•ÅÑÁ\*Fÿža}àb øÔéŠÚó\+Òà–r–áµ{B‚ö]+~»ô\Q :¦"¸r®c``J8¬¶þÁ¦î[z]s8¥)”Q¤\ z~o<€ûvûZîT®{çÈþ&TÆøjáž?”\1ÚZ2›A±Å.©?<î” 'oòáX“Ѧx­•ïßÚßåi#é‡Ð*FS[5…µP•ެ¶­ÅÂ2NnŽ„{ýì÷ î3b(×ÓꓜPé[VL»%E˜°”|‚KCö$Uîö'Ж½8IÀJONu£t³À—PuüyTs¶`YûTϺágôŧäÞa(é+á*l­‚R<¯Zý8›ÑM™÷Ü’1nO0òþ£ó™ãCÂxžÎ‚£—ØFÿ(g 8!P¡ßÄ| P|.¦ÙXD"»J®ß'wUÓÏñXtæC®S²=·‘ú¯ÑäÔÆ¼çVŸõ¬'ÏpcæëÕß­úV²æe„ŸÙ• ÕÄ_lÔΙÆX‰¥‹soÎåéŒþ y°\TÙ]á´€EŽ¥ofëXgÌ‹ÅWŠô­¥”½=Rf>+â@GZrÒÅ3ŸÔ!>Ps’ôk^êEÓuSñÜ‚¼—®°ÔÝ?ÎfUµÐýúäãüú>“æZ³ýi(Þòt9kjŠ#ä©×úË jXoo–v–¶6j_Â>ô§Ês·6–õ¦ìª)†¬þ¡ëi}f“,9;[•€—Ûè9UŸýËa{¨ðü —èîîóaЬcêoÛg°AÎ0S‰à>L÷‘2O8 ? ] t< ²Â‘(fËM‹#{ö-ϺçÒN¥ä ;.£^ˆR,ª¥œå}ÌÆ9cLš¥ ÛŸó I1z5;–;‡ ¥?Ÿõ³7÷¼­/3oÆõåò&>aµõZáJÃݦP½=MÀ¨hçîZÒEýÀŸêï¶âÂÝÕ°VEX1:Y.ë#+·\‰Îøÿ—˜Zí+n2)š& %ŒUˆ|·Ñ¦YÚ&…¾ƒêÌñmý{t–Bg/,4qIMì«wmËzÌ4&@ÛQÿà,ÒÅÆè¼#!fvwÜø5ˆÑ6@•% ¡Í˜=z$ëtÇ @y}ž äžpKͽù×Z0I²Ê™®S$5|%żj\n !db\bMmÒRæ^i!MrhŸè'Ðr½xÓÒ¢gK-O%…c8=áÄ¡,Ú¥:;«©âë´@ÌOcâîbC×…6äâ#-3«„äw½ëÒOÍbÛG”ì Üêeˆì ;‡¢ŽXŒŒ§"¥ÀGåu.Ë¡8’µÔK sªÎN 8²8…Ý-ÖhâRxQ”÷àÀÛÎÉ#…´ ò=W×ï.ïYR ņ ê”®DBë|+ „ý"#„Ñk Ãà†ÓöXx Ã7ƒÓ­]^m<Æíy©d–âú”yZ’j…v'ÝÈLX×AÌPóÏ_´çI}ZJPÙ7†¼ñؼ¯AUËÕŒ šf[îÈCõígÓ¿ŸÌÏ ¿AZ"n —æ+‚…{Ó$Ë=~ÐS ‘jÚ†^(½Ú2SzV¶eî·fkÓ ½DW²Ñ<ÎäF¼òFš~V»­/QLxš*‘l8iheuòtg|æò^Ð~yV“Ó­ƒÚ²2üèJ_‚éØÜɰ–uûðHÌÓÄ£äuÊQÊâ>‰¸s{Ô ·ëíÃ0QŒ»ô3æzÄça±‚&éQ– m=ÕuûsPÓ‘ý¹{Õx 3>!Üu˜2}eŒm‰&j}€¸A|ôI[ôÀˆdãŸäqy„—вZIBÔë­%M 0ZšZ­¦öu·¡–)¤ú´ÀV¤\Œü¥ …)z=Ùy$…­ÿN»+f².¸OÖîµÅ•öB9È/‹z€»‘οFö磋}šh}Ž}¤¾«¸Á0˜Zï%i<ㆭ ù•k»¸ŠOsh磸T·4‡Ò6aú¸¾D¨à`õêÞr…åéfÞÓÍ¢.”×M[EºýÚ +äʉémþÔ˜hXºúÖJï=‡:QsгFóy|寛ߝkû'IÒã)µäߨ™B³Àÿ‰×W^S뉚»¦Æ]l•®5f)VpI“zž*f/Œz˜µ²þ>@\G^ö,Ú?ËEÿ2À•*s8R.¶ÝÈÐàAÙ¸¡5ïy²—Q1´Õ“[èŠ àŸŠ|Š<¶üÊ¥ 07í.“@{&x°;kM%è Bð|õO(s×LWèéu®¶lÚ´'¹&gM…ÕøACfcå¨EnmÊqƒø7ÄþØÜCBÕ$™æyeJ|LÄž¤ÿ G}Yoâùù›™¨!€¼©È_,cæ%³\ijž[IÉ¥v¶¯î6>­ »©ÂÌcŒ™µ,1€õ¬:ÃRóþÎØ 7 qóªòéÉ}~q*…Bê.÷Ùf“uÕÚ¿í—&wÕÖÈè·÷¡ua–Ï{‡®æcx x]Mñ¹ú­æ/:`W98‹N‘Ÿù:,Ã8جˆë“Â1š l^zê¸yºYªÒðf5ešcl9ÒIéÆ ˜XÔcýtÚ•b „yôÍ—{ÐY£AÍm­¢Ò’BøJrPá)Õ“¬¼`ÛÙIÒ3… pVR}÷"^¤ó4fO¾z¤ÀöCA¶æë Ågù4øÇ(]ìqä1[úä'ª dIŽ»”LŠØîà[4¨3&“ÌýÀ4O¦¹SÇ `š­W®W«tᘭkÖ~x'Ý"+èIÑ‘y^Òdj‹*ÁÛ˜‘?—X”ug°u *u,¸ÔY$Né_hý@]ÏÇÙxt?2ÉQ>ŠÙì†992O8cÖq㯛#µ(‚'ÊRÓÙUªCèqRý%ÜP£Þ@H7~(Uu8±­NåiHÂ-Iþx©Ôè†ê›‚¾š¿m9¼6ÊV({èÝû–}èÀ,Ä¿WíX;%f©t‹½¿Œ½N¦Pû«ZºwªžŽ}T×Aê²Ó Æ¨…ÃW(}Y€õMÖÕ}W ®€šÖù×™àåbz¤Ó3hý¥+A°3ò‘ˆp¦w˜†Ov¬vµç™D ž.6Q‚È<¥ÂŽI7°Wϯ!R¯<÷46¨¢Û?%ã€Ä»çU )É+_§¨žÁð®¥u!ç‘u•ÝR–5Úl“5Õh¼á˜FešT9©+ »{+*O»ÏP!±S\_,pÀåE¼áAËhÅ)+#|ËäïyÊ=‚L¶Wz¨EuÌ çœéÑÜÏY—Xòì7×u³)Bû»9rŸßÙ=å—¢“¯3²Âm¼áõÎ^‘ÞÒ ¡pé^ž.öㇿ%è#>ZWç)u¿Q$ÔTË „ØÒÃáaþº28í3虿œò[¢,b=ôI»KíÚ·WL­è­Q’š)Ëeb¶ça„v‰eCPjœ "yºØ;µcß}¤5z¡;U@•÷~a ]TÛÓºp}–>îƒâ çyÙýGÍ -×3ÄA𣑑:€ûóƒ&SDè÷vy(ÿÒ‘A½ÃÕÐHµã·y 3„ùøÖó¹‹/L³•®ä±)ë\)X4õv™Ÿ"½%[9L­ÜùÚµ.k‹z‡6›DˆQ©ínPÕsbí1/ ö¤|f†u¨ˆõ|cцú>é …¡2@Ì3Õw£ß K˜O¡òó‘ûb5/Éõ£©j7#{ºØgl¦"õ«O\­ÏJ–5ö²Ý>Åå c“®ïNÆÙ‹ß뛂Â+Ď膼z×jOTà¥á¥Ê €éùSç¢W lU†?Я¥ï J©Lb½u¤Ay©ûtƒB³¤ìæuv¥ CØÎ‹¨§õösõ’˜“÷LÖî$¨(Œ”õlúN‚ð.>‚Rôɇ‰ÉNÿèš{zwèïV*aßIPMÙç ¨o…fS×G[zвܶSÒaà‰Ì c%--,º­ü©½dß!*‹=é›ÝÓºàüºÉº&æX¡©‹”˜33Hyù̱-”Cq\ß8L‡ê¢:®¯-†2†U­¯×8IðŒl( ÷$.œç¡S:4ÖÂwiâÚ¡Ôò¤Eåb†Þ¸]Ç g=í–ö›‚R¹êÞ÷I%Ï”ÂIÅ|Ú–×Ôôn{¡ª†þi5¦rôq U2³¦Šp ±8ío¨zý]vR®9<$gÖ­.Å+‹ÃÓÙÿ¸–[¦ ßR‡§+}¦I"® Î[€º9Ýkr^#|ÈË}™…ÆÇwa.¯TdQÕ½ŽOþR ]Å\u*ožk§uÅâDůïcŸvÛKç ußÓ“FZ)Ù„ñôX©Õ‡áˆ©'Õ:ròUy0ÕÜ«Á¯“Y}pcvš^1l¾rõý£}Ó8£ïê!ˆù"#†ìWUàšÚ¾Þ!L­÷S˜žy-X˜žµ'AûJж o£¦Ý_Ä9¿RØ/s‹5ÚGuèë%g³$´.Åó°k,@lù¤ý8¯gíO àÈ:H ZÆR`ì $»"¨ížá b^ìþsA§”eÈ7¥¾#Iùôƒ€v§«ð—ʈJÿª²~ÒXãú:¿Wë™´„‹ÝÓÙ™J”V眪Å”žcz¨ˆ3…»ª¢u/”ÍT#…? vU1oxëGç3_k§(àO0}ÔÙGQt>¤‘ÿ‰ë¦ÝL®PÜŒ"ÏÚO>¿èè¶LµÜ7»ãèy±öô>ömξTëŽnnÙs…ÈÑn~oðàSúÙn5“ÏϯN#O$ŒvçÖ¹8£vZâÿÑi6i(Fñ$d²érá‡÷t}®ž!1m,Ô=ƒ™åÙ4(7ÖLÐg Ýób¦¯¹PÉÊÚ&Úçõ[‚^g³Ëí^î»Ól)´Ž2ª?;Žòïîjí«5R•<ÈLöû €–¾½}ëQÛôq^ë~c+û±WË€†Òkß3‡^6½zèý:#<Ø]gè(wÏm‹c/ÔÄ=CúÁø‰…£¸5ÝòáË÷ú2Îc3­f=’®{ÃÛó,<Üä=>žšüGeö>âöp_¡õ}ÙmÆ<ón=÷~»æá“l¼ˆŽM¤òR¨¨ –Yd%jÚ ƒ^û\°Þ}~õN˜Z¹Ä2û—-SüK€A»ë0öwò}‹·yò‘a´¿n÷çsxÍX©º»3F]¨YnšCÝ3P ç2œÞOÊ΄壓ÁȶÆ$s¢ÝQ =ð¹Èû¬ÛÛ7¼4_ñSÁ‘W¯uÀ+ãžœ‹«ÇÊ ƒE¿‹|7/ytÉ7¼çû˜µ÷ Dãýžk³å#ÃõõʃñDóö îw0ã1ÊcƸqÛ_ÌMÛ™^ËÏkßERÒjŽÝ¢,ú››]Û?g6Ú˜Ž jܱsX¸'œaáçÏ?ÿñ¯ÿú׿ýç¿ýïÿÿþõ_ý_qü?ÿýÿý¯ÿû×ÿýoù¢fdùxcrysden-1.6.2/examples/XSF_Files/2.xsf0000644000175000017500000000121311712736221016335 0ustar tonetoneATOMS 6 -2.567869 0.032045 -0.221028 9 -2.886000 0.687964 0.883366 8 -1.382513 -0.640867 -0.040575 6 -0.229973 0.040074 -0.088613 9 -0.144013 0.755076 -1.202635 9 -3.477776 -0.891429 -0.435296 8 0.750693 -0.879985 -0.022804 6 2.051993 -0.506002 0.090723 9 2.454670 -0.625774 1.333637 9 -0.132224 0.912482 0.909417 9 2.776631 -1.267760 -0.681152 8 2.543443 1.857414 -0.537325 1 -2.530354 0.718822 -1.046630 1 2.306985 0.752430 -0.270590 1 2.083902 2.304517 0.170326 xcrysden-1.6.2/examples/XSF_Files/mol-urea2D.xsf0000644000175000017500000013462411712736221020120 0ustar tonetone ATOMS 6 0.0000000000 0.0000000000 0.0000000000 8 0.0000000000 0.0000000000 1.2614009982 7 0.0000000000 1.1482466623 -0.6997899990 7 0.0000000000 -1.1482466623 -0.6997899990 1 0.0000000000 2.0265496485 -0.2028169999 1 0.0000000000 -2.0265496485 -0.2028169999 1 0.0000000000 1.1340804828 -1.7049749982 1 0.0000000000 -1.1340804828 -1.7049749982 BEGIN_BLOCK_DATAGRID_2D Grid1:: Charge Density Difference; Grid2:: Charge Density DATAGRID_2D_Charge_Density_Difference 41 42 0.000000e+00 -3.501404e+00 3.320950e+00 0.000000e+00 6.889479e+00 0.000000e+00 0.000000e+00 9.916210e-02 -7.036295e+00 -8.632000e-11 -1.614379e-10 -2.793978e-10 -4.472420e-10 -6.637130e-10 -9.109040e-10 -1.153951e-09 -1.340884e-09 -1.388230e-09 -1.092340e-09 1.759499e-10 4.329099e-09 1.627900e-08 4.610300e-08 1.090540e-07 2.192601e-07 3.766204e-07 5.567194e-07 7.184999e-07 8.287006e-07 8.774005e-07 8.674997e-07 7.978997e-07 6.678001e-07 4.950102e-07 3.184900e-07 1.757900e-07 8.276498e-08 3.301798e-08 1.081411e-08 2.366100e-09 -4.446199e-10 -1.256180e-09 -1.396090e-09 -1.287073e-09 -1.073568e-09 -8.244930e-10 -5.851230e-10 -3.840964e-10 -2.336348e-10 -1.314634e-10 -4.080240e-10 -7.622770e-10 -1.317417e-09 -2.108508e-09 -3.122203e-09 -4.274208e-09 -5.398030e-09 -6.225860e-09 -6.268301e-09 -4.242500e-09 3.933099e-09 3.060701e-08 1.074770e-07 2.993100e-07 7.039798e-07 1.411500e-06 2.418999e-06 3.565903e-06 4.586600e-06 5.271300e-06 5.566901e-06 5.501104e-06 5.063703e-06 4.239901e-06 3.141402e-06 2.017799e-06 1.111430e-06 5.226800e-07 2.092100e-07 6.991598e-08 1.715599e-08 -3.141025e-10 -5.390341e-09 -6.395550e-09 -5.977290e-09 -4.999510e-09 -3.839862e-09 -2.724476e-09 -1.787935e-09 -1.085771e-09 -6.103570e-10 -1.785431e-09 -3.331574e-09 -5.754010e-09 -9.195531e-09 -1.359538e-08 -1.858300e-08 -2.340545e-08 -2.680253e-08 -2.630400e-08 -1.507080e-08 2.898300e-08 1.726610e-07 5.865099e-07 1.616370e-06 3.776498e-06 7.515500e-06 1.274800e-05 1.853300e-05 2.343900e-05 2.650201e-05 2.771700e-05 2.742800e-05 2.552301e-05 2.167298e-05 1.625399e-05 1.052700e-05 5.825001e-06 2.745999e-06 1.102030e-06 3.717801e-07 9.581899e-08 4.772005e-09 -2.167960e-08 -2.723810e-08 -2.573393e-08 -2.157077e-08 -1.656549e-08 -1.174404e-08 -7.700820e-09 -4.672247e-09 -2.623105e-09 -7.233120e-09 -1.348349e-08 -2.325832e-08 -3.712309e-08 -5.481840e-08 -7.481570e-08 -9.400441e-08 -1.070633e-07 -1.030853e-07 -5.096700e-08 1.504060e-07 8.055999e-07 2.685900e-06 7.332201e-06 1.696030e-05 3.329200e-05 5.536701e-05 7.833604e-05 9.582005e-05 1.048299e-04 1.075000e-04 1.068800e-04 1.019799e-04 8.936197e-05 6.886700e-05 4.548402e-05 2.548401e-05 1.210200e-05 4.879401e-06 1.655760e-06 4.360002e-07 3.387601e-08 -8.293399e-08 -1.080701e-07 -1.027347e-07 -8.619850e-08 -6.616950e-08 -4.687250e-08 -3.070571e-08 -1.861082e-08 -1.043836e-08 -2.712923e-08 -5.051270e-08 -8.703100e-08 -1.387459e-07 -2.046216e-07 -2.788722e-07 -3.497654e-07 -3.970700e-07 -3.786840e-07 -1.733700e-07 6.121902e-07 3.153799e-06 1.039120e-05 2.806300e-05 6.399499e-05 1.230400e-04 1.985800e-04 2.694102e-04 3.123002e-04 3.229398e-04 3.199698e-04 3.214497e-04 3.212702e-04 2.971902e-04 2.395100e-04 1.632801e-04 9.340799e-05 4.492998e-05 1.825540e-05 6.226001e-06 1.649119e-06 1.357000e-07 -3.046900e-07 -3.998070e-07 -3.803550e-07 -3.190023e-07 -2.446954e-07 -1.731780e-07 -1.133367e-07 -6.862730e-08 -3.845197e-08 -9.419510e-08 -1.751798e-07 -3.014575e-07 -4.799981e-07 -7.069910e-07 -9.622780e-07 -1.205396e-06 -1.367258e-06 -1.305543e-06 -6.144801e-07 2.010001e-06 1.042070e-05 3.408100e-05 9.088800e-05 2.034690e-04 3.809000e-04 5.916201e-04 7.601399e-04 8.182200e-04 7.762006e-04 7.261001e-04 7.445998e-04 8.044001e-04 8.057598e-04 6.895303e-04 4.898699e-04 2.879800e-04 1.409740e-04 5.789399e-05 1.984060e-05 5.218300e-06 3.483101e-07 -1.075000e-06 -1.378495e-06 -1.305508e-06 -1.093109e-06 -8.376270e-07 -5.922690e-07 -3.872526e-07 -2.342632e-07 -1.311285e-07 -3.027632e-07 -5.623780e-07 -9.665409e-07 -1.536957e-06 -2.260740e-06 -3.073145e-06 -3.846497e-06 -4.368270e-06 -4.216650e-06 -2.223100e-06 5.304100e-06 2.909860e-05 9.494898e-05 2.497760e-04 5.476200e-04 9.959801e-04 1.487600e-03 1.810599e-03 1.798900e-03 1.522901e-03 1.297500e-03 1.383699e-03 1.680899e-03 1.849400e-03 1.680700e-03 1.243010e-03 7.516998e-04 3.752400e-04 1.560180e-04 5.365800e-05 1.378030e-05 3.476998e-07 -3.605880e-06 -4.421540e-06 -4.151590e-06 -3.467209e-06 -2.653656e-06 -1.874713e-06 -1.224739e-06 -7.402290e-07 -4.139521e-07 -9.008350e-07 -1.671138e-06 -2.868230e-06 -4.554366e-06 -6.689170e-06 -9.080700e-06 -1.135909e-05 -1.293377e-05 -1.270438e-05 -7.771299e-06 1.079720e-05 6.846999e-05 2.249260e-04 5.843301e-04 1.255780e-03 2.230390e-03 3.252901e-03 3.866399e-03 3.672998e-03 2.760001e-03 2.012596e-03 2.321698e-03 3.304899e-03 3.889397e-03 3.616400e-03 2.721299e-03 1.676781e-03 8.512901e-04 3.580300e-04 1.230380e-04 2.995700e-05 -1.878401e-06 -1.133190e-05 -1.315829e-05 -1.222089e-05 -1.017548e-05 -7.778750e-06 -5.491270e-06 -3.584830e-06 -2.164968e-06 -1.209655e-06 -2.480998e-06 -4.596149e-06 -7.876760e-06 -1.248702e-05 -1.830913e-05 -2.481595e-05 -3.102208e-05 -3.543490e-05 -3.551630e-05 -2.506300e-05 1.439599e-05 1.344080e-04 4.526700e-04 1.166880e-03 2.471800e-03 4.353300e-03 6.445900e-03 8.057900e-03 8.068904e-03 5.723000e-03 3.346995e-03 4.432991e-03 7.301994e-03 8.338094e-03 7.257599e-03 5.267201e-03 3.229700e-03 1.653210e-03 7.001399e-04 2.379650e-04 5.151301e-05 -1.345580e-05 -3.292280e-05 -3.622730e-05 -3.326586e-05 -2.761631e-05 -2.109170e-05 -1.488160e-05 -9.709950e-06 -5.860310e-06 -3.271916e-06 -6.324430e-06 -1.169854e-05 -2.001522e-05 -3.167136e-05 -4.634550e-05 -6.269570e-05 -7.829550e-05 -8.969390e-05 -9.167820e-05 -7.282071e-05 -5.470065e-07 2.141160e-04 7.695900e-04 1.989660e-03 4.196799e-03 7.508399e-03 1.193940e-02 1.727000e-02 2.060001e-02 1.631400e-02 9.267986e-03 1.288399e-02 1.993600e-02 1.919201e-02 1.405160e-02 9.164400e-03 5.406499e-03 2.752580e-03 1.163140e-03 3.822000e-04 6.111601e-05 -5.318600e-05 -8.764610e-05 -9.204680e-05 -8.365470e-05 -6.927890e-05 -5.288250e-05 -3.730471e-05 -2.433404e-05 -1.468004e-05 -8.191110e-06 -1.492097e-05 -2.755372e-05 -4.705270e-05 -7.429581e-05 -1.084645e-04 -1.463870e-04 -1.825287e-04 -2.095327e-04 -2.177854e-04 -1.892590e-04 -7.540401e-05 2.542699e-04 1.085730e-03 2.877951e-03 6.126799e-03 1.138760e-02 2.023630e-02 3.523600e-02 5.122700e-02 4.698604e-02 2.156103e-02 3.717804e-02 5.329299e-02 4.202101e-02 2.511299e-02 1.415610e-02 7.828100e-03 3.908001e-03 1.620710e-03 4.872900e-04 1.228997e-05 -1.608460e-04 -2.129200e-04 -2.155083e-04 -1.942333e-04 -1.605898e-04 -1.225769e-04 -8.648490e-05 -5.641570e-05 -3.402698e-05 -1.897791e-05 -3.257726e-05 -6.004670e-05 -1.023236e-04 -1.611846e-04 -2.347085e-04 -3.159541e-04 -3.931970e-04 -4.518460e-04 -4.757600e-04 -4.409760e-04 -2.879159e-04 1.438201e-04 1.204640e-03 3.454000e-03 7.554002e-03 1.467970e-02 2.869900e-02 5.629000e-02 9.246999e-02 1.104801e-01 -6.715989e-02 7.418990e-02 1.045580e-01 6.883499e-02 3.656501e-02 1.845320e-02 9.588398e-03 4.637801e-03 1.822100e-03 4.177301e-04 -1.819700e-04 -4.061750e-04 -4.721220e-04 -4.650550e-04 -4.165660e-04 -3.440804e-04 -2.627018e-04 -1.854253e-04 -1.209869e-04 -7.297380e-05 -4.068958e-05 -6.581830e-05 -1.210729e-04 -2.058585e-04 -3.235301e-04 -4.700460e-04 -6.314710e-04 -7.847100e-04 -9.023500e-04 -9.589060e-04 -9.286350e-04 -7.563800e-04 -2.840401e-04 8.473797e-04 3.216600e-03 7.536199e-03 1.522690e-02 3.073800e-02 5.910400e-02 9.052700e-02 1.591200e-01 -4.239960e-01 1.468301e-01 1.062310e-01 6.931803e-02 3.851400e-02 1.901510e-02 9.512700e-03 4.350800e-03 1.441090e-03 -1.676986e-05 -6.498500e-04 -8.934030e-04 -9.602240e-04 -9.282720e-04 -8.276480e-04 -6.828390e-04 -5.211870e-04 -3.678734e-04 -2.400562e-04 -1.447977e-04 -8.072890e-05 -1.230529e-04 -2.258968e-04 -3.833571e-04 -6.016600e-04 -8.737670e-04 -1.174593e-03 -1.461484e-03 -1.683654e-03 -1.799829e-03 -1.790220e-03 -1.633180e-03 -1.224960e-03 -2.727499e-04 1.728401e-03 5.398601e-03 1.183441e-02 2.380200e-02 3.980500e-02 2.814996e-02 -5.079007e-02 -1.637700e-01 -8.921003e-02 1.291198e-02 4.166102e-02 2.863899e-02 1.460620e-02 6.913599e-03 2.599701e-03 1.785401e-04 -1.021520e-03 -1.548280e-03 -1.761590e-03 -1.810503e-03 -1.729940e-03 -1.535455e-03 -1.262297e-03 -9.605090e-04 -6.765380e-04 -4.410010e-04 -2.658958e-04 -1.482175e-04 -2.129109e-04 -3.901967e-04 -6.617110e-04 -1.039988e-03 -1.517207e-03 -2.054873e-03 -2.577530e-03 -2.984560e-03 -3.195650e-03 -3.207000e-03 -3.084760e-03 -2.854560e-03 -2.358350e-03 -1.213900e-03 1.091002e-03 5.352501e-03 1.328900e-02 2.356201e-02 1.327398e-02 -5.247599e-02 -1.226070e-01 -7.635701e-02 1.689017e-03 2.456400e-02 1.613499e-02 7.009603e-03 1.978602e-03 -7.397998e-04 -2.137980e-03 -2.761200e-03 -3.036600e-03 -3.184590e-03 -3.216090e-03 -3.061370e-03 -2.700730e-03 -2.198647e-03 -1.656134e-03 -1.157678e-03 -7.513590e-04 -4.521500e-04 -2.518661e-04 -3.410131e-04 -6.245070e-04 -1.061133e-03 -1.679693e-03 -2.485739e-03 -3.435640e-03 -4.395860e-03 -5.137240e-03 -5.456180e-03 -5.381899e-03 -5.207880e-03 -5.224630e-03 -5.435520e-03 -5.526600e-03 -4.988801e-03 -2.953302e-03 2.779506e-03 1.583001e-02 3.399301e-02 4.341701e-02 4.242700e-02 4.357302e-02 3.754300e-02 2.004801e-02 5.098000e-03 -2.057999e-03 -4.691802e-03 -5.478600e-03 -5.484301e-03 -5.264370e-03 -5.188560e-03 -5.336130e-03 -5.466301e-03 -5.254949e-03 -4.600650e-03 -3.669310e-03 -2.700790e-03 -1.854109e-03 -1.190408e-03 -7.127200e-04 -3.962629e-04 -5.057750e-04 -9.270790e-04 -1.585121e-03 -2.549558e-03 -3.882690e-03 -5.573601e-03 -7.377190e-03 -8.708320e-03 -8.977600e-03 -8.314000e-03 -7.679500e-03 -7.956401e-03 -9.196500e-03 -1.083170e-02 -1.218930e-02 -1.241500e-02 -9.178601e-03 3.256992e-03 3.136800e-02 6.980401e-02 9.240201e-02 7.694602e-02 3.911498e-02 7.719994e-03 -7.601000e-03 -1.215700e-02 -1.237170e-02 -1.115940e-02 -9.528100e-03 -8.149199e-03 -7.646601e-03 -8.141100e-03 -8.892699e-03 -8.862900e-03 -7.717990e-03 -5.955280e-03 -4.209280e-03 -2.795760e-03 -1.758695e-03 -1.042558e-03 -5.774311e-04 -6.947750e-04 -1.277147e-03 -2.208188e-03 -3.643840e-03 -5.793260e-03 -8.769320e-03 -1.210370e-02 -1.430190e-02 -1.374220e-02 -1.092780e-02 -8.753601e-03 -9.473698e-03 -1.266580e-02 -1.641470e-02 -1.930540e-02 -2.111670e-02 -2.148580e-02 -1.646300e-02 4.272997e-03 4.766801e-02 8.012301e-02 5.619800e-02 1.062199e-02 -1.427001e-02 -2.119010e-02 -2.133340e-02 -1.970590e-02 -1.702080e-02 -1.335810e-02 -9.916302e-03 -8.645900e-03 -1.039270e-02 -1.333650e-02 -1.443060e-02 -1.264180e-02 -9.374350e-03 -6.271509e-03 -3.972790e-03 -2.424515e-03 -1.415698e-03 -7.794480e-04 -8.837590e-04 -1.631246e-03 -2.860670e-03 -4.867830e-03 -8.123791e-03 -1.297970e-02 -1.851990e-02 -2.136050e-02 -1.762190e-02 -9.046197e-03 -3.474101e-03 -5.774796e-03 -1.375210e-02 -2.135360e-02 -2.437260e-02 -2.379860e-02 -2.447800e-02 -2.765401e-02 -1.730001e-02 3.001601e-02 6.430501e-02 3.845799e-02 -1.252800e-02 -2.768299e-02 -2.492400e-02 -2.369370e-02 -2.442030e-02 -2.215080e-02 -1.508660e-02 -6.758701e-03 -3.292702e-03 -7.804699e-03 -1.646570e-02 -2.127010e-02 -1.924150e-02 -1.383400e-02 -8.760771e-03 -5.270210e-03 -3.106680e-03 -1.782090e-03 -9.742629e-04 -1.040156e-03 -1.926556e-03 -3.420410e-03 -5.971899e-03 -1.034220e-02 -1.708370e-02 -2.448460e-02 -2.608210e-02 -1.248500e-02 8.911997e-03 1.766900e-02 9.600997e-03 -9.760000e-03 -2.565101e-02 -2.605399e-02 -1.384601e-02 -4.321009e-03 -7.404000e-03 -2.871007e-03 1.466000e-02 -4.001999e-01 6.639957e-03 5.599856e-05 -8.064002e-03 -4.057005e-03 -1.216000e-02 -2.498500e-02 -2.665000e-02 -1.226800e-02 7.575996e-03 1.755401e-02 1.092300e-02 -9.764999e-03 -2.535560e-02 -2.519150e-02 -1.804790e-02 -1.105283e-02 -6.398390e-03 -3.667540e-03 -2.072814e-03 -1.126535e-03 -1.131653e-03 -2.096717e-03 -3.739370e-03 -6.589540e-03 -1.151045e-02 -1.888890e-02 -2.578470e-02 -2.051200e-02 1.906100e-02 6.094301e-02 6.223600e-02 3.884199e-02 -1.993001e-03 -3.337200e-02 -2.787001e-02 7.808000e-03 3.940499e-02 4.300100e-02 3.858298e-02 4.459000e-02 -5.769920e-02 4.200006e-02 3.918999e-02 4.224598e-02 4.103199e-02 1.163000e-02 -2.531999e-02 -3.464901e-02 -6.015003e-03 3.545301e-02 6.090301e-02 6.270099e-02 2.424501e-02 -1.843499e-02 -2.611810e-02 -1.966930e-02 -1.212300e-02 -6.958080e-03 -3.949770e-03 -2.219539e-03 -1.203747e-03 -1.137604e-03 -2.098585e-03 -3.717470e-03 -6.465450e-03 -1.098900e-02 -1.706000e-02 -2.038800e-02 -5.823001e-03 5.174798e-02 1.055260e-01 1.029840e-01 6.459299e-02 -8.899868e-04 -4.958698e-02 -3.673801e-02 2.456701e-02 7.935101e-02 8.665302e-02 5.859199e-02 3.185800e-02 2.128699e-02 3.057200e-02 5.641001e-02 8.542901e-02 8.154100e-02 2.917901e-02 -3.357899e-02 -5.089799e-02 -5.427003e-03 6.074101e-02 1.013980e-01 1.069920e-01 5.668601e-02 -3.403991e-03 -2.024520e-02 -1.746310e-02 -1.137050e-02 -6.710890e-03 -3.862050e-03 -2.184232e-03 -1.188232e-03 -1.057413e-03 -1.934143e-03 -3.370110e-03 -5.680340e-03 -9.140801e-03 -1.296200e-02 -1.281640e-02 1.972005e-03 4.301000e-02 8.741799e-02 9.608999e-02 5.738300e-02 -5.865991e-03 -4.124099e-02 -2.679700e-02 2.309799e-02 7.833001e-02 8.831000e-02 4.975300e-02 1.760989e-03 -1.991600e-02 1.969934e-04 4.772499e-02 8.749300e-02 7.986498e-02 2.552998e-02 -2.532297e-02 -4.165298e-02 -8.102000e-03 5.497202e-02 9.546399e-02 8.860400e-02 4.505001e-02 3.091000e-03 -1.260220e-02 -1.307990e-02 -9.300401e-03 -5.796490e-03 -3.443480e-03 -1.979314e-03 -1.084620e-03 -9.106140e-04 -1.648825e-03 -2.815420e-03 -4.574870e-03 -6.953469e-03 -9.129299e-03 -8.140400e-03 1.330398e-03 2.268299e-02 4.675800e-02 4.838401e-02 1.183900e-02 -1.002800e-02 -1.459007e-01 -3.182030e-02 -6.999969e-04 3.060898e-02 4.721799e-02 2.314200e-02 -1.146200e-02 -2.694900e-02 -1.180601e-02 2.271700e-02 4.713401e-02 3.104600e-02 -5.859733e-04 -2.946997e-02 -1.520004e-01 -9.895027e-03 1.129502e-02 4.815900e-02 4.697099e-02 2.299399e-02 1.517698e-03 -8.088697e-03 -9.145001e-03 -6.984240e-03 -4.600190e-03 -2.832760e-03 -1.660010e-03 -9.175140e-04 -7.285780e-04 -1.307949e-03 -2.195950e-03 -3.470740e-03 -5.105280e-03 -6.636101e-03 -6.721102e-03 -3.454499e-03 3.408402e-03 7.986009e-03 -4.462004e-03 -3.992599e-02 -4.399401e-02 -6.420040e-02 -2.819014e-02 -4.862100e-02 -2.377898e-02 -1.243994e-03 -6.059006e-03 -2.056300e-02 -2.738979e-02 -2.035900e-02 -5.847007e-03 -1.366004e-03 -2.433601e-02 -4.856503e-02 -2.891970e-02 -6.099987e-02 -4.466003e-02 -3.934202e-02 -4.050016e-03 8.001000e-03 3.288202e-03 -3.539801e-03 -6.741500e-03 -6.618100e-03 -5.077650e-03 -3.447060e-03 -2.178820e-03 -1.296446e-03 -7.213410e-04 -5.433520e-04 -9.711960e-04 -1.616477e-03 -2.525760e-03 -3.712031e-03 -5.072970e-03 -6.335899e-03 -7.319201e-03 -8.788697e-03 -1.384800e-02 -2.739000e-02 -4.700598e-02 -4.799801e-02 -1.889503e-02 -2.909601e-02 -4.894099e-02 -3.743201e-02 -2.406999e-02 -2.135310e-02 -2.427450e-02 -2.605399e-02 -2.413150e-02 -2.129610e-02 -2.443299e-02 -3.818399e-02 -4.886100e-02 -2.773201e-02 -1.982898e-02 -4.883000e-02 -4.625702e-02 -2.658500e-02 -1.347790e-02 -8.681998e-03 -7.277399e-03 -6.286399e-03 -5.012500e-03 -3.654610e-03 -2.479630e-03 -1.582735e-03 -9.481009e-04 -5.286720e-04 -3.792150e-04 -6.790070e-04 -1.132093e-03 -1.777780e-03 -2.668000e-03 -3.886180e-03 -5.590400e-03 -8.089399e-03 -1.183340e-02 -1.686900e-02 -2.046400e-02 -1.395398e-02 1.010501e-02 3.617603e-02 3.064600e-02 3.378004e-03 -1.546200e-02 -2.139501e-02 -2.197120e-02 -2.199950e-02 -2.209290e-02 -2.199050e-02 -2.197360e-02 -2.123699e-02 -1.460201e-02 5.281001e-03 3.221703e-02 3.506300e-02 7.907987e-03 -1.499599e-02 -2.040701e-02 -1.649050e-02 -1.151330e-02 -7.872801e-03 -5.445500e-03 -3.784500e-03 -2.594010e-03 -1.723710e-03 -1.093426e-03 -6.526660e-04 -3.625160e-04 -2.491796e-04 -4.505150e-04 -7.612309e-04 -1.219254e-03 -1.890070e-03 -2.902980e-03 -4.485310e-03 -6.898499e-03 -1.000170e-02 -1.190910e-02 -6.487399e-03 1.639800e-02 5.845100e-02 9.453499e-02 8.679301e-02 4.477201e-02 7.197991e-03 -1.126429e-02 -1.652370e-02 -1.710020e-02 -1.700720e-02 -1.710600e-02 -1.631520e-02 -1.017490e-02 1.012000e-02 4.930100e-02 8.976999e-02 9.245399e-02 5.383399e-02 1.310201e-02 -7.651001e-03 -1.190190e-02 -9.689299e-03 -6.615800e-03 -4.292670e-03 -2.780250e-03 -1.810200e-03 -1.165159e-03 -7.241740e-04 -4.259070e-04 -2.338541e-04 -1.557303e-04 -2.873600e-04 -4.988970e-04 -8.270900e-04 -1.335780e-03 -2.142040e-03 -3.426920e-03 -5.325040e-03 -7.432701e-03 -7.567700e-03 -1.133010e-04 2.294401e-02 6.647001e-02 1.124750e-01 1.010350e-01 5.001400e-02 1.268100e-02 -5.595900e-03 -1.156410e-02 -1.250050e-02 -1.246620e-02 -1.248450e-02 -1.120750e-02 -4.108302e-03 1.630599e-02 5.630299e-02 1.062960e-01 1.086110e-01 5.984600e-02 1.887500e-02 -1.778804e-03 -7.817701e-03 -7.198900e-03 -5.050680e-03 -3.228430e-03 -2.016020e-03 -1.256960e-03 -7.766050e-04 -4.661610e-04 -2.665970e-04 -1.432441e-04 -9.411520e-05 -1.798140e-04 -3.260240e-04 -5.679740e-04 -9.639610e-04 -1.609900e-03 -2.638860e-03 -4.133600e-03 -5.788901e-03 -6.176500e-03 -2.052497e-03 1.119100e-02 4.219501e-02 8.582598e-02 7.326400e-02 2.836001e-02 4.411399e-03 -5.770598e-03 -8.977700e-03 -9.287800e-03 -9.173799e-03 -9.307199e-03 -8.756602e-03 -4.754800e-03 6.975502e-03 3.419499e-02 7.980302e-02 8.081198e-02 3.567499e-02 8.268602e-03 -3.170900e-03 -6.309599e-03 -5.557800e-03 -3.872890e-03 -2.447270e-03 -1.487170e-03 -8.884760e-04 -5.218030e-04 -2.979290e-04 -1.630990e-04 -8.459290e-05 -5.630220e-05 -1.132445e-04 -2.177766e-04 -4.032020e-04 -7.227150e-04 -1.257040e-03 -2.113750e-03 -3.386560e-03 -5.011699e-03 -6.513899e-03 -6.927900e-03 -5.073100e-03 2.311990e-03 1.546799e-02 1.103500e-02 -1.895003e-03 -6.894998e-03 -8.184798e-03 -7.942200e-03 -7.278371e-03 -7.012070e-03 -7.388160e-03 -8.050401e-03 -8.096099e-03 -6.375000e-03 -1.240075e-04 1.350801e-02 1.356499e-02 2.579987e-04 -5.670495e-03 -6.983500e-03 -6.285300e-03 -4.699440e-03 -3.119340e-03 -1.926240e-03 -1.137620e-03 -6.503990e-04 -3.608020e-04 -1.936087e-04 -9.990019e-05 -4.922000e-05 -3.418796e-05 -7.332470e-05 -1.506740e-04 -2.967900e-04 -5.599140e-04 -1.010346e-03 -1.741790e-03 -2.864530e-03 -4.485360e-03 -6.704999e-03 -9.713499e-03 -1.376400e-02 -1.823790e-02 -2.090530e-02 -2.038680e-02 -1.693600e-02 -1.263830e-02 -9.303000e-03 -7.118100e-03 -5.880889e-03 -5.531359e-03 -6.069410e-03 -7.498501e-03 -9.908400e-03 -1.350220e-02 -1.783370e-02 -2.077229e-02 -2.059300e-02 -1.735030e-02 -1.281940e-02 -8.992199e-03 -6.176100e-03 -4.094330e-03 -2.587450e-03 -1.557350e-03 -8.945520e-04 -4.910229e-04 -2.578690e-04 -1.297370e-04 -6.256990e-05 -2.890272e-05 -2.139283e-05 -4.900510e-05 -1.070429e-04 -2.221396e-04 -4.364680e-04 -8.104590e-04 -1.423880e-03 -2.379390e-03 -3.819230e-03 -5.971360e-03 -9.193600e-03 -1.372910e-02 -1.881110e-02 -2.205710e-02 -2.121430e-02 -1.698000e-02 -1.206860e-02 -8.287500e-03 -5.918580e-03 -4.678130e-03 -4.352560e-03 -4.887940e-03 -6.374021e-03 -9.062000e-03 -1.318580e-02 -1.816520e-02 -2.181120e-02 -2.159850e-02 -1.764410e-02 -1.253090e-02 -8.299101e-03 -5.370921e-03 -3.418220e-03 -2.111450e-03 -1.249299e-03 -7.019000e-04 -3.728840e-04 -1.872494e-04 -8.909350e-05 -4.031090e-05 -1.740510e-05 -1.372955e-05 -3.324484e-05 -7.611530e-05 -1.640310e-04 -3.316200e-04 -6.281250e-04 -1.116724e-03 -1.875010e-03 -3.004680e-03 -4.652030e-03 -6.994250e-03 -1.004270e-02 -1.318630e-02 -1.505540e-02 -1.453310e-02 -1.198580e-02 -8.849161e-03 -6.243690e-03 -4.499440e-03 -3.552760e-03 -3.307320e-03 -3.735360e-03 -4.884940e-03 -6.861760e-03 -9.671230e-03 -1.279250e-02 -1.491790e-02 -1.476210e-02 -1.240130e-02 -9.172501e-03 -6.288900e-03 -4.148010e-03 -2.657210e-03 -1.639530e-03 -9.624111e-04 -5.324080e-04 -2.762120e-04 -1.342682e-04 -6.127430e-05 -2.635037e-05 -1.072879e-05 -8.843950e-06 -2.228318e-05 -5.266420e-05 -1.163305e-04 -2.395981e-04 -4.597710e-04 -8.231830e-04 -1.381176e-03 -2.187650e-03 -3.296900e-03 -4.739030e-03 -6.426060e-03 -8.004680e-03 -8.879821e-03 -8.620450e-03 -7.379430e-03 -5.747850e-03 -4.260890e-03 -3.171130e-03 -2.542040e-03 -2.378640e-03 -2.680120e-03 -3.447480e-03 -4.667210e-03 -6.236081e-03 -7.818481e-03 -8.819269e-03 -8.728091e-03 -7.580779e-03 -5.914280e-03 -4.277510e-03 -2.933130e-03 -1.919000e-03 -1.192061e-03 -6.973580e-04 -3.816790e-04 -1.947733e-04 -9.260760e-05 -4.107900e-05 -1.704696e-05 -6.644000e-06 -5.569480e-06 -1.439433e-05 -3.469720e-05 -7.782060e-05 -1.621629e-04 -3.138020e-04 -5.643600e-04 -9.455850e-04 -1.481918e-03 -2.181380e-03 -3.019450e-03 -3.907720e-03 -4.665260e-03 -5.057240e-03 -4.934289e-03 -4.354870e-03 -3.542470e-03 -2.735210e-03 -2.093579e-03 -1.702547e-03 -1.601316e-03 -1.799049e-03 -2.277540e-03 -2.985340e-03 -3.816260e-03 -4.581290e-03 -5.031690e-03 -4.982680e-03 -4.447910e-03 -3.622720e-03 -2.735590e-03 -1.936749e-03 -1.289663e-03 -8.056390e-04 -4.700690e-04 -2.552723e-04 -1.287828e-04 -6.033580e-05 -2.627326e-05 -1.065228e-05 -4.031910e-06 -3.355981e-06 -8.805961e-06 -2.147498e-05 -4.860450e-05 -1.020084e-04 -1.984587e-04 -3.580380e-04 -5.996460e-04 -9.340190e-04 -1.355614e-03 -1.834223e-03 -2.308040e-03 -2.685490e-03 -2.870210e-03 -2.808310e-03 -2.523530e-03 -2.105422e-03 -1.664350e-03 -1.294623e-03 -1.061766e-03 -1.002403e-03 -1.125459e-03 -1.412266e-03 -1.816207e-03 -2.261261e-03 -2.644850e-03 -2.858590e-03 -2.831850e-03 -2.569660e-03 -2.146560e-03 -1.661888e-03 -1.198080e-03 -8.052820e-04 -5.040420e-04 -2.932080e-04 -1.582638e-04 -7.919990e-05 -3.674190e-05 -1.580953e-05 -6.316160e-06 -2.346747e-06 -1.907462e-06 -5.048260e-06 -1.239272e-05 -2.819571e-05 -5.942570e-05 -1.159985e-04 -2.097301e-04 -3.513930e-04 -5.459670e-04 -7.872480e-04 -1.053730e-03 -1.308123e-03 -1.503110e-03 -1.595034e-03 -1.561799e-03 -1.414351e-03 -1.193060e-03 -9.525700e-04 -7.458450e-04 -6.139090e-04 -5.811500e-04 -6.534250e-04 -8.177049e-04 -1.042940e-03 -1.282737e-03 -1.481955e-03 -1.589294e-03 -1.574217e-03 -1.438869e-03 -1.215505e-03 -9.512531e-04 -6.907820e-04 -4.656580e-04 -2.912390e-04 -1.688665e-04 -9.071240e-05 -4.513270e-05 -2.079787e-05 -8.879550e-06 -3.514531e-06 -1.290804e-06 -1.014048e-06 -2.696238e-06 -6.642530e-06 -1.515595e-05 -3.201748e-05 -6.261610e-05 -1.133673e-04 -1.900470e-04 -2.950685e-04 -4.244260e-04 -5.656510e-04 -6.983370e-04 -7.981880e-04 -8.441460e-04 -8.261830e-04 -7.497499e-04 -6.344510e-04 -5.079250e-04 -3.983060e-04 -3.282460e-04 -3.114222e-04 -3.510300e-04 -4.394920e-04 -5.591850e-04 -6.846500e-04 -7.871060e-04 -8.412760e-04 -8.328239e-04 -7.628120e-04 -6.466140e-04 -5.075820e-04 -3.691470e-04 -2.487446e-04 -1.552653e-04 -8.975040e-05 -4.803190e-05 -2.379672e-05 -1.091480e-05 -4.635650e-06 -1.823691e-06 -6.649210e-07 -5.018680e-07 -1.337519e-06 -3.300889e-06 -7.541750e-06 -1.594976e-05 -3.122037e-05 -5.656180e-05 -9.484860e-05 -1.472326e-04 -2.115893e-04 -2.815310e-04 -3.468120e-04 -3.955050e-04 -4.175400e-04 -4.082610e-04 -3.703830e-04 -3.134081e-04 -2.508496e-04 -1.966503e-04 -1.621404e-04 -1.541619e-04 -1.742543e-04 -2.185092e-04 -2.779693e-04 -3.398580e-04 -3.899890e-04 -4.161730e-04 -4.116420e-04 -3.769860e-04 -3.196007e-04 -2.508432e-04 -1.822807e-04 -1.226342e-04 -7.638020e-05 -4.403450e-05 -2.349722e-05 -1.160481e-05 -5.304860e-06 -2.244789e-06 -8.794880e-07 -3.191339e-07 -2.306547e-07 -6.153020e-07 -1.519498e-06 -3.473215e-06 -7.347570e-06 -1.438513e-05 -2.606373e-05 -4.370380e-05 -6.782290e-05 -9.741620e-05 -1.295068e-04 -1.593590e-04 -1.815076e-04 -1.913842e-04 -1.869210e-04 -1.694025e-04 -1.431947e-04 -1.144932e-04 -8.969620e-05 -7.399420e-05 -7.050970e-05 -7.991700e-05 -1.003791e-04 -1.277396e-04 -1.561017e-04 -1.789625e-04 -1.907808e-04 -1.885199e-04 -1.724912e-04 -1.460936e-04 -1.145300e-04 -8.310461e-05 -5.581290e-05 -3.469215e-05 -1.995692e-05 -1.062462e-05 -5.234600e-06 -2.386824e-06 -1.007287e-06 -3.934940e-07 -1.423131e-07 -9.830980e-08 -2.622952e-07 -6.477260e-07 -1.480351e-06 -3.131015e-06 -6.128270e-06 -1.109997e-05 -1.860511e-05 -2.885875e-05 -4.142530e-05 -5.503070e-05 -6.765560e-05 -7.698140e-05 -8.108230e-05 -7.910070e-05 -7.160230e-05 -6.045160e-05 -4.828270e-05 -3.780530e-05 -3.121153e-05 -2.981093e-05 -3.387453e-05 -4.260900e-05 -5.423880e-05 -6.625530e-05 -7.590090e-05 -8.083800e-05 -7.979661e-05 -7.293050e-05 -6.169400e-05 -4.829970e-05 -3.499459e-05 -2.346418e-05 -1.455949e-05 -8.360250e-06 -4.442440e-06 -2.184509e-06 -9.940820e-07 -4.186510e-07 -1.631803e-07 -5.887320e-08 END_DATAGRID_2D DATAGRID2D_Charge_Density 41 42 0.000000e+00 -3.501404e+00 3.320950e+00 0.000000e+00 6.889479e+00 0.000000e+00 0.000000e+00 9.916210e-02 -7.036295e+00 1.840300e-11 3.438810e-11 5.943520e-11 9.524300e-11 1.418160e-10 1.973760e-10 2.650790e-10 3.921360e-10 7.692700e-10 2.334790e-09 8.962320e-09 3.461210e-08 1.216590e-07 3.759010e-07 1.008260e-06 2.337440e-06 4.679190e-06 8.093410e-06 1.211130e-05 1.570260e-05 1.765950e-05 1.723700e-05 1.460060e-05 1.072400e-05 6.821100e-06 3.751810e-06 1.782450e-06 7.312920e-07 2.595700e-07 8.021770e-08 2.196970e-08 5.605590e-09 1.532500e-09 5.815300e-10 3.380570e-10 2.405420e-10 1.775270e-10 1.248080e-10 8.178160e-11 4.972620e-11 2.801260e-11 8.698100e-11 1.623440e-10 2.806830e-10 4.495420e-10 6.685170e-10 9.348720e-10 1.281680e-09 1.923440e-09 4.022800e-09 1.295620e-08 5.093260e-08 1.972330e-07 6.895900e-07 2.112300e-06 5.608270e-06 1.286190e-05 2.547130e-05 4.361330e-05 6.469460e-05 8.331200e-05 9.329680e-05 9.093130e-05 7.711900e-05 5.684510e-05 3.634870e-05 2.012000e-05 9.623490e-06 3.974220e-06 1.418770e-06 4.402260e-07 1.205970e-07 3.049640e-08 8.081860e-09 2.901180e-09 1.615520e-09 1.139370e-09 8.313480e-10 5.820040e-10 3.810250e-10 2.312190e-10 1.300400e-10 3.807590e-10 7.102560e-10 1.226480e-09 1.961870e-09 2.919720e-09 4.093900e-09 5.630850e-09 8.637970e-09 1.887580e-08 6.293410e-08 2.498370e-07 9.643760e-07 3.343340e-06 1.013050e-05 2.657220e-05 6.016280e-05 1.176140e-04 1.989270e-04 2.919320e-04 3.728660e-04 4.155080e-04 4.044860e-04 3.438640e-04 2.548280e-04 1.641630e-04 9.164990e-05 4.422630e-05 1.842030e-05 6.626620e-06 2.069150e-06 5.690070e-07 1.436580e-07 3.753480e-08 1.306920e-08 7.087970e-09 4.945330e-09 3.599110e-09 2.513260e-09 1.641950e-09 9.959330e-10 5.593150e-10 1.543110e-09 2.875910e-09 4.960880e-09 7.931510e-09 1.179850e-08 1.654000e-08 2.281860e-08 3.539770e-08 7.894370e-08 2.665090e-07 1.056770e-06 4.046090e-06 1.387050e-05 4.148420e-05 1.072620e-04 2.391690e-04 4.602840e-04 7.667990e-04 1.110380e-03 1.403880e-03 1.555390e-03 1.512880e-03 1.291220e-03 9.643800e-04 6.277000e-04 3.544710e-04 1.730280e-04 7.284960e-05 2.646430e-05 8.334060e-06 2.307920e-06 5.854010e-07 1.529700e-07 5.293890e-08 2.851430e-08 1.982450e-08 1.440310e-08 1.004270e-08 6.552390e-09 3.969280e-09 2.226640e-09 5.790770e-09 1.078220e-08 1.858400e-08 2.969110e-08 4.413940e-08 6.184280e-08 8.525860e-08 1.320880e-07 2.934730e-07 9.828400e-07 3.854970e-06 1.457620e-05 4.928150e-05 1.451580e-04 3.690770e-04 8.081520e-04 1.526170e-03 2.495970e-03 3.556030e-03 4.441490e-03 4.888300e-03 4.752820e-03 4.079230e-03 3.078700e-03 2.031260e-03 1.164190e-03 5.766030e-04 2.460410e-04 9.045870e-05 2.879470e-05 8.054350e-06 2.064590e-06 5.469510e-07 1.927060e-07 1.051710e-07 7.343770e-08 5.336360e-08 3.717700e-08 2.422230e-08 1.465070e-08 8.207530e-09 2.012290e-08 3.744020e-08 6.449750e-08 1.029920e-07 1.530180e-07 2.141120e-07 2.939240e-07 4.492020e-07 9.706870e-07 3.159900e-06 1.214280e-05 4.514930e-05 1.501580e-04 4.345970e-04 1.083920e-03 2.324170e-03 4.294630e-03 6.880020e-03 9.635020e-03 1.189140e-02 1.300810e-02 1.264300e-02 1.090970e-02 8.324220e-03 5.576690e-03 3.252470e-03 1.639160e-03 7.107220e-04 2.650510e-04 8.547430e-05 2.422440e-05 6.314060e-06 1.720420e-06 6.322850e-07 3.562920e-07 2.516110e-07 1.831730e-07 1.275000e-07 8.294440e-08 5.008980e-08 2.801850e-08 6.476580e-08 1.204420e-07 2.074190e-07 3.311630e-07 4.918800e-07 6.871950e-07 9.367630e-07 1.397280e-06 2.870030e-06 8.887200e-06 3.310450e-05 1.204830e-04 3.931510e-04 1.115780e-03 2.724290e-03 5.711350e-03 1.032920e-02 1.627680e-02 2.260180e-02 2.784580e-02 3.045720e-02 2.953380e-02 2.540520e-02 1.940730e-02 1.311880e-02 7.771120e-03 3.988600e-03 1.760450e-03 6.672450e-04 2.184640e-04 6.294420e-05 1.680440e-05 4.789030e-06 1.882270e-06 1.112750e-06 7.987010e-07 5.830440e-07 4.054070e-07 2.632410e-07 1.586650e-07 8.859490e-08 1.931050e-07 3.590420e-07 6.184000e-07 9.877540e-07 1.467640e-06 2.047900e-06 2.768510e-06 4.000630e-06 7.652920e-06 2.200330e-05 7.840350e-05 2.777770e-04 8.870390e-04 2.464730e-03 5.887810e-03 1.209580e-02 2.161660e-02 3.424870e-02 4.873620e-02 6.190630e-02 6.884830e-02 6.617600e-02 5.525610e-02 4.083910e-02 2.710230e-02 1.607040e-02 8.359320e-03 3.754230e-03 1.447740e-03 4.822080e-04 1.417990e-04 3.914470e-05 1.191570e-05 5.134810e-06 3.220210e-06 2.354420e-06 1.723070e-06 1.196060e-06 7.746900e-07 4.658020e-07 2.595450e-07 5.335020e-07 9.922110e-07 1.710270e-06 2.735280e-06 4.069970e-06 5.678650e-06 7.617320e-06 1.063310e-05 1.865300e-05 4.845800e-05 1.622320e-04 5.554480e-04 1.731020e-03 4.705770e-03 1.102050e-02 2.239630e-02 4.060350e-02 6.794800e-02 1.052530e-01 1.443440e-01 1.662640e-01 1.571260e-01 1.229400e-01 8.306400e-02 5.118530e-02 2.932710e-02 1.523010e-02 6.930040e-03 2.718350e-03 9.227410e-04 2.783650e-04 8.055070e-05 2.690890e-05 1.300180e-05 8.686940e-06 6.462990e-06 4.735200e-06 3.277300e-06 2.115350e-06 1.267940e-06 7.046440e-07 1.366210e-06 2.543160e-06 4.390980e-06 7.040240e-06 1.050760e-05 1.469020e-05 1.960350e-05 2.649610e-05 4.232280e-05 9.653930e-05 2.959740e-04 9.684390e-04 2.934970e-03 7.807180e-03 1.801340e-02 3.683090e-02 7.047520e-02 1.319350e-01 2.318190e-01 3.438210e-01 4.050040e-01 3.780160e-01 2.790700e-01 1.680220e-01 9.109130e-02 4.811800e-02 2.436200e-02 1.114050e-02 4.438150e-03 1.538470e-03 4.798820e-04 1.486640e-04 5.637390e-05 3.100220e-05 2.198330e-05 1.657300e-05 1.212350e-05 8.350590e-06 5.363860e-06 3.201860e-06 1.773490e-06 3.244230e-06 6.049580e-06 1.047540e-05 1.686710e-05 2.531150e-05 3.557300e-05 4.744830e-05 6.256530e-05 9.140160e-05 1.786680e-04 4.836470e-04 1.484060e-03 4.347320e-03 1.131550e-02 2.586620e-02 5.406770e-02 1.122650e-01 2.386220e-01 4.600560e-01 6.968560e-01 8.140170e-01 7.602810e-01 5.554890e-01 3.122510e-01 1.492720e-01 7.096540e-02 3.438130e-02 1.567850e-02 6.333830e-03 2.250480e-03 7.360690e-04 2.524600e-04 1.127480e-04 7.063170e-05 5.252970e-05 3.984920e-05 2.898810e-05 1.981710e-05 1.264320e-05 7.505920e-06 4.139790e-06 7.147140e-06 1.336630e-05 2.325240e-05 3.769440e-05 5.707650e-05 8.103190e-05 1.087940e-04 1.416360e-04 1.924880e-04 3.195330e-04 7.288940e-04 2.027370e-03 5.667360e-03 1.439730e-02 3.265510e-02 6.984540e-02 1.554770e-01 3.585080e-01 7.151090e-01 1.185230e+00 2.626600e+00 1.483550e+00 8.631410e-01 4.681890e-01 2.087360e-01 9.156750e-02 4.265260e-02 1.938630e-02 7.951910e-03 2.921970e-03 1.029960e-03 4.114390e-04 2.224170e-04 1.558960e-04 1.194360e-04 9.031360e-05 6.495920e-05 4.390070e-05 2.774210e-05 1.634840e-05 8.966920e-06 1.461670e-05 2.746010e-05 4.811650e-05 7.884190e-05 1.211440e-04 1.750620e-04 2.389700e-04 3.119200e-04 4.049840e-04 5.807550e-04 1.069270e-03 2.543540e-03 6.591120e-03 1.618330e-02 3.619640e-02 7.768210e-02 1.763420e-01 4.116810e-01 8.174230e-01 1.972950e+00 1.351420e+02 5.202970e+00 9.887820e-01 5.255110e-01 2.326940e-01 1.001210e-01 4.623730e-02 2.115350e-02 8.879310e-03 3.450720e-03 1.382420e-03 6.837870e-04 4.464460e-04 3.382580e-04 2.613020e-04 1.945930e-04 1.372330e-04 9.112060e-05 5.678680e-05 3.312330e-05 1.803460e-05 2.777210e-05 5.253920e-05 9.310590e-05 1.552000e-04 2.442430e-04 3.635470e-04 5.116760e-04 6.816260e-04 8.711010e-04 1.125810e-03 1.660390e-03 3.127420e-03 7.061960e-03 1.631630e-02 3.547700e-02 7.425740e-02 1.620260e-01 3.604590e-01 6.760350e-01 1.061170e+00 2.601190e+00 1.303170e+00 7.757910e-01 4.448240e-01 2.057290e-01 9.266460e-02 4.407040e-02 2.063200e-02 9.056320e-03 3.924760e-03 1.946290e-03 1.235900e-03 9.342070e-04 7.346100e-04 5.595750e-04 4.041730e-04 2.760010e-04 1.782800e-04 1.088040e-04 6.253520e-05 3.370850e-05 4.907410e-05 9.382230e-05 1.692130e-04 2.898420e-04 4.737430e-04 7.385670e-04 1.090760e-03 1.510350e-03 1.950120e-03 2.386210e-03 2.958330e-03 4.225160e-03 7.534650e-03 1.538510e-02 3.167520e-02 6.342090e-02 1.285080e-01 2.625400e-01 4.710830e-01 6.521900e-01 7.183960e-01 6.812830e-01 5.273940e-01 3.127530e-01 1.556810e-01 7.622730e-02 3.813660e-02 1.867610e-02 9.038920e-03 4.822800e-03 3.188250e-03 2.511620e-03 2.064740e-03 1.626980e-03 1.196910e-03 8.235630e-04 5.354060e-04 3.315920e-04 1.960620e-04 1.102740e-04 5.861490e-05 8.073790e-05 1.567730e-04 2.902970e-04 5.178470e-04 8.943310e-04 1.487400e-03 2.344260e-03 3.424930e-03 4.548320e-03 5.464000e-03 6.112820e-03 6.951270e-03 9.191080e-03 1.499230e-02 2.767570e-02 5.247710e-02 9.964690e-02 1.872960e-01 3.235460e-01 4.640480e-01 5.313130e-01 4.889520e-01 3.593770e-01 2.156890e-01 1.159820e-01 6.106610e-02 3.218890e-02 1.722070e-02 1.013980e-02 7.291430e-03 6.262840e-03 5.635270e-03 4.791700e-03 3.696500e-03 2.584180e-03 1.665880e-03 1.012670e-03 5.910810e-04 3.339420e-04 1.820940e-04 9.493110e-05 1.237850e-04 2.455810e-04 4.715690e-04 8.882020e-04 1.645240e-03 2.957160e-03 5.022610e-03 7.804080e-03 1.076170e-02 1.294610e-02 1.374370e-02 1.364360e-02 1.419630e-02 1.763240e-02 2.704500e-02 4.718980e-02 8.567130e-02 1.527050e-01 2.519260e-01 3.587200e-01 4.143570e-01 3.767400e-01 2.751580e-01 1.709880e-01 9.696600e-02 5.338610e-02 3.015990e-02 1.897630e-02 1.458900e-02 1.363980e-02 1.375810e-02 1.322970e-02 1.131340e-02 8.435100e-03 5.553010e-03 3.321650e-03 1.865320e-03 1.011700e-03 5.388550e-04 2.820020e-04 1.433020e-04 1.768470e-04 3.604630e-04 7.237120e-04 1.452400e-03 2.904610e-03 5.656180e-03 1.035430e-02 1.713010e-02 2.463960e-02 3.000030e-02 3.109390e-02 2.885730e-02 2.644870e-02 2.716630e-02 3.427450e-02 5.240260e-02 8.806520e-02 1.472450e-01 2.307420e-01 3.273960e-01 3.866820e-01 3.433610e-01 2.479060e-01 1.606230e-01 9.689190e-02 5.733810e-02 3.656350e-02 2.786880e-02 2.625810e-02 2.833280e-02 3.086020e-02 3.053100e-02 2.585760e-02 1.850180e-02 1.143820e-02 6.344650e-03 3.285500e-03 1.647150e-03 8.205650e-04 4.090220e-04 2.015240e-04 2.350410e-04 4.937240e-04 1.039650e-03 2.224640e-03 4.786110e-03 1.003000e-02 1.969410e-02 3.494490e-02 5.323230e-02 6.559190e-02 6.695020e-02 6.092730e-02 5.389470e-02 5.149890e-02 5.764080e-02 7.640440e-02 1.120270e-01 1.655960e-01 2.420980e-01 4.668680e-01 1.054250e+00 5.466580e-01 2.587570e-01 1.753260e-01 1.190620e-01 8.066730e-02 5.957030e-02 5.179450e-02 5.311970e-02 5.975690e-02 6.636280e-02 6.648550e-02 5.574880e-02 3.769730e-02 2.165400e-02 1.117420e-02 5.371830e-03 2.500920e-03 1.166240e-03 5.526900e-04 2.634170e-04 2.896440e-04 6.263740e-04 1.378040e-03 3.119040e-03 7.137400e-03 1.591310e-02 3.364090e-02 6.845200e-02 1.197530e-01 1.428960e-01 1.345280e-01 1.230310e-01 1.124320e-01 1.079700e-01 1.144990e-01 1.347390e-01 1.692060e-01 2.150070e-01 3.001720e-01 2.014070e+00 3.207570e+01 2.992050e+00 3.286100e-01 2.215990e-01 1.743460e-01 1.382830e-01 1.162290e-01 1.081140e-01 1.114170e-01 1.215970e-01 1.330900e-01 1.427280e-01 1.251870e-01 7.441220e-02 3.681240e-02 1.751840e-02 7.903570e-03 3.457480e-03 1.523170e-03 6.899460e-04 3.187950e-04 3.295770e-04 7.297530e-04 1.659960e-03 3.915160e-03 9.369950e-03 2.188130e-02 4.993380e-02 1.235020e-01 2.584740e-01 2.890760e-01 2.410180e-01 2.262760e-01 2.211830e-01 2.189080e-01 2.264690e-01 2.435360e-01 2.648930e-01 2.883960e-01 3.414490e-01 1.433510e+00 1.070610e+01 1.838760e+00 3.561040e-01 2.910480e-01 2.670290e-01 2.454850e-01 2.277740e-01 2.191400e-01 2.207190e-01 2.257550e-01 2.381920e-01 2.845820e-01 2.689610e-01 1.348890e-01 5.422150e-02 2.369030e-02 1.018430e-02 4.258120e-03 1.800310e-03 7.886410e-04 3.556430e-04 3.450360e-04 7.754850e-04 1.796720e-03 4.328150e-03 1.059630e-02 2.529400e-02 5.875620e-02 1.463820e-01 3.077480e-01 3.605660e-01 3.357550e-01 3.525940e-01 3.708750e-01 3.794420e-01 3.868830e-01 3.886330e-01 3.750300e-01 3.492450e-01 3.302090e-01 3.709910e-01 5.116650e-01 3.797200e-01 3.298850e-01 3.474740e-01 3.735000e-01 3.882710e-01 3.872930e-01 3.799740e-01 3.716270e-01 3.542490e-01 3.357250e-01 3.587530e-01 3.171530e-01 1.558520e-01 6.233710e-02 2.679620e-02 1.125850e-02 4.600310e-03 1.905570e-03 8.202280e-04 3.644780e-04 3.317570e-04 7.498370e-04 1.741140e-03 4.188610e-03 1.022090e-02 2.423200e-02 5.396700e-02 1.142840e-01 2.105740e-01 2.922510e-01 3.633130e-01 4.461850e-01 5.360830e-01 7.869870e-01 7.032300e-01 5.245580e-01 4.445110e-01 3.598590e-01 2.871720e-01 2.405780e-01 2.240430e-01 2.393110e-01 2.847690e-01 3.565450e-01 4.412200e-01 5.210140e-01 6.909340e-01 7.984910e-01 5.412630e-01 4.494270e-01 3.665390e-01 2.949360e-01 2.145130e-01 1.176040e-01 5.566330e-02 2.505520e-02 1.059040e-02 4.341110e-03 1.802410e-03 7.751060e-04 3.427200e-04 2.930860e-04 6.615050e-04 1.519810e-03 3.580410e-03 8.494730e-03 1.951030e-02 4.153490e-02 8.002840e-02 1.388820e-01 2.205210e-01 3.310010e-01 4.615040e-01 9.075350e-01 1.793290e+01 6.433830e+00 6.348170e-01 4.332980e-01 3.107560e-01 2.176210e-01 1.647020e-01 1.474490e-01 1.642900e-01 2.167510e-01 3.094100e-01 4.317230e-01 6.293810e-01 6.171240e+00 1.851610e+01 9.272020e-01 4.632610e-01 3.324830e-01 2.216740e-01 1.397200e-01 8.061200e-02 4.188980e-02 1.969900e-02 8.582660e-03 3.617930e-03 1.535350e-03 6.680700e-04 2.959660e-04 2.383450e-04 5.358610e-04 1.211800e-03 2.768260e-03 6.290720e-03 1.376450e-02 2.799540e-02 5.212280e-02 9.091710e-02 1.555020e-01 2.594590e-01 3.974300e-01 8.140400e-01 1.117280e+01 4.354230e+00 5.561870e-01 3.566850e-01 2.303430e-01 1.444140e-01 1.012220e-01 8.860120e-02 1.016460e-01 1.454240e-01 2.321010e-01 3.589410e-01 5.627190e-01 4.569690e+00 1.079230e+01 7.930890e-01 3.948980e-01 2.574860e-01 1.541770e-01 9.013270e-02 5.163820e-02 2.769780e-02 1.359940e-02 6.209650e-03 2.731740e-03 1.195930e-03 5.289340e-04 2.352590e-04 1.788250e-04 4.014440e-04 8.970430e-04 1.995200e-03 4.353130e-03 9.078530e-03 1.766920e-02 3.207390e-02 5.647990e-02 1.017980e-01 1.853090e-01 3.101620e-01 4.673260e-01 6.828040e-01 6.030230e-01 4.098930e-01 2.681790e-01 1.565360e-01 8.954390e-02 5.885740e-02 5.048590e-02 5.966720e-02 9.161090e-02 1.605540e-01 2.739270e-01 4.168100e-01 6.133390e-01 6.749920e-01 4.592730e-01 3.040070e-01 1.806650e-01 9.911510e-02 5.507610e-02 3.127440e-02 1.718500e-02 8.800500e-03 4.208940e-03 1.926530e-03 8.658150e-04 3.874290e-04 1.725140e-04 1.240570e-04 2.797500e-04 6.242470e-04 1.372760e-03 2.930430e-03 5.945580e-03 1.129400e-02 2.028360e-02 3.611340e-02 6.742710e-02 1.305520e-01 2.372190e-01 3.659430e-01 4.533010e-01 4.326280e-01 3.229610e-01 1.976510e-01 1.062020e-01 5.704030e-02 3.570220e-02 3.008840e-02 3.662320e-02 5.946170e-02 1.112800e-01 2.059220e-01 3.322320e-01 4.379250e-01 4.501240e-01 3.570780e-01 2.282560e-01 1.245510e-01 6.432760e-02 3.460150e-02 1.946430e-02 1.080650e-02 5.661440e-03 2.778290e-03 1.297810e-03 5.893140e-04 2.638940e-04 1.169220e-04 7.983540e-05 1.822960e-04 4.115590e-04 9.118760e-04 1.951710e-03 3.963930e-03 7.572290e-03 1.381320e-02 2.522070e-02 4.843670e-02 9.652460e-02 1.819250e-01 2.920920e-01 3.708370e-01 3.525730e-01 2.544470e-01 1.489600e-01 7.706270e-02 3.982890e-02 2.385630e-02 1.973570e-02 2.482600e-02 4.238500e-02 8.251960e-02 1.583270e-01 2.657150e-01 3.591260e-01 3.666060e-01 2.812040e-01 1.717060e-01 9.012930e-02 4.524870e-02 2.370170e-02 1.301730e-02 7.114730e-03 3.702200e-03 1.812090e-03 8.430010e-04 3.795260e-04 1.678890e-04 7.344290e-05 4.800470e-05 1.120440e-04 2.591280e-04 5.875600e-04 1.284560e-03 2.667210e-03 5.240260e-03 9.924960e-03 1.890410e-02 3.749540e-02 7.560200e-02 1.436060e-01 2.454580e-01 3.456580e-01 3.207590e-01 2.079730e-01 1.167440e-01 5.977790e-02 3.005130e-02 1.718670e-02 1.392870e-02 1.820170e-02 3.271310e-02 6.536350e-02 1.264460e-01 2.222330e-01 3.321980e-01 3.372930e-01 2.307230e-01 1.329900e-01 6.920750e-02 3.426480e-02 1.736970e-02 9.150220e-03 4.818130e-03 2.436170e-03 1.164900e-03 5.298250e-04 2.328710e-04 1.005320e-04 4.303290e-05 2.739080e-05 6.605900e-05 1.580990e-04 3.701570e-04 8.332890e-04 1.781830e-03 3.623610e-03 7.159700e-03 1.424450e-02 2.905430e-02 5.871190e-02 1.121980e-01 2.153780e-01 3.600520e-01 3.189480e-01 1.716780e-01 8.981000e-02 4.591830e-02 2.273320e-02 1.255430e-02 1.002370e-02 1.354890e-02 2.532070e-02 5.120720e-02 9.926270e-02 1.907530e-01 3.406650e-01 3.431050e-01 1.940890e-01 1.016490e-01 5.276140e-02 2.596480e-02 1.276920e-02 6.439110e-03 3.251470e-03 1.587690e-03 7.362840e-04 3.247280e-04 1.380600e-04 5.757300e-05 2.386110e-05 1.525220e-05 3.841150e-05 9.563840e-05 2.313550e-04 5.349050e-04 1.172000e-03 2.446820e-03 4.976940e-03 1.014760e-02 2.084320e-02 4.145700e-02 7.686370e-02 1.427860e-01 2.326430e-01 2.051830e-01 1.133450e-01 6.136860e-02 3.215020e-02 1.605750e-02 8.819730e-03 7.041430e-03 9.671640e-03 1.823270e-02 3.643000e-02 6.865440e-02 1.275280e-01 2.210730e-01 2.202040e-01 1.270240e-01 6.882890e-02 3.670220e-02 1.826350e-02 8.888660e-03 4.368160e-03 2.142070e-03 1.018140e-03 4.600610e-04 1.971400e-04 8.095130e-05 3.240480e-05 1.285930e-05 8.620040e-06 2.277370e-05 5.878600e-05 1.457020e-04 3.422230e-04 7.583240e-04 1.597910e-03 3.268890e-03 6.635640e-03 1.334190e-02 2.554720e-02 4.430910e-02 6.927300e-02 9.201970e-02 8.513820e-02 5.870370e-02 3.596750e-02 1.981410e-02 1.027610e-02 5.821010e-03 4.728740e-03 6.441990e-03 1.180920e-02 2.267440e-02 4.026290e-02 6.433840e-02 8.943170e-02 8.879100e-02 6.351980e-02 3.978600e-02 2.240580e-02 1.152660e-02 5.709190e-03 2.810810e-03 1.368260e-03 6.433080e-04 2.868000e-04 1.206290e-04 4.818800e-05 1.854800e-05 7.001780e-06 5.119570e-06 1.407820e-05 3.718310e-05 9.306540e-05 2.188870e-04 4.831410e-04 1.009050e-03 2.028860e-03 3.993010e-03 7.668540e-03 1.390030e-02 2.263750e-02 3.184970e-02 3.755510e-02 3.586740e-02 2.806040e-02 1.863980e-02 1.089190e-02 6.011920e-03 3.620020e-03 3.030570e-03 4.009710e-03 6.930880e-03 1.250490e-02 2.084600e-02 3.025130e-02 3.698640e-02 3.676090e-02 2.977500e-02 2.037760e-02 1.214180e-02 6.577180e-03 3.397990e-03 1.719010e-03 8.487110e-04 4.015200e-04 1.792130e-04 7.503260e-05 2.956350e-05 1.106990e-05 3.996200e-06 3.214650e-06 9.036960e-06 2.401670e-05 5.985700e-05 1.392900e-04 3.027330e-04 6.186360e-04 1.204010e-03 2.259570e-03 4.083280e-03 6.936950e-03 1.065690e-02 1.427530e-02 1.628540e-02 1.565900e-02 1.272760e-02 8.896740e-03 5.550010e-03 3.313010e-03 2.155930e-03 1.868510e-03 2.373630e-03 3.799900e-03 6.351240e-03 9.925570e-03 1.367140e-02 1.609440e-02 1.598190e-02 1.339670e-02 9.611400e-03 6.065300e-03 3.499160e-03 1.914070e-03 1.010680e-03 5.132790e-04 2.473110e-04 1.117600e-04 4.713980e-05 1.857940e-05 6.879830e-06 2.415010e-06 2.077150e-06 5.865220e-06 1.549060e-05 3.811650e-05 8.720990e-05 1.856520e-04 3.693370e-04 6.923840e-04 1.233650e-03 2.090270e-03 3.319800e-03 4.811540e-03 6.187320e-03 6.920780e-03 6.677150e-03 5.573970e-03 4.092980e-03 2.737090e-03 1.774930e-03 1.248770e-03 1.117150e-03 1.361770e-03 2.014050e-03 3.105280e-03 4.539020e-03 5.966420e-03 6.853830e-03 6.797410e-03 5.822420e-03 4.358620e-03 2.917610e-03 1.797750e-03 1.044480e-03 5.777790e-04 3.031220e-04 1.494420e-04 6.873170e-05 2.939640e-05 1.169480e-05 4.338840e-06 1.507990e-06 1.328690e-06 3.729570e-06 9.734100e-06 2.358440e-05 5.300310e-05 1.105350e-04 2.144010e-04 3.885550e-04 6.612820e-04 1.058230e-03 1.580880e-03 2.169810e-03 2.684460e-03 2.948850e-03 2.856990e-03 2.450060e-03 1.888660e-03 1.349060e-03 9.422710e-04 7.075930e-04 6.487440e-04 7.644510e-04 1.056380e-03 1.513530e-03 2.076380e-03 2.608430e-03 2.926570e-03 2.899490e-03 2.536450e-03 1.978260e-03 1.399240e-03 9.146610e-04 5.600670e-04 3.225710e-04 1.742090e-04 8.775870e-05 4.107720e-05 1.783620e-05 7.184840e-06 2.687920e-06 9.356900e-07 8.157790e-07 2.267940e-06 5.845320e-06 1.395930e-05 3.087960e-05 6.328330e-05 1.202620e-04 2.123500e-04 3.492310e-04 5.354260e-04 7.628570e-04 1.001900e-03 1.199860e-03 1.298030e-03 1.263300e-03 1.110060e-03 8.919180e-04 6.717000e-04 4.961870e-04 3.903140e-04 3.639270e-04 4.189010e-04 5.510740e-04 7.462630e-04 9.722390e-04 1.174860e-03 1.290890e-03 1.277740e-03 1.138550e-03 9.190900e-04 6.791720e-04 4.641900e-04 2.953280e-04 1.751660e-04 9.669000e-05 4.955020e-05 2.353610e-05 1.035580e-05 4.220970e-06 1.594380e-06 5.584830e-07 4.718280e-07 1.299190e-06 3.311880e-06 7.815290e-06 1.707060e-05 3.451350e-05 6.460590e-05 1.120400e-04 1.801600e-04 2.686920e-04 3.711800e-04 4.732570e-04 5.541000e-04 5.930460e-04 5.793010e-04 5.181290e-04 4.284800e-04 3.342300e-04 2.559350e-04 2.072960e-04 1.953790e-04 2.217560e-04 2.828650e-04 3.692500e-04 4.644830e-04 5.460450e-04 5.907860e-04 5.841530e-04 5.272210e-04 4.356350e-04 3.312070e-04 2.327880e-04 1.516650e-04 9.165000e-05 5.133650e-05 2.663260e-05 1.279050e-05 5.685730e-06 2.339550e-06 8.911690e-07 3.142860e-07 2.545620e-07 6.952420e-07 1.756790e-06 4.107450e-06 8.885920e-06 1.778680e-05 3.294270e-05 5.645700e-05 8.954350e-05 1.314280e-04 1.784120e-04 2.236840e-04 2.585120e-04 2.749640e-04 2.691670e-04 2.432180e-04 2.044540e-04 1.626730e-04 1.271450e-04 1.047650e-04 9.942880e-05 1.120150e-04 1.404210e-04 1.795010e-04 2.212560e-04 2.558940e-04 2.742340e-04 2.708260e-04 2.460880e-04 2.059060e-04 1.589410e-04 1.133880e-04 7.483840e-05 4.571370e-05 2.584060e-05 1.351570e-05 6.540880e-06 2.928900e-06 1.213530e-06 4.652190e-07 1.650010e-07 1.275080e-07 3.459910e-07 8.684110e-07 2.016370e-06 4.331340e-06 8.607530e-06 1.582400e-05 2.690940e-05 4.232640e-05 6.157170e-05 8.281200e-05 1.029300e-04 1.181650e-04 1.252680e-04 1.227250e-04 1.114280e-04 9.441590e-05 7.587940e-05 5.996770e-05 4.991160e-05 4.759510e-05 5.343470e-05 6.636780e-05 8.389370e-05 1.023020e-04 1.172900e-04 1.250240e-04 1.233110e-04 1.123390e-04 9.450830e-05 7.345280e-05 5.276930e-05 3.505580e-05 2.153930e-05 1.224160e-05 6.435880e-06 3.130190e-06 1.408450e-06 5.862910e-07 2.257620e-07 8.040610e-08 5.916530e-08 1.597450e-07 3.989220e-07 9.215250e-07 1.969290e-06 3.893170e-06 7.119870e-06 1.204440e-05 1.884560e-05 2.727080e-05 3.649220e-05 4.515100e-05 5.165240e-05 5.465180e-05 5.354000e-05 4.870050e-05 4.140930e-05 3.344280e-05 2.659080e-05 2.226970e-05 2.131270e-05 2.389800e-05 2.953890e-05 3.711540e-05 4.500030e-05 5.135250e-05 5.456820e-05 5.375210e-05 4.899280e-05 4.129240e-05 3.217800e-05 2.318640e-05 1.545060e-05 9.522350e-06 5.428380e-06 2.862580e-06 1.396460e-06 6.302160e-07 2.631030e-07 1.016000e-07 3.628590e-08 2.540820e-08 6.833980e-08 1.700120e-07 3.912390e-07 8.328950e-07 1.640350e-06 2.988630e-06 5.037190e-06 7.853450e-06 1.132580e-05 1.510780e-05 1.864120e-05 2.127930e-05 2.248370e-05 2.201530e-05 2.003400e-05 1.705810e-05 1.380940e-05 1.101860e-05 9.266470e-06 8.894770e-06 9.973670e-06 1.229720e-05 1.539880e-05 1.860810e-05 2.117530e-05 2.245500e-05 2.209240e-05 2.012820e-05 1.696930e-05 1.323380e-05 9.546310e-06 6.369620e-06 3.931310e-06 2.244550e-06 1.185520e-06 5.792710e-07 2.618480e-07 1.094940e-07 4.235070e-08 1.515050e-08 END_DATAGRID2D END_BLOCK_DATAGRID_2D xcrysden-1.6.2/examples/XSF_Files/ZnS_variable-cell.axsf0000644000175000017500000001435011712736221021637 0ustar tonetoneANIMSTEPS 13 DIM-GROUP 3 5 PRIMVEC 1 2.71000000000 2.71000000000 0.0000000000 2.71000000000 0.0000000000 2.71000000000 0.0000000000 2.71000000000 2.71000000000 CONVVEC 1 5.420000000000 0.0000000000 0.0000000000 0.0000000000 5.420000000000 0.0000000000 0.0000000000 0.0000000000 5.420000000000 PRIMCOORD 1 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.35500000000000000000 -1.35500000000000000000 -1.35500000000000000000 PRIMVEC 2 2.98100000000 2.98100000000 0.0000000000 2.98100000000 0.0000000000 2.98100000000 0.0000000000 2.98100000000 2.98100000000 CONVVEC 2 5.962000000000 0.0000000000 0.0000000000 0.0000000000 5.962000000000 0.0000000000 0.0000000000 0.0000000000 5.962000000000 PRIMCOORD 2 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.59050000000000000000 -1.59050000000000000000 -1.59050000000000000000 PRIMVEC 3 3.25200000000 3.25200000000 0.0000000000 3.25200000000 0.0000000000 3.25200000000 0.0000000000 3.25200000000 3.25200000000 CONVVEC 3 6.504000000000 0.0000000000 0.0000000000 0.0000000000 6.504000000000 0.0000000000 0.0000000000 0.0000000000 6.504000000000 PRIMCOORD 3 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.82600000000000000000 -1.82600000000000000000 -1.82600000000000000000 PRIMVEC 4 3.52300000000 3.52300000000 0.0000000000 3.52300000000 0.0000000000 3.52300000000 0.0000000000 3.52300000000 3.52300000000 CONVVEC 4 7.046000000000 0.0000000000 0.0000000000 0.0000000000 7.046000000000 0.0000000000 0.0000000000 0.0000000000 7.046000000000 PRIMCOORD 4 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 2.06150000000000000000 -2.06150000000000000000 -2.06150000000000000000 PRIMVEC 5 3.25200000000 3.25200000000 0.0000000000 3.25200000000 0.0000000000 3.25200000000 0.0000000000 3.25200000000 3.25200000000 CONVVEC 5 6.504000000000 0.0000000000 0.0000000000 0.0000000000 6.504000000000 0.0000000000 0.0000000000 0.0000000000 6.504000000000 PRIMCOORD 5 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.82600000000000000000 -1.82600000000000000000 -1.82600000000000000000 PRIMVEC 6 2.98100000000 2.98100000000 0.0000000000 2.98100000000 0.0000000000 2.98100000000 0.0000000000 2.98100000000 2.98100000000 CONVVEC 6 5.962000000000 0.0000000000 0.0000000000 0.0000000000 5.962000000000 0.0000000000 0.0000000000 0.0000000000 5.962000000000 PRIMCOORD 6 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.59050000000000000000 -1.59050000000000000000 -1.59050000000000000000 PRIMVEC 7 2.71000000000 2.71000000000 0.0000000000 2.71000000000 0.0000000000 2.71000000000 0.0000000000 2.71000000000 2.71000000000 CONVVEC 7 5.420000000000 0.0000000000 0.0000000000 0.0000000000 5.420000000000 0.0000000000 0.0000000000 0.0000000000 5.420000000000 PRIMCOORD 7 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.35500000000000000000 -1.35500000000000000000 -1.35500000000000000000 PRIMVEC 8 2.43900000000 2.43900000000 0.0000000000 2.43900000000 0.0000000000 2.43900000000 0.0000000000 2.43900000000 2.43900000000 CONVVEC 8 4.878000000000 0.0000000000 0.0000000000 0.0000000000 4.878000000000 0.0000000000 0.0000000000 0.0000000000 4.878000000000 PRIMCOORD 8 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.11950000000000000000 -1.11950000000000000000 -1.11950000000000000000 PRIMVEC 9 2.16800000000 2.16800000000 0.0000000000 2.16800000000 0.0000000000 2.16800000000 0.0000000000 2.16800000000 2.16800000000 CONVVEC 9 4.336000000000 0.0000000000 0.0000000000 0.0000000000 4.336000000000 0.0000000000 0.0000000000 0.0000000000 4.336000000000 PRIMCOORD 9 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 .88400000000000000000 -.88400000000000000000 -.88400000000000000000 PRIMVEC 10 1.89700000000 1.89700000000 0.0000000000 1.89700000000 0.0000000000 1.89700000000 0.0000000000 1.89700000000 1.89700000000 CONVVEC 10 3.794000000000 0.0000000000 0.0000000000 0.0000000000 3.794000000000 0.0000000000 0.0000000000 0.0000000000 3.794000000000 PRIMCOORD 10 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 .64850000000000000000 -.64850000000000000000 -.64850000000000000000 PRIMVEC 11 2.16800000000 2.16800000000 0.0000000000 2.16800000000 0.0000000000 2.16800000000 0.0000000000 2.16800000000 2.16800000000 CONVVEC 11 4.336000000000 0.0000000000 0.0000000000 0.0000000000 4.336000000000 0.0000000000 0.0000000000 0.0000000000 4.336000000000 PRIMCOORD 11 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 .88400000000000000000 -.88400000000000000000 -.88400000000000000000 PRIMVEC 12 2.43900000000 2.43900000000 0.0000000000 2.43900000000 0.0000000000 2.43900000000 0.0000000000 2.43900000000 2.43900000000 CONVVEC 12 4.878000000000 0.0000000000 0.0000000000 0.0000000000 4.878000000000 0.0000000000 0.0000000000 0.0000000000 4.878000000000 PRIMCOORD 12 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.11950000000000000000 -1.11950000000000000000 -1.11950000000000000000 PRIMVEC 13 2.71000000000 2.71000000000 0.0000000000 2.71000000000 0.0000000000 2.71000000000 0.0000000000 2.71000000000 2.71000000000 CONVVEC 13 5.420000000000 0.0000000000 0.0000000000 0.0000000000 5.420000000000 0.0000000000 0.0000000000 0.0000000000 5.420000000000 PRIMCOORD 13 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.35500000000000000000 -1.35500000000000000000 -1.35500000000000000000 xcrysden-1.6.2/examples/XSF_Files/README0000644000175000017500000000565011712736221016343 0ustar tonetoneFor the descriptions of files see file ../README ******************************* Short description of XSF format ******************************* _______________________________________________________________________________ 0.) All coordinates in XSF files are in ANGSTROMS. _______________________________________________________________________________ 1.) All keywords must begin on second column. _______________________________________________________________________________ 2.) For MOLECULES the XSF format is very simple. The first line begins with ATOMS keyword and then one specifies the atomic data like atomic-number, Xcoor, YCoor, Zcoor. Example: ATOMS 6 2.325243 -0.115261 0.031711 1 2.344577 -0.363301 1.077589 9 3.131708 -0.909527 -0.638930 9 2.736189 1.130568 -0.134093 8 1.079338 -0.265162 -0.526351 6 0.007719 -0.041269 0.244204 9 0.064656 1.154700 0.824420 9 -0.042641 -0.911850 1.255074 8 -1.071578 -0.152842 -0.539134 6 -2.310374 0.036537 0.022189 1 -2.267004 0.230694 1.077874 9 -2.890949 1.048938 -0.593940 9 -3.029540 -1.046542 -0.203665 _______________________________________________________________________________ 3.) For CRYSTAL-STRUCTURES the file begin with CRYSTAL or SLAB or POLYMER keyword, depending on the dimensionality of the system (3-crystals, 2-slabs, 1-polymers). Then one needs to specify PRIMVEC/PRIMCOORD keywords and optionally CONVVEC keyword. See example: Example: CRYSTAL see -1> PRIMVEC 0.0000000000 2.7100000000 2.7100000000 see -2> 2.7100000000 0.0000000000 2.7100000000 2.7100000000 2.7100000000 0.0000000000 CONVVEC 5.4200000000 0.0000000000 0.0000000000 see -3> 0.0000000000 5.4200000000 0.0000000000 0.0000000000 0.0000000000 5.4200000000 PRIMCOORD 2 1 see -4> 16 0.0000000000 0.0000000000 0.0000000000 see -5> 30 1.3550000000 -1.3550000000 -1.3550000000 Legend: ------ -1> specify the structure is CRYSTAL (other possibilities are SLAB, POLYMER) -2> specification of PRIMVEC (in ANGSTROMS) like: ax, ay, az (first lattice vector) bx, by, bz (second lattice vector) cx, cy, cz (third lattice vector) -3> specification of CONVEC (see -2>) -4> First number stands for number of atoms in primitive cell (2 in this case). Set the second number always to one !!! -5> Specification of atoms in primitive cell (same as for ATOMS). _______________________________________________________________________________ 4.) Specification of 2D or 3D scalar-field (called as DATAGRID): see file XCRYSDEN WEB page, file XSF.html !!! xcrysden-1.6.2/examples/XSF_Files/vector_field.xsf0000644000175000017500000002437611712736221020660 0ustar tonetoneATOMS 6 0.0000000000 0.0000000000 0.0000000000 8 0.0000000000 0.0000000000 1.2614009982 7 0.0000000000 1.1482466623 -0.6997899990 7 0.0000000000 -1.1482466623 -0.6997899990 1 0.0000000000 2.0265496485 -0.2028169999 1 0.0000000000 -2.0265496485 -0.2028169999 1 0.0000000000 1.1340804828 -1.7049749982 1 0.0000000000 -1.1340804828 -1.7049749982 X 2.000 0.000 2.000 0.010 0.000 0.000 X 1.902 0.618 2.000 0.010 0.003 0.000 X 1.618 1.176 2.000 0.008 0.006 0.000 X 1.176 1.618 2.000 0.006 0.008 0.000 X 0.618 1.902 2.000 0.003 0.010 0.000 X -0.000 2.000 2.000 -0.000 0.010 0.000 X -0.618 1.902 2.000 -0.003 0.010 0.000 X -1.176 1.618 2.000 -0.006 0.008 0.000 X -1.618 1.176 2.000 -0.008 0.006 0.000 X -1.902 0.618 2.000 -0.010 0.003 0.000 X -2.000 -0.000 2.000 -0.010 -0.000 0.000 X -1.902 -0.618 2.000 -0.010 -0.003 0.000 X -1.618 -1.176 2.000 -0.008 -0.006 0.000 X -1.176 -1.618 2.000 -0.006 -0.008 0.000 X -0.618 -1.902 2.000 -0.003 -0.010 0.000 X 0.000 -2.000 2.000 0.000 -0.010 0.000 X 0.618 -1.902 2.000 0.003 -0.010 0.000 X 1.176 -1.618 2.000 0.006 -0.008 0.000 X 1.618 -1.176 2.000 0.008 -0.006 0.000 X 1.902 -0.618 2.000 0.010 -0.003 0.000 X 4.000 0.000 4.000 0.020 0.000 0.000 X 3.804 1.236 4.000 0.019 0.006 0.000 X 3.236 2.351 4.000 0.016 0.012 0.000 X 2.351 3.236 4.000 0.012 0.016 0.000 X 1.236 3.804 4.000 0.006 0.019 0.000 X -0.000 4.000 4.000 -0.000 0.020 0.000 X -1.236 3.804 4.000 -0.006 0.019 0.000 X -2.351 3.236 4.000 -0.012 0.016 0.000 X -3.236 2.351 4.000 -0.016 0.012 0.000 X -3.804 1.236 4.000 -0.019 0.006 0.000 X -4.000 -0.000 4.000 -0.020 -0.000 0.000 X -3.804 -1.236 4.000 -0.019 -0.006 0.000 X -3.236 -2.351 4.000 -0.016 -0.012 0.000 X -2.351 -3.236 4.000 -0.012 -0.016 0.000 X -1.236 -3.804 4.000 -0.006 -0.019 0.000 X 0.000 -4.000 4.000 0.000 -0.020 0.000 X 1.236 -3.804 4.000 0.006 -0.019 0.000 X 2.351 -3.236 4.000 0.012 -0.016 0.000 X 3.236 -2.351 4.000 0.016 -0.012 0.000 X 3.804 -1.236 4.000 0.019 -0.006 0.000 X 6.000 0.000 6.000 0.030 0.000 0.000 X 5.706 1.854 6.000 0.029 0.009 0.000 X 4.854 3.527 6.000 0.024 0.018 0.000 X 3.527 4.854 6.000 0.018 0.024 0.000 X 1.854 5.706 6.000 0.009 0.029 0.000 X -0.000 6.000 6.000 -0.000 0.030 0.000 X -1.854 5.706 6.000 -0.009 0.029 0.000 X -3.527 4.854 6.000 -0.018 0.024 0.000 X -4.854 3.527 6.000 -0.024 0.018 0.000 X -5.706 1.854 6.000 -0.029 0.009 0.000 X -6.000 -0.000 6.000 -0.030 -0.000 0.000 X -5.706 -1.854 6.000 -0.029 -0.009 0.000 X -4.854 -3.527 6.000 -0.024 -0.018 0.000 X -3.527 -4.854 6.000 -0.018 -0.024 0.000 X -1.854 -5.706 6.000 -0.009 -0.029 0.000 X 0.000 -6.000 6.000 0.000 -0.030 0.000 X 1.854 -5.706 6.000 0.009 -0.029 0.000 X 3.527 -4.854 6.000 0.018 -0.024 0.000 X 4.854 -3.527 6.000 0.024 -0.018 0.000 X 5.706 -1.854 6.000 0.029 -0.009 0.000 X 8.000 0.000 8.000 0.040 0.000 0.000 X 7.608 2.472 8.000 0.038 0.012 0.000 X 6.472 4.702 8.000 0.032 0.024 0.000 X 4.702 6.472 8.000 0.024 0.032 0.000 X 2.472 7.608 8.000 0.012 0.038 0.000 X -0.000 8.000 8.000 -0.000 0.040 0.000 X -2.472 7.608 8.000 -0.012 0.038 0.000 X -4.702 6.472 8.000 -0.024 0.032 0.000 X -6.472 4.702 8.000 -0.032 0.024 0.000 X -7.608 2.472 8.000 -0.038 0.012 0.000 X -8.000 -0.000 8.000 -0.040 -0.000 0.000 X -7.608 -2.472 8.000 -0.038 -0.012 0.000 X -6.472 -4.702 8.000 -0.032 -0.024 0.000 X -4.702 -6.472 8.000 -0.024 -0.032 0.000 X -2.472 -7.608 8.000 -0.012 -0.038 0.000 X 0.000 -8.000 8.000 0.000 -0.040 0.000 X 2.472 -7.608 8.000 0.012 -0.038 0.000 X 4.702 -6.472 8.000 0.024 -0.032 0.000 X 6.472 -4.702 8.000 0.032 -0.024 0.000 X 7.608 -2.472 8.000 0.038 -0.012 0.000 X 10.000 0.000 10.000 0.050 0.000 0.000 X 9.511 3.090 10.000 0.048 0.015 0.000 X 8.090 5.878 10.000 0.040 0.029 0.000 X 5.878 8.090 10.000 0.029 0.040 0.000 X 3.090 9.511 10.000 0.015 0.048 0.000 X -0.000 10.000 10.000 -0.000 0.050 0.000 X -3.090 9.511 10.000 -0.015 0.048 0.000 X -5.878 8.090 10.000 -0.029 0.040 0.000 X -8.090 5.878 10.000 -0.040 0.029 0.000 X -9.511 3.090 10.000 -0.048 0.015 0.000 X -10.000 -0.000 10.000 -0.050 -0.000 0.000 X -9.511 -3.090 10.000 -0.048 -0.015 0.000 X -8.090 -5.878 10.000 -0.040 -0.029 0.000 X -5.878 -8.090 10.000 -0.029 -0.040 0.000 X -3.090 -9.511 10.000 -0.015 -0.048 0.000 X 0.000 -10.000 10.000 0.000 -0.050 0.000 X 3.090 -9.511 10.000 0.015 -0.048 0.000 X 5.878 -8.090 10.000 0.029 -0.040 0.000 X 8.090 -5.878 10.000 0.040 -0.029 0.000 X 9.511 -3.090 10.000 0.048 -0.015 0.000 X 12.000 0.000 12.000 0.060 0.000 0.000 X 11.413 3.708 12.000 0.057 0.019 0.000 X 9.708 7.053 12.000 0.049 0.035 0.000 X 7.053 9.708 12.000 0.035 0.049 0.000 X 3.708 11.413 12.000 0.019 0.057 0.000 X -0.000 12.000 12.000 -0.000 0.060 0.000 X -3.708 11.413 12.000 -0.019 0.057 0.000 X -7.053 9.708 12.000 -0.035 0.049 0.000 X -9.708 7.053 12.000 -0.049 0.035 0.000 X -11.413 3.708 12.000 -0.057 0.019 0.000 X -12.000 -0.000 12.000 -0.060 -0.000 0.000 X -11.413 -3.708 12.000 -0.057 -0.019 0.000 X -9.708 -7.053 12.000 -0.049 -0.035 0.000 X -7.053 -9.708 12.000 -0.035 -0.049 0.000 X -3.708 -11.413 12.000 -0.019 -0.057 0.000 X 0.000 -12.000 12.000 0.000 -0.060 0.000 X 3.708 -11.413 12.000 0.019 -0.057 0.000 X 7.053 -9.708 12.000 0.035 -0.049 0.000 X 9.708 -7.053 12.000 0.049 -0.035 0.000 X 11.413 -3.708 12.000 0.057 -0.019 0.000 X 14.000 0.000 14.000 0.070 0.000 0.000 X 13.315 4.326 14.000 0.067 0.022 0.000 X 11.326 8.229 14.000 0.057 0.041 0.000 X 8.229 11.326 14.000 0.041 0.057 0.000 X 4.326 13.315 14.000 0.022 0.067 0.000 X -0.000 14.000 14.000 -0.000 0.070 0.000 X -4.326 13.315 14.000 -0.022 0.067 0.000 X -8.229 11.326 14.000 -0.041 0.057 0.000 X -11.326 8.229 14.000 -0.057 0.041 0.000 X -13.315 4.326 14.000 -0.067 0.022 0.000 X -14.000 -0.000 14.000 -0.070 -0.000 0.000 X -13.315 -4.326 14.000 -0.067 -0.022 0.000 X -11.326 -8.229 14.000 -0.057 -0.041 0.000 X -8.229 -11.326 14.000 -0.041 -0.057 0.000 X -4.326 -13.315 14.000 -0.022 -0.067 0.000 X 0.000 -14.000 14.000 0.000 -0.070 0.000 X 4.326 -13.315 14.000 0.022 -0.067 0.000 X 8.229 -11.326 14.000 0.041 -0.057 0.000 X 11.326 -8.229 14.000 0.057 -0.041 0.000 X 13.315 -4.326 14.000 0.067 -0.022 0.000 X 16.000 0.000 16.000 0.080 0.000 0.000 X 15.217 4.944 16.000 0.076 0.025 0.000 X 12.944 9.405 16.000 0.065 0.047 0.000 X 9.405 12.944 16.000 0.047 0.065 0.000 X 4.944 15.217 16.000 0.025 0.076 0.000 X -0.000 16.000 16.000 -0.000 0.080 0.000 X -4.944 15.217 16.000 -0.025 0.076 0.000 X -9.405 12.944 16.000 -0.047 0.065 0.000 X -12.944 9.405 16.000 -0.065 0.047 0.000 X -15.217 4.944 16.000 -0.076 0.025 0.000 X -16.000 -0.000 16.000 -0.080 -0.000 0.000 X -15.217 -4.944 16.000 -0.076 -0.025 0.000 X -12.944 -9.405 16.000 -0.065 -0.047 0.000 X -9.405 -12.944 16.000 -0.047 -0.065 0.000 X -4.944 -15.217 16.000 -0.025 -0.076 0.000 X 0.000 -16.000 16.000 0.000 -0.080 0.000 X 4.944 -15.217 16.000 0.025 -0.076 0.000 X 9.405 -12.944 16.000 0.047 -0.065 0.000 X 12.944 -9.405 16.000 0.065 -0.047 0.000 X 15.217 -4.944 16.000 0.076 -0.025 0.000 X 18.000 0.000 18.000 0.090 0.000 0.000 X 17.119 5.562 18.000 0.086 0.028 0.000 X 14.562 10.580 18.000 0.073 0.053 0.000 X 10.580 14.562 18.000 0.053 0.073 0.000 X 5.562 17.119 18.000 0.028 0.086 0.000 X -0.000 18.000 18.000 -0.000 0.090 0.000 X -5.562 17.119 18.000 -0.028 0.086 0.000 X -10.580 14.562 18.000 -0.053 0.073 0.000 X -14.562 10.580 18.000 -0.073 0.053 0.000 X -17.119 5.562 18.000 -0.086 0.028 0.000 X -18.000 -0.000 18.000 -0.090 -0.000 0.000 X -17.119 -5.562 18.000 -0.086 -0.028 0.000 X -14.562 -10.580 18.000 -0.073 -0.053 0.000 X -10.580 -14.562 18.000 -0.053 -0.073 0.000 X -5.562 -17.119 18.000 -0.028 -0.086 0.000 X 0.000 -18.000 18.000 0.000 -0.090 0.000 X 5.562 -17.119 18.000 0.028 -0.086 0.000 X 10.580 -14.562 18.000 0.053 -0.073 0.000 X 14.562 -10.580 18.000 0.073 -0.053 0.000 X 17.119 -5.562 18.000 0.086 -0.028 0.000 X 20.000 0.000 20.000 0.100 0.000 0.000 X 19.021 6.180 20.000 0.095 0.031 0.000 X 16.180 11.756 20.000 0.081 0.059 0.000 X 11.756 16.180 20.000 0.059 0.081 0.000 X 6.180 19.021 20.000 0.031 0.095 0.000 X -0.000 20.000 20.000 -0.000 0.100 0.000 X -6.180 19.021 20.000 -0.031 0.095 0.000 X -11.756 16.180 20.000 -0.059 0.081 0.000 X -16.180 11.756 20.000 -0.081 0.059 0.000 X -19.021 6.180 20.000 -0.095 0.031 0.000 X -20.000 -0.000 20.000 -0.100 -0.000 0.000 X -19.021 -6.180 20.000 -0.095 -0.031 0.000 X -16.180 -11.756 20.000 -0.081 -0.059 0.000 X -11.756 -16.180 20.000 -0.059 -0.081 0.000 X -6.180 -19.021 20.000 -0.031 -0.095 0.000 X 0.000 -20.000 20.000 0.000 -0.100 0.000 X 6.180 -19.021 20.000 0.031 -0.095 0.000 X 11.756 -16.180 20.000 0.059 -0.081 0.000 X 16.180 -11.756 20.000 0.081 -0.059 0.000 X 19.021 -6.180 20.000 0.095 -0.031 0.000 xcrysden-1.6.2/examples/XSF_Files/ZnS.xsf0000644000175000017500000000071211712736221016711 0ustar tonetone DIM-GROUP 3 5 PRIMVEC 2.7100000000 2.7100000000 0.0000000000 2.7100000000 0.0000000000 2.7100000000 0.0000000000 2.7100000000 2.7100000000 CONVVEC 5.4200000000 0.0000000000 0.0000000000 0.0000000000 5.4200000000 0.0000000000 0.0000000000 0.0000000000 5.4200000000 PRIMCOORD 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.3550000000 -1.3550000000 -1.3550000000 xcrysden-1.6.2/examples/XSF_Files/bucky.xsf0000644000175000017500000000422211712736221017314 0ustar tonetoneATOMS 6 1.22650000 0.00000000 3.31450000 6 0.37900000 1.16640000 3.31450000 6 -0.99220000 0.72090000 3.31450000 6 -0.99220000 -0.72090000 3.31450000 6 0.37900000 -1.16640000 3.31450000 6 3.40840000 0.72090000 0.59480000 6 2.79510000 1.16640000 1.82130000 6 2.41610000 0.00000000 2.57930000 6 2.79510000 -1.16640000 1.82130000 6 3.40840000 -0.72090000 0.59480000 6 0.36760000 3.46430000 0.59480000 6 -0.24560000 3.01880000 1.82130000 6 0.74660000 2.29790000 2.57930000 6 1.97310000 2.29790000 1.82130000 6 1.73890000 3.01880000 0.59480000 6 -3.18120000 1.42020000 0.59480000 6 -2.94690000 0.69930000 1.82130000 6 -1.95470000 1.42020000 2.57930000 6 -1.57570000 2.58660000 1.82130000 6 -2.33370000 2.58660000 0.59480000 6 -2.33370000 -2.58660000 0.59480000 6 -1.57570000 -2.58660000 1.82130000 6 -1.95470000 -1.42020000 2.57930000 6 -2.94690000 -0.69930000 1.82130000 6 -3.18120000 -1.42020000 0.59480000 6 1.73890000 -3.01880000 0.59480000 6 1.97310000 -2.29790000 1.82130000 6 0.74660000 -2.29790000 2.57930000 6 -0.24560000 -3.01880000 1.82130000 6 0.36760000 -3.46430000 0.59480000 6 0.99220000 0.72090000 -3.31450000 6 -0.37900000 1.16640000 -3.31450000 6 -1.22650000 0.00000000 -3.31450000 6 -0.37900000 -1.16640000 -3.31450000 6 0.99220000 -0.72090000 -3.31450000 6 2.33370000 2.58660000 -0.59480000 6 1.57570000 2.58660000 -1.82130000 6 1.95470000 1.42020000 -2.57930000 6 2.94690000 0.69930000 -1.82130000 6 3.18120000 1.42020000 -0.59480000 6 -1.73890000 3.01880000 -0.59480000 6 -1.97310000 2.29790000 -1.82130000 6 -0.74660000 2.29790000 -2.57930000 6 0.24560000 3.01880000 -1.82130000 6 -0.36760000 3.46430000 -0.59480000 6 -3.40840000 -0.72090000 -0.59480000 6 -2.79510000 -1.16640000 -1.82130000 6 -2.41610000 0.00000000 -2.57930000 6 -2.79510000 1.16640000 -1.82130000 6 -3.40840000 0.72090000 -0.59480000 6 -0.36760000 -3.46430000 -0.59480000 6 0.24560000 -3.01880000 -1.82130000 6 -0.74660000 -2.29790000 -2.57930000 6 -1.97310000 -2.29790000 -1.82130000 6 -1.73890000 -3.01880000 -0.59480000 6 3.18120000 -1.42020000 -0.59480000 6 2.94690000 -0.69930000 -1.82130000 6 1.95470000 -1.42020000 -2.57930000 6 1.57570000 -2.58660000 -1.82130000 6 2.33370000 -2.58660000 -0.59480000 xcrysden-1.6.2/examples/XSF_Files/zro2cluster.xsf0000644000175000017500000000355111712736221020501 0ustar tonetone ATOMS 8 1.2750000000 1.2750000000 1.2750000000 40 .0000000000 .0000000000 .0000000000 40 .0000000000 2.5500000000 2.5500000000 40 2.5500000000 .0000000000 2.5500000000 40 2.5500000000 2.5500000000 .0000000000 8 -1.2750000000 1.2750000000 1.2750000000 8 1.2750000000 -1.2750000000 1.2750000000 8 1.2750000000 1.2750000000 -1.2750000000 8 1.2750000000 1.2750000000 3.8250000000 8 1.2750000000 3.8250000000 1.2750000000 8 3.8250000000 1.2750000000 1.2750000000 8 1.2750000000 -1.2750000000 -1.2750000000 8 -1.2750000000 -1.2750000000 1.2750000000 8 -1.2750000000 1.2750000000 -1.2750000000 8 3.8250000000 -1.2750000000 1.2750000000 8 3.8250000000 1.2750000000 -1.2750000000 8 1.2750000000 -1.2750000000 3.8250000000 8 1.2750000000 3.8250000000 -1.2750000000 8 -1.2750000000 1.2750000000 3.8250000000 8 -1.2750000000 3.8250000000 1.2750000000 8 3.8250000000 1.2750000000 3.8250000000 8 3.8250000000 3.8250000000 1.2750000000 8 1.2750000000 3.8250000000 3.8250000000 40 2.5500000000 .0000000000 -2.5500000000 40 -2.5500000000 .0000000000 2.5500000000 40 2.5500000000 -2.5500000000 .0000000000 40 -2.5500000000 2.5500000000 .0000000000 40 .0000000000 2.5500000000 -2.5500000000 40 .0000000000 -2.5500000000 2.5500000000 40 .0000000000 .0000000000 5.1000000000 40 .0000000000 5.1000000000 .0000000000 40 5.1000000000 .0000000000 .0000000000 40 2.5500000000 2.5500000000 5.1000000000 40 2.5500000000 5.1000000000 2.5500000000 40 5.1000000000 2.5500000000 2.5500000000 xcrysden-1.6.2/examples/XSF_Files/GaAsH.xsf0000644000175000017500000000170311712736221017123 0ustar tonetone SLAB PRIMVEC 5.5246078800 0.0000000000 0.0000000000 0.0000000000 3.9064878040 0.0000000000 0.0000000000 0.0000000000 19.5324384880 PRIMCOORD 14 1 31 0.3031580950 0.0000000000 -0.3114762280 31 2.6436116560 1.9532436370 -1.8580462820 31 -0.0518106620 0.0000000000 -3.8817233780 31 2.7623039400 1.9532436370 -5.8597314410 31 0.0000000000 0.0000000000 -7.8129756070 31 2.7623039400 1.9532436370 -9.7662192440 33 1.4763662580 1.9532436370 0.3364242780 33 4.0486178660 3.9064878040 -1.9045164900 33 1.3477148630 1.9532436370 -3.8838141570 33 4.1434559100 3.9064878040 -5.8597314410 33 1.3811519700 1.9532436370 -7.8129756070 33 4.1434559100 3.9064878040 -9.7662192440 1 1.8326336150 1.9532436370 -11.0071551850 1 5.0841632790 3.9064878040 -11.0254911680 xcrysden-1.6.2/examples/CRYSTALxx_input_files/0000755000175000017500000000000013556022211017770 5ustar tonetonexcrysden-1.6.2/examples/CRYSTALxx_input_files/cuprite.r10000644000175000017500000000012111712736221021706 0ustar tonetonecuprite CRYSTAL 0 0 0 208 4.27 2.96 2 8 0.0 .0 .0 29 .25 .25 .25 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/chabazite.r10000644000175000017500000000023311712736221022171 0ustar tonetonechabazite CRYSTAL 0 1 0 166 9.42 94.47 5 14 .1045 .334 .8755 8 .262 -.262 .0 8 .1580 -.1580 .5000 8 .2520 .2520 .8970 8 0.0250 .0250 .3210 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/polymer.r10000644000175000017500000000041611712736221021731 0ustar tonetonesample-polymer POLYMER 1 2.4402 6 6 0.5 0.721900 0. 6 0.5 -0.721900 0. 6 0.000000 1.399308 0. 6 0.000000 -1.399308 0. 1 0.000000 -2.498460 0. 1 0.000000 2.498460 0. SUPERCELL 3. COORPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/graphite.r10000644000175000017500000000017311712736221022045 0ustar tonetoneInputFile by XCrystal 1.0 CRYSTAL 0 0 0 194 2.46 6.70 2 6 0.0 0.0 0.0 6 0.333333333333 0.666666666667 0.25 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/corundum.r10000644000175000017500000000016011712736221022072 0ustar tonetoneInputFile by XCrystal 1.0 CRYSTAL 0 0 0 167 4.7602 12.9933 2 13 0. 0. 0.35216 8 0.30624 0. 0.25 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/calcite.r10000644000175000017500000000017011712736221021643 0ustar tonetoneInputFile by XCrystal 1.0 CRYSTAL 0 1 0 167 6.36 46.833 3 20 0.0 0.0 0.0 6 .25 .25 .25 8 0.007 .493 .25 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/urea.r10000644000175000017500000000036411712736221021200 0ustar tonetoneTEST12 - UREA BULK BASE 6-21** CRYSTAL 0 0 0 113 5.565 4.684 5 6 0.0 0.5 0.326 8 0.0 0.5 0.5953 7 0.1459 0.6459 0.1766 1 0.2575 0.7575 0.2827 1 0.1441 0.6441 -0.0380 EXTPRT END xcrysden-1.6.2/examples/CRYSTALxx_input_files/mgo.r10000644000175000017500000000014311712736221021021 0ustar tonetoneTEST11 - MGO BULK CRYSTAL 0 0 0 225 4.21 2 12 0. 0. 0. 8 0.5 0.5 0.5 EXTPRT STOP END xcrysden-1.6.2/examples/CRYSTALxx_input_files/pyrite.r10000644000175000017500000000012211712736221021550 0ustar tonetonepyrite CRYSTAL 0 0 0 205 5.40 2 26 0.0 0.0 0.0 16 .386 .386 .386 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/cluster.r10000644000175000017500000000022111712736221021715 0ustar tonetoneZrO2 - CUBIC STRUCTURE CRYSTAL 0 0 0 225 5.10 3 40 0.00 0.0 0.0 8 0.25 .25 .25 8 -.25 -.25 -.25 CLUSTER 0.0 0.0 0.0 6 2.5 0 0 0 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/rutile.r10000644000175000017500000000012111712736221021537 0ustar tonetonerutile CRYSTAL 0 0 0 136 4.59 2.96 2 22 0.0 .0 .0 8 .305 .305 .0 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/Pt322.r10000644000175000017500000000015111712736221021050 0ustar tonetoneInputFile by XCrystal 1.0 CRYSTAL 1 0 0 F M 3 M 3.92 1 78 0.0 0.0 0.0 SLAB 3 2 2 1 10 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/ZnS.r10000644000175000017500000000012611712736221020752 0ustar tonetoneZinc Blende CRYSTAL 0 0 0 216 5.42 2.96 2 16 0.0 .0 .0 30 .25 .25 .25 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/Pt_fcc.r10000644000175000017500000000013111712736221021432 0ustar tonetoneInputFile by XCrystal 1.0 CRYSTAL 1 0 0 F M 3 M 3.92 1 78 0.0 0.0 0.0 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/zro2.r10000644000175000017500000000016111712736221021133 0ustar tonetoneZrO2 - CUBIC STRUCTURE CRYSTAL 0 0 0 225 5.10 3 40 0.00 0.0 0.0 8 0.25 .25 .25 8 -.25 -.25 -.25 EXTPRT STOP xcrysden-1.6.2/examples/CRYSTALxx_input_files/argonite.r10000644000175000017500000000022511712736221022050 0ustar tonetoneargonite CRYSTAL 1 0 0 P M C N 4.9616 7.9705 5.7394 4 20 0.25 0.4151 0.2103 6 .25 .7627 0.085 8 0.25 0.9231 0.0952 8 .4729 .6801 .087 EXTPRT STOP xcrysden-1.6.2/examples/README0000644000175000017500000000652211712741613014561 0ustar tonetoneIn this directories are the example files that one can use to explore the capabilities of XCrySDen program. The structure of this directory is as follows: =========================================================================== Subdirectory Explanation --------------------------------------------------------------------------- ./CRYSTALxx_input_files/ CRYSTAL95/98 input files ./FHI98MD_files/ FHI98MD coord.out and inp.ini files ./FermiSurface/ Band XSF file for Fermi surface visualization ./GAUSSIAN_files/ Gaussian98 Input, Output, and Cube files ./PDB/ PDB formated structure files ./PWSCF_files/ PWSCF input and output files ./Scripting/ XCRYSDEN's scripting examples ./WIEN_struct_files/ WIEN struct files ./XYZ/ XYZ formated structure files ./XSF_Files/ XSF (i.e. XCrySDen's Structure File) formated files =========================================================================== Here is "ls -R" listing of files (with some explanation for XSF): ./CRYSTALxx_input_files: Pt322.r1 Pt_fcc.r1 ZnS.r1 argonite.r1 calcite.r1 chabazite.r1 cluster.r1 corundum.r1 cuprite.r1 graphite.r1 mgo.r1 polymer.r1 pyrite.r1 rutile.r1 urea.r1 zro2.r1 ./FHI98MD_files: GaAsSurface_coord.out GaAsSurface_inp.ini GaAs_inp.ini ./FermiSurface: RhBulkFcc.bxsf.gz MgB2.bxsf.gz ./GAUSSIAN_files: N2O_homo+lumo.cube.gz benzene-6CH3-OCH3.g98 benzene.g98_out ./PDB: bucky.pdb cluster.pdb mol2.pdb ./PWSCF_files: EthAl001-2x2.inp EthAl001-2x2.out ./Scripting: ZnS_molsurf.xcrysden animation.tcl atomic_labels.tcl build_crystal.tcl colorplane_animation.tcl contours.tcl g98cube.tcl isosurface+colorplane+print.tcl movie.tcl multiScript.tcl ./WIEN_struct_files: a-quartz.struct al2o3.struct b12.struct bi.struct cab6.struct cd16te15sb.struct cd8te7sb.struct coo.struct cos2.struct cr2o3.struct crb2.struct fe2p.struct fe4n.struct fecl2.struct fef2.struct ferrocen.struct gaas.struct in2o3.struct mos2.struct pt.struct si111.struct tellur.struct ybco7.struct yfe2.struct ./XYZ: anim.xyz bucky.xyz mol1.xyz mol2.xyz ./Xcrysden_Structure_Files: 1.xsf ... MOLECULAR #1 structure 1symb.xsf 2.xsf ... MOLECULAR #2 structure ANIM.axsf.gz ... XSF animation file + forces ANIMsymb.axsf CO_homo.xsf.gz ... CO molecule + HOMO orbital CO_lumo.xsf.gz ... CO molecule + LUMO orbital GaAsH.xsf ... H adsorbed on GaAs surface README ... explanation of XSF file format ZnS.xsf ... ZnS.xsf fcc CRYSTAL structure ZnS_variable-cell.axsf ... XSF variable-cell animation file (stupid example) bucky.xsf ... bucky-ball structure c2h4:Ag001.xsf ... ethylene adsorbed on Ag(001) (superslab model) fcc-410-1x1.xsf ... an fcc-(410) surface mol-urea.xsf.gz ... urea molecule + 3D CHARGE DENSITY mol-urea2D.xsf ... urea molecule + 2D CHARGE DENSITY oxirane_homo.xsf.gz ... oxirane molecule + HOMO ORBITAL zro2cluster.xsf ... ZrO_2 cluster vector_field.xsf ... small molecule + vector field **** NOTE: to view charge density (molecular orbitals) for a few *.xsf examples load the file and go to "Tools->(Data Grid) menu. xcrysden-1.6.2/examples/Orca_files/0000755000175000017500000000000013531257210015736 5ustar tonetonexcrysden-1.6.2/examples/Orca_files/pbe.accOpt.AsF2-C2C2.out.gz0000644000175000017500000054045013531251510022252 0ustar tonetone‹HSe]pbe.accOpt.AsF2-C2C2.outìZ[sÛHz}Ž~EOM%±§Hªo¸)µ®¢©‹9¶.5öd_R ŠˆH€@ÛråÇçtMt“ Ç»ë쾄eKÕ}ú»œïÖÐÏ?ÿLî7Y–fO$ÏÈ"/«3²Ž‹’E'?ãw£x9Ý,ã*ͳ’í‡ë»óñý9­’Õú´Ê³ä4/¦qýeý˜ âéôv] †å%ïøˆŸœœ?zý²ûúŽ-ä_ïñ„ÿCò=[öN±÷ôû}2ÌÈ𑌳j÷Èù剳™$«ʦE:—$Y&ӪȳtJʪØL«M‘ÀpÓçø)Q ]êþü×½º)ׇ>ýC¿<€tžÀáÕ*É*’ÏÉ*‡fpyAªE’/Z÷r­µ-§ùúå’ý:O ìÉ‹r‘®ÏÈegÏä&IÊä{dºŽ¿’»eœMŸá†²J«M•y^Ñ^Pö¿È’âé…ŒòìsR” ç÷ȤåêKO”\o’å"IW§÷›Eñ]vê|]%Å*Î^üö/òÝÑ×w" —KR¤O‹ Ñ [Ÿ“Ùß$Ó_Χ¿’ãGÒÃ]‘?ñŠ|l-t HŸÜ_|¸N.””jû§´ZižUEú¸©Ö¼ÈWäUš‘x¹^ÄI…hÍ‹YR¼>SÇýR½M¦Ï‰ëÿ3rñr™,Óo:ó©µç«yûòœvÖNF—ä]R–iܬK+Í8±õ³vÝ:Íú·ÅcZõô[õ¥w?eZªyš,gäú~4V ÃlV$qIÞÅY™döaØD6\ -§œ;Í7ë%¾¯ã´85?L—›²‚V«¤Zä³RË•*ÁÒ¼$Òøß äÅתˆ×yãI9E€%å¿© M@®Ïk™îóǤ¨Èø[?;¸E.ã5T¨”@÷ã_G·“ß{D}íOF“þõP£E‘"”㌼ϗËU\€÷çãñ¤GnoGç=ò¶ØÀ#îþh49õð@xCfIV¦Õ‹š¤+Ô ”%B/k%¹Nª˜\] É|“M•:ñ²ì‘‡ó¾Já Ð,EŽS]ßñÁÛqP¸$wIU$Ùsné§67ëz{XÃÉP'ȋљs¶Y&81Ë‘–ê翌—/eŠOï“eÓ„ÜÇ{ßBëË=òûprúû~¸¹ÿ8iM•¯Ø”¶:ÂYó9’jú9AâC½¹Ë+H‘BMµë:.bxì>‡ —U«Á}K—| >•‹ib4Þ=+]/QÞëh8#ãÕºÈ?ë=Èó-)`Ë )“¸I Ð¿_Ÿ^_£>~¸»¹ÕÞRpoãâ–$Xe‘'ó&¶`Æ÷ïÈ:­ë$äÄ9$ÑÚhÙÇOHî|ŽúÚ_ùt[Žf/YŒÜ¯—¿³j›G°i’~Ž•ÜÈgd4œ¨€œê²ð”ÀÚ°êÅÇ»®…Ë¡+ù”|KËelŸr±LTý‹¹åË aƒ7q¦pÕÆº|}J²l•/JkãC2]dº ͬz§ÓQ¢hR%óÍr‰" Nç_›P»L vLIü´IJòe‘ã<¸1—Í7%©ò’fãy¬´ˆgñºÀ¯T£Q ãZ£F§fI©SÚÂ&WE -zäÓ€¼Ûüš˜wò¾ÀN¸pG—°Ž8#gŸ°»P¢«ŒÙÉ©"”òtãwzÜWí¿T¨8¡ø4ºS83ò1^&Éç?D¨ü!}£9yÅû`·2É“2_Ól!A\2n§º«¸@R±UMd¦¬bà€Ü.AdOþüúþJ—ƒåœ\<#TP4¾G¬ßG—›L+  p§Â].ãC] ²*¦SB^Ū0(Œº>霂j02z½¶ËÂûe¼Bî1ñ~ž&ÈŽ‹|n• Wy¾üÏi^®rò éøú–”ùòséUvZ¾¶Éc¹×.싌°ÊxsWç¾›··Û4÷ÚI)Päסx7*+"ÌÈÕ€<›ÅR×€3R®f»‚©ú|j·ˆb~©O–é#hÀÕwm3ժϧùj½©êŇ/ Æ%–MÓª™fP)c„R¡sT•Ÿ‘EU­ÏNOkð’Jò’|€JåaÄq{,ß´›¥–FÇÜèí‡áß·Á •Èe\VX«2ù²Š‘€¿ªì[Ô§«}†wÃÑû‹Ž}H;ȲHO $EŽ~&Kô¦ÉhXïÛØdú•ƒON´øw~q9üíÃCÿíp2žô%y„ fj¢Sö.–¨HpøkËÉy”¢KB×ñ¢¼±Ž¡ÁÙÉ;t_ï‹32蜭,¨SÌ»¼È´Ÿj«§)€®b@î/å€DAp/`ä‹"þz ´:9Ùwv•¢ÿj®å9Ûböþüñï Œ– ñ˜su^c“/)Jç#(˜Ç³dÖ)ù§Ë 'ÄɬçžXTjÍ)õzç ƒcÖ@§6 ó©in•q6Åc®ê¤‰‡N©lÿ¾â³_¿VhqѤømª†’ ŠtþXŠϬ㠓-?¶!¸ÉTÚšWëê Ód°ÉÒþs\,Kz2˜%§ëÍã©b[öÿÎþ»;›ÏŸzbÍgó”Ë'ÓþŸ³3Â×Ö‘úOñtôW’_Gw=âq倢¨3*„i:Ö˜gˆêùç}³ý˜ENþôƒ_ßÝü|Þߌo®&‡6ÜÕ5§¬6³%<ÞA·‚.³T…å4(êŽñ§¯ÄMþ…Ì0«MK"Õgü A2RïÄò“ÚN*u%4™ÂU§þY½Yè>4Ôzù†¨oÞò ùúò0ÂÔÏþ(:ÔMsŸ ‘GÕtNýH}N ŸS-@ Ö_’f½ôeˆ<«×Kù^Ï”…žÔëCg=óC!ÌzéÑ«÷l /p_­ÔúQ½žÂ(b«eðXRQï¥/ŠõŒªõ7õz1`\RNë³¼ ýF—ÐçŒÔzæà3(ñæ}Äý04òD"j=Wëß™õ^àZ_u–/¥ðÔ/° -pÖSáAØÈ#|NÃz½ïKêj½´Ö³§žOi½W/<‚†Södž%¿HP×{!2\`|Tãû¾„<’ž×ØVø(5>>ÆYj}`á{J~¨f|‡5¢áƒërµ>´ðýõhÀd³^r4üñðžéõ‘å/9 $mÖp_°H6ëA¡ìÏ©£¯BRãSŠ ‘Íã"Ô|ãÌ’G ¼È“AÙƒ”¢±-ç4òÔzÛ¿ð#î…õz? à hl+çZáØ“G¡WsRs˜×¾¦ð‹˜²'—­üÀä ”>Gá6÷x¤ýŽÖ>Xï%Ìè‹û¢~¯¬ì){rß²bJøQ½^ñÙÆ×ÎÐþâ%?âHð0¢ Ÿ‚¼Ù+¨iñÐYïù`e#\†Íú0”¯â‹GŸ%S'>s*" ‚éx–aÃP A Ÿ%ã^cO!ÍaùqÄ™Y£ù°Æ_ÈJa¨ì/¸…Ï’úç>à ÷(Bêõ–‰€üÐL>ƒe^턲 ŠBZþb*§ù7|ö|Æ›õ¡/}•ß„çè‹ ÝæÏ‡šxç£Ö[ñK” ¾á?̵^R*ŸEàØGqXø Ÿ‘¡ê½8’*ÿ Ë¿øÜ_sFóY~³7¹/õzø÷|—T—ÉêoÚÊ^ê1ÜÅÍ9¹½¬ ª~,÷Ãë顚¾÷Dð{žAþÒÝ#©§©‡ŸB?éd‹h_½©Î¬RâÙÉoëYŒf¿¾²q›_2À‹¼½D:ZäéT·LÓÇËM\™™ÇÜo/v¹]C€ÓKº{ïN íìÕ;¶/ÑlyÛo®þÈÞŽA÷Ž«?ÜqžÆOê5ýv|O»c²Šaz}I¡4Jê© £… AU,>¼$øAx| zC/À~x Êãz‰¢Å<-ʪ~>––»ŠÚÒc–ôŽl³zL •ÍfÉS‘$úáÇofíe}³=¹ƒ¿Â]bíçË:¡6„ýáGŸ'sMÙ<ë’ÆdêÚØx ׿’¿8ý÷•…¡®¼RCë©Q¾Þ—FõÀu÷ _hi0)êñ°ÁàƒÅÐr‹Ôívƒ!†jŽÄA ô²¼îP ©ž·Å C5d²§‘:å^X˜CfaxF¯§‘:1¤úf/®GÃWª±òµ^'¤cO„\¶ÁŽcCÆ-Fh0Âãž‹Qª Fdì±Dç†x¡ÅF9ÕrDÝr„BÚrø¥­Mkä`ì†@«maø¡+7rðžF:$‡cSÈ¡GÁC4câ†õä¼µGHó[ é`äidËá«.ÜÒÅð”ÉžFêæ)ÆR C2i§Å0;< ëG †0ÞŒ:µ‘­‹á©±D'FódhkŽIʲ©×%‡“?˜zâïÄœ´æ}ßï’c/ù“×9Ú1 #èÂðvtÒõ-0¬9Ê F3¿ìuvºF §f£FQ+æüÈ©•]¨·˜«m9$¢°åz@;0œÎ_Õ[Z?‘Ýb0Ô概 OÍî½®½®sÎꜴqðÃÌbûªÞòÐ9)Ö§è’ƒîÔJ´pŽ. Ų‡l8ff±žž©vë‹m¿¨úYºžš™°#RÏ•w0¸sïðãF$œùVר¶îA—|·fs¹«‹5Ga—|W—ˆ»q€ì-FÔ…±[ç"ºñxA›?BS÷Í\¹7‘5yÝÁ@^·æÛ¹rt`¨z˘Û aå ïbh™öê­kÔ[aa˜|jfÓŽ¸Õ—õNÿáÖÊÐô§F‹Žü(9vk¥5…Þ.†–iϦžs¾Ó[†¦?5ìMu*nîòT…KË0pâ¶¹°y¿Åa,›†]þ~Ú©•Ô³l5~1ómOÏ©»µRFnÖ‰­Æˆ O݉͜º9HÕJÑöڑᩱD'†¿3‹¡VZ÷cï’ƒíÖÊÈwkv$£6^"Ñ%Ç^ܺw#´î¶"Ù…Awk%õÜÙìù6OÏynwRî ^JÚ”rî·99ò skaÔõÑ:²úzðFp£–ƒ ý˜Óìb„‡ua ÇŒ“#ê–c;±÷Æy_z‡å`”vËaMýµ8wzí] ¦0vgdç™Pßxõ_Rm1Ðá¶yÿÁˆ`°@ý] Ž`ˆn {z@°‡4<‚!»uÙbôJrèÞõíbhžÚ³éÎÔß×wJõ_6m1˜ŒÚ˜SMßAŒF´9êbîF`0Ân9 ’¯þ.ïFx£–£/}5ï{G0"ƒáC=’?bFc4~ÁX #?<‚axjžGíݤ0´J”»öà¾×ö§Œý/{ûÇä £ßùWtÄÆÆ•vÝ=…wÀ÷î )JÖYYÒCjfÿûÍ_⵪Pd[öž‰13V³ ȉ|C"S.ÃH낸>3â§S*Í¥ØÙSÂA¾˜‡`èeI Y«tãý2aFü£Ì¨xÖ‡–bÄ?”dƒSÛ‡Ñzëˆ葟 #ÓiñÌ=p†yò†ïÃ(ãà¹8!Ý0BÞû#;»zFð£3¾p,ŠM(äЇÑzüÂ0 ê¯Zî^qéTŒq*_ÇB§} S%G~Ë) Õ‡Qx2áƒìJi‡îÌ¥ÅÇsQnä—šâÃôñÑž𠩏ÍÅöÇÑz…$â˜åã(tšÎ4¹8— Õúè0TâAùlmz ³Šôd5ÌtQaè>ŒF·4D§ƒéc ³ CTy«G>é)ŒÂOC.ì¶ÖÞ¸`¸>ŒV?%œ#ûe Ã/ÃHz2-Ý åL·l`d~šÏ‘;Þ©ac&²’t©z–¶ c¬:%¦ºe #óÓÖ§ÔŽƒyù2†!û0Z—xòDçŸÀÈr?ŸÍÏ<\X:2M§úXµ+…Ö‹0’¾¾Ö¤™éžÁÈúiñmMÆÁú©6#ßç†]„‘í§©Ó0ÕÇZ™Ÿ¿ÔÌãGªÇLaøEÙ²šöœŸê–-ŒB§)Î`æ5d5ö9B—òumͰ#ã÷1äÈ_8…‘ùiñmͼ—k¹!Kã!rFtÂÉTÇmaŒùi™Qñp±¤ÜL—ª¾-atFëU†£áA…N]܉D´}†íÃ(ãà¹X­¦ºe ÃÕµq÷¢Yë&|ÌÕóa|†Z¿ÔÈÓFkë'ëB““FèÃhö-Ù¦$*Ý2 ›étìkÆÁ:nf:nCôa4ûŒ}h²3—Ñ©æbÔ0Ñ-[œZÕ‡1Ö ¥žÚê#º¿¶ BOvÖ?#ÓiŽe™yÙ?¦õ„™ÿ!¬]„‘ùºõ•ÁÈü´ø-§ã ÆûE>Ã/Â(üƒôd1ÆéFÖO‹Ïq2Ž5TG3öãN`¸aFñK‰MrÆo¶>x]BÝÏî®?-…ǧpw¥šöË¡ñ¥=ͱ¹õàu¤Ç> ˜éÐ^¿ùîøÝÉ_&7Nþrô ÷}DÛô_~¯Ñ<ŽÙ£Ã“wǧ/Û»/§«'‡¯_œ¾;ysüÝÓ=`ìzÿÐûß}ÞÿÖóþ÷÷¿é¼ÿçýo7ï¯yÿÍûßeÞÿóþ÷—÷¿¹¼ÿåýo+ïOyÿÊûßMÞÿVòþ÷‘÷¿‰¼ÿäýoïïxÿÇûß5Þÿ–ñþ÷‹÷¿Y¼ÿâýoïøAf¼ÈË7Ü<ÌÆ©7«WßÄQüõÿ}~røÿ~wxzºJŸïWõó—æû_!¯†(T¼@ÊÃÆÈølíyZ}M ¶FŒŒYÕ9ÝV‡‘$.ˆÙU­«FmrÂŽñ‚—Œdf”aüFá‰}ûFR‰‘‚@Üæ8pU´àÊi2.ßµ—"ÚÖš¶q ^7Ê}ßHÐKCdè1Ñ¡}£§ÝE "S.ñóøQ’ÞÓËŒÁìA+•(ÓNÞVPuâlÚ‘€ ªmAѤLhsØ?’‘“+"©-È{¥Ó®q“7ënÎ0èdš{—Ê’kíhúÄ; Ù’ðF¨¯žP8íL’cJ+Ñ,¾Wf¿9j޼īH•¡ JÅ#·$ÇÉþ#^ÙÄX€K xcpÎrþ$›vœ¿‘ÿö-Xo3´º4ìv‰ ÌÒ6HÍ é34'îôFZ;%&2'¬`åö{#QvƒEü&ɬÆXÔÅ…¶=o(’Z+åiî4"ÏLrå÷{#Ñ*HUy2 Ñv„pMâ¡-\sš.M"‘ÄÁ«ÎǬTa¿uô´ÍIøÄ…ÚgšCqš>éPÙ×~j»Ì!¦UJ b 1ì7Ç@úž%‰¤¤¥•²f´Ž¸êA;†gªáT˜£†4~Фµ°Ð§yì5GD“±‘vc-ζ&ÌAÐ"’0#1(ì[b|ô”t"*ñM’j9®É8(}Äq4‰ј–P!ˆÑ’Ò¦0Û°#èRKƒU {”±ªöãŽd%Í’¶:±ÚÍI Ä«µ¡-@Zˆ½Q@n ù­Çî ÍqOÊ_%¸¢Z|3–ؘ¥©6ž9è.XD| DÆDx£Ùr, û2¤õ‘áÑ ã†d‡ç®½Hwõ^g$~¾ Ù!öâ9ð  ·8 ÖÅŽ·YTÞbëЄ|õ ­qg=hÚÇ„‰Ýƒ7îÉs8Ê&±R͇ó¤Q(‹×I¼µÙª¤û9ÂŒRÐÐp] oô{­#4aBXØ×*XH+ÒàÝ€õ"åR·´#¥Y#˜xƒäÝö¢Uhk†T ­$©Š#…$ Ùƒ£‰…¾M:Yœô§ïàrÄ!ö¢UX"ÜKA3ÉGH+ZE’4Ú­#èÒH±Cí¬´Jý^ëHÒœHŸh’L­m‹UG¢' q¸‰ìHt’à$ Ʋ†7îÅs˜{`“´"F&Û«jÀª€nÃOÒº q š¡ –Œ1 Õ¾ÒŠØ·Ñá‚¢ciEt( qVÒ»FûžG m'Òè$K+¹Ïþ€× ‚´ \­m:R,I»#áâaÙ5œº½%k‹dL`ær?ž³"òðšææ%À*ŒÔ<ðAŒ(h2]ÆLÞ Ú/¤Ð9ð ãKÚýæ¨Éô´RdœÒ&oCXZÑVÕ¤¯Y°ìæìW!!®ˆëZwÇ~<‡DDnÉì„H¹æÒ'¤™:„P €„rÃra=ic$—519ÖI´îÅ$Î&‰{rôŒ ­aÀµµ-Œ8q7½Ú‘Ü—“ûé9D9RÒ~£»jø*¤Íû ²á9ˆ} Í9@H’[ë¨öÓs`3Òò)AœLàu¤xÓ¶§}A6:©:¶ÐWÜ•!¶HÝç¨ýxiž7 ˆå ¸=Fòî|†#[#Há VƒhÕ üoÜç«$Æ¡ “Q-?–VØçDR‹éG˜¡EÇåHCN¶´|<ÉÐÁË×ïŽO^¾úbÏèAò‹òDÊÿyzéd™ÿ¨ß’yÉÞàÜÎ)(ÄvMžXüxUյޯ°ñ85ˆŽdÏ÷c±ÿIY">M¼9ùPtÓ‰ïñ[ö:ÅËŸ–¿q˜lyƒi:ñ¥}ênº‰7…XÔƒìý°m'ÜZv±C¼‚ˆoü:Kt¤»“h#3—;ÄIÇ‹<$¡6¬®uç@6’`³+Ý]­R,¬Èoà‹_͈Ù'¯ p×P˜ß0é€+ôìF÷ c)lØ!žÞ ›Nü‡/[à›Çq®[\8Ò€ø§xó—Wºœ/CÒã…£ åb\‹Ûƒ¼ÊLÛ‰S^°s/Þ¹â1úh¹CôÚ§‹^Œ%„™Å.:/ã 5¼ô:è[SòfÂŒ™+¢¯]3HƒÀŒ%ÖlGä´Mä=°§4qÒ! yÃP,bN›HKñB/4ËB­ðËÖNœ€B敎÷òÈä#CM,w*£5©!Øñ@ÍÂ3’w`òfI¿07séHÞ>‘7É“ò3~È[òV‰¼I|—7Œ;À"Œû¯õÈDÞÚÒ€¹“;ÍÉÛ$òVÆ-.–C"ïx×7…z•!…ñ‘ÎGéFK"o© _B@B턌 ÞÉLÞQ;‰ ‹t䨑¼ypñäv±ƒ3¦7{ÂÉhÙh¢Ö‡DÎ’¼zÌûûûH)2@ÉwòѲv°É‰·Ÿ”Â_ÒˆYqÙKJŽmÆä^RŠž8âk<¤½¤Q=ímòâ>*¥ÐÁ…²¸K)~ƒôYè<.¥È@"&ûÙOJ!vl#~Ã^R dúgŠ~\Jñ„ŠØßGJaáàx]í+¥$ÎGâ¹ó~RŠ×A…²•RÜÁ꺓RÔÁ©D{I)··j)ÅXÔþRŠÉ[G¡³—”bâ I–ï#¥KñVÏ~RŠß÷“RLÞÞWò~LJEòÖU {LJ1y[Öö“R3ò~LJaáà†Zí+¥@ÞJI›ÉûQ)Åë bÿ½¤wpj(äý˜”yëÁý)uÀÕuWu…b'ßqÌBÛwQzãŒþoVn¯ïo8€ç=jå]ßÅ  ƒƒÕ «Z}SÞ„‚;ÛX“øæ·+îÛŸ_¼{Ã_O‰Óǘ”(,Iç±BiQŒ(޼6E|®»ÊŽKR§$© Ú6-EHŸ Ú‡?„g­l[z#51x…¿Sz{3¾·Oªý€QdCùôÚïJÚÒBû·³ö¾<íµGÅÿ÷ƒH<ªHMü6g̱¹G{öˆ¸ì¶ŸlEÀø”ŒÚ­¨5- ie—Ä qoš™„i‰ø…‘ìRM;)@¸ˆ2 ì6,£n·"I9ÚwF‘¯b+Ò>Ä­\okÑ*Ò‡rÝêÑ­¨I„WÈWgÛŠD'¿j+jΞüå[ñyÝŠÏ'[QÇÁrœ¼O·¢Dâ¾,!ŽÀîmÄ.޶"í0¸Ëò)£M‹;Ä´í\Ã)Ë:#ˆ[¶-i_æ`"q˜D8Ç™œoÈÑ7–¶‚õÍVÔ´À¡)R×Mk#LRÎͶ¢°›A‹ÒUÞZ…˜("ßnEd»QDeÖU©¢ÞÆ©ùVáÈø6¹É‡çm-‹‹Ú”8¾G¥¨Æñ>î®ô‰u´á$% MkæU³IïíVôƒƒ·Áé¦%aO Řj·¢{¢M+­©R‘¸¸´‚b¼I„ÓêYÊVDg»†ûl¾µˆºáÛ{*ˆJ¤ÆƒÞk+*x›ÕVDòoÙŠ‡»²ñõtåó €¢$’²ß¼€·"¸í°¼<¤Û»ñD÷œ/²iI{ƒ6YòòC².@Á×ã–¤¥‘z•I^ Ú*aƒð„Ã6-qQƈÄSãMc-ÔÄ÷6-‚~Iæki+¨Ç´;¥Ý´št¼ú±ŠLVŠ€Ä|ލ¡Q5ƒcÍÈ‘ˆ1w„-‹¨0!æq²ìÕ–èiT¸ò"ˆñä1ðå¤' Žê|Ïñ§ôJ][ Ò˜”Y° ÑK·± n'L(c@8 *©(Ó=É4Dâ,+s18˜'=ÅÎUtl<’•’#wóhCëŒJ^ (&Æ©Â\ˆ5Y zÓcF„O Uu_9OÌoI:ð¨^€0J✢ËìÞ6‚gEkEÈ}d©±§&-¿Ñ€,”yáp 8'HÎíi¹êºå§¿uD eD(úÑè€È¿©$ÂS•­+Î:Eœu@6¤ÇÈUÊôˆÅƨÖC°•ÁýhUu@¤–EÊ^iju4#"Ah˜¡R&ÙHc F‚ÇÁ| sŒe1R@“Œ"'MËŽ‰ANiWZ‚-ÑЈ2ùz14ð´ªC¡t[Ûc¯¤QjPaŽv{ŒãbiFJv…Ù¼ý€œõƒU¡ ÿ­Hm¬, —ÕHQhõÊ!H\@kY`N éZcáû×ëì ½Ñ$Š€©JHØEʪ@ÆžAr‰º8¦âY+Äçëh—äà5D ZRȶ)R“¥C¯ E퉢uÀ`ö2î8Ï¥B ã¾bL@:“aÿ {àŒŸ½Y‡üþå«—‡'YýŠ“˜ßëL&ìÌy¯~&‡ ~§oÔ{‰åÈAàÜŸ?ð†â/X> ‘|´#çÀ-#à®,ñÿ?,Ÿ×üŽ€ÇÇ7¿#àÉi޼Óc!œçˆ÷ãù3œéüãLçg:ÿ|¦ó¨lÛóœgrâsxÿËÅåÅÙíçfDݳj¸pü# ²Êʉݨµ¤‰yDqNœ…¤@XQU­Õ™zŽŒ°ññÄ•RѪßV)Û²§Þsìn¨Jø£¾‰5 íßN¢ˆ«õd,¶F¥á[p˶s„e¼¿mË©Â#£_@.¼Úí¯ÕÑh­â)“«o#›¾vaÕØˆ*ÞÂ2Y£%2kgG-É:¦%QÑàNf ©ºB68:¹"ÌzZ/ã[wg@Þ,¾î;´Æ±ƒûßhך5vã2wÈ–R! &€nÍ¢>²‹8/Em‰²W|?¬ñðy(µ£·8ËBʔΑ¢"ƒÛÁ†Ëí×ÓlBl÷¦A7 ÎÎîÝ^¡N””{·'Õž¨ÚOh\À8ƒ µÀ_Ã3iƒÂ-šÉ1®dš–ŠŒP¶85žY†Ì”Æyóèa+.ñ.îæŽ1§œm)pjdŒw³ÙF„¤ÚñãÆ0¡Œ8–@BÜ.jZâú¤ÁíSÑõÂáf¹(4°~ÌÜ¡÷¢ÆBûç“‘ ðZ3>·¤ãâ<ÅË  d@ª¶%˜‰&E-_ÌOáÉîŽþH~ z=âC¯§|w°7pàNœ‰‚Œc"¶Æí%ˆã0U†qK\23Ä4÷ ™™Î3jÉ.%ü5GlÎsžI7:U$Xó¦†9dGš¤‚ƒÒ€þ>¤hFJykF|eE4òª4|f¼ ­Œð‡Övö±¥½%PÐhO>„œ3^´c~ŒoIïæŸè¦C^íÏç€-¿È§|‡ªÎ„0¢Ä€L’T£Ý‰\}ðê–ÝÉÇHEa8ùÅœ)#q1c>D"yMömÄ$H÷äCncÃüè Y8äaÀ¯v¦Èq¤up-EpòÙ? ÐHâ±4òR$[ÃRû)B®$®Óò!‰kÇÈ35æC^kK ×´4¸@‰ÔYªÇ‡ äÝøÐó)RFpÂa&|ÈYრÕM'$"d´ñŽ…«V‘°jøÑàN5@ðˆª-2Ü •#K¢$¶Œhõ!Çú°p£3KbB8' ¾=êWœ(A -LR0þâ]ˇÎRü ¦áâvH¶f࢜îcƒj¤dØ›‘6¡‰£ïχHÅ¿‚ádû×ð-Rnœ@«ѸF¶Y2NF²ßÃZAÖÖN˜Ô‚mÓ’ôiB/©ÁbÎ'Ô†ìÝÊ´‡ù aFJ² êHÕ‡ÃG,ïþÑLIÆ"jDTŠåTñ@ŠÓ24©—‚0MKD„à6Ý€ZRÒ”ÔÂÈç|ȸø—vÿœÑD…w#îB[ ©S5æCÈ`¬\h9çC6Åüv>”NVЇ«¢Nùzh âN±!‘uV¢€ºȤ61áHyÁöæPá> ±!G-‰‰9íL 3cF$h=h7ŒßNë g¬‰O‘Á,ä Q〠҈!õ¿ ÿ#¾A~–‰Yˆ4ž&ešÓUÉ7⤨&óš“uÑ4…®ríµnM8œÿ"fTÜÒáž6ö¹‘«A"+ ÙŠ1»QúYÚ ,Z3„æƒG©qƒx`j"Ašö£q"ÖˆæÀyo2±!ªˆ†F§‡ÊâØÚÛkÕ|¦²¯Ê†â¿`þKŠÆœµz‡×/1œkÕ^)»?kEB®xä¿_{‰0Ôfuê‚Û“u“b…ÅWb$.9Éî +\ÈvCehÄl-2òáÐ=gô¤ry¹d´÷‚'…Rz’ƒ!Í%<;ßhï G’Z†¬¤¸"üNBI‘Ö‡ d2lƒ#U%ÆoÔPR\ˆJk6P¬’Ï©{Ê&–~IÐÏÛ#§3-ü¶}‡É“ÕÕÁˆ,&¤P*äpDsê#…:üjd@Èó¨qˆ€%ºš ;j^W¿/š Ë¿-«ñNþòööúÃíÙ§ÕíýÕÕÅÕ‡ÕÏw‰“ߜݞ]^n/Wß½}¹¾¹½>ßîvÛxÛ¹'~~¾¾ý \_­ÎVçן>Ñ—÷·Ûó»k’hãÏ¿ünóÚÃ?ý+>«åÏ›“£ÃÄ.®Œ¿8Á•ñÃWG|Ïè¸^¯N^®Ûž§«£oßœ¿¦G¿÷–R}ü§ïḩï^®_?ß'ïþø–µ^œÝïvgWUùºÉõ«›Û‹Ow?mWr›ÝÇíåe“X‰ÁWù—züxu~wq}µk{°pæÍìöèÊÄ´Gñô ©‡A¸Â·>nww«³«÷—g·«O×P¬î?ußó×Õwg¿\|¢ù5 êí m”nP•¸¿“·É &…¶æWbR©îÏîY÷°Éï öüJLê_‹I!NΨ g¯/(½»î-2÷@ØåÁË«»-±´Kâaç;û°]Ýïh6݉¿zù mǃ՛«íêø’¸Ô-ç"õ_@Öûë«-õ¸}¿½§;›êëc<×eXwo·»¯/ǃzÇ?gÒFæ„íÚÅÛ²êç÷wë뜌éÝÑý]A@î'Ño»Þßn·ÌÖ?ÝÝ^ü2ŸQ;ÂS °vq»zvwÖk\z4 Å¹û¸çÞ»YkÀ_=YŰ7M»àüé .J‰ÎÒ#zŸ;’tßÞmo?]\1iÐÓÝŇ«‹/ÎÏÈöi€Ï  õ`ut»­}˜Ð €INITjé? 2€I/ntq•Û‰ÜîèúÓÍý0x÷ó55x¿ý¥K{uŽˆh¶»¿}¦-C²õæzw‘gŠøÓ:/réqpðŽˆçêÃŽ˜Î»ë;"¾íOg—÷AwŸ¶ «Ë:»±(†Í—VèiÜ*Û¼UÒ {2át†0«ƒ¥¤ÿ™uþñç³Û»ÿÌ –Æ—Á!«xÎdpÚn{W0y»½¹¿Ü]4û¹˜Á!¹QnÈàVšG·Œð?u'KÚv Nfp‚ŒgŒŽ¶øvñp‘ªç££¿þù¿W-ŒŸÓÄ[Þ_ÿ|UõÁ¤ ‚lÇŸßOû‡Âûؼ~_}ñA7~Xï==zþ»¿yð€ÞåôÝË×/NÇO¾=ûtqyw}EJÏ×W´?¯ž' €6>ßmï>^7R•kÔ<{þî éÝ;â]Ç¿œ$]e;éW~n»½ýæh¡V;»¹9cùé´Z}ÿïüËø=|Z«Ùp;º¾½Ý^F.Ö¼ªýyüžWÏÿœåÅ‹C"¤Û[‚H?¿¹¹›¼çퟃXÓÄ1ž½¿ …k·º¾)@iÈ×»;B$àÔ^¤7`:¯_‘P»¾½[ßò„›9­¦Ó±ìP2\h¾·×¤º%Î|ÍçèúþòúÓ+Hì©>w÷·W¤i]_ñ›jÝ¡‰†Ô¨m›¢K’ͱ½Ú‚ žnïî’È**Ó—Û*éç×gcÙ°YÝü°ÝœŸ¾6‡»çr}$±…JßLg|òíó,%>žÝ~hEÚô‡MRiI?ûîþòîâæòâY?øyŽTîQQ“uNžÛëãWeP‰—lž‘|¸ÚÕ…Ælä¼¾?¿Ü’J~RÄ Žé÷Ψ„·g5Y<88º¾úiK“¾:ß®ÏÏIæßòêcû½|yºšŽ^ÿiô$SÃé¨ûâ.ÁHçÆd¼¼kÛ¯XíÏ]îoVÛÛÛëBŸèaµ]•\&ÑŠÙþrs1õÓö|WÞtü“7­ØsüÍÅQåXv º|C?N1…‚=èDà6´O·?’nŠMØÎèh²„)5ÛëíÏÄÁÖ'g7wu¶×'Ó5áýzú ±‡çÑ“ÇðÌDç©Ä‰d<ÓF{ÿ‡ŒlîÒ :ãy@]Aêöjû‰ÊÓ?ÞµšF†ß:#‹=vül‡ñÏ?6=òºÀ»—óñ dð ϹÇñííè5«8>¤]úë–´ïO7“Ñ¥'3DߺÎ{žÑO“•áé<ÏÖ+̸÷I¡ñóJ2͸\¢N¦šgé5Oþ?± -þ¦nH ÀÝ.®šnÿßãÒ€ÜíâªÓ-ï….òЭÁ]ÓMD)¡èŒTÔÿ\Ÿ\œ_·¸ý]ÇBû-¦÷÷·Û¯«ÿO•wqê/[I“©wz¢¨ÁŸ®ß'N ²-ä.ÏX»Âôf†~ï³iíü“-§Ýnÿã~{U¹uÉŸÓ³‚ÄB”—Dû<[íÙZϦ˜íà åN&ú›b¸gƒ½ßUΘï»k°^úö54‹úûÑÇ- 5F~æ?º$‹²ÛËõ1Ñü‡Ï¤ÿð¿fW-¶èÇó±/z»&{ sëãËÍjœO,ueA²zsûÄjVWê[_<еö;¹¾‹ÌŒ^zÉèøþÁ~,ƒŽ[©QfÙ}–©Ÿ# äÙÅÙ(jÿyÖÚÕׄñ˳›d¡~}pú †Âînµ½ …€½Ú§¼Ur•áV>½AÃßòYîûÉ‹úW¼'›€•ú ©Ž`7}iZ¼¦žcÛø‡íåõÏÉUQè8ÔQžÓ¾½»½?/Þ”ÿ¸Ç¦Ûëë»Ýd”(Ó£dí‰íØ«íö}Ïí6Ÿ¡b¼­~@ÊûêÅÉËg«ǯOo[Uí1mW3i-÷Ħã>§ôwón½±n88!šdÚ¼xoM?±?ç~ì_Ófûáóîãö§ƒÃäûäO>¿“ºyZ¤üœyÑöÂÌOk5ÈÒùÞEÊ®ºÆŠA¯·éwtV«'/HZ}¾Ü>=ø3-èǻ՞9OxwþqÛèűÁ)ÿˆÎ߃Ø|3RÂáTœø¿y^TÖÈX¤°?²EðÏqcnØÛ´»>À„vL^ßÒ~~¿úvKøå%äê–È9<øŸWð˜Ñ¤ïX‹è¹¾€©óäìGH‘ zŠ…KH{Z)ß*mlv¶EWÛ8þÝ¿7éÓ D£¬G’ƒW¤Nc×_¡Ó×÷·«Ë ú³ì’±×Á´ý¢¼›f¹>ÛÁ©ÉÑdIŲ¬ì$|¬ïû‹Ÿ.²ËNð;ZÚQ×Ú—n' ¥Ñ‘‰ñîFŽÚq¨¸ãö½*£EÙÂŽ˜šõÌcë~²ò-QÂïXdwí›^xC1˜NOÜ”îôlÇ‹îgw¥fmî‰bŸžÉk¿üΘÔjõa0៟v@LÛV!ƒÙ(G ìÆöA\²‘ÙKO<ÀAÇ{DËùhiƒ"mtõÄúM°"kk»›3ÞP±íö—»±©ÙàB"€ö+þG|µaC ü쾌e@ SõU¼MÿQT%¯')e¸Ò ÷Š—„E+^¾~ùîåá«Õ‹?Ÿž~½úîÍ32®ß¾ywü??ÖûÕ51}â¸#ïATò/ˆz“]îGg—ç÷pòPÿt`³\tyÒ7¹>V4_({è·¥ïËÈ/þ“¨7Y¦¤ÔBûl|g ï…¡—ûe¯Þžœå÷ŽyäÉ6"pxñÿ”A|wvÃæÍÒA僈k'ðýQôH5G M@D~ù”¬Š›ÛëO¤pŸ³\Ά1þûË»]ô“FCõÜDÒD¾é  â©ØîøûñÑn-¡ÿ¢{g³þ¶àÒåf§<::>í¦qŸ‡€€9½yý§ã“ÇÏV‡Ï™ë ýåèÕñéC@¾h:SëäÇ œiCËÿúKÜo ¬þŽî7­ô?Üo¿¿û µlIùmî7i¸ŽLþ^î7ñÅî7ñ«Üo2Ú_ä~‹˜ú2÷›Œý?í~sžt/q¿I”¤Z=1’þùB÷›ã؃7è/t¿y·!õî‰ û…î7Pk•ÝoÖ‘ûMø¾Â?2þ£Í»ß”ÿjô»ßžÆÎ—‰ÝG:UMÏ/FôÀgdÌ«ìH'÷û£|¨ø ˆUÑGõÕ6H›¨"ÛFÓÌIÈÀ¾C±^²‘ÞÞnº¸¾ß•yÒõ”'qo{îèDú˜£Àž0‚¹2øx…z·3‡"]œ—ñÕ¡é ÔF*¤EC f-¸9LÙÁŒBé#¤ ‡ aΖ4y=‚ƒì¨Îl,Ry—À¬ls£´óbðz<+\kGÑ8Z,Ο.n±Î„½½¦=Á{¤,D¡<‰¤˜dŒfJ¶ ªz§@ÿûÅÕö®ÁV f…Âͯiô^NFHÖ¿…»Â1˜4ÀxÏaBøH¶ÝPÐ'ÔÏߦòúÉáåÍdz§MûÜÙY¦v/å`‘ã·5uúf{7ê³W'¦ÝΛÚ}%ý¨Óñ“ïG¯)ÖÂë“Ùþ-×¹((¢NGýNìµÎ"£©£NßO{å7$ÖÆ:šÙm§é=h5ê×Gdzç¤H¿:#¥ã¸¹Ä:lðw»†TB7x4Yã. è»Ãï×9–µBK OãÖ<ÙE@.bÅ ä„ušC9&€L2 ~°FÑkP'äÁ™) ½Ñ2ÜCÐØl ²z÷íñêÅ7^=ùêxõçÃÓÕß>;|GÖÏ“^øçæÃ??]Ím1õìøõéËwÙÔîüÇ›Íݧ›Ex‘çï n{՛ɉ7'ß¼„,a˜/§®áH‰¯ßЫß5'ÇOŽ?Ž6Áñ“ퟞ² ÷K%£–7ÒÉ d¼bNv…Ѥ_¡RNÉ"PÓ®#•ÅÁ„´£´áºç1E±œ4Önƒ&\j, Úê«|'xÖXæÊ1©1*TçtóÆ:ŒÃ#—3 ´1ATàL·×Ö‚­Ëa•“ ÌãÓ6V:Þv“ÆBóEç\2c­¼%®¤b&ßo,ÆED]è5ö2×+ŠI°®r‚ycaè1Éòœc`ÔÁ}Z†”Öe-F‚Øxº‚±1;Ãjc}Üxº‚"fÅj« R2pãé ÆÆB[¦ 1]AnŒÜ1mc70žÅtScaÚÆ6Ò†˜­ gêó¢…Ìrg+È­ò£Æ*Bž­ Î @ÕÆZhFœ­ 7VzÔxLür²‚D“”ò™"å´1Î"ý 2Õ¡D*²wscÕklÙa™Zî!ë^c­6Fr nl¦‘_é]V¹3Rý9¦:i;mð™øccåâ0\¯±5ƒjCäÆ¾×˜–̶e¤gzµ ¡i,QÕõ Öq6H¾V&¨/2F5[A4Bù¦±DFu4ž­ @.áuÓéò¹ñlÑXÊœB()pºMn<[ANÍç3Õì¸Ä7î¬ ,®Áµ`âW³D¢Egƒ(In¨Q7[A4Ö¡bƒKwŠš­àÀÌMÁ†„@DÔÍVQ§¨iL¬Q§g+ˆ ôÎ6d Ÿ±¡g+ˆÆ¤²ê¶1iVÜx¶‚(ÍcM†ÚUtnÜYA‰‚è¢ilBäϪ³‚™²iì¶&„ꬠDV®ºS,;J¹qg¥ ƒ Mc©T„ÜYA©tÙ6ŽÊ¶Ð„z!ÛÆdl1dÝYAÔq©Š+§ñ\TwVPj%&c7V¤ÆÄaCCHvã;ʄ4¨áÚ4RÄ öVР¤{iìXiâÆ½´¢1¨1Ê sãÞ ’¾ìÛÆdFȽ$¶alÓ$7î­ Yƒvh»Aò0LoÉkè™{V…é­ Ž·Û1£€$7î­ ÙÔôP¨yQLg‘G¶ªñÔ˜h7¬é¬ â“Œ¦±Š–¦0T`£®iLâ˜Qg:+¨ÈðÐí0Èú;+5öÞÄ vVP‘jÒzOT"ê:+¨¸ DÛØEUÍvVö²“íCˆ\ÔvVP‘’êrH~ÞV¶³‚ %XlÓX6—„í­ F•Ú¶±gÍ\ØÞ äãnÛ™Œí­ iϲŠ\pãÞ â6ÊÐ6Q´ÙÞ "РàY°fñÜ[ARFª !˜7ðN±½$¾X©Åç ûë„ë­`h½¸´07î¬ iÄA´iûò¢¸Î j)E•)B€?ÇÆÔ_McCÀ;+ˆ<ÓºmLVxsgÉöªmìmÔ \gI ªªó ¶»ywÏ|2+.Z«‡º(¤¸:wV©TÓ˜­'4î¬ Ñ~䮹±OúÆÌ'³âÚ˾i õ’{bæ“AcZ??4•|cæ“áÆÞV¾j]6ж™Of+¬ˆ¶±ØC%f>4&éTw·€Æ˜wVÐÐάʶиЇÑYAù4Ô(v±ÑYA£_G®vœ wVÐãÐ-d㢄ùd¸1)v¦iLËÍg>4ƪ´Ãš]Êbæ“YñqƒÑE½äã†È¾f>nle›kÍÿ™O†‡Æ@ Æ¸¦Ã{+ˆ¢Ìªil㉘˜ùdÐØÓz·½ˆÂÌ'ƒÆ0ê˜I½ *6œQmc£8~CÌ|2hL Iɦ1Ymq‚$ûÀ‹º‚¤PP‘3Ÿ R0ÚÆgåhÜYAÒ¦Œ¶Mco™dÏ'cQ›©NÐc¹7î¬ ÙF McXhÊžO•Ý] ÙZÖ dÏ'ãp1«rÑ€úq¤_½ñh “ˆwV…½iØ=Ï;+ˆb !‘„Åõ64£ [59äÃqÙóÉ8­m90Bc2=nÜYA§mß%´B¶€dÏ'ãŒl8’ÃfoìùdéüÕu/¹ilÜYAGf©m'èó:ÙóÉ8œ6ªCbé¹ç“A¾n£8<7î­ iæu[QcØà•=Ÿ ê¸4Ã0jâ¢tV+|¸¦1Y`ܸç“A:×6–šUÙóÉxÚÝ êH+ÖeÏ'ã•r£1[ïbãÎ z!•oHçnlÜYAZëF#¼AsÔìùd-[È(ŠÇ;+èI‘©5vŽ®dÏ'ã]ÐÞ6C䢲ç“ñDe²’(IX3D<÷VVšmûظç“ñ!Ⱥ»©±Ž.8ÙóÉ Œ]•ÝÔ[‡wV…˜FS¨€ìùd‚CÃ7Ìei¸qgI6…ê`—(«—»ç“ Ú…jScn†Æ V7v·´ð4ð†íùd_]h"!õ|2DÙ6vñVö|2„eUtjìUÄóÜ'ƒ@ k«L‘ŽÌ‹ˆ¹OFÀuo«þL½áI9÷ɾsULHSiFÝÜ'#ÀSjt+ÇŽ_9÷É ±UÕ£ÆÚ±Î/ç>0M’Ç•×ÔXŠg+Hé­õK"52ƹOF@kWUËEÒ¤BÌ}2Ê¥B Ùî–sŸ []IT±÷šeî“ÁÑšhÆL]`]TÎ}2ÔXËP …Wqü†œûdÐ8˜Êë×Þãåžûd¨±Euí¦± QÂÎ}28;„Œ-Y¦Ä vVP¨ö 5Ñî–sŸ 5&ÆQý Ab‘žç>¤~²¡šÿ VGÁɹO†ë 5»µ\EÔ‘æ>j,tCü ‘!ìXsŸ 7õÔ“ª6÷É 1)T¢i,b@¬œûdP°=Wl<ÆÆ”$ëîVÅcãÎ ¢h3 ⢎Õrî“Aã`ê¤ÆVE.:÷É@qA¡øÒ˜¬‰¤×Í}2*٠òï“wVKc·æÃD9÷É 1j 7­ˆjÏÜ'#84ö5^ÉÞezžûdи†»ÇÆžCÇåÜ'#p¡êA†rˆ%çœûdÐØ7V+>Å“sŸŒ@uá–ɘHÛjî“Ac/B Ù ’ùÆÜ'#bÊvÌ6†è˹OQ¯ºiìó0:+ÈÅ£ër“Òì3—sŸ ›&‡6x¹ç>€+1´QŸžwVP“•XM¯š­„¤!Ž£=8÷ÉÀÁÚZšõã¢Ì}2¸­›(8¨ìG’sŸŒ@\î0Tl(h+L¢sŸ ;_ÝYÔµñ¸qg-RF™¦1µ†šûdP7zÆq0‰©¹OMƒj&¨7tÆDJ+ÕB&*”ܸ³‚–¬£êÕ0=|Fg-1ó¦1GîÅ vVÐ"qŽj+Áá:jî“á{C’ïM˜¹³‚ÖѶM¼4¤æ>±q(]˜¹Æ9¬ˆ;+ˆò¾õ¤F;Ú°à­æ>jLÆqeæÖûÕÜ'ƒÆVÖƒfjlžç>4ÆÅ‚¶±gG™šûdˆL—וöÈ͇ÑYAˆõÛ¦±“2Bî¬ Ù]®!~ï¯àÜ'Cûw=*+€ Î1ÕÍ}2Ô˜°FRcÕ;+èé} Õñ!Wœ`gyÊ0  ãrÏ}2ÔØÈæhÕð ccî“V†¦q¬}©¹O†Ã¥\C¯g «æ>4v¶’¨¶Â¶•šûd¼CÕŸ vƒcî¬`@º‚:#al1žç>w³\ÓXi>PsŸ û¡:~ ÂVäÎ ¦†ªP¡q4ÿÕÜ'#àߪ…l bjî“pYˆJüÔ8x6=ÔÜ'ƒÂzd€¡iˆóÇk_jî“AãÀ)ÈJc%Y“QsŸ 5&ÆQ-Mjl‹ 5÷ÉPc8$ë9¤™—{î“á˜lS}_@>bc¶‚±—¶îAjìŸ ¨¹OV¨òÕ nÈNl ¨¹O½¬ª5vѳ­æ>4¦eÑmcËa«jî“‘ˆ Í4ŒKn<[A„ŠP9²ö«¹O†h]Ø¡2Ã\46ž­ \·ìéÍ=\¼ÜsŸŒ„ùßScÜÐàÆÖ7‡ã& ²šQ7÷ÉH\3£Æbpq$[ÉVø„Æaª…l‚Øè¬ Y4²Á3XnÔdæ>IŠ‹FcRÄÆ¤¹7Á¥Þöª©¹OFÂüWU¶ÂÀ$:÷ÉH„r5Ç Y¿¡æ>‰è,'ZÈA¤Æ”štÃBÞ¾(aç>< Õ aÙ ÅË=÷É "ß+Ù6F nÜYAbV²A1Æw÷Ü'ƒÆ|¤[;ÇŽ5÷É ±oîzPãN©æ>ËZÕ4V(@wV8¼©6,5VG5÷ÉDy£ÛÆ>)®sŸ 56B†¶qð2N°³‚ˆ“©\ÔjÜÓŒcî¬ ýhªéAqXÎ;+Hæ¨Z5vJÇaôVЫ挞ûxËOÍ}2Ô8HW=®–”íÄdæ>4v Ë¥ÆDàLsŸ "˜É>në¤ÉÌ}2\ ÞT×½ç+8÷ÉÀÿèTô±—26î¬ î¼Uý™«* æ>jlTK2…Wpî“áH—FZY‡­'ØYA ·ÊÐ46šýÏjî“¡-'´ª •õ„žhÔÌ}2¸ß+M³Sà ‰œî“‘|›²:plØÈF¢æ>4v¡dPc•¨nî“þ4´„hýÙHWsŸ ÛÐ,w@VfæsŸŒÄETéÛaP_^Á¹OFâ8Ð4\4 rQ7÷É 1Ù²C‰'ØYA$¨‹â~uѹOF’–34އwVРă·m\Á¹O†K×:8<¢œûdp KlÛ5m²èç> ‹~¨çÝjo4ç>nl+žÑ8Æo¨¹O†ï'4ƒ(`ŸŒšûd¨±c'ymìE´Žç>\f¦Šcä…ˆ jî“‘Hß4;R‰eÔrç>46ÍÙ1»HüsŸ 5&Ž+[ÈÚ²ïKÏ}2ŽQÝàÎ tÜqãÎ :+Å04E¼í®ç>4&®æ›Ær0rgWUvSã¯åê¹Omc<:‹C.Ã;+è¡«QãîÎæ¿žûdи½Ìâl¶ŽõÜ'ƒÆ¡¹^‡Æ&a£³‚^j5³7lzè¹O†Ï­>Gü9^tÒsŸŒä;oURc¯1ê¹OFr–„j<:[ø‚wV”øÆYM½ae[Ï}2¸o#eô.ÀÛÜûd¨1‰¥ª™Sã 8®@Ï}2Ô˜@TÆè&ܸ³‚¸vlÚÆ¤×ÇÆ ¤.×*ÉñÜYAâó²âÙs¤/÷Ü'CÃÐEyø7øÐVÏ}22æ¯÷Mc#™oè¹O†TOR‰F}à3 =÷É ÒÅèêUó0=Ù¨ÑsŸŒâ‹{•ÉPciÙÔsŸŒâÔõDÌCG6q‚³¤Æ$JC; sàè¹OFÁ”Í¢=|cNÏ}28Iõ¢Á®PÅE™ûd†KÌÕ4Côåê¹O.òÐ^C0ò0æ>j,¼¬Îjì£GÏ}2hdÕÌÑ8Þ•ÖsŸŒâ+Ûõ Ù#Nè¹O‰m¨¦±1|"¦ç>œ+KU}_Škd2sŸ {QÏ€¨±"‰Î}2ŠlX¡ªBöU©nî“Aã kè¸Çe>ÂÖsŸ ‚±\„àq0g"ê:+ƒ§ Pc§ÆsŸ .õ™æ*±'ޤY¯ÓsŸ übƒ« UÊîžûd¨1íùªÆÄEÚ˜ûd¨1Ž—Ê0")TFgÉdª–p0ËÍzî“AúZ+ë5™À‘{±qgÜ—²i¬¤‰¨ë¬ 6ÊrÞg$䫌G9€;+ˆl2•D’OF^7÷É(Ž3¯Ò*xÜ™óÏ}2h,›+Ûh¬Yç×sŸŒÂÁ\/ÊUˆ¹OF!t\ÕˆjLãyî“¡ÆdjÔÛ ÔØ ÇÜYAã¯*ê.A2žç>ÎŒ¦«mEU"¤¹O†{ίR›è ÑsŸ Ì«Ï)b£³‚d Uí¡Æ6éusŸŒ‚=jÄBˆqæ Î}2 Éû«›ÆAs,±žûd¨1©2åøŒTX$>‰Ãè¬ ›|ÛØ$ûdÜÍCáü¤‡’¬c«MÏ}2Šuþ=‹ÆJ¥1wVÐ{YQ'ÕØ8ŒÎ zokb"4vÑ¢×sŸ ‰½¡b€JÌæ’žûdÐØº¢×¡±â Î}2pH -ê<ø¯àÜ'£é¬oûuѹOFãÊv½å'pHñ=÷É ¤•¶¦.‘T0.ÊÜ'£a²Ö£U!á6Lg+ˆÜI¸Ä[CÃbמûdHc@¶²(Ò ¤,ãyî“¡ÆÄ­ŠKƒUq‚³Ô]±!É2 ϳÔ0xU Fcs†è¹O¾4õŒCÌ£ç>ÉQ˜Œ… 7î¬ ½u¨T‡ØKyÝÜ'Cú˜yâe@sŸ 5&qUô:4v1_žûd L¨¢1 åqó‰yÝÜ'g¥%Ñ{ÅÄÜ'ƒLº¤ô×1‡œºDÏ}2ÔX›ª?“FHTÏ}20³euV -à²b<Ï}2hl+Eck£²=÷É ÐØrº$pÞ§h<[Ajì*B“ÿYÏ}2¤z:¡Jô¬€/WD•xî“ñÈÇXï.I90æÆ³DãÆeÁuôÌ}2§ªlX‰KI œûdÐØéâ¡Bc­¢0÷ÉxÜ·ñŨ‘H„8pl™ûdHmjâ 4v1”™ûdPN@W?¿ä|ŒÌ‘ÌÜ'ƒ«J´†²4×a­ÀÌ}2Ä»•¯îY‰8ó˜DÂÌ}2Ñ–ªÜï&ÄÅjç+´†Æ¨10K­§+´ŠÆgŽÆ|,‹ÆÓ”ØÌƒ.ʶAÝUÃ'fæ“áÆRš¶qÀù>OWPrÌÉP®×™€äÈj3óÉHŽ9 Á4ƒå8F3óÉH8+S£ö/ ™™O†«šçmÌ\jf>Üä!TqLuÃDzh<]AÜäŒ,NT;À—Ë2ÅÌ|2 á Í-?ÒŽáÀ‹Ã˜® bQ]t41•¥™ùd)ne òŽ£,bãé "RÕÅ\i¬÷ñ<]Ac¹çó M –f\”™OI!Χ¥ÔWãaµu«ÛýÚšR±Óê»?¾zõòß_¯Þ¾yûÇW\NruøúðÕ_NQïËÞ´T#÷ ¼ìðÝ›ï^­Ž¾=ˆfŒ:…ñãD¯ .ÿÒE®&y6pêjIŸÛEľ ÒtQ‡xBÄ8wQ‘!T¤÷Í/ÆÔæ#Ôá¡ÖuQǵp]Ô±lAuQruÙGç,ÚM~YDã‹z#ÔùàQçÈâ_D+å²»¨ƒÎ2F@±Ë¨#•ò!Ôé‡P°VSÔ¡ˆ04¢Ýä—.êp)ÙrRŸ›BÓÄ”Èøî¢áWA›¡‹:ÜÒEν%Ô‘µ«GT‡>~uÐrÕê„Ã"Õ¡hñ°„:2ŽXXB¦OQ§q]е¨‹¿,PLYÆoJsƒ“*µ@u´•K}õÕIÔÕK¨#™‚„uVs‹¨sÒˆEÔSá uÖ³„:RZzš.Õ 9ØM~Y :TŒ€ƒ¡R] ·bQa®LwŠ:2%]a„sÔyöG6–Œ8³HuT7¬7R/¡qän uBE&mjŒ:N8À)^w“_PG ‡Ó®ÜŒ¶JYµ)êPz×a\Ò2չθ¼Áˆv\ñ—¥qZF‚q‘ Õ_<.9„¥q HRpµä¾Á¾TR ðŇÝ#|ùa_•ÒÇ…û\QQŸnab’Ýä—îA<ŒoÁÖ-àãe5QWf¶4}4[€˜§ ‹ÜC \z8ãð‚,rê+¹Ç °ÞlÎÌ·€RRŒ·~Y\RoÔd X#–P‡*ãUþÍ·@Àæa‹j¾¤ÂÀ¡»›ü²ÈÕ,_l–Ôme)âú\ ²Yà–¹ÇS¶K*¤’‹KJ´³¼¤Â=$¬XTC„¢AD»s¾¤’¯í&¿,.©å[aã%äâ.µ²°âù.% &DÓw&ãÕÀw¥v“_–d¼Ä媱ŒÇ½Ä/¤6nIP‘äõËJ¹ð|T×ÊxD§,.)é1‹J¹@U’Å%õ$1—e¼‚åÍ‚™ŒG„žÉxþeYÆsN€FÆãBÍ’=ƒúšniIíáe¥\x&µf7(YYòÝPeÃ\ÆKï1%a¢e&KéãDz”YÜ Á·²F?°†ú¦ ï}GôuzÏD÷À/Ë»”ïïŽdi}—Ä û/Ë)‰žî¸`ÆãÂ/Ë2žóŌƥ‡tëe¼¤1DÖ\ÍåÜß#5¿,WìŽn+MLs _Äç°$¨<‘—ôK[@9¾Ê=6®”_äô1‹[`d?Í+·È=T$RöúõŒ« §ÆUèÛ¥‚«ÚaÌxÍ’…ãÊJ½dÒ£@yQǸ c“Æ•Zf¼NØE“ž¬ý†ïÌ«eÔ?wÃAôvŒ+¾&±›ü²ÄxÉzÀÙÓȸª®¹qtKsãÊ4føœñrØêȸòƒXB±x»HuÄ>‡¾Ž{Z¹èH"ã V {; Žïî&¿<`\ÍŒ…êë0?,ip0® eËžzD¦§¡ÞM~Y6®,"eÆÆÕC N„%/ 0 §7ûÑ;Æ•ubb\5ÌrŽ/5—¬Ð1®HC~À¸‚J#{ºò'9=1®œ[RÛ_\û£5®È¬YZGçD0‹þú<à_Ðl!Œ+¹èK… ¼Ì=Ho]ܯZ6®$¯ìé0¥„›W v)“>M4ñ¾Ÿ)`ÐlÆËg.ãÊŽ¹ZüeQtl#¶Æ².WF-}¤†jÙÛæ9áȸaÙQ9'—T¸†Î‚öý“…h\ÁÒ–}õHrNÅÝä—Œ+?³—Ø¥¶’Zϸ‚(áñŽqÅ©—w“_+ÏÑ ­ŒwKÜ–«à—\ (+T|ïbl\©eˆ®lªc\9¹¼¤4£E/ Wà2²ç=¢á»ã»É/‹»Ap9¥FÆÅ»EãŠD"«ÌÚeÔ9¾g82®ìÐ?g‹Æ•x`7„+±è¶Gý)yZçÆ'¯WøeÙ¸â¼o#ãÊK^´v˲Ù¼âYoG÷ðS~yh—N\ 2ˆ%Gør‹+ÕwÍN“»›ü²,ãÚ3—ò‹ø¢&ÛQ«‘òX ÈB§Õ«7Ç~öò×D¤<ú¦…Óòƒüª½âQðê6EWe¬5á(ŠTÄhÔÈöG¢Tm¤É,f9lŒ4ßèŸkÃQ;D ¤ ÞgⵡD½‘£¶á(d:G•¿ uàËA&m¨ƒŠE_ŽBO²óiŽ¢C`Q]ÂQxð~`9Ó†£ û%Ûù£p¥"+…£È@jÌÁ$E ŠÕâ6…PgTÂQê4Gt £·«x(ÝoH×hŽÔaH£p.it0GêøÜlŽBF›úm8Šà¬"“ptúM8JD˜…£e.!£pÂÛ¾£pÜÁFá(„:2² ){à MVÝ822FÌ2ÿÒeJ^XN(XãL7÷Ý='fÙw¸-¼è{Vøg²©q&ŽHÑõ|ÉàûªÝ8#úž¡£úò{*¶Ž{q&K< –ˆ¿,h]§_"ÍÁfÁ–DÒ+c]_‘æHŠêÅœKØ©m$à[ZT„ª~§™{@z¿èYÁÓ‡âLxó÷âLQœµi7ùeu—¨F¨“5Z¤ƒ:oû.mÛÕrQ묕b‚º&”¤ƒºeÞ@´ÿ@ˆÎ#¨Ãäæq&¸Á-jtýü˒Špá‘EŽœÈ²ïÒÆ…$¥Ü’§¥¤6,ò¾ÍSQ‡;ÝnQ×R½„:GªÏÒA rx‰%‹œØ®á`´yœ fî‚¡.þ²d&‘¬ b¨ÀR¨¾ù†Ë—ds/93H±Ã┑œ÷®¢N¡ô¢?)Úi³¸a×jñ ·í€ôyœ ra{¾+·›ü²€:„˶º+W5z1DIÜ–Bt“~XtÏ©µ+ê$É ¹ˆ:+'Ñu¸¯³gb–{ u:÷Ïzpl>VûñË’Ú/øbn«ö[²š—Í$µ¢3ðnæ%íÆ™ kÆÈLŠ¿,K†ÁŽ]ŽÐî–Ï ˆm.Æ¿ \ˆ´gBíÄulšŒ¾¬0b‚/¿l&‘F¢–Ï Ô0ôãL$§5ºÝñ—Å-¨7ŒWÂ=¼0.p÷ui á—ýfÆs¢âºôà‡å°R’¤añÛƒ‚kÃW&ŒwÐZD7ÎÄ‘ˆ&!Møe‘Ôˆ´Æ§¤ÑÈå-@t¸¸¤ ñsÝ8^@ÎQ·›ü²$KƒWbìüž ë…q!æxaIé¡ÑjY (oº¤Ö.ÊR‡µKKj¥•KKŠsÏe®†llb!΄$‰uz¼¤øå]*¦Kú€3o‹®PèóªgÂ+ÂU„w“_e¼åÝ­Œ×^.ºB ˜_ þ&JPfq—’°´n"ã›8[Rd\”ñ¤ß/X88w—–Ô!U7΄õÈÁL5Ëa1nžtT.|ÓÊøP•œŽ+T/Òa« ïá"êß¹nd<ÑŽZ´g ¾‹»Á{½ÈàpÄü€Ùéý8’Áz|¬È¿,287=°.,Ò Ët$MÝRœÉDËàò/‹»4¿ÉR#ã_pÙå8pw?΄¨t—Yæ~*D5::‘ð‹QjJ°šÛ‰3a‚÷cY4®4ßaW6ôe<Wõ qn\9)—B­hóØqà¡É9ÆÍç2^¸E»w6–RÿÚú…-@ÆnÀy\'΄Ùìà§ŒwXXR6®¸òæÈ¸ªñ/3îáe0®´_V$§Ô1^·¢CÆÕ°¥¦]=“ï0^µÌxm`U±g¦ÇÕî&¿,3^kgÆÕrˆÙÿbéøŽ¤p‹¨³ÃàGŽ$â[Kw½¸¹‹ŒYbÏ Hí´Kš%‰ Ýo!ΧÀ㪞 wŒ+ÓF GãJ.ŸõèÌÕ1®tXŒ3®h&Æ•_ôÒ€¿‡‰£µ[—0 ×÷ظbU±gB´cÄÔ¸zàr ÂN¯[d¼ Ç‹A<ìÄ™DSJû©q¥û'ëѸj®;FãJ-jâwÈ·œ¼Ë܃kd5qau€2àËÆU»yfÆ•°‹^-¢B·gâ>n¢‰±¬‰“J'Ç1®0®Cš„n®NöŒ«~œI4¥¬šWvÉïà=›ÈRÂôbœ Ê+.}d\Iµè‡îå'Kjâ½ì|£švŒ«E÷8‘Y’¥ÈÎÅ¡Cý+@š àÝä—eõHN]FFùå]ê”YV'…vâLxE¼Ð_ïÏuŒ+ŽùWvñf-Œ+³IÆU½“Û3®ÆêÉxå—¨¢:b:ƕՋn{×ø‹;ÆÕ€#ÔNœ ë‘\Pw7ùeYƳÖ22®¼_rÛãÂ/ºíÉþ‹®’2ntâ+=ju$ÆÝ¢÷Èk—Üö„ôáãÊpðw?ηôĸR WGޱò™…ݳ¸ÈÒ^¾¨7pއ~œÉÀÈÇÆ•TËÆ•åšãj1ÆÙþc6‘Ôh1΄X– SãÊ.sÇYÆ2~XÖ=ÒÁvw\HͰgòpøÇRŸÕw‡9>ù5Q&¼‡:½>¤VëÕw÷——Û^­>Ü^ïv9ÄÍõÍýåÙÝÅõµüklùîúîìruu~¹=»MÉ"èéÿõœÒêO©ÕÙçííÿk·ºcX?]n¯Îñø<¯¸¾z¿}ß<>îþãív[žÒcÄĤyó´âç¯õëÿU¿þ©~ý¦~~H`€?('§EñÑœæ&¦uá¯ÄºrÈæ+[r–’Õó6ÕÀ_3 ” &uq9ûèk$[@® ÈU@)§Ûèk„cTþX¾G‘¿V@åWµq9ë|ýº.€p¨ÈÇ iò×PþÉ…¬›|­€L’ØÌGT~ÅÉxJ;U¿V@púäõ‰Ísètú•x“¾†\laô5r  \"y (¤¬Ó(e©ò×:"ß2©DîN•sÐ{ð“¯PhW-¡`²j1!ת­_ >‘È#ÊÕ7Æ#ª4L¦£˜|­€ÄˆŽdoDR–a?ùZÉvD© ÕdD¢,U®ÃS¿V@ª!H“J 2ÿŠÄ´³¯®SCb¢ùÔʯjSjÖ¯iéHvéÈ•5wAO¾V@#Ê]Êö•²­˜|­€ZÊÎ ('Ènz;3ùZùvù ›,¿ÍvÆÍ¾@¡e#‰L&l¤ñ5ýš±3) CúTúhÊFD^ªœÂ¸~-Sc×JAöÐ#HÞ!&_+ ù«Øˆ ó¯ ±‘ÞòçÔ}è-†É×:"ýëØˆ›~-€Ì¯c#ÃükdÛ¥Í=‘¨Ų̈é×Èý:6âæ_ ß²‘T¥bÂFÒ¯H†ÌôkZ6ÒCvùU±²<ýš©–gçÚ:ò…x|Å»Ÿh#jDÙ¢·j¦ 3c;_ ÏV=¹f­®½Ãü+"ÁÆŠ«y«ëÛ÷ÛÛÝêŠâíêîãÙ|ó„Ú¯w_Ñ+ÖÏWOY¿P Û¬šgrôŒ¦Ú> ã…Í3éG …¬­xx¤r/¯~~¦Ç ðŒ;Ð31^¨æ‡c¼‘ jž©ñBñ,dœ¡4S|4íh¡†ØÑÆgcÊо}æG %"ò¯ô0Œ*Ò©Œ”¡FdƒÒðͳñôQ²y(§ Uâ¹Þ½üîåë%>ûà Ú’§GÏWwŸ¶_“åõþìóŽþùx}‹?]\­Ì°ÚmÏW¹5Z®fŸ }â7C²ž¬ê’ó^\½¿øéâý}ê¼›v0”uÅ;VO„ îôÏOž_Ÿÿmõéìîöâ—Õ×·ŸØ ž½ •»iKž¨Â¾«ÕÑõýåõ§fۮ¡þVîªI ü3ûýOo./îÖ'/×ÿcyžÔójQûD“¾Û~¸¿|Ô©Ò]y¿ ]û“M|¶» ûþêœ!lÉÊÞŒû³`r©Óø¿?Šžm¯vwŸkÏÙV~ƒrT YØzàû£õóôzZ¸ ¦^_ú|So¯ï¶Ww£þ-TÃSe„àÙÅÙ¼øâ?g(õòÄÆÐòç™÷ˆgÔuµ+-u}[ü-«3zùg¬A÷­¸KX»zêúòê‚'úá~»«f]QyA”®ŽPöôàÍíØYïnÏ®v’xš·M×7·w¯¯Ðµbì‘®Ï^¾<]í®/ïgøtEñîÚÕR×Ó7`ý¾MWœéú†<u}q{ñ~õa{µo¶+gxÏ]‰%è~Ú:ع¼µ·sï_Æc?ýx·zýóÕêæìöìòr{¹º¹½>§½¸ú0AÑ¿ünãY¾.C»÷gž¿|}øjuJ¼üÕñêí›—¯ß­Ž_Ÿ¼ø f­­‘bšlk²A‚¿þ c¿éïŽî··×Ä?­nﯮ€ÚŸ/î>®tÅúwo_®擸xhÙ~¾¾ý `׮ί?}¢/ï/n·çw×·ŸÿÛ–í‘KN¿ò³à>¦Ï›“£CÑ/NŸ½<¦µ>:|u”п÷(hž½¿ ž >|÷q»ú÷ëWëÓ´VÏž¿[aß~øüõAýõ糟¶EJÝ}¾IªvòÉ¿Ÿ|{v{w»Ý®Yšo9'³âÃvµ;'6wTÚòÌ ^ßúŒzõõ Äõí„“¦Ö¢i ÷”ß––JDAºÛÒÆ&݃$ÃõÕnÞ ÿ^F‰}¹ºÚ~¸$â¡ùßnw¯/ß7-åÆl×¢i|s{ñ‰8ÿOÛÕùýÝõ?®få 7zëo·$_0„Õ‡ŒçÚúýõÕöàÍÕvuŒ·ßR£ãFã–oo·ëÝ9!—wPvÝ–¬Ç|èÀšµ¿¾½Ý&IØö,-;„wptxòîøôåáëBª½V tXÑðñ]ÖÉOc¹KþÓ(ØÞaCбÃoðÅ7=µ‰ÞŽähA¦;_þ”ù>ÄJÍ{*«ÔÄ?…6!z÷øO%òåØÒG£žÚèX©/þi‡ ‰ ½\h¯G=¥’'ëôKÜÆ?öƦ{»“w !¸`Unª®Ã•§JÓhù\ •oÇóDM‹Ò‰Q,£KS2ÝóMÏü,ùÓ2’&ÍŸR¤¬£aÖSRÏ @ÂDz‹i!Ž–]dGmO”“åýÔ•Åbͺ×*o!‹ùÔç¶µ§ÇJpáŠ×“žÞÆ2qbC ;ÊO¥øn2Säh´„Ke*¡ $R¥§Á šnJÏV…äꪅڠ#JàóTÑ¡!ήՔ3º™§bîIáç=i¶ÙʨXؼÓù˜›+_Œç‰ë°¢¾ÓÐ- ©†TL â6ÍÓÎRWu¼?ƒͧ*cJܺ’¸6ˆP­t¢´}À÷Àg{ÅÄKµ…Ä[JX¤÷s9 ᢜo•R*n±µUºQ>í)i_ÛÊME,­ù3 ó_;ŸrBžâj„i—Ñ+Cí)|๕œÓNlåÔ´F¶6QGp1]MÞ‰J·¸{ê áÆÈQ9çC¹XÉ0ï²!4¬©9Y ×CPñ]_‚ôÆ4ïD­³¾/?åñ’¾ÐH Wiw¤˜›¨9(Ú×î2Ô)¬£¥ÀÑ3ªCC~ÍÒãîQ³]iãİd¥æ=i¸¦¡!¼´™gðÞÒCÈBÌšÝ9©fÛÝÅÙDi23(¤Å:8ùîôAõaÜkÀ¡º¾;üþWôJøÝËWU N]QÕ~” þDvB±JµÍ*Õ\ïj\ ÚkU±µJ:ÖDÅ:ßîz]Q6±z!ue¥+û¡–ߊòkÅÐE‰)êúýÑ2âFþ'å‹ÿÈI¶Ì›–¿»Ñ?ùw6sfhÍ6¶^¿ùîøÝÉ_V'ǯ¿>§ïŽßþîÆÖÉ–V™°†íøæí»õó‹ËŽk5-:«Ý/¶wwèqqUýDô?8o¯Î.wóG×7ŸÙ8&3&7##ùúöýî_Ae»YïÎþ–uµýyÒéâêì®õà>A“Ûíûû«÷gWw»§ÌŸÈÆ{v÷(¨GÀ]ž³O.ÁùfÝ1uÆ3žôxñÕ‹õêìêýêíx ×Åñ†.•»\OñZ{¼½½þßÄQò+ÊĦû¶öxÔbm{Àp­W v$‹ŽîÉf£W³‘¾ø‚Øaì$«ã¥™ü‰‹#\dõÿÃ×o‰x~¹øtÿiEœáúçí{¸cnhúÕ¡°»ÛÞ ÃF uàw·÷»»Þ~ßÅOÛçø§³Ëû³f¢÷õ#øÐÙÕ´Ï“ÃËO—×ÛŸvWïÛi§ùê=OÄæg÷>Ñpiró޵Gu`?ܯöxuF³'Aõ)aëäù›ÕOìÄê£!¤„Æ=èW„jô½ø°½^ˆ<@gÓ÷}}Pôa® Ï (q'·ü¡ËçëCºÊŒúàéƒÚ­¯¶Wî>‚V÷oH«:$Éu‡öàµÿñd|9‚Q¨{BµçÑõÕOÛÛ²\ÜŽ6gU`v7gç[š]öÁ“ÂòäåÕÝÓKT*MXŽwz³Ð™†æ¤S¡ÿA/PïÊ:”z™€ÖÈ)ÊñÄ€è@Úd¼°³±Á át@äz »ÏM‚ß@FMPjÀ³ˆô^ :ÐK¨Ö}°u˜ŽO‰b^°ô.Çší•eyœ›öäç¦éÖ—°ÿõb{ýi{wû™Æú€@Õÿê ã ‹0c{¼«fÃzw}¹%‚:Ç“£ô†÷ŽêרVO &ª6¥žiý•(%ÿúúM¦§•3}ZmkÝõIt{`0šéž¯mÆ.€Áh:`çÛ”¢ÒuŒÃ˜Í|ÚQœýòä›ë«÷»§õ]¹J5ž^}¸ÜƇæä+ÊOŸ]|ܾš‘› ÄÏ^~"Ýøæiú»’3Ôë²ò‰ßdzÉì»Õçí]!ø÷«õêÓõívõ¡l…Ïç4›ÕÙ-t²í{"ظÿ~󈚱­–>'YÅ[½Ìlÿ¨²ˆù–aG6mN(sï·È0Û=­ÌãÙöGVf§™üùSÞÁïÿðþ?ø§ÓLy¯·?¯ùù ±Y}ó¾gñ¼ÞÃÓéàPk>•äÔ‘Ùû”ŸqðòA"°K> ~‹äêRÙ™VžéK¼j–L!‰q÷é!¹ÁB~¦ê¸4`Á÷¢¿bˆq)Îo­}#²K-?kÆeò¸ÌW ±+Μ+Š{Ï(Á²€_‰åq™¬!h_ü&sù{É",—a¹‡`eŒ `D _žU|ù Ë?Ëd7–q™Ý—g¡À _a_ÊK™qò:êüŒY6ÃC—x\¡7.¯tq(‹É}¥ !Ò¸„X„¥°z ‚ϳUå™*°d—üŠ!öÇUqï—J´*Ô",‰(´ª&´ê|Å—ÁZ û Š¯>Ã’ù—W°2Ý ýCìѽ“y!¾xL÷n¨sÌt/ ϱGDCC¡{7¥{$I°2Ý û,Y`™¬ºŽ™î…{–Ë” ŒœÂByÆ+Ó½ðð¯ÂWCæ1æXr6î KyË÷ùWÈëèÂt]¡ ™é^¼Ž=º'þ•×ÑøÄ}bt6ó¯2G™é^ò’=~ßò/9,ó/©2,ù¬²Ž™jþUøªÔ–z–~€U|eº—z_ ÿB<ô”U|eº—L÷²K_-ÿÒË|Bº<.»«å_Á/ó/™é^2ÝKû0ÿ’ÃTv´ã ‰V¥_„Õð/ԉ㋓íEXjÁZ ûe­y‰üÌšP…îYÉ,â_¡ð/?ã_…&T¦{ÅrHvåPP¡î†Ï)|UeºWâX•î MTXE7Q™î•|–³e\3¾Zù„"º?lu¹¹ñjãòŽ""ÉüÌVX°]n¶šb¨°„ö)D"ދ³º•Ëã‹ãB€^ wÈçN&?•&üÏ·—•VŒá{Gù™¨´:ãS,á$d$ñy˜¥åY‘izèà~‹æ˜÷¶,Ǫ<+{[ Àj05“Þ‚DB•iC—,ÏʵìÀit´7²p‡rΨó3QÖQ+Àjtòù¸K;8óœr¼)˳ KgúJ:ùL£$^DÙ!‡O¨üLVÜ›J« °†Ú.A( ÖPžÝWÛ,3—Û E«Wcú³B«Úñe¾b]2®"ÉϲEyVx´fºoìŽ9,R…*sÌ'ê¢<+Ì´|àDd>¯“®[| …¾ŒžÂbÛhD_¤If~?Ô(¢æY†eÒ³m5—•®¢Gç=$ʳB«ÆfXÉêðä¢_—(ûѸ¼‡Â,àD|MÖÑÅÝaù),ãòsˆLoŽ!ÁÊ#šY à+¾ê«™î Ï©°ì0â]X¸PQøý„OàZk%z°Ä„V½È¸¯¡*ͳ +Ó}¶­_Sž#ËÞ–cšˆÏ2,•a™`ù"]øQùYÕMl¦ûŒ©.,[ø„ʰʸl¡{kzãñ/U({Ûçp"•ŸùB«ÖöÆ5ã…••ФöY‚åz°ÌdŽªòU9†ÅÏ2,Ÿa%ûq¦³<Ͱ8MÖDÖV|…‘ЃE:ƒ¯:fæ…ª<+üË X# :õg®¯6Ö'ª|t™î3”™U”ds—͸ͳ K&XÙFžÃ‚>QøÄç(˳:.Õ×0ÑDá_v¤Gó³Â¿œN´šm䝨ÆÊG]è>óÕ* ­ºL÷ÙvïÀ"¹Ux´šímSÇeGôµ+”q %à¬}–`¹Þ¸äT7©²c¤G'½%Ãò½qÉéCÙr:.Si"ô`Måvñª¢D!¶Ï",Ÿõœì˜YÊ9”uߎòb<®¬±>1Ñ éYÑM¼œÂâ1Nõ SxN‰ékžeX™ßgŸB‡O pL‘Cs È!Ÿõû<»ÿŠºr„rt­hŸ%Xf ‹Ç8Å}á«aL_cÜgý>hfuƒ¸¢G—àkQžº÷nÄ'º°ˆZ-×DyVä£÷=XvY(Ñ«åY¥‰Ö1û'¾bÿÂT(4¡&tÏϬé>ûMº°|áåò,ÏÊ ™î3¦º°¬-øRSX¶à>ÈÞ¸ÄDðÙ=˜±<Ò‚êkÆ'ʸäx¥g –îÁ¦:@YG3¦/<«ã"º6²·§µR ,ý½1 ÉZ_ñe¬|®ÐÀŠ3]“ª]x´ˆ¶»Ø¤¬Ld˜¢ç· +Ž‹XVÕ£—ü„1É™GUéË/ÏQ$X²ú:†`E…L‡F_ ¡?®â‰Y =ll¥{ߌk-T¨6Œ†þ¸¯ŽaoW«“³Ï1>U7ƒ¬©¯ctFº¶lo66 |i&?s¦À’VX€%HEóv$ÓêrC¥ 8麰Zkm`jjè °|y& ,ÝŸcµ¤rø Kè4Çè?¤B?“˜î[ŸÂÄ«³ÆÐm—KºIÄû%+îí2¬4GR÷T¥‰¤“§ì2Nmt…å2,ßMÕ6¼Pd^ò³fý2¬8®µ¶?'û¿Rš,mªÝ¦‘`Ù…qáÈ­xއì_ÍÉg\µÀa¥u$óËT¾štò8W<+{Š]¤‰|^;ó¨a݇™ÎÄ—Dø™,¸rVZÇ5Âæë¥’+ù×-­ •æXü&SXµòq(šg–^†•´°µÚÄȶhž£ÈφŠ{3â_e¦ÅC´Æ»uÕ£³=dò3UhBØ>¬Öû;0ïL´Z.ë´Ï¬L÷Å74÷\_­ãÊ÷cTyVñåû°Ê¸x®úܳŽ)˳:®yÎÈoR=DÜ>„Ù~ŒüÞ'¨ K}X­'yhôÕ‚/]žú’…îõW­4ª¸gº/ø*ç ª<+ø’ Ý÷a1­~ߌ{—ŸUZ•ª«È—¨6ÌPneéü¬òU©;slñÅ<]Ÿ»híÇü,Ã2}|µgð¦±kõÈ7”žeX¶?®Ök(7¦Žkä7Á3;X…îSlÁÌ;—õÛ„¯D_‘÷°¹ìGéae~oÝFTÿW²¢nŽg ¬Ìï‹oæ5\‡j?»C™ü¬Ä Á8J°LÖ¯syŽÅ×oC¢{±ùàÜY‚•y´Qì÷L:@ò E?\öŧ¥oiŽ…G«/{{¤Oð³âJ%^˜Ï¤§§¬ûÙ|® ˜­e´¨Hg”]Ç¥û°ܸê÷­°b6A;4:¦2˰DGŸ0 –+ºoåªðûП#ë¤åT[°/m]¢Kµoè^¹>¬V¿WÕï;šuŽ~V²;h©ËYÀ2¬˜V–æØÀÊü>Çut¼™Ÿ™%½0Ñ„(<ºÄ ÁèÂëÑ®œ5©ìÇ´ùY‰©:óûÖ÷ØŽ+ê·÷.éÑñ'ž™²ŽZöaµ¶ËŽìJ°dÈÏTYGõœS3óŒb©ËYfåÑ®<+{[ëEXÉ‚Nª«–äPÔéðLV|eý¾øD'ãb^W?@¶·C~ÖàË.ÂÊvšÓ˜ÇºáEÆ3QÇ•ù}ñcÎ<ÉHòUí¡v\ñYŽ_„•mQ«7%B±ø¶£ÏJ,†Ð…îSÜÐÌ+Íò´èÑyŽ™:æm–ae|St€r¹9äg•šÌï‹Otæ-§\¢˜†|)YïZ6ö‘‹°Ò¸ Ë‰¢ßãóZ<+ø2c~_fZ<£YWù’]ËϪÝatV{ê1T™ÏÊÇztW¡{×·wŶ*~ò¿ªîklVÏþZtèò¬ÎÑUš˜I£¢ÚjÃdšðùY•µÆgX¡õcŽ<¶-M&ÍQ5:¹ }X Ÿpvªo»$Vhž%X6Óýؿڌkl+”s+SžÜ[чÕð‰U”Ùáó*çÛHšÏqtª†yÔý(³¿Ð”g…¾¬êÃëÑõìWâøY—îÓDC÷`emöOèü¬Ú6Ó}Žq›y¸sLI¢¯tÓrãYñ= kae9d}£褓ǽ„g¾Î1óûâ'ŸŽ‹„MC9uB×ZˆÆobý"¬Â¿Èî(:¹ í¸ð¬ÁWÖï‹o{2®5Tír&L‚ýsxÊ~tÃ"¬âÇ5ÆMd9Êöc–3ßõ"ËÁ*~ËEþ&#À¿¬&ŸríþÍ[$øk¼xô—£WÇôT¶Mÿå÷Íãó®I­ŽÞ¼9yöòõ!ý¹zrøúÅ黓7Çß=ÝÆ*´X d™‡:eU¶AÉx\ú+š –Úx3bi/e”´öÔM¸¶%i ‘7@‡ƒÎw}PŠK(Å–ÐøuÌÝA*UNPÔ\Zëul©6¨}& \%³?Ó-¸ªd‰4ê"Y:’ì'¢y]p±tË·¹¥ 6ÅQ"RIIð€¬ /®“^ZN›ækPpˆ-­Sgóú6Ï]’4ŒûH’]ª£=‚¸d”Ó5uœz£•žAÀ§qæŒXŽ“6U˜¤å)­l¶-j¸G˜R±Q‚iPÁLëWÁ˼š’xgK0‘^ÝÛhóRKãŠoÞ*pý ×ùí4A•ó%Iëc$¬W°Ê‡vFŠf-!|ŒGHKë¸4Ô·y5‘®,{Ê©¥  ur›–†~±Ö§µ¶´^!ÍŽ^Œô¨ª™×Z‰LWÁceœÐ¨ÜP’¹ZõœQLªAs¦×¹¥ö:–ºÀ,œv.½}ÐFržž4w¾xíUZw,BŒ-¤qk›[^jޝÕ¥±üE/­b~·Ò’¦¨´ÎT§l¤@¢©-ç‹*TG„£xCbÆ{üNë1è:w`†˜f„šÝÙ‡hñ~0‘Õk]ßR>2øh«¸ Sn4&1$ZÒ´U²ÍáÖ¹£NƒÙ¥–›5Iˆw\Iîu'q‘Ïo _:Ÿs*gba¨:#â/™Bx´B±;‚Õºî£(Á™Buκ!ß» ˆmçî´PùÀ NËß%ˆí¹Ú¿8ŸbÖ7Äv\Žs´D´š2ãE^¾ùãæa6L½Y½ú&Ž"4z~røÿ~wxzºJŸïWõó—æû_!¯RY£¦”ÿÇÁeR/pÓêko$  B5× ‰­úÙÐTµ•2YÅUâ$ Xq®™•ë…ñ…GýøöÎXD‰VaíC}#-"2Ã2$dÛ¼Qmœ †‹Ç Úž±n¥Ü÷Rjô^’”p¦}£SŽ^H‘oï¤=»€Tð:YÚXU0WT²“7‚É×¾ÄÙˆâu †ŠJ‘NÖ92Ë"^†‚ÂȨÑôb;: Ÿ4 DŸÒAÆ]ã&o$Ö¼øé´xÄx‘%Qã›7*Ü”§w’'ýKe‰i%$nÝÒä­´\ýÎì7GMÜ<þOT7z„4.hkH؛抾"¢r¸ªDPÒÅ‚ƒ¹ä¿‘ÿö-Ø€ªµ¤ž8²ŒL6 WYäi¤x®F…ö(Ê€œ` 2–1vû½÷; $ ç CCd¦¢D,²zZ’¶Ù8ÕýÏ¡ÆDàôˆ¥<Ô#o”HgÜ‘¹R¬®`¡T×#Ú!|“–`•vqpP]¨…&U„Ó†ýÖÑã¶›W$pY·D…%’V’ÄŸEzDU߇4CRB‘wàꇥàÔ#s ÂqRà mrW'‚CÓó¤iÄ"êÍ‘äœÔEyX˜–ÊTÌ1—sDm–jhÄ#Hx&Æâis ¦éˆËÄuø€›/ž«—VΑ­¿ ¡6[Åí‰\´Ç&užöG3HX!¡7§#ÓSrªý8€#}U¢RЉJÙî®7ºCbžÄ¶1£7’Âvƒì°’ãRëQÊÄãmÜÍ-ó$•Æ#g!©‘ÐÃ}Cư GLH)A9Õ©Ùr,i‰Î"ß&ýßëfŽüFãiê¤ÖØÐÒ*tWT‰Á54ZEîÅs`áÓ'ýie›We‚IFÑÌy÷2^Pø—DÃ{òÂ*­‘³(OM£õͦ#æI3¤ÍHv 6KŒmE%!Ž îzxq*Bbƒ,«*˜Ñ UœÌ5" ÚwÊŒˆŠ¶#)ʤëâj[©ðõ0­² 7à5´ñpGq´‰“Òó0 ÒškÔ¾5x1Æs°ª¥À¡U¼õŸ9ñL°AFLÈ8ZGGŠl(qDÖ{\tö¨øÇéMÅ~ëˆ K IR }^5XµI@Z)*n°ªÙî#å–L A ´*÷â9lŸ,P'ÙªRÚÔ‚UCL%XÒg`Æ5XE=Zæ F \ ¹T!{TZ‘¥‰ÒQZ‹4Ö¤Xx\w‚ò‘Khæ^‚¦'Is7Vr?ž­l@ú)EQ{5Òsò“)ƒ|¨´'G˜!ã.è•¤Ë ¬=ÊýxΊȃd †ùKp½mÀêˆ& l­Ê!.Gê m+¤ÜÆPñF»ßõ+¡•¤àu yÂI"çœS¸@p3ÙR`¸ž%²ÜçЀˆ1‚ú½Í©0ÒsˆT¡ß))éÑHdâÄŸ¨=€`ZõûqXÄ=<©d¥ãG‡ìtú‘6$I4çGod-Úˆ#žÓðîI9Ȇ.-ñÍ`R‚ßôA‘%b5šlÒ:T› §û¬©Âø#‰  öÓs`3Z mŒTs”Z©O˜©´b´C#ÈHç$cÔÔ]ìµÏA~W²8H_¥  Í`GsÄĵAÆi ö9 mR(¡°ã@â`U˾=òFêKÆ!™3·Ø¬MD©eÅ4âv0ð*.BdLFq€Gýš/_¿;>A%’/õŒ$¿(O¤ü?žƹñõÛA®Ã+š1AR[mo¡ƒl:8ž%¾`Þ–Å;(ŽŽÔ8Š©ŽâÑ8ßn5ø…32ùPtÓ)æ3â8¾’ÍJJ ~å ¦é“ñ!)ßIfw®Bô 4Îäý°m'ÎÄcø AoHœ.w0Ì‚ùÖM㈗…Sq©CôÕñõ!6™¸„nwH$¤r‡({8‚ò$Ñî0~ƒ'Ó—„/¶8î€+&¿aÒv*c?ÞÒUŒ%Ü!Rå ²éÄoˆvâ•~ƒçÊò‹ —J@ò½|& …èUHƒwT³pÄ/Eì€K¢qO™ {ÍÒLÛ‰SS°Û6Þ äK%–;(öyÅë‹ü¦ôb²s‡¼ÌsHµÙh„còfç]Ì„½jœ@±DÄG2+c‰õ“y;v;ò ÁH­’¬l$Ço€K«tbòæŒ]ñºÇ8’ ã!Ï^ÒÚ‰× …¼ÙAF* )ø~±ƒ62Ÿ‰â‹ÃE†å1‘S¼‰ny»JÞ“9 ÏLü“¯2êDÞÖ•…ÃûÛ7ø˜&‘·Lä-œ+ow æ2í8·ËämÊÅùcî”ÉÛò¶‰¼\à G›À$òöqú˜¦ÊÂxá[4$òV.]—Øp¹‡8$¸ák'Î*qÃgXrãXrðË”y¥™/ÅóÕa±ƒs.¿Á²Â)ƒPh-ɫǼ¿¿”"Ã{&<ÚAÖ¤k0þö“R¸ OJ Ëû½¤”ÄÙšˆrp/)E*¢#B‹ {)…ìé”h?)…^îø¸”â7Ĩàý¤†ƒ e?*¥íè¢Î»Ÿ”"´:œ9­ö•RüË.°ý¤Ž8ÅþR b<ê~R huñ(n?)Å‚ y¥•R8äÕ*6ÛKJ¼Žêì^RŠÉ;-Ü^RŠÉÛFf/)ÅÄ'ÙÍ´Ÿ”bòV&Oúq)żÎÔú¸”bò>/ÜãR*’wl¶—”bòÃþR*’·W…¼“RX8'ôþRŠÉ;‹ßOJ1µÆÓÐý¤¯CL¾±Ÿ”bòÖ¡÷XJý£ºâ£óÂKÅtk}‹ú)IÄWÄ›õøo\ƒøù;ýu=†¡iyáT‹àú§ííåÙM"ž¯N?aN£Ò «…Wá Ýí¶ëA¼Ce¢¯oi.ËuŒkÇU @‹Þ•²“‡Ôw˜¼”Bz©o*†´Ø^^ÿ<­e‰ŽCåùõÕîîöþ<ãb÷÷È~{}}·›Ž2Ö¼n‹Ç4âKˆiû†T’©§e£¾è‹“—ÏV/PËv±ºéÁÁ ®|¹zÙTØ>ï>n:8¼úpyv!<ùtöËfuv~¾©¹R~¯¶?f~Z«A–Îðð†63©íÝÇë„9ôz›~Ggµzòbuz÷ùrûôàÏ´ ïںɻóÛ¦øUlpÊ?¢ó7Ûó¿m&EÄÇJñùæù1¨Ñ*Eïb[ã”ûþG0ñçÚ{Ö]s©ç“×·œ±ýÛ-ñŠËK"H®ôsN$óÃgÚøÛMúîààŸ@y=×Äðw«'g?¢E®í’ö´R¾UˆSzi ”õtHÿî_‹€xšh“ÙÄD W[¢~ÚõWèôÃõýíêòbwWwɈØ+u3m¿(ï¦Y®ÏˆÓ¸ú”Ê ÅÊ?=ö}ñÓŠ¥?®W?œÝÑÒŽºÖ¾\ìà$¡”(•pŒñîF¾¸ŠË#âŒÛ÷ªpŒe 8bjÖ3­ûÉ¥‚¤$µçXÙÙ‡mÓ7½ð†þb0žHkÖéÙŽÝÚIO².†NOFÐCïdcaX=1zãQnâ‡Ñ¾ÁŠ $™¸Ž60§áè‚ V€BȽ±¤ñNñõÄáâ ÒXÎGÃH£ ‹0ÐD,.Ûˆ\›iwsÆ*¶ÝþrË"wVéôWøGÛ¯#Û…ÕÙ}Ëþ€@¦ê«Ñ?T%¯çn{w³ú·H¨6–Ÿ ‹T|ù.IˆÓéSyqüluøœ¹a•//>äËÌ×ÓT”¤å])«úõ—˜GáÈGóH+ýóè÷7d ž/£y$ 8ð÷2Ä›GâW™Grã¾Ø<Š˜ú2óWjþO›GÎ+óEæ‘4¸ÃüÄÈÑ_hy\8b kxȶyÈ<òyh`Ûóe摈Þ%~ãÄ™GÂoT`»(ø¯PŽHØ/6”ÿjô›GÏ c‡mvéTm¸fxz~Ñ0¢>ÙïÍ›YÅ=õôàèãÙÕTa]}´Ú>^:ÿ”ûèÚ¸ÂiUäçzëSºO˜7d˜ÒÇ;RÿPdý§‹ëû]™ ]/@0Ò–_çöEÿÑ×Ç =¯qÉc´´«íŸH4sÞç<âeüÞµÝ#-¼­mõO¼-sv¾òÊ€¾;ü~ý K~×BK(´#} æv+ ü«w߯^|óçÕ󗯎W><]ýñí³Ãw¤s<¹ùa»!qûææns¸{.×GòHn>üðóÓÕ\bPÏŽ_Ÿ¾|÷—}AíμÙÜ}ºY„¯í‹½Ám¯`q¡DÁŸü5™ËïÏ>ïèŸ$\ðï'"OÍdõ»´pÆDúw:µY @áõ<áÏ_"˜åôåë„ò·o^¾~—aBù¸däðëßð£¤G絈Ó/ú,8Zèóæäè·È‹“Ãg/i­_ýñÕâAÉoÅA±íÒÁØ¿_¼ZŸ~¤µÂ1M_Ô_>ûi[é»b=€ÙüûéÁ·g·w¤X®ÙŸ²ý%qÃÝ9Ù€qGU-‘¬ÍzŽu}…þúv"F²n×´Œºãì[*•t}Ñ÷ÄbXïæ-,j=épÛ?Ó£³¨oLk€A\|"=ü§íĨå ÷ü’tgÒ|oî/Y˜”b.GÓ£Óï“zÍ£–žz—–'/×ÿcVû¹Ûò8­Ðúüúöv{5‹¶g­ÜÝ!žzË:“j¯U¼Ÿ3c|]Ö~ðÆ”Òà¬Ò¾d:ƒÆ¥üxÏ8æ¿øº>㻂¥§>]cŒþ${vñ¾ð´§p¸bŸÿ®ÔžŠoÅ{¿ñ|éÉ¥·/ 1Uê HŠoÓÂGõzÕΩ¼­=P¥ ®}©ý”¶ygr­ánP')±VËæ©S켃ŸŒãRÜ*­EÅíà”o¦ ÿ¢“ñ^l홆ç¬+‰J¹àˆ|¤Eð>ÞoöÄ _¯ëŸ^›œ X Å6ö …ÂMq«d;ZécžÚœ; 7 ã}ÓÙ;…µÌ¼[Ò×EéŒC¼7:}'î}˜Š¸ÌD§ÀÍzïÎp+„q®y‰ð5»†`”¡$Xg›?‘/HÆûuSÜ -R`qÞV1m@µðâ]@;§¢ÍÜà–P*n]¦[Η5y§äÐð>!|hF+q‘>Þ[›ÏSjÙ$f8ÚèŽï s ðx—Ñp´mV%¸Ðp0p‡9Þ#›Ž«`+ƒ5^Û†-yƒËèñ>Ø”‰ŽvUŒ7Í´qY8¤{]3BbŸ†kâÒK§R4"Ü&Vs2¸–Múœ)&3Q+ÒC®o?eÍîœT³íÎ÷‘jÐ(d¸‰ÆâïNTƽTK& +øWôJ¸èÈöúE9æ=hlÅ•ƒæðVØeH<]zP©²C¡£wå.H%ÃQJ+øIÔž!Ò±&*Öyñ躂ÆrW± Ô••®£ëûËëO?<ðV÷©«xž?ZF\íŠJVç®.¸iù»mñó÷±‘g3g†Öüac«ä£;9~uø}ÌFwúîøíïnlµ§îoÞ¾[?¿¸ì†nŠÚý"ÿ\\ÕSé&{{Õ„ÉÖG×7ŸÙ8¾|_š‘‘|}û~÷¯ ²Ý¬Çwg˃ºÚþ<étquv—¶÷x‚&8¶¸zvu·{ZÁü‰l¼÷5$aÔ#`ŽÎ.Ïï/+œoÖýßå/¾z±æƒ–·ã-\{¼»=»Ú¡èR¹Ëõ¯µÇÛÛëÿM%¿¢LlºokG-Ö¶ ×Úaqj\#8º'›íênþÒÃØIäVÇKÿ2‡+H‹¥®F2‚úÿá‡ë·Å—Nœáúçí{¸cnhúÕ¡°»ÛÞ HHV~w{¿»[áí÷]ü´}þxÓÐÖ·à>$Èž|óüÅéÓy^€çi}ÑáìþΞ¶ïK×^g³ãê~¿ÚƒÝ¿$k>¥ Ÿ<³ú‰ýPý™\G'ƒF¼"lÂwL*Ó÷}}uKfn OÈÝ•ªq‘µÖ¤ +ûÁ¤?´•È-vðj{õáîcQhîñ†´0óA äM^ªƒwåÈùr£èdqkÏ#Ž ( ÆíhUdwsv¾¥Ù½L‡š¤sí(Î~yòÍõÕû]MžŠ.Æg‡W.·ñ!òÅOz>»ø¸}_ÄŒÉÓ³—ŸHK¾yšþ®Æ|ùú†¬¡|ÙäãÙŽ¤÷Ýêóö®ì›÷«õêÓõívõ¡ì¨Ïç4›.|Ä›éÔç7¨Ûjés’•=ŽWbéqT9̓ì˰#kŽö8Ôº÷Ûd¢ížVôlû#ÇôÅÿ”Áûã?¼ÿþé4SÞëíÏk~þ{#"aBlVß<á’*£dïõsšd‡\)#ªÊ³R€—,Á’À*1š*ä²L>?«…ºÉÜ%X\‚fVÌ„Rü†©Ä@LgBX°à…} IR²‡mHe££sÏJq˜Çi\fT­……ü)ÅÁ”ÒܧÂt¯_FX°à5±mÑ·,䞨”Œ¹ò¬ü\¹ Ë=«F¥ L¥ë¸|†å‚UãGsL©)ãª42¾Â"¾«¥ŒD_1 =s¡à¿i æõÆåU-ô‘WAçgºÂi\“Bm£qY]¢eC.a¡Ë³ KæqɶÖò¸Üt\•&„J´:.Ê5—+Å0µNå„ÏÏ\—ÁZ û²£C.{/d~V‹¤‹L÷¹œVî]‰jFpp¤{—žÙZdXdºÏžúô•)TÖåY¡/‘é>ûêÃeŽP˳ÂsD¦û\h­ Ë•b&v¶‡š9fºŸѨŸ˜ê&ifH|"Êvæ_eŽrÈë8*¶3YG—i"Ìh¢á_2Ó}.+Ôç_™Bqi?®£ÏÏ*­ÊL÷¹PÑÿÊ{HMq_ù—T–|V)Å™?&<§ÎQgXê!X5lÞ,ó/™é~R¸g„{?šÈ#¬û±ò/™é>*zŒO„eþ%]—]„Åü«âk$·[þ%3Ýç‚@Ë>0®hµS†¼ŒËùL_¸qñåò³Ê¿Ô0‚µ@÷ùN…p¹×`7ªè9bRìÞnªBÁÃYñ0š£Ú”ûD¶GåYá÷ÚTZ]€Å¹lò!礘=«üKÛ,3ì]'Ý7Ÿ³Šò¬âÞñe¾b]2®j§XCó,ÃbºoìŽ9,!6¢ð›ÓEyVx޽qÙѸFº†,N`“a™!Ë5°Æ|Âo\Ñàʹ´.ÏÊ~4¢7.?ÁWÈòQÚÞPÖ±mC®©¾¦°ªžS‚ dyVÇ5¡û0Óòc&£•æ(˳²‡ŒžÂbÛhD_²“C9¸/Ï*îMšc)F>&•k™&¯£,Ï ÿ26ÃÊ…ºç<'òÎ8®qQf~Vø—qy…%XCS^šñŠÏ2,?…Åc\š£9bB”ge™`µ±GøJÑMøfe³ŽxVÆe‡ŸèÂB¦´,kKH ÈÏJáÖ•=XbB«µïPB2Úg V¦ûRH™m£ ¬ZÞ…)¬R˜neU†e€UlrxJ)ˆí*¾2ÝgLuaÙ¢¯ê<®²m—ékĿĀBÝ9Ô(ó{Sžš°¶7®/t3^8´Ï,׃e&sTÙg%KtO™£ªãòV¯ìqlo7E¿·ÃxŽô¬ê÷6Œt€,è !Ó}YGQžþ冬‘…Å:C‘%ìM–g…&\¦û ef%¹è«F¼¶Ï,™`õÊø¦9ªFÇ,™6?“e9Õ×0ÑDÑ劎ió³¡Ð„Ó‰VKÁb¶q§ò±ÐêÃ!eyVǕ龞à ›b!7æ9xVö³#úZ€JñÐ)Ú<˰\o\rª›”q•ý8´Ï,ß—œÎ±ÐD.„×̱â>ô`MåvñhÇ”ÞÍ~tÍ}ÖsJÁâ©¥œäPÖ1ÇúÄHÖz1W½»Üë—f [úòr ‹Ç8Õ'Ê¸Š­ÐÑ'|æ÷¥ÈðœO°œÏ¦3XUðY¿Ï³ëð/Ö£“5«'tïja`GX<ÆEÜÛ1_ã>ë÷m¡[9µ;ò¹‚°.ëÑ!?«:€w#>Ñ…Uí!Qã]C~V O¯¼ïÁ²S`(¸/Á²åYÅ}HëXŠÓ²aª½0d^Xö,r(dº/e{°ª¬•c~ÇœaeºÏ˜ê²ºÐêD/ µ°ù*ÈÞ¸Ä\H{HŽmQ<«°To\3>‘e­*ñö•OùtÖ0ÕʸFE¬S6ÑˤbäÅÞžz<ÖŠmý$kMÚC1Þx­ä¦ú™‚M°ò¹B+ÎtÍÙ¦­ÚIC«×¤Òë:G· +ŽK(·QÅï+MÄ›9BÙ¦ÈpðËs –.ú*‰ŽÄï]ô3)µ©~¹úã*ž˜5õol™l«T SöõÄBÊÃÐWãÕA¾×bóeXÖågµ°ù ˆ|£3ҵݔ”5ÅæÓ©€¸k u¹€x>››ÁâdÔEn[4äg®ITVk­Ñ( ¿/{H–guŽº?Çk-HM¨y}dò¥)ŸŸ_‡rñâS˜xuÖzÉÕ ÔÃgå󳢓C^„•æˆôà3ßPô7ᙫãÊÄóëÌÛÚ.ë8dŽ˜Ó=»EXq\km6å³Ü²ˆÄðÌÖqåâÅ×1ó‚ ǶE²ù²ÓægÅW Ƹ+­#™_eo‹ìã‹W‡ð¬è&Pì"MäóÚ™G ë.3î‹R&?+6ŸrVZÇ5Ójk§®*ÏÊ*ͱøM¦°8?{YÇr“G—ge…^†•´0Ôë̲Cä ~*F#qÁ­ËŒøW™iñ­ñnUlQ•÷£.ÏêmVëýE©ÞbwŒt&~VèKdº/¾¡¹çŠ8_¦‰!Ÿ+äòPC;G߇UÆÅó(q1=x¶kù™õVÈÑjŠ-˜yçÀzu9k²iMòÁøM¨°ü"¬Ìï­¬u³·×™♯°2¿/>¾™×R ¿Ïzt*öHÏB¶;`%X¦k&"óÕ¢¯Z‘ŸÕ½­Ä"¬Ì£¹DÙ‰¯j‘Ÿ•3|¡äâ Fuˆ©Ï]éüLšP*ñÂ|&==…\ ²p –‹åeÜ…¬š K÷a5:¹åS½Q Œç(NèÑ¢âË,êºoµÝ£Ý!7±p7ô‰§€?¿ý9òR¡{kRÌ]ÔÉ¡¯ª"k•ëÃjõû¡øMDºO^ÇÕœ‹ å—a%»Céêƒâ¥^½^lÃTY«2¿Ïqo&ë¤yeý«È¡JzèÃëÑ%¦f(¶»)ÏÊ:êÌï[ßc;®¨ßšÂ 3­Šü¬ø£Aˆ]X­­àpvõ‰<ÇŸ•˜@¡³ž“cjfžQ,u‘i"ÛiCÑWC—^„•ì!褲ƈd~_ôUQaeý¾øD'ãb¾à«è«‘_àYñmae;ë£aöñùü¬¡‰Ìï‹sæI&U¨ì¡XÊ'‹ŸUþ¥ý"¬l‹Z½±~$;²Ÿ‰Ÿ™ºŽ…îSÜÐÌ+ͺr‰ÔÒCCíü¬êfX„•ñŽ\x´J~̧ª-to2¿/>Ñ™·úmM›õ ›ŸÕ9¹+‹‹Ê”8•uL•ŸU>aÆü¾Ì´xFY”Å~,4áʳ:G݇՞z åœ/&{­þ¯±m Ý»þ¸¸}‰šœóåg –íÃ*㊺r™cNÐÏ4YÇ®¸w•&fÒ¨è…Ï=_`7åY—ϰBëÇylÕ¦D2‹ì÷M1H”÷¡«á¤+‡B_9¶€é+ú ,›é~ì_mÆÅö@±;tö=Êò¬ìm+ú°>‘,Ϥçä3|ŸŸ?9’æsªaŽ&Ó—f¼·m£ZÕ‡5Ö£e>w9mB®ñjضL°tŸ&º_Í9²Ì±d¶Ì¿ð›é>ǸÍ<Üp­˜¢û†dÃÄ}9ŠŸÖ.ÂÊrÈúMÉ.-EÖÉ£þeCã³²™ß?ùt\k!¿Iö=‘ŸU¹mý"¬Â¿dÅW¬t=:ú}a[•=d³~_|Û“q­¡j‡â7ñI±ôYCu6…¾Ü°«õcý>ûåRmc34¾íßõ"ËÁ*~Ë•þ&7À¿¬&ŸrÿÍ[¤øk¼‚Ï9•W1‘Síû{æñy×ôV_Zö—€bIÉ5Q'Y–!ùœ¬(|ÞÎKC® +ãÎ‚Ž¬L¬&¿æšÚÞù¶%18í’]¬µ²!݃ñÔ”¯«Å–°‚4eW[$©F ƒU*϶VÄñHõˆú.ítýå+Db8‰dã&±ê%†8NŸ$=üÁs®osKC3Œú/Nö¥È¶–À%£Ð¶DVý˜ ‹Þ.«’…g-ê¿×–4÷ âí(êEÌ6¸{2¦ÍÜ5Y­žo9 W@ªü„[$ߘzƒK½"ÍåûLŠO–ðg*L$Ò¶CòæÑÜ©iòïp¨Â™aZ’.¤š©ÔÒx™å»1ÚržŸ×ù탕\ì€ùµ#ƒ,· 82jg¤$jB§u‘ÄG|˜BΘúvÒÍ­—:iøé tÆXк™;Ié”Jú‚µ6Äs%˜AáòKЖŦÛ"Î Ÿ4áhaV aÊ 6ó<8H¼TBƒ-sõd3J³°ÁÇ48iÎt;µ4AÆÌTD?^pv{¦œA»`ë8áu¢M 3ÕùtÂB¼=Ýb‰1lm¦y™’žœδT‡ä²Ág*gr/Òeƒ¬sÇ.pÚ¥ù¸_xK˜ØÄ¬ÈT'DHs78<®ëN-U±F/ïýPSþ}s&¯SmHl…ŒCš¶ie•Av¢ŠyÌÈŠœªMæen锺‘¥Í3¸Lu¸]Ÿvœ"£»îâÎ"½ ™o(cyGãÞMÀ•üvî–&œ3ÎYB¡N‘÷Îy×pü>Y©nÈIÅíh÷HûE^þXI`pð×oV¯¾‰£øë!þûüäðþýî°ø~U?i¾ÿòjˆR@)VxØøÓ©’hüÐêkš—P„$íÒ!ñ*Oë N%h“º¶­j‡OŒÓ:Ò X›H2"Œß(<1@ß¾ÑÏ!´KüM7âƒBª<áã~L½ä‹ħ-ÉÚex£Ü÷ÅæµBiô!^“©oTžUz,uJÈ? gET”Fj>”…^)ÓNÞÈ‚²¾>çàà¥Ãm1BíQ¢’9†ûFÓ€Vl°$dGŒoÔi׸ɉuç”øFÚíÈéF/rBÅ<}`šCó$ð¢bû‹¶í9ãˆEÄ”a+³ßiX-Ml€6³i®I ïq n€@«ãd¬ äÆô;Ñ'Ü´¹†ïøü÷,$—´‚¤‚ˆPÐô‘¯ï$™¬¥ íƒCR£i,Ô•uºýÞˆ²ÀÖ8Z"$È V=‰`O*1Þiš%F¾-°Ûà‰Þ¤XÑZùýÞ(Q-‡ÔÆ«†rH:ÚŠv7DÍi;ÁÓWŽ”«¸Ã~ëè7´ðÊ+©6©IyúôBÒmË&š©û´öÉûaÛNœÙƒG/øòÄ| Ët”²|ë&^,A¼, ‰.½A±¹¯ñòˆk(µ4”*àuˆw´¹+"˜uyeÍ¼Ž‘Œñb ÿˆã\xzÈüÀoÕÆî]—Icã–N1ïûâÕR’G(‡]^8ïâHƒã®Äj‰ç”I³k¸]8’³qápA$Å“oX5IC2m'N»ÃÊp¼AÈò’c©†å1ËF¼¾±„€©å7ø˜ +ÞÏ&d€Ø0SòfI3áp3N’ÀæNÒ¥-Xb^1&ofXñ† (¢[0¾ΩÒ)æ´‰Äò¶™¼I®ä9€–k'×dM÷º_Ð:¸åñ6K¼TƳáp±ÜAZ]ÈÛ'òöpbvçÀäß=›1°H–7˜ñˆ¼ù˜aBÞ¢biÜcÒ@Þ&‘7QXyƒ«y³ó9’·Mä-‘iáŒ5™¼]ÜL«C “…s!²¾É[¹2i°ˆÚ‰©5d´ªxVÍÇ’ê¢02ÞÓ|¾ªìbcŒâ#ž\ Å ­%yõ˜÷÷÷‘Rd€Ò*ô£dÓ /žò^RJmP&;ºÎ÷’R´ýȨaµk?)qd£5ºŸ”Bf„`“HØGJq‡èÔßOJqÏ;e?)…`bã]kK) Ž[k/)Eh%MJÕmü˜”â7DËa?)……#MÚKJÑ 9í¯ý¤Ðê|ÙdK)tð:i ûH)ê@ä½—”bòæ¬|{J)&oíŠö¨”bòVÞdò~TJ1ñE?û~RŠ;È—RÜÁ錥ǥT$ï_!¥"y‡Ž¶ ¥˜¼c’ßý¤T$o·¿”ÂÂ)µ¶½¤È›ôÂBÞJ©H­¾(aJ)î dU“R o3ØÌ—&Rêuר$^*[+]ÔOÉE¾z´4Þ¬ÇãÄÏß©´è?¨ë1 Õ"©šJ,ipýÓööòì&Ï×§Ÿ0§Q…†Õ‡ëql„UÛõ Þ¡Fн¿Ÿ¼¨ßqÅzqm”.zW P@R[#bòÒ!"®µCÚÆ?l/¯žVµDÇ¡Ž²”FO¸ØýÇ=òƒß^_çèu”2ÄQra&®ÅÓˆ/!¦íâ {Úö*¾8yùlõUm뜼@=Rz÷˦öáùùýíÙy¤z@7ïÖ$›†ƒ“³÷¨1Áeåß•š¥Í'6àçÜïÅÙýn·>ú¸ýáóîãö§ƒÃ«÷—g·“Og¿lVgç盚+ 5àçðjûaæ§5©f¥s,ÕN›‡™ÔöîãuÂz½M¿£³Z=y±:½û|¹}zðgZÐw«Î2ÖÏÞÆï'ß–ïÿóùWoÿWìpöé¦Õ8ð!åu#ÎnS=6â&ØÜ„®u”ÎZ¥mµ¨a•Jo d¥à Ï,³)y’ørf°ª$dÌ’Ð 2ÅaÛ0ª"2Z¬£T .¾²X{Oò|¢ÒM:Ÿl×mi:L5šðèÁ^Ÿ®BŸ³«Ï«ËíO¤î>^üxûÕå­Æd-Pñ:­ÄõÝtyââ°¥—‘ˆ:—ðôÄ ¦³ùÚš9¡Zýf¼+ÉÌàGêÍb·ÿ¢F4ÊUSNͬ(G¢˜³Í7+guÃ7­s¶}-ËÝ¿ãŠUJjí qH1è’_©|NIW~Ó µ°k¥€2ÎHÂ1¼*ÙÎ!òâ7[sÚ—L;WØ5#P1=‘,Í·&N/‰ÏlM%\žàm[P’/bæ<Ö¹’ÕU”|¸Òç[<¦æ|ePn4ªÝœ ÔBÊ d¹ª™q³¥¶8Ãõ£Q aê¨Hµ(wP‡&ûf¹ëW³Ùp A˜€mo>DK×ÔD]­ü-TP‽‚#P ®€`¨ã+ÔTYØ„Pz4ªš|¸®–óIw9íR§žÄ?m(:°Ð›Š]s~C¿¢2«°—y ))̳þðú„þË–Úü½¿ÍŽe ]nvúÇ££ãË=íó°Ù£7¯ÿt|òâøÙêð9s="¾¼tú/3_OSAP’–w¥:Dè×_báËßÓ<ÒJÿÃ<úýÍ#IzÆ £y„>›Gáïe‰/6į2äÆ}±y1õeæ‘LÏÈùo5œW½ž›GÒ Oã#7Ö|¡yärÀÖƒ¶ÍCæ‘w¸# ÛÆŠ/3DPHÈòÄú3_j™á+N2á¿B9"¯¿ØŠu) î÷G«íãE„ñOÎé`´ ¤MT‘Ÿ+¯Oé>aÞæî‡éQný§‹ëû]™ ]/@°–ôX›¶ÜÈÀø:·¯úÁíºã†ž×ø[#«íŸH4s!ß^½ÎüÞµÞH½­mQ¼-sv¾JÊ€¾;ü~ý K~×BK(õZOÍí" 7V ùWï¾=^½øæÏ«ç/_¯þ|xºúãÛg‡ïHçxróÃvCâöÍÍÝæp÷\®ä‘Ü|øáç§«¹Ä ž¿>}ùî/û‚Úÿx³¹ût³^Û{ƒÛ^5ÀâB‰‚?ùk2—ߟ}ÞÑ?I¸àßODžšÈêw;hጉôïtj³€ÂëyŸ¿D0ËéË×/åoß¼|ý./œò€¿þ ÿ8Jzt^‹8ý¢Ï‚£…>oNŽy‹¼89|öò˜ÖúèðÕÑ_-”ü–QÛ.ŒýûõÇ«õéGZ+ÓD1ñõAýõ糟¶E‘¾+Ö˜ÝÉ¿Ÿ|{v{GŠåšý)Û_7Ü“ wTÕÉÚ¬çX×7Pè¯o'b$ëvM˨;Î>±%):Qׇ}O,†åðnÞ’Œä,ÏH‡Û~€ü™EµxcZ ââéá?m'6@m,h¸ç—¤;“æ{sɪÀ¤s9š~¿˜Ôkµ|ôÔ»´m¼5ß¼3àZGEµ´0õO2_œŒ÷bg=•Í2(¤½¨ó”w?á+=Óú|…;û—œU®ÄeCqBáŽF=q=AÕ—²|­ȶâ}ÓéhM˜¯È”%Cdr ËbÝè$$‘£4•JyWIXïLºÿ9}§$MV´(ÑC®>ÇŽI90 ñJ½ÍSÒÒ›ŠÜëóÔ¤%úxsŠ!Ü÷•â n¯TÂÐ:¾ÃÁs“UáD a AÕ? ¤[Çû‘3JÀmÖf¯‘®˜%Wæ dˆ÷gïTVʆúhïXYŸ’5Êie8xj¼*–†ãkOímÍ|ˆc'½`ã–¨ÆÈf—áîK©18§9>Œ#õ´ËjOÚÇéªyÜÙÈ^àã=À9Å;«ëðäù¨«2XÚC¼Ï7ë)å*J”ÖJW¢G{¹ââéÎV²}‰ ƒ«›N:\ÚŠ÷ë¦ÜÄ ÂAA Ñž³ b¢š×SÎiˆYM%Üþ´²ŽHYË'-|ifÂ5‰Ã6/QX…¡™‹ˆt+ç4$šJ3OÜÉ«ÛUH댈÷Ϧüi\)GD,(ÕìO'}¼c5Ì0D£›ýi­j·ŽqÎ[ïƒMW×[¹âe¬œ–v4-p¼×5í³¦Ù+´|ηŒ[ÇLj·èA;®|"ÈÂ+ÐKh¦;hnÐ…³€i­€xÊo„S"y¬Øz—kÍ6Û²LÎM{2tÓtëKÙÿz±½þ´½»ýÜÆ§üW_ WX„„ëëߨg8d@¤7¼tT¿FM¨°:'T¥"@›`¢ ŒJ;^¿iÀôôù¨¹;ÑCü¶¦§àGv48-f`ÄЃÑLyOÝð30v FÓƒìMÉgÕ‚áÁôÀl¾àÓŽâì—'ß\_½ß=mÞåê³Ã«—ÛøὓžÏ.>nßù¥79#!ž½üDjöÍÓ ôw¥0fì×7dNåÛ*Ïv$þïVŸ·weß¼_­WŸ®o·«eG}>§Ù¬pc$^IÇF¿yDÍØVKŸ“¬-rÀ‹Ÿ£Êid'X†™ƒ´Ç¡¾ß~ o÷´ò gÛ9º¦®þ§ÌÞÿáýðO§™ò^o^óóß b³úæ ×de‹¯NŠR+¶çhOSž• «+™aÉ`•Jß²„0ªò¬TE%{™`q ›X1•JñeçZ«*?“u\°àÆU i(’WÉçÂäg¥ ìë4.3ª¨ÖÂB†ŠKæ:2qÏâY©(„¬F nÛVÁB©~… _ såY©¦¹r–{–.Q»¡Ôè,Ïê}†åWÉ´rݾ'Á _a_Дք/‘kjÅœ›ôÌ3WeX¨PøM[q¯7.¯s8,ª¡ŒçèK•ƒ•i\“Jo£qÙÁÌéòLX2K¶•¸&ãR‚Tr6®‚{¡­Ž«zMðå2¾ØÍ;—«Uw…ÁZ¢ûL«.× 9stFX™îs=®.Ýç*ÅDªbJ÷¡Î1Ó}®Ö§Õ€­ôŒVë3Ýçja}X¶ì!?ÝCºÎ1Ó}®ÔÖ…åK¸u©[!ò³RY!\ _þ!þ•ùªËõZâ:2ÿ*ã’C^ÇQµžé:fÜ—è{‘iÕ¸ +Ó}®KôÿÊ»)óBâ_V¦û\éèaþ5ä]Þ𯲎ReXò!XeoÛ9M”½-u†¥‚Uø—ËüKfºŸTþá¾á_2ã+Ñ2vX™îs¥£Çø—[æ_ÒåqÙEX ÿ2ÊŒe-=«ë˜é>Wzd\™:züK†D«:æ_…‰Rw:ãËÕjæjÁZ¢{›oËä{ Un7° ݇Y=ú ŠÊyü°Ì¿T¦û\Yåaž£9£¯Rá^eºÏÕcú°JEÚZ÷°<+ë¨2Ýç 9}þÕ^™Àª² []n.A:%ßákDü]æg ,›*Ü÷jiÇq •ˆ/Ì­Q—óRÝv… …‡­¾Ú—©ÕÂb^;ŒËåg¥êÛ  ǰjÃ4.N—”©½T¤uåYá¨P8טb=WĠÖù¸Ý–g…VQ¡p†û ,ƒJRI7)Ç®¾Ì±à Ÿ4˜šIoNŒ’¹©Tù¨Z–g…îQ¡pk¤ÑqvœRÍåS\YžUX °|>®ÁnŠÎ¤Ju5]žºG…ÂÃYò0š£Ú”»M*Œpg¢ðUm*­.Àâ\Oõ|5ákhŸ%X¶ËŒÆå0£ÄJ„ˆËÏD…寸2_±®?—ɶ•’ù4Ûäg¶ÒÓ}cwÌa ÁõzMä3uUžþ¥Co\v4.¤ë*§Ê9š@–g÷fÈãr ¬1Ÿð›z ¯Ä9©ü¬ÚFôÆå'ø*UßDá_ª<«ã’=|MaU;Íçsò«êfB÷a¦å§ªg™å`©‚¯JFOa±m4¢/Y«M®ÄF´Ï,“æXª™ÏÆ…ŒK¥šf®ý”džUX6ÃÊ•¾ç1”ýèåqQŸ¨Áãí³+óûR¥xÎ'@”J¹Àgý>ϮÿܦXÙÒg@”g…G{3…Åc\Ľ÷Y¿o+åÊ©ÝQt/3Ÿ0ù™+ûÑ»ŸèÂBºÕ4Ç ²Ígò³jy߃e§:@Ñ¿Â̆©:€iKu[ö/Lu€,¥žëe…L÷¥"mVÑMD®ÜðèB«!Ó}ÆT–-çVj&«do\bªÌuŸ5ãR½qÍøD–3»Ãoª¿0è¬aªˆ2ÇÌs _­4Lªf^ìí©Çc­P…+Ë´Èïõ&Öé[#ejÅ—M°ò¹B+ÎtMj{“NÆGXñ6ÂÚJ®Àž`¹eXq\H×Zª[ÆÓ:ŸdC¨{(øå9ŠKmtÖ™†(·uªê,¤çŠâ Vè«xbÖB…M>}ÁËÅ*§ZWúÃÐWãÕ!sµð¯T\obD:ܦTÁrò‘¯ctFºvÕ×1¸\!UägÅ_H<7à °8›u¶Ýã¹P¥{< ,Õ‡ÕZk*p¯›qÑ/¹äÎÐTÁtŽWx7¥:w®¿;”ê年+W />…‰Wg¡‡’§Ü^Qñ™®:&áEXiŽÈ/^è+û†âøð,ˆ+W Ïg¬3oÓˆî3Æ==3•¾ü2¬8®µ6[é>á>žá™)•ч\¼ø:f^0á6²Ú#ÝÏŠ/ ŒqVZGkªn2xÓàkBô¡ŒKdºÏçµ3Ö½Ø|qŽUvà™*°ä2¬´ŽkÎ+—qŸl¾w³NµÛ#,•æXü&SX1v¡¯Œ/ŸŸ‰:G½ +ia¨ÊU÷P¶Ý}~V÷0#þUfZ,–…¯faªî„=Qp/UV‘kÎi^³ˆeS—gu\º3Ç_ÌÓ¥šò‰Tݹ†GKÓÇW{oªž3ä+ˆ÷(ûV`Ùþ¸Z¯¡„Ï*󜤓ç¢n²ú:`È'ZM±3ïØx(:f¶Ý培¿¤_„•ù½uU_¾Ž";ø™-°2¿/>¾™×pM´]’¹…Œ/Þ㨡Y|0Ž,Ó‡µF“â¿OõÙ~Ê:*±+óh®!QäP–²<+¬F''=ºäR4Q7I_]ßì!e–a‰¢O„,·µË°Â*u¯GNøÊ>>Ùнò˰D±adõ%Xqo¯é=Í3¿Ïqoæ°©wùFW}µð{=ôaõh›ešÆ>÷ø,ÃÊü¾õ=¶ãb~çm•|0‰Î û–9jÙ‡5¶Jd[Õï]~f ŸÐYÏÉ153Ï(ÓW•#žÃÏÊ:j½+ÙCÐIEÑ'Š/Í”guŽY¿/>ÑɸX¿·3].ú›øYá÷Ú.ÂÊvXÉã ym~VéKg~_ü˜3O2î[–q»C–g–_„•mQÒ•kdHñ!Ûò¬â¾Ð}Ššy¥™¾ü”J•ŸU|™aVÆ4‘r.š¯0§Âçë–îMæ÷Å':ó–“~[æXí!›Ÿ5ã’‹°Ò¸Æ:¹K:“(ºÜPø—óû2Óâe=RV?@ò ŸU}Âè>¬öÔ£Õ£‹îkò³J_¦Ð½ë‹Û»b?¹(Ï MÛ‡UÆÅóp•¾²æó³jWib&Š^hʸ„hÆŸU|ù +´~Ì‘ÇVÂFœÚI—Sq7EX¡«áÎÕX‘m+™ÆeÝÄfºûW›q±=PôÂ’†&ÊZ?4ã²¢«á ¦l+ˆ,‡dYǪOXÙ™ãèTm…rž–Dß(ž•˜faUÖXVÅO>d¿¯,ÏŠì°ºO Ý'‹8Éí¡ÛEÖÚL÷9ÆmæáNñÙÒÍ~dN(:“µ‹°²²a£ËÞÖ²……gU>ÚÌ|:®µõyðÙ§ â3ÙØ0Ö/Â*üK4¾Žl+dþ%ÿ—Íú}ñmOƵ†ŽUsAçs¾d#Ó³ê7qÃ"¬âǪo»øR¥fÏU¢õw½Èr°ÊŸß’ I.ð/«É§Üàóy$þïðsRæUÌçTûþ^£y|Þ5?Ö—ÖMÆ% X“’ôd”9·‰¿8…‚º™Þ]LykKRKÍ…ácK彿Ä5ʳ9Ç bJK2¶Dýòø]ÆK«T„‹Ø›!GùÒa|Išc-'Y[*âxÄ6Ý*Ù/ÆäT7.Xk} ÷ob.² ´‹ÉPÂ)‘FéÛÜÒH2¯T„/e°É.Ú#IÙ¨-ñ mÇïV:%**Íá–bÛR8£¢&‰SeRÜ;)t–sr¦qê ªÇ„Zà¨ãgdƒ6œèÛÜ’æ(d¶G©ïƒ-•ÒŒ¥Ó ¦fŠ`Âi Y3A%xYaZÒ¡¤° Ÿ(ó¼Ð*8e*æ5ñUorB,©M&µtÞqÑ€2#åßÃ,Âߎ8j¤é¯oW¨×¨s$LÖĬ^´^Îyß´$‰ˆe'˜ŽH2ò*pU2›FXR¨$Ÿ0ãU9ÂÌ#V¥Ö¶‹Iÿ£¥Në…ÙÅEï_ç–:ø­fš¸Lš.–µÖ¹£0‰±.ÏÂRË =I'¬#k‚ê´J™¾ˆn‰”j[§¢^·+Ú|‰®¼Ô·´+Õ*<Ç^3Õ F§·ke¨s'̶:¤–È+–÷;aD ŸDÛ›iF´ÝµOtELBà’y†IoD‚LuV)™ý¤Èû¦+LµÑCÙs dð9*DfàÕ|lj‘çxC©m9¯VAÓ Ú9$¬J´ä}ð9²]çŸLi´'Ò. ʉx&‚Å•LëÜ­7&[ì\2Eñ;m‰ jKúEH/ÓS/kŽ&7Ѓ…—yùc5…ÁÁ_¿Y½ú&Žâ¯‡øïó“Ãø÷»ÃZ…àûUýü¥ùþWÈ«!J¥Xpó°ñ‡#˜¡4¥Õ'&:0I“edÛKÙD Á(Úç ,?­M½hÕœ§ EJ¸t$ø–²H2"Œß(ü&ÄÎüFK4Q§ÕÈÑìê±ã !£S/E4L£ Ùàé¿N§L{¾)@r &Ô¾1HŠrÒ[㥪˜!zVšd¢õ¤q{ |ŸZ%Ê´“7™‰f´†°ŠH9Is@nÀzcžPG¢È LÔ‚_±Ê{Šdšs$7=1l.ÒDâ®q“7âÓµo$ž)ÂŽ$ÚY êRüSá¼-±!vBzòVȘMpeö›# @øæ IüI%ÛGRûÁˈDÒR4K¬ ­œ@6’ƒ$dðF›‹ßÈû,É:`Q §>²$æh†H(*Ķo¤y9’H$¼©#«+·ß©oð†VÂT –º}48¢"WK3е¸Ó‡+ðá¥U1“ÛÊï÷F¢UbÕƒC*#­a•¸4-A¶^µ»x…ÊÈ´‰ñ6²- šUØo=ѹA>Hš„„PjçH HŒÄ­Ä›T Ð-¥ñ$^] UÑ`Ú$Íöš#JŽ)e4ÈŸ:z„òÈ^+Oº€ÌÕèË^F÷ħH‹ÃÅ~s$»Žì&b*Šöö-­êL ä¬$A{U óŽq¤‘EY@{Ì–¡&V¥3”4dÛÒ*–HB7&½Ó5™'˜98äLèwš%vÙ€{q·qD/ަHû‹^Z°Z9Kº,’9ö#´âqÔK! žCÖðž”#Úpá-©â«„ Ç™juØ 2 ÉZ¢ÎV(Ì~”ƒsQäzuJ!®±2ÒW‰q¢â–‚BS{‘öˆ$9 1 ζºω§a¤Ð’çMríißX¤%-A©¡îÚ8ÄiiH±§ŠyŽØ“çxz#m,²gˆ`*­BÅ㈥õHÓô°,hÛŒ£×ÆÜ¥Â﵎$w ‘?4ÒÆ}¼¼‘ÀrÕk2 ß6XÝÎZ±¶ö>‰TVö¢Uˆ]MÓ£-BÚ2„V‹:HcL_³ˆÑiJZbN#ƒÕ\ÉûÑ*¢úQžìƒtv=–VVÅì˜$­´1@Ú¹¤°LªwÊ»×:ÂÿEb2G#×l£>‘´’¤gÓ"H½h¶ª¦GÒšÌKGm€U¹Ïá½LœC¢æs9P¿`•$5X¹&®«ôˆå/"€N‰õpÎeìžÒŠÔ#­ˆ@n模X‚Ç{R  ´½±>b¶àÿôŒsÁîÇs°È4äzë$R@Vž£'vŠTÇXoY.ìú#Ä ÙÃ1³ï~<‡¤¹^HW¡A+Ù¾a(ÙH?SU-½fˆÛ²–`X>J»ßqºC*«„š¨Z°‚6$’§ðìa´‹ia,y ±|”ûñ­Ñ€Ä8‰üFÒŠè”pF"Þ’(lµ”ü„Oô~£ß0 XâÅĉPB#’*•v† ¤‰4ëÈçÐaicx4¦œýôTµA"2ÊÉÚöÊ89´|R»ÍDÆôºeœHÒì¡Q;ú»Cí§ç°E)°‚ÄÏC-'gw1TúT>fM(ã$cŸv”†šCœXUûñ¤Šuœ›^l *Û7’¥‹i#œžXáH¬(‘ÖL<•HXUûñ`•ÔR7,Š“úa¼U5’XX¤´‹E0›Á ¬• ±¢ˆûSšâ—¯ßŸ ¨É—zF’_”'Rþc™âÜøúí ™—\‹ wˆ ’äãdÓø+¨˜/˜§EIŽÆ°Õ9UˆW1øv;¤#©¾D2$ ’E78HôæÄ+ÙüZ~–å ¦é“±:ï#áB„%úNÞÛvâL¬üp°;ûE¹…Å:fIçÈüxPÆñ²ËoÐÏEãõ!¼tu²yÄÂH?ˆ|#Þõâ9‚Yç7°{­yí(q·Pì€pM“ß0途@|ÔoÕð îáÉòÙtŠo`ßc¼ZÊ]=´o½¸pØ‹ Hl<»¨e •†6•†¤' l.ˆDß;‡¸©2$ÓvâÔ:·bÞz¬4ÜÕKTZ8ZiŽŸSÃb—È›ï`žĆ’7ƒÉ[Åh$I`©€SæÔ±Äç_#òVìråˆ2ÖkHþoØ_߀ýX:Åœ6Z&òx o2 òà)¬˜¼E!ov ƒ¼µu‹´S­6Ær¸È°ÜÁóq“7¯4ÈÛ{»0äÉr­qE8°¨7(­}ÈÛòÖ‰¼éçò†q7k»‘¼‡DÞÊ×9¸Ú)½ äxkJ$ò&qº¸p›™¼ùL ¦•‡{#£… ±‚ “·²…¼mÞ_;qæ™±óöÇcI±Ü!Êþx3‡gÃç«f±Ù!yá,#- ÆÏƒBkI^=æýý}¤‚ \¬Æ±Ÿ”¢v|º´Ÿ”RpˆÇ`Èý¤¤ ÉœH>ûH)RaÓ2aì%¥ˆê¡¢Þõ¨”B¯CYÜG¥¿!FQï'¥$–|á¿K)>q‚`?)%qT'ÙLÞOJÅ3ÝÈö’R@8 7r–}¤<<¤!±äØKJ­™Ãï%¥xá„È¢ùq)%¡;Sö£R ä-\t0í%¥˜¼>vØOJ1yK¯WûJ)&>éežô£Rбç°Ÿ”âÁf­íq)Åäk»ì'¥"yÛJÞI©HÞ>‹æÇ¥T$o[ÈûQ)……³Êò~TJ1ys ù=¥“·‹úù^RŠ×aH|i)%£Ý—•ቔúG¡ÆGç5ª©—jÍÖRõSr‘¯­­7ëñ߸ñówªMúêz CµJD*Çk"\ÿ´½½<»IÄóõÁé'ÌiTâaµðá‚aävMŠÄ;9Bµø÷“õ;®b(y,~þ®T°€<¤¶ÈÄä¥Cªd\‹´Ø^^ÿ<-‹‰ŽCe©­žp±û{俽¾ÎÔë(eˆ£äÊN\Ì)¦_BLÛ7Äö´í”*}qòòÙêÊâ.J=8x‚¦ôî—M!íÃóóûÛ³óH1ô€þnÞ‹âÃÁÉÙ{©àºôïJÑÓæðsî÷âì~·[}Üþðy÷qûÓÁáÕ‡û˳Ûáɧ³_6«³óóMÍðsxµý0óÓZ‘â—;ÇZï´y˜Imï>^'Ì¡×Ûô;:«Õ“«Ó»Ï—Û§¦ýx·úÀ3ç ïÎ?n›:Z±Á)ÿˆÎßlÏÿ¶MeTK¥×q­S|¾y~D j´J¹ u-—Ê}Ž#ƒøsí=ë®0¡“×·œ±ýÛ-ñŠËK"H.tN$óÃçJœÓ¤ïþ ”ÑsM ·zrö#ÊZ\¤ê" iO+å[¥I|i+H_Ç¿û×" žf Z#ADb"«-Q?íú+túáúþvuy±»«»dD앺™¶_”wÓ,×gÄé?\}J•‰b!®êþXß÷?]pÍYúã:֤ߎºÖ¾qO$”¥Ž1ÞÝhÀ±=q¨¸ãö­%à[”-làˆ©YÏ<¶î'W’‹;$VvöaÛôM/¼¡¿L§'Òšuz¶ãEw vÒS+:=A½“ma±zbM㟟v@ü0ÚW#X„ |¯þ‰Az.b¨©ÜKà_ObΑÆr>FÅ !ä‰EôÈežv7g¼¡bÛí/w±Ârgå$‚‹¿ÂQ‘Ã?€³:»/cÙÈT}Õþ#¨J ^ÏÝöîþfõo‘Pá¶í‹|ù.IˆÓéSQé&O¶ë¶¶&„"Oxô`¯O×?¡ÏÙÕçÕåö'Òw/~¼‹ýêrŒVc²(™Vâúnº×åâ2‡Û”ˆ ïóý\r(ˆ‡<*[nÛPîŒ „B¹(® –7ÎÄËÅd›Ç¢J¢1USqðÕ?e­4"Ôû¬%ÛŸ(y³dÉÊ=p˜MƒbO[Æ•êÕŸ2U1´eBr[š F œ”uT¹ÜôêÝÊ’Ap(w¼¸…ƒbß[a:®\ çbæõÊçô*= 9•CÍ3[n…ÁNÈ߯ Ô”o@ ¢NAÔ…¯¿U´zªE;ê!—¿j–úm2s´WPÊ×5r¶Õc“/rÉ-R•ˆ¥@)„7£©n6çÍô )u³r†™/“BÇüý¯Oè¿lÕÎßûÛl~Òåü§<::®qïÓ>H:zóúOÇ'/ŽŸ­Ÿ³„6^ô:}È—™ú§©ú*iw¥"Ô¯¿Ä”4ðýýMI üÔüÝMIIjÙ £))7ÄJ#ÿ÷2%Å›’âW™’rc¿Ø”Œ˜ú2SRCÑù?lJ:m÷¦¤ÄÍ?²寙/4%½DºaX£Ò~¡)é²<±8Pý2SRAKê!LIûe¦$²Öù¯`Q÷J7)ùŦ¤ò_þaSòyaì°#Áî#ªD§ñùEÈøä3ÞÌj#ãf>Š5< î÷G«íã›ñORmHç5• Ò&ªÈÏeî§tŸ0oYÝW¶Ö¡¶ýO×÷»2@º^€2€xJ©Ó–c_çöUÿÑB «ã†ž×^ÒØÕvû'Í\5¹SÛ´¼!÷ôFx¦Û‚«x[æì|’}wøýú–ü®…–P¨qž*¨¹]äÆÊ$ÿêÝ·Ç«ßüùÿÇÞ·õÆy# ¾÷¯ø€Åì3îžwÒÀ<Ȳ­øŒc’“ÉÌbd©cûYÒèâÄÀüø­*²ŠünRÇñn^¦Ä’Ø,‹Åº‘¬êž¿xù¬ûÛÞQ÷Û§{oÁæxpùn»uûúòf³wý\¯÷õ¾Þ¼÷ËÃnj¨§Ï^½xû÷]A]Ÿü|¹¹ùt¹#Ü;ƒÛž7Àò¢…±÷Ç]ß¹†>€rÁ?{:R Ý7;/iá ™ô:áZ¼¬ƒŒ7wjðü^ü9zñêHþæõ‹Woy¦œ¯5ø¿¿y„»Ý;¯Eš~Õg!(Ÿ×‡û{´E÷ž¾xk½¿÷rÿ‡—‹‡J¿‹•øvåñ¯Î×G`­ðH+«‰Ç«ú×_Ž?ožï…Ýá_Vß_Ý€a¹¦ØÓö×" ¯OÀÌ;ªZ‰àmÖ3¿‹K4è/®Fj„m»æ›Ùvœ|ò7)¶>*ÑS1¤‡¯§ßtZôØpÛ÷¨ÆÇŒÙ,Þ¸Ö@ññØáŸ·# ~Y¯Ý“3°Áò½¼=#S`T¶ZŽñ7Fµ­ß¼÷†€|óðÅú¿&u²g¿ù¬¬Ðúäâêj{–-‹¶g-–>Ã<õE:³êÜ·ò[îœEÕ祋QJ’`ÂFÎøŒ! ‹¯Žò›ìœ+ä1·áûX͉‰(.¦òdÎËÔ›dóÛêQOÌ'YHç¡×¡¤¼é“Éo¤sÆ€Û”“_µq’S±Ñçžø•Wƒž½Ã‡RõWßÔ‚‘Æ$:¿Y®cr<¬÷^Šàs¥ù½)¿=Îê˜ÚÛü˜¯ oU4 ò K;æ7ĵ'/ƒ6ª¡-æÍ0õW nŽ@§IOÕ› éåqšø:ª¢«éâª\ÎÓÓØÚÓFjÏÞ™>¿"USl]J¶¢‡u†9/J¶ZsrÊ24Óxï*'À2h¥ê˜:é@‰0hîCÚb(ÚUlñ†¨¯ÓÆø° «rSpÈ °(^7ót®Öø£ºA)ØüvuÄ}J;mûº90 ç­ôŒÈŽvU.±µÑäkåežÚ;åWï`Ut~K:î K¯M¤ÇÛŽ•¶6i0Êó›Ð 'à³ØfT}å>ªDÔ¯ÊE³áªhzQ)_u©ä’áÝkB,o4§»Ì«P¥ >tkH­1_ÞZŽwvƒ÷ áËʺ?1&Ïo&§Ü°´he7,ôÓ0F9ˆÐfÒS!ÏÇyRC!pu(K÷ÐGcjŸB#Mú”«Ú2W»˜_?Nxßò©¾b«tT®a©r^=å!©’¼$Oßpí%›ßŽÇÔøN©où¶<#çEŠÄ·zF)|åÚüêò5a¦¾ÕÎoõ*'°øès‚ ÄD]—W9ú}~s7á>g“k–ð7ÛUãå×üvn²žÎ9Õ2 ¾¶­c¢n³ù ܤ'l2×;¾ºÒVaæ!:b›Ê!Lkbܧmv^6°C.®>±ew¦ÙöƒïÓ 1ÈŒÕ&‚ùrøýÑæÃ°t³ÀZ+ð‚C¯¢ÆÅ®XaÖ´Wr$¾j|EJ¶¦ð:Üe|UA!=4©8 0cwq—~ƒgJèibœÄl0¸6ÖÈÄ:‘ˆÞ «õ^ºª •ÈèÚ¿¸=»øôîŽQéõwÕj£¡ëOûË„«])ã«ã®ÁlðnFóÍoî´åÏã#c7gBVþ³%¹ûŸ½Üû)gî;zûìÍ7w¶Ú ¯ß¼]?ÿx6{%s#f÷A9ÿùx^OðË•â«óæJqí±qù…œã³Sù8ÉW§×B.»žôøþø©óí/£NÏoÊ ð+xlq~z|~sý°‚ù|¼Óz}cÔ=`öÏNnÏ*œ'ëùËÐË=¬é åÍp ×o¯ŽÏ¯‘ Ø¥J—‹1]k7Wÿ …‡‰÷míq¯ÇÚö@ǵvX\Útòjÿ|¶ó›ñU¡ùFA¢îÙé/s8Gm±„a7ÐÐÿÏï.>\I,$ÃÅ/ÛS Ç\Âôk@áúf{)@0µsEüæêöú¦ÃÑogéÓöùá²á­ïPú€"{ðäùÁÑÃiZ€çe}±Ãñí{<{ÚžJ×¹O'ÇÕóýj ÿ‚®ùT&|øüu÷™âPó3IQELÄ W/Zƒ«Ù×Ä*ãñ¯Š¾OÚõ¥€°‹"öå‡ÒÞ€%WZ,Xy|åFÙ¤Àš«—Ûó÷7Ä €ºÅÊÂL‘T`Ü;ÌC³z+GÎg £Å­=÷én€,}öWµA®/O¶0»åPlŽ/Îoþ¥0æOóLËÁfmvvÆMøúcºhõ` 3…IèÀ,Ký4 ×c¾´¬ 5==4¿¢™à†Éëwèòz˜~ð%p¦ÐúM¶0óÐÓßyf˜1JØ%”j´næ@ZÐÚGÀò¸>(Ög¥Öd³-ëdþêœÝ4Ýæµì¿¶Ÿ¶7W_Úû)ÿšWÈa"úæ_LÔ3p ʧ÷bõ[Ì„ kî„*ûßÊ5‰Õꊨò0·{õº3gÏç@P*LÁ€¼3gàÓ>I6W‚Á‹wKØŒelx3ãÀ 63`Bï¹ÍžÇÁ¾0›¯ø´XÿúàÉÅùéõÃ:§f¶½ó÷gÛ܈©IG=Ÿ~ü°=ýe7œ¹ Û^|3ûò!ý¦F‚ýâÜ)~ÙóáøÔÿM÷e{#ûæ´[wŸ.®¶Ý{ÙQ_N`6¾®ÉÏfʱÑïÆ¨Á­[ú²µHžHýìWIs§8Áe¸wö8Ú…§Û÷àã]?¬2èéögº]3®þ# ‚Óg>ý'ýéˆ9ïÕö—5µkBJ¨M÷äÕ¯dÖ¯Ÿœ@†÷œ\µÜæ¹"^z)°ô°¤¶–Ú•žÛjEzð—ÕûY€Ey9‚8û–RÜ&Õãñ†qöxÁùšbä|û¹Ê¶¥:GÇx¹Aõ¹&«azñ]f­¹-HúÎ#, »ø¶ÂÞVŸäz,˜äkã6[çV¸–TµRsZK›X‘aÅ»`É]©ëèf`%¦WZ¤fáX3ß!ÎjÛ¤šc‡ÕŸ´Õ çðŠ¦½"»nyÚŒÀR¯aU¼!^Þr zìßÎÚ„öJ3^º­Z6ÆK®Áj}^¦ðê°Ú¯™^.ô#^ µ‚¬²X |Ëýhí¬j÷ñ}…Å|ϵËfù^îÍ®+¤ ,jEzÅ|Ï•ÕæùKx¢^*–6ÙŠùž+«Íò«z²‡*,æ{®j7 +¤É:ʪ{[1ß*–ÔÉ/ÆK3åòé ¶Y©Z­{^ÇAe£Ñ:J¥ëR ‹Ö±Âb¾çNóò‹ai~ÀYþ[ù¥™ï¹*Ô¼üê%ί&2GxB†¥ï€eC=$í¡$•c:m–¹ –È/á47‹ù~T%i@û(•4­åuôܦ¼Àb¾çªP÷ɯ´,'t`¼ü",<†•s ;ÔÛ˜¬W`1ßsõ¥ûä—º¯Txu¦æ»à¢óW#¿„^¦ÀZà{©"ofø^ª|áû4¨°×Â"ùÅÇ‘qÄ÷AUXÌ÷\…fž¿¤’SËûTmÃ|Ï•vî–_½ÔæÒÍ8 ‹ùž« ÍÂ’W:½šÀª•̱šã^kËM5H4ÑÖ–ÏÀò1¶ù Ë#¬Æ–›¬&VÁ3E×*ÃÇߥ’´I•Ü«9îµöê ^®VµrMtVsª5! ^˜ZŠå„u|þe¹MªrvXÍq‚×c1-Oá{U+†§––VsœÐ~Ëa]ÖrîÏsJ•oh3ba5ǽ ¥&Ú›’Ȱ•Z*iö¥#¶á{¬æ85°èr¢,¹UÀ'ªÛ”Ð «9î *ÒOðê=ΣØzPÝ‹Ú*,Ëü5S+¼ÌÑ`í쌗Šv Û„'¬«¼º‹òb±Ì‘ªvšÛ|¥—Ÿƒåx…<”вµ´ÉÞ¶aH/÷ˆlý^R­Ý„8€…m•^Ä÷ß1…¥T­úªä“á6©NØÙ4‡—à…¹ŸÄ6á;FÚ„^®g¼Bk('ð†½ØL{%m‚—SsxŽ/Í•ûxŽøW¥çè5†%ö„–[7FÚ„¿ÜˆïÓÄÊGšO˜ÀGðJÚÄ^uv ‹|£aÎ*ž£“›9MÃreŽRù}‚e§’Û•9ºV4R­]I›ð½ ¼‡Ò,L³ÅþvÉ…,s,mVÃ"ÇsÛWùk8ÇT`µÕÇÊ•Pè…aþ‚—•6á{ßäÄ,,/•uâ ë «•…^ÍÁR#^ûËö|EI›ÐÞ3ßKÕjòF°t}b=‘…Õçó†a¹;`©2)—­¯Pñb¾gJÍÂò¼·ó—Jû<Ãrsx ä—"žà«(L{ÏmÕò~/?’_ëÈiYóOV˜ƒåÆ2GäD” Tm[Ö\éü}L{Èr5ð::i«ôJ`%¥c›ÉÊ"n“*¦]èg` <,²'$êåYÉ~¬º#0ß3”‰W4ÐÛ¹Ú\×Ò+T¼t5W3¹ÌÑ oËE®½°MÖ1˜9¼ú‘ ЋNKƒŠ»dˆ-láU©M>îX?JS?ÚÐ&¾U`¾—ŠÎSXi#éWäktšð}ðþZ€%¾••+{«YÇ0‡—Û&"sŒîƶIÅ+Îá¥ÇrBrH5mÁK*:w!ÍÁëm±'rÞÇÆþjíœÈvŽT‡{ÊEײŸÆs¬ºVx"ª!^3°( ¥ÀŠc¼ª=õá¸dOÔŠÎ3öDdy/§r¢±rÞØmÒàÅö=ÏnF~…M/>2W}¬sì…ï£Ã"—ìœz]xÆÎ‰lß·U…õØï,'œÈ//m¢ÓbȉYXä•ûr‡ØI[å¯8Ë/ÙJüŽ ¦²ŽR ˜â c`R¡¸î¡7IÌ÷R½w–TùîÙ¯mdt…Å|Ï”š…åk¼}wÁ«ÚIÏá¥F6@ûÊÕj+mÂ÷ÉÌá¥Æ6€Ð~,'Z Ù9XýhŽÂJ.ÅË:šŠ—+•ßÅßG<ÖÆ‹üâŠ;6G ­©ÂÜ%_`ñ¹BK•ªÕz£Ë:jý»“¾Æ£SX†•ñB€÷²Ù²›rž8÷uãò3^9}wÁ+ëG9W €¬4—DbÖÊZá/å‰Ëq޹֩í›êã}?WÕ±~ãdމñÊçüNÕ9ªž«µbƒ3ÒuØHÜ7Ç'0––¸Mbªçjí|67•3ËùãÐÆ,m–™‡Õzk=V ¯1dú‹ê¹-T¼ìüÖPÙ¸‰MvµÕŠô=Wk—˜Â(ª³ÆáÄÆÔ¶èG²ºÖ8-©ކð"¬2GÊÅ.ñèâ+”â+ÁT™ƒJ©ÀŠóxo×SZ®O¬„ï%΄BcVÆkmÝÆIʧ¾øîya[0‹«µK¬cÃ\â[±}_â¾Ð¦/Õ/Ã*ëè) ÇW¹òqÞCàš‰†]æ >¯DÔpÝ%+•ãxt–_Øf„'”^†UÖzú~bxi“½­L™£ÄMưr2|‰› u-¶Ye—a+ ëtÉIŽ*û1¿"Á6¹§ ”È/™©DˆÖ86'ƒës~Ä1q›Ø÷JùyXmôkOÊ#¶·5<Á|/±¡iä*Ë‚¢¯Èm¾âça ^4šçª>à’¶ºŽ‰eÎ nÒDˆðûÕ¾w¼Ž9¶‹5@°t?«$÷Mn/™£Üy@‡¹ðª}Ôj£J{î—œ×:Ïv¡ç6/|¯¾Ÿ‡…Plµï ß—ªdðS¥—6ó°Dw¬1ÿ»ðªJm 9·Õ9Ú™9¶ô"™.)õènAË«¡Æ£•vóôjÏà1óýX?Ò.¤6+¼ªý<^mÔP×X‡æg~¬ÓtµWÑ‘/¼ZîL¢s(Æß7QŽÜë:ÆEX,ï}3Þp¬6ËhlK•^,ï%Æ7Æ+×åuùå¥m9tŽ ,7kM1›ªk ¯fÿÛäü¾%X,£±Þ†Ó¾ì!*K!°ôâEF:Ë#Xžb+Ëm½¬£1Eò™ôøl?ŠO”s>Sì‰ü^ìB±sŒ‡ÕØä.6ò^]›/±b[µ [†Uø KDh¶1c±'B9›óÍ2"ïÓüé¨F³½ªø.M©}êð$]`…yX­}¯Éþ(1¾r_¨È/Óœ‹*—a^…ï³RΖ{ÙþBFUz±¼ç{3Ñ̾ñÙ^-Å3C‘÷¶Ÿ‡5´£kœ)òÙ‰’6Á˲¼oc-^Ùö•ûŽmßÀm ^zÖÐWp—[®_¡Ú–í¾S3‰Œ"Û$–_Z2 xi“=dí"¬â¡MZ³fJÌÝI[Å‹í{‰‰Žð"Þ×s+ŽEns–_„Å~ZÈ^†%ç–Ût…Åò^☓H²jÖ±{‚Úd?Ú¸‹}Q5X¯zå¶ Kø¾ÜšD¥ÉŽfûKÛbåÔ C;Úõ‹°˜^ë–ïùå±vÜV}+Çò^b¢“h9Ú¾br‡"s MârÊéEX¯\Ág{ÝAmuŽCy/3•Èh¶£%VË/׳!Sö¶³ó°ÚSÖŽVlZiÝá„ïÃ<^ô}‘«¹ªÄ娭ÎÑÏüh¾½Ç׉•š}…JûPyb¢Ä.¬Éuû6¦ mVdX©c"¶†"ge޼·ƒ´‰ÌqiV#'ÀV–DØ=Û_9Y ¶I¬Vyæûa|µâE4IÂ_½jðÊmB{¯æa5r¢DI ,ö··iÙÛ^ÏÌqpª†ó;ÍŠý4ö‘}7ñfÖÈŽÝ¡%´É:z;Ï ߯³+üÕ·x‘œ=ä™ïùŽÛ$ÂašdÇôâ³ßVy¿‹õÏ>b_ÏÀµUž`y/qò1^k,ð\ù‹Ï³NSj“*½â",‘_ªžÍi5œã`y¶ï%¶=Âk­rlwžWn|¾Ð/Âbyï²L/<1¸ÿ…mIâ«ßô!˪ãÏïÉ Ð$øÏnô‘ü¯ß`‰ä7ü””¹ËY™jßo…Íýó®ù±¾¶Æ4>Êõ;× 4Õ}ñÉ‚é}_ô¢Â°(¦&Éu8á›ÖÅž³X5E`×Èß)§y‘oª`­.¶Å‚4å®iìƒJ˜be?ýh8”ÓºÞȲNc9¿R om°´dˆ9F– ¦Êߌ>èäZ˜ ³jÅòs2ÖGÝ›€é¢¾ãoº¨SŽÝ|ïò-wðàÕ0l¿‰ç×Á–ÑM´¹ò¨Æ"vЫ~ýޤt¡ŒÁü8ü®BcöõŠ'Fú½ÏV›ÂJŒ¹h"­‚‹”Ìè;þf4*Û°dñÄ>–{æ:éžÒ;˜4½*'´¸ ˜[«¬f€ÁR…éqF)S¾ictå›ÎAƒ®”·°“u´…+´ÚkÇÅà´ogdL°|ÿ3“2L æ¨òut´¿±ø;3](¦0WXý&hã4ßôÑyWx Ù”O¡’QºxÞx’bжâ‰Ú3ôÎ ×[”Ÿ5°jª\ßt=(~_f\.x¾Æû`¼›:w*bXî%PaÚÌÿÈ9ÀL¶™ò¶.ùÏël¹AsGþLí7]°& ×ÅRá¢î[®³X`!8Ú§bYÁìBN?Wæ»,×3×éJ%µ«ôÞÞÒ*0×gÊjZ ½iè©7Ćg®Ã:•lwãøŠ'Øf@–ÂÉÈu&ÅÂ-Æ©h*×áÝ{\ß3×YÏyüLtÎùvF_½³4°Êñí},b+=;ÔD`.2×¹äIûâ»›¤ú”Ú¹p¨BÙ_ÿ–]¼Ñ®r2ü«™ëLâ; „iˆwV_^–å÷Õ_F þêu÷òIÆâ{øÿç‡{øï÷{µ ÁO]ýü½ùù¨¯ú¬Œ!#€ÐÆÿ<ž©/¯aõm46Âr¹dMy8ÀÓ7(UmŠQ0U'¢Ì.ê ƒ÷šJ‚tªèˆ4‘ª(ÅvÄàœÁxh*–£>^Ä éB"f L͈x»tA%¼¢Ê°”»Ž¨]Ô…s0=Q£dñ=fxP}£÷ŸÁÑíØ\ŠÔeg gúш( êëzl6˜=ftõÅ<‰,Ÿ`Æ'P™¶y¾ŽþªEÓ4ö”7Ñ–]F#âghGL½À42üç›& #:®AXåhšçû ìDÜG´´gªºÝæh7°Ùñ*&8õ ÉºQ ªò © «Ð«ÀŒ°´1;Ï“‡#Òï± |ù&1 Ò+v¢Ëô£Öé–lPÞ·#¦¨èK‡ow ֯Š˜;hÀÑ$ sXTI ˜*á ˜= 6TMIãBEnewìân#¯FÐÝ´¿µ0¥U-e<€]ƒÑ’6›ƒ&¹­-¾a5:!Ô¥ÝÖ1Â6·°Œ.`ê»|UT¦‚¶ eBH0™ØŒÂN'*¨-”M²ßmŽxzšÀÊVô0›f  IBËEÐåm̨ ØÆÄe¡T»Íï=Ì-HvfŠ`Aá à¯¸d zRƒ è#‘gàÿ D e¯Ô»Ì½?DÀX0¨K Ø‹À¯°f¾¹h{Ø€d10*n.Ñì&ÂÌ4ðÐv ¹ˆ´LÄQÕx09€ò}¯Ú•³¼ƒêq?*»+ç¨ä¡ öDl¶9T0sX`°™Ë{&ž~•kA@x¤:`-îÄ9ttoP%\mÒ.`~0tP̓õ~H;Ûƒ¥ ;GÜIæàiXLC`€«#‚o¾Do=ÎD7Ç·r6´Þõ1a‘m̘ºÓ#Zì00ð#,¦ˆ20¦Rn…¦Á:Fp`œ´‚íš³»ÆÖ-ab°ç0o.l­:GÒV0&s`ü˜ ŠÌÂVq„lgÌ`Ãî«d­‹bd°©ú†sP®†€B7bI23”˜·Vc¶ßo¯ÎŽ/ ó<^}Â9 J9ÙÔ\å ÔŽ^nße>¯Á4“ιÖ;lRÛ›…rØëMù;v6݃ƒîèæËÙöáêo° nº÷4sšðõɇmSG+áˆþˆŸlOþg[ʨJ¥×a­SüIÿþüS©L”‹QU÷ûúž~üü‘jÎÂ/¹&ývеö¥úg«ÃBRàT 1â{=@8—¢ •w`Þ¾µ|K²… œ)5éɸÍ~¸êÖ>­ö@”¿ß6}Ë€—ð™é‰iÍfz¶øbw$í¨§5°é§=‰@wI ±R÷\‹èþãá ˆwƒ}5€•Ah𩜯ˆ¬©<‡KÁ?)Ló à Æ;@\Nh,ðUVèx0æ±Î—yº¾<¦ •¿»ýõ&WXžY9¬mçá?½~„9²Áì?¾\vD7“Ñ?6ÿcPÕ@´ž×Û›ÛËî/™Q½ŠsÊb…Å_¼-âhÜŠ-eàQI­§Û³›ãõ3þˆ±~ú&ÿ|øý‘üü¿Ÿ?zór‡ãO—­Å0°nÄñU)èÒ77ЀŠe£³–yë²Õw¥vWŸ”Ò6$Špp ©D’ðWc"¥¿ã2¡Ô„ Ü RôcœÔr!&©Øtô‰EÆØé-èó‘I7ê|¸]·µípBXä ›îìõéâ3ö9>ÿÒm?ƒxýáãÏ7¹_]ŽÁjŒÖKf—•¸¸/O^œyzLDƒ·MW’ÌàÅ.Ë%-éúå'¼Ì&(,47‹ëÝ5“Qwµ›U”™ÐñÞk*×Ôå—»œÓÛU6Ô%¦¢¢ (í½xÉÏ;@Ù¾0š‹fÃ@@ÄÉNºabPxÜwüZ4Ø`¹–Þ[/?%?ý©§"7nÊÐ;û²ÚzIYã$)Xâäà}¨ +龄oAaAjƪÇÅœ¼×òžÞ÷Q~ªyÕðšP€r}ƒ•Âc Js7#kO‰øIÜŠJg7 ž J6eêû¹$Yì%ºö’©®/¦¨Ûím’¤NUJ’5 ¨æ!•YQT°Å*¸ŠHŠU}»k„Bò>µÇ«8J@µë†V½<Ëïë#Ë ”@é(Ó`\(ïeÝz©»@ïºù»+ªÇ=e[Pª¦˜Sõ§Ê®5'¸¸%°yÑü¸ASGl*á/`>M ²Ó‰$éŸ_ÂÿÉœŽûû¼k2+c~ØßVo˜ûÜ…ÿþëW?>;ì"¿¯Ÿq¿ÓVÔ@k‹{6•LÁwû*§MÅQð•èp(¾Öi3ñÑàrÚž‹`G Å}æSð6‰OsûÇFÝñáh{uôâíßwu}òóåææÓå"<Œ%ì n{ÞË ˆFF¹ƒzüåþùÊÿýìi)dØ}³“‰ÎIÿ ³¤Åk1Èxsñùç/ðŠÍÑ‹W@ò7¯_¼zË‹0å|¼ÁÿÛGø÷×½óZ¤éW}Â?ðy}¸¿G[äàpïé‹g°Öû{/÷x¹x|ó{°X‰oWŽëþzñá|}ôÖ ²šx¼ªýåøóV éñPØþõhõÝñÕ –kŠòl-Òðú|À¼£ª•Þf=]»¸Dƒþâj¤FX†6ß̶ãä“¿iL±õQ‰ž‚ˆ!=|=ý¦ÓbÖƒ ·}úg| —Íâk}?þy;òê—õ Ð=9Û,ßËÛ32F¢åÀ|p&0ª"=øæ½gñòÍÃëÿšT¤žýæ³²Bë“‹««íY¶,Úžµ,ù óÔ·ß̪sßʯ¦s¾ŽÇ²ö½öŠŸ¼çèWÏù}ñדNùõsÎÊÑôL)_«ã’ø ­ù•㑦éY²f†Þ«¦g5¿:¾ÂÒóù5r~›_ÇLºI˯ø4C*8àTbp1¿*ÎïÿkOeðݬ|_Bqü58G/õèÞpÌ ñžRE^ùš) +‹•„½£Û2͘6ä¤ !ë­ä}¥@\ °ëF={¯µ¤ÜBô”ᬒ¹§¢×(›“ž…xÅ0Ô¯šètEA[|$´*ôö=“Â÷|õ×XòUpOgtȯ`'Ø‚ÂkAÚö òÆ Ó5¸Á˜t` e¸0 ¸÷Í\RÈ/ýÌdLMqÌ:Oè™êª(ä)»*wò^ æ‰)J‚“¯¹Øp‚מ҆½‡Ò!)J‡ùÂÀn®Ïo/ýdUðmª‡ìª2#–¤Ä3j†‡úàmC[gŒnxŸîèüúr²*`ëk_Á'N••÷`­¬Ê•®áªhz¿Ünôvy €—ó ¸á.Ãì§}ÝÊ ß°U–r¡û?¿jÓ6g)hÐ3ÑW“Ïû“žÂŒhk`Ó·Kォ€@FDJ¢Í¤'=™¬âC¥¾Ôpe®VD[º<â¾`­m¹OéX±Õà#QvÝòP‘D‚ §@,åÜì¼]CNÇ¢§<„‰fúÊ}*¦dRcåÓ˜_áÆ§ÑúFR{뼫ˋÏT(õŽ“1ñIe³!Q*„ ·ÞæWqcNÐx¤S·>Y •ã5¾ uùuÛ˜B&âñV%ð[ªó Úqó+µñªÊðÓlS²7•­è¢3Sê1×R%‰ÂÏUˆâƒL¼¹Û™Â÷á͆ÔÎÖÚP˜:Â}µzuqõ‰-»0Ͷ×|˜AfuÀ‡å«Ãïî4†½ eÏ/ø7ô*›]ìŠæ'{u ‡Ï«ÆW¨t5j ¯Ã]FW¶)¤‡&fì.î‚iªè8¼Ã8‰Ù`p l¬‘‰u"½AWzéª7=t%£kÿâöìâÓ»;FÅW2*Þ€®?í/®vU«esW¼]›o~s§-þù»9²ò‡œ-É’wøìåÞO9GÞÑÛgo¾¹³ÕÞxýæíúùdzÙË1»ÊùÏÇózV^.ï^7—wký‹Ë/äŸÊ×ÀI¾¸:½þrÙõ¤Ç÷ÇÿÃHouúx~|S¶õx€_Ác‹óÓãó›ë‡ÌàãÖ‹‹ î³|vr{Vá$Ìg=ßÊ‘óÙ†0èhqkÏ}º F߃ýUmëËã“-ÌîE9Ô›ãÁ‹ó›‡aFÜb!€ù3ج͎ÀÎx¢ _LWšìt ÁtƒL§h& ÜJ€š@fÔ™â†~2&Éz9ø)Ì@ÏÃ`– e×ÏüÜŠØð©ƒBuVfLX}Y#òWç4ئé6¯ãþu°½ø´½¹úÒÞù×¼:¬°€Á3ÿ2 ž €ù^F8½«ß¢¤+¬™ó¡¼­JM®§f±9‹ô«× ˜9kº€ÑMŠÒnÌœyM†´ÇÎNÀ¨~ b3Þùu»MÀø0ˆÍ ­À3k’Ç0Žý˜ÍW|Z,Ž}ðäâüôºV'ê9_¶í¿?ÛæF0ÙÕ¨çÓ¶§¢=T®ßUÚ^|#÷ò!ý¦Fbõâœ~Áòáø”ïM÷e{#ûæ´[wŸ.®¶Ý{ÙQ_N`6¾"ÉÏCÊ¡ÍïÆ¨Á­[ú²­F×HøïWIs§8Áe¸g ö8Ze§Û÷àa]?¬2èéögºÛ2ªý# ‚Óg>ý'ýéˆ9ïÕö—5µkBJ¨M÷äÕid¯Ÿœ(EV\wÅs›d4G7±ÀÒwÀ’ bxo³Ôâ‘q¤,x«‹êÚ,ÀÊéU8¢J-¸M* àK€…A”A%¹^˜š¢ìdëJ-žœ% Ûj…Mðn ^nPe­…e)Gupù\I ÛŒT^ï< ‡o+É `aB ‰®ò*Xn“,÷˜§©À wÁâjdJîô:i«ôŠ +îËpýB^GÀ«Ò+1½Ò"½LTL/•_Ï.mA*çuXµðI[…o/|(¼æ8G¶¸­V^Wªà5ªþ6ÀËËc繞B¶Š—f¼tSk/¹d,xÕ ÁÊ^TúáŠ1LAÎB/Çmµz®²XK|ϰ´W#X®V^WÌ÷\£kŽïW#SšëYU¾¯‚ó=W›ç¯ZGê¥I›T+PÌ÷\AìnXŠ/Ã×=dE~)æ{®Þ6 +Hå©ǰb¥=óý¨2Gýäü9l„pÝÎ|¨…mµÊ¶îy|ÆëÈ»5Œå—ÌQ3ßs­¢{ä×¼áœí ¿d5ó=W?ºG~™ í«üÒ†aé»`I…Ù™^Ú*^–a™]`~kÑ'ÁKä—f¾UÐ>*Ïû1èeù¥™ï¹úÑ}ò+.Ë//¿ËÔ,–y‚éÕÊ/Í|ÏU†îÃ+,Ë/ ¯ÎÔ6¼(%Bæ/íÆôª2ÇôXK|Ÿª—Pxµç6©ÄÛáû4©Qϰ0iï!–¶ä”oå—a¾çj+³üe˜ïeþŠÜ&Uø0¯{¥î€eµÈ3‘…²· ó=WÍ™—_RýHÞ_¬*¿°já^kËM5HÄì¸ì/òyYIŽH©V–/Uïçêkg¼Jµ·"sÊÉR¡}V`¼Ô"^Žê˜e^õ|L븭V½Çª…CXµöaÁ S(I9·ÒÒVé•fðrl¤Š‰|JLJiFÚDæ`Õ íG°\­./—/Šw›êÌV-Ü{ÐPj¢½)P’“P>ªóÜ…¿°jáÖÀ¢Ë ¡Ø?OÚÓY±}±jáÞ òú¯ÞoDæ(9¶tÒVaY毙šØeŽë¾É­‰áM®·a¹Ê« °0ÐKªE)n«òËú9Xn€W¨ôÒ\åƒñ ù§ + éå‘­?ÆKhïøäÛq›«ô"¾oüŽ),¥j>ÅÕ`‹Þ†6U长ðò¼Â¦¾…“9ji¼\Ïx…ÖPNÄ*s”â³k%m²·šÃk s‚÷¼ Ó+¥çèG´·•¿xUÚ O¸ß§‰•ŸÓ#1^Š×Ñp[õkÃ"ßhÀ_˜›INâårDÓÆ°\™£T8ŸàEY˜äßZ1Ò&¼ê<ÃâêßS™£kåõ*Wû¦aÞCi ÒDžJÊ=œJ¯ +ŽaŽKsÌ)Ø–æ˜ ¬¶ÊöÀc@¹"rUÉíÇmQ|ßäÄ,,’…|…çè¸M* v^ÍÁR#^k°—Ë+"¿ª à™ï¥:3ùF#XªÚ÷|YÃr[•«Þ0,w,¶žKQ^Õ¯õÌ÷L©yX²‡<ïmÙ5ÎäÝ^~$'ÄçSrCÌs[³Ž~/?’_õwÚ}S5ºóa–Ë‘_r+Ps[Õ>2¬¹ZÊùû¾V7Í÷­n’6‘9> l€9X`3HµN/¼ª¹- ^¡Ÿ5ð°(ï!+{(ã…ö„ÈèÀ|ÏP&^ëæbçŒh9–.°æj—9ÔÛrÉvÀØVa™9¼ú± P_=õµ26fü˼*UÉÇëG©ü)×®ª~¬ôb¾—ÊÅSX +2,©ùÇm®âåüµKl€^î¹ í«® a/=¶M/®0ØØ&¯8‡—ÛL¢;Õ™s›èíæ`õvcçðåÇjçÈ#Û9Ryì)“®±¢kyµ´‰üŠjˆ× ¬¡=ÆxU{"ê1,ÂqÙžêŽ=YÞKå⩜ ªï¼‡äraÓÆ°Ø¾çÙÍȯl+;šñš±¢Ã"m©¼>cD¶ïÛê¹zìwˆNˉQÅG&@ü´rbV–Ã}9´Ìs,UíШüç`ù% òj/m•ö©¬£T¼¥øÂØ;GnáËÒ¢ó½T©ƒUm¦úr¡icXÌ÷L©yX’y£ç½í¹­ÆD“žÃKmá{ÏW¢­´U¼Ì^jÑ«Î"£+¯&;«ÍQ’oT›©ÚÂ_É• çâo#ëAµažcöý°­Æ:’/°ø\¡•gº³= ™+—¶*sRX†•ñ¢®b›¨"ïs²Vl“ŠÝ]ŠËsT¦©fÚó³ã¸-VXi/‰Ä¬•í7¦ÊœÂ«!×!5 ¥šußÏãÕDuÀ]•”<†kZ–ò-ÐfzÅUɱŽÁé:lTå‰brÅî°±R•¼çªä|67•3\3½äÕ€ç6o–™‡Õzk´‡86Tä—Ü&ò øx~Žk­ÀL\Dš+ÃÚC›Èhð»Jel‰)Œ¢:kD]*c÷, I®R[ªôò˰Ê)çøÀßî¤"<´ÉY*¥+ÎãE¼]ãL"¿¢´UXqVÆkmÝ&ÈÞv¯Œ¶¹Ê_\•\b“(˜ 9ÁìùíT© m_EÁ¸«¬£wÍþcÖßXœ>IwÅ|Ï絓ˆ®;Ÿ†‚ÏWì ¹Mü¥ô2¬²Žë¾±£YÍmFø^™2G‰›ŒaQÒw±ålÁ«ØÐ¦¥"¼²Ë°Š†ÀªÍTì‰RË keW¼Ü@~ÉL%B´Æ±Å¾ïCÐñ’ý¨ü<¬6úÛ7<1´¿¨Mö£b¾—ØÐ4r…Õ|Ç{ˆkNÁ.¯sŒó°/š‡“„U¡Ä£³ ŒmÁ¬Ä2g7©"ú~XŽí/âÌK.öªÒý<¬6’œ±(2ºÀ*Uùx7eXÂ÷öQ«*í¸_^øžé”3°ÐèG4ª…ïça!'|Ïo1KÉ»!^f–èŽ5æ9¯ëÈ>L~ÕG9Ð…¿´™cK/’é5G˜eÚ+nÓ/7O¯ö  È~三—6á/íçñj£†º9;Qlû*n‹/áûr·`C1k<§ì!ï¸MÎÀ”Ž‹°XÞûW/r•ÏÓBn£Ü. ‹å½ÄøÆxaíLÅ'…Š_eæÊ¼ØD®–÷KÁZãWã¥ø1mŽ`¿ßF»PÎÓ”±ó°›ÜÅjûZ_dt¾™‹v´œá+ã–a)±'äL§ºÁ‹Úê~4"ïÓü‰¾rªm„'²-ç<æaµö}s.ªøg>ïÃ6]i—a)ña$Ö!ϼ3ݰ­îGÃòžïuÌD3ÕFÒ Ú"·JìQ$Á²ý<¬¡-w(UdŸ/p[ÕÛ–å}{lñʲñÊE+ÖJôvlì «ça }¹#’m&”«‘Û|…Åvß©™DFÉ«rutvÒÄ`”µ‹°Š?„6©ÝÁ>_Žgb›ÄÉ•eû^b¢#¼ÖånÛòp¶icX~ûiXtE|…¾øùÛ$N®,Ë{‰cN"É` ¹8žcѹaÅEXì‹‚­ìDÞ÷±Á‹Úª¼·Â÷åÞÐ$*=°£µ/ôŠÅçkõëa1½JdÚkΪ=!<áXÞKLt-ÇZ¬â+ð¹{)µÖ9R‘aéEX¯\©FΚ ½ØfJ¿í†ò^f*‘ÑlcÊýBNb`{n«v¡³ó°ÚS~Ó$S-z› Žö5–¦œð}˜Ç+SºþÜyUȰü<,Á+û rþ‹\ͱ+l‹Â÷.Tž˜h#± ]¥ž¨vaåUVj㘃ˆm«·Ùžà·"à+UXiV#'ÀV–Qʳ `;Ž7ˆœðÌ÷ÃøjÅ+û 7áXGNA¾B…¥æa5r×]r«ržæÄW³_¼4ãàT 稘'r•ÎKC½"|ïÍ<¬¡]í78Ó¡6áUoçy¢á{”¼‡Lä;Zæ/{È3ßó·I„Ã4õ¬‰iïëYf£_„ÅzS2J–b¾[@/@=öõüQy–÷'ãµVj“$þÅéCB¶å”nt­‹°D~Ñâ9Ú–'О¨1+Ïö½Ä¶Gx­Ñ<YîÁdÛ‰ì/ÙÛ¡_„%qL,†ÅxE¦Wâ6#1÷oúeÕñç÷¼Èožöÿg7úÈûù×o0‹Ã?ò zJ‰ÜåÌFµï·Âæþy×ìT_[Kå:•`C`Ç:šÊ—=¢‰˜R$×›\Ó-pÍ#ëø¦ŸÞà¹:¥„‘o‚PÊüÙQaÂÄw¬c¨üc)ÌFµä£æŒSl -§,>Ð7_åoЇ*úìOÏkÃ÷À¢÷&„&ˆ×=/ø˪É0Ý&&,ùŽ¿é<Ó.ð]ô9ñˆÆ»à9ñ•|saei£ë]yqä½sº sOºÏ)^4Ð6Y]îÿÎÆŠ'Øgà”è5È.cØŠÀ‚}3ºº%ŸõZC>ØòVƒ2¹ mdkT¡ø·©çÈvÞ4xz,»˜Kfâ7] |_Æy­´®”·`=€*^‚` òz%í)q‘ÌÈhkÙF‹D¯>¦jfö·3å­)~Óåh+Q ѪßÖE,kí}¹¥ } º¥|ÓóË“û\½70öR¥E&½s]\áyízç¼Ì¹ØK•5r>zí Ì€‘Å:wŒ—…’ˆ¹Î[gyeaF¡â‰ÖXò™?ñ޳ícá‘Ní7}O½ S sä`%¬ÑX¹ÎW¢GHÃè˜W-Ј=•¹ã.pÑ1×E«MÑ#X"œêd˜ÍÂ÷eE Y Lá–*L¸·Ø90£²² ö˜ÐA`°£ò7p½œ.ÉXücÿÿüpïÿý~¯Öø©«Ÿ¿7?ÿõUŸµ¨{TÜ„6þ/àL}Ž^VĽŒRQLé –©·ø:Zã?6û¹F@B(`÷§Wʪèˆ4QÅRWF @ôäCêÿ­i¥ÃÂÿáfFp¶ozáÍKd J\¸Pò,î8"¾}·˜íL)“bŒ¨Q|y»$ó&øË®ÀÔµÂ(\)œéG#b¹ZUGt CÃAç(·}£Ž›1À~Ò ÀfÈL¿Xö'Â^U˜QG´eׄш ºûÐŽˆ½`Lý€¸ƒé§ 4¢aáÿÚ4¶Ú€êùª ô/¨kÑí6G@´¦²˜ÎMÃntm“Ò ˆ¦ÿè­sMÂòÄ£ =<Gô\x8"ý[°`µŸ§b²Ty¦ò¤7˜¹Ç«vDZ|ÊW§“N”ó2ì6"Þç[Ÿ£ØµÍôAlbéeàŒíCÃ9˜. 6ô@O*¯‹»šÂ¡9jÙF›ÝJ~G±>‚|mÖv1L_E âzjšcÚmã³²%o¤!›u„Mç=æ3Ô”;Ô5Gau] †”· ×yüÐæ˜Ï1]¥ å¬lÀÔ·I&›ZªÂ­Ià.瀩(¯Ìc§9⹨ƒ™€RîKv µB}àtTHð†©@ÎÂX;`c¡úVz—9¢gˆå~`9BÓ³\¢âQS™”0ƒg ©ÙÅă¸¡üXF‰rˆšÝ$@Øx0€W¤Ž}³ÍÉÂç¤Ñ(ð3cïÚ•J “;‚ɃýpD»+ç(4@Õ"uc›^Y4`}D ÑN?Ñ–B 22A·ìÄ9~@¼\-¢é!ê`D´ÆTB+¶OqdBo±þ<ذXGÜIæài& 6QÁ(-áòMmi*˜Û Û†àxGÐbnÐrøâˆ;Ê *ÐÁõ¨ç`A›m¬ªø!VçB×²Ž ŽÀü§ÁR%·EÅÖïT`8xt¯*A¤ ´(kج`’*XiÛ6¡à–ê‰ñQ,Ž˜vâU²ÖÀ Àw€ÈU0 5þŽ–k›ð&¨ÃLš`Ökr!Á–Ù‰WAуð„5VÐ(*kh+¤C‘¤Îi°ŽòZ|:¢{…@«ÝÖ£õ`GL­ˆµ ´°“5,V³‹ÑÓU Û¡[—3†î$s²Õ >%€ @Ý!UAÿ÷°-6 ‘±ÊFÔ`€(–‰ÁÍ®Ú €Á6k—2 7()XÈÑoؘ<`(ª€Ëùqw“9d?€CÎXgIé†Wa±,Úè}ZÌøÚR˜ ³–ÂßÁÍ#÷_ï&s:d5µ«ïh`tÐ~¸Až£jÌÉ‚ ž42xQ;ÍÑnf´V ³CƒÔ™²Éá$#PÜûïѱÁíhQ PNÝÝd „v P rz]\r+‚°3Y)3ØÅÞ¡\ÀÊ`võ´ãn9h†–°‚rµëz4Ezð A4ÓGÏ È ÈÉrÑ»Ù9XS Ø.y;0fœ'ö ˜ÇÎ5†%fÇWª´pD³›ƒ>#ÌÍcpkÀÁøVY_Ã\ÀMðvàw$g`#ûÞ04†ÜMæ å0ƒH°Élc¯¢¶2è€gÑëÒíˆÄÌǀ減ÌAª:ÌÔL B'¤¡©( lSØ“j€ Xï =@A ÐÈ÷Æ5W/^½}vˆ%E¾62º*qQšˆü—ÏWóÜè—úÓª¸—T €;äIeÜÕA7À½¤ñy9¯+ö‡pãåTG9ØE¯Ûñï ¡Ÿ]b(¶é”óÑ>ÉO²é]æ$#¸¦SNZDÜ‘ß$ÓÐT2 ¤‰~ø¶eö ©æ‡/Ø|Cq²…6g‰Î/•iññ¾,Z_K#ŠÀÑó!’l° €Q–æ`té@Ù$Ë fÅ#Ðd3ØiuÊ[ uÀç žGuÀ”Š'MIk€JøÖÐɺé”G ¨=+!¿5&_X¸eÐ;:º–[¬#%(ÙÑÂ&£•¦"™ A…c¶ äÚN”%ô…J&Èè.•^îàl&kÜä *ùÂT¿Ø!æsù&±pBs|ÂÞÄ9NÞ6˜$||nGò ÙÛ8™ž?ÖNÄÞÊ1{g&övwt ™½³æ§ë"æŽwH FöÏ{aÈÞ™Gé)£.ì ö¢Œà†#óQ¸™ØÛ¦ÂÞ¦¡Ò°²·ÂÞ±°wŒÂÞhìp§2¹ùÕ”-ì­”Z^¸Hg«ÄÞ!K(ÁvA)Íao[ØüpF #"µe^±Ì|&û™x,iãrWVoâ¥BÖ„U7:D%‚Œò‡‘KhìJkI_Ýýý6ZÊ€i.©»·ƒn:€§ÚIKÁÎU\êb'-…'rh^t»j) ƒá™ö.ZJÓé‹f޾_KQ‡œø`7-E ã拉@n‚ó“÷âNZ wnÌ'»i) G»Ëv»j)A§Lý]´.œÍÁøÝ´,\MK˜ï¤¥¬±÷»k)ê`bžô.Z :°ÁÙ¼¸_K{g{d7-Eìm´fö¾WK{Ûž°ûµTfo˜½ïÕRÔ!çÙMKQ‡`v×R™½ÍîZ*³w6óvÒRÄÞѳj¾_KѹìÏnZŠØ»Ï¼´“–ÊìMÔnZЏÕE¦ÒýZ*³w!ë.ZŠØ[É´ԿË$Þ;¯AE»R鵪¨ÉEÞÝ[ÙnÒãÿáäÏTôßÜu…j†R %W$¸ø¼½:;¾,Ìóxuô ç4(°Ð-|¨œÆFy·]÷võK a­öÓÑ@ó»|m˜*Ö®ÞJýHÀ(µ%Fƒö¥Žp-ýÑ~ùÝöìâ—qQJìØW,¥²y¡Åõ?o1?øÕÅ×/¯Xê\)×U¢RJ9øaÚ¾)ÏpÎÚ^a¡ÐƒÃO»,J»X¦tµ:Àr¢0ö‹¦ŒõÞÉÉíÕñIæh€ß›±íƇ~ux|Š%"¨*ü[)9Ú|ò¨úß^_¯÷?lß}¹þ°ý¼Ú;{v|•!<øtüë¦;>9ÙÔ\å ÔŽ^nße>¯Á4“ιÒ:lRÛ›…rØëMù;v6݃ƒîèæËÙöáêo° nº÷4sšðõɇmSÅ*áˆþˆŸlOþg[Š˜JÕa¥QüIÿþüS© ”KøPMõûúž~üü‘*¾Â/¹"üvеöµÔ÷°8hŒø^Î…àAB嘷o-ÀÞ’lagJMz2n³®ù£uPRç¾ö-^Âo¹èý´'¦5›éÙâ‹Ý‘´£žÖ€¹8íIºkLtÀO®EòÿñpÄ»Á¾ÀÊ 4øà Ü®ÛJpˆ–D¦;{}ºøŒ}ŽÏ¿tgÛÏ`±]øøóMîWÉ7 ÞˆvX`ºPîâfLÎḺ¤\X¯"æ÷k¥£RŒf)ËOoêO&rzt,s:· ‡  w^†LHÕ dƒÃkåÕ¯'^Þ8]^a ¨ˆÉ+hºY­[Pàí× î•4Y)JÂxNA«¬<ôî5Õm@9¥0†Àï}¼O’]ÉH¦òÈ@ñ”AQOÛ‚êó먴)Ê#+Oà­$fó’"·§Ëðn€UÀ‡¼À^òè(¡šö¼`˜ÏžAáÕ¿Šh OÕµ’â­>>§Ú§a*b¨D@áa89Ô<ž‚i}3C â”k±ª+Há¾òŒNÖ-VPx¦Ÿ† \‹•võsSÎ]0­ ÔŠB‚P¶ÅʨPRÞ waJ@ È®kÆ¡šó¡¾Šä픂¢X†€Šƒ†³¯ßK°3¥\=˜°yÑ`BO¿©ü5•ƒð0x&…öX‚±C²ôϯáÿäñMÇý}þ0™•²G?ìï?«wÂÇ}î‚âÿõ«Ÿ<{Úí='i ;“AÝäëÜà£R´îéCUüøkÜ,|óGºYÖØ»YßÞÍÒ‰b«¿ÏÍÒ.ÚľZú£Ü,õÕn–úMn–Þø¯v³2¥¾ÎͲ½³ÿ¿Ý,¼¦þUn–vø>þÃ3¢¯t³¢Æäè©)ó•nV ˜e}$g¿ÎÍRÉ`º˜>n¼û*7KÅ·½-Cn(ï¯u³L|4ø‡Ü¬ç"ØÑÇBqŸùÔäˆGiÿØ¢;>?§Íl6:oæý\ßàþ´ßmï¯%ŒÿH~(c“ˆAØD•ø\€}Ì÷…òÎl~\Ò«®þxq{-ó@H PèíO_¶ÜÀñyÌßo ƒïÒ=køyñþÞþìúnû#¨fªç;S÷SÆÅ§:ÚiŒÚ¶ÅHq4–ìd… ï÷~Z?Å%¿i¡‰\r½Â˜³[†ÆjþîíwϺƒ'ëž¿xù¬ûÛÞQ÷Û§{oÁæxpùn»uûúòf³wý\¯÷õ¾Þ¼÷ËÃnj¨§Ï^½xû÷]A]Ÿü|¹¹ùt¹£¿;ƒÛž7Àò¢…qéÇàž¹†>€rÁ?{ZbØî›%´p†Lúþ,^dAÆ›‹¨?—bŽ^¼:’¿yýâÕ[^„)çÓ{Ìß<¿¤î×"M¿ê³‚ÏëÃý=Ú"‡{O_<ƒµÞß{¹ÿÃËÅ—߃ÅJ|»rÀö׋ç룰VxÜ“ÕÄãUýë/ÇŸ·bH߈÷€Âîð¯G«ïޝnÀ°\S”gûk‘†×'àæU­Dð6ëyØÅ%ôW#5Â2´ùf¶'ŸüM0t²­JôD éáëé7³l¸í{Ô?ã#¸lo\ë €øø ìðÏÛ‘P¿¬W€îÉØÎ`ù^Þž‘)0*é,G܃SôƒQÝçÁ7ï==—o¾Xÿפ†ôì7Ÿ•ZŸ\\]mϲeÑö¬…Äg˜§¾ÖfVûV~çœ3l Ú“\¾!Jº{ŒÊùdj«M&Æü^9çѨ=ò9G¥œá<~"ë<–wǵgi‹.Hy2ät%㎳‘^Ðí§ývL…Ø5è™>¹ü 2Çû¼÷1åwÀùÅ~3OSÊrŠY+Ù‹p.É…“ßóŽÆì×Äɉ"^IN Œu9²á€—›¾ôT_Ÿ6câóØú+L©ü¾vÒ³OÉÕ1uÀ,u‘lêSÊïdkÏŽ‰©R3 +¶Ú:E¯¤èJÝþ g€õó^~Å÷®"¯U”`€ÞB ±¥Ç´uUTÀ÷ƒ côÑ¥üþt4¦RÚÝÌ3ÅЬ§²Þš”ß‘N(””ñ•ݰ^Yh¦ gyZ9ã¯ø†µ!‰U©Ùà•ßuŽ)äHq‚”+Góª©õª\Â®ŠƒOóUÝåe¯(åT vUî¬vYðFJ"vÞ©J¡€¯­T~‡8¡­ ©J·U@ÒÄüòMOç€mëVVÀœ ‘‚½øp*¿ ÷.)—…Ë<£wMOå4¥=¡7\<¥5Í2pÆÁ$c~§7–&³CÈWaŸë\ûT"Ζ^‡ë)õÆ'Õî2Ÿß%±¬é5É[zä7”š˜©¦ÙV“æUy b\ÑþÔ3<iš]¦ðn_³H©¼ÕKN0½3͆tßTRÝã¥`º 8¢U}ld|äW#¬uŒ¥´Jf*‡@œzßÓÃ^®‹¤a›Å߇Mh ÓjÕ^§¦-Wû<挂–Z2õžï›UÁ|Bì‹«OlÙ€i¶½ÆàûÀ4h 2|Ïæ@©~t§ù0ìÝžB€üz•Í.vÅ 3н:ãâUã+ TºÌ4…×á.Û p¥šTP˜±»¸ >Œ¤a‡q³éÿã!ÚX#ëD"zƒ®@)骩+]û·gŸÞÝ1ª£ ¼¥+Æ“ ëOûË„«]ÆÁ w †º6ßüæN[þü1>ò7vs&då9[’×îðÙ˽ŸrV»£·ÏÞ|sg«½ ðúÍÛõóg³×7bv”óŸçõ¬¼\·½:o®ÛÖû—_È9>;•¯“|quzý'ä²ëIïÿ‡‘:ßþ2êôñüø¦lêñ¿‚Çç§Çç7×+˜ÁÇ;­W%AÝfÿøìäö¬Ây²ž¿(¼ÜãàÑÁšZÞ ·píñöêøü Š]ªt¹Óµöxsuñß Qx™ØxßÖ÷z¬mt\k‡Å¨0Øþ-ølç7ãk4ó#Œ‚DݳÒ_æpŽÚb Ãn # ÿŸß]|¸’X:H†‹_¶§޹„é×€ÂõÍöR€`záŠøÍÕíõM‡£ßÎÒ§íóÃeÃ[ß¡ôEöàÉ󃣇Ó>´ÏËúb‡ãÛ÷xö´=•®s=žNŽ«çûÕþ]ó©Løðùëî3Å¡æg’Rê½Â/ZƒkË×Ä*ãñ¯$'|¤Gö=á¦Ð÷¥*x9`Š»|@¡“Ë=…È}ŸV/·çïo>ˆ t‹#”…™"‰á~‡IÊVoåÈùlCt´¸µç>Ý £ïÁþª6ÈõåñÉf÷¢j‚ÍñàÅùÍÿ0£a♂nÖfG`g<Ñ„¯?¦KMöºÀlO!búèYÐà•D æ !×cÞƒ)*ëm1EM  [Üò°¬0‹èÖÇ<`бá0R…ê¬Ì˜°ú²Fä¯Îi°MÓm^Çýë`{ñi{sõ¥½ò¯yuXa&‚gþ.=Aó½Œpz/V¿EIWX3çCâ-5¨êŠ”Ú]÷÷gG œ9s:ÎÎsu ˆ»çÕëÌœ}M–tLAOÁà%¾90ˆÍxëË~‹0~ b3FYù Ùß\³ùŠO‹Åñ¯ž\œŸ^?lÆ µmïüýÙ67bå„Qϧ?lOE}`^ÃÚöâX¹—è7e1’«—àÍð£“Ç× }oº/ÛÙ8§ÝºûtqµíÞË–úr³éðáG~ÑQNm~7F nÝÒç5ºoDÒ¿Šš;å .Ã5xc°ÉÑ,;ݾëúaBO·?Óå–ùcíYœ>ûóé?éOGÌy¯¶¿¬©ý[¢PBmº'¨´Ê é{ýäÜ&|{›Ò&EÁO,°ô°¤àšŽ~ ‹rRdXaQ)šX9#ŠD ùn«æ¶ZȲ³ £(ƒâo¼0YJ êPâå ‹òqH1Xpo ^nP­……yT8¬ÎåÒ”ç6)ƒÉ‰F=|[üm 3Dˆ¼ã2"ZÚ*½à wÀ²r«5¦1,+…e»È°â]xñ­TŒÄ¯ÛuÌãX‰é•é…yâ „Ä%s‘-h‹µX:|ÒΛÃ+J±tÌÝQ¸–ÛŒÌQ©‚ר`Û/ òõl^#m²ŽJ3^º)¨5ÆKnk)XñþR¦ðê 8ט^\|Rõ\TèjQ_e°øž‹‡äØýUÌ÷\Vk–ï¹Hš¢‚2C¾—"b¾ç¢_ó¼*w±ý„ïmÅ‹ùž‹~ÍÃ’ÀµLM;NÅ|Ï×faÕ+Þ"·ÕÁŠù~TL£~rʾZ¾æ¯¸M báÛ—²Žƒ¢;£uôŽiot k(¿4ó=—š—_¼ŽT02G3¹­Ê/Í|Ï‹î‘_Ö,Ë/m–¾–ȯ>Ý!¿´eXæ.¼D~Ii¿ù¥™ïG|´ù¥zá{¦}#¿4ó=,ºO~Åeù¥ãåaµòKîÀki«ëÈ|Ï…î‘_º_–_:^)G^é%2G…8¢W#¿L?€µÄ÷Ì«”™~âtðü2Â÷iRVžaµò‹Kg[{(¿ ó=H™çU)œ'%y+Å|ÏE`î‘_RJLdN]GÃ|Ï…nî‘_v"¿jal,4¸×ÚrS Í&OÈ5+m/_ ÕÏ•ÄÎxõXm.Pt´™ºŽñR‹x¹Z¨ÞÉɧç6]×1ŽaÕr…/OÑ •,yii«ë˜fðr,fŒa™ãå–†zÉÞÆBƒÚ`5•ƒãBpJæ(´ÇBƒ{JM´7å7aN†ìUÓÆ°ô ¬E—s81ßs‘B/l9…÷ÅÒ'xa'†e¥0¶‘¶Š—eþš)c]æ˜ LX|¦m¹MEå*¯.ÀêSSpÍÈ=¦aù9Xn€¦°bi*waŒ´‰²aH/÷ˆlý^"Lß`aþ‘«–ø¾ñ;¦°À<®Å`ŸÂi«sLsxù^T¤V| ^JÚdŽ®g¼Bk('"•ø*> ߇ÐÒ&{È©9¼âˆ^‰­A¥XNhi«xé9za9ÖÛJ c ,+üåF|Ÿ&V>e4bùU/н*íÃ"ßhÀ_˜-L‚½r§m+°\™£%ŸàeryÈŒ—á«OJÚ*,ϰ¸`÷Tæè†¿z¹2ѶX÷PZ‚ÕSÑÑb ^G¡W/²ÐÅ1,ÂqqŽžñš›c*°ÚÂØåŠ¼Ò \T.§ÙǶê+ø~ 'fay,Xîm8^GËmU?z5KxµÚi"¿ªÍä™ï¥ 2ùF#X"W•ÌQø^ vwÞ0,w,yjœ” åªÈ/Ï|Ï”š…%q&%÷lª,¬´wsx ä—êë:*.‹Å²°¯Å†;ïçðò#ù%…žû0ÚÛ±Ïí|˜ƒåFs4b º‘\MµHmç#Ú+œ¿ï7bß)–î¤MøÞ§ 0 mŽõ†×Ñp[’u ý ¬‡•“æñ¼¢´ íó=C™xE9Ðk"ï«ÞºÀš+ç[æ˜m†bðeN-m¢‡‚™Ã«Ùªò½Ü`kÛ ,[xU “;ÖRèY嶉ý˜ï¥Øð¼ey?ÕiÂ_ÁøkVšg^•B–]sxé±mRŸÔÇ^J56Sˆsxé1OÔ"ȼ«œû>¤9Xc½]í .âÎôjíœÈvŽ.{ÊC=$×ÞfôPTC¼f` ì 5¢}kOD=†E8.ÚJ®¶mË{)6<•M÷œshßG¶ïyv3ò«µôÄfª6@tcX„ã"íã5G{¶ïÛ‚·zìwTŸO®£zn«>_ 91 ÓJÊeW¾î¹Í¯Æ8Ë/ÙÊeÎÀˆ©¬£©¥øÂØýÈÅ`ëªç0‰ù^ ËÎÁ 5Æ7±ª®MÌ÷L©YXíµazÕ½-2'é9¼Ôȼ”™Ø5¾šÌ^jl0¯æÔÇC@Ö1Ù9XýبÅÒG¶oªÅ™»äJQrñ·Çµ¡XG±ø}æ l«¾UòŸ+4°òL×.Ô‚Ý9Ò¸.–µI!ñ.…eX/̺* L쎚ÛúºŽqyŽªÀ2ÉïpaÊÞÖÙ6;ZbVÊ3ßã« ^D¯êw°½ê¸MÎ;”Wó°9‘­yÖµm¬£/+ÃÒ3sœª‘­,7øƒmv!ù U?z3khGÉL,1#mB{oçybÄ÷¼‡¬-ûÑyž¿œ?*Ï|ÏwÜ&n:¯”½-g'žÛän”ò~ë¡Ð×óÇ>lrlS•^,ï%N>Æk­ôÆ×8ãå¸Mη•‹°D~õMÌÊ }hkx•í{‰mðZ“ý%6¹jã÷ÔVåWèaI3¯U‘9'—8¦–Xí7}Ȳêøó{žä7oûÿ³}äýë7˜Æáù =åDîr‚¢Ú÷[asÿ¼kzª¯-Œ€riɵ™b¬.q`BÏçUX=œò˜ä‘k”ß.ðÍ7‹õ<‰k°¶68Áªý&HtÕ™[óÝÜØ—*Öûù›`·'•8”SÑHö"«uÀÑ_åoï>øÃËÎ{Uìüˆµã} ¶x¯ n*)Ë+‰´×˜wä;þ¦óÞgÚP¯|&3Âr©ý&˜j:ßF„ÑMÊ9J0Ý®§µù&Ì=§ÊèF§’Ó #ýùm.ã ö™v¾xˆ›”lâÓª`L LVßñ7£ÂÜH…bX®¹ÜOÖ l¾Âtø‚ äœ-¸ ˜²¥¬f°T&aú z†¿éT®Wˆ«àl Úæ¯xôÏ‘ í£âÜT.áIi;#cœ¶EïÁZ*o Å´÷±¡¼ÁŠz…†øÍ”£ùH1,Îhë7ÖÈs¬—=¦ü …b.ZªÐ Tæ)Ö¬uŒ¹ öefP¡rE-ƒÜ“p€%'æÒXAVËÜ‘{aU2Ÿ#×YÕ—Ÿ{ïå^*sïqw¤lëf®ão¦ä%þÿŽ¿ ¢;Ÿ8×ÅrR¦ANFÕ÷í7]LÎ2 1±–*<à“¶ªå:ØÂZ1 ¡Í3ÎXƱ®íA“ci„–…,T2ÁÛ:z‡³pt=s‰9ʨˆ&®Î¾i€Ä} Ê:JŒGÇœ]¨À4àQ˜>߆oZ˜{ëNkýãi­–¸“²ýi¢ý`F¡9“ñRÈÕCqÇi0LëÞìðDÍIþ%ªçýaøÔÎÝ#È‚È]"¾›|²ÍŒà/@ùüMäºd˜«ð*PþNa¼(Ëï+ ŒüÕëî哌Å?öðÿÏ÷ðßï÷j€Ÿºúù{óó?P_õY €ºG½MhãÿÏÔ·ÎèÁÚƒR:‚éêSDN:âC&ïEMmB™“¼öø(m“&k¢èˆ4QE`ÅØŽR ¡ÄÝcû 1 åðÑL‘عžòâÁu˜-jz­w¶ŠKRã ÎÁˆFÅhQýÉ=ÌüA~Ý·7Æ;O‰ MáL?¥ª#:ðyl 0°¯u©Î7cÀÙÆ· 0›^tö@*( Ò [J&iË® £At÷¡1ÆdqÆGÐäj°Ä0"ìê`?6Ç‚HÉÁN@­{T"ÛmŽ€@Br:ßÃêUl›° pˆ”…¬y[ÖgDT@öOŠFô\Ëw8"ý>W Ö Ö·Ó‡É'ÒɆN~0"Ì0€*……ì1׎vïúhD× ⬾ÆêѲj8àY_yóeéšÇƒ õã)ýdÜmDàUX¤víVÅ`”v¨<ˆOß7¼ »4&à ÆSªÌ´Û:Fðë€ßÀ|‹°k´k˜Êl¦P´h†9_Ò‡vmƒµñ("1ç úb»Í1¡ý©Ð T Sch¶9:™¶$)*yæêIÐFXÚåÄ“j·9âÝFpZ VE+éH8 ª•³ Rš&Œ3cãˆ%ŸA€P2P½Ë× t\5ÇÑÜCóÒ´#ª&’ìÁ€mÒr íãÝ Áw‡ýLT5»I€zÍc®@e`K¶MžnJ:b¬†sPSƒŒb¾·=`ÑïÈ9 Luµ,ÈV”¡A,&•ÁÒëºÁÏÐ`+¶(Ö}ÂÝnœã7`×¢Ù| B4 GD¦UAjG׬GØ- ‡sü„#î$sð4 ¬(æ÷ð¦oGDE¶‘ÂzÝ>5ú6^ÄCe®§d“jG™ƒ±ZзÊÁD`»÷Cá‰é‘YxÖ6sÛþÁ„Al)1ˆä]ÖÏzX ‡9Y-Öøª`Q[Cj ¤ʶ D-8Æ´8&Ž˜vâU´ÖŒðÞ 'ê €ÚÊ‚ÕîÀ^à- h¬i°Ú(áh¿¯¢Mˆü´;KÞ#hdPíôñ>'˜¹°UAꀄ¥T®j·uD/kšƒRΛju¶‚–¦3X™¥Ee1°>¾€]IéXw’9y/ÛM|RUEÐWàbi°éÒ@䢿x X*î£lGmå14¬ xœ@ØfŽx¬¢QÆk4sŒ¨Nô€iЄ)Yín2­2ô"A®$`ÕÔŠkÔV È1Û죚9¢mf”‰’3ëÝdN‡ì¦œ3øÌ`4‹Ú Ä L3 ƒ|m¦së'¢šÖ`ç&¢ªßmŽvv*GX‹³îú,f ÀxT8¼‡-ª0xãQ!ÓîØMæB°HD9˜È=©Qa>fTÉàò850žÁ{ò(àa ÷ÙÅÓq7 ^ƒµ E¯Ã`ã8¼ Ô;.µÈPüßò»:ô¼‰ª»Ù9XTF'"ŒAÃ|(ÉAÚD°kjÍ´:00}¦\NŠ»›ƒ>#  ¨:)´M`åaÁ £êeöª¥š#ž‚f7™ƒ–gTÁàžÂ6q¨­ÀÅ› !ôÇžŽÃÇ8I)Ø!+Jü»ÓˆíUè„ñØËF¦>è\PJ‰œìÁôaÎ=Ê PbÈêw»Òä¿xõöÙ!ÖùÚÈèªÄEi"ò_Žkç¹Ñ/õ§Uq/©wÈ ’òe×;;è¦ÈÅùù Ãþ°jôœê(«Zzù] Þ%ÂDÙ%†b›N”đសdú /?kÁ5rÒò¼ó›dl0NcÙŸG?|Û‰2{Jùñ/Í&!»ùÅ6Õ›_*“©B÷eÍr‡D§ ùù6€ GY°0ðòcÇüþ~¢ÌšG /¸!¢¬¢IãÃú#]×4<¨ƒÁœú®L:çσµGß^FÐM§<ÝЧg%-µ ˜ºÅ…C«’á»|bD.j*(ÙÑ¡¥~cT– Â1÷Aɵ¬Š.Nå×…ÔîRÙåù}~Ö@xâ…);„œö%¿ÁÀ® Û0ç̘½éh?gÂÉ‘4J’@sc¡ë"Ë#€ ôÂÞ¦°w 4;Ì3Ó» {;#[OëÛ½½°·aöÖÂK£ÈÞ±²·öv2B¨Ê™JôjªgöF1³°pQS¬œž‰öYBy > Ji´pàÝ)fïb4RP€QBñY;Qæ¨ÀÌgò K¿ÜÁªžÙÛèBÖÃb‡ª˜¡\6`ÐcÐüN¥µ¤¯î‹þ~-e6஘üüq'-|o(jº›–24§ýîZ Oä`miqwÒR£OînZJ£¯núºïÓRØ!æ£ÎÝ´_Œï¦¥ÀAêc¯D:Þ«¥`¨NùŽZ ÈÅ2M·«–¢ŠÔÝIKå£Ô”­…]´”¦“”(Ûø^-…d ¡gå¿–¢…ë3J;i)è†hØ÷j)bo›ã;i©ÌÞBÖûµTaïÐíª¥2{ë$ì}Ÿ–"*-ì}¯–¢ú†½ïÓR™½õ”½—´Tfï¼ãvÒR™½•ö¾OKeö&Ïg7-•Ù›—Ý´²7˜¶»k)bï¬ÜMKÑ©lˆ½sé—-õï:‰÷ÎkPÒ®”z­•*êG’‘w÷–¶›ôø¸ùó•ý7wÝG¡Z¤¡TCÉ% .>o¯ÎŽ/ ó<^}Â9 *,t ª§—€¶ëÞ®Þb!,Ö~:h¾c—¯ çÚão¥€$`”Ú£AûRH¸Öþh¿ün{vñ˸*%vì+–RÚ¼ÐâúŸ·˜üêâ‚ ˜W,uÊXRa%ª¥”Óˆ/¦í›ò ç¬íV =8|ñ´;Àª´‹uJW«¬' c¿hêXïœÜ^ŸdŽø½Ûn|èW‡Ç§X#‚Ê¿•š£Í'Ú©ßÁñíõõzÿÃöÝ—ëÛÏ«½ó÷·gÇWƒOÇ¿nºã““MÍP¾@íàåöPæóL3éœK­Ãæ!!µ½ùpQ(‡½Þ”¿cgÓ=8èŽn¾œm®þ úá¦{O3§ _Ÿ|Ø6e¬òŽèØùÉö䶥ЩZ–ÅÏ“çû·My)ü‡ëI×j¥Ô÷—ŒÁÄßjïIw»Â ]{}GÛ¿Û‚¬8;†¤š='À2ï¾tXa&}³Zý¯q%úÇ?c]‹¥¸G!ÚÃÊùÞXç©>9ðV®O¾$ãý'QˆÅ#¦Äe ç[à~ØõçØéÝÅíUwöñú¦î’³Wî&Þ>±a–ëcôïÏ?•Â@¹†U¿¯ïéÇÏ©ä+ür‘KÂo]kß¼§ ISƈïõá\ $TÞyûÖ ì-É6p¦Ô¤'ã6ûá¢?Zû$…îkß2à%ü–«ÞO{bZ³™ž-¾ØI;êiÍì˜D »ÆD_ØØî¸ÉÿÇÃïûj+ƒÐà S9–é,XÒx—‚B›³{€·ãÓ .'4 =ž]v|@p•¥ëËcÚPù»Û_or㙕Óx¢þ“c'GÿÓß .»¢›ÉÚPÕ@´ž×Û›ÛËî/™Q½vsÊb…µü^¼-âhÜŠ-eàQE«§Û³›ãõ3þˆ±~ú&ÿ|øý‘üü¿Ÿ?zór‡ãO—­Å0°nÄñU©§Ò77ЀjU£³VYëFVÔT®[$ŽŽ^ãäÈx:½ý{wçÃíº-‡`M$lº³×§‹ÏØçøüKw¶ý Ûõ‡?ßä~•|êh‡¦ å.nÆäÌÄ\QKê…™ˆY6¿ZÏà¢QãŸT¬O/¨éÌ<®w_†LHÕµÌèÚxy= ÞE.j:z®x¡’¼f§‹Žº…G•„C~“è2GE—k3(Iæã®(tWAEºxËo2Uôò’HKîS'Yñ¬ärì1x…q•”– ö”=š hy®?$1•ÞtçÐ @騀¡ŒK/Ý´¼»QÉ@ù(º?"XYUS%Ir™øÉ“’I÷t 9 AáãÐ:Á^ª÷2®·³Ï–ïâqj‚¼À”’„b½ ®>ö¯Ïoð¼;@ÅT¾¼SÖH~’\^½Ñ-(Õߊn—ßjr½JMAu”« *~iŠ)Æ¥”‚BV®X™šèTÒRSzøò“iA͉$©Wfl^4˜ÐÓoJMå ü žI¥=–`ì,ýó«Cø?y|ÓqŸ?L@f¥ìÑûûÏêðqŸ»€ øßýêÇg‡Ïžv{ÏIéÔÑ]@¾Î >*…AAëÞH•>TÅ¿ÆÍÂ7㤛eý·›õíÝ,Lêõït³´ÃIHú£Ü,õÕn–úMn–Þ„¯v³2¥¾ÎͲ`×üÿv³èá¯r³´ÃÑðøpÞÁ¹ßÍŠ Sã §¦ú¯t³bÀ ¼è#yýun˜+øý›à¿ÊÍÂŒný#*ä­aY#¾ÚÍ2ñÑàr³ž‹`G Å}æS³ñħ¹ýc#ˆîøpüœ6³Ùè¼™÷sK€ûÓ~·½¿˜0þÃ9"ðˆAØD•ø\}Ì÷…òÎ`1\¼é–]ÿüñâöZæ.  à•éÊ–8>ùûbÿx­=>® Ö`h÷3ÝöGPÍTÐw¦ð§Œ‹·a›cÔ¶­FŠ£±dÇ“Ü èû½ŸÖOqÉoZh"—t²¾î…¡±€š¿{ûݳîàÉߺç/^>ëþ¶wÔýðæéÞ[°9\¾Ûn@ݾ¾¼Ùì]?×ë}½¯7ïßýò°›Z@êé³WG/Þþ}WP×'?_nn>].ÂÃèïÁÎà¶ç °¼€hDa\ú1x §Ç_®áŸ \ðßOÀž–¶ûfg -œ!“þA§?‹Yñæ"êÏ_क़£¯€äo^¿xõ–aÂù¯Þüöþ}$uï¼iúUŸ…|^îïÑ98Ü{úâ¬õþÞËý^.¸ü,VâÛ•¶¿^|8_}€µÂ㞬&¯ê_9þ¼CúF¼v‡=Z}w|u†åš¢<Û_‹4¼>0ï¨j%‚·YÏÃ..Ñ ¿¸©–¡Í7³í8ùäoSl}T¢§ bH_O¿é´˜õ`ÃmߣþÁe³xãZÄÇO`‡ÞŽ|€úe½tOÎÀvË÷òöŒLQIg9✢Œê>¾yïé¹|óðÅú¿&5¤g¿ù¬¬Ðúäâêj{–-‹¶g­$>Ã<õµ6³êÜ·ò;çœaÕ&\”äãÐÑ›Úêñr|~¯œóh<®_uÉHŒ¹àà iŧQçwÇ“ž*×ôô6pÖ˜Œ‚ÇÛ(ùöÓ~×b«ŒQ¶ùª =çQ¥`ŒO®Ïï€ó‹ýfžFEIߊ¿öªf_ÚÑ1¿çÙã3ªP‘!pN l“¥TÞåæ×÷MOíc-'„3’±’È ò«å8íÙ§ *1{ãzWç‰E>(ÁÔ¤§¼¨˜dMuCó+>«r¥nÐS)¬I^%%/Q!$›ß­N±ÕI5«¢Uì‚ÁjS2z3SÊú†¬ví"E tÌïHghkT÷ô|¬ÅHÓzÒí«Wãž)_-³6¤fÚX¢'¿ëcÛ+˜f]Oe½i8ž"Ç~U.á°µ° ÓôÁ¹fžÈS}~g9ééMLÍ `ZØù„OUó{É1'¨^ç$B¡hZÆpžR`Ð%¬'x7ÀÖ¨d*m•‰–’RеWC 'éb2ÇÛØ°”O=Izû5¢­.6,pw4­Ê§òžpÂñ_G6câãëöWKrH›iOà·Ôôî )ÓçyÚéª:¶á[˜V‹¾¸3ùÞD‚©Ô¤ù…•·J7ót`5†üÞnŠ­Éoe—)ß,’J…Ba:f*ɪXj… 0íòû·)m7-‹Gß«æW|bšß±M8s4Ë`]Òì‹*ä×aý[J+òNå‹û"óëY£f(¤ó»ªÚLƒ-¾¡³ù}ؤ§ó>´"+Õ|a”·M“L0S9De›¥ÇœƒMçB;äâê[v'`šm¯1ø>0 Zƒ pÁÌU‡ßÝi>ŒzÑÅË~^ðoé•E°Ø+Ì(öê@Ž‹W¯(Pé2Ó^‡»l“T¹»„&fì.îÒoBOqÎã$fƒñ)°±F&Ö‰Dô]­ÒUSW2ºö/nÏ.>½»cT‡÷T¹+žÞCןö— W»b6Ô(ç?ÏëYy¹n{uÞ\·­=ö/.¿s|v*_'ùâêôúOÈeדßÿ#u¾ýeÔéãùñMÙÔã~-ÎOÏo®V0?‚wZ¯J,‚ºÌþñÙÉíY…ód=Qx¹ÇÁ£ƒ5´¼náÚãíÕñù5»Tér1¦kíñæêâ¿A¢ð2±ñ¾­=îõXÛè¸Ö‹+P;€[íß‚Ïv~3¾F3?Â0<ÚwÏ>H™Ã9j‹% »Ž€þ~wñáJbé .~Ùžb8æ¦_ ×7ÛK‚É{+â7W·×7Ž~;KŸ¶Ï— o}‡ÒÙƒ'ÏŽNûÐÀ-ní¹OwdÁè{°¿ª r}y|²…Ù½(‡š`s‡ljÑm!’ÝûUÒÜ)Np®Á—‚=ŽFÕéö=8H׫ zºý™®¦ÌJÿÈ‚àôÙŸOÿI:bÎ{µýeMíßš…jÓ=y@…Q)Ûë'g&‘`,ßÔÜ&¥ýÐË+°ô°B-/'Ť­Â2‹ É,ÀÊùLjÄ¥…•“A,‹°02(Ý6ÀË8) ä†¢–6IGÎiÁË Êšµ°0M„DHl»g©MÊcvaaÌ·¥Û°úTo*)øÐ¶Xa…;`YIQ/…tTÛV`E†ï‚Uooº ¬$°Ó+-Ò SR0¯G´µÌ)– |Ò–½›Ã+š:Ç0Â+Ö²J¼†åÖ†xáóÝ1ß+i“ò¾J3^º)‡5Á«^œõwàe ¯Jkð Qèe͈^!VzÙ¬¾µÄ¬󽔯êó=Åšå{)±A‰[XÐ&{H1ßsÉ®yþ’ROZnä6m ‹ùžKvÍê7yýxÙ:Gæ{.—6 «–î'û1ß+æûQ)Œú)2Šƒ®q"¿/Ýó:JæŒÖQä—Vã=ÔÈ/Í|ÏÅî“_f¼ŽU~iæ{.7tüêã²üÒ†aé;`Uùe¦2§âe–¹ –¬£QX•^Ì÷£ò;Ú7òËÝ!¿4ó=—ºO~Åe9¡ãåaµòË÷ùUù‹ùžËúÜ'¿î«:^)&.xµòË/Ë/Ó`-ð½È/]Ÿ™H›ÌÑß§IQx†Õʯ)ßWùe˜ï¹¼É<™e½]å—a¾ç.÷ȯþùe˜ï¹LÍ,¬Zön «–MÇ2{­-7Õ ˜¿Df¦åÉ©Mô#– Ükm¹Éjbyµæå‡µmV`¼Ô"^®)£«å©m+°âV-6Xð¢œEr<ȧmVÚDæ`™À ^CŽ¥|/"ï¹,l¥—ð– œÐ~Ë5å¿<jii¼°LàÞƒ†Rí“ï½øÀSI›ìm,85°èr¦OÔuÌm Ë”’õ³ÀóºûHùæÈ¯icX–ùk¦u™£Ùȃ³œhr]çhjy¦ÎºÊ« °ú´ ²‡Œ¶m–Ÿƒåxa0¢}ÈÊ2¬0¤—{D¶þ//þÑX}S¸³Ä÷ß1…æq}'×>·õbçØ4‡—à6Iæ(÷™TÓV`¹žñ ¬¡œˆ_õ#_RÒ&üåÔ^qD¯Š×P~•6†¥çè5†eë»±A‰Fjþr#¾O+i"%Ÿs™­®Â ¹xW†eǰÈ7ð—ÞÔ·‰ýWK[åÊ¥¤ø/J{$síí¾–ÑíœgX\n{*s4–{ä½Í²°oÚVà=”–`õ¹¬s3ǽúŠWÃ"çXï+´mV*°Ú²ÖåJ¨%@G´§¶Ë÷91 Ë7úÑñ*m–šƒ¥F¼*6S-·Ý7m ‹ù^Ê!“o4‚¥ûž€6Uçh–»V¨ò‹ñ’ý*^Ì÷L©YX^h/w]TÓÆ°Ü^ù…¥««¼ç9*nkÖÑÏáåGò«Ú;?Ä+Ös°ÜhŽF|¹†#s4bOøÈ°fŠX¾)ÇÇåÜ–ßÙC> l€9X˜íLÖÑåjn+°B?kàa‘ÍÐÚ«£ýXet`¾g(¯h¨·ë«¶­ÀÒÖ\1Þ2Çl3”9Ë4c›è¡`æðêG6€z¹½B# ƒ-¼*e‡ÉÇëÇê§¹n¬E~æ{)<…•šìzÂ_ÕG~À_ °’xÿ#s kC˜ÃKl“æåøÔ6©xÅ9¼ôXNÁk*'d?†4k¬·—휘9`E¶s¤ìðØSê¡zí¶m+°Ô¯X{ÂLôcµ'¢Ã"—퉡3°'"Ë{)<•º–CëíÒV`±}ϳ›‘_¤çåèxŽÕˆn ‹p\¶sî°"Û÷m¹Z=ö;BX«¥­À 91 “BÊ:Ê}ܦaÅ9X~Ñ臰6@Le¥Ä,ÅÆ6€¬£fz©¶-ÃJÌ÷RvVœòªÀŠó=Sj–;gÆHz/5²BÍ¡Á먥Mø+™9¼ÔØu”«ÉUNTXvV?¶ìDFË:VžH®”{ñXÝøVb›XižH¾Àâs…VžéÌv)^ïGi«ë–ae¼0gjÍÉa]‹åS­xÅå9ª óBË™Nlñ¶KKi/‰Ä¬•í›ý¨¯ÀmZÊZ÷ý<^MTÇa¡IáUÛÀÊmI`qðA¬cpFº›sžˆÒ&%Å{.ÎgsX9¥ôÄfÒÜæ*^fVë­åBÝ_+°¨MÊm÷v~Ž‹J°×L6ò"r›èmÕsp‰)Œ¢:kD½–†=¤¥­Âò˰Ê)Éw}ÆQ`åÛ"`¾õJ`qp>cD›·«m"v´´I©ó>.ÃÊx­­CžÛ_‰ÛlŋˀK¬cÇþb¯Šï®¥Mè¥úeXeÁ•«¾‚ÄW·Å ‹ùžÏk'5ZwÙÛòZÊs[¨°ô2¬²ŽkâGÆk ‡¨­Â2eŽ7ÃÊYÖ…^C ·1,» «XaX«âÅ6¦ã¶º•È/™©DˆÖ8¶ “9jiþR~Výí±4<Ïq`ßãO¦XÌ÷šF®zôõa5ëça ^4¹QçÈ´ÏmVb™3ˆ›4"ü¾$âªëØK›¬£îçaµ‘ä¾±£/‘…@‡¹ðª}Ôj£J{î—׃uld4´ íuÃ÷ó°°gì·µ´ Oh3KtÐW¡ŒæuŒ ¬ÜVçhgæØÒ‹dzãc[ÎH›È/íæéÕžÁ»M=í:Ú´ÀòóxµQC,;)ôb^µÜ–*,áûr·`#ÛOôc,q&+>Œ¯üa±¼÷qS“£…جµE‘šå½ÄøÆxa±Ê( èø&ß$Ä‚¤rÖ„ÎQåæa­1žSm_l€\pÛ’ð—Q‹°XFS!±W–å6¹[ Œ^œ£ÈhÝЋ_ò•ÂðЦÄf2¦ÈB>“ŸBfÛ¯úC¼´ ß;«±ÉÑVî'{[I›ð½q˰”Ø5V«UƒW¶£…¿ŒÈû4?G¢o͉W,J›Ør&ÌÃjí{ÓêZ¶™´´U¼â2,%>L½#2<‡á¶‹å=ß똉fö9Œ!³-›aÙ~ÖÐŽ–õ,³ÚÑ²Ž–å}{lñÊöíôFK›ÌÑêyXC_¡ú|ë°Ü*^lçðšId—ºŸÚ…FÚ„'¬]„Uü!´I+,‰çøÜf9aÙ¾—˜è/²áÈh‰ui«°ü",öÓ¨ÊÉ„W½´Už`y/qÌI$Y…¯ÐàEm¾Ò>.Âb_le;½‹á¹MΔ¾/÷†&Qi²•ÝdŽJÚ„¿\¿‹é•måñ~µ£…öŽå½ÄD'ÑòlߎÏt´´U¼ô"¬‚ÙÝu?NmrÑÛn(ïe¦Ͷ²žØ9bcYGgçaµ§d+·¶ÉÐŽ®°„ïÃ<^ôýz?§>|nÚ–Ÿ‡%xe[¹Ú_¶5²£]¨<1ÑFbZ?Ði»ÐV¼"ÃJms±5í}“Ö.Ìmbç¸4«‘`+Ç4»s›ìmÏ|?Œ¯6x‘?Pï› cÛ¥­ÀRó°9Q°hðZ·ëX}¯gæ88UÃyTý(°¬´UXfÖÐŽ®wûÁµÉÞövž'¾ÏÖVkG×9b[¥=ó=ßq›D¸1LSS§¢Ór¦ ÅŠ—_„Åzts=çãü"ÅŽèmÏò^âäc¼ÖJo$ÕµêË™NN‡Æo=‡Q>.ÂùÕ“ _|…^lkXlßKl{„ךb¢õnA‘…ùœÛ$NŽ€—`5qÌz[Û2íó~Õ“$¾úM²¬:þüžõÍËüÿìFyþþú &aøG~O»œ$¨öýVØÜ?ïš\êk‹ã# \r­@»Çq³`‚æTJª×‘²!åðMë¼fKÊš@·ýQã‚dÚo‚DW®Èek{“r)Ó~ˆ‘,nU©£®Á?7½‰õ›0÷"y ÐËèT™»Á¢æ}Ål7íuÌšf“°lÏ«`k`Zðøb¾ƒ3!åÔS˜@S)å+LG½çUè#'5R+AV˜4HpªŒ‹U‘'ßI»Jy‹ç<Ÿúj=§s©§2uFƸž3a•w[à;,=SüŽWÓy˜c±æ¢ÕÖ–ÙXxý;ž‘ÑÎðÙˆª§gH1o}P ©­ µa²”ÝñL1ô •0j‰€sW¬/´õZY™;ro2Þן£x§5hÝ̽ÇÝ‘‹)g®SüÍ”01@Åc€±xpÈuÑg+Hƒ 9G–|(¬sL¹Îšœi xÀ'ŸRËu@µ #sñ9ÆC`Ÿš:w܃Fç¤gˆ[/û=™R/0;œ…‹‰G4&gI±’3º¡'Œ˜’VeD`/¹ä4€¨3Û ¶m®³Ns¦̧†u!™òhjsM¾p‹‰ÞÛÔÎÖRRSE”`åÕµ´ÍŒð´ÍÄT$€)yŸ4ºO”)Læîcð|[Û£ØKÌW ‡ê>¿Ó{i‰í÷,ÌîîZô‹²ü¾Â¾(Á_½î^>ÉXücÿÿüpïÿý~¯¦ðÿ©«Ÿ¿7?ÿõUŸµ¨{ ¹ãÿÀ¥Mº—¯Âê[`L°8zà‚®`€ÈÉ€ìIÛÍú¦È,§lRÀ2º‰ÒÆuªèˆ4QE`ÅØŽPà6ѽ±QÕaá´ïÈ礵öÊÖ^x»2p­ÇLaRê]GÔÊ€¯›önŒh0yvX)¤${ËâgØB6€”tiDS8ÓFDEY'’Íz§AœÁˆ etƒ 0*ä¼ÅRÁ6¯àñ¼S¦Jª¥ܶìš0DwÚ;Hí’KÁ4MzƒÑ€Äq®Ïyßx‰AؘH+ZE Ýns´T1Þ¡ È©mRVƒ r½Þiר »ô¦·íI5çJ¼Ãé÷Ø‚¶5h`˜&ÐдÓOÑZ—`ÛÃDuJíˆÉ)XA@HkPà”Ê1ì6"fP·ÊÂ,`1¡wM €TUt&ÌÏ&ݬ£ÃB¬&jû,¢Á¢ÜiDàUo@iõ ?Ym3"ª`v¨qÛ²1ìb²+E@ìŽDTM»­c¤—c`hu»/¦<@Å$XèØäÀwp˜g¤·(Ka1Vè‹í6Çö§ ȧ@"`÷†sÐE½‚ÛÔ¸ÐæˆÐX:‚aæŽ5ˆjæ±ÓñÞ#,_LØ̨ÁîÐÀðgÚ52ýnÉz:ÚRŠK½ËñÅ«Zl›ÝzÝŽ޹W` ‚m‹E¿k±IQ2PÚbmdLǹ“ ×°>1ð|Œˆk lZ¯°+u;"XódSƒ˜*Šäü߃.Çý¡Z°T 0i0ªvÍãùšû4ÀþC<§u»qŽì{ |&E©M^G„/,&Îo§Ö#X=ØöÖGC™çÕN2OÊzo ˆF0Á€ïdÐD÷`YƒþTøÆÑW¹ŠGéÊlt:ŽvÇŽ2¨1‡¤FꌄgÖ§ ö/7”xÁvÇ\ÿà=i°bhĸÓ:âÉncÔõ­Æ‘¶r ÿ§rG‘›PÇ¡%d`¦Y#ÃVÞ…WÑZCC0"«‡íÁkÅÜÃ`9š¶ L}ÀH€ÊtcZÔxmBú–´UhM ÔV}Þ@ÀÔöÂûœÿ€Î)éTwZGô²‘A,ƒx1¸&mP'q-BžT‡q ”= Bq'™Sö²Eà 6Pi s@¦€|ƒŽcNŒ,È€®N ;€duh³«¶gÄ'xA`‚g=˜H”] P€¬ÎDn,¿]è8rÊôn2­²>€…ôµ› Ä×Åò cz¡G?¤ÑÈ@L# ¾ r7âœÝdN‡ìþ¨5`E$QK:X'¬àg9ðÌãPÊ¡‹‚ÌJø­£ßmŽvãPä$ '°ºv®«Áøþ%´¾Ùè{‚6Å„Ð*§áÝMæB PAxZ…jÂ'ÕŽˆaÁÔÇz–j½ñ‡¼'‡¹Ø< "­cÜM€€¦¾¢Ôi`>4¤CqD>ö >u;"ˆD¬Ê;¢ênv–„1 ó;÷ ÕºFs •„.ùOpøÊÐ5Àj¢0»Ù9è3¶‹Ì!ÒÊ Ì'c Ë Ž©†~G2Ö ÅáÑIJ8G³›ÌA˨ Æ#* ThGĥ¤V ¯Á§óíˆÀ¤ ±àÊ#—´½;TK6$XP@Ô0 ¸‰=,Øå Ñ[€^߃ºÃÌ’ä÷Æ5W/^½}vˆA¾62º*qQšˆü×ÜI˿ԟVޤDþÜ!'H*”½«ƒn:ª³™˜ûØvØvÀýœÓˆä`½nÇ?‚%°¡=]b(¶éDù@ ¦ü$›†¥ËÏZFpM'Júá3Jø‰¿Æ¯cv¿ýðm'ÊìA^~CLC‹` Œ^*“ Âû²}Zî“çççCØL “-̸KSø7ßýÇÆ|ƒYæ@£fPŠdúç‡-ôG<vGu@Ç(š2iJ¦T·¿ZFÐM'Áåô|–þñèÅ..H ¾Ù´Òx;) Jv´p(ú¨ƒß˜’НûzAɵ(5EÏë`rHŽîRÙå&s=k <éÂÔr‡Ó³çuÀ?‚a¶È˜½É&ö6ÙT $ „œCç>2•H8Ø;j]ÈšˆÑA½o&ŒÏ# ¹/2{»ÀìMTBöÖ%ÏsÀÛRµ±·î…½}aopÄ;€ŒM<é|G®‹¨åQifoò²ymýceïÈìd-#¸áÀÞV {foU©4ì€ìmC™tO1bo'+6wböNÂޑٽƅ…‹–Nzó3Q⺘¦¥4Z8ŒU1{óÕ?€#;/×NÄÞ–Éjòc:–tËò‘U~™c˜¬f¹CH©çu äÀ†Ü€Ù~§ÒZÒW÷E¿–2ïJŒÝ´tð}.“±›–2`à‚Nr}'-…'rXC²ÛUKiŒ>“…Ý.Z +Ó§ÁÙMKa‡èêâÞ«¥h„|›a7-lëy„{µ”F‰ÂîZ ¯I¯º]µàC^‡]´T>JµyW`áÀÝ2²ïÕRHVp´YœÞ¯¥hárv•Ý´t w×RÄÞ!ûW;i)bï¤v×RÄÞ>3ßNZ*³wd}¿–"*ùl^줥¨C>DÛMKeöölµÝ¯¥2{G/ì}Ÿ–ÊìmØò¼_KeöÎ#줥2{Ýíª¥2{'1ÂîÕRÄÞQ {ß«¥hò!önZŠØ;‰™7ÒRÿ®rxï¼éJ¡ÖZg¢~$ywoaºIÿ‡k?PaÏs×}ª%J-“\Pàâóöêìø²0ÏãÕÑ'œÓ >B·ð¡jxk»ù+a©õÓÑ@ó»|•ÜPá ·Rþ0Jm…†Ñ })\+w´_~·=»øe\S;öK)L^hqýÏ[Ì~uqÁåÇ+–:e,©,UBÊiÄ—ÓöMy†sÖö ë|¾xÚ`MÙÅ*£«ÕV…±_4U¨÷NNn¯ŽO2Ç@üÞŒm7 OV‡Ç§Xኺ¿•Š¡Í'Ú©ßÁñíõõzÿÃöÝ—ëÛÏ«½ó÷·gÇWƒOÇ¿nºã““MÍP¾@íàåöPæóL3éœ ¥Ãæ!!µ½ùpQ(‡½Þ”¿cgÓ=8èŽn¾œm®þ†…ïoº÷4sšðõɇmS„*áˆþˆŸlOþg[jJ™Ôa¡Pü]|Æ>Çç_º³íg°Ø®?|üù&÷«äPoD;¬](wq3&g&抂XRíËáõÌѯ’@ØÄéO±¦SznA@ï¼ ™ªE(ÑÍyýR÷ž‰_¶(yÿA•žùΊÜÔ…ó%™B255L”ó‘Ÿ¥è&I.ë ±¢Ã ¥bó*œß)!RòÛ³ÅUZ¬ÐG¬ðj5Y×çá‚K¬©¡ñ|Ó AQœF°ò^ÞJIÎó¾æfuqÊ°Š VZËs¾>̯©¥²ã-ˆ0 4÷NˆÝtS  @Íì ){ú ¸57ºœM ªé†„¿€ælãÍZ—6õŸ_ÂÿÉõ˜Žûû32»Ý~ØßV/'ûÜåÐþëW?>;>lþ#í}kì¿íýooïëdšDÝï±÷µÃ€Hú£ì}õÕö¾úMö¾Þ„¯¶÷3¥¾ÎÞÇ«]ÿ¿íýû*{_;LàóÀéûZ{?*Ìñ€.Cï¿ÒÞb4Ö½ú:{_%ƒ¯÷ø¸ æ«ì}L-Ö?B³_éGX_&õµö¾‰ÿ½ÿ\;û(î3Ÿš'>ÍíAtLJ¹´™MÞSWû¹Ð"Àýi¿ÛÞ_“ÿád˜ø–EÄ l¢J|.ä=æûByg°¦jJ=;¾¹Ú~þxq{-ó@H P<Þè5eË ,ðÇüý¦€n›íYÃÏ먣¶h·ýT3Õ…)@)ã®ñJ˜³>l«bâh,Ùé:8ú~ï§õS\ò›Z!¡±Oðu¿( ÔüÝÛïžuOþÖ=ñòY÷·½£î‡7O÷Þ‚ÍñàòÝvêöõåÍfïú¹^ïë}½yÿî—‡ÝÔ"POŸ½:zñöﻂº>ùùrsóér†!v·=o€Õšñ } ®Ðéñ—køç(ü÷°g¤vß,¨ÝÂ2ét ±x£o.´ûüÞÎ8zñêHþæõ‹Woy&œ¯ðÎøoáßg#÷Îk‘¦_õYˆDt¥ä=n‘ƒÃ½§/žÁZïï½Üÿáåbäÿ÷`±ß®œôüõâÃùú謞;d5ñxUÿúËñç­Ò7â= °;üëÑê»ã«0,×nØþZ¤áõ ø€yGU+¼Íz0sq‰ýÅÕH°mwµöüMÐÙÖG%z "†ôðõô›N‹>nûõÏø,(›Å×ú( >~;üóväÔ/ë {r¶3X¾—·gd Œj ËYëà8÷`T€xðÍ{q囇/Öÿ5)f<ûÍge…Ö'WWÛ³lY´=kEëæ©Ï†™U羕ÜæTeísl¦þjµORb¡ïƒ3xÍ"ß{ÀK`k[÷ ë¯ø<§¯€¢u±<€­=%ü¡ø5~§„d›_ñõp~ÈšŸu·ØbýfùU©ÞÖdöÖÇ>å©ùéxÛÓ~×O±´…äC¢¬twk4ÏO@ÎׂÐÓ+ºšÃœPqJ«†$ø²í ŒaòÃ)…8CçÒºbÛã;½*·ÁF«bRp 'Àš¦§N†B­*Ìô,ùC8v©-'I ]=¢QSRÊmzª`Úm-݇ʷF¯CÍ‹ŽË‚kögÄ\«ryj´Ë`C¶<¤ñIJà °ž.?ˆ›Ùe½o)dtH]ÃÆÑ–‡mSŽ×Ú6ØÂðMϯ„æj“žøö˶€zÝnW0á|~h6徨L»!Ul¥ ðf,Ʀó4ƒ¥w^Û¾¥_Œåá×tžÖzÕ Ì`Ú Em~À5vCßÌÓ§¾S)ûòk:¦O®Ù n]ßÂMtøAESFœâÂ4èy7K˜z§Ï£f8A©fXøVˆzeó“ª9dt­©HL“ÑK%çòC¥IO«mz¢›ÛìÜè„í ¡WܬŠ6%ËÃ]vÈÅÕ'¶ìNÀ4Û^cð}`´™uૺÕá÷Gwš£^°õíÀ þ-½ŠÒd‹a…©­^ȹåªñ*ݪ™Âëp—mð…%…ôФâ€ÂŒÝÅ]ð…W:Œ“˜ —ÀÆ™X'ÑtµùNuU›]ÉèÚ¿¸=»øôîŽQ]'/]ñºþ´¿L¸ÚU… ˆNî̦‡®Í7¿¹Ó–?ŒüÝœ YùCΖ$X;|örï§œ^íèí³7ßÜÙj¥_¿y»~þñlöÞÜFÌîƒrþóñ¼Ú–{ŸWçͽÏÚcÿâò 9Çg§ò5p’/®N¯ÿ„\v=éñýñÿ0RçÛ_F>žß”-@=àWðØâüôøüæúaó#øx§õÌ~Ô=`öÏNnÏ*œ'ëù«Ë=¬é åÍp ×o¯ŽÏ¯‘ Ø¥J—‹1]k7Wÿ …‡‰÷míq¯ÇÚö@ǵvX\ÚTÌjÿ|¶ó›ñ}Žù†A¢Ø=û ýeç¨-–0ì:úÿùÝŇ+‰¥ƒd¸øe{Šá˜K˜~ (\ßl/f˜­ˆß\Ý^ßt8úí,}Ú>?\6¼õJPdžSj~& óD°{V/Zƒû³×Ä*ãñ¯Äx Š³×ƒ[è°YL :Ÿá+ÔĦí+Jç¤ìêåöüýÍ1`nq„²0S$Á”ˆs¬ÞÊ‘óÙ†0èhqkÏ}º F߃ýUmëËã“-ÌîE9Ô›ãÁ‹ó›‡)Œ†­²:Ù4ܬ͎ÀÎx¢ _L·kìt`4˜¸>y7­9´w 5€òIÒÖ1 Oh°¢Ð³ÐúL˜Ãl Ìd ß”ÃH°_\‚;ÅÏ/>_ƒú¿é¾lodßœvëîÓÅÕ¶{/;êË Ì¦Ã'ùmC96úÝ5¸uKŸC¶é©Ÿý*iî'¸ ×àÂG»ðtû|¼ë‡U=ÝþL·kæÏÕdApúìϧÿ¤?1ç½Úþ²¦öoMˆB µéž< "#ƒôçõ“³|HÜ<¶ÌÁr£9š³b™#òÞTzE†5W8?óÐH®Zi«x¥ 0‹2‡É:y¯ªÌ¼B?kàaåôqbºíq? íó=C™xEC½-%0…ïCÅKXs…mË Y5#Y¨¥Mø+˜9¼ú± P÷ãho‡Æ6 ¶ðª”ð%w¬«üâ›^NÚdó½”Ýœiz5<‘3ø-Àjl¾>7£kC˜ÃKm“8‘ÑNÚ*íã^z,'Ì€ï»J¯Öf i–ïí~²Ž^ÚĈlçH ß±§\ôPk3UþèÚ¨†xÍÀØýöDÔcX„ã²=1,ý:°'"Ë{)»;•Ç^7sÀª6@dûžg7#¿6€ÀØÑaŽË6ÀÔΩ°Ø¾oK¿ê±ßêYÃòÒVirb&XÝ1ÜCØViç`ù© °ñ}µ*¥²ŽR®•â #Xº–3ŸØ¾JöPb¾—«s°bÕe•èíZb51ß3¥faU@³o%{»Ú_IÏá¥Æ6@3q±ÉÈmNhŸÌ^9QË™³m">Låûdç`õc@ä—åÛá^ÖEb É•òÜâo#k£ÿ‘mÌóÀ¶/_`ñ¹B+Ït f{]G¦}Nö‰mNôP ˰2^”TðÒÌ÷Ûjl(Åå9ªË4¥äM±r!E/xVšÇK"1ke±`ã€ï96´V¦-ƒÝ÷óx5QGvÓ«ìÇRA\Y‰)¨žKjbƒ3ÒuظIœ©”º[Ǧ vÏ%µùln+§gûiù¶™Š—™‡ÕzkkZ²=p›WËÎÏQ`­˜ Þ.û1ó¿ Íšع¬³ÄFQ5¢žÌÀžèÊÞ¦¶ %µ{¿ «ÌfWYXôc)1m±ÒžKjóë$Ú„¼ÝØr…ïµæ¶Z²½Ë°2^k‹§Ç1«Ìkk«üB¡Q`ù¼(WëŽRdL…†¿T¿ «¬£'šÔ8yÆËä6SchØ•Ròå¼vQCž¯2Çüøx¢ÂÒ˰Ê:®©Ìxk›Hœ ª¼ªL™£ÄMư(¥sõÊ*> ´‰m¢”]†U¬0,æœÆ{(Ç s}"åòKf*¢5Žm†6&ûÛÔ¦+,?«þfY0²¿œ´ÉRÌ÷šF®úvÙÆôÒV×1Îühœà9jiù¥ËœAܤ‰á÷“ŸÈ/-m"ïu?«$÷M@ü4%m"¿´ð½}Ôj£J{îWM¦¸Ü³æ¶>¬†ïçaaφ'qjÚk3KtÐW5{ˆ_\–"ÓЦëíÌ[z‘¼oäj‘…6‡9Ê9 ¦”™¥W{eÞru-g'1,?W5Ô›Tãr\4¾ÜIJ¹Kø¾Ü-˜DçP%x‘¹µmÎÀœÈ a±¼÷q#)ôúPŠp燚ë 7r¾­4Ë{‰ññžº&ó/ŸÛ\#ï Ë{‰¥`­ñ|( ÑM(,ž›å½qÍ2jËh*Š ±¡>ϱÐÞÆf½8G‘ÑzS³Ò 4Àʱ+´t²‡Œ)²Ï¤Ç§Ù.¬|_l“ìûa[¥½±ó°›|`Gs|5ó¶¥J{· K‰=QõŽu·çî_Å/yŸæçH´Wv¼·Ë‚¶jš0«µï ÚõnÁÒÛÄßV&.ÃRâÃØêo³o夭ҋå=ß똉ff¿nh3qmg°/ÛÏÃÙÑ5ßb‰¥e;ÛÄOS–å}{lñʶoàÅg¬ÔVmL«ça }…&dá‰ì󡯠…',Û9|§fÅ¥nüÚ²ŽFq[µ¬]„Uü!´I“ؾì[廨&±eÙ¾—˜è/²áÝä ,¿ã§»/¿‹ý4ª2žc©g\cËY–÷ÇœD’Áª÷jxQ[ùeã",öEÁŽ6q +ߣ@;ºÚLVø¾ÜšD¥ÉŽ®g™ìyn«x¹~Ó ¹©®#Ç¿ª-¼êXÞKLt-GÛ·Þÿ2-^ØVu­Ó‹° ^d“î7çÈ›Ü å½ÌT"£ÙŽ®ëÈrÂr[ÝÛÎÎÃjO=òŽÅ嬴 ß;áû0WW"c{ÕH[ÅËÏüÆvt{ÙÑ.Tž˜h#± í$þ¥=·I F¹È°RÇDlMsOAdŽá6[y5ÍÃjäDðõŒœÍmÕþòÌ÷Ãøjƒû#&Ûr±D¦3,5«‘…Òs±ZᎠKÏÌqpª†ó°ChM)K›œQ Ð˜…5´£Íô¬Üs›™ãíJ18Þï ˜¥áàmüªyDË Z‚é(}Õ>xË0e2 ÇÎ Uñ¤Ø˜K%»ÁLMl¡Ý5%|zÅxbF/¾³«}ðÿ3ÑÇÚ0®,ŸºÀZj~  {`‘::ÞDÖ9EýlòÞ§Š‰ L;w¹ÛQ®ÕeìGa$¨ÂØT’AkÛy°jȲ†W±t90¦Ðε¤;ÀªÚeéN9`ߨ#ÌÁüS(ÂÖ`‰H×6¡œõ`¶°k‰WÓN¼ŠØœ á(IÐ!C¹ kìѾôqÀ9½¶ óVÂò‚B¦L ýn¼ŠžØ˜åœ“Ôð*i+0æƒD5Mx×3À´Ax ”Uí¶Žxª‡:¢­FFm…yt€WakÄЈ#ò°g.C潓ÌÉ{ÙY\J˜"¨ŸÌI(„@¼ƒˤ¡*ž3.îAü%Ê8&ÒŽÚ 4.жrÝŠ2˜ÚyÖ€"„ULªí1C3ÚÞ¡ „#î&sÈ~° ÜzÒ:5TÅ‹]ÀÅš<¤`úÁî M±03m²ŠòÖî&s0Çì(ŸzX Ëa@:Øj ˆ´÷X Œ.˜#êT âÈx Œh¿Û-xÐh`þÝÔ—ÜÑ Œïà‹SæÞ¦ }OX=@VÝ&q7™ÁÖV*  ­n0å‘bÓë:£[OLÌ­J`ò@#ÆÝ$p(b Ó|›Æ`£ãJb ¸Ôð1’*`¨ HKÚJïfçç€ðŸÔ²q`Ì8Øæ &Žò<š†2`u$°T@wÀ:zM»Ãìfç ÏØ“õ„¶C ¨7Màv{Ìl âB>‚G :öú$(Ìn2-O°ª‰ƒÎN›ð µ¦lAgaúýÀBZ€ B‹<Ïq7™C^¿ANµÂ¬Ôm“+\J”« "[#€g 52z÷Æ5W/^½}vˆEM¾62º*qQšˆü—Ï:òÜè—úÓª¸—T‹€;PR£ƒ wvÐmG˜˜—û,¥Ãþ°Ò(§:Êú_·“a,V h¼C±M'Ê™ˆ¾ùI¶¢Ÿ@p…(#¸¦%ý°d>ä÷HÈ~ÆQlÅÑßv¢ìdRæoØ‚÷ôrGâ)ßÚ§ÅÇû²úŽ9 ="Ö5xÉê…9`"!¢R£ÌžG UÞŒMŽâåG/ž:àѰåFmUž4¾ª¡ric°º@A7ò=¯C–#x8h0­ûÂÂ¥¼ÒôÆ.Ò:ô(sdáÈk.ôÙ~ÏDóvs(Ú%×v¢ÔtT–_’ ¢»Tj¹ƒé]YiE:_˜ê;` ¶ŒHA€½½¡0â½éhŸØ;dK’’$½¬tö¦Õ²w²ßà[Ê"ŸG@N“N9§Mf>bï¾°w@g#Ï£˜µ%®¡Ëæù]—.ì­+/M;8%Ì—Å]éïè@öÌÞ¾°7ˆÆ…9 {Ó9`~æÈì­½l ´âÚ€ùò†ìm„—F€½=gö6ÌÞu¥1FË&ìMdEö¶X›vaáRކçg¢ôG¼˜†ÂR.²·fö.*Ï 4£„×ij'$«*éü¾%•_î`Udö¦X`>_]!RAÞòÌ8{;”²w*­%}u_ô÷Ûh)Þ0:÷vÐmK™ÿvÓR`¦håIœî¦¥ðD.ø¤º]µ˜ˆ£@Ý®Z _+¦Âø;i)ì,mº]µuðjw-¥7àlšde„û´žW€?'½‹–Â+T)WøØMKцN2vÓR¸p`^P‡´.\LY²ì¤¥¬0 Þd÷k©ÜÁ°=r¿–‚Áe©»›–Bö.g~»i)bï@—pwÓRH¥’«n7-Eì­²³“–Êì­3ß½ZŠ:Ø,×wÒRÄÞ6ñ÷k©ÌÞzÆ[ÐRÈÞ@K-ì}Ÿ–*ìíxîÕR¸p)ßôßMKeöÎpwÒRÄ­A±v¿–¢uPŦÚEKöfs{¤¥þ]¨ñÞy jê•Z³µTFýH.òîÞÚz“ÿ× þ Ú¤ÿæ®û(T«D”r,¹&ÂÅçíÕÙñeažÇ«£O8§A‰‡náC=ÐrÚ®{»z‹EްZüéh ùŽÙu¹Ñê­T°DŒR[db4h_*×â#í—ßmÏ.~—ÅÄŽ}ÅRj«Z\ÿóóƒ_]\põŠe®ì[*;Q1§œF|‰0mß”g8gm¯°TéÁá‹§Ý–Å],”ºZ`ASûESH{ïääöêø$s 4ÀïÍØvƒå,O±HÕ¥+EO›OþµS¿ƒãÛëëõþ‡í»/×¶ŸW{çïoÏŽ¯2„ŸŽÝtÇ''›š+ |ÚÀËí; Ìç5˜fÒ9×z‡ÍCBj{óá¢P{½)ÇΦ{pÐÝ|9Û>\ý ôÃM÷žfN¾>ù°mêhå/ѱó“íÉÿlKU©ô:¬uŠŸ'Ï÷o›úVø´®åR©ï/ƒ!ˆ¿ÕÞ“îv…º&öúŽ2¶·Yqv IEƒN€eÞ}é°Ä9Lúfµú_Èy™< ð¯»Ç?cY‹¥ºH!ÚÃÊùxþå©@:ðV.¾$ãý'Q†çuâ2ó-p?ìúsìôîâöª;ûx}SwÉ€Ù+woÈØ0Ëõ1Hú÷çŸJe¢\Dˆªºß×÷ôãçTs~¹È5é·ƒ®µ¯¥¾‡…¤À©@cÄ÷z€p.E¯r!y.ÌVKÀ·$[ØÀ™R“žŒÛ쇫ÑYĈ²ã÷Û¦oð~#03=1­ÙLÏ_쎤õ´xUtÚ“tט”`3uxî?΀x7ØWX„Nß&üþH~þßϽù?¹Ãñ§ËÖâÀX7âøªti‚›h@Ų‹ÑY˼uÙŠê»R»«O1â™.yC*‘$ü\r;s“ 6'eÁƒ…ßý ŠÈµ\ˆI*6½Fb‘1vz ú|dÒ:n×mm;œy¦;{}ºøŒ}ŽÏ¿tgÛÏ`^øøóMîW—c°£µÀ’Ùe%.nÆË“gEž1×ã%¥ü˜Å©ïÝfª)UJg5?…”8¹ÒúåY\ᄄ™Œºkê±YásBGé¤ݰ£é†ýD÷üò7t͵ƒW&L Êõx7\žHEùqŒ‘IJ„&-Þ‡´¬"ÝŽá—H¹Œp%/”¬¼suB¤ž^"¸Vt¯_ຢ^ŸÆÐOZÒìêšÌ‘ªÃú(«Z¬z/¯Y”änVòbVU¬¨´rb…á I!b© I!l}ž$|M_†÷ âE3eO&ÉNÞ×W@Í=•FX…Š̰¨ ÔštKM¢ÐE bªWu‚}}ûV_*›(5…¬Ò€ªrføô­>n@é)V•Vªæ_fˆ«ï5+¨9)rÀ©À’€‡6:ûMñ¯©è‚¿€Í3©öÇb ì~uÿ'§o:îïs‰ Ȭ`<úaÿY½>îs”Øû¯_ýøìðàÙÓnï9 PXWzut¯ó„JqRP¼7R)µñã¯ñ´èª?ÒÓ²ÆþÛÓúöž–NUÎïó´´‹ÔN’þ(OK}µ§¥~“§¥7á«=­L©¯ó´lïÂÿoO+Dã¾ÊÓÒÓXãûÿ>•ºw^‹4ýªÏBÌ>¯÷÷h‹î=}ñ Özïåþ/Ï\~+ñíÊÛ_/>œ¯>ÀZá‰OVWõ¯¿ÞŠ!}#Þ »Ã¿­¾;¾ºÃrM¡™í¯E^Ÿ€˜wTµÁÛ¬Gb—hÐ_\ÔÛvÍ7³í8ùäoSl}T¢§ bH_O¿é´˜õ`ÃmߣþŸÂe³xãZÄÇO`‡ÞŽ|€úe½tOÎÀvË÷òöŒLQUg9夌J?¾yïº|óðÅú¿&e¤g¿ù¬¬Ðúäâêj{–-‹¶g­%>Ã<õÁ6³êÜ·òSçœd㱬=˜Ž«œå8’áâbdqXãå¼~÷¸~ŸÐHÞ}4-L0µ‹d˜üôxÜó˜Xñå¦YdT ütj¿k±ÎØ$ùù{‡÷„‚Àŧ<”Ÿƒî‹½ŽÙ»¶goœ R„ßX{ó“Þñ˜Êcƒ:ˆ-E9RªEÜ0äFW\šžÆÚZ™ÑUÎ5¿Æàc~b;é »ä1B´j©7)?w¢t/ß çiÁT‹õWÍÃËò–l#tåfÐÓxð_üêŽ1ÒS[0Þ\~º:ƶ³T5œßµ AÁŸòÔñ˜T¥ñužA«¾ÎÓàå}“Ÿ’N)äKƈ‚‚Q¦®J¼I!lŠ¡9ß™7ìÖãÛš:m|£íûü´sŒ-¾]n8¦]Ý“qž3ÎÐí³…úXóëS$°·•o-´1ù©å”¶…B¼€®u*|Çó“ÉIÏ”bhV¥žK ˜wZƒyç¡õR7æ<¨€ðU1¥1 kkã]¦K¨Â¨øbG~µóŽä§ˆcÚ*|P× ë™* |’\~R8æxeÖ•ÅñA[ß0FÀ—ƒùiàd¯Ð3Ð (‚ÈjDfOù‰ß„¶!õ¦oæ™” |럟ꥉ5‰•‡¼JZ U bβ£ý[]ó„…€˜©Á(XWžÎÇÄ·µªaq{£ ‰¥ãdL¥jן 7¿Æä£ÎOÙ*'ðÑI_žr—‰y›_• .å'icl);C³ p§ÆwÂ*?-›Èh± Ç[èZi rÈy—ŸˆM÷§õ±r¼ÂËù¾éõ˜Âg™ÍþöïÃðÐêÕÅÕ'¶ìNÀ4Û^cð}`4ÝkØ(‡ßÝi> {A7|y»/ø7ô*›]ìŠ&{u 'Æ«ÆW¨tŸi ¯Ã]†I;rHM*(ÌØ]ÜsKQã$f£þã!ÚX#ëD"zƒ®6éª7=t%£kÿâöìâÓ»;FÅËÄÒOî¡ëOûË„«]UÀÜ5˜ Æäšo~s§-þù»9²ò‡œ-ImwøìåÞO9±ÝÑÛgo¾¹³Õà¿~óvýüãÙìŘÝåüçãy=à.7n¯Î›·µÇþÅårŽÏNåkà$_\^ÿ ¹ìzÒãûãÿa¤Î·¿Œ:};¹=«pž¬çï /÷8xt°¦ƒ–7Ã-\{¼½:>¿F‚b—*].Æt­=Þ\]ü7HB&6Þ·µÇ½kÛ×Úaqjp‚Vû·à³ßŒoÒÌ0 uÏ>H™Ã9j‹% »Ž€þ~wñáJbé .~Ùžb8æ¦_ ×7ÛK‚ïx*â7W·×7Ž~;KŸ¶Ï— o}‡ÒÙƒ'ÏŽNûЈ t‹#”…™"‰îøßÞ®ÞÊ‘óÙ†0èhqkÏ}º F߃ýUmëËã“-ÌîE9Ô›ãÁ‹ó›‡)Œö)¦ZÄs¶v³6;;ã‰&|ý1ÝCz°ÐøÀà>€}5Zá§€š¤õ˜]¨ŸÀx€w=¾Û+ô,€œ  ã)ØŒ˜O˜Ì0sôh?é:»,à›9à /Ü"€^û)ó¹¢p,ëƒb}VjM6Û²Næ¯ÎéÐMÓm^Ëþë`{ñi{sõ¥½Ÿò¯y…\a&¢oþAA=âŒpz/V¿ÅL¨°fN¨XD3H¹[VD•w«Ý«× ˜9{¾®r„isoÌ€™3ð©XÞÑNÀ¨~ b3–=uÃOÀø0ˆÍ ˜qgNhCÈÌÙ|ŧÅâø×O.ÎO¯6cÙÚ¶wþþl›1£ê¨çÓ¶§¢¿ì†ósaÛ‹O`f_>d ß”ÃH°_\‚;Å_>_ƒú¿é¾lodßœvëîÓÅÕ¶{/;êË Ì¦ÃÇ'ùUI96úÝ5¸uKŸC¶é©Ÿý*iî'¸ ×àÂG»ðtû|¼ë‡U=ÝþL·kæÏÕdApúìϧÿ¤?1ç½Úþ²¦öoMˆB µéž< ò.ƒÄóõCéRä²!_ÖÌ<ˆmR¬ÕKß‹¯*¾[ ¬b›2`Q9œX9+ Çs¤ìŽ–6) Œ°0Œ3(@7ÀË8¹ÇÍ/ã$¡=ú×/7(ÎÖ²žo#÷¾–)’6)ŠÚy„…aß ÀÂ×¼5Zëд1¬À°Â]°œÐKO`UzE†ï‚c¨¤Mеv‰é•é…‰5˜^µDAÛ–aa±Ã'mñ¾9¼¢LPµ CÓÆ°TÁkT4n€—·Œ—Sq„—·/Íx馨×/+xÙ ^ÂÊ^á„W]-жXvkïSÉ ½*ßË:*æ{.í5Ç÷A®úºZ6¬m+°˜ï¹ðØ<MïrWþªôb¾çÂcK°øôÎß‹ùž‹¾Í Š" óý¨ GýŒ’íUK{l3"stÏë8(ü3ZÇ*¿äÆ{]Ç^`1ßs‰£yùÅ´Ç4Yƒ½Ûó=MºG~ù1ß§Z¤X†¥ï‚%{ÛŒ÷v#¿´eXæ.X^öãho`1ߊ h{~àk¹õ¶­Àb¾ç¢I÷ɉ´,¿t`¼ü",Qòà#ŽÖÑø*£5ó='úíxÉÒ©ðêLItÁ+HáD—ìX~U^5ýÖßK±Ã¦òKŠsáû4)mϰùå¥t•’6¡½a¾ç"-óü%ìT~Å|Ï…hæaI1§ÐO`É:æ{.¶3/¿˜záÚ*¿Dæ`±Ã½Ö–›jh6±y«†ê¹ø¶Õ9z„ÕØr“Õ¤"q23.œXlLhëë:ÆK-âåj¡#ÅwJ*Ph«z‹aÕ’‰/̼$«ç ¬œ“Ûª½ŠÅ'x 9–²ÖˆçªVÚda±Ã íG°0Ñ–SÄ’Úœà…Å÷4”šhoJ!Ä2Z‡r}¥ÐD¼’uÄb‡X‹.ç‘â9&.¦¸-TXa56ù¯Þci0Öµ|Þ©¥Mä;Ü›3Oƒ9š¦˜¦å (FÚ„ï­«¼º‹òêÈ92ßYPMÃòs°Ü¯°‘‡fÊóq«‘6áU†ôrÈÖá%Ô”\ 2‚W¥=ñ}ãwLa)L|Þʯ†öØVa¥9¼ü¯¸‘Ç`ÊðA¿–6‘«®g¼B+Ž`9ÖÖ*ñu+m–šÃkKe,ÊÞ–k[m[¥çèG´¯¶‰í°°Md´ñ}šXù9«ËU¹ ¡¤­âeǰÈ7ðf.’{C¼rÃreŽR}‚å&[Žï)i«xy†ÅEç2GoªZ¯pH›ìGx¥%X@“únÑŒhZþŠcX„ãxŽUN¸¬ÜưRÕçx (WÄ"ÑR¤'p›Úû~ 'faaÖ6¹æÂWA¬´‰œðj–ñj¬´gX"¿ªÞöÌ÷RÔ™|£,ñŒ•ÜßÒܦEzðܰķ*™Ë¥(jßï<ó=SjV¥½;”ý„W½›ÃËä„Á¾ÏEܰ­ÊïçðËÂZ Pn!ŠüRV˜ƒåFs”B¦Jn‹&¡}cdXs%˜ó÷IŸò:²~]«+íÓÀ˜ƒE9ÛÆò+'þæ}Ÿa…~ÖÀÃʉûä°+ ho(Ãb¾g(¯ˆÖ] 쉡ޮxék®¤p™£A,8¦À·ò´´‰ü f¯~lˆ~äbÀ¯bX¶ðªO&wÄ_^ÖÑÖ1沚ó½<žÂJµˆlÎ}·néU}˜àü5k kÅWPm[æðÒcÛDhïøÖ^µM*íã^zÑfŠù*¬4Kíœê+°Þ6Ò&´lçHñä±§<ÔµrcoF×F5ÄkVkO(5²W[{"ê1,ÂqÙžK›MÃby/çäDS Zn™J›Ð>²}ϳ›‘_¡Ú˜}½Ù¶Xn ‹p\´ê]ú¦a±}ßÝÕc¿£ÊϼZm€ + äÄ,,OÅ©ËyŰ¢kcœƒåǺVøkƨx¥²ŽR(—â c@NÛL36@b¾—â¶s°RµsXwd¦úÆMÌ÷L©YXyBkö­ª¼¹šô^j$¿œð½/öDÅËH|"™9¼Ær¢FŽåB°“¶ ËÎÁêGsÔAd_܎ͺ0,W £‹¿=Žx¬M³ó# Œuô¹ Oç–/°ø\¡•gº³]Nr¬£c¼°MŠMw),ÃÊx)ƒ uåf{ñŠ=m5¾šâòUeɧÎxq‘õÌgØæ*íÓ<^‰Y+Ó —ûõQÚX~©¾ŸÇ«‰ê`–a‰¥ñUïRöÜOÑX];úÄ:g¤ë¸±ÕO+z»”4ÂRoRà¾çbæ|67E‰±E~õ…ï³ÝŠu¯%¾ŠAºYX­·v´Ø…zÀ«øWg–Ÿ£ÀZ«ÝÁ¶o~y‚mÿÂJå¹ ¶ÄFQ5¢¤È:¯#íKj“ó!4„a•9bªr9™BÏ9.&—«ëÈÅÌùŒumBÞŽ"sدÍñ,.r…Æ"¬Œ×ÚZ”_ì#—½c}kkòO3—XÇ$ ¦BÃ_ìÔjZÐ&rã"¬²Ž>—g/° ßç"ðØ¦…'ó=Ÿ×N"jÄËò:&n«´WzVYÇ5ñ*ëG–_šÛ*)Sæ(q“1¬œ+~ kñgÏx¥ Ë.Ã*VU’9úí±äœðªrù%3•ÑñÒ55S¡}ö•±MìB¥ü<¬6ú XH FÞ‰8nÛD)æ{‰ M#Wý¦É¦Æ°š9ÆyX‚Í£fHëÙŽ–9ú +±ÌÄMš~¿Ê{±W´ ßë~VInü!Á«ºc©˜a ßÛG­6ª´Wà~5)ÀŠ~Ì1H2ÇWX ßÏÃ"éžÆ|_ŠvÁ_u…eæa‰îú*ŒA°*va~‰z¥®£¶3sl鵯9:‘Ñ\Ê<Çb°Ml&L)3K¯ö Þm´À2ÅGV†ÛÄï@£z¯6jˆå¶¯"W¹¼®ÙÄŠ—ð}¹[0‰Î¡®qȯE-Ãs¤á‰¸‹å}Ð[}š£¡H ¶ù©´gy/1¾1^k¬¦Á:-Ç'Ö|“p­È^/° Ë{‰¥`­1‹³‡T†Eòk­l_Ït0 ë,–ÑTŽB|Q—ç˜â‘PåU£çÈ2š*U bV˜ ¥Ø9¶‘ÆYÈgÒãSHšG½[ qr™£­xÙyXM¶rªq&>£ðÜVù˸eXlûº_í9]â«ÐæE~‘÷i~Žd¯šj“³mÒs›¯ëæaµö½i|Q9A$Ò²M\†¥Ä‡©÷†ø¼6ÏÛt¥Ë{¾×1Íì7õÆJâø—‘6ÁËöó°†v´øiÙ6Y3½†v´ey߯[¼@Þ…ÆÆäxt^O´'$Ö¡¬ž‡5ôô0&Êv4µy±M,Û9|§fÅ¥6C¹ÚϘÚ$¾ª¬]„Uü!´Wk¬ƒ}÷¼žd¯V¼Ø¾—˜è/²á«¼ç³¹ü8] XaùEXì§Q­Á«Ø&¥Ð0êZá{Ëò^☓H2˜B©Ê¯ÐÒ ¯¢éŠW\„ž¨7ÍÄ´wÛt¥½ð}¹74‰J#U¼8­Ä^[¹~Ó íèê‹rüKì‰*WË{‰‰N¢å`ûÚê?ïu`ÖŠ—^„UðÚäòÂÝñ«Mî†ò^f*‘ÑlGá{¶W·É>æ*›…Õžzô ßËókËmÕŽvÂ÷a/úþ01kG“]aùyX‚×ÈŽ–8“–6á/*OL´‘Ø…jxžÆ>L¶ %>á"ÃJms±5[Ï2yon«¾¨Kó°96¦ìm–:p[Õžù~_mðÂòF}ÍÌ,oõ™÷*y5«‘…𨸲 –ž™ãàT|‘…|® ‹ì²ça™yX#;Z|…áj«°ìˉæý",ÖCÁÖóÚrç¡Ülƒ¶Pc¢Ê³¼—8ù/`¢Ü¸+qÌb¥‚øR5†ŒÆè,–_TzJ`…®±ïqéž`û^bÛ#¼Ö¨›mµÉ ½r’4GœØ9¡_„ÅòkhU¿6f¼|±Éõ¦ÞMÿ¦YV~ON€&¹Àv£¼àýóHü#¿á§¤Ì]רï9 ~6÷Ï»æÇúÚÌø(—·\ªrû5‡í­cY“°Øúª+e*×X,:JBëTÌßÔäÅÚo‚´³¼Ÿ­M½+?Ö°+õܰ<{ÂÔ/yD§’’(’ÕšÒò¼ÊßÄÓu—²O«°¢åQ Xm¾… âUgN†Ÿ£Ë÷[qtL…ßüŽ¿éœI¼`wÙÀ÷ðf|i¿ æ‚¥:ž8º5†oìû‚m`*Ìš²üÑ@[ytø¹·ÍÜÁË׎òÀc¯“áhIp½¡Jßñ7#L)ŸÅk,Š™oqLkÿ/{ÿÚ×$Š¢ßëW¬ˆ‰‰f\Õx?|bnEI”flIAÊÝîÞ±?PdYÒŠäð!Û÷Îùï'3$€õ`•eíí¸'Ì™¶Da!‘H$ò S40-¾.…J ÷e‰¸ƒx ÒV˜ ´Kçœø¥ÃìÃy°@£©”©à\Êh†ZÃ'ËzE œÓÎH0+²¿0wRY/­¼o¨¤70sÎXedŠ)4%={Qf¤œV%Ù ™g‡¥ötJºÃT€ÆæåXê[ç“‹è­qOÔïXr—¹Î¹B%edÀ2¨¥þ&úíÁ%MŽ\çÓ-?ø»ð°b;zÿ.FY¸NÉDOÜ"%ÒzQ¾ÄäF’¹Î¨´ 0÷¬×í—6æÜFDÃèRö)à€ bËuF‡äE#× `Õ¼²¸ÎUAÊĨ„,\gU±Ï£5ATžpQ”u JG]èûÔû FŒÑæ¥`8˜‘À¢&ÆÍ¬3åK ZN½´Ñ®¡(ªè©É ö$O@˜ •¡÷=#s9!\þA?4ì @r"tæL7/ÈÕ‰€d3 Ô- Ø;B4æ  S ¨‡æù:JжÓ}h$Žhò®ñ£1K¶oG :Áü<ÈmÕ/qt:€¶¡2ÍKw¹Á:0Vk°Æé͸ÝoŽ€'hLn(¬—¾mÞù",(emmBªbyèa´1qŽ+õ„ûé÷Ђ  0,ð¾bk×qAh ¨€i¥nGŒo²ºH¬Hœã÷=©A": °•ë© Ë ÐlrÓŒšÚaÖBíœ×˜ËG û¨0#Š£+›È×$ ¨‚ÖéuÑJ¶Ùª°‹½Ç¯Ak °ÉrÆÍ½Ö1l0õ!pGÄ'ÂwÓ-¬±¼‚%³¾ æ¢¾‚Q”V­æ½æ7˜fS€‰*DåqYGÐÆ»à@waV¼nŽAcñ$ £BOÊ)÷›cÜQ`š^€„ÃLÁ–˜G;ت۪À.Bjöh*¨ö™ãZ}`‹kÊÅÇ|ˆÇ#J0¿L8¶H³Äx2†Ò™ÇPöàå½$øÁ÷퉛郚}(aêHcB;¢$I FMÄ—dÈ«ÒìË9`Šk`TÊ Ì ÔæU`±aBÚà @~ì%¼h p=Ñ€òìÅ9nã@'‚†€}bM;¢fL´µÝ' ßa8«±<e•ÝSæài˜#‡EíºiõîWð.|Ã9 sÀ9ÀÕDèqO™@w˜ÛM(Ü uD f}¤££IŠfŽxS@ÃNDñR‡ÌBöZG´‚èî:ˆ,ÐWN7È  [1:RÈAº¶É ]€R,X°8bÜ‹WÑBS` giïC'AL‚À4¹Ùã(MB£t —ÁTKù<Å~¼Jåâa­`FJ#;¹*•ö8xb`u4Mx­\pb4º4¢ÜoñÅ‹F„Uñ®3À–AsöŒºvZUƒó¶¦Û %€ÚK椽ÐvK½;)ñýª²ÒÿÛ¬#žƒî°X0 ³SfV½¯¶ò¨¨Àr⊜«˜'¬, rEZ§:*q {J!qÑ-RûÉܨ¨šd!´ÙH[Á jÐŒ@o‘‹ñ& hrPšxUí's4fP#ÿÔ~Q"€ °š0ÉfúèÇ ,"‚¦ÁP"ÎqûÍÑ€?h0 -8Äh,Å,p p…Eë2¤¸}nBë1” Hʆv÷š£ƒ½ {‹*Tç¸Fëw ìWßÊ<1ÃÔ”FßÁ“£Â~8G"Ý?×3ä¶c~oÔ¼°=T'7<æL}‚/ÎMÊ–¼ŸƒUm€é p:ºÆÍDÈý¶N¥ÍLVG †ÁQ `¯…¬÷³sȺ†™i¯`=@tM(XÀ:Öà—€ÉÚŒˆžÈ »ØGRN{½ŸÌΉ–YL„×NµÇó{­ƒdÀ[*¨p@_69Íq?™ƒ}Aâ\)\OÑÞdXûC†2v7¾6éöÑúaWšœâ—¯Þ>;Æ¢&_]å¸(M„ÿ—âÚinôKýÛ*»—T‹ t I2=Hx°ƒj:xÊà‘˜ë¶ÃaßÛRª£$¾ðU8…À×Þ€2Y•Ši:¥| d§'Ùšþ†—Ÿë¶é”’‘çM3aà ú&G?\Û‰²~P¤.=Š¡¢ÛxLÑ¿ÔÁÒHz‰Eô¢û²j¹ƒ£ØUz>„#hé6”ž|vx™¶jz£Œ7/x 5#4=l¡Û£t4Œ‰Þç:`J „½¸ñD%ð%¤äTÓ)¨DÏ}èo»ôòÂQºžü._ÒJ+ ’d”L¿pàÂP,9=Í÷s9^8ÜÙµ¥šH A/I"à]* ….uб¬´¤h]˜Âó @ˆ—<]ÛÁ…²oÌÞd>R&œlºc’: ÄkðC • ;öÖ…¬žÂuøÄrÝ6î”rÚ$æ£çv–Cê¶Ì Q;{YØ›ö±·÷ˬböN*š®‹<0‚%Ó2±·*ì-åÂ0OùéÙšcöÖ<‚íG@ö6ÌÞžÙ›×aÔm:µLì3{kǼ„3, {»ÂÞI~ {{¿¼p>q= #(t1­.\ìÎcé‘ÌÞ¹" <óŽÃ+VµeeI²•ÇÐ~ÀcIo—;X§ {S|…ÎWe\ì¨Ho~~‰½ñˆÂ>¨´–ôÕ®èï×ÑRøä¯ÚÙA5À´$nØKKéMÑœ‰½´”“=ݯ–,<]Z«½´¾Vĺa_-…Àµeqwj)êŠEì§¥H„˜÷ÓR0XE:Iø}´ÃHûk)A;ÞÆ;µ.†ë‡}µ.\H§~ûi)"«ôqØWK¥Ò ûj)Ú¯Ê8^é]Z Ù[çûò{i©ÄÞtym?-…TÂܳ…½wj)bïd¸ï§¥{ÛýµTîP°]ZŠØ› Îï©¥2{Kfï]Z Ù;xYÙ{—–Êì]ÄÌn-EìMÙ ÷ÔRÄÞÁ˜a_-…d…=Z„Àn-•ÄŒÚ_K{§sÌ-õg¡ÆóêjêåZ³µTFýá\äÃÎÚz“ÿ× ýüAµIÿä®]ªU"r9–Táêóöæâô:3Ï·«“O8§®ÄððC=6 Ö¶kaVo±ÈV‹? 4ßqHW1-Õ>zË,@A©-21TäJƵøHûñ»íÅÕÏ㲘ØQT,¹¶z¦ÅíÝc~𛫫RA½b©bÂ’*;Q1§”F|‰0mߘf8gm¯°TéÑñ˧ÖÅ],”ºZaASûeSHûàììþæô,q 4ÀïÍØ`…€E{|zŽE*¨.ý[.zÚü¤¨úÞßÞ®?lßýzûaûyupùþþâô&Axôéô—Ípzv¶©¹òÔŽ¾Û¾Ê|^ƒiÆS­wØ<$¤¶w®2å°×›üïØYކ“»_/¶Wƒýp7¼§™Ó„oÏ>l›:ZéƒúGìüd{öŸÛ\F•+½öµNñçÉóCPÝ*•‚Öµ\*õý9aЃø[í=énV8¡[b¯”±ýÅdÅÅ0$ :–y÷ë€%ÎaÒw«Õ?!ç%ò\À¿þ„e->æê"™h+ç;Š=J¼• ¤/Iøßþ++ˆÇˆ1xy,± Èå¸vý%vzwu3\|¼½«»¤cöÊÝÄÛG<6Ìr} ’þýå§\™(¢ªî»úžüü‘jÎÂ/W©&ý¶ëZûê{œI œ 4F|o;„S)zPi¦í[KÀ·$[ØÀ‰R“ž·ÙŸRuH)V ÊNßo›¾yÀkøÀÌôÄ´f3=[|±;’vÔÓhp2§=‰@‰ï"ÁkxdÍ&¸~<â]·¯:X „Šô†éx'NÏ‚Q€5•çpÉøG‰Ïzé 2.g ¡ñýÛ#Æ<Æ+ežn¯OiC¥o·¿Ü¥ Ë3+§äFÅo09vLx?œÞ3.û¢›Éß´hT5­çíöîþzø·Ä¨Në9e±Âb‚/ßf q2nÅ–<ð¨¤ÖÓíÅÝéúYùˆ±~ú&ýýøûþûÿxþÍ›ÿ™:œ~ºn-üãëFœÞä‚n Mps ¨Xv6:k™·!YQbȵ»xUàc¦4%†”#Iø«òÂÔ¤:æ/X®ËkÞ®ÛÚv8!,ò„Möútõûœ^þ:\l?ƒxûáãOw©_]Žn5Fk%³óJ\Ý—'-Ί<½BĨ e0NY¬6”§@’R7öš—ÇàØÏ­é1ˆû½5‘Q M=¶àñÀÐ1éð84hø½S,/S¤âü8‚.é”O×8•¸©5ÁR™™ä„ÉÆÕ§ x¾lZ¬¢§¸MnÖVò»pïwçºÐ ($’í°’SàGøÆÕåœTZÔ'³5Ñ=p=(r† ÷Ë ë«]Æ€«{P¼­¼e_Q¥ì«X±ÂÌX²Rƒñë’Ÿ4 B qfPX†­|\3žpÕQW6daÚí-ãV¼iAIñ(Q³>Ö7S²fÑV3û•«ÓƒÎÞFëÝê¦ÌÖTHÀ¿€u1©«WX$hþòêþKîÕtÜßç|YtòÃáá³z{Üç! (_¿úë³ã£gO‡ƒç$ªðþ"¾8:yÈ—ùœ'¹ (¨¸;®É‡zïÛ/ñiÀÀ¤Oc´ùÓ§ùú>Âkmêwú4ø¼”Hÿ(ŸF~±O#“O£6þ‹}šD©/óiŒ°îÿ´Oマs·O£,>þ}dñÎöú4߸¬Òý…>MðøH}k¾Ì§‘Qc6 ôi¼ú"ŸFò,¶ì7øxÿ_êÓèðM÷ù4ÏY°£Cƒâ>ñ©Þ8âÓÔþ±Dü”`5mf˜zÚ̇©˜$ÀýñpØî.ŒÓ&DgX Â&ªÄ/õÖÇ|Ÿ)oM¶1,øÕon¶Ÿ?^Ýßò<ÒÕ”ÑÅ ñf[ÞrWðmù¾Ú?-Ég ?¯ñ'´E4·ÕLå{gŠlò¸ô„Á{ ‘¶•?q´"ÙéyúþàÇõS\ò»Z&!>ì >w‹€FÞjþáí‹gÃÑ“¿ Ï_~÷løÛÁÉðÛ§oÁæxtýn»uûúúnspû\­Õ¡Ú¼÷óãaj¨§Ï^¼|û÷}AÝžýt½¹ût½C­G{ƒÛ^6ÀÒ¢…AàoÁÇ=?ýõþøÊÿüì©I4_-pßÂé™ô:jY¼5‚Œ7¾~þo œ¼|u$óúå«·e¦œ:ûžÿìœ×"M¿èg!:?¯h‹<}ù Öúðà»Ã¾[<Ýø=X¬Ø·Ë§Yÿqõár}òÖ ÏV’šøvUÿõçÓÏ[6¤ïØ{@awü'«§7w`X®)²ý%KÃÛ3ðÓŽªV"x›õðéê ú«›‘)¶]óe²'?éK­³­JôD éáÛé—V±Y6Üö=êŸñyW2‹7¶õP@|üvøçíȨ« {v¶3X¾×÷d Œê'óyrwd}4*²Ü}¹ó¨š¿<~¹þ÷IÁæÙ/ŸåZŸ]ÝÜl/’eÑö¬U»g˜§>.¬:÷UzTœÒY|Ëk™ÛdÉ;…AËCsŠ~kmzœ’V|ËŸJ«T4õSí¨ÈlINn½ˆù‘︧°Òi× ¢¬lõ&„ôX7=]glñ­©Õƒ@ÐÚà+ò*8­ó£Ûô<¾`–|dä Ñrù|aL~<;ßVJ®Nƒ‘8cK¢gŠ©PÁ¦§îMO[óz BEÑ ¶˜IY'=½Ê™$3I¢.Iµ”wCWܳàƒ4èIcc]OzëWùþÚa× ;¯ë<1LJ­«¢¥Q¤ËC=¶ø¼¶ÖNÀGJ|¯ÒcÏñ˜‹ºæS|úX×Ó)GÏ™è²ÏˆB:ßÜæ¼bœNšùí™ 'hàU™FâKæJjãÝ ¤ o#l–Á4=uHå"˜û,¨‰—G JøJLåŒih+XÖ>=jœô>]i/adïu¨T°ˆ}zœ83f´Í§°š¾Îö®¢?tã©›'> vºŽi>«i8A{™ VÚÆ«¡® >¢â_ññŽéÑߘ¶xO>4=£³¶2£°9{ Ýâê9^â«×ŠHž`jOI5¦Ó#¼IO|p]?UÂêF, ­¼Šé1Ý„¶˜£ÁÖû HJO΄jy(SÈ®êæpøÀ¼’ Ñè(@¹ ¶è¼ùv—…(ši˜·KÔÆcziŒo¥‰æúô+bŸ›M)8Û ÑV¦ûä…¶*å¿¡ õœ`\:H¨²ÏÔòj¸4q‚l&éqqz•möŠRF4Ñ3r(Â(±NÌ›”2ÓÃz•cMwY°íþTÎÛFˆâuCÔ‚z*‡P놘°³KêE’·ø(ì«›OŲ;Ól{‹Á÷Î4h 2èòA¬Ž¿?yÐ|è{Ñk^oVàÿ†^y³³]±Âô]¯ŽølvÕøŠ •nMá ¸W6x¦D!=4©J@aÆî*]ÄÆƒôBOã$z#þù1ÚX#ëŒ#z]WÐQÜUQW2º¯î/®>½{`T<ã×¥«’ÔõÇÃeÂÕ®Òã‹ÊÒÕ«M„®Í—_ÝiK?Œü•Ýœ YË9[œDîøÙw?¦r'oŸ½ùêÎV{TþúÍÛõó³w7lvåóŸ—õ(9ßm½¹lî¶Ö‡W׿’s|qΟ“|us~û¯Èe·“ߟþgAêrûó¨ÓÇËÓ»¼¨Ç#ü-.ÏO/ïnW0ï¼Þ#XµÌáéÅÙýE…ód=+w¹ÇÑ7Gk:hyÓoáÚãíÍéå-»Tér5¦kíñææêD)CðÄÆû¶öØé±¶=Ðq­W vE¿:¼Ÿíòn|ge~„Qhxöûó.Q[,a8t:úÿåÝՇޥƒd¸úy{Žá˜k˜~ (ÜÞm¯æÖ®ˆßÝÜßÞ 8úý,}Ú>?\7¼õ¥(²GOž<žö¡xž×;œÞ¿Ç³§í9wëñtr\=߯ö ð/èšOyÂÇÏ_Ÿ)5?“ˆ&1N­¾juw„o‰UÆã}»ª‰ôc,W,f¶K—$øˆ˜M)ýµÉ÷$¾7Þ¯¾Û^¾¿ûÀf,Ð=ŽfŠ$øåàæ9ðhßò‘óEƒt´¸µç!Ý à£ï`Uäöúôl ³{™5Áæxôòòîñ¿F‹Ð`8u›µÙØO4áóoéÆÏ£C€Î$˜RÞâ3§9Ðs29­E‰i&§È”µhšejšw° 3Ðás²b —€{7‹ù ø&0‹`¾jºX+âãàX$/JåY¡3Ù+Ë*µ|:§7M·y%ùßGÛ«OÛ»›_Ûë%ÿ=¯O+, ÂDrÍß¼¯G0`ÿçÎwbõ[´|…5sÀTüÓ.[½`TR̽zÝ€™3ÇšœR¾ârÌœ}ž‚[>´  ‹‹y0ˆÍXtÔý:ãÀ 63`4æ(l3SÀl¾à§Åâô—GO®.ÏokFoQ*aÛÁåû‹mjÄ­£žO?~Øž³úQ%ç=µ½üVòõãô«rÉå«kð†Ê ‘§· ½ï†_·w¼o·õðéêf;¼çõëÌfÀWéùE>õùÝ5¸ K?ÇÅØ£ûJ¤=«¤yPœà2Ü‚7{ͺóí{pÑnWôtû]Ž™?ÿkçÏþrþ_ôO'…ó^m^Sû×&D¦„Ü OQ”.C{ý¡D$Š74_Ûä6®ø –a©`qµ é8o;·q–opwÕY€•Ò—p¬’¯Ž–6®„/eFaºJm^Ú–ëŒRpž{SÚ¸²ºÇ/ÛU1kaaÒŸ—9ÚÒÆàðä`aÔĵ•Ú:X˜0¢†‹ åJ›­sô–Ó‹/2,Ã,‡P`…‡`¹,|V,ôŠ‹ô …^&Œhj^¬ ø¤­r7‡WàJ2’¯ÍJnãu”2ã5ª®Öáå8»=ÆÀrœÛ¸ ¬T/ÕT¿šàU+b×±ÅKg^í*iðò\ÙÜ2in«x™Öß—+»ÞiŸH¬Â÷¥Öß{á&ô²Ü&VáûR¡kž¿jå ¾ ÌmuŽ…ïK…®%X…ïu/¿ˆ ¬Â÷¥:Ú,¬À×­•îåWj˰ ß*_Ô’Q]U­‘üb¾W¢¬cW!g¼Ž…«¢@~©Â÷¥мüb?ÎÅÈ/–Ѫð}©.4K/ËÕ¾ÜDNp…ˆAéK=ëAùUçh ,½,Þås° ߪít´|Þ™8‘_Ì«ªð}©.´K~Ùe9¡|ÁË-ÂÒŽoûc:uË÷ÐVù«ð}©â³K~¹ðŠ™Wgj‡3^žyÕqý£B/_yU‹Ößûê%ô2GÛZyZ3ßÇI ø “1^f"¿X×êÂ÷¥šÉ<éô#Ó^¾/[ÖµT¹`$¿X×êÂ÷¥*ͼüª•°ÔD~ñ~ÔTí¾±å¦$èZMNòi¡æ¶J¯Rí~®~uÂKh¬DZŽóÊ—á¶ºŽ¾à%ñ²¶"$W»÷¥Íò~Ôa «ÖÌxQŠ¢Bq_ît¸ÒVu­Ž3xõt­*/ùðWqë#fh?‚e©’põôº Í1½ U»o(5ÑÞ)×N‘|[Á—6®™D¦°:‹.%\âãð2ÇXÚ¸jÛ`JµûÙzßiÝ]S)Òò킦­À2…¿fjNç9bí—²`ʦ­À²•W`QŠÞÛåHSr[…åæ`Ù/ßT•ç ]’ÛxoßÓË~C¶þ/¶n¸z†šÁ‹ø¾ñ;¦°$fç£÷rr,¹­®cœÃËux… ËUÒ-^MÕÉÁŠ‚—o`…,®æ«ø‡æ6¶M¬œÃ«ƒ%E­¤¬øÎ‚æ6æ/«æèF´o*·–So¦½©xø>N¬|J?ÄÖ WýÜÆëhÍùF£½-Xw(ÝÁJm–Ísä â¼0ËkŒz]‹ÛXæXW`•êÚ³2§¾ù+ò^¶m–/{(.Ášˆú®rB¯jÙ0†E8ŽçÈÕ]¹÷ ¹­ÂŠV[źóP®¸b))¾¤æ¸ùˉNNÌÂÂôf|ªÜ@²¥Í0휃%G¼ZŸ´Ö›m[†Uøž«“o4‚¥Š,TÊtxaïm§ ,û¬Xæ¨MÆ+W•˜åœa¾/”š…åyo‡Â÷º´q%¿ÁÙ9¼ÜHN°%Îõ ¤,m íÝ^cY(Y²Œ–ÜVçèç`Ù1í«œ(·˜\i“¼·](°æj§ïÖ,—´Ê:Jn«ôŠ 0K©F~±~´ÜÆ:Í‹X‡•2ÜÚó…VWÚê:úÂ÷ÊÄ+êx"Ùõë–ï«~ô*Ú«½›çØØ‚/fV{‚÷¶×sx‰± PçXööŒ àMæU®2L>îX?ò:Š‘ Ìñ…ï¹2ðVÜT†oZVÆ²Ð»Ž¿æ`µºVò¥RÅm/?‡—Û&’çh;¼’ÝR`…9¼Ô˜'ŠRrb35üç`ɱöœÉœÐè¡Pì®2<ö”;]+y«â9Ùã5«·'øqÛ–a©1,ÂqÑž¨÷°¹­Î±È{® <+'êËþâ?ÎØ¡Ø÷ev3ò«µboç`ËÕ`ǰÇE þš±B±ïÛê´jìwÔJðlçØÒVÏ‚ïäÄ,,ÌÙùÈûÈØVñ s°ÜØà9Ö‹«M[ó:rEYŠ/,ÚlûV€ñŠ…ï¹ ìêyöEËÞ¤°+c¡Ä«…R³x±îÐÌ÷†Û˜¿¢šÃKŽðÒŸ(±ŽTðbõ^c9Á¹A¤ï}¾Ü–a™9Xb4GÎãQï]óe¥½ÍÄÙßG<ÖOàXÞŸÏ—¶—‹.Ã*ç ¬4Ó5˜íœõ¤ÊÕPÚê¹Uô˰^R;Œ ß*Ëœt’éSc¥WXž£Ì° Õ¶Ï1˜Ì«y5&ÔcXq/ŽÄ¬¥ŽMµh_dNä6®-Ä<^MT\LÖ¢ÎÏ‘ŽWªý¥²¯‹]ZIçP–Ÿ‡ÕÚ÷X7•ù¾¥µé +,Ãʼ K­ªœ(zÈqÛºÈûr¯c&š 2Šñ E®êÒÆg:¸¨³°&vt‘«–)mU§™"ïÛØc‹Ù·‚÷£Êg¬4Wjã¸/n¨YX­¯v4ï!]`©ÒVíUSìœr§fÅ¥ö|>¤3O(SÚbÅË,ÂÊþÙ«l™Ö.Lö*ó½)ö=ÇDGx­ÑÍ lÙÌÊ–6>“–Æ-Â*~5aÚû/²ïë:yÏqÌI$Yb #¦—ié…mÕ2aVñEÑŽf[δö}²£Ùþ2Ì÷ùÞÐ$*MüUíÕg ¥­ò—‹° ½Ö¢±¿|‰ ÅÒVý4[ä=ÇD'Ñr,JZy¢‹bßV-ÂÊxõ6¹êÏùR[ÕË{ž)GF“­\m¹r&¸­âeæaµ§­­J¼P•6Í2Ç2ßûy¼èûPÖv÷¨÷¶uó°¯d+3ñYf,m¾Âò•'&Ú¨Ú…õL:ã•b£ØÖÀ Vlã˜]ÄV7çCªÄ ei •Wã<¬FN€ÍTuÛ…–ÛØfr…ïûøjƒùÌ«¢?cõmlÈÉyXœÈ0Š›8n«°ÔÌ»S5ôøf®ˆ¾Ç‹Ú ,=«·£•ËÕR˜ÕÖ3C4®fy¢áû5–c9‘eaÑC¢ž#KWø¾Üq›F¸£'[&óDòõ’ö¡0hµMœ[„Uô÷-<‘bB›7\û_Î°Š¼ç8ù¯µ’dû5qÄ+¦6½Ñ•öaV‘_(Ó™'BžcÈq9ÙÈhWì{ŽmðZ£Éa«?ä‡jG¯Qíkž£‹°Š¼ÇbS#¿V¦MWÑjlû«>dY åç÷<éorüË0úáø¯ß`ˆ¤'ø”SyÚòÇ]Šß‡Íîy×ôV_Z«¥:k,§mIâ±z=ßß ‘ò1¥zŽð¥16U2C}eUºO“ÒR´_Ê@Tó—)Å;P ´2Ÿ«¦/‘o¢ù¤Àb&ÌuÃŒ´˜åUúOÞM*»Æ‚ÚN•l*Á;m TˆN7‚0†.r²¬Ò®<þ¢|iMp)~ ðJ·£ñ~ŽÊ¸ó—ØÕä]bµ÷ÉB;ÒÃø¢~‰s÷Nf?^ Ì–F×R†¨+žfc€lÙ‚ß`ðâQy¬–n*LtÓùþ"PLçòÝ]­€¶ L»Ása2&Þ©bM€8ŽNU˜d¶Ó¡|ét¦ZgX‹¹RÞ€Öq!äȪ 5re£uÒ¶3ÒÆj—åx“*0Å”· •ôÆD-ʦˆµ–óz)|lÖ4Šñ±œKY¬’“¿E¦(gSÉÊ@™î‘2Þ¸òŒ¢×ºá´‘-\çBÉø¦ŒŠôœòUùÒ„NŒˆëlY‚ƒ+LCyøÒy›Î¼ð¶KôËZSÖ®åKËCá:Npî!¦ü¥Å2æ¢r*<DÇ!Tñ\…áÄhEé%1w;P袙ë´sÙ¶ˆSÀ1L|7Š)âBá:`´¹±ÊÀÞ¯0ÏAV䳘`Rì£h&¬;ø5Ñå/b9•ÐZÊ)ôªàiLz!–":–¬B«#šnF°J¢*ܾ¼Šaã+/a+ìj“íŸh}ò'ð bˆŠÊ(ðܬ¸—k]¾Ú›Êuø/`zU¸.„r¾èaOiÿpéùEY¾«Ž/JðW¯‡ïž$,þq€ÿ}~|p„~P‹ü8ÔŸ¿7ÿê+‘´€Ö¤¸ mü7›¨ºÆ<ÛJi ÛÈÌ1XÁÀ2¡U²3:|Qu"Êœà…{ Ì‹,GÖDÖ±Q¢óÚ½>2 ŸR:o*2¸ˆÖb‹ô ­jFÔ$áaè`1‘BNÔ¸çˆÀD6 ”Ý¥œíGTÖï. ª6?+‹aHàÿ]z‰­3gºÑˆ¨(l-H  x„8ŒZߨãf ô åÒmF$h?ãƒIL;˜¼kühDLríÛaëD´Ã²ª±iR°bÀDmð§ˆí»{‰UlÖ T@ízJª6Øýæh°Ž¬ÃxN+%û&©¤Æ0UîD³Ä@UP9Þc-d ­¨ŒW ïö#Òï¡ÀÆ‚¨Â"èJº5^p©·„ˆ2íˆ 1±®+H¡D~¿ñ= , „uùŸ¯>2U… \ÊÌÙìÌ·åÏ%,mJ8„ýF^¦…®°ž®±U5Ì*¸Lx¼YG…U´1ŠÅ †°1qĸß:|Mˆ,cÁT 9;i™¾G«ÐÁ7˜µ6¡pP p±˜õF”b¿9F|'hœEö­åu»Ž Š‚t‚°`1V‚ã#(´ A§ 9¥ö”ûÍïëÃÒ; `èvD ¸RÌ5Ø ÖÛ%h×éfÁœB˜æ¨ö™ãZ¢ðô˜(G‚"#Eµ#ʈ¦±’°¼@ùFK,[ å ªSºK½ŸdY« ì#PŽÍˆ æÀöÁÊÚ°Œ:´È` 9Xxú*¬Ë‰D÷ä4Q±#°÷±ÓÀ» rQ¡¢¡\yí À>ÇJÅ:PÂJi÷ã·q˜.–_E;Õ1$˜P°Á;ÀªF 85ôk „9™7rO™ƒ7‚<Æ ©½·ÁªvD0Ô¼ƒ…Ñ…ï´,ž ZÁ]€ÙSòÑ=eƉÒÌ&Ø™±Éo‚eò$æq°÷Œç0 ÍV…Êu}·Ï:¢„á}`R nX”¢¹ ÜŠÃÂÎlµ*zQÀ µ²dŒÉ¸¯¢…Þ Ø²°µ mZÊa¦™ì|ntì~0ßÀó£ä¡b?^EbŃ­à]J%‘› ÖÇ|£`çÂ*»FYã r¬Rd<š#X%{­#F@ñ >¨0¡lFDmå5,±£$¸Ö<!ö˜&X´æqĽdNÚË V]„•m‚ ¨î›-ZãàrÃn(’3¾ÈžÚÊÞ –a;šF°Ãh0Ÿiˆà«n1ߎÏÏ‘Òɉg÷âUMþHTðˆ@3·œƒ1aµ,Z—¡Xõ…2s–É Ì¢#'¬Ýgް‡O |_̬åDgæiTȸ/Àzô#)N²‚yÃþ042Ð`¯9‚·«5ЇGêQŬù§ÀÌqÁ6ožP(Y¤1¡‘"×Lí's¼k¬ª[¸G¶#JF`@¡&íÆÁÓTpkÑlKÞëî%€s`WÁ´ÑHò2v2°®ÆÑVaBÓŽÛ Lp‚ÈÉqÕ~v¥šI0̶Mh+4åÀCÆGÝái±ØeÀlÎÓa¬(‘ï^TÅÚ Êy^_ó¶ ¤‰Àv8e,f<=ÊUP© Œ€¯rà=y5b-Ne À‚ìC69˜Ž ,׎h¹aw` 3¼aâà½FÔÀè Á^çÌÇ~« Ô‹às9 ëØ[ ¾ÍÐa6ç‡]irŠ_¾zûìk’|idt•ã¢4þ_:ÏIs£_êßVÙ½¤R¥%H*r硪éîv æ&´û¸Ÿ) R¤ËTéu;5°¶0„“c(¦é”òð¥'TËI—Ÿ%`›N)ié‡ô ‡ÕcÄÀß9úáÚN”µˆ^¥ÓÃÚ!’®0©å)±Hz]M³¡û²òtû…ž R $ù†jÌÎ õÓÝúGºÁ¬Ë¤s›BΛ’¶ÐXx4ŒÙóç:`J ‘PÂWº‰JàKHž4hq§4¥¦''4ýn„ ‹ •(()Ò-Z§Ã(™~á|ÎØGD²·‚WÜ*J¶íD©)|¡’¤kOé.•^î²l¤ç‹2ó­Ã9,t@·<àèÂ*Ö`ÿuÌÞä[¦L8éF&I Äk0• •è¾VÏÞ¤xˆ½É\Gmã#€!-îDìí·"{ÓV~S cKµ%µÉÜŠïº4³w\ì`2Jœë ‹›˜ØÛö¶¼ÒÈ_¥SÁ•ut\„ì­0n´°p1•IÏDibt1Í0J±_8, {›ÂÞ -¶„½v"ö¦°wŠPб¤XîJ{»$–1^; ãuÄÞxÝH>¨´–ôÕ®èï×ÑRøP<³°³ƒj:Èt³Ÿ–ÒÀë*$ãl/-–”óÉìÚOK‰èó“žý´Þ\Jó6Þ©¥°¸"¼Évj©ÔÁ”}¿[KÜÄr ¬wj) E:cÙOKY=Z’þZ*Àât·–Â…ϧH–ÝZ ÌÛd^죥ˆ¬)=í~ZŠ:˜ÀÛx§–‚Þ¦'¼ûi)doíSüq/-•ØÛ쯥€J.¦|ûi)bïTi?-ETJ¥eöÓR©CÚ6{i)bo/ËÂíÖR™½ ³÷.-Eì­BdöÞ¥¥2{1³[K{»Ì­ûh)dïTí~O-Ed•j-E|2è÷ÒRÄÞR”•i©?ë,îœWW/—Š­•.êç"v–Æ›ôøß¸éç*-ú'wí¢P-ò«©¤’WŸ·7§×™y¾]|Â9u†…ªÇò#l׬Þb",ö~>h¾ã@vKµËßrJPPjkDŒ¹q­Ò~ün{qõó¸ª%vK.žiqû_÷˜üæêª@¯Xª˜°¤ÂLT‹)¥_"LÛ7¦ÎYÛ+¬4ztüòép„Um뜮VGXÆ~ÙÔÁ>8;»¿9=K ð{36Z´bu|zŽ5&¨¬ü[®YÚü¤¨úÞßÞ®?lßýzûaûyupùþþâô&Axôéô—Ípzv¶©¹òÔŽ¾Û¾Ê|^ƒiÆS©vØ<$¤¶w®2å°×›üïØYކ“»_/¶Wƒýp7¼§™Ó„oÏ>l›2XéƒúGìüd{öŸÛ\• µö¥JñçÉóÃû¦<þQêQ×j§Ô÷ç„Aâoµ÷¤»Yá„n‰½^PÆö[ÀTóç XæÝ¯V(‡Iß­Vÿ4®dÿèô',kñ1ÉD{\9ï§9ªo¼•ê›/Iøßþ++ˆÇ8 ¡± Èå¸vý%vzwu3\|¼½«»¤cöÊÝÄÛG<6Ìr} ’þýå§\X(Õ¢¢ì»úžüü‘JÆÂ/W©¤ü¶ëZû¦=uœI œ 4F|o;„S%yPi¦í[+¸·$[ØÀ‰R“ž·ÙŸR4H)V ÊNßo›¾yÀkøÀÌôÄ´f3=[|±;’vÔÓhgzßE‚ÏöÈšMðÿüxÄ»n_u°-Þ¬„Þ‰™¢K"Ïá’ñôÄï¾j³€È¸œuhd,„Æ×uó¢Tiº½>¥ •¾Ýþr— $Ϭœ’¿ÁäØ.Ð>§÷ŒËþ€MÍ7íU Dëy»½»¿þ-1*Þ%˜Q+¬øòmÖ'ãVlÉ*b=Ý^Ü®Ÿ•_ë§oÒß¿?á¿ÿçß¼ùŸ©Ãé§ëÖâÀ0°nÄéM®ÇÒ77Ѐj]g£³ViFVÔTª{Ä’N^ãäÈx:¿ýûpçãíº-%‡`M%lz°×§«ÏØçôò×ábû,¶ÛºKý*ù:êh‡ª3å®îÆäLÄ\Q‹ëá¡[ýZR‚+YRÆÕ¿ekÊ 5· Ç  ÷^†DHÙ ~;&L¯(Œ–Òpž[^¶àivþ›ã þBQ Ù”W ¤ü8ÍYôë³pú›ætÜÆÔGKt®×‚’‘¢E%—B´œ7]q Å/o4ç¬WWi±Bº<1ÔÓ“—Nœ\¼&Jä‚ éR´íAQHªÄSÞšlÂ(°4ßÜl?¼º¿åy ¤«(¦W—*ÊÇ¿ó ¾-ß7öÞbzÖðó:¨  ž¡ ;lÿ ª™êåΔÅäqñ èÛ5Z’µV'ŽV$»Ð÷?®Ÿâ’ßµÐ2 5>uC@nïÔüÃÛφ£'ž¿üîÙ𷃓á‡7OÞ‚ÍñèúÝvêöõõÝæàö¹ZªCµyÿîçÇÃÔ"POŸ½:yùöïû‚º=ûézs÷ézGö·½l€¥D# ö߂ƒv~úë-üñ” þù ØS“ ¾Z¨½…Ó3ét8²xÏo.àüü%Þ9yùêHþæõËWoË"L8ßE¯ÄoáÏ›óZ¤éý,ÄGàçõñám‘£ãƒ§/ŸÁZ|wøÃw‹ç¿‹ûvùüé?®>\®O>ÀZáiHRß®ê¿þ|úyˆô{(ìŽÿãdõâôæ Ë5A¶¿dix{>`ÚQÕJo³]]£Au3R#ŶÛ]Å>}©u¶õQ‰žƒˆ!=|;ýÒ*6ëÁ†Û¾Gý3>¡Jfñƶ> ˆŸÀÿ¼ùõcµtÏ.ÀvË÷úþ‚LQÅc>î™Fe‘»/w.ó—Ç/×ÿ>)±<ûå³¼B볫››íE²,ÚžµÎö óÔÇÌ…Uç¾JÏ€SŠoyí) ÅU\„VÁzNT#ð¹"Þ©I·1ðjÚ·ü)#k£` CuÜJOåBz–;é©…r¡ö4Xº¼dÒƒ%ºt8´Øº(òM™J3ª$À1½ôʧg²éA{S~ÁÖAðE]E/»[—ž»Ö1ÙêÒ®"ñÎn%˜´Á¥ÇÀ8ƒ¶0 ,y;RH»J0|FFù 05ê)Á΢»™œß:Y{bìž‘NƔƴcb}$Sáj|–³Ê7ÎúyJ|ÔÂu¿„6&Ñ`ä=?¢[r/†žBÁ4«"¼ÑªRH(­)W%êÇ. 1…„… FøÜ4=³œÌ_šÇfkEC[•r«|ɬç|}¡kOæ¨l¦·hezö8á„褬,.aÈØr»ÊwÔÆœà¢iö ÌK6´E»<¦gˆÚm|»€†“×ѯ֥õœòP(åqà¥ÖTl06? ÏÓ®%“&’ÄËtK’ƒºZèU¾Òõj4f¶î`ñvëhåD é™ÞxgãCžZ%ÓÞÆÚœ¡'¾ÄW=…`c{S±¥5¬óæé‰§Ò“žÐÏø0´"BV9$P ©ôümºËmZlMK[¥ eôPv2Oé´ ÷| ]{âÁGLÏÑ&c ŸrF–ÃPËR 6P. ºÐÙ©~¾¡­ÉO^ÊvÅéyØ„B°Ë\#‡>ckÅô|–^ÁõœÎ–r¾~½õUDàS¯ŸkMå­v¦˜X6ÂÅiKét+‡xÅ”n5xÙrBLºL«iOM¨V‚œŽ ›àhUôŒ’VšF¯#e»é¢ì«›OŲ;Ól{‹Á÷Î4h 2"ÞL^ò ùÐ÷Í„©+Vàÿ–^i³³]±Â„[¯Žø4uÕøŠ •îúLá ¸Ë0·M é¡IU 3vWé"èn7zš'Q<ŸkdbqD¯ëjœå®’º’ÑuxuqõéÝ£Ú &VÌ]•ÜHèúãá2ájWé1=PéêõCYÍ—_ÝiK?Œü•Ýœ YË9[œöíøÙw?¦¤o'oŸ½ùêÎV{XþúÍÛõó³·ù6lvåóŸ—õ(9ßF½¹ln£Ö‡W׿’s|qΟ“|us~û¯Èe·“ߟþgAêrûó¨ÓÇËÓ»¼¨Ç#ü-.ÏO/ïnW0ï¼Þ$XµÌáéÅÙýE…ód=v¹ÇÑ7Gk:hyÓoáÚãíÍéå-»Tér5¦kíñææêD)CðÄÆû¶öØé±¶=Ðq­W vÀ[â‡÷à³]Þo™ÌЇGÅðì÷ç9\¢¶XÂpètôÿË»«7KÉpõóöÃ1×0ýP¸½Û^3Ì _¿»¹¿½pôûYú´}~¸nxëJPdžSj~&1Á«R«ï€ZÝ­Þ[b•ñxß®ØE;¦úc">‘nK€êƒ0éŠX˜ò(ä_"øF¯¾Û^¾¿ûÀf,Ð=ŽfŠ$˜Wà™ž«·|ä|ÑÁ`-níyHwxÁè;Ø_Õ¹½>=ÛÂì^æCM°9½¼¼{üo…Ñ´÷&ŠûÍÚììŒ'šðù·tççÑ!@¯\ ì6b ÚaÒ@«4¾³Èä,,gáðªË7´ŸÀ7<€Z€&o3ÐñÀi€^€ñŽyxweElx ‡ÔA¡:+3&¬¾¬˧slÓt›×qÿ}´½ú´½»ùµ½òßóê°Â"LÏüU÷z‚æ{á|'V¿EIWX3çCe/f?¦ü”GI¾óêufΚÎîšiS1Ó‰Y0sæu.D7#Å<Äf¼óy»É ·±™#øŠ:ŽÁ2s`6_ðÓbqúË£'W—ç·ëX%¡¶\¾¿Ø¦F̼3êùôã‡í9kQ’GSÛËO`ä^?.@¿*‡‘X½ºg¦<Éøpz Ê÷nøu{Çûæ|XŸ®n¶Ã{ÞQ¿žÁl|‘Þ;äC›ßQƒÛ°ôs\l5ºnDÂÿ°JšÅ .Ã-8c°ÇÑ*;ß¾ëöq•AO·?ÑÝ–ùSí¿Apþì/çÿEÿtR8ïÕöç5µmBdJÈÍðäéR¢×ÊüQîçaÔ$!\i \<Ì K=«–o‹\l“Û8­ö jY€E ¸t ÷ÜVa„…A”®4Z‡WJ‘A qÜÆ%6Á»ÍxÙ®lX ³Œzù‚¡å6.I:8„…A×–Fë`a††¶ôTš-·U¼|å€eºÒŸ=,Sé ¬°,7Uy"zÅEzaÊæ¯RdÃp›(°° ß“¶¬Ü^¡¦ßçbb’ÛxŽRf¼úrf=^ÎX^Ç‚—æ6.7,UÁKµe°–ñRà¥3¯Î¼g¼<_ Æp{—/ÓÁZàûX°1ÚLøžK¥ÊÂ÷¥èÔß{Q¸JÙ ßÇ «ð})‰5Ï_m9ŒL¹¶-Ã*|_JbÍê´gÊqóª,|_ʑ͠m ‹uÏ÷UNÈÂ÷£Rõ'%„a¼Ê²ÜÆ%••(ëØ•¤­#Ë/Ì;^GÞCªð})¾3/¿øB¼íÇV~©Â÷¥œÏ¼üâ’ j"sªüRºÀRÀšYÇù¥L¥÷ƒ5Þ-¬Â÷£ò6í—ìVQMäWcáûRÎg—œˆËrBù‚—[„¥áçÑõºÚ*^…ïKÙœ]xå}‹W̼:S¬›ñòÌ«Êú‰üâ’ðZt°øžËšà“’uµzù¥™ïã¤èz…Yx¯°,¿táûR>dž¿xo=á/–_ºð})‘²C×ê)ß³œÐ…ïK˜yùů.dœÈ/–šÊË7¶ÜTƒÝ”eâ£I]Úª-§Kyù¹‚Ñ /¡±'É㿉RZÛ*½|ÁK.â…iyØ-'’Ûê:†1¬ZÌ/ã…9xos WWÚ|¥}œÁ«çX¤I-uÓ—ÄÂ6¦½3´Á²~ˆ#ùŒ]q[…EååJM´wJnÃëÈgm[†¥f`u¥€á·<Âw°r[†UÊËÏØNëîj‰MÁw4$·±ü2¦ð×L‘ç¶J/-aM…:?m¥{±}/µZœc‘ÑXCÏÓŠ_ó9ŸlxUë, Ë™ôø’l?Íüå3ß';ÛËmæa569ØÊ¾fì+¾ÛÑ|fˆ†ð"¬bûbnÿ±ÍÔØÑËû8?G²I=Ç'LÙÛ¡´U›IûyX­}o6šå½-s4ÜVi–ae^…¥Vl¯ZÓâ…mì¡ñžöv¹×1ÍN Yu‡å6†eÄ<¬‘­'ò^qËSä}{lñ"ûVò] UbCŽÛxš‡Õú ¡±ïùg(mž×Ñ;§Ü©™DFq©ù– Ÿ»Ëì[5~­4fVö‡È^­|ßÅ1©­Â*ö=ÇDGx‘ ïXN”g¾U¥6>;‘Æ-Â*~Ú÷Õ6)¶Û÷U~™"ï9Ž9‰$K,yË먼¨­îma_me¶¿TÙÉÙÆg™Ò0ßç{C“¨t毱ã¸ñ²bV¡ÚÊL{¦—á¶ «È{މN¢å`ßÖœ¯ºøÛ²´±ï.­Z„•ñJ¥W:û¾úµØÆëh{yÏ3åÈh±£[¹Òíh¦½5ó°ÚSJ—6¾?¡¸­Âb¾÷óxÑ÷ÕeX’Û*íÝ<,Æ+Ùʲã¯uŽñ¥¶J/_yb¢Ø.¬÷'Æ~G:ïɰBÛ8f±Õ›Pyµ‹QÛ96ÎÃjä„O6Væ¯âwT“ñr…ïûøjƒù Ì_lû&Ÿ/d ,9«‘ÙcéYÚê~tjfŽÝ©šL1ˆu3G–÷ØVéåô<¬ÞŽV5>Q|_Ú*¯:3Ï ß'O½ðDw¾Ýû®ð}¹ã6pGÛØ&…^¹H1´ æUça=„¼=¹[bDë€oäV‘÷'ãµ—IW^-x%Û\ Qiaù…E‘&6¹OüåZÛÄûžcÛ#¼Ö¨Ú5Ç ]†e}i‹Ì«^,Â*òžª;u©h±T<ÃðlÊÇè ×Éàb†©LŒ =ÁBÁ„Xx †/6™ÁÛø&¬;øº)JþŒ³åäEå+×¥¢é¦$YR~+_VÞv3RšªA×ûkÞ6•”xQV+ÌY´å|zR- ž»ŽaZ ¢Ë0#H¡–J™ÂHæºT+w±CÆ}¸Öû¢,ßU8%ø«×ÃwOÿ8Àÿ>?>8Â?¿?¨5~êÏß›¿ÿõ•HZ@kRÜ„6þǘ”àOÑË 2â‹™û&”û¼LBDéeÐ^û|w2õ˜— f‰9a(§ŸÌ:"ö#JtÌB;¢qiµõØÞ‡æý6^ƒî™Š+xßà‰/=õeôSûލ4h<Ðs4:ßha#‚೘¯N6MÈÏ1`n˜ªV†2êÌ™n4"*Ê:lÆ)LKèå·°-ébÀª$X#>8Õ¥‡S Ç@ã·I*àbò®ñ£1GµoG¹áŒÓD¬X7ýè`³*ªÍkÛ¬>– Bтݮ‚TÃ`÷›£Al¤Jƒê±yÎMõS€m¼r®yéTE™ màÔ+à*Ñ•J·ýˆô{hÁ‚® uhTTÓ„ h  ,(ÙŽä„•0Ië<–˜Åü“{\§ L0DzÊ©fªxVЉUiÓ¬#hjG©Î@rÊHõ]1oå^#¯Ð?  w6.Ó×`oôwh‰†ÃŒyy¯•@XdÊ”÷[G<ßu^c‰¥s¦Ò`®èàð5ìžÐ¦Zá "^ê+GR8Gð[÷š#l׊өªØÌœLPi ó…v¨À^‹?`+5ìYÊ’)÷›#ÞmÄ|¨ :`-…í Ûþ 6,v4µ “øPx sA€ÂÄýžÁs\Kž•0#è×&½šÑ_x¬ â§‘rDáËdØÁ ˆ…¡õ~Ào°Ô.Ð 6fŠiö#¨9L÷êÒ5È~D0´@œâ«ìˆ²G4ûrŽBRL€jë:5,~Ñ{Ê¢Lõ§È/Ršò¤Úý8ÇÕNÈ7EÝ—Á.ƒ "Ѓ%š9‚8~Q$°zκ§Ì‰°Í½À:|Þ§œ¯<¢À÷…À‹` ㎭½@æ€b`Þ ,DFšÜSæ,ãìð0?P͈Ì?Ø1ŸõÌåÙ®#¢² ô5îšcØkÑ Â¿˜Œd^EÛa–c- ˜Ö·MàR`@gl•ó£îëh¡ßX‰Ùd@ß©Ž=Љ¹|·Uؘܸ~ e ûñ*(zœì +™òtæ&ÔVÔ-Pºm´ @'`¦Ò ”ÉUî·Žx6¿…QãÕ&ÔV ’ÁHµFañô™DP¬t®j/™C{YË ¨°1ç~fª‚\ñ˜ ä¹o-@‹…¿a‚Ás?pÁpD½¯¶ò(ÿAlà²X׌ˆG€àíÁ8I:ÕÀÖD/GƒVI%ÊÔ~2+SDô`cÀBªv Àbø‹`sHØåV6’v‡cX œüŒ#î's`pV$*Ø"ôй’Nkœ¸í¹NÈ¿€™ 2É’$Wn¿9¢·«€w"ð(s×…)ƒ½îÖz7¾Ûª˜oÖÁÂ+Ìûêíí's¼‡,±xUÐ]›vDœ†!¦Á¾’¢6 VÅ ´ 8ˆ¼0Êö’À9À tU“²S»€ H!`‰Jе#‚mƒáËl5Ù«j?;…§E«42¨;;IsƒÀ£ÕDÿÐêÐ Ž4Xe \G½ŸCÅ8µÇn$¶w¦m Tõ7MÀ½Úâ jÜ å ÎœÎù{÷äUðóÑHöhÌ›f?’¶ß^ƒª¢àJ7"Øñ°aúxäB¸ÞOæ`_c@"ƒ‘,¨¢'mî5ÌÐ'Ê·ÈÔUNz &XC»Òä¿|õöÙ1–ùÒÈè*ÇEi"ü¿zw5ÿRÿ¶Êî%U((A’»;¨¦ƒw¤ÇÒsÙv8ì;  E©BRRŽôºµ@k ötŽ¡˜¦SÊBFzBEÎ_ºü,yÛtJI?è¢AzD#X‰ÑÀU‰~¸¶e-¢XVzøBÃâõ&Œ¹.tŸ‹F W74:«ÒtHs §º„’t˜Öbah²RPŽÞF7/P*dÞý°íéæAzØBs ccWFuÀ”$'èU ±=( ‘GPM§”SƒÜ™ô¬„–?`èQ,/œ¥@Xz—/h¥¨Ë(™ÑÂE—‰¦=zHðÂáëÚ‰ÒVõÓëZºKe–;x‚›ž/Ò?Ò…)¹ØHÊJS˜HŒtÇ1{S`4eÂI®4%I *Y¬.T"éÔR Üvfoº,¨oÁÝ)# AÃ{Sü/±·Èì­<³ž ÔN”¸†.3$ö¦‰øÊÈ,vnÌÞ"³wÀ8üb홽]fo³8do&«'M–Ø»Ž`û0N' {Ó:¤›ÌK£ÈÞ)Iì {Gæ%<Û) {—u› öÆPý—֗ž‰ÒßèbË%<ƒïT†Éìm³lµ§ „Fj'bo¯ {§KšåÁ2{'záùª²‹B:÷LOŒ,‘%¢û ÒZÒW»¢¿_GKZ3?GöÑRØAºÈ±–ÒxX%Óc½´”“=ý´`Æ!EöÓRx«5&Sr?-…ÀESeqwj©Ô!qº[Káa¸E­íÖR¸s³µŸ–²‚ã‘TÍ^ZŠFtʸŸ–Â…óéøk?- ®fLsØGKYS5Šý´uiƒî¥¥ð±›M×Ì÷ÓRÄÞ™!öÒRÄÞŠZ÷ÓR‰½E5Âvi©ÄÞ®²÷.-•¸Õ¥³[KåýPÙ{—–"öN9ßöÓR‰½-a;µ±w -î§¥{Ó‰Ë~Z*±w(;n·–"öÖûj©ÄÞLÖÝZŠ:¤£øý´²7xèl„õZêÏ2‰;çÕU´Ë•^k¡Šúùȇ•í&=þ7®Aúùƒ*ƒþÉ]»(Tk4äb(©"ÁÕçíÍÅéufžoW'ŸpN]…aá‡Êi€Î°Ûµ0«·XbkµŸšï8¤ç©Hó[®‰ Jm‰‡Ñ "×®¥?Úßm/®~¥ÄŽ¢bÉ•Í3-nÿëóƒß\]•úåK ³§ºJTJ)¥_"LÛ7ærésV6 =:~ùt8¢´‹eJW«#,' c¿lÊXœÝßœž%Žø½¤‹Õñé9–ˆ ªðo¹ähó“> vêwtz{»>ü°}÷ëí‡íçÕÁåûû‹Ó›áѧÓ_6ÃéÙÙ¦æ ÈP;ønû(óy ¦wN•ÖaóÚÞ}¸Ê”Ã^oò¿cg=<:Nî~½Ø>^ý ôÃÝðžfN¾=û°mªX¥Nè±ó“íÙnsS®³ÚWÅŸ'ÏA@u«TÊI×b¥Ô÷ç„Aâoµ÷¤»Yá„n‰½^PÆö[ÀT²ç XæÝ¯‡Iß­Vÿ4.Dÿèô',kñ1×öÈD{\9ßic•'ÞJåÉ—€$üoÿ•Äãİv2›€\nûa×_b§wW÷7ÃÅÇÛ»ºK:f¯ÜM¼}ÄcÃ,×§ éß_~ÊuR ª©¾«ïùÇÏ©â+ür•*Âo»®µ/Õ¹^g’§ßÛáT$TÚiûÖì-É6p¢Ô¤gÁmö§ÔüQÊE®s_ûæ¯á·Tô~ÚÓšÍôlñÅîHÚQO£gÇ$=4&¾‹”~xdÍ&„~<â]·¯:X „ŠßÈ=ïĹY °¢ñ.ÿ(ñÁ#0Ý£}DÆå¬C#c!4¾ô@BˆRdéöú”6TúvûË]ªo<³r |Ÿø &Çvžþðq8½g\öDw˜¿iÿШj ZÏÛíÝýõðo‰QÔsÊb…¥ü^¾ÍâdÜŠ-yàQA«§Û‹»Óõ³ò+cýôMúûñ÷'ü÷ÿñü›7ÿ3u8ýtÝZøÆÖ8½ÉåÔ@šàæP©êltÖ"kÃÈŠJe‹¸¾ÑÉkœOç÷ î|¼]·•à,‰„Möútõûœ^þ:\l?ƒÅvûáãOw©_%_G½í°Àt¦ÜÕݘœ‰˜+ bq¹0ð@Èö¿òc:Ïéúøo’Rÿ—ç—s«p zïeH„”C[¿,`2˜ò‚XéÈo¯”(¯Ã çǧº¡%[ŠÜÔ¶†“ø1Œ§h ý¦yf–Sg¹š$„*žê¥¶ ì¯iO›$Pu‚¸‚q4ÁØb¥j¾æ+QsÅ5ÙAÄÌ®Æåjî e·Ñž@G¸)Œ5ð/`Lêж‰š¿¼:†ÿ’C4÷÷¹‹dVüpxø¬^™÷yJÇÃׯþúìøèÙÓáà9 +  ½:yÈ—y‰'¹l&(¥;®a‡šêÛ/ñB,–Ùû½£ÍŸ^È×÷BTÔQ¨ßé…(¬µHü£¼ùÅ^ˆüM^ˆÚø/öB¥¾Ì 1ÂúÿÓ^ˆÚ~‘¢,>å|dÕÆê/ôB‚Äl–èÈõ…^Hðø]ˆ,vz!2Ò›ÜGÓ-|‘"ù –G ö¬úõ{!:|ÓýA^Èsìè‚ ¸O| îñijÿØ¢~Jx™6³Þ¨´™SùG€ûãá°Ý]jÿàçûJyƒ°‰*ñK}ò1ßgÊãÂ' Z,JþùãÕý-Ï!]-@)0õR *`ü,m¹Î/ø¶|ߨ?AbYà j ݵIÏ“†í_A5S¹Û™²˜C#N¤Tƒšm­Îo‡*ÙñÜ2úþàÇõS\ò»Za_¼Gˆ€Ü" ß ¨ù‡·/ž GOþ6<ùݳáo'Ãož¼›ãÑõ»íÔíëë»ÍÁísµ>T‡jóþÝχ©D ž>{uòòíß÷u{öÓõæîÓõ"< Ží n{ÙK ˆF†m¿íüô×[øã(üó°§Nµáÿß{8²xÏyu.àüü%Þ9yùêHþæõËWoË"L9‡ðÛGøóÄfç¼iúE? ñøy}|x@[äèøàéËg°Ö‡ßþðÝâyÄïÁbž]>ú«—ë“°Vx’ÔÄ·«ú¯?Ÿ~Þ²!}ÇÞ »ãÿ8Y½8½¹ÃrMAí/YÞž˜vTµÁÛ¬ÇEW×hÐ_ÝŒÔHÆ»‹Ð§/µÎ¶>*Ñs1¤‡o§_ZÅf=ØpÛ÷¨Æ'TÉ,ÞØÖ@ññØáŸ·# ~¬V€îÙØÎ`ù^ß_)0ªxÌ'ÀÝ!óѨ,r÷åÎÃeþòøåúß'%–g¿|–Wh}vus³½H–EÛ³ÖÙžažú˜¹°êÜWépJ@jãAªVŽø\ÄsQ|$•òÐm ¼šö-·áûcÎCƒ£9¥,Å“béY,O§räÈ+ßÂKY6=¯MÍÛžÎr½2ÂÀÕ’Pøä3?¯ÄO^ Ý<òœ9{:TEÁÊ`BzîZÇ,Éû¼ãzkhƒi-B'Ë›ôl5=NozJ|¼ÜÚÕ„í'sΦ秵'S(6èÁ§Xµ¡PLã´§ŠÒÄæS|RÔ¢ ¨l5Ý8ëi+EP².½ðÆp>2=="¡kD£y*í9sYžgCj%å" h£1ÁaŽÍ§øtN·s±ô˜œÐéLhÆ5šæW¡¥[åKf#N°*ÝoÌ/œŽî-Ó³Ç ÷ Ø•¤4Þ6c k(# ÝQ­ŠqÆ´{EÓ,/X¦Ñ¥gˆ“yÚ [Nш†èAizN8åoZ¦ÁŒ,¡ÁV[¯WùŽÒˆãñ™vó©ôB4l¬­Å*_ézÕ‰)=b‡BC[` H®)õˈ¶1:דÄVä¥VÊôÜnB!/›_½– ¶°µ­KÏæ¦=½Ž®Áh]% ?mÒó·IOï[v3¡ac ~šIÏØ&´'J7 Ñ»æWcÒþT3<„ÄkWXªEA§geã11ˆmÚº Zäµ–´?Õ,i»AZ †r(¦g^N8ÊŠîífgc"žkM¹Ï(ß,`, PŠˆ°N§gW3«¢C£¤´Âu‹2=Ÿš‘š¦Q{éXªáL¢€=õ´'´¹¶§MÅ9™Bàë‚ruó©Xvg`šmo1øÞ™­Aæ1Æ[ò ù0êÝ`ǯÀ þ-½²Š/à n½:âÓÔUã+2Tºë3…7à.Ã'Â)¤‡&U (ÌØ]¥‹ «©èibœDo026ÖÈÄ:ãˆ^×Õ¸È]u%£ëðêþâêÓ»FÅ<¡tÅÃmèúãá2ájWé7À¡¥«×Ôµùò«;méçñ‘¿²›3!kù!g‹Ó¾?ûîàÇ”ôíäí³7_ÝÙjË_¿y»~þñbö6߆Íî£|þóñ²%çÛ¨7—ÍmÔÚãðêúWrŽ/Îù3p’¯nÎoÿ¹ìvÒãûÓÿ,H]nuúxyz—·õx„Ÿà±ÅåùéåÝíã æ¯àã×›‹ v€9<½8»¿¨pž¬çïÑ.÷8úæhM-oú-\{¼½9½¼E‚b—*]®Æt­=ÞÜ\ý/(ežØxßÖ;=Ö¶:®µÃâ Ô`­ïÁg»¼ß2™a$ž}àþ<‡KÔKŽ€þywõá†cé ®~Þžc8æ¦_ ·wÛk‚ÙS*âw7÷·wŽ~?KŸ¶Ï× o½@éŠìÑ“çG'§}hžçõŧ÷ïñìi{Î]çz<WÏ÷«=(ü ºæSžðñó×ÃgŠCÍÏCÙA‚Á¹ú¨ÕÝê½%V÷íª¦/Ž|©Ãb.Œ|ÁìW0&Óup×ЬK-à%§M\}·½|÷ÍX {!/ÌIôi‚uέÞò‘óEƒt´¸µç!Ý à£ï`Uäöúôl ³{™5Áæxôòòîñ¿F“˜B9ßoÖfG`g<фϿ¥;?z ÀêW<®yн @Î Ã.€];@æ½A³7PKÈ›€Ð㊸èø'‡2qvËO8uY¡•OçЦé6¯¢þûh{õi{wók{¹ã¿çµY…D˜Èù›êõ¬ï<ÂùN¬~‹Ž­°fŽw8óp“^ªYÒühgxõº3g ߺM›Æ.¶˜3gçPlòKñ¿Šy0ˆÍxã2KO'åÀ 6s`0ñN›“! `6_ðÓbqúË£'W—ç·ëX%—¶\¾¿Ø¦Fh²£žO?~Øž³ð©Xn{ù lÔëÒS|U#©xu ¾HyQñáôtçÝðëöŽ÷Íù°>]Ýl‡÷¼£~=ƒÙ øª!=WÈg.¿£·aé縘Zt[ˆd÷a•4Š\†[ð¥`£Qu¾}Òíã*ƒžn¢«)ó‡Ò-‚àüÙ_Îÿ‹þé¤pÞ«íÏkjÿÚ„È”›áÉ#ªÒe4¯?”¸£Ü‰“\S×pg²//ÃRÀòµ×jÚ ,°¨ÎÊ,ʇÀ°8¿¿)mQN° ÂÂHW٬à “xq8šk,r[…e ^¶«úÕÂÂ, ²,öˆä6®¶98„…1 ×V6ë`‰XoJÝÓ+µeX¾ÀòÀ2µ •ê•Ó‡P`…‡`Õ+¡áX±Ð+.Ò 36pÜ6ôô‚6ž#VÑ{ÒV…›Ã+èZ-ÅŽð µjª”¯¾Y^o.<1¢µXªà¥Ú*VËxéÕâ¥3¯ÎÔ«g¼|(xI®$¹+JÓÁZâ{Wƒ{¾g^•…ïKͨY¾çª7²Þˆæ¶:ÇÂ÷¥¢Õ<ñE^1åU–9²ð}©hµƒWk­€¶-Ã*|_ª‰ÍÂj*‰Ä1^UNÈÂ÷£Jõ'åsáH*_F/m\¹_täuì*ÊŒ×Q4<Ñój#¿TáûR;g‡üÒvY~©Â÷¥Ïù5¥W•_JXêXU~éñÞndŽ2–þý° ߪÓt´GUøÞ-Ë/Uø¾TãÙ%'ü²œP¾àåaaž–_cžpµÂ¯*|_ªÞìÂk¼Ž-^1óêL­mÆË½¤[ù¥Ek‰ïY:p=—ù¥™ïã¤fzÕÊ/®3#¿táûRýc‡üš‘9¯Â÷¥ÂÉ<,~ '{¨Ê/]ø¾Tq™—_õ-ƒZ–_šªÃ7¶ÜTƒ`zæ >ÒÜÆ2Z—êðsõž^Bcí°Æ ¸†Û"Ãò/¹ˆ—m*üÖ+m[†ưj-¾Œ¥ô)œÀÕž,·Õ9ƼzŽ¥t(|VÎÂ$·ñ~4b†ö#XvS_Êð Ísd^5T¾¡ÔD{§Ü4eŽ\…]•6ÉüeÔ ¬Î¢K\Z›¼Î‘Ú˜ïM©?[;­»Ã ¤k–9-,lcû˘Â_35šó±V û|¨Û´X¶òê,ÑV“|(ݶeXn–íðòM• a:X©­Àò=½ì7dëðrÌ÷ Kr[¥=ñ}ãwLaI¬æQêí±­òDœÃËux…M­È' ½2^ž*½&XV¼|+Œ`Uþ’e)nã½må^aD¯XéUøžé™^VÍÑk ËÖ9òý©¶-Ãñ}œXù”®§òj'¿r[eưÈ7ííæiœì`å¶ Ëæ9rÅí ^˜¨ÒžoÌ4m–+°J5ê9™SßÔöPn˰|ÙCq –ðMvÑÏ1µXa ‹pϱVîä{ÜÆûÑÆ «­úÜy (WjåN¾ö"¹yÕ‰NNÌÂÂ\R¬;ŠüRÜÆ{ÈÉ9XrÄ«MåN¾JѶeX…ï¹Z0ùF#XUF ßá…m–.°ì,IõÛÇòÞ–¶VáûB©Y¼œðD•…ÌÎÎáåFx5¤Ë-ÆK1O87‡×XÖ½-]Whö¶ós°ìhŽ5"¤&ò^Vz…k®¶oú¾Õµ\¥qF׺ØÙs°(Û&¡Ã«³'¼˜ÕyXÙf(ñ‰/lã=ä ß(¯¨×Ûª¯tÚém¯2¬¹ZµyŽº‘_V £½]íU¯çð‹6€ïm&l«ô2™W¹*/ù¸‹úq¤·;ýè ßs%Ý),L×Äj;X­Nó®ã¯Xõ¹øØˆµ*ïàý^jÙ6q^mâÃ^jj3µvá‚Íäã,¹h甪–E¶vN(vWå{ʽ®åJº3º6ȯX=1ÒÛ=Ôá¸lOðíCn«xyÏ•tgå„XÐC Š}_f7#¿: ‹6@°cX„㢠0²å: û¾­æªÆ~‡ezÙ^Fc[ÅËwrbæLäxNÙÛlX–Ñ!ÌÁr‹6@½2ß¶eX1¯#W`¥øÂØàHÂØ&‡6žc,|ÏUS'°P×Ö½]ì ]Úê™N,|_(5‹—«1äéÞ®x©9¼äØ6©{»èmUÚªŒŽz¯±œ•ö~Û¼ŽÑÌÁË6ÀÈWˆ-,›+n³¿=Žx¬µjä*óª/mÕžˆ.Ã*ç ¬4Ó5˜í®Æ KõTYÚ|¥—_†•𢔢õŒB¶xa›g¹Ãòe†e¨:zO/)K›®üçñâHÌZ¬TÃq¦ØÀ¢6Ut‡b¯&ªîj¬°|‹¶ñ~”¢TÉîbÝé:àÓëL/“÷P.mlçHQªd—³¹ ,JI+'{Ûp[£ž‡Õzk”Oªø0E~YnãjÔÂÌÏ‘a­1ó­®²0?FH|†mµ²µ(U²9¦0Šê¬‘ |žÆ~GÒmØæ<Ãr˰òSUññÞ¶ÜVi_ªd—3ÖI´IjÚ'…öyŽéOl«Õ¨EX†•ðZMòndûºÒæÃ*U²9Ö1‰‚ÉÐTÉV¾¡µ±]ˆ‚qV^Gp …ŸÈhWÚXæ a—«ÃçóÚID ×]U¿#Ï1½xÁ¶Z^ªeXy×XLgB/Åm/çÈq“1,éccÊÞW å Ë,ÃÊVغ‰Õ SäW(mºÂ²üâ™r„hMxÕøD‘«º´5ôró°Úè/ei(z»³ï©«ÃËÂ÷šF®D¹'Û·ƒÅºCÊ0‹ñ¢yø©}/š¶+™ÓÅMj„ˆ¾ì±ÍôbF*1«ÙCIºXÅÎ1¥M°ÌQÌ÷æ›VUÚKO:°!¬1i9ËhÕðý<,„Rù‹ÏN·UXzë  øça¬óÞöX‘Ša™™9¶ô‚ï݆O …,öj(mšåª²óôjÏà-}?ò­<·UÚ»y¼Ú¨¡Þ„z¦ØL‘Ûx)æû|·`³ŠO“ï¾.òÛªNSaV‘÷À•^\§<”6ö¤*òžc|c¼ÖÀ6¡Úr–Lºc Kyϱ´,°‹°¾[Ï)ô¢6>cÅìžK°ŠŒ¦:Ý~\³c°ú7ÃR‹s,2šJ ðYfÆ+ݖĶÊZgYXΤǧÉö«2§ìíj†eæa569Úʼc+£S[£]†Ul_LÍÏva‰›(n«ëÈò>ÎÏ1Ù¤•W;›Û<Ë íçaµö½ÙÔ»±µ£©M±\Õa–d¦úCü¸ÚqëG]ä}¹×1ÍlíU¶å ·ñÞ6bÖ’=òk±yÂy߯[¼ÖÙ–ë!UÚªœ0jVï+x5K›cþ2ÅÎ)wj&‘Q\žJ{–«¡´©J/³+ûCh“Ú «‹‰Róª)ö=ÇDGx‘ _ÏN8¶J[µ™Œ[„Uü4Ô§ÕÎéöµUXEÞssI–¡¹ÀgÒÛX昰«ø¢‹•Oh/¹­òó}¾74‰J[yÄ÷ª´Uþ²bV¡ÚÊV¡—.m|ÏJÚ"ï9&:‰–ƒ}kz½]}+lc9aÕ"¬ŒWªœÒ•×rg“Û^ÞóL92šìèêóþRÜÆ²ÐšyXí©ÙÊmü¾·£+,æ{?}_å}Ž\lì ËÍÃb¼’­&x±íØþ²¾òÄDU»í{ŽYéÒæyoÛP`Å6ŽÙEl5ÉNÑŸ#nc™cã<¬FN YïYµ>r²1y¹Â÷}|µâ•üÞ*1äÔÆ|ïä<¬FN 6¬ÊES&XjfŽÝ©ù5N^ø>”¶SpzÖÈŽn’$·{¨·£™ç‰†ï;¿c*'d…Uø¾Üq›F¸£ÝÔ—¢õ(¤Z÷¶s‹°Š bc\‡ÛäØf+¬"ï9N>Æk nN“¾¹µ}©­Æ:\X„Uä—#Û¤Ð>ûÒ–6Å2ÚûžcÛ#¼Ö¨ÚcþrÜÆ°¼X„Uä=gûÛ9ŽiDµÉ¿îC–ÕP~~σúæeþ¿ £~þþú &aøGzO‡”§öýZØìžwM.õ¥µ}ñPª›¸/<¥’ûÉK¦°’åSOõ×X…ØÚ’È`¾â,mL´í—‹@f˜ú¤;5à=ˆ0VC.†u¿£ˆ!ï0+C°aÆ/_¥/ñ¶žÎòYb 2J™NÚÎkC™¢&¨#c3n ×}Žžb‰20KÓ‹ò¥…ïRZ€ï¤§(ÞÃø¶ý³‘½Ž£Ã€tFŒݼ·”‰äE»µ¤±1jƒHùOÎJPA쌧Ù`Nš”°ß¼òYšz ÄÕ¦Ù`‘jй"Å0)Nž‘V˜š«Â´øº {þX(Ã_¢… Ø ÓÁŒ‚Ëö0´ í²?guH9d^•Ñ…‹¢´*˜¯.땦‘6QóºÈ]¡˜ŠžÊÈ¿(«i¢ %o–Ð¥·¸^Ñ;Êú¢ÌH%ËkIñO<)¶¦¥<ÖÙÃ_ÔYnÈF¯”Ç3ç´1…ë\,±%ŒÜÌÎ'bÊHD\ç\Jž„w\ôÍÜQcØ”LŒŠÀ§<÷Ä9·MÅ=fÀή3Ön XݼýÒàÞ2ºÞg*…»V¶\gtÈ·x‘ëœ+<8YUñDÊà»xU¸NÇr¹ŒT}ÀYD©]á:`O[VS{¢üaùRǨUá: 'Û+F{ÊL•aºÃŒ…ë¬ö%é–ÖF`ùÊByªyžÎ‹ˆëJ zŒ8{ác7#3œ 0wRÙF›J%lµ“;ò9?Òó µswÂPåˆÄuRÚò%8µDÏeô¨A‚iæ:¾Ê(÷p©öEY¾«î-JðW¯‡ïž$,þq€ÿ}~|p„~PSøÿ8ÔŸ¿7ÿê+‘´€Övað?Ì¥æ7zYAz|ípú¢6á2aD,ˆ,P_{á)ŒQÄŒYí¥”YGÄ~D‰ÎWhGÄjJ[Ìèmûš¯Á€üs ö•TVÔ7Ùk´üAH«¯LbæAí;" NØÂ¦:ºuD«@¨ÃEIƒ ò³7ÁÈ(lUE)uæL7¥¬#ZZïz Èwß’Òë” ðË¬‘â S•Q¢C“wˆ)¦};"ìpÐ &Âò‚æë–8:›bÄD&O¬öc…õÎö6Zš£ÝoŽešÐ1€lll›$ò”ÂÄrÞ$-\© ‚æ)ƒCJsp¥Pm?"ýZ°°-œ²I”é¹B4˜Ì€6×íˆðϠȽ²^E멪ßoDà: Ò:ƒ„Æì¨bô° "Œ\ÜP4µu˜Œ@XJ 6„ýFTX|ô,¨T‰Ò§Ùt¨‚ÎhY°ckÓ€ñ°Zú‚„”žrkÇýÖÏ~=E®±Ñ7L¥Á\Å Fð*èÿfA8(,-T&I*ì½æÛ5J«`ß+Óp8™¯„’µn7ÇV ì(P˜{G”ûÍï=*`H£J6œ£°L7è~” ˜§îG:/)Ü ¬ådJÈ©ö™ãZJ,æ­¥“Ã"{tœ#aX\i´j–€€PÁƒ©J‹ä*Xå{I¿q°@ÖDPØ6eŸä‰€`ì}°§]*+Ï#J4LÀtvÀ®”RÓìË9@P°…@ªj‡Ywêb!a@g¡@ÇtŽÆÓ¿¶l©Q>àˆv?Îq`—âF4`оMÚÆ@KT;&Jì$p[ÀÜŠ@ç¨ ‘ÜSæÄ ØÇȪÊ!¿êÐŽJÅkØ pšµÈðMb€ýêÀ¥¤¾rO™°Î³E«taTí5˜°CÁ’TÈ ¾ãà$0Àp –FÁÃ^ëˆV¦¥ôó£µ Ú †Ã„– •€z `€$Z8ƒ±µH†½Œ{ñ*Zh ”8x¤°X¨\+XÔV@qÆkÚØŽs°òV€0®ÎiQ÷âUô%Ñ^ƒCKX®fDÔVÑ#hTùª;P‚·kø€(°¸ÁÞk1ª{"שi²h€’O×E ]#@È+´1•kÝB ?÷’9i/++aË DOUð&´éP&µÈ€=‚H"Nk²s”ÞW[y*p2V*˜Î@I²U¢il‡ ¸ÿ°­ÇÔ8Íq?™Cöe; ûÜ5ìTA´‘~bCU‰^6²ZžÖ:”rj?™3`Ï0rWT‘½¶'öjd0Z;ʬD¯cxn¿9¢· ðˆ©2<ƒU"¢n Ú7É("ª@‘ƒ&š8â~2ÃZ)…æˆgÛQŠ[WD'[«ClÀÈU`5ƒ.¨@qݟΫlR³ô¸F·Ý£hA—¡¯Ö޾ƒñ ýs°õ¯îgç ð´hV9põÉy©M ­à˜É€5 ÝPFlTd"Ùd¶¤ÑÝ‹ª`]ƒæÐ`;€ˆ9¨UšÚ†0LàOpœX¹àˆ{˜$êG½ŸÌйMôóÖu#‚áV¬Q†S íˆN‚Z„õày £éýdöEýÑ‹P±•«I[9Œ{8IéúZd &ÂE<-FAäî49Å/_½}vŒA¾42ºÊqQšÿ¯9ãK¿Ô¿­²{I‰üKJ”* >ÜA5@Îã?ÑsíÛ‡}ÜÏ)ÕQâ|ùMž•`m)èc(¦é„y|$”Òó*–.?KÁ6RÒ êÐ{$ m ƒƒrôõ0³GŠv¦‡/Ô5:rv±ƒñâI·ö‰/辬z¨ƒÎRÖ€R\˜F+Èͧ·^Ä”éæE(#P¶Ö éa ’5»2¨¦Ô ½ª‰J3GðªéD#$ß3=9Á ‚ôÜ(íýœŒ’$[O ò†Ê(™ÑÂÅóNDó}ò UEÈ(Ù¶¥Ö¡Cùôz€ Þ¥Rq¹ƒ©^ ‰Ñ…)»Ø!UÖÁÑÂS6ÆìM~±w.AA ˆJÖÝ' •èVψ½³7íàÛ yá²r§ÄÞ´ÏÒs;Ù[£âOs@æ¯(qT…½Óô#¨0»ÜÁxYÈZÙŒ®:ˆÒ!RøÙVa˜gF•>¯>äá…CϱÙ»ð’ G6Ý|P>=Ç TÔý-W m~ÒÔNýŽNïooׇ¶ï~½ý°ý¼:¸|qz“ <útúËf8=;ÛÔ\ùjGßmße>¯Á4ãΩP:lRÛ»W™rØëMþw쬇GGÃÉݯÛÇ«¿aáû»á=Íœ&|{öaÛ¡JœÐ?bç'Û³ÿÜæ¤\&µ/Š?OžÞ7Å¡ðR ºÖ¥¾?' z«½'ÝÍ 'tKìõ‚2¶¿Ø‚¬¸¸†¤Š;gÀ2ï~°>8Lúnµú§qùG§?aY‹¹4G&ÚãÊùNãÍÃG‰·Ruñ% ÿÛeñ¸1F™Øär Ü»þ;½»º¿.>ÞÞÕ]Ò1{ånâí#f¹>IÿþòS.ë“*ðPIô]}Ï?~þH[á—«TÐ}Ûu­} õ=Î$¥ö„ïm‡pªã*íÀ´}kýô–d 8QjÒ³à6ûSJö(¾O)S_ûæ¯á·T³~ÚÓšÍôlñÅîHÚQO£gÇ$=4&¾‹çâ‘5àþóãïº}ÕÁJ ÞÂmœš¢ Ïá’ñô\ò˜îq‹"ãrÖ¡‘±oƒ?r`Ì;Qj$Ý^ŸÒ†Jßn¹Kå‰gV ÃÅo09v ô‡Ãé=ã²? ºÃüMû‡F@UÑzÞnïKŒê²¢)Vâ{ù6kˆ“q+¶äGõ¨žn/îN×Ïʯ@ŒõÓ7éïÇߟðßÿÇóoÞüÏÔáôÓukqàX7âô&WCi‚›h@•¦³ÑYk¤ ÿ2.]ßJU‡¸<ÑÉkœOç÷ î|¼]·…ܬh„Möútõûœ^þ:\l?ƒÅvûáãOw©_%_G½í°>t¦ÜÕݘœ‰˜+ bÕj_X µÿ5ðÃuÉé’ëßlóìEέÂ1è½—!R¶iJ6ͯ(L°5ÿ ç¥æ7ÙtE±¼Š[‘›Ú€¢ø?3º _þ¦85ˆjþÑIbŠM”¤÷é·ÀYÏùU°lÞØã1¨éAù+Q˜Ëš.‹qqÍSãÅ¥ZPé+ D¨ïú¸˜¨ù›×<Ê=€•¨\ êÚ̻þªçø)¨ŠWë‹ÊñT+%»B< OqÙsÐgÀE¨¹ÑålJPM7$ü hÞIÁ¶²AëÒ¦þË«cø/¹ÓqŸcF@f·ûɇ‡ÏêåäqŸ‡€ :|ýê¯ÏŽž=ž'±Òkœ“‡€|™?v’ëK‚ø¿ãbo¨¾ý{ßn`çüö¾ÑæO{ÿëÛûx‰N¨ßiï+ð Hÿ({_~±½/“½¯6þ‹íýD©/³÷ FÀÿÛûôîÙûŠ <²øBí íý 1+º B¡½<¦þA{ßÄ/³÷eÔ˜›í}g¾ÈÞ—€ƒü û Ö׉ú‹í}¾iÿ Çaõœ;û(îŸê#>MíAôÀO äÒf†©§Í|˜ -܇íîš´ø?ºÛ‚Å l¢JüRÈ{Ì÷™ò¸ðÀDƒÕ»?¼º¿åy ¤«(€¦¢¬FDó–ë,ðoË÷ýƒŒž5ü¼*hƒwÙÁ*ÛþT3Õ…)@Yg®`¥MÀða[G+’® ï~\?Å%¿k¡±\ÂW~ð¹]ä{c5ÿðöųáèÉ߆ç/¿{6üíàdøáÍÓƒ·`s<º~·Ý€º}}}·9¸}®Ö‡êPmÞ¿ûùñ0µ€ÔÓg¯N^¾ýû¾ nÏ~ºÞÜ}º^„‡aÈ£½Ám/`µf<H¿Wèüô×[øã(üó°gòo‡¯ÔnáôLúC,Þ¨@^ í>‰·3N^¾:’¿yýòÕÛ²Î÷V ÷ÛGøóldç¼iúE? ‘ˆ!—¼Ç-rt|ðôå3XëÃïøn1òÿ{°X±o—OzþãêÃåú䬞;$5ñíªþëϧŸ·lHß±÷€Âîø?NV/NoîÀ°\S¸aûK–†·gà¦U­Dð6ëÁÌÕ5ôW7#5RdèîjíéK­³­JôD éáÛé—xÍ=ë3°á¶ïQÿŒÏ‚’Y¼±­€âã'°Ã?oG>@ýX­Ý³ °Áò½¾¿ S`T[˜ÏZ»ãÜ£QâîËǸüåñËõ¿OŠÏ~ù,¯Ðúìêæf{‘,‹¶g­h=Ã<õÙpaÕ¹¯ÒƒÛ”êÕÛ&pîo¬Œî¸ìÚB—Φ„ßr›PNFSµ^™ Þ†ôvÒSkê ÂY× €¹¤NYÓ³î[º_õ*'lH¿FÝbŒêUßÓ˜üV7j#—Y@¸xy"=,Œ©¼´¶~*¥­Eš0.E×u(öC-šžÒ«¶'̬¤ÖÈѳ˜zNz —n÷”Ø•°Ñ5(˜ Tz°Y{rhIÝlC0mlÌ/ëòWvs&d-?älq‚µãgßü˜Ò«¼}öæ«;[í±ôë7o×Ï?^ÌÞ›Û°Ù}”Ï>^ÖCÛ|ïóæ²¹÷Y{^]ÿJÎñÅ9NòÕÍùí¿"—ÝNz|úŸ©ËíÏ£N/Oïò ð<¶¸?\7¼õ¥(²GOž<žö¡xž×;œÞ¿Ç³§í9wëñtr\=߯ö ð/èšOyÂÇÏ_Ÿ)5?“ˆO4x«ï€ZÝýÙ[b•ñxß®ªaj¹J˜Jæ+˜‹ªÀ/`ÞKíc:î'g-Z·ún{ùþî›°@÷8B^˜)’äiJåê-9_t0˜AG‹[{ÒÝ^0úöWµAn¯O϶0»—ùPlŽG//ïÿ3ZJ/ûÍÚììŒ'šðù·t»æÑ!@¯$˜íc´ÂE(ä,€dF¹=€6¹k€Z@fb¸".:~ÁÉ¡LœÝòN]VhåÓ9´iºÍ«¨ÿ>Ú^}ÚÞÝüÚ^îøïymVa&rcþNx=ë;p¾«ß¢c+¬™ãÞJηXqX$'Zxõº3g ßPÉ)Vs`æ¬ãä$aJ’ ôÏ–°o\Þ-vò¯n b3F['ÿ+!3fó?-§¿ s”)°ô^°”yVáûQ˜Žö­ü’ËòK¾/uo~‡üR¾àåaaF˜Áêeù¥ ß—ú2»ð¯c‹W̼:SÕšñªò‹Òô,É/-:XK|Ϻv¼·[ù¥™ïã¤:yÕʯ—å—.|_êlÌó—]”÷üÒ…ïK-‘]òkÊ÷¯Â÷¥^Ê’üboY~iªÃÞØrS ‚‰4j½”®æ6µ1éR‡}®²rÂKh¬´R쮾 ¶Õ:ÙÚ¼ä"^t%w¨ëHp5·±]¨ÃV­z—ñÂä9N¬ü”§Þ)éhŸÚ ,3†E¾Ñho ÖCõÞ·±®µ6Ï‘k[OðÂü;UÞ˯ܖa¹«Ô}ž•9ÕŽ¶¼XNX_öP\‚4iêvhïÛ9†1,Âq8?ËŽæX=*Õë´ÔV`…k®Šnú>éS¶1;zµºÖÅΘƒ•ì ¾04Œö¶dyïÅ ¬ÎÃ"›¡>èµ^¹-Ã*|_ L¼¢¬·Û½½ ·½Ê°æªÂæ9¶öêX~éF~y=‡—ÛU×¶µ(¹-Ã2™W¹þ-ù¸Ëú±—ѹ-Ã*|Ï5k§°Z&GºÚXy×ñ׬ZÿVNxµêZïçðR‹¶‰zÀ6ña/µh3é ^UNø8k¬·«ÃûqÆÎ ÅÎáú·cO9ëÓê§ #=ÄxÙã5«³'F¼ÚÙAaŽc{Â< ·YÞ‡"ï¹fí¬œ¨6@˜Àâ=Š}_f7#¿HÏ/ìíÖv ‹p\¶zYØÙ¡Ø÷mÝT5ö;l—š á ¥_4øNNÌÂrXW»ðW‘Õ¨°Â,7µ†yzµ6@ˆy¹Ö)ÅÆ6ÏQ©/lc^…ï¹>é–LuÛGz[rój,|_(5‹Wµ ß”mÚ ,5‡—á5’Ñë¯ê§E=‡—Ûµ¦{+Ù–™ƒ%Æ6€Z–«5nm®mÍþö8â±Öª­Ÿy"Ùئê:º «œ+4°ÒL×`¶ûšœ£ÐÞ–¶Pñò˰^˜¼ÓÇn›ýhkì!†å9Ê s ˯T@ Ûdå‰8GbÖҤɺáû7Im\—Wˆy¼š¨Ž•Í~,7¬óehsV©GÝÅ:º3ÒuhíœKË'ÿXH2¬RºœÍM`Qò×. ýÝ•¶XaéyX­·†5:;ûžíhj3 ËÌÏ‘a­KûŒW¶r…V0!jýnQêQsLaÕY#Ëûbç¤šÍØÆr áEXyŽ”mzÂ÷ª´qü •R†æñ‚©ú¦îs‰Á$ûPêÐÔ­aVÂkmR|qä#kn«s,õ¨9Ö1‰‚É€vá˜^º´9†%Å2¬¼ŽàJ=¡—æ6ž£ä:ìù¼vQCžhì‰,WSÝsâ ¦½T˰ò:®±ºî$ö¨¹M0,çÈq“1¬”¹‹ûVæc’d –Y†•­°5Vpíö#Ëhª’ÌûQÚN~ñL9BDuîkÝz)¼¨MTz¹yXmô—üóu³Y§Q[]ÇÂ÷šF®êŽ«Ói¹­À ó°/š‡ŸÔ‡OüOmuŽ±Èœ.nR#Dô}œÂm[‚¥Ä<¬fåS„9»þÆsTÌ÷æ›VUÚKL^}˜,ïsooY¨¾Ÿ‡…PVx‚ù^)†¥ça±îXc9zÏ{›ãä¾´ñY“TffŽ-½à{·©ùÊT±MDic»ó±ÌÒ«=ƒÇÜޓض*m¦âåæñj£†zSï”úÌ¥¨÷XÌ÷ùnÁ4:f•¨|/;X`¾Uù¥Â"¬"ïkNºò.2Åç°­Á«È{ŽññZc<£Âêä*¶±‰ÎQ†eça]¤6õŒ•}¾T­Ú¤q2,¹«Èh¬(0ña²ÍmÕþÒjqŽEFS±ÎïX› ÛØ¾—ZgYXΤǧÉöcˆã…Õ.¬°Ì<¬Æ&G;šçÈ/)·1Oh» «Ø¾˜ŸÏšz? ÛXok–÷q~Žd“rzÂtSíl«°ü<¬Ö¾7ÅrU—9Znc^Õa–¬> ëZßÍ‘Ú*Oy_îuÌD3É-rµÀš±W˜‡5²£ë}¦Ð¢6ÆËy߯[¼Ší»näê5FjcùeÔ<¬ÞWplç°,ô¥Ï(ps¦=TîÔL"£¸<ªÞ-(vŽã¶ Ë,ÂÊþÚ¤5ÖÁç0ª´æ{Sì{މŽð"^WûK5x¥6æUãa?ÊmŒ}«jßWÈyÏqÌI$Ì—z¶§¶…Ê_aVñEÈU3K¯ÔÆrÕ0ßç{C“¨tï[qÓqòbV¡×Ÿv±Úz£³£m‘÷D˱º}µ¿ ,SÚXjVÆ+ÛäãØ£ä6Þ¶—÷Dm¼‡œ™ç‰†ï×)†:òLi«~‡+|_î¸M#ܘ?½Þ7‘^`GWýèÜ"¬¢‡Ȩ^wÔ8&´q Yº"ï9N>Æk­Ì8¾Ê{;·XaV‘_.ÅG¾‚ã¶J¯bßsl{„ÙݱúýÞÆ6æU/ayOe&2ÇpŸ±~Õ‡,«¡üüžõÍËüF?üüýõLÂðôž2)‘Míûµ°Ù=ïš\êK«èâ# T¡p ÄÂáiý½)q7ùz*Ìë‘* ®±Þ¯Ó:[žÆx‘òç`‰fMÕÈê— íBId,¸0ÔK‚Ôоå×!®³¡ìël+žèiyCµ¤‰ë`N™WU°Æw_RamU¸.†ôwà 5eGc®Ã"óe?ªè¨Œõåš¹ebL7щë çç‰Ö])?à,¢Nr ËjêÜô´b…—`o†bíNÛÌ€=¬má:pF$K¨ûª‹›t“Ÿ¸N¥„WøeÁ º)£Êm‰ Œ—å%€‚ý§ëèxƒ‹˜g®s6ë= ƒÊ…vî˜xªX7Ö*ŸO Á×\êÑûE•öq>ó¿wàòЇ‹¢/Êò]fQ‚¿z=|÷$añüïóãƒ#üóûƒšÂÿÇ¡þü½ùû?P_‰¤´ÞdµêÃ{,A/øSôÀ@ ‚Làx»º"ð¸ôÀÍÀҰز>û¦È£±–ÖVXM‰õdÖ±Q¢cÚAtÉ ½ ÆûT¯xàE„M 2 ÔVô9UWê…^…ò¨¬¡4lƒÚwD`ØéÀ\°s•݈¼^ÀµfšòÈÏæ.¢Ò¨@uGtæL7eC‹CI9Î@è¹JUÜŒ «ŒfF¬²ÕŸ‘A Q  ­“PLÞ5~4"¦˜öíˆ(7@(+X4+Ýô£tDô°aA§4#J°waÖ `DX}ÜøƒÝoŽ€gP0çTÛ$%L-À&µFY›ª´hˆhQç4/2:݈ô{hÁ‚®ÿD)¬%=d«ÓþM³íˆ„´–L! ª&Îñû\úÒ€.4,¡vªBƒ–”(!Àék,FÐÔiÍ’Dհ߈ u¢U`fÀÖ¹ÕÌU°rÞÂZɈéOꈸ‹… Œ8GŒû­cÀWU×`5aÚ&p·­͈DÐ5¶FëÀ¶R¨KŠdó^sÄ“HåQ`ƒo8Çâm Jáb…Øð*Ì1ÂŽQ¨áÀ,#µ Èî5GÌ¢¯¡¶¶I=[ lZ¨Kš.7a F êGh$óxy9®%ÐG*”§>¢d•ºQF|èÛCÀ_ª¢íN;&ñ*tÝKø ô‚àŒè}“ì ¥ÁNT [m;¢¡¡5ˆFU^RbL³/ç(°¤üŸlM› 4ü`›Ã&—®•ähá€Ì°"Hà0±qD»ç¸ &’ (ÁIѲe 91ƒ"î+Z‡·€`o€ì‡UÎi`åž2'â6׺J ,Û(`×<S‡ *•^è"sµbÂSJŽº§Ì `*, F<Ø.²e aò vA}ÈVÇám#0k ¦óÈè8bØkÑ —L¢V’0ßmˆzÚa z»k{Ý{$ªñˆŽ÷âU´ÐxZ`üƒùå„èØ#‚84,éc×Ù*˜=Ó9ôÁDTN Öy/^E_2 3iÁ¿ŒÚwŠ d8p”kíç^°û@#ƒJ9‡ûØ|¯uÄGàÜ€š`rˆFÑ£¶B …'øÌ¦ÝÅý¾¨$Ù@`8P2Õ½díeЪÔ±‡MÒ3¤­€…GpÿkÛ©N°¹¼µàüaÅ 2Ô•ÞW[3BWÌ… ëa;eò>çPnw"7€¹ÊrÐ’”¼u?™Cöƒ<øŸ { ¶ÂÊj ” )¨fD‰UÞA]£éÿ Ä9ûÉœãx@Nÿ”/¶µ@[I¥Ê2Ph¡Ÿ#üHØ!ö%%nuûͼ]p¶°Åµkä*j+à|´œA˜Ç‘M.`‚Y Ã*ÄGÜOæB 5¹†ÁêlÐV01@Fƒ°Ž®¡*ìb€p@ã­cØOç€ê¤$̵•è¶7&‰þP툆BŸ ö”MÖ£ÚÏÎAá‰v öêȘ«Ààz¡Ã.B3"žBaá¾râh½ŸCU+‘Ñ—)É® Œ d(X-pBg!£;æÁ=Hó¤‘õ~2g@çNà “@©Þ›2`véh±Ü};"˜¯à¥€Rq`+S Kï's°¯˜àÄ5˜¶'8 " ¢S€ßM߀p˜myv¥É)~ùêí³c¬ò¥‘ÑUŽ‹ÒDø5®©[e÷’ù—”Ô('·°ƒj;xŠp¤æ²ípØwÀ¯(UHöRéu;þ#,&z«C1M'Ì‹€AYü+>¡¢e§ËϘG9`›N”ôÃÑZ¥7Éø7m±jp[Ž~¸¶föH/ïÓÃlýÞ³Xì^}F7óiëã}Yô1—:xéù¡$݆b7³sÀDÜÁ‹D`¼Á,ËdÌ7#€á˜:ÐÃBŽŽy„QL·AFzUClV4JA5h„ä§g%´üA€™lv†É(¥Â ¢aExáȱl.¦Ìyéi’¨ ‡0V›Q²m'J»C².½ ®Â»T˜Çq©ƒ§_z¾HÿH¦Ìb‡ x‘Uᤣ³7ÚR&œ„%I ®ôvHT"£wÄÞ²°7í=P¬ By4÷¹SboºaŸžÛéÂÞš™•jíDìMÄLìM %¿Ü¸U–I'±G×Eìrç+{«ÌÞ ÈÎÎÙ[•|^‡¸ uáÐkG@ö¶ÌÞª°7Tç: {Û²§%E€{óJãͶҩ°·göV…½E\\8ð JÒ§®xiÍ1Jq´p¨22{•'Ϻ „.HíDìVšØ›ÖÁ`9·Ü!¨PØ›BSé|U.v€ W™ ²à#(ÿ ÒZÒW»¢¿_GKZv˜wgÕtn¡yô-)ª °Ÿ–K q þZ LDfLvûh)…§YF°CpÞðâîÒR©CðþZ ÀÕ+#ìÖR¸s}È~-dõàdÒtsk?-… ç%ïûi)X8»Ÿ–"²*¥‡}µu&IÇ}´tð>ä•Þ¥¥ˆ½sTw/-•Ø›vÜ~ZŠØ;Tî§¥{'Cr/-•¹•e×N-•:è¢tvk©ÄÞ:2{ïÒRÄ|‘÷ÓRÄÞ!Õ¼[K%ö¦cÈý´TboÅì½SK{µ¶–Jìmª¶KKQ‡¨\aïZ*±·d{¤×RV9Ü9¯® ].ÔZëLÔÎE>ì,L7éñ¿q ÒÏTØóOîÚE¡Zb!×2I®>oo.N¯3ó|»:ù„sêê# ?T d•Ý®A¾Å AXjý|4Ð|Ç!]KO5–ßrùGPPj+4Œ¹ p­ÜÑ~ün{qõó¸¦$vK.Lžiqû_÷˜üæêª”¯X¦Ú?¹,UBJiÄ—Óöi†sÖö ë|¿|:aMÙÅ*£«ÕV…±_6U¨ÎÎîoNÏÇ@üÞŒmÀz«ãÓs¬ð@EÝßrÅÐæ'}@íÔïèôþöv}øaûî×ÛÛÏ«ƒË÷÷§7 £O§¿l†Ó³³MÍ? vðÝöPæóL3îœ ¥Ãæ!!µ½ûp•)‡½ÞäÇÎzxt4œÜýz±}¼ú¾¿ÞÓÌi·g¶MªôÁ ý#v~²=ûÏm®AÊeRûB¡øóäùá}S ÿ(Õ k­Qêûs ñ·Ú{ÒݬpB·Ä^/(cû‹-ÈŠ‹ `Hª¸s,óî×ëƒÃ¤ïV«בtú–µø˜Ksd¢=®œï4R%ÞJÕÅ—€$üoÿ•ÄãÄ YbË-p?ìúKìôîêþf¸øx{WwIÇì•»‰·xl˜åú$ýûËO¹¬OªÀC%Ñwõ=ÿøù#l…_®RA÷m×µö5Ô÷8“”Jؾ·©Ž;H¨´Óö­õÓ[’-làD©IÏ‚ÛìO)Ù£”‹\¦¾öÍ^Ão©fý´'¦5›éÙâ‹Ý‘´£žTœoÚ“ôИø.|¶GÖl‚ùçÇ3 Þuûªƒ•@(¼/„s|ˆ,H<‡KÆ?JL'ð=S÷ˆŒËY‡FÆBÐ /!°¾[©‘t{}J*}»ýå.•'žY9_ü“cÇôøþ§÷ŒËþ€èó7íU Dëy»½»¿þ-1ª{FY¬°ßË·YCœŒ[±%<ªGõt{qwº~V~b¬Ÿ¾I?þþ„ÿþ?žó榧Ÿ®[‹ÀxÀº§7¹HÜÜ@ª4ÎZ#mø—qéúTª:Äå‰N^ãäÈx:¿ýûpçãíº-ä†`E#lz°×§«ÏØçôò×ábû,¶ÛºKý*ù:êh‡õ¡3å®îÆäLÄ\Q«©ö…ÕMû_9y³¬‰ìùo†‹MçVáôÞË)[„ŒÀÇ¥üÊ.BÍ.gS‚jº!á_@óN ¶•ÍZ—6õ_^ÃÉõ˜Žûû32»ÝO~8<|V/'û<åÐáëW}v|ôìépð<‰…^ãœ<äËü±“\_Äÿ{Cðí—ØûôÝiïmþ´÷¿¾½¯¢Ž ˆ~Ÿ½¯,ÞJÎ@âeïË/¶÷åo²÷ÕÆ±½Ÿ(õeö>¨D÷ÚÞÇóÙûŠŠ<²˜‡ì íý€·¯Éeê íýàÁÖ&cÝ>â{_F¢9LN÷Eö¾ä7Xˆ(Øo°¾NÔ_lïëðM÷ÙûÏY°£±â>ñ©Þ¤ÈPjÿØ¢~J —6³Þ¨´™S¡E€ûãá°Ý]“–þdƒËxƒ°‰*ñK!ï1ßgÊãÂ's(F¬ÞýùãÕý-Ï!]-@)4e Ö*çó–ë,ðoË÷­­èÝð¬áçuPOo£Ò~ØþT3Õ…)@Ygð…Æ,c[G+’]„èûƒ×OqÉïZh,—´>·‹€|o, æÞ¾x6=ùÛðüåwφ¿œ ?¼yzðlŽG×ï¶P·¯¯ï6·ÏÕúPªÍûw??¦zúìÕÉË·ßÔíÙO×›»O׋ð0 y´7¸íe¬ÖŒÇé·à Ÿþz |å‚~öÌEÔÿß{ ±x£yu.´ûü%ÞÎ8yùêHþæõËWoË"L8ßFÔM¿y„?ÏFvÎk‘¦_ô³‰rÉ{Ü"GÇO_>ƒµ><øîð‡ï#ÿ¿‹ûvù¤ç?®>\®O>ÀZá¹CRß®ê¿þ|úyˆô{(ìŽÿãdõâôæ Ë5…¶¿dix{>`ÚQÕJo³Ì\]£Au3R#E†î®Öž¾Ô:Ûú¨DÏAľ~i›õ`ÃmߣþŸ%³xc[ÄÇO`‡ÞŽ|€ú±Zºg`;ƒå{}A¦À¨¶0ŸµvǹG£ÄÝ—;qùËã—ëŸ3žýòY^¡õÙÕÍÍö"YmÏZÑz†yê³áªs_¥·)Õª=LDcê¯&ØÀ镱¤rùálJèðmm×?ªþª…mῘÀÖžœ4ꦧU5­ÂÇXé!kzÖ]{‚)¼l°ãD/ød+=HMOÇ[l¥¬õW(š“Ò”t3Æëô°´ŽYB4àÕ™¦§Õ¦ùU+kDz šž7óıé)…m%A5†0í©DÐÍ2à‹°†Bx_Ŧ›“žÂIÎ?Eƒ„ê¯ZïWùn×hžÚ)Ñ` æ’jz*ÓÊé˜ÖtcZc[R›üÔKMÇ4ÊZÓÏÓ7¿Š¨}zÐ8Ó¤kÐ<¦ŠªùŒFµÊ×¹Fœ€ïÈmý3›´Ìè„wéá[|ÓÞ|jð½^C!)rG·Á&ò²ýÔQ\±ÎÅQÞ9ÃC@x×/ƒo($,Ð/=Ü«=9äÊÙhžAø†¥ iVù6P?O©‚k™_Ovl(ã]žz5ÂÖäy›ög¡¼ñʧqãÏ[EK—€¾ –"Èto4O%RŽ^$Z2‘žþ+=í)eŒ¦Ã¶ã[|j’šMi+Ó5S¢Þv´R§cÓyÆ([’Èü*½†e1QnfLà„v—ÕÊ[z”pMÆÔøp®AÏ8ãj«D2¤‡XÓ1­må-ì2.èG(Jä@ÀGœ`£‹ºùÔXïk«q–žcë9$µ´MO]›M'Qè§NÓ½"k®üÍ;åðxz¨4í‚iz*¯U·Ë%sÐ3<„è4œ ÛšM§…i²zuuó©Xvg`šmo1øÞ™­A^:püêøû“͇Q/ä%Wàÿ–^i³³]±ÂÔV¯ŽøÜrÕøŠ •nÕLá ¸Ë0LBzhR•€ÂŒÝUº`&@ 'Ñ<kdbqD¯ëjÒ$ê*7º’ÑuxuqõéÝ£ZÌáTº*I£þx¸L¸ÚUú“¾tõzƒgðÍ—_ÝiK?Œü•Ýœ YË9[œ`íøÙw?¦ôj'oŸ½ùêÎV{,ýúÍÛõó³÷æ6lvåóŸ—õÐ6ßû¼¹lî}Ö‡W׿’s|qΟ“|us~û¯Èe·“ߟþgAêrûó¨ÓÇËÓ»¼¨Ç#ü-.ÏO/ïnW0>Ù/‚Úæðôâìþ¢Ây²ž¿±ºÜã蛣5´¼é·píñöæôò Š]ªt¹Óµöxssõ¿@¢”!xbã}[{ìôXÛè¸Ö‹+P;H/V‡÷à³]ÞïsÌЇGÅðì÷ç9\¢¶XÂpètôÿË»«7KÉpõóöÃ1×0ýP¸½Û^3ÌSR¿»¹¿½pôûYú´}~¸nxëJPdžSj~&øü8 áê; Vwö–Xe<Þ·«æÒgœ·à:Ç|À‹ E¾ U:'Y•˜, ßâ|·½|÷ÍX {!/ÌIô„1“\½å#ç‹3èhqkÏCºÀ FßÁþª6ÈíõéÙf÷2j‚ÍñèååÝãcFC—¦ÙoÖfG`g<фϿ¥Û5zÀƒ³ŠùIçA[|“Èyô%xSd-bŽ @-@óÆŠ¸èø'‡2qvËO8uY¡•OçЦé6¯¢þûh{õi{wók{¹ã¿çµY…D˜Èù;áõ¬ï<ÂùN¬~‹Ž­°fŽwjè)´Xq”$§èøû³“Μ5\@«§p@ZÍ™³Sï›®£=ÝþDWlæ×__œƒ… 9ö—óÿ¢:)»‡Nç¡õkS0“Pn†'¨ÐH—½þ`⎦PI¨-K[-S8¨K=«–†0²Ý‘ÔÆ¥dÁgXT˜e%Pà2š‹D´m–AXÊéJ¡uxi¸ÄG-0Ô´X¶àe»2a-,㬯A—~ŽÔV`9„…¡×–Bë` z\]bŸíK[†å ,ÿ¬Z²BØ1,Sñ VØV|V,ôŠ‹ôÂ̶§´ñ:bÙ½'m¹9¼B“º?Œð \ê`2ãÕ—/ëñ„}ãuM[¥ ^ª-{µŒ—ŸàÅ嫥μ:SàžñòÁ,í!ík ei:XK|ÏœÀÅ+dÓV`¾/E¦fù¾¦Û—¦§—qµL´,|_J`ÍóWW.dÄ_¯Â÷¥Ö<¬¶¤æ˜W+^…ïKù±YXUN5Æ«Ê Yø~TZ¢þ¤05º>‘_\²U‰²Ž] šñ:2^\°®#Ë Uø¾ÛÙ%¿Ô²üR…ïKùž%ùUË&,Ê/¥ ,õ,³¼·™£L¥÷‚U‹pïGUø~TΦ£}+¿Ì²üR…ïKùž]rb,Wù¥|ÁË-Âêä—^–_ªð})“ó;䪊™WgŠs3^üÒcyßÈ/-:XK|_å—_–_šù>NЬX­üRbÌ÷U~éÂ÷¥\È’üZÖµ¯Â÷¥$Ê.ù¥–å—.|_ʾ,ɯai?Vù¥©œ|cËM5æ©åŽÊ9˜ä¶ «”“Ÿ+ðº-÷Ý—Gº–´/xÉE¼,•6ÎëXέ$·1ßë0†U‹÷e¼(Ÿ¢·%SËhgðê96Ѥ-“CŸÒˈÚ`Áå÷‘œèèUyÕš1,òF{[˜%¾Om–Ísäݼ0P…Õó*¶1YW`•òÕs2GÄVWå _öP\‚4©V}½¼×´Xa ‹pÏÑ?0GÞ6fXm™èÎc@¹bÙª¯×cš¶ ˉNNÌÂr-ñ5¦¶-Ã’s°äˆWC-eÖã•Ú ¬Â÷\^˜|£,]}˜/l«°te—`I*µ^öv¹¸"¹ù˾/”šÅ«‘…“½]e¡³sx¹^Õz–bŒ—ªstsx¹‘üª¥éù˯º·ŸƒeGs¬e÷$ßñjÚ ¬P`ÍNß·º¶ÞõiÛ2¬ØÙs°T*G\ýŽ~oWæÅ ¬ÎÃJ)äêÅØŽ^ØVa¾/P&^ÑHo÷{»ÓÛ^eXsÅmóu#¿¸Ô§hÛ2,=‡—ÛU?öò Û*,“y•Ëø’;ÖÕ–ëlrjc¾÷…ï¹ôîè-¶™T?ÇN§y×ñ׬F×òE8ncYèý^jÙ6élßÞ6ña/µ('¦6@µ'|œƒ5ÖÛÿ8òaZ;';‡ËøŽ=å¢Ogõv§kƒìñšÕÙr¢«Ì j ‹pü"{"yÏ¥wçäDc¨ ¬J¯bß—ÙÍȯÎèeNg;†E8~‘ Š}ß–Uc¿Ãê ‰¦­Àòœ˜…å¿vdûRF†æ`¹e vxu6@ˆy¹d+ÅÆ6ó*ß—m[‚ ßs™Õ ,ЧÑž±j™ÕXø¾Pj/Wãä}IàΈj/9«æï½üÊm–žÃKŽmù€ ÀëÍ,1¶j9ùÑÞŽ-,›Kt³¿=Žx¬µÚ(ÛáÅ´§6–…ÑeXå\¡•fº¶˜ðµ‰¶°°ù+úeX /ÌAZË}ó•oUÚjl;†å9Ê ‹ 5qß6žƒm•¿â<^‰YKÓ•*nmßÔÆå«…˜Ç«‰ê€»êÂ<^ÔÆåÑE)«ÝÅ:º3R,$;¹Š7¥ãäR”²Úåln+¥hžð—â6.-ô<¬Ö[ÃRÏÙXGn˰Ì2¬l…aAg9?GjãòèÒvò‹gÊ¢5]é%†V~¥¶ËÍÃj£¿äŸ¯gé54¾»”…ï964\‰“=$¹­âæa1^4ª;8V+¹­òD,2§‹›Ô}]'sÖ-¬È|¯Ä<¬faϪ;:ß½´eXÌ÷æ›VUÚKÌd>µW%·UX ßÏñ•êðêø^1)=‹uÐlåÊ÷ÅOÓÜVa™™9¶ô‚ïÚ…­Ìihï6¦Â²óôjÏàí¦&Këã9)}9ÃróxµQÃ$;G|¯J›c^UÌ÷ùnÁ4:&ZœúCŠÛ*^aV‘÷ÈÛr²·5·±ÞVEÞsŒoŒ×ZÑÙܘï·1,]ä=ÇÒF°À.Ò›zkB¶°R[…%a…ªÍ¤Ú9RË­çXd4ÕL˜Ð^s[ÅKgYXΤǧÉöó¯V™ƒml›h3«±ÉÁVöÌýY&ÙѬ;´]†Ul_Ûø|Ÿ¨vt#Ëû8?G²I½žÐKrÛÚÏÃjí{³© U+'’MÎ|¯Ã2,É>L¥õqÌÜV`y_îuÌD3É^m}¾N§ñý\ÔYX½ÂDF³XN˜"ïÛØc‹×ËD4öD;Gn˰Ô<¬‘¯Ðë´j¯b[c±sÊšId—§ÞbůÕÜVçhaemRSõvlaQëZSì{މŽð"^W{µµ}S[¥—[„Uü4ª2?Gj«ô*òžã˜“H2˜/azn¥¹å„ ‹°Š/êÔ&Ö8€íæm 1ßç{C“¨4ñšèZÑ´eXV,Â*ôêíè‰=Qíh[ä=ÇD'Ñr´oÎÝs[¥ae¼R©•…¸ UbX½¼ç™rd4ÙÊý~oG3¯Z3«=õèìè.ÎÔÛÑ–ùÞÏã5d[yÑß®ºÃºyXŒ×ØŽùÛ­m}剉6b»ÐW™ÓÆ™R[¥W(°bÇì"¶º…Ud4Û_ÕαqV#'ÀŽÔS€mÌjºÂ÷}|µâ5öl«õœœ‡ÕÈ ìgå=·eXjfŽÝ©ùz²‡ª¯ÀôrzVoG×ôÍÝ:½íÌȰ ß—;nÓ7ØÊõfëËm¼‡œ[„UôPM ™ÏX ·ñrEÞsœ|Œ×Z™æ¼–ã9¶´5ëaùå:zõ±!×Ú˜®Ø÷ÛáEv÷ˆWkü ÛXÞ{±«È{#ßŠå„æ6Žû~ý‡,íÏo~ ´ôd ßK¥y9'Þ³¿|÷Cz/uð–ÞP¼¥_Žÿž³ç-ê•Ïà\¤ ϧ}¾ÞÔvS±fÜúÒÒ¸©lã3SjU’Sy#8µŒZ8|0—Ê/—K‚æØüݦ´KX·Z{,•W¿Ùi._Æ”¤«H ,i¾r2,;A´f]le°|þc°ájÈ%ÐÖx÷O§\,ߺ@Ó—Á+cu ’Nù˜Ð“Úë2º””UþEùÒë)¾ðÑv(Ì¡èü¥Ð¹D;ŽSê¼u cÙú%Ì=XK8±úyô>–›ÜàwS²®Œ§Ù¥Uº_*ÁÊ |æëm®‡þ¢|¤ôé$(¦¼ñªÀ Ts°À©©t$ëƒVA˘i ÒÆ{Ya:˜QLÔÆ/m°%ã‘ÕÁPMíWetᢷYÏÂp¢$«±ëË·3Ò&šy –ÏÇŒ‰Uøž´ŽŽ^ƒHõ áK,fKyŽp½°þ¯¯_Z,Щ Lk­N7_áKhZ*Y,Áe<ðD̺.º iô„ç€rþI®s¡äqN’óUùÒ„œ/\Póß…w ë–¹c6èÌ\'3ås`Õ£¨xoc=>Q¸Î™tÿ¸%@¥ýÒgCá:#Íy h×®&Vaô1†ÂuNš‚3ÌŽ`æ¹ã.*[½Àu†3ÑEëa8†9à,¢Kñ@ä:“LÓj‚ºj`*Ð%"sð’³Üh1˜×­Â„u+6ˆÂuÊż²ZcúòJy”6ÆkY¸®ù28°ªÛàÜY³~¹¼;”rºr¶ZÜ™ëœMñðE£4íÜæ’…ë4ïâ(•ЕòôÖZ3×ågÜh;ƒ´ÙQ)~Q–ï*»‹üÕëá»' ‹àŸáŸßÔº?õçïÍßÿK$- õ&;}T[ï/E%øSX}€Oµñ ´,f{&r„í%"Ö[÷ÙJ½îeo-ÐÁcaeÊÇ(³Žˆýˆ’ ƶ#zàððTTN¤zš/"ðzð ƒMÔIÎç^xÛZelMÒ™yPûލT~m¢œwAw#Z¡”‚=Óðísäg% bþŠ#êÌ™n4"*JYG´(14ô”¤¸I¹ é°ˆ³¦ö!':dPŽcF:Ä RhŽ&ï?ónûvD˜ x]Æëû~˜~t&:eè9Ú9J°¬1Kþ-ÍÑî7G@–Êcî=,B*\Û„;IxL¨l=U…¶¶¯×Êê”Û•:¹ýˆô{hÁ‚`°%1å µíˆxüA_J˜¨½/Û#ˆ7PR °%ðŠ‚Áï7"pØ%^€ÂÉ#c³Ž@U“Ó˜hÄi¥›š„4LVC`öA1ì7¢Bh€P;!š­Š*X8Bö°:iüC»XÁÒFÀˆKœ÷[Ç€o´@^ ÐÇša¦ïA/FR3OûŽs ì %2VÍ)'¦ØoŽx®©‚LhF—ÕÀÔ@9´EZq„·$,<,½Äî”ùSî7Ç}A·¸Ä6ì§Jâ­)ƒ,Ûi «Ak$eÒTûÌq-> ¥|tÎcI§ÐíGP¾FXLø"§µÌÝ6Xz ¾Vˆ¯ • »g/ à7 F=ÌÅcþP%kÆ46@­‚r ¬[d@Sƒ‘Žt± öÊjöådG–& îØÃ÷ca p:Ðah§rOÀ´ÁÌA €æ= »ç8°KÑæQ õOô¢Ñ#?9Ÿ@ÓlQ¤^xßÈE¥1±Æ\8âž2'Â6W@7à`<×HrüLbL† ;68×É © ÄÐf‹ÆÐ:î)sX† keK°ÙÐÌ©#j0ÿúÒjëý¶­Ÿƒ­Šž펰×:¢$Pi8ÐJ  ÁBÚ *Žê^jÙ6>-1pkÌ9_÷áU´Ð(+Ð(;Œèö#¨*Ì –ÈAÙÙ*À6´ø,‡”eöë^¼Š¾¤˜†Ú#ßÅfw ¶Bïl vÉäuä¹ÒÀxhî*¹ß: ä:´f"XQùf±ð Àˆ5vt‹ h¬0h‰žæ¸—Ì¡½,`{cÊiž­ÚEªÂ$Áö5¯µ°Èw,@Cc*Sä¥÷ÕV pÀÕ• ÑÁ¤ÖݦC«?6`ƒZVm/Ø-°´5™ñTæNí'sÈ~! 󀽯B³Ž¨­î6XE\¯fõÑ3BL_`óœ}w?™3`ÄГòë]º–t iÀŠè¾‰”¡¤Î6 dà`ø?Ê [y¯9‚· (‚È‘(!E;GÐV @%á>‡ÅnÁ+ ª@³hàfÀGÜOæB„èXÍVÇ9hª³ÂZz$yí%6À1ÀÉÐÎx k¨°Ÿ@/@࢈”±w.,È7I‰›š3툰uÑ_DSyq?;…'Œä¥D[ŒÈÔV`WÁÿ4:Ùœ¬X^päÁÑ×òüîgç u­ÀG»Š’œË¶) @&S@šÖ ÂpI@™9×Qï'stî ÆQ0‰#ŒÝidÌ î,èi—½o¶.îQàØ€ZnE¹Œ÷úbl°€¥²1úžààˆƒÐê:×Òà¿Y¶ØæaWšœâ—¯Þ>;Æ(ð—FFW9.Jáÿ5·¿Ò/õo«ì^RuƒÒ!¥HJÁ…;¨®žÐsuÛ‡}\0J<¢ÒôVÿQ °¶ ð{Ž¡˜¦SÊþþòƒ˜'þf;œÂÿìðþæêþš’ÙŸ¼½ûxyv— ¬VÃ6•¨ìx*'ý­Ô×+\ÞÝœR滫ÁÝÚks>\ŸÞa‚àáÿ‡¤ü‹Ãâö?UþßžJðR±7)oݵƒ³·ÿ‘Á9‚ÀþÒAÒ Òáï‡d¤W¿’M^${+¯G`4þÑØýÿ^­RhAÖÂ;®‰H«3üÛÿW¡|#IßÏ~£Ê7joôáâ7º|c^-~cÊ7v8îÅâ7¶|ã÷ø&ìñMÜ»áH¹µ½›†Òì1–Ýc¬=è,÷ ³ {àwÏK‰Ýp”ÜÚƒÎJïñÍtV{ÐY¹=àìAgö áü¬÷àg½õƒt^ös:íÿÿ懷CRBôY ÿ4Ôê¯?]Ýpe–oAz‚rßþ|ôö5ýõ$}º“’”%^t_£©¹€WÔ-Þìžëâý¬-^âª_Ê®”Ç‘ëŽâ^‡2àfµ_‹÷/ÀðˆƒlqÀëMÊã)$ס٭ädM¿—t‰béû7“ï·Î}?l/Ïÿ¯‰xX‰xHDt<Dç#X2ñ–‚36]""*ÆF}]è¿Äs0RB%¢qì2°¥À¢kÆh ¦¿Ï`h*¼¬‚g1ÚÄ_F¯#^RÒéâJª`4žeFÉ_jìjÁȰéÂI ~kÀCZµsà}ðšÐ~ßc¦ggŒYb&3Ú0°X Üuc*µ±ƒU*µQf žˆ Ê)ÊQ5Þcrà8U»afx˜T®`¥u 㼬5±²DA2½Âr?Ê£ãPX7Æö[Ñ¼Õ ëò8[Qj؉¶ÝŠw ßE£©D`ú LÄÛÍVÄ“\u»^Xµ C ü%Þʪ›­ž—³ï‹ÕlÅ(2.ÄéV xã oU·¢Áàê–A5`‹GÛJû*ðB#Hy3»UˆuLáö”Ót¢¤ó³Ì4#×ñ{g˜o´MDÁ§ñÚ“h·"]ç±­î’´k›™  ´‰æ;Ý¥Á÷щʅ“:hÜm¸Œ¦ÝŠxÕ„v+b–T \æ|Õ*FÐv°X&}¼Uðf¼Áp¥qnñ¦[ËI`vcUØS+*ƒåµëU²·"F‘ðV‹0A7[Ô$¾_‘íV °…Þ4_âµèO/Zx+ZO°i•³U+‚Ç¢» fÝŠ Â%U°æ­èðÌ„†1§[ ¨§ë{JâËŸTÑdúýxkiàüߦW×V<¸å­ˆ=BÀ`aDR ̾fÚŠ(ý$=j åÁnð)ƒî¿„½¡ð1BY°a">&øÎ£û¬40ï’1Ik[%nðÈx¡ýR°úd–©´¥uÍ/l»½%Þ%Æu¦nE‹æ1쥱ݴ-i™Lî$d•1$¥nhÌc-(5€]Ó äÄÄ8w°Ùѹ¨0QÍ+Ø–©Ú2=`µÁƒ!<zÞk-Ý@¬¶½¿”†îÓ›ú¥‹Pô˜¨0½òøÃJ/md@^á¥mÃô Ó@#<&¯Â4'¬a´nj¢ãÆÃ“S°‹5ã{œ®0ùv‹âý† H.ïq‚Cìœ0z:4U÷Õó lÑâµjO;„±¢«4³ÂîM£xX+°€Ý;O“‚IdLc94æ¥Ç:¹ê¬¨ëžÛ/òy‡WÏ+(´t ˆùfµÒ!ŠzÕ–ê¸âåelcRú`#Ñ^¬¢¶‹¶IY àÿÀ­6 ìGà'`v=k ¢…+gJºn˜Ù5N h/pǤqì¤(Ð9x+PÙVkzŒ…7"=‰ 耇:ÎDK˜Ç¢L«6ð¯EÛÖ͉W°( r¡(̽Ck,NŠšUfÓïEÄ«tNÇYøOaEê÷xÂVˆ`(´v%^͇©·Î¬Ž 1€_”oAX$‡WoùPEH©ÊøðŒ—LB=P{l¬>Sél´Å—ž(þÁÇjø¤o±‚4ød! XÔ95ãñõ h>»—s'è)½¯“¨ñ]ÈCjì3~ŠfüðãËï^â“åßpóµÎdâ­½¶çú'ù~tØn͵>WØÀGÏ-ðç/t€¡é/Y> Qt´£¦À—pß@Vø¿¿,Ÿ×|EÀýñÍW<:ÍQ×r|,„ç9ò¼?ÑQžéüy¦óç™ÎŸg:ÿ|¦³S·íyÎ3:ñ9¸ÿåãÅÇÓ›_ŒfÏ~àÃ…ã Ɔï5vcÖ‚%ŒÒ¾w >>B/ªšµF€«çÁ 딀¯dk~;eŒ`l«9óÞx0Îc5ÂwÆ&k¾3 ˆâ½ÚÎbëTZŒ‡* ˶sDÊß9¿í—cƒG¥¸€Z¼úí»×ê°[«tÊäëhà“`¬]:Ý;ñì3ôãmãÖµ‰à­x×} Þ1,‰NwvkÀÔ•¬Áîä (‹wÿÀ+jÌÒˆõÑÀ9­«„c´&oÝ·ÁDzശœ1£¸¦uk€ûÀ/R¾ûið©Á •É*Ï?À5G£¶]àY–—næH3zôáÊ÷ë‡y \XŒã¿°’SôøD˹½¿×àäI¥öþL{ ¢^ø~Äã3 ¡2ü5F&]oŸ®l¶Ç¸!ãÉ-©ñÚ£€¥ Sç /~›Òov¶Ú€¯P÷þ\C×ràØÉèw³Ý€Fïcü­ÆÃCŠÁÖ™b¦Ûš/½Á@…õ˜Íb& ',ø¸Ìë]îŒ+ñpþûç#Ì%ÊZÛ‹;|´ïñÊæHEp uû%0O _MOá„¢pÇ<&¿E½êäЫ±ÂG͘7@Ž‚‰œcLªT婉C\û/•p΂ÐlÂ+àfbÒmm÷%…”ð™tsÄæ¸¸˜º“X˜mƒdS#‡¼Ãã$pÍ;9„JëÒcÎ"‡4ÌHëàl'‡"8Ö&j9„n¼éVF…‡ÎÍìcÌÚp¢\X™ñ÷jt-λä–òÝ\’s§é¨¯ö—sH­°(ÇrU½±ãÄèq@ÙÛtwßI·”Ô ™F§çä¶J»æ¸v§’mïïñQ(Ò=åeˆ¡;h–0šÇ“Â¸}ˇÀ?«ùÓЕq‘æ3rH LF¶ðýXaÆYR§•CJi<“ò¾—CßHéÖ:Ä|^ƒê99„JÞ9ô¼“CÏÇrH[I {¤É!ï$æk©a:|ðŒ¡¶0’X˜ÜÃé`Û[7ß4;¯»C €é°\:V(róUû$Ì«=„ɤ”uÙÊ!²‡¥ïÎ,Aá9I íQ¿F¬0ØÊ!å,=M¥|V,‡0ë¹`ø1¥1ÄÏ/AÁ™é>ÆÌÀÊ ¹·k€Dß_‰ƒ“íß"·À¸ñá«¢ãqAîÊAVéÐ[£Ú8PÒð`¬k¾{È f°œÊ ÌG ×ðÒÃr(£x“ö¬¿–Ë»¿›©Â|­2Êʱ”‘Ôá} N•~À.t}«¥ üŠgâqöB,©Ç ~ûÚCVbˆi÷OåLTßIØR˜Eè^aº)L1ÿåT¹|Gà÷Ë¡|²šåP:\•u"˜lR¡$¿¬/x„ÞY5ˆ"Öq2¹;­™úôZs¨13ˆ©º/Aˆyãm¾f–ò©ÂzâE;Ñ®1á*VA„n¡W=ô2À"¶Ìÿæúˆðm;r Á)ÙÒ—ùtß…€f“Õe¦t ÚaæîtÌ1°§‚1­ ‡ç¿˜`$nùpÏØ öù.ÔfØ]à"Ìrà©Ü=Z+bGy|Œ—ðË&Ða¢r&txâ]#˜RIfÃ[E˜³;=Ô.‚Ä6øg*Z ©ìk²i|ÑÂÉИŠVÌ̤ъ©LÜþ¢Uã>7¿Aã5ÔfuvßêB ¶§èà _ËN]ZA))ewN­ÐAY[‡¯œÀq˜=g ˜ K-9ís—'¥Öf’.CÚ%NxÚߦ{‘˜v©áI ŽœDúŽ®’b‚3º˜ÀÁ±óú6ø† Ï@&Tn\“‹`ðê J˜9c—~IÑO¿W‰±-üöû!zÔÔ#%[ÅäxQ÷W 0'¾Šnù ¼LP)`ÐI„<½5Ž*`‰¯ÆJ•ÂÔ{ ˜g¥°Z õç óOò5ÿKùË››«÷7§Ÿ†›ûË˗?Þ}I~}zszq±½¾ór}}su¶½½Ý¦×ÎópÒÏÏW7ÿ‰P®.‡ÓáìêÓ'øËùÇ›íÙÝh´þç_¾Ú¼öˆOÿ†ŸÕ°üóúøð`@µ‹OÆŽñÉøÁw‡?|—Îè¸^Ç/×mÏ“áðÅë“g¯ ékO`‘ã§<Ü'o_ž ¯žâ¯ÇoxCÇÚ«ÕÑéýííÇÓËjƒ|‹¶ÉÕOÃõÍÇOï>~ÞïË7·¶·uŒÍf*S‡å?Ý_žÝ}¼º¼m{r¦Íìv7†BcbÜ#a<!÷°x]áÅÇ÷¶·wÃéåûû‹Ó›áÓV÷ŸfÇÀó×áûÓ_>~‚Ê0‘«·×°Qf{„U5âÞÿnJZc%¥qö7RRëÚŸÞÿ²ž£&!Ðìù”4¿•’R­ŽOáDì”Izw5·ÈÔ¯]®^^ÞmA¤]ü?ì]moÛH’þ®_Aà0€³;Ò°_Ød·8¶ì›±Û“ÉÞb?(2 #K½$“ùõWO5_ŠdÛÉeçn¿¬GâÓÅb=ÕÝÕM²ŠÆ°ù/³erØÑÕD/üÕŠꎣäjU&Ó%R[ÒgQµÄXwëUI-¶wå#ݬ¯wíܶhÔÚßoËÝýýzÙUê–®]9Ê1¢‹× ëóÃ~¼~ÿ¾§ÓíÉaß n§Ñ®ïæÛ²äaýa¶ß.~^‘Ôðª“ÕÛän¶ŸÅÀM a"g_† çÖ»ò“£$<öf©ÌŸ%š“^QcdPLCCšÝË}¹}X¬fìtt·ø°Z¼_Ìg´öÂRS–:JN¶eÛö‰ È*74UÁk¾Ðþ ½V Z¬jœ²µ¦ë‡Ía î?­ pWþõ½– ršr÷Ëgê24·nÖ»E}¥ à͸&¹i1Ý’ó¬>ìhй]ïÉùʳå!h¿x(a7,gs( µùa³„= ]¥¬»Ju˜¤ZŒr™““ü…XŸ¸ïÈXóûO³íþ÷ZÔcúÕâL*µ"›Wâ23Ñ$î¶±ä¶Ü–»…èÏR`-.5JŠSµ8¤øî)ƒ¿‰^,-ýââÜÄB;êâåWè׈ ^]‹Kqôí»ÿÛ°0|nîil¹[Zµñ` Âm»Ÿ?.œûwÀû¥ëúcãÅ'#Þðá¸÷æäì?sGàˆÎ€àôöâòü¦{äåìa±Ü¯Wô<Ç,±¢®ø99«"ê<øüXîï×bV #žÝQܽ£±kúÛüžb•²×®ùY6{ýb ³ÐŸä—Ùf3cyÀì”$oÿÊ¿tÏÃwk-/ÜNÖÛm¹ £˜8•ü¹{žW§Ç¿ÇÈr~~LŽ´Ý’Dúùj³ïçõÏ^éžcœÝ-(àÚ%ëM#”T^ïödHÈi[Q܀˹|E“Úz»où‚Å5%ýËq[­CiáB×»]SèVÌkžpNÖ‡åúá]‚;¡ÐgØ®(ÒZ¯øL‡‡w$·¹ ¶IKÒš£\•oÊý¾š²šéýbY¶S"ý|9ëÎ “dó®œÌæs²×äxw¦Ç'úŒÈ¨4æŽÏÖó_’=žöäÏ˳ÛÏ›þ_¿<«gÉ“ûÙöƒœÒú?Lª–â³Ëýb³\Ìáí?Ê-ZÓÔ1'_ÛåôU„.Ô^²9¥ùaµk‰Æ‘¼È¹<Ì—%…ä×Í4ß)ýÑJ¹š¤xn/G¹dz?¬WKºèÕ¼LŽçsšó·Ì>ºßÅÅM2üœ\¾é ŽÇÞp³‡w/ö•ŒJ}Ó‚àb/ñ ‡ýu“Ã&)·ÛuãŸhdÉ&xþªÚ2 «˜ò·Í,Xêc9ß5gšþÚ;SÂ;Ç/3òʆìöbÐäýØ·™‰ÏCâ&ÔOË÷›¢Ê+:éQX¥f»,?Ñ6¾žmîw-‰0ÛåuŸî¯7Wcvîù’, ]_J¸ÚÎÔÑî~¨ÍM„¡k;§ÈOÍ^•iª¼¹_¼ßËHšá·ˆf¡ÅŽbØaûó¢EÍ v×·4¦Àpƒ "Žs‹évÛ9MRÅ\Ôì¿Kˆ}?lzÚUG†Þ“¹æ±§ôS¾œ³zõŠeÜ]5|ÖºŒÐ+¯¼“½æ´:Íц2¼øN"Í@›-V¢Ùý…K r³Å*Ò¬î Qã¡™°h¦Â~)™hF!êïãëÅ|-mÑùÞ'íטîÛòy»ÆÿÖwáÒ/äLS{!Þéˆ& ~XßU#-ܶùR79åè —7XèÇ>¹Î¿.ùvÚ¶üõP®ÚÑ:ˆäƒgt¬1 ž…hNÖçõª½^­w¯¦Y¶c+wZ¢_5 ÷zÁoªƒïíC/ýë9"‹ö÷“û’&56~毕¹X$OeVår<%Ÿÿð™âþ‹Él%­E'˜â½èrœ|-j<]N’2˜÷<Ö4ã¦WÛw Lªu¸Òžõü‰¦m»ëõ> ftÒ%›ãí“íxšÊY£¹JáöõdYµË)9]Ì> P[ü>“ëê5Y|9ÛT+Ô磛,vû¤\X¯Æ=/©¶Êð¸"Áb-^ò½Ü»Þ‰â “p/Öa 8j½j•Z vý“VäÚ`C‚ß•Ëõ§j'ªÙˆBôÕrNýv¿=̛ݔ_x…i»^ïw}-µZrôÄëØUYÞŶ݆WèÃ>’ÏîâòâöâøUrþÓôææyòãÕõôøôì9]ÚŽ ;~×ê]‰Ñr[ÎÈfÛõ‘Ï£qâäûO£‹Õ†úåy¹¦€˜bUb{~O–š(h'§ýP8ú°^ß=«àí=ú>¾=R5€ZŸð^oÀ~y'¥°ü~]ùYîèf~ÿ°¸Û?{du¹þ8°cÁäôêrÊ[Qfbª¨¯39­®’óë‹Óä?}® ï«ñ”ŠÂÊÍ£a ¦ô]8‡EfÎÑ5 ö³ZÕd•jãuEë Ë+4z·>l“傾6ÃXg4j‡|ΛsÓUŽg;ì:óã6´Ôå×3Ã.î—ÚÞ->.ê==Ü¥C‚hÚ¶å]àÑueÒ°Ó }w…CxGSH"Ãøºj†ti²Á§Š¯ØRƒ–µnÑO½:Ò(NtLs ‚«¶mu }c1‘–x•=ÒRê‹æ³ð lió‘–Õm•Çω¬cižá9%ûݳˆˆþîƒDho'^‘<ıä]€¨.•þu0“#¤.žQé2ï¨Qi‘šID¤ŠDÔáôn3ã°åoûî^€°…Ví¿'Aþä>™]¾^¿çý½üc ¨ ˜OšãðÎYpT§Ll6çEÂÅm5CÜô^„ÒÎøT1jý9-—ûÙ¸ OÉãÓ×áß×?Þ4ÿþûÙ÷¯ÿÐò¦?¥ý Õ¤y5‹az±¢Ñ›lÀûBÕ­‡÷˜•C<ö§X)éFÔmáΠŇa-¾©W@_h|]ޝ)$©CÜÈÅ¡'[=¬?òíFZ¶,ÅRšÛµæëX¯g;Äß•åÖû¾9ƒ1Iƒå™Rkù¥;<¡ÓûŠŠça…i‡ÿRHs\eÀ71hõõ4CªŽB @êBîi®Q·¤*7_4êäõ¿|£"WvÔ]QHß׈Âã©5X7BÛêìH^añÈ—é‰Ê¤(ÓšiÍÿL#ÞÚŽ(Û…º­(NXQ‰j´ÒMýyÝ^ VüYO+<Ùj•5çUfh5å;¢"^Ø,àæ¼òĉ;•óvM:t}ú…æ¸f½Ów{šß¸ûüpyMÿGóˆ×üs7~XH´cÝütr2½‰ídr›§„ ÇŸ\]¾™^ŸOO“º4½«*Ó?%ä›.gTmŠ'4ÐÂ|︟€Ñ÷ù·DÖîçþ #kkì¿#ë?>²ÖÅ»ÿÉÈZgEFãFâÿU‘µúæÈZý¯"k=É¿9²–ú¶ÈÚ¢tÛÿsd¯ßYëŒÒLÓŸoŒ¬ ”0âà<ýÖȺÈ'ÚpXlý·EÖÊ#G‰(&.ÿ¦ÈZ‘ê{<»_dôµa¾9²6Å÷?YŸ5;oÑpüÔLÂ&Y8¾ÑŸ‰|B‰.=tæj÷—ä¾=©7tŸ‘$m¸’鼩µÆ/åÌ¡ 1ñˆAœS£×Ûòãb}Ø5×IëG¤Ô -f|át‘úáVáèöêöøÏÊØ†:ÿÛQõÓN€ü¼>‰šRï“©èãB¨|äµÉ“ò ¶æ6dTêhÏG‘»¬ÌîMÕŽÌ$K½2xú;Ï ³¾ ¼˜7úµªYOî¦2åñ¦Š3F[[ W%…†P­ócÔÊɽÆ{–HëM¡¨”£U–ៃ‡¨“˜4å 8)åºWU¨Bû‰+èÚX7‹-zÃ\ìõšú÷‘†ˆVC—X²ÒX»WêðÚöÄà-2ˆþëbUî…µ¤˜媑IÙØ<ëÙ½Ð9µq|¡•‚áÓžKà£'œŠX;»g·K¹<:^nîgϾnœçUwÁË`.mÝš½(÷6_Õˆ}7r&Ù¯h1¤D£éÑÛÎišFcUØIN~ùL£f|k"jtoÄt ›í5ÒÐv½í·ªÏä‘bÕœ,ÊÊ3õ;èHFÔ—'ÓÁq ¤_Í(è˜FoA…Q‚tDÆm¾iÕÞ6cmê8Œ_žgA?¿×ϵҪÏ!Å2îÚ¸Gåµ ^:?&ˆ3QjÀû‚²Z¯Åo”5‚øI²¾ æÎ™T MÉ—u—-Xƒ$·/§Éù‹Ÿ“³‹WÓäçã›ä§×§Ç·´ú9zì–ʳd¸cQ§ÓË›‹Û¿}­¨Ýüýf²Ø<*/Œù_+®\ aƒyâêúÅæ–y1íoUO¼¼¢S_œ´zL¦÷N0=*ß<ã-¼Û£Ù´Ü)ZBã%×ðU¡ 6rú¤íœ ˜<ÚLðêb^T=Š:Ò$56¼Ò¤{`Kƒ¸µ¼}Á`í=^XòIý>ÖlêTá˜Æƒ¤~•sÖu*å l‹ã3ëqœ;;XbLcÓ„F› †‹‚óºs.‚y¬ŒrÕKçcS8¤0 /±q°5° jø8E=m 6)ÛY¥qpˆ:€‘é¹~¿³ƃÖ™Z Û‰wŠéV}8«ÊðÕà4€û *ÎHbnÀˆ),[Cõ¬ÀÚuÁáû 2˜ÂB‚]ÎImUŸÁ ¬:j8À9KRîSðÀ¸ñ ì<`0EÙì\Iɨþ°0È`—e°aÉºÇ ù$Šä¶ö: ì&™Wü2ŸÖ}0F¾_Wצ Í! _ 61°³uIõ12½új(Ð6Öià ¾3¡[é¬Fn:mÃuLƒŒ­L§] œªúØæA<v®È´£ ƒ‹(XÕ¥AØT`[ï¤&u¬†I‡`$ÄO] 6XDyÎ2n ŒÒ%Œt 0¨ÐÓL pŠÒØè¦*<ƒQ‰àƒ˜a­²uº\r»‰Ñ¡šƒØIöZ‚©£1xÀ '¹²Yڀɟ1Œ<`³»gMÉy€ñ^1ƒ XN5H« ƃ5 LK+ÀÛIØæ0ˆì¿y(«Àx!6b 28µ^‚QBàƒ(‹@ÿ5¾A+õL…iÂX+§˜ÆîVvÀ Àªhéf°bRì€AdkÀˆd<“ºõÁ(Ãe˜¦ ö 6~œQDÜ^ vÃXÇ…z`£²Øå¬mo“7`”¿j:Ö(%ÀVeA²‚iRÐu=L±4}R ÓX.Áô‰Ãõ>u¼”VØEÁmô0Òk28Â`šÕL@š¼ Þ" õ|ç3FÕ?GL¹ò—çN³#ùƒ(­èŒ»,e;ûƒ\PÃI°³•0Hd{+%#-ƒc R`¤5” ‹tcÐâu N‹°îö1‘¢¯Uƒéi01htž+¦A&HŽ1hR/œù_*;Ç$-Rv08Æ BY6ac!”Õ€µqR2218Æ`ZHR ËpŸÁ$¤Ák’9ñË-a=¨Ò>ƒü¦5©\°ÑÜSB%’É–%ØU:÷ä‡´Ñ Õ[ÜgÁ(Â)ÁžWm*í3ȯ=ëÔIp™«´Ï`RùF.Áž'M•öLº«í°\Ç•‡‚P¾¬¦ˆª ¨xë5ãèK©>ƒ ÎŒ‘’³”F¥b f¾Ù“a°Ó*€c æÎ‹ Ô\o‘Á1i=ཫ‚c$¥b Ö8-À×°#©ƒÈ)Õ¨F~¥b Ò8è$˜c©€çŠc$¥" ’“ç…óC`aüÖ+i šq™naìit3È ‹ü àƒÔ¹sáÏ‹²Î: *h¥^‚½ àƒH{鵓ËrOÑg|`š»ƒ5" âÑ]AŠ¡°Ç¤ Ž0¨(ŽvFåÀ Ž0ˆû¸íÜM`•¹`ºƒYnR+À´†ek˜ƒ˜÷ ¶žƒ@eb :Tú`Z?±5LŒAŠE”Óʾab z[Ã'Ãj"¨cÐ;­­£ðƒ# jš®Ú9%Á£•Qϯ \ Œs Ž0ˆÂë $žÇgaPÞ 0Ê-38 ¦u¶ÐÙÑl:¬0ˆÏF 0R?38 *^ç™g®GÔVkK°çM'e# jZÄ©sAK GÔ™3^ªáÉ: Ž1蔈d’ã÷cü¹7 Pñ‚WÙƒ¹ÉÚ¸9ò¶¡²1sß»°Õ©lŒÁ"KÅÜ­!Þ`WYŒAòõ6æ'0ò38Æ W*•j &ƒc "«d;ÖáÙÀ )!\´˜À¿a f“`Ë[*‹0h9`dÆep„AC¾ØQƒDAçƒBSFG4šÆ+©s‘…n•EDj@#Õ Ù™ßE4ºà'›°7aäw1,m‡õ(.Â.ê" d5Œg-Ž1Hƒ·p~¥Ž1ˆJZ€iþ :ÇÌPS€é ¸ºƒõik,ß*ØÎ.Æ`Žt“¬|˜S\ŒAš•kB5c[A¹gy˜óƒ…ƒ Àžw{TaÐrkö)ïª< Åº \®*ÌÝy„Arý¼u~…:ˆ¼ ®òƒØ̤ä¢òº< ¥xª {Pû3 Ua–°Â7¦ø’Ám›`Ün^7Ø“8OU»ô 0Í™Ámn›"Ú ö)ß´Uƒ=™„Ë:i+™ÃKE{2 ou«ÁÆ…n5Ø“a0EjJ€­ã½ìÉ$!»}!Áät<µ ödìla%¸‹ÇÁž ÀʪvNQxÀ.̃ƒ=€QC¯eÐâ¹vÑÁž ÀF‰”¨ÈCT0Ø“a0•’‘;šÁ3ZÄ´»jØ7aQ3Ø“8S¾ržzëÁÁž ƒ½¶Z€µ ±Áž À뤮 0Y»Õ`O`N–,ÀNñÝ5Ø“apQçGĬ1Ø“¸@­VF=ÇôFµQB-La]°(Ø¥!TìÉ$\ªÁ-À(¹ÌàƒÎX×î×áZêÁÖƒ=€-k^€©ã8GtEXp=¹ŒÁirRíâõÞ5wXÛ“q¹÷ÂEo¨ s„AR¤™Éƒ/þ§µëû®ã¶Ñïú+æœnÏ&ݵ:üMæœ}pe9u×¶\Ûm“¾ÉÖ£­,éèJmÜ¿~ñ3C΀¼ŽÛè!Ï`x9 AÀc[áÈÏAÝÂdÉÙ™šØ³~Ö-L&(1ªˆÉøÎ¬kHbuÝd\&nH%LʤxXÌÝÂd°óT€2Íá-‰‰ ¤ú‹’ÑlB27Z˜ M W^Í¥a™Ï-L†K©ŠØeôR·0òRª?0¹Ìº&BÊ,ÍÄÈ‚ÍH na2¨j¥SMœapÝÂd¨áê–QꎉŒä¥T¬C¥©[nH0’[ZtÖ$AÆ t “Aâ¢E5£ñÜ&ƒ ¨¢‘ˆ8d+W·0™hƒ*ŠQx™¸!Áè€$UÄ {^ nH0¢æp¬ˆi9Î-7$Rk+bòay<·0™Ç«îêÌç&ƒ ¸â®£[˜ ™å®,ôÚøç!ÚÂd0©Šƒâé[˜LâTë1©/Ï-L†\r_MX‹ŒðÜ&ƒzßÅ£×!ô™¸!AZbÙÖÑØkc']·0™„*+bŸG] “Iäy´G{@Ý™ &,e©"Všƒu “I>êjÔyr‰ò´ja2äh¨âj ’¡[˜LâÒ4 qà –˜ o覲vk¬ƒì¤k‰É(„¹XGÍ£–˜ ˆSt¥´h‚i T¨PTa2D¬B^&$&£0|mqjˆØ$›û,$ˆc±²‘ˆ˜ô$‰É(ìâU€¤N(r ™XH9RÍ „ëä$1å—è,®~¤²U 1{S S–6‰É(@Ê.Œ±ŸL‰É`³ßÆ‚ª…ýaæ³Äd82 ÚäqäÝ-1¤"Rª¬)D={@Zb2\ë`,Éhò€²Þ˜ ˆ­+ D¬ÍÔç†ÉN.±= &(÷¹!AÕ‰©"ŽžwÿµÄd¸… 5qšûÜ ­¾Õvƒ¡hÌݘ ˆ©¸aPÙ‹g·Äd@œb1‰Xå-1”c zÕ2yˬ–˜ŒBqLmcE̺Ä ¢ôc¨ûÃÔrC‚d\ºâ ˜€íSŠÄd@L½H5qÈ£Nb2 &Û$TÄÔåÜ–-WcEc“+å>7$Èu—tmÊB‘˜ ¬v£ÊF†ŽÈ¶¨‘˜ ˆmò51DÊÄ Æ`«ˆ2×Óçn4$Hf¹©ZÆ*Êp–‘˜ ö‡hjÖÄ!¯ÝFb2 v®8éDó¦­‘˜ŒB)ÎX±N£¼Q‰É(@±˜ÄDl4ûÝFb2 Åèê–¡Ý™¸!ÁdPÉ»"! Ädp˜—œ9SÇšh$&ƒ¢F¦œ@©å'â†IÖ*ÔÄSL ‘˜ ‚eµ*úÙá\cV擱©” ˆóI#1Äd[] N‡ØžEb$&£„ÑTÄ:ïԉɀ¸ÞòqŽÀ1“ÑpÿUÙò€†LîsC‚ÑguËaÌ&„Äd4b¨*HÙ£è8;Fb2 ®÷=ð€é$a§‚ªyÈúÀ†ÉN®4’ç#,n‰É 2}¨,F }Þ7“áó6ºx@DSH“¢O57³d#Pb2L\”±òLÜ i»jÙ›,A‰Éh ȺbÁÍ}nH~®œá¼eö0qC‚ðÙÊ´"bëóà—˜Œf¬ €!É–C&nHkËÚíÇì3qK‚‰LsW“ÏÄ“ѰŸ|5­Ž^²’‘˜ G0W;5DL$ë:‰É€˜¸Qw*˜‰$×8èÞ¡ÊK›Äd4μ…ê=ŠCó´’˜LëE?1¾™¸!A”ž.ȉÌ’ *‰ÉhÄœTž&“”»Ñ f`à<¶°ó•˜ Ò|Q¯uEìS6!$&“h´¡Cógc[b2l?•Ãà Öùн‘˜ SÓ±nÙMsPb2šÏC*WOfÄd4ž©ñKÄQgãDb2 ަ Û ž,s‰ÉhÄ„¥âM p>Pf$&£¿Qç€8VÞO1“Ñä¤Û À þ96ÞHLÄÑ”  ùsŸ%&ƒXZ=RElr ‘˜ŒÆˆL¶&&»!1øPR€©®sË ’‘㊠Ø’ÍÄ zc9ƒ€ÜPH‚â†I€U\At?7$HÎ5ž®8ôÅHL†ˆõ¨ÊÖj°1â!*1c­‰#eFb2DL>y1‰ØÌg+1"öc(v]ÀÉD¶ ¬Äd@ìU56"p7$pŒÞTÄV›LÜ`ÀQžºå˜ÝR+1^׫Œ€p÷© Â/VÓš’‰DxC56<ôFb↣b¤·"Ž|ÐÉJLgWb=S< Ñ”ùÜ`tÆ. aà×JL†ë®ëb}qÌá Vb2°r°¶-ÄÐϬù­Äd°¦«#'!ÁkSLÜ -)PFÄÆq\•˜ ÓÒ]Ì"öZçlH0™± þ'â`xÈJLÄÄØºå„# nH0¹  Î@sŸL¤eŠƒ5Æž¦•˜ ‹õ…ät9ƒŠ•˜ “HŠ]‡„—–Ãu¬Äd €F_NrEÀ@h%&b?¨3ÂõÔ¹e!A"ÖÁ”Èê¨ç\Vb2 N¶¦MŠÄd Š›V Sd…»!$ˆP]¡ñ7xi³“ág¡ þˆØž¬ $&CÄIU绣Ú“‰…AlÓŠXgHÙJLÆ` :åGÄ.ï¤[‰É 8Usˆá¦2qC‚ ‰y‹P²â±¸%&Ã_iQ"y3ÑJLHP«äÁž»Ñ k½&ÎcCb2È”êª ^¤<qµ“q}’ Ć—6+1ÃG{Šõã±µlÆ[‰É15\"öÚò”˜ ytŒ:-ÄdªY?KL†ˆi©.ÆIâ£0,n‰É1Ý-c#e¯ÍJLÄÁËĉ­ÄdÏ!ycEìtÊ-7$HÖ¬/ú9éycÎJL†Ãbü);.LÜ EHàXÇhr7¤©LˆD6’b›ßJLÆ VÉ-š³Í.ž•˜ *_ ÌÀBìPS57$H:Æë ÄÓj%1ƒ³…¡Ä1&O.~fÄd \ê¤Í»ÒVb2 ®„„¸‚¬ù%&ƒà”ÆÂç@f<{šVb2‚+†+ÛÉ*˜ ˆµ.(1ˆs¤“•˜Œ¡¥ºÊùƒŠaC+1ÀÁ€ˆSÌB‘˜Œ9æ]"”„(8î†Äd@J†+5Žœ¡‰ôÉùG±Ë¸¨•˜ ˆ}X¢ ™8À±“1œÓiY4iJs½7$Hc=-– ˆµžºÑ Ny¹BìH‹æÁ/1ƒ)g—¨{ó'€¸!Á„4cåagBb2 ¦a+bmó@’˜ŒA*_}`äBÀL,$ˆô³ˆ^ªˆÓ¤ $&CKµ&%ºˆ[iì¤ó¨“˜ N˜¤²ë¡”ålL,$h±¡o—p…ÀcÃø³•˜ ˆC .ñÒg!Aø]ȳÓÚm²#&1‹™bmiÇróš"1 ïX/±j 6¡²“A&)ìTÄ)'ù±“±¬­ª>#š%wCb2œ Ø- =ˆSN`%&c±w8ºÂgò&Æ<»%&cu_Žå‚ØXʬÄdÈ~2¾Ä™£š“˙ĬÄd,'»[–6eËgÖILAÉÚ/ÁKÊÄãhSþ@!A‡¸85 æÈ[ :Øu±Œ:“°1›¹!$è èM¬‰ÓÈ™¬ÄdÇ8ê+ 7!ÁL,$èpäÀ­ˆ]>åg%&ƒ,¦„ù)K˜ó¸Z‰Éà\“Ò Ô©°9î²#&1ràiq*³Û£Wö&$&É~v%ÝŠF6¿œmÕJLÄiÉãÊÄ b!Áˆýûr¦†æ9ù°Ù$–˜ ˆ}9)bråylHLáΩdÓH„èÙTs“‰@(ʆ‘棬ëœÄd"†ï¨J7`öN- FìÔøXZ&}–x 9‰ÉDd±)!d/ÑepÏIL†ÔDÐE}iƒóv|¶Ô Ll¥åxYÈøÀGX&ÞJlUU,ˆ©™x+A0£—З°µÎî’˜ Û"A&6o%bFÊbÀÆÏï&â˜Êé'Ín©˜Œæ­%õŸ#ë‹£²A¼• Û”VÄ(s“ÁᨺY1úÇØ®s“ÑìøE™ûŒçÍ'0àCX0óè#™6ì¤;É€›\v!FÔý˜?p+ARÇ#ŒevÇ>«Üç­VNÆÉ‚óÇ`pú0 e+AçiíNK~QR!xÉJÆ LĤëæè,"NˆÎ¢Q×,´ö¥5¥òKË?=þìO_¯Î^ýé9—·¿|üüû7ÏÞÈòO?ï—Úåm=:Z~ìñÛ³ÏN†“ß?~ým#GùLŽ ÷œŽç­þ,gÊß9W¤#-³‰×7·9køÉ|“VQ2Érvð—ËMC.¾ËYÀJœ3)gûþý0ýºBɈ”³z—›ä+—³w—›Ø3ó9Kwõë:³qJáÖæ¬Û…Ráè}ή]Q";P΢]:ÃÕ.gË^^G…§rVìåu BŸ³_W_D{ÌY®ËÍ0N?ëΓb²9kuÍ:ËL¦‘[±Î'sêëTÊÙ¦kÖÑÔËY¥%ë´]±Î»1g‰^±.·éW¬Sù×Êu4rvçšuÖŒ9‹saA%Šœ­¹f] 6ge®Y—¸ÌœÑ+ÖâÒ›‡¨ƒ F—ïQQáîÃ.á\ €þº3¤1U^Ÿ>ùÓÉé“aNìÿ™9SO̹M.iÔsz¢ýæÎ4ÓoÿY“ãä»ååÛ|^Œ³™ñLþӚܓßiÃüðÓúa &?=¼ø§®ò*Á‘¡ÓqÌIˆs)¿‹Ÿþ¹&w(©2?ü´}˜’IË›ú“®ÒÈ jyøiý¦Ïgh˜5ëȯ | naÝ|§É:¤ª ¿d\XÇ©–ÆŠ;?­ÉÓèÉhn²ûŽä>¥&ëÆìÂÖñG¶É:<$g45YÇÍÒ‹5ëxmÒãØd?TЧn‡uÀ÷›;}Ö1º¶b}åÖ9ÕgÕíQ—Y‡Ù°a>ĺxˆu¾Ï:•Ò!Öáã°ZmY§°¼uùN“upCÌŠuØæÀfF“u8K,h:œÒ ¤%{¬#7 caB–§ö„e%nµí±»¶Ç:r˜|챎!‡Ãš¾e2ÂÚoîtFÆ1rWXgd½íŒº1pVÙzç;½Ù@î–ÞjÇÎRÏ(GqÕ^ã1Uè¡ê².ð>H5\²cWÁ‘öˆ]–e豸|è±nÄ)¼£ £ˆµ4¨±¶,ç;}Ç;ì·+yÛîZªC ;LÄ`PÛƒO›î7wºý ¡6Û¦µ´=˜_zì*Þ‘†„–íÇà×¶G¾Ó_ãùlÿª_:ZRw'] ñ¬–s¥ìÖ¹RmíÁΟ¾_9Wºoæj˜rÝÁ‡Ð]ã›ÎUq(ZÎÕx` ¤¾öÐcr½)@ÎBFýΟ0Ùoîô+NJ¶v®ìçJ©¢áµwµœ+?lœ+Õ÷K96œ+Ý’&窫=ȹ‚>gl´á\áÔÓÚ¹¢;}ç aºkç*v08v®H}t+²«luä§±Z;W.õXGΕé£!±ØÊ-窃ÁMfH<ÊrCÁqfºýæÎçÊ«aë\õ&ìçœ+ïÎ vùâLõûÍÎUØô‹V›ƒÎU߉¡i4e½é\)á\©>¿8’x½ xÓë9Wà;ÀLݲ=È•âH¦ýæÎçJ­lr®ÈÚî;W:n:W]T‹œ+lé®+{ȹê‚ä\¹.–JjªB ¥sÛC·lr¥øÅ~sçsµjä\©þPK®k{À¹ÂPóM‘ZÎ6³ßÜé;W¼-¼r®ŒêùˉTMwjF„•váq¤ö²‘:ÕÕjä\ÌL®¥ã Ò@°¥Õà,è¦y¤8žmã\…¾9Ùr®|ßlC´äç ‹#oŽIç*rmýæNß¹B޼s•ÚZ ‚éA ì\¹ØPIçGá\˜¥N§¾¿Œ´Cœ«ñ€s• ýt =¢‘Àšt¿¹Ów®¼]͆”‚6m¬ÓÖ¶×xv®ÔbL´œ+³F\2±kYޱb€`@ ¾smw6ŒäÐù£¼Ñ*«‘‹€í7wú No×R’w×Y@v¶KŸ+X-¦g{¸qk{¸¾â q  b‡¤ï\•mŽ–s…uÆ4¡„œÇse;û’Ù¹ [§OœÝØ·=pT͵#R>(Òyix~vú—'Ͼ$"峿ÔÙ-?šêgÅ£à§ëpXF‡£@!yVWq&*˜¸ˆ8u²CÚÊÒq…¾Ø6ð‘ÇTÔ„ÊÑÞ@Dzš1u |$º F—77q&UÊšë¿m/Î[øjä;« é8\µþ!X¢Þ§Ú˜1ºj·l,AzªïÞÛu°„"®»÷Š•¶k:`¼ Ðh.˜L#X‚'@+Ό҂uœqb]ذÎvf]Á‹[¬[øë\¬ëú Ÿa]H]P ¬ë¬Ô.Ã.2Îǽ±ËPX7ßé¬#4ÞÊ`E ]Û}Cêm3†®ÁJκëm¤ isZ¬ä»iÛ5X“N'ݲŽô©îyä  sÏ#'µ›ceœ 9ç\ÚoîôÜ$e8Uaq“<´_w#%’}ÖÛƒÒÊ؃"38¬ PƒX‰®›pZ¯Ç:ú.ëÈÒuc7ºÉ' q&5\r«QÇw:¬CíkÖ‘;îtÌà$õmÛùU½îÇÔyN\±N“'»1už €.äÆºß°Îm»ÑMYœzq&c\CŽùNÏ쇥¾Þd§ùÚǬë&!cúÕŒ3IùÀÙ~s§×/]Çsx[¢n’UÝ=(mrDO3΄FwÜð wºüò\$qůÔ1(UÖu“&{W"œu$ÖñBóîP\°¥V¼4'zýŠÔ+Ý‹ÄÜÕœ¨¾švL†–ЦUw ø±‚Æ6S€’®öPäùBÞÍ82¢¸Êó~s§;Ô¸$éJ¤Î˜þ@6öî æ¹fœ 0Ø­HC?Î$EÎ"Z‹4V­[­æÉ éõ ¹6uׂ ¤NôZ¤1öƒçuwÖ=Êcv×R”Véi5òŸ`Ÿ7ãLH€› ž|§?K‘çg‹Ô ypÌ`x¦g‰.ã´ßÜé®ñž“`×k¼í¡îœ‘Ûuv°ñлþBe=ç!\­ñ –"Õ•Ë"Öx¸¡ý5^«îNq!µãLØŽDÒÒµeéMo§›ƒ*Ö¬CÊÕE‘IK§º< ®Qn5Ÿ«Öx;¡Ë:Gú¿Ë:ê`l»‚DkUèn›‘a¡Fœ xˆ]OX£¶ 9Wu@$” 釶MÄΕŽ=­–hj–½ö†sWÚΕéz‰Ü”®‡€ja½P+8W©,犣ÔdœÉäJ%á\uãLȹJ~­xiuíÅ™s¥bÏ¥gçªg‚=¥q£xM[‘ÄØ ѱÁTG¤s¥»Š×gдg2¹RV8WýMöÄÅa×ÎUGñ²se;£Î©Ã®Bka\@Ž=à\™~¿K´Kù2ñs…¿NœÉ­Û:WKì-q΄µsú;²ä\u÷zȹ‚֎3I9 Ð~s§ï\y¿Þë!çª:ćݖƒíÅ™ ØSo«þBEΕP¼åp \H¹ˆøfMÚˆ3ùWœ+Žë\9Wª»—ˆü?¶c*‡¨á\¹%Nzí€seTW{s5vµ9Wº7à\aAkÆ™°+¥„sÕ B³ïŒîûñ¶øµ”ƒcq&“+e…sÕ›¤õV¤Quýe²µƒëM”.ë‡-“SãZ¤1„>Ú–¬ï®¥HcÙÃxÙ¹êÒ€ÄlÆ™ &-mEªRW¤p®âV¤¦»³þYçÊ4ãL²+¥íÖ¹Ò½…Jã4¬¶ÎU7ˆŸŒ'ÓÛñ€så8W\Œjí\)NHp®lw¡úŒsñq8“ìJÕ§§æ;}ç Ux7Εïú¥¤Ä»~pKuŸuš ì­«>öìÈGêÃöd§w±g¯µí²ͪgB®” [çÊöŒrDŽºu HótìÅ™  S8Wýqȵ䆭sÕŸ¥H„ÑŸ¥#¸gò…ΕßÎÁ÷ãrêè¿Æ‚@r'ÎäpøGïáÅãïO_I”Ég~‡^zù˜¨ /®®.ÿ¶»>ÜÝì÷s*ˆÛ›Û‡«óûË›k¢ük¦|{s~5\?¼¿ÚßMÉ"èéµ³Pýy¢:ÿ´»ûÏýpÏmýýüjwý‡çåñ»›ë‹ÝEõüéúõîv»å)=FLÌôÝüYùï¯åòåòÏåòwåúécjÁø帜̆+•Nin¸Œv¾DR¥©z@¹|ÄÛ–°n°UÎH¤?%LNKC9ë‹›Ú ai¾ºœÒ«†l³![ÞVòrjÛ¨üç9ös¾, -wÍ1âri›ŠüøÌÅ|Y54ß5(*6—…G®ôHÏ™ÝV=Zîbg|JúY.KC}ùLõ¦T-5ät™.“[îV—SC¡jh®™»n(Myµ¸ZµÚ\–Ū!7ÆX7dñ'?%ó-—¥¡TKmJI¸‘Út×'¶—KC¼#1÷ÈL52Ö=òˈAt¼œRUÔ”xwÝ£ù.uÃi½¹,=Òub³GêgõÈTÒ­9ßEÛ)9au¹4d˧Ýú´å®A%;µ¹,ŸæÊ§…4 ÜÕ§é¹ôBËÕö²4´ÙSrÚÍÈžr˜æÂìòrj¨Ùº)þ¢0HT~sYzë9¥çß Èé®álq›ËÒPZ©×Ú|—u‡ß\. 1˜4uCωe7jÄÏ=ŠÆûÍeiHý{j¤4¤Wj¤5ûçó¬;ÆÍeiÈ|™‰›ËÒ]©‘Ð’šžu²Ám.KCîR#ì,Ïݘ3°oÕÈ<Á’Sq{¹4þ=5R>-~™7—¥¡Jg36Öµåîa5bÆ•QòÓô8ÕmdÝååÔÐjd«FCH6¿í¼’—SCz¥FB£¡9 '뻹œ?66äØÌnî.vwûá †âÝpÿãù5:úÝWôê£Çûÿ¦ŸxôtøšíëñØ£]õL¯ž «gæÑÉòŒœ¥q¨UqõÖ<Ãô¢}ôrz†²çôby¦LýÌ#K2â zÑU"Æ`¨ž¥å™â~üÌåô~_ÞC"Ì£êa¨"!rõ,®^Œù+Rîé¸zeઇªê ÜY¼È7é™^ÿ ­ŸÕŸ¯âè¹Q¾Kmýù°ðÌæ]Ý(òíVÏÖŸrOç‡aÍæKž¥† ¦g:¶ÅoÐñ!¨ù™mŠ_ gjÝ™üùóCÝÔü̬Å?¨ój×ÔüЯÅæ›ôl32|ý,®år£1bZ Š…¡óÈ0«a£§ÏŸž­??æ5?Ô[A-ñÜGoŸ½xöòÛ%>ûè(û’oNž÷—wßçuqþiOÿûñæáÿÿxyåf¿{?ÌÔ Äß1ýå+í ðÊœ×ðòúâòï—ÓËûí ñØûÈ¿1|¥”:Ž¿þúèèéÍû¿ Ïïï.~¸¹ûÈ^°ø1…Ìünz5£½; '7W7߉ëW±¬Ðà˜^5áXÿ}Š÷ßÜ^]Þ?zýìÑú߉÷•«ÞËûßÐGßï>Ü­|ÝuÔ)Nóû^»ò>ùÄçûKr°®ßs ;ò²7¿ªHËûÚ[~ÿ»“ÜÀ“ÝõþòþSyS~€N¸|À¶ïN=~žWš©@‘¥aþ‚ªW7÷»ëûËÕû›˜ºãÒÀ“ËóøáË ®{€B¢sÈ'ñÏ_Þ<«WQg£¼ªéÕW Þ2œÓ‚ š¿ŠNó«¤èÕg×—ü¡vûò’xy®ÍüªÒÇ^=»{w‰™õöîüz¿²ëÓ _:yöìͰ¿¹zül26½9ƒÊh¿»zÕWÖdž^ýöîòbø°»ÞÉ©Q¿Ššelç_­(?sxëgƒ{¿Y÷ýÍ÷ÃÅÍ?®‡Ûó»ó««ÝÕp{wóžzyýaâßübýé—¡–›çgž>{ùøùð†tùóÓáÕÙ³—o‡Ó—§¯¿ýž;óÈŒ–á8;¢òŠŠ_þ 4sõÅÃÙ+,(ÍHèë?½žœ½<&\óà«_*'Ùÿ÷ìõÉcHèvwGóýýùÕûiöî2ú—ûñY^à¯wÐéóIÅþ}W>㇫óûï7¿ú¯¯‡'—·7W»áÅÍGÒÀGŸOüe½þ±DNŸŸž¼}ýìdxõúìÕéë·ÏNß 'ŸŸL ù/Ý•£Õ§'et: 5ss}ôLJ󋻇Ÿÿ*¿öôH“DZöÝå–™ÏþÞüÞ·¿ûËËó–ít ›·ïvÇçïߟÝÞ?Þ?ÕNô‰>þðîG§W»÷÷wô“Ój÷ÃåÕ¡¦»íßÿp{|ÿñv3BhyxuFÚåÅÙ‹Ó—o7Ï>×óïVÿú~õ¯¿.]ǾÄÍ5­ÑïxÉ7Œ9عփâzÀvÊgÏÏFoŽ^ΛÕëüõ3äX‘ì?R‰ÜJ¯ÒPž•€tù÷óG]6†×CoծݓE®jª>àú/ЇçÈêx¸Ø _?=50õaúÕšêÉîݧÝ×+*G6œw‘4ÄÛK²ö?ìa0Õ&ûÇ›‹‡«Ýþ›£ƒæ<þæå[dÒÅúýÕÿ°Ô<oÏfÛøªVÙÛFp.öØÛ°4«ËZn„?ο>‚ry?Ù[««nÌ[êÑ¥GØœqScd{§©±oïÎ/.!JØ«ÂuÈÆ!GtiŒxˆÚ¬¹1²b55ö펆ÄýݧánwuþSÓÖ™/¹P[ý™£KógŽÇ†ëþÃÅj÷íékrï¿=}2¼<{ýâñóçßóúõö gs±>Ór}*œ<š)ôc÷$HÅöðÍõÅ~pä‘}„wô«_ýjxEÓm¿Þÿ¸#§ìþÇk›=Éqøíýîãíoïo®w¿½¹{žÿÓR4dP_I~MÃæŠÖê›ÛOUC<ªHŽ»ýýp3üÇ«¿<áß}û#àÿwónøÇù~Øý´{Oݼ ÝM]ßß+mO|øQüpy½ÿ1?¼8¿'_öíÍKRZÓ'~£ý7Ú '§oÉšTþèÿ:Ìfïh xcrysden-1.6.2/examples/FermiSurface/0000755000175000017500000000000013556022211016241 5ustar tonetonexcrysden-1.6.2/examples/FermiSurface/MgB2.bxsf.gz0000644000175000017500000000737311712736221020312 0ustar tonetone‹ʈ„BMgB2.bxsfí]Ë®·Ý×WÌ>È€ïGv‘¯,6dÀùÁA„À‹xá¬ò÷an³X=Sc\¢–¼pijN±Éz°ªÈžË»÷>~úüñÓ÷?ÑårùþËïÿúõòþ·/¿ÿó?¹lÌ5:o‚¡ËûO/¯|_¿óîÇŸ¾ûáó»¿~zùðóÇ—Ïþ….ÿå·|þ²}û×/ÿn|üÙïotñt±þöŸ¡Ë«óúçèþ[sûû†/˜ZÚ_f°Ù†ž}á†d£qùö…í¹n3•é¯ÑÇ&æËŸÝˆkÚ‰|²;‘}öe'бÙÜtä[H5%Ö°ÖÖj;œ3mö¼MÉw¢Ú¢#—bÃÕø˜L'r—®¶›vÂ;ý+\¸gœß?ó6Kmzv-5ø×Ñù«÷©Ö¯„»ÖTsÙ?±.ïë¯.¤ìî ’|„[Hm2aª¿VëÂ×\ŽÎÄXs'’÷æ11²1 ð£ØœL4(¾ÆH.å>„œª}tÎWïöÁ|á€ÍR·Ñ¥œ#È4Ua¾¶œ<á9Û.(Ÿï ’|-¥>žÒçafHŸ]tm uеÅ*;ҽÌs Ý;èNR÷‘4ã$uyÆŠ+‚o:Ñsÿ$f»6¤ZÂn³¡Y®]‡Á|GÍRo6ëJìÞ˜l7àcf¿ÑŒ9t¶ÁÖ{‚Ž|A` ©ÅöV)&ËÞ8µÇK»‘ÅlÙ‰”mЉÛ@ü(¶ÍPêÔü{L߆ڱCòvw¶y»ûEAŒ|á€ÍR·ÑyãÉ;×=J°&äî Ú£vA):î ’|-¥>ÍŒA=ÂR(*9£‘¤«äST “f,S7Lzb™j"^é~šfâH¬@È+bEhÿÎN»möö¹s×âúnd[ÎÛÅZÛ¶ÍÁ6—bŸíãnD´ž·.ñ'®m k]˻ى‚ùŽ›¥Þ<Š5±ó5—fÜ'²mÖ‹©!šË=AG> °…ÔÐL¶Odˆ![]Ë ®ÇÙC#ÒCB°1 ð£Ø7Oéó03 4£º6ÐŒ:@XÅ„s ™x¥;šq’º¤'©‡LÒcæLÈ$=f‚ÄŠåÙ6B^+ÚvØæÄ{ãdÙÐM®ìœ‹¶;à†Å‚˜ #߀ °R£ ûVÆÞÔØöÑ5ÃÞµË^KršC( ÁÆ$ÀïÄ>ƒ>šƒ>ˆ¥P5’fâ•®‘ô4^½9½¢ËÔ ÄA­OñÂ6ÀR`ô+Ö>ò „XQÛ¦·ØÛP]ûÄøà»Ôæüv×e¯>Œ£ ©IÝ?óìQ*ÍÄ+}h&^éÚ@3ê k=Q«˜h_éÎtïðÔ9¬ß̪i¦žeÒLš©g™•YŒXÐÛ^Þ¯@¨Aaä±býRLh$é*9£‘4c™ºaÒŒeê!“ô˜92I™zš©g™ÿƒ"9BevùR`Ä €sPë{Ûý ˆB^+N«8­â´ @«Xf¡ð°ƒÂèW¬_ ˆ¼!V(iæEÍ2oûÖ4óˆÍR!²m„"9ÂRÔ bÈýŠÕ•YŒsPë{ÛýŠõ…Œ¼by¬P›™¤w3gš™¤w3!Šä½m«‰«O|œ‡o€–b}o¡_PƒBÈ+bÀR`>Öof½m„»x÷+0ÂöúsP•Ùõý „@^+Ö[À U„XñŽå÷¶îâ¤x•Ùå…ŒÞ6@¿a)ò €X±ÞAaÄŠó}PÇþíÞÛ>ïWì£;ÏA=S]þûg^+ö÷Þ–}0ž¿Ðfj„ Ã`vÍú*ßßtä[Hõ.ïûªFÄä8Ò„fy®í‡g+'D#—bõ´ÿíRûPCSîly!Û·²ý»| ˜O"°Yê­˜XjäŽ ¥(”¡ûÙöƒ¡Ã¥¦õ:ò -¥Æs7W<Ùjkÿȶ-j·=gkÉ ÁÆ$À¥Ø¸/Ûul£î.¨í S÷3 ­Ÿ*ð7ÄnPO"ìQêW½Ë®óÕ¶çIɆ“…âCa_WBÊ÷I> °…TuHŸ‡™i }tuеfÔA׫PœéÞaÆ9ît'©ûHšq’º‰ °G©7½3ŽùªL³ ÛᬠŒ‹Í÷I> °…Tu43}ôd K¡ªäŒF’®’O5R1Lš±LÝ0é©e®wPñJ÷Ó4¯Pb@^+llÍÍ”‡ V›:.ó§T=WkBä µ —bÃ5›¡8ÒœëÅšfÀ¼7u,êØb"Ÿ³ æ“{”zS_yŸ[¼¼UµÃBÞ+ ®}âö¢ÇHä[HÝv]†]€ 5óf¶e)\ï‰Íö ßÂ=$¶€øQì›§ôy˜™šQ]hF@¬âÍÎfâ•îhÆIê>’fœ¤2I™3!“ô˜ +²m„¼"V˜î>ÛGuè—àKo§×’w‹ÛZÙ†„3A’O l!5^kð\Za¿Bs[Y9¯h]»ç±Õr…LÛ@ü(Vƒ>šƒ>ˆ¥P5’fâ•®‘ô4^½9½¢ËÔ ÅA¤xa`)Ö÷+ yÅúX‘Út•}—“Úúù؇jsáS*>…!V”¸(6#ŸDØ£Tš‰Wú4ÐL¼ÒµfÔA×z¢V1ѾÒéÞá©s@ØÌ*i¦žeÒLš©g™ •Ùõ±¤·½¾_PƒBÈ+bÂR¼Y#IWɤËÔ “f,S™¤ÇÌ™Iz̼ > *³ë—$V¬?µ¾·Ð¯¨A!ä±â´ŠÓ*N«´ „3³…€B¿býRä±BI3õ,ó¦woM3õ,$Û^_$ÇX €B¬@¸_P™…8ÐÛèW >òŠå±Bmf’ÞͼL43Iïf‚É—÷¶¬#Vœø8ßà,@o{}¿¢…W@ÄŠÕKQø@ØÌ8¨õ÷¶îâAܯ@Ûç –Wf1ú5(€¼!V XÀ Õõ±ãËïmcÜÅCHñ*³ë  ½íÕý „¥ÀÈ+bÅr…+Î÷Acø·|oû¼_qžƒëmXÅ™W`ÄŠý¥·íOÝzžÑ„}‘òµíIö0[n]Óש³msV¶+ø“1Ñ–ßÞ$ù‚ÀRQüþc1ùêCîïá.[Üßwt¶mvßÅÞzµfH€K±éÚ¶cûòåëöÆÿ×OjÃ.ÎìDhûÕ}tõj]Úõé@0ŸDØ£ÔmtÎöß\Í×jüþ«e{ÁöþCåjÚw¸”ûÖq$Hò }Ú<ÚîJ7€ØýoÞ~bß§kn~§÷äÝx#XÛ@üN¬o3ÙÕÁzÛá|ô¥ÛoÛVjb(ƒsæ“{”º=lSÎÔ¶Yû§œ2ûöÚ|¿®»V—ï ’|A` ©ê4>3Ó@ú<èê kͨƒ® V¡:ҽÌs Ý;èNR÷‘4ã$uyÆŠ¾.9ÚMÍÝ~5{ÿÒz-¶t¸ÚìϺ¾è‚`>‰ °G©Ûè¶wŸ®ââþ»MÕB/ÿ¦à}'Z®.–”î ’|A`¤6]µÝ9´­Pœ{ôÌç[ߟ¢ZSòB°$Àb7€î­Š‰–§$kvÂTï¹›\å-Ø@Œ|A`R·¥hNƒm¶¦Ä®¹6§Æ{YSø”å†lî ’|A` ©êhf úèÉ0–BQÉ$]%Ÿh¤j˜4c™ºaÒËDpPñJ÷Ó4¯@bB^+B/˜opµ0œoßé3”ü ¹ÎYFÄÀ6?ŠÝ6Úìø×yÚò¹Ê»ýk?ù”Ú—»!A0ŸDØ£Ô›Í3<_Ûw±Í×dÞÓ»î“Ú6>8®90A’O ìƒTŸûÊ6›Mq8À—Û¸¹¨â¬ê:•[!‚ØFàRìÄ4>3Ó@3ê kͨ„UL8š‰Wºs '©ûHšq’zÈ$=f΄LÒc&H¬XžmƒäËcE¹ýnÝP-éÒçë> qëfssÕ•ê=A’O ìƒT]ª<Üðhp¥üÝ ð…ô¡nm b`H€K±êô!ÐÌô!@,…ª‘4¯t¤çñê­éÍX¦n˜ j}Ї¶!–¡_PøÈ+ÖÇŠ¯w6ljäÛEOnL§ÐúëíÐW±‚ù$‚À¥ÒL¼Ò§fâ•® 4£º6ÐuÀ°Š7·¯tç@3í+ˆÍ¬šfêY&ͤ™z– R™Eˆ½m€~B j}^+–âÍI3í+]#iÆ2uäËÔC&é1s&d’3A Ë+³K+–ŸƒBèmcô+–× ò „XqZÅi§UZ™Y„ÂÆjy¿c)–ç±BI3õ,“fÒL=Ëɶ×É1–by !V`ܯ¨Ì"œƒBèm/ïW >ò €X¡63÷÷Þ>èfÎ43é¢v3AŠäË{ÛV+N|œ‡o`–b}o£_PƒBÈ+ÖÇ €¥@(|`lf—;(Œ{Ûwñ–߯ÀÛëÏATf1ú5(„¼!V,· €ª±âëïm¯¿‹‡‘â-¯Ì‚>zÛý „¥@È+bÅz+Î÷A=Ù:|k÷¶Ïûç9(°Þör«8ó ”XA—÷Ÿ^>oï¾ýðóÇ—Ïþåõ~üé»Ä?ÿŠfvúMxcrysden-1.6.2/examples/FermiSurface/RhBulkFcc.bxsf.gz0000644000175000017500000064071711712736221021373 0ustar tonetone‹Ϥ<RhBulkFcc.bxsfìý[¯ôÀ’žÞç¯(`.Ú੊¤ïF–dcÈ€3WB[nÙ±åZlÿúÉb.f>O&¹ªøQòè°ÕÝ®½¾U‹ÌȈxãSxüÃü_ý×ÿôŸÿ×ÿôŸü·áñxüß¶ÿïñoþç¿ûûGüß¿yüýßü¯ÿßÿåoÿðoþÕÿøþ_ÿå÷ÿþgÿèÿÓðÏþÍ¿þ·ÿâßüÛý·ÿàŸü]üáßüÝÿú·ÿãã_þoÿú‘~û¿ÿ»¿ÿ·ó¿üÝÿù7ÿæïþ·õøßþåãŸüí¿þ_ÿîñÏþí¿þ—ó/þö¿ó_þÍßÿíñØþß÷?ÿÃû¿üþÉ¿øøñó7ÿö_ý‹ÿùñ7ÿ_<þ÷ñ¯ÿ¿ÿÿö_=þÁ?øþ÷¿ÿ—åŸÿåýñ/ÿÓÿ™-ý±ü¯þö_ÿOÿÇñèþ²ŒÏ¾üOÿQzËðóÊÿð¿ùoÿËÿç?ÿ‡ÿúþ«ÿî¿þGÿ|üGáñ?Ä·üçûþÍ¿ûÛ¿ÿ®ülûwÿ,<Æø¿Cúßø·º¿ìÿÿ ûK?¾æqy¬ÿSÀyðÃÑž$žÓ+ty ¯¾[þñÿ½ëïóðšöc÷\_ùÃóõê÷SÿšòïLó8Ìïïo{öÚòºù™ÿÙ:¿ÖüáùZÆü¡›ÆüÕã´¦Û³­Ë+?Áðœû!æ5ÿÎÐ÷¯“û? Íð«ómǺ¿B¨_N¯¤9*b>ÞPü¹H†¥›!Ÿ¥‡|†ç°ÛÔw]y…ײåA§g~¶ç8<þ¤¼é»~,"‰g]nÕ«Ë}‡WWä3 ^aÄå{vå@†¾üdœûrnc|Ò®t]É ÑëðÌß6÷Ky¹az•g[†òrÓ:Ík‘Ï\.ùsZº|CžQ$åM×e*WyXû¢?¯¥–ǰ¤YÖ¹]KZ‘Œ¯Šÿj‘B?æg‹)'~(§ó|vE¦ÓÜñàç÷` Óe~•£zá*OÝRLg÷ĵŒ'ZÞgî§¡Ha)Oå†¯Ž 8ãïŒåŠM/»eíò³ÅKQTfÄÁ?Ÿk×îñÚëÏHX­fû.jIÉölñ¾å¿ß®üÎky¾Š|¢€ò<ߎ»Èg]ʳÍý³èöÚ•ûŸz-ß6Nåº<—Wyzuð€/R´OåÀßé íg¼—å¬ç%Ý;½^°½ ,ù,_¼åq†r¢Ñ†ÌYOkaA³v3ØŠDÞl÷%¡1\»–4"‰¦ªï¼®CþêhªÖ¬ ñžåVE{ ‡¼ö°;ø£o'^Þ'ª\ÖúxEË ™ûqÊÿ,þÕò8ïCx•ýº–ÏW>·ø©ˆñ9ÃËŒ¯~€ÏŠg_.y?”W»‚‘¢°–aI³hí³Î—Ü;}‰ µ$‹äýmñ? ^âYå™ßÞµèBtˆEXSÁ!QiGhýò‚ßî¥^\õÌ»CûoÈœµ~¦ÖÏÃÐ/ååðÚÑj”«<¼Èþ!þýb-‡·ÊÏ1¬e‡/Í’”ÏÀ8ÁF\»{—/ µáÊZÒˆ$Þ£ò Ñ¸”YÆù•¥0ÇÃ)òÕñŒ¾–|N|›¾ò¦kÁ–Ïyv‰êS^na ã›v8Ñ®hÉòãÚÞßÖ]¹–ݼ”sëŸý вfý˜ÁÖg ` žÆ%7ˆKî]¾D†KZ’E¿mî»"Ÿ‡¼² ˆà žoþh`óW¯ñwòé,c_¼óü‚3𻩀í·ÿ(:ªÙˆ£+ø­ÇßéŸ@Þ]4ªûOžkŒ’òXXÒ,™Aù¬'ñÑ  »â,G`{\’>qe÷._jÕµ¤É4ÆSÌæ.[—9búçþmóØãþs<é|)樲ÐÓµ/²D”û¶<³%qß h0¾w>ÄþYpH¯å’Eå$ «Ñ,™Aù, £Áº·qÖiô®PQqIÁ â’{—/¡á’–‘¼¥°Æ rÿx÷Ç|Å¢û›ò‰Î1æËÄ»œ<>Çìeæ~-/7wBì%^¸âŸS{=ÏÑN_ì„eÍÊf°ñYFƒ„rP܈DÜFŽÞ·oc¨˜ã’íÙ‚‰¸²{—/ •á*ZR‹d¢—Yò‡þ•_û}ýnC¢LÇl•£ÇbÏÏWq®Qr…´ˆ ¢+òY¢ )QÛ›u8–4KfP>+Œ º+ÎRPlã”ã¡¢è]¡¢â’ ‚Ä%÷N_bÃE-)"‰ß2gõSñ̰°–4k7ƒÏÀœ°#ÎÊAqÃ`ˆn27xÎï´cÃq‰PqôÎPÑqÉ‚kÄ%÷n_BÃe-É"yKaîûl¸–7&(’‹Æ2[Ëh¯×aQ³då³2ÀHVŒ/Gè®8KA±ŒL7%FnPD®Xwññ;¼}iGq\™PÙž­¶T¨˜ã’íŸq÷._*ÃU´¤Éǫ̀s‰ŸooV­Y6ƒòYFƒº7q–‚b1¢›Ä f"·eÝÍ—¼š/ÐW7— >_qI~íqé¨xˆ6\Ò’,’P Kb”€å³0ˆ ÝuÅtùt-E7‰4‘+ÖŠqœÂ’š…Z¥šRZ©sVt™€Pš ›šl„džBm¸$,‰Äf>+›Î ÊÜ*ÎRP,#›õ†”+“ûp>ë<«èó%"çÉgwØp\¡ç*·Ë¸¤¸êqѽ˗X³lé³0=Jg1(6ƒ!ðcn€ÉPŠ)峪äãY¢×YÅ> C '4Íqíà4=è3ß^ZB]àJXЬbŸ%€!‘º3Î*p¿f0L7)xPX!Ö=‡"m>KÉGgŠÏrï9Lj³Š ­t)3¼‡p Ç¥°O¡BE ‹š%3(Ÿ%_"4(è®8‹A± ÒæEäšuwŠDù,ùÿÖG|j2A4ƒ½Ì*î¤Eú°ÛkržˆÈÑ&™P‘°ZÍ¢”ÏÀ̾¤Ž³LI$¢›Ä fŠªaÝ"Q>‹T˜2Å™>kj0~©PMÇÜ{¦öÚ¬¢RXÊ—ˆœ¼ÓŽ ÇeÍbô.Ÿ¥¸„hÐÐ]q–V1¢›Ä ŠÈ%Å+ò·Îg1ùÈLqE2‹~&1}X4”>PD€“i.:=í›Hv >4ä<„eÍ2ÇEŸ•FƒÝ‚…¸È`_Òpƒ"rź3Eâ|VN«´™b¦bœ¤QúFÕMçu\N1ÄÔ’rï9Õd•Âr¾D优`ú, £A%Þ”’S\Bà >ºwù.i óYN>:SÌ„¥R™.˜©ª›=-­sšuOÀ¦Ÿ ÚDI[¥s•èµ°¨YÙ 6>KChÐéiÆY/ÅÎ E7  q‰uϾ¤Ég)ùèL1ÓúªÁÈ¥Mu“KÑTXpZí˜Ëš:®ª´E*‡°°¤YÊ*Òg)_b4Hè®8Ë…d0½‹d\bÖ])ç³àKœ)¦–¨C3*¥Q‘ÊoTä©úó¨Ì‡@* ÊECÖfÑ *Ñ«¬¢ÐàÝ›8KA± ÑMâsôÞ°îUŠ„ XÉGeŠ—ÂºW†Kee µ^uƒ¹|-I…mç5Á,“Sµc.­k긬YªP‘Ï"À0TVQ¥‚Ê—ÁÝ$nP—Ë•¼)Ÿ…¸D™b!.¹wù.j‰êUä©òO†–ioö2ÓMëY€Z š%3(ŸµŒ ªlV‰^eÉ`dº©áMä’vt°òY{ôÞdŠ«rc€`#.V7e_ÃÅ"O‹DåÓªu?¯œg™¶k‚¥Y4ƒöYDƒ®Paœ¥ X †³Šâë|I[,Ÿ~ù,'I¨(zw¨È¸¤®nrñÿ‰/¡á²–°Ö] _63÷—´>KãbIË`nºÚ_Òæ³œ|¼Ö_ÒV7©íbIøÕp]í/ ÎQôWûK/_s-¯ö—*F«2ûK•¶Qç«ý%¥15WûK>hÖEc×<Û-cלÛ-c×ÊôޱkîÛ-c×èÂy–E"ý™:Ä k‡ { èu‹ yC]Š£"·{:ÅX¥h+Ì`÷B†ðY£ýO<õXªú‡øÍE™ôaaƆ_ ¯Î44Ãͯоœ^{?P•1o{ðòYÂoúªJ‘fþð|–?ú¦ÅŠ}‹¨³ÖEÏOÜ^ši^N„uÚ«h)-¡Hªþ¬u(µ+=x±xIQlµ,”銷Øû U1JAðý,KüÁè±ÀI¼9³rkñ€1úG0Ï <9IÌ¡I6ŒöÒ÷¥.z —YFÅã¶èsû|ì!MÍ:wïæd¸v- É&5Å_(|È›@`‚¯TúÅø§œNüû$ðf€…ç2 ú˜ /Ÿ <Û«g¢*êR¹Hd4ŸKW>:¦±æxŠJ­¸.QnÌØÐ .¬ß‰ºY|–„eÍbQä9âR,#_BÃ%-±HÈ Æ#(º0÷¯rð¯›Ñí/¸£/teöd º ¹ÝèêÑý‰œë»~õñϹÎoÿž?DŸSXÐuQÛlb¼U…u_YÑ1<;x³8‡nEbGÂ’fÉ V>«T z˜¿æï쾤1\YKE²É‡ï20/3ŽPÀè2P¶4ÅËDy£Y¦&Þ÷&m*aÅ3âÂhöÝX*ˆ¢—@F­SW3XÃxE‹úµ¸ên^sµÉ+†Yå †üNÖfÑ Êg `œö½Ôëwv÷j_"Ã%-‘H”ÏŠá`‰e–ùY ÁÒuåq"Úí½Gqm}_nïÛ v%š¡rñŽáµ™šçŽâ—püûöo‹§›™¹øÛP¦)ʃZXÒ¬Ý ¶>KChðKChPÐÝq–"ñSŽKì±~G¡¢âƒ`"®ìÞCåKd¸¬%‰û³†®Ï|ï#„b ãMžKyá2gˆ¿x.5f–’¾ŸKuúò`aQ³då³2ÀhÑ ¡»â,Å&Gv‘4¬»ëGÅzìÑûöG*æ¸$ñH|Pg¹÷ìKÕµ$P$ºüsz uÿ0ŽÅ,ñöçÌjô ¨i|»ÀREÕw™‚/Âj5Kf>KCh0C÷äôg)(ƒa¾ê|ÒiGýN&T&Gô®PQq‰@°Wvï¡ö%4\Ò‹Dµîñ«s\¿D{ŸQMcp ³¹µ°¤YÙ 6>KChPÐ]qVŠCt“¸Á_Èy÷/O$Ç%B%GïIÑÙɹÇ%©®f.ˆËî=û’Úp- É£izÊ-€%±#aY³dé³ ÀØÞThÐ]q–‚b1™nzt7h"÷|—>ðwD;ŠãÊ„Êf{½+TT\B,ÄUÜ{¨|‰ —µD"qÖ³Téøwdå³0„óS·q–‚bžè&[>Ñ–u?OaI™$ŸõHºº!º;ùVµ÷m¿‰¡º£F\º×ùÆ7†+kIhôGšE£Ï2À¤n;Î’=0ƒ!º‰Ü ìŽ,’íÛyVQùzÙ7ZKÙQÑŽ²½Ù*‡Ú^Ë’ÓÆ Û/d*_baY³dé³²7kР ;}£ƒbùÓìi[nÞÙ¬»R$»HÚ e•ÂÚÑÆ£Æ!¡„»Õ˜PّУÆH=… WqɽK³då³0„‰g[šÁR†­Xwà^峄•™í¨`ÈYžÌ6q¾Dä|Å“v|ñïÌ¥÷_1†¢Æ%–4+›ÁÚg` º«?+G` ƒ!ºIÜ ˆ\Å€9:lóYJ>*>=-‡ðüþŽ¢]ÅÁ9BþÉAT< âmGâŒÑsôÞ ‹š%3(Ÿ%÷.4(ÃÅ8«â)È`ˆÛ 7h"W¬{•"!»"Þ…™âŠ«9€j2Žœ½æ‘v†)t÷drž|iGs\YX­fÑ *.ÀÌ³KK$qƒ™5lXw1â •|4o¹3š5gEC&³õ;;ÛšnxX1´ân3«û¨øÞ‡ZXÒ,*ôYBƒâ¯…¸äÞÅ`ˆn7hnýYäã«|9|eŠÍû;#ðb©ài—*$õ;ÌV(¡D¯r9+’¤Pò%9/&Ø´ã«oF‹•åQ\B,Ä•Ý{Í ÚpIK$ÏÜ3]m¦Xi}Õ`¨`F¹¶]$éM™2UæÎ¿³¢›yÀœ!L<r‡Ê**…EͲ”ÏÀt.TqCE1ιÊDÓ½‹u—áR>KÉGgŠ™C®j0X0£ê&åªO§iWóGù;{¶ü‡㜹§†Á•Ü»…%ÍÚÍ`ã³LÎ º»–`Š[ƒ¡¢âƒ`Õ9ìî½Íg)ù¨L±D¢¹{uFSÝäR4Õzœ z~¯ëCXm¢:”½BåHXÐ,™Aú,¥°Œ Ýg¹‡ †sƒ"rɺW)’™C àÞ)VZŸ5*˜©ú³P÷¤ºA×WΜwå• Cé³Tǵ ë@³hå³0„3toâ,W¬©–t“ëßvBå€uWŠ„Ih‚`!®ìÞj0`¸¬%‰û³ÈE»>ñ´LÛŤªOœ8»IÂ’f©hH>Kƒh°ªÑTV‘),2®%7èúQ±î$TœÏRò‘™b¥õ¸äÞYÝdÃźAyºHµº§•óÞ¿ ß¹SrÝ¢Á;%× 7x«äºÄï”\7~áOJ®³H¶7½¸¿¤5ƒ•Ϻ´¿äGeÊ!~nÈ¥ý%Û‡Cr>y™kûKÒñ…Š©–àÚþ’sÃj-ùbI2GûKR~áÚþ’aì/IßvmIz¶£ý%éM¯í/ùùêƒý%É^Û_’>í/IÿÚþ’ß5븿äOŒ]hìÁc׿ëﻆ=¾eìÚX掱 –¶©¶>ì¼.ÍE:în®¥§v_ìnU†3$¯v·ê¬‰F;‡S£þú_:‡¿ƒîö:Dvéº\CvéM]’Ü5d—|Ö²K/w Ù%Ts„ì¶vÙmßvˆìÒ·!;7€ïi‘Èÿ°?+ºä"Ÿµ+•0ï!9˜ó3qþ:zÇ·.7Óo¢§F|Ú訚éѧÙŠq¥£û? õè«ómGš_!Ô/ç×Þ¤=* ‹šeS«‘Ò‹„û³ÔŸoy!É:Í-ê‘èÅ\¶xãû2iˆOP²K_’ ϾǛ®„RKw@–¦ÛËFó'çç#]fŒö[0)e˜ÇbïI%å!G½±Œ˜Ñ¡ÛkÍ:E\òfò%ìö’è-m7#v˜Lº{cXep ŠŽ·œûÑWÌŒ‹žmÈZÿ¢I‹^®˜š¹[ËL˜™ƒ+·Ñcå‡rnn½Ÿ`Pú._ü kÂ$ÏgÉ@UÂ’f)À=ÁF\šD_B=•–H$ÚŸU±î4ÞÑžˆW.‘åÞgšoï›3ƒ—Ïz²•ÿzÍØg´¬˜‡ßODiL1Î} áºxËKVq|•ù;}ôFùM‡xEá-,(†Ì |Öé^Å*(&â’{§è³á µ–H$Îå|Ö<‚jYÇ}¼‡¸Âé¥Å;|ð²àx{XË R¾<_?°“ÙŠx)Š{(FTß>cËç: ›Ô pÖfÉ Òg `œ®º4¨÷‚'v{Iôô%Ùp5Z"‘h–û³"Ö.b\VÌ©:ÐÂñyÊS¯3 Š1Ja¢/AÑØ£Ô6¾P±Uc_zŠ»·ËØåó.Céó‡(Ò’–°¤Y»<ðYjß9ß>ºG`)–a\"LÄ%÷._’ W¨µDÍ@(Éþ¬~3NŒÿl(Ó–Öe,Oðó›ßgéfôÆÆ¯CÅ4øÙÍÈ×ÏHP ôÁo/5g‘¼úì,,j–Í |ÖÀ¹yFƒ‚)\·AgdLÄ%÷._’ W­%‰ög©ncK2u~O²É2?¿Bü7%™:Ç»[¦ë/ïyŒYrÝ‹³t€-ÇÔ^Ï]rYXµfÉ Úg ` :^P±Õ)ÇenCó•Ùí%Ñqɽ˗dÃj-‘H<™uƒïjÅÒó0¾r^æ=ø²”ÞGÃUJïûaß:Ï0Å·áîOÌ “°¤YÙ 6>KChPÐÝ!Ó¿ÐŽâ¸Äºþ Q›âƒ`".¹wú’b¸-¡H´?˵†]_d4ïRE!uÙ‚ñì–|Éç!~s®¼êâ›(aI³hå³&V2 º3ÎrTíy(§›¬•"ñ|*±÷Pqó€ŒK‚…¸äÞéKŠá •–X$ܯþ¬a(¹Ðª–ÜǼL])y{¾Ë­aµš%3HŸ%€!4˜¡{úÄY ŠÅ`xDÍ/ËÅɋ׼ñ!ŒÞs¨˜þâ`!.ºwû’l¸j-±H´?ËýYQ²£š—ZC ‹š•Í`ã³0„Ýgå ¸a0D7™<ß÷¾óñ?™Ö«—Eï9TÜdʸD ˜ˆËî]¾$®Pk‰[´lFýY–4KfP>+Œí¬‰ ÝgѤ‰ÁPmžå£f-mnï| ÇzêàùÕâ¸ü8|Ðü ÍËñµ…¸|T<Är¼ÍÁK$ÚŸ%1RÀöYº¼.å"5qV/¬üŹé*Û¾¹Ùñ,«è–ò%ìö²|¨´â¸¤è2Ù8„ÚlРqÙÑ<ÃjaI$Ú $)€!4Hsë8+›èÆx›n"7hW@'¡â—_½Ê*:…Å|‰ì^E;‚ã2¡"çº»ÝÆ!ÓUqɽKXÒ,™A‰„û³ÜŸ%èÎ8ËA± N? 7(ÀdÖ]øZù,nÞtZR3Ê**…%|°ƒÆMDHŠvÇEp*Øšíf-u‚…¸¬Yò%òYèÜŸ¥8Kp_ †è&9¬xpÀ¡ ãS…/ÇåI ŠO¹*«(|­ kǶßa ¦N—Â>„9T|T²fqÙgÉ— ZKúr–ÂeÒæ|›ußö&Ÿ¥ ß™b/^"‹óDE®hŠOEZˆÎÈDÇûÛDˆ!ÇeBÅÂ’fÑ Êgq º+Î’–xè7¹?‹D®Xw§HHxe*,¹ò£Jë«C,hÕòšžùfE’(,â£a‚A;šã²fÉ Òg ` qɽ+(ƒ!ºÉã´˜Ut–R$Êg‘0®¨däL?Ÿ×q¹å‡47»½$z‘æÊ*’h_ÈùP ËšeŽK„ †Ð  »“ D\rïò%ä­%N„p3P5oÉGÊÔ©%iX ý[i블¹ÓÄ]Wt é¤t”²ŠLaYXÔ,›AÓŽêÖ'4tgœ¥¸Äi<"®É9#eŠÁºKK$íÏr¦˜ K×`(¿ía— j \¤ÆÒ:e¾•€uùÍR¬¥Ò¹Jô*«¨–ò%òYíŽËq–ƒbNEc\bLÄ%÷î‰òYJ>*S¬Í@ªÁ`)@UÂKqX€šîŽÊ?Y¦ :.‰žE¹âÑ k=0ƒÏÀ|™6Aœ%ŽK †é&rƒŠK ‚‰¸œÏRòQ™b¥õ%íÏrç ë«4›"qÕ³L/¬Ê|T¤:. U¢fÑ Òg)«è– ;ã,—G©pJý§*¶R–XwÆ%ÁD\rïò%®ÁPY™EÒŸ–¼¡|M¹­BüËUˆ.Æ>¯œÿ<Ò?4Â:éßú¬Ã‘þéÙ>ŽôOýãHÿ/ói¤ú¶#ýrø8Ò?ÁÇ‘þ¡Ö’ã‘þ­H›~r»'eÚWûK4øK…Êçþ’–<Ï—|î/i3ÅçÑûçþ’qû’/úK¶gÓÎ ‰±ÒŸLûXßËEl^÷ÉåmZ릭Çy\’)÷‰s}œËqå\^F÷#Slsà;­¶óÒ;m²ÞåýøSìàãr=¯ÝÓB>®êËKüZ/£Î­s‘|6vÆ®õL] ±{Ü5vÆîqר»Ç]chìŒÝaIh„õ¹søQ?Ÿíbçð£=žÛÅÎa¹©F¦W;‡åB›ûvµsøQßøZ®ï|<\Ãj ¾µ†34ÖåÎÎP[¾[k8Cm•o­á µÇ8÷%ãaO~ª%¸1&áçµ¹ÿôƘ„t¢Ø{kLÂϳMÐ…c¶û˜„Ä9\“p35hð8Œý¹þŸÂØŸª‰Oal²UÃØŸÜǧ0öÇÂ~ cÓ³} c·'øÆþdÿ?…±Û‡Ïalƒ¸ª™0æp¼ö2ÏÒsgü¦ë"n0>îõXȸqœ ç0 àú´I¿b.hÄꘞÛát^ÜL÷Z9{SXv¡/ÐWç?êÇуæWh^N¯mÎÁGu ‚íÍÔ>Ú£çN†KÍ@ú;ZQ­A[êÏzq/v”=¨08–>†%EXñ µ×MS™^8/œ 4bæÕ ³Dc0…Ò³Vî^ÀHügÝ:!_ƒÃRF-RQ³~)!Ü{Øxr KÉM‹9K¼åÇ8‘î]¾„†Ë¼‹$±Rd 5ÂNù¬w~º¼ÜRåðìŠLûµÇè²¼üg(+{Ž32 :iú µ  ôq~a¥YW&'E‘””vôk|䟼0a&ŠeÚ•°8?‘fP>kI²ä„j¨âÒž®±tXƒMñR$ïiV%q ýYêÏŠñ?;„ºŒ™& ÈŒ Uaï4BÖ…g‡p„ä‡D&ÑŽzò®ËŠ ÅšoïsŽ/+S(ErYX­fÙ Ògiòåiô^µ iÁS_¶®q=—s+Ã%-É"Ù2r•´¤ög©?+‚ÿbGç°µ/sóâ YZ¡#" âòaˆHµTÜÌÀo]<Ð2•s*)¹ç{ssÖ, Kšµ›ÁŸE€¡É±‡„Jº–¬ÈU¨ø5ALÄ% ξ$Ô†ËÍ@I¼mèÜâ\PV7Ís,ë@/¤‰8ú/^ dºN®X€wâ¹€Þ=ËÊ…øš¯W‘…%Í¢”Ï2ª4t?å¸L¨hd/CEχÝApƒ¸äÞåKd¸¨%E$[­²pž¸ëþ¬yÍôM¢¢˜ç]ϰ?[üï‘ä|-(E['„ò1Ð+%þ>ªŽ0‡–š%3(Ÿe€!4¨ T½ÜõŒvÇ%Ö}Þ“_@¨¨ôšA0Wvïò%¡2\.¥‘H^ð§žeíþ¬qÎižóæøh¬Åé‹Hâe)Yžøcñ 5+›ÁÆg ` º;ÎÒäÿ_˜`lù1kHBÅÑ;CEipÁ â’{§/‘á²–d‘¼¥°F7—eªõîÏbå{VyùêWÙæ#Ú [0(,i–Í }V tWœåby­@ÞE’¤@r^i/S¼äã5ßÞC­Á9.Ù„E,ĕݻ|I¨ —Ê?=¸ÿ…Îí_pÖRÈ«ùÍö”¦°¶9H³lå³0„3tß¾@qƒb1¦›Îó%¢xÅï´cÃq‰P‘+Tt\Ò³ržˆ‹îݾD†‹ZRD¶*øñx%SÕŸEaI³²l|–†Ñ ¡»â¬7 †›µ´¹é0…õãÄ;‹œç?ó~r\Öà=zOÑBÅ—$¹°Ò¯ ®âÞåKBe¸ªf Šd\ÇõXXîÏ¢”Ïâ ê©«8 ojC§ãfGn>;Í*Ze¤L"絟鉊\ÓZ$Tt«|ßxó­o¯Ý»n‹Ch0ƒàqɽ˗ÈpIK²HÖÝ)å³Èá›Ýguº2¿”Ö)壊Ü='Ñd+TB. fîCY‘’/i2)Ô¬ŠvÇE€a4¨,ã,g†”3"Ý$nP†ËÍ@‰óYJ>ª?KÙ1 »tFí¼Ú‘[~TÇ¥4+³}ÕxWhpÎÖYÅJXΗàš ÞFƒÝ«8 ¡¢â’ ‚Ä%÷._â‰òY»HÚL1Óú®ÁPÁŒ2Òϲ¼.RcÉ‹œמ®=ÞdØsî]Âj5Ë™üâ³ 0„E;šãbPlCt“¸A`±îJ‘(Ÿ¥ä£ÇFR$®Áàþ,U7©¢ã´&ø¸0çG>¥våVaŽÌ`“U¼Z˜³}؃â–Á¸X˜óàã4ˆëjaŽDò§µRÇS®r8šr½ýÑ‹S®›ª°Êg]›rÝV¬©%ëâ”ëTƒq4åzûpqÊuh —šN§\OH••ó*¬f1iUÓˆjÇ,¬F³lå³0”{ß¡ûQV),åKDΫJt§ŽË)Fï —dÜ".¹wù.i {U‘ûm3ÃaIh…EͺØ_’üÂY9ÄÕþ’tßNÉù‹ý% q…ŠWûK¯†ë\$1ø@ Ó.Æäë‡åDæ‘7ài~|ö?Zp^â“Íħõ:NèöZæ™ñ6G­L,.––àið;Ý‹›éžØa9/hüÂ<ÕeÁH¤ˆ¯Q1=÷åÛh ŸñÑŠ±ãG6I[w‘|Ь‹Æ.tµgºcìÝã®± 4v»Æ.ÐØ=î»Ðøµî/Iîð¨s¸Ñ¬/:‡Óµ<êNÏv­s8½ÜQçpz¶kÃú}u¨ÿèÃz9½vhäsçp£ _î|¼Ú_š‹tg g¨/ù­5œ¡VÀ[k8Cmn­á µ/±°$F‰D>‹ÛT=íB¡¯ ±F¬ØâœÍzh >]œ„ÝGG±»œôlpFrSv`tmÙéÉn‘‘%]¨œ«Ü®ƒUM®ÐÛS÷þÅ‚Û@‘üÜD$Õ/îÞ¹`1L°¿ºs8Ù£Ã?2½´søGëvosqçpŠ>Žv§g;‡¸Ë|9€ä¯3aþý΄ùLÉ—´†K]À9»yÀÙm6ä"g÷s•8»íM/rvÉpqvÛ ¹ÈÙ%SsÄÙ5š%‘È@úuãµe[¾D†K¿£oÓß¡Ö{–ú³¢«Î_ðžëVJ¡ßÙº",ì8èã…/¤ì dvôšP³Ùr}Èÿ,Ô_À¯.´~?h~…ÐKšÅÕëç¡¢7€{ËA½"0’àßü#M@T¹¼?K™â¹ôVDcW,l·.åx»ˆ) ×9M\ì3ãô¯œ?}ƒ¤þ¢Ç)‰øg)Sx¾˜Í ùٞ˺ä… ¾WÂ’fyÕËt ’Ä®z¨MH[~‚…¸v÷j_R¥ 9è‘"‰È“Ëã/a-÷g¹?«C½XÄäÅoG†^tOC¶BžhGK$Ñ¿€Cºç‘¬k®‰°{ͬT´êó“ÿ 9Ji–Í }Æ/„ЍJE`âÅmqѽ+ÿcÝPÓ˜E’loQ“à Ûµ?ËýYcéw~3s¡/Ö`Œ¨ðêÇb¸Þ%%0OcΉ?×e™Š– %Ò{¾09ÖÂ’fU¶WÅVDƒç—Øc‡Ë —kQó§ò%nÒf Šdíæ‚ã×µ/›Ó5*ÜýY®ÿ<ªŒÖa!q¿°ŽØqõ¯´G —«ZP¯–4‹f°r‡L º+ÎRfŽK„Š ´*æ¸äÇ/`>,{/+C<³ž†+kI H®xÍ9FÎ¥ÖÐû³ÔŸ5cGü:™[ºŽ5?Ú8ÏÜoUV­Y2ƒòYBƒžüÏ8Ë",nÃ#캮Dm¢x*2.©@° ñîÞCíKd¸4Y"‰²ÎO0?ß5£?ßæ‘äîÏÂòþ¼ +E±.[eN¶ä4+›ÁÆg ` ºXžqVŠ[‘ÛÈDTÊ*r`aË}ËÑûjb ¬ë߈G‰¸äÞ³/© WÑ’@‘<¶‰ïc)ÿŒ®:›Îj–ú³¢í,ÕÂÑtåg³°¨Y6ƒôY`4hPÐÝ÷.-ž/©ÈyP¼jù!Ç• •”—èƒÊ  qe÷*_R5QK$’õ9”Yýë³Ë•¥^Éäþ¬]X­fÑ Úg`pÉÝù((öæ&ÒM¿¤°Dñšg¦X™.r\^·ÆŠGzºH2N÷€í×pïÅ—4†+kI H[ÿBŸqÕô|a«ýYêÏâŽ*ù, ¡ACwÆY²of0´ùŒÜàyVÑR¨ò%œ˜`~µ÷˨Ñ»^A/§×Öä£ µ/q3–Í@$–5KfÐýY¬ÔERœå ˜×Ò%b^úK.ÖÝ|¼“'´ojù9¿«f Ò6ê,E— ¨ŒÃÙ4(µ©‘²y’áʪ5ËfPÒû³ÔŸ5±v…q–L´ šusƒÚ¼)Ö]ޙ.á"a ¹6;=ÑŽ’Ï„ÎnEïr»rÈrÕt⎇ZXn¢–F` jVÕŸ #ˆCðãøÔD.¡”@Öy9„Q´ðµ·RX„†^·ÆêMÛ7q\§‚­´ên–|Á°¤Y2ƒ2\YK4(èNP_íÏrVÙ°Vqƒ&rp(E¢ %‹d;7¥%=£ñ)#×*¦ý ­R®û5EÎ 0„Ǖþí¾!zw¨¨¸ÄšEÄ%Ÿ%€áf ¸}›Áðþ,õg1ø6뮀]›Ó•|<-2‹#~GÌ9!fµŸÖ5Î"ç O^È‘GC›°–­4+›ÁÆg `Ƚ‹’áÊZR3¦›DDUû³Èº3¿ |–¨0‘d¿Ôq‘u)Z~Hà‰ÚéÇù!ŠOM!Š\í(aI³lå³— q)Î’/q36Q$"rź;ERõgPÉ"™UƒQå 48Œù©Í¸6£ƒûÑE§Ë“‚79Ÿ…UkVÅq‰P1À`â`‡îMœ%Ä%÷.ºI†+kIú+Eâ|–Ò*UbÕ`P$ε) §ü3wÊé)µ¤¤“ÇSÊï)¬P «"ç—3Ú‘ChÐÐq–â`ÑMâåKÜ D-©òY8eŠ=ÒR©L%9Ï P•ž˜«n®‹úe®æªkŸUFƒ¿ÈUë ôÕ-7ø9WÝ®üÚm¦øbù€D²}›‹Ôn ~M<9*Tn ~ÝdJ€qkðë‰#B¾1ø5Ծ俪ºépo2vª•RùçpÐò³ùSÖd¹4ˆEC–4k7ƒ­ÏRV‘hPÐ]qVŠ[ÃëŒE¨Èe¨˜ã’&ŸeÄ%÷δ¾ —ê{5Y¥h,Rû¥rÞû³TXÍ–Щ´ÎÂ’fÉ Êg1÷î²?BwÅYŠE΋ VI¢Šɺ+zW¨¨¸D ؈‹5ö%n,Õf Š„Ež®È=ì/IÿìZI£Yçu\_ô—4qÖ/YÅÏý%-ë~Êq}Ñ_ÒÖ`œ#®Ïý%¡Ñ‰d&Q­®÷kæ¼ôgP¹b敪«9Cœnb¨‹?:¬,åìF®`àÙ#/ÿ*Fÿ½iÃò¡çã<Ñ|<ú>b”…,ÏϾèvÏe&ÓóÒ +yvniqfÇ û©H¬YÞ²pÃØ»Ç]c׿ëﻆ=¾eìšXæ–± µ–·©&ÉÍ'«k¬Y;‡Óå;êNåµÎៃ?èN·÷ZçpºÊGÃÛ³]ìþ±ñÃéÙÎ:‡ÿdçãÕý%í³±ßùêþ’æÜÔ‹}uI+Sõ‰_Ü_ÒÜ7ÕÐ^Ý_Ò˜'õ*÷—È ¶>ë°¿$4ºM­¿Ú_j»ãäÉÅþ’PÛD—Ò\ì/ µ½–%¿Ú_²Å tï•°¤Y4ƒòY3kAéçìíݟž®|›|°½3ývöèÛ+Ð×gPð‘1EFIŒì^ÛJÊp:+QðŽÈa¤Œž6)W#.‰Q:Ç-?Ö‰¤GÞÌÛ¼µ Åû³¬? ŸcxâóÙ!ŒåôÏ}ŠXŠ>fäø×¥<Îþå…ÄÛÎÌ%û6³Ã;»£ž—/8ÁF\‡Û¼e¸Z-9\°~´±üäpÁzRŒ Ö·ÌÝçë?ŠþiÁúö¦Ÿ¬ÿ܃O ÖóóqÁz2v¬‡ZçþL[¢–Ü€Õä³n ÀÚÎ6o ÀÚ˜N½5«Ñ¬ãP±ñfÇlxË`\LP$Ÿ…—[ ŠGÕ}s/AñcTKgЭEzt-ýI‚BÞ,U¨ïµ·üTÙ$Ž‘åO4!Pߦv$ñ4Þ²ÞŸ¥Œ¹+TËt–lE4…¥ŽW¬œuÍé}ôF%¬=jÌøÕWï4ÔcaY³úç‰ÏÚd“)¡‡Û„ê9 Äe÷^5áïPKülÓäí(+$hµ?KýY&i×RÿÎÑçŸt=uáÅ–¬ã×%g"$ŸJgPD°%ë_º AÞJ³då³0N9.· )zç–W3qѽ»6‚SmíO)’øÞXmý šŸvãþ,õgM[ûÐã¿ê ÆZò*µî1˜*È.YkñsKW;•°¤Y»l|–†Ðà9í(ŽËᲦ¢‘ˆR\b,ÄÅ­yNKj3µD"yêÒÔ±g¤öþ,÷gØJ0`óæø.Ê3‚‹îÞo”¥°ˆcaQ³*;ªb_Mþ'tWœ¥Lá²[“PQôžCÅí†0.!®¶æ©…–&Z“Ø¥%I´ð…$‹Ø´dÇâÙve¼¸÷g©?«ïH¼Ð5_FDV£Y4ƒöYnJ®×IÇYÇäüÏ·!Ú‘— Fï#N3.1v¿3ýiÕ „!ÈÔ‹äýÚ¹"wê†2YþgK–ög±‹dퟨW^çÒsgaY³P4DŸe€!4è ŸŒ³rPÜŠDù’ž³éÄŠv¯ä £÷*†fy(@°ý©Ü»| ·‡XK$’7ñY:ë–¹ ;/’Óþ,ögYXÔ,™Aû¬`4hÐÍZŒ³›Á˜‘å|‰Çz’ VË8.*ŠÞ«M¯ËzìO…¸äÞÝ ÄÁýÒ‰$"¤y¿!ï+5o{Ù«Ñ,™Aù, ¢AÛ75;jó ÑMçYES¼Î—å?ӈ㡢è=‡Š­?%â’{§/ÑÆ+k‰D2¿môáOô;ÞŸåþ,<žMOí÷á›ê t:>·ÓD¯³ŠR)“†?QÚ¾¼!º;î_à}ÓMÔÕíå½®š^gZbaQ³¤sÒFïÏRu›Z/{`CóÖÍ ÒîØ"É}(y"—£-?Ê—ÐZÚŽŠvÔ~&ZeÙëÊ’ÃÆËúË/ÐcÈ—ØËHKì™è³äÍèçªýYêϢ׃QÑMäá+Öý°bûIÌN¦O æm‡4LpÛ?×øS!!a$¡'á*!. ËÍ@ÄoÒ’ ó ':Îòþ,õgVÜ 0¬Ywá^#bfºr`³Y$å•ðW˜¤Š8^ßL°hGØ·ŠPAŒ¡èÃq‰…EÍ’{—Ïbdd4(èÎ8ËA±b3ïÏ7H"×1 S$Îg1¢tø/b@”·E#Ñ«h×),åK´BL°hGq\"T½+®·fÉ Êgɽ»ˆœƒ´Ä< qb=¼?ËýYäPÈ®ˆw9¯ãrÂ_ÕÜòSMóa¢W<&qOd¥ìOÅd™ã¡bÍÂtù, !.¹wù±yæù(qƒb ͺk–û³ÀNŠ·ü¥´Žu\Õbz’Ù¢¹M€ƒ‡C+îÖÛ”\sÄÐ,*öY䢗ˆ¿fœ%÷^5q3µ¤âÖÁº;E"¦Þû³ÜŸ/£ŒÀçôMúé›öÙÓ7ÆD¦ojÍ:Iߤ³þ˜¾©ã¬“ôMó8Ç集u?Nß´Gu˜Qkk0 PÓ‡¿ÎBü÷8 Ñ“±¿O©º'õg±ä ZjÃ20h·3ìÞš'aI³´u‡Úp}¹óñx góm·Öp&V I§[k8SnW*sc g¨çÖÎÐÕ™/©Ú„Žö—hÖÇý%íu©ú³.í/i®r¾ä¡¾þ_ì/iÔ,+`¨Uó‹ý% ð䊋ûK‘}Iãe*ͺÖ_ÒbKïϺÖ_Òà^'O.ö—´YE¥°.ö—4ñ‚œëÕþ’qIXÖ,™ÁÊg•Ùt†%;\I?ak«÷g±?‹°H€)C©ŸÛ‹dáWf›Ù æ˜û4Ì 1eR`‘43Mo:q$`k´[¾žP÷[Œž5=Å•7#ôHÆáIÕ<¬9xh–ú¥?= «ûW9n^ŸY†~Zª Œ„{ï? ?âó¶çôâzK{Mè5tæC.d‰2'içý­m)î‹wìu(Å%YçÄe÷._bœH-ÙE’ÞtÀ?ëž$rµ¿‘ýÁò?ª&LûJî#:¸½&²Œ=öíî"ùÑú¢sÏŽgý¤´{6*E•)ßÖõè¯gB“ûžëÛ;ƒ\”°¤YÒ9Ó›ôf‚³MCØ®%­HöýÁéµ9ZÎýõ{l¸?KýYc)9xF_öƒ¨Í¥£ªë0ëè¹"5eÅd¸èó½|• {eI4bˆ§œ‘È È„]Xfý½-× ®óÑr_LûKUaGÓþ~Ë¥iátÚßã¦ý¥r4í/}¸6í/4Â’fOû£7ËÐ#yç©?ù’¿fc4ëÛl,9.o¯LmíN¼A\U37éÛ<©É￱.ºÊ:·÷”7(à˜ñÛ3*=-¦2¶¸ú°ÿ³P}¿:ÿÑV³ø öYÞ#}F; Ô{Öë®ÆÜ†JO‚¸v÷._jÕµ¤ÉóÉ ¿‡ƃë>!2òþ,õg=gnÅ™ËEŠà•û³¢MÌyÀ·Ÿ{ÕŒ*\râ–4K“ÿí³0ˆÏ™à5—Q —dÜ".¥%5P’†KZ’E²Å2ÍÝ\1OK‡a¾3#×zû³fdF47u(k~Ï4˺P ‹šåe-—ØFòÁä‘Ýg)sy!¹ Qb •ÏR¨˜ã’G ‚…¸¼Oo÷%¡¶YK‘¬ñ&çñâ1h+ãÅ£š—M:ë{s#÷g¹?ëUò{fiy6L[²fÑ Úgy¹Ñ`†îMœuž/·áO;kØp\"Tœ*b¨Ž×/‘HXÒ¬,àÆgy¯ /RU¢ŒÍ›f0tau•ÏsïÙV5YEÙ7§%•C|ÊqIÑiªþÄ%Å 4ˆË- Ú ÃeaI³de i:ÝÝŸÅ ØÆfÝÜ ˆ\±îòèòõÎt)-)äÀê&£ 5oÒÊQj}B‡™~•Û…C¶«–Ïî]Âj4KfÐ0‚ƒh°€’&Îòþ,2¦›Ä eÝO+T”éŠÎøºÉ*ºu_h]ä<™à 4Ž‹àÔÑ;­â’‚ÄeÍÒf ú, ¢AAwƒzÁ}ÚŸåþ,† 8Šœ möX3ÅõŠBŸz5±F_0ÚÍA×vn"ç¨)„cpgÞ%„¡ +aQ³då³²/©Ñ \‰DA± q5æµ\Âa9ÊY•Ï:¯ãòx%ü]æ'sBMVѤé b‚39Rs\"T½[³hå³0Ü ¤Í@4\Ò1¢›DD‰¢2ë®ýYª&v^Z÷£ùÃ0š»®0š¡6Þ y®2šµÏ2À¸Êh6 †^áFódnòYÇ$s#’:#P:oKömƨ;ãÁͺ5ìQÅY÷ƃI$Û¹ý»ØæŒšû³ÀJyõ3w¬uWjÉI'¦£”¨Òª,¬F³œsªŒI4¢Á Ý›8KA±@°—¹ÁÝ—´¬» EÂä£2Å9aÙÖ`œ×«µ^ðT°¥ê¸4:SÙr&m•{ωÞ&«hÍRÚXä<†Ð ÓÓŒ³½‹Á0ÝDnЈËÍ@Ü äúD"fŠ•ÖWÂߥ‡eÚÛ‡½Ö#1Û¨q–Jë4zVÕ&{ÑñÂÂ’f)«(ŸµŒ º+ÎRP,#Gï-7H"× Xˆ‹ù¬ª¾WÃþ‘Ö·HT0£ê¦óÊyÕJ±ŠJ¨ª¼Ê5YM—ІT¡bÍ¢´ÏÀPAó%гÌŸr\"T½+TT\¢|–W]ÏÍ@#GÔPKªê&”¢}ÙÌpØ_’X‚³Ô«ý%ϪÊ!®õ—4 †Éù‹ý%M>ËE‘ûKÚê&lžŠdà¡]ŒÉËt#ù¨iñ’œ»rF\¿s9eÄêÛ÷ªærýµV”3rÀ‘Þt¡=¨jóùf‰ò:‚ŒoZ*$㻕ƒO]È":ÄšóÂ\ý«Öfßܹ…5NÏh¯Ñ;wÂó@$4뢱 ]U€zËØ»Ç]chìw]誈ÿ–± ÿ‘H¨%¿´©jÉÅÎáíÃaçðöm;‡Ó‡£Îᄯu'1uoöíbçpR¦£ÎáŸg»Ô9Ü®/w>^]Ù¼3÷gÝYÙâSN9¸³†3iVǼó5œ 9¸óþÏ×p†Ú—èx½C"‘°¤Y2ƒ½v³jVÕŸõ:~S×÷út&|O4Ÿu#¯I¥ä$SI;߃æ†TÁ*'Wh-ob¾£Íí=wïnY8Ü_ÒjÖçý%­ïºÝhýûKë’íNc‘¾Ø_ÒX¾lkùÅþ’Æ*g{ÝXò/ö—´Nœ±Ìq‰Ì`+’Ãþ’Ö2¸Ú_Òxg'O.ö—´ÈAYÅ‹ý% ªQpwµ¿dýœõêˆEë1ee¸4CÐCÐÝ’Ø’¨3ãÑ©º?‹èÖ¸—ˆ8cåEg|Œ‘·0¹Ðú„ŽQ#|&¼•€ñ‚"‰c4чDâ¸D ؈‹»€åKd¸¬%O‡¾ôÁáOóJg@·¤ÇÑ)7%ýé—g™¥3sBúªýè§]¼ÀüD•có w>Â&zFî<ƒ§`²NcâæáUúO—®+g°ÌÏrùÖhSûc‘(Tc¦ñ9jôNƒ±kI H¶™'ö<}qF'æta¨üOUšMUæ:ßC`‘yXŠ–¼Kò³ñQö ígN7~°‚2¡ ‹àšé7ôgÁ|ØešAµPXÒ,Gï —zTÉÍ1c&Ã%-‘HfT§¿“<Ègaƒ 3¸Âož8¥Œ÷ªä¬YËƒß ȹ:?·vhx_²¢Ûò2Ñ“ÝGY'ǾÂxûØ…ÕhÖ/„ЍJ…Š;NÜîA}Ý Ä<WTËpíZ(’ŸÓá@<”rºè6 kÈþԳܔØy—ð•ÄÎPö…¾‡õ•Ißý0–Ûû®"A†cDoù2b{ˆäž–9‚”°¤Y»lEr8G3IáhŽæöáâÍÐø’ÃѦHŽG›¦ÌÝÇѦïF›†ïF›&5û8Ú4eŠ?Ž6}Ôfðx´éÿ•uWKOE²ÁÒ“ “kÿÒ“”?Yªq£ôdÓ,õ3 'êµ}Gwƒšè]D”ê„‚¸ößi¾ÍÄ Ÿ@Ïft»C©g1ÁG'!‹äõêÏêÖ\þ\^%[¡åŸ5_`ÍÚÿèÏ"À <'çU±æp™—³† s\²!®?Äåõ˜(Z•áRþTïiDÓ\ u H'„Ø`úFõQr»H¢£*’óú*ÖRÂ’fi+}VÛ º+ÎRæŠOr$¢Äqi€¢w†ŠŠK ‚…¸²{•/±áÒå“H–øwJ$Ñ¥ºiy¡XqŽø–…ü˜ŽçýYìÏÚ…Õj–k[¹•@ChpÆ„@ÇY§),sšºµ³†?± "=r\Nž0ÓÅP±Ä% øÑÔ“s²êwd)²–Šäñ®Õ–|]ÞZÆÜá\(ªeZÀ”̬N÷þ,jì[ÕìH€a4Hè®8+ÅHÄm8_¯| )^1Á¢éÚ •ÄŸ…PQqI‚WN÷bý›|‰ µD"™û7J}|?£'%šRÒ+aQ³¼?KýY;ÀhÑ  ;ã,Åb0v‘ìŒÙqÇŽ(^ññ&ç5#WiI~µ•½'ãÍé=. Á韱¨Ú 4®¬%"Ùä¿ 7ñ'Ö,}›|–ž@hÐ[ g9(ƒ¡Óñ¹‰5Å+>~W™Ð(“ÔŒL°TS7$ßPÝ*Ý·ê&²¡]€)ßëPßxê‚´¤5+ë\㳤§Ò`BwÇYÙ´ †è&qƒ§åê•c‘ËQ Ë9d9°3™eae{e•³½®-¹úŒn«f .›™Q˜#Ã%Í’¤Ï’73”dœå Ø =­¹A¹dÝÍÇ~)Ó%È&0ç=žî'!Bí(T“ñÎ& ¡jT„Ð-@°WV£Y2\Ò‰Dh0ãÄ&ζƒaºIHuǰ ë~^4äðEÍòl¶W ÍuW)êž„ðwì¿é)£Å ÞaɆv£Û=. °Ü äÍ@Ó±át4Å8K˜ Fm7¨HO¥©ˆ©ãòÄqøw‚ü&¢¼ä×öí^ß Á? òók·Ü ‰Ük¼Ëöm'椟MÌIºpmbN:ƒ£‰9Û¹]œ˜ÓšAöÜ]˜Ó.W€ŸNÌùbˆÑöù¬ó!FW×Ïoߦ •;ëç7¿@V÷ÖúùÆgÝZ?ß0²~>óñM>K¾ØýóÔjb›û³À«hˆi"—CìyŒÍ’3á܇²"9_Ò KšE‹$Ÿ%BÅhPÐq–‚bÏôózLrƒª¯Òìt§H¸ü™.eŠ•S †“œžxÈýYJ™ªŽ‹[~\¡¢re™èUV1 «Õ,™A:  ¡Áº×qV‹ÁÝ$ĵ»÷–u÷°rh‰EÂLñÄZe—+ÓVù€ NåãÐà×ü¨ÝûñçPkÉsœ·‡sœoymŽs2ƒGsœ“f]›ãÜšAù¬Ó9ÎW‹ºBÅmüQQ—&A×ÙÉp5Zr\g—¸Á£:»ä¯ÕÙ…Ó:»ä³®ÕÙµ>‹ã¼ÎNù’'oˆn¢Í†m<²†CÎe”âƒ`ÿésidWôl‰ó?DÄ‚_òõr,²bÕþ,ögIXÖ,šAû¬ K¡ø8~PÆYNa©×ùID‘5Ç%BEÑ»2]ŒK ‚…¸èÞíK4VZâ å‰}ók抈µDÑíÂÄh ´?Ëše3HŸE€!4Øa‚–ã¬Ó¬¢¹ /Ò]ÊdlQ¼¢Åq‰PQôžCÅPÅ%ÖÆR¸wûÍ%pB‘,ÓŒˆeÂDüŽx³maI³T)Ÿe€A4(èÎ8+ÅHÄm(«hÖ¯ùx2Á¢Åq9‡Ìè=‡Š*.©†qy>¹|‰lˆ´D"y£§¬õË»#ãPXÒ,Ù*ú,ïϪР ùg)(ƒ±‹¤97O¥ÑY‹§|²ä™º`F >Ž4¿B¨^®jÒf 5äÊàïÇꃗH²°ZÍ’”ÏÀÔœzÅY ŠÉ`˜n:,‡h,’l•²Š²oNK*‡,k)¥%Ç%E— ÈÆ¡62(îž–’yʆ«ÑkÖnŸ%Ó)4(s«8‹û³*ã-ºIÜ \üvñè¯g¢×ø Ê!sTø³íôèÅqɅʹf·*‡\µ,x3Ü»„eÍ¢–F<¹üÐC DqŒ Í©77("¬û_qoí³¾Ä½z¹[¡HúŸ×q}1D¢ŽOO†Hl¯ýyˆDÊ~"ñóÕŸ†H„FX‡C$ZŸu8D"ÔZrKChPK=g)(–%—–˜܉Üäɺ“üU>Ë„ñajº.Lø ¨?KEC¬PQNBÙ 'z‘U¬ˆvR𙜴²fa–Ž}–†Ð ¡»@0— ¹]rƒ&r)’œ"iòYN«0S,‘8o¶gÔš\›÷g©ŽKECÌéål_t¢WYE¦°*aI³dí³àëÝg)(&âF’/1ëî‰òY+x¦%•°T †óÎ*¥Q®ÚYl–Ö©Ž‹9qV¨(^åÞ™èeVÑše3(Ÿ%€!4HŽËq–‚b1¢›Ä rc©Ü»|‰òYÖ’J$c‰(•ð?­œw™¶k=ìf}ˆJëTSÂj“ªBe)ÑG•{W¢×YE¥°˜/!tÂ8K— ÓMâIäºtK›èÞåK”)¶–H${ÁL#’ãf†¶Vê´&ø‹þ’ºŽë— •/úK4xž/ù¢¿¤åÏ¢÷oúKÄõ‹/ùÜ_²Éô‰$§Å¨!È\¿wt츣j`¡DÑm‹$ú¬Ì9ÄÛ_öÎ#æÕÌ#6´Ïñ¤ŸÅZ®+úÀ´äW?˜_x `¿¦å ÞƒˆŠ±Ð 1zW4ØÕtš»¢%ÌñgˆŒ^EKžvO 7ÓEÁ™˜g"ùlìÝã®± Mí×chìw]èÌ‹Ý3v¡«PÚ·Æî°Mu“ÂÅÎáíÃaçp¨…õEçð&àÃÎáM.v§7=êN¸÷Zçðã´sx“éÅÎáô8Gá6\ßî|<\ùÉt_ÃÙ ëâÎtC–‚„n­áLRèPgwg ç9¸óþÎÎÄ[r3ê¹/‘á²–üˆ$Iò-ø`îL•f©&˜>+/¸ÝÇû³ØŸP _û—ün·W?þG¥E}Èk†€9O(.äë_ ŸUMÇÉ^ce0»–$ÂLEce‚ç OÏ©b<œÌKa¶çq)sãÁ?óËÍϱd8Né\¨ ¤›‚‰¸²{—/i¹Á…b”H¢Ç@wÔHçúBßîüÄÂÞ¥CÓ§Úºœ•þÇÕMšQøN¶•?Š,¶«é4½/Ó2ã!–ÆÑn–í‰óø|eoµ¤$-¬sŽK„м™ G—ü€àq9\¦/±á’–ì"I8d)ø::j|è{E3ïݪ=&~Ó¨p× F9–¯îzüQWÓqú{*`>Ä÷MÈ7>ª\¡ça5šuJ;šãÒ(¶ŒSœÅPÑÍ@S*nƒ¬{ö%¡6\YK‘¼£”j̰°QPMDz/Áø§{G?<„¿êÏB¦ØÕtšƒÞu@?•¹†ñÆ?‹}³°¨YÙ 6>ËLp‡Y‰õŽÞ*šÛÀ–#.S¼ô%2\Ò’,’M¦+óÛ´Þ[WTÕ¯X³_óÌÒwÛ•Wðþ,Öº«šNsЧWÁä g´[XÒ,šAù¬,’ÐÕä<Ó^õŠÀr¸ü`ô"JÍ@Z"+>ž¹êìKBm¸²–4"yÎ=f–zEæ#)Ö†WɾD°eš^XùãÅ1¬¦ótØë,¬V³dé³0~Ë—ÔOH¯9®o&¤?j>>ƒàq]Z/‘lšugh}’Â’«ï ­—l|Ö·Cë+X·7=¬`ÝŽ÷bk)>)*NNâcQq¨ ×qQñö>Ÿ‹ŠS^æcQñ㻢âИÁââíà?7YÅ*…Åû&ã K¾»Ý# Ð2Óå´¤â’ýwšo3½).šÏfFfŸæMØE ² ¸šNšU™Aög` œ›ÇÇ9OôŠÛððÛ5LÜ )Þ Þ>vÇ¥Œ½oÖ’¡"Kij<‚‹ÞÝ»|I¨ —ÇKè ž¨ß‰·!Ï8ƒ•²°¤YšƒŸU ¢ABwÅY9(nD"n#QMVѯøxxlˆj8.ýQEï —\#.¹÷já›ÇKpvà.’íö¾€6,,þNUMGŸµ?A‹ÝgéMuùtBWQºäºþV ªLV¦@5kЪ)¥åÝÉ·ª¹o*ÿÔà~ÞÞj;ß~ã]ÈZ҈Ě%3(Ÿe€4(Ý–ÖÛÁ ù¥BåÐ<è ê¬âeW ÛØÞ«®@Ö¿ö —]Dòˆw>ì«Mí¤ ]¯õUoozØW½}¸ØWÝ`$·,\ì«nð›|Ö/}Õ‡­î ¶žÖ;áÏôMNì´u\êÏbšˆ $çÞs†£Í}0…¥|‰…%ÍÚÍ`ã³ 0„Ý—dÜÖüн˗ÈpU¬û³<›óYL>:vX¦îÛH„-qbÔ¥uÜŸ¥þ,lùq9„’¶Ê*«haI³dé³¼Ýã%k2ÎrP,C1†¸A¹bÝ•"Q>K"a¦Ø9äóÊy ¨|@…*9Ø‹š:.õg©BEö*÷þÌuƒÖ,™AçKDÎk£ìÝ›8KA±¢wÓM 9BˆKî]¾Ä†kUY vÉU5ß53ö—¤rV€zµ¿¤©]‘f]í/iêjLÎ_ì/ij~ĺ_í/ië‘\ƒq*’nÂïìbü©èÀ\]®NyÅÞ¶Ù±©Üª¼x)ÔýI4‰9´š—WÙ#0GC‘O4šcîpy·åg›ß¸ª´æáŽzW³æWe'Ù®^äj©Fáh/vü;¿ÍŒvçgñíð;fé¬ ˆ²H>hÖEc×T^Ý2v¡©j¹cìBWñ·Œ]誈ÿ–±Ûq/:ƒæ“éÓ¿´©j–õÅÎáí@;‡Íú¢sx;øÃÎá;]ìNöà¨s8T`á›ÎáMŒ‡Ã ÷^ën ×—;¯®á °î¬áLlžv¦ÞXù۾†s;Ñ;k8Gál’»³†34¾D†KZ"‘¬œáµ<1“ù¹À*KXš9ïv ø¬¼à6eع?ËýY&ftÄ£G’ˆ4¸E¡׿£« K“+´Æ6Þä'ÿØ/ÂÑ^ìhÆJ´ÛÏóîÝÀÙ† ìJɰ–VX­féÛä³øÑËï¬ÕÑžÀ­ ¯çJíJ7v…ÅÙw5oÿLƒ[ÈâôÑÓµBýÏ<@[_?ZGêWÐËéµÏ—bßx뵤5k,;â­jù™Õžˆ‹”¯˜._¨®¥û³t•½«YÓLwŵÊH™¬fV@ìØÉJju–¢»ˆÆA{±³HBmýÝ ª•8P ‹š3hŸ¥Ñ$jùtß q¨M4·Ìº ¾!ÙI„Ê}8•)—#gäd'ɵÉéÉÊQj“uv®¡q»w6î/I_}´¿¤Õ¬ÏûK’fí/iã¬ÏûK’2í/ ”úfIR™£ý%›¼¸¿dûp¸¿$Tô›ý%Óþ’Ћšuµ¿$P$®Ž³.ö—üX˃þ’tÖ×úKî=ê/Iºp­¿$œö—<þ ¿$ÔÑ»„%Í’´ÏÚ½Yƒ ÝgI$d0r òY±|+,WÀžCùMX{ŸXP„ÿ"DˆLP±'ÇŠš0i!:CDÇ ¦¦#¡¦MÎ ‰‘:çYaòfF\‰õŠÀÈ ŠÛב[h_ÅxG™bÐÐ1þy¢êuš¹en¼9.]•JÒŸ“±UÙÃ1¿ï™?è’{´¿Eß–_ö ­ k9ønÎ0âí‹ »rÎq‰=¦¬š¼ˆ ˜ˆ+»÷Pû¹Ò‰dè¡sñú#2°®pYú\0uz±ô^³íGeÿ鯣bÅdß0“y]>ωÏïyxYK¢Ëï3¿Ëϲæ©dE,,i–tNR„Š ‡p¢æ[*s¸¬1 "¢ÄîZ(’Ÿ†Ò“ˆë¹bùûÛó³C¹0?ZDà)!Âoã§œž&ÿ/ÓR´¤‹ö2o|ëâë§®ToF!ÎÙ’a5š%‘È@Ò›™ãÊ81Y$€z‡ŠÞëKnƒˆ+»÷Ðø.k‰D²ÌÅ&¾!déZQ(ñŒ?)g­ÅÀ,±TüÍFÙ# ’^÷g½=r¶|ëŒ.íõUœDºÙ/T¢fe3؈Ääü=BWáDzE` —«Q˜ÉlÖPˆKî=û’Öp­Ø¦šE²évÏUcËÃ.¤è½˜U¯ââÕÃ,xW£2øVÉ:—~™µ"­/aQ³då³²HB“/!9/P¯LWæ6B½k”)^`!®ìÞCíKd¸¤%É‹ )^{™OŠeF&ÑPˆ,Ê€ò©Ê°¼G€]êÏÚ…ÕjÍ |–Æy ËÉaF`9\Nq}á6DD™PÅëQÊ+ÓEÄ%÷ž}Ic¸²–Š$éÜr²Xµáæ¯aß\çí¥ÝZØ•JXÔ¬Ý Ö>ËChð<«è|ýu*¡‰ÞO×AüuCGµ¡ã‹rýd>–ë'/ó±\?ù¬“r}Ï]¹ÚAÑ®j–εŠíïvP4šõEE2GMœ%‘(\öƒêVí& ÔöÚä¼`+cŒ&ÖýÉáÄõ;ú¶êï #`úY\§V©!JgÀøÔ¢fe3Xû,0Ôþ,õgõ(ä?/‡ð¹]<ÆÓJ¦WO§½ÊûË…?8æxUÿv~:_\X½vƒ¯^X‰$ÔÖåV«a¨-ß­VÃÐUÑû­VÃPù’?j5”Ï:îþlÌíÝŸ¡ûËI÷gã=®öpo_h2]Ÿ÷öm¸·/¡šk{û·›rÊÜ]ÛÛ×jó ç{û¾X¥˜ì꟬Rº%îuòÄåDÑJô*«(L.´nržL0¦ h§©>Ñ»[´l ¸Ú/CͲ¤á’–X$„;`ˆ àÁD.YwóñˆéR¬É(Tñ©#WÅ´Œv«y\ Çr Â=ªàNaŸB…ŠYXfqÑgÉ…Êpe-iâ,Å —H‹܃ï–uWÀNvE¼ ïÏr… Ë!Äüˆ"[$©Ê—˜è"r„´I!TB+,i–6PFƒò%޳¨%‰é&rƒ"rE^Õ´ÖY*yK2šæ:]4äþ,0§âTɶ:«(:PD¡(ÄL.ÒŽ°¬Y2ƒöYè?•}s±Ý»‚b®¬% 7("ׯÈ_Ñ»HREÓ’äýðg®Àu\ÚŸ¥þ,ä$œ{WCtz&ÚC/9/&Øš%3(Ÿ%€!4¨ÀF Xc~É`È—ØpIK(¥H”ÏRòñ¼L[y3Wg0צ,œòsÞŸÅþ,•C(¨ ¡ULaYXÔ¬lkŸe€áÅÀ„Xßë1¿D\æIäšußµ¤Íg)ùè´äiå¼óÎ,¥Q®ZYlæ·•ùfNÜ*Ê£+ëD/…%Ír¾„>KL°Ð  »â,ŧg¢48A°—Xwû.k E¢´¾k0ûKÒ‡ký%)¢<ê/yüZ4t\ÑhÖyVñ‹þ’&Î:績è/iY÷SÄõEISƒá‚™ieõ «3Ø€—W§m϶ =ëã 4ߨ!›îŸÓTêO´c6ÞQ}Ë:ð÷qä2s =¿-ZѬøtÜT`DôK:Öu¼4€q,=ìžN¤Uåcbº‰>ÍÂÑø–¾û²l Æ„½åç"±f±í–± +$ï»&_ËØ5ìñ-c×Ä2·Œ]¨µä¸MõÇØ1ÙpÔ9¼Ý·‹Ã°ª©Ý×:‡Ó·uo7äbçp2iGÃ)“r­søÇ"tÿävO:‡ÿhç〷ÖpÖšuo çömûÎM wÖp&)`ÂÙ­5œ?,(zV¿[Ãi_Âêt/x¢H¢Ù*”AÔ˜Áø°ój,,i1Ÿ|–Üz–û³FLW‰×ÿ‹¸GT¨ì+·ëŽJ «š\á5¶/42B2ÔY½ªQ[|°'A?9ÉsEOŠÜ»}‰gÁCK$’è(QÕß­¨‘©„…¿£™óê}™ôÆFoˆL1ÇÕj–ú³¢°ÛX3eRú²ñW+·5Çõ!šµ·¯NWI2hç#š8H«Ê‡hcÁ#õð览˵ºÜ?•.¼D’…u Y2ƒôYº¾.xêü>Í›z–ú³pnõ‰NÐMcÜåjÉI¦–¶8Þ|wB}«tߪ›x‚…¸¼eæ)®FK*ÍšV|›|Ñ Ì­´>ÛƒPY Ùjܳʉh‘²­ õü*çÊÉc»Ml¬e¶£¡¶°²½nât"Yò,’P9d»j¯Ä {¯…EÍ¢”ÏÒnV¡AAwÆYòšò§ò´\…-ïì~òèôõÕþ%ë<Àt¼A¢ á!®ªÑ&ëj“èa¨øèê–…Ãý%­f}Þ_Òˆ¤š0smÉÏ?;Ø_²ùú‹ûKÒ?;Ú_’táÚþ’Gð55èêþ’Gj:Äq‰Ì`ë³ûK6¯ }¯õ—¤s;ê/IÏv­¿ä‡ï=è/Ù¾úbI¨#dÅÎWûKBE¨XX£Í |–—Ü»¡;A½#01;·‘¢]²äCÄ”d%=̻ؕ$vŒŒ¸ïÏR™ŸÌ …Š-2$†)sOŠ•*|U¨™¬SŽËb”Îejo&èaÄE÷._¢-?æ6LDuðsÏ'f7u=üܾ®=å('dpWÌGŠš…ºÎîÅ¿ÃýsÚŸ%ýy•'ˆ`Îî<¾JjiÞ 7²|–yÍ2]£õÍRx–›²¢…|‰Ä´£8.H7i3qb‚¸äÞíKHD™5¤HÆ÷„¾"Ó¥dp§2ºã2<à¥$t¯‰»Cé¯÷$vV¹Ùÿ 4Ç‹ /O$g Þ`£p·ÝÚ•ã_S9ø¾Œ§´°¨Yf‚e åÍD¨'fPŸ Ä%U¸ ÄUQd wÃ-‘H&²ûë‚έ¥Ã~ŒˆJ^æÙqD Û]´ßY5§ÂoÜŸ¥þ¬h5J¡Äø¶"Y™æ’Ôˆÿ´cV­Y'ä|ãÍH;šã¨w37‰Û 6â²{§/Ɇ«Ñ‹$â˜RÒ#Ç2Ç£uô˜ž®ãÔaîwf-¨ãŸè‹kÓþ,v‘Dü¸ËÑ~î"±°¨YÙ ¶"¡7ËÐ#T8Ñ ^˜ÂeEï9T 5k(l>^Éú’l¸B£%ÉkF_AüϘÃä'Lò¤|ܬ%þ šµ”p–ú³,,iÍ |VI¨¡‡ó%ë9{¨„EŽË„ŠËAñ:.â’{·/Ù W£%É»N!3¯Ýå$ù‡¼Ž‹Ë+þ-‚¶Â`LL(/H]x–4‹fP>Kã4«X¥°˜/ÉáòvßÈmˆ2ÇeBEÓU¸åÇ™.‚`!.¹wù’l¸B­%I´ë0=×'ø¾‰¿îW ‹®¶ÈÔ¢fq–{Š 0„ϽÊ*V),æKHD‘54í(ŽË„Š¢w¦%C&â’{—/Ɇ«Ñ‰$ŒRõ*|­¾ç®v°¤Y2ƒôYÞŸ¥þ,@wÅYÿAï¾ñΠ;ëˆZ}gQ£Y·Ö5qÖq9Äöá¯Ý7î¾¹Õ.Ö<ÛŸ´‹ßpzwjÅøæî„Ó»Ó(íêÜ|Û±:×Ïv¢ÎÍ›«s«s‡êÜ Á/¶‹«s¨ ¾\g£*÷ÎD/³ŠNaÉMÉ™ Vo,m¯¬²Ë?iÉeãiýåì1èKªü‚†½ˆù¡Ï’7“Ÿ³¤o”×´?ÝtZÇ%(E>ÞýYf€lÎ* æ)_Â-?f‚'…jˆwÜ©.Œ$ôD\%ÄU¹wåç˜×%·Hˆ… …-…:‰GÍ ž–Ö©Ž‹AŠ+TØ0÷.«¬¬"(çKt û+*P¼ÀH¢jY`ô¡¸Ä¢fy¿ }‰,’´D"QœåL £6ÇsŠô*`g(Ï ßiIïÏRÉÑ $ œÂr¾„±³£jÆÛŠÄ£+zw\oÍ"®X‚‰éŽ‘òç -1OAC܆Xó!bÝ P“äž,ÃBië¸jbû³ÜŸšN‰^eEú‰{2+E¾JL–8. ËšEÆL>KCˆËò¡/›g-‘HÈ Š54ŸH¦Ñ¤2];•¼}IfÑÏ1 ÊÚû³ÐŸåÜ»¨q‘æânÅêŠïlaI³dé³ÄE Ӿɽۗ'—–X$bÝÅÇ‹©'‡ï´¤g"ISUg°´Žu\J1MäòO¥–˜èuVÑYäK”I©4‹fP>KÃhP‘8ãã".ÓMj fÊZB‘(ŸUgºN*ç•ÊTuFNn^F‰Q¦L•LešÕµºêÏbÒ¶Jô2«HaY³”£”ÏÀ 4tw}<ó§Æ×Áæ•§¥/QnWZb‘(Sü¹™áǾ”i_í/©ë¸Î+T¾é/i²Šçù’/úKŽëÚrüÀ,6¿À_í< Gš_!Ô/w‚]«ëÁý]ÙSl]ص¤‰5KfÐ>‹zêF?趯/_¾–¡º°ž-¬Ú_%<ÓO“<¡fYÕ”Òfuµ¢ÛìÆ¡‰l|¶þ_{—/©„µ˜ÁÖg`ØÏ¹QV¾q)HUÆ[f=üÚT³…U»¢d&÷qN£k=M©êËÌ9=¹CrÄ• •sÝEÒ`$µ y%—…%Í’á’Ï¢H¼HW8‘q–±¥ w  0e(•r»YÕ¼NæO Ùh u‚߆f3Øø, ¨ »â¬ ÷[ƒ!‚ƒ‡ÓjÇ6u\Œ(–T9„û³¦²·B1­SXΗˆœgìœC¸†ãRØçe3ZV+a©>DƒEåÞµ_Fý ÒÆY Š.;VˆM"W¬»8³+ä]”–W“Yœí¾i–ú³À 9«(Éó¸Htˆ9"Ú$*Ö‘fq>|VEé f_ÒÄY Š-ÒMâ3EÕ²î§5ÁÎt‰·JQ•ð' *~TåîÏÚÙÖ&«èó%¢ÉڱḬYÜ Tù, ¢Aï7£{·/¡á’–ˆ‘+ŠWäïq™vúI_¶Õ8‡ÌŒ€«3XJ£üBΫªï$tw²Aý§²o»/i¸A¹‰R$ÊgVÎ{F¡þ¬Îpµãž…k긔¹cNÏåêÏÊÂ&«¨–ò%Ô,›Aù, ×Çk3ã,Ç%d0ŒèÞåKd¸œ"a>KÉÇ/›ŽûKRû¬õjIø­ârIã³0®ö—´ CÅ«ý%m>‹†ë\$o·0àŸaêãÞ€—<Óúã„IPÝ\{ÔJ=ɺ}éºâç´xIã6-’x±³ÖÇ1Br¯Òn5kaùú\.ïÁŒ Q»°6„¯Î-­q¹z?-çd|ð[±Òë´]%ê¯9ôó7"ù]³®»@c÷¸kìB]ÕrËØ…:ÇrËØ»Ç]cjÿãJ jÉy›j5}úZçð£<èÝõÎáÇiçðûÛ®v¿?w§7½Ö9¼ ë°sxû¶‹ÃáúrçãÕ5œ)ïÐN~g gÒôäßZÙòõœsg gò ز}k g¨}‰kh©%ÉômP´Ýý«4Á¿º7ÏÉ•3¦ÙÃäÁm`ËÌ |–Üz–ú³öÛ·Mˆ¬jrEµÆ•æ™¶í4,æž/xŒvGÿø-_áð_³I¹wg®¬%"Iòy¡­&ªIa§QH0‹J+4øêqÉŸë\ÎZKÙ½?KýY;Yšž ãCµF=Ú=Ðöc¬ãù£™mM9#Ìð¤Áã +¾äŠ€ž¡äv‘¾vs žÏC¬ŽwÄöó‘,,ilÑsæ¼ Py‘ü>|SA>æÜÌ_kò¥@ùÉ525îf ÞÝ|«ÚûF‘Èl¸VWƒû¹e[¾Ä†‹ZbÍ’¤ÏÀ¨¶æÁÜVZ{-EcC²u©íN•¬óä¾+VÛ·bù›(k);š-lc{³UníõY¨Xrªnâ–:q¹÷JXÔ¬WÁ½öY‚%„+Ùk6þ4{ÚÆË;Ëo3ËSùz÷g9x~üŽ6jRÊ£Æ.B5Æ;]©¡õÚdZ¯Ä®„%Í¢”á’– jë1ã,O` <*¤j »£Û÷*ñf¬L-|‘wÉ«Â6âx!|aÿÄ '„Š[Ž÷—´šõyIc¸´›õêþ’tnGûKšð‹ý%éïí/iâÓ/ö—<ê88GÈuìüÍþ’ÇiI¨…EͺÜ_j_"Ãuµ¿¤áCœ<¹Ø_Òp5¢¬¯ö—4<éôËý%´c#,i–Ì |Vöf 4â¢{wFÃ¥©hæEäŠO$Ó(2³“ o©ŠqbAÅfæ´æT«þ,ð°bhÍÝfV·á{%ýDbÔ ¢l CåÍ =„+PÄ•Ý{¨}‰‰(±†¦xY›Çé…ÑÜ£Ælz"½6/hÑT±¼Ö4Œ˜>¡í[‰³Ø¿:ÔTã˜V¯ IùìÒXXÒ,¯û³v‘„z|Q£¹™´ÃÍÄ®\«Ñ|tg5šm ÆçÍÆp©®æ¼Fó‹²ÙËfÃÝ²ÙÆg—Í^]xðsn˜ô}gáÁÆ90z¿µð Ô¾äOä›Öî xüÁŠÆgyAôÙ —C¸G€}Î*:……759¿3Á¡JžT—6i+CÅ—$L޹ºF\tïÙ—4†K)½ùù‰ ¸ë1mé‚Ë}Ó¶uh–Í |Véº º+ÎrærU–²ŠÃP¤ |‰Èy3Á¤5ƒH[¥Ôµ¤RÆ%ÁB\Ù½‡Ú—xX’6§S$ë«Ã2dzõ;ú6çO 0ŒgVYó}΋†ta½°Šû³ª©Ì*"y"e²še µjºH]TtÝ·|C}Gu{•_p †ta×’P Ëš%“Ï’ž J·¥õ¶§u\ª<Þjø¨øøo¶†ÚM™œ¿¸Õ0TöúdѤ¬í<‘ò‹E“HŽM6hðxѤ¼fãO³H6/óe×ùÕAÛ !®º5 ÔãÖ €M £ÉaTð¨ïAVÚÆ’¤¿s„?ˆ šŸäß©¿ír ¦÷iÞôj ¶]Ë=kŒ/5…åšÑáPžA¾Ó’"Hx–ú³˜UT K¤…ÈùU‡*Þ®Z£çèý@XÔ,šAù,¹w¡A.÷/ð¬Å`˜Û 7h>„¬»ùx%O”é"Iæ2w{‰rçýYêÏ"µÇ-?u¾¬”ø*Ҏ⸊°ZÍ’¤ÏÀ0âz‚•²/QÿC"7˜YÆu?/Óv¦‹Tr&™7¢„¿ê¸XJ#2›4·÷g‘wVQ),íâ{3aI³h:å³ 0„gõ"°ž\ûÍÔ?'ù4‘KÖ]|üyå¼zR”ŠqŸÕ.­cÊ''ƒ¶ª ¤‰\ÁÜ»½JGå¬H¨ó%5KfP>K)…Ý—{? ûOmßh¸¤%‰òY»H~³ƒþ’¤f×úK¶rØ_’ìÛµþ’pÚ_"a5šuL·`œr\ßô—lR8ì/yüêÞ W¨µÄ"‰¿/ ÃÅJÌ}uZŠvgZ><Ûô6¡s®e‘i4eânkîÓâ%waI$Ñ5fÇ¿¼¢y+Aãš»ã ×VX®êÜÒ§ˆú‚{ŸÚ{É—[—bùf&·Ô¿ñAòõœžo EÆ×ó ‘H³”]¾eìÝã®±kóõwŒ]Ãß2vM,sËØ…ZKŽÛT“|z6 u§ŠŽkÛ°;‡7‹t±søqÚ9°ð¹sx“Ïaçðæ/v'ƒÔ9œ4ë¬søOv>æ5œqþ| ç¦YûÎíöÞYÃYטÝ[Ù¼ ǪÝYÃùQR¿ZÃi_2b߇µ„"‰J˹î=òÓR(øèdIy3¬ùŸ½¸`pí`ã!,kV6ƒÏÒ‚[M»p‚Õjr…ÖØÎ\xíL FpõfçЛ ÑÌÆ´Ï7ÚÎgD_õ‡wHBíÞåK¼ã€Z"‘ÄÇ,Q[Ähغß§$ë^xœ.â7v«PXÔ,™Aú¬ 0¶ëÿZ°ÅŒ«£½?KýYœü¢ÝS| ´»tœ—†LŠÇªi·Ä8¿P@Éíæ7}NÏޏäÞåK²á •–X$]„Ò÷X|m?Ó*Ë™fÑ Úg` Æ?‚­ÇK‡]Í\ÊÞìÏb!âÓâ—H¼Ã,÷µ~Ú^Í@«¦1²2žãÛ#Í#3½ý?ÁB\Þ±KQ W­%IÿD¼`aI³ømòY|6=õ{ÍC±×,Ÿæ…+ÚȲi>’ú³º5[Ëç(öGôÏœIñf þQ=ŽÔ¯°¿\¨o¢Ë?y{u¯yãk]«kaI³¤sÖFè©W´ ºóŠùòñZæ x•ëK^MMUT¦(S š5 X5±ª…êœ=ÐÔÆA–¼ªÕ¥õ—_Ç /©¼Œ4‹"‘Ï’7“ŸóùFyÍ©ì|,f½1ørtrõþ,fåéŒä¦äÀäÚ”Iñf :J¹P9W!!b¤jËq•—…%Í"~“–H$BƒÆ‰B–D?‚EL‚Rš›á×ö>fžšªþ,¼ ¡á£n"ÐÍ" u$¡CÑã’ZXÔ,šÁ*þAdd-Q4Å8˘b3Em V¼X9ï*Q) _Ø0äÑþ,eå@USât)c&Å‹/Î9.µ,ï/i5ëóþ’GíK¼›õâþ’íÃáþ’M¦÷—üèéÁþ’íÙ.î/yÔÔD&-Bw}Éã´¿$œö—È ¶>ë°¿$ÔîݾäbIâ{úK’.\ë/Ù㬶¿$iãµþ’Ðõ—<þ ¿$4L0…E1Ú Êg‘‹64t¨—{§/O.-±HDñŠü%-œ ãM³˜jöæ ÒÏ"¦EYg2;æ~Ô8©ñª?‹tz&Ú)øÇ)9߈‘:gŽKÞŒÐÃ8Q ^ XˆKî]¾D¬¡)^‰$þ»’IaÉÁH° T³7Ï<1èþµÃ¯TÑÁZ©[ Ö~(§óÃ\Zq8âVû³¤?¯n-‰ª×³>0Álzä½çPq»!*¥yjp —ùQúoN‡–H$oòw)ïÏ ô¤PXÒ,mB”ÏFtgœU½©*T´I¹wïÏb–RXÊ—Ð/˜ ž4k;âyCTJãº'¾œ^[ˆ‹GUù’ýx›ƒ§HаjͲ€µœÒó-?]K—ã¬Ó:.ÙY—lwj‹äD¯û³˜Â’åË6±±–Õ*ŽK„ŠL@6¡62(D\2B6OÙp…JXI6ƒ”é´¹õì&‚¬óÒ:ÖqÉ;‹â¥G¯’'Jôº?‹5ÎÊ—m˜ BÇ%*çšÝnííª‰¸äÞ+_Ͳ–H$`4hР„q–€Œ!;¾Xáº=Îç® Š>^ẉäó ×á¯p}Ôàôx«î¦Y·êÖfÐ>ëêVÝä(¶ê¦*³­ºWGl4å­u´ûG#64%þxêÉ£ûËå©'µÏ²/¹:õ¤a0ª@úlꉘ’ü »r•‘õ¯™ŸËȃÈ^¬”ùx'O˜éRZR´#ë¸Ä‚ªB…Ì©sïb[ÕŸ¥–ó%duE.ŠvT}¯4ËfP>‹ChЈ‹*c‚Uû™¨%’B&rÖý—ÊyeºÈîg޿ɨ´ÎYæ˜y(9‰&[¡ýYÊ*:…% þY*ˆ*aA³<üI>‹ÃhÐÐ] ˜ˆKî]¾DÜ å#‘ì)’V$‡Í Mvì—šàÏý%uæî— •/úKÚ¬âi¾ä‹þ’ žGï_ô—4ˆëÜ—|Ñ_²iVß³\bTžV§Å{D{€ àÏø©¼ÂÄáª1~)ËÚç<íü6ë¥èá9–ÙtÚ?§.,‹d)3K#ö×¢fʤ sËkœÞ©Ô=­¨Ú‹¦èÏ>û6Ï ð"ñ·6%À~@õŸÚ¾E‘vÿT$_»@c÷¸kìB•€½gìB“‰¼cìBg^ìž± 5JûÒØ·©n2½Ø9¼ýä°s8ŧ×:‡ßŽ;‡Ãt?N;‡7x±s8ÁQçðfß.voGuØ9jÃõåÎÇã5œÛ· ´uk çík8ka]^Ãùþ6uÞßZùÝ7µ†ó'ÚE!å©/q›<-eæü›¦Ã,H ½ÓJ¦|°í¶[—2Ïaº2û=g¡¤fµ3•š%3HŸUÜ>jHíþ,®±íŸK™âÂZÐjÒW¼¿ç'v²_°bBY¦vÚjf‚U=×_ºwù’P.-«•HâOРÂH¯{>³fE4bÅZ#>Kdþ šÅ-?öYÑn•ºNE9ÞŸÅþ¬ˆVʼÖ…®NnqÒÝ "‰†³t‘ôñ÷Ëp±çW™™{žâ7ÄE÷N_"Ã%-É"Ù|Ö›×*¿f”ýdÉ"¼iî| •°¤Y4ƒöY¬ãì&ŒŽaŽÒ#C¼?ËýY/€¬/ö/xÒ]ŒJðÚ°€4ç¼hO#a´Í%nüâÒ`ìKBe¸Š–Ô"‰$Sû%#”"¬F³dí³0ˆ3tO,è\MqñþmïÏbV¼ñHÉ­Y«ä'ÝõñÙ ?#:58:FÔ„«&Nã’üÚ ââQé«ã…–‘„FX£LÑ ` VÕŽx¿©è Öá¹éD=¢SýY$g™Ö›à>xCtw|«xßhªòOÍ‚§©ÉFHæ)ԆˢHdå³²élРgΫ_Sö€–B6Ä“/iwh‘d«šèÏ¢å“Mtr‹vTó{UB«üKôîZ]îÏ®ºA\tïò%Ò,k‰|–F =П¥-? ŠåOåi«ZP¦šé·åÑåë…<¢SýYÄDÂ!F(Â.ª9"T„­¡´‚ºÁ5+›ÁÆg `X$„´åÇ-?Ä£BªÆ°D·Â½BÄÂÊBÑÂ×ÑÉþ,¢uãx7û;*8ã¸Ü&ä•kaQ³håÞåKd¸¤%г¼O\ËßÅ­3žS¤§ÐÓ%7*¢T¬©(Tñ)#WèT´«8XûTß«¨úœvmr¼¿¤Ñ¬/ö—<º¿œì/iâ¬/ö—l÷—¤rmIÒ¬£ý%©bíÚþ’GÍ©?ëêþ’ÇiIÍqY³®ö— ®ã6¯õ—lÞù°¿dûp±¿dÓ…Ãþ’$Óký%¡f[UX}µ¿$Ô伄%1Ê ÊgeoÖ ACw`".1Ù—´Ü ˆ\‰D|¼˜zrøb÷Åû+# \³Ì/0󠜄³Ìcx6rΊœçK(Fé\6 Ç%è!œ(Pï¸dÁ â’{—/‘á2¿‹¤Í¤H™dùøÕú£ùqÚ¸ž¯À—3i¡ÉGÕxçëyðÇ),é\8Íä?þ “¿½éa&{í‹™ü6SÌ–¬óLþqqEª%øX\±}ø\\¾+®x|W\Qg/Å}Ô7×Õ±¸ÉU¿ ¼5W"Ùdúã¤b'z•UTVƉ¡õnª6ãÚ •d‘Ë(TÌqÉ£ÁÎt©åg÷%m&…%HIÇm·ë„ÝŸ ¢¶‘OÐwXÆÐÅ õä#ò?Ã\–‹/S™+‹$ÔÐC•ÌõÞŸ¥þ¬ÛH·—会H;šß •íwöè=å(™–ÔôioSu†ÐƈÙMÞC¸€'—H¦a) qè‹£Œh¶ÏU¯Ïè(óSG\7c™Ö.¬V³dé³0Î+TT¡Ü{—›¬b5ÏŽù‘ób‚wÚ±å¸D¨0zwŸqIÁ âò°$ú.jIɦõC—Ï-ÆÞ…È_¼f2βfífðÀg`ê %KÑ•9 —3·±½œ½Î*jžÝš‘CEΫˆ_ ¯ÖÕ\w…Šzc>".møÌ¾$Ô†+kI#’5>Ûpüj¿Í>KO`4ȧ>¯ãr'šÖRñ*ë’çëßdÂR¾Ää<™à]5kŽËêlEç}sÐÅ º½tïºñ•.PK²HjÍ’´6JO¥Ážoéüéii¸ üì Dí>*ÇâýYêÏzEOIΫH´£Ü¡ån¯›LJ5.ƒÓbèè1Š/i¼ 5Ë"‘Ï’7”ô|XyÍÓjÇ ‹š:.S¼YNž˜Í˜ð¬ýY„yÊ—˜œmùÇ%*$äÙ&@OW5ˆKÂ’fÉpIK²HZ4(è.© X Æ\ö*šˆòTæã¤äð%±+¤Ÿò(òþ,õgí¡UhÈy†c Ô/(’È1F}”¸DÂj5‹Q}– —Ñ DÂ8K˜ gENk‚Mñî«n긾ØWÔùh_u“Uüb_õ£™‡²ÇÛu$~y…¸Ì`ã³®®—HãËâÇó„6™ÎJšumžÐæëç =jï‹yBátžÐ£f²¾ñT3f'#ž¶—û<â©aóŽG<ýü§OÿIò½‡|£Y·(øæMoQð­¾kf8î/Ùží´õjIø­ârI›IQ3ÐÅþ’:ËSÅYûKš ”Y÷s‘&·Bcùî$·Býr·’[¡>øóäÖùÆpšoÔEj®Øq¾14Våíó4뢱k«›î»:xÏØ…Ó|㟻P¿Ï-cÿs˜>rSÉ­P;½[É­P9ä{É­F³¾è~œæÃi¾ñAðóh`Ña¾±‘éÃáúrçãÕäÖvCNï$·B-¬[k8Ãi¾q³oó¡;Ë7n.æ›øôVr+aKj·’[›f!ˆü£ä–&WçoL‘ÑQ¾1½öµ|cª1;Ê7>÷þ9¹(’tCn$·¶ü‚ò%w’[á4ßøøƒ|ãæOóÛ}»˜oüÑ…ƒ|ã&¬ó|ãar+Ô¾äVr+Ô´ý­äVã³N“[ßä·o;Ì7&ƒr-߸ݷÃ|ã&¬‹ùÆ6¿p'¹(’í"ÝIn…Ú þIrK³&Žóɱ\Ë7†Ó|ãöÏ.æ7)æ·g»˜Ü •/¹—Üj4ëVr«‰³œÆ»˜oL¹Ý£|cýá›|c¨ÿ¨ç<ßxœÜ õ½•Ü •°î%·vŒtg]Ì7†ú’óú_Î7†Z¥šWóM}È­äV¨|ɽäVƒÿ(¹¥É±‡ùÆÆI|‘o µ3rÖÅ|c8Í7>þ ¹•ô”ù’;É­PŒ[É­T™p”oL_}-ߘ<àQ¾qû‹ùÆpšo|üšoϳk¼™2)_ OK^æãð´¿ðixÚûÃÃÓóóqxš|Ic¸4õñê<»Çé<»s¸8Ï®ñY§ñ'ÃÓ’ž~ž–¸ÁÃÓß OK¼åÇáiéúŸOãæô‹óì¶W8œgþ`ž]cí³ÎæÙ'~1<-ño‡§¥ûöqxÚvß>OK'úqxÚë~iž]m¸4õñò<»F³4ƒèê<»Gý>~ÓÏÃÓš=ž¾žÖHûxxZ¨ïÎñð´æµçÙ…?˜g× šuyž]s‘g}1<­±.ÇÃÓÂwÃÓËw<<-ÔvôxxZm•OæÙ”ÆÔϳk §>^žg×UÏ :ggúyxZ¨ýöñð´$’ÃÓ6ïüyxÚ£F(ÇÃÓBw¾˜g×8ñìÞÃ̳KÇ{4Ï.éµyvI™Ž†§%ããð´t?OÛdúyxÚ£«û³‡§…ûO{Ô°õxž]Âo׿Ù5†KS¯Î³Û>γÛPÍçáiÛ‰~ž–bÀÃÓ¶/ø<<-4ù’Ãái:ª>žgºëóì3HŸuyžÝöápžÝvn§óìć|1<-iÖÇáié†|ž꺧ãái¦?ëpxZ¨ùª/æÙ5šÅ9Û—çÙ5†KS¯Î³ûñ ÃÓBW'O‡§mºðyxZÊ;žö¨ÙÖãái¡É—O{Ô´ãñ<»P›Á/æÙ%Ss4Ï.Ô¾ä‹yvI Góì»òqxZº;ûK¶gû<ˆDšuqRä¹± 4v»Æ®É×ß2v5{|ÏØ5±Ì-cj-9nSmås˜Éo0ùÃÉeò†ö‹ÎáVXÔ¬«ÃÓâŠûv©s8ÈQqÅæëO‹+þd磖FÞZÙ²cÜê~g g[ sg g¨žàÞÎМÎwk8åKTT-PåjÕ}éêÏ¥@úS‹Z¹{ZË]½ö{±½*–KdËzÙЋÁª0Ÿ|ÜVû³ÔŸE’é&[Ç¢å»y-ï¯/ {µÊ7/ùÝ^Žëµ8‹$ÔîÝmBª¸Ñjb‰dB¾k2·ºWÛã±PY{±½„Ù¢fÉ ÊgiK£Dku´÷g©?KñÂÀ Ï\^­µÖyáõöÚ\…­%Ùy}öæ´XûqyM·øNŸöÒoížî°‹^+Ĺ\¼¬ÍBr¬*×^ìJ³dé³0„ó‚õMK¸zKÙ«ýYîÏšif<5ÖÂka|Y%Ÿ¼Ì‹Ã!±~>/¦oDb,Ä%[E_¢ÝÓÒ‰dXºÂEÇk™}»ãYÞ6 4@HXÔ,íŶÏb²AhPÐ=F/åöF!¼²%_¦e¶äóþ,&·º5â›æÎ1`Dʸä}cÅ’¯”iìáÄ£±œ‘$6Ð]ýÎ/ÀéÉ—h«;µD"yWÎ/H1Ny%­…%ÍÒöxù,9d¡AAwÆY¯7ÓRú³âcÑ7@ð„”Ïð‚%÷þ,ošQv¯R!Œ£í„ϳ•àK_|ðq¨Ø¼œ^[ˆ‹GUù’ýx›ƒ§HаjͲ€é³|)t]¼)Lq–.Ï ŸNsnùDCuÖ’BÕ ää÷×OÈéè†øî@$^g¬~@™ ".!›§l¸B%,‹$›ÁÆ@Êt ÚÜÊÊ£Óxˆdëj»C‹$[U¬Xmß¼?ËýY´–²£ÙÂÖ¶·ˆ$Ô.TÎÕ³„ý骉¸äÞ+_Ͳ–H$`4hР„‘„€Œ!ŽöbÓË;Ëogþ¨|}A¡ÂFÞŸ¥äpHA(¡Æ.§—Á©÷ï€6¡ÁÜ:A0—5K¾D>KZb‘L,3%¨7ÜWÕC#Uaؽ/½oR VоÎÈ{ 4Øû³ÜŸE„/ìJ;zžƒÂ>„9T|4¢f q9$¥/t€K‘ä ¸a0ª@Ü ‚oÅ€9:Lš…¸Q¥bÍ…&•A|š#×­b 1­¢ÝªˆÉ-ÆÎE$á.ÒjÖ D†+ÔZrNü'ÍJ]'ÔhÖûK~ þÁ<¡&ÎúbI#ϼ¸¿äGOFK— ‡ »ã,Å%ÁF\tïò%²oN‘H${¦kÓ,æÀ”SÞ,gÔÒ³ÍY¸M뙟cæN9½’í{TyÀ’! uîð<«(1Jç”ý,è!œ(BEXÓ›".1EÄeŠWΈ³éœéRZò¹”tûØÅ×Gñ¬“ÀÐ>_3j ã—ç:€$‹çV8‡Ë ‘;,CaÝ_ë€ {×eã ôœ}Öy¢WYEH7©?‹8‘´£9.*ŒÞMD‰5$âªÛˆ™–”–H$ã°Â×wý2ã ø¡ò^‡"Ÿ7VÜ£&^±"¬¥D»Ñº¼^ ÅU[XÔ,çÞ•èUVQøM8Qkf‚.‹Û0¡Âè=‡ŠÛ¹‰'6âRZR-?Zi‰D2½…š¿m@{b$ѯEÞN1íÚ—Ÿ¬ „xÅ [²"1øFxù*ûe¨Y'å7S¢WYEzçKÔŸ%&X´#9.Q¼ŒÞ«ä ãcrmù‘{—/±û˱H¢ Wóeï^_‚ïõYJ7 Eôý«‘»vàC ,kV6ƒHäÍ2ô5NT¢WYE¥°Äm¸?«b‚ í(ŽËÉeºöPqÃoæG9,I•æ*¥¡/Ɇ+ÔZ"‘Ä#DÊg…µìâÃp!Ü.žò?5Kf>+‹$TÐÃ*š5¡ÀS‰^eED9_âI]d‚A;V—EïŒv]A,Ä%÷._’ W­%I¿`¾eßc’@tǸöZÎ4‹fÐ>‹ã¼ŽK Þ*{¸œ¤ÀÜ»½d ÂR¾DýYd‚õújýQEïšìWP‘—Ü;}I1\¡Ò‹¤öE –4‹ß&Ÿe€Ág;/­S—®¥.¬®2/¹½Ê*Ö)¬“´¤P´£8.©³]&@7QwT·W÷š7¾ÖDÕ–4K:gm„žJƒ ÝgÉD+\Ö|KåOÉf'>ž‰^g•ÂR¾DýYtm¢ÅqÉQ*z—%§·õ—_Ç /©¼Œ4‹"‘Ï’7“Ÿ“´o<,@M§ðãÒ:Öq™â%Èürî‰^eÂÒ<;õg4ŠvÇ%*$DŒ$ôd\%ÄeaI³ˆß¤%‰Ð q¢¤°%E"n#‰·$kÈ€Ã|<ƒeºr`“|sï †&9…å|‰ú³Ž)PS§HB1†¢Æ%µ°¨Y4ƒUüƒÈÈZ¢hŠq–#0ÅfŒÚb«MH/v•Ö©ŽKΈN³¹A&(Ñ«¬¢¨ çKXß+¢C´£8.ÆèŠÞ×WšE3(Ÿ%÷._"ÎAZ"‘ˆÁ0·q^9/Š×|ü³ÈÔ™.¥%•CVÑ«32êÜ»l³[{T2ŸÆ%·ˆ‹î]¾DJ+-É"Ùží9a¤eBo\^ŽÂ¢f³Ñø, ¢A 1ΊÐ1:ǧ+ÀyÀð§*+Ïšt§LJŒ§ÊM|¡ ðͯ°¸oÆŒÂ,’í†0T ã}9šÿ¦ü³̡•á*ZÒˆd}u˜IÖss 4Ëß&K®'0ÔèfÆYzÓ÷Ø:˜œ¹ØõeˆQ´[ÎzŠ´¨štÇþ,|¾:ÿÑP?Îiôîûæ‰ÕÜ ¡ÛKwXùé´¤ˆ¤Ñ,™Ai£ôTìɱÔzÅ´º°ºÊù’‡êúK1ªf Žèô¤;eR¨šRڬεHl•³½®-¹×uÈúÓ/Èc_R{k–D"Ÿ%o&4h¨£òšb0hÖ³Áµ+¨[d2m_9¸œâŒBí¦<鎙:=»ÃsŽK„ŠfÁ{Q«츪F\–|‰ —´$‹¤Aƒ‚ Ž³Œ-¹åg*Óõ ‹˜&ŠQ ‹ð«³íMÙ æÜ èIwʤNžÒŽÕˆ€Ã¨ Ž>¾‰ j3hŸu5*ØÎ€˜Œ[šìh¨ÞÕ@íÁ£ ¨ŒØ¨#ñ{#6ŸukÄFÃ`¸%ëâÔ“ÍZN=I¶÷ÚÔ“MO§ž<ê¬üSOVê‹}Õ­°¤Y÷U?º º;κ¸¯zû Ö¬û­âÉŠ¡·âÖ ñGçW¿¬?Þ_ò¨™`n㺼¿$Ù£ý% âúbI£%Þê~qIzœ£ý%›ž^Ü_²½öáþ’Ð]ß_ò8í/i2)î|¼Ø_RgyªQûKš T5œëZI“wv)ÍÅþ’:'îÂê«ý%MVQªò%Ð9÷gíÞ¬Aƒ„‹ÁØAp‹¸èÞåKd¸œÏÚEÒfŠ™°Ì©Ìí«™ätúsOŒnzÊ”©’©9Íú¨°JÍ–¤m¨Ó¹ç‰^‰Q:— d¨Éyép"A½#°.§z$w"¢Ìq™çæM.§%•C^ÇoF7Q —K=RT[ü³¥LÆŽw•JMtTíR ´ö9×6¿ Ë„³n.ÃU‡hë^‡"aî½è\“Ut36 †‹ Þ#°†ã¡¢èݬ¡èZŧB\tïû­2µ$‹$!‡¾„cñŽ¾ð Ø­2¼½ðþ¡_Ÿ@o¨Yl/w·öò¼†QN ¾-,j–Ë!Th¤D¯ ‡p"ñ[EÎk,”hGq\d 5ÿM¡¢Â$gº”–Ô–U7Ñpe-iDÿ™F¾A>ƒ–Èh@Mc¼:»D˜‡ZÃ(Å. ¦¸ìÂj4ë´BÅÞL ž2Nl²ŠnÒf r¼”zrq\$Tœ<1?ªaIÚœ®„?Ý»|‰ —´$‹dû¶w9i±‰,^~ëòêÞÓQòO†©\ËxžeÓ«…Í*f°‰¼Y¡Â‰õNô*\·‘‰¨M¼?‹c¡D;ŠãR¦‹ù‡ŠJø  q±î)û’P®¬%H¢mÁÊ’øW¹ŽeÿB·N‡XXÒ,šAù¬ó:. Ô+Sî]ü›ˆ(7)_"r^ýY;íØp\"T½+TT\’Apƒ¸äÞåKl¸¨%Y$éM9¹Ùà5rg5KfP>‹vô—Ò:ÕqiÝ@*k—CˆeS¢WYEJ!Ë'T’«ú³(mq\º!ùî„úVù¾ñµu ù¨tˆ¡=^¼DbaI³v·>‹—B×å¼Ú1Ûƒ¦ŽK6DÖEùZ¤b«²ŠJa±L¡ÚŸÅþ¬ñd‚–l¯¬²* eɳAi—ŒÌ“ —„%Í’””é¤QtWœUyMøSs"¢Ä’‹6/_¯D¯²ŠDSlPû³ÔŸEÚQ—P¦CÈíÒ!ÛUˉg÷.aµš%3H‘` fPÒÄYç5Áæ6´àiǰM—p¯±Ê!„¢3¾n²ŠNa)_BrÞýY;ö¯9®:^l e\R@pƒ¸¬Yô%2\Ò£ABwƒzÁýÃ2ítnËZ´^¬¡(^”ÔLYD”9ÖL1 Gk3>eäꬢ¢]Õ÷*BÖX(ÑŽâ¸TŸÂP‡Š–4KfP>k-™m¸Ý%Åb0Î+çÝ&$ŠW|<ÙÕ¿9-I®F,ŽÊ!ÈüN¨É*ŠGR¾¤"çÁJe¾ªá¸H¨(z—fÙ ÚgÑVÙ½Ó—ÈpIKÄ`ˆnú¶™á°¿$eÇÎ P¯ö—l^æ´âjIøœ¿Ø_Òø,Œ«ý% ƒ!Ãõ‹HÖåEÉ¡ÝðÒÅê´·ÿA:M®‡gƽSü†òmñÁ'½áW™§:÷ä«Öümžšª5NÚ÷®áOɳŸ ‡?ô¯¾‹Ï)È<2ƒ»vsÑ’U‹°Þ¡H©nZ9ÁqéXA´@™¢%G"±cÿÂRnï¹f]5v¡«ÓúwŒ]¨«Zn»P“ó·Œ]誈ÿ–± µÿ1·N-9oSõ¼Á‹ÃÛ?;ìNhðZçðûÃqçpøƒÎáÇiçðÆ[^ìÞŽ÷°sx{Ó‹ÃáúrçãÕ5œéÙ&ðbwÖpnçÆÎû[k8·|{òo­áÜXnÙ¾µ†seŽ«&¤% ÷æ!¡›}Sõ™Ö¤j§-{Ký¾Ú{{6îßv%'Wh­…Å-?Ê*ÒgyÁ­÷g©?kÂ.’x§’F¡–H|YŠLcèM’Œ²`sz aOÝûž3ÀOƲ§|÷gÝ˾ùzî“ør,ûqfh|ÉçÍíÃafŠÄ¯Õhn?9¬Ñ °>×h>j€!4x«lv{нl6Ü-›•H¶7ÝA°N´¹þ²Uú ù!ú}õÔ ûYU®e70ÙMÚ+¿ižÜª4kQ|–& V5΄î*” (ñ·å¿ê'mϧ.ïS¿i9ƒPŸŽÏMq‰Ú„ˆ¸´e[¾D†KZ¢?ú¶½H¸ ]aÇRØ-Í i"¼œ5Kf°òYDƒî@œõZ^@·™núñ ˜šÊï}4U¹rÞcÕ˜b\Nº{bøÐ#ì§í4TÌqÉ&SŽÏ1â’{çü*.Ý,’íåFÌ«‰ð–ï[6ƒÏ2À$twÍ'†erÏÃnÕ „\–M-ñ×s XU#mìþè4>Ñù¸‹$tUôî®%­0âkë@8ÿÍ>^j¢Cû³ÔE"ÚD„Š…UiV‰ä³*Jî]Ð݆k×’†ÁÝ$"Ê•X÷CiÙ•wÙÝa‘¹±8™ßi˜ŸÌ =êB ñHb˜²HB/…è•ìϲ°¤Y4ƒ•ÏB\"4(Ä¥8˾DÍZÚÜ$‘Èëî ia±“æ-Éhf®³aA3?º=(™Srªb[ [3´¿¤°DÁï/i4ë‹ý%éúí/iâ¬/ö—4†+kIú±¿$ ëhI“øbÉöÔ‡ûKêlÅ7ûK§ý%á´¿Df°ñYÇý%)‹}Ô_²½ÜÅþ’PûçºØ_ÒdÇT$pµ¿¤ÉÜ©°újI`¢·–SX/u³’œçþ,÷gº;ÎRæPqKnPˆË¬»R$ÊgqFn•)FZ_Ùe啑ιêƒ,6ãzf¾™W¶¼äÑë »E¢ŸHŒÊ*fš|‰Èy1ÁêÏb–Ãådß½‹ˆR0¤aD\Ù½‡Ú—8-©&Š$ÂÅyÚù»7b|²ô‰\A´ ¨·ŒØ\ô+W&ÌQc²Ûߦ*â²–†é_Ê!T¦Ñn"ôN49¯ýYêÏ"ÇeB…¬¡BÅ—„®Jžqɽ;‡¬À]KE’~2aœÉŠ- cŒ^U\‹:GìS6!ÆEsm<‘tE1”ª×èÞKÈCaQ³¬s2òf‚‰Úª|‰ñ›vÄ‹vǵ*»BšAÉeº‚Cö޶üÐpIK$’xRhÝ_J÷t4'#ç'rßÇD ;.H5Ç  ¦]Xf ©Oå'&_E¯š¼KdIÎW;â5ƒˆ—Ž^Ò¶è—¤ˆ ï‘{gÝ“ WÖ’@‘üx”¼EÍdŸ8„ <;Ñ,,iÖn‘È›©BR8Q ^˜Âeq™?Øâ²†9ÏñJž(Ó…ÉŠŽÞðWuA°Wvï¡ö%6\Ô‰d|GEƒ_e>Òð|ÍåïHXÖ,Îr£ÏÊ" 5ôP—@½"0•C¨cTD”ù7¦°ÈÇW¸?K)S}µKïù8zPmLp‘_[î=û’ÖpíZ(’ôG'<bͲ¤ÏâèÙŒuÅ´bj¿–¡º°.‡pî]×_|ü®2¡R&«™÷g©?‹J›Õ9ÔŠnÀ¸DfC·7ßëPßxëµÄÂ’fí:w೨§ÒàÓTwe*\¦Y'eÖÐóùTKÀ!9U3Ðë$‡,æýYêÏ¢;T‘š]¨œënãCmýåä1ÔµT ‹š%3(Ÿ%oF4hÈ8Ë@F‡Ü†`‘S†R›—Ñ|K§§™{'dsVq‡y “3_BrÞû³ÔŸE ©-?§„­DOÁF\YX­fÉpÉgQ$Bƒ'6qÖy™¶¹ -xš±)L‡BχUzZå#âSC “œÂÒàd‘óÜŸ¥@M!œ «ö)úÈqIh„eÍ‚{¯| —Р »ã,G`g•óêIñ‚'Q¼äãÊk¾òþoZ/b€”r卵UÔ,kçKD΋ &í(r$Ç衊Þ-,kÍ }ÖîÞ4(Ãå8‹"ƒ‘E²óH¤O*ç¿è/I–ü¨¿$yôký%¡Î½Ÿg¿è/ §ý%_ •ãP1ÔãÄõ¹¿$ÔZRqƒ+‡ÛQŒšJ³¯NKé‰ ¨ñ/˜æJgÎzUáG´ ÅNO è× Ö…ìÜÒ§w2(3´o+Xˆv,^ò¤!ÓŽñw²´·uOû·— ÅZ€ÙëÝ\.'ƃ‡°:ôxÆ/('-@QÀu„΋„šeÖýޱkj0n»&_ËØÕìñ=c×Ä2·Œ]¨µä¸M5} v§ºškÃéïuלê7ÃÉòu‡?èNFõ¨s8YòkÃÛO;‡·Û{Ú9ü';óÎíïÜYÙ<`ŽøÎÎ 9p6ê­5œMÆóÖÎ-úàþà/×pÊ—dÃj-±H¦WAï´Ç£.ȳ^Ýÿ3quÏzË»š¬zrרF¿˜ÇÚ ‹š•Í`ã³´àVû³ªþ¬UˆCWâú.FÅ™6YW„"oŠŠÙ>Œ-Žá\߈$ÔîÝ…,y`-¡H^sÙ ñþϘ/ÆY¯îŸ£|¢_Á2†åUò ®ÄÔXö} ôvnÑ –܇„õ:Ûò#Ÿ•ÆfÒâ±=Åêèj–ú³& ã‰1ÛÞwÙlv‡QXˆ¦†ÕéQ•ÐÝ~ЏÜ&$_ÂÍtÒ‰Dû5=]¿}ãNèj·Êf99IkÔ½³[šE3(Ÿ%€!4øŽªK^¦¨¥ìšÐäþ¬a(ä|Of¶Ÿk·–sëÉœÆKÅÚ§ XˆKîýÖƒä³znC¹±ð ´Âº±ð ÔÐ;ƒ.ï §;(°ƒ"¡Áé2\¡Ö’«éé©Kþô^Aúƒ£É°Ÿ¤ÿ‡Ö#CÅæÜ ‚i‘ä>ª¯“ QþjƧñ­ÑJr^ÝÒ,šAû, ¡AýqCƒbÕ®x-¿M'?Ak¢¹?K±ÞTg ‘(zÏ¡bŠŒ¸‡ XˆKšõªÂ>Î-Àóø'ü}[õwðFƒ‚îZXÅ7õôP&×®hí0²Þ.µyùCóϼ?KýYü£ùqÂéÝiîÛw'œÞZ¾¹; §z¬Î|¤Îá;unçXÃwêÜÕ±:‡_Õù‹FÌÆ’ßjĬßôëFÌÿ,{cO¶† ïT³¬/n5 {§f]Ýj¸×®€ªê}mÇ‹&7ÛûyÑdÒ…‹&Cý(^`$¡Ãчâ Kõ!´ò%²H.–׿ ÆYŽÀÄ`0js<§HOC)%| lUÈS51LbUB«À ëqJÎ?š¨šñ¶"qÆèŠÞ×[³T_e–`"·÷!ÎÁ›gÄSÁ·!ÖÃ|ˆXwq({(Ÿ*:J XῈQ&T»âÍ@ &LZH$âžÌJiË™,q\–5‹Œ™ëé5…¸,ú±yÖ‰„Ü XCó‰dÏ"&’ŒôYM¬-¥2“qéÛ@Ó¹ˆƒlEúe‘„š»«ë•d‚-,i–Ì }–'= Ó¾¹ÙQ¾„<¹´Ä"ë.>^L½cQÉ$™3ýœ*aH!’²™Mš[¸kW4Èö<«è¬Èáþ’V³>ï/Ù,Òáþ’&ÎúbÉ£ö%Ê@]Ý_òó“ƒý% q]Û_’¾àhIèþryÉã´¿$œö—È 6>븿d³½‡ý%éö^ë/ µ{—/¹Ú_’⬣þ’da¯õ—l7ä°¿äÑ]ï/ UîÝÂRVQfÐùfÿ=¼?KýYŒÀ½;>7HlÖ]î]ù,VM8Sì´>þ,p‘À^>ð“UD”Ã’#¨L ¥´!°èáqZQ‹Ñ‰^eåÍ=„Í«¿QýYä6½“54ÅK,ÄåL—|‰‚+á¯êŒõU¦O¿ç“™® Kâ'TLGt :ýÕ®L“¿»Ûq{§ ËPÇíZ$¬P):jéf m"NT¾$G` q‰ &uD"Ê„ŠföhsºÊÎg¶qqU9dnùÙ W¨µD"™b„Å9›Æûߦ³XØër×{ˆ¸$,j–uNRÞL¹w%z•UT Ká²ûëÍæ5t~A„ £wfºœ–TYˆ«ZH¡‚gÔ=IK$’é¹”¾èòÀ¡D â“ÃDžýJO‹² «Ö¬_ê¸T4¤ •Œ“ ¨w36‘Û¨æSÌ¥¦‘o•Ÿ#Ç%BEÑ{C—T ˜ˆË ô%»á µ–H$ÑlðåMß3 ¬ÒábaI³v3؈DÞLu\‰õŠÀ.‹Û`VѬ¡(^òñ®L—ú³H¨(zgu†ã`!.¹wû’»U¤%IÄ.ØÍÚa¦l-,üšAù¬,’ƒgcië¸ð¦:ƒ|:õ¹9Ñ«³6Ï|‰™Íì!íèþ,ÞÝ|«šû&ìòO•q,SF}ðIÖfÉ öÊbs*ÀQj£õÞú…:.ÙW¨Èî˜âϬb•Âb¾„6QÖÒû³ÜŸÛ«"5ÙkYr!.!™§l¸-©4k‚E²Ï"À ´¹•o|bÂs.Ó¡6k(¿=zíë«f e¦Èh£Á!ÚŸ%ŽK„ŠñÎŽ„jŒdW-Ä%÷^ ‹šE3(ŸµŒ¤´Dƒ‚„-Ý&¤Õ5DªÂ°ªãîU…а²P´ðµë{•ÂR¾8Þ_Ø_—âEïŠ1u‚¸¬Y6ƒòYBƒ;toâ¬óÊy· y‘nGüÆ¥uŠQ:ÖÜ£Ð&>u}<7)…¥88GÈMì,ÚQñ¶#q„9T °¤YD\öYò%Bƒ‚î}9pís3CÇœ×Ñ_Òp5ç*_ô—4<Òy¾ä‹þ’šã:Þ¿é/i×¹/ù¢¿$¡Á‰ÜÉ_5àiëñ¼`„мrç‚ð¥Ãü'Z¿4²Wõ;®]Qç×8uñïd)ôhŒ’Á=­kîòþ9µ¡H¢+J;Íøªh«J%ó„ý9N%¹õ¶u¤ÆŸ`ÐQUù6!ì_˜a„ÎDò…± ]EkÝ2vMýÛ-cšLäcj^ì–± 4vïÝq›jÒ…kÃÛ‡ÃÎá¼æ¥Îát-:‡7Äu±sx“Ïaçp¨…õEçðö8‡Ã?oz©sx;ªÃÎáP®/w>¯áÜ£¤§o¬áL¶÷·Öp&]˜³Ù¸·†óá3»±†3Y$n9÷%4\Ö’Õ›ßs?àˆÒû½±Ïø“‚ú19÷˨TÁª†¯kí ’‹¶%7 ¯¹ÀïL¥f9_BŸ•Ü>ºz–û³:T–¾ º÷…ûù¶*>aã§…n·_—c‘̳/ áÒ²ZŠ$+ ùXž ¬÷$tBøØ9¬‘½îÿÙãIù¬X‹. ]13‘Í@5K[~ä³0úø,+C“Žög©?+þÙ£¯e\Æs‰_ Ú‘ …Œ·Ï—Ü»|‰ —´$‹$Õ˜1w¨Éاqd¯êwXÉ\­5àõøWÊu‰þ”²fÑ Êg)šŒá¾­ëž—²o£ýYìÏš—¬{ij…wyõ%>úð qyFáîKBm¸žn ¦HÖåŸ#Cî­PýŽ“ š<6>±æ¤[K}bV«Y2ƒ,'ÀÌÐ}Ã!ýPÜûÀ¡²g!kˆIP¥þ¬·‘/É“hc‹2­´þ§qIÁ â’{—/‘á’–d‘¤3ì§ÕÈ^÷I(YçÉ}]ž»R ˚Š&òYBƒ®~Fœõz•/èWÐgÑ¿—K>ôè_ˆÏVžZ£˜bŒâ-þ'Ë‚¯³H6ï|¸ÝåçZ^ÚîjÃ¥ÁÖW·»lšu¸Ý¥Ñ¬/¶»4hPÐý|»ËñÂôÓÂd¯?.ÜI>ëláÎ_»oþòK÷ïΆ¨ÐÕ‘Äw QǧþàtšùŸ…?8V³flÁ¸Õ.¦ÓiŒ«ö@ 7.lsC¬Îw}ÕˆëÞ¢¯Ð˜AÈ‹»×Bc¢i¼¯î^ ­¢»º{-Ôvô”v¬zcY‘›kbóàvåéªåÄ‹{—°ZÍÒ­¢H0„3(iâ,AÓMâéé·åÑ+_Ï-šÄFÂBÂ!çLpš5ÇUõg¶ Ð*.É ¸F\Ö,; šoÎ$t7¨We¶ÒMâMäÝ÷ +{Êg y“ ­Ç á;s ÆÎû³ÔE²„)ú@¨haQ³Œ¸è³²½nР »Dâ ˜ F¤[nP3çź+:DܨˆÒ±&£Ðªˆ‘«bZF»ŠƒË—˜èœÉ‘šãªú³½WšE3ŸUa 5kÑ—8Îòl0¦›HD‰¢yå Ùñ.ddÄՈſcæGœÙ"ñH')¬‰ÂPSˆ"E;z–4k7ƒ> CöMˆË›Ïv_Ò0¦›$¹fݵåG´0ÙIñ–d4Íu’5?*æTœ*ÙVñ°¿d+¢+1HÎ[XÒ,™Aù,FïFƒ‚îš™@Ä%÷._bÃ%-!뮉“'J«ˆÝ'﯌€rÊ"(¿ ÌsÊV8ñK¢W‰ªÃý%f}±¿d{¶Ãý%mœõyɃî]¾¤eÝ?ï/I×åhÉ&Ó‹ûK~ô`Éf{/î/yÔ¹÷œèm²ŠÒ¬«ý% Çåþ¬‹ý% âòp®‹ý%©®æ¨¿d¿þWúK¶o;ì/Ù ÊÅþ’P—CHX£tN>+{³ º;Îòþ,R9zo¹A¹bÝ•"a>+û’6SÌ´¾EÂê ×m°¢CµªQ}ˆ*GXS¢jסœW¨HŒ.á[J÷´½™ ‡ò%&çÅïárÃqI½“â5¿ƒàq9-©²þªÜE’¢Ý>+Zl“¢a Þ6dŠ£g*?Y^%ÎzWN• ;?KQJ¿”îé“¢!é\¨ $‹cèUV1ƒúM${¶=Ãe¯^í¨acš®²Gï¡s\²ýÓ’Ê!g÷._jÕµ¤É:AÍbÌ÷˜S³ ¸èvô†¥‹dÆ" 뼎KECªPQ9„pbõMVQᲸ “óÊÏi[¶_kºŠ¢w†ŠŠK2n—KiäKT¤&-ÙE²½i×søíˆ¡ OmÈK»Ø¿UýKö Ö¬óÒ:y3­È81Ý7€z71\·‘‰¨ô=ž¦Ÿÿvt¦K}9zM¨¸Ç%I™‚…¸T‘»ÕЮ]KZ‘¬L .ÈFaaƒ„EÍÊf°‰«wèÑÖq©hH* —•{ÏDTU4Å대>(ÓµAÃq¹?‹£Õ+hË»£x ö%6\Ô’f¢°–Saáwômú;û„®‚ºHºbº|¼–冦BMˆ¢xÅÇ‹2 ÿ&r¾R@ª¦ög¹?«ƒÁPQÆÁfC·—÷:ßø]@™EbÍ’¤Ï¢žž×»Mˆ&:ﺎË_®À嚺;–6«¨Ý”˜\[vz Çåþ,ºP9W»Ý ›åäÞåKjaQ³Æ²ƒÏ>Kƒ~î¸L;Ý·e(¨Fá2Á`‘XCB©²BSÁf ×÷jØ?a^€‰9/Ð(8)ŽKýYÜòãP‘€V¸ÊˆËÂ’fÙ ÒgI$BƒÂ‰ç•ó ´TÁÊp4u\ R¾Pƒ]Ïü©²Š  œ/9Ïp,j ǥ஠û}0.)Âj4ËfP¾DChpIg}×ÌpÜ_’8®³Ô«ý%‰=+‡¸Ú_~%ç¯ö—4q½4ëjIÃ98Î:ÉôT ý#ÆÄ‡@ô^ö6ìÅIôlð^¬˜¥0t%sAV¦*£–v@idqܹ¥5Në üxûQx8/ظöyñR„r+ÚPº29©,^Údê*ITç6ñ…ˆr„õï,µî#ç‡Ìë‚D2OHÄÏ3vù<±™îͺhìvå–±k˜Ÿ[Æ®a¥n»Ðx¦;Æ.4þG"Ñ„™Ó6UÍ«¹Ú9œìÛQçp¨ÁÂÛ|;‡· ÔÅÎá¤%GÃf}Ñ9œDrÔ9üQ^ên ×w;¯®áܼ 7šßZÙêCà·o­á µ°n­áü±!Ø™zg g¨}‰ —ç=Q$ï)¡åÛ⣂ÃïJ³ðߥÝ(ˆ‘&ª^Éâx¾×Øb;¬ «µ£ëJiÐ:-¹¢#/-Ÿ„EÍ’¤Ï* n7¨ýYêÏŠa=ú™ %Ý{—oþÉ«+ömX£Ÿ»wgçÚµ$P$I·¹²~Òà=泞eãâ»X¤Ä dqªù;.p°S#jHæ¾T^i‚ðÂ2Ÿ,¬V³hå³0^k‡¥ÅZíýYb¿â7—¸þ…B‰h8h ¼ò9âR,ãIj4\Ò‰$bNL¶ŠHµèé`!>3æû“Åñ¦ V£.+8‡(,XЍš(b3„%ÍÚÍ`㳜ÂŒ¦Ÿe$+J^ʾ=÷g¹?k|bÔÊÐÍkù;Y$‰uï0≈Ëcïzel`¸²–Š$ k.%£Ïç$è);î@{Š|¶/m XPÄaaQ³hå³´åGYEA÷XAÄé^1+ä·Ç{:‘!Úû£°{%Æ%ÁžQÈ-Ûò%2\Ò‰$$ä°ÇNÖirŸë¼‹}{×MÚ{a:D¥Y4ƒôYDƒº7qÖ{êv¹|oÏ’Ÿ:ºjä1&,ڷLJf:SŒK|œåH$s\ºj|Ž—Ü{ö%áÊZ(’íM Kr QtU”¿”I)–4k%”ÏÀÔf •ªóAõ 6ÏRWãÑQ¶j:ë¼³HšŒãrýíÃçrý&#p\®ßžÁaE²–×:(Ÿ•F‹?wP$O{ÔA‘bçkۇÊM §ÿ!ï¾¹ºŽ(t5À¸³Ž(Ô§skQhþÙw눎[ C}«nµ†úÆßj5l}ÖVÆÁ8o5ü¢û3Ô*#eºÚýîºÙøp×´šuÇÈ7†»®àÿoÞYE´£'Vs–k݉‘ˆž‚…¸$Sk–Í µÄ¯ 4øÄŒÜ*ÎbPLÔiºIÜàŠ:|A)‚¬ªÂËãž܃ Só !çwì¿1´Œ /(’p £—„FXÖ¬ÓýÎÊo뾺;ÎbfƒQ›¹ÁYãš `†" RJøò``ªGÁÃ$P9´’HÞÏæ| ÉyÍ‚'íèH\û³ÜŸ%aI³hí³¼+“hPÆAq–ƒb2¦ŒŠõ0‘K¦Ä)²+9ÈUøobÀ^uœi†d‘g‰š8Oa)9ìÁý;_µÉL–9.*•fÙ Ÿe€¡Ígê´µ%WPLCt“¸A±†bÝÉ4:ŸE*L$鳊XÛ)·íwv2nû6m"Gjï—¬¢òõÞ²@¾—Lp%,i÷gUýYDƒÁŒ³ž¥Ã¥b0D7‰¤H*ÖýÉø”L½’¤’E2gú9iÉ13PÖ"³Ý DK„ŠÑ  ;7o*(F’{7(ÃU±îÌZ)ŸÅL—3ÅÌŽå$MòYHß8±Ã”’A9M´Îž@ Uj©Éáþ’GUÔ¤â«ûK¶Ç9Ü_ÒÄY_ì/IÿìhI˺Þ_òóÏö—45_ì/I^æhIÊ*^Û_ò8í/ §ý%2ƒÏ:î/Ù˜ÆÃþ’í.ö—$ÿ¨¿äQ»÷/úKE’¤0Ÿ•|î/Ù¾í°¿äÇÂ^ê/ u…Š„%1Jçä³²7«Ñ`E΋ f&Cû³½W¡"Yw§H”ÏÚÝ{›)VZß5‰ª›ö"›íÛ\~£Â”쨘'—ùl§3–• YŒ®ªÔ<|x3g…êMÎ3¿àac$¢D¨x”CÅ—lšÅL——Ü»þ®ÎPÝ êžVÅίÂJ=#’Áħñ¿ÏÛC¢Ù@Œ>(x^£3ëDâ:.UHªBÅÍ@Ú Dœ¨¬bŽÀ6ÛËpYŒŒ™`²†â¸XóS%O*:-©2Wvï¡ö%UËÏÄávÉ0w0k™&ß³gÆMý,p|ñïHXÔ,ëœËÁéÍ=„µÃE˜ÂeqŠ5MÎsÿ©Çü¿™PqZR9ä懨:CˆKîÝEj4\YKE’¤°öP™e¤þNFÜÚ «Ñ,‰ÄÕŽ.­c׎·sS…ŠÊ!´ˆÜ³Šæ-Mñ’œLÚQ—÷g9zW¨è¸„ ؈kBÕ„|‰ —µ„"a+Á[$ņHXÒ¬Ý ¶"Q*ŸMO­÷qÑΠ*‡ðÞ±å Öl¤àä‰2]â¢)mÝïÏRo•î›nbÕÊÖø’£ãŶè]$­°$F ˜¢Ï" µ»MˆZ/{@K!bëâqµ°HU¬©)!´o¶|²‰²–²£²°ÚŸ¥þ,ÚkYrÙx[ÿÓ åKl¸¬%2v4ƒòY¿”i«Mˆ^SþÔ܆ˆ(±†ôÛWËú^O Ñ~g§°€)„6ŒCˆP„]¼?KýYDBÆHDOrârï–4k×’Ög `züR9/l©p™xÔD”XC [áÞªBEãj‰¢½ßYóùˆÉ/9/&˜Ø_ãGŽ1u ‚+aI³då³ Ã)BwÇY‡ý%É_ë/IÈᨿäÇM]ê/IìÊQÉv:ûKÂiÉãúKÍúq}î/iã,‰dÙEB1ª»YÇèÁê¾.˜¾ÖE#R‚ÈxûHÁ—é^êÜòÊí©“Cæ”äOßýb¥3¨›&0´ ¬ß#ã Yø;ÞÑ˹+ŽÞãïäã]|x7‚•€pœ…ç29<;&¬'ë˾©ßD"ͪz"ÿÜØ…&ùxÇØµùú;Æ®ao»&–¹eìB£%‡mªÛQivÓaçp½×:‡§Ã›µ¼Ø9¼Õaçðf‘.v7ÂÒÜ•«ÃÛ‡ÃÎádßN;‡ÿ`磖WßZÃêÁ-·Öp&>‘Ñ­5œµfÝ[Ù2)ÜüÝNùe ¤%Õ>ñäHÄÑà 9š>º‚¬õw£lIá¿VpíÂÁ¯žÉ¬šŸhkØhþ(òÛÑI€È0Q\ûÞ5ü©b‚á³´à¶ÚŸÅþ,fЇø4¥K)¬ˆ/€¸v‘„ڽ˗häAµü"™¢¯Çdž X,~»uEëþsŸD^½iV¿b«h«š3:Æ·P!¬ò¦ï‹MNÖše3hr¾/)Þ~L a-ŽGá¸?‹è£Ù(1`ü¥/—Ü»|I6\¡Ö‰dzWM¯ ³zØÞþ§gÃà®ÜŽ˜¢I|bÚyUM·B³8›aA7 «Õ,™Aù,åKˆ£Ó§Úõ„8\U®ýY*#P"Ö÷€Ô§ XˆË“ÔèKŠáj´D"‰q=ºHØ÷ádƒ&qåv?ÏH¦¿Õ¥kAªn²°¬Y¥Â>‹ChPÐý½©ÅåKÉíÆã]JŒ®Uåš}¦DH¿o–Eª¸Ä Xˆ‹î]¾¤®Pk‰D’ƒ”í±'÷Ñ×˱T´YMùT²fÑ ÚgqÏ7ÇÊ8K/§×¶%·Û%Fâ´süa¨øø®‚µå¢éK®V°6• ÇEÅÉÆ,*>Ь£¢â$íEÅmœuXT¼=Ûç¢âí†|.*®Eâè5÷ÖAÈp…úZž®ƒøë†Š$eÇð×ôOÄ%ÁD\rïö%²!/¡íb+˜Æå='þPXÒ,Ù*ú¬0РXg)(ƒ±ÓM)®ïE§c‚pü‚ò Dz/OîLJ½åÔ½¸üŒãÒãxT+û³ør~m".»w|vCèà%îG¯4ËÕtôYBƒCÁ.Uœ¥ ˜ †é&O4Ÿu#…,ŸÐHŽ2•´ÏiGq\W÷öÕEˆëòÞ¾V³v3Øø¬/ööÕ†¸˜è–Áø¼·¯±HÙV…ÚŠ]]¥(‘„ÆéÑ^í«•C®šà/öU‡ZK #.öU×9q3WûªCíÑ[ÝÓ›~luOÌöY«û_qïáÞË¡H¨ŸàËPÄùN`P ¦N—Â>¯dR–„%ÍâúRû,ú¡Aç·úNìÊd¸lº‰Ü ‚o‡å¬vt(ˆ²Äš¡‰BŸ*r-1íöÔŒv³H’%W t†gÁ“9"ŽK„Š…eÍ¢Ôæ3 .£AùÅYº‰&•vº©áEQ‰u¯h-^ 812äjj‡¸ÉüdN(E°ñ¿eIjpÿN!n2%¹(ÚQW¥Y6ƒðYBƒ@\ÕmUÓ‘Á–˜܉Üä Ⱥ“üU>Ë„±¨d2š™ë|t5 ºó£?ö ›È©Šmý%ÑË Z&ÚIÁgrþÑ ËšUî[å³0„ Ý‚‰¸Ì`ˆn"7h"—"É)’&Ÿå´ 3ÅNÅ0#s)«È,ó nâne+²H’˜{g¢WYE¦°*aI³dí³àë«ñ„W ÓpÈò%fÝ"Q>kE_-ËùË eÔ”ksnÏÏm_ÀÌ]Îém‘8³}Çå&÷~¸¿¤Ñ¬/ö—lÂ:Ü_ÒÆYŸ÷—<nˆëòþ’#‘`úôÅý%I GûKRýÛµý%Óþ’¦*̉ދý%MÅZ5^âZI8í/ÙþÙÅþ’Ðh‰Dr±¿d“ÂaÉ&’‹ý%¡*²°4îY¹wù,e=Ýg)(ƒAŽËÜ ˆ\UÓ‰'â’{—/q †´ÄgsA\ªˆr­”ª¨ ÈTåU®ÉJvJá´ŽKECªPÉ2ÔÞLÐC8Q ÞA '~ˆÛ0EŽK„Šöúº?‹™.`!.¹wWgx˵D"¸'r‚¢?£¹-Å<Ë‚ª×x+JCÿÂD‰Wù¼´Îu\*R36'*Ñ«¬¢ƒ—%Ö´£8.*Uô®´¤rÈÁB\.¥¡/q‘š´D"™–g=£«,ÿlžØ7Ι{¾žpÕ–4K:çÒ:Õq©hH*;¨O|/"0…Ëâ6šñýTƒ˜`ÑŽä¸LÏ8zwWw qɽۗì†+4Z"‘<៯oËŠª[O4븵ñf*­S—@½+T¸È܆‚fEñ*_âä ÿ™§5ƒãòuô®þ,Å%ÁB\*ÿÔQ-Ø@$-±Hâ•/ÈA?ÑïèÛôwäͺ9#^$]1]>^Kqå*‡:Hñx ññJž0_’Õ,Ô hâ“J+u®ög±?Kq‰@°úejtã© Ò‹Dš%³6ROeTÕ&DC,­Ò:Õq™ˆb3–,Š÷b`f–ì´ôÌ¥[¤ÅqÉQz–ú³èv‚åä1äKäe¬%‰|–¼Ùiå|Õ&ÄlÀ,s"¢ÄŠâUÂkfNK*‡¬–æ‹1[!Ð(8) )ªè]ýY´ÂUB\5KøÍZ"‘ ~nfHö³2í«ý%u×/*_ô—4YÅ_ò%ŸûKZŽëÅå{k8äü·;k8FYzk g¨Íà­5œ)ÇfÔs_R%58álIbµ–—E«ë³]±×%ó½YKoâo˜ 3ÆŽÑx¢o(Sm+aQ³8@A>KcŠQ(2ìÜ‹­ýYîÏzÍ(}Á<".»wú-—–d‘¤,v¿0f寏Q?´«¹+j±oeÙæ;¢E~N…ÕšÖ¬j éÇ*§7Qý,aI³hí³úØ’hpâè¿!bü¢èÚ‹­ýYêÏŠXáÿ6âÒ`Ý—„Êp-iD’ÑíöAÉNüЮfY$]ÿ|ÖÛ³uë\öËT¥[øgþk–Ì }†^/§×Öä£ •C®fŸ©?ë4.É ¸E\wŠº6K~Xg·}¸Xg—Ú£:»ÇÔÙ5>Kãj]SA¤r•«uv q]›þ {—/ µáúbBúûƒVaW潡õ­fÝZ¿½â¬;Cë4¸Lµ=Zïè]iIÕ`dÜ .ºwû.i 'ÇzWs¼nXÈ7Ï¥ ¡¢«› ‚¸Š{—Yµáâäe‰dî#Ü(Dýœ1б/ÖÒ¢f©(’.§Bƒ‚Šuùtšs‹7¤$O^ lüL“¦ùŸ…ú ÎiGÝÝ|«êûVUäâŽ0é^kò?u¡hI£?Ò,™Aù,é©€uÛq–í ÑMâiwtý¥YeB£LR3VZüœîEÛ+B…öÚë-ÜŸµ[ÿÆ/Ƚ˗ÈpI³²HjŸe€!?'HßX¼fË`ˆn7("WNbw¡v,r9Ù5nÊlI‹C..)Ýž[Ìî-)m4ëÖ’Òt ˆ³n-)}Ô¬ûÿe{c•/ùï/Ù>î/iâ¬/ö—‹û³ªþ,îoârE¡zU«»kI+’gKþîo„ÕhÖ/5Á*@å³å§n긪f nSÂÜ»¶“ë¬%ˇä¼dš¥Ýp\޽+TT\²ßÄÄÅ–ßk¯´$‹$4Â’)àã2mip¨u[Z/{ pÙÜê{mwd‘d«œ<‘}Û-_¨m¢þªÎ  Û›­òήÀ¤±?K XM¢ò »y µá²°$™Aù¬óÊy—iÃ7:£?Íž¶©ãrµý¶øxùúŒ𬢑ƒò%ªÎÐ|$òoÆ."T½+TT\2`®”qÝ»|‰5KfP>KãËf†Ãþ’Qž ^í/ÙdzZqµ¿ä‡u?#ç/ö—lR8/ö—´>K†ë\$ý°¶81½éÂ!X힪æ¦ å¬»°~xKÔpSü% wªX¤yÐ5ÿŒ^ é `„8ë5ná5ÎÞüõ²¦1> —ÄM= /i#–“yæu-/÷Zžå;X—h)úÎH>hÖEcº*¬¸eìÝã®± 4v»Æ.tU¨xËØ…Æÿ8š¢–œ·©rÂÌÕÎáM$‡Ãá:‡®ØAçpz¶kÃÛ‡ÃÎáŒê¥ÎáíÃaçp²o×:‡ÃõíÎÇ‹k8CÓyg 禧ûÎtCn¬áL™;²ÔwÖp&)pÈÇ5œ¡ñ%æÉ94K"™µÅy.ñiTú’Ârí>'Whí¼Ì%ñ–;?Õ&˜Sÿ~ìüÕ/Î5ìU«û*]Íy&æöl̹QªhÑì0¹oíw–°¤Y4ƒòY^¬ýYUVépy}(ºpêÞ œ=t½Y$éå`žÆ¾ŸŽÉo]Ù—ün‘QD5%¿Oip¦L9^ëêç$¬£9Λž^œãü£€Ø¤£¥êÏ"â¢{÷ÂxÙƒ¬%"yÿÄK~§g~ê9Þ©‚PÖwI–i×aKc<v»H¢fe3Øø, ¡AO­sÅg?"®Ç(Е”„ Õ#ê/†ÒòZf‘$=EôÎPÑc¸Š{µñ–ᢖX$Ñ„d¥ß%»%Ÿ#^Ê:íY_hºeEEÔk¡Á–4‹fnªŒt@ƒ‚œU$ƒoNÑÆ7Z@‘GË-CÉ/Äã@éý)¡"ªÒ3 ¹?ËýY@\ö´*¶¢á*Z(’÷OÆgÉñÏÑÿ”%ÙÃ?’keJ‘˜ >帲¢‡ÎÑ»ŒC‹ÜŸS“P¨|‰ —µD"‘”ÏÀ”¹¥!vP,Ãt#¹Y$۪݊5ö-[¾Ö&ž’óÙéºÃÆQÊ…Ò¹Vn×û³ÔŸ'.÷.aI³²–4>KƒÐÃÐ]p%™†Á0Ý$nD®Y÷Ý£7¾>£€GŒ„)–Òuî|IÕ'®¥‘š‚ œ†:z¯Ú‡“Žx KšE_"ŸE-±HÝg)(V ÀÁÜ Â ²îUŠ„Aа²P´ðuFÞ &?Oaýu#3‚ïšuÿv#óñ’ì&>ýrIöñĜ͟^œ˜ó¨ðzy.OÌyÔChðêÄœí'‡sRÔvmbN²oGs®æê#‰d—BËh6Wì F3Õ˜1šf}Áh6hP_}•Ñl¸A½öUF³É“ÌúöÛö¿Ópª ©ñŠ4ž‰öÄJ!_"r^çfBŸ}V0„µ±ÔɆAË2:ÜÐMž­ú*ˆS$Èg)ùè5žØæ$ &ÐíY„6¿°g’H“8/‡ÈI§ÍgiËUJaYX¼ÊÙ 6>ËI4¢A%Þgi– !.sƒ"r]Ÿ¨ÛË|“JK:a©T抸޹¶= —^ù9fî˜ÓË"I5fƒ6^¡îV+1˜è­„EÍš”Y%9¯T³’ÐJO3ÎRP,Cû³ÜŸ%Äåý ¬ï¥©‘–X$Lë{Ë*çU$à\5³ØÊoï™ï&'~^4ä–…Ãý%­f}Þ_’^ûhIg}±¿dÖáþ’šuÿfIk¸v-ij0¾Ø_²}8Ü_ÒÔ‡|±¿äýḿ$4Â’f]ì/Ù´þ°¿dûê‹ý%){Ô_²‰äbIh|‰Fµ^ì/ik¥TX}±¿äým¹´®–Ä(s9Ä„h×°HР^˜Œ™»2MD‘ã2ë® CEïÏR—Ý;«3l¸´1AEj*òT­!«UŸ˜+·7eM£D¢Ÿ¸´Nu\» µ7s9„`‘AýÄÚã¡L#·a"J¬!iGq\™PI ‘«÷Ï©¿±êÏBuÆRrâ•/q‘µD"éÐ-ùÜ÷nßöþ†b6P¢ÝÜëX$*@u> ¤›´ˆ8ÑõU{¶Ý^†ËÊ*Šˆ2kHr>3Á?L#âSr\"TœCV°÷g¹?K#ù<EߪuŸ±å‡+(§uÁ¼Îž _l…%ͲΩMHÕŽ„‰Ô' XT…Ëà6DD™5\°-Z|¼?(ÓÅ/ÐWkÿiÕ_/ü6tÄ뵫W:*VSK$’(,lêWîD£f—iëR躌e:„¯XÕ ´ž û×UΗ<Ô×_Šá–•ia‘4P´T³Ú²Íù*£ ðþ,õg q©°ZUðÔ…¬%á@XÔ,èÜ/•óêI‘¹¥!v¦pYÜçÕÈÈIˆ—cq¦kwF›?¥›’,§gw¸;Ê„j½Ó¹zc©:âåªwj_baY³(’Êg•¾Ýãþ’ô¦×úKR|zÔ_²ÝÞ‹ý%Û›ö—l.ö—lÏvØ_’LÚµþ’'?ì/‘°ZÍ:4\¡ÑŠdšÙÛ'1ºyEÇ(7%Ga-­°¶3Pç–¶ÃFgPPÍ ­Eq!= 1ÂEÛS´åŸÍ@\Q<åćFé#÷×{+ù··­ŠFnê¨ÉºÉ< ØO¤D»/æÚ:þÑ×åž‹Dš%yÇØµ¬ûc׿ëï»öø†±kb™[Æ.4Zrئúø}ùÉaçpƒT¿èÞ>v'ÎáZçðöl‡Ã?‘Ñ¥Îád{:‡xËKÃI™Ž:‡“¯?íþ“ÜÚzk gh'NÝXÃùƒ-¡ÁwÖpþÈ´8ä[k8þíÛ5œô%Ùp…ZK,’y-I€øû(Zu°ÊÉZcÛe“þžå†?Ú?_¥Sc˜øú S¢Q-ƒ‚†(ThðÄ fú9gôâr£ˆÂÁÐRXÔ¬lŸå·švQ3Ûc#’í¾É½W©‹“­Ç‰ü©ÉM~ávXA#›¢fȵUSãû”³î×âiûèN>ìÿ,T_P}5êwü8–5 /gŸµH{T:DïÏrÖ â:NýÉp…ZKÎSÍÆþ;ÈÆÏÑL|ïÑM®ÖŸÎÑLlÞÇѦɬmšìÛÇѦïF›†ïF›6>ëx´ib?Ž6Ý>|mš¾ q‰A°û³½iœZ/-‘Hªí°ð€ñÊû,#ú³b@ˆù;Ñ=W kfvt9%vîÞo”¥°”í°ÕVÕ_ËŽÒg Ì} º<ŠqV|f‡¥Ÿ`)àe†•ý´‡¡bÒ`Ä%žã¬L1Ü»M´ú5¥%I´ðk™Õß¿ ›϶$ëæî=Ô2Áw¸(§ÇšÆj3P‡rÖ]Xf¹>KChÐ#ÒT^È 8Ú ‡¾çž.TUF'ÅJ2ˆDÑ{“%/Ö Ø5ô§ò%šK-±HÞ¯›µ¦n(Ë2Þx¶cOÏ<Õ6þÉæAö¥ä n¢°¬Ye³û0„Ý=µnŠã P›Çñ9óÊÊßgÑŸ,’Í/PQôÎ!SŠKªýYêÏ¢{—/Ɇ«Ñ‰ä=¦4w‘lc`óOº¥|ÁøvÉùÛ¢é*T˜„EÍòf ù,õ|K>„›Á˜ŸÈúbKVÇío=x¤u½>ç¸H¨xFaWz —ØŸº?‹î¾¤®Pk‰DR6(ï+QDò|ÛËFXfÉ ºHCmø²oŒ³{Ëé&qƒÑ·-%#à¹sY %Nõ”vÇ%BEÑ{[ªýYîÏ}I1\–H$óÛ ìR°°ø;ü6û,=žÍ%Êz¾©Î@§ãsã‰>9æêùÏ>ðŸå/µ´}xCtwt«tßÜ ]íÏBVO€o]–XXÔ,霴‘zj4(Ýv3×åŠÁ  ©¸AµüðúK1¬2ìÈjÖ( ¬¥í¨hGÚ^YeÙëÊ’ÃÆ{ý=†|‰½Œ´Äž‰>KÞŒ~NоQ^S FE7‘äH³îòè»c t93’›²H„6ˆC&˜‰ƒùØŸ # =y%—„%Í~“–T˜h8Ñq–°¥P'ñhÅ Úuîu>«f`u æó²H’f­«u_c=Å‹v„}«/É.чã KýYtïòYŒŒŒÝg9(Vl¦¨ÍÜ ‰\Ç€ݬ|Ã6 yr0”ÃŒØiVÑ),åK;› í(ŽK„ ¢wÅõÖ¬zû³àÞåKÄ9HKÌSÁ·!ÖC|ˆYwq(ªÖx12+ºõæ D&ˆfø%Ñ+I{¤ï¬Ÿ ¡rgý|¨Ýû­õóÉ׃5¼µ~~³–b4I¬‰r3'šn…žÞÖøÓ[ãÁ’èÁEß&ÃÕpƒWǃ%ÉM'™âóñ`·'¶)[ñEú&4&ú0}SkÖIúfû¶Ïé›ÖަoBý8Ç雿åŽÓ7›L?§o¶çéV _ͨmŠÎlŸò€Õ–ä•U´°¤YÚ;&&X´#Ñ  »ã,äOÍ`›‘+Ö¹]×'ꨘ)V¹Úòü³2ÒJŒz¤¥“©L³b¦Ÿ³å©•̽[XÒ,šAçK˜ýo˜àB;ª–€A±¢wV&TÜ ªÜŸ÷^ï_8¹×‰j0\Áº •¨°€%Uµ0Wœ×q©eápÉf}Ü_ò#Óƒý%MœõÅþ’ä>Žö—Ô¬û7ûK/aÞùêþ’ôáhIŠe®í/Ù>ö—„FXÔ¬«ý%› 9ì/IR¸Ö_²Ý·Ãþ’Ÿ{p©¿$tgý%2\­–ö—¤ê¦£þ’ô×úK+…jG—ÖiN=uÎ>Kõ!„‚îõŠÀÌ`°ÔD”ëGIñŠPQ>‹uªNKz–û³ÐÖ)_âZjI§i¬ìaa¨JFs1é{\ö| ¶bìÎê¸äÍ\_Eœ(P¯LYEqΗ54,Ú‘—EïÊ!+.©úÙŸ%÷î"5VªåGµºQŒ¥Jç9b÷ôv–¯^µQ$ª Î:jéÒ:mr}¢†•sÓ+Ãe%zUT Ëù’±Ôá› íHŽK„Š£÷yd–úƒ¹?KˆK…^ó,L£ «)’i`“Á{ý艰8-S:§š`=žO]Õ÷rØ¿ÂeÕÔ‹ˆk¨¬¢¤ |‰$'™JÚä¸\¡ý§ê¯~ãM4âÒíu˪àqðIÖfUÎWÞŒ¼ëv£õu}<Âeq´.Ùî4I‰^[1Ù7åKv›ØXKÑŽ.¥‘í¥UÎöº±ä^)Ä¥*x›§Û{%,iÖn[yØÌÐzÀÓšà/úKZï|Z¡òEI‹Nó%_ô—4¨æ»9Á<Á DÍœËþ…\fúSÿ†¾™cü&rëÔ,šAû,÷/4îÐ=I³ú“Áˆê£m5†?LU?&T’õb÷ CÅ—4†Øû³ÜŸ5žœ†«hI#’÷’…\Ò]u6sCÖ…ùý+¥$>ÚÎRrÍf ‹š•Í`ã³¼ŸIý?„¼åG),ÒMoÒ°øú¨fª"–Ž«"T8öŽ1  ±ªt¼?KýYð%6\Ò’,’·Öç'~èŠH–©Ë§3¿+ÛòWKXÖ¬j3|Ö06ùh¿¡»â,Åb0œU$78½X_5¡Æ,ª90žÑŽnÒŒÂ=z]é©pŠ Øû³ÔŸµû’P®¬%µH–è12^b˜–qbV£Y4ƒu3†Ð wÚ2Î’}3ƒAºIÜ`&r»²–å·}YúD,sÎï_Ýp\z‡å|Å%ùµÄåþ,ú/µ¤ˆ$T²fIÀ½†Ð .’—KèòñZšn"7¨Kî³–,JŽ259OÕ4íh* †8›€Ð‡Q»H0AXû³ÔŸµ›§P.™4‰DfP>+›Î º»ˆ&Ú ÆnÖ[n®ÀNB¶ŠVÌö–ï<_"×f&xw‡ ÇeBÅ«°áv—dW]#®ª?‹¾Dš%-‘ÏÀô (qœ¥ X †6U°hL(å }½P€ñ‘Ãq +Yåh˜òY‚“¶o⸸>!ÃÖdÉ_LÄê {–ú³v3Øø, ‰DÐqVû ƒ¡ÁÜ ‰\°îÚò£ ÅXY(ZøZÈû4«¨ÐJA—ÉyáΕòæ@…}*ZXÒ,íÏRÖ̪Dƒ‚›ÁP ­ÛD®XwìݬJ ÅšÚ~­ø”‘ëy¢×YE¿ÍtFèr~9¡M›pHhV£Y2ƒòYÞŸ¥þ¬ ¥ —©#‘J¤›Ä fŠªeÝy«ªf õl–¹³8âwÄüœæÞ3µ×dIÊ›Bœidžã’f)z·Ï"Àôþ,÷gÁ—ÈpIKÄ ŠÈõr Uš“VòQ™âjég² âGÅœšSµ†åŸš¯­_4Ä™‚ÍòC KkEÍqÑge€Ñ Á*¥Àdƒög¹?«+z*Ã%"׉-—P>‹“±«„ S1U3Ó7Ì"(¿ÀÌÃy…Ê_g!6ù¬—³…ûn<åq®:ðº4º}œ«n4+›ÁÚg}“«n>äÖ2ŸsÕ̓æWhóYŸsÕéÃQ®º­nºX> ¿ÓÖq±´Á+1XaaI³h•ÂR¾DhÐL0ã,~ÁPô®P±"rɺkVÕŸ¡ý ÒÖ`¸`FÕM*²q­«@Xâm§¥u. :Ü_ÒjÖçý%Ééí/iâ¬/ö—¤§>Ú_Ò°î_ì/ùqÕûKÚŒÏûK’k;Ú_’¸škûK¶‡ý%m—4ëbI“Ut ëbIÃqy8×Åþ’q©?ëbÉWsÐ_’çZÉö¦Ú_OaYŒÔ¹§yŠ9#B—ÍÔ;(&ƒ‘¹†‘kÖ])æ³rôÞdŠ]n,¬ýYªnÚ}I¨ —Š<-ÕꪊWõ½¬ü=¯ ¶¥s#vÚÚ› z'ª‚X—›¬¢SXU¾¯˜àvl8.*ÞO‹PÑÕ;n—?}‰Ê?U«»‹äÇör¡X‡f“ñ…¼Ìa™¶t.ÔÒÍ@2Äö¡9Ûžáræ6Òˈ2k8aþAæã?´ÿŒ_PåñGóã>hó Ázmˆ¶ü¸åÇ+‘Œ/–5KXç•ó2öf¼.ºHìýw¦p™¶"¢pÉ'bËŠ§ÊH™¤fb‚GìžÇeB…Š.àŠBá7!.VÃY¨%Y$f}ÛÌpØ_hˆ}µ¿$ÐI´îãbÉömçäüÅþ’톜†ŠWûK/#Í:Éø|± «C7«º%µ:Í5õìÜÒ>Ê®ÇÎÇ'¿`zqA Û4Î^ÃÚùÊĶYa8´¾{âŠMyÁˆóCâÕ)’›glvÔþà'Fp)þÉ‹—Òí冨JV”'#Êšµ‹äƒf]4v?½eìÚ|Öc×V7Ý1v FºeìBí,iÉi›ª;”/v'wxÔ9¼q5;‡Óãuÿ šKÃÛãv§üµÎádߎ:‡Íú¢s¸5\ßí|¼º†3½)7ÝYùygí×¼³†3ÔôÖÎÐëÎÎ&Î:&ˆÚ¿sÈÙ¥r³Ûä³Û4ë"g÷þpÌÙ%Ü{³K?9âì~îÛ%ήñY™ JR8åìþN[º:k“‚6Ý€õÃ9`ÓX°~Äøç°’:êÂw°„¸4ǬNj´di#í£Ì;ï“ÏQm2,p9nÂЬqRîp-¾~|ÏÆ*ÂêØy­HÖE.tÓs-^&¡eÍRèÖ|TÏ9B¾’UË8áZXÔ¬³¬í³Ôò#4Ø=9Û~}¶"IZß¿ZnãçZž˜[÷^zkÞTð]—Sê{»®”rFSUþΑf±£{F:Yrnš0‹êíN™UˆCÐ7aQÉ×s&f´JLcþ;ÏwøQòõ–4Kõ;öYM"ŽKÐ}äìÍy™(Æ%U‚\Ó29{Sù,mÍ£–H$ñ¶åK>wsÙ_yÈ™ï¹#iîf ŽŸ9Eì½·Ü·aš…Âí¾su%Eÿwž~~½Šva5š¥ùäªÀ¨óŽì8`œµb|õÄY ç¡bŽKRÞYÓfdªýYìÏ¢áÊZ(’·Färæwú'WD½c³ÒE2—ly©¢ ]½è]T’ÿèkÁ¦xˆ˜Ò#÷¿ÔJAXÒ¬bkŸe€!4èáOjùÙƒâ¤%c1ëÑê ³{IŠ_ZñQtAq‰A°z/µ?KýY0\Ö‰ä]ø}Öüv&Yç¢qÉ©jâ‚.º]T^-˜ 30[.aQ³<˜>+Œ º;Î9¿¨Øw*|È{-6PÍ¡bª’¡bÖàTK ÞK .ïÏBu“ WÑ’@‘¼²F7—eºÆkõ'^½R’8Os6¥ò7Ô;ú~Â|ÿ]XfÙ Òg `x¿ Ó튳‹Á0Ý5zpø§—ØcORc¨èáÁB\Úqàþ,.i E²ô¯Re½Äûžsâñ Û:/K¡…«f Kš•Í`ë³0„Ýg­ON¿+0ÝDnð-„rCâW¼‘$¦q'¤6!*Ò`ûjk^¿¾Ž—÷g©?‹†+kI HÞò‰V0ÿ³3K™éÛ?‹šQXÒ,o¢ÏÊ#ÝD¢ABwÅY ŠEZhP¸A¹é–úÞhP$b‚E;ŠãÊœ8|Dï —qy–û³`¸¤%ɸ–Çò“F³dÝ D€!4˜Ÿú ΛšÁ}ã¹åmYw–ÅøÃ99¿K;Ô÷À´ïNµðš÷m¿‰¡¾£¼½Õþ,õgAŠ–„FXÔ,êœ}–ô”h°Ú D­—=0ƒA"nPvGÉŠ!•™Ö¡U³PÛD· ÑŽJ>nÖÒæ&Eï´ä²ñÁò ÞŸåþ, Kš%3HŸU¼Yƒéëf Åò§ÙÓ6Ü ¼³ý¶R$Êgí.'ÔÎè—–’ÃZðDûæfGq\"Tv$”.H;zÚn/p•Wµ?KýY4\ôYÆ|BƒÂ‰Š³‹Áðf qƒÆ°dÝ•"Q>ËÀŒM`î·¬"òõZð$„/&X´£8®ߦCчâ Kš¥ýYîϢᒖH$гrV3¦›Ü $"W¬û6ù,žP`£g†$’Ÿ¬"bZE»ÚvK V쬭yŠ·‰+FÏÑ{#,i–¸ù,ïÏR¡»â,ód0Èm˜bÖ]›Ä®h±¶2ÅJëï”AŠvA&H$愘è¤ø´Ê—€œ_%Ú‘WV£Y6ƒôYB\ÚŸ¥8KA±y>Š„Ü`a ÖÝ)’ªè$SœͦC”›È¸órˆÌ¶þœ[ÈõÂñ½™ •°*ŽK„Š|†Ð  »—÷g©?‹†‹Ü`Å­“uï|9|eŠ«Í@Ș˜&e=qIIzSä$\þéYðÐ`§ÄçK$,jVE;ŠãÚF‹•åQ\B윑ög©?‹†KZ"‘8ŸµgºšL±³cžkÈTåÚö”O²oH ¹V׃û‘_¨f‰–¬¢RXÕ*-¥ÏÀt.Ôq×Ijw!é&!®jû³”"Q>KÉÇé¬aÀ5*˜Qu“£J™:™zVÇå)£Ú²pgðkí³î ~mŒ;ƒ_Û|ÖÁ¯muÓùà×ϳxÓ ¹Q˜ÓjÖœíƒâ¬;…9ú£¡~œ«…9:ÐÕµÂýä÷Z©ãý%Iö—´šõyÉöápIg}±¿äçòì/iY÷ÏûK¶§>Ü_ÒÖ`|Þ_’ìÁÑþ’Í^Ü_’dzÔ_aitóÅþ’dCŽúK~\è¥þ’”I9ê/IìZI:·£þ’Ÿg»Ô_(’t ¨È½Ú_’8‡×z&,j–Ì |·æ zºÔ+sVqç6nÐä¼(^¥H”ÏÚ •6S¬PQ ‚`#.íϪú³XÄß±HTë¾—\§ÊcŸ—iKŒÖ9Õ÷ª÷RÐC8Q žX—Ó}#·A"Ê),Q¼âãw&8areºÈq‰PaÂßÕ{\’2w¬{r‘šúéeh¸ÜE¢*ø¶wœ:¼Ïyå<¿ÍRõñ®väSó}ô¦>ŸÏ'ª³¶,JÎL0iGÞÝ—Òhm¥ŠÔtݲ­ýY,¬VË^"‘°¤Y‡ý%ž~Ñ_{pZÇõEI¨mÕyVñ‹þ’PÛÑ_8®Ïý%¡¶ñçˆë‹þ’V³$’Mð#ð¼K[Zã4-¤ÏæB OëÄq¨CÁHV)wX˜…qX0?\2¿Låt⇩¼i¼¨»e®íM¤–÷éA›ÌÏpDOñ‡±éM?†±šõÝNïÏ"çðÝ’¿Î„ù˿י0‡Û¼=ýb›÷–ñü¼`=Ý Ö·ÛûyÁúÏ…ý´`=iýÇëï_,Xßžíó‚õÆÆ/XOR8]°.Ä%÷NÑ›¤–H$HˆL•÷Ï —äe¸hJ‹w3 —ÇÛ“÷ÑǨÑœ~3¥—¢ˆ±‡bDõí3¶|®øÄn€€³°4Kf>KChpºõX$ÁÎyÁ›ö̺CK$’xʳ-ó9d”ßTÍ@Bù~žâÍÖ™’ãó=Ù ¾ä§×c]a|¡b«Æ¾°yÝÛeìò‰š³¨¥kžçP Kšµ›ÁŸE€Á£2tï^0v»HR,øD ˜ˆKîÝ#ì”Ï¢–P$1æ+2ÁåTJûaÌ8± lµﺬ3[‹0¦ôýuE¦ýJ.mFmÞŒiX þÛKå¬ïòêËÚ ‹še3(Ÿ%žÜh°jùáì¦ëÚCÅŸßAÍ‚@0—·Nj–ú³X¤&‘Œ˜;ǟ㟷ʒªˆƒ“#È+µRñ ª à 0o¶ŒÑaLý¾èXª5KfÐ>K£ªc¼ –ÅOM8£H½«æG¢7Öº5ºwïÏb–´D"‰¯“ŸzŽŠYýSŸ-_)l õHòwvº¨æŒ°oç˜âÛ°Çs.³Â$,iV6ƒÏÀôÔ…pb‚Å`D«Þ5"IZBEÑ»¢¶ªØŠ ˜ˆKî¾ÄÕMÒŠdé–gžt·¼ËH¦ü“¾ ȪˆÃþß•[¹Àqˆßœëߺx Å&JXÒ,šAù¬ 04hè®úkEÕ&çû2%>Bò¨s\"Tb3ãéÉåÁB\rïÚŸ¥ºAj‰E­Aþ;Ëo|.¹†’í+ÅØïoÓçkíZaµš%3HŸ%€!4˜¡{úî—qÿ çKÄ Æ«ó:‰hGq\æC½{ò?ã`!.ºwûVäJK,’Ëò³E%[3Þ‰0qÉÅ„9T|T²fqÙgÉ—¨?KZâÐwŠƒtÕ ÄàÛ¬û°7ù,ù΋p|Ú3ÚÁmBŒOEZˆÎÈDÇûÛDˆ!ÇeBÅÂ’fÑ Êgq º+Î’–H$#ö£‹ˆ2‘+ÖÝ)^ª¡5?ª´¾j0Äï–Clߦ6!ñ;Ì*Š$QX(ÄGÃv4ÇeÍ’¤ÏÀâ’{WP,Ct“¸ÁŽYE±îN‘(ŸE¸¢’¹åGô³XPñ£‰hnͼ’èEš{s:ˆvQð…œ•°¬Yæ¸D¨` º;Ù@Ä%÷îýYêÏ¢–82ÎáÀ|–’”©S1JÒ¨ÚQ‰æ²HÒ·1M¤òOWtp¼+­˜²ŠLaYXÔ,›Aӎ丄 Ýg).qˆkrÎH™bögQK$’œ|l3ÅLXºCùm¥?÷,\г˜Ÿ;¯ãRÖå7¨êW:W‰^e•ÂR¾D>K£¢Áq9ÎrP Cq‰A0—Ü»S$ž7Èä£2Å{Zû  –Tõ!Zª¦,6óÛç¥uªã’è«ÁÉHKZXël|–†ÐàË´ â,q\Þ+փܠâƒ`".ç³”|T¦Xi}‰d/˜iª›\_U5±0>8‹$匎¦\Kô?öÓ”ëИA ø»8åúç¾L¹þyíKS®Óx4åúG™.M¹µ–T"¹6å:á·³Áã­Bü¡ ñ¼0ô¸¿$4Â’f]ì/IÏvÔ_’äZÉ—9è/I¯}­¿$!‡£þ’$Óký%¡Ö‹äbÉOnA±„eÍ¢”ÏR¡‡¡»A=#02Î*Šˆr¾¯™`å³Äq)S¬è] Æ%ÁF\*!çþ,õgIK$’î‰zrÕÇŸWÎKŒÒ9öQVÞL¥uĉõŠÀöpy»oä6LD‘5t K|<6§WL°hG~µ Eïûƒ†úª"5¾¶Ê?éKÜŸ¥ãåÁËR@ÖÍ ¡ý/5ÁŸûKÚ:®Ó •/úKš¬â/ù’Ïý% Çu½Ñ_Ò ®s_òEÉö¦ó@³A1¦ÜØö42nÄ„™÷¾]ȇ‰U+ÚðGÇ•)’i(ˆ†u*<¼W¬çìÔôíFÁ—^ß÷h’¾ $Ù{gcy‚‘½/3}&‚ŒXo:<þ¤œŽö7ª?XþgIºoý÷‹H>» Þ1v-7xÇØdŠo»P[å[Æ®Åo_»Cjmü¢sxûpˆì’Ö_ëN/w„ìÚJ˜ÏÃÉU!»&/óEçp2GÈ®e >w·š%/ó;×p&>äÆ˜„ô ˜‡kLBú€é¬·Æ$$ŸÅYawÆ$4šu>&áê‚Û;íN®íN¹Ý£ÃIX×v§ìÿÑÎát]®íN>ëhçpRÀk;‡4‹fðtçpvïúP.1É ë èBæ7™rTtûȹ./„=³»‰º=œ0^ïµ<1¹/:–Bà½ý{þ0jšÏRvÚFs¢QÇ 8;Àax"ñÖ¿ÐæÝa°…%Í2mŸõüqéw4S‰†KZ’E²eRâù”Œç0m¬’'{ï lÕ¼–Ù&Þ9tšŽ¶(bPa¨•z©"wìbch<"…©‹n^ŸeVÎ!âsøíJXÔ,šAù¬`´h𔈸ñnV.±îÉ:Ì…ƒ\ǾøŸœÛdªé…à ›D£÷(g݃Ä|[ArÄì?E‚"UpƒñÜQÉü*ª9¼ÿ'‹d}å|Vüm(S„åA³°ZÍ’”Ïò–Ÿ—úŸ_Ä%ùwÄåEºô%2\Ò’,’°%”_¥º©_ÊvŠ*»¬¹ k_Þgí0#ÞJ ®œæ’­x§ÐùÈ,Ots@·sa~úײ‹OšSŒË:å`µ–4k7ƒ­ÏÀ¡Â8+‹$¡šHˆ¿£n¯Þ?ò »/ µáR–D2Í(’~Ž””ºPOÜqx)ÿŒ—å¹B„µÊ+¼¹ì¢õ›¢Hà‰dÛ3(™–4ËfP>+Œ¤ 4тŸFï ],¢YaD\rïò%4\Ö’,’·¶úÜý'ËZ¦Œº"J³¬ŸÏâøçè>r‡òü®fÈbì"À.îpꆕCÀ`²°Í’”ÏÀô|rß`$Nã˜PÑï$ûÆ©š¼,Lĕݻ|I¨ —«›(’x#Š_ˆàºÇ–’½Öðýmš­zö§óVˆ²ˆ0³L¹îû¹ »åõÄFXÔ¬lŸ%€a4Hè^Í÷gý¨ÈÑM§—YÍ{ò>dÄ%7ˆKî¾Ä†KýYY$á]KÝ=ó,Ó[¨ûUñj%FDHtÛb ˜3¸•°¤Y2ƒôY`4hPÐ]q–÷ch×N75Üà9í(ŠJ©2Oþg¨˜ã’䙂…¸²{—/ •árE®DòÆìßÅtÙí–úøPo6‰b6·EXfÉ Êg ` ¾Xɬ8KA±÷˸â“–çL0§³ºXž„Š¢w…ŠŽKv\#.»wùíÏ’–d‘¼¥±Gþ‚hª åV5AXÖ¬lkŸe€a4Hè®8+Å ƒáýLêÿ‘+ÖYl“óüÑŽÿ?öþ%Kre‡²û2 Á[Ô/©Õ«ZÕ®ù§„¤Q°7„4SºfDFD¾Þµå~ÍU 88q\PY~ت÷µÎB©¨&‚`!®HïÊ%%Žñ|M2÷ö ü'ò,…Aå,}¡AAw×Y*ŠÉ`èéè¹é‰šu—ŽõÙGmKºÜÄ7D„ŠÞ*¿o|Û;Ú!.¥w¾ñ\žÏzÆûäY ƒôF ypóí®ÎRQìH!º‰ÑE÷‘ßÅv%¬>¾yØñ©=?7¾bH9ŒÊ-^w‘¼Åøý˜1"—tYÆžE“(g)› º³ÎRÖt>U¦57ÈìlÖ]Í/Ò³”rŽUEIXÒKt9¥a—Õ˜P!F"z \Õ!.¥wyV:#ˆœÕLÒ¡ABw×YÄ–f0íª‰\³îÀ½BÄ +÷Jñ±ÐkU‘ÍIº¼)r~Ãþ«£‹vD½àJb«1ºê£Õ%2VçY ƒÌYé@'Ñ ª)ÖY.ŠÅ`ø2¹AUzª“DB=Kâ£êSV¡¿hï¬OÓ²ŠëPY!³v6¼ÕÛ}%NBEÕ»EÏja°ËYJïÊ% \ò’f’ŽÁÝäa ¹bJ‡Ò³+µÇ\ )ƒÍ$;Ì©qÝ„D†©qO+Õøªå1Yä¸l,yà s–@°Ñ  »ê,Åb0n¬¡Yw1Ò³ÌNŠ·£é ² ‡*yLˆ‹'x9 ­$,²ºâ{ұ:ÏrdÎÀl ¸C\Jïb0D7yÖÖĺ["±žE_ì~ãýw6̨»i·iHÿO§VèDiREš^Ò+)ô¬D;"g ` JåQ³{¿dÊ{-×¥3Ö7-׋vçKÖ‡x®åz‰–»ó%úkÝ/Øo¹.ÝÇù¦åºäGõO-ׇó6Íè0˜r´Ý =öA½*0kï·Ñ«Š"rEñš'¼Ñ޽R,BÅ=,ÕÝ´àq1½+—¸}š^ÒL²|6,|6̰;_Rò'0ô89_RòÓÑs;;_R:Ëɦ'çKJ~«\*žœ/)¿®_LRK‰©û“å·ir‹7ƒ×g±9W}½±·h@|{\sÅF£áÃrvêx=~Œ2›$þÚCÉþAmûúÕ%ÿ£ú8þ ü íËék—ü@ô¨Ž/í›äwÏ:ìJ~‘¾ v%¿ä_»Ò9à7Á®äàðU°+9pÉ$ö’ã1UΟþ1ÖÎäðO´<59¼~¶½Éáõ›ž›þùÕ;“Ãk½pnrxýaorxe0ÎM÷>÷ÙÍdzg8WLŽ£Ò_á\m: úæ çòÛ¶£w?ÿοŸá\¿©®lq†³t¹D‹^b“Ô÷-Œ­\^ª6^Ò‰ê§õÆ÷ć±á=ÄûV?5šî¼‹=£ .2àƒ/Ò3vÂÔ*i$ögûÄ'¸óë…Ø;±®¯I ‘²ä“›Rj A@IÆ‚g‰?8LïÎ \ºŸ¥ù¬Ç ´°ˆ(®Òñ÷9^Çg«ÿ¸ƒtNâ`¶ïÜ=ƒ7d¬ecÔõ#覅Mˆ®ü8Xl]Š=ÏYæþºÞ³^AñÞ¹b°><Ä÷8õÆê=KsïÊYLjKµ s‰—îgÑ$õ?µ¥7vÂè2ÐLÍ!¹>@f?ž&ès5„€sxÝðGFXÆ·yõepªôúñv»‚%<¾M@øsÙ~¨ÿ>UlMÀ>-m,x–®*g ` ' q1½ûÜ'—îg‰u³ÍÇâ‰ÖÞÕ‡ÂÁ¼õª}¶š‹ÉA <çÐß4-\‹ÞdßwÁQõ»¡G©ízâµÆ)žÛõy}Ëž…0èœÅíFƒ4‰A}ªÀ¸n·Y•K¸ä%4ÉxøÃ&K–Á—^5ƒB«ÿO´ùܯØoùzp»>t™…‹·Šnv¿²Ÿo@%~Å¿s}>‚·jPÝþäù®URŒqmÆê=KaP9‹Ã ;T½—Š[]²ÖY\ŸCÄ¥ôÞrI¸x?ËóYû³­·à¯U­wì듎›AÕeá§ïk<©¢4Ä7¨IµîC÷L ÑÁ©^ÑX}½ÇθŠs‡Àä4–=«…Á.g `¤³É„ždU.«3A›c‚‰¸Zz/9—0pù~–Lò®Ed4Ùl­4³tè…½l³›¶Ï6ÞŸw´¢«en`§úÂEˆ~z‰¦€ë ñíÎô,…Aå¬0ÖˆuÉZW~T*&¢X*¶ºde,¿yÝ̽Ï%9pù~»›¦Û3t&i½xM%-Œóbìí¹s3,÷À„Ø}ÀÎß7›º^lñߌÕy– r–†ÑàÝ»:Ë›†ÜÿvÄq‰=Võžî‰£.âj齤\âÀE/±Iæ%®­½°µ–|èúÂ2ù °…|¸#ŽÞC›ªŸ—%ÏÚÂ`—³0ŒºIƒ:Ë÷Þ½üIý£àkHŠWûžxü]¥b«KV?e;Ó{ä’¸|?K¹s².k6V§“÷èœ^×Ö»R߃VÆ’g) 2g5€Ñ¡ÁÑ;ê,Åb0¼Ëý×4‰)^Ў⸡²â7Vï,]—qEz/9—0pÙKd’ñzm+FJ¾ Tãõ»7VçY ƒÊYBƒo.ì`¥¢X †è&sƒY/9àã7&xÕ®tÍ'g/_¼gl©R±Õ%Ë7¸ˆËé½å’¸|?ËS$S£iHÆ‚gEìr†Ñ  »ê¬Vw †è&qƒ&rź_±µÓK^»¿@¿Zÿhû8eHÕ»¿¿¿¶W{T%å.=x›„Æ’g) *gñ¥Ðëbè®:+Åx-ýÂòU6‘+Ö]ɱ„åaG^>Û\³Ði;w–£+(8´°QPºPà ¤ðäÀ¥ûYò,‡AH†N£Án»:KE±‚·Ã:~Kë®ôa=ëXU´^O½Dä<“žÒ¡eK¡…ɵK»LÈJÕNâ-½—ÎXô,y‰gŠ 0„ÝUgȘÁø17H"×PŠ Kð+‰TŠ¥!KUôåM@CÆ'—,³Íõ#ÇEp*Ø*@Û n!îÅô®0¨œ¥ûYBƒ‚îRQÌB J„ŽTY‘ ŽGÌ©gqjRŠUò°>U™$Uq+­V_€^¢rÌL0K8w­ìûéG8e©ÈºÄž¥0¨œ¥\"4H/I{0P›Á ÝdnPÅ·YwK$Ò³Þ:òß=LGífXëS­ˆ¦ªHÒBt†Éù ˜¼‘#óŸˆ6¡bcɳ¶0Øå, ¡AAw.ÝÏÒ|–è&Q"rź7Z«×³H…‰$³¬/bm3Éúöjgi:x¦ö¤*ntà-¥—ˆœLÚQƲg) 2g©.tW¥¢X †HY™DD.YwK$IÏâµ Rɉdf†f›†ÍM|£ÆW?…Ì*:]D;)øDÎoÆê<Ë—  ¢ÁÝ»:KˆKé]Ò…¸AÞÏJ[Ñî³£žeñQJ±ævÙƒaùFÝMÇ}\êô'HK$GI¨jV²^"r^L0s–†Ñ ¡»%9Õ%’ñ$ð‘T.Qà’—xß ÅG+Å’õ)eJäÌÝMFÙ7h}ÛË.%Àj<§´79wÅ!îz¥±$a1 *g5€Ñ¡AËÓ"T\£TluIÇ q)½K"QàÒý,+Å”õ%ø»a†MÞ9¯¾AšÄÍêÕUÃÛ Õ¡¢viïö,©ŠÌYFƒjâp{?È`¸z7鼀 X‰õ,ŠRŠu?Km1l˜QwSº ÄT=Á‡ ¨­Íge xe­AnJÆ¢g=b׫r–UE¡Aµ:‰œßŠâŽÁÝäf+¹*[]ÒëY¥KÖWàÒý,ÍgÑë= ¤ö55¶m&Yž›ú5&”Nb°v¦±äYêPQÎRsŸ…^ªŠ¬³¬—Ápã!ã›8.±îªÞ“ž…ºÄ ˜ˆK=n˜Qࢗäù,’¥¼ò£ÎùÃ6m·™îÞ/é=ëïû%ëÝ»_ÒÕYÜ/Y~ؽ_Ò±îÜ/Y­°w¿¤ëÁøà~I¸t?ëäý’åËíΗ”ÎXß/¹ ` ž½_²šdo¾då{ÏÝ/ùùm;ó%+r8w¿äÇX;ó%¥Ë%ß/YüÞ|ÉòMwçKzÏú{¾¤Gƒ‡}\Ì—ôÜ౪ø÷|ÉŽR|Äq}0_Rò—;F\Ì—”ÎKÚ|Éåÿóÿþÿýÿ_—Ëø›¥žWœp~Æû¬äüü¶ZF…_z”8Ó<‘%(~µh­¤_ _ÿhþ8þ ÿÓ-µé8 tÅ_»?ßí¹Õtâ]â‘Âᛘ¹Y¨~Ꭸw†+šj¤Œ˜+Z@j¤jBÁ­þµP^Q­×§¢ç;Ü­\©åÖ=N­×äÕ~Ûø˜¹¼fŸéн ï&¹æÜû xmfnã¯=8ž¬›nÄ7Ùo†äc/¹¢¿%Maxû1gú0ÉõN Ž.ñ÷ß4D™¥œD™ÖœÝ»ñz µÀÍiãˆrÆá‘¯â£0Émz5¥øX^õºÅ7_¯è¨…?{YoÏöŽŽ×ùëmŸ`z` Íó ÷5¼°…¦>ª0ã8åñâÝõ™$߆üf¬Þ³Žs‰—¼d3ÉZû³±è Vz¼Ýpõ‚Ÿmº†ŽY¸…VX_lÌÌ8¨ýê÷‹r°0¡VUÑ4ÿæà««›E‹·Ïä5Û‰+ªê"à6Äûú¬°IñꩾáLIb%Íü?…åØiccѳ4ë< ´å’Ò®ÍKz“ؘî´B­]Úg{?ÁÍÒM´õ<±4â},S]×w\fçerñÜ 4Ð$Õçb;fuF4¶V—‹ß¦Í·Ö̾´)H}©Â$ïÇ=ú©*ÎÆœ”Œ%ÏRTÎ:F\JïÌ% \ò’f’Å   ëy£Ïvx`…åÄ+:h¾]±ð³Eòùú5â[}Ôà‘±c¤–³lm=¯ykEûl±ØTÿÍøk×;^Šûm„ÖQó\lÃ{c Ú¬ÅiÆêà c…Ú±/±ÂÖöAÇÛ‡onCt;×úèÃk.ˆÔ†eO³;CЃ±ìY ƒÊY `¬Ïšhp¸ÕY®À&î$âjé]¹¤äÀÕ¼¤3Iuºøk54¬¾±³k¬eN´ÔØm=ã-fƹ]'¥\z>n°éô 3Ö4„MgÊ;lú¼N¬@(üW±äYƒÊY ÖYGÕ»JE×% wˆ‹éݹDK^ÒL2Ó7Òû4Ìo\û¡Ú$q4ê¾CçÙM›ž^ÑñPÿ[8Sñ *l/ß8·…å®`0d,zV„Á.g` º«ÎjEq6‰¸¨Þ[lÔ|c ´@0W¤wå’’Wó’Î$šº_ƒ¼žæU­«­Æª`~*Nm8—–³¦¡¾½aÆÇ-:åk¨ŠMË|¢6–<‹aÐ9«Œ º«ÎRQ,ã˜ã2¡Âê]¥¢ë’‚;Ä¥ô®\ÂÀe/i&)Ý$ÐíÖbÈôxÅvÌjé6}ÄöÅjí¡uxÖ7tÂ+ônVhÆê5¿cš„¨‰FZ\Hg”Lt1í(Ú¤*2VçY ƒÁB\Dƒ‘Kº:ËÔMBºÉÜ`£¨:Ö´–õ,QaVŠ7ú,÷`üÒ¡"šÎÚûFíuª¢%,…&çÅ7Ú±ã¸äYªÞ•³0„…¸”Þ•K¸ä%âEäŠâùKZØâ£”b‘Ì¢ŸMLï6 ]Hs—L€‹i.:½ík:|Qµ‘œ—±Lè3 *g5€Ñ¡AAw`!.1šŽ´¨!¹ƒ&‘D"=«É*R,)F"fÜÝtØÇ%™ˆ’¤%iïMŽêUEHXIÜ"9/&˜9ËChP›ê,Åb0„¸”Þ- J.¤—HÏ’øHYR‚¥¥L5̸»IÂèakeÖ ]üMš]Ú׎ö¾>7 ½TéY»œe©Ù"4åiÔYQgÃt“¸A¹bÝ[.éô,‰2‰|²£µtÝMnEScÁ/“@1åçµ6¨éAíÒÞåY ƒÊYÖKDΓ få¢X †šE\*².!ënÄåv7²0pÑKÔƒáI ¶Ò¨ÉFí7jòTˆ›yØæ£ §ýôù²ÍXg) ZèÀ lÐ=×Y.Šï‡—¸ÁV½w¬»$`!.)Å-—t=j˜I&áêö ¶öµÕ ll;ì V›œº[k]×Ç%Ïr£žZø¤½ º[Â’^"Ct“¸Aq\"TX½[ÏR]"¥Ø”n±dó¥—¼„}ƒihä6†O=⛺5‹ž¥>.æ¬0vÐàAå¢X F£›27h"W¬»$éY­zï•bÊúnDâbwSË%¥ \lò´IÔ>­^÷ãÎy¶i«'Øž¥0¨œ%€!4¨ærÖY,ŠÍ`nJõ’Ô&Xz–ÄG+ŨÞ]*º.Qw“Ó»s —½„½îg/Íôžu|àïK3ë7Ý›/É †é¦³ó%žerþä|ÉNwÓŸ—fºòËTéß—fú?™p9t¾¤{)>˜/)|ùº×òì|IÉ|¼\æì|Iþs0_Ò9úó%…¥ 5gçKþð¬“Á®ûl_»üܾ v٦߻î}û*Øu¾p<…e“ØžØsÕUŸ ™«×_]^Ž¡<‰ß¦¸>\#0ùm@{îõO èOœ¢o°þ׫uõ'2[ÍVÛ_Ë¿À¿ºý£%}Ðöú/§¯½=’•b{¼;ž9‹øÍÿç³^i|ßž3ó²ý0ÏóFõ1o2hòàØë‹¤Ò}`e„ÖîÇ»M•Ž5—ðœÀ¿÷+û„AL Ì=Çȧõ^Ñe0 xGç`î†-õßDqƒ%ÀaÖç›×vnµlŠ÷7E“±g¸ä%6IšÏŠzá1‚¸"ŠóEÛöÃ<œÛ~x< ÞcL‘ÌÆïˆ½ï;دk}{££ð1aU­ ý¸Oh‡¸O!TD¶¨Ú4Ú§7hmÏ[Ô2#ë¹úáìóƒ{ZkY¼òpG™´kdzŽÒ»³™;K›IÖOÍa ù`pû¦·[,˜jõ,Á€;Ëï1qfæâ‡Û“L#FJ꿃QœÛ±÷ý~a7îmÏ\ZT»Ãw~?‡Àóö«¨Œ®7Ð õé-ŠÌ4Õ.H‹Zñ@PpA‰ÆJžu妗CÄ¥ZF¹DK^"“|Ï*ÀööÖ»©ÿÕI‘†)N×·ò¶õ†evïÑr®Bñtpš|ºãNìtÇ"Äi^"Ö~xL±;t$‘[Ý¡·7;eß)yÜ8ÌðlãpÇE\Ëž¥0¨œµ™¤¯³„¸øÿ´\Ò®æ%…&¹$Šwœù!h9hû Büm ÝyþkÁÜÞÃx`UóP]!Xœû‹»)Ÿ˜¨ª¹5äíŠMp·D{ ½ÑBQmºæûØr¨Ÿ ô’Z?Å×ÞŒÕy– r–ÆáÜ{Òðÿ´ô^r.aಗØ$Ô³×GÔõõqŒu¯±(¹þIÍ{í‡Z6†HS­s÷WÛ12¸= ï‘™®¯hÔÛ½lh ªÖ~µ-4ó*FÌ— ¼¾6Œ%ÏŠ0Øå, £ÁÃRÑú)ÿ!.¥÷–KºÀÕ¼¤Ð$‹< 4/6ΛVâ‡Zõµ¡èqÎzзÉç ,ñ¼Øë>¯gn6­`9lúžàÁÏ÷HCúñºÐXò,‡Aå¬0Ö×hPÐýp;D*—ùÿ qµô^r.Qà’—Ø$ìÁ¨°Œ]:AUÎÍVêhÇøÁ%iýmã¿ú6´M}ã|Ê>zqf¡5>ÛbÝ\àbdĈæf¬ìYƒÊYFƒtïê¬CBÅ܆k³­.Ym:Ré ÄåôÞrI¸š—šä2ôÃ@í…­ íŠÝÈõˆ*ôþTß©7¬wä«Q3S,i+6ŒXõœWj†×ÃXò¬»œ%€!4Hè®:Ë•ø1Ç%ö˜ÿJE×%ÁB\‘ÞKÎ% \ö™D}ƒÕÀMýŸæ"'ø÷-VÄW€Ò^¾é6„ô7UbÐ{äeýïèݧ±äY ƒÌY0:4Hè®:ËE±Œf’Žu÷V±[õ¾Ø‡¥âÈÞã‚/q)½·\’WxI¡I.¹ýsÞÚ#%õß þ :mµ\°yӭ榳«'ÚäFöWѳ•³0Œt¿¤:ËE± ÑMÇ›†Dñêÿi„ÊbTï.Y— qµô^R.qà’—È$êuç»YaÞL]ÖwÜ8yÜ éÉXò¬»œ%€A4hèÎ:+ŠâŽÁP<¹Á_ÈyÏ/OÇEB%ª÷K*£.)Á—Œ¸˜Þ#—t«yI¡I.ydaª #<ëÍV6–= aÐ9«ŒKFƒ„X›ÁhtÓúú7˜Æj÷qéM-‰v$Ç„JIÕ»JE×%ÁD\‘ÞKÎ% \ò™DóYíO:ÏÒoÓ¿#€!4Ø>uWg©(ƒ!ºIÜ`{¢ë~,aÉ™lŸÍÚ%¿|CL¨´·*¿oñ&–üŽòíuzoo|ç ÍKJ6–§œ%?%4t—×+ÁHt¸A¹ŒHŽo‡ª¢ôú¤—¨Ó‚q”´£9®•KŠ×ŽäŠñÁÊ ‘1JÎ%6½D&QÎjÙ¬CƒÌ€®³T+Ÿ¶LÛqƒÎÎdÝ%‘HÏj&É=s m\2i¥$ì"TcB¥!¡KÆH =•„«„¸œÞåYƒÌYy(p¢ê,Åb0„G‰T…aͺ÷ZÏV>Ü혊!þ? ­—„ã9ï–Þ ÍqµJ¢äCÕ‡êËž5ÄŽç.y‰Lâ=[– ÓMªçDäŠuoÕa§gY|”R|Ô¡ý!þ¤*JÂjò%×έª^Û Íÿ¬ÄU£·ê½3–Š·lŒf׃qÜ4d2[ÿÏÆ¶–ÌÃZU”„õ~Ó5AÎ7&¸dc™=&¡¢œ%€!4(è.Ä¥ôN#ñääEä¦a ðñÒ³Èá[)ï/EÀúÂ/}\씾@µB:†„^«Š›*òß"V%%ž¥0¨œÕF‡ÝU— qµôÞqƒI‚—Ø$šÏzb›50ËúÒÍÔ0c}n3ÉÚÇEÉTÊõ¹{H³Ò›B¸|6h‡IU”„ÏJ%rVÒ5¥xJ e¥¢X †è&qƒÖiɺ[Û¥ž%ñ1 ½ÑOÁ éÎên²¾}¸M;í¥¾½©åeH::viïz­*na°ËY&çµ6’Ðݽ[Qœ —ŠªKDäŠuoé½Ó³Ü5A/±I4ŸµugtÝMêèp¯Çqªö÷êÿyëð úPZ‡J6–<ËaP9Ë=2Dƒ"çYg¹G  sƒ*ź«OHˆKéJ±—z0Ô0ÓÍga›û«wΧÎ+5†¢µN}\ÍXg¹+LÚ;†Ð`ƒî¹ÎrQ,Ct“8®F¨t¬»$×%ÁîÍÛÒ{׃áÀ•¼„&Ñ|Vt½¦^ÃÃ6íÔ¯.ÞkÜ^”±ìYlRÎr;„Ð  »UEIXb0D7‰‘+Ö]„Šô,‰RŠ%ë»ëUý°ìnràbß š<Ó|{u;ç}ÿÏW-×üªå:sƒßµ\ï)ÅÿÞrÝå…i¹n&™ÛÙû%;aP;çÏÝ/YÊ^;ÄRËœ¼_r9$çK?¸_²‡½RqŽçî—®’½äƒû%Ë»÷KV?=w¿dýaï~ÉúMÏÝ/éâ[i\<ëäý’5ŽîÝ/YâÛÉû%?n¶s¿dyn'ï—üîYûó%ÿìJ¾ vY¯ÿ.ØuìñWÁ®¯e¾ v¥ó’Ý1ÕÎÀû“Ã…¯Kÿ"íNw¯¥¶vŸÎ.£’§'‡³;{£ÑÙÉá.Ôh¾þ—ÉáÏ`DšIÙCvëërÙ­iÙ-í$²+‡ÈîòÈ® GÈnùl'‘ÝjÓ=d·ëÙ)—´¿UFýŸtÿOšÏÂ=ÍùtèßôŽÊ莲⟫5iœœ_¸øá=¼áYoî¥"ñϯA䬉;ÀùCûk%ýýêøGw>>hû ¥ûrüÚít*kℲ֌0@*›ÉKÒÈîgyòäÍ!\øF.Xª0ª÷'Cðo0 DGìÚ«ÿÏšáþŒ,S {kö@›µý?· Q_³vޝpÁz¼"†LGW*´Ã÷¹â‡Š ãµ|>0šÇ·×žuŒ¸”Þ•K8íe/‘ItˆÜà›úv#¯–êã_¡>Þwð×ü«ý‚gĪúZß±´q® Ús»àžÆ1žÎû†Ó£5E¬šžø“ú©ãúðtƒ žnh~Ü>/ÚŠD9Ü1lÿocpƒ2–KÆ’g1 2gÀ¸d4(èÎ:ËE1Œ ›zûpXK—›ÄÇ[/áZO1ÁúÕ両‚_¡ûrúÚD\Nïzˆíñv^&Ñý,›Qa9K/…Ð`{‘º:K/Ÿ ¿°äß<ìx¤*:¾%½äÊK¯°6q\WÚ‡Õ{ %‡ !.!…§¸Jg,;^J’ƒháÖuV Ñ]ðfXOÜ ‰\á5¿ ½R½/Mz ã“^¢Áq™PQrmi·KÈLÕB\Nï6=ËaPcÞ¼Ÿ•&OJXg¹(Äià'sƒ&rź _KÏÒåMŸI¥Ð+ä-(Ó7ÐX:&@Ó—À©`k´%C]‚`!®äY ƒÌYöÌñ2A=á¾ ÑM*ZYqɬ»JÖ§Y|Ük‡X¢ÖX¨r¥ª(|­¢«•c—T¨™vÇ¥²Oa+/±äY@\ÎYBƒòÌá~Vž.ë ´6§½Ì’4§ª˜$,é%9_²±Lè“ã²@€!4(è.,Ä¥ô®\"nÐ^B“ø2ÅÉ*TŠ-ë'}­Ð¿´Ö©‹2‘÷¿I_ è$¡7©ŠGÆ’g) *g‘ã2tW¥ºD XˆKéÝ¢ Y÷ä%4 îgu“'8aÄ ëÛZv¹™¤W±ÕZGå[lÒ箘)†œk¡—ª¢=Kz sVb‚E;Šã¡Â¢X †è&qƒD\Nï–Û©gí{ÉúAßâ¯1ŸÅV÷‡hYìnêšÔþ‰6õqYßfÓCk‡¸$cY赪H Ë Dƒ‚Èq™Áp³¸A×%b݉¸R»ŠY~ñšD÷³Zé¿TF¯ô_~Ûß+ý×ÏöçJÿK—ÞwWú—ÎKvWú÷&Ùf˜Ûq›öÙù’>®£•æK:nðX/ù`¾$s\¿TïÌ—ôˆë8—ü=_²XA7ƒdF™„§Óºû ÑßËCl>Ñæãm<릫ÇÛ)¸%†ðž¸Ž¿ë°œNεctËÛ™º•'Ç;¶Óqq]²n‡òVc½¢úðq=ÝãA>êkGüv³L®c“üìÊðŸÓ÷KŽƒ]a°»|ìÊðŸÓ÷KŽƒ]a°»|ì ƒÝåD°Û/)½±þœ¾äO Ïvvrø’žŽžÛéÉáK¶œlzvrø’ß*¿o''‡/ù·/üÃÍÇý3œ%{ðWg8KŽ._á,9ò}u†³ä¨üÕÎ’3Æq.‘÷gòW4øÅš„åkokV¤úÅš„Ë€5 ‹/|³&aþÕmMÂb…oÖ$,?lk–oúkök¦ î–±kÒû³Œ]ÕŠ?ËØå‡¿ËØµü³Œ½|VÆ–ÏÊØõÁÿYÆþ0•±Ëoû»ŒíWÚ #ÎK²ý?ÝoKghðÙÞ'·ßÜ0^u{câ}3÷xà–6Ö¹ ç¯$¸Lã#~Û㉾uþÐþZÿ ô«·´äÃ_!9}íÄ9ȳŽA°²™ê¬-—”.p‰ìÑI3æŸý34 Wó’rÍèvÃi‡šÏ9÷1’Ã^©ax`oøóöÆã}bïäë†iïó?Õ훾ßvH"åŒse²¯VcÕº&>hM{­Î’±,6hóØq]Â+? q1½+—(piŠq3ÉòMqü=Ÿ¡žõ¸¢g¡æóPá÷½ÇpôU¡7¢æŸx:¯8|>?Q8íóW0†ÇMPsUÛþŸZÅ(yNV”ïÛývÿ>¾ïûÆ¢g%±N›û6“”zx™ ˜ˆËûŶ\RúÀutÒ¬~h¬UÓ*Åõw+_±„Ž·!¼¨\ï!`Þcx´þ™%Lq{¢!£ú)GnÔy‡½Ú*6ÝëÒÒû…È›±²g9^+gyóåaõnP¯ lÁâbzw.qàÒãWWæm±†Ùgh؃ñ®X*&ƒjàb_Z(wã ÓDsrŒ_ý|†ö1“80ãÏz.,â³± jzaÖ{ KÆ’gµ0Øå,? î*k–Áî¦Ô³Às’Úo ÄåÜØrIéeI™ä9q·ÎР»iº=‡Æ~M×ÇÔ|aªQklׯszõÁÇɈu›Z@E™ÄñƒŠÏÇcѳ™³ŒjÜlEè~Èq¥.q"¢X—4œ—Ó»r‰—¦7“,·¡åÆt††óY÷ú–¶ÆÐÛë‰3з±mEßÓë>÷Änîy-FJ‚üÓ6Äî'zÝåY ƒÌYFƒR |±çvÇå•×[õ¾ÖÎܯLylÄÕÒ»rIIËÃ@^‚üxà<ŒÎа#÷Qßäö'óÚÉö«k…0Å¿sEãÔ4F GvÉXò¬»œE€a4˜ ;ê,mþ?f‚yåÇ—)^í'W©¨Æ wˆKé¹ÄK^ÒL²Ä·ÇWq´%ž½î5"¡Yñýlÿh5Ö«ñ!õyŽÑmbcѳ™³ÀÈhÐÐuVZ¤ÁËÍ$k׃Ѳ—hGóñº‡üÀ6`zpÔ%— ‚…¸&tþF.)9p©ýÓ&©!±™Q÷GågŒ–Kº,#ϲI˜³r6Ãocd¥¬é|ªLKn0±­dݵIúP{÷•üæ m˜œ¼a—Žã¡"$$Œ$ôÔpUF\ÉXô,‡AMÞo&éРÏÐA[šÁhx´Cª$rS}*Ü+=ëõ€ZAYÒ7mU QUÔ¦ï†ã;„ß°ÿ%U®TI´£«>FŽ¡gÏšsÑ L¢:˘6Ìn7¨J5 ùéY;THxçÈVÓöÕ®WåÁƒE΋ ¾1ª¡¢êÝÆ’g=ãzoÊYÌ%æè%Í$™ÁHghÈzˆSÒ8”NÏò²$]Nßmºr+$ã.™¦³Ð+UQ‹œ6î©c¥_µü@&K—Ù/z– r–@°Ð  »ê,Å’IÄ ú ¶¢‘i”že}AËÆ$ë÷q‰²v‡ x>ßGßxØÌÐZ²^bržLðf¬ž=VdÎÀl ¸C\JïÊ%\ô’f’ŽuOghÀÔ‹ÃOúºÓ¥üÖZGÉGbЦItj…ZÈÅJU”*Òô’^I¡g‰v´.#Åæ©Î+@wÕYÁB\¢›Ä :p‘u—I¤gퟡÉêXZvIEí¸ÛQW~ÜÇE™UjŸ÷¿I_Ø´ÃNU”±¬—0 *g5€Ñ+ž„T«.¹C—1âRz·‚«À¥)ÆÍ$Y)ÎghØ¢e±T¤›IÖ,ÃTmUû'5q©åMGÏ {hï2VçY ƒÌY&ç‰íè^tˆÁÝ$nPÝ bÝ%‘HÏJë𤯻@ØÝ¤ŽŽãžàýƜճ†àÉ¿jÌQìUÅ“9Å=ƒq²1çÂÓéYgsd’í•Úßr½xÖî–ë<µåºï ÓØÓÉ-×¹cÍ#Yg·\—\*JÏ:»åºtËÃ@G[®÷Ï¿-ÝÏÒ|–ºàSOcßÙy–OL©«Rý–ÒÞ7èÞÕY’°Ä`˜œ'7ØhÇŽã²DB=K¥¢/‰÷ºëUé]¹DËýñ˜UtGî‡Ã »ó%eÏXñåNΗ¬8ä¨âì|ÉÊ9‘ógçK–ozX*ž/)¿®C“<®qI4̸ØÔó2ÉuBžÃ<íùÙjÒÄ {½ˆš¦{DËÈù×û§D^÷¿­4¶Ý 5?ŸîÕX„lh/œBÏz½§;šÇnC„èú¬â˽@°Îë•Ð^ø~ÅÄÁ<¹Ë="D§ÄÏÉ-qÚLò»g v¥ËLß»Â`wù6Ø•!i,_»Â`wù6Ø•.ÿÈ$»÷K6cõ²ãYNÿ¼–;“Ãkv>79¼ØgwrxÉ2''‡õ ô«KþG?˜Ö—Ó×.ù|09Üù‡7ÏΗ”ü"}u†³¤—ü»3œ%9àwg8K¾9ÃYr.IÆ’gÑ$ÊY¼¦êmšÏb VˆnÁ[a½ä€¯T $Áô‰E)§äd¤4ŦÔIOé°äD©ªäª´ëbU›+|Æö(½pà¶tÙl»ß¸úϹ›Ã«/ìÝ^¿Ü¹›Ã?ìÊÎÍáÕÍÎÝ^cïÞÍáõ¯»9¼~Ó½›Ãk€<º9,Ä¥ZæÃ$ÿÝ ó?t'Ì‘rI¸<|’³»rvå8»Õ¦{œÝ&?ÅÙ]9»òœÝå³ë<ËsS ÊfZZÂ+ÛÊ%NüBi2 ÿz}ºyÂïó¸ ±8ìQý4Ëó…5q5¼4ægÞc6}X8ñ¦Ó#Ûúaûk%ÿýêövG´}…’¿œ6÷ùôúq©¨ à‰B\Lï¾_ïÁRäz}‚ZÉc9þ¼¹}mÝâéŒïð,ßüš’£cí>ÀÚ5É4fû5ǾöNwœÄ¸¡õ¤ú9Z”'•¾ð,…Aå,Š‚is9¡»ê,W`*—ÅmˆˆR©¸Õ%… ø’—qË%]àj^Rh’åO¦+ºèâõâdvQÝ®ctYÄ6+ÌÉ›ÓÎK¯çF¤¶7î6cuž¥0¨œe„¢f_nþW%“¨\·á-ä¡òSËP!D©¨ýÊÁ Ä-½—œKÜJÃ…ú4É8÷¢ï6ø¯$W¯{uàæ?SE±>ô͙ȹÍý!4=«…Á.g ` ¦fyÕY[QœMbr¾Q+ªÁÂBQ¼æã_¸'ÎRÑýo£B\Lï‘KúÀµyI¡IÖöhÅÝl’ö¤ûYš"©‘fóÓixâ~V6Û> “¬]:lRûfñëòܸÒò«Å¯%Œ¯¿–\½µøµt¹ä_¿²»iïòƒ{¥4ŸÅ^]M‘°'K­AlJûGˆ·0˜s–UEIXju29¿ÅƒaºI·sÕ†¥­­.Éz–ÅG7‚AÖOƒ¥êïÕzdzQ“Úqç¼îgåù¬ƒ‘¶ÖÉXÞß«þµCP{·ÐKèî:‹E±Éy2Á¢EäŠuWõîR‘u‰@°)Ùƒ¡\¢À•.á¨ÉS¹ûó%Ë'çK:Ï:îãú`¾¤«³UÅOæK:Öýãúd¾¤ëÁ8F\Ì—”ÎKd’ú%0Ó5 àyç¼ü§"UD Z‡ 5ÕÜ ÎÊ Þ_‘®±bž!DCítS56¥Œ·¸Žô&·>Ô¬©v¢È?¸d]ï •Ä0´Ëé¯yö þƒR_ª0ÉûqGë㯛±Ê'·tÆixÄÇ&±gi0á›`Wì.ß»N¯ÿ*Øeöø»`×Õ2_»’½dLuý^ùÙþyCNM¯?ìM¯‘üÜäðš·÷&‡WÝùÜäðúö&‡×Ïvnrxý{“Ã+Š>šþ§›'ï—tŸMóÎgï—tϳاï—d›z×Ùû%ýû¦ö“÷Kºð¤YÅýù…Á>gíΗ”ìÛî >9_Rº¸#ñää|II1ÑÑòì|IÉñÚÅêÉù’õ ¹ñOÆ"&¿ Á-›•œç”•ÝÀÍ|Ú2íÉ‘ƒ••·[F_~`®o( $| ä LhãÇeF¦œ˜|vª1ÞÙ£Í/zZ~qÕ1ⲓÏ!gÉKd’k,Ñó5o]CÑý,úÏj°éûúÄô̓·"…îgéŒO䬯s{G¯ÅꣂÓèX{ÝÂôCûkÝ/Яnÿhé>?¨¥Iî×;^åç-RN…‘t?K}ƒï9ׯ_¢ßrä»óªÈ0úPæF‡í·=kè‹ÞˆöÈTŒßTƲӎؖ©œE€!4øí(ŽK„ŠªwQ¨K‚¸”Þ-K*ŸÒKd’šeZ}:ΕÚöÁÉz5Ãi>‹’ÜTÁKËõóÖÓH÷(}ë·žè?×ñÀXô,…Aå,oþ4tWe&X岸 QªÞ·R±¤ºÄ XˆKéÝù”›Øå%2ÉX-ÒžÛ4Þ¢qwx ±2ž÷³R¯ûÿ©˜S 7¼.¯úÊ#VMá ò,…Aå, ¡ÁÝ»:kŸœ_ã{AyàÉûEñ²zo¥âšr4r ,Ä¥|ê\Â%Èô™dvÌÆqÕ8Qyº¾î0–îgiФ& ðÆ-Æ—ÞXô¬- v9KChP—gXgEQÜ™DÜF#¢~r}d3Q¼æã%ž°zo¥âòÙX—+Ÿ*½3—èzˆ½Ä&AΚêÓm/ÅR{Ç|–îgi>KÆ’g) 2g5€Ñ¡Akñr“Šb1oªŠ’°¬—â5/¥— VïÞ•¬ºDùTˆ‹é=µrq¿¼Ä&yíÒëtŸíõ¯eÀãàÀ†=KaÐ9 b4ÈøæaG]>#ƒAºéXU4Å+>žW~’ÒEYÒ•tc+»|*,ÄÅô®\¢‹Wö™¤¦‚)’±ìYÓQÎ2ÀÀgÓ§Ö÷Ñ7Õå@ÓMxnÇB¯TE»Œ‰n&&Ø´#Þ|_o•Þ7½‰zGõöò½NÃ@:6C/±IäYô9ç,ú©Ñ  ;½^ñ@‘—7É :î8"ÝvfIsʱ„%½„Ñ2ÅÑ+™FÝgbTvÁÎH®¯è¯¼ÀŒ¡\â,cÏ’I˜³”Íœçx?Ë{0˜5•O•i™ƒ•3ë¾×qÉÀLB¯¯üHÂ$,ÚÑ—ìC$$Œ$ô$\%ÄecÙ³¦ƒœE“ 'A [jà ñ¨ª0¬XwâÞd)][aSº’ÇÅË$IXÀñBøÆþª Ìq‰PQõÎêCu‰%ÏRTÎRe/±ITg©sm¦ªM»›F þ¢duh=Ë¥dIí(e 2AB/«]ÖÁÖK|BL°hGVâ©Fgõκޞ¥0¨œ%€A4¨›Ýò™D †¸ ³âCÔiN…ìJû¸L¬©C…W~’öN¡—ª¢$,qOb¥Ì›ÉÇec™c–r–Ñ Ó{Ú©6O^"“ˆkh>QL£8H²“RŠi­S—(kw¨pÝ&ØV ½bhÅÝZ/a>5,c‰ã¡"Æ™\´Ð ¡;—9oæñäò™D¬»õmŸÔ‡Ov¼êÁø[¾¹|&ßtŸm_¾¹ä½/ßtžµ/ß\2ÀØ—oº:k_¾é?ή|Ó±îûòM÷¨öµÜƒqЀºF±ÿîBü¹ Ñkó?ZOéûYšÏRG¡Ú?Õ« µÜ*RØ¥½[•§g) *gIýtWå.2êL7èCyºÊÆô®\® {‰Lâ!êÎpßïg©ýF«Õþé^]N‘ Û$Íg±CE½+îja¤PÎÀd_™`ÓŽâ¸H¨¨zgÏYwI$Ò³œÞ=닼 /‘IÔÝä¾§ÃÎy7¶©WWóYê‚g·û¸Ò|–z¿Ô¦|*¡—ª¢%,ê%îXS/›è&rƒ"TT½«›Nu‰ÄG)ÅJïžõe§Ÿ¼Ä&Qßàßà ‹MÛ´ÏΗt}\¿t¨ü=_Ò«ŠGzÉ'ó%Çu\½0_Ò!®ã\òÁ|Éj¸fjÿä.x^ò|ãf’µ>ÞñVUÔŠ¶²ºÓyRÃéFªS­2â½^áY\Šq{²Ûñþ$tÇg›j}‹âîíí×;^ŠŠ¢á§Ã€àpm;ˆ^o8` 4㳇Ç?®fÔ§jž˜ZzÞcÉo&ù;Ø•¡›"ù"Ø•Œù¾ v…Áîòm°+ v—oƒ]Jû4ØíŽ©þÄ·S“ýg±[øìäðòÃîäðŠðÏM¯6Ý›^+ñs“ÃË/Ø.,|09¼<ÄÝÉá’ׇ7÷Ïpv¿í«3œk Á=ñ¯Îp®.o~u†³äóÕÎ’Õq.I# {÷Kv<ëÏû%Ýë¢ná³÷KºW¹½ä¥{ýÿ¾_Ò¹YsÀ’]óƒû%}ÀæŠÓ÷KºŒÑrI—e’g›/é°¥ñÙù’÷Z<99_Òcr%°“ó%}½ äzr¾$#®d,y– rÖf’ ”L¡›Èâ¸[X°Hð¥~žõp¿6`¶XÁ`îþ¾í@AÃ7º7' 4½tàT°u´%AÝcœÌ(ŸÓbg3B™ä1ᮇåwÜÛåÒ,_s,šž\­=q3ô¬Ù}â%¿?ø¬é0vb¾Þ6y÷Ö¿Ï‹ãYOØü2ðÚ ÄmãÍûú×°êë‰=LÇu‰n¥Éa AáDzI3ÉâYïØ¤Ví#êÙL¢†ª$v…¼ ÀBý¦Wì[¿ò ÒøÂõª<õKǹ¨k}p¼ºáäO5v¬×Ä­¹ Ý~›Å:mî›âí­¹#v!&cѳäs¿HAáD1>¤{ܧIÚýàŸ_ÀŒŽùzÁ"­*2oY}úÂcäCŒhyã1áÛü.Çví=ß±LñŽL;>†¸œ>>ÞC°áÏ·¥¥Í—¬ùÝŒÕyÖqõþÁj¹Œ¸~[-÷÷¶¿%¾ínû»dXôÁ¶¿EØÝö·<“ÛþV_ØÛö·<ë“ÛþJ6–<ëxÛŸ²Yƒ¥Ã‰'¥?å’ÿª±;žõ©+ŽKsȪÞU*jÑÖ–Ä3âJðXµŒê9BªülÊÁ-àwÑů2Ÿ9Õñ5×Sñ pÕ£zIÄÿ0Få_ _ÝþÑîãèƒ*géËýF;’ãÒ*¶GÄÞÄm°õĬ!WKïÊ%%®«æe‹^AþÖ”3Þã‰N×V¸ÆÓÑJXÏgÕÿ+Ül„ñÛ`…"µ=_áõõŸ 4hcɳ´ù_9KChð7&øÚ6ÿ'ŽK„Šªw±†¨KwˆËé¹Äú)½¤™dù¦¯5êË; cmŒÅÉ£Ö=ë¼…{ÝŸx)措0Éô‚öþ ÂÆ’g) úèÝœÑ ¡»ê¬Žœ‡ì%Ú1q\<+=‹|üû øE,Ä•–ùþä’’ãAó’Î$¯Ï¾Çèë¬&‰œõž^!ù~–§H©km‡9ñÍX½g1 zšUw‰tÏuÖ¯z‰Èy2ÁØHiŽËâ#«w–Š®Kî—[i¼¸ä%Í$Kv®õXûõZPj°¼ÇW4ºú$“æ³d,{ÖQÎò°–.7º³ÎŠ¢xÇ$ä6îœk(Š—´£9.*]­z_² KÅV—¬þ,Ä¥LÛrIÙ \XÏo“K]£N Û©æÆ¦ÆVcQŸÚXò,…Aå,Æ7¡Átù u‹b3¿¨Š”°¬—ˆœ×ÚÕvì8.*®ÞU*ª.i ¸C\nÿd.aàJ^òŽ>Õ©¦ÖÖa\ߣ€8a¬Þ³•³0„hhòå@Åd0L7ý"ô’â5¿Ù§dËY–䝿?G´ä¯ /g ËÒ•bI×^&‘±ìY›wr–Ñ  ;ë,]ÞÔkÉÖÜà±öÞbU¯**¾Y/9hÙœ¶ã¸äè¾/£ùÖ%- tˆË# š¯GàJ^BÏbT€L¡“AÕÐÝ{0¢¼ÖðMäšugFOFz¡*9xc$=ÓŽæ¸t>aK®%§]%d¥j%qözÏB´I0„(éê,•öþ€qƒ 0u¬ûq‡ŠÛ!„¢7|Ý©ŠIÂBF9/&øŽ>CP*²-ë’‚;ÄeÏb.É 'KˆÝê÷]n7¨²‚‡J‘ƒ¦¡ kÍÒU¡úmz­*¾vŠ®%ö²S¡¦ÎÅx—W0Û©T”±äY ƒÎYC»ÒèÀ%è.“¨(ƒ!®Æ%¶ŠomEcÁn=ë¨+q5fqØ!æg¼cZŸª¢H Ñ":Ä7r¤ã¸D¨¸z·gæ, ¤wŸQgà’—ˆÁÝ$"J•É+J$Þ7*층îFsùm»ŒæòÃIF³äàmrñ$£Ùç,Œ“ŒfÇ`è+üÂhî’Ì}?Ò.ÉœM"E ´‚ÜÇuz=Øò6Ò¼SÏ®ë<ë«õ`ËocõÕz0™¤$‰äëmVÔ¤µ¹ïIMjRîØë.iI¢“ä( U:XÕŒÕy– iGq\Dƒ ºwu–Šb_X³Àn°å’Žu—#“¤ã¼„çÙ~nBÿÔ ˆñw¬ý¾WÀ?ð¬¨w ¼b*³†šÎ&?ÇÀµJâݾ'âÛ<2ŠˆÝÂïiD‡ÊÄyçeÒp}øm/ÈÆâ-9¹¥3Nõ‘FÅò¬ð­¶˜éj&ùóN»Â`·c¬sÁ®0Ø]¾ v…Ánó…v…Áîòm°+]þ‘Iè%¿Œ©êÉÉÉáK#¶ÉáÕ ç&‡×0¸79\Ö§sjrxý {“Ãe­1NM/Ÿzwrx–ç&‡»ÀõáÍdzg8ËÏçðÅÎqœáøâ çòÙ¶3œkúøâ ç{1yÿÕÎ’s‰Ç„øàeß¹“g1 :géÀ->›Kßö}úo*òŠO‡ÏMO4žug…t&–£Meíxº7DŪÞ*ßßæ›¨^wm”8LïùfÐÞý’Þ³þ¾_ÒypóíìõŸÜ/é¢K‹;9"}r¿¤‹|-&æhùÉý’.*·xÝEòî—ä$®Zæ`¾Da°7Éî|I—Uœ/ÉÙÙâÉÙù’9PU<;_Ò£w'çK Apg,y–|NË{0=Ý… ‰-…:íª  Û„{ˆ+÷(zÃ×›b,˜\h½áøá»·•UëUwl/Tõ!“¤?‘és¼ìl&è!œ(“Üã:ù‡ÈY5zG^È \Gçv¡ÛwLÚÎuplój6ð×1°ÌwŽU¸ôú¹»<·Ëøw¾ßÁJI¬óæ¾÷+tÀg oø“÷?Ì+‘wM¢RQŒÙ/RÐÃ8Q ÆÔöq…IÖ?…X“f˜qÖþsC`“ K‡nE’=nx¢1Ć[ýœñÆßŸ¸õ sZÍOçôÙXÓÖÖ÷¢ Õ îô›skH³'º^çE»Æ’gÉçR€d63ôNÄ3W` \ò›„ð«>yl4â*¸ÆoÞ8¥ù¬÷ØºÂÆû-ʳæ‹u›¯;¶¼Õçc>kž˜Ž67僇Ñ`ô9¼ G5cužuL¨8›©T¼FJ Þ»›X.ëD5Wó’B“¬Þ‹Ã¼GSíB··êK±ÇÌ»Ü(ìPË©ñ‘OŒqÍá¡=·úDÐØv XCR¤ ä¾JP³xt½ÒXò¬ûœµ»G³t8Q þäÍ’sÉþjÓÎ$û«MËðÑjÓÅ$¯6]¬ð÷jÓõü¹Út±Âß«M/9 î¯6ýŸØçpºõ¤Ð$«Ÿ~Ñz²ªØœËù¦õdùmì¿þªõ¤d€a“ˆ æ×v¶”’£¿KEá*`ýÉöÿt¿Íe¹> ~ê¥JÎÛNŒH¾ŸÅg=3%ÑmòqR†?´¿Öýýêöv9KThð˜œWÇšŠã"åë£Ò³¶ºdùmï`q1½·\Ò.é§ú>h9ú³[k ¢£Vp×ÀH5­DŸªÇxŠdBÓÃ|…|×Xö,†Aå¬0–OM4(è®:Ëz‰Êeq¢ÅqñŽ€F~$ž¨.âjé½ä\âv¡[™¤¾<íÌ›åc2èm³-!¤Mõ«^ùÿ„3y>kŠhiû( 2g ` 6èÞÕY‡V‡EÎo¬a!íxÉ— )],[]ò{ÇÄ¥ô.+0R4/)4Éê%7´nÕ'Ù×;¦|j:Šô1D%žŒEÏR|sÎÒå3¢AAwÕY­(Î&Iª¢ôzé%"çÅK<ǵ*?ñ ˆ˜¥¢êàtÃýoÎ% \ö™äqkò\G4í£þ îgecÁ³•³6€Ñ¡AAwÕY*Š¯î¸¹¶.DQiLH–øxý KÖ’%Éq‰PiÕûú©Q*¶ºdù¦ºa©öOåà-—t«yI¡I.s]R]!@0¯zسøÛRÎ"ÀPo+?µê,}S1|:É$b 5&$>~s™’Éä<˜`ÓŽzCÚ»Sò[¥÷Mo¢Ú ˜®­—Ào¼|A^b“гšÏu9˃lè®:Kó ŒŠ!Œ.ÇíšM‰E)‡²¤Ó”Èù-Ž–a{¡2H®º/ƒù£[,èØÌÑÖÆ¢g) *g)› :²ÎRÖô|3­¸Afg±î‰—x"¥KB¯TE^ùñÈqˆŠiGq\ÞY#9‘0’Ñ-@°W3VïYÂoò™„hð)+Aº·U¨SçÚ‰T†íY÷£¦¡T¾¨b+y+¨R™$ ‹¥•~Ãþ+R}rxõ‚ï.k ]öÙê’ÒËcvHïÊY \Bƒ‚¬/hÙ˜¸[rƒªôTª:<ìãJ’âð¿)ò»Šò«"¿‹o_ùü§"ûÚ7èGu’w),ù÷Æœå‡Ý9ËrrcÎò¨v7æ,éäÆœ> *gܘÓ.1¿mÌùs‰Ñ%éYÇKŒNŸŸ_«]’ÙßœŸ_­@½ä›óó}Îúæü|Ç`üÓùyl#IL½8|±û‡ ¨ÜØæVI>nR“LD©éË7¥Â!탪Hè%±äYŽHâ¸L¨ ZåQ¥ @ÚéÇô.nˬ»$éYRº¤KS†»3ÜJþ'5©©£W~$ÀJ”B(¡Wªb3VçY ƒN¢‰tïê,ë§RV ‚¸¶ôžY÷´;^b“P)nr׃qܦúžÐXÀûY¿^ù²Skƒö¦½—l,y–$,´ Ý º«Îr— w&‘kÄÅó˜ÞÎÀ%¥X²¾z0RwÆaç_7n²q ’«"ZÝøßÐâòæ}ÀðAváèàˆù㉭h·!Ðú0ÝyRæ}´äƒgœfÛG§i^Ž1 =÷“ȳܑûE°+½±¾v^ÿU°ËìñwÁ®«e¾ v%{Éþ˜êòÛtÞbwrxÕÎM¯ÆÚ›^«s“Ãë¯Þ›^}áÜäðò v'‡K L/jwrxÍõG“Ãÿró±á\é‹3œ+FBäWg8ˊź̿Ÿá\¬°á\~Á7g8²3žÎgg8•KZà*ÙKd’×\Þíþ‰þý6ç,¸õ¶ •¾•®í:ìše°vHuãü*#Â觘8sw‡ÊÓ~èþš~~µY¸¹Bglõôåøµ}ñ·=ª’Þk¿ñ>‰A/±±äYö9z#_ ½.|‘t?Ë}z-½ Ê´0^r]¡Õ}Z» In&Ô…\÷Ñ}¿^!€ÁAu=—|ü‚¸~;ðÄk\'ï—ôAõi¯³÷Kú€»c§ï—tɨ¥©ÂÖ¥¶ýû%]¢l)´0¹viwÿ~É%ã*!®ýù®ÎKöçKJ‡ WÎΗ¦K†RgçK ÁÜ%ü³ó%‹vçKæÎΗ¬u=ê fLa¹D•‘Ñ MbPO¸¯B •…ÅÃ%—ÞS/=‹EJ+_VEàl¸JC.“X@µÒjí•‚X§rL…šK8w[Ù·Ô€[AxÉ&Iò_õÚE\Îf†‰õ®À¦¶u.—£Þ~ޱª¨ÖÛ7]ïW”:*À½òŸú¤âí­¾@ÖýV€÷V·~t¬½ÐÚýÂÎÒÔ©uöOH³·+X÷×€^õ£¡…Ü L¢ê½ù\é$@° ‡q¢Öm«tå²LràYsâ û [k^üñؽi!^ùG=÷ÒE}§Bý¿×§Vx°åàzg»$ÄG·ssìÌý6+T‡iÔÑ4 Ov ×}cÙ³äs Îf„‰¼Xê L岸 z‰LR$ö Γ5@ö•¬½ÄoºŸ%áq{Fâ`“ôœ1B§}ŽðÆoÛT¦{¸Àt¸áùú˜î­ïԀɠÍXgs\&TT½o8qEøƒdVìôS¹Ìô®\ÒWÉ^"“¼jFÒJ+‘¸ÑU{ T¤Ì«¹ãûp%ŸúŸn`þVxN•ÇBÆSƒ 7—W¬}…}¦ð,Kža°ÏY¢Éq' Ô³S]bnì;Ò»rI \—È$º_Ï¥Áî pçÓã}e›îgYù®‘é}ÂîÀZuAaG76ÿ³ÍÆtÚaP9«™¤d豿4xýáÏ¥ÁÛÛ»Û”r°Çù’rIº¡|róšröö8¯éÜçå‡Ý=ÎK·ÉÉ=Î9 :gïq>ÛÔµªØ$TÎ7u¥MP»}v \—ì÷Ù-Ÿm·Ïn}Öçúì›îöÙ­í\Ÿ]—³0~鳓^²}¹’ßD… s\"TT½oPweWX—{¡$9H^dWüÙT7òû ~1×+±(Šù~–ìccѳø ü«·´û8ú ª³,aI/ÑZO1Ád Åq™P‘xB¥Ëu‰@°Ó»s ÷ÃÊKl’úGíí­µY¸fõ¸x¼s¾0ØF_ãÆ¸k…Ô©ËgÈYBƒ ºwuÖ±ª˜$,Ò¸%^L°hGq\"TX½·RqeY— q)½+—p/½D&¹ÈŒÓM-ññ^¬Œ’±n;#}ÎÀ tWÕŠâÎ$z©*ZÂ’^">^L0iGs\"TX½·RqõÖ%ÁB\:Eª\Âb/¡Ij´ÅLÊýÁÛÆ’g)V)gé> Ð ¡»ê,Åb0šIºçf¡W¯¬ ûl–ëlê‘q\"TT½o_¡ä/篭ÅýÈU‘²=Þ’¼LÒŒÕ{ 윥¦H¡Aî©÷ ¾|b0ôÂî·CtÉ±Šª¢%,é%Љb‚é´æ¸èè®Þo̧®KP4=­ìÌð4ÒOí%2É»œ¥Ð)4èuö ĺŸå>H†uqƒ&rÕ¡²eô.×[è>r^rÃFJ%=¥Cs\J¡J®¯àTSBö0Ðë ½ÛXò,y‰L²ŒåSz”°Î1ÄážzÁ"&±îÿŽÿˆ{Õ'ôM)Ò±î‡}\Ÿ,‘èêÓý%Ë/‘X1ÒŸK$–þ^"Q:ûì.‘èsÖ½d‰Äúܸáyw¯Çª*žÛëqé”®ÿ^dþ¿â"3‰¨oŽdw¼¥vJð ê•;f<Í©Rè+:DaPˆ%‘‹¢ÍqÙ³•³0L‰q1½+—(’ÓKl’Fä^2Åkò—z–ÅÇÝÔK'ø³;C}\î{R‡Š4 iï$Í¥*JÂ’^ÒÈùKg,z–8.% ¡AÕ%ÁB\LïÊ%äí%2I“H:=˲ •bK1š ¢úO­Í÷³Ü¤¦ŽBjzMíët@ÊQR-aÉXô¬Ä‹vT®'tõÎ:Ëu‰@°.–2½ké¶Xwy‰LÒÄÇK'KJÖ§Ü¡Võ=©IM…ìãr¯®«©£KÎ¥ÐkUQ–ôY¬"E—Åb0\—q)½+—HÏ’—Ø$›¬ß÷`vλ­ $÷‡ø~Vj¬~pkšZ;DÉÆr UEå,Ÿ"%t‘Â:Ë—5‹t]œ/–"½+—H)¶¬O“´†™Î$ûà ]¯ÔqOðó%]×q‡Êó%üE/ù{¾¤ç¸Ž«÷¿çK:ÄuœK>˜/Y¬À«E6£– ótÚTñR`—¶‘èþœ¦°’ÿ¼¡ÏbZ»c¯ÔTŸbÈ^õ­ÀyF]G~Ù~C}¡æFt¬ÝoÜß‹ÑýÛM6ìH$K|ãÞqšy$Ì}<£­ÂýØ{üp• º\É¿™äï`W†ÔòöU°+ v]f:ì ƒÝåÛ`Wì.ß»’QÚ§ÁnwLu–ç&‡ûüråçÜäðb’ÝÉáUý?79üùv&‡>Û©Éáõ‡½Éáµ2:79¼ü°;9\ràúðæãþÎ9lg8;c=ùzÖã ^ù‹3œK-³áüñ’?ùü6ïAÿâ gÒeÔã\¢À%/i&ù‰oèr8L÷Pg)fcÕ¬œÕÜ®ÏíÎec(}kÄJŠÇƒü芀7~ˆJÄXá0Lhк½ÛôÍüî@QS7÷ sÁÅl»ð`L-iï 0×§ïÎAz×C,ùñúÁÓ$2–ú¦z^ ¯…^*ÿù¬mÙ‡–“MÝ¡=è|Côîè­Òû¦7‘ïè/ˆKAÈÃ@\6–ÅDEK¯f„UìuTf¼V$WŒ?ÁéfÐÞý’γ>¸_rÉhÐðäý’KÊÁÎÎgï—\:|@äpö~É%c¡š³÷K–_½;_Ò!.àœ/)}Fyr¾¤d +ñäì|ɪíîÍ—¬.sn¾d‰o»ó%Ë'çKVŒ„RQÆ’ésÎY-—thPÐÝ&a¦ÚÌU›ê9VzªY¦¥è¬(Ukª U}ªÊU5­»éX«BVí¬ªZõ¶*qÕèÇÕ»Ì(Ÿk2#.CãDzyÉf’9 W¬p¸ (¾§ Œ«kÞ ž\C婿¾7Øk):ýç~±yìz‹”óx×fÓ笓¶§“¹}Œ¦1öâÌ*`Óeæ¥ÎÍôÓ€±§úÿ³]e—P‘Ï•.@R80ô Nlé]¹¤ã›—t&©q}ñ'±Im^6½ß£¬° GSxQV-.^ŠÎî¦ú¥ciÖó>æ{Õ¯ Ç@‰vʾïñÙ¦`ƒ¿Vô´ý?S5Õ%åúÞ7Ö/—¤³¡‡pâ‚3âJ岸 .zI3ÉêY·[ÀúZ…PUAIûÕ›A×RfUï±kM-Egß`µؼÛÐP=?Þƒ>½®Í ×ÛØ^±éöŠ÷zº×¨>´?¹¿¡ó~¥™Ít:mÉ?Œ@=Ån—Ëä6̺o¹¤äÀÕ¼¤3É«ú,´© G¥ë?½yÜýìõª5§)þÄKÑ5ŸõF‹¥´´­¹~ÓöD+f½µU“Óí:¶ë!6=+ÂàŽIÄ?¡' Ô»zg©¨º„W~kÈô®\¢À%/i&ùÑ(±°»àuuE½yª5Ã;êcÄÇ´]óYè¦óô{̰Ϲ¤©"6–<‹aÐ9«™¤dèaÙK´#+°V./?hƒ=KE6heŠ||KïÊ%%®æ%Ù$¯÷í‰eÚÎýH®5ï¯hªØÓ…·1è¦t?‹ÝtÚƒ~G[f3Vö,…Aå,Œ_ô‚úý éÇõÁ†ôåQínHψëôÒz™dáC¾YZ¿šäÕ"ÒwK뻜õéÒúÝÖµkb¯ƒu Þç:X{¥x·©xù“¿›ŠK\ûMÅË7¯(úϦâÕ>6—÷›ŠLòWSq¯*ZÂÂû¦à`&xK»=Ç%BEÕ»JEýÉöÿô¿Mé]¼¥>›¼dû>Ý7uaC-È&|ºét2KKÑiS þêövuÖ/B¯UE.¿ÝXÕù!9ÓÞ¡Òå…èÒQ©èV/A&âÚÒ»rIé—[ïi’;¸š×È[$3:m¾ cɳÒ3ä, ¡ABwÕY­(îMbí} –À¬¡(^ññOø×xåÇ—Uï,½7bÁâÊé¹Dë%ä%›I–ì< ¯þOºÿÇaP{ÐߨîϦ¥èú>ú¦|íé¾ÊýK®×ß|¼Úbl‡,éKÖ¤ÅqñÝioUÿ¾©ýÓï¨ßëíï|¡yIoz–|ÎÝtÚƒ.4Hß–×;hà cÈq‡Ê~*¸0ôªâÉT Ûs\'S¢ŸN¦™äì¼?W½Æ·½¹êõ³›«^ß·½¹êå霜«î0RY87WÝã7æ¬_æªwGÝ{l¹;ê¾üð÷¨{îã:}¤tùaóóÕ‘Òù‡VôõÂÉ#¥2Öâ:w¤T&éê¬ÿqwc]Ê[éâ|V#–oªv‘ ¢¤*zE¶>ªvnUõòƒëí‰â jôV½wu½=KöaÎÀTàRE“ˆÁ0·An0ñ!dÝÍ¡v;6’,÷q™XåævÑt¼ò“TE~äž9/¾jc²2Ç•Œ%ÏRT|ÛF¸”Þ™K¸è%a’Ž‘›øD2â ±ý&É’$™%ø«;C”u#³_`;„ pQãdhÉÝ«Ûñ½ ¾$Ú1yàr–Ñ Èq ‰ÁPà7(“ˆu7O=ËþqO0Ewg¼ÑÕï¾'7©±£Pퟔ–šÂÑ©Š’°¬—ˆœ‡gEìr–†Ð ¡»÷F¼Þ˜w&âbzw.Qà’—4“tz–ÅGj`ûmÚŠœeÈ­4FS“š: )³úÊÛ!(ÚJ;´ª(cɳDÎ+geÚ8Q(šu–JE1ÁD\&rź+pIÏ’I²R Yÿ¸sžMjPc; ·f„®+5V³ ž ;µ÷0V§*J²^B€a&xƒî=Ç%BEÕ»JEÖ%ÜaÖ]é]¹Ä+)Åaõ`|:̰;_²à£ÔÓó%]ïŠÚ!ÎΗt}5&çOΗt=?fÝOΗôýH \‡&©a1q3ãòÛ¸WW§ÓÆš#3=ï/¦P ?o‡—ʦ°²ÿ4è1 óDSû¡Ú$Z(`0jªlù¾_c‚bzÝãYûV3÷W5g­Œžášú91檅“[¾‹=Ý£j{‘Í›½j„Ž6ZñÛ¸ a3Éžu2ØåΫï‚]É™é«`W†ÄS|ìÊðŸt1û›`Wrþ±I´}úpLU»¬ÏNÿ|ívÖÞ³þž^í³79¼DË““ÃËÇÙ.,|09¼<ƒÝÉá幜îׇ7Ïžá,ÙX_á\ân¦~w†sÁoÔÎ7g8WŸ Y¿9ÃYr.Qà’—È$õY…›MStHΨ3žŒ%ÏRTÎjn׺žm³,}ßµÊÿy`Âr^fþ€絸…ŠÀ}VâY_Ã5- rs…ÎØÎûnö‡´ Gw±‡ùÂàöÜf€÷(½§1!.îo^Rh’åOÞ8=è?gù·1g`T|rž§£µ[¤RõŒÐçÈ®X¶¬½lbqjzï~(ù¯yÃ&µþÑöqôAKþ úrüÚ¿ .Õ2~ãá ò›DžÕ|®ËYöS¾.|‘âÓËWòk™èZ½Ê¼ÕÌm¦Í1Jç2t&¹™PgÔ›Ó–ìÎrt…ÝÅn&)9ú+/(c褳Œ%ÏRTÎr6ÓÈ ûˆKÑ Þ ëéœçBǘ"qúPbaÊQ2r77)µ)éùÞ;¥.Y·äZrÚuBÞ½_²ü°{¿${Ö'÷K. 6œØÕYÜ/¹]˜J†RÜ/¹²­nöhHõôý’ûìÜ/)ÿp¿dù“Ýù’’%Ï:;_R:èÎ:ëì|IÉe… ޳ó%e8š/YÕÉù’%¾íΗ\þa¾äGI á@Æ’åsÌY‘Í:4¨À%/‘IÄ`´Bºä[Å·Êrì­”¿°È_jxvN"üÛ ÜÓ}ÀÕ/î‹nÍc%çÏg± K;™ß×{hؼéúºëQ?LøÂcÞR½ýPódÈÆ2–=K>§©l&è!œÈý–¬À\.›Û ÅÀ^Rh’åO®wP™EH«+à¤Ö>Ô·7&ƒxˆ@ý|Æo\ãçù,v¬ÕŠçOô =ëúœ0ŸõŽë–õ=ºµ¼Æê<‹&IL0iGq\ '.žEP¯RÑå2¹ ¯°ÛÒ{ɹDK^b“¼ÔÁõ!ÆLÊ}&¯Ÿ:¢%·ª«ÅRõÏc^°}SßÏJóYùÞÉÄù¬ÍX½g]%ëC"ÀøMÂ’8Ì ¬•ËeH܆ˆ(*¢xU*Z)¦ÒEÄ¥ô¹$®ð’B“,ÿÎó‰s:ÁÞðD0¾yØ=¯Ýt6VšÏŠçÆœ%€a4ø‹ª(½þ›s‹}6Be‰!Ÿƒøï…ŽTg}Ю¿¾U¶ëÿ Õ¿Úõ—ŽÛõµwåäE¸Ò.s??ìLPôžõ÷Åb¬Ý Š®Î²I¤½KèÕ[µ…€’ãu"çÉKéǵ„+»2 Âh ²u3ý;PœK¸ì%4 ŸêÓ4DÅÚ[ìr–`´´kê=ØþÑÞ$»O§«Ú>x:}¦¥MÏ>î+´/WþáéôKsFÇOçïV_»Cƒg_X™¤äèòÕ¨aé"ß7£†eHÕûW£†¥Ë%ÿ2jÈœµ?ýÙ‡Û¿§?ËðŸƒéÏ.;›âݽ۷ú¹»}Ë»wû¦ñäݾ.í¶„¼V”çîöõ‹úÂñݾN)Î?4 Ó1ŸRºõý,‹'ÄÊÖÞ%ôjÊG˜\z‰Éy2Á¢ Aãrº«w,ê ÛXš_Pdà’—È$„T§B@%‚Š•`ÝOñDJ—jMU¡ªOU¹º¦Uµ«}\"ç·B­°„»¤âNeŸ B•ŠÍX½giþ‡9K)T«yI®³\»\v!Í{+¾;ÖÝ»Äð.¾»,®F,Žø1?æ„Ä‘G"ÔÈyR "GH›¡R:cyˆ—˜³l¢Aå.{‰LbºIÜ ˆ\’W¢µŽPÅ[JC–à/Tü¨˜ÓÄ©’mK ‹D¡)ÄF.ÒŽ½±äY ƒÊYš?U|âRzgQìÀÕ¼¤ãEäŠâµD"=k3Iɲ¤wRpwû¸¤/¸I š„¯üXÇ Âшö’õ‘ób‚íY ƒÊYDƒÂÁB\d0œK¸è%4‰$éYI|B–ü¥s^º³ijÕnRSG!•oi⩱š#?”s%ôZ¦g) šœ,Ú‘Ð]u–êS•ŠªK‚¸Äº["Aà’—$¥²~êÁØ/™8;_²v7íÍ—¬ÿÜ|IçY¿¨ŠÏ—tuÖ/×ßó%ë~Œ¸>˜/É=2Iý”ø82£ðÚé´å yÄ ó«–?1Òx½=±äý1E«ÃKÜ€ÚùOüP³Üˆ”cS-Ÿßj@jåõzo¾PƒÝSâ0ïoóä6÷ï4c­\ &·xÆi¾»0ÓõþˆçöŽ¥õ¯ýàªåí}áÆÎývôQkÈéo“ȳԊöU°+ v—oƒ]§×ì:öø«`×Õ2_»’½dLuµ×#ïN/ðääpg,{ÖÉÉáËáäðZ›^>õîäðŠÎM/wwrøÇ&‡ÿåæãÈ;j_áì<ë«3œ‹MYÿ|u†s©Œ´ì›3œK-Ã…¬žáT.Qwº¼D&©/.ÏÔ\玽×ùÊu¼ob#àYÂ|ÊY:p«Kl;ŸjÝÿÏûg=½°¸¥¾"8 ´Ü^™míß!§õm§œEÄe4¨\bP/±I·±>7²äCÈ”‡rÉìJã]Jbd|r[,ŽÈ81?Zõ,muzBÂ"ÃÔ¸§Kf¥_U:&ë˜ã’és-@–œÍ=„•ÞKpåÇ^"“<œ+¨c½¢ÕéúxÞ Ïác][FÍòB¼Uà ÍòÜÍ­ûYòŸ©¾¯˜Hdz‡ì5݆ Dg¡ªm4ªqøÖ2àT3FÃ!5-Œ-ýF;ŠãR€ä0¡q"A°W*—‘KLD™5¤IÜrPãæ·kLÅ ÔkBâŸ1ЇM{ÿ©³Ð¯Ì.7çÍg=ÐkfkzÖ­ïöxïÏXZ±öÔDÎúÑ€)d,y–}NÒÙ J¾pbõËsSÆrÙ܆Ò;YøJö›dzEÅR:•îÏö ꯣs~z°Ïã4ª¶Þ«GøÍ÷³<Ÿ5F ÅõùzàY?[É3UÐÈ¡«ó¬}r¾Ëf¢ÍqÔ«zW¹¬º„ 8ídzg.‰ÀÕy‰LRcUì¦{¿_Ð5ë;‹ÞϨv+ꤢYQ½ ®æu±íkë~–¦Hžð¬ëôj—tl,yV ƒ½I¤— Chð7¡—ª¢%,ê%"¢ÄšvÇ%ñD;r)Kª.âRzW.i«ó›dÀÖnß¾Ñ\.o ßƲg1 *gù~Ö[VtWõ¿ö훉뚾8GÔ¡è¯Îõœê7爺:k¿bùá¿Ó7ž¾ùj\¬ûlÿ2.¶ÿî”Ãw§wŒ¿ßrøîtNû;w¿mßû϶ëÎý7ÝuçÎçöݹCƒ\;vç’¾R)^ññz©*ZÂbšRó•ÑŽŒ½ŠÊÒâ~ÆxEåg æï÷§—Ø$ÌYÊfÊs΀Êʚ̧ʴ‡}\‰âÏù,³$ôÌ æI/ñ•1ÁÄ. Õï # = W qÉX¾Aü¦—Ü&N4‚¶L¨xTHõ¸µŽ}\OT¾¨°QÉc¡Wª" (—VZþD&ØUêTidAÇfX—ÈXò,…Á4¿€ˆD/±ITg¹Sm¦ªõœ+=×€(Ø-žHé¢,) YóY",ôªP5!½„µ³™`ÖÛªÄY£«zw]oÏbTÎRzWú ç¼D< rb=ćdÖ}¯õ’©0¶Ö©ËÄš(7’q¢é,ôJU4é'½„¬Tâ«Àd‰ã²±Ò0.1g `qÙ>È%bóì%2 ¹A³†æÁ4&’JW£’KG2SðWw†(ku¨p>ËÚ»©q‘æän­—ïlcɳ•³ÄE»?Qó§ŠoHï)—€'·—Ø$dÝÅÇ[Ï2‡ÁEcBü)ß°µÎ}\ƒ(åöOöêJè¥öa Kz •{à s–†‡÷U—q%º‰ ”½D&‘ž•ÄÇ£Îy ¹;ã»&$ŒºIÍ…jÿT¯.ç³$ÚJ;”ª(cY/¡F©œE€a4(è®:Kú©ð5A°—uZ²îÔví%2‰•⿇Jn¥9î þ`¾¤ëã:ìPùd¾¤SÑKþž/é8®ãêýƒù’qæ’OæKÄõŠoj3rϧÓ^µLŠ@<^ÛÞã îÁSÜñ¨*ŒàÅE^òV3IYý'ä³F®HFsócû¡zfØ´–ËT}ãÎÝõ1pyçjÈkrKûCXŸVðÀDüðà>UΊÔ"#¨‰Ûw/Ÿ1•YqÕoï¡I>v%÷z|ìJêCù.Ø•Œù¾ v…Áîòm°+ ¥}ìöÇTô¬S“ÃË/Ø^3à¹ÉáγԻrvrxýÕ{“Ã¥ O/_nwrxyn''‡—_°;9\ràúôæãîÎÕëyçû›3œ¥ ƒßœá\ð¯u†såÉñx¿:ùD$^F=Î% \ÞX½™dùm59F|»¾± ¾‚€ðŸú€`b…P3VçY ƒÊY:pËmî]¹N±G¦:à5âu}¯akýP¬êrºv^‰S%G쵑¼»Nq{zxNõAxÕ˜úb÷Ù^zW.))pùX­L2Õú#°ÿõ‰¬×nÚÒXò,-PPÎÀ¨±»aË8½æS aïJͦoü5\‚·©‹NñLÛʸ%Qøï[㈛êèЈ¤wç–œ°dÄê˜cÄ¥ô®]ð \ö’f’õ ƒ? ±ôÿ8 *gµOÐ}¶jƒx¼÷ ³‚‹æQvmhRï ïbÏrG|ÓF–®&Ñ9þ ›¿@¿Z±>Ž>hû %¹c¬·×ïõöÆ÷¾°yIgzVò9æ,û){‚åÛ|ÅôòÅkYò ëÝgê]áëoÇÐN?í¿v뺦œ¶¹sÉŽ®ЂCgÅøýû¼Àô®\BcÙKšIºœ%€á<§ È@ÜBtIÁ[a=~— ¼U½+nüPÊÑzWõz0µÔVRÒs:$Gì…QJ®Í$#yLH¸JˆKÆ¢g9 *gÉ$Fƒéêqd@AÞ ,"` (U2Èür—!›ï/¨¿—ÐP·Û ' 47Z8ý¥zO7ƒöî—tžõÁý’ÞKx›õìý’K*¢¬(¹àøà~Éb¬Ýû%k–9w¿ä’‹®VŽ•\¨}p¿äÒq\[õžëz{ÖÙù’Žs`uz¾¤c-žœœ/éXPQgçKzUQÖÉù’Žã’±hF‡Aå¬;OA§wç.{I3IÇ Š¢jäÕšAk‘ð *¬t$è³ Ö–ßFÊMd9Ux¦öéwÉt ˆÂF!–L.ÓŽ2£}n %g3AâDƒzW`[.))p™ˆ’Iê+ŠÍ"îÊ?GðHÕ Õ7ˆŽŠ Bä¼]q¯Ú¢¬EÐj4’ÿ\ïS{Ó­†Èxãß1i;=€‘*ä»7 3ÕÏÑò&xó¹Žã"¡bè!œ¨º¤àŒ¸œÞED)pÉKšIÖ^–Ó H&T×y*&‰ ØiÂûæfy®ìÕÖnu…9ÿh>«B¤€5–dz~GGGµÏ•?ÀXò,“ó Ìf‚‰û¸\±\·!ÄEÖÐz–Wó’Î$÷‡ çw¬ý¶×myB¯¯Õ::Ö´²W+Ö5_Oü–ïgqФ>ÆxˆS´ß„±:ÏúE/9¯í¬¯˜¯¨7¡¢rY¥"ë’Á=â’øHñDK^ÒL²äúç{ïWš¼q@EöѰ/7i¾÷S¸þ™€ˆu’IóY2=«…ÁÞ$Ìf z”ŒêM;Šã"·Ñª÷%/°T4ÅK>Þˆ‹JWË%%®ð’l’y!ë5ʱqˆÊñÍÃŽXÙ«ûÛjŽMüúßãñºŸEÏbTÎúEUô˜õ’ób‚·Ñs\$TT½«TôÚÕ wˆ+§÷È% \ö’Í$Ëo»Ž $‰ò.¾ÈKÞ$þm„ ÞŒÕ{–îg1g ` ½n¨Õvýg<7û¶^$ÓŽä¸ÄÇ·ê}‰H,-KRCæ×_±ª¤À忦_ |ía{]ÞÍ ¶sñ×2H{T=çÀÇëjêP{oX§*žmH_ß7\ûª!ýBÜ!®³ é2É-ÿžØ¿î²þ¶s×]V=kïºËúùë.kv޻ñÜu—’—Os^wÙ?¸ÓyÖþÁKûwº:ë¸CåƒC_½ªøÍ¡¯ŽãúåÐ×ß·×:Ä¥GuööZÉÆ²OÞ^+Ý‹ÄWìøöšbH‹.%dzƒ˜Š|%Çijƒ˜ %‡ÿ“gc?I”Ýû¶Ÿ({T³›(—ÿw¢Ì×'Ø¥ûw¬bŸÄ.Ý3`Î:]ú€ð±Kb Iñšßñò¾+ E[蕪HLÞÐzÉä¼¾€¦ h§ÂÖ¥ú 5Ô¶±èY- v9‹#™„Ð]uVƒûƒaº‰ÅÃa·cT‡¹K¥kMiȪO[åÚ«Š¬v­—ˆœWí¼•pÇå‘›÷ŠÈγ¼,–9Ë÷e4¿ /A¥¢Øå² i–Ø"rɺ'>žâ‰yÊ’Ò‹³äò;šÏ’Ð+U1_ùÁ>.¦@HŽˆ6i„ŠŒÕy–û«˜³0„[.éê,Å6‰è&qƒ¢êX÷ãž`)]é:9æO%ø‹?ÊvÏg5¶µS3C ½D"™àF;vWbK/s–†Ð Ó{²—½DÜ ˆ\Q¼"÷Û´—ß¶±û%kÈVØáVê MyXÞ^vªýÓ½ºT¥}4 ¾drÞÆ’g1 2g¥þ^¢AAw`ÍŸfj³Ø \"reI$Ò³Ž;祎Iðwwµ¶¦Âu}\Rî¨é¥^]Ÿd[G‡…*IXÖKèY ƒÊYFƒªÞUg©.!ƒ‘ðÒ»r‰—¼Dz–ÄLJöçKJÖª©bŸž/Y‘ÃQ;ÄÙù’.g `œ/é –ЧçK:=KëÐ$õû¼£Èof\~3òtÚ«~…WÀÉ+ûð+t‰z»:]t2_G¾;WLvëþ×mÊ$ó–ߖ±ýµêN\|^§ðÆÇí7ëî(îÂXkì%ÓÈ3NõQsÍÖ$hÿAÃ×Kv¾ÝÂ5kvFkЉšÞ茫ÑîÖ™äwÏ:ìJj9ø.Ø•!µC|ìJÖX¾ vepÅÿ]°+9ÿÈ$ò’ã1UmŸ>;9¼üêÝÉá•%879|É0¢M/hðääðò@v'‡ÎáääðbŸÝÉáÕ³ÎMçÀõéÍdzg8×H޳_á\|3ù_á\0’&ï¿9ùö˜ п9ÃYr.Qà’—È$õ£µ$þš£jÌg1lT÷›ê¯ÁÎŒ5>Œ¥+?êãbÎÒ[/²ué[FÌQVŠL+H›+tÆö Þ²ÑöËû¦=¤Æ«­P¬>‡ø“¡¾cQþ×§Ój™‡ßâñ¤wg®æ%…&YÁ5~u}n`[Ï`©ï#Óîf¬Î³•³0^óeíöx·ÓÑ‹´GF¤@ÙÃÍ/÷¸¡\¿õÄû?×P—´½¨ñ7øƒ;·CÜjþ (U ÉÞ¯Ç߈KµŒ<1pÉKd’Š:¯ X§gÌËÈXò,]#VÎÀ¬á»'1´× MëœÏ±cÍ›“tF½l”WH™W1µä…¬µ jâ=@6¾ò}Å×Î$…_»{ zT~ˆz¼Ûƒ/4I6V2£ LÓsç¼Ð  »¾¾©žA{:ýs#íÍc´‚í3îïuÞ_Xã»ÓÞªî}“I6Pjxe[¹D‹^b“( *g `8¨2Ü*3D¤èbÈ]’qG)ŪkÛóãøÖ"_ݲƒ86ÇÞˆÊ]¼>,#!¦ê.‰+½ËXô¬ð’.g `z”®lY³Ë§-Óæì쬼-•Ç[”%Þ9xü†62 „rÉØ…¨Fx'LRrõn@Ë“Á6–<‹aÐK^"“º«Îrç¼ âQ#Ua؆n3îM]nÄÊBÑžÏbHº¿ þ^àx!|aÿVtõÂ1¡’níÝ/é<ëƒû%]àâmÖÓ÷K–¿¶{¿$×€ŸÜ/Y~Áîý’®>ýà~É%×Á­Bîjçî—\2m"öx¾Da°ËYûó%%ç®Óó%"Zøì|IæjLYŸ/éx$ÑégçK iÇÎX2£®Ç+gµlÖ¡AAw¥wV`f0´D”ˆ\ñ‰bÍA6v2ó–êðæ± âGsš9USãâaÅЊ»m¬nÇ÷Ê$ú™Ñ>·È’³™ ‡p"A°+°–ÞKæ6¸è%¦xoh¨çTCÙëqGcÎõqG¼š8x¦áZ³c Õá…®½Ç3@#·§ûYôŸjÅ`¥ž÷{dŒúØÂ¦3övM"r^¥$9.AáD•Š­.)C*—‰¸”ÞÍ*p5/)4Éù®˜¬»_Q/LÈf54`#²újxyæZ³QÈõ•G' ªC^‰¤ÒåÍgM`¥ž¯8åkcɳ¬—Hãg63íHœØ@ýòö²S©hnCD”ïãÊùx.‹Ã4ÉëöÀ¢Ç-Ø<ÛGÃZ¼ÜtPßç¸Ñ>Áó•‘ïŸj¾Þø'™4Ÿµ«ó¬_$,õȤO­Ü ^—Êeq*[]R:ŠW›<%žPéRàj^Rh’õñ>°s„ñÍÝgº|6ÅTæÜóе߷ñ°åëlîKõÏ0ÅD¼%ϺÅä_TE÷˜yá4Éy1Á¦Ám4Beí]a×KEññO¤tm齤g-Çðúkƨ(òV™Äª¯àûÛœ2@cÙ³t?K˜}ª§{4××e¯Gsñú“=šË3ØíÑì{0þîÑìûj~ëÑü»mv–SlQþªm¶ËY‡m³§,µ3¹¯,1DJ×7JÊ%ÿrð nPü°y;7(.kYqêE—³tžìø…Ú!<# ù,©Š$¢Äšœß˜à…i”xBŽK„Š4dü<`Ó‚/q)½·\Ò.n¤ôYŠƒë¼Ý°í>àl¥¯­Ó³ÌÃ2g5€qÉhPÐ]u–*0 éH泤*nïjòñO¨t‰vä¯NW~ðqôAU— qµô^r.Qà’—È$õuú?é<Ë¿M<,†?Ûö©»:ë¸iÈcB>ð„ûY¦xåOèLr³æ€%»¦–„Š]ï[{K÷ŽòíÕ{í”ô…æ%%Kž%ŸSβŸ Ê·íõŒ‡}\žñÜ¿j¨ôÑ%–ý«†%§)%°³W KŽ×û‡&ý»¼à”šÌ&984™ÑàÁ¡IeÍœOÃ$%âÿ}¦ÎO.Xl*}û›E%Œ¯”ŒG7¸W\«‚.’P,j·*(ÿPtÒþŸî·-Ôô}ºoz¶P[cbè ÿR¨¹,王',ò-KŠeÀûYžÏ²ªH K¤…Éù­ª.¹ÞöÈkôV½÷Æ¢g) *g)½ :py~ÏZ †¸ qƒâCĺ›—x"¥K$5äF¬­Ø”É8÷=‰À³ª¨+?¤MΓ¯í(Ž«+{–àr–†WKï]¥ù9†L"n°±†ë~ئm˜TrÌ¥üAL»•Fd6inßÏòÖG’æ’°L´‹ïݘàÒKž¥þ^-Þ#Àt'âJéós¶¹A¹dÝÍÇvÎ{&…RŒug¨•Æ}O›´"ÈDjÿt¯.E'ÉQM)Y/±±äY ƒÊYÜHi4(论„ 8Ýäü©â›½D&±žÕL2Óýù’åWŸœ/Y*ñÝù’Ëp~¾daÝwçKd¬Î³öÉù’Æ1ÇõÁ|Iþs0_rù5½ï®2Í—,/_EòíËÑŒŽ‰ítÚ{‡XyM¤ZÿNtÔâûÅãV˜/“Ïð >/i K&y?†0Vý¢­{sÆ$ÖëöîÆòïprKgœæ£‚-×?ëÿÿÍaîú9_ßù'œßnø`!7ôJ]q®nM"ÏrÆWÁ®0Ø]¾ v½^ÿM°ËìñwÁ.×2ß»9ì©®ïAì=˜^ª¶““ë}ö&‡Wm÷ÜäðúÃÞäpéÀÂߓë£ïM/µÌÉÉáåìN—á·Éá¸ùg8Wÿùâ çß¶3œ?qçßÏpv=f_á\Þ^. úê çúÜâ~ð‡g8KZà*ÙKl’[,ùxU7Á°ðÜÕØþQÞ­¸?_‘Œ^Çþ3DAcyOp ƒ]ÎÒÛ¼í¢bU›+Ò[lÐÒ0Wp=ê…/¼°µÛ;GXÓÎ_9käY µÌf’’Ó»r‰VÈKd’™~n½5xðú ›înw]„Á 3%ÏRTÎjc}ãou:š÷³ Í/ºÙ}Ã8R ¬¤p­šx{© ˆš³âûÔ8ü Ä&øq¹IM«[à*ÉKd’…`OPñA0Á×=cuž¥0¨œ%€!4XÑuè2õùb·p:Êέ©œÏÒõú~«x#üçyC³•”­ÔR³-ZULÞêˆWyvá=“ q)½+—\µØš^"“Ì·2ÐëÎ?áÿ£ßæGŸ€ŸMŸú~ÇØí³:P¨}OlûËæÍcR媊ÕÓ»?è¯%%…kÕ¤pðãèƒê+´/Wò›¨wÔo¯Þk½ñôy M"ϲÏÙé§ò`û6_1¾|~-Û [†D|ú%÷TùÞe6g*t³Î“’ÂþºssôÂÐErÅxGåf åez‰M¢œål¦<ç ÈÜÈ=a§_„õ.à+xI(Ó‡ïgy> ÉHiJ Ìû¯¥¤h‰8¥R¨MB$”0’Гq—Œ%Ï"~³—Ø$DƒÂ‰B–B?„ELnÑæØ¿Ö·wb¿2·¦¦ù¬ˆUoôÐz%¹@£á¤µ‚†IJ®$\c¨ú@]bcɳ™KT¥š &Qå Ì#?¬ÚT<°¬ˆ‚£$Å&¯ŒGù¢ÂF%ïgy>këPUü m©tLðnÛÒò¨þn[*©.9h[º¤ô~жT²—ì·-]†<Ù½ÛI¶¾!ç:É–²ÛIV²±>è$ë²Ùÿ3w€§£]߬e_bŠ}·–½dèá¶YÏgA²^²q ª¬µPä¸D¨¨zo¥bIuIj˜ârzW.q}J/‘I¦ëýû૦Ǧï+¼¾~5Œ=Õ Òó`ƒV¦ÓcG‡Æ~;Ä%útƒ"Íg–^BÖÐL°hGr\"T,KRCV]¢î ".¥w§6͹êèMRÛõiõyÌ—‹–õ’›î,žpHמH¨øÊÏV*®ê?oìÜ´@ˆKé]¹D—Óå%2Iµ(:kMcѳ½A‹IhPÐ]u–¾©Êe=?7=Q©Š²‚ÄZN6•µÅqùÊF~øVéËùkqéQù!^ÁlëÁË$ÍXgÉÀÊY~)ôºl/RWgöq¥1!F—wºˆäûYZ1( KzÉ ;¯-= äKæ‡! ‡’Æ —‚ÂS \%‹&‰0ØH…N Ánˆ'R¼G­uêãJ¬!)^óñOt?Kª¢$,é%ÚJ&Ø…—R(“k¤Ý.!{Ù%—Ò»EÏ¢—Ø$ `thдXgÈâÜ¡}|pÂu±éß'\;½Âu}¢žpíþþ ×K§ûWuK‚ºŸ\Õí sÖ髺k°Û»ªû“÷¯êž^±‘+ÊïVltÕî?­Ø ǵ¿õäÂRñ’µ¿õ¤ËYÌ%§·žt † éí'bJÚ/ÈìÊi DÑ?3?§) )ÿG±Ræã%žˆ´,)F}\fAÕ¡BæÔMjb[¥*Z¢^bV—ä¢hG÷÷Ò³³0„‰¸œÞ™KÌ`ÈKh… r3ëþKç¼”.õ7Þ?+j­s+ô)M“Èj……^)Ò>DÁ7r¾tÆ¢gù2r–†Ð  ;A°—Ò»s‰¸AÙG&iIg’ýa†¬ŽýÒüÁ|I§Üv¨|2_Ò©ŠÇzÉó%<®Þ?˜/é¸ÁÃ\òÉ|ÉüÙæ©ñ^éZž×ÞétZE׸ù8Þ¨b ÍÌR+C^ð¬wý:ÁÃN¡1´º?§),š¤"—÷¯–{´:+))œÜÒ'izÓëŽOƒÖÍ ÏáZ‘.;¼PÿÐ$ºÈùSÇ·B·MòI°+ v—oƒ]RûôWÁ® I‰ü*Ø•!ñb_»’QÚgÁî`Luyn''‡—v'‡Ëp~rø2M—l¬&‡—ß¶;9¼ ü““Ã?δ39¼Ä““˱v'‡K\Þ|Ü?ùrø/†è/Îp.ˆk;ÃÙëìÎå·iòþ›3œk>Å-ú¯Îp.o//£æ’4&ÄU­Í$Ë2ų®)gëƒCü€`y«)ìóŠ­¶ÕÏGtL±ÃË7SåY ƒÊYíÀí¥/V9Ÿ¥3¶O.ýá>U_â‰÷Z‰ƒm­àĶÝ´Õn:5=¼_wÓ»rIéÕÊ$c Šìnï ¬ççàÉŸz÷¹häœ8%ÏÒ•7 ` Ï×{·ÊI›_4ŸU.°ÿí©ùFqÓݼ$ª½ñõ… ž¼¢´ØâÂÄÜ_• ¨û=n•". ¥%È/ –ïGo’µfh‰¥¾o4dpòñþ~A¹£±äY ƒÊYª¦„çüÔ«4JoNâŠNÍgÝ! Õ¸a]ó ^nw_‘XÞ`‹t-ÚÛH¨/TÃ::ÁB\Z ÒrIÉ«yIg’áúŽ':Ô÷%^$L‘س•³0„t_žUk”Ú<ÆûÛ^Ñéù¬ šÄëaa‹[¤ío7,\ÛN{¯êØó@Ÿ«¦OqX—´¯Ý!.=*=D=^yI3IIÆJf„“é 0„õ"éûè›êèéè¹é‰zE§¬ ûÐr²©¬í÷€oˆÞ½Uzß6Pj^àìZx*9pÑX2‰Ã sV„ÎŒS¸e V<`¤p QtQÜQDR¬J÷³8ŸÅȧ˜hq‹q4曆ث¨|X½;íjqÿ„½ÇNâJïÊ%ò,…Aå, £A‚ÃÅʧʴîåvIåmetåz¡ßÏÒ|1цpˆа QÍ¡r!l-= Ô%¶±äY- æœe€!“º«Îò•£DªI£äâ^#bae¡hákßÏÒ|кq¼Å­$TEUpÌqå²!KEËž¥0¨œÅ\’¼Du–‹b•Ë*¤UÏ©ÒS—µO. nTEéZSU¨êSV®ù~ç³XûþkgWÕ‡´c¢Möî—dÏúä~ÉeøÏÁý’\g}r¿ä’¹Añ!gï—\##®æôý’Kf‹<Ÿuò~É%“óvì8.yÖÙù’Œ¸Rur¾¤d"WïÙù’’»3ÔJsv¾¤$¶Õ<ìÙù’’ÉyKf”Ï1gE6ëР ;A°‹b2‘K:nPD®L">^L=9|o—$ï/E@ZTë R¨I$.š:†iTE~ÑKLÎÓçZ€ì8.AáDzÕ% ÷ˆ‹D”r —ŸA3I§¤Ø™ùø«¦Ø>N®ëýôåøµÍ0µGÕe=^=ø} K>W:ržmg•ü5×ï)ù—Pò;¥˜#YÇJþAsÅj…?›+ûüÝ\±à·¿›+–gýwsE§*ž]‹{!¨ï8®³kq/Áq^‹+“,ØòËMÅ ¾Ÿ¥ù¬ '–Žœ×0ËeqPYïV½—\*¶ºäÒ‰'TºÔƒÑrI§¤¨I&©_«c*VFé{k¥/í4Ÿ—ׄ;ع8WQŸ¾£U½>*x–Œ•¡A9ÒÞztª¢%,é%"çÍ_cß 8.*æã%žPéò•!.¦w%0M³ÊKšIã}Ãn†÷ ‡ÜÇëãõ}Å•â¹YÓ7otÊXò,…A«"›IJ‚yL Þ÷³4Ÿµq?=? çÙoÚQ|üF¨,ÆÚª÷•ÙF©èíÓüÙ!´ÑrII+¼¤3I}}±Uã…îú¼¶¬æÁš‘9tÆê®DñŠ—xB`Ö [§*ZÂ’^"r^L0¯üxäG%)‘1QMÃUâ’±äY \ö’f’ º Aº(ƒñæÎy5 j+(^óñw®bÛÊ—2$YR%Š!ßÏÒ|Ö|‰œg9æBõ‚*‰VctÕG«Kd¬Î³™³ 0„eÖY®ÀÄ`¨j;ì vY¾¯:÷q}r¯zùÚ»÷ª;Uñƒ{Õ—Lt´z»WRNžWìrÖÙâ2IÇ`|vBü`ŸÐòÙv÷ ]ºÖº¿÷ -õéî>¡K"ð>Ù'T29¿¿âé’9®ýO™1;XñtɈkÅSfóV<]7x°âéÿD¾wŸ‚ï~ÛW|×±ößYá³a†ƒù’“5 ž/Y8ÕÃvˆ³ó%YIIÃ@'çK:•GuÖÙù’¬@™u?6ɾ¸UräûJÜ*ùË}%n•üàÅ­ôÆ2éz‘ºWl_o,‡z£^òüúè¿{ÖÙ`—µ¶ï‚]§~ìJþ¾ v%Ÿ¯‚]ɯå¾¼“¦öÄ­’“ÞWâVI ù;q«ó¬&‡/”4¸R†#½ñ2œ×KYŸLwëÛgÅ­’ÁéWâVé€ó7g8Kõ_á,©àøî gWŸ~%n•®PûFÜ*©ˆü'qË›+võÆÅ$'õÆ5×ïék¤8§7.6ÝÕ/ÿ n•¬7~%n­••¯Ä­.’{-áI½qa~võÆõ%?§7.˜|Wo¼üª7î‹[¥'ð¾·–7„´ýWâVÎY¿ˆ[èK–ÙÕÒî)½q©ëwõÆÕ1Îé¾ð•¸U²Þø•¸UrüqK»&öõÆå‡“zãÂÕìêëçôÆ%Ëìê?픸Ur.ùJÜê<ë+q««³¼–ð¤Þ¸XaWoìø[o,ùÕÇ9Ö÷Å­’ßѯĭÒëq«t¾}$n}¢7–ü’ûõ?©7–ì€rͳzc×ò•¸Ur.ùJÜêÐà?‰[ÜÕ¿¯7vIâ½±ädäù¬“zcŽôÆKW’þ-n-¿zÉWâVÉã+q«ê—ÐW}aOo\MrNo,4 NëûâVéjŒoÄ­œ³¾·:ãXÜú@o\¹è=½ñç;¥7–áHo¼ä¢ë½±äzû+q«ä0ø•¸U†Tÿƒ¸åí^ûzãåôÆå›îê—á¼ÞX2ѱ?æpÉ⾸ÕyÖWâV®³¾·:Öýƒû%—C½qÉY'ï—\†#½±dÒïƒû%—ÿùÞ³|9Ôóý„‚/9‰EÁ—Ï–§u>·/nuhð+q«ãÿEÜâå¦Óûì.‡zã‚Nî³[>è®Þ8ÛôxŸÝþ¦ÈÎç´õì¦Èåì.O+·ñ÷¦È¸ßÎî³[þÝ}veøryçòÙ8ÿ/Ë;÷—§• ÷—§]2NÜ_ž¶ö®ü¹<í’YÃýåi]ïÊþò´Î$ûûìVäpnŸÝòv÷Ù­1äÜ>»ÎXò¬–§]2ôØ_žVRv°»’rÉ'ûìÖ_°·ÏnñÓ“ûìº0¨œu¼ÏN8ñƒåi‹þ^ž¶~‚?—§­þŸËÓÖÿçÏåi… ø’×þ>».pqëãé}vgiÑÙ}v—ü}ôM?XžÖ=Ñýåi¥³Ïîò´ÎÚûËÓJ~wö—§u_{Ÿ]ɹäƒ}vÙXö¬³û캉uÖ'ËӺ貿<­äXµ¿<­‹|ûËÓJŽ£ûËÓº¨¼¿Ï®0 ô¡fwŸ]¸¸õñô>»>¨jÑÑ>»”Oÿ^žVrÞÞ_žvÉ(`yÚª;ÿ¹<í’Êþò´2üçô>».‰·ô^²±>ØgwÉÃhðä>»õÁï-O+Ãî/O[>õßËÓ–ˆô÷ò´KBëËÓJý÷–§]:غ»Ï®wÆÚßg——·>žÝg·üÉî>»UúsyÚ¥ããw—§­ŒÙŸËÓ–gð÷ò´’ëàýåi—®ªÞÝgWrõþÁ>». *gÝg·<Ý}v?±÷`ŸXÖ§•¬tí/O[¾ÏßËÓJâ„–§]2ô¿<­t|Õßûì²gyÏöÙ}v9pyëãÙ}v—Ì'Š‹þ`yÚ¥Ów—§-~ú÷ò´Kb[–§•ÌÝî/O»dÚqŸ]Iað“}v—„¸RurŸÝ%¹dÝ?Yž¶|пçKJÒ ~éãú`¾¤dãXUü`¾¤ó¬öÙ]2ÔÞã³ûìŽWǺË$ºÏd>žó ¼‰æ£C>y?:­ªãFºËƒH>®+:¯¤ÃKÚÇ%ÿѧvàiùm<ýÄ£Pq.jí•Â!)˜jǧûà,•VµSVkõBÛ9õàÆÿbyÖÙM‘ÇÁ®0Ø]¾ v^ÿU°ëØã¯‚]WË|ìÊp¤äwñí%¿ÃäL/_{WÉïÚ&‡;cɳÎN/Ï`·¹bÉõ''‡—?Ùm®(Ù™öWg…Û>ùÕÎ¥2âA˯Îpö0ßœá,é|w†³¤§óéNåõ#ù€*A;ºº¼8ÇêsƼ=íCá:ûª»Ø<«#²q^¶dcɳ„ù”³tàÖ÷³Ø¥s¹íîoDZtßmgyW{yÊ7Žü.Oçu8LRRz·à/RÖ–IÚ9ã¥vÖ¡cœ@öUwMÖAeÝÅæfKž¥0è‘^iôhžŽö0Ä­qïDõODÂÍnžµ~ ×û6dÇùì5/ÄaícÄ•Ît‹ßÁ…\{‰Ïo‡ÂWûàä6‹ÇÙñ•ãÂAr*×]laV¨ñ•ü ¶ë«cðô:޲§ûYšÏâ‰÷vü}±ÏÂë`|;%¿b$™çùù8LŸMâ;žD\Ö(uÎX·§u(\WÝk}àõ‹ÎùÛc„dú£±@Æ’gé.¶¢¿…*¢AÝ2F°†ïëV¨!? [MÏ#[ä` !‚œ]±7¯FÈ aêkŽꊶ‹÷+>u•Ø<¶™d±)ë q)½+—𪻽D&©S?¾"’ÛXô,…Aå,%d¡Aü°Îz=ž‘5ëƒÇšßª KŽœå¢÷Ø÷³4lò¼ÉªO ÿÏm>#ZÕŸ×{lg}ÔOoïn©Ø}9m".=*?Ä+r£¼LÒŒÕy– ¬œå—B¯ ¯üèÓ7Õ3hO§nÛ-ݳ–< ô:°i³vÉïÞ½;2‰B€æ6P´£AHá©®’E“Dì¤B'Ð` · ÄdÅ`(†´èRrÜQDR¬jQ¬‹o¾Ÿ•æ³â¹)޶ÛÅÞf’’R¨Û?Ý„¬T-Ä¥ôncѳè%6I(Qe #ˆƒ»ØÊÁÊÎÎÛ-£/Æb®o(`Õ³€„< äù¬½RB)v9ä¸<&¤þª Жu‚¸äY ƒÌYöô º/O Þp_—^U"©Ãº]þpo âÕ³€•…¢…¯ò^_òvø~糈ðýiGïsHe„­T¼dcɳ„¸”³˜KŒé%6I+Š;Ã…4¹A߬£:,©nTEéZ³U¡‹}XŸ¶Êµ¤šÖÕ®‡$n±vn&)ßR Ù³¾£@¸Jö’c äÿhVêì>¡Î³>¸_rÉhˆëôý’lï<{¿dq™ÝO+»rî~É%qªÞÓxö~É%SðžÏÚ/QÌ9ë`¾¤ÓO ‚OÏ—dm7ÍÓžœ/Yütw¾ä’´‚OæKÖjwo¾ä’uŒæKf+HÂ’±<ŸEŸSÎÇ%4(è.P¯ºD —¹AåÆ7K$2ISºþ¹^ÎDÝ,µKÖÚš ·Ô Ðç¬ÜIÓkjßò¨ †B¸¨ØÔUEKXºYGõ_ÙLЃ8Ñ ^X+KªKEÖP¯r wÓYé’,Yæ†9aQÃsïZ¶E¯Tƒ¿b_ÀcŠÊ¨þ/÷p¦¹jöy` xîñ `6a°þî€áÇB¯TEKXÒ|q"iGs\*—U½‹ˆkH,Äeä \¢N%yÓ$¯'¶ðÕ<{rùñŽt~Âr?×a^ŪQ>o)ÞçHý+Ô !„Æ’gÉç<&äùzá7í³Ó|ÖÈîM”Ëâ6D¨˜5ÜJÅ2d>žâ‰”.É’ùÙWI^"“T~Üñ«­“¹úÏcø¸ê~­¯A$£9H‡é¯Ï¨O+ŒPó f!ŒÕyÖ~;D—Íò¼P-aI/IóY$™A;Šã¡¢êÝâ •.cr]ùQzg.i«ó›ä7ª^ÕMÐK]0s8‹0﵉Hþx†جHcɳ" f“8›5èQ2N¨·ª( Kz‰ç³È‹vOBEÕ{+K®K,ø³;Cé]¹¤®’½D&™[¢@@¼GâHÕÕïßž#¥Œ%ÏRTÎj&)z¨CE»&² öGUQ–‡8Ÿe>´£8.*ªÞUíº;ƒ}ƒD\JïÊ%¸²—È$ó/ˆ~¤¡â4[í«ó,…Aå,ŒÃ>.ƒzU`­\^¬@nCD”XCKXÖK0d&X´#µþQUïÚ¬¯ /'Ä¥ô®\rU—5½D&©ÉΤ?áÿ£ßæGŸ€Ÿí°µN}\~-õÂêUöKN¡×ª¢\Fz‰æ³Ä‹vÇew–£+èMÔ;ê·WïµÞxú‚¼„&‘gÙçìôSy°}›^ïnG•Ëä6ðŶ$QrúHâ RŽ’‘õÍg‰ &íètÈ&5u*’+Æ;ú+/0c(—(ËÐKlå,g3å9g@æÆÝÔK~¸}\¦x²,žHé¢Ð+UQ0Ïz ç³üÞš%AP#!c$¡'ã* .KžEüf/±Iˆ…… …-i÷·âa±‚XC bâã-ž@éj…ÍŠj¸&ŽÅË$KXÖK8Ÿe&˜…šJ8w®1T} .±±äY ƒÌ%ªŒRÍ“¨Îr¦ÚLU›·Ä³øVY.>ž­uêãJ²$‰Q"(ôZU5a½„t†™`ÒŽªÄU£«zg]oÏRTÎbzw.1ç/±IÄ`ˆÛ8îœÅ+Ë5ÂkùlTº$KJC–à¯îŒFÆ­|o¼;zEí‰ôs<ç³D!ŠÉÇ%cѳĘ9g `q9½›³›g/¡IÄ ~2ÌP²xrÜüÁ|I×ÇuØ¡òÉ|I§*ë%Ì—dŽë—êýƒù’qæ’æK­íñŽà Š×ûžtCý×ËÅìXMø“kÀðú "¾Õ·7–Œ×÷Ùù6´¹ÝúRƒ^A#É4 ¤“œÂj&Y<ëñÀ°cÍ”‘¦ÞwÊkJ³Wv¬Øyõª ¿}ÓúŠX¸"ñ¿jP"Æ4ëƒsâ5j`¤ñÈ$Ÿ»^)þ&ػ˷Á®dUä«`W2æû*Ø•„Ò> vcª«MÏM¯Ÿmorxͧç&‡×`·79\:°ð÷äpçYRRÎN_†£Éá#›^~ÛîäpÉëìZ\Ùgí1ûb-îO@‰-._­Åí<ëÏMÅÊ%´-•ŒöÛ–.Ÿµ--oÈßmK—Ìì·-õžµÛ¶´ØT §w;ÉV]æ\'Ùe8ê$+ÿÐIvaz׳.)pùIÍüÕî±1g®Ú sÔΡ¾A½Ñ2Çh káJÛiÞõ˜Ù³´–9K£ýIÉÿ7ÝIIá9}¶ö©Kþ>ú¦|ñtòs;F\)½+—0pÙK±;ý5a{TýkØo9Ô€@“h½€ÐBçà -¾©&cQáPô•Ÿwl°7¼Ö·|W•÷ŠNoº“’R3P|êj €y¾0Ÿ­ð§xɇmOÉöq 6â»;Þ¶\R:©™ïMRQ<– ïWÄÞ¢ÛqNQq!Q3VçYV8˜³|åG#?t_~ ü~`Eg£›~¸A\Ò¦;))W¼‰5cqRýS$sïW¼£ëz{GÁq\—4Ü!.¥wå.yI3ÉÊ9ºÄ¢”Ó’QÉiÊ÷³4ŸÅ¤—ÒáǕƄÐ1·K²?dÀ ".Kž¥ÀE/ “thPÐ]2aKŽqmx´CªL¥Vߦ±¿0[™m@6¹¤ÊǧN÷³¨¤NÓŽÚ­ rõñIUÐ…A嬳UÁòú³Óæÿ¯ 5ÅÑ’“ÞÙBíÂGUþ±PÛ_±ÑUâ_­ØèrÖW+6:CtÓÙ­'%•ò*òOo=)‰f0qvëIÇJ}p¯º3=ëô½êËðŸƒ{Õ™Íûä^õeH¬¡X÷¯NˆÿdÍPŠ¿:!~!éW2x¬—˜ïݽ_Ò{Öß÷K. ê6ëÙû%—èªûÙû%ë¯Þ»_RýüÉý’Õ™öî—”Lp¿ä’U‘¦—tJŠ=ëä|I§ò¨Î:;_Ò)P^Îur¾$ëÎn¥9;_ÒiâNÏ—tª¢Œ%3šœ¼e³Œ ÝêU©.i xG>P.Qà’žÕL’•b –!e.ÿDNÉŸ!Œ®ÝMWtÜPLm2ëOŒÇ‰wH³!Ú.Y†rî±Ð+3ºf %g3ùq¢A½*°V./o/KEQ‰5˜ÏË› \j‹‘I*À}ª½cûMEÇM˜³Fc·XÎ_.^±·šŸ·xãí ä0Ä<ÓTc7²ÌuŒ\r¬½7ŸëUEõ˜I/QþÑ|Ö#n³º\¡¢ê]¥"ë’TŸJ<áåZÉ’Òå%Í$+D6« vèÏû6¢ñð5À>Ỏ_7d·ÆÞÎØVoŒè?K´#‰(±†­z_ªññ,“¬téò3׿«»IÝÍK:“ÔP`ûU ähÜ}¾šFY?÷Œ\®zG·ã‚2x(ÿ7cužuÜ¡¢l¦}ø 'öª¢ëê%ºŸ¥ù¬7ØS¼$T,ž°TT]ÂËéü•Þ•K¸ä%Í$K|»?[ï×kNtÑÂH^Ý#Lõ-ÿ6E (cѳ" v&Q6kУdœ(Pïý.æ\r žÜä¼(^ю两tI_P©hÁŸÝj¥QßÓ˜:Öv¼¤3É<Èöét™ÇsŠM)#‘%ÏRTÎ:îãRÓ@½Ú!¼Iü›TE­”^òØ[n·ü?×àßÌq™‡ÕÉ–ŠªKΈKé]¹DK^&YâÕØûÄ^ÐÍXg) *g `¶Ö%PÏoÚžAÉOÇÏMOTª¢øøÍ>%[ÎóY¦Áqé iïNÉo•Þ7}m=«::F\%ðã僧Id,yV8ç¬ôR w;¶xû¸C¼Ê¬¡"R‹U½ªèa ^9/&Xý!ä¸ %³IM¥¢"y (ârbxRࢱìY ƒ  ª„œ5•OÍmˆRv­ŒnñDJ—TE"‡†)ÊÉyõW‰v$Ç¥ŽBõº+í:!+U3‰·ô.ceÏr”I0„(éê¬Ãžà4&¤O†Í}\©qêv¨tE7|Ý©ŠiH—¦ÃµP·à{U¨^P%a@‹º$@p‡¸äYÌ%\ò¡ABwú÷wÛ´—'úc¦JϯVJ<‘ÒµÕšK aªúT•+UE÷=¹¿WËþY;»ªVc5+ñV–\*ÊXò,…Aæ¬È%$t·IT‹Á8ìœ7"¦Ä|¼VƳÿM²¤š†Äâ¨BÌÏ—t¬*ZÂ’^Br^¬Tã«:ŽK„Šªwz–àr†Ñ r —½D †è¦Ï†æK–,sÔ€zz¾d!í§çKÊïäüÉù’.g `œ/é ®C“T¼ƒÙ¤fÆE?±xÏ÷ħFñ$4õÖ‡ „ÏL{Çâ½—4£{€ÓùU&)9Mn錓ï½sùSöŸÆÕL5“`B¬Ú$Òá-þšW°ŽáÎë;õ/µý½5Í^ß^¼ìxÃðëûsÕÍ$¿zÖé`Wvš8þ=Ø•ÁøwÁ®drþ«`W†TñìJÎ?2‰¼äpLÕûÏN/gwrx©ŒNN/qwrxUŠÏM_2Œh“ËŸžœþyw&‡äprr¸ \Þ|<{†s‰½ÛÎÅ>ßœá\;a8yÿÍÎUÏâZµoÎpþdçÀ;_á,)—8pÉKdÞŒ%¡%u ¤3©ºiËĺÝN{¯šîo»XÕea±•±èYùaÎÒ[¯USé;á~VM®¨vuQ3Í;a¤êZ+óSßD¨Iéýÿ©;À÷ײ/¿M{d¾Y˾<7Ü“øp-ûAfɹäƒÍKÂ×–øv²Gó'Øíôh–ÎX÷h^2Àüªmvùl[Ûì‚{¿i›•I A°žh~ý«Ò¼¥_À_=…^ÆÊû ‰²¾ ¸8ÿpFPÆÒæ1†Aæ,o@$tOÝϺ[ÁßÖþ’?ç³ø©Û÷é¾i{%=?7Õ%"âÒ•må.y‰Lr­0â[-ÙÝü[ äco¬Î³•³0|å‡<ë¬úà (úÝéé2O¼¿êÿB¢ÖªIbSô4²k¢:}ùõŸ‰bè¸TluÉRQr}Ž—Ò»öW)pé i&Y?8®ûmÔV€0–Þ·»œ%€!4˜®üpäg‹b‹MGÏ™9ë°‡tkifçÛ·±1´i­šhûúnø!^ØÇ{ŒxÍ$eHÕ»¾‚¾œ¾¶÷¿)—øñêÁÓ$2–Ö’—È$"rźK"±žvR¼¥Íà:;´ñ£k #NÕlkãa÷Ú Ëâðîý’Þ³þ¾_rÉhP·YÏÞ/éWó’Žuÿà~Éò vï—ôŠÀß÷KÖ_½w¿$«ŸÜ/¹d¡Jzýþ|‰Â`—³öçKV¥xo¾d ëçæKJÊ%i9×Éù’Nc“Àéù’N¹cÃéù’B¡·3–%,úœÉyÞÏò´>¡»ê,U`*[]ÒqƒF\dÝ%‘(piG®dIÉúR—©;K‘­:«Ø¡o/¯ •oiâTËCGïv™$ÿ GNás-@–N/!ôÐ|£hGU`­\^Þ7Vï*] ‘â5âÚÒ{I¹Ä²¤¼D&yÔGþóžžßnªcbq­·ãÿ¹Ý£’¸=&ÈŸïW\%¨0¼±_XlPcоIØá®0Hµýz'šœ×ý,Íg‘ã¡bÖ¥b«KJO„¸”Þ¥!«»©yI¡IÖÿçÕboýœ×pÚדá¶>Ý€ûóµŒí·ÝnÄ!#fÇjè‹÷=×}cѳ’Ï)@2› zXUÔýSê%æÄ‹v$ÇÕ•#‰f`©h¥K²$5dÝ8p.aಗÐ$Ïç-wMüè„pGúý抧¹±³}ŸúË#¬OÀ•Gô9ȳ~iR;žN§5œX2¨·ª¨ýä6DÎûF¼(^r\&ð´z‰¥b«K Að%!®ÔJþ'®æ%…&YÿŸ ñíúÆþëüÇÇyDÚ­Þ Ž‹Æ’gµ0Ø™DÙL’‰j‡ön¡WªâƬõ)õ“ód‚E;ŠãâfEUï*U—¸•†}O-½—”K¸ì%2I“1cS+‘°Bµ7©ÁXò,…Aå¬f’’¡‡¦bêU©B÷ë½Iü›$,ññúA7â%™Šã"¡¢£ª‹ úrúÚJï-—äÀ^Rh’åÿyŽqFƒ"ÏrTÎò'Àgs·£@½+0ÞÒ «WÙûÅøúÛ16—)Ù™äf©?„´#¶¹sÉŽ® ºDaCoo{¯K÷ÆËè%2 =+|®ËYöSyðqªîµ±\fX7¥Tà”ê%x¢”# ‹i*õWñF<ç³”Õ¤¦ŽB%×ãKŽþÎ Ê7¼o4–<ËaP9ËÙŒhÐu–+0Ar‚Eb ”*dY<‘ÒEÈ&0×`Þâ ÒK´¬\7â ' 4yåG½ºÂHBOÁB\ÍXÙ³å%2‰Ñà†»:ë¸M[܆O„neEé(^”"I<‘ÒŦ•VQ—”l,y–Ò»r–—Ñ ¡;ë,U`¿tΧ­<±KŠW|¼Ky*]Wlæ11 Ê@Ú»h«ŠÜem½D优`7Vƒi5zÉÕ»Œ%ÏRTÎjé½Cƒ \ô›D F3ÉšO÷æKÖäzn¾¤t$Ùa×ó%%x¿¨ŠÌ—”L.s\Ì—” 0Ž×ó%%{‰Lr¯©%ÞkšQxítÚ‚&ÜÆ« —^¯÷G8÷“«ñãþB/hM‹j¨ˆTœª&·tÆéŠz¡‚…G#³Óý9NaÉ$ÕØ-ü +LwPˆó"ÎÄ>âëí‰aáküµ×|$±½½Ïw ×¾*bŠV€š-M"ÏŸøU°ë{0¾ v^ÿU°ëØã¯‚]®e¾ v%{Éþ˜êúºpü`wrx‰o''‡—gwr¸ãT?˜^L²;9¼Ä·““ë±ö&‡—Ïvrrx1ÉîäðbÓÃÉá¹ùØÎp.þ›3œ‹ŸWt|~s†sÕ>°õ«3œâùÕβ¾°q?ø³3œÊ%¸Jö™¤Æ*ðñïKßZG†}b×kšÿPÿÜç ÖìsñµY¬zs…Ö5=áYÒ§tå§ÕõÎYµ¦Åœ^l*Îd7¿lg ×È÷9ÊÆ’giá´F~€Åê/ˆòE§£}?Kñô¾…±êKªá3ì,}³þ££cæB)>F\JïÎ%[à*—Ð$¼¯™¶ëkþ”ñÍ7¡uÀ{<Üœ¤3êºÙ-Ïbt¿¥G~ÐTëÓ`0jñm1$¼¼Ã‹tíœXq]'Ü—¹bí÷õz{¾Ácœ¶ëk•û7–œ¥îço”ÎXß<( ºûfÐÙ«×ïÝ X¾éÉk®ÿ¢!]«d/9۾؇úéW é—!±yŸ5¤ÿ¯6#ÐJÅî¹é%WDRúð¼î_ “°>­ùÃܰ•œª4¹<Ä¿M–Ì»*ð|VTª1\}¨.ñþ^z–âr‰"’šå}9ƒu–+0ÕfªÚXϹÒSÁRDEJ”/Ëû¶6Ë7eÉ£bHe’ ¨VZ-¾°]—CrþÒ1Á¾ŸÅ)’'+ Tï®ëíY ƒÊYJïJä’—ˆ§ ƒAnC¬‡W@&Ö{+å ‹üÅX(ÿM ˆ2™ÀÞ•´D\ÔI ™Äz Y©ÄWñ$“æ³d,y3÷'2k qÙ>ÖÒ…\z‰LBnЬ¡ùD0IÏ"F’Lô™‰µF¹-šÑFÆ]Mg/Q{$ý6“”ÌÝZ/ñUw0Áé~–æ³}\´€Œ@°ã›†•KÀ“ÛKl²îâã­g‘0&•œHæ~^êú˜^_1PÖ"³Is‹wïŠÙ«Š–°vï—ôžõ÷ý’KFƒÂ–gï—\R.‘uú~Éj¬½û%…"Í%Ë7û÷KÖÈ·w¿¤P@ºdiiÿ~É%k‡R÷çK»œµ?_²*Å{ó%k2:7_R:V˹NΗ¬ ÆÞ|É%÷=}0_òSgíÌ—,Æ:9_R²ön¡Wª"}Îz Õ3Á¢Åq±Sõ®ú”u‰‰ÜĺS"‘ž…®‰¤«Ó‚‚?[Ô$í…—Ôr f·)¨¡µ66=\Û!:3Úç¨**›z'Ô«Ç%nCÕ»XCS¼äã…¸œÞ)Kz!¸Îh’÷3ì³ÿDãásîrnÿè0jöÔë…ëäãÊÝuD×xu,„6¿À$êP Ÿ+]€¤Ð+èAœh½¤U`Ke$&XÔ‘8.*ªÞu9Ýâ @p’%™ÞKn±åÀ^"“¼†+íòÍkN@÷Ÿ¸_?ð@gý¢`§'Ú׿K»Æ¢gÙç Í=,ôJUd¦rY܆ñ›hGq\âãum]JëkÈ@\©;ƒ¹D}Oò›¤¾aè‹~aÌs¸£Îzc«Óý }ኆ™f¬Î³Žû¸œÍØ¡ÒpbÉÚ»…^Ý}‘„%½d«V¦‘¯hGq\$TT½·RqÉάK‚ÝJ£¾'å’¸Jö™dæt‚€_‘BN]\ç¼}6KžÕÂ`ge3õq ' Ô³s¹œ„^¨ŠÞï"½D|¼ôm-»4ÇBEÕ»º3ÜJC¬Ž\u2—DàÊ^"“Ô|¿!¾ñZ'%ÏRTÎj&ÉŸÍcBú>ú¦zíéôÏMB¯TEññ²´61Á:H.ŽKoßöVuï›@°ÞQ=*?Äíñ–îÁÃ$a¬ÎŒ60r–_ŠýÔÎë]¡Ë1DD”âŽ"’…^©ŠŒoî¯bLT´4í(ŽK±—Mjî(d$W@ârbxj+{‰MÒÂ`—³Rè”I”[Öìò)[ëLD);+o·ŒÞåz‹uR%aI/ÙÐFÆ!¦…]„j|8fCBFRªâRz—±èYö›„?z”¨ÎJØå²ð¨ˆ(bXöq™·x"¥‹(ZøÚý½ÄäÒKˆãÍû*¨8.õê²±Z]ð‚ºÁB\ò¬ÁX‘³ä% ÕYÇóªÚ|µu«ôºP­uO¬t±ÖlUhWŸZ蕪( KzÉV!wµ³iG7V³ ža+K6–ŸsÀD<%ÏÒe -”ªH48ÿQü;#îgµ£ìkìņ¦D×>cêýõˆšöZS`t…½nX¾~‚-KjGaË%%®ð’Î$óž“(jŒùFÞ­p»É8n{EY>¾†;.MlÆê=‹aÐÃ@:^ ¡wƒîÛo‹§Z5>ÁS-n±lL £<ŸõqÃå1F¤Þïჺ¤àq)½+—(pÉKšIÖ® ¶ôꔈç HÆiÒã7ªd,{Ö="¹s–†¯ühä‡uÖ«¢´À–o,({>Ÿ±î¬::.Y¿±;Ý[%1 ro7lk&YžÛîu—凓×]J\Zl}öºKþspÝ¥÷¬¿¯»thÐW~¯»ìÜYY÷?î¬&ùóàÎÊÕÜùïôÍoÓ7¾›ôÍ@TR%ñá@ÔþÓ)ÿðtú¶¿VþáétžÕžN—³ÎŽ‹éét ÆÙvÇ _¼°Ý"wþêÐW¸¾9ôUrT€<{{­t!ZÁûäíµÒÅ*F±³·×JŽ£¿ÐŽJ”šÏâgSÚUBVªvßÒ»ŒÕy–Þ*›„Ch°’®Î1Äø!7èì̼­Œ®\ﵑÄBÆDÂ!¿0Á#.…%êù,ð–´ªKî=ËÑRÍòô¡ABwú÷U€n7˜Ê ¢[â^#bae¡h/d%ò6&'ZŽÂ79ï1!ÐŽ¾Ÿ¥)’­ \*KEËžÅ0¨œÕâu‡ ÝmÅb0Z!Ýqƒ*¾]–«:DݨŠÒµ¦ªPÕ§ª\]ÓªÚe|¨—$ržLp#G2Ç•æ³X½Û³™³l k1—0pÙKÄ`˜n7(ŠŠä•%±+à]ÄȘ«‹#~GÌ9!±Eä‘ö%¬ ‰Â’)D“‹¤m¬4Ÿ…MÌYŠoiØ‘—϶\Ò1¦›d¹bÝuåÇz–ØIò–d4Åuš?*æ4qªd[ÅêŠ"ÚEÁ‹œ—±ìYºŸ¥ù,VïBƒÂª³|9éݹċ^BÖ]IOÔiAv_¼¿jR¬/Hy &!µ"é‡Boº´w¿¤ó¬î—\2ÔmÖ³÷K.™l¹¤cÝ?¸_²üÉîý’’u³î—¬^¿w¿dÉ2'ï—\çK:UQžuv¾¤ã¸Tg/é——sœ/Y1ùÞ|É%ëÎÌ—,~º;_ò“¦NÍ—ü(ìÔK`,›>§œÙ¬Cƒ‚î¦Åq‰2¸FïŠKE¹fÝ-‘HÏÚrIVŠÝübÁŸÝêÛPG‡z=ÔÂþuޏ§DÝ&êC9îP±ås[€ìTEAë%"çÅoårÏq‰PkÈRÑ|ü‚3ârzW.Qàrwàf’¥cíýж‹ZµÅa…×õøx íb¸Âi§g\NŸÓ)˜’7¦o&dÚý¦!ù\é$›c=„¨_ÿÑ!T“ó:½.Ê@—nªoÕûªV TluÉeȲ¤4ä-½+—”¸žx-m’y÷Æ3ì3ÆÍÇ âšê4Qn§Öi¨®‘뛈ÖTë¸ËRÙŒí‰.2»S¹,nÃ伸Nóäâ¸(ž°zW©¨ºäŠ«+îÎP+r‰—¼¤™d‰oÏwÈù P?7âÇërÃìò‹ÝÏ›±:Ï:l­s6óé´kl×7¨×@‡…^©Šµüê5\¬`ú™Œ³hGr\ž“ت÷2¤R±Õ%Ë7%vß“:r·\Rràj^Ò™¤¾¾8)3ÝPtÕgÚ˜KžÕÂ`6‰³Yƒ]—@½*0•ËÖÞßq£*©Š’°¬°YDLðW¶Íq‰PÑÇáÕWЕuªý“¹DK^&Y»›ØWCcùÿáoÓ¿Ó>AÉÐÃsÈõzùôZ¶¶ ‰ˆò¢…^©Štòo"çå€rMŸó¢;7G/C*}‹„aCEïu{ã³/„—t&‘gÙ瘳짇=Áõ Ñ-xç>.|¥' ¥W°+©?ÑÍ"ÔK˜À”ÚZÒë8.*ê(drUÚmÑ¿Ë JïÊ%2–¼¤™¤ËYÎs»mÚ™’ËeQb ¥È*„_—˜Iè%˜ÌkpeóHÎ4 Nê¥!¨®ü¨±š€V¸JˆKÆ¢g9p)gÉ$Bƒ 'uÎ{ö_܆ˆ(±†[Á‘û¸’x"¥‹…Õeu&HU”„e½„优àGä…Äq¹±šJ$«Õ%ÍXg1 :—(pÉKšIº:ë³a†ƒù’²ü’ ö³ó%«úÔqv¾dÁ–‡äüÙù’®®—g/é8®c“ÔØO´™qùmÚ¡Ói÷g{:¯™˜Àì? ‘®·!(ëÛwå-økU«Ú°¦g»×VÍxÃ6’P^¬ j¬‹”3]ÙWÝÓ|£ýúÏóöļfIÐÄïŒ!äž®·8‰ñªy¹c÷Ôrc˜äwÏ:ì:vå«`×1?_»ÌJ}ìJÎL_»ÒåšD^r8¦ê}5g'‡—Wlwr¸d°ðÁäðIv&‡×øvnrør89Ü{Öß“ÃË—Û^ÞÞ““Ã}àúèæãé3œK|ÃEóïÎp.yA—¾9ÃY²±¾:ùxo¦~u†³ä\bŠ—^"“Ô¼ýŠ0xŸÚDüüRáêqÍÈQ/<‡Àä5„Ìâps…{æÞX¶œ‡âÌCÀ1k5ÝÚö›Z+Ím,z–Éyå¬vàv­v±íB¥ï¬=½]C»¾ÐQ?h»=]cÕûÏú0½{Lˆ«yI¡I–?Á]칕&âA}lH¡¯džWÅdGûw<¿0áÔ:­ïðZ#/7èY›±:ÏÒŠ4å,Œ×ÜÔ~àéhm'©ôV.‘üvsZÿ¥È õ£¾vMBÄåZF¹D‹^"“¼Þ7ìÅ©%dìï½Nè¼ºß ‘¸Å2-Çgã;»é¦:$+˜‹WYÃ@2<+Â`ÎYBƒ¯aç0q¹Ðv”}帰ÈtmELÁ#ñØÙû½g’B|IˆËkïtÒY«yI¡I–O0¼ÐtUubq¸y̳Œü<ëA]2¡PÆ’gé2s–¯üHU$tn¤ßòÙªÓ¡r°¯fÔ0ê‹=ÛB·èȽXkC“¸.âÒ•må.y‰L2÷üSRѲ8ºÃ¡>oÆ·šBÃÀÍX½g1 zˆÃ»7èÞÕY5ñ#׎a4óܵ÷k»¿Ä7n'²Ä8b]Ó/¥âV—, ×çq9½\‰ÄÀÕ¼¤Ð$Ë÷ÙjÍÕ$,lt¤GMù>(±äYúAMƒh0]jÁÇÑÕWPh_»ä¢G凨ÇË‚°™¤ëÁØo×_]óÏvýNØo×ïM²;A±<·“}ÎÚFÿž XÃÓÞÅúÜÎMP¬?ìMP”á× Šÿ…oßœ=GTò'øêQÉOç«sD¥ûkž#Ú5,ù­újÔ°ä7þ«QÃ.g}5jØ1Ç£†L–ÎeäL'§?Ë·©@1¾|› :Ïú*(7–oSÁÿ}ÙYLp¢qàI÷³<ŸŒ$ôd,Ä%›*—(pÉKø„Nìê,cK¡NÒMBª Ãv¬»@–‡´6rƒl«ÓÞ{ ó _jØ<"çö_êxR½ ûYš"aõÑê’ÒËnæôþÞ\zßÝUg©ƒÁªMÜ`ªôĺ«a‘ÒÊ—5Z>Fb$èÁ*†X&©€zjŒkÀ¤­õÖξ ÚÑ•¸ïgi>ËÆ¢gÉ>ÖÒµAæy M"#¸Ì &>DL %±+­È_<‹ YE xQ·È„€X¬@jâX¢8œÈù¯*‰ÉÇ•îgy>‹aPñMÃŽB\JïŒä \d0L7‰4kHÖÝL#õ¬D…½!€>3±Ö(·õ}‡ošN©½cUQz½õò½b‚m,y–îgi>KƒhЗ‰¸ZÚí .y‰L"Ö½ññže_T2IæF?¯¯ 4qQÖ"³Es›ß¨q™dÍ2øxªŠREš^Ò‹žå0¨œ%BÅhÐÝ—7Y #1½‹tàënÕŠz–×S)¶:¶‰4%Ë7v$ùX j2Ñò@Oðä”–$:íß/¹dUQ›ŠÏÞ/ù v;÷Kº:ëƒû%‹}vï—t¬û÷K.;Jqì=>{¿dM‡{÷K~j™S÷K–?Ù/)‡ó% ƒ9gÌ—,ñmw¾d1ÉÉù’…'ß/¹äôþÁ|Iéd}üœœ/)©åÀ ¨gçKÖ¼€Kf´ÐkUql^Ÿõ’ób‚UkŠãò}gVï,ͺS"âjé½SЏä%2 »›Z“ÍÒÑÁö5æ¨e‡Í<Ñæ³|Ó;tµ7 ÙŒô9íÃW6³ª( ‹ Þä<õ…´¸…—­à?Äý…¬tQ–”†,Á_«öÙ7è¾§áŽV´ç4„}O¼¯{‹ÊÕ™0_?Ì7ðÚ÷yLQ›=®nï8êãR‡¤$Û!=„­*nØŠjP.‹‘1ü8\’ÞUï*U—HC&âŠô^r.q“'½D&yVxø¸Gï JPÝp(¼&=ÐïØKž%Ÿs€t6#ôP;o¸¨³ª( ‹µ¦YC]œ¯ž*nÊG©Øê’囪;C­4ì{r“Wó’B“¬mÂBýŠžÚŸÔ¢‡tOìÚŒÕyMâél¦ÓiN\=  Þí,—ÅmXUo)ŠW优`ÑŽä¸t?ËÕ;KEÕ%Á:oÑÒ{ɹDK^"“Œs¢ ?ÚÆ6‹ža0›$e3|¶„êùMõ |ò‡ÏMOÔT²¬ ûhÍ/m*kë=ðí(¾;î{âûæŽBµòQé!êñ¶_h’ÎX6£ LÓ7“”ìÁòmy½*0F ÇGÅiïâão{JWÉ‘Ï=?b‚E;2Â*ö¦&5Äk·2Æ+ú· TR.QಗÈ$ ƒÊYÇmÚRÆ|*nCD”²³ò¶3ºr½P€UEIXìù!ÚBv1¡âöÏ×Î(uÉèII\é]Æ’g5/ér–F‚‡óšIQ¹L<*¤* Kt+Ü›Äi`ÖÞ)ôJU$&·^br^L°hGr\ªÜX7DPW XÆ¢g9 *pÉKlBw×Y»ó%—®jû{¾¤¤êð—>®æKV}ao¾dyn'çK+ìΗ,?œœ/é<ëq}2_Ò×Y.ŠGÌ7ªÓ:Þf//á\ƒ#~ß®˜a¿¾a¬ Zh3ÖŠð1¹¥3Nõ¾ð‚ٖ~Z#_ä…š™@M¼nhW©.µó ªˆïÏq;DòŸ'Ók„Ü1Ï~µgðŒK•õé ·ˆoS¨/ÕRnça­`[MbÏÒLÊ7Á® I|ü*Øõzý7Á®c¿ v¹–ù.Ø•ì%ûcª«}°erx‰o''‡—¿;9¼¢ès“ÃëÝ›^””““ñäYg'‡×·worxñ¬ÃÉá¹ù¨ãÕ_á\­ÀM¸ßœáüÉ2ñܾ:ÃÙyÖWg8WLþÆ-ŸÏÎp*—Hò'š¤¦@pø5X¢„Ã}ôá ¯¯ó *ÿµœX'·‡¨=îdv7Ý\»¶7þ} ×|ß,â¬u[Øg Ï’±¼üI˜O9Knµ…O’Ü£æÐˆ×5&FÍTÿ!¤©wˆÍ$%§wå­<—È$õWÇ&ÏŠÂe†]¢ºOlfù¯}ÑÛèÅ \Cñmaõì웡¾±Ëš2«5hk*àrV‹ž·¨u:Z{dDµÜGŒ WXÔ:Öj{Ãá#Äåô®å\-p•ä%2Éë Ëü-6¢ò;þ¤•ÿ+FÂâÜ~އÛÎÕM·µ­=¼ ô¼¿{ceÏRtÎÀ¼¿ÇèÞ¼Ï4Nü€SåÚ«6’9 Ä«\ãÆsÏ$ÁF\JïÊ%-pu^"“\k: –`|£Oå¿·ðäö«¾T.ÞØ¤nº×ÀYÃ@>ãÏja°ËY–°ÝkÉ_{þÍam¿á©rï>Sª®Eר™d±‚ê`".¥wå’¸Jö™¤)ë›HD,øÅ\¯Ä’î°›Nö±±èYº ¤_ýÒœ+>Ž>¨ê,}9mFr=*=Dm;÷|Ön©¸üðwkÇE;—œì`í:ö›Š×÷úϦâÞ³v›Š×ÿçϦâ®ÎÚo*^žÛßMÅ‹þn*îM¢½+ìÁøê„Wé¼äøÄ/tøB‡ VïÞ¡ºD Xˆ‹éݹ„1Ä^¢ÃÀÛÉí¥¢¼¿"RØXò,Å*嬑9KhÐ]u–7p«b£›–çvC‹å0¾¡b?Ÿ±bp¸ã´ÝP|TÜ zn8wÌq‰PQõξA×%úÚD\zT.R8 ¡/“è>º=KÝtÊY|)ŒÃm¿ÎÒË'C/¬ž›žèÀ¥s¶Â;Àm9ÚTÖ>¦Íq¼Û×"®³wûz“la°ËYÜíëq уñÁݾ."µXUº(vò”¢L²ö˜íÍU+Qö)tw®zÍÎ{sÕJâkÆøs®ºt^"“œœ«î4qCœ“sÕ‹þu_~ø{Ô}í„9uÿ/îýGÜ{²)Ý'ø°aÑ¥ f‚Y‰ãRÙ—N2q>Kö±gæ,å¢Ay‰¾\+Š× „rÙ…4¹Aß\p.=Øz+Ê+ØW¡ªOU¹¶švùÕn3ÉÊæ´¡µž¢@DŽˆã¡’Œ¥ÉGÕ%ÌYB\JïÊ%¬³ô&Ò$A7enÐY÷DkIÏÚx—Õ¦ÁȘ«‹£UÇf~6Nhí«[t¬*Š$QbIä¢hGs\ö,…AÏ`˜%âbzW.ƒA/±I‘{ɯÉ_êYÅ[‚Ñ ®s}ð¨ç?ºêõdNÅ©’m=z¥*JÂ’^ÒÈùKg,z–8.% ¡AÕ%ÁB\ê¦c.!7h/‘IšDÒéY–U¨'YŠ@Ó V%å{,Ô¬:¯¢'kñ,vk÷qÉŒö¹-@–œÍ=¬*Þ}ƒb¢/`㇙`Qæ¸D¨¨zgŸª•.É’Ö‘ÞÝÁ+?î{’Iî7Ž =ñ ovŸÝÛvˆpw9 ‘r;j­s—¤:T=ˆ-ôRUT‘b½„D”™`ÑŽä¸L¨¸zg8ë‚`!®ÔJ£‹ jRSG!MR£K›¯½ªE8mà Ó-ÞêÛ$Àe,x–}.He3BáÄ;vHº“ÐKnÃD”ô’â]k@2Á¤Íq‰PÑ9ÍV°.vß“šÔÔQ8Ŧ{‰LòzTÿÏ„;]Ïî¬nÆÊžuЀÚg3Nc—A½:TX.[{áEUÑ–ôý &XÛšÅq‰PáÇÑußA°n‘x䇪®ÎKd’×\Ä5›ÊXüôÛôï(›µ×¥t8Q ž/Ÿ^Kw¨l¯rÉ/¹^óñrê%ÍÍJv@·n‰ã¢;»zç|–; Õþ©^]½×|ãå òKžeŸ£7ÒO =4‡,PÏÍÖ:õq¥€ÏTà$!í]B/UÅ$aQ/ÑZ¦6ÓŽä¸L¨(…ºýS½ºù!âò|r‰³Œ=‹&QÎr6;ìœ7¨WÆÚÙ܉(±†¦xÅÔsÇšµw ½s’°¤—lаdÐhÚQ…"TÔ«Ëù,wÁ Wqy>‹ž%ü&/±I„ÿf(]¹|ØüÁ|IßÇuØ¡òÁ|I§*ë%Ì—t×qõþÁ|IF\¿ä’æK~Œ1¤A='üuîóÅÙØé3wï÷5›ù¾`¼bO´·š«å›Â>ÇQ¸æœõÚÏ'"÷óIÿ¹]o˜£|Eô¯aðŽ£‘ J<¼äùÆÍ$K|¾ƒÖªÙùéýýÆjŸqâÒ,í)‰;¯çcˆ_ð‹Iþv=7øM°ë”⯂]§Ÿ~ìÊðŸ¼ù¸†s‰H¸¡üÝÎ%×k)ú7g8W¾‰å«3œ%‡Á¯Îp.žÅ˨ǹÄD½¤™dýmQ}ÔòŒp[ÿ—`N¯ÕÚûB|ÚøÁ[ÍZp!}NëÅçw±ý?ÜO®ž…’"îL/l.¯© #Y¤‹f¬Î³•³tàVÛ.T×_çöŠf¬{ÌódÜ´ÝMïÊ%%.«•Iê{€ù¬Q^~oüЭæ,½Qä7å{±©–¢s°LÆ;w£¾0NþžÓøöÛh,{–(˜ &À¨ñ ý!¼‹­½+ªëël=ybwíâ2Å«}O:þN/ “,¹þ~ +\ëûÏ{Lôrã‡n5×5nv¿æÏÐþäŠm™©±šÛ€Õ 4;gó…kóe,y– rV¬Å&öFè.¶ö®¨®j…EÊ1âÒbíõ/9p5/éLÒÐíšO¥´ñ÷š‘ôú·g½ü0ì*ü¡ûkúúÕúG•³0¬—ðËékûlªä„¬Çë\—¼_d̈¸¾iêZênŸÝò@NöÙ­6Ýë³[=ë\Ÿ]—³0ÎöÙå¢4Êv²Ïnùm'7¤/ŸzwCzÉëƒ é˃çÁ*ÝÊüji}ïYß,­_s UÅo–Ö¯y[m—Öû³Èj>kÁ=âRz—¸ì%Üë[Í#$…÷õ޹Ý1šlfc!&òŠ™<ËaP9KKщtïê,Åd0êCŒ®½×¼ZέíãzÍ)Jù;6¿ïÑ7x@¨üÄ·ˆ–*ÕÝ$,ÄÕÒ»ÂzÉ˧d’æÞ¼YJtec=û0Øç, ¢A/Eg¥uZùÝ4Ÿ*£¼Â>„ß꾇èC™£-ZS ´CŽK„Šªw‘Õ|Ö‚;ÄåÌ\⋲ô’7.&ÌKÚXò,íAwÎ ªÏ&è®ïã¥è|íéäç¶ÐÂR†¢:¬¯ïcÿ‡í¯•ü ŽiG ñÝioU÷¾©#WïhLÜKÀÍÿò…æ%;þÃ1.úœr–†€}Ûu–Ž`’ÁP !7¨¸ã×_ŽÑ\¦dg’›5ìLb&x‹°]ìM„Šªw‘EŒoÑ¿Ë JïÊ%6–ó&Ñ”³|“yι±eÍ.ŸŠnRöRt%‰{̤Ģ”³%£>M!…I:röHéê?¼böÍ‘ÒÞ³¾9Rºü  Ïß)]ãY÷ÿIwc­—ü½D¢«ö—HôöÙ]"Ñ{Öî‰K\ûK$º:k‰ÄòÃßK$ºp‰Ä¥+_v÷z,V8¹×cù8»E~W;UäwuýWE~Ç9|Uä÷|È¿ùÛŸ”üÿè·å]zU‘–¸§D΃¯jLVÇqéYÛ³GuI=ÿ¦ô®½+ \ò’öµ37("7ñ‰bÍAÆì"É@ŸyÈ”›È8^¦w,ôŠ¡w;±¯F|oc‚e¬Þ³•³ÌEs>‹ 81Û(ŠÅ`(pñµIĺ›§žeŸJ1yÑÏ&¦e½2Û$³EsoxgéMáè´JXI/19O&XI— VïRyTg]£j3âRzW.a@±—4“tz–ÄǤA³H³É7«Ÿâµ”ä£>HËDšI:PFÒ¥*Jo”g) :IˆvÔEYBwÕYé¨4糤¹ qiGXw.éY6 •bkÈìÁ°ÈIù³ £kš ÉÔbj“YÏ¢{Ü¡’níÝ/é<ëƒû%˯޽_ÒÕYÜ/YÿÚÞý’qý}¿¤ó’f’®ãƒû%—ÜXÐZÏ:y¿ä'íÌ—t½+©…ïÜ|I×WãåO'çKºžŸÔúxn¾¤ëGòªÖ“ó%‹gíΗ\†óó%]—Œ%3ÚçÔ/¶e³^Uº%¨79O£q=Ç%BE¬;%ëYî”bÉúÊ% \înÚL²x–šÔÔ¾öŽƒonyS3\k“[=+èŽ[ë’és-@–œÍ=,ôÔ{UÄV.—Žœ•XCQ¼âã_1g”JEU,Áüձ咒—›Ôd’{4p¿j%Ž^÷[¨ÿ¯y. þÑŠæðMßï]“¨ÛÑ7ƒR€DÓ¡q¢µwÖ€.—!a%"J优àvì9.*©zæ³gÄ¥ôž›ÔØQH/i&)kL –­–h"|jüà}Ñ2=+ùÜq€ôNÜ@ýÚAÄÄÂrÙ܆TE²†â-OñÄ´£8.-ÝV×KEµÒ¸ïÉMjì>S¯;Wó’Î$Oõ÷Ö!~xr¦˜žuÜìlæÓi?Ÿºëãò7U¹,¦„°Õ×Éù¬-aÙ>$çaÓ°vÇq™Pá»ãR‘ï[{3âJƒ |ˆz¼ò’f’’eÏ¢÷Û´åÁ¥Ç‰õ¬ÀT.+†¨¿×í¢x«,ž0¾µÈWRLL‚?ã¨9.í„Ù¢réâµÚ?{uÙßÂSÉKƲg) 2gýÒ9ï9dzU`/ on™6÷q%t˽æã•ëoÁ¿%| ä ½DÝb‚É¿™ãªÞq¯®N2aö_IœéݹĞ¥0¨œ%€ñá0Ãî|IÉxTHõì|ÉŠßÚ!NÏ—”Œã…ðÏΗ”\c¤‘…só%]Î2À86ÉØ¥™q±é6€·ÆD^|¿`’dz¤Õã­ÚŒµùØIùî Îë=^¤ ZNý“1Pt U7ÄÞ;ð §Õ:{ö¶ÓýÛYëÿAl ûsZEügzã³qŒøv‹¿öªùç5Äøh1'ÞLò‡g v%•ß»Â`wù6Ø•\Ž}ìJ.¿ v¥Ë?2 ½äxLÕfNN¯¡forxý¦ç&‡×?Ù›^~ÛÉÉáù‡ýÉá…ã:99|É0¢M/žurr¸ \Þ|<{†s‰äÚ*øÍÎ%Óßœá\ÕØkp(_á\+q,ùøê gɹDK^"“Œ5£Ó8¢>fLÐ>õ¨n¬Šð‘ßúø“‰›Ç°§þ^ã#šÔ®èˆ_Ù÷Wàƒ¶s±5×y·\¨V¬åx?†0°Œ%ÏRTÎÒf-ùPé[áEë蘡a:Jï&¢¸š—šdùW ?ÕK¢xÐBc®ŠhG~—çVÿÕxaß5WªZv9BŽªoeìi|¼¡z=òixB¯£ÚmÆêTDÖ'ÍnÔÄ¥ZÆž¸ä%2IƒEÊÁ%|ùõ«Ìç6Öp½º[3¢Ÿê2ÐmŒÖ?h½z[·_]º”GT_AChÐÊGÙ•ª«6“üOís8Ùz²<7u3|Óz²ø‚z[¿i=éÐàW­'+ÇÅÁ8Ìi£ÄßKƒKÎ%ûKƒ;“ìïq^{~Îíq^Œµ»Çyñ¬“{œ»0¨œuvóÏÝÙã¼ä…“{œ/¹TôÅR*ÅB\)½ã`¼âAó’B“¬o/ü¾GŒRߌRO¯küPB{nÆùßú¤NÃ@4–g ` º«ÎjEñb0iäGÜ`ý‹®a…± øñÛ¦Çá ÷âWçÔ„Š>¨¾‚îgÃz ]×-ããèñƃ/4Ig,{ œsÖý–Fƒ‚î|ÅôòéµäÔ4ò#"—ÏZVHö‰Mì¶©L"×ô˜9®æèeHÕ»‚ƒ õºëé=6*—(p%/±Iâ›*g%€Á ê®qb…h1ÞS€oÕJɱêI+(¾m‘¯‰Çäü„©L-,4Ç%B…ÉÕÕ¡îgyŠI\é=‹žµyIÎY‚%‚+é Á"&³î-£÷¹~C—9Sl&)„†— 'M;‚6pZ:ûx¯ïgi>KÆ’g1—äÀ^"“º«Îro« •vdYqÕ eï©§ž%¬,-|½!ï“ÿ"aý÷"ó×™Ždwõé§G²w7æüÄÞSs.h–çìÆœK0€ÏnÌYïîÆœU3:·1gyn»sz®æä#™díèØc4»WìF³t°Hí'Í ºŸd4;nP_û,£Ù+Å»$³þŸüÛâßé9U~6Qã"ÍE§7¢}y{©—˜œ7,‚g) *g ` ².I{0(CÁP.Qà’—ðH"‘žeñÑ‚ ¥+Ð BEØÑÞèÞ¤&qÜÑD§å¹qE´„*IX2–^åçv}>NÑ …7ÖYºŸå 3ø˜ÞIä*pñíµž%ñѲd,!enŠZ§µ5n})0 d厚^3ÉÊ“£CE¢­ä\ ½–€éYŠ.h',4(è®:KE±JEÕ%i[&¥s²îÌ%\ò™D²¾z0Ô0ãî&jÕR±©o»×]šøqÓPº´w¿¤ó¬î—¬¿zï~IWg}p¿dù»÷K:Öýƒû%]àj^Òõ`|p¿d1Öîý’®?äƒû%ëŸìÍ—”l,7œ/YÞÝù’Kf‚?˜/)¹zwƒÖÉù’’s‰Wµžœ/éz¥Ô2zv¾d­O§@6ÍhŸS ß–Í:4˜TEIXO¶v‹œ·í7‰ˆr³")^ññÒ³x?ËJ±)Ùƒ¡î ._LP“šš<ÕkÈ.Dõ'¶ÎÅUåá˜$ÿ‰ÌŸk²älævÁ" ½:EŠ-UY/9OÖ´£8®F¨”®z—,©Ýé‚ÇìÎhé½ä\â&5uÊ$Ãï[¦]l 893ÁàÈ}º^wM¢TõáHCáD[Vr¹lUQDYC“ó¼â^üIæ¸@¨PCv©¨Z†óYD\©IM…îu"g=~æ3‘èâ½R­ÆzŒ€4=Ë>çÉlfèAœ¸ú’a‘Ú¥½'¡¬áFñ®•8ùxþ`&X¿@¿ZŒ™ªw•ŠªKÔ¤¦ŽB]ùQ¯®«é%6É¥ýIïY‡mÚÎf:öàU)z½|*—5Юvˆ{°éõî¹LçL‰œ±ñƒ®iŽ‹»ÓÝ"¦À‹¥¿]ùacµºàé ÍKJo,y}î¸sž3)Ɖõ¨ÀR¹,nƒûjÌ2Iˆ·x"UqKF¥KS‰œ',Ú‘×–(K—B•\{uÕ¿eŒ’sI2–<‹&QÎÚL²Øtw¾dùáä|Ié`ÑQ×'ó%‹vçK~ðÔ|IIpòŽëƒù’’ î/ˆëƒù’Òy Mò˜å—}3r¯N[ÞZ„FÀc¦ËÝÂ>€3Nã#ú¸^ÕV/0%7D¤Z+éâªÑÝM̰` È©ú~½¯«½Õ€ÕºœÓá%Í7Ê$rÉsh¸wö!‡x qŒÿç“ȳTg}ì:Öý«`×ëõß»ž=þ&ØuµÌWÁ®d/ÙS]5—–ìNg¤úÉäðúM÷&‡W–àÜäðòÃîäðÊq›^~Ø^x¤““ë±ö&‡+NÿËÍG]mýê çÂ#iãÔ7g8—çÆk·_á\˜F]âýæ gÇ¿}x†S¹¤®’½Ä&¹Þ¨Ó‚‹RÕæ ]‡}ΜsûA'´ªõùıÀ ñƒ¼ñÀú0a¥åc@Wå@š›^¢~ÒŒ^%&L1ÊXò¬ûœ¥·Üv¡Òwx¬v3IÉé]Ò…èê1M¢|êà­H¡ë°z53Fβ֦-‰ï+:>‡7î›Õ²í¾ûCûk%ÿ_%`ÿŽ??¨ýtræúÜþ\m:ÿðÁjÓ¥Ïáïզ˯6-ÙXû«M»œµ¿Ú´d辿ÚtýáÏÕ¦%×%¢x…¸”Þ}i\ùT“Ð4‰®ÃÎeº¨nmÓÃ4 ×½Â†kð|Ú‚äÆjĨØ#?²LÍèÆÒè$àrV &ržuÖHY¥–cøáùzÆN˜çûc핊—T— q)½;Ÿr^S^"“ŒÕ"í¹Mcàøix Í«+Ž­¿j*TmÏ­Âp M°§Ñ—ê+ÆÐ ÁN÷e4ÍÊœ%€!4¨iª³TÏnñmF\AÂÜïÁ÷VwD H“¨zo¥âZµiÛ,@°—ò©s 7ÇÒKd’Ù1ÑrýŒ0]_wë9M›Mk £ú¨5u„Ò"A2nZ~x¿P&Õ¿ î-¦õçš),wÈq™Paõ¥ââõ¬K”O…¸˜Þ•K"p•ì%6Ésˆ1”Ûøl¯XE£ð¹f¬Þ³³ð'FƒŒoª³X§ÝŽ ›Ä Î,蕪%jç爥€¸€CÚ1q\ T\½·R±Ë§Þ1 ù,¤wå’\—È$w\GJƲgMG9ËŸMŸZßGß”Ï ÑMxn&rç…ÈQbHúA­ý‚’¬hG¼!&TôVé}Ó›˜®Ã²×ïµÞxû‚¼Ä&‘gÑ眳è§Fƒ‚îôzÅE ÆsƒŽ;zýáv™æL…n–ÐÑÒqôJ¦‘—¢² vFòtÊ—÷³4E‚Œ¡\â,cÏ’I˜³”Íœç8Sì«̚ʧʴÌÁ^™Xw¦-±¦œœŒ”¦l£ â1Á¢ÍqÉ>Ö"FzòI&ÍgÉXö¬é gÑ$BƒÆ‰F–jQ&R†ëNÜ›ô,3A6ƒ9¼f’’Ñ:q¼×z û«*0Ç%BÅ—ÏP}¨.±±äY ƒÊYªŒà%6‰ê,U`®ÍTµ±žS¥§P§¤g¹|Qa£’g+† ˤKgV»¬ƒ­—¨v6,Ú‘•xªÑY½³®·g) *g ` 𝧗È$b0Äm˜õB¦DŠ»…}:€åÿF R—ŽL Íð‹ÐKUQÖWççKg¬oÎÏ—œÞ¿:?¿äSµ(s~¾$F3k¢ÜDƉ¦ãváwëÁº|úÕz° F‡Ï®Sàê¸Á³ëÁÖ§#ÿ“õ`_ol“Zñ‰|SrˆÞ—o:ÏÚ—oJûòMGwå›Ò}œ]ù¦ûrûòMùL¾¹ü*ߨ[ø¬¢¶üðâ%è€V¥JUt>¥gù‘ChÐZ¨TRꧪK‚½»‰é]¹DÚ.½$™„J±4d«ËÒÕÝ4ì5y®ö˜*™µ™ä‡ù‰¸£)ìÒÞ­ÊÓ³< ­–Tÿ…ÝUg¹Ë€ †:Ä {+Ó»r »&ü^Ë$êÁpw†û6ØÑÁƵ¨[X§û¸~=ðÄk\'ï—¬¦ß»_’ë¬Oî—\rõΞŸÓ÷K.)—Xw>{¿dùa÷~ÉbÓ“÷K–vçKJ6–{¿NΗ”ÝÓŠ´“ó%%*iaǹù’’Ó»Wµžœ/Yz¥vçK–NΗ¬oºe,™Q>—º*™O­½_@½%,2ì5,"7±î”HT½³OUu‰¯q½¥Ë —¨‡Ö^B“¨ýS¡jmͤ«g ‘öP{3ÊçØÇålfˆœ(Po¡—ª¢¸ é%b MñŠÇ•”.UïÖY— q1½+—¸£^â^Ýú¶ßVS8ú³‚Ó°\5Ö°kõ7Ÿ+}€|1…êö'Q§:TxéÕå2…^Q–°¤—4>~©%ž€vL²¤Vï­T\ûjÔJC¬ù,uêp̸Jö™äñºÆ/xÔd.ëd¬Ûîos€T6ô0Nd—¾)Ëes|n|¢Rmë%´œ˜`ÑŽæ¸ø†¸z×[å*‡o¢æ³Ô«›«ÙK/“4cõžuØ9ïl¦O›ow^Ÿz)C]ZÜé"…Þ$ž0¾1òEL좥iGq\&TX½˜uû'Apj¬f|O‘³l,zÖû¹;ÌÐeÀãžàæKºì|Ü¡òÁ|I§*ë%Ì—t¨æ°zÿd¾¤C\ǹäƒù’ų®qÖfôžoÖ=&–p¸Ü¤k:+úžêÎÿ ÇnQ›M¼è7½b‹X­vÑ™ “Ôê牷õI¡f"׿jÑ_áýbCïoë¸ùƒéJ+èþœ¦°l’k >‡+ÝcºÝà Sœd:6ÉÁ® È|ì ƒÝåÛ`WÀï‚]Ç¿}ìÊPÚ‡ÁnLuùm''‡—¯°;9¼>·s“Ã?_{grø§Ú=59¼ü°;9¼r\ç&‡/©zÏW~ÎM¯~or¸äÀõáÍÇý3œ[ïJ„šoÎp®6°ðó›3œËgÃÑÕïÎp®½R<$õÍÎ%"ñ2êq.1›G/ÑmÖˆ³×ûÓYÑ ¢caG£’W.KÀn5¼`o"8àpÙDjïþƾÁí‡î¯éèWëÕ~Kwšó+èËñk§0¨œÅ÷ÚÛ.4Ÿµ›Þ•KJ\°á—ÌÌ5µ|+P\(P”oŠ Š®Kç¬@¡0ØkF' ™¤C\_­–[+ʽmë³>·íoÑÚv·ý-Ïíä¶¿UÚÛö·šäܶ¿’àÖÚœÝö·bò½m— ‚}x– nË%%û¶ÅšDgEïW¬ß)‡è%¨I"Zªj]±ÛÀVÂVW@ÓÃ{hëG+Ì~?<¡ZMS|»Œ.¬Ñ³™³¼ëÕ´ãÝ×Ϋ1*°ùŠ45¼®]“¨.i 8#.§wç‰uÚÜ·™dyn/X{–a…dz=éZßëWûaŠõâѲ³Ø”Ë–«AÐ85Ǿö¬§HÈÕrï!px´çfcùè&`™³0ŒÝUg½^WÔ€O,·«¯Ô¾Í$kÕÆR‘$ A°—qË%%®æ%IÆš6Ñ’AµÚçѲÌt{Å:“úR­Í'5Vë$Æp}"ϱYñùÆ>.KžåûÌY `d4hè®:ËEq\a¬wÜp©Èûöþ zW©Èº$@p‡¸”Þ•K¸ä%a’ÅjÝ9„}¢Ä®Þ}5Ó,ÆŸÔÒ,ºx·6Óå·é2ÐP7ŒÕy–Â`º/Ãù…‰#ÏhJu–F~È`¼ïqºÖ ¤›¦G`Š}Be|à-Y*F]Òb!.v7E.)]àÚ¼¤3IÍ™­¸›MÒÞƒêË÷¶©þɳ•}õÿ‰˜i(ëÙ‡Á.gù>“æÝ]géÊ%,ÐM5‰£pÆ·ž¨XŽ8. ©z×p†±ºt„¸4Ÿ¥\âÀ•¼¤eÀ©¾Ñ,_NŒAÞëK†_ðÂÚ2–<‹aÐ9k—ŒÝYg¹(&ƒaUQÜ`LOÖ ¸nyŸÚkù í(YÒ«Ø¶ê½ ©ÒSã”@0—;r[.)9p5/éLò¸½Zi5KF÷ÞXg9 :g` ê> ê,Å71¤›Ì Þ©×W  ùQŸn@©;Ê1Ü~uÇqñã¸,×WP]Ò¾vF\îu×CÔã•—4“”l,{ ìœ%€A4(è®WL/_ËD74‘«g-+Ø>´œljr^²—hG¸³9”J  (¾Ÿ¥)’-<•¸d,›„aP9«…Î 2ܺÎRˆƒÑÂzÇ :uw¬bs|cä;ÖKL΋ ÞÒaÇqyX‹ÉUiWuIKÕq¥ù,æ{Vò’ÈY†%€+*ŠÅ`ü0™u·D¢\ð‘þ„u!4,4N:¾ ‚úòÙ[K´‚ºÁ6=«…Á.g `Ð$‚îgÃ%‚Š_sëî+?Ö³ˆ•…¢…¯…¼UE•V,ºLΛ V_´8.–}®ÞY*fcÁ³•³˜K¸à%®³T»\V!­ãÚ_EÖÝרg©ÈW­é*Tõ©*×c¡WKÞy£ªÑ%ãk·ª“1ǵ*2VïY ƒ)g`hZŠûY \.ŠeÑMâEÕ±îÖ@x¥kTŠÍՈſ#æçP{oÔ^§*JÂR Nä<™àvì9.Q•¬Þ³0ˆ}úV{0D°2pÉKÄ ŠÈõq ‘¿¤…%>J)ö5rbA? æÔœªÚ!FŠzE§+Ë ‰œ‡±L;2 úäÏ[»Ý‚}΋óY-—tÜ ˆ\™D‰;ͽ›k̵s^ ÜÒ ¤"$}ÊÃa‡Êw!þÝ…hî³õ”ûZuþsZ«î<«…Á.g} U÷?l­c0>Ъ»Ú¾B§g} U/OtW«îº›Î¶èßéú¸ØÚ†Øa}Žžåã‡ÌYjÈ9o&uVnü ¡Âê]Ü ˆ\±î’HÜ®¢\ÂÀ%/Q†f|,Cóêõ`ˆúCÔ9rÜZ—oíÜ/é<ëƒû%—„ÓmÖ“÷K.™lÕ{fÝ?¹_razW.éz0>¸_²ü°{¿dé•:y¿d5ãÞ|I×Ç弓ó%ªè:ëä|Iæ¸Òr®“ó%âr‹åÉù’ù·íÏ—,?œœ/YûßЀjcÑŒƒ Ä-›uhPÐÝB/+02ÁmtÜ ˆ\ÑŽ–H¤gmÕ{§KÖ7vwç³¶\RràR“§M¢^]uñ²¿W¿Ç=Á6£|n }—›†ˆÕ¡ l+—³ªh"J¬¡Éyññí˜9.*®ÞY*º;cÁârâWG!—{u7“,ž5€~®4 ü¨ás×$ÍŒò¹ÒH  z'òDh«ÀÖÚ™åò;Λ‹ˆ2kØ(ÞÅ$_†DÎë¯ñ˜ãÒ?Ú>Nr©è+§ürÊ?žÏâ•5VóñÚ$ÕXrÜ9¯É—ÂÐC8Ñ;çY©\·ÁW™/y¼þªhñDz ÝŒ®Ùs\tçT½?êá7÷êæù¬£‘xI3ÉŽg}4̰?_Rˆ»}v¾¤0Iäôqz¾¤ ¿‘ógçK “k—vÏΗtY&yÖ‘Ij ¨¦™q±)§%}:M ^ëxÆ©bœ¨_t¦ç“5Æã ñ¾Â/ÆOPïWCªã‹Ç„_ÕX‘¦Þñú×bõ”Îp½cñD‚‘߯|ÂŽïoû)Ö?aý³^*C7ßH“THÞ~Á½ZäVxÇôg3Éžu2Øí0_»NÏú*ØuÝM_»#}ìÊ^f “x¦øhLUÊg'‡—v'‡×oznrxyð»“Ã?,Á©ÉáõÁïM/ñíääðúö&‡w<ëÏÉá>p}vóñìΕïÅŽ›¯Îp.Ï÷5¿:ÃYò?úÕÎÒë›3œ]µOuÿÎ>gWþ³»rvå8»å‡]În‰o'9»Ë!gWþ³ësÖ Ûo~áìþ¯Ü¶tzÖªò`/ÛW °V›>cÜW °„¿-ÀZ?Û °J0>\€¥Ã™¬e o‘„JR©¸yp!¾dÄ¥ô®ÁR®æ%…&YþäN;ÙF|}Ú0Ö7i¶Îßųtè:rÙD{–à s–†ïËhꬴ" †é¦Šëpµ¾{ÞIÌq‘=Î×BU— qñÆs‰—¼Ä&©!±ÙôN¿ù5ŠþÑ9cÄ{ a ‹žµ…Á.g ` º§ùŸ­(î KXäkLT¹Ëz3ÉÒô>j°÷Ú;w ÙW›ÿ¾$ÄåûYêÈUàj^Rh’ùOž×©¡Á©>¨8ýô€"ŒeÏšrV—ŒÝYg¥=% -¼¨NÜ ˆÜš#^‘ïhá“IÄ‹v$Ç\RõîRQu‰@0—ïò(—(pÉKd’ç³íO:ÏJa9Kƒh°}ê®Îâ7M 㛸ÁöD;Ö}œÐž«~!ç7k—ô$Z ïŽ×Wë}kobÉï(ßÞt?KS$ô…ö‚&cѳäs)g` º«ÎR<ƒáùmpƒ&r‘är™æL2IÉ1Ñä<âh²†µt¹‰ñZ‘\1ž Xy!ÝÏÒ|–Œ%/‘I˜³Z6ëР2 zêU+ŸÞÙM§ý&rɺK"±ž5†Êãdt,a©;Ãä<㛇}ù x§!¡KÆH =•„«„¸Òý,z–à s–†Ð q"ë,bK3£¾ïÌý!®O…{¥g˜ ² Ì«ŠÒë}àI' €ýÓå@Ö ­’Xý5†ªÕ%ÉXò¬é0g`ÐKdÕY­Ë †é&÷Ô“Èe Õa§gY|daÃ’'Š!™¤äšÖÕ®— ÃEÎëò¦êmUâªÑ[õÞKžE.À9‹÷³„Í9°ÎbQ,Ã܆¸Añ!bÝÉ¡XÏï"¥Ø\ÍF”L&È$ÖÞ%ôJUd}j½„¬”™`Ҏ⸜w–g) *g` êf·ê,Åò™DÜ`c ;Ö]L£{ê¥/P)nŒf߃AÊÍdÜa;Dc[KæaÍïH—ÑÁ“ócTmæˆÅ“PQÎÀtâRz÷`©¹A¹bÝÅÇKÏJûɘQÖ—"`bZ”õ5nT…IJÖ$¤VHÇ?*UÑ7\¤—ÈXô,…Aë2ÀèР »ê`!.ÝÏJƒ¥ \ô™DzVSº²R,u,õÔ«UÝM›äS:1è°iÈcBГ¾@íPª¢$,y– r–†Oj¡ª³Tûv!}[ˆKé݃¥ \Ô³(>¦ý×ÞßË–`w“…QK¦Sû¸¼e:úw‹_sÎúnñkÇ`|µøµÓ³¾ZüÚu7/~ý`ïòÛ¾iÌÉžõ]cΥ㑾iÌÑ?ZòÇ9Û˜£Rò£:Û˜£?ù½Wjÿ~Éb¬Ýû%Ù³>¹_rÉhPw+ÎÞ/Yþd÷~IǺp¿ä’—ï}œ¼_²Zaï~ÉüÛÎÞ/Yÿdo¾¤tÆRÕÉù’’¡»ê¬³ó%kÏÏÞ|ÉšÑÏÍ—‚àKF\gçKÊðŸƒù’凓ó%ËocOpg¬ørô9÷qéjž;TrêYYUlÜFÇ ŠÈÅ+ÚÑzÖF¨tJ±KE÷qñ~–糸ì%4‰zÝ[ËõüÛÔŒ}ܦÌhŸC¯²™ ‡p"A½*°V.¯È܆ˆ(±†¢xMÎoLðRËPéÇ% Ù‚¿º3¶ºd!ì{Òý9Ï7j>‹½ºœ"qü#Þ·ú'ÏÐrŽ;ç=“¢©<'èaœÈïÃoêg0±fP•ƒ'ªg-+$ûÀr²©¬Í÷@oˆßT*ªIo¢æƒu?ËóYxãÓƒ§Il,zÖî|Iç§Ì—”.öq}0_Rr¬:V?˜/))ŽþÆqý=_Rºˆ¸>˜/é=Ka°V"aSšÑx¼ÆåÉ-2œÞBÚÔ Â×óþưքÿžiœð .Öÿ)Žd×äŒeØWì·f4·Ya¾ãýUÔÀ¼ü|½rÌû9 RÜôEÀ£Ïw,ðÉ÷O9_/üÆYEûÏý®±[ë“ȳ 0¾ v…Á®ø'ƒ]§×ì:öø«`×Õ2_»ÒyÉî˜j÷ïìOÿ|ÓS“Ãë/Ø›^=ëÜäp÷ƒvHžî>hÚhtnrxÇXš>œþ‡›”±Ë—±OþÕÎÜ5ñÝÎõ³ýYÆ®¿íÏ2¶÷¬ÏÎp¦ûYâ>Z@òß0ÿcwÂì^óîüôƒkÞ™u?8°¾üð÷õE¯ÿûÀúòtþ>°¾vMüy`}}«þ<°þÃáÿu`½‹ñûÖ+X'âRz÷•9òoû^²|…Yä“€J®6Ƹšà² hÝ<¹?Àï̳ûí‡ë }5½&Ÿná§×ú¯Â¦oPðTî†ñÅ¡=PÖ×ZJÄo«»ì1ë•=+é§ÌYFƒãÕÇ!â’铨pì%ìü½?ÙÇõyzV½”¹üÀ%”Õí±³´úB³ésxij®n&¹ÿÿÙû—,Ùy]ˬ³Ö‚;ô²WÖòYÎþ7')ÑEÌIJî¦m‘7"Î)}:¾]. °°ðº‡½~NïGÌägÃÙ™ïì—yajÝòŒò¨i™¢vE¢f…ì|–‘ B÷ûkxt"Ù4Kq A°—“ušÜÇ|–µ„"ÉŸýY½DõfþQ$½ l± Ç»®""Ž'Æ‹ç/RÈÇ2]†!è£Ìªb|½0í‚D󀦖4‹fÐ>Ëõ;Dƒ®2Pœ•aMÈç0T,7`\BÑq5“/éKš.Fj EòšçÊ#å;T¯¹¾g†ªHMãųúÄQξ=wù¼ÔŸM4Ë2ïÕ…® <§?9@ὤfÑ Êg5óɉ/¸J‡Aqþ ØŠ„Ñ»k~$z‚`OŽ•{÷–9Ö`XK(’üÌcˆä5¢ ~ Ë…m[ý›F’?fÞúÊôgî¾§¨Z“õ¼IXÒ¬j[Ÿe€a4¸há5B81Ád0rðòbBùQ箘P1Å˨Mq‰'/qɽӗ´]ŒÔŠdzGæîµ¦¢>þ…’*V{Ø>‰Q’˜OÕ…÷‚Í@5KfP>k@¿ŒÑ ¡»ë¯U“Á¨tSÁH3zØO9.*±•ñT½¿@°—Ü»¶Ì©nÐZB‘,눥ýâ‘5ã#믧ØVãÍ@ù¸D÷.¬^³hå³0ˆºßš8ËA±Œ&_"Šês©OiGs\âC\ì«ÉÿŒK‚…¸èÞíKT‘+-‘H2œªÏZÇlÇOs=ÊM3„%ÍÚÍ`ç³0„ ÝgÕ ¸c0D7‰$‘›…Ì\ˆ$5L°e*ŽËÅòˆÞ#TÜžq‰@0—Ü»}‰jÝ¥%ÉZR«xWÉ× KšE3HŸãÖ¢AAwÆYŠÉ`¸jÂò‘+Ö=[øy޳sHη7ð­Éq5„ 4^¡{9½6—Ý»>¢û³øá%’*¬N³lé³t(„ëAêâ,>1>°äeßxü-…F>I“/AÏäãf-q\#åÃ轇Ԛ !.!ïÏR–„%c·›ÁI€A4¨'гª‰îŒ7Ízà ’È>P>Øù,Ú·*’.“â| 훚M;‚ã2¡"çZÝnç骅¸ìÞ-,j–Í ERF Jg9(Ä©à§åMäŠu¾V>«¢€Ôâƒó¬¢Û„(zט‰ Ð4Ç%p*ØZmj¡.A°W£Y2ƒôYÖФB÷[ê ÷Å`xç ƒ‡ ̺{~âÓ6ùȬñõi¢×YE/PU³½Ö­!P3í(ŽKaŸÂ*Þ:aI³€¸ì³ 0„¥%I Š[C´¹AïUÓéŒJtlZ?jäÈq\"T,,iÍ @0—Ñ  »ç`HK(’J7m"!%ŠJ¬»wž¸ÂħH²fÊj0Äï—CÜZO¢wV‘›Ÿ•/©b±o E;Šã’fÉ Êg ` qɽ+(v£´„"©DnǺ‹üU>K;O<ÿMùÕ`møQ‰„ÒÖÌ+ñ£–ÄÍéNa)_²“ó©– }r\N` º  qɽ{˹Ak ERS$?ÏÆ4Ò*Ì7óŸCu «›œ_@ö_i"%œ_`ÒI‰Þ&«x&,i–Ì |9.£AAwÅYŠK‚…¸äÞt£´„"Ù“m¦X ˦Hùm îY¸RKÀüÜi—°M~.ªú•Îu¢—YEk–ò%ôY ,ÚQ—Åb0D7‰$â²{wºù¬c-)ú ÏïU}ˆj‚•ÅV~û´´Nu\ÎokØ%Ö­5…Lô:«È– 2ˆ½ô›q9®fw®ŠEÀ :.ëNÄÕ”«¨å-¡Hö‚™®ºÉõUnÏêCv‘¤á¿N¦\KôÛü=å:µfP>ëê”ërz¦\oºpqÊujãà«S®S§%íHrÔ÷þ9åz«;<þŸ*ÄÿUˆ§…¡Çý%©5ëbIñ€Gý%7Å·á£þ’‡õ—l¿s±¿¤<ÛQÉ­E\ô—¤NKøá¯ö—¬ws™¶…EÍ’Tiê¸\4Ä ‚zF`f0”UÔ‡w¾¯S$Êg‰ã"¡Ò¤õUƒ¡¸D XˆKî]û³Úþ¬ùX${ü&ÕÇŸWÎSŒM}<ú(oFè!œ(PϬ†Ë©å6DD‘5Åk>¾^¤– í¨[+á¯è½>hê^A/§×æiúÕŸE-ᇟÞÐíšRg Ïk‚ÿî/éë¸Î*T>é/i³Š¿æKþì/é8®óèýƒþ’qû’úKÖ»MÏ)Zu-ƶ(þ¨Ö8eÿ>kŽH/_€SÍÀ.øøõ÷C>/MÓ~ÇNײ`1}þØ‘Æ{D´›Ñd|ª×:-&ø·ìBkìœÁ1¦ì,X*=ÒÓ®áT˜÷ëMÉÅÖ•û2Üaýƒ\lö7²?ØþgÉ&…×ð )œ‹äoc×£ÁoŒ]Ë ~gìúLñ7Æ.µVù+c×á·OÝ!ŒH=Xø³sx3\‡È®Dm×:‡o§Èî æÏÎáÛ)²kó2Ÿt——;Bv=Kðwçp¯Y­—9§;×pnºð͘„ínœ‡ÿÕ˜„í‚ÓY¿“P³Â¾“p Y§c..¸Ý¾ÛáÎáíM/î.\ÍÑÎáíÖwÿd voÚxqçpAG;‡·‹‹;‡4KfðlçpuïúÔ.·ÌQ$3¶¾×Á“õƒ¨?‹kh†µÀ£^d«ˆâËc¥Ÿ°–+0‹ŒçŒ Qó îifÇ[¾y—åu~u>ùª¦ŽØ;„õz¾cêÉ{‰Ó»¢ÔεYXÖ,¸òY¿ .þŽ|I39É-s1u˜Þ1OumÉgw2){—¿k"¢œV¨äÏ 1UK‘¿Î¹©÷ŸfC^OopP:k)úå¿ó˜Pø‘]uüÑüÁá¿î¡§–5Ëóùœÿ¹‡µ4<Á%N6hò WÛ D‘do•~#— ì9°Í×szá’=È„ ýYYŠA¹Í,x¾kuS6ÐÜ–öˆM¢k²è† ó¸Þð×ïw­S]S>„y¼ö.¬V³l=ßRùS¡Áº÷"Q\²ÿN‡¸äÞéKÚ•fj™Ã¬‰ìŽ#eºzä€_Ì.{Të4bõÆŠQö»=`òü>÷ýý Kþ:(Ç›"ä™Þ¯Øí5ÝßÏ?qRäÇ…Â’f…ì|–çÃjä(¡»ã¬Óä*êw‚…¸ª{—/I­ájZæ(’5¿¶_¼ŸQ²u…«ÁÄÝ|Fcàë!és-&ˆ[OC\ä#V}VÆ×#WUd‹ibÝÓ3p¢„EͲ”ϪãÖ¡ABwÅY ŠO£÷†ˆR\¢É±@\vïò%^iæ–¹©êiÖØGT%O÷¹ئH³¬ó3Çüë|¦*FZeÜ|®G¸S\dlÈiï¹V§Y4ƒöYBƒšOî‘×*©"V>&Tô;?q=Š­8¾ Xˆ+Ü»|Ij WÛ2‘dçQœ=ý“ ¨'÷”øwüWVŸ!$÷溨'÷Ëäÿ®ØRÂ’fU3Øú, ¡AB÷f2Ób0D7r\ ëÁyOž\褂àqɽӗ4+ÍÜ2÷¬“c_ÙvWøÊ_$Š]ÅËý ó;ßkʾi?!¯‘UG–4KfP>«Œ º+Îjöch×N7uÜà)íhŠŠ©2OþW¨Xã’[ ‚…¸ª{—/I­áRE®D²ÙšzñˆÒ“¨ßdªÍ@hî*¬N³då³0ˆºßš8ËA± ÷/B¬Dn+3Áõw:Ž‹„Š£w†ŠŽK*îÝ»}‰ —´¤Šd•Â+Ûú¦¯ì0B³Ô DaY³v3Øù, ¡ABwÇY5(î ÑMêÿ‘+Ö½Š$µä<Ç´#9® TnŒÞK%L„Š—ÜZLÄî]¾$µ†K]$É{YªÇh„EÍÒÝä³øFƒzjÅY ŠÅ`ðë˜ä5ë.)œçK,5kq:+Oˆ ž*‡Š:‰õŒ¶§×î]'^º -©"é4ËfÚ(=¥‡nwZ¯ ˜–¢¡›`]¼ÉöMVì8…ÕÙ7'µù Ö­rØëÎ’WßZù{ŒêK:/#Í’Hä³äÍ„égÉkÊŸÒÓš´w&ë®âå³ärγŠÂΗhs ™àŠ]ZTcBEHHIè©âªqYXÒ,›Aµyï"éР »;O‹Á¨x´Eª&r…n‰{ϪX¹CÑç‰Þ¦ Ÿ;9¹yÓäüŽýoMT`ŽK‘D1ºè£Æ%V¯Y4ƒòY^Ðé–9ˆDq–"02¦›Ä *Ò뮉òYN>*SÌ(ô4÷®ø´Ùi«ÍµÊ—0vfTñv‰‹PQô.aI³ªì|–†Ð Wš¹en®±³ ÑMMç ù1%•CéòYJ>¶™bÔÈ2¨"é˜![äÍÏd˜*÷Ô²RÁW݆†ÉÇ%aI³d峂…¸ÄÌ)ÎòRi·ÌQ$äÅŠuÓÈ|–ØIó–N뫎‹”Û/**‡Pî]óð•UT ‹ù‘ób‚«°zö˜fP>KCh°‚àqɽ˗˜'wËÜ+*$ź+E"¦Þkh˜)®¼—p~Y„ã¢!ýN—­ÐŠe8œUDV$ò%™h–²/òYÎØ º+ÎâÝ$n°É@©eŽ"a>K™.÷gi k04GPQé·° ž$ªÉ{™1ÕéÍÕ\»°zÍ’”Ï:G\Še49IkÔµ?ËýY¯úAñþäÐݾÌ(›Í‡Í;º|ò¹û–?uµ!oU°æßL£rdÃD¥{å¿qÆ¡˜ü³,-¼ÜêDîsÈ¡kÔ`PXÒ,mµÏÀ 4NâÒä1®û´áòþ,õg¡vEɽ›³Ž‹åU{Çž3˽ò BôÙ<óÝ£Ø*‹àj"ƒè訚à3^BV>‹!ðÁë…‘þÀíYƒq·Ó’dÝ©Y2ƒòYÍtˆI™UxzE`šÜÇݬò%4\Íþ,÷gÝ# WÓ’?ŒY¸÷|ªD>0g.‡"Ø“ò˜PW]XÇ,"—óýyNË=‰Ó€ôÚ˜?=;‡ßõnã4¡¼fö7¾O4KfP>Ë;z…?= k\R²œ|IÄ%÷^}Ig¸´?«éÏŠ~'ü5ª5‡9QvžmCÔ#=sŒ”†”i¾Öe‚L_÷ÈÆfý s66Ñ{ùƘÒigaA³Â v>K£Aƒ§qÖ.’ÍZ2\v›ã`!®êÞSëKd¸¼?«éϨý½”f‹e¸hÕÌ(üxOQ³ðΞ)Šÿ׸ þÎT±å3ƒ ì„æš lû f  †„EÍ’´ÏªãÖ¢AAwÅY ŠÏ QšJ³Ç%‰ øÖ .»÷êK:ÃåýYMV\¸HMãÅ0?§ÑE"2;ŸÞã‚*lª0Î_4„ÕiÍ }–†Ð`…îmœÕÌ''íxÊq™=öŠjîW\BlÄ5£ܾ„†ËZÒögÅ‚§Zþ¹JA›–á3糚sþθ  xÈлJAÂ’fU3Øú, ¡ABwÅYÞ÷îáO¤›È š5Å+BEËß*îqI"¾µˆKî½ú’Öpy–*rסæÁ‚²°Z+1îã+ª³û©µkÌ)…eÍ’”Ϫ£Cƒ„‹ÁÐ<.“ó‰)^ññâ¸*¡²á7Dï— qU÷ž_bÃ%-‘HÞK”jDËÂÆls3P>aص «Ó,™Aù, ¡Á ÝoMœå X é&HS¾äœœ¯LpÉŽa’š8.*½ßšP1â’D|kÝ{ø’Îpi»HÞÙ …LÕ daQ³ªl}–†Ð  ;㬊;Ct¹A¹bÝ«HR+ý3½íÈ?“šèÝ¡¢^N¯Íâ®%ù}^}xŠÄÂ’fÉ Jô<Fƒ:Hг›Áà57¨C.Ö])’_RXjv$9_U3Qi[un&ÀÆ¡šDƒÒš!™'.íÏR–Ì  ¤L'j˜Û.Î’‰¦ñ6Ý$ƒ_]AǺ«Uù¬Ó¬b“¯×æ@º69=ÑŽ££’Yѻܮ2]µWuï©5KZâžb ¡AAwÅY2†8?âEäJ d~)ùÈL±ñµ`ž  ¡Éù•0/xAP*‚­´ê&‚àNXÒ,™A.íÏjû³º Ôî›Á¨!BÇ 2¬0ë®PDù,N@u¦X"Q0ä0iÒ~ÀåKŽ)PcgŽ«†}åÙ½+TT\"Í’ô|K ¡AiIÛŸ…½Š`0L7)ÄVðͰÜ)峜|T¦˜5Lçå•fH$ n-5!ÒBt†ˆŽJlþt'GŠ3m"BEÂ’fU3Øú,#.¹wAwÅYÞŸÕôg…{%ŠJäU¥µº|–¨0gŠ•Ö'±VE’Z~T4 KˆKî]i}.ïÏrJÑšf ”¯¹°mŒNÛ¦°ZmB^‰Ò: ‹š%3è>åÞ‰ Ýg9(ƒ¡ÂCqƒâ¸Èº;E¢|–â`R²C¾Ä†Ëû³(yzË*çOË´»–…0·q]Ý_R\ÛÑþ’6ÎúdÉ­%ç+‘Û±îì/Ù„u¸¿¤«Áø`Io¸¸?ëêþ’õ⸿$ +þèÅþ’íM/î/ÙDrØ_’Z"÷ƒý%·á¬¿$5Ñû'ûK¶‹Ãþ’Ôù’¿÷—lþ°¿d½ÛqI¯Y÷—ôhð¼Žëïþ’–ü%«øAI—)>å¸>é/IíË#®úKR§%µ¿äöÿü¿ÿ¿ÿŸÿ×íöúÉîEP¿š­°öÙ6…µ±T1G–ªòO0/q Ryåf@ÇŒS ÷ßߘ²5Eò+CÖê×VE >tí3¿‘”n [×?Ú>Ž4^!µ/§×®äèSÅG¬Ÿ7uþ‘Üã°=,¾¯n¿Û}amáˆq÷yavbÁßy#ÿûºQ{“M †+/wŒ€}.µ—á>||=Æwµ ùÁ^Õ€ä@uzCKüN64‘Š]¦HÎÍÙåVÍš0‚"İYÏö~b™ø}yÔØr[ë üù@†&ãfRC5ïóå)–4K†k×’^$÷cû²?fd' 8ÆS¯cân÷g„++,‹¬Á3ŒõšÈ©hö•cÆúX§T)ŒÛ_Ïe†}˺Þ-¿)æ6Ïsõí¯yh«IË"ÅûΖÒó„lr>£¨ÉÌ¡X„lÙ¸ó‹˜"àgH¡ «Ó¬s_"Ã%-©"Ù¤ƒŠ`¥gð`ÓŒìøœÁW¤¹ÆÕ2ùô×ï–ihɲ„€_÷Ç S_1"$«Ì}ˆ‹û£ÚÞ,Ÿ÷€"«fÕÓìõ1Öwe¼«|ò‘ ߘƒØú¦OŽÂZ ?HX¾)Þ8à?2Xâ»IXÔ¬j|¼Ù³¸m¸fÐeIþîX^?- {ç˜ô²Î!Òò‰y|¯q~£*Ǻp9òóoLu[§‹>xFè±²r|Ù™…}›ŒÊ|À¾ÌV¾sTåß ¦_e„‡½_;K»¾i>nÊ©„¤Y2ƒòYçˆKî]¾D†KZRE²EëfmŽˆßVVCÙÖ ¢Êg‰.Ùu6Ò¸ß-ŸÖ)ĘƒËj„²Hb*UŽïcÈÏ*¹°bëLš¨äÉ"ôg ¯<³rUR’å_?…_È磲C+©¿S…Õi–Ì |–Æ9âªî]¾$µ†«jI'‘ñóëŽæ…i¨]ÖŸ ¸2$€Ò¦ ì²á ã?tL<}­[Ï«.䊟<0l­þ™Bžq®s@;…ÊäØ4²TY@°;ù³¡(`Œ„ž„%ͪf°óYBƒçqIÁâ’{—/‘á’–T‘lÏÆ4W6bQa3¼—øð÷5©ŸwžˆÒ^!ÓuúhÈg òmWzg0„Rºg {-ӻ榳9Z› –4KfP>«Œò àrÝg9»ãP q…{—/Iá -iE¢rþ 11ë•£õˆe3¶kd{nj5Iõÿ–«˜²Ü጖Zq·N7ghH­æúL0iï×€*£]XfÉ Êg ` VèÞÅYçÑ»BEÅ%wˆKî]¾D†KZRE²=;²ÿA "&½¶Qc¡2‘xåZ«e²°To?^cŒu´#ô4êlóy_‚L¸&aY³ªì|–†Ð ¡»â¬Š;‘ˆÛ¨Ñ{jCÅ—ÜZ,ÄUÝ»|Ij WÕ’N$6ùö@B<ãƒûR˜Ø”‘ÿf}í†~½Vf 0›Á@vÃ=÷a~"2¢°¨Y2ƒôY0Z4(è®8ËA±ŒsŽË„ £w…ŠŠK*î—Ü»|‰ —´¤ŠdûnÙ †ÿÉG¹>Ák¹‡LßÃ=´ä=M!Ó×sŽJìlDÂM­×x¶]XfÉ Êg ` Vè^.g)(ƒ!ºéœv4ǵ*ÛŽoR`¨Xã’rÈ ‚…¸v÷._’ZÃUµ¤‰ uײÐÏýûJò„ÙxO‘8\ÝÔw£°¬Y»ì|–†Ð  »â¬w †è&qƒçLp¥{ŽK„Š£w…ŠŒKÞ1•·A\rïò%2\Ô’*’M (ÏÎt¨±ó;ÿgèBö´46¢fÙ ÒgU€±] º+ÎRP,£ÒM??!9"W¬»Éù .ÏFÚQ×N¨‘üDïÛÝ*Ö¸¤H ؈kwïò%©3\»–ô"AsI¾îñÏvah–Ì }†Ñàs±g)(ƒ!ºIÜ`%r;Öý<_Òü30ÁõÖÇåÇуê—Ô×î—>•>"?¯´$D’:aAŒ°Eo€a4ȃ¤#ÆÃgCt“¸Ar)Æi'PU³Ô)`£šPZ©ó®è2©564(25ÕÉ<¥Æp5Â’HÔIŸUMgeneˆi¢Å`T³ÞsƒrtrÊggí¦äÀäÚÈWwØq\v¡t®r»ŠKª«î—Ü»|‰ µD>«i5&ô(\aP,Ãà‡°H€ÉPŠ)å³Ìν‚yn;4,u†“š„ œnÏØ\`@+¨+laY³¦8½6\‰ »â¬6ü6€B +ĺ×P¤Ëg)|Q`sž{¯aR—UThå Ká˜àá:ŽKaŸB…Š–4«1ƒtïò%4\ÒÇY Š.+Vˆ-"W¬»v…ò òþ+­¯øÔüi%z•U¬¤ÅtFêˆP "GL›TBEÂê5KfP>KChp÷%]œ¥ ˜"iϬUǺ7´ /RaÊWú¬«Á8¯PM§Ü{¥öº¬¢é@…¤ÅWڱ㸤YŠÞå³04(²î]¾D†KZ"nP@¢xEþšö2°È›dý,bú¸hèFš;µ¸¨q‘æ¦Ógæ$v >µä<…eÍ’”Ϫ£Gƒ‚îÁD\d0ª/é¸A¹‰R$ÊgÕ´J—)V*FI¥o\Ýt^Ç¥¢!U¨¨‚¹÷šŽê²ŠJa)_"Í’”ÏÀTô®8Ëq  !.¹wù.k‰òYJ>*-©„¥R™*˜Qu“£ç¥uJ³Öìvë=5»ÞMI[¥s•è•°¤YÕ ¶>ËChPÐ]qV Š;Ãt“@0—X÷êKº|–’‰Óú®Á0A‚E*PaÁ/ÕŽ{™BWÇ¥Ò=¨BÂ’fÉ Êg1_b4(è®8KA± Gï?ŠKĺ qѽۗÈp9­Ï ̨”FE6*¿Q‘§êC\_Å2©4¨ IXfÉ Êg ` tïâ,Åb0L7‰Ü£÷ŽuWŠD ˜ˆË™âêKj0P0c‘°Muƒµ|­Ô¿±"÷´&Xerªv¬¥u]WSŽÇ ú, ¡Aeg)_"Ct“¹Aq\"T½+TT\ÂL±—Ü»|‰Ë2©%ªT‘§Ê?Uz\¦]$u5.@µ°T´ªrVú¬ 0:4HèîD¯‚b1•nê¸A¹¤Íq1ŸU£÷.SÌ´¾A°—ª›ª/I­áR‘§EÂòiÕºÿR9Ï2mÕ»´[ÕŽôY®ãRÑ+Tg9(ƒ!ºIÜ ò%fÝÉ+Ÿ%ŽK„Š¢w†ŠŽKTÝ$Äå¶5 ÈpIKXëîÆ„O›ŽúK:Ÿ%€qµ¿¤c0D7]í/éòYúgWûKúê&…ŠûKÒ¯†ëjIjuΕóûK_{,/÷—$*F§2WûKÒpÖ_Ò*ú'ý%‰¥75ûKþЬ‹Æ®¶oŒ]÷ݾ2vL¿2vÝyûÊØuºpÞ…e1Jî¨ãºO#£‚[ÏÙ›ÿ0?Hß<×­—õn«{°ÑJި𗠙ïhŒ}­ñmdÿß/äXtqG«±n [×?ššÇуÆ+t/§×®$µŸJ±~ÞþÃËp ¿ñwšf Èž÷]gL#š×4M}¶Ç=0ùcýñÚÑsûîöeå›GŠä³‘_w,¯­Ã £Ôf°CÊ0vÿUf;,O0éôæE~RÐgC¤.òËQC›!upv󺦸þ³a¿sçˆk ë¼WQ†KZ"‘¨?kD?à”_"°ÿ€'ÇqëFè*ÎvÞïÈ×ÏùH¸13òÃ]žëìªÈg½b Gö 3 ž1;teéP¹8lcÔßêÖÏZ·¾?kìœÁÂvŠW|Þl¡ƒ?Èg*àqÆçŸN Nïˆ]à°¨Y2ƒvÕ»Hú8Kü5§ú’ÎpU-IÉ&R¼ó0`ôÚ‚7ͺè):oç•eIÎû›Ät>ר‚!¬ŒqâŸSå¸^ù_E²{y<‘ˆc:ó8`ÈÜëÍöÁ×Ï>|ØÞV§Y2ƒòYç}ïMþ‡ dwï©õ%2\Ò‰Dù¬ûc¨sÿžëðݰþ¤t–;x± ðá§xêW¶{ÑSüd‚b]ì>kžÃ&æ4ê<½0>xŽ8+ûL¡É& ý´Ï…Ç&¯ ͪf°óYBƒ§¡b“?ÕïqɽW_Ò®ª%‰"ù9‰ñrk±GDïïê)–g»ìòj?àšßFÔ;Æ}¼ÖtlÈçN˜÷ÐŒ:ÑE’ìÿ¥'ùEã[ox(,i–Ì |VÛÑ  ûétˆ¦þ@¿,Äî=5¾D†KZb‘¨#ß+rmË2âÊ'8Õç:A¥ŠdœÂ}dP¾Ä?{Ť¾üh ZÃ_1¼j­¬cõÌ?ÉöñÙ «Ó,™Aù, ¡Á ÝÛ8ëBÅõ;ú=.IÁ·qɽW_Ò®ª%‰"Ù>•ª›^#ºU†Åp ¦ÏçOYž¬ñlùTE-NvS`æ–R³ã“Ö›×g“°¨YÕ ¶>KChPÐ]q–#ñsŽ«©ãï0TT\",ÄUÝ{j}‰ —´¤ êë³bßf6-¨uc’ÕZ eXã{¡‹]ÌC²°¤Y2ƒòY`thPÐ]q–‚b1U$=ë®6!ýÎc< k\²ÝmÁ·qɽW_Ò®ª%‰")_ô´è“øÎšUEŸª¬ó»¡ŒäD8ž_Ø_´£â…I”®}(.±°¤Y»ì|– —´¤ â¬u †£6Ås$rÖè°Ëg)¢t¬yVáù!úE»Žƒ÷y»›bç=ª.±3ãmFâŠÑkôÞ Kš%3(Ÿe÷4(Ã¥8KA± qâ>¬»9²+â]”)6Ws6µ™¿ÃÜ»½æ‘v†)µÜ“X)òU¢ÍqUaõšE3hŸ%€!ĵ»÷.Î’á’–H$äƒ5lY÷†i4Édž·ÜͶã—¢!ϯâïT¶5µ<¬Zs·;«{kùÞʧNXÔ,*òYDƒæ¯…¸èÞÅ`Èp‘‘kÖ]|¼òYæð™)ïïŒsçu\žÿ¦ü³Êc(ÑëÜÇžIm¾DÂ’fÉ ÊgU€Ñ¡ACwÅ%ÁD\Õ½wÜ —µD"Q>«fººL±²cÊ›©`ÆÕM»HJ•G7+™êüŠE”¬ÂÔæ•UT KšE3hŸ%€!4(BÅq–BE1¤›„¸äÞɺÛp)Ÿ¥ä£ÇF2‡ì æ]ݤüö/Ó´9Ôùí9v‚¸B…vçÞ),iV5ƒ­Ï2ÀtwœõŽíMôÎPQq‰@°Wuï]>K†KZâ´¾j0öꌾº‰®9/@Õü^Õ‡°ÚDu(µB¥–4KfP>‹),£AAwÅY ŠÅ`4„ ¸A…ŠbÝ•"!â²{W¦X†Ë5ªaR3ëžT7èúªó™óš­ÂP–Ö©Ž« «Ó,™Aù, ¢Á€î]œer^L0é&׿í„JǺ+TT\BlÄUÝ{_ƒ¡‚i‰D¢þ¬½¢p“‚êOË´]LêúÄ{츷°¨Y.¢ÏÀ|+´â…RXb0LΓtý(9.*Êg)Td¦Øi}!.¹wW7©†–uƒ*òlšÞ'µîÇ%שûoJ®;4øUÉuÏ ~SrÝEâ_•\w~á_J®«H¶ïvqIgå³®î/¹µA±Œ«ûK¶‹Cr~óY÷—ßx*nßíâþ’sÕ:-ù{Iù£GûKÒp}ÉvëÃý%[|zqÉ–ì/ùAÑ—ö—¥=Ú_’†ëûKÊ9Ú_’†ëûKþЬÃþ’1v©µ_»._ÿ•±ëØã¯Œ]Ë|eìR«%Çmª€;‡K;‡»cɩݗ;‡;•ñ É‹Ã:s¢ÑåÎáÞÔ¨¿þ´søCáž”Cdwûd—N‘Ýí]:Ev·@véÙÝþÙ¥SdwûÙ¹|bͶ ¤D¢Í@êÏʈ D2N1»)߬~ªu_c±û+1®û_ß½_˜ç½:îý»Íï 3ŒY².Ý ez<0ˆSSô;ûºuý£íãøAë+¤öåôÚõƒôŸJ¢fYçäK4ò€Zb‘p–b³ŒcâLïGl@Qñ}ݱXåðæT´gت ÒbÖÄ2£'åž/ìÛ€þ’‘Ù4k™aW8WïöŒoðbðý—€yÏüÙk¾~ ±1we˜›Qæ“?ÈËv§‡"Wž^‘=çˆKÞL¾„Ý^½E¢A'ä×ó¯ð~³ÃåŽJæyz†A!ŠžÞw$z1ôg%{°™îþ³°æäêE>H¡sÙ „´³ÏB-(ê‘ÆaŒùHk>’'oN÷š°?ë…ÍÈùƒDO±„eÍb€{‚gi>’| õÔZ"‘p–øÄ w‚üÍéß +ȸ+h§WÌL¸±¿usïp,oä\_ÏP–õ'c墫L—i‰ÔR>äñ;Ú¯ÏöAºÝé“î²ËÃ饰¤Y2ƒòYç{k¾˜š^)új¸R§% ‡s)Ÿµn¯ù¼QŽÓPгàïÓŒÙÏ9ØD ß„ÌГVÍ š.ãâºÌöô¸S>±ß=Ë\ô#»Ÿx¹|FîxS¬q¢fÉ Êg9Yw¶ê²õšÏä`ÑÓ—TÃÕi‰DÂýYέ;`ýáXæì§qÍOtn=Æ1ø·iA)Ú<°lš³Qe3*êCæqŒ<`†×ñyßó£|>&YXÒ¬j;Ÿ%€áö³í£m2Õ|KåO‰¸äÞåKªáJ–°eN›Tƒ1S$iæ;¸è¬Úp,kf¦ŠdyªÂc0§gˆ>¿Í=¬åô´ž1 êC†;”ù$,i–Ì |V· 6Å"œëLá2¹ Å%ýÀ\Ü»|I®^KÔ2ÇýYªÛÈÎ c¥ç,Û‹"yÆ~÷ü7‡˜5‘<êß/Ü5YËýýFGfþVaµš%3(Ÿ%€!4èxÁí;§—¹ ÍWF·W#z‚`!.¹wù’j¸R«%n™óf Ô æ›kß÷¨Ü¡Êçþ Ÿõš1’/Kt€€G–e¾pB$,jV5ƒÏÀtWœÕ´ïœÑŽ ëÎùäêöBÔæ¸D XˆKî]¾¤®NKÜ2ÇýYmçIø’ŒœÃ3½G”ù¬S~£äú1TK¾j>ˆ„EÍ’”Ϫ£Cƒ‚{Êé&kÑŽžïOBÅ¢ßCÅíÙ— qɽ˗TÕZ-iZæ¸HýYØÖlücIVúX|‘ÝGèiV¯Y4ƒöYBƒºoŒ³‹ÁhÚwΖ‹›âÕ~ u{IôŒÞk¨¸ŸƒˆK‚…¸äÞåKªáêµD"Ñþ,užL*’÷šgBç…%Íš±1A>˃hPÐ]qV Š;Ct“ÛwÎ÷½ï||¹÷ˈvÇ%BÅÑûs—/çî]¾äS-Q3—Íà IXfÑ Úg P&£ABwÇY ŠÅ` ¨¡Eä’u·Ü&DÉ©ÛK·Ç¥ÇáƒÖWè_ޝ-Ä¥Oe_òŽÑÚ­–P$ÚŸ¥Î X>K‡BÇ¥¤>Îâá3ƒ¡«£,û¦ãšU”}³š©ÛKò‘Ғ㲢˼fÔ ÒlÈ qÉÑ<…áJ½–P$Ú D)Ó)4hs+C¼›èÞxÓ¬‹´+“`ñËy¢×5JaÉѾÉéÙ’ã² ¥s­n·sÈrÕB\rïö%ЬFKÜ2‡ýYî coŸ…±é³0ööY»Þ¿ÃØíâï0¶G\j’7ô–ì¿ÓßMÇEÏ–c@¸©Q¨3¶‡<‰aßOÌAUæÓ6`qÌÂÊåóCÆXÓ­‹úϺèÖõ¦æqü õº—Ók‹sðä¤Slo¦–ŸÝ—¤Öp9\ÖßáŠj¯¡ë¾2Ÿõå‘ðf¿)Ÿw&ifäô²[‹4>À9ä(c̼¿c¢QŽŒ¸(‡2‘ÛÍZ0§ùvà{×äEX—á <ÔyƒV“là´˜Ó¸D[~Œµ¿^¾D†K ú.’M \þ®IPÊg=îK{LáËr‹t%Nù­Q³ÏNô×çsŒEd4!©‘íxÔÐNÏ ‰Ä¬>áržo´ºß#ûŸÏÛˆ5h–4KfÐ{v‘¤z4}ÈõD\ž/¶û’Ô.R¼I~R´ j8¤2ÅÙµ€f˜ñÝîȰ/\–žªŽòOªÏʧ`a0„f £—ù´¦ìÏ_¿ßT_ÀÏ•¦ŽxÁÔS³dÝ÷A€q½7 ÞØ}9F\rïÖ`.w1î"Ù|}6"H(sì*k0†7&¶MŒ![îó³Z¤` æjpëE¾58ÕWŒ´\ÓÛQô_´`<$»‡2«–4«šÁÖg5}š{H¨ÜõÜàÇ"ì¦=ið#j0Ã…´¤Er_wa‡+À\PU7eùD{¥Qˆ|ó3¢L.Û #}E~á‘bP÷7œÑtGYÌ Õg4KfP>˨FhPÐýœãb¸lnC¡¢÷tí ¸C\tïò%6\Ò’*’í»e‡ƒw]78b¦ìãÁ5[ù›Ö»½F ï×8L”\ŒkZsz(åž½°:Í’”ÏÀ0ÐdÊ{NiGqfÝ÷è½Ttp¾²šö¤ÁD\ս˗¤Öp©”¦Yi†Ê+ϲfEîs­ÃªRX–PÀw¶ ¸À\êÕ¦õzÅ– Kšµ›ÁÎg ` ûkjƒ6öœ2ÁÚòcÖ„Šç“«þM¼ƒàqɽ˗ÈpIKªH6]˜Ã76ë-ÔŸ5OK\¼b¨æ:=>Nï{x7 ‹š%3HŸUF‡Ýg¹XÞ{èw&å©4¢xÉqy¾ÿ ¥Vƒk\²$‚`!®êÞåKRg¸Xþ)‘¼ü¤YC]$ïå*ùâi¢*¬^³dí³^Ü-Éf º1"Îr„LÛgNó%¦xÅÇï´cÇq‰P±+Td\RAp¸èÞíKd¸¤%»H6]Xám|x­¡‰þ, «Ñ¬Ý v>KÃhPÐ]qÖ÷ †è&qƒ‡)¬òÏ´å‡ÉÅÚ/£þjpÞKu“BÅwh£@°×îÞåKRg¸Ô² e3,lkÖа?‹w“ÏÒèÙ ÝgñMÅ`øë軉È=Í*JeÜs'™j?Ó~Ž8®'DÂS¥óÆ“XÏhwzíÞqâÃå.Æ`ÍÒj£ôT\u»ÓzŶ´!².îûë~šèu¦K5»M쬥 šD;ÊöÒ*W{ÝYòjã;ë/¿@¾¤õ2fÉ3 gÞLhPPq–½¦ü)=­¸A{g5ÛË£ŸåÞ½åGYE§°”/9/ ^°?«A5 T„„„‘„ž*®ê—Ý»|‰ —ºw‘thPÐ]RØÒ¨óÎYBª$r…n{…ˆß±Ï¨IK2¡¬`H˜Ü“¾˜5a Þ±ÿv¡¨@ñ#‰ctÑGK$¬^³hå³l¸Ü®•fˆ³‰ÁPÔ&nБb@ç$Ô÷áˆò´BE åÞkLÛE»nÚ“3vVT]ãí.¡¢è½5k7ƒ=â¢{—/‘áò´˜PÅ`x Xñ!fJ*‡Ò³+–DFæ¸hèFÊm;!,¥Mç=]䑬Á;÷Ô±R•¯*¿&K—…%Í’¤Ï2Ë&ÄEè®8K†K †D"nÐkhȺ‹iT>Ëì¤xK2šçu\¢¬]÷DNÕlëÎÃvYE¥°Äê’ïÂê5KfÐ>‹¡¢â’wˆKî]¾D†Ë]Œ¬i$ëzqøb÷U®ŒÀyi래 ª9‰.[á¦=u{1÷¡¬HÍ—´™k–hGù, £A‡Šˆ³‚…¸D7‘l ›$å³¼††™bç·Õ÷¡½"çÕŽÜòãOL³:Û§¦=jpÍvYE ‹še3(ŸUF‡ Ýg)Td\RAp‡¸èÞíKd¸ÜŮƙb¯¡Q †òÎÌHW‘lš¥"5O¬f1sâÞÓ5Ä®ÌVƒ‡0vJôJ³hí³0„M;6« À`(T7(,Ä¥‰òY6\Ì»ÒB5®ÎPß+:Îk‚ s¶‹½¦¤¯ãºX˜#3Øe¯æüˆ$³¯ sn|œq]-Ì‘Hþ¹VêpÊuÚÂj–É]rÝU…Ñg]žrÝU¬5-Yצ\o¾þpÊõ­ÁL¹N­áruÓù”ëÃÁãÛwÓÎV³ ^5¬v¬Âê4KfP>‹Ãh°B÷.Îr ËùÒMä+íØq\"T½;TT\RAp‡¸\0#_BÃe-a¯¢7ö|ØÌpØ_’:a©õbIj¡»â¬«ý%KpJÎ_í/ÙðÛi¨xµ¿$ýj¸~I~ü³1þà7ô7J$ÃNOð4?¾úÆí„d#´¾h æÈ,!àcöÙãömÅ༡€«‰EŽÌÜ}JË€ úëÇçëXh«É˜ -Y÷—êÖQxFý[Ž¥¢%kÊÇê¸a@[^ã´‹äwͺjìR뙾2v©å)¾2v‰Æîö­±Û¿Z~¾0v©õ?n?8Ü_RdzÔ9ÜkÖßÃåÙŽ:‡ r¸Ö9¼}ÑÃÎá‚ß®uëºujþè'Ãz9½vê>ÈßÃ.|ºóñbIjÒWk8SsÈ¿[ÙZüj gjÃWk8SëK,,i–Ì |·©Ê¨ÊÜÊÛDïÆ[f=µ_®€NBî#‹\Nj‘Ü”][uzr‡©u”t¡r®v» V=¹BklOÝû nSçÍöýE¯íÞžípçðv·‹;‡ çp´s¸(ӵÅÍ;Ú9¼ƒ‹;‡7]8Ü9¼^œïöÆÅ2 ùÏL˜ÿ™3a> ˆäK:ÃÕt_ãìÊ Ž8»‚j®qvÛ¹>äì6üv‘³+òˆ³ÛÃEήœë#ήÓ,‰DÒÞL'^[¶åKŒ …Òp7ýi½GØ9Ÿõˆ»=Š÷<Ĺï*$3’ Λ{RÖ”+™”Cèbÿg©½n]ÿhû8~Ðú ©{9Oî{pÈI¨ØnN4¨—{×þz®†Ãäÿ4ܦ´Õ ‡T¦xAïØ;Çë‘€ÅTÁ×|ñ,ù̇bd§øzx$âZ“êì?}Åݦ÷íþãÃ!³3‹ð‘ax$Ä(,7 hò%}VIj¡‡oõŽÀˆ¸ª{O­/1­-sIv®(µÍ`#N¯Æ®²cÅowÐ3œ¹ø0yBgЃƒ+YŒ¤P¾–Ÿ›#~2OàÇ¢nc‰•ÎUX¢»a€“c 0~!Tê™·!ÄÕ¬[CþGº]µ$Q$Û×P™­ËÉJW7åÀ¨Þm™ªÌ&Ϫ…§)ÀB>-‘´Í üv_¸”p#8=Ç(W¡°¤Y¶½òY^õB4xÎq‘=nÂe¹ŒK‚=ß’ùSù5–JK$’G¶øh¼P7Èñ®ªÌÆX,GÕ(àFC~‚°!Ï7*3–qƒGLÓ¾OçHaI³då³Ü0 U/„1\6·!"Š¡bKAð­E\6Ä˽},«Z’(’òÝææ›#jê5„¿©©MÙaAÍ;|ðký*Ç€lÏûðî…ÕkÍ |–Š{˵q–Dâp™Ü†8®J¨¤¡¡x*6ëÖX¿#ˆSÝ{j}‰ —´D"yM8‰ù"ªt¼óDýYÙøFÍé€óEX—üÏî)…%ÍÚÍ`ç³0„ÝîÏ8«ÅHÄmT"j»›XCQ¼$Tjô¾]hÝk ˆG¸äÞ«/é WÕ’D‘”ã?¢Ö¯¼óÄ5õ¯µ­ñ–4Ëf°ñYQ7h4Hèî†Åf0v‘”|‰(‘ó¤xÍǓ㪄J±½ø;î½”!&âªî=u¾„†ËZ"‘ä¨<:·æGlÁðÎôg…°:Ͳ”Ï"À0Ü¡{'Åb0D7¦°Ü8B>^™beºÄqy?†ê¯iˆk\Rj¥P*hÄe÷nõkI¢H~lU|·ìzç‰jêw3Øù, ¡AAwÅY¶ob0´êEÜàiVQRh<©å‡7à­›ý2ì_Pô®PQq‰@°×þ©RçKÜXÊ/‘HXÒ,í–:°:Ê"rɺËVɊɾ¹AR øÆFfï ׌bš‡j6 Jgjh„džÚÆÒ{0ffÁ Ê@zç‰kê—ˆÚgÉDÛxˬ«a@›7ɺK$Nžx 1‘C“/Ë1,ÚÑò Éѻܮ²\5x¸÷Ôùi–´D"À t\Ä1øa|êa‚RYgåBÑÆ×BÞ€„† 9ÏêMÙ7AP‚SÁVÚ uìÛ}"üzCj®ª%=$t¨Üg !BË 6a…Š0H©"Im¬©…Jø»:ƒT ­ ÂG¾Ä½—2Ä áÜÕ°¯d<½+TT\âðRˆ‹>˾D¥ZM‘((ƒ!ºIÜ ƒo‡ån`>KÉÇó¢!'üYáºArB¢&DZˆÎ!®HÉpö i*5«šÁÎgqɽº› Úµ¤c0D7‰ˆòβîÊ/(Ÿe*Œ$Ùy—XPò£.ò'jÏëÖ8?Äñ©)D‹¢-,i–Ì |–â¢A!.ÅYò%b0¤%‰ˆ\²îN‘ˆal*™$³j0šê –Ò0¿ "5à•_ßTûÑÝ{)C, ä|«×,™ÁÆgFU¨¸C÷.Îâ¢{7Ý$n°jIǺ3Eâ|–óÛª©ßS1] †Ó7ʵ1 §üœ2wÊé)µ¤¤“ÒQ6Ä{ +5²f‰ –ÏÀ0TôÎ8Kq‰@0—¹AùàR"‘"QòQ™b‹U †’œ§¨Êb_ÍUwÇEý2WsÕϪ£Gƒçªuݺµ½Ÿäª;ÃU_»Ë_-H6)¨Öã›Á¯ÛÝX¡òÕà×ÔŒ¯¿þT¬anÄ7ƒ_SëKþeð««›gñ–ÈZ)•²¾J•W®ÉRi‹†<TùíÝ v>KÃ),B÷f;âz3¤›D¨ˆÈe¨qI—Ïâò&7•ˆi¸·ê{µB«^T¤vZ9¯*DV«å‡t.­£°¤YÒzú,çÞ…Ýg5ù2d‚Å ŠãëÎèÝ¡¢â`§õUƒ!_¢ê&m¢HT䩊Üãþ’r\®õ—tšu^ÇõAIgg?è/éX÷SŽë“þ’®ãÄõwIjµD"Ég<Ô̵ºÜÏ™óÖŸ|ÈëÝ2úŠÃ§E†êj®g;½YQ‘•"bÉð-LÚ;¬KÉŒç9FN<(Lк?Y>0h!9¦ß<^ÑXú^{'÷7ÍÑaèáª'¾v–v\Ìa•CX›LÙ¹¥5NÙ¨GйH\ëÎÆ„¯Œ]¢±»}kìº|ýWÆ®c¿2v},ó±K­–·©þÜ –ew'ˆ¢õvauoÈábçp1iGÃ…Í»Ö9\ŽËQçð¦Y;‡‹±;ê.§÷¬sø_v>^Ý_Ò=›ú¯î/i¿›{±¯î/édêy\÷—tçM5´W÷—tæI½ŠÇý%2ƒ½Ï:ì/I­n[ë/ö—¤Æî8yrµ¿$µ6±É—\ë/IÃYÉ­µñô—¤Ö½[X£´D"©Þ,µ~NÐ 6qäO«§M­–w–ß®ýÖøú@©ÅBÂmÜZRJj±‹P ñŽÉa¤ŠžR‹«Î—Å(ã–{3Šä>/à¸Í[ÛP´?Kú“MbXŠi¡//Ð7§¯=Ñ­ÿư±éðr¢löýœ¡Li~»B¶O(}\i¿zƒ'Æ\-Y¤Af¯Ö®>Û3¦Ä7““¸³{\‚õø qoó–áê´äxÁú&Ó¿¬oOð÷‚õ-®ÿ{Áú&Ÿ¿¬ÿ ‡¿¬o/X/ÑîŸ Ö·÷ù{ÁzjuîûiKÞÒøÅ¬>ŸõͬRÑ ›_ ÀÚîÆ)°_ Àê4ë8Tì¼Ù1Þ3ÛE‡Ëw ŠÍÿ ûæ»E¹@gÐW Šâ(ѵô {³ú©R{®m„ä1. ‹i½¢…¤äh¼e)´?«©Áxb<åx„bÌ hãµï¯÷^8Õ1`ž.ê?ën [×?ššÇq#™&ÇêåüÚûIôP²@½"0‚`!.»wú 碖øÙ–×+pov“ñ 3gÁkâ¡ ¸ïØ¢qŒ¹Ç÷³U)ÜX±÷=&œ=ÞÇæ?gèj—üÐKüQT›è„¨ØJfP>Kãœã¨W¦-?æ6‚…¸ìÞéK8ÕÖI"y¬¼c¸‚çzêýYîÏÊÊ=@$1|}MI¾~½PS’]hÍeË‚â¤lâ©),iV5ƒÏÀ<§Åq1\öT4QŠK‚…¸äÞéK¬õÒ‰$ÿý1ªúçCªW÷ ™r° ¸—Ö÷ÚcŒ­æ'‹§~uŽyü³ w‚_ˆ)$,iÍ ;`½»ðÍAA€îг1\·a"Ьa S—{kžÜ;M´&±KK$’¬À1ì5NB†q¡ýY¬uÏè:ìÛ: 8*³³À>\[V¯Y2ƒôYm¥9ÊšwèÞÅYÇäüvAnC´£ç ŠâEô¡â­‰Kš­yìw¶{§/Ñdi‰D’ß;v‘d¡†Áßê|ê·Ö‚ p?ë¬ÂÁ©JXÒ¬j|цúÄÝgÕ ¸‰¸5Ûb MñŠ'¡¢è½†Š%®çÖ<׿ÁŸÚ½Ó—h{ˆ´Ä"Ɇ¶ Ë%Þã=ì÷g©?K²fÉ ÊgU€Ñ£ACwÆY ŠÅ`ì")™”§Î:øHñšW¦˜—Eïžï¯Z`!.¹wùm¢–H$ùU£>$;ðÁï“å½`ÃÜ0ƒòYBƒ¶oª4÷ŽnùÝtšUlÚ„ÈÇsË[~xq\"TšýDÑŠK Äe÷N_ÂWÒ‰$ÿN(­…%ÍÒþ,÷gá ôlzj㽩¾¾Ž¸ÁÓD¯²ŠNž(_"5“´y|B|vxªxÞtuFuz÷Î/] –XXÒ,éµÑ 6\À Ý–ÖËÈR؆ȺÐîÈ"™Wò„.GÎÈùYKÚQ[XÙ^YeÙkZrÙxYú…ν£×W[¥Y6ƒôYôfòsò€òòšŽOéi½#ÄÞ~û¸âçnÈtÍGÛ:ûê&¡ â3ÁÞN.T#ù # =W qµîš¥Í@òYBƒÄ‰B–.à¿C¤ê!B·Ä½BÄÎtíͦYÌ!+ru†Ðºò%Døf‚ÕB+ûÆHB1†¢Å%ŽXËØ½Ó—022tgœ¥L±£6sƒŠô*:|hÉ"J…ÿžQÈ„¿rï®d´ë8Xùm§P ­ð#qÅèŠÞ×;â Ä%÷N_bÎZ"‘ˆÁ·!ÖCù±îâPv¼Ëy—ˆ5VghËOS÷ôV¸L‰ “·æ‘•2¾&“%ŽË¢f™1—Ö€` .¹wú±yÒ‰DÜ XCåç´?K¤ØIñ–ç¥uªãe­ *RÛ*V ­¸Û¦…Vñ)˜` KšE3èè]\´â`".»w³áêL-‘Hĺ;¿­a—äðÅî‹÷wFàïôÍí³ôMûl'é›Ûgé›^³Ó7·`¦oº8ë8}Ó>ÎIú¦cÝÓ7í§:ɨõ5‡¨·.1úŸYˆÿcg!¶“±?Oéº'OeÉ–Ú°LAÙråÑ•aWî]óß”_t¾„Ùÿf[´ ;·“3(Vô®ÊÆ%ÁB\vïô%ªš–¸Ò‚5ªÎP݆*:\¤¦6!•ªÚÑÓ€Qm¢:U¨¨v…šeK!Ÿ%€á|‰êjg1(ƒ!BEÑ;k~— qÙ½{l$ü‚´Ä5LªnRÝÓiå¼Ë?Y««þ,•É5¥u¨ã’°¤Y¬ kòÛBƒ‚îΗ°bM †è&q\"T½«šÎq‰@°—Óúªg¥Ÿ«›(Õ ~ÐÌP4ë¬LûjIWÇuZ¡òII—U<Ï—|Ð_Òr\¿Dïô—ôˆëÔ—|Ð_²%¼fSþ©Yð\¼¤.¬*’õnÃì2>0í"‡¨Ùæ>JÏïR]ÛãQ=†áÊÁÙñgÏܱ…éñxÅ„ÀûüBùôƒMãYÀ®ÜÃ*¯òAqì4F֫ןkÀ…‹Çh—é}©ý€Ù3Ý“Ÿ‹äc—hìnß»4üW3lùc—†–üÆØ¥¡áž2v©Ei»ã6ÕÂ9\ëî4ËÕÂ;‡‹ß>ê.Ua×:‡·‹ÃÎáín;‡7av§,|Ð9\„uÔ9œZÃõéÎÇÃ5œýݾYÙ†f»åWk87kÉÍ›_­áLÍã|·†3µŸêÜ—¸eápI¯Yï/鎋«…/î/iròÔÿö—ôjv'¿¸¿¤5ž\quIï1^ˆŒŽûK:‘|Ð_ÒaK‡ËûK:ÜK'q¹¿¤Ãä.¥¹Ø_ÒóoÆs±¿¤G\†ÇÉÎIKªHz4HPRáÊ­2‚8Fª„ELJëEøÀ,µM`®Â¼[ wИZ8) Y!è­§^£^íö¦„ºç Xbô¬ í)–7ô HîïeÇ‚êŒl¸°mPC³<öAÕÂFS˜`ÿ|Åö·×;†§eË7µZÆYÀ#æêæC5ÏÇ„ ÖúŒžÃ•hm’ š<Æ÷+·×ÐÏâ’ªsâ2ÿfèAœH-©"Ù4kĉL¶ rŽ™’a§|Ö+£«± s›<ƃ½À¿M;šµæqˆÈèqg…Ê k‡;òsÙT¡| bŽ\‘c“û^QW³úSl殺¤YÒ9Hy3A5‹ÁPöÀH‰¤îÞžšKmØ_oXäáä-WKwã.Æl(¢3hÊßÅËwîxr™ʰ²H‰)ÞdúâÊì)VÎH“/_¯9`Œ…„EÍÒäù, ¡Ás&¸F`ÇEB¥!¢**.© ¸G\tïšo)Ã%-©"Ù¾Ûpǹ~?cÙósá,ëõ½Í6U }å›U ³–ÖòÎ@( ¡…%ÍR뤖K죈hÐÐ]q–"0†Ëâ6LD‰5d>K¡bKn-âò|ØÝ—¤ÖT-éD²‚å8þÓ3àqÖŵ ¨Wn¶9°Zx oÕÂÜšmh–Ì`ã³0ˆ+tïã¬Ó|‰Éy2Á•5ì8.%•áó¢ívåéª;Ä5@r÷)d*Í’”H0ˆ+(éâ,ó;ªæægrƒ˜ZÖý— eº´à©âë.«èR4ACF2ÁhöÁi#rÆ%‚Û¯åKä³0ŒÝê÷xX¹A… 8Š Ýk¦¡Í!3á¯ÈÕ¥4ª{Úƒ®MDÎ3Pkö–³ÿÔöm¬[ *:ˆTxiÄŸU}I‡à*ÎRPLC\ Cl¹®fÀ®|Öy—g’ÅQu†rï•겊"-œ/!Ñáýš;9Òq\"T½›„¡”Ï2â’{×.F.Åd0D7‰ˆE%ÖÝÛT-L*ì¼´îF³Ä2GŒæ® WÍÔo‡<ÍÎgéŸ]e4;C¯pÎh“Ì]>ë˜dîDâÑç{® «ãº:¬Háé«ñ`½f}3l»5㬯ƃI$?±ÌÿÀ‰m^ \³p.RSE¡jÝ™ZrÒ‰é(eµ°ª «Ó,™ÁÆg` VèÞÅY Š ‚¸¼èk÷%ë.ƒ¢|“ÎׄeWƒq^ìº'g±_ÑËãòOæÄ•-WÒV¹÷šèí²ŠÒ,[‘óBƒ„½+Td\bnЈKí×ô%2\ÒfŠÖWÂ_¥ÇeÚÛOöZM ª(Tù§juÕòÃj“Zôð“3B‚²fÉ ÊàW€Ñ¡Áº#ÎRP,£Fï-7h"W ؈‹ù,Õ÷Êp)­/‘¨`ÆÕM§•óÍÄj–ªVW£Ï÷š¬®ŽKECªP¡fÙ Êg9?§–ò%г“ÁÝ$B…Ñ»CEÅ%Êg q¹ýÚ»a¸¤%ªnr)ÚgÍ Çý%?õ!'¨WûK:Ÿ%€qµ¿¤c0D7]í/éòY ¯ö—ôÕM*E;IçBKª·ŒçÞ€·=ŽV§qñ’œ»ÚñþÆ~™uŸwý£àטu3°VT3jÀñÃEƒYÈ›µŠÉJ¾woùŒ½<¯ ‹Ð[þŠÎáçsmŒ[5¤#ÐÓ.¬Q¢sKkœ–ÇÍÜ*›§‘ü®YW]Ú:âoŒ]¢±»}kìÝí[c—†&âÿÊØ¥ÖÿH$Ò’ó6Uí"¹Ú9|ë`ÄÞ9¼!‡‹ÃEÍŽ:‡KVñZçð&¬ÃÎá‚®u—opÔ9\ìÛµÎáÞp}¶óñêÎínìÉÿj çf‘ö5œ›ä¾YùᅚõÍ΢Yè¼ÿj gj}Ióyùá% Kš%3HÑë ôlzêú>Ý›*àà×Ñwó­ßº“‚Ö¤6’ƒL%ízº"–M“+tÞtëíOï©{·y:Ü_ÒiÖûKz Þu»Óúö—tÖ¥ÚÖ"}²¿¤³|Õ&öÖòïý%­U{ÝYòö—tN\±Ìq‰Ì`'’ãþ’Î:\¾Ø_Òyg)WûK:äàRš‹ý%ªapw¹¿dC\;î„Õº÷ùÄpq† ‡ »äÝD.PgÅ£=RU"„èV¸Wˆ¸båE¾¾µÈ[˜\h½âøá+Ù ¨@ñ#‰ˆ1ºèC"ÑO$FéœvÛ—h˵D"y¼gæ£ ñùÈ'7À:£óê峞Q5±®Ø5;?îó…ªí¿½§`©×i>‘¹›§ð2O–j<³ð›±Ü˜câ–û«vT­5¹¾°®=»©!v)œ†ŠfÌl …¸ =„Å`DÎ(D²=[vâa¢çáÎõõˆ1JÚßXÓ…©õ?.MÍgÙËGèB>½AYçï‰:ÕÇðæÃÌÒÇ lk~´AN J(TΙ~óý…âË%&òç¯ñF×…EͲÎÉ@Ú› zqaŽYÁpIK(’×ðï?¼ßñÝ´AE íB·»ªþ¬Yìñ9DñØŒ5Y/çˆ×z1Ö#Er+ƒ¨Òy¬.2å,k$B¦&îï'¯0q—šõ ¡boÆñm'ÄPïÙM—ÁmÈpU-IÉ­ b|DÎÑTR]èv¼Ú ÁÕ,M}ŽCˆ$;0«¸õcþNüÓcÎOÆ“èÉaPŠ­4y9ÿw­6‘°¤YÕ v"9ž£™Zœ(PuŽfj}ÉñhÓN$Ç£MS‹nG›n6Ý뱎6-Ž6ÝžíïѦ·Ö 6ý_Yçpµô$Q$Ûù¦ôd»›V|SzR*¯XýMéIj†;„êyF«AI­õ7E\%ìˆeÿön6\zS¢zêJ¥ÎoÓIÈ"5«ð­³Î†.¼Ÿ#~¢‹ýŸu7°fí´óYzP£Ásržk —Åq‰ˆ2kÈP±Æ%‰ øÖ".­Ç¬¾¤3\Οò}^´!Ù\ÂV­s0ãßYË6V>¤]ÀÒÔqDgP¶üg'=w6ƒòY;À(v”hÐÝq#0…Ëâ6LD‘ãâóñ — qU÷žZ_"Ã¥Ã'‘d\„}Fù“D,“Õõ£C8þõs|x¯¨#„ÕiVÛ¬ŸE€a4øšQ½©8ë4…åä0ÉùÊnñ)^q\Jž(ÓÅP1â’R ƒPÑñtï®ß‘¥Øµ$Q$å'/õbkÄ‹%½ëpÇ0\¯@ƒÍê—¦Ò¾©ÙQ›Ï€ÝgíAq'sÌ×›5Å+>^ɵüì„J‰³":PÝÄ¸Ä XˆKõoò%4\Ò‹dbMãÄ™óOT¨HXÒ¬fu€ðÁRh6º+ÎRP,£Šd³!$¢Ü&DŠW|¼/4#—7ЭE¨Ôè}»P¨¸Ç%ÛykçûûàêK:ÃUµ$Q$EŸé¢hj–Ì }–Q@Sš:ÇYzS1þ:ünb Mñš§fQ™¬fd‚¥š:!õì¤öT9TT\b¬ŽøWdy|â© Ò‹Dšµë\糤§ŽO5¬B›kw{Ð1¶!´.§åîuò„.ÇiIí!´»‡—‘…•í5¡2sµö˸Ö¿íˆ×zÌû±á²fÉ ÊgÙ› šßaœÕ¬`<­¸ÁÆ;ƒu7ÈRòD™.A69ïñT¾DÐE´£PMÅ;Å×{?Ó|ˆn[ìŽxÌLfÉ JK(¡ÁŠ»8KØÒ›Ó¹:@ýYÃv¬ûyÑ3]l"äÙNƒ!…IJa9´9¿cÿM³0^hö›¹òÙã’ԫ툧{§Ï2À 4tgœ¥L †¢6rƒÍêÆ€ŠÏë¸T!)bà« ¿‹(¿ òìÛ¿ùü— ¿¾vÇ òS]æ]RK’}01§ØÑ£‰9á_›˜óãŒ&ælßíâĜΠÊg]˜Ó®¦ülbÎCŒnm>ë|ˆÑÕõó©!³¿[?¿á7²º_­Ÿï|ÖWëç;ã_ÖÏW>¾Ëg)ù(vÿ¼UÛš¥Hù¨hÈ…¬u¯yŒ"…×IVQY‘š/é…%Í’”Ï¡B4èP‘q–‚b!®&›nP6^¬»R$Êg1ÓåL±²cªÁhª3XJú'—Ö1™ª-?®ÕeÐB$zU¬Âê4Ëä¼|†Ð`…î]œ¥PQq‰@pÓÿŽIžò%J‘(Ÿ¥ä#3Å‘Cîj0ÎË´U>àÂîÏr1ËT4¤ÒeØkî=µÂ’f9…åVÝå .`Ó,BwÅY"TÄ`0T7h"×ñª€`>K†‹™bWZ¨CÕç•óêIi* Y€ÚT;¢ÌG@{Ê–_`… …eÍ’”Ïr÷´ ”¡;ã,Åb0*¡Òrƒ—qqvº|‰ —´D"quÓ.’í„ö—lôbÉz·ãþ «Õ¬“rˆÔŒó¬âý%¶<ì/ÙŒêÅþ’ÔÆ%çˆëƒþ’Ôj‰D²Fž¡´£ðöÕi›.Œ v¦rñ’§iS$Kö»À–¯˜ó3¼dØ3* Èû>÷ÂÚ.ع¥5N÷û+*çóaŸÈŽ-ϨXûE$Ô¬¦"÷ c—Za}eìú|ý7Æ®c¿2v],ó•±K–¶©þè) vo˜übçðs=èÞüÂÅÎá¢2GÃ%Ú½Ö9¼)ÓaçpjÁÂÃE³Ž:‡·»wÿÃÎǺ†s“Ï7k8Ë AäWk87/Ã=ß_­á,‘Ñ4"|ùb çf‘8äãÃ5œö%»áJ–X$ Öhð'úÝMG n5íB¡o>âq·ºv‹>8óWqcvYñEšÎû}ò^ãÝ*Óý¢ûgºnÍ?ªÉ^c«WðËéµõAÆuƒ<×:ñy -‘H¨Y^–¡Êy $íÏR¤Ž¥¬ €xȽ…Vûi¥2R&«PrEöHµÉZk“e×kÈÇ/ˆKmB‡ûK:Íú`IgT«¹M4ĉ>Þ_Òüê Dë>Nö—tΨº©DÖ¹¶ãý%£¬.4ѹvn÷xÉ­ÅUF\‡ý%2\½–ö—¤¡Å‰‚+ûKSñf€RWûKR¹ æ]í/ImT-zµ¿¤ÄYˆK±PŒvïò%ŒŒ¬%‰@½à¾"lšuG5à J12H©áKb`skCC “@ÕÐ* ÿÕErr5…p îjØ·}·= ¼µ"ÑO$F霗¼™|‰q"µÄب×<Æãä«pS+±†?Áÿ<Ð1—@ú³Õ«Ô2Þ‘y#M”Ï{à÷yx& ÈV€0nêTµa`^0h ŒôZ²›ÂX5ÎTZ«‰DÑ{è\j ¤@p=èÞ5h7\©ÕŠä5,#È쌞"Ÿõ~#e®wÓUk¼‘ú³LWyMùÄG–ç‰ÉpÙ‡£p*[ô—<F¸t˜“c«ëÝòËi~G¥ìÄi–4Ë:g)oFèÑ€` .G` —ÉmPK$’×2 pžgN¿Ö8Tõ× ¿i–ë ³g@%Ù™»ìÞC>ùŒ‘aŠž×,p€écºcrlv€}§afÓQ³Î9.{3­N"·kPo,Ä%nƒ¾¤®Ôh‰E’J.OŽ>Ç„ZÍ%P2½Q<æ9õêÏš4fäÊÒ%Î[¶bSÅHm '—/ï0OYT5ãiaI³ªìDboFŽK8Q ^˜Ãe`".¹wù’j¸:-‘H´¿^Cƒ=—€üÁ’e‡êZLÆöþ,ÕA.ÀäkìÀf hhŠ}5ùÁ(w Kš%3(ŸUE’:èq84xûn Nm\r<4øÖº÷ã9ΩՒæ8o‡sœ î½6Çy½8žã¼U]œãÜ™Aù¬ó9ÎW‹º6KNnã_Šº¼±ô°ÎN†«Ó’ã:»RrTgWðZÝêìnÿPg×û,Œ_êì”/á¾]D™ Ùø†5zªP7µq‰A°"~ºwý±+f©%½±á—|½ ­X3§žòq³–77aÇo]ÿhÿ8zPÆYŽÀ.k¬'‰(±†â¸ÄÇ+y¢Lã’kc)Ý»|‰7…©Mo:/˜¬8, ¼ÙkÆ×¹×\èjߢx9ÿ•ש}c$7ŸÑg ` VèÞÇY§YE· i£ÅΖL1)^ÒŽâ¸D¨(z¯¡â&SÆ%R ÄE÷n_¹>–I¾BÎè…2¬[¶óá«ñ©„ÕàÍ©g†Ð  »â¬w"·¡¬¢YCåKÄÇ+y27S¢ÆŒ„Š¢÷*nŠK<¤€ˆKî]¾„6DZb‘ Ë£F‘‹/,,h–m•ºLÛÍ›ÇÐ]q–‚b1U$ÝwóTQ¼”‚äS%×ÉÔ-?<z=h}…Ô¾\3¤@óýù©ô÷Ï›Úo‘ìÂêÅ(3(Ÿ¥Æ_m®Õœz1>1>°‡åE2Ϭ¢ì›ó%­MDU2”V—]Ñûn:³Ñ )ðÆR!š§j¸:-±Hv3Øù,™NEÒÜÊk–ë iÖÅ R$öÛÕ£·¾Þ‰^á!çKv´Ñá¹Cq\&Tè\«Ûݼ³ãõ/hc)Ü{#,j–´D"ÙFùABwÆY2‚8šS¯þ,&²îÿÁ½­Ïú÷êå¾ E:Öý—:®¿‡H´ñéɉí©ÿ"±½éßC$Š|þ"‘>"Ñû¬Ã!©Õ’ã!·¡ —çzìõHQý÷\[Ë»üg#s Ýÿa#³ˆ¨¯–dw¼¥KëÌu‚%?ÌiÇ©º|š<¬SX$ +…X*ÈEÑŽÞ¯)BEø€>«‰K4¤€ˆ‹î]¾D–\Zbºö=‚'ÅKò×ù,ÆÇ¨·6#à\ë¸_P‘š* ]þIÒ\YEí¦àGîñ´°¨Yâ¸äX½ :.Ñm,u‚¾DÜ ´D"©)’6Ÿåä£2ʼnòf5£ÖçÚTZÇüœ+ µ8fÏöuy@¥£œUd KÂ’f5f´£âS¢AAwÅYŠK ‚µ±”ID®Xw¥H”ϪÉÇínÌ+­¯ Wg¨”FuOÊb3¿­:.×ꆫ ^é\%z•Ut Kùù, )ä¸g)(ƒÁ¸¤ÁÚXª¤:} óYN>*S\Óú] Æyå¼ëžTë±Wtõ!*­sM «MT‡RË!R+,i–²ŠNa9_B4HD¬8K— Eïä—q¹\…¾D™bi‰DR f:‘73tµR¿ÔÿÝ_ÒÕqV¨|Ò_Ò¡Á_ò%÷—t×yôþAI‡¸Î}Éý%[öÿþŽ–,‰Q xZö̸&.ò߉n/îŸS£ôçñzG(?ÌèYÍñWÌnzÌcüŒ›Ã"­+•œ±ä×óߘ_xL,`È2…Ç xÂJ¦÷út°¶7Õp;®qZ/â4vÇmª›ž^ìÞLÚaçpj…õAçðö©;‡7_±sxûg‡Ã¥ÎáZçpQŒ£Îáíô^ì.ò9êN­áúpçãñÎ4` g'¬«k8‹fÍc|µ†³°w°8߬áLC;ëè›5œih6£žû.iIÉ&…1škóÅpï…Õi–Ì |V]p[” CÑÕœ‘?!†ÉçÓ6ZßLüPøŸýqDFÃÙr¼öÊÄ\÷eƺB«L¥5¶9 Ž¢®% çæ|F§è>vïúˆ©ý¼^V+‘HXÔ,mù‘èõz6=µÞGoªoÀ¯ã‰.`à·–$IN2•´=EŒ~gǧJçÍ'‘gôqÉÉ<Ép5›…¡YÞ I)Ó) –nKëed)dCd]¼AÕ&´U²b²o²|¶‰´–²£²°²½ÚdM{ÝXrÚøsì6¡Ãý%f}°¿ä6ü×Éþ’ÔúÆö—Ü:Lï|uÉ­ÅBW÷—ÜZì"TsuIyí£þ’q8_ì/)ºpÔ_RLÚµþ’4œõ—”ß¹Ö_’Z|-ä}µ¿$µØ_QÁÕþ’íM*ZX£uŽ>«ú’ zËE¢L±™¢6ÅsŠô*:Ô¼NF”Œ5…:>U䪘VÑ®'_:B~±óQµâmEâŒÑÏ£w‹Q:W d¸äÞåKê©%U$åÙpz3ˆÖÉüE9àB,D:$T¤s;óòa3¡‡pâÀ(”³›./xPŠd•bLŸÎ8yÚáù€%bZÙ0®©¶*q‘ÿqÖ4‡EZîïÈÞßsd\F¢m§g/¬û Dû}޼Ìk~³Â:ç¸l éÍ =—ì ¸C\—éKd¸¨%!’Â<‚ù¹lüCƒóG"±£Aê=~óPtõg-û¼¢ ^5?ž\>¾¢€î™ÿÆÑá$ÞGðäUXfÓŽòfÅVqbjA½š ‚…¸Äºï¾$5†+´¤Éãñ ²çqsšö™rö³ Áÿ,,Uk†¢³?ë>°qDžœÖü^n_æ¹Ã÷RŸMÂ’fU3؉ÄÞl‡ÇEPïL¡¢¹ nùâ’{§/±á’–T‘”ï6c|õ2`L©7ÊN'±fÆÐs|·ŒùÂch(:kÝÛbynΘ£2!‡B´%aQ³d峪HR =”ö¨W62–©Ñ{jCEÏ&âªî]¾$µ†«jI'’Œ PD¨ éžÄX3‡ÿè ºä?ËjEjºfóÌ]¨Âê5‹fP>Ëã4_bP8!½ã¸>˜~kã’ ‚[Äuyh½DR¼óCëäöí«¡õ2ƒÏúphýqk‰³Ž*X7eºXÁÚeЋЋ|þ,*N­á:.*.?ù³¨¸ø…?‹Š‹}û³¨8µf𸨸(íŸEÅ]Vѯð:#¢Ìîn·ÃH´Êt)Tt\²ÿÎcFzS\´ —µ$æÕøMØE²°š®ÙÈ õgñºuý£]œužèu›‹zJ4(Ý–Ö˸?‹6ä´BåÄÜè º¬âUW ÛÙÞ«®@Ö¿÷ ]DòßÂ;ŸôU§6y¢B׫}Õ%¢<ê«.–âZ_u‡‘ܲp±¯ºÃom»ØI_õq«{‡-[Ý·/úw«{_ÇuqI馴{0Ôe¯.)Ý.ö¨ ç¸..)•°:ͺº¤T"éã¬ÿ‰{cÊ·u\(÷Ú‰4´  ¦\÷¤ŠÜ=BîcçAÛo3gŒÑ{×[³Zù «ŒÃh†Ëq–x 1ä6Ä Š!ë.å—jÇJ’õu\"ÖTÁRåÞµåGYE—*_BVJ|Ue²:ŽK„J»ðubßv€Ñ#.ºw;WMkƒ±‹¤ãEäŠO$Óè|VIjÓ’žQ(úYu\¤¬+™½åÚX¤&ÜåŸdhÅÝVV·ã{+,aušÕìׄÏ2>P3@0—9o22\â%±îâã™Ïròñ¼&بJßp›ƒë¸T4ÄŠB•ºVwÏpt¹¥°”/±°¤Y»ì9.*‚l —ì ¸C\rïò%2\Ò’*’.ŸÅä£3ÅÇeÚ7&9ÓŸ·61ꔩ’©L³zË «™´UîPYE Kšerž>K´£Ð P´â,‡Šd0 ‚É ŠÈ뮉òYÊ+S¬´þyå¼Ë´U> Â•ìÅ]— X¯ »rïUXfÉ :_B€a4¸C÷.ÎRP¬è]¡¢ãL‡0â’{—/qÕ3ÅU$m Æ§Í Çý%E³Î P¯ö—´µ+Ö¬«ý%]]⬫ý%mÍCÅ«ý%]=’ שHòãmT1_ϹºX¶®l|Á¼ßp9pâuñÒv7va©hèýŒsÿRº}Œ˜#ÌÒ ?—2¦,¦ðqW³æWU§pƒ¯(“›îSè©Ø/uniÓ;c‚ê²!Ƕ§GŒcx¾ß'î63>ïÔ‹äwͺjì*¯¾0v©õL_»DcwûÖØ¥.âÿÆØ¥Æÿ4gÐ’_ÚT5Ëújçp¹ÛQçp§YtoŸ÷°sx“ÂÅÎá¢LGé t—‹£ÎáM¦;‡[ÃõéÎÇ«k8S+¬¯Öpnß;S¿Zù!‡} gñL_¬á,6Y¿ZÙ_bÃ%-‘HÖµ}ÑR2Lߦl¢™ŽÂ’fÑ 6>k_p[XwL»P'@6ëA|Žo¾¿*ÆüDœ¥ù½¬™ßðLO$ƒœЬ0¬±Í¶jAF€Í@…£½ØC¶Äq·eÄ”ø3÷nà,Ã5£2!D²þ$ß,¥~"ÍÒÝè³€±ZxÐ8½šÀ­ ¯`Äy»?P…¸ïj.ŠÁù×JÀÎ#èÍý"µÿ̃ÝxkþÑx=hj^Á/ç×>C\Žet⥠Ò‰DšUu®óYÔÓæ¸ð Õ#¦Ã—šcÙXeïjö4ÓlˆTFÊd5£jzUÚÔ¨³]ì—ŒƒöbW‘¤ÆúqÉch¥³„%Í’”Ï’7#4t¯†85&ÚËßeÖeðÝŸ5p ­FϪ´.GÎÈÉN“k“Ó“;”£Ô&ëê\Sçvé÷—ÜZÄåm\÷—ÜZ4Xqbgý½¿äFXt#`J-”ú`ÉíF0—Z˜÷Áþ’áä@3µôƒý%ÛÅaIê"Å2ûKR Ýg]î/ImX¡€ãjIaAúKŠ›ºÖ_RŒ£þ’b ¯õ—¤¡‰Þ*:.6KðŽxA¾Ä†KZB‘˜ÁØébß"ÄVðÝ„åØïÑ•Yƒür7NÂU)‘ *ñäXR"-Lgè¨Èv·Ù"qÐ&¿*£tN³ÂìÍ=äÞê‰$·1-w„òSdØ×¿ƒîöùÙØqœ"ã9¼1_l¸&ˆÃ‰=ÐX^kmÂ~7UöhÌïjñC ó_ôuŸãµó½c¶p¾1pHF5(â9ðŒã{lÉPÑÐC Xˆkwï©ó%"rIDI$÷áŽiØ“’Ó„´þÞu\Ž(k69äˆO›ê Æ´Šv›qŒ÷@­DmØnŽ aŸÂv”Ç›…›ýLêÿ±Ïâ¢u1Æ>qÇYŠÅ`0Vˆ]ƒï–uoR$Lž8Ó%F†\þàw\J#NHl‘x$3L":Hˆ!m„Jê£wòà~3ú¬F>Dƒ‚¨%f0D7‘‘+òŠ´Öo¨ä-ÍhªŽK,¨øQ–CS5ÛêòOÑ" E!îäâ}‹ÏkŽK„ Í CEõŸÊ¾q™FÁ*c×’ž$‘+ŠWä/iáIêÒ’âý•Pi긔_Pæ9 e+šZ]Ðé•hß¾ó%"çÅ[³ÄqÑg9zW¨(äMì4 ù.i‰D¢‰òY£2ùgeÚMÂ_¨Èµ9 ç:.eî˜ÓS¶Ï]$Ì*Qå…eÍÚÍ`ç³0„Ý*²¾W †—S$re¸ª–tù,%•–<¯œwÞYiæª]í¨ü¶2ßΉ³°Z-?Lç*Ñ+aI³lå³È º+ÎR|êúxÅ%J“È뮉ñšI‘(­¯Œãþ’íâbÉv·Ãþ’ò ×úK:Í:Ï*~Ð_ÒÅYç×ý%-ëþ âú ¿¤«ÁHÖ}HÇÕjÀ««Ó~l/zO ½8Yd`P´ŽP¥?Ù›b~È€ @ÏŽ?£c6ÎÑ˳vÁ£:ƒ-õvvkå¶æïTa• qÓ4LÈ*r3ê¸ns¬OÎÒy/À×;Äî3Ò*§"qu“zR¾1v‰Æîö­±ëòõ_»Ž=þÊØõDß»ÔjÉq›êzá¹î‡Ã&¿Ø9Ü Ëšu±sx“Âaçð&Ó‹ÃÛ=ìNÅx_ê.Gù¨sxÓÓÓÎáÙùX×p®?ùj g§Y_­á,>뎡%߬á,Œ:ï¿Zù½é“ÉáÏÖpÊ—°:ÝZ"‘Ìù~UŒóð -É_70‡f5[aaQ³Œùä³´àV›&Tv¾® Èe÷µ-¹Ja¥Gª|ö•Û›fiþŽ‚UM®àÛé9FU Éü ËUåS6ŠàwpëyÝí݉¤`r¸wú<–H$ããQQôsœb\†…%Í¢´Ïªc{¶ù‰Mð\­92"•r´ 6ŽaCîxZ¯ÜÖü“=šµ‡ÈhÉ–ïŽx[HšN¤UåóÎag„c§ˆ‹ŸÊ¾¤~ÞÔ~x‰¤ «£LŸe€ágãS×÷éÞTû³ôuôÝôEµr»™Æ8`¾¥''A¦’v=Ý ©g'µ§JçM'ñqÙ½ËØ_ÒŠDf.ï/)ŽòhIá¯í/)¦óhIÉb_Û_R~r´¿¤dc¯í/ù1vý%cÖ„—×úKz6O¡ïÅþ’}õ—”?z­¿d³–‡ý%ÛQ¾Ø_²1‡ý%Ûï\ì/ÙdJBÅÑ;Å(3â’{ DPo-‘Hvn£øS²äCÄ”Te»»²ó.ÛÝÈȘ«ñŒiög‘ù©œÐfßȉG2ôsOEŒ`¥*_Uò€œe}ÊqYŒÒ¹Ý@¦Ö›zqѽۗp˹ Šdy.HÅŒðócÁÄéY7¬å“¼€1{/Ñj¸® ŒL¨§ÐlnïÏ’þŒÑùœX9ŸÏ ò´8;/N‰_¿bÄÎ3F f›üú€vÇ%©è]ÐC8Ñ Xˆ‹îݾÄDë:)’G¶œ¸Þ˜œÍzH!ËíÁàÕÓ‚úÑyqi»«ÜèTNôD¦+¸ˆOßã=¢l†!Æû=ÎõsJXÒ,ë ¤¼™ ‡£÷;y$Æ%ÁB\rïò%»áJ­–H$0…´l©_Éý0ÄùŒ„¯_VQ9hê}Ó_Oü¦ýYêÏš1?1kBxÀ÷+&†æ6…é¬Âê4똜9hGq\õŠÞ.;.!ö¼AQ¼ô%ÕpuZ"‘d¼8d­éж¸z‘¡HaY`6°¯€µ ŽÞ>•Ç=»œhæEpª–4‹zj‘È›íУð½Ä‰õŠÀ.‹Û‘_p\",ÄE÷._R WjµD"Éž-ŠÖAÃè˜Ñ@”ñddî,5kisÓ &-ÿwèög©?KÂj4‹fÐ>kIÉk>Û„ê‰vÇÕQlÅ«¸D Xˆ‹î]¾¤®^K$’Ç+Øãu6~Ø·³²o..׿³%º!ÖuBsËãžÕŸEè®8ë¿óîÇ%߬#êPôWëˆ8Õ/ÖuqÖq9ÄvñŸîwß|Õ.Ö=Û¿´‹Ÿtzv:Åøàì¤Ó³Ó+íßêÜÝíX»g;VçîMÕ¹Ó¹cuîÑàßÛÅÎÕ9µß®€NÂ|<½Ê*ÊÉM9áO׿–Ú^[e7Á’ÛÆËúÓ/ÈcÈ—ØöRK,ú,y3ù9{@úFyMùSyÚ_ê¸Dñ’W–3]JK*‡¬„¿ò%ÜòcÐ(8)T#B…HÈI艸JˆËÂ’f¿ÙI$DƒÂ‰FÄ–B£Bª¿”Ö©ŽKEC _œ–T™‰^e@yË‚.…cŠ Äq‰PñtFŒK,,i–Ì ûIK$ÅYŠÀ›)jS<§HO1 v…òMÏ¢!çÑŸåê Ò ®{R‘šò%ŠU›vD$Þ*𮂽ØÒ,™ÁÆgѽۗs–P$b0L7‘õ"¦ä¸õçà Siê¸D¬‰rS)ꞘèUVÑåŸâž#ÄW‘ÉÇÕ*Ô,1föYM}Рܻâ,²yÒÓMäÅŠOÓh‘(ÓµSÉ¥®†$³JëTÇ%Êš*êÏ.jܵºânÅê’ïlÚQ—Eïä¢lI,ûfΛÔyri‰‰\²îâãÅÔ‹ÃwZR©­®QúF¥u¬ãr2¨I!èz ï°‹„¹gE˜/Q&Åš%Ú‘>KÃÍ@‚ûŠK„”3R6Iy&f ¤%‰òYÊtýR9¯T¦j‚gÌNwµ£Jë”LUš•*êÏjªàV0«(aY³”£L€!4(è®8KùS3?ÁB\tïò%ÎíRK$eŠ?hfØîvZ¦}µ¿¤«ã:¯Pù ¿¤Ë*þ’/ù»¿¤ã¸~‰Þÿî/é×¹/ù ¿¤T^-øð£ð´:íþxÑ^s~È8AÖiòõ"ks,w ;õ7bgwÖäv§‰ús™¾t>¾§ š••.þ{àúÅ'~ªˆ[£dNõ…i¦,ÍZòÀÅ#>U¬bÄÌîÂe„¯?ÉÆ.ÑØÝ¾5v‰Æîö­±Kõ™È/Œ]¢±»}kìÒР´Ýq›êŸ^ìÞ.;‡7­¿Ø9| Y¨]¹Ú9¼]voZ±sx»8ì.HõZçpqGé5\î|<^Ù¬áÜ~òÍÎÔ™ÁoÖp–%·³†³Ø·ûf gñ€ØŒzîKh¸<±ºŠd•B·1&[¤¨²^SÜ ïzIJÍxÔcÂê4KfÐ>‹ n5íBµ+÷‘ÉîåQûwX¤ügI4M®Ð%qªäˆ50JÛãóÄîÂù…®æåñÂ$» Ý»|Ij ——ÕJ$Ù¨ÖÁ-YabÃJ_ÇÎn ‹šå òY㌽<ûêè"SÌ‘qÖ8coÅͨYŠÄykZÙ¬!”"À—ˆƒ+G¼I£êöø"ÓF¨?ÑÔvñÄ(sÄ%÷N_bÃ%-©"Y¥°Ö_¿ºŸt¿Ã»ÙgÕ'èž-{Œ$ÏoK¥ìšÐäþ¬‰Yò·îÉÒùhV%§É5Ù ä9¥Š±‡Z_!µ/w‚uzy®ãÄwºPµ¤‰4K:GŸe€!4(Ýöãá«Ç2µÖû³”áñoj 0y¬ýG5Û°SM)mUçÔ*ºL@5½Ù ¯Ö¿õ vïò%–ýÏ.’Îg ` ºÛï&:µÆ[f½üWÀ\õg¹ðãq2ÞÕõ‰r`÷™m8=¹CqÄ^AIçZEÒa$‘0ÄUB\–4ËøM Ö)¡A-ËPœe Cˆ£ä‚ELJýTa3æu:yÏ‘½Þ¿Àú^@ACínœЬ´Xrü³óèÝ;ƒ÷—ô±ÌßûKZ-iv³^Ü_RÌúÑþ’M ÷—£z´¿$ M0ôÁþ’íâpIÉ/\Û_R~rÔ_ÒÇõ¢7/ö—tœƒã.ö—tL£Ãò‹ý%}—І.ö—ô ­èŒ‹ý%Ç%aYŒÒ9Ç%wLl3â¢{—/±á¢–ì"é¹ART3ÛùLk‰ðz€ã2IFú¬kå 8²Wû³T»BOÔ^%ýÖ Ñ" +…¸á’‹ç´c#Fê܈ŽQ{3Bƒ`!.E`»/I­á2E‘dAfdâ#º ×!½àÖO®§X÷Ð`~hвê«¿Qú3 — ^û=£º)ŸŒÇÀáiPÚs&¸ê\Çq™P!ôNT\RAp‡¸ìÞåKd¸4ùeÉO 4xÝkêüÄDÊ×s ï°b÷å'ÄÅòÙË*x–ÿqí *a²M lùÎj†šúnŠÂ’f5:Ùx3@áÄ ê ß‹Lá²A°—XCå³h¸ª–t"y.3 ´ÆWŒVx<‡Z?FÝÆ= ¨XóÈ^ŽXW½ð›g »v%â­µµñwª°:Íú%_"o¦ÕiØ7ƒz* —*2.© ¸C\N>Ò—ÈpIKªHŠ%cˆø{ÀvŠŒ3—Cù4öÜÜÄyøª·Tü“ÿ~ 'nf «vÓ ­Y3äq k»x¡2A8Ñ ÞÃeq{ô^¤ðf”Š·áã™^cWwÜ!.¹wù®FKž1óê>¿ž'ø`&[¤‘½Ú4¡Jfx9*Š~bÒ·4K³…ÕŸE€qžèuA­<ànnS«Û&¢Ö¯øø=z/u Ý÷NÌ/Z¿lUê ÿ™nàô´þ¨6oŠfPÙyKà½?HýTÏòþ,¥sOsï5벊W Ò÷§>渮¤o;î×Õ‚t‰d³½ÿ{Ž·»l·»üð½Û]Ê\ÛÁÃí.Ee®mwI­á’Òžow9^¸ÓkÖáÂòÝþ\¸ÓÅY¿T¨ü½è«Ë*~µè«ã¸Î}}°{­C\úTWw¯¥NXãÕÝk©=HÞPx¾{6¤Z—ÔÚ«˜²|©³‰1eRkþïýÓQvçíØQö¨æÐQn;Êžãú»tGYì«Ø¥ÿæT¯a—þ‚ÿìB ë:.áÞ—:.M›uZ’[=˜ðWuƈފdzHMØ_×N׋ [Ký­ ®@°…%ÍÚÍ`ç³ Ã%BwÅYî÷ CçÕŽ5:ìë¸Q*-¹œåÞkäÚeí:_âAŒ÷î€ãbØçí×-,i–Ì }–ƒU‡±ÒÄY Š.3Vˆ-"·aÝÉÇ;y"Þ…u\âjvg»›Ê!\J³°EE1XQÈZw“ó¢@@Ž´×+ŽKV¯Y2ƒöYD\Bƒ»/éâ,ʼnè&sƒ;EÕ±î¿Ô+Ó%Þrg4û:.² æGU÷¤Üûˆé….ÿ$Ck¢P"˜à 8.j–¢wy@+'4t§{—|Ä`PKÌ ’ÈÅ+ò÷¸LûG³Bë]€ÊŒ€KëTÇ¥üžyØÎ›s*ÿD£)¬Fî£RðE³@Λ¶ohGp\ôY®ïU¨¨E ÁžÙCû¶û’ž$‘ëDS$ÊgýR9¯ì˜k‚Y€ª\Ûž…;¨ãRÑrz,‡ÐJ¦=CØe•ÂR¾ÄšE3(ŸeŽK„Š6)TT\BÞSL ÒpIK”ÏRòñÃf†ãþ’Ÿˆò¤õjÉO6ö¤âjIç³0®ö—t F*^ë/éòY2\ç"¹?ï±â°Š±Ô¼ã„huZþ“PÚ÷„Qlãx‡Û}ŽU ÙÆ“œŸ‘´Õþ9ŽÛ<ÖŸ’û˜àXr´ö-û÷Ьé¾~eGân»°Šž’5ÔºÜI–ûi5ÿ âëŸ3ùàøk8óï?¶ùw~Dò‡f]4v‰Æîö­±K4vçÂúÐØ%»Û·Æ.ÑØÝ¾5v©õ?‰´ä¼MUÓ§¯vo‡Ã©üäRçðvqØ9\4ëZçðvƒÃÎárz¯u3xÔ9\¬åµÎáÎp}¶óñòÎõnu çö“oÖp¤ÊIß߬áÜdêÎû/ÖpnRà–í¯Öp¦Ö—ÈpQK,’çpïÙÿÄÎî¬çQß›%J®‡ Ý*Ë=w–4Kf°ñYXp«A¶îϺÿCE „î V9¹Âkl³gC}Õ#¸AÏì!5žÏZJî—ó1âjï1²cûÿÔ½ 8Óp…–$Šä¶­Ä˜«Ö¯–&Zæò)ˆÃù ¡oV§Y2ƒòYù¸ JçÙÍ‘iú³Ø7%¡=‘ò~7ø~Õ€ßi,i2Ü‹³úçÀ!÷ŒÌàß V&éP$B\ŠeèKd¸¬%ÉØ_Ò.íf½º¿¤¨ÌÑþ’.ü`IQ¦£ý%]|úÁþ’M>‡ûKºØùƒý%Åõ—¤VX&a.ö—¤Ö—¸WñbIχ¾Ú_Òq5®ãºØ_ÒñHÎ*^ì/I§?éÅ(S¨¸{³ qÙ½+“áò–¶üˆÈŸ(¦QäÎNö¼¥*Äu’?Z™ÓŽSu¡yX1´ænwV·ã{M.žþ¤á¸¦°oöf‚‰ÁB\»{O/‘á’–P$ö¹æ»a:+GÂfuf45"צ"Ízg<Û^O( ÷Ï©n]ú³¼CëßÙ"„äòBró# ÏÉyå(e Åq™P!NT¨Xã’=[ÑsE pïf •ÏÚµ$Q$å„LˆeÆûK,Ù™ÃZº®F³^ïä7eNbzF~Ûû÷¤ÔùJÌcÍÞö²s‹Â¢fYçd åÍ=„wP_,£w…ŠŒK ‚…¸8ÕÖ|< —´D"YMtèB†š˜¥Cù¨b@³^³þÄE6}(üXâ„hž·º;ÌÃzmôg…°zÍ:MaÙ›iÁÓŽ˳Ô«Há2¹ ‡Š÷XwQ¼B\tïÎtÑpU-IÉO0´onvÔš!f§gÓ‰šáë,îcü“?ïRÐ [Jìf°‰¼™k̤§õŠÀ.‹Ûx`Z¦YC…ŠŠK‚Õò³»÷Ô~k+/,âƒzëÔýQ‡I|PͶuTM˜‡¥°¤YJG)w¸‹d»ÛÅÍí'‡5šåÙ®Õh–opT£ÙÕ`|P£Ù.ÕÕœ×h~P6»ý΄¹_•Ív>ë¼löêƒínâ6¾YxP4‹™®o¤Ö—üÓƒqÖñŠíw.î è|–דî p9„zÜŸ…¬bCD‰5$9¿3Á *yÂf *Þò£PqK¶gÛAp9°D\tïÕ—t†K)µ$ $ê߆ü ‚#¾#’°¬Y4ƒöY;À(R $tWœå •CˆÛ0EÖp§x‹f‰×êAfº”–TY[¥½+Td\",ÄUÝ{j}‰ —´„"YÇUÒi–c€!4ø‚—ñûœ éÀê(k–GpA1šä‰3]P³]S«šnR×Ý¡â~S{Fuzu®Õ‚!]¨Z’:ý¡fy«!}–ôTh°îÖ?ŽEr¸Õ0u®@ïÅ­†?>ë`«¡\[çôŽ·¦Î^.š”õïü‚&R~°h²Éá¢É /š”×ìüiÉfCþ·ì:¿: pÄþß HC0¾PâÎfR=Œ ní9¨JÛYò¢‚ò©Ž¢‚-κt?©¿ÓÝíj ¦÷éßôb VüéÈ™¥×5…åšÑáP^A¾Ò’$\ÁýYM) ©©¢ÐSO^Qcæx[‘¸bô=z?5‹fP>Kî]h°áØ¿àØ †¹ rƒ&rź“ÖròD™.•Ö©Žk'ÖJ^†”›Ê!”{oŠÔó´åGµºb¥ÀWµ´#g½¢Î¡Ñ,›Aú, !®Ý½wq– —´„"7XYÞu?/Óa,*ùù–¢Ÿ]ÇÅR“Ù¢¹¹?ËåŸÚò£ÂjUÁƒï &85Âj4K¦SÃþ0„ ݉¸äÞÅ`H>äMä’uÿKå¼{RX¬TU;2±ã:®=´=›ÒD.‡`î½)¬>HTmºÀ|‰Éy1Á4ƒöfœHi4¨PQq‰‚b!.Íùqž‰D.µD"Q>«Š¤0´Gý%»b\é/)'䨿¤|øký%ihÓ¹§YÅúK~êjúKʃ^ë/Ù¾ÛaIñÁ×úKR§%É#‡š°;LK²¯®N+ºpÀsEÑ •fL@}y†;.ò ‹ï6¡›µÙ?ÇþF‰d‰2’|@‡:5(ƒõ©Ö®˜¶Wk¸Ö8eu5ó‚ ÖíUÙlŒP³tAýÛ;>(ñ)z"óOÂÂf=E›÷©H¬YîIùÂØ%»Û·Æ®Ë×eìzöøc×Ç2ß»ÔjÉq›êvá¹ GÃ…s¸Ö9\ý¨sx{Ó‹ÃEKŽ:‡KvìZçð 9èþÉ_êÞ.;‡w„Ü9ü/;ëÎí'߬áÜ"ñ–®~µ†³«1ûj çOFƒ‚¾YÃYøÞ‰•¿­á”/©†+µZB‘<ßwõ%«“©‡ï¹žØèQ9Ÿ¿V?eóÆ»Ý)N‚‚fU3Øû,-¸Õ´ …¾ V5¹Â ¢'¬ƒp3FpÍoÔFì;¡7)hæˆbÚ·Òx(å|ޏ[Éžñìëžd¸Z-±HòS×óöÌ®-v6<–{¥¨ž+¬ª- ë>ä#„eÍ’”Ϫ£\L &¸:Úû³\ !¡ÜÙI‹PgeR<ÜN ¼5 ¦)``ù;úŒžË€bìSÄ%÷._R WjµD"YÑèëðfà ÇeÈò©2ïs¼ÂtG=ŸgèS³dí³0Ë!~œ¸ E`Ì*6܆ˆ(³†¤xÅǃãr¦KiI¯ºœUçLÄ%÷._¢Xi E’õò]{؟ن`Qøüˆ?: °ä–4K´ì³0„-W¨,Ñ•ép™‰Þ–ˆkH5á•<ñØ;¦%I¨4[~0)¥‰K‚‰¸äÞåK´9Zb‘¬þǸ«{o„EÍ’”ÏrþGhPÐ]q–І\¡â¯"J¬!³Š ¯ä‰2]LKz $8.ŸEï:U~9¼¶—>•>bý¼í‡·Hª°ZͲ”ÏÒ¡Ðq©©³Îë¸Ô&¤ •ÝîtI‰Þ&yâL,ßn;kéf m’í• ØCj͆ Š—ŒÌS5\©–Ý –Ï’é4tWœµ›è^$ò´ªãrÑ)^óñJž(ӵо)‡¬„?цJiˆPÌq Õȹ”)²\µ—Ü»…Ͳ–H$`thP Äõ; Šqv‘tHõx…k9|®píPôñ ×¢Y®píþñ ×íBàôp«ná®mÕíÌ |ÖÕ­ºåSmÕ-–ül«îÕ}Dù͈.Úý—渧ž”'¸6õ¤óYV/N=é ÓM§SOÄ”ÔôìÊE DÖ¿c~®R EXKTéüßÃJ™iTM°ØIñ–b4UÇ¥¢!U¨ˆ9Uî]‰^õg¹V—-?`urÑc¡ÈqI³½Æ!g ˜ˆKîݾDëÀ­%B%r{Öý¼r^¾k‚1ßÒÕŽ*­s—ІX¡²ç$úl…½*¬FàŸuª„Õh–6Ég` º qɽ˗ˆ”–ˆußS$½H›ºìØyMðý%]æî¼Båƒþ’6«ø[¾äïþ’ þ½ÿÙ_Òsƒ§¾äƒþ’Ÿø”“_ F½ãê´çýsqžÏuƒ/äª3 ˆçÅekï>’÷#§·±ÉûçÐ…ÕˆdŠV÷|1ÜãŸ)“âÎ-­qîx¶!ÀÜkDÏêsí¬oú>Ègô5{ãw´Pý§´oùÐ p*’Œ]¢±»}kìÝí[c—ºLä7Æ.ÑØÝ¾5v‰Æ®sFçÆî¸MµTé\ëÞ.;‡pÈ¥ÎáòÔGéÖß÷ÓÎá‚®u—=ê.oz­s¸ø¨s8µ†ëÓ‡k8KÅÂÿ¯Öp–LÊý`žw§Y¬áLÝtÉoÖp–< wѳ†³ .lF=÷%2\Ò’*’-÷ñ|ÄÛqD±â˜-M°Ó# äxâT+(¯w{sTöRAŽpgª4Ëf>ëÅ©[ÎQzhÄšëEð,2åtIMh]»úó¡áLa“s¸]Öƒ†Së´-šÓHœ_x`œƒ`!. ©¾$5†+´¤É=ÛÚ&´Nªä|V«Y6ƒòYÞgD4X¡{‰³ff"Éh"2÷oköû³²2 û[ÿìd§Ós½]½ØW{ÜËù‰¢&˜a?KêkwˆKŸŠцKZRE’ZaIŒ°}–†Ð ’ßÔÉ:O—ÄwÓÕ·¦$IÎ=wžt§=ìš?ê:œ*Ÿ7™ ™šj„džRk¸$,‰Df>+Lg‡engÉDËRˆ1Ó¬#ÙZ$Ù*Y1Ú7Y>ÙD'·<êXV¶WVùK¾Äa,µDq–‚b…Ë ¤Ï1ÒsŽR“Ë72¢t¬É(Tñ©"WïÏB´«8¸™M§Ü‡¢ê3Ú±Ût°¿¤Ó¬ö—l‡ûKº8ëƒý%Å}í/)‘øµý%??9Ø_RÞôÚþ’¢GûKÒ?ì/¹ö—t—©Ê‹ý%â²{¿Ø_RØ•£þ’rƒký%?™”ƒþ’Ñ_ê/)øí¨¿¤ëZIêÈy K´£Ì |ÖUˆM¨È”‚A0—ŒÝ—tÜ Ó¢xÅÇ›©'‡/v_¼¿2Ê(‹Àü‚2ÎI0[¡<3M–²"¿äKpB¬s»ì8.CGï —<Ø%nCD”XC.·üp¦åã&ŽX·ÖÝç ®W©ˆ…¯­Âyø w«|=õç0…%K§™üba¯eòÓІË*½˜Éï2ÅnÉ:ÏäW”HüÏâŠòwþ,®(™»?‹+ŠfýY\Ñg/ŽÅ-–ïGÑ;ŽëêXÜòÝFÔ“3W"ÙpÈÿž“Še í͸:mŠ>£Ô³¼ÐᲸP)òc.¨BÅ—”×&âz ¼c.¨ñ5K$’9«c üa‰ kzÿ» ᯑgýgÓÎ5›­x‚9»çév³¨ân–5KY‘óÜû Ó!œ(P¯Lá2¹ˆê8.S¼æã**.Ñ–!.¹wŧ4\Ò’*’-v~ànÙt&Ö•°ñ“éΨ¬a~¨ïͰ*Ò’–4ËfP>kIA\„ªd¨W†Šéà6ROD¡$¾¡xÅǪÍãéÓÁB\âwv_’ZÃUµ¤Éó½ùý"ŸËØ'žû¾?Û:¯›¬3nÿÀÎ-j–Ì |VÿV¨¨BØ.wYÅ–ˆkØP¼$•î˜!IŽËiIå**.y¢G@ˆKî]¾D†‹Z"ÙøÞ©Uù¬]Añæc…ßAÔ&ͪf°óYFƒ‡ECå$F¥_.ÏÐú†ˆ2k8S¼ëwk“' ËÛ™–TY”sÝ*ê„㉸´á³ú’ԮВN$Ù*ÏÇ¢fÙ Êgé ŒõÔçu\<–®P%Öp?þ]VÑÉgºœ–dù…©AªÎP)¢w…Š º8A§Wî'Þ†KZREÒiÍ }–ôTìºhÅYç¥uªãÒº‰Û¸TA÷Ñ$OœéztÃö¶ 6©”F[~ä(w{ÝYr}ËúË/Ðc„/鼌4Kž‰>ËChPÐóa£ŸV;VXÔ×q J™WòD™®WpÑM™ ÿ¦:¥4ª{â–Ÿ¦”HHIèiaŽRˆKî]¾D†«Av`¶…Ý… …-Í`ì")^D”K»p(QR×’£DZR!þ®Îˆ*B«Ô©y¼8ç90^÷´Ç]ôQã «Ó,G9ôY2\Bƒ‰â,E`b0L7Ö7mBGûªû:®¿÷U¥=ÚWÝe?ØW]þÙѾê.¿ºB\f°g .®—H:ãÃâÇó„Êy;š'T.®ÍúÉ/Ì*ñÚ<¡t:O¨üYÝ¿GEÃõ‹H“[©»Á7É­Ô¾ÜWÉ­ÔeEΓ[çS{(|\.æSw`u”/æ׬«Æ®Ïµ}cìº<àWÆ.užéc—Ú÷ùÊØ¥Þÿ¥€;‘'·Rçô¾In™^ë.šu”Üê5ëïÎáíâ0߸‹ÃÛkæ·ïv±s¸7\Ÿí|¼šÜÚ°¥Àé7É­Ô ë›5œ›fæ‹!¾–o,ìÊQ¾ñçâR¾±‹O¿Jnm‘¸µ/’[›LDþKr«™Îz”o¼ýC¾ñÇןU _Ì7ûv”o,zz-¹•†&Bþ*¹µñ!$T¾Jnmšu˜o,VìZ¾q“éa¾±øÓkùÆ’)>Ê7þ8–³|ãar+µ¾ä«äVêÉÅ/’[Ïú%¹õw¾±Há(ßxû‡|ã.äœø¥|cŸ_ø&¹•ZV÷«äVjÍà?%·4kâ0ßø£—òE¦GùÆa]Ê7–ꦣ|ãvq1¹•Z_òUr«Õ¬ï’[]œå4ÞÅ|c‘ÂQ¾±½ø$ߘº?ªÇ9Í7'·R{F¿Jn¥N¾In¥V·InýoLí!o[J.åS£€VÍ«ùƾ>ä›äVj|ÉwÉ­ þSrK“c󽓸;ߘgÔõ¬^Ê7¦ÎQž*$·¶< qÕWÉ­44˜ï«äV±!GùÆò;×òÅ×åãR¾± ü£|c¹ÛY¾ñ8¹Ubç×Iôq5¹Õù¬¯’[ƒqžÜú ߸ÅY‡ùÆ¢§×ò?hð ßxû‡|ãv7ÅÛß$·Rk¿Jn¥¡ Šÿ%¹åé^‡ùÆŸ‹KùÆÂáå‹»–o,šu”o¼ýCr«Ó¬¯’[]œõUr«cÝ?Ø_R.Žò?ìñ¥ý%åSå C{mÉíÿH¾÷Ÿº?ú Ÿºò Ÿ>žÖêÜIr«Gƒß$·znð_’[ÜÜtuž]ÉQ¾±Ôq]›gW,ßQ¾1ý>ÏîpRd«sÍtÖ‹“"Ë78žVjW®MŠì —ìÛÅyvåGóì ôÅð΢Yèˆÿ‡á'ÃÓÒgÃÓŠ…ýsxZùnO+ŽåÏái]íÊñð´N$ÇóìJ]͵yv?ð`ž]‰¯Í³ë…ÍúdxÚí³áiånO+ïóçð´‚ÿžÖ»©Ãyv‰"YòÁ<»íâpžÝ†-/γ+‡âhž]§Y¿ôúþ=<-}6<­ÜúÏái%Ÿõçð´ùü5<­«]ù`žÝzq<ÏnË}\œg·]γK­°>˜g×{3eRþžvûlxZ©ÁøsxZ1iOKC“C>ž&_Ò.M}¼:Ïîv:Ï.ýÃ<»ÞgýÒ4<­ÜàÏáié³áiå„ü9<­DFO+~ûlxšöx^gw;g—þaž]gå³~›g§¢¡?‡§•øôÏái·Ï†§ÍúsxZ‘ÜŸÃÓʳ]›g×.O}¼:Ï®Õ,Ï º:ÏîÖ½2)Oë¾èñð´ôÙð´NÚÇÃÓR{vއ§u¯}<Ï.5¾ä“yv°¤YWçÙuIqÖÃÓ:ër<<-µ¶êxxZkùN†§¥ÖŽOë­òá<»DƒÒ™šãyváÒÔÇ«óì:£ªD¿Ì³“?ý{xZêýöÑð´[‹އ§¥Ï†§ÝZ„r<<-ѹvn÷xž]ëÄý§˜gw;g—†ÿº<Ï®˜£ái%ÎúsxÚö“¿‡§øçð´[ƒÖO†§mqÖßÃÓŠf¶ϳÛò€çÙu†KS¯Î³+çúhž]Ѭ?‡§ýÈç¯ái%/óçð´r®ÿž–>ž¶]œOÓV÷«óì:3(ŸuužÝvq8Ï®èÂé<;±†O+åŸÃÓÊýsxZÉíþ9<íöÙð´M³.γë4Ks¶¯Î³ë —¦>^gW¾ÛÑð´þ9<íçwþžVâú?‡§óôçð´ôÙð´rƒ OæÙ¥Ö ~0Ïn»8œg—Z_òÁ<»¢ GóìJêÏáiåwþì/)RøsxZùö—lºð÷ð´Ûgý%f}0Ï®<ÛQ¨ØÇYϳ;7\ë.‘x?“øxå(›h°|ZG¤mZÂì¿ÜË…H^œÉ-^ ˆÅKͤ;éÖ8Å‚§òá¹úIK¡&° ^$ÅSuùT ×RiaվʪhÖƒ#žý¯‹±~‰4ëê¤Èsc—hìnß»6_ÿ±ëó2ß»>–ùÆØ¥NKÛT{ùfò{LþwçðÏËdò{†öïÎáaqÒÝÅÎá"…£âŠb‘®u‹tT\ñƒ{ÏŠ+þa磖F~µ†³È”[Ý¿YÃÙWÂ|³†3µOðÕÎÔ}×pÊ—¨‰Zb‘ìKW× ­cõ¢VîžörW®}Õ^l­ŠÕÙº^6uÂ’f¹’Œ>K nµ?KýY\—[é–'ÀŠ]-ß­ky7)pa¯Wù.àð½þ—‹«H ‡ÿT*¾„ñ©¤-‘ÔuÆ[$ÎEÇ^Ì­îZ›¬…ÊÚ‹­%Ì–4Kd+1¹¥‘ ¢µ:Úu"•¸ˆº®¨.^Ë«µÖº.¼."á*l/É–EÂbí_—ª3èK´!WZ"‘Œ,AÒ q-¯kÇ {Œ…äZU®½ØÒ,™û, ¡Á}ÁúvÁÕëZÊ®ýY^äN'Q—¿ÊЗ ãë*ùM Z2Ïõóu1}/`Փӽ˗h÷´´„"ɇà]1Ò3ØjCÖ 4¨ 0–4K{±í³”¨RÑv™>FD/Êty‚hÏÞ#@#{”ɯƊö1ª…Ÿóx§ßFww\Ü)Ó™tÆ=¦C4q A°ò tzò%ÚêN-±HVÒ;ZJÖór,,j–Ì |–²Ñ ë¸g ÙiÁRÄé}®^ß:>bþ+¤Ó±?KýY GüÊZ†tââÙÀìu4°§ë(T•{·/y°÷Z"‘d¥GááüO;.ψÀ2Àê¦|xÜ-Hˆåo1àô@±b¾@;ß.¬N³ŽË!zo¦xÌ*Ô+_¢pÙÜhGq\¦x½;y¢¸D ˜ˆË®NK(’gþõÊ#­N¦Úƒu^M½Û3Û½¨ÏÇõ½Ù¼ñn1ÿMÂ’fU3Ø‹DÞl‡Û›*÷nP¯LᲸ ôg™5Åk>žÉeºöP±p5ŒK‚…¸èÞåKªáJ–X$ká{Í—d´QËó±Ük×s-ýÚuá¹BÐ#„eÍ’”Ϫ")u\*b…Š@½"0&z•Ulˆ(æKLñ’'í(ŽK„Š£wå—qɽ˗TÃÕi‰D’…]OHþ8sŒàZ^qFCX­fÙ Êg `üVÇEPϬ†Ëih¹ Qf Eñ’GV“ébZR9d%ü½k°ã¾—Ü;}I®Ôj‰E2ŽÕŸú'úÞÍ>KO`4x^Z§:. 5ô ޲XC&z•Ul’'T¦&-É2hGq\Vg)º:uyFuzy®íK¤ Ò‰Dš%£6JO­Á†îгÑx»ŽKŒ™*Tv'‘Z÷áä‰3]NK2‡Œþ¬¦:ƒñ‚êžD¨(z§%——õ§_°{—/±—‘ÿ¡Hä³èÍŒåå P‹—aµ#Kë\Çå¢!‚,'OÄ” Ñ«¬b“ð't)Íë„N7Ç%J$$Œ$ôD\%ÄÕ`1¡4â7#; ¢ACw!HaËF$ª ~Gµ‰Â S¼ E¤0Óµ6?väðgu†Ji”/Q–èt•*„c$¡CчâG,ŠeåЗ(2r̤hŠq–"0ÅfŠÚ\¦­à›a¹ùx•Ö©ŽKá¿+T˜ðWî‰^e›"µûÙx~Õ꺋‘¸btEïŽëñ“ K@÷._"ÎAZÒð`0ÄmüR9/òJóýw«Dâ¢ÂXZ§:.k®Pù!ã~ê :Ñ«ŠB—*QÅþ,UÁ“ÉÇÕ°_äÅʉKËFÄ%÷nÎŽlž´Ä ¹ÁšŠ};-Ó¾Ø_rPÇuV¡òAI›U<Ï—|Ò_Òs\çÑûßý%=âúÅ—üÙ_²Éôygµ0)^Í{âtIÕ_ß§[0æ ã%R1÷çk¤éÄãdm ÉMˆOó7ÐŒµ0œYyͦSã.’ÔéÏ4AF¶¥e ÀiKoøíWô°?§'Šqä¬þ tàš©Šs½ w8¾#;vÏï€Ou&’Œ]Ÿ)þÆØ%»Û·Æ.ÑØÝ¾5v‰Æîö­±K4v·ÏÝq›j±½×:‡‹Ž:‡ ¿Ö9¼}ÑÃÎá’¯¿Ö9Ük3)W;‡Ë78êN?Šq¥s¸X¤£ÎáÔ®«cq%ŸrB¾‹»ýÍùùf,n¯Yÿ[N*¶/ù»lé9üU¶ôó •-ýpÑ•-ýøŸ¿Ê–ZÍ:)[*–mB‡•dÅ×_«$Û>üa%Ù&…‹•dåÖkêGV!ÒpñÂ"á –u†P½˜–@ªË4„…Ír 2aeÏâµW8jÆj“h¡c”Â’fiܦrïõ'©ýÏ‘qÖ‚¤ Ÿ­>ujßÇoªo°î»ý‚¸äÞåK4?„ZRo]2Ř}6½£Õ=‡åwT‰æ—ˆ@zš1ÂnxG‡ò}RN¢fir’Ö¨ï£Gƒˆ7iD§&4©?kåDãô.8ñ TsY-dë>ââ'ÀÝdúÀL¥slÄ¥Á »/I­áÒ9°H† ƒ‚f Èqb+Á˜ÚìÆ˜Õ˜€úÑžU©ffå5‚K“îÜŸµ€|de‚~“·|ÃÍãIA\ Õ"ã!È@\Ê/T ›ZÃUµ¤É3ÇÇÁ¿IXÒ,ÝM–ÜuÑBƒÞòÃ:.¾éê¶A^aÖJÛÃŽÈVì)’¢Y$:t¡ä=o [ß¹‹DóKô®PQ«¹B§WîP'^º -©"é4KfPÚ(=•{6]«õ(`€¥ðÕQÞyj¿CYy+“ÔÌýYPM)mUç^$²Ê»½î-¹vÒúË/ÈcT_Òyi–EBŸ%o&4(è8K^SÕŽ4ëÕà§ÎÐIT÷Ñ9¹œêŒ~|gHÒ©àŒNÏîðœã¡b$¤E­°ãªqIXÒ,.#»]$4%‚tPì-??x´CªLJ• ‚,¯ ÌÒÐ@69eå=êXÐPýY„“ç´£9®Ã¨ ‹>>ˆ :3(Ÿu5*(^óÈ`|¨ÉŽ¦á¿¾ ÔnüTiø·@íxÄF‰3b£óY_Øè ÓM§žìqýI»ØÅ©'åÙŽ¦žü˜ÁKSOzVêï}Õ½°¤Y÷UïNâÑþ’qý½¿¤Ómnºº¿d»8Ü_ò“)¾´¿¤˜£ý%¥–àÚþ’"Æ£þ’>“¢„òÅþ’.ËÓŒ"¸Ö_Òe Üw±¿¤Ë;+Isµ¿¤Ï‰+t±¿¤Ë*ZXÒ,ïÏbÖÂ=Å„‚îŽÞ**.ÙApÏ ˆâ/-ÙEÒgŠ™°¬©Ì¢Lr*ý¹'F·7eÊÔÉÔ=ÍZ><°JÍŽ˜óãtîy¢WÂ’Î-ØSìþFép"A½"°.) Te,Ä¥¡fܼiÃå.,ˆ$['” æPŒfT!¾rƒ¤E§ê ¼ó¦Î3ú5§ŒÙÈlÒ0¢›h­%;‰rï3Р ¤š=äÔŸµG`Ç%BEÑ»CEÅ%ÊVqѽۗÈpQKªH6iBÉøÂ±Ì?@ýÛ} /“Q¨Ù<¡Ãef+èœ?[4…ÝÑ›4¿9¿ŠÂ²f¹ÒÞLÐC8‘øÍ˜û³Èmˆˆ"kX£÷}0TT˜$ü>›ï^E®ª%­H²Ý|T(õ|ϱmã™CÍÊü<ßO0fÃðŒï6L÷8C¶þõq†7t® «Ó¬_*TèÍœ{ßqb—UTüã|‰¹ ögí¬aÇq‰Pi’' —hsº—Ü;}‰ µ$D’¶ïw4&¼#¬ÈÏ»šÛÕNÄ>ñg¾µZ8›û¨i”°¤YÕ ö"‘7Û¡ÇöÝ„ê)\~J>Q{lÖÐ#¸ÄÇ+yÂLó ™ð7V) 랪/Iá -éD²†¤õ'ÙøŸ3zRòÃÄïPXÖ,™Aù¬_ê¸X4$Pïr %ÿÖQ šâ¥µdÖN;v—Gï ½öhÁâ’{§/‘á²–T‘¬R˜§¨0~f3Zµ1„Õj–Í |–Æyië¸ø¦õ¤þëˆ2k(ŠW|ü9Jeº”–dYÔžª3ö³“ÚSå"5¾¶>HýTúˆ©5\úð‰„%ͪî|–†ŽË/ÕŽ»=èë¸hC\¡"Ö©Úª.«(ûÖ¤%•CVêCdam{i•*Ò’WƒÒ!.!û. Kš%3(IÓi4(è®8Ëý©KëTÇ%ÖP\´ùx%O˜éRZÒ9äö°»:C<,ëžT¤FTÓL‡€Û•C–«¦÷.auše°@‘` (éâ¬_j‚U€J¤Z1l_ÇåÂ)"beºˆ¢+¾î²ŠnÒf ×=yÜYXˆãRcÂÌyª©â’ ‚;Äeà _bŸ%€!4Hèî8Kpÿ¸L»¨ ö×+Ò3Å«èPÉE”{¬Y|sÈJø«:C¥4ª{R}¯'h±ü“Qµ9.Fâ5 ÜìCE‘Mx‰À“>«ú’ :ÀuèË X Æ/•óâCÈ”˜»Âú732*RÂ_åd~*'ÔeÛñâÈ—¨V·YÉ(Z´‰Eï&ahå³0Löˆ¢á’–ˆÁÝôa3ÃqIá¸N P/ö—”8ë´âbɦY§äüÕþ’Îg9T¼Ø_Ò1á:IÆeaª‹Öcú§÷‰?\ðŸ±b Ø{hÖô†›zŒe^qüÃvô±î·ì„µi–;·¦³åâþÔêªt~YeíÎã%þ)ø;¨°üÖè¾áÔ“bÙŠ¢©r¸‡%_ž *w‘ü¡Y]¢±»}kìÝí[c×eR¾2v‰Æîö­±K­ÿ‘H¤%¿´©jÞàÅÎárë£Îáín;‡DrÐ9\²Š×:‡‹á:êþÁH—:‡‹Ž:‡ ß{­s¸3\Ÿî|¼¸†³Ø;òÛ߬á,ö¨ùn g©GBOþWk8‹.`ËöWk8SëKd¸¤%‰öÖ!¡ET}†5©ÍN[. æ¶èºÚ»à7îaW%&Wh­„Õh–kdà³¼à–cÕúÞÇ%æ`,Üó=gqljÏï¾ÄðÎy]•¼_Loìžs …ÙtgîýÿÒàÇcÙ7ŸÅ92_eß"#í@úl,ûqfj}É5šÅ*ÕhÛ{­F³|£ÍÔ ëƒÍ¢G5š¥*싲Ùrø0ý櫲Y‰dÓ¬ë‹öÇ_¶Jœ¢èÖk¼?Çss>/À.cL©Ê¯}ÒeÍ’¤ÏÒT—Cº«úY „w«'µOàDŸº¾O÷¦õ¤îëH$ŠK‚µà‰[¶åKd¸¤%ú£+"¢ãüÂ4Üa^šx9k–Ì }–†‡ÒªG@qÖˆ™d•n*Ü iÅûseÚë…ög)Å8=Þyzñ>«£#ñûY4&ì}®2bÇÎ8¡ž/Û€““†äPXÖ,é dãÍî'SµÿԘ𛸠Qb wBeÓxJž0.1&âÒŽû.j‰E’Å€ZÝy¨•WëEì z.¨ïÍ6êãó{Vã‘˸ª «Ó¬ßІàÍTQqbÑ,‚z71\ $r^û³Dñ’ã2'¤L—BÅ=.ÙdÊ„¿—Ü;ëžh¸BKE²þäžU.šòQŒbùÇ„5'Ï¡j}6ãÊ‚JXÖ¬jD¢:.VH'Ô;c¸,ncçJìLÖP¯ùx%O˜éâdEEï —qÁ/¡á²–H$ÙÏÕH<+Là·5¯§Ê¢fÙ ÊgU‘4èá:.‚zE`*‡ÐþzQÊxšâ5 íÏjØÖBÅ3«èÜd×–{03Á†«jI¢HÖŸŒY«LõiïfŸ¥'hD¢ož9Jgº^gÔ¸þªÎ˜¢GÀŠ.ÐÄ%0:½õ\§Ö—H¤%‰4«ê\ë³ 0¤Á¿ ²+SÆÛu\$¢WÀ‰”®%Pòäq’Â’›²ãþ¬¦”f9p” u¨¸ÛøÔZú»÷êK:aI³då³äÍ„Ýg¹&˜¨ªv¥:®JmHU|¼’'Êt)-é’?0¯ A&TJ£º'©hjË£wb$¡'‚`!®V§YÆoBv‰Ð`ʼn]œõK™6C ÎèÏRÀáP„ÉgºØÔ' mÂ_Í@ʪîIA÷g5åŸ áTXͰOÑGKR#¬&–¡{§Ï2À$tWœåì—Êyö¤˜5TXn>žÉÕqM°H®P!e Ü»h×Çs–µI Ñd‚]Xí*xôŽ)zw\¯ˆŸfÐ,ÁîÞ;4(Ã%-‘HÄ`T‘”È訿¤èϵþ’"Ó£þ’bß®õ—.ú¨¿d“ÂÅþ’Ÿ ÔA‰„ÕiÖq¨¸=ÛaÉvë‹ý%©ÓŠdZS‡bôTš}uÚ¦õÏGèϸ6}׋|tâ„hÖ+ ?ò?cö|Å.¹ûÀƒäTÕ¹Õ¬qîèÖ0´Îý¤‡ Ì\ÖÇÈò¼ŸÄ£/Àýs—g›<ž/|ë¬ûÌÖ ú³`HÁ¹H¬Yä¿2v} Æ7Æ®Ë×eì:öø+c×Å2_»ÔjÉq›jQZn:ì.ÖòZçp9–GçúAçp¹8ê.u5×:‡‹?ê.1àµÎáòá:‡7‹tÚ9üo;ÑâüÕÎ×?±ô›5œ%·Ë٨߬áì2ž_­á,~ûƒ?\Ã)_R WjµD"yÞo02Û'™SíÔpÿ–=?2‰¯3L༬rrר®å*3/P»"aI³¨§öY\p«i }WÎ"¸´7÷}¬‹—ëO2 ˆoz½Á8ŒÁÕŒ#¤]ERî÷._¢‘Ò‰$›Ñ˜ÿ¶îC×ÉY¯êŸ³|Fð.ï{LVÙ£É/u tɳ¾¶„Õh– º i”–Ï%WGk–8âé>Dp7æ7@˜4EñËÕ§þΰúÀýnùäð â¢{—/©†+uZ"‘h¿¦f½ºðƒöÍ;¡µÀ[ÛÖ6–b$¬wvkA4Í ›0„gÌãÊžEž\Ê® M¢k§;xŠñ>G·×ð~‡q^0øã@Ëw‚‰¸äÞ¿ZxPª ?¾XxZa}µð DFG;(~~çÒŠ‚¢vPÃumņ߾)H—áJ­–\-H/ÿ ùÓ¯ Ò¾h°yŸ¤ÿ÷ꨡb÷Ý ‚i‘ì>x¡ýèºn­øtZ=jœ 1j8UjÍ }†Ð ‡Òª¡ƒA±jW<(HØRg‚îÙ¼?KýY|S}ƒF$ˆÞk¨XN¯â‚`".¹wùÍz•–øqîÓãøA­Y¼[ã³0ølzjÏ æ›êÌ+®ÿLÍ@Á•£K_¢aZÿ™'áª,†´>N:=;Ýyûàì¤Ó³ÓéÂg§çTÕ¹ÓàcuNŸ©sBÕ9}¦Îý§:Tçô«:ЈÙYò¯1»7ý´óÿÎÞØã­†ÛÝ·n·îµǾäêVß\Û_‹&ËßùsÑd‘Ÿ‹&·‹¿Mþ`¤¿MÞ†.šÜª°¿¢¼!¡¢CÑã Kš%3H_âÈHZ"‘(ÎRÆØLQ›â9Ez 8Š(H©áˆ¸öÀ¦¸P„‹îݾ„œƒ´„"ƒaº‰¬‡ø1% Øk(¿E”{_~‚ð_Ä€(‘ ª]Ñ [Q"-‘{¢Ïò–/$×À*Ô,1föYòšBƒr´¹‰Zbº‰Ü XCñ‰bÏ&’Lô™ˆµr+± …h:x¢öDúU‘ÍwkVW+1È›vÇ%BÅûXßk C,ûfΛÔyri‰‰\²îâãÅÔ›0•,’y§Ÿ7ŸµÓE ¤¬Ef‹æ&®Ú ²=Ï*¶;ƒö—ôšõ÷þ’r\Žö—tqÖûKn­/Qêêþ’í»î/)ÈáÚþ’íâpIÉ]Û_R~rÔ_’ZaY³.ö—ÄuÔ_R¤p­¿¤Tõ—ÈpuZrÜ_²Ýí°¿d»¸Ø_²áÃþ’rª®õ—”ø¹w Kb´”ÏRöŸÐÃû³ÔŸÅLÑ»™QÁB\âãåKX5!-±H”ðg)€ŠjùÀÔ$Oà7#¨LA µ´¡T½S—Cˆ‘:Ǭ¢½™ q¢@½ûÉq‰ÛPôî™=ŠK‚‰¸ìÞåKœC~ŸTg¬­¢èazD5PF“ þèY¸mÑã ôâ¦Ø˜0²"j|£{Êû|,V¨TK­T¢×3ô…•/Ù#°ŸÌçÂ@šˆó£™=ܜ ؈‹îݾd7\©ÕŠä¹†pQ%úš+ÐÌÚ4þ\%²{™çjbã÷GŖϵ`9êGïï0Þ–4Ë:G)o&èaœÈ¬¢"0‡Ëî¯'~kHæG„Š·­+Ó¥¸D Xˆ‹î]¾DuOÔ‹ä‘íI­œ¿/¬²ž¢„ü¹Ž ž¡Gœëç#;Œé S5¤Y¿ÔqÑ›©B¥âÄíMêÕ ¤Í@â6˜/©ñO‰OIñŠùQòD™.Fï5T,q=âƒ`!.¹wú’j¸R«%ÉœE\Å8ÏÐ’üuCça×þ ‹šf°‰JëXÇ%œ(PïLᲸ fÅ:_b>^8ó 业2þ¬ÎP\"lÄE÷N_†«Ó‰$ƒýZCû§X?baI³hí³ªHºgsiê¸ø¦M…Ê#¦{™ˆR3(^óñ”˜¥%µmÝ Vgøì ÆLçÍ ˜g”ŸÊ¾¤~ÞÔ~x‰¤ «£LŸe€q\€Úi½KëTÇ%nÃDYCQ¼æã‘U”}s}•rÈJø«:ƒ—l¯¢wÙkYr".»w™§j¸z“F‘T3Øù,šN£ACwÕϘ %êÒ:ú` ÑoWÞùz'®•–T˜¢¢‡ˆvt‘QðNEBF¢«6â’{—°¤Y I·zº+Îr™¶j‚µºFD1¬ë¸T4Ä䉋*-©²ê{UÁ|IƒãY¤Fì/ŽKñ‚£wÆ„ºÁB\ p¤¦ÏÀ¬Ð½‹³~©œgÔ¦x®Fz] èÒ:Õq)¢T…Ê…vñ©ë㵈Ѯó%{„ÜÅÎÞ·ËxÛUð k¨˜aµá%ͺBRú¢Á&ÀU軎H›:>ä¼&øƒþ’ž«9­Pù ¿¤Ï*žçKþî/é8®óèýƒþ’qû’¿ûK¶2͈ô(F:ÑÖãÇ»&ÞòÅR¥/îÑhþ~½ÙÎ÷ŽÞ$ìUýŽkWÔ¹¥5N»°†0įLjÊÅ Û¼NýÉ3K$Ts˜‘{ÞKìÍ_—µîˆ—M àä8¿¨%p9Ëøm˜A Ÿ‹äc—hìnß»¾þíc—†–üÆØ%»Ö3]6vihPÚ‡Æî¸MµhýµÎáb¸Ž:‡·7½Ø9¼Éç°sxÓ…‹ÃÛ ;‡S+¬:‡Ë‡?ê.ÞùZçðí´s8 ÿ¸óñp çf{¹Jþ«5œ%>Uçýk87™îk8;a]]ÃYt£<¾ZùI›QÏ}‰ —´¤Š¤dîî0# )ïàÖ²ˆr0LÚ/ãZP«œ\¡5¶ï ÃjÑCºÙÂ/´üpgªG¤)_bŸ5²G`œCßõ#ÞãbyÕ7Í~¨|ï3±±sx!…á1?Dî]¾$µ†KËj%’çsœaãïÜ û–ø7MäwÿÈM~©k ‹–ºâp­P©î£-'¢°¤YÜòcŸ%€1NèQãêhÍ‘aÖ0BXC4´gXƒ†óŸ ~bÂÙâ²{—/‘á’–T‘2‡?}æã†ªÊØÞŒìUý+™59IkÔßùˆ U$c„¤V£Yš-,Ÿ¥hJhpzÆS?—Ÿ¿SªMî@œÐDº6;–e‘ v%Ëçu¯ö-«yŒ9ÁB\ R}Ij WÕ’^$Ù ‡2eýA~Ž{+šÒ{¨&'mõa¸æø¢UX­fÙ ºœHÓõU½¹C÷rBhjyŒ1â±VuÕ÷™ Låþ¬!ê)²å{Ô¯³^pòËi\²ƒàqɽ˗ØpIKv‘/ƒý´Þ¯©> ‘q£ô ž\Â’fU3Øù, ¡AW?+Ζ€ÔÏé‰rÉ|F#6ãL˜UËX`R œÃÛÀ!C~šg'’ŸmwÙn}q»Kj —[_Üî’Êß9ØîÒiÖÛ]:4(è~¾ÝåxáÎv·¿îlïó÷Â"…³…;ÿé¾ù­ûƳ3¾iˆJCI|ØuüuÒ?|þbÿgé¾N§Yõëù¬Kíbú:ƒqõÀvRøêÀv'ÄêüÍ¢¯q}µè+µfÐ>ëâîµÔšhï«»×Rk«¼‚òâîµÔÚÑsÚÑŽÒýY¯ØL'·k‡,WM'^Ý»„Õi–mˆDB€!4XAIg Èâüˆ”w¶ß¦G—¯÷ØHâ!a ¡ ás&¸Ížã¡âè€qI€àqY³ä$d¤%Dƒ‚î ¨ÜW ºIÜ Ã ¡Û÷ +E _ y “ ­78þÅÍ& Ǩ1„3ÇÕLW©›…*ZXÒ,™ÁÖgqÆ ¡»Dâ X ÆHwÜ ‚o†åŽ76%bMF¡.'R䪘VÑ®âà_ò%":ÈWr¤å¸ºé*ŒÞ¡Y2ƒòY|Ô¬%ˆq–‚b1¢›HD‰¢yʼnÙñ.fdÈÕˆÅ!¿ãÉ<â„ĉG:Naý\ ‘£…HrQ´£9.u>N1{³ µuRöÍÍŽÜ|¶û’žÁÝ$nD®Xwmù!-ܰ“ä-Íh’ë4 *~Ì©Ë‰Ä¶Š‡=Ï*:…% žä¼…%ÍÇåþ,Fï …¼g9 ¡…Rï3"W¬»R$JžŒÞ‚Av_¼¿2È(‹Ðä”y`NBÙ å1νÞt¸¿¤×¬¿÷—‹t´¿¤‹³>Ø_rþëdIǺ°¿d»Ááþ’ÔäÍ>Ù_R¬åÑþ’MO/î/Ù~rØ_ÒeÝ€w±¿¤ã¸g]í/iW“T¿Ø_R²ØGý%E®õ—¤á¬¿¤\\ë/Ù³ÇÂ’¥söY»7ëР »@½"0÷gíÑ{Ç ’Èm@°øxä³Â—t™b¥õ%Wg°nìõPˆëC\92ðT¡Ú„u(¿T¨XŒÒ¹Õtöf‚Ê—Ô3«árÇqY½3Tt\RAp‡¸œ–”/QÂ_Z²‹d“é0D—ÂZ…’Ä¡~ªµÖ0JòÁ®öà¹FñlHaûõb-"?I£t.µRű^k@œXAý}›‚ù9¯½ò¤ ̲æ´Fï©MžÔ¸äÖ`!®Ý½Ë—¤ÎpíZÒ‰$µŠjž!JëV;5î9BÊß÷=R>µP/ß A1…õ[— $½™ ‡pbõ]VQá²ó%$¢Dxæ9.'O˜éjÒ’ŒKvÜ#.¹wÕ=ÁpYKªHÖ»-ÙÖ¿3¿Â¬gÌMãùm-kz'¬V³~+­“7㺊S êÕÐápYܵ±²†…1#Å+ÆYÉeºÐ'Ñ{êBÅ=.)2%âRûèîKRk¸ª–t"YgÉW•™rÐVÿÙ”}D=!–4«šÁŸEo¶C¾Ž  ¾‰À.‹Û؉¨.«hŠ×|<ÓÊt=ƒGjsÈLø«:긄[~Ä…b_"Ã%-©"Y¥å;õ?é~Gwã߉'HôPi·JëTÇ…c6õDÔ̩ݤxÅÇ7õUàßDÎSðWuÔ9=ÑtÆÁf§Wç:N|§ UKzý¡fIç䳨§¿ÕË«Úñˆ«©ãRѧ«˜â¿;–.«Ø +g¾DLÕ»Óë8.9J¹P—ÊíîÖ¿C\rïò%–ýÏ.’Îg `ÐÏ”ißdR.ü5¬! TY‰ðëÖ3A69Á¼ ¡á­‚“šîG×–†Š´ÁB\–4Ëø>K"$Nü¥r^½ÿæ6<ˆ5ÜŽ¾Ž AŠ3]NK2äñTf]JÃÐÊä<ñ¨u— «ö)Td\ÂêcšAÇ?ŠŒ3í"iã¬O›ŽûK~ðÛqêåþ’-Î:-‡¸Ú_²1§äüÕþ’6®oBÅ‹ý%ç`Ãu&’­ƒ/.v1þø¬hô"ݵ±º^,S„ØëE=;ùj@ì<<ã¬/Þ k;ÊìÜRýÁcÂîÂì¤"W?KâçHr®ýb0ƒ3;Èǘ¤.,éOv€Õ®-ÉïøSô–gc0Wk™_û9Ä?ËÂÄÅ Ù¤!Xœ¬šcŒ*’ß5몱ëóYß»¾ºéc×±R_»Ôz¦¯Œ]jüOC*AK~kS弚«Ãåâ¨s8u`áïÎáíóv—ÜǵÎáívwšõAçpÑ…£ÎáM ;‡;ÃõñÎÇkk8ËݰÑü«5œ›.h3Ð7k8S+¬¯Öp)`gêWk8SëKh¸¬%IŽK£¼¿QeýñyLj52€ÙSs_ƒUM®PIï}àh`UxqÜsŽBXËψÁ"S8q Ëó¸hí³ö·ƒÁi }³îXàMR@êügl瘥ö¤<ÞÓ'îÀÙ†«jI¢HÊẅ€¡È›»ä&ŽQÆz·†ìÑ~ö/ÌïpSïéÅ.Ÿ%î¦ Âïl¯‘•çðNj–G¤Ñg`Ìá´:šÓ‰Ì~­ƒ†+î}Ü#ƒ›mòýÂzÐò".Æ2ö%2\Ò‰$c‚ÀUù™Ÿa‘†;ÐíýÎådq4ßý?°Hïg ‹Ý&G–+¼8îYšµ›ÁÎg5¥N@ƒzcºþcÄÐ’})ûöÝ0ÈtíÊ= ’I¬Ð0CI"¾5ˆËî]+e¸ª–$Фˑž{†XØFG“ÇÚþ9TH>#ÊyÙ¡³™UaÔ,›Aú,rt€‘²_A§Æã¢Ûã9ȉ¬Z5Ãþ\)Èø‰D¢¸D ˜ˆK[¶åKd¸¤%IŽ ÐÜôPÿFÇówÔjû†1ÙUX­fÙ 6Í@÷,4¸C÷.ÎzÞ¹01{t6 ÄË-¯N|߿ŧ˜NÔ¤×éøÇ"a¨Xã’ŸÌÝ|Œ¸äÞ«/é ×®%‰")žöyØE»{€_ °¤Y¾à?Àôf µüðAý 2ûk§öƒèSé#êó:y¿‹¤«Á8.×ß”öïrý>#pX®ß‹ä°ƒ" ×;(:ŸUF‡?è Ø.;(~2Å—:(Ê­:( C{ÖAñßy÷ÍÕuD©}‚¯Ö¥öë|µŽ(µÿìÃuDÇ­†©=U_µ¦öÄÕjxà³¾h5ìŒóVú?S«2.!¿Øý™¾u²ñé[WÐkÖ7®@¾1}ë þÿæPÔ&$TÃýYí(…Šs«Ê?ƒÖK¦Ö,®ÙAi‰+Nìã,bK¡NÑMDªa;Ö] ËÍ@Y!ÛöGw0÷S çl á9_±ÿö¦X(Ž‹‘D;ʡ◤VXÒ,»wû,.ž7CwÅYŒÀÄ`(j7ÈHϬ»B)¨ÙŽÀ¦Tt šAÁÂ$P5´’HŠ.0_¢ØYQ5iGEâÜŸÕòP¨È–›µ4¿—hÆÁq–‚b1;·ÑqƒâCÈ”8E"v¥ù© ÿE 2ð¨ãJ3”Ã7b®;©‰ó–“Ãd¥*_õ#Ó`²Äq™ýjFy¼Nì››‰¸èÞmÉi¸Ì`ˆn"7(ÖP¬;™Fç³D…‰$3}&bm§Ün$ãJ¦˜Œ3 p\BLÄUÝnÇ`ÈpIK$±î•oóYN>ŠJÉ\éç‰éÔRÖ$³]á%¼RãIñYÈp(÷¡¬HÍ—ôÂ’fÉ Šã¡"ȦPQ›75oƒIî]Ü  —Xw¥H”Ïb¦Ë™b§õ÷$MêÒ7Jì0å£dPM¥åÜ<¦–œt:Ü_²½éáþ’N³>Ø_RËÑþ’.Îú`Év÷—t¬ûûK¶?z¸¿¤«Áø`É)Ó“©©M³~°¿d{œÃþ’Ô «iÀ»Ö_RpïQI9ä×úKRCä6MÖûKÒð_'ý%·®àïþ’Ô•¸áZɆCP¡baIŒÒ9ù¬êÍz4(èNP¯L †ög1zW¨è¸Ä XD»{ï2Å2\Ò‰DÕMµÈ¦d±Q~£Â—쨘g/óÙ.ö 44¥AçEC£uŽóðíÍ=Œ ê)¿ nCD”Åõ k\’ÚL——rÈLø»:ƒuƒª{ʦ!4ëÁ,Ücm—¬àßÖ®èÚã¹~‚Ö}áj”üKÔq©BÒ’õÊ‚‰Ê*Ö¬ hæK^gD”YC É™9C’É…ŠNK qU÷ž:_"ÃE-‘Hî„Ù4ÔÞŠlüßq²f‡Lç÷;z+²YRN Kš%³TÑ¡‡p¢v¸(S¸,nÃD”XCmœ'/ü¦L—Ó’Ê!ïqI"¾µˆËîEj2\UKE²}x—?§÷ ‡<ð“WÔlWauše3Hio¦:®'¦Ô»ÇFᲸ eÅ[šâÕþ`'OHo’ãâþ,'ü*:.âÚÝ{j}‰ —´Ä"_µ÷?_ Q"aI³ªì}Ÿ@Ϧ§v—І.‹ÛàÞ1³†¢xÍÇ+yò<‘©¤í„¿ª3XJ£S¥óæ“È3ªO¥¨Ï[?|¢HzaQŒ°D_E’Z vªªi\ÇE"ëâf Q¼æã5:ö­™D›Hk);* +Û«"5ÚëÆ’ÓÆËÔT#”Z_"ÃÕ˜4ˆDfP>Kã—2múF ÒŸšÛh긖cŠW|¼ê{éRZR9db “óÄ!B(Â.B5*ÿt­.1’Гœ¸Ü»?5«jIç³0=Î+ç…-.šˆ†Uq/qS¯´$ñµ·0¹Ðºq<¾°¿¢Å *¬VË ®@°á15KfP†Ë0œ"tWœuÜ_òcì.õ—ì|oß_RÌÆµþ’ÔF®çYÅúKRUŸs\ô—tšuޏ>è/éâ,Åãôˆ¯Lã´›õBemÕ ?Ocü$ƒèÜ}î…µùvniÓ2½1t›ó-?}1 ñÅu¬¯áÎbžÈÍ“ÆÍpãÕr×çÿ?øy¥$ëO&ØujWtÑ?„~ùnOm»OõxÏqq.3¤›¾2v‰Æîö­±ëòõ_»Ž=þÊØõ,Á7Æ.µZrܦº]pëñqçp®w—[uoÈábçðvqØ9¼Éôbçp+,kÖÕÎá"¬£ÎáM §Ãÿ´ó‘Ë«¿ZùygvÞµ†³ .ýþf g§Y_­áÜ4K›¹?[Ã)_¢ ”ÆÑI$9àx0býˆÙ9„ÄœÆlïÑŸÅ`Õ“+´ÆvÂ>Ídvýè{ÂJÀaŒáùb(ÓòŽDHUÌô“°<ü‰˜O>K n9…Ï)¹ûü˜ÂM=‡°bKŽî"Ú}qÛúó¸äÞåK8òÀZ"‘ä߉XfÝ刜ÑûßYØ0ðß“_Ìu, ûX’kë¯9û…ž”ü èÏZ"(aI³¼EÂýè£Ì |…ŽK=HÝÓáóÞ1X~7}Ñú­;)Tù¤Nr”©¤}N;ºƒïâ޾Πq]ÝÛ׋d7ƒÏú`o_gˆ«‰îŒööu©ÚªÔZ±««%’ò¦G}Õr” =î«Þ¼óa_µœxñÛöU§NK$’‹}Õ]N\çj_uj<úI«ûv(þnu/ÕMg­îÿÁ½ÿ†{¯†"©}‚C‘&_ b‚‰ãRØç½¾èÏjå£f-mn¢Ï’/tçËÕ ø64á²iqƒ ¾Íº+¬P^e5S…*>uäZcÚíAíV‘l§W¤…ò%š/ „äˆ8.*¦Zlß—xóÝ»¡»â,D‘J;ÝÔqƒ¢¨FrgŠD„Wå]RËȈ«‹£ Üd~‚*¨lÑyVÑ),…•B,Hä¢hGq\&T„ܪ¸„ Xˆ‹îÝÕtd0¤%¦kß(xR¼$Ïa,ÞRŒfå:o- ZùÑ-¢änqªb[ϽÊ*Šh7¿“ó·^XÔ,q\r,ŠÞÕŸ¥¸„ Xˆ«IPÀ—ˆ”–H$5EÒæ³œ|T¦X©ej® µYå˜yðne+ªH ŠFÒIé(g™Â’°¤Y$í¨øTÃ*´?‹q–âƒ`VÓÉ!‹È뮉òY5ù¸Ý™b¥õ]ƒÁŒšsmÊÂ=¢ÉÍ™»šÓ+q&p—Clï£A‡ûK:Íú`Évq¸¿¤‹³>Ø_rë@°ö*^Ü_ÒŠDÓ§/ï/¹uYlNƾº¿¤ü³£þ’¶*¬iÀ»Ø_ÒU¬)κÚ_’Ú¸Ä øbIjµÄ]XûKJ-ÁQÉvq±¿d³–,¢°¬YÒ9ù,e=œ/QœÅL †8.*ÚŸ%Ö]q‰A0—Ó’ô%JøKK\Ý´×=䀊(ÕJ©ŠªÖW݆¦òªÖd­wsµÖi—Ä(«2uÞLЃ8Q ¾ÉÏa⇸ Qâ¸H¨˜Wªâƒ`!.%üUÁ-?Ö‰dVyGÔ¯[Òq=³QŽÕóµÇù1T Ÿ–Ö©ŽË*†‰Jô*«è ÅÃ.AD™5$í(ŽKÉ•n)-é²@0—Ý»6&¨HMZ"‘d ‡^æƒËwŸÓ;Âì§hš°¤Y®v¤´7ô N¬ ~³HŒÀ.‹Ûðx ±†;Åûƒ-ÁÇ+y¢L—éæÙ[áê ƒ`".ºwû’Ýp¥VK,’ÇeÊz @O!¬N³Ž P{o¦Ò:×qÔ«BEᲸ )Ê*Šâu¾DÊtÑöŠãRÂ_‹Šô zàf ?ˆ|ɩыd‰0ú‰~Gw³HTŒir Näs¥¸z”S¤˜âO•Q¾¤ªYjÐ¥[TZ©³êžÔŸ%ãàòOkx邵D"¡fIç¤ÒS—iÓÜÔÓD»´Nu\"¢è LñŠg¢WYE§%µ¿^ó‘TºEÚQ—%]hSþI·ë–!.z ùyi‰EBŸ%ov^9o¸¢l‡8©?†Eªã"”RÂkÎt9-I0'˜ç|É S '4]þ©Z]ög Ð Wq ‹É—¿YK$¢Áš ~;+Ó¾Ú_ÒÕqW¨|Ð_ÒeË—üÙ_Òq\çÑûý%=â:÷%÷—l±óˆæôÔ«Ã_ë>gÕ)ò ùbˆIw+½ X„¸Q[Zã4 S Á,øøð÷ü$¦1×óùœÿyu¿óÊ0A>ëâ¾zëa æâ%waU‘¬ošDhÉø:1Κf#[·¸õò^‚¹¿—hÉ:ÉÆ®ã¿2v]¦ø+c×çO¿1vipŒþ±K-JûÐØ·©nÏv±søÇ¹t§,|Ð9¼Éç°sx³H;‡·vØ9\õÎáN³×_í.Â:êN­áútçãáÎM°Cù»5œ%/áè߬áü‘)f³†3µfð«5œ…sÀfÔs_"ÃE- ‘lüÛ2¢˜tµ(õMß8ecu¬jr…ÖØf1 –Q¤†¢¿á´SC5 븱zƒÕÛ×[F¬ÿO° «Ó,™Aû¬7·`pÚ…âúŒâôfL‚7ãç¡Hª{—/Iáò>q‰äþÖP¾Œi"–Qܨ‰ÚÕ¼ä86ŒÐ´ §·g¾K}ˆ‡¢s¾? L–‰ ¸†j¯3¼˜£‹DÂ’fyø}–Æ2?±-{±=wEq}>Ga:§%¦Úþ†¸èÞåK´ü]ZRERò§chÉ3[Ë05Š9ñC»š3Æìô,Ô~ ¡2M¤†¢«þz‰ÉŠø?5Kf°™Ç5Ç„¡ÁûCƒWTçš{±5wEq}Æ4S(Ó)âÒ`êKRk¸ª–t"©èöÖC)Nüà®fY$ÿú­×‹¬³ñy›ý2ãÉ?Ó ¬Yü£òY~½_[¤~ªÔ:d}^'BNã’ ‚;ÄõUQ×–¹;¬³ÛþÙÅ:»)ÔÙÝþ¡Î®÷Yj»Xg×U©\åj]jCÅ&¤ßèÞåKRk¸>˜^^ûÁˆ…»2¿ZßiÖWCë‹°g}3´~³|˜jûËÐzFïNKº?kÁâ’{—/‘á²–hr,w5¯è4ðÅ ö+o† åÍ~@÷ŸÒ¾©RCÑ+tïã,µüˆÁ)ŸJÄÖIáõM3î·þÀ?²Ç„ÊöÏöèýáG¨è!ÁB\»{—YO­áòÂ7‰dbƒÊÄCþŒv Ë‹åÜ¿M—C€!4è¡èŒ³4NË-?¢›FÔ“?–9ÎNë?ËÂJ²%pÈ: lìDÒq\"T½;Tô‚›7…¸äÞåK4¹œZRERÃsš»Ÿôš%3¨ùûtÏ&èî:H¾©¿Á¢ï¶<ž¬zåŒÏ÷k¹_,Øù¨œÓŽnÒÙÙOUwÞÜŸe¼Ð;«ØW“ÿ¡ UKz‘H³¤sôYÒSǧÔmi½ì ÛµüÐîèøK1ªÊ¤V™¬f#4ëœ ®¶³½&T½k‰¬‡̯¿ÐlΈµ°¤Y»HzŸ%€A?'(ßX½fçOI7¹ÒÞ™N¢ºÔ:¹œêŒ:7Õ8°{äë¿ZRZ¾,ÒWKJ{ÍúfIéÎ…f}µ¤ôÖ²îÿ«öÆÇÿ=D¢‹އHôò9"ÑiÖñ‰[k¸Ž‡HtqÖñ‰ârþ"ÑÅ€ÇC$nmør<×cóYçzl?9 ò»Øù« ¿ë¿ ò;Îá« ¿åCþ)ȯ?I§¼Ëm¸Î»t<’SXÊ—•_U™¬Žãjðy11fŠKv€Ñ#.º÷†³ãt1ûkwÜ ˆ\ò‰N‘ˆƒ¬ìdÇ[Š>S$)7‘qAÓ_Ï­_§‰^1´ân+«Ûñ½• –°ºão^Y›7*zHA0—‚b1.Šä5·NÖ]|¼òYJ>*S,Þ_ô³ˆéJY§†ÌÍx'å1j†£Ë}(…¥|‰…%ÍR|*Ÿ%BEÑ»BE )ØAp‡¸D7‰”Aë^EÒ峘|t¦XÙ1'iöôMê;Lù¨’i"%B$mÐmBÊ*«(aI³LÎËg)¯I4(è®8K¡¢û³‚…¸”§%ëî‰òYÎ#Sì´¾j0š$'ÒŸ3:iœ2U2µ¦YS“€ý¥BEöãý%f}°¿d»8Ü_ÒÅYì/¹µqIÁâú`I§%U$] ÆûK¶‹Ãý%›Ïº¸¿¤ˆþ¨¿¤­]±f]í/éëjg]ì/ik~̺_í/éê‘<ªõbÉfô—lßúbIWÇ%aQŒ6ƒòYÕ›õhèÖ ž˜ŒÊmt ³î —TÜ!.¹wù.W7í"Ù|=‹ÔT¾V Û¶[³äMÅp¦T¹€î¼´Nb”ÎU™Zo&èaœ(P¯¹{¸\p/¹ Qb Åq‰¯Ñ{jCEé@°þ®Îj$ÞÖ=¡HM"¹ßïÕŸæ?°5ßíUOïêŽgÀ¼RX‚9ý½Ú±Z$H z'*÷®Ðs ˜Â%ÖPLp¥;ŽË뙕–Txɸ¤‚àÄ÷Þ©ÑpQKªH¶ï6=°²$Ò¸õ8EQþtŸÃ@JXÒ, Ê@Ê›z'VPŸÚLèVÜF³Q–¬áNñä >žšEÚQ—rÈÂo®Î`)@°—+ Ù«(õkI/’;šŽæyº÷Âê4ë—š` juÚþÔ]—ÞTß@܆Ìr;¹)^JAòq¦‹2­Òî8.•Ò¨îIç­žÄqµîÑŸZRE’:aIŒða™¶48µº-­—=p¸,nƒõ½b Eñšwò„ûÄwË—:›(k©¡Ûäd{«UN½nÊ?U««–ú…jžRk¸,,ŠDfP>ë¼r¾éCæž¾>P@—Ur¦09ï¡Ûàß„]„j\þÉZ]a¤ŠžzÄE÷._bÍ¢–Èg `|ØÌpÜ_²ééiêÕþ’-–9-‡¸Ú_’:/þúbɆ¢OCÅ«ý%Ï’áúE$Ë "ÙŸٷ½¯Ø7nÌïöŽg{D$>f£ö`ÖvBع¥5NïÇ=²Ø#ÃØùmƒ÷ù…ÊÒÇ‹£›g ø{ákœ=ùëõÎÁ©¾°®pÌ.º¸xI£$’¬XuFnVí%Ú¸¦y€þÌ#Nü<¿Beæ%ü\ÉïšuÕØ¥¡%r¿1v© y¾2v© Ǿ2v‰Æ®ÖUc—ZÿãhŠZòK›*'Ì\íÞ.;‡ r¸Ö9¼}ÞÃÎá"…kÛžvoÏv±søÖÁˆ½s¸xçkÃáútçãÅ5œÛÝØyÿÕÎRAô$òþb 禧ûÎí ¾Yù^ö䵆3µ¾D†KZB‘¬à4rm«Ë©~axM˜,€C£"´ä79è^Û;[,£9õtˆÝWNR@þô>Fî£ÎÄLC[¿ó¸ žÔøã uæ&kj–9.ù,-¸Õ…¾ùˆ7˜aQüι{p–áªZ’(’¿ÅYˆHr2àШˆ}”Y$˜´û‚»©4•Ã.Y<Ñqð‚SÍ_7²<žO®ú·q •ÉÖé ÿƒÝ¬Ò,™Aù,Œõ[Õï¶/a. C>Dæ(išE"Ä¥XF¾„†ËZ"‘TX$œZƒ¯%¿:Êún÷‰ÌÏ^ŒPrâšS?Eë‚ÿ¬­E]4ÿ¨GûÞù Fƒü üT¶þú¼ÂUU$ÿ+ë®–ž¤¡­fø¦ô¤Ô®4õ×ÿ\zÒ¡Á¯JO6]`nJ"Q\òÁÐàÔø’“¡ÁHŽç8oozqŽózq<ǹÔq]›ãÜ™Aù¬«sœ·ÎqÞ,ùÅ9η6TÔþ,wÄqyK=RŒ¶UKER>—üNϨjɺÈÂ÷WìÇx½ÌÙ~FR#?M¸+M aµý?Á94>‹ƒhÐÐ]qÖ –ü¹ (Íñö3c„¾Ù`ÐÖ.’ÔDïnÒØ;Õ`4ˆë:d¼e¸¤%É 1ãYTÓ½fì‰Ìb=}gô‚ÒÔ˜Œ-aY³šþ9¸© 0nC‹ Ýg)(ƒ±Üuæß {C&Ôå?y™wL7þ…PU©PÑKÕ/Ä%÷Îb+®ª%‰")’£ûß‘^ùð…bÌ8‰UX­fµûYš*ûF4X¡{g9(&ƒ!ºé‘£d"±Ç3G,1Ê}M«@XQ5ñ Ç%öXÑ»BEÇ%MG<—+KéKd¸¨%I6¤ìY}†¯·°¨YÕ v>ËýÛDƒžSÏ8«Åå †[~È ®õbý‚ÕÙÆéÍÆ…‡OL”xD®-nÝýQ?ŽT¡b»±ô}øA<ùŸÑŸwÿð‰"é…%Ͳ€!úz(:4¨ƒäÒT>KM@7¨C®o-)H>UrL%«¦Ú„¨ÎUÑM@gš¥.–'âŠì˜|‰ —´Ä"‘”Ï"ÀQõüǧ0Ñb0<§ž_®@I¶ªZ±Î¾UË×ÛÄsr~D]<ÉQÊ…Ò¹Êí¶KÑß ®’£°¤Y36&Øg `z”®T Ó2?miª Tõè­¯° ‹ø@ÈA˜¢Šdó Ê—4z2iGAМ¦^>jÖÒæ&vÄqA³ìKä³ÃÝg)(V ÀÁÜ Â ±îJ‘(H!VŠ6¾®È»Ã俤°þ³‘ùûÌÇK²Ûøôã%Ù‡sН¿61gû;‡sR+¬&æü(úÁÄœÔú’&攋£‰9…'¿61çÖRaÊ5ÄH"Ùu¡g4»#ö£YXÐ#F³Ó¬Í q]d4;nP¯}•Ñì2ÅÇ$³~§½[üŽSõ³‘i.:½í%÷®s‘óŽO¥Yâ¸è³šè¡¢âuÄqÁÝ$nPZ¢¢ óYN>*á¢TŒ3ÌÔ,B—_¨™‡í"'q^I§íM¹eAYE¥°$,ó;:ƒŸE€A4(è®8ËKÁ`q9õG"W¬»N¯òYL>:S¬„¥R™5£ÖçÚö,Ü­ÍÏ)sÇœ^ˆ$ M…Š’¶Nç"Ñ묢4ËÖEä<™`£ABwÅY Š*jc©;ⅸȺ˗ÈpIK$¥õUƒá‚U71WÝd±‘ß®™ï.'~^4¤¢‡ãý%f}°¿ds,‡ûKº8ëƒý%åøí/éX÷ö—t†«jIWƒñÁþ’¢YGûKºúö—ÓyÔ_’Za¹ïbɆ{ûK¶‹‹ý%Û 9ì/¹µqÉý%©õ%ͨÖký%]­” «/ö—¬w«¥u°$Fêœ}Võf4t¨WF£r7(Ž‹„ŠS$ µ?KiI!.¹w̨ºIX¤æ"OÖª Qõ‰µr1 MM£EŸHŒÒ¹j SçÍ=‹êíár‰™/!%ÖP´£8®J¨”Š5dº**.1<âÚÝ{j}‰‹ÔTQH‘ä°&NÈ’=mÔ÷>žCÀð'ÖœŒ/PG種×d—¡q¢*Gj¶ùz­"eVQD”YC’ó• Þîæä 8.§%•CÖ¬ Å2êÇ â’{o* Yë¾kI¢HÊ¡¯™O傞¡lãRXÒ,éœ ¤¼™ ‡pâêS ‹.‹Û%Ö°R¼›µ¯ä‰2]¼sÈØêê =¨â©©¢P¯T««H-‘H2^\ÙÒiÖy™¶½™–Bí)uGŒ‡O°H–G9yj¿ÃÉeº¤fwUA5¥´"TÄÐx–Ë?µålj4BÔ…ª%©–4K:wZ9¯ž™[ƒzF`6Þâ68¯Æ¬!)Þ†gòD™®Ý¥ÖM™œ',§'wXej\hSþ©Z]:d#®Ýc¤Ö—XXÒ,ŠD>«Š$uÐã´rþƒþ’Ô¢ó:®úKR ÙγŠô—¤Nžs\ô—lozØ_"aušul¸R«%É# 0L„êCNcôM=Ç9lHS-ÌÎ-­qZå~á±`B튑M*·Rnwbòåü¾Gœ•(xØü:¡LÚ_ÏùHæßfôòäÿìŸSV‚99iQS|ý2FL;E>ëyÏ!åûo‘H³š8ë c׳îß»¾ãc×±Ç_».–ùÊØ¥VKŽÛT· -9êî‘êßÃåu— ¢kÃE GÃ%v¾Ö9¼=ÛaçðöÝ.v¿pÔ9¼iÖiçð?í|ôð/Öp–h«¾ZùIAÛn¿YÃYò A!~·†³çß>[Ã)_R WjµD"yfìäcB?‘*'Wx;ìj‘3žå6½Ñ9¼Ìà‘²¥ŠÙg|¶uó ÇÑ ‘?]^süD3ý\mUÔ,8£–4«šÁÎgiÁ­&J˜ÙÎñÆÔ‰$µî]¾D#¤%‰ü©ÉM~ÑvX}ƒw>=ßT-¬Í@O”ùäø¥œÙjŒ‡õŸ¥öºµëwð8zPo²ÖËùµg€9^}Dû9ñSÄuœú“áJ–ü’úûO6ö@6öxŽfêÜ;}ÉÕ9šÅ;ÿ9Ú´x™?G›NõÏѦÛÅߣMS+¬ãѦÏ:mšZè~<Útûˆ6Ý"#Æ%a§|Ý;}‰µ^ZâÉ}Ü»V€«¹GU–iT½>–wàë5õoªöê€{«+܉þ¬…˜BÂ’fÑ ÊgU€Ñ¡AAwÇYùAa¦XЙ{LËÌ¿ƒ]ô‡¡â­K<R™b¹wšhõkJK$’•&ˆZÐq‚2lŒ‹ü¯Py5Ï(“‹Äh[-ìÕáÚª°zÍ’¤ÏÀÔЗ*(¾G}H~Uå!dîPYE}i–÷މ í(4Hè®8KùSÅ%Z)Ä%÷._¢Ü®´D"Q¦X9de—•wvFZ‰Q¦L•LUšµŠ¤Té [®<º2ìʽSXÎ/È :_Âì¿™`CwÄY н«2q‰A°—Ý;}‰ª&t®]iÁ Ug¸åGå,,pɪ…¹:༎ËmB‡ûKZÍúdÉ­Eƒ®«¹¸¿d“Ïáþ’Žuÿ`É­õ%Ê;_Ý_RþÎÑþ’M ÷—×vÔ_’ZaI³®ö—¤º;_r±¿¤Ø·£þ’CÅ[—÷—¤Ö½»}ôbIÉxõ—l7¸Ø_²=«›ÒTˆQ:GŸåúAAwzÅb0X jn´£8.*Îg©NUq‰@°k0äÞéKTC+-‘H\þÉÂP•ŒÖbÒÍgaâIj'F>g—¼™¡q¢A½"0fÍm(_BÖP¯ùxr\Ît1-©²þÚ÷¡þ,¹w©©¢PåŸIŽÀ¢f{Yµ®ÞàÍ ^9\8‰j‚«Î¥Î@²´®óq'´6½:\V¢WD”XCåK*¿!%OH;:-©2¢÷‹f±”FÀYEjtï^³®Ôj‰D’}V?Ýá-,j–uNmBòf‚ê*£?Õ›ªBE܆ˆ(}QeÍÇ+ybÉA¦’¶8.•Ò¸î‰çÍ…D\>½*¬æ‰×‡—Hª°:Í:¯œ·7£WÝîµ^5´²!².Õî´ɉ^'O”é¢å«6±³–¢eae{i•Ã^w–\ Øí×ò 2O»áJ°(’j;‘73tð¼&øƒþ’Î;ŸV¨|Ò_Ò!‡_ò%÷—t¨æÂ×ÏYÚßF„¾ù¥Ã­†"y ?—?h ÁÇ Yßfbjÿ¶æ»ˆ?¸1á¹ÝeÊþF‰d±¦“ ÖhªÎBÜ6䯧:ÉÆ.µ@æ+c—†6Eò±K-üÊØðo_»Ô¢´Ýq›êfß.vÿ¤ƒÎá‡\ë¾ gÃr¸Ø9ü#ÓƒÎáí^ëþù¼éÖÃÛ‡?ìN­áútçãáÎínlNÿj g© ÃbÓ¯Öp–œ–®~µ†³°yXûÕÎí»i3ê¹/QF-ÑnÖjˆ;­×ÓZÑûüˆ»U*y³o6ÞÌ2˜ôgq]ûý> Wq§X¥°_tÿL7ЭùG=ßRœ·^Á/§×Ö¡Ïò²t!Ó¨Gî]¾$µ†ë6|³ì׬4êfÉ¿IPlŸwOPlRø&AQLç{"çðï ™ÁÎg]MPH$âúj´\ÉMûÛ WØ¿§ýmöípÚß&…‹Óþ Š>šöWôçÚ´¿Ô˜Aµ¹:ío³o‡ÓþŠ—á.SQf݇šw¶n;Ù@‘h­h¶.Q 0ç ½âÞéȶ– `“Í@ ûXyêýbMÄ”ƒ|Ä"ä™Y¾¬»Y£ ñ9VÀäùäM¥9l¯|–†Ð`…î›Lßo4QeÜi!x—TÜ!®&ŸC¬d´¤Š¤d±'®uG ´ ä!ÛKvJU·9 #jJÞÓ3‚¡eBYæò þŒYý–çû«Òœ>KChPÐ]qÖ<Ϩ³Ë¦3â¬Ó.ªH6ÈPQ$Œ@°‡CÊ/±³Û“/«–t"ÉØ=в%ÆxäfY¯)´äÓ©b81AO×|ThÖ}xŸKšåý¬¿ÞF‡›y\ˆ³1!ð•Qx­]ɦ3,Åyôn>^ù*nWS,B_"Ã%-©"Ùêß&œÄ|aØ«]o½Dðo_fš†vAÀôBð.¬^³d½_†•æomjá¬~çKÈ`L˜=3gÍŒ°"Ÿ×áH$A¨o6ÅŽQ…Š5.é ±‹­TÝ´û’Ô®ª%½H^³¦~zbcé)Ç%BEÑ»BEbVéxT¸{}éKh¸¬%»H6)䨼±÷Œºl»«ÎåÇ Ë'aY³lå³v€QthPÓg)(ƒ!n]ÜàøB ÆJ:ÔÓûz†ÎÓŽâ¸4Š­Fïih"=Niò¿—{}cÂsc¸Æ†K"É1\üdy4¬Âj5Ëf°iÀôN[UšË¾‰Á ÝÔ´ü _æ‘ý3Îè9ÊìK†C‘ˆ ®·î8®æqø M -â’ýµ{Äå^_ú}^hIˆ$uÂ’)`‰^ChÐÛxÄ\i®cIºIÜ ‰\~kIAò±ä(S) Û„4ý“êlC¼›€Ô™ ïÏr¯o`$®FXÖ,˜Aù¬j:;4(s+C,íJóݬwÜ`ã à$d«dÅdßdù~Ë—°:CLðî;Ž«iÖ‚s•ÛU\R]u‹¸Ú^_úi–´„>˃ÐC DpEA±Œ¦Òœ°H€IPŠ)ûz¢á!‡ãVq`ïØÓóË;)Úì-» Ð ê »×÷…n/. ¡ABwÅYî· †B„&xPXÖ][~¤+E_ yŸgÂbÐ¥p̆˜uÑÍæ@„} *JXÒ¬f£Ü;} —´Dq–‚b…Ë ¤Å ŠÈ뮀ݡ<ƒ|Çš3›*Ÿ:r=OôŠšÐðÛJg¤¡Á× ÂÍ›¤M*¡"auše3(,Äå^_D&ˆK$¢›Ä VŠªcÝEky¸¨0fŠÍÕÅ!¿#æç—Ü{¥öº¬¢è@bSˆÜ\»ÓŽÇeÍbônŸ¥¸„hлÕëK_"CZ"nPD.)^÷pˆVòQ™âf›¹N² äGÅœšS%nj\¤¹²Š6ÄClSm7?CXÖ,™ÁÆgÕ&T$târ¯ïîK:nPD®!œßëù£šŒ­1æJë+Iã\²Ê/0óðK…Êf!þO…¨,܇ã)sÕ©ÍÂ}«n5+Ì`ç³>ÈU÷û?ëŒrÕ݃ÖWèòYäªËç=ÊU÷ÕMËôwº:.—6°èAåzj–³ŠòYÊ—4ä<™`ÅY ŠÉ`(zW¨È¸Ä¬»w1ҽ˗ÈpIKTƒ¡‚—Ò¨ÈFå7ªQ}ˆ+GNKëTt¸¿¤Ó¬ö—ÜZ4¨Ý¬W÷—ìòAöõ½W÷—܆ÿ:Ù_ÒÕ`|°¿d»8Ü_²eÊyŠN´¹Ã}[ÚÍtë”h²'` SlòÌLàžâô%¬ 4ØÍ¨ G,ŒO'Ñn ~´}÷äýÁy>Åá ÿ Á˜ýÖŸ6îèÔ-Œ('tt‘¹ûA³ž»ÊŸ~eì*_ÿ•±«pÈWÆ®ÂH_»¦òL‰µä¶MUÊO;‡s{Õ9¼Û·‡Ã¯ö®sx—ÂÃÎáíÅuçð‘_xÖ9|Øø«ÎáZ³~ï® ׇ;Ÿ®álÚbÆÍWk8 ;ök~µ†³)¾ô»5œMy _­á¬â¬k‚¨þžKÎî¶|ÄÙíö’³ÛíÛCÎîøËg×´Ï9»Ý¤]rvǹ=ãìjŸuDG¶â–³û¶ôtÖΩr.ÛW°vûvÀÚßóͬÕœ°ŽûöŬ¦ÀòâLÍ1SRC†KËž)í£Ì;ïwK¾´˜˜\K>kåÍ´`c$JKOƒÌ]úK°EÓ„4k?°våÊ4úX’?Ëzš ¦ô"€zoÈ9˜ Ë §¬|–†Ð`ò†@3ðAIÓ¿JÄ%÷n ¦áòä±S$»ÙHF•Ùœh4ÂU·+öÆæŒô‘åa5ê:¡Ía3¸ùEúhF9QÙ³ ÀÊõ!IÑã· R’ÿi#þiÛ¨s°°¤Y2ƒr¡,*ŽKÐ=™Ø/$5›jVˆDq‰@°—foÊ—ØpAK,’dj`¸’Ëå0!âOò‰²2×ÔkÁF‡ÉòÉn&Ow ÌOznT½®@ý‰Ä¤LS-¬R³Š!ª#ªÌÐ½Ž³¦6‚ü$­Ü}¨˜ã’† Xü*Ü{‘)¦áÊZÒP$‡ÇèâIS‰ºÎaÄÌ«nâŸUT»´¨ò^º¶§äÚйi‰.¹ilß¡§–4+›ÁÊg¹a€hÐßgå øø´EÉ •HÞ2¢wS¼š÷d Vï%ç[Ê—ÈpIK$’ñcHõØ#¢\'Ní^CX®©×‚¨Í¦E¶bZæaI³hå³2À¨Ð  »çq‰œ'ƒ‘\êT)Ÿ{BET¥BŬÁM[$®…¸äÞÝXJÕµ¤¡Höf,¾HJ•‹ÓÆaú1^,1¤ØÙ0´ü´wØš%3HŸ%€QìaÀÂ1H#ƒ!º)}OÀÖ¤³aÉï9.±ÇŠÞ*º÷’ XˆK;ŠÆR.j‰D²¶øK ª££j]cõú6>;{ô²¦žÂ’ffðÂg` ºC10õ‘ † ßÉ nõ|dºyé*‘ì7dÀòwq\"T¬Á 9ù?ƒà㈸èÞËÆR®SKŠd?Þ ÞÆÁS²¶),_B>!¬B³´ˆ>+Œãº º+ÎRÿœ ª7("·k£_f«†€†HÄ»MˆWÖ࣮†Ñ»CEÆ%ÁF\ÚŸ%_"Ã-‘H–•³àó_JÍò§¹H 6øÛò¯®ã,íQÃí›Ïí<ÑŠuß²ãõ‹[r>K»©îAÁqáîh|µîÛy›òŽêöÚ½»±”†ëÔ’¦–4‹:'Ÿ%=”nKëmÈ`¸a€Ü íŽXw)U&+“DÒ”6Ñ优`ÑŽ²½ÚÜ${MK./,¿ÀýYec) —´Df°½òf””oôº\ùÓÓÓVÜ ½³ü6S$Îg.§)Ñ),%‡EÎ˾ »ÕïœHè0RFO‡}®â²{W– }–1Ñ p¢â,aK1Æ£Bªj`|jÜË|–!›ÀÜ}VÑùzåKˆŒý½9ñÂIìŸÆCчâ Kš¥ýYEcé ”Hgå¬b0µ9ž#‘ë†3:,óYED©À!OCÉßÓ*ÚUl V略æ1ÞV$®=Gï¢fÑ qѽ¥0\г‹Á·AnP|ˆXws(fWÄ»0Sì´þ)ŸýÜ@&X$â„”è¤øTÜ“·æ‘¯í(Ž+ «Ö,™Aú, #.îÏrc) —´D"7˜YÊuÓX4 0¿ ÞrDªˆ5Rn"ãîË!‚mݹŽˆVVѽ—ÚšG–™à¦–5‹„Já³* º qɽ‹Áá7hn¬»øxç³KÉGeŠ=¿W5Ê;³ºÉ‰QmCa2õ¾ŽK’Ê£5øµòY_ ~­Œ¯¿Vù¬¯¿VÕM÷ƒ_?˜Å{Ôü|Q˜SiÖW…9ûY3Îúª0G_Ú”.ôiaޤ)êiaŽþòK­Ôåþ’ýÅåþ’J³>Ø_ò*Ñ öV<Ý_rÈçjIź°¿äU".íûxº¿d?øËý%û¹=Ü_òÇ ^ô—4¥°t]žö—4%t÷8†‡ý%‡}»ê/ÙõçaÉnß.ûK^¥{ÿ ¿¤¡H^mYXý°¿dÿ4Ö[X£tŽ>K[ó= Ýê‰ÁÈÜFÍ ŠÈëNÚQW&TªL±BEÅ%.˜!âÒþ,÷gÉpQK$׺Ÿ%×û a1ö}™¶Å(S}¯z/ =„ êåpùˆ(Ámˆˆ2kHŠ×|üÉ7m™éRZR9d¾puÆ—ÕM¬{R‘šúåeh¸ÜEÂ*øiå»é’cÊè}å¼>Í5Áª7ôNÄóèIu<Qf yÖ’‚äcÉ)-Iië膨”†·ª,RSE!—n¯ «Ùò£ƒ—H$,jÖuI¥§ô—4¥=¸¯ãú ¿¤)mÕ}Vñƒþ’¦´£÷×ý%Miãï×ý%•fI$éI»xÄÈ~Æjök[òä߭ᬪ&¾Zù£šßÃØý±c+Íút §|‰8‡üÿL˜ÿÕ™0—Û¼+=ý`›÷Á þº`}?ƒß¬ïé÷ë‡ÿùuÁúÁ“ÿº`}ÿm¿/Xߥðû‚õÊÆ_/X?8‡»ëB\ŽÀ´àI»Y¥%IÏ*#H3{sÂåd¶J±°mêÌ„±'e›Ñø:a±@ÑÓ‚1#óÀÇÒîç‰ò‰¤F’â…9¹Ÿx¸tG&<é‘4ËùSú, ¡Á¤=c{)`!.‹^Éu1RK$’w²`b[ºük ëÇ¢!”Ó¢ß`~ú12w—†>ög­wv·QÙ3t]pƒ ^cæâ0ç.…÷{^ÛÁ–4+›ÁÊg ` ºsªàÄn/Å%ÁB\NÖÑ—(Ÿe-á½v#½–< *8¸2 u\ïº%˲HFNéݲuùEÿfNo‰)S¿ZO˜$†ù¦ïÇeˆ-aI³d½êEõ;§â¸g¥,Nô2T<¤=0v¦è¸<ùÒÃ!™)¶–P$ èæyƒé áë“3 ‹¤"5NNªž%—‹Ch0C÷ý…V½h¶  ÑMâ§¹Ã^¸[ÚQ—EÏèÝëÖ— qɽ˗¹Ô‰dšÂˤ¯Ì*“lËŒeMh*„%Í:Í`å³ 0Ux-\ƒ8+Ń!ºÉ] "r§Ý…§HŽOlÚQ—GïkÌ•r\"<Þ»wùögYK(’®Í6$‰$.’„Uh–vžÈgµP&£ABwÇY ŠÅ`¨jÂ[~Hä’uŸ·ê\ò r¾ú´8.ýþÐüõÃñ±…¸tTö%îb”–P$§°JͲ€å³t)t]òEªã,^>3º°ºÊ²oºþR ÊG"‘š¹çNò‘ÒjÝš]&à4Mi6dP„¸d„¼eýY¥–P$§¬ ¤L§Ð Í­ ñi¢kãM³.nЮ@N‚ù`ç³hß²HšÒMÙi¬§šö¼ù —](kv»•C–«â’{·/Q–´„"É£Bƒ%º` Cˆs‚ŸŠ`rßAV¿¢ßøà‡¬" D¯3ÃIÍA¿àT°uâÆ+A]`!.k–} |–´Ä½Ãê'zÁ}1eˆÀ}0i^õ¢P„ñ©Ã¢háëûD¯²Š=ƒ.­[s ÆN—Â>„9T|UÂ’fqî}áLsu12À¥HrP\1 ¤Å :øfXžö2ŸålŸ2ÅEZñiÉ~n¤D@(>uÓéŒLt쿈Èq\"T,,i–Ì |–Ý»|‰â,i‰D’é¦ýW¯,QE%Ö½ µDx©ïƒ$™è3×`€ß¹)‡Ø_0÷nÑ3«(:ÐDáú$E;šã’fÉ Êg`qɽ˗x“´„Ü`&r+Ö]ä¯òYÅÎRÉÊ/~6 ~T"1Í­™W=Is¯[ÑN >“óM),i–8.û, ¡AAw‚`!.¹wùrƒ…–P$9Eò*“'J«(S\ÌOT~NS`YÝÄüBIS¦‰”@r~I'¯[cVQ), ‹še3(Ÿ%ŽKhPÐÝq–â‚`!.¹wú’¢‹‘Zb‘ô˜Ú­´¤–ž?êü6«›Î,\Sæç~¨ãRV*ªêWî‰^e¥Y4ƒöYBƒâ¸g9zƒá¸„ Xˆ‹îݾDù,k‰Dr¦õ3`Ÿ¥®QM°²ØÊoß–Ö¹ŽKùmU¨hÝ…%ÍRV‘>ËChPÐ]q–9.1^Ô nPq‰@0—Ý»|‰»¥%®Áh£?Ë},²q™¶ sTrŠä¨¹šr-Ñï¿à÷)×Mi峞N¹ÞíÛå”ëCežM¹ÞõôrÊõ«D\L¹nJ-±HN¹>êCîÿâÿ…*ÄûÂÐëþ’¦–4ëaIS@wÇYOûKÎᪿäÕ>ï/9êUÉ«D\ô—4¥–X$ûKv™²LÛ¢­s*­c— ¡»ã,E`b0”Ue"W¬;™`ÑŽâ¸D¨(­¯ Å%®n"â²{—/Q–´„"ÉUðGd„úøûÊy‹Q:§>Jy3BãDzE`g¸|œ¸ Qf Iñ:_r¾hʦ(rÈë]uÆùC›ò\¤&Äåa£ú³x¼nYHåæ/—Í M)új‚ï/©ê¸n+T>é/©²Š÷ù’úK*Žë>zÿ ¿¤B\÷¾äƒþ’ýܦˆô,FHµ¶j^B2ù·%Ó»â{æÒµ °Ð¶1ÄhsÛÁN¦˺BMÈgš™:Çœí¬1€•Æo¹]Þ ýÒï ŠwœhùÙ’;‹Hb^‡8·i[ȈúÚߨþ`ua"Ù¥0L±'ò^$» ~cì*nð+cWgŠ¿1vMa•¿3v5~ûÌØ]ÈæÙ½þ²kn‘Ýë/ »ªæƒÎá×-²+ó2Ÿt¿n‘]ÍüÞ9\i–½Ì_Øùx½†sÿmߌIØÏóð¿“pÈÓY¿“pÚªÂ7cjͺ“ðpÁí;_îÞÛÃÃûí½Ü9¼ïÃÇ}»Ú9|hã³Ã»Ö_îÞîáÎáZ³hïwg÷®÷4¥áƒ!‘tý&ºc¢Qð‰û á$¨rΧ³Ñ+á†0OÓÛæmêâ)…tQ­5Nؾ°0ô)…P”¿ŽÑ­ß®10Î7–ÀÌä¯Ç`ÐßýˆÛÛõKd+,,/ä#-W-€q‹¸ôwøkrµ$‹dû´n†=Úö¦óÄkhÖ>˜í$kL;‡o(:Î:a]Ô=%‡Š@¼Hÿ {+æ7’ÃIŒqCZv]¬Xšü\_?D~!YÛl{-,iV1ŸOùŸÈghð”8ÙÀݬŠ­e¸ɰ‘aù£“l]Ð#À(gœ0Š Á|?tñ"¹ñð?é´ó§%…ÁìôZÚH&DUãð?¼·DblI& kÇß#¯ÿÀU±Ð,™AÏ·Tþ”h0C÷J$ŠKò{*ÄULîƒ/‘á’–d‘ñé—ÀW$®Ýy¢54} —3ÄV©d‚Þ˜vÞó½'x3Ê|¦nG½ËûO”sÜÌ”MŠå9›棢°¤YÙ V>KÃõ„²HöÜ.BÅâ=êöÒäËӽ˗4…ár¦X"i‡™Ña gÝÆ‘kÓšc˜»>€såȬ&ÂjÇØµ´ýšÈ3 #š’—ƒê’«½–4KfP>+ŒW‰]¿CŽKAñ}ô®PÑÝ^œ&Ä%÷._Ⱬj™;EràÞ•WK‡ÄŽ:O´†&™'4› ñÛÒ­Š(gK†¢sx‰'º7f^m^ «Ò,šAù, ¡Áb>¹ëß›Á¸$Tôž¦ 5¾M Xˆ+»wù’¦4\®n²HX²Mûö§Öp—‚¦Ä³}g«ÇtEèÀVqï87 Kš•Í`å³0„Ý=ߟé1¦›n9.¿ÇÝ^ÜÓŸ$ƒà qɽ˗xT¸ZæN‘ì^¦ïÕŸ_êÎí_P­•(~[º—a,,iÍ |VtWœåýª¿>馚¼¥EQ9UÆÉÿ s\r|‚`!®aä³?¾¤) WÙ2‘L½caÃY¿}š7›ŒkKƒhPÐÝqÖW †è&sƒj)ë>c:„Èy¿GÝ^ÚÓ5 â&Gïû§)T<ã’ý@‚…¸²{—/i*Ãåþ,Фos:J)4K›ä³ô ôÛÝgéIÉ`øttn"rɺ;ErŸ/9ïOÜܤBBE·Ê÷M7ñ¼£Õí•{×/Vš©?+˜mi–Í`ÑyB=•Ÿº]i½ƒbY ÙZí´E’}S>ë2…UÛ7‘óÚ|f Û+«œíueɳ¯¬¿ü‚U´ë͵ֶ0vfTãí*¡¢èÝÂ’ff°öYvïð%2\Ò’,’ŠÁÝ$Ö£àCÈ”œJÅ®x?ºq5¢ N‘”Ì ”è5D†)sO+•ùªý£Ád™ã’°¬Y4ƒöYÁF\„d¸Ü2G‘k(Ö½`‘Ï*ØIñ–b4YÇeÊí¶BEü¨‡%q¾Z¥°ÄêŠï%ª4KfP>˃h0ƒàqѽ˗x¥[æ²H*Ö])3õâðÉîgÞ¿Î0¿ ,ÂuÑÞSe+´¢@ç>˜Éù’*“"Íí(Ÿ%€!4hèÎ8Ë ˜ˆKt“¸A.³î‰òYÎt1S¬ì˜j0¼åGÕMLùüPÇåüœ*Ttî} æÇYE KšE3hŸ•F…Ýg)TT\r‚à qɽӗØpIK²HªL±Òú®ÁÐU7¹ê*‹}_ZWä·‘-Ïyô*ÞsïV¥Y2ƒôYBƒ¢g)(ƒÁPQÜ @°S$ÎgÉp)S,‘¸C3ªnÒü^Õ‡° ä¾ÚÑõ!¬6QÑ+T(,iV6ƒ•Ï"À0tWœ•ƒâŠÁ(Fï —d\".»wù¯4S ƂɊªnR)š;OT¦­’S$Uå• C5%žu\5KfP>K‰^¢ACwÅY&çÉ`x-¼êß´Yûv**ŸElÄ¥´¾k0T0£þ,‰Äû8?^•ó*y»­ þ`¤¥Yì/Ùås9Ò¿Š³>Ø_rÈçj¤Åq}°¿äUÄ%îaº¿¤ÖvT=Ý_râUÉuS ë›’ë=^¸ì/yµÏK®ûvÕ_¢V}ÀuÉuS†}_•\7•áú %×?TÎKXÒ,霫GN‰ôt'¨wP,#s7("W¯S$d‚3íXq\"T½»`ÆÕM'®—Ý»¼h¸ÔŸuŠd—‚Z>kf¸î/iª_ ßö°¿¤©¸ QûKšRrNK>ì/iÚŸBŧý%͆둤Ãi«¿š…Î-¯qJÓÞÑì8'Ì"é"÷ñÞ&BD|:Á×wýÀÍÂqß’§1Ý+=xdØ“MC”ófz/ôÏò裛òKùsôCýùáôØMy åQÝ,^ºÉ/šõÐØ5ÕEúÆØ5å%ÿÊØ5¥~eìšÒ8|eìšÊÿX$ãm›ªzŠŸvwçªsx·o;‡_í]çð‘)~Ö9¼Ëç²sx×ú‡ÃÇ\u7íóÎáÚp}¶óñéÎß¾¯×º=^ùKá\,·Ëç›5œø7Lêúf ç}hËö7k8›Ò@:XÕä ‰¤í‚ëÌáò;c3VTOݘç~%ùŒšt‡ c‡ŠÜ“Iç9x¤e[/¦9hÔmÊG`ò¤šŸvX–>Ìs|t²uàng€àdk 2ÓLc:ÄèÓ›ÒÆ‹t­âÜ$,j–Íà­{7Ù£É/ÚŸ¥þ¬ä#¢3ˆD”Fiù{ú/²c)jD}oŠ/árz̯Z{ÔÈLÀÉW š ;»“3 ûÖ·Š\Û¼ as>i:„ÂÔ`'{>v’v¼bèO«Ò,™Aù¬{Ä¥XÆ““h¸¤%IÛÆYÅ»7¥/â É5i¸´?ˬû´‚hgò„cï¶a}ØKÚ’«Ùž. WïecX#¥ÝÎ+•)þ’ô¢ k™‹05µícãÕº¬èÞ&$åÓIÇ÷­Cd$aI³då³<B¡"E"Pïd+Œ º+ÎRP,Có¸Ü…E‘ˆâu±¼8®“P9b@Eï —q|‰ —ögI$cÜëhYhŠÍ@Ir©œ…Ui–Í }–†Ð`†î.,z‹ÁÝäý2êº'çO&øOŠã¡rFïû †Š9.9¤€’#.¹÷¥CË ögýY}}—Í@–5«Ï±Lá³0ŒÝgå ¸b0D7‰ôÔ:÷ÿ¼£’¹HžèŸñôÑúÒóç4ü¡õ#ðáôØ>ó¨šÒ—ðx‹ýY‰„Í*Ì E¯KQ A^$ÆYŠÅ`èÂê*ë’‹uwŠä.…e5“Øò“•¶Vg):M€ŒC6 Jejd„džh¸´?«èÏ‚´´é”Q=ÍmgÑDËxÛ¬ËàŸ® bÝ=ÛQŽå6«¨|½7ʵÉéÉÊQž.ôÀ!ˆÞåvååªåÄÌ«)„%Ã¥ýY÷ýYDƒ‚î†+2‚8?äEäJ dyñ»°˜)6¾&ÌóæMACÆ3r3Ð<Þ³pp?À©`«m†ºGDùF¯•„eÍ¢”áÒþ¬¢? i"‚zÃ}gˆPqƒ +p8Q ¨î¢HŸzX7×®èwf¾¤Ç¨)„sp·"jSô®PQq‰4«0ƒðYö%4\Åþ,ÆY ŠÅ`ˆnRˆ­à[a¹væ³”|ôâ%uaÝ•CͰsÚü̬¢I Ó$:N äø´#‘H›ˆP±°¤Y§¬}–†Ü;¡» —÷gÁ0Ý$nÐ+ÞI^eZ«Êg‰ IfúŒÄZISò£–DOÔžH¿L6m‘/…(r‘´c!,j–Ì |–â’ Š,Eœ%_"Ã%-7H"W¬»7™a,*™$³¶ü¨Žë‡¢!•ã‘ÏÔxCÒüUÑé"ÚIÁ‹œÏª4KfP>KÃhð„îuœ%ÄE÷.ºI†Kû³Äº+Eâä Ó*J¸äTLUƒáÅKªnº¯ãR…¤*TTÁ¤“ÓQLTåVS KšE&Ø>KChÐÐq–ã`".qƒò%4\Ö‰DÉGeŠ•ÖW*SIN¥?•UÝ óÛvɬR³JÚætîž?=½•°¤Y2ƒôY0*4(è®8ËA±CÅ!XqƒB\rïL‘Øpi–2ÅN뻃3,ÐÌyÕ J$®ѰX0äÒ†ý†°BEåʽK³då³0ŒÅ+ÎRPlÃÑ;Àâ`!.æ³ìKd¸¤%ÅŒ\<¶ª›TЦòæÜ æ2Ÿ=ÃÎ- * RÑˉTqšÁÊg ` º+ÎÊAqÅ`˜n¡B"W¡bŽKª|—Ý»ÒúE ÷g©?‹¥hnÒfUäž"9râ¬Od™œWb°´NÂ’f¹B…>K¹w¡Aeg)(ƒ!&ØÜ 8.²îŠÞ**.!6âR † fT–©‚M÷g¡ÈÓ[~T9[¦í–…Ëý%•f}°¿dÿžËý%eœõÉþ’Wûw7ûK*Öýƒý%¯2TÌqIUƒñÁþ’ÊpyÖÃý%û‹Ëþ’¦ÖïûK^%À|º¿d¿×—ý%».<Ü_r¸œ«þ’=‹ýpÉ«D\îz¸¿ä8ª«þ’ݾ]ö—Ôbü½¿¤Bƒ÷u\ô—TÜà}Vñƒþ’*S|Ïq}Ð_Ò”÷âú½¿¤©>÷—¼þéßÿö_ÿð÷ÿþ·þÏùÛ ûó?þí?þñ_õ¿ÿrŸSêìxcrysden-1.6.2/examples/PDB/0000755000175000017500000000000013556022211014273 5ustar tonetonexcrysden-1.6.2/examples/PDB/bucky.pdb0000644000175000017500000001333011712736221016104 0ustar tonetoneHEADER PROTEIN COMPND bucky.pdb AUTHOR GENERATED BY BABEL 1.6 ATOM 1 C UNK 1 1.226 0.000 3.314 1.00 0.00 ATOM 2 C UNK 1 0.379 1.166 3.314 1.00 0.00 ATOM 3 C UNK 1 -0.992 0.721 3.314 1.00 0.00 ATOM 4 C UNK 1 -0.992 -0.721 3.314 1.00 0.00 ATOM 5 C UNK 1 0.379 -1.166 3.314 1.00 0.00 ATOM 6 C UNK 1 3.408 0.721 0.595 1.00 0.00 ATOM 7 C UNK 1 2.795 1.166 1.821 1.00 0.00 ATOM 8 C UNK 1 2.416 0.000 2.579 1.00 0.00 ATOM 9 C UNK 1 2.795 -1.166 1.821 1.00 0.00 ATOM 10 C UNK 1 3.408 -0.721 0.595 1.00 0.00 ATOM 11 C UNK 1 0.368 3.464 0.595 1.00 0.00 ATOM 12 C UNK 1 -0.246 3.019 1.821 1.00 0.00 ATOM 13 C UNK 1 0.747 2.298 2.579 1.00 0.00 ATOM 14 C UNK 1 1.973 2.298 1.821 1.00 0.00 ATOM 15 C UNK 1 1.739 3.019 0.595 1.00 0.00 ATOM 16 C UNK 1 -3.181 1.420 0.595 1.00 0.00 ATOM 17 C UNK 1 -2.947 0.699 1.821 1.00 0.00 ATOM 18 C UNK 1 -1.955 1.420 2.579 1.00 0.00 ATOM 19 C UNK 1 -1.576 2.587 1.821 1.00 0.00 ATOM 20 C UNK 1 -2.334 2.587 0.595 1.00 0.00 ATOM 21 C UNK 1 -2.334 -2.587 0.595 1.00 0.00 ATOM 22 C UNK 1 -1.576 -2.587 1.821 1.00 0.00 ATOM 23 C UNK 1 -1.955 -1.420 2.579 1.00 0.00 ATOM 24 C UNK 1 -2.947 -0.699 1.821 1.00 0.00 ATOM 25 C UNK 1 -3.181 -1.420 0.595 1.00 0.00 ATOM 26 C UNK 1 1.739 -3.019 0.595 1.00 0.00 ATOM 27 C UNK 1 1.973 -2.298 1.821 1.00 0.00 ATOM 28 C UNK 1 0.747 -2.298 2.579 1.00 0.00 ATOM 29 C UNK 1 -0.246 -3.019 1.821 1.00 0.00 ATOM 30 C UNK 1 0.368 -3.464 0.595 1.00 0.00 ATOM 31 C UNK 1 0.992 0.721 -3.314 1.00 0.00 ATOM 32 C UNK 1 -0.379 1.166 -3.314 1.00 0.00 ATOM 33 C UNK 1 -1.226 0.000 -3.314 1.00 0.00 ATOM 34 C UNK 1 -0.379 -1.166 -3.314 1.00 0.00 ATOM 35 C UNK 1 0.992 -0.721 -3.314 1.00 0.00 ATOM 36 C UNK 1 2.334 2.587 -0.595 1.00 0.00 ATOM 37 C UNK 1 1.576 2.587 -1.821 1.00 0.00 ATOM 38 C UNK 1 1.955 1.420 -2.579 1.00 0.00 ATOM 39 C UNK 1 2.947 0.699 -1.821 1.00 0.00 ATOM 40 C UNK 1 3.181 1.420 -0.595 1.00 0.00 ATOM 41 C UNK 1 -1.739 3.019 -0.595 1.00 0.00 ATOM 42 C UNK 1 -1.973 2.298 -1.821 1.00 0.00 ATOM 43 C UNK 1 -0.747 2.298 -2.579 1.00 0.00 ATOM 44 C UNK 1 0.246 3.019 -1.821 1.00 0.00 ATOM 45 C UNK 1 -0.368 3.464 -0.595 1.00 0.00 ATOM 46 C UNK 1 -3.408 -0.721 -0.595 1.00 0.00 ATOM 47 C UNK 1 -2.795 -1.166 -1.821 1.00 0.00 ATOM 48 C UNK 1 -2.416 0.000 -2.579 1.00 0.00 ATOM 49 C UNK 1 -2.795 1.166 -1.821 1.00 0.00 ATOM 50 C UNK 1 -3.408 0.721 -0.595 1.00 0.00 ATOM 51 C UNK 1 -0.368 -3.464 -0.595 1.00 0.00 ATOM 52 C UNK 1 0.246 -3.019 -1.821 1.00 0.00 ATOM 53 C UNK 1 -0.747 -2.298 -2.579 1.00 0.00 ATOM 54 C UNK 1 -1.973 -2.298 -1.821 1.00 0.00 ATOM 55 C UNK 1 -1.739 -3.019 -0.595 1.00 0.00 ATOM 56 C UNK 1 3.181 -1.420 -0.595 1.00 0.00 ATOM 57 C UNK 1 2.947 -0.699 -1.821 1.00 0.00 ATOM 58 C UNK 1 1.955 -1.420 -2.579 1.00 0.00 ATOM 59 C UNK 1 1.576 -2.587 -1.821 1.00 0.00 ATOM 60 C UNK 1 2.334 -2.587 -0.595 1.00 0.00 CONECT 1 2 5 8 CONECT 2 1 3 13 CONECT 3 2 4 18 CONECT 4 3 5 23 CONECT 5 1 4 28 CONECT 6 7 10 40 CONECT 7 6 8 14 CONECT 8 1 7 9 CONECT 9 8 10 27 CONECT 10 6 9 56 CONECT 11 12 15 45 CONECT 12 11 13 19 CONECT 13 2 12 14 CONECT 14 7 13 15 CONECT 15 11 14 36 CONECT 16 17 20 50 CONECT 17 16 18 24 CONECT 18 3 17 19 CONECT 19 12 18 20 CONECT 20 16 19 41 CONECT 21 22 25 55 CONECT 22 21 23 29 CONECT 23 4 22 24 CONECT 24 17 23 25 CONECT 25 21 24 46 CONECT 26 27 30 60 CONECT 27 9 26 28 CONECT 28 5 27 29 CONECT 29 22 28 30 CONECT 30 26 29 51 CONECT 31 32 35 38 CONECT 32 31 33 43 CONECT 33 32 34 48 CONECT 34 33 35 53 CONECT 35 31 34 58 CONECT 36 15 37 40 CONECT 37 36 38 44 CONECT 38 31 37 39 CONECT 39 38 40 57 CONECT 40 6 36 39 CONECT 41 20 42 45 CONECT 42 41 43 49 CONECT 43 32 42 44 CONECT 44 37 43 45 CONECT 45 11 41 44 CONECT 46 25 47 50 CONECT 47 46 48 54 CONECT 48 33 47 49 CONECT 49 42 48 50 CONECT 50 16 46 49 CONECT 51 30 52 55 CONECT 52 51 53 59 CONECT 53 34 52 54 CONECT 54 47 53 55 CONECT 55 21 51 54 CONECT 56 10 57 60 CONECT 57 39 56 58 CONECT 58 35 57 59 CONECT 59 52 58 60 CONECT 60 26 56 59 MASTER 0 0 0 0 0 0 0 0 60 0 60 0 END xcrysden-1.6.2/examples/PDB/mol2.pdb0000644000175000017500000000271711712736221015647 0ustar tonetoneHEADER PROTEIN COMPND mol2.pdb AUTHOR GENERATED BY BABEL 1.6 ATOM 1 C UNK 1 -2.568 0.032 -0.221 1.00 0.00 ATOM 2 F UNK 1 -2.886 0.688 0.883 1.00 0.00 ATOM 3 O UNK 1 -1.383 -0.641 -0.041 1.00 0.00 ATOM 4 C UNK 1 -0.230 0.040 -0.089 1.00 0.00 ATOM 5 F UNK 1 -0.144 0.755 -1.203 1.00 0.00 ATOM 6 F UNK 1 -3.478 -0.891 -0.435 1.00 0.00 ATOM 7 O UNK 1 0.751 -0.880 -0.023 1.00 0.00 ATOM 8 C UNK 1 2.052 -0.506 0.091 1.00 0.00 ATOM 9 F UNK 1 2.455 -0.626 1.334 1.00 0.00 ATOM 10 F UNK 1 -0.132 0.912 0.909 1.00 0.00 ATOM 11 F UNK 1 2.777 -1.268 -0.681 1.00 0.00 ATOM 12 O UNK 1 2.543 1.857 -0.537 1.00 0.00 ATOM 13 H UNK 1 -2.530 0.719 -1.047 1.00 0.00 ATOM 14 H UNK 1 2.307 0.752 -0.271 1.00 0.00 ATOM 15 H UNK 1 2.084 2.305 0.170 1.00 0.00 CONECT 1 2 3 6 13 CONECT 2 1 CONECT 3 1 4 CONECT 4 3 5 7 10 CONECT 5 4 CONECT 6 1 CONECT 7 4 8 CONECT 8 7 9 11 14 CONECT 9 8 CONECT 10 4 CONECT 11 8 CONECT 12 14 15 CONECT 13 1 CONECT 14 8 12 CONECT 15 12 MASTER 0 0 0 0 0 0 0 0 15 0 15 0 END xcrysden-1.6.2/examples/PDB/cluster.pdb0000644000175000017500000000115611712736221016453 0ustar tonetoneHEADER PROTEIN COMPND CON AUTHOR GENERATED BY BABEL 1.6 ATOM 1 O UNK 1 1.400 0.000 0.000 1.00 0.00 ATOM 2 Pt UNK 1 0.000 1.600 0.000 1.00 0.00 ATOM 3 Pt UNK 1 0.000 -0.800 -1.386 1.00 0.00 ATOM 4 Pt UNK 1 0.000 -0.800 1.386 1.00 0.00 ATOM 5 Pt UNK 1 0.000 1.600 -2.772 1.00 0.00 CONECT 1 2 3 4 CONECT 2 1 3 4 5 CONECT 3 1 2 4 5 CONECT 4 1 2 3 CONECT 5 2 3 MASTER 0 0 0 0 0 0 0 0 5 0 5 0 END xcrysden-1.6.2/examples/FHI98MD_files/0000755000175000017500000000000013556022211016060 5ustar tonetonexcrysden-1.6.2/examples/FHI98MD_files/GaAsSurface_inp.ini0000644000175000017500000000772211712736221021570 0ustar tonetone 4 6 30 1108 8864 : nsx,nax,nx,ngwx+1,ngwx*8+8 276 326 20 14 70 1 : ngwix,nx_init,nrx(1),nrx(2),nrx(3),nschltz 50 50 4 : nx_basis,max_basis_n,nlmax_init 20580 11 4 570 1 : nnrx,nkpt,nlmax,mmaxx,n_fft_store 1 1 1 : minpes, ngrpx, nrpes 8 0 : ibrav, pgind 50.0000 T 0.10000 F : nel,tmetal,ekt,tdegen 8.00000 3.00000 : ecut,ecuti T T 3 : tmold,tband,nrho 5 2 1234 : npos, nthm, nseed 873.00 1400.00 0.1000E+09 1 : T_ion, T_init, Q, nfi_rescale 4 T T : nsp,tpsmesh,coordwave 11 : nkpt 0.0000000 0.0000000 0.0000000 1.0000000 :xk(1-3),wkpt 0.2500000 0.0000000 0.0000000 0.0000000 :xk(1-3),wkpt 0.5000000 0.0000000 0.0000000 0.0000000 :xk(1-3),wkpt 0.5000000 0.2357494 0.0000000 0.0000000 :xk(1-3),wkpt 0.5000000 0.4713574 0.0000000 0.0000000 :xk(1-3),wkpt 0.5000000 0.7071068 0.0000000 0.0000000 :xk(1-3),wkpt 0.2500000 0.7071068 0.0000000 0.0000000 :xk(1-3),wkpt 0.0000000 0.7071068 0.0000000 0.0000000 :xk(1-3),wkpt 0.0000000 0.4713574 0.0000000 0.0000000 :xk(1-3),wkpt 0.0000000 0.2357494 0.0000000 0.0000000 :xk(1-3),wkpt 0.0000000 0.0000000 0.0000000 0.0000000 :xk(1-3),wkpt 10.44000000 0.00000000 0.00000000 : lattice vector a1 0.00000000 7.38219500 0.00000000 : lattice vector a2 0.00000000 0.00000000 36.91097400 : lattice vector a3 1.00000000 0.00000000 0.00000000 : rec. lattice vector b1 0.00000000 1.41421352 0.00000000 : rec. lattice vector b2 0.00000000 0.00000000 0.28284271 : rec. lattice vector b3 10.4400000 2844.73304047 : alat,omega 'Gallium ' 6 3.00000 2.00000 : name,number,valence charge, ion_fac 0.70000 1.00000 3 3 : ion_damp,rgauss,l_max,l_loc T T F : t_init_basis s,p,d 0.572885000 0.000000000 -0.588619000 F F F T 4.995706000 3.691097000 -3.511212000 F F F T -0.097906000 0.000000000 -7.335403000 F F F T 5.220000000 3.691097000 -11.073292000 F F F F 0.000000000 0.000000000 -14.764390000 F F F F 5.220000000 3.691097000 -18.455487000 F F F F 0 0 0 : ineq_pos 'Arsenic ' 6 5.00000 2.00000 : name,number,valence charge, ion_fac 0.70000 1.00000 3 3 : ion_damp,rgauss,l_max,l_loc T T F : t_init_basis s,p,d 2.789929000 3.691097000 0.635734000 F F F T 7.650782000 7.382195000 -3.599026000 F F F T 2.546812000 3.691097000 -7.339354000 F F F T 7.830000000 7.382195000 -11.073292000 F F F F 2.610000000 3.691097000 -14.764390000 F F F F 7.830000000 7.382195000 -18.455487000 F F F F 0 0 0 : ineq_pos 'hy_1.25 ' 1 1.25000 1.00000 : name,number,valence charge, ion_fac 0.70000 1.00000 1 1 : ion_damp,rgauss,l_max,l_loc T F F : t_init_basis s,p,d 3.463177000 3.691097000 -20.800517000 F F F F 0 0 0 : ineq_pos 'hy_0.75 ' 1 0.75000 1.00000 : name,number,valence charge, ion_fac 0.70000 1.00000 1 1 : ion_damp,rgauss,l_max,l_loc T F F : t_init_basis s,p,d 9.607680000 7.382195000 -20.835167000 F F F F 0 0 0 : ineq_pos 2 : nrot = number of symmetries 1--------- 1 0 0 0 1 0 0 0 1 2--------- 1 0 0 0 -1 0 0 0 1 0 0 xcrysden-1.6.2/examples/FHI98MD_files/GaAs_inp.ini0000644000175000017500000000740111712736221020251 0ustar tonetone 2 1 8 168 1344 : nsx,nax,nx,ngwx+1,ngwx*8+8 50 58 16 16 16 1 : ngwix,nx_init,nrx(1),nrx(2),nrx(3),nschltz 8 8 4 : nx_basis,max_basis_n,nlmax_init 4352 10 4 570 1 : nnrx,nkpt,nlmax,mmaxx,n_fft_store 1 1 1 : minpes, ngrpx, nrpes 2 0 : ibrav, pgind 8.0000 T 0.10000 F : nel,tmetal,ekt,tdegen 10.00000 4.00000 : ecut,ecuti T F 1 : tmold,tband,nrho 5 2 1234 : npos, nthm, nseed 873.00 1400.00 0.1000E+09 1 : T_ion, T_init, Q, nfi_rescale 2 T T : nsp,tpsmesh,coordwave 10 : nkpt 0.1250000 0.1250000 0.1250000 0.0312500 :xk(1-3),wkpt -0.1250000 0.3750000 -0.1250000 0.0937500 :xk(1-3),wkpt -0.3750000 0.6250000 -0.3750000 0.0937500 :xk(1-3),wkpt -0.6250000 0.8750000 -0.6250000 0.0937500 :xk(1-3),wkpt 0.3750000 0.3750000 0.3750000 0.0312500 :xk(1-3),wkpt 0.1250000 0.6250000 0.1250000 0.0937500 :xk(1-3),wkpt -0.1250000 0.8750000 -0.1250000 0.0937500 :xk(1-3),wkpt -0.3750000 1.1250000 -0.3750000 0.0937500 :xk(1-3),wkpt -0.6250000 0.3750000 -0.1250000 0.1875000 :xk(1-3),wkpt -0.6250000 0.8750000 -0.1250000 0.1875000 :xk(1-3),wkpt -5.25000000 0.00000000 5.25000000 : lattice vector a1 0.00000000 5.25000000 5.25000000 : lattice vector a2 -5.25000000 5.25000000 0.00000000 : lattice vector a3 -1.00000000 -1.00000000 1.00000000 : rec. lattice vector b1 1.00000000 1.00000000 1.00000000 : rec. lattice vector b2 -1.00000000 1.00000000 -1.00000000 : rec. lattice vector b3 10.5000000 289.40625000 : alat,omega 'Gallium ' 1 3.00000 69.72000 : name,number,valence charge, ion_fac 0.70000 1.00000 3 3 : ion_damp,rgauss,l_max,l_loc T T F : t_init_basis s,p,d 0.000000000 0.000000000 0.000000000 F F F T 0 0 0 : ineq_pos 'Arsenic ' 1 5.00000 74.92000 : name,number,valence charge, ion_fac 0.70000 1.00000 3 3 : ion_damp,rgauss,l_max,l_loc T T F : t_init_basis s,p,d 2.625000000 2.625000000 2.625000000 F F F T 0 0 0 : ineq_pos 24 : nrot = number of symmetries 1--------- 1 0 0 0 1 0 0 0 1 2--------- 1 0 0 0 0 1 0 1 0 3--------- 1 0 0 0 1 0 -1 -1 -1 4--------- 1 0 0 0 0 1 -1 -1 -1 5--------- 1 0 0 -1 -1 -1 0 1 0 6--------- 1 0 0 -1 -1 -1 0 0 1 7--------- 0 1 0 1 0 0 0 0 1 8--------- 0 0 1 1 0 0 0 1 0 9--------- 0 1 0 1 0 0 -1 -1 -1 10--------- 0 0 1 1 0 0 -1 -1 -1 11--------- 0 1 0 0 0 1 1 0 0 12--------- 0 0 1 0 1 0 1 0 0 13--------- 0 1 0 0 0 1 -1 -1 -1 14--------- 0 0 1 0 1 0 -1 -1 -1 15--------- 0 1 0 -1 -1 -1 1 0 0 16--------- 0 0 1 -1 -1 -1 1 0 0 17--------- 0 1 0 -1 -1 -1 0 0 1 18--------- 0 0 1 -1 -1 -1 0 1 0 19--------- -1 -1 -1 1 0 0 0 1 0 20--------- -1 -1 -1 1 0 0 0 0 1 21--------- -1 -1 -1 0 1 0 1 0 0 22--------- -1 -1 -1 0 0 1 1 0 0 23--------- -1 -1 -1 0 1 0 0 0 1 24--------- -1 -1 -1 0 0 1 0 1 0 0 0 xcrysden-1.6.2/examples/FHI98MD_files/GaAsSurface_coord.out0000644000175000017500000000151311712736221022130 0ustar tonetone 10.440000 0.000000 0.000000 0.000000 7.382195 0.000000 0.000000 0.000000 36.910974 4 6 Gallium 0.572886 0.000000 -0.588605 T 4.995704 3.691097 -3.511200 T -0.097908 0.000000 -7.335397 T 5.220000 3.691097 -11.073292 F 0.000000 0.000000 -14.764390 F 5.220000 3.691097 -18.455487 F 6 Arsenic 2.789929 3.691097 0.635750 T 7.650782 7.382195 -3.599016 T 2.546813 3.691097 -7.339348 T 7.830000 7.382195 -11.073292 F 2.610000 3.691097 -14.764390 F 7.830000 7.382195 -18.455487 F 1 hy_1.25 3.463177 3.691097 -20.800517 F 1 hy_0.75 9.607680 7.382195 -20.835167 F xcrysden-1.6.2/examples/Scripting/0000755000175000017500000000000013556022211015630 5ustar tonetonexcrysden-1.6.2/examples/Scripting/pwofilter.tcl0000644000175000017500000000236011716440630020355 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/pwfilter.tcl *** # # NAME # pwfilter.tcl -- check of PWscf Output filter # # USAGE # xcrysden --script pwofilter.tcl # # COPYRIGHT # Anton Kokalj (C) 2004 # # CREATION DATE # Sometime in February 2004 # # SOURCE global system set dir [file join $env(XCRYSDEN_TOPDIR) examples PWSCF_files] cd $dir #scripting::filter::pwscfOutput -lc EthAl001-2x2.out 2 { # 1 13 2 6 3 1 #} scripting::filter::pwscfOutput -lc CH3Rh111.out 3 # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ scripting::lighting On scripting::displayMode3D spacefill # ------------------------------------------------------------------------ # zoom and rotate the structure # ------------------------------------------------------------------------ scripting::zoom 0.4 scripting::rotate x +60 scripting::rotate y +20 # ------------------------------------------------------------------------ # display 3x3x1 cell # ------------------------------------------------------------------------ scripting::buildCrystal 3 3 1 #******xcrysden-1.6.2/examples/Scripting/pw_filters.tcl0000644000175000017500000000465611716440643020536 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/pw_filters.tcl *** # # NAME # pw_filters.tcl -- check PWscf I/O filters # # USAGE # xcrysden --script pw_filters.tcl # # COPYRIGHT # Anton Kokalj (C) 2004 # # PURPOSE # This is a multiScript that tests the PWscf I/O filters. It uses a multiScript # utility (see example: multiScript.tcl for more detail). # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2004 # # SOURCE scripting::multiScript { # ------------------------------------------------------------------------ # This is the MAJOR script # # It opens files, one at a time # ------------------------------------------------------------------------ global env chdir [file join $env(XCRYSDEN_TOPDIR) examples PWSCF_files] # PWscf input version < 1.2 scripting::exec scripting::filter::pwscfInput EthAl001-2x2.inp 2 { 1 13 2 6 3 1 } # PWscf input version >= 1.2 scripting::exec scripting::filter::pwscfInput CH3Rh111.inp 2 # PWscf output version < 1.2 scripting::exec scripting::filter::pwscfOutput -lc EthAl001-2x2.out 2 { 1 13 2 6 3 1 } # PWscf output version >= 1.2 scripting::exec scripting::filter::pwscfOutput -lc CH3Rh111.out 2 } { # ------------------------------------------------------------------------ # This is the MINOR script # # It setup a given structure # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ scripting::lighting On scripting::displayMode3D spacefill # ------------------------------------------------------------------------ # zoom and rotate the structure # ------------------------------------------------------------------------ scripting::zoom 0.4 scripting::rotate x +60 scripting::rotate y +20 # ------------------------------------------------------------------------ # display 3x3x1 cell # ------------------------------------------------------------------------ scripting::buildCrystal 3 3 1 update # be alive for 5 seconds DisplayUpdateWidget dialog "Example will be alive for 5 seconds." after 5000 {exit 0} } #******xcrysden-1.6.2/examples/Scripting/CO_lumo.xsf.gz0000777000175000017500000000000013521026433025020 2../XSF_Files/CO_lumo.xsf.gzustar tonetonexcrysden-1.6.2/examples/Scripting/g98cube_multiScript.tcl0000644000175000017500000001240511716440663022216 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/g98cube_multiScript.tcl *** # # NAME # multiScript.tcl -- a simple example of Gaussian cube multi-job script (i.e. multiScript) # # USAGE # xcrysden --script g98cube_multiScript.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a scripting example that shows how to produce a multi-jobs # from a given Gaussian cube file. It uses the scripting::multiScript # facility. Many times, one might want to produce several plots of # molecular orbitals of a given molecule. It would be desirable that # the display parameters are exactly the same for all plots. This is # one such example, where CO HOMO and LUMO molecular-orbitals are # printed. # # The multiScript uses major and minor script. In the first script the # loading of the files is specified, while in the latter script the # operations of what to do with each file are defined. The usage of # multiScript is: # # scripting::multiScript scriptMajor scriptMinor # # scripting::multiScript scriptMajor scriptMinor # # WARNINGS # Inside the major-script (i.e. scriptMajor) the scripting::exec # should be used instead of scripting::open. # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2003 # # SOURCE scripting::multiScript { # ------------------------------------------------------------------------ # This is the MAJOR script # It opens a Gaussian cube file several times, each time giving an # index of requested MO, and then each "run" proceeds accoring to # minor script instructions # ------------------------------------------------------------------------ global env set file [file join $env(XCRYSDEN_TOPDIR) examples GAUSSIAN_files N2O_homo+lumo.cube.gz] foreach MOindex {11 12} { # load the $file with a given $MOindex scripting::exec scripting::filter::g98cube $file $MOindex # rename print.png to $file.MO$MOindex.png if { [file exists print.png] } { set filehead [file tail [file rootname $file]] file rename -force print.png $filehead.MO$MOindex.png } } } { # ------------------------------------------------------------------------ # This is the MINOR script # # It produces and prints the isosurface + colorplane # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ scripting::lighting On scripting::displayMode3D Pipe&Ball # ------------------------------------------------------------------------ # zoom and rotate the structure # ------------------------------------------------------------------------ scripting::zoom -0.5 scripting::rotate x -90 # ------------------------------------------------------------------------ # load the 3D scalar field # ------------------------------------------------------------------------ scripting::scalarField3D::load # ------------------------------------------------------------------------ # configure, i.e., specify how to render the scalar field # # for the usage see, for example, isosurface+colorplane+print.tcl file # ------------------------------------------------------------------------ scripting::scalarField3D::configure \ -isosurface 1 \ -interpolation_degree 2 \ -isolevel 0.1 \ -plusminus 1 \ -basalplane 2 \ -colorbasis BLUE-WHITE-RED \ -scalefunction LINEAR \ -expand2D specify \ -expand2D_X 1 \ -expand2D_Y 1 \ -expand2D_Z 1 \ -colorplane 1 \ -isoline 1 \ -colorplane_lighting 0 \ -cpl_transparency 0 \ -cpl_thermometer 1 \ -2Dlowvalue -0.1 \ -2Dhighvalue +0.1 \ -2Dnisoline 11 \ -anim_step 1 \ -current_slide 19 \ -isoline_color monocolor \ -isoline_width 3 \ -isoline_monocolor \#000000 # ------------------------------------------------------------------------ # hide the isosourface control window # ------------------------------------------------------------------------ wm withdraw .iso # ------------------------------------------------------------------------ # render the 3D scalar field as requested by # scripting::scalarField3D::configure # ------------------------------------------------------------------------ scripting::scalarField3D::render # # ------------------------------------------------------------------------ # # revert the isosurface normals (this should be done after rendering of # # isosurface) # # ------------------------------------------------------------------------ # # scripting::scalarField3D::configure -revertnormal {pos neg} # ------------------------------------------------------------------------ # now lets print to file what we have on the display window # ------------------------------------------------------------------------ scripting::printToFile print.png windowdump # we've done all; exit exit 0 } #******xcrysden-1.6.2/examples/Scripting/ZnS_molsurf.xcrysden0000644000175000017500000014225613521030040021673 0ustar tonetone # ------------------------------------------------------------------------ # This is the script saved via the XCRYSDEN "File-->Save Current State # and Structure" menu. This feature saves the currently displayed # structure. When it will be loaded again it will recall all the # display parameters, such as orientation, zoom, perspective, ... # # Execute this script as: xcrysden --script this_file_name # # File created by tone on localhost.local # File creation date: Fri Apr 18 08:10:29 CEST 2003 # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # definition of xcMisc array # ------------------------------------------------------------------------ array set xcMisc {whirlgif /usr/bin/whirlgif printCommand {lpr -h} rescale_image_list {up down left right center rotXY rotXZ rotYZ rotAB rotAC rotBC wireframes_2d pointlines_2d pipeballs_2d ballsticks2_2d ballsticks1_2d spacefills_2d spacefills_3d ballsticks_3d pipeballs_3d sticks_3d dm_wire dm_solid dm_smooth dm_flat} resolution 1400x1050 babel_dir /home/tone/lib/babel status_init_label {Building GUI ...} wm_rootYshift 0 babel /home/tone/bin/babel debug 1 titlefile ZnS.xcrysden resolution_ratio1 1.0 resolutionX 1400 resolution_ratio2 1.0 wm_rootXshift 0 resolutionY 1050 mpeg_encode /usr/bin/mpeg_encode ImageMagick.convert {/usr/bin/convert -quality 90}} # ------------------------------------------------------------------------ # BEGIN: XSF structure data # ------------------------------------------------------------------------ ViewMol . # --------------- # Store the content of the XSF file in the xsfStructure variable # --------------- set xsfStructure { INFO nunit 2 1 2 unit cell celltype convcell shape parapipedal END_INFO DIM-GROUP 3 1 PRIMVEC 2.7100000000 2.7100000000 0.0000000000 2.7100000000 0.0000000000 2.7100000000 0.0000000000 2.7100000000 2.7100000000 CONVVEC 5.4200000000 0.0000000000 0.0000000000 0.0000000000 5.4200000000 0.0000000000 0.0000000000 0.0000000000 5.4200000000 PRIMCOORD 2 1 16 0.0000000000 0.0000000000 0.0000000000 30 1.3550000000 -1.3550000000 -1.3550000000 CONVCOORD 2 4 16 0.0000000000 0.0000000000 0.0000000000 16 0.0000000000 2.7100000000 2.7100000000 16 2.7100000000 0.0000000000 2.7100000000 16 2.7100000000 2.7100000000 0.0000000000 30 1.3550000000 -1.3550000000 -1.3550000000 30 1.3550000000 1.3550000000 1.3550000000 30 4.0650000000 -1.3550000000 1.3550000000 30 4.0650000000 1.3550000000 -1.3550000000 RECIP-PRIMVEC 0.1845018450 0.1845018450 -0.1845018450 0.1845018450 -0.1845018450 0.1845018450 -0.1845018450 0.1845018450 0.1845018450 RECIP-CONVVEC 0.1845018450 0.0000000000 0.0000000000 0.0000000000 0.1845018450 0.0000000000 0.0000000000 0.0000000000 0.1845018450 WIGNER-SEITZ-PRIMCELL 4 -1.3550000000 -1.3550000000 1.3550000000 -3.6720500000 -3.6720500000 0.0000000000 -2.7100000000 0.0000000000 0.0000000000 -3.6720500000 -3.6720500000 0.0000000000 -1.3550000000 -1.3550000000 -1.3550000000 -3.6720500000 -3.6720500000 0.0000000000 0.0000000000 -2.7100000000 0.0000000000 -3.6720500000 -3.6720500000 0.0000000000 4 -1.3550000000 1.3550000000 1.3550000000 -3.6720500000 0.0000000000 3.6720500000 -2.7100000000 0.0000000000 0.0000000000 -3.6720500000 0.0000000000 3.6720500000 -1.3550000000 -1.3550000000 1.3550000000 -3.6720500000 0.0000000000 3.6720500000 0.0000000000 0.0000000000 2.7100000000 -3.6720500000 0.0000000000 3.6720500000 4 -2.7100000000 0.0000000000 0.0000000000 -3.6720500000 0.0000000000 -3.6720500000 -1.3550000000 1.3550000000 -1.3550000000 -3.6720500000 0.0000000000 -3.6720500000 0.0000000000 0.0000000000 -2.7100000000 -3.6720500000 0.0000000000 -3.6720500000 -1.3550000000 -1.3550000000 -1.3550000000 -3.6720500000 0.0000000000 -3.6720500000 4 -1.3550000000 1.3550000000 1.3550000000 -3.6720500000 3.6720500000 0.0000000000 0.0000000000 2.7100000000 0.0000000000 -3.6720500000 3.6720500000 0.0000000000 -1.3550000000 1.3550000000 -1.3550000000 -3.6720500000 3.6720500000 0.0000000000 -2.7100000000 0.0000000000 0.0000000000 -3.6720500000 3.6720500000 0.0000000000 4 0.0000000000 0.0000000000 2.7100000000 0.0000000000 -3.6720500000 3.6720500000 -1.3550000000 -1.3550000000 1.3550000000 0.0000000000 -3.6720500000 3.6720500000 0.0000000000 -2.7100000000 0.0000000000 0.0000000000 -3.6720500000 3.6720500000 1.3550000000 -1.3550000000 1.3550000000 0.0000000000 -3.6720500000 3.6720500000 4 -1.3550000000 -1.3550000000 -1.3550000000 0.0000000000 -3.6720500000 -3.6720500000 0.0000000000 0.0000000000 -2.7100000000 0.0000000000 -3.6720500000 -3.6720500000 1.3550000000 -1.3550000000 -1.3550000000 0.0000000000 -3.6720500000 -3.6720500000 0.0000000000 -2.7100000000 0.0000000000 0.0000000000 -3.6720500000 -3.6720500000 4 0.0000000000 -2.7100000000 0.0000000000 3.6720500000 -3.6720500000 0.0000000000 1.3550000000 -1.3550000000 -1.3550000000 3.6720500000 -3.6720500000 0.0000000000 2.7100000000 0.0000000000 0.0000000000 3.6720500000 -3.6720500000 0.0000000000 1.3550000000 -1.3550000000 1.3550000000 3.6720500000 -3.6720500000 0.0000000000 4 0.0000000000 0.0000000000 2.7100000000 0.0000000000 3.6720500000 3.6720500000 1.3550000000 1.3550000000 1.3550000000 0.0000000000 3.6720500000 3.6720500000 0.0000000000 2.7100000000 0.0000000000 0.0000000000 3.6720500000 3.6720500000 -1.3550000000 1.3550000000 1.3550000000 0.0000000000 3.6720500000 3.6720500000 4 1.3550000000 -1.3550000000 1.3550000000 3.6720500000 0.0000000000 3.6720500000 2.7100000000 0.0000000000 0.0000000000 3.6720500000 0.0000000000 3.6720500000 1.3550000000 1.3550000000 1.3550000000 3.6720500000 0.0000000000 3.6720500000 0.0000000000 0.0000000000 2.7100000000 3.6720500000 0.0000000000 3.6720500000 4 1.3550000000 1.3550000000 -1.3550000000 0.0000000000 3.6720500000 -3.6720500000 0.0000000000 0.0000000000 -2.7100000000 0.0000000000 3.6720500000 -3.6720500000 -1.3550000000 1.3550000000 -1.3550000000 0.0000000000 3.6720500000 -3.6720500000 0.0000000000 2.7100000000 0.0000000000 0.0000000000 3.6720500000 -3.6720500000 4 2.7100000000 0.0000000000 0.0000000000 3.6720500000 0.0000000000 -3.6720500000 1.3550000000 -1.3550000000 -1.3550000000 3.6720500000 0.0000000000 -3.6720500000 0.0000000000 0.0000000000 -2.7100000000 3.6720500000 0.0000000000 -3.6720500000 1.3550000000 1.3550000000 -1.3550000000 3.6720500000 0.0000000000 -3.6720500000 4 2.7100000000 0.0000000000 0.0000000000 3.6720500000 3.6720500000 0.0000000000 1.3550000000 1.3550000000 -1.3550000000 3.6720500000 3.6720500000 0.0000000000 0.0000000000 2.7100000000 0.0000000000 3.6720500000 3.6720500000 0.0000000000 1.3550000000 1.3550000000 1.3550000000 3.6720500000 3.6720500000 0.0000000000 WIGNER-SEITZ-PRIMCELL_END WIGNER-SEITZ-CONVCELL 4 -2.7100000000 -2.7100000000 2.7100000000 -29.3764000000 0.0000000000 0.0000000000 -2.7100000000 2.7100000000 2.7100000000 -29.3764000000 0.0000000000 0.0000000000 -2.7100000000 2.7100000000 -2.7100000000 -29.3764000000 0.0000000000 0.0000000000 -2.7100000000 -2.7100000000 -2.7100000000 -29.3764000000 0.0000000000 0.0000000000 4 -2.7100000000 -2.7100000000 -2.7100000000 0.0000000000 -29.3764000000 0.0000000000 2.7100000000 -2.7100000000 -2.7100000000 0.0000000000 -29.3764000000 0.0000000000 2.7100000000 -2.7100000000 2.7100000000 0.0000000000 -29.3764000000 0.0000000000 -2.7100000000 -2.7100000000 2.7100000000 0.0000000000 -29.3764000000 0.0000000000 4 -2.7100000000 2.7100000000 -2.7100000000 0.0000000000 0.0000000000 -29.3764000000 2.7100000000 2.7100000000 -2.7100000000 0.0000000000 0.0000000000 -29.3764000000 2.7100000000 -2.7100000000 -2.7100000000 0.0000000000 0.0000000000 -29.3764000000 -2.7100000000 -2.7100000000 -2.7100000000 0.0000000000 0.0000000000 -29.3764000000 4 -2.7100000000 -2.7100000000 2.7100000000 0.0000000000 0.0000000000 29.3764000000 2.7100000000 -2.7100000000 2.7100000000 0.0000000000 0.0000000000 29.3764000000 2.7100000000 2.7100000000 2.7100000000 0.0000000000 0.0000000000 29.3764000000 -2.7100000000 2.7100000000 2.7100000000 0.0000000000 0.0000000000 29.3764000000 4 -2.7100000000 2.7100000000 2.7100000000 0.0000000000 29.3764000000 0.0000000000 2.7100000000 2.7100000000 2.7100000000 0.0000000000 29.3764000000 0.0000000000 2.7100000000 2.7100000000 -2.7100000000 0.0000000000 29.3764000000 0.0000000000 -2.7100000000 2.7100000000 -2.7100000000 0.0000000000 29.3764000000 0.0000000000 4 2.7100000000 -2.7100000000 -2.7100000000 29.3764000000 0.0000000000 0.0000000000 2.7100000000 2.7100000000 -2.7100000000 29.3764000000 0.0000000000 0.0000000000 2.7100000000 2.7100000000 2.7100000000 29.3764000000 0.0000000000 0.0000000000 2.7100000000 -2.7100000000 2.7100000000 29.3764000000 0.0000000000 0.0000000000 WIGNER-SEITZ-CONVCELL_END BRILLOUIN-ZONE-PRIMCELL 6 -0.0922509225 -0.1845018450 0.0000000000 -0.0085102327 -0.0085102327 -0.0085102327 -0.1845018450 -0.0922509225 0.0000000000 -0.0085102327 -0.0085102327 -0.0085102327 -0.1845018450 0.0000000000 -0.0922509225 -0.0085102327 -0.0085102327 -0.0085102327 -0.0922509225 0.0000000000 -0.1845018450 -0.0085102327 -0.0085102327 -0.0085102327 0.0000000000 -0.0922509225 -0.1845018450 -0.0085102327 -0.0085102327 -0.0085102327 0.0000000000 -0.1845018450 -0.0922509225 -0.0085102327 -0.0085102327 -0.0085102327 4 -0.1845018450 0.0922509225 0.0000000000 -0.0170204654 0.0000000000 0.0000000000 -0.1845018450 0.0000000000 -0.0922509225 -0.0170204654 0.0000000000 0.0000000000 -0.1845018450 -0.0922509225 0.0000000000 -0.0170204654 0.0000000000 0.0000000000 -0.1845018450 0.0000000000 0.0922509225 -0.0170204654 0.0000000000 0.0000000000 6 0.0000000000 -0.0922509225 0.1845018450 -0.0085102327 -0.0085102327 0.0085102327 -0.0922509225 0.0000000000 0.1845018450 -0.0085102327 -0.0085102327 0.0085102327 -0.1845018450 0.0000000000 0.0922509225 -0.0085102327 -0.0085102327 0.0085102327 -0.1845018450 -0.0922509225 0.0000000000 -0.0085102327 -0.0085102327 0.0085102327 -0.0922509225 -0.1845018450 0.0000000000 -0.0085102327 -0.0085102327 0.0085102327 0.0000000000 -0.1845018450 0.0922509225 -0.0085102327 -0.0085102327 0.0085102327 6 0.0000000000 0.1845018450 -0.0922509225 -0.0085102327 0.0085102327 -0.0085102327 0.0000000000 0.0922509225 -0.1845018450 -0.0085102327 0.0085102327 -0.0085102327 -0.0922509225 0.0000000000 -0.1845018450 -0.0085102327 0.0085102327 -0.0085102327 -0.1845018450 0.0000000000 -0.0922509225 -0.0085102327 0.0085102327 -0.0085102327 -0.1845018450 0.0922509225 0.0000000000 -0.0085102327 0.0085102327 -0.0085102327 -0.0922509225 0.1845018450 0.0000000000 -0.0085102327 0.0085102327 -0.0085102327 4 0.0000000000 -0.1845018450 0.0922509225 0.0000000000 -0.0170204654 0.0000000000 -0.0922509225 -0.1845018450 0.0000000000 0.0000000000 -0.0170204654 0.0000000000 0.0000000000 -0.1845018450 -0.0922509225 0.0000000000 -0.0170204654 0.0000000000 0.0922509225 -0.1845018450 0.0000000000 0.0000000000 -0.0170204654 0.0000000000 6 0.1845018450 -0.0922509225 0.0000000000 0.0085102327 -0.0085102327 -0.0085102327 0.0922509225 -0.1845018450 0.0000000000 0.0085102327 -0.0085102327 -0.0085102327 0.0000000000 -0.1845018450 -0.0922509225 0.0085102327 -0.0085102327 -0.0085102327 0.0000000000 -0.0922509225 -0.1845018450 0.0085102327 -0.0085102327 -0.0085102327 0.0922509225 0.0000000000 -0.1845018450 0.0085102327 -0.0085102327 -0.0085102327 0.1845018450 0.0000000000 -0.0922509225 0.0085102327 -0.0085102327 -0.0085102327 4 -0.0922509225 0.0000000000 -0.1845018450 0.0000000000 0.0000000000 -0.0170204654 0.0000000000 0.0922509225 -0.1845018450 0.0000000000 0.0000000000 -0.0170204654 0.0922509225 0.0000000000 -0.1845018450 0.0000000000 0.0000000000 -0.0170204654 0.0000000000 -0.0922509225 -0.1845018450 0.0000000000 0.0000000000 -0.0170204654 6 0.0000000000 0.1845018450 0.0922509225 -0.0085102327 0.0085102327 0.0085102327 -0.0922509225 0.1845018450 0.0000000000 -0.0085102327 0.0085102327 0.0085102327 -0.1845018450 0.0922509225 0.0000000000 -0.0085102327 0.0085102327 0.0085102327 -0.1845018450 0.0000000000 0.0922509225 -0.0085102327 0.0085102327 0.0085102327 -0.0922509225 0.0000000000 0.1845018450 -0.0085102327 0.0085102327 0.0085102327 0.0000000000 0.0922509225 0.1845018450 -0.0085102327 0.0085102327 0.0085102327 6 0.0922509225 0.0000000000 0.1845018450 0.0085102327 -0.0085102327 0.0085102327 0.0000000000 -0.0922509225 0.1845018450 0.0085102327 -0.0085102327 0.0085102327 0.0000000000 -0.1845018450 0.0922509225 0.0085102327 -0.0085102327 0.0085102327 0.0922509225 -0.1845018450 0.0000000000 0.0085102327 -0.0085102327 0.0085102327 0.1845018450 -0.0922509225 0.0000000000 0.0085102327 -0.0085102327 0.0085102327 0.1845018450 0.0000000000 0.0922509225 0.0085102327 -0.0085102327 0.0085102327 4 0.0000000000 -0.0922509225 0.1845018450 0.0000000000 0.0000000000 0.0170204654 0.0922509225 0.0000000000 0.1845018450 0.0000000000 0.0000000000 0.0170204654 0.0000000000 0.0922509225 0.1845018450 0.0000000000 0.0000000000 0.0170204654 -0.0922509225 0.0000000000 0.1845018450 0.0000000000 0.0000000000 0.0170204654 6 0.1845018450 0.0000000000 -0.0922509225 0.0085102327 0.0085102327 -0.0085102327 0.0922509225 0.0000000000 -0.1845018450 0.0085102327 0.0085102327 -0.0085102327 0.0000000000 0.0922509225 -0.1845018450 0.0085102327 0.0085102327 -0.0085102327 0.0000000000 0.1845018450 -0.0922509225 0.0085102327 0.0085102327 -0.0085102327 0.0922509225 0.1845018450 0.0000000000 0.0085102327 0.0085102327 -0.0085102327 0.1845018450 0.0922509225 0.0000000000 0.0085102327 0.0085102327 -0.0085102327 4 0.0922509225 0.1845018450 0.0000000000 0.0000000000 0.0170204654 0.0000000000 0.0000000000 0.1845018450 -0.0922509225 0.0000000000 0.0170204654 0.0000000000 -0.0922509225 0.1845018450 0.0000000000 0.0000000000 0.0170204654 0.0000000000 0.0000000000 0.1845018450 0.0922509225 0.0000000000 0.0170204654 0.0000000000 4 0.1845018450 0.0000000000 0.0922509225 0.0170204654 0.0000000000 0.0000000000 0.1845018450 -0.0922509225 0.0000000000 0.0170204654 0.0000000000 0.0000000000 0.1845018450 0.0000000000 -0.0922509225 0.0170204654 0.0000000000 0.0000000000 0.1845018450 0.0922509225 0.0000000000 0.0170204654 0.0000000000 0.0000000000 6 0.1845018450 0.0000000000 0.0922509225 0.0085102327 0.0085102327 0.0085102327 0.1845018450 0.0922509225 0.0000000000 0.0085102327 0.0085102327 0.0085102327 0.0922509225 0.1845018450 0.0000000000 0.0085102327 0.0085102327 0.0085102327 0.0000000000 0.1845018450 0.0922509225 0.0085102327 0.0085102327 0.0085102327 0.0000000000 0.0922509225 0.1845018450 0.0085102327 0.0085102327 0.0085102327 0.0922509225 0.0000000000 0.1845018450 0.0085102327 0.0085102327 0.0085102327 BRILLOUIN-ZONE-PRIMCELL_END BRILLOUIN-ZONE-CONVCELL 4 -0.0922509225 -0.0922509225 0.0922509225 -0.0340409308 0.0000000000 0.0000000000 -0.0922509225 0.0922509225 0.0922509225 -0.0340409308 0.0000000000 0.0000000000 -0.0922509225 0.0922509225 -0.0922509225 -0.0340409308 0.0000000000 0.0000000000 -0.0922509225 -0.0922509225 -0.0922509225 -0.0340409308 0.0000000000 0.0000000000 4 -0.0922509225 -0.0922509225 -0.0922509225 0.0000000000 -0.0340409308 0.0000000000 0.0922509225 -0.0922509225 -0.0922509225 0.0000000000 -0.0340409308 0.0000000000 0.0922509225 -0.0922509225 0.0922509225 0.0000000000 -0.0340409308 0.0000000000 -0.0922509225 -0.0922509225 0.0922509225 0.0000000000 -0.0340409308 0.0000000000 4 -0.0922509225 0.0922509225 -0.0922509225 0.0000000000 0.0000000000 -0.0340409308 0.0922509225 0.0922509225 -0.0922509225 0.0000000000 0.0000000000 -0.0340409308 0.0922509225 -0.0922509225 -0.0922509225 0.0000000000 0.0000000000 -0.0340409308 -0.0922509225 -0.0922509225 -0.0922509225 0.0000000000 0.0000000000 -0.0340409308 4 -0.0922509225 -0.0922509225 0.0922509225 0.0000000000 0.0000000000 0.0340409308 0.0922509225 -0.0922509225 0.0922509225 0.0000000000 0.0000000000 0.0340409308 0.0922509225 0.0922509225 0.0922509225 0.0000000000 0.0000000000 0.0340409308 -0.0922509225 0.0922509225 0.0922509225 0.0000000000 0.0000000000 0.0340409308 4 -0.0922509225 0.0922509225 0.0922509225 0.0000000000 0.0340409308 0.0000000000 0.0922509225 0.0922509225 0.0922509225 0.0000000000 0.0340409308 0.0000000000 0.0922509225 0.0922509225 -0.0922509225 0.0000000000 0.0340409308 0.0000000000 -0.0922509225 0.0922509225 -0.0922509225 0.0000000000 0.0340409308 0.0000000000 4 0.0922509225 -0.0922509225 -0.0922509225 0.0340409308 0.0000000000 0.0000000000 0.0922509225 0.0922509225 -0.0922509225 0.0340409308 0.0000000000 0.0000000000 0.0922509225 0.0922509225 0.0922509225 0.0340409308 0.0000000000 0.0000000000 0.0922509225 -0.0922509225 0.0922509225 0.0340409308 0.0000000000 0.0000000000 BRILLOUIN-ZONE-CONVCELL_END ATOMS 16 0.0000000000 0.0000000000 0.0000000000 16 0.0000000000 2.7100000000 2.7100000000 16 2.7100000000 0.0000000000 2.7100000000 16 2.7100000000 2.7100000000 0.0000000000 30 1.3550000000 1.3550000000 1.3550000000 16 0.0000000000 0.0000000000 5.4200000000 16 0.0000000000 2.7100000000 8.1300000000 16 2.7100000000 0.0000000000 8.1300000000 16 2.7100000000 2.7100000000 5.4200000000 30 1.3550000000 1.3550000000 6.7750000000 30 4.0650000000 1.3550000000 4.0650000000 16 0.0000000000 0.0000000000 10.8400000000 16 2.7100000000 2.7100000000 10.8400000000 30 4.0650000000 1.3550000000 9.4850000000 16 0.0000000000 5.4200000000 0.0000000000 16 2.7100000000 5.4200000000 2.7100000000 30 4.0650000000 4.0650000000 1.3550000000 16 0.0000000000 5.4200000000 5.4200000000 16 2.7100000000 5.4200000000 8.1300000000 30 1.3550000000 4.0650000000 4.0650000000 30 4.0650000000 4.0650000000 6.7750000000 16 0.0000000000 5.4200000000 10.8400000000 30 1.3550000000 4.0650000000 9.4850000000 16 5.4200000000 0.0000000000 0.0000000000 16 5.4200000000 2.7100000000 2.7100000000 16 8.1300000000 0.0000000000 2.7100000000 16 8.1300000000 2.7100000000 0.0000000000 30 6.7750000000 1.3550000000 1.3550000000 16 5.4200000000 0.0000000000 5.4200000000 16 5.4200000000 2.7100000000 8.1300000000 16 8.1300000000 0.0000000000 8.1300000000 16 8.1300000000 2.7100000000 5.4200000000 30 6.7750000000 1.3550000000 6.7750000000 30 9.4850000000 1.3550000000 4.0650000000 16 5.4200000000 0.0000000000 10.8400000000 16 8.1300000000 2.7100000000 10.8400000000 30 9.4850000000 1.3550000000 9.4850000000 16 5.4200000000 5.4200000000 0.0000000000 16 8.1300000000 5.4200000000 2.7100000000 30 9.4850000000 4.0650000000 1.3550000000 16 5.4200000000 5.4200000000 5.4200000000 16 8.1300000000 5.4200000000 8.1300000000 30 6.7750000000 4.0650000000 4.0650000000 30 9.4850000000 4.0650000000 6.7750000000 16 5.4200000000 5.4200000000 10.8400000000 30 6.7750000000 4.0650000000 9.4850000000 16 10.8400000000 0.0000000000 0.0000000000 16 10.8400000000 2.7100000000 2.7100000000 16 10.8400000000 0.0000000000 5.4200000000 16 10.8400000000 2.7100000000 8.1300000000 16 10.8400000000 0.0000000000 10.8400000000 16 10.8400000000 5.4200000000 0.0000000000 16 10.8400000000 5.4200000000 5.4200000000 16 10.8400000000 5.4200000000 10.8400000000 FRAMES 1 0.0000000000 0.0000000000 0.0000000000 5.4200000000 0.0000000000 0.0000000000 1 0.0000000000 0.0000000000 0.0000000000 0.0000000000 5.4200000000 0.0000000000 1 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 5.4200000000 1 0.0000000000 0.0000000000 5.4200000000 5.4200000000 0.0000000000 5.4200000000 1 0.0000000000 0.0000000000 5.4200000000 0.0000000000 5.4200000000 5.4200000000 1 0.0000000000 0.0000000000 5.4200000000 0.0000000000 0.0000000000 10.8400000000 1 0.0000000000 0.0000000000 10.8400000000 5.4200000000 0.0000000000 10.8400000000 1 0.0000000000 0.0000000000 10.8400000000 0.0000000000 5.4200000000 10.8400000000 1 0.0000000000 5.4200000000 0.0000000000 5.4200000000 5.4200000000 0.0000000000 1 0.0000000000 5.4200000000 0.0000000000 0.0000000000 5.4200000000 5.4200000000 1 0.0000000000 5.4200000000 5.4200000000 5.4200000000 5.4200000000 5.4200000000 1 0.0000000000 5.4200000000 5.4200000000 0.0000000000 5.4200000000 10.8400000000 1 0.0000000000 5.4200000000 10.8400000000 5.4200000000 5.4200000000 10.8400000000 1 5.4200000000 0.0000000000 0.0000000000 10.8400000000 0.0000000000 0.0000000000 1 5.4200000000 0.0000000000 0.0000000000 5.4200000000 5.4200000000 0.0000000000 1 5.4200000000 0.0000000000 0.0000000000 5.4200000000 0.0000000000 5.4200000000 1 5.4200000000 0.0000000000 5.4200000000 10.8400000000 0.0000000000 5.4200000000 1 5.4200000000 0.0000000000 5.4200000000 5.4200000000 5.4200000000 5.4200000000 1 5.4200000000 0.0000000000 5.4200000000 5.4200000000 0.0000000000 10.8400000000 1 5.4200000000 0.0000000000 10.8400000000 10.8400000000 0.0000000000 10.8400000000 1 5.4200000000 0.0000000000 10.8400000000 5.4200000000 5.4200000000 10.8400000000 1 5.4200000000 5.4200000000 0.0000000000 10.8400000000 5.4200000000 0.0000000000 1 5.4200000000 5.4200000000 0.0000000000 5.4200000000 5.4200000000 5.4200000000 1 5.4200000000 5.4200000000 5.4200000000 10.8400000000 5.4200000000 5.4200000000 1 5.4200000000 5.4200000000 5.4200000000 5.4200000000 5.4200000000 10.8400000000 1 5.4200000000 5.4200000000 10.8400000000 10.8400000000 5.4200000000 10.8400000000 1 10.8400000000 0.0000000000 0.0000000000 10.8400000000 5.4200000000 0.0000000000 1 10.8400000000 0.0000000000 0.0000000000 10.8400000000 0.0000000000 5.4200000000 1 10.8400000000 0.0000000000 5.4200000000 10.8400000000 5.4200000000 5.4200000000 1 10.8400000000 0.0000000000 5.4200000000 10.8400000000 0.0000000000 10.8400000000 1 10.8400000000 0.0000000000 10.8400000000 10.8400000000 5.4200000000 10.8400000000 1 10.8400000000 5.4200000000 0.0000000000 10.8400000000 5.4200000000 5.4200000000 1 10.8400000000 5.4200000000 5.4200000000 10.8400000000 5.4200000000 10.8400000000 } # END of defintion of xsfStructure variable WriteFile $system(SCRDIR)/xc_struc.$system(PID) $xsfStructure w xc_openstr xcr $system(SCRDIR)/xc_struc.$system(PID) .mesa PL UpdateWMTitle ZnS_molsurf.xcrysden set working_XSF_file $system(SCRDIR)/xc_struc.$system(PID) Get_sInfoArray DisplayDefaultMode xcAppendState render xcUpdateState # ------------------------------------------------------------------------ # END: XSF structure data # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # display "waiting" toplevel and watch-cursor # ------------------------------------------------------------------------ set wait_window [DisplayUpdateWidget "Reconstructing" "Reconstructing the structure and display parameters. Please wait"] SetWatchCursor set xcCursor(dont_update) 1 # ------------------------------------------------------------------------ # size of the main window fonts # ------------------------------------------------------------------------ wm geometry . 836x515 # ------------------------------------------------------------------------ # BEGIN: create fonts # ------------------------------------------------------------------------ saveState:fontCreate font1 -family {nimbus sans l} -size 12 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font10 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font2 -family helvetica -size 10 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font11 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font3 -family {nimbus sans l} -size 14 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font12 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font13 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font4 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font14 -family {nimbus mono l} -size 12 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font5 -family {nimbus sans l} -size 12 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font15 -family {nimbus mono l} -size 32 -weight bold -slant italic -underline 0 -overstrike 0 saveState:fontCreate font6 -family {nimbus sans l} -size 10 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font7 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font8 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font9 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 # ------------------------------------------------------------------------ # END: create fonts # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # BEGIN: take care of display-mode # ------------------------------------------------------------------------ set translationStep 0.05 set rotstep 10 set light On Lighting On array set mode2D {PL Off SF Off WF Off BS1 Off PB Off BS2 Off} array set mode3D {space Off sticks On pipe Off balls On} array set dispmode {mode3D_name BS mode3D Preset mode3D_f2_packinfo {-in .ctrl.c.f.fr3 -anchor center -expand 1 -fill both -ipadx 0 -ipady 0 -padx 0 -pady 0 -side top} style 3D mode2D_name BS2 mode3D_ModeFrame .ctrl.c.f.fr3.2.a0} saveState:displayMode set style3D(draw) solid; Style3D draw solid set style3D(shade) smooth; Style3D shade smooth set viewer(rot_zoom_button_mode) Click-and-hold; Viewer:rotZoomButtonMode # ------------------------------------------------------------------------ # END: take care of display-mode # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # BEGIN: Atomic-Labels/Fonts # ------------------------------------------------------------------------ array set atomLabel {globalFont {-*-nimbus roman no9 l-medium-r-*-*-22-*-*-*-*-*-*-*} lastfont font15 fontBrowser {Simple Font Browser} atomFont.brightID 3 selecAtomWindow .atom_label_selectiton globalFont.darkID 2 globalFont.brightColor {1.000 1.000 1.000} 19.atomFont.label {S(color center)} atomIDs.do_no_display.previous {} atomFont.label {S(color center)} atomFont.do_display 1 19.atomFont.darkColor {0.0 0.0 0.0} atomFont.darkColor {0.0 0.0 0.0} atomFont.entry .atom_label.nb.fatomLabel.atom.e1 atomFont {-*-nimbus mono l-bold-o-*-*-32-*-*-*-*-*-*-*} globalFont.brightID 1 atomFont.id 19 atomTypes.do_not_display {} 19.atomFont.brightColor {1.0 1.0 0.000} 19.atomFont.font {-*-nimbus mono l-bold-o-*-*-32-*-*-*-*-*-*-*} atomFont.darkID 4 atomFont.brightColor {1.0 1.0 1.0} globalFont.do_display 1 atomIDs.do_not_display {} globalFont.darkColor {0.0 0.0 0.0}} set t [ModAtomLabels] xc_setfont .mesa {-*-nimbus roman no9 l-medium-r-*-*-22-*-*-*-*-*-*-*} {1.000 1.000 1.000} {0.0 0.0 0.0} xc_setatomlabel .mesa 19 {S(color center)} {-*-nimbus mono l-bold-o-*-*-32-*-*-*-*-*-*-*} {1.0 1.0 0.000} {0.0 0.0 0.0} ModAtomLabels:advancedCheckButton default ModAtomLabels:advancedCheckButton custom ModAtomLabels:advancedCloseUpdate dummy update CancelProc $t # ------------------------------------------------------------------------ # END: Atomic-Labels/Fonts # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # BEGIN: Various colors # ------------------------------------------------------------------------ xc_newvalue .mesa 8 1 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 2 0.950000 0.950000 0.950000 xc_newvalue .mesa 8 3 0.950000 0.950000 0.950000 xc_newvalue .mesa 8 4 0.707900 0.707900 0.707900 xc_newvalue .mesa 8 5 0.707900 0.707900 0.707900 xc_newvalue .mesa 8 6 0.950000 0.950000 0.000000 xc_newvalue .mesa 8 7 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 8 0.700000 0.000000 0.000000 xc_newvalue .mesa 8 9 0.834500 0.950000 0.950000 xc_newvalue .mesa 8 10 0.950000 0.950000 0.950000 xc_newvalue .mesa 8 11 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 12 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 13 0.950000 0.000000 0.950000 xc_newvalue .mesa 8 14 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 15 0.950000 0.950000 0.000000 xc_newvalue .mesa 8 16 0.000000 0.950000 0.450000 xc_newvalue .mesa 8 17 0.950000 0.950000 0.000000 xc_newvalue .mesa 8 18 0.950000 0.950000 0.950000 xc_newvalue .mesa 8 19 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 20 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 21 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 22 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 23 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 24 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 25 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 26 0.950000 0.000000 0.000000 xc_newvalue .mesa 8 27 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 28 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 29 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 30 0.950000 0.000000 0.950000 xc_newvalue .mesa 8 31 0.950000 0.000000 0.950000 xc_newvalue .mesa 8 32 0.950000 0.000000 0.950000 xc_newvalue .mesa 8 33 0.950000 0.950000 0.000000 xc_newvalue .mesa 8 34 0.950000 0.950000 0.000000 xc_newvalue .mesa 8 35 0.950000 0.000000 0.000000 xc_newvalue .mesa 8 36 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 37 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 38 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 39 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 40 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 41 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 42 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 43 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 44 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 45 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 46 1.000000 1.000000 1.000000 xc_newvalue .mesa 8 47 1.000000 1.000000 1.000000 xc_newvalue .mesa 8 48 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 49 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 50 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 51 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 52 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 53 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 54 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 55 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 56 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 57 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 58 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 59 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 60 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 61 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 62 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 63 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 64 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 65 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 66 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 67 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 68 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 69 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 70 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 71 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 72 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 73 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 74 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 75 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 76 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 77 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 78 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 79 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 80 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 81 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 82 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 83 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 84 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 85 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 86 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 87 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 88 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 89 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 90 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 91 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 92 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 93 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 94 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 95 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 96 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 97 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 98 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 99 0.931400 0.875500 0.801000 xc_newvalue .mesa 8 100 0.931400 0.875500 0.801000 xc_newvalue .mesa 26 1.000000 1.000000 1.000000 1.0 xc_newvalue .mesa 17 0.880000 1.000000 0.670000 # ------------------------------------------------------------------------ # END: Various colors # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # BEGIN: Atomic radii # ------------------------------------------------------------------------ xc_newvalue .mesa 4 1 0.532000 xc_newvalue .mesa 4 2 1.960000 xc_newvalue .mesa 4 3 1.722000 xc_newvalue .mesa 4 4 1.246000 xc_newvalue .mesa 4 5 1.274000 xc_newvalue .mesa 4 6 1.078000 xc_newvalue .mesa 4 7 1.050000 xc_newvalue .mesa 4 8 1.022000 xc_newvalue .mesa 4 9 0.994000 xc_newvalue .mesa 4 10 2.240000 xc_newvalue .mesa 4 11 2.240000 xc_newvalue .mesa 4 12 1.960000 xc_newvalue .mesa 4 13 1.750000 xc_newvalue .mesa 4 14 0.910000 xc_newvalue .mesa 4 15 1.400000 xc_newvalue .mesa 4 16 1.456000 xc_newvalue .mesa 4 17 1.386000 xc_newvalue .mesa 4 18 2.660000 xc_newvalue .mesa 4 19 2.982000 xc_newvalue .mesa 4 20 2.436000 xc_newvalue .mesa 4 21 2.240000 xc_newvalue .mesa 4 22 1.960000 xc_newvalue .mesa 4 23 1.890000 xc_newvalue .mesa 4 24 1.960000 xc_newvalue .mesa 4 25 1.960000 xc_newvalue .mesa 4 26 1.960000 xc_newvalue .mesa 4 27 1.890000 xc_newvalue .mesa 4 28 1.890000 xc_newvalue .mesa 4 29 1.890000 xc_newvalue .mesa 4 30 1.890000 xc_newvalue .mesa 4 31 1.820000 xc_newvalue .mesa 4 32 1.750000 xc_newvalue .mesa 4 33 1.610000 xc_newvalue .mesa 4 34 1.610000 xc_newvalue .mesa 4 35 1.596000 xc_newvalue .mesa 4 36 2.800000 xc_newvalue .mesa 4 37 3.080000 xc_newvalue .mesa 4 38 2.800000 xc_newvalue .mesa 4 39 2.590000 xc_newvalue .mesa 4 40 2.170000 xc_newvalue .mesa 4 41 2.030000 xc_newvalue .mesa 4 42 2.030000 xc_newvalue .mesa 4 43 1.890000 xc_newvalue .mesa 4 44 1.820000 xc_newvalue .mesa 4 45 1.890000 xc_newvalue .mesa 4 46 1.960000 xc_newvalue .mesa 4 47 2.240000 xc_newvalue .mesa 4 48 2.170000 xc_newvalue .mesa 4 49 2.170000 xc_newvalue .mesa 4 50 0.700000 xc_newvalue .mesa 4 51 2.030000 xc_newvalue .mesa 4 52 1.960000 xc_newvalue .mesa 4 53 1.960000 xc_newvalue .mesa 4 54 3.542000 xc_newvalue .mesa 4 55 3.640000 xc_newvalue .mesa 4 56 2.800000 xc_newvalue .mesa 4 57 2.450000 xc_newvalue .mesa 4 58 2.170000 xc_newvalue .mesa 4 59 2.170000 xc_newvalue .mesa 4 60 2.170000 xc_newvalue .mesa 4 61 2.170000 xc_newvalue .mesa 4 62 2.170000 xc_newvalue .mesa 4 63 2.170000 xc_newvalue .mesa 4 64 2.170000 xc_newvalue .mesa 4 65 2.170000 xc_newvalue .mesa 4 66 2.170000 xc_newvalue .mesa 4 67 2.170000 xc_newvalue .mesa 4 68 2.170000 xc_newvalue .mesa 4 69 2.170000 xc_newvalue .mesa 4 70 2.170000 xc_newvalue .mesa 4 71 2.170000 xc_newvalue .mesa 4 72 2.170000 xc_newvalue .mesa 4 73 2.030000 xc_newvalue .mesa 4 74 1.890000 xc_newvalue .mesa 4 75 1.890000 xc_newvalue .mesa 4 76 1.820000 xc_newvalue .mesa 4 77 1.890000 xc_newvalue .mesa 4 78 1.890000 xc_newvalue .mesa 4 79 1.890000 xc_newvalue .mesa 4 80 2.100000 xc_newvalue .mesa 4 81 2.660000 xc_newvalue .mesa 4 82 2.520000 xc_newvalue .mesa 4 83 2.240000 xc_newvalue .mesa 4 84 2.170000 xc_newvalue .mesa 4 85 2.170000 xc_newvalue .mesa 4 86 2.170000 xc_newvalue .mesa 4 87 3.920000 xc_newvalue .mesa 4 88 2.016000 xc_newvalue .mesa 4 89 2.730000 xc_newvalue .mesa 4 90 2.170000 xc_newvalue .mesa 4 91 2.170000 xc_newvalue .mesa 4 92 2.170000 xc_newvalue .mesa 4 93 2.170000 xc_newvalue .mesa 4 94 2.170000 xc_newvalue .mesa 4 95 2.170000 xc_newvalue .mesa 4 96 2.170000 xc_newvalue .mesa 4 97 2.170000 xc_newvalue .mesa 4 98 2.170000 xc_newvalue .mesa 4 99 0.532000 xc_newvalue .mesa 4 100 0.070000 # ------------------------------------------------------------------------ # END: Atomic radii # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # Various parameters # ------------------------------------------------------------------------ xc_newvalue .mesa 13 1.050000 xc_newvalue .mesa 5 1.400000 xc_newvalue .mesa 6 0.400000 xc_newvalue .mesa 7 0.600000 xc_newvalue .mesa 9 1.000000 xc_newvalue .mesa 10 1.000000 xc_newvalue .mesa 18 1.000000 xc_newvalue .mesa 10010 1.000000 xc_newvalue .mesa 10009 1.000000 xc_newvalue .mesa 11 6.000000 xc_newvalue .mesa 19 0.100000 xc_newvalue .mesa 24 15.000000 xc_newvalue .mesa 28 3.000000 xc_newvalue .mesa 29 3.000000 xc_newvalue .mesa 10029 0.600000 xc_newvalue .mesa 23 0.000000 0.000000 0.000000 1.000000 # ------------------------------------------------------------------------ # BEGIN: Wigner-Seitz Cell # ------------------------------------------------------------------------ set check(wigner) 1 WignerSeitz array set ws {rcc 9 rpcc 11 type prim transparent 0 pc 1 ic 6 bc 3 rc 7 hcc 10 conv_b .wgnset.f0.conv not_config_yet 0 selected_pos_color #33ff66 normal_pos_color #ef0000 prim_b .wgnset.f0.prim fc 5 can_disable_color #eeeeee hc 8 c_type 1 ac 2 cc 4 color #55eeff} array set wsp {sel,10 1 sel,11 0 sel,12 0 sel,13 0 sel,14 0 sel,15 0 sel,16 0 sel,0 0 sel,17 0 sel,1 0 sel,18 0 sel,2 0 sel,19 0 sel,20 0 sel,3 0 sel,21 0 sel,4 0 sel,22 0 sel,5 0 sel,23 0 sel,6 0 sel,24 0 sel,7 0 sel,25 0 sel,8 0 sel,26 0 sel,9 0 sel,27 0 sel,28 0 sel,29 0 sel,30 0 sel,31 0 sel,32 0 sel,33 0 sel,34 0 sel,35 0 sel,36 0 can .wgnset.f1p.l.c sel,37 0 sel,38 0 sel,39 0 sel,40 0 mode selected sel,41 0 sel,42 0 sel,43 0 sel,44 0 sel,45 0 sel,46 0 sel,47 0 sel,48 0 sel,49 0} array set wsc {sel,10 1 sel,11 0 sel,12 0 sel,13 0 sel,14 0 sel,15 0 sel,16 0 sel,0 0 sel,17 1 sel,1 0 sel,18 0 sel,2 0 sel,19 0 sel,20 0 sel,3 0 sel,21 0 sel,4 0 sel,22 0 sel,5 0 sel,23 0 sel,6 0 sel,24 0 sel,7 0 sel,25 0 sel,8 0 sel,26 0 sel,9 0 sel,27 0 sel,28 0 sel,29 0 sel,30 0 sel,31 0 sel,32 0 sel,33 0 sel,34 0 sel,35 0 sel,36 0 can .wgnset.f1c.l.c sel,37 0 sel,38 0 sel,39 0 sel,40 0 mode selected sel,41 0 sel,42 0 sel,43 0 sel,44 0 sel,45 0 sel,46 0 sel,47 0 sel,48 0 sel,49 0} array set ws_lfpos {4 { 0.000000 0.000000 0.000000 0.500000 0.500000 0.000000 0.000000 0.000000 1.000000 0.500000 0.500000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } 8 { 0.000000 0.000000 0.000000 0.666667 0.333333 0.000000 0.333333 0.666667 0.000000 0.000000 0.000000 1.000000 0.666667 0.333333 1.000000 0.333333 0.666667 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } 1 { 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } 5 { 0.000000 0.000000 0.000000 0.500000 0.500000 0.000000 0.000000 0.500000 0.500000 0.500000 0.000000 0.500000 0.000000 0.000000 1.000000 0.500000 0.500000 1.000000 0.000000 1.000000 0.000000 0.500000 1.000000 0.500000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.500000 0.500000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } 2 { 0.000000 0.000000 0.000000 0.000000 0.500000 0.500000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.500000 0.500000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } 6 { 0.000000 0.000000 0.000000 0.500000 0.500000 0.500000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } 3 { 0.000000 0.000000 0.000000 0.500000 0.000000 0.500000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.500000 1.000000 0.500000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } 7 { 0.000000 0.000000 0.000000 0.666667 0.333333 0.333333 0.333333 0.666667 0.666667 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 }} array set ws_npos {4 10 8 12 1 8 5 14 10 8 9 8 2 10 6 9 11 8 3 10 7 10} SetWignerSeitzInit; update; SetWignerSeitz_OK test; SetWignerSeitz_Cancel .wgnset # ------------------------------------------------------------------------ # END: Wigner-Seitz Cell # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # BEGIN: Molecular-Surface # ------------------------------------------------------------------------ array set pDen {nb .a0.n t_shademodel Smooth 1,ident 1 0,radius_old cov 0,t_surfacetype {Pseudo density} 0,drawstyle wire resolution 0.35 0,render 1 t_type GAUSSIAN 1,level 1.500000 t_surfacetype {Pseudo density} 1,t_shademodel Smooth drawstyle wire 0,surfacetype molsurf 1,cutoff_old 1.0 surfacetype molsurf 0,type gauss 0,t_drawstyle Wire 0,new 0 1,transparent 1 radius cov 0,ident 0 1,colorscheme atomic smoothweight 0.2 t_drawstyle Wire t_radius {Covalent radii} 1,shademodel smooth 1,drawstyle solid 0,level 1.0 0,monocolor {0.8 0.8 0.2} 1,smoothsteps 0 1,smoothweight 0.2 level 1.0 monocolor {0.8 0.8 0.2} 1,t_type GAUSSIAN 1,radius_old cov 1,t_colorscheme {Atomic colors} 0,t_shademodel Smooth shademodel smooth 1,colbut .a0.n.fn1.1.a6.colb cutoff 1.0 0,resolution 0.35 0,t_type GAUSSIAN 0,type_old gauss 0,colbut .a0.n.fn0.1.a6.colb 1,radius cov 1,monocolor {1.0 1.0 0.40000000000000002} 1,surfacetype molsurf 0,level_old 1.0 0,t_colorscheme {Atomic colors} 0,radius cov 1,type_old gauss 0,transparent 0 0,smoothweight 0.2 0,t_radius {Covalent radii} 1,resolution_old 0.35 1,t_drawstyle Solid 1,new 0 t_colorscheme {Atomic colors} 0,colorscheme atomic 0,cutoff_old 1.0 transparent 0 type gauss 1,t_surfacetype {Pseudo density} 1,cutoff 1.0 colorscheme atomic 0,smoothsteps 0 0,resolution_old 0.35 nsurface 2 1,type gauss 1,t_radius {Covalent radii} 1,resolution 0.35 smoothsteps 0 0,shademodel smooth 0,cutoff 1.0 1,level_old 1.500000 0,surfacetype_old molsurf 1,render 1 1,surfacetype_old molsurf 0,tessellation cube 0,normals gradient 1,tessellation cube 1,normals gradient} set pDen(0,ident) [xc_molsurfreg .mesa] PseudoDen:_xc_molsurf 0 set pDen(1,ident) [xc_molsurfreg .mesa] PseudoDen:_xc_molsurf 1 # ------------------------------------------------------------------------ # END: Molecular-Surface # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # Number of Units Drawn # ------------------------------------------------------------------------ set nxdir 2 set nydir 1 set nzdir 2 # ------------------------------------------------------------------------ # Various displays (i.e. checkbuttons of DISPLAY menu) # ------------------------------------------------------------------------ array set check {wigner 1 crds 0 antialias 0 perspective 1 pseudoDens 1 forces 0 frames 1 depthcuing 0 perpective 0 unibond 0 labels 1} CrdSist AtomLabels CrysFrames Unibond forceVectors .mesa WignerSeitz Perspective # ------------------------------------------------------------------------ # Various displays (i.e. radiobuttons DISPLAY menu) # ------------------------------------------------------------------------ array set radio {space {SpaceFill based on covalent radii} .mesa,bg #000000 cellmode conv frames rods unitrep cell hexamode parapipedal ball {Balls based on covalent radii}} DispFramesAs xc_newvalue .mesa 2 xc_newvalue .mesa 0 # ------------------------------------------------------------------------ # load appropriate color-scheme # ------------------------------------------------------------------------ array set colSh {scR .a0.f1.3.scr slab_dir -z slabrange_min 0.00 r1 .a0.f1.1.r1 r2 .a0.f1.2.r2 slabrange_max 1.00 r3 .a0.f1.3.r3 scheme dist slab_colbas monochrome dist_r 1.00 dist_coltyp override dist_alpha 0.65 scMin .a0.f1.2.scmin dist_x 5.4199999999999999 scMax .a0.f1.2.scmax slab_coltyp combined dist_y 0.0 dist_z 5.4199999999999999 slab_alpha 0.65 dist_colbas geographic} ColorSchemeUpdate .mesa # ------------------------------------------------------------------------ # rotation matrix and zooming factor, and translation displacements # ------------------------------------------------------------------------ xc_rotationmatrix set 9.019399951934647e-01 -2.524980998911268e-02 -4.311225952857570e-01 0.000000000000000e+00 2.074515590721197e-01 9.008993625656341e-01 3.812403299329447e-01 0.000000000000000e+00 3.787718253895869e-01 -4.332929558905239e-01 8.177952791907598e-01 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 xc_translparam set 3.250000000000000e+01 0.000000000000000e+00 4.616152655987591e+00 # this is used to force the update of display cry_toglzoom .mesa 0.0 # ------------------------------------------------------------------------ # Anti-Aliasing & Depth-Cuing & PseudoDensity (these are time consuming) # ------------------------------------------------------------------------ DepthCuing; PseudoDensity; AntiAlias # ------------------------------------------------------------------------ # reset cursor # ------------------------------------------------------------------------ set xcCursor(dont_update) 0 ResetCursor destroy $wait_window xcrysden-1.6.2/examples/Scripting/g98cube.tcl0000644000175000017500000002625113521030674017614 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/g98cube.tcl *** # # NAME # g98cube.tcl -- a simple example for display of MO from Gaussian cube file # # USAGE # xcrysden --script g98cube.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a scripting example that shows how to display a particular # molecular orbital (MO) from Gaussian cube file. In this example the # 11th MO is displayed as isosurface + contours. # # AUTHOR # Anton Kokalj # # CREATION DATE # Fri Apr 4 15:21:53 CEST 2003 # # SOURCE # ------------------------------------------------------------------------ # Load the structure. The arguments to scripting::filter::g98cube are # cube-file and the MO index, i.e., scripting::filter::g98cube # cube_file mo_index # ------------------------------------------------------------------------ scripting::filter::g98cube $env(XCRYSDEN_TOPDIR)/examples/GAUSSIAN_files/N2O_homo+lumo.cube.gz 11 # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ #----- # uncomment this is for Lighting-On modes: #----- scripting::lighting On # choose a 3D-display mode #scripting::displayMode3D Stick scripting::displayMode3D Pipe&Ball #scripting::displayMode3D BallStick #scripting::displayMode3D SpaceFill #---- # ------------------------------------------------------------------------ # zoom and rotate the structure # ------------------------------------------------------------------------ scripting::zoom -0.35 scripting::rotate x -90 # ------------------------------------------------------------------------ # load the 3D scalar field # ------------------------------------------------------------------------ scripting::scalarField3D::load # ------------------------------------------------------------------------ # hide the isosurface control window # ------------------------------------------------------------------------ IsoControl_Hide .iso # # description of scripting::scalarField3D::configure options: # # ------------------------------------------------------------------------ # OPTION:: ALLOWED-VALUES + Description STATUS # ------------------------------------------------------------------------ # -isosurface 0|1 REQUIRED # 0 = do not render isosurface # 1 = render isosurface # # -interpolation_degree integer OPTIONAL # degree of scalar-field interpolation # # -isolevel real REQUIRED # the isovalue of isosurface # # -plusminus 0|1 # 0 = display only the isosurface of isovalue # specified by -isolevel # 1 = display the two isosurfaces of +-isovalue # # -revertsides pos|neg|{pos neg} # pos = revert the front- and back-side of isovalue # isosurface # neg = revert the front- and back-side of -isovalue # isosurface # -revertnormals pos|neg|{pos neg} # pos = revert the normals of isovalue isosurface # neg = revert the normals of -isovalue isosurface # # -expand none|whole|specify # none = do not expand the isosurface along the # periodic directions # whole = expand the isosurface over the # whole structure along the periodic # directions # specify = expand the isosurface along the # periodic directions as specified by # -expand_X, -expand_Y, and -expand_Z # factors # # -expand_X positive-integer # expand isosurface n-times along the 1st # periodic dimension # # # -expand_Y positive-integer # expand isosurface n-times along the 2nd # periodic dimension # # -expand_Z positive-integer # expand isosurface n-times along the 3rd # periodic dimension # # -basalplane 0|1|2 # show the ith basal plane (0=xy, 1=xz, 2=yz) # as colorplane and/or isolines (as specified by # -colorplane and -isoline options) # # -colorbasis MONOCHROME|RAINBOW|RGB|GEOGRAPHIC|BLUE-WHITE-RED # the color basis for the colorplane # # -scalefunction LINEAR|LOG10|SQRT|3th-ROOT|EXP(x)|EXP(x^2) # the scalefunctions for contour/colorplane plots # # -expand2D none|whole|specify # none = do not expand the contour/colorplane plots # along the periodic directions # whole = expand the contour/colorplane plots # over the whole structure along the # periodic directions # specify = expand the contour/colorplane plots # along the periodic directions as specified # by -expand2D_X, -expand2D_Y, and # -expand2D_Z factors # # -expand2D_X positive-integer # expand contour/colorplane n-times along the 1st # periodic dimension # # # -expand2D_Y positive-integer # expand contour/colorplane n-times along the 2nd # periodic dimension # # -expand2D_Z positive-integer # expand contour/colorplane n-times along the 3rd # periodic dimension # # -colorplane 0|1 # do not display|display the colorplane # # -isoline 0|1 # do not display|display the isolines # # -colorplane_lighting 0|1 # 0 = do not perform lighting for colorplane # 1 = perform lighting for colorplane # # -cpl_transparency 0|1 # 0 = render colorplane as non-transparent # 1 = render colorplane as transparent # # -cpl_thermometer 0|1 # 0 = do not make a legend (i.e. thermometer) for # colorplane colors # 1 = make a legend (i.e. thermometer) for # colorplane colors # # -2Dlowvalue real # minimum rendered value of colorplane/isolines # # -2Dhighvalue real # maximum rendered value of colorplane/isolines # # -2Dnisoline positive-integer # number of isoline # # -anim_step positive-integer # animation step # # -current_slide positive-integer # iD (i.e. sequential number) of colorplane # # -isoline_color monocolor|{property color} # monocolor = all isolines have the same color # {property color} = isolines are colorer according # to color-basis # # -isoline_width positive-integer # width (i.e. thickness) of isolines # # -isoline_monocolor #rgb # color of the monolor-type isolines # # ------------------------------------------------------------------------ # # # Example: # # scripting::scalarField3D::configure \ # -isosurface 1 \ # -interpolation_degree 2 \ # -isolevel 0.1 \ # -plusminus 1 \ # -revertsides {pos neg} \ # -revertnormal {pos neg} \ # -expand specify \ # -expand_X 1 \ # -expand_Y 1 \ # -expand_Z 1 \ # -basalplane 0 \ # -colorbasis BLUE-WHITE-RED \ # -scalefunction LINEAR \ # -expand2D specify \ # -expand2D_X 1 \ # -expand2D_Y 1 \ # -expand2D_Z 1 \ # -colorplane 1 \ # -isoline 1 \ # -colorplane_lighting 0 \ # -cpl_transparency 0 \ # -cpl_thermometer 1 \ # -2Dlowvalue -0.1 \ # -2Dhighvalue +0.1 \ # -2Dnisoline 11 \ # -anim_step 1 \ # -current_slide 30 \ # -isoline_color monocolor \ # -isoline_width 3 \ # -isoline_monocolor \#000000 # # ------------------------------------------------------------------------ # configure, i.e., specify how to render the scalar field # ------------------------------------------------------------------------ scripting::scalarField3D::configure \ -isosurface 1 \ -interpolation_degree 2 \ -isolevel 0.1 \ -plusminus 1 \ -basalplane 2 \ -colorbasis BLUE-WHITE-RED \ -scalefunction LINEAR \ -expand2D specify \ -expand2D_X 1 \ -expand2D_Y 1 \ -expand2D_Z 1 \ -colorplane 1 \ -isoline 1 \ -colorplane_lighting 0 \ -cpl_transparency 0 \ -cpl_thermometer 1 \ -2Dlowvalue -0.1 \ -2Dhighvalue +0.1 \ -2Dnisoline 11 \ -anim_step 1 \ -current_slide 19 \ -isoline_color monocolor \ -isoline_width 3 \ -isoline_monocolor \#000000 # ------------------------------------------------------------------------ # render the 3D scalar field as requested by # scripting::scalarField3D::configure # ------------------------------------------------------------------------ scripting::scalarField3D::render # ------------------------------------------------------------------------ # now lets print to file what we have on the display window # ------------------------------------------------------------------------ # this will query the filename: scripting::printToFile mo-11.png; # here the colorplane legend is NOT printed exit # # while this will print directly to print.png: # scripting::printToFile print.png; # here the colorplane legend is printed # # while this will print directly to print.png: # scripting::printToFile print.png windowdump; # here the colorplane legend is also printed #**** # ------------------------------------------------------------------------ xcrysden-1.6.2/examples/Scripting/multiScript.tcl0000644000175000017500000001222413524242054020660 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/multiScript.tcl *** # # NAME # multiScript.tcl -- a simple example of multi-job script (i.e. multiScript) # # USAGE # xcrysden --script multiScript.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a scripting example that shows how to produce a multi-jobs. # It uses the scripting::multiScript facility. Many times, one might # want to produce several plots of molecular orbitals of a given # molecule. It would be desirable that the display parameters are # exactly the same for all plots. This is one such example, where CO # HOMO and LUMO molecular-orbitals are printed. # # The multiScript uses major and minor script. In the first script the # loading of the files is specified, while in the latter script the # operations of what to do with each file are defined. The usage of # multiScript is: # # scripting::multiScript scriptMajor scriptMinor # # scripting::multiScript scriptMajor scriptMinor # # WARNINGS # Inside the major-script (i.e. scriptMajor) the scripting::exec # should be used instead of scripting::open. # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2003 # # SOURCE scripting::multiScript { # ------------------------------------------------------------------------ # This is the MAJOR script # # It opens two files, one at a time, and then for each opened # file proceed according to minor script instructions # ------------------------------------------------------------------------ global env set dir [file join $env(XCRYSDEN_TOPDIR) examples XSF_Files] set file1 [file join $dir CO_homo.xsf.gz] set file2 [file join $dir CO_lumo.xsf.gz] foreach file [list $file1 $file2] { # load the $file XSF scripting::exec --xsf $file # rename print.png to $file.png if { [file exists print.png] } { set filehead [file tail [file rootname $file]] file rename -force print.png $filehead.png } } } { # ------------------------------------------------------------------------ # This is the MINOR script # # It produces and prints the isosurface + colorplane # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ scripting::lighting On scripting::displayMode3D Pipe&Ball # ------------------------------------------------------------------------ # zoom and rotate the structure # ------------------------------------------------------------------------ scripting::zoom -0.5 scripting::rotate x -90 # ------------------------------------------------------------------------ # load the 3D scalar field # ------------------------------------------------------------------------ scripting::scalarField3D::load # ------------------------------------------------------------------------ # configure, i.e., specify how to render the scalar field # # for the usage see, for example, isosurface+colorplane+print.tcl file # ------------------------------------------------------------------------ scripting::scalarField3D::configure \ -isosurface 1 \ -interpolation_degree 2 \ -isolevel 0.1 \ -plusminus 1 \ -basalplane 2 \ -colorbasis BLUE-WHITE-RED \ -scalefunction LINEAR \ -expand2D specify \ -expand2D_X 1 \ -expand2D_Y 1 \ -expand2D_Z 1 \ -colorplane 1 \ -isoline 1 \ -colorplane_lighting 0 \ -cpl_transparency 0 \ -cpl_thermometer 1 \ -2Dlowvalue -0.1 \ -2Dhighvalue +0.1 \ -2Dnisoline 11 \ -anim_step 1 \ -current_slide 25 \ -isoline_color monocolor \ -isoline_width 3 \ -isoline_monocolor \#000000 # ------------------------------------------------------------------------ # hide the isosourface control window # ------------------------------------------------------------------------ wm withdraw .iso # ------------------------------------------------------------------------ # render the 3D scalar field as requested by # scripting::scalarField3D::configure # ------------------------------------------------------------------------ scripting::scalarField3D::render # # ------------------------------------------------------------------------ # # revert the isosurface normals (this should be done after rendering of # # isosurface) # # ------------------------------------------------------------------------ # # scripting::scalarField3D::configure -revertnormal {pos neg} # ------------------------------------------------------------------------ # now lets print to file what we have on the display window # ------------------------------------------------------------------------ scripting::printToFile print.png # we've done all; exit exit 0 } #****** xcrysden-1.6.2/examples/Scripting/build_crystal.tcl0000644000175000017500000000736212161025154021204 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/build_crystal.tcl *** # # NAME # build_crystal.tcl -- animates and builds a crystal structure # # USAGE # xcrysden --script build_crystal.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a simple script. It renders a crystal structure, and builds # step by step bigger portions of the crystal. # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2003 # # SOURCE # ------------------------------------------------------------------------ # load the structure (the argument to scription:open is the command line # ------------------------------------------------------------------------ scripting::open --xsf $env(XCRYSDEN_TOPDIR)/examples/XSF_Files/ZnS.xsf # ------------------------------------------------------------------------ # resize the display window to 400x400 # ------------------------------------------------------------------------ scripting::displayWindow resize 400 400 # ------------------------------------------------------------------------ # let us make a white background # ------------------------------------------------------------------------ set myParam(BACKGROUND) {1.00 1.00 1.00} scripting::load_myParam # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ #----- # this is for Lighting-On modes: #----- scripting::lighting On # choose a 3D-display mode #scripting::displayMode3D Stick #scripting::displayMode3D Pipe&Ball #scripting::displayMode3D BallStick scripting::displayMode3D SpaceFill #---- # #--- # # this is for Lighting-Off modes: # #--- # scripting::lighting Off # # # choose a 2D-display mode # # #scripting::displayMode2D WireFrame # #scripting::displayMode2D PointLine # #scripting::displayMode2D Pipe&Ball # #scripting::displayMode2D BallStick-1 # scripting::displayMode2D BallStick-2 # #scripting::displayMode2D SpaceFill # #--- # ------------------------------------------------------------------------ # show th crystal-cells and switch to perspective projection # ------------------------------------------------------------------------ scripting::display on crystal-cells scripting::display on perspective # ------------------------------------------------------------------------ # first zoom the structure slowly # ------------------------------------------------------------------------ scripting::zoom +0.03 15 # ------------------------------------------------------------------------ # rotate a few times # # usage: # scripting::rotate x|y|z step_size number_of_times # or # scripting::rotate xy|xz|yz step_size1 step_size2 number_of_times # # ------------------------------------------------------------------------ scripting::rotate x +3 10 scripting::rotate y +3 10 scripting::rotate z -3 10 # ------------------------------------------------------------------------ # now build the crystal slowly # ------------------------------------------------------------------------ for {set i 1} {$i < 3} {incr i} { for {set j $i} {$j < 3} {incr j} { for {set k $j} {$k < 3} {incr k} { if { $i*$j*$k != 8 } { scripting::buildCrystal $i $j $k wait 100 } } } } for {set i 2} {$i < 4} {incr i} { for {set j $i} {$j < 4} {incr j} { for {set k $j} {$k < 4} {incr k} { if { $i*$j*$k != 27 } { scripting::buildCrystal $i $j $k update } } } } for {set i 3} {$i < 5} {incr i} { for {set j $i} {$j < 5} {incr j} { for {set k $j} {$k < 5} {incr k} { scripting::buildCrystal $i $j $k update } } } #**** # ------------------------------------------------------------------------ xcrysden-1.6.2/examples/Scripting/CO_homo.xsf.gz0000777000175000017500000000000013522572207025002 2../XSF_Files/CO_homo.xsf.gzustar tonetonexcrysden-1.6.2/examples/Scripting/colorplane_animation.tcl0000644000175000017500000003221612161025154022535 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/colorplane_animation.tcl *** # # NAME # colorplane_animation.tcl -- a simple example for animating a contour plots # # USAGE # xcrysden --script colorplane_animation.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a scripting example that shows how to produce an animation # of colorplane/contour plots by loading the XSF file which contains # the description of the 3D scalar field. In this example the contours # of the LUMO molecular-orbital are animated trough the CO molecule # for all three three basal planes (i.e. XY, XZ, and YZ). # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2003 # # SOURCE # ------------------------------------------------------------------------ # load the structure (the argument to scription:open is the command line # ------------------------------------------------------------------------ scripting::open --xsf $env(XCRYSDEN_TOPDIR)/examples/XSF_Files/CO_lumo.xsf.gz # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ #----- # this is Lighting-On modes: #----- scripting::lighting On # choose a given 3D-display mode #scripting::displayMode3D Stick scripting::displayMode3D Pipe&Ball #scripting::displayMode3D BallStick #scripting::displayMode3D SpaceFill #---- # ------------------------------------------------------------------------ # maximize the XCRYSDEN main window # ------------------------------------------------------------------------ #scripting::mainWindow maximize scripting::displayWindow fullscreen # ------------------------------------------------------------------------ # load the 3D scalar field # ------------------------------------------------------------------------ scripting::scalarField3D::load # ------------------------------------------------------------------------ # hide the isosourface control window # ------------------------------------------------------------------------ IsoControl_Hide # alternatively you could do #wm withdraw .iso # ------------------------------------------------------------------------ # this is preliminary, used for the sake of better visualizing # effect. See below the desciption of the two functions used here. # ------------------------------------------------------------------------ scripting::scalarField3D::configure \ -isosurface 0 \ -interpolation_degree 2 \ -basalplane 2 \ -colorbasis BLUE-WHITE-RED \ -scalefunction LINEAR \ -colorplane 1 \ -isoline 1 \ -colorplane_lighting 0 \ -cpl_transparency 1 \ -cpl_thermometer 1 \ -2Dlowvalue -0.2 \ -2Dhighvalue +0.2 \ -2Dnisoline 11 \ -anim_step 1 \ -current_slide 1 \ -isoline_color {property color} \ -isoline_width 3 \ # -isoline_monocolor \#000000 scripting::scalarField3D::render # ------------------------------------------------------------------------ # zoom and rotate the structure # ------------------------------------------------------------------------ scripting::zoom -0.08 8 scripting::rotate x -5 18 scripting::rotate y +5 15 # do the animation show forever while {1} { # # description of scripting::scalarField3D::configure options: # # ------------------------------------------------------------------------ # OPTION:: ALLOWED-VALUES + Description STATUS # ------------------------------------------------------------------------ # -isosurface 0|1 REQUIRED # 0 = do not render isosurface # 1 = render isosurface # # -interpolation_degree integer OPTIONAL # degree of scalar-field interpolation # # -isolevel real REQUIRED # the isovalue of isosurface # # -plusminus 0|1 # 0 = display only the isosurface of isovalue # specified by -isolevel # 1 = display the two isosurfaces of +-isovalue # # -revertsides pos|neg|{pos neg} # pos = revert the front- and back-side of isovalue # isosurface # neg = revert the front- and back-side of -isovalue # isosurface # -revertnormals pos|neg|{pos neg} # pos = revert the normals of isovalue isosurface # neg = revert the normals of -isovalue isosurface # # -basalplane 0|1|2 # show the ith basal plane (0=xy, 1=xz, 2=yz) # as colorplane and/or isolines (as specified by # -colorplane and -isoline options) # # -colorbasis MONOCHROME|RAINBOW|RGB|GEOGRAPHIC|BLUE-WHITE-RED # the color basis for the colorplane # # -scalefunction LINEAR|LOG10|SQRT|3th-ROOT|EXP(x)|EXP(x^2) # the scalefunctions for contour/colorplane plots # # -expand2D none|whole|specify # none = do not expand the contour/colorplane plots # along the periodic directions # whole = expand the contour/colorplane plots # over the whole structure along the # periodic directions # specify = expand the contour/colorplane plots # along the periodic directions as specified # by -expand2D_X, -expand2D_Y, and # -expand2D_Z factors # # -expand2D_X positive-integer # expand contour/colorplane n-times along the 1st # periodic dimension # # # -expand2D_Y positive-integer # expand contour/colorplane n-times along the 2nd # periodic dimension # # -expand2D_Z positive-integer # expand contour/colorplane n-times along the 3rd # periodic dimension # # -colorplane 0|1 # do not display|display the colorplane # # -isoline 0|1 # do not display|display the isolines # # -colorplane_lighting 0|1 # 0 = do not perform lighting for colorplane # 1 = perform lighting for colorplane # # -cpl_transparency 0|1 # 0 = render colorplane as non-transparent # 1 = render colorplane as transparent # # -cpl_thermometer 0|1 # 0 = do not make a legend (i.e. thermometer) for # colorplane colors # 1 = make a legend (i.e. thermometer) for # colorplane colors # # -2Dlowvalue real # minimum rendered value of colorplane/isolines # # -2Dhighvalue real # maximum rendered value of colorplane/isolines # # -2Dnisoline positive-integer # number of isoline # # -anim_step positive-integer # animation step # # -current_slide positive-integer # iD (i.e. sequential number) of colorplane # # -isoline_color monocolor|{property color} # monocolor = all isolines have the same color # {property color} = isolines are colorer according # to color-basis # # -isoline_width positive-integer # width (i.e. thickness) of isolines # # -isoline_monocolor #rgb # color of the monolor-type isolines # # ------------------------------------------------------------------------ # # # Example: # # scripting::scalarField3D::configure \ # -isosurface 1 \ # -interpolation_degree 2 \ # -isolevel 0.1 \ # -plusminus 1 \ # -revertsides {pos neg} \ # -revertnormal {pos neg} \ # -basalplane 0 \ # -colorbasis BLUE-WHITE-RED \ # -scalefunction LINEAR \ # -expand2D specify \ # -expand2D_X 1 \ # -expand2D_Y 1 \ # -expand2D_Z 1 \ # -colorplane 1 \ # -isoline 1 \ # -colorplane_lighting 0 \ # -cpl_transparency 0 \ # -cpl_thermometer 1 \ # -2Dlowvalue -0.1 \ # -2Dhighvalue +0.1 \ # -2Dnisoline 11 \ # -anim_step 1 \ # -current_slide 30 \ # -isoline_color monocolor \ # -isoline_width 3 \ # -isoline_monocolor \#000000 # # ------------------------------------------------------------------------ # configure, i.e., specify how to render the scalar field # # render 2nd basal plane # ------------------------------------------------------------------------ scripting::scalarField3D::configure \ -isosurface 0 \ -interpolation_degree 2 \ -basalplane 2 \ -colorbasis BLUE-WHITE-RED \ -scalefunction LINEAR \ -colorplane 1 \ -isoline 1 \ -colorplane_lighting 0 \ -cpl_transparency 1 \ -cpl_thermometer 1 \ -2Dlowvalue -0.2 \ -2Dhighvalue +0.2 \ -2Dnisoline 11 \ -anim_step 1 \ -current_slide 1 \ -isoline_color {property color} \ -isoline_width 3 \ # -isoline_monocolor \#000000 # ------------------------------------------------------------------------ # render the 3D scalar field as requested by # scripting::scalarField3D::configure # ------------------------------------------------------------------------ scripting::scalarField3D::render # ------------------------------------------------------------------------ # now let us do the animation # ------------------------------------------------------------------------ for {set i 1} {$i <= 49} {incr i} { scripting::scalarField3D::configure -current_slide $i scripting::scalarField3D::render } for {set i 49} {$i > 0} {incr i -1} { scripting::scalarField3D::configure -current_slide $i scripting::scalarField3D::render } scripting::scalarField3D::configure -colorplane 0 -isoline 0 -cpl_thermometer 0 # now render the 1st basal plane scripting::scalarField3D::configure \ -basalplane 1 \ -colorbasis BLUE-WHITE-RED \ -scalefunction LINEAR \ -colorplane 1 \ -isoline 1 \ -colorplane_lighting 0 \ -cpl_transparency 1 \ -cpl_thermometer 1 \ -2Dlowvalue -0.2 \ -2Dhighvalue +0.2 \ -2Dnisoline 11 \ -anim_step 49 \ -current_slide 1 \ -isoline_color {property color} \ -isoline_width 3 \ # -isoline_monocolor \#000000 scripting::scalarField3D::render scripting::rotate y 5 18 for {set i 1} {$i <= 49} {incr i} { scripting::scalarField3D::configure -current_slide $i scripting::scalarField3D::render } for {set i 49} {$i > 0} {incr i -1} { scripting::scalarField3D::configure -current_slide $i scripting::scalarField3D::render } scripting::scalarField3D::configure -colorplane 0 -isoline 0 \ -cpl_thermometer 0 # now render the 3rd basal plane scripting::scalarField3D::configure \ -basalplane 3 \ -colorbasis BLUE-WHITE-RED \ -scalefunction LINEAR \ -colorplane 1 \ -isoline 1 \ -colorplane_lighting 0 \ -cpl_transparency 1 \ -cpl_thermometer 1 \ -2Dlowvalue -0.2 \ -2Dhighvalue +0.2 \ -2Dnisoline 11 \ -anim_step 1 \ -current_slide 1 \ -isoline_color {property color} \ -isoline_width 3 \ # -isoline_monocolor \#000000 scripting::scalarField3D::render scripting::rotate y -5 18 scripting::rotate x +5 26 for {set i 1} {$i <= 49} {incr i} { scripting::scalarField3D::configure -current_slide $i scripting::scalarField3D::render } for {set i 49} {$i > 0} {incr i -1} { scripting::scalarField3D::configure -current_slide $i scripting::scalarField3D::render } scripting::rotate x -5 26 scripting::scalarField3D::configure -colorplane 0 -isoline 0 \ -cpl_thermometer 0 } #**** # ------------------------------------------------------------------------ xcrysden-1.6.2/examples/Scripting/MO-state.xcrysden0000755000175000017500000006240213525547772021075 0ustar tonetone# ------------------------------------------------------------------------ # BEWARE: do not run this script directly; it's used for plot_all_MO.sh # ------------------------------------------------------------------------ # ======================================================================== # # # # STATE-PART OF THE FILE # # # # ======================================================================== # # ------------------------------------------------------------------------ # definition of xcMisc array # ------------------------------------------------------------------------ array set xcMisc {} # ------------------------------------------------------------------------ # display "waiting" toplevel and watch-cursor # ------------------------------------------------------------------------ set wait_window [DisplayUpdateWidget "Reconstructing" "Reconstructing the structure and display parameters. Please wait"] SetWatchCursor set xcCursor(dont_update) 1 # ------------------------------------------------------------------------ # size of the main window fonts # ------------------------------------------------------------------------ wm geometry . 780x720 # ------------------------------------------------------------------------ # BEGIN: create fonts # ------------------------------------------------------------------------ saveState:fontCreate font1 -family {nimbus sans l} -size 12 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font10 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font2 -family helvetica -size 10 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font11 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font3 -family helvetica -size 14 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font12 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font13 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font4 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font14 -family {nimbus mono l} -size 12 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font5 -family {nimbus sans l} -size 12 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font15 -family {nimbus mono l} -size 20 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font6 -family helvetica -size 10 -weight normal -slant roman -underline 0 -overstrike 0 saveState:fontCreate font16 -family {nimbus sans l} -size 7 -weight bold -slant roman -underline 1 -overstrike 0 saveState:fontCreate font7 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font17 -family {nimbus sans l} -size 7 -weight bold -slant roman -underline 1 -overstrike 0 saveState:fontCreate font8 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 saveState:fontCreate font18 -family {nimbus sans l} -size 20 -weight bold -slant roman -underline 1 -overstrike 0 saveState:fontCreate font9 -family {nimbus sans l} -size 12 -weight bold -slant roman -underline 0 -overstrike 0 # ------------------------------------------------------------------------ # END: create fonts # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # BEGIN: take care of display-mode # ------------------------------------------------------------------------ set translationStep 0.05 set rotstep 10 set light On Lighting On array set mode2D {PL Off SF Off WF Off BS1 Off PB Off BS2 Off} array set mode3D {space Off sticks On pipe On balls On} array set dispmode {mode3D_name PB mode3D Preset mode3D_f2_packinfo {-in .ctrl.c.f.fr3 -anchor center -expand 1 -fill both -ipadx 0 -ipady 0 -padx 0 -pady 0 -side top} style 3D mode3D_ModeFrame .ctrl.c.f.fr3.2.a0} saveState:displayMode set style3D(draw) solid; Style3D draw solid set style3D(shade) smooth; Style3D shade smooth set viewer(rot_zoom_button_mode) Click-and-hold; Viewer:rotZoomButtonMode # ------------------------------------------------------------------------ # END: take care of display-mode # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # Number of Units Drawn # ------------------------------------------------------------------------ set nxdir 1 set nydir 1 set nzdir 1 # ------------------------------------------------------------------------ # BEGIN: Atomic-Labels/Fonts # ------------------------------------------------------------------------ array set atomLabel {atomFont {} globalFont {} atomFont.brightColor {1.0 1.0 1.0} globalFont.brightColor {1.0 1.0 1.0} atomFont.do_display 1 atomFont.label {} globalFont.do_display 1 atomFont.darkColor {0.0 0.0 0.0} atomFont.id {} globalFont.darkColor {0.0 0.0 0.0} fontBrowser {Simple Font Browser}} set t [ModAtomLabels] xc_setfont .mesa {} {1.0 1.0 1.0} {0.0 0.0 0.0} ModAtomLabels:advancedCheckButton default ModAtomLabels:advancedCheckButton custom ModAtomLabels:advancedCloseUpdate dummy update CancelProc $t # ------------------------------------------------------------------------ # END: Atomic-Labels/Fonts # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # BEGIN: Various colors # ------------------------------------------------------------------------ xc_newvalue .mesa 8 0 0.770000 1.000000 0.420000 xc_newvalue .mesa 8 1 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 2 0.950000 0.950000 0.950000 xc_newvalue .mesa 8 3 0.950000 0.950000 0.950000 xc_newvalue .mesa 8 4 0.707900 0.707900 0.707900 xc_newvalue .mesa 8 5 0.707900 0.707900 0.707900 xc_newvalue .mesa 8 6 0.950000 0.950000 0.000000 xc_newvalue .mesa 8 7 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 8 0.700000 0.000000 0.000000 xc_newvalue .mesa 8 9 0.834500 0.950000 0.950000 xc_newvalue .mesa 8 10 0.950000 0.950000 0.950000 xc_newvalue .mesa 8 11 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 12 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 13 0.950000 0.000000 0.950000 xc_newvalue .mesa 8 14 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 15 0.950000 0.950000 0.000000 xc_newvalue .mesa 8 16 0.950000 0.950000 0.450000 xc_newvalue .mesa 8 17 0.300000 0.300000 0.950000 xc_newvalue .mesa 8 18 0.950000 0.950000 0.950000 xc_newvalue .mesa 8 19 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 20 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 21 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 22 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 23 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 24 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 25 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 26 0.950000 0.000000 0.000000 xc_newvalue .mesa 8 27 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 28 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 29 0.644500 0.804700 0.856900 xc_newvalue .mesa 8 30 0.950000 0.000000 0.950000 xc_newvalue .mesa 8 31 0.950000 0.000000 0.950000 xc_newvalue .mesa 8 32 0.950000 0.000000 0.950000 xc_newvalue .mesa 8 33 0.950000 0.950000 0.000000 xc_newvalue .mesa 8 34 0.950000 0.950000 0.000000 xc_newvalue .mesa 8 35 0.950000 0.000000 0.000000 xc_newvalue .mesa 8 36 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 37 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 38 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 39 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 40 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 41 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 42 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 43 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 44 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 45 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 46 1.000000 1.000000 1.000000 xc_newvalue .mesa 8 47 1.000000 1.000000 1.000000 xc_newvalue .mesa 8 48 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 49 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 50 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 51 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 52 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 53 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 54 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 55 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 56 0.000000 0.950000 0.950000 xc_newvalue .mesa 8 57 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 58 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 59 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 60 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 61 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 62 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 63 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 64 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 65 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 66 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 67 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 68 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 69 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 70 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 71 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 72 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 73 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 74 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 75 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 76 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 77 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 78 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 79 1.000000 0.850000 0.000000 xc_newvalue .mesa 8 80 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 81 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 82 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 83 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 84 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 85 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 86 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 87 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 88 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 89 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 90 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 91 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 92 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 93 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 94 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 95 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 96 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 97 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 98 0.750000 0.750000 0.750000 xc_newvalue .mesa 8 99 0.931400 0.875500 0.801000 xc_newvalue .mesa 8 100 0.931400 0.875500 0.801000 xc_newvalue .mesa 26 1.000000 1.000000 1.000000 1.0 xc_newvalue .mesa 17 0.880000 1.000000 0.670000 # ------------------------------------------------------------------------ # END: Various colors # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # BEGIN: Atomic radii # ------------------------------------------------------------------------ xc_newvalue .mesa 4 0 0.532000 xc_newvalue .mesa 4 1 0.532000 xc_newvalue .mesa 4 2 0.532000 xc_newvalue .mesa 4 3 1.722000 xc_newvalue .mesa 4 4 1.246000 xc_newvalue .mesa 4 5 1.274000 xc_newvalue .mesa 4 6 1.078000 xc_newvalue .mesa 4 7 1.050000 xc_newvalue .mesa 4 8 1.022000 xc_newvalue .mesa 4 9 0.994000 xc_newvalue .mesa 4 10 2.240000 xc_newvalue .mesa 4 11 2.240000 xc_newvalue .mesa 4 12 1.960000 xc_newvalue .mesa 4 13 1.750000 xc_newvalue .mesa 4 14 1.450000 xc_newvalue .mesa 4 15 1.400000 xc_newvalue .mesa 4 16 1.456000 xc_newvalue .mesa 4 17 1.140000 xc_newvalue .mesa 4 18 2.660000 xc_newvalue .mesa 4 19 2.982000 xc_newvalue .mesa 4 20 2.436000 xc_newvalue .mesa 4 21 2.240000 xc_newvalue .mesa 4 22 1.960000 xc_newvalue .mesa 4 23 1.890000 xc_newvalue .mesa 4 24 1.960000 xc_newvalue .mesa 4 25 1.960000 xc_newvalue .mesa 4 26 1.960000 xc_newvalue .mesa 4 27 1.890000 xc_newvalue .mesa 4 28 1.890000 xc_newvalue .mesa 4 29 1.890000 xc_newvalue .mesa 4 30 1.890000 xc_newvalue .mesa 4 31 1.820000 xc_newvalue .mesa 4 32 1.750000 xc_newvalue .mesa 4 33 1.610000 xc_newvalue .mesa 4 34 1.610000 xc_newvalue .mesa 4 35 1.596000 xc_newvalue .mesa 4 36 2.800000 xc_newvalue .mesa 4 37 3.080000 xc_newvalue .mesa 4 38 2.800000 xc_newvalue .mesa 4 39 2.590000 xc_newvalue .mesa 4 40 2.170000 xc_newvalue .mesa 4 41 2.030000 xc_newvalue .mesa 4 42 2.030000 xc_newvalue .mesa 4 43 1.890000 xc_newvalue .mesa 4 44 1.820000 xc_newvalue .mesa 4 45 1.890000 xc_newvalue .mesa 4 46 1.960000 xc_newvalue .mesa 4 47 2.240000 xc_newvalue .mesa 4 48 2.170000 xc_newvalue .mesa 4 49 2.170000 xc_newvalue .mesa 4 50 1.974000 xc_newvalue .mesa 4 51 2.030000 xc_newvalue .mesa 4 52 1.960000 xc_newvalue .mesa 4 53 1.960000 xc_newvalue .mesa 4 54 3.542000 xc_newvalue .mesa 4 55 3.640000 xc_newvalue .mesa 4 56 2.800000 xc_newvalue .mesa 4 57 2.450000 xc_newvalue .mesa 4 58 2.170000 xc_newvalue .mesa 4 59 2.170000 xc_newvalue .mesa 4 60 2.170000 xc_newvalue .mesa 4 61 2.170000 xc_newvalue .mesa 4 62 2.170000 xc_newvalue .mesa 4 63 2.170000 xc_newvalue .mesa 4 64 2.170000 xc_newvalue .mesa 4 65 2.170000 xc_newvalue .mesa 4 66 2.170000 xc_newvalue .mesa 4 67 2.170000 xc_newvalue .mesa 4 68 2.170000 xc_newvalue .mesa 4 69 2.170000 xc_newvalue .mesa 4 70 2.170000 xc_newvalue .mesa 4 71 2.170000 xc_newvalue .mesa 4 72 2.170000 xc_newvalue .mesa 4 73 2.030000 xc_newvalue .mesa 4 74 1.890000 xc_newvalue .mesa 4 75 1.890000 xc_newvalue .mesa 4 76 1.820000 xc_newvalue .mesa 4 77 1.890000 xc_newvalue .mesa 4 78 1.890000 xc_newvalue .mesa 4 79 1.890000 xc_newvalue .mesa 4 80 2.100000 xc_newvalue .mesa 4 81 2.660000 xc_newvalue .mesa 4 82 2.520000 xc_newvalue .mesa 4 83 2.240000 xc_newvalue .mesa 4 84 2.170000 xc_newvalue .mesa 4 85 2.170000 xc_newvalue .mesa 4 86 2.170000 xc_newvalue .mesa 4 87 3.920000 xc_newvalue .mesa 4 88 2.016000 xc_newvalue .mesa 4 89 2.730000 xc_newvalue .mesa 4 90 2.170000 xc_newvalue .mesa 4 91 2.170000 xc_newvalue .mesa 4 92 2.170000 xc_newvalue .mesa 4 93 2.170000 xc_newvalue .mesa 4 94 2.170000 xc_newvalue .mesa 4 95 2.170000 xc_newvalue .mesa 4 96 2.170000 xc_newvalue .mesa 4 97 2.170000 xc_newvalue .mesa 4 98 2.170000 xc_newvalue .mesa 4 99 2.170000 xc_newvalue .mesa 4 100 2.170000 xc_newvalue .mesa 10004 0 0.000000 xc_newvalue .mesa 10004 1 0.399000 xc_newvalue .mesa 10004 2 0.399000 xc_newvalue .mesa 10004 3 1.291500 xc_newvalue .mesa 10004 4 0.934500 xc_newvalue .mesa 10004 5 0.955500 xc_newvalue .mesa 10004 6 0.808500 xc_newvalue .mesa 10004 7 0.787500 xc_newvalue .mesa 10004 8 0.766500 xc_newvalue .mesa 10004 9 0.745500 xc_newvalue .mesa 10004 10 1.680000 xc_newvalue .mesa 10004 11 1.680000 xc_newvalue .mesa 10004 12 1.470000 xc_newvalue .mesa 10004 13 1.312500 xc_newvalue .mesa 10004 14 1.450000 xc_newvalue .mesa 10004 15 1.050000 xc_newvalue .mesa 10004 16 1.092000 xc_newvalue .mesa 10004 17 1.140000 xc_newvalue .mesa 10004 18 1.995000 xc_newvalue .mesa 10004 19 2.236500 xc_newvalue .mesa 10004 20 1.827000 xc_newvalue .mesa 10004 21 1.680000 xc_newvalue .mesa 10004 22 1.470000 xc_newvalue .mesa 10004 23 1.417500 xc_newvalue .mesa 10004 24 1.470000 xc_newvalue .mesa 10004 25 1.470000 xc_newvalue .mesa 10004 26 1.470000 xc_newvalue .mesa 10004 27 1.417500 xc_newvalue .mesa 10004 28 1.417500 xc_newvalue .mesa 10004 29 1.417500 xc_newvalue .mesa 10004 30 1.417500 xc_newvalue .mesa 10004 31 1.365000 xc_newvalue .mesa 10004 32 1.312500 xc_newvalue .mesa 10004 33 1.207500 xc_newvalue .mesa 10004 34 1.207500 xc_newvalue .mesa 10004 35 1.197000 xc_newvalue .mesa 10004 36 2.100000 xc_newvalue .mesa 10004 37 2.310000 xc_newvalue .mesa 10004 38 2.100000 xc_newvalue .mesa 10004 39 1.942500 xc_newvalue .mesa 10004 40 1.627500 xc_newvalue .mesa 10004 41 1.522500 xc_newvalue .mesa 10004 42 1.522500 xc_newvalue .mesa 10004 43 1.417500 xc_newvalue .mesa 10004 44 1.365000 xc_newvalue .mesa 10004 45 1.417500 xc_newvalue .mesa 10004 46 1.470000 xc_newvalue .mesa 10004 47 1.680000 xc_newvalue .mesa 10004 48 1.627500 xc_newvalue .mesa 10004 49 1.627500 xc_newvalue .mesa 10004 50 1.480500 xc_newvalue .mesa 10004 51 1.522500 xc_newvalue .mesa 10004 52 1.470000 xc_newvalue .mesa 10004 53 1.470000 xc_newvalue .mesa 10004 54 2.656500 xc_newvalue .mesa 10004 55 2.730000 xc_newvalue .mesa 10004 56 2.100000 xc_newvalue .mesa 10004 57 1.837500 xc_newvalue .mesa 10004 58 1.627500 xc_newvalue .mesa 10004 59 1.627500 xc_newvalue .mesa 10004 60 1.627500 xc_newvalue .mesa 10004 61 1.627500 xc_newvalue .mesa 10004 62 1.627500 xc_newvalue .mesa 10004 63 1.627500 xc_newvalue .mesa 10004 64 1.627500 xc_newvalue .mesa 10004 65 1.627500 xc_newvalue .mesa 10004 66 1.627500 xc_newvalue .mesa 10004 67 1.627500 xc_newvalue .mesa 10004 68 1.627500 xc_newvalue .mesa 10004 69 1.627500 xc_newvalue .mesa 10004 70 1.627500 xc_newvalue .mesa 10004 71 1.627500 xc_newvalue .mesa 10004 72 1.627500 xc_newvalue .mesa 10004 73 1.522500 xc_newvalue .mesa 10004 74 1.417500 xc_newvalue .mesa 10004 75 1.417500 xc_newvalue .mesa 10004 76 1.365000 xc_newvalue .mesa 10004 77 1.417500 xc_newvalue .mesa 10004 78 1.417500 xc_newvalue .mesa 10004 79 1.417500 xc_newvalue .mesa 10004 80 1.575000 xc_newvalue .mesa 10004 81 1.995000 xc_newvalue .mesa 10004 82 1.890000 xc_newvalue .mesa 10004 83 1.680000 xc_newvalue .mesa 10004 84 1.627500 xc_newvalue .mesa 10004 85 1.627500 xc_newvalue .mesa 10004 86 1.627500 xc_newvalue .mesa 10004 87 2.940000 xc_newvalue .mesa 10004 88 1.512000 xc_newvalue .mesa 10004 89 2.047500 xc_newvalue .mesa 10004 90 1.627500 xc_newvalue .mesa 10004 91 1.627500 xc_newvalue .mesa 10004 92 1.627500 xc_newvalue .mesa 10004 93 1.627500 xc_newvalue .mesa 10004 94 1.627500 xc_newvalue .mesa 10004 95 1.627500 xc_newvalue .mesa 10004 96 1.627500 xc_newvalue .mesa 10004 97 1.627500 xc_newvalue .mesa 10004 98 1.627500 xc_newvalue .mesa 10004 99 1.627500 xc_newvalue .mesa 10004 100 1.627500 # ------------------------------------------------------------------------ # END: Atomic radii # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # Various parameters # ------------------------------------------------------------------------ xc_newvalue .mesa 13 1.050000 xc_newvalue .mesa 5 1.400000 xc_newvalue .mesa 6 0.400000 xc_newvalue .mesa 7 0.600000 xc_newvalue .mesa 9 1.000000 xc_newvalue .mesa 10 1.000000 xc_newvalue .mesa 18 1.000000 xc_newvalue .mesa 10010 1.000000 xc_newvalue .mesa 10009 1.000000 xc_newvalue .mesa 11 6.000000 xc_newvalue .mesa 19 0.100000 xc_newvalue .mesa 24 15.000000 xc_newvalue .mesa 28 3.000000 xc_newvalue .mesa 29 2.500000 xc_newvalue .mesa 10029 1.000000 xc_newvalue .mesa 23 0.000000 0.000000 0.000000 1.000000 # ------------------------------------------------------------------------ # Various displays (i.e. checkbuttons of DISPLAY menu) # ------------------------------------------------------------------------ array set check {pseudoDens 0 perspective 0 labels 1 depthcuing 0 crds 0 wigner 0 antialias 0 Hbonds 0 forces 0 frames 0 unibond 0 perpective 0} CrdSist AtomLabels CrysFrames Unibond forceVectors .mesa WignerSeitz Perspective # ------------------------------------------------------------------------ # Various displays (i.e. radiobuttons DISPLAY menu) # ------------------------------------------------------------------------ array set radio {space {SpaceFill based on covalent radii} .mesa,bg #000000 cellmode conv frames rods unitrep cell hexamode parapipedal ball {Balls based on covalent radii}} xc_newvalue .mesa 2 xc_newvalue .mesa 0 # ------------------------------------------------------------------------ # load appropriate color-scheme # ------------------------------------------------------------------------ array set colSh {slab_dir -z slabrange_min 0.00 slabrange_max 1.00 scheme atomic slab_colbas monochrome dist_r 1.0 dist_coltyp combined dist_alpha 0.65 dist_x 0.0 slab_fractional 1 slab_coltyp combined dist_y 0.0 dist_z 0.0 slab_alpha 0.65 dist_colbas monochrome} ColorSchemeUpdate .mesa # ------------------------------------------------------------------------ # BEGIN: scalar field (controur or isosurface) settings # ------------------------------------------------------------------------ array set DG {envar0,0 1.0 ident,0 3D_ORBITAL_#007 cb0,0 1 r0 .dg.1.c.f0.r0 YSpace 15 yspace 5 c0,0 .dg.1.c.sf0_0.r l0,0 .dg.1.c.sf0_0.l2 n_block 1 e0,0 .dg.1.c.sf0_0.e bw 407 blockFont font16 bh 49 type,0 3D n_subblock,0 1 subident,0,0 DATAGRID_3D_G98CUBE ystart 206 radio 0} DataGridOK array set isoControl {1,current_slide 1 isoline_color monocolor datagridDim 3 3,cpl_thermoFont {} 1,cpl_thermoNTics 6 2,cpl_thermoNTics 6 3,cpl_thermoNTics 6 3,2Dnisoline 15 cpl_thermoNTics 6 3,anim_step 1 3,cpl_basis MONOCHROME 1,isoline_monocolor #ffffff 1,isoline_width 2 2,cpl_thermoFont {} 3,cpl_thermoFmt %+8.4f 2,2Dlowvalue -0.1 2,current_text_slide {Current slide: 7 / 25} 1,cpl_transparency 0 3,colorplane 0 blend_button .iso.fb1.f.right.f5.b3 3,isoline_color monocolor cbfn_apply_to_all 0 1,cpl_thermoFont {} 2,cpl_function LINEAR current_slide 1 revert_button1 .iso.fb1.f.right.f5.b12 1,2Dnisoline 15 revert_button2 .iso.fb1.f.right.f5.b10a 2Dlowvalue_entry .iso.fb2.f1.1.mf.r.f3.1.entry1 2,cpl_transparency 0 2Dnisoline_entry .iso.fb2.f1.1.mf.r.f5.1.entry1 2,isoline_monocolor #000000 1,2Dhighvalue 0.417066 cpl_basis BLUE-WHITE-RED anim_step 1 1,isoline 0 2,isoline 1 3,2Dhighvalue 0.417066 3,isoline 0 2,cpl_thermoFmt %+8.4f 2,colorplane_lighting 0 isoline_width 3 1,cpl_thermoLabel { Scale: ? n(r)} 2,cpl_thermoLabel { Scale: ? n(r)} isoline 1 3,cpl_thermoLabel { Scale: ? n(r)} colorplane_lighting 0 cpl_thermoTplw 0 1,colorplane 0 cpl_thermoLabel { Scale: ? n(r)} 3,cpl_transparency 0 2,isoline_color monocolor 2Dnisoline 11 3,current_slide 1 3,cpl_thermoTplw 0 max_allowed_2Dnisoline 100 3,2Dlowvalue -0.736872 cpl_function LINEAR anim_apply_to_all 0 1,anim_step 1 1,cpl_basis MONOCHROME 3,current_text_slide {Current slide: 1 / 33} 3,nslide 33 colorplane 1 cpl_transparency 0 3,isoline_monocolor #ffffff 3,isoline_width 2 1,cpl_function LINEAR 1,cpl_thermoFmt %+8.4f 2Disolinewidth_entry .iso.fb2.f1.1.mf.i.3.f1.1.entry1 2,cpl_thermoTplw 0 smooth_button .iso.fb1.f.right.f5.b2a 2,2Dnisoline 11 2,nslide 25 1,isoline_color monocolor disp_apply_to_all 0 plane 2 1,isoline_stipple {no stipple} 3Dinterpl_degree 1 2,isoline_stipple {no stipple} 2,current_slide 13 1,cpl_thermoTplw 0 3,isoline_stipple {no stipple} 1,2Dlowvalue -0.736872 isoline_stipple {no stipple} 2Dhighvalue_entry .iso.fb2.f1.1.mf.r.f4.1.entry1 1,current_text_slide {Current slide: 1 / 25} 1,nslide 25 2,colorplane 1 2,anim_step 1 2,cpl_basis BLUE-WHITE-RED 1,cpl_thermometer 0 2,isoline_width 3 2,cpl_thermometer 0 3,cpl_thermometer 0 2,2Dhighvalue 0.1 1,colorplane_lighting 0 bmc .iso.fb2.f1.1.mf.i.1.b color_button .iso.fb1.f.right.f5.b2 cpl_thermometer 0 isoline_monocolor #000000 isosurf 1 3,colorplane_lighting 0 3,cpl_function LINEAR 2Dhighvalue 0.1 cpl_thermoFmt %+8.4f cpl_thermoFont {} 2Dlowvalue -0.1 current_text_slide {Current slide: 13 / 25}} array set prop {datagridDim 0 type_of_run RHF pm_isolevel 1 isolevel 0.1} array set isosurf {type_of_isosurf wire 3Dinterpl_degree 1 isovalue_entry .iso.fb1.f.left.f1.f3.1.entry1 1,2Dexpand_X 1 transparency off rangevalue 1.1539379999999999 1,2Dexpand_Y 1 1,2Dexpand none res_type angstroms 3,2Dexpand_X 1 1,2Dexpand_Z 1 twoside_lighting off 3,2Dexpand_Y 1 3,2Dexpand none 3,2Dexpand_Z 1 3Dinterpl_degree_old 1 space_sel whole_cell expand_X 1 expand_Y 1 expand none expand_Z 1 minvalue -0.736872 mb_angs/bohr Angstroms old_twoside_lighting off spin {} 2,2Dexpand_X 1 maxvalue 0.417066 2,2Dexpand_Y 1 2,2Dexpand none Y_Sel centered 2,2Dexpand_Z 1 2Dexpand_X 1 shade_model smooth Z_Sel centered 2Dexpand_Y 1 2Dexpand none 2Dexpand_Z 1} UpdateIsosurf array set DataGrid {launch_command IsoControl dim 3D first_time exists} # ------------------------------------------------------------------------ # END: scalar field (controur or isosurface) settings # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # rotation matrix and zooming factor, and translation displacements # ------------------------------------------------------------------------ xc_rotationmatrix set 1.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 -1.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.000000000000000e+00 xc_translparam set 1.300000000000000e+01 -6.000000000000000e+00 1.609286470111767e+00 # this is used to force the update of display cry_toglzoom .mesa 0.0 # ------------------------------------------------------------------------ # Anti-Aliasing & Depth-Cuing & PseudoDensity (these are time consuming) # ------------------------------------------------------------------------ DepthCuing; PseudoDensity; AntiAlias # ------------------------------------------------------------------------ # reset cursor # ------------------------------------------------------------------------ set xcCursor(dont_update) 0 ResetCursor destroy $wait_window xcrysden-1.6.2/examples/Scripting/movie.tcl0000644000175000017500000001074011712736221017462 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/movie.tcl *** # # NAME # movie.tcl -- a simple example for making a MPEG movie # # USAGE # xcrysden --script movie.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a scripting example that shows how to produce an animation # of a molecular structure and concomitantly creating an MPEG movie. # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2003 # # SOURCE # ------------------------------------------------------------------------ # load the structure (the argument to scription:open is the command line # ------------------------------------------------------------------------ scripting::open --xyz $env(XCRYSDEN_TOPDIR)/examples/XYZ/mol2.xyz # ------------------------------------------------------------------------ # resize the window # ------------------------------------------------------------------------ scripting::displayWindow resize 400 400 # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ #----- # this is for Lighting-On modes: #----- scripting::lighting On # choose a 3D-display mode #scripting::displayMode3D Stick #scripting::displayMode3D Pipe&Ball scripting::displayMode3D BallStick #scripting::displayMode3D SpaceFill #---- # #--- # # this is for Lighting-Off modes: # #--- # scripting::lighting Off # # # choose a 2D-display mode # # #scripting::displayMode2D WireFrame # #scripting::displayMode2D PointLine # #scripting::displayMode2D Pipe&Ball # #scripting::displayMode2D BallStick-1 # scripting::displayMode2D BallStick-2 # #scripting::displayMode2D SpaceFill # #--- # ------------------------------------------------------------------------ # perform initial preparation for movie # ------------------------------------------------------------------------ # # ::scripting::makeMovie::init -- # # # Description of options: # # ------------------------------------------------------------------------ # OPTION ALLOWED-VALUES + DESCRIPTION # ------------------------------------------------------------------------ # -gif_transp 0|1 --> make oblique|transparent animated-GIF # # -gif_minimize 0|1 --> don't-minimize|minimize animateg-GIF # # -gif_global_colormap 0|1 --> don't-use|use global colormap for animated-GIF # # -movieformat gif|mpeg --> create Animated-GIF|MPEG # # -dir tmp|pwd --> put temporary (i.e. frame) files to # scratch(tmp) or current working # directory(pwd) # # -frameformat PPM|PNG|JPEG --> format of the frame-files # # -firstframe positive-integer --> repeat first frame n-times # # -lastframe positive-integer --> repeat first frame n-times # # -delay positive-integer --> time dalay between frames # in 1/100 sec # -save_to_file file --> if specified the movie will be saved to file # otherwise the filename will be queried # scripting::makeMovie::init \ -movieformat mpeg \ -dir tmp \ -frameformat PPM \ -firstframe 10 \ -lastframe 10 \ -delay 0 scripting::makeMovie::begin # ------------------------------------------------------------------------ # first zoom the structure slowly # ------------------------------------------------------------------------ repeat 10 { scripting::makeMovie::makeFrame scripting::zoom +0.03 } # ------------------------------------------------------------------------ # rotate a few times # # usage: # scripting::rotate x|y|z step_size number_of_times # or # scripting::rotate xy|xz|yz step_size1 step_size2 number_of_times # # ------------------------------------------------------------------------ repeat 20 { scripting::makeMovie::makeFrame scripting::rotate x +3 } repeat 20 { scripting::makeMovie::makeFrame scripting::rotate y +3 } repeat 20 { scripting::makeMovie::makeFrame scripting::rotate z -3 } # ------------------------------------------------------------------------ # now finish the movie and save # ------------------------------------------------------------------------ scripting::makeMovie::end #**** # ------------------------------------------------------------------------ xcrysden-1.6.2/examples/Scripting/isosurface+colorplane+print.tcl0000644000175000017500000002611112161025154023762 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/isosurface+colorplane+print.tcl *** # # NAME # isosurface+colorplane+print.tcl -- plots and prints isosurface and contours # # USAGE # xcrysden --script isosurface+colorplane+print.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a scripting example that shows how to render the isosurface # and contour plots simultaneously by loading the XSF file which # contains the description of the 3D scalar field. Then the # isosurface+contours plot is printed to a file. # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2003 # # SOURCE # ------------------------------------------------------------------------ # load the structure (the argument to scription:open is the command line # ------------------------------------------------------------------------ scripting::open --xsf $env(XCRYSDEN_TOPDIR)/examples/XSF_Files/CO_homo.xsf.gz # ------------------------------------------------------------------------ # display the structure in appropriate display-mode (must be Lighting-On) # ------------------------------------------------------------------------ #----- # this is for Lighting-On modes: #----- scripting::lighting On # choose a 3D-display mode #scripting::displayMode3D Stick scripting::displayMode3D Pipe&Ball #scripting::displayMode3D BallStick #scripting::displayMode3D SpaceFill #---- # ------------------------------------------------------------------------ # load the 3D scalar field # ------------------------------------------------------------------------ scripting::scalarField3D::load # ------------------------------------------------------------------------ # hide the isosourface control window # ------------------------------------------------------------------------ #IsoControl_Hide # alternatively you could do wm withdraw .iso # # description of scripting::scalarField3D::configure options: # # ------------------------------------------------------------------------ # OPTION:: ALLOWED-VALUES + Description STATUS # ------------------------------------------------------------------------ # -isosurface 0|1 REQUIRED # 0 = do not render isosurface # 1 = render isosurface # # -interpolation_degree integer OPTIONAL # degree of scalar-field interpolation # # -isolevel real REQUIRED # the isovalue of isosurface # # -plusminus 0|1 # 0 = display only the isosurface of isovalue # specified by -isolevel # 1 = display the two isosurfaces of +-isovalue # # -revertsides pos|neg|{pos neg} # pos = revert the front- and back-side of isovalue # isosurface # neg = revert the front- and back-side of -isovalue # isosurface # -revertnormals pos|neg|{pos neg} # pos = revert the normals of isovalue isosurface # neg = revert the normals of -isovalue isosurface # # -expand none|whole|specify # none = do not expand the isosurface along the # periodic directions # whole = expand the isosurface over the # whole structure along the periodic # directions # specify = expand the isosurface along the # periodic directions as specified by # -expand_X, -expand_Y, and -expand_Z # factors # # -expand_X positive-integer # expand isosurface n-times along the 1st # periodic dimension # # # -expand_Y positive-integer # expand isosurface n-times along the 2nd # periodic dimension # # -expand_Z positive-integer # expand isosurface n-times along the 3rd # periodic dimension # # -basalplane 0|1|2 # show the ith basal plane (0=xy, 1=xz, 2=yz) # as colorplane and/or isolines (as specified by # -colorplane and -isoline options) # # -colorbasis MONOCHROME|RAINBOW|RGB|GEOGRAPHIC|BLUE-WHITE-RED # the color basis for the colorplane # # -scalefunction LINEAR|LOG10|SQRT|3th-ROOT|EXP(x)|EXP(x^2) # the scalefunctions for contour/colorplane plots # # -expand2D none|whole|specify # none = do not expand the contour/colorplane plots # along the periodic directions # whole = expand the contour/colorplane plots # over the whole structure along the # periodic directions # specify = expand the contour/colorplane plots # along the periodic directions as specified # by -expand2D_X, -expand2D_Y, and # -expand2D_Z factors # # -expand2D_X positive-integer # expand contour/colorplane n-times along the 1st # periodic dimension # # # -expand2D_Y positive-integer # expand contour/colorplane n-times along the 2nd # periodic dimension # # -expand2D_Z positive-integer # expand contour/colorplane n-times along the 3rd # periodic dimension # # -colorplane 0|1 # do not display|display the colorplane # # -isoline 0|1 # do not display|display the isolines # # -colorplane_lighting 0|1 # 0 = do not perform lighting for colorplane # 1 = perform lighting for colorplane # # -cpl_transparency 0|1 # 0 = render colorplane as non-transparent # 1 = render colorplane as transparent # # -cpl_thermometer 0|1 # 0 = do not make a legend (i.e. thermometer) for # colorplane colors # 1 = make a legend (i.e. thermometer) for # colorplane colors # # -2Dlowvalue real # minimum rendered value of colorplane/isolines # # -2Dhighvalue real # maximum rendered value of colorplane/isolines # # -2Dnisoline positive-integer # number of isoline # # -anim_step positive-integer # animation step # # -current_slide positive-integer # iD (i.e. sequential number) of colorplane # # -isoline_color monocolor|{property color} # monocolor = all isolines have the same color # {property color} = isolines are colorer according # to color-basis # # -isoline_width positive-integer # width (i.e. thickness) of isolines # # -isoline_monocolor #rgb # color of the monolor-type isolines # # ------------------------------------------------------------------------ # # # Example: # # scripting::scalarField3D::configure \ # -isosurface 1 \ # -interpolation_degree 2 \ # -isolevel 0.1 \ # -plusminus 1 \ # -revertsides {pos neg} \ # -revertnormal {pos neg} \ # -expand specify \ # -expand_X 1 \ # -expand_Y 1 \ # -expand_Z 1 \ # -basalplane 0 \ # -colorbasis BLUE-WHITE-RED \ # -scalefunction LINEAR \ # -expand2D specify \ # -expand2D_X 1 \ # -expand2D_Y 1 \ # -expand2D_Z 1 \ # -colorplane 1 \ # -isoline 1 \ # -colorplane_lighting 0 \ # -cpl_transparency 0 \ # -cpl_thermometer 1 \ # -2Dlowvalue -0.1 \ # -2Dhighvalue +0.1 \ # -2Dnisoline 11 \ # -anim_step 1 \ # -current_slide 30 \ # -isoline_color monocolor \ # -isoline_width 3 \ # -isoline_monocolor \#000000 # # ------------------------------------------------------------------------ # configure, i.e., specify how to render the scalar field # ------------------------------------------------------------------------ scripting::scalarField3D::configure \ -isosurface 1 \ -interpolation_degree 2 \ -isolevel 0.1 \ -plusminus 1 \ -basalplane 2 \ -colorbasis BLUE-WHITE-RED \ -scalefunction LINEAR \ -expand2D specify \ -expand2D_X 1 \ -expand2D_Y 1 \ -expand2D_Z 1 \ -colorplane 1 \ -isoline 1 \ -colorplane_lighting 0 \ -cpl_transparency 0 \ -cpl_thermometer 1 \ -2Dlowvalue -0.1 \ -2Dhighvalue +0.1 \ -2Dnisoline 11 \ -anim_step 1 \ -current_slide 25 \ -isoline_color monocolor \ -isoline_width 3 \ -isoline_monocolor \#000000 # ------------------------------------------------------------------------ # render the 3D scalar field as requested by # scripting::scalarField3D::configure # ------------------------------------------------------------------------ scripting::scalarField3D::render # ------------------------------------------------------------------------ # zoom and rotate the structure # ------------------------------------------------------------------------ scripting::zoom -0.5 scripting::rotate x -90 # ------------------------------------------------------------------------ # now lets print to file what we have on the display window # ------------------------------------------------------------------------ # this will query the filename: scripting::printToFile; # here the colorplane legend is NOT printed # # while this will print directly to print.png: # scripting::printToFile print.png windowdump; # here the colorplane legend is printed #**** # ------------------------------------------------------------------------ xcrysden-1.6.2/examples/Scripting/plot_all_MO.sh0000755000175000017500000000303113525545440020377 0ustar tonetone#!/bin/sh # ------------------------------------------------------------------------ #****** ScriptingExamples/plot_all_MO.sh *** # NAME # plot_all_MO.sh --- plots all molecular orbitals (MO) in alike manner # # USAGE # ./plot_all_MO.sh # # WARNING # do not execute this script as: xcrysden -s plot_all_MO.sh # (this will not work) # # PURPOSE # This shell scripts shows how one can plot several (or all) molecular # orbitals of a given molecule in an automatic fashion, where the # display parameters for all MOs are the same. # # To construct the script as this one the following steps have to be # done: # 1.) the 1st MO has to be displayed in xcrysden in usual way, and # when the display is properly set, then save it as: # File->Save State and Structure. # # 2.) encapsulate such saved file in s simple shell-script as this one # # # 3.) replace the STRUCTURE-PART of the saved file, and request # therein to load a given file instead (see below) # # # 4.) replace all $ characters with \$ in the saved script except for # the $ character for the $file variable # # 5.) at the end of the saved file add: scripting::printToFile; exit # # 6.) exucute the shell-script # # # AUTHOR # Anton Kokalj # # CREATION DATE # Fri May 13 11:07:01 CEST 2005 # # SOURCE # this is the Bourne-chell script for file in CO_homo.xsf.gz CO_lumo.xsf.gz do xcrysden --xsf $file --script MO-state.xcrysden --print ${file%.xsf.fz}.png done #**** # ------------------------------------------------------------------------ xcrysden-1.6.2/examples/Scripting/contours.tcl0000644000175000017500000001745712161025154020226 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/contours.tcl *** # # NAME # contours.tcl -- plots contours+colorplane from XSF # # USAGE # xcrysden --script contours.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a scripting example that shows how to produce colorplane and # isoline plot by loading the XSF file which contains the description # of the 2D scalar field. # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2003 # # SOURCE # ------------------------------------------------------------------------ # load the structure (the argument to scription:open is the command line # ------------------------------------------------------------------------ scripting::open --xsf $env(XCRYSDEN_TOPDIR)/examples/XSF_Files/mol-urea2D.xsf # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ #----- # uncomment this is for Lighting-On modes: #----- scripting::lighting On # choose a 3D-display mode #scripting::displayMode3D Stick scripting::displayMode3D Pipe&Ball #scripting::displayMode3D BallStick #scripting::displayMode3D SpaceFill #---- # ------------------------------------------------------------------------ # zoom and rotate the structure # ------------------------------------------------------------------------ scripting::zoom +0.1 scripting::rotate x -90 scripting::rotate y -90 # ------------------------------------------------------------------------ # load the 3D scalar field # ------------------------------------------------------------------------ scripting::scalarField2D::load # # description of scripting::scalarField2D::configure options: # # ------------------------------------------------------------------------ # OPTION:: ALLOWED-VALUES + Description STATUS # ------------------------------------------------------------------------ # -interpolation_degree integer OPTIONAL # degree of scalar-field interpolation # # -colorbasis MONOCHROME|RAINBOW|RGB|GEOGRAPHIC|BLUE-WHITE-RED # the color basis for the colorplane # # -scalefunction LINEAR|LOG10|SQRT|3th-ROOT|EXP(x)|EXP(x^2) # the scalefunctions for contour/colorplane plots # # -expand2D none|whole|specify # none = do not expand the contour/colorplane plots # along the periodic directions # whole = expand the contour/colorplane plots # over the whole structure along the # periodic directions # specify = expand the contour/colorplane plots # along the periodic directions as specified # by -expand2D_X, -expand2D_Y, and # -expand2D_Z factors # # -expand2D_X positive-integer # expand contour/colorplane n-times along the 1st # periodic dimension # # # -expand2D_Y positive-integer # expand contour/colorplane n-times along the 2nd # periodic dimension # # -expand2D_Z positive-integer # expand contour/colorplane n-times along the 3rd # periodic dimension # # -colorplane 0|1 # do not display|display the colorplane # # -isoline 0|1 # do not display|display the isolines # # -colorplane_lighting 0|1 # 0 = do not perform lighting for colorplane # 1 = perform lighting for colorplane # # -cpl_transparency 0|1 # 0 = render colorplane as non-transparent # 1 = render colorplane as transparent # # -cpl_thermometer 0|1 # 0 = do not make a legend (i.e. thermometer) for # colorplane colors # 1 = make a legend (i.e. thermometer) for # colorplane colors # # -2Dlowvalue real # minimum rendered value of colorplane/isolines # # -2Dhighvalue real # maximum rendered value of colorplane/isolines # # -2Dnisoline positive-integer # number of isoline # # -isoline_color monocolor|{property color} # monocolor = all isolines have the same color # {property color} = isolines are colorer according # to color-basis # # -isoline_width positive-integer # width (i.e. thickness) of isolines # # -isoline_monocolor #rgb # color of the monolor-type isolines # # ------------------------------------------------------------------------ # # # Example: # # scripting::scalarField2D::configure \ # -interpolation_degree 2 \ # -colorbasis RAINBOW \ # -scalefunction LOG10 \ # -expand2D specify \ # -expand2D_X 1 \ # -expand2D_Y 1 \ # -expand2D_Z 1 \ # -colorplane 1 \ # -isoline 1 \ # -colorplane_lighting 0 \ # -cpl_transparency 0 \ # -cpl_thermometer 1 \ # -2Dlowvalue +0.00001 \ # -2Dhighvalue +0.1 \ # -2Dnisoline 5 \ # -isoline_color monocolor \ # -isoline_width 3 \ # -isoline_monocolor \#ffffff # # ------------------------------------------------------------------------ # configure, i.e., specify how to render the scalar field # ------------------------------------------------------------------------ scripting::scalarField2D::configure \ -interpolation_degree 3 \ -colorbasis BLUE-WHITE-RED \ -scalefunction LINEAR \ -colorplane 1 \ -isoline 1 \ -colorplane_lighting 0 \ -cpl_transparency 0 \ -cpl_thermometer 1 \ -2Dlowvalue -0.1 \ -2Dhighvalue +0.1 \ -2Dnisoline 11 \ -isoline_color monocolor \ -isoline_width 3 \ -isoline_monocolor \#000000 # ------------------------------------------------------------------------ # hide the propertyplane control window # ------------------------------------------------------------------------ IsoControl_Hide .iso2D # alternatively you could do #wm withdraw .iso2D # ------------------------------------------------------------------------ # render the 2D scalar field as requested by # scripting::scalarField2D::configure # ------------------------------------------------------------------------ scripting::scalarField2D::render # ------------------------------------------------------------------------ # now lets print to file what we have on the display window # ------------------------------------------------------------------------ # this will query the filename: scripting::printToFile; # here the colorplane legend is NOT printed # # while this will print directly to print.png: # scripting::printToFile print.png; # here the colorplane legend is printed # # while this will print directly to print.png: # scripting::printToFile print.png windowdump; # here the colorplane legend is printed #**** # ------------------------------------------------------------------------ xcrysden-1.6.2/examples/Scripting/atomic_labels.tcl0000644000175000017500000001405711712736221021146 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/atomic_labels.tcl *** # # NAME # atomic_labels.tcl -- shows how to edit atomic labels # # USAGE # xcrysden --script atomic_labels.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a scripting example that shows how to edit atomic labels # using the scripting::atomicLabels namespace interface. There are two # levels of atomic-labels, so-called, global and custom (see # scripting::atomicLabels for explanation of the two items), and in # this example we will edit both of them. # # AUTHOR # Anton Kokalj # # CREATION DATE # Fri Mar 7 17:12:59 CET 2003 # # SOURCE # ------------------------------------------------------------------------ # load the structure (the argument to scription:open is the command line # ------------------------------------------------------------------------ scripting::open --wien_struct $env(XCRYSDEN_TOPDIR)/examples/WIEN_struct_files/fe2p.struct # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ #----- # uncomment this is for Lighting-On modes: #----- scripting::lighting On # choose a 3D-display mode #scripting::displayMode3D Stick #scripting::displayMode3D Pipe&Ball scripting::displayMode3D BallStick #scripting::displayMode3D SpaceFill #---- # #--- # # this is for Lighting-Off modes: # #--- # scripting::lighting Off # # # choose a 2D-display mode # # #scripting::displayMode2D WireFrame # #scripting::displayMode2D PointLine # #scripting::displayMode2D Pipe&Ball # #scripting::displayMode2D BallStick-1 # scripting::displayMode2D BallStick-2 # #scripting::displayMode2D SpaceFill # #--- # ------------------------------------------------------------------------ # display atomic-labels, crystal-cells, unicolor-bonds, perspective # ------------------------------------------------------------------------ foreach item { atomic-labels crystal-cells unicolor-bonds perspective } { scripting::display on $item } # ------------------------------------------------------------------------ # rotate and zoom the structure # ------------------------------------------------------------------------ scripting::zoom +0.60 scripting::rotate x +60 scripting::rotate y +20 scripting::rotate z +10 # ------------------------------------------------------------------------ # scripting::atomicLabels::global -- # # let us change the global font. Create a new font by "font create ..." # Tk mechanism and then load it by scripting::atomLabels::global function # ------------------------------------------------------------------------ set global_font [font create -family Times -size 30 -weight bold] scripting::atomicLabels::global -tkfont $global_font -brightcolor \#ffff55 wait 500 # ------------------------------------------------------------------------ # scripting::atomicLabels::atomID -- # # lets make few CUSTOM-ATOMIC-LABELS. Custom atomic label are those one # that were edited explicitly by scripting::atomicLabels::atomID or # scripting::atomicLabels::atomType commands (unless cleared by # scripting::atomicLabels::clear). # ------------------------------------------------------------------------ scripting::atomicLabels::atomID 21 -label "Fe(0th)" -brightcolor \#aaffaa wait 500 scripting::atomicLabels::atomID 4 -label "Fe(1st)" -brightcolor \#aaffaa wait 500 scripting::atomicLabels::atomID 5 -label "Fe(2nd)" -brightcolor \#aaffaa wait 500 scripting::atomicLabels::atomID 17 -label "Fe(3rd)" -brightcolor \#aaffaa wait 500 scripting::atomicLabels::atomID 11 -label "Fe(4th)" -brightcolor \#aaffaa wait 500 # ------------------------------------------------------------------------ # scripting::atomicLabels::atomType -- # # lets change the labels for all P-atoms # ------------------------------------------------------------------------ set type_font [font create -family Helvetica -size 17 -weight bold] scripting::atomicLabels::atomType P -label "Phosphorus" \ -tkfont $type_font -brightcolor \#ffffff wait 500 # ------------------------------------------------------------------------ # scripting::atomicLabels::clear -- # # lets clear some custom labels, hence they will become global # ------------------------------------------------------------------------ scripting::atomicLabels::clear atomID 21 wait 500 scripting::atomicLabels::clear atomType P wait 500 scripting::atomicLabels::clear all wait 500 # ------------------------------------------------------------------------ # lets make phosphorus labels again custom ones; change label to # P(yellow) # ------------------------------------------------------------------------ scripting::atomicLabels::atomType P -label "P(yellow)" \ -tkfont $type_font -brightcolor \#ffffff # ------------------------------------------------------------------------ # scripting::atomicLabels::render -- # # lets toggle the display of some labels # ------------------------------------------------------------------------ repeat 10 { scripting::atomicLabels::render global off wait 500 scripting::atomicLabels::render global on wait 500 scripting::atomicLabels::render custom off wait 500 scripting::atomicLabels::render custom on wait 500 scripting::atomicLabels::render atomType Fe off wait 500 scripting::atomicLabels::render atomType Fe on wait 500 scripting::atomicLabels::render atomID 4 off wait 500 scripting::atomicLabels::render atomID 4 on wait 500 scripting::atomicLabels::render atomID 5 off wait 500 scripting::atomicLabels::render atomID 5 on wait 500 scripting::atomicLabels::render atomID 17 off wait 500 scripting::atomicLabels::render atomID 17 on wait 500 scripting::atomicLabels::render atomID 11 off wait 500 scripting::atomicLabels::render atomID 11 on wait 500 } # ------------------------------------------------------------------------ #**** # ------------------------------------------------------------------------ xcrysden-1.6.2/examples/Scripting/animation.tcl0000644000175000017500000000655311712736221020331 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/animation.tcl *** # # NAME # animation.tcl -- a simple example for animating a molecular structure # # USAGE # xcrysden --script animation.tcl # # COPYRIGHT # Anton Kokalj (C) 2003 # # PURPOSE # This is a scripting example that shows how to produce an animation # of a molecular structure. In this example the structure is rotated # infinitely in different directions (see the scripting:rotate below). # # WARNINGS # In this example XCRYSDEN switches to fullscreen mode. To exit from # fullscreen mode double-click the first mouse button. Note also that # in fullscreen mode the right-mouse button triggers the pop-up menu # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2003 # # SOURCE # ------------------------------------------------------------------------ # load the structure (the argument to scription:open is the command line # ------------------------------------------------------------------------ scripting::open --xyz $env(XCRYSDEN_TOPDIR)/examples/XYZ/mol1.xyz # ------------------------------------------------------------------------ # switch to fullscreen mode # ------------------------------------------------------------------------ scripting::displayWindow fullscreen # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ #----- # uncomment this is for Lighting-On modes: #----- # scripting::lighting On # # # choose a 3D-display mode # # #scripting::displayMode3D Stick # #scripting::displayMode3D Pipe&Ball # scripting::displayMode3D BallStick # #scripting::displayMode3D SpaceFill #---- # #--- # # this is for Lighting-Off modes: # #--- # scripting::lighting Off # # # choose a 2D-display mode # # #scripting::displayMode2D WireFrame # #scripting::displayMode2D PointLine # #scripting::displayMode2D Pipe&Ball # #scripting::displayMode2D BallStick-1 # scripting::displayMode2D BallStick-2 # #scripting::displayMode2D SpaceFill # #--- # ------------------------------------------------------------------------ # first zoom the structure slowly # ------------------------------------------------------------------------ scripting::zoom +0.02 5 # ------------------------------------------------------------------------ # rotate a few times # # usage: # scripting::rotate x|y|z step_size number_of_times # or # scripting::rotate xy|xz|yz step_size1 step_size2 number_of_times # # ------------------------------------------------------------------------ scripting::rotate x +3 20 scripting::rotate y +3 20 scripting::rotate z -3 10 # ------------------------------------------------------------------------ # rotate infinitely # ------------------------------------------------------------------------ while {1} { scripting::rotate xy +5 +1 3 scripting::rotate xy +5 +3 5 scripting::rotate xy +5 +5 20 scripting::rotate xy +5 +3 5 scripting::rotate xy +5 +1 3 scripting::rotate xy +5 +0 1 scripting::rotate xz +5 +1 3 scripting::rotate xz +5 +3 5 scripting::rotate xz +5 +5 20 scripting::rotate xz +5 +3 5 scripting::rotate xz +5 +1 3 scripting::rotate xz +5 +0 1 } #**** # ------------------------------------------------------------------------ xcrysden-1.6.2/make-usage0000644000175000017500000000530713522507025014023 0ustar tonetonepager=${pager:-more} $pager < 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. xcrysden-1.6.2/scripts/0000755000175000017500000000000013556022211013537 5ustar tonetonexcrysden-1.6.2/scripts/pwi2xsf.sh0000755000175000017500000001652013526643612015517 0ustar tonetone#!/bin/sh ############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/pwi2xsf.sh # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # set locales to C LANG=C LC_ALL=C export LANG LC_ALL # # pwi2xsf.sh: PW-input to XSF converison # # Usage: pwi2xsf [-r] pw-input-file # # Written by Tone Kokalj on Tue May 8 20:43:44 2001 # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ if [ "$#" -lt 1 ]; then echo " Usage: pwi2xsf.sh [-r] pw-input Option for PWscf version < 1.2: -r ... for pw.x < 1.2 one must spefify the ityp->nat conversion, and the corresponding data are writen to file nuclei.charges. The -r flag deletes this file as to force new ityp->nat specification. " exit 1 fi r=0 if [ "$1" = "-r" ]; then r=1 shift fi ####################################### if test "x`which tee`" = "x"; then # no tee cmd; make a function-substitute tee() { cat - > $1 cat $1 } fi if test "x`which readlink`" = "x"; then # no readlink cmd; make a function-substitute readlink_f() { file=`ls -l "$1" | awk '{print $NF}'` while test -h "$file"; do file=`ls -l "$file" | awk '{print $NF}'` done echo $file } else readlink_f() { readlink -f "$1" } fi pathname() { file=`which "$1"` if test $? -gt 0; then file=`type "$1"` if test $? -gt 0; then # give-up file="$1" else file=`echo $file | awk 'BEGIN {FS="is "} {print $NF}'` fi fi echo $file } pathdir() { file=`pathname "$1"` while test -h "$file"; do file=`readlink_f "$file"` done dir=`dirname "$file"` ( cd $dir; pwd ) } if test -z $XCRYSDEN_TOPDIR; then # XCRYSDEN_TOPDIR does not exists, guess it from the process script_dir=`pathdir $0` export XCRYSDEN_TOPDIR=`(cd $script_dir/..; pwd)` fi if test -f $XCRYSDEN_TOPDIR/scripts/pwLib_old.sh ; then . $XCRYSDEN_TOPDIR/scripts/pwLib_old.sh load_old_lib=1 else load_old_lib=0 fi ####################################### # ------------------------------------------------------------------------ # Function: pwi2xsf_via_pwo # # Purpose: for "ATOMIC_POSITIONS crystal_sg", get the coordinates from # pw.x output by making a dry pw.x run # ------------------------------------------------------------------------ pwi2xsf_via_pwo() { PWO_XSF2XSF=pwo_xsf2xsf if test -f $XCRYSDEN_TOPDIR/bin/pwo_xsf2xsf ; then PWO_XSF2XSF=$XCRYSDEN_TOPDIR/bin/pwo_xsf2xsf elif test -f $XCRYSDEN_LIB_BINDIR/pwo_xsf2xsf ; then PWO_XSF2XSF=$XCRYSDEN_LIB_BINDIR/pwo_xsf2xsf fi cat $1 | awk 'BEGIN {RS="[,\n]"; elec_nml=0; elec_print=0; } toupper($0) ~ /&ELECTRONS/ { elec_nml = 1; } toupper($0) ~ /&END|^\/|^ +\// { if (elec_nml && !elec_print) { print " electron_maxstep = 0"; elec_nml = 0; } } /=/ { if ( toupper($1) ~ /PREFIX/ ) { # skip prefix, because we will make pwscf.EXIT stop file next; } if ( toupper($1) ~ /ELECTRON_MAXSTEP/ ) { print " electron_maxstep = 0"; elec_print = 1; next; } } /a*/ { print $0; }' > pwi.$$ # do we have pw.x ? file=`which pw.x` if test $? -gt 0; then file=`type pw.x` if test $? -gt 0; then # give-up echo "pw.x does not exist; cannot parse pw.x input with \"ATOMIC_POSITIONS crystal_sg\"" rm -f pwi.$$ exit 1 fi fi touch pwscf.EXIT pw.x < pwi.$$ > pwo.$$ 2> /dev/null $XCRYSDEN_TOPDIR/scripts/pwo2xsf.sh -ic pwo.$$ | tee pwi2xsf.xsf_out rm -f pwi.$$ pwo.$$ exit 0 } # # check if we have OLD or NEW PW.X input format # new_format1=`grep 'ATOMIC_POSITIONS' $1` new_format2=`grep -i '&system' $1` if [ "$new_format1" != "" -a "$new_format2" != "" ]; then # # we have NEW PW.X input format # # check if ATOMIC_POSITIONS are specified in crystal_sg units sg=`cat $1 | grep ATOMIC_POSITIONS | grep -i crystal_sg` if test "x$sg" != "x"; then # coordinates are specified in crystal_sg units pwi2xsf_via_pwo $1 else # cat $1 | awk 'BEGIN {RS="[,\n]";} {print $0}' | awk ' BEGIN { calculation=""; num_of_images=""; nml_end=0; nml_end_string=""; new_neb=0; } toupper($0) ~ /BEGIN_ENGINE_INPUT/ { new_neb=1; } $1 ~ /^BEGIN$|^END$|^BEGIN_PATH_INPUT$|^END_PATH_INPUT$|^BEGIN_ENGINE_INPUT$|^END_ENGINE_INPUT$|^BEGIN_POSITIONS$|^END_POSITIONS$/ { next; } toupper($0) ~ /&SYSTEM/ { print; } /=/ { if ( toupper($1) ~ /^IBRAV($|=)|^CELLDM\([1-6]\)($|=)|^NAT($|=)|^A($|=)|^B($|=)|^C($|=)|^COSAB($|=)|^COSAC($|=)|^COSBC($|=)/ ) { print; } if ( toupper($1) ~ /^CALCULATION($|=)/ ) { calculation=toupper($0); } if ( toupper($1) ~ /^NUM_OF_IMAGES($|=)/ ) { num_of_images=toupper($0); } } $1 ~ /^INTERMEDIATE_IMAGE$|^LAST_IMAGE$/ { print; next; } $1 ~ /^FIRST_IMAGE$|^ATOMIC_POSITIONS$|^CELL_PARAMETERS$/ { if ( !nml_end) { # first finish the &SYSTEM namelist nml_end=1; if (new_neb) { print " calculation = \"PATH\""; } else if (calculation != "") { print calculation; } if (num_of_images != "") print num_of_images; print nml_end_string; } # now print the current record print_line=1; print toupper($0); next; } # old neb stuff: NF == 1 && /first_image|intermediate_image|last_image/ { print toupper($1); next; } toupper($0) ~ /&END|^\/|^ +\// { nml_end_string=$0; } /a*/ { if ( print_line == 1 ) { print $0; } }'> pw.$$ PWI2XSF=pwi2xsf fi else # # we have OLD PW.X input format # if test $load_old_lib = 0; then echo " ERROR: cannot convert to XSF, because loading of pwLib_old.sh failed " exit 1 fi pwNucleiCharges $1 /dev/null cat $1 | awk 'BEGIN {RS="[,\n]";} {print}' | awk ' BEGIN { end=0; } toupper($0) ~ /&INPUT|CELLDM|NAT|LTAUCRY/ { print; } toupper($0) ~ /IBRAV/ { print; split($0,a,"="); split(a[1],b,","); ibrav = b[1]; } toupper($0) ~ /&END|^\/|^ \// { end=1; } /a*/ { if ( end == 1 ) print; }' > pw.$$ PWI2XSF=pwi2xsf_old fi # # execute $PWI2XSF fortran program and print the XSF file # if test -f $XCRYSDEN_TOPDIR/bin/$PWI2XSF ; then $XCRYSDEN_TOPDIR/bin/$PWI2XSF < pw.$$ | tee pwi2xsf.xsf_out elif test -f $XCRYSDEN_LIB_BINDIR/$PWI2XSF ; then $XCRYSDEN_LIB_BINDIR/$PWI2XSF < pw.$$ | tee pwi2xsf.xsf_out else $PWI2XSF < pw.$$ | tee pwi2xsf.xsf_out fi #rm -f pw.$$ if [ "$r" -eq 1 ]; then if [ -f nuclei.charges ]; then rm nuclei.charges; fi fi for file in pw.$$ do if test -f $file; then rm -f $file; fi done exit 0 xcrysden-1.6.2/scripts/gzmat2xsf.sh0000755000175000017500000000417513515621207016037 0ustar tonetone#!/bin/sh ############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/gzmat2xsf.sh # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # set locales to C LANG=C LC_ALL=C export LANG LC_ALL BABEL=${BABEL:-babel} # ------------------------------------------------------------------------ # this is an experimental Gaussian Z-Matrix To XSF converter. Use at # your own risk. # # REQUIRES babel !!! # # # Usage: gzmat2xsf.sh G98-gzmat-input > XSF-file # or # gzmat2xsf.sh < G98-gzmat-input > XSF-file # # ------------------------------------------------------------------------ if [ $# -eq 0 ]; then input=- elif [ $# -eq 1 ]; then input=$1 else echo " Usage: gzmat2xsf.sh G98-gzmat-input > XSF-file or gzmat2xsf.sh < G98-gzmat-input > XSF-file " exit 1 fi cat $input | awk ' /^#/ { comdeck=1; } /\*\*\*\*/ { if (after_comment) { exit 0; } } /a*/ { print; if ( comdeck==1 && $1 !~ /^#/ ) { after_comment=1; getline; print; getline; print; # this is comment line comdeck=0; } }' > gzmat.$$ $BABEL -i gzmat gzmat.$$ -o xyz xyz.$$ > /dev/null 2>&1 if test -s xyz.$$; then status=0 awk ' BEGIN {getline; getline; print "ATOMS";} { if (toupper($1) != "X") print; }' xyz.$$ else status=1 fi rm -f gzmat.$$ xyz.$$ exit $status xcrysden-1.6.2/scripts/dummy.sh0000755000175000017500000000205611716211455015242 0ustar tonetone#!/bin/sh ############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/dummy.sh # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # do nothing, just return OK status (sometimes this is very useful) # exit 0 xcrysden-1.6.2/scripts/xcConfigure.sh0000755000175000017500000000310513525505352016361 0ustar tonetone#!/bin/sh InstallError () { echo " ************************************************* An ERROR occured during configuration of XCrySDen Code: $1 Exit 1 " exit 1 } # # Usage: xcConfigure [topdir] # if test "$#" -lt 1 ; then if test "$0" = "./xcConfigure.sh"; then XCRYSDEN_TOPDIR=`cd ..; pwd` export XCRYSDEN_TOPDIR elif test "$0" = "./scripts/xcConfigure.sh"; then XCRYSDEN_TOPDIR=`pwd` export XCRYSDEN_TOPDIR else echo " Please goto XCrySDen toplevel (root) directory and execute the xcConfigure.sh as \"./scripts/xcConfigure.sh\" or from any other place as \"xcConfigure.sh topdir\" " exit 1 fi else if test \( -d "$1" \) -a \( -x $1/xcrysden\); then XCRYSDEN_TOPDIR=$1 export XCRYSDEN_TOPDIR else InstallError "XCRYSDEN_TOPDIR $1 does not exists" fi fi # check if XCRYSDEN_TOPDIR exists: xcv=`env | grep XCRYSDEN_TOPDIR` cd $XCRYSDEN_TOPDIR # # assuming user shell is csh or tcsh or sh # if test "`echo -n a`" = "-n a" ; then ECHO_n=echo else ECHO_n="echo -n" fi if [ \( -d /tmp \) -a \( -w /tmp \) ]; then tempdir=/tmp else # set tempdir to $HOME tempdir=$HOME fi CLEAR=$XCRYSDEN_TOPDIR/scripts/dummy.sh MORE="cat -" which clear > $tempdir/install.$$ 2>&1 if test "$?" -eq 0 ; then CLEAR=clear; fi which more > $tempdir/install.$$ 2>&1 if test "$?" -eq 0 ; then MORE=more; fi rm -f $tempdir/install.$$ date=`date` export XCRYSDEN_TOPDIR . $XCRYSDEN_TOPDIR/scripts/xcConfigure_updateProfile.sh . $XCRYSDEN_TOPDIR/scripts/xcConfigure_definitions.sh rm -f $tempdir/xcInstall-sh.$$ $tempdir/xcInstall-csh.$$; xcrysden-1.6.2/scripts/orca2xsf.sh0000755000175000017500000001023012667256061015637 0ustar tonetone#!/bin/sh ############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/orca2xsf.sh # ------ # # Copyright (c) 2016 by Anton Kokalj # ############################################################################# # set locales to C LANG=C LC_ALL=C export LANG LC_ALL if [ $# -eq 0 ]; then input=- elif [ $# -eq 1 ]; then input=$1 else echo " Usage: orca2xsf.sh orca-output > XSF-file or orca2xsf.sh < orca-output > XSF-file " exit 1 fi #------------------------------------------------------------------------ # This is an experimental Orca To XSF converter. Use at your own risk #------------------------------------------------------------------------ # # The script greps the Cartesian that follows the following record: # # ^--------------------------------- # ^CARTESIAN COORDINATES (ANGSTROEM) # ^--------------------------------- # # where "^" marks the beggining of line. # # This coordinates are augmented with atomic forces if the following record is found: # # ^------------------ # ^CARTESIAN GRADIENT # ^------------------ # # ------------------------------------------------------------------------ forc_str='^CARTESIAN GRADIENT' coor_str='^CARTESIAN COORDINATES \(ANGSTRO' forces_exists=`egrep -a "$forc_str" $input` coord_exists=`egrep -a "$coor_str" $input` if [ "x$forces_exists" != "x" -a "x$coord_exists" != "x" ]; then ncoord=`egrep -a "$coor_str" $input | nl | tail -1 | awk '{print $1}'` cat $input | awk -v ncoord=$ncoord ' BEGIN { nimages=0; if (ncoord>1) print "ANIMSTEPS", ncoord; } { if ( $0 ~ /^CARTESIAN COORDINATES \(ANGSTRO/ ) { i=0; getline; while ( NF != 4 ) { getline; } while ( NF == 4 ) { atn[i] = $1; x[i] = $2; y[i] = $3; z[i++] = $4; getline; } natoms = i; atoms_printed = 0; } } { if ( $0 ~ /^CARTESIAN GRADIENT/ ) { i=0; getline; while ( NF != 6) { getline; } while ( NF == 6) { fx[i] = $4; fy[i] = $5; fz[i++] = $6; getline; } nforc = i; if ( natoms != nforc ) { print "### ERROR parsing output: number of atoms and atomic forces does not match" exit 1; } else { if (ncoord>1) { print "ATOMS", ++nimages; } else { print "ATOMS"; } for (i=0; i1) { print "ATOMS", ++nimages; } else { print "ATOMS"; } for (i=0; i1) print "ANIMSTEPS", ncoord; } { if ( $0 ~ /^CARTESIAN COORDINATES \(ANGSTRO/ ) { i=0; getline; while ( NF != 4 ) { getline; } if (ncoord>1) { print "ATOMS", ++nimages; } else { print "ATOMS"; } while ( NF == 4 ) { printf "%3s %15.10f %15.10f %15.10f\n", $1, $2, $3, $4; getline; } } }' fi xcrysden-1.6.2/scripts/pwo2xsf_old.sh0000755000175000017500000003133613174035716016364 0ustar tonetone#!/bin/sh ############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/pwo2xsf_old.sh # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # set locales to C LANG=C LC_ALL=C export LANG LC_ALL # # pwo2xsf_old.sh: PW-output--to--XSF conversion; # Used for PWscf versions < 1.3 # # Usage: pwo2xsf_old.sh [options] pw-output-file # # Written by Tone Kokalj on Tue May 8 20:43:44 2001 # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cat > pwo2xsfUsage.$$ <nat conversion, and the corresponding data are written to file nuclei.charges. The -r flag deletes this file. Here "option" is one of the above options (i.e -lc|-oc|-a). EOF pwoCleanFiles() { for file in pwo2xsfUsage.$$ pw.$$ pwo2xsf.xsf1 pwo2xsf.xsf2 do if test -f $file; then rm -f $file; fi done } pwoExit() { # Usage: $0 status pwoCleanFiles exit $status } pwoUsage() { if [ $1 ]; then echo " Usage: $2 " pwoExit 1 fi } ####################################### if [ "$XCRYSDEN_TOPDIR" != "" ]; then . $XCRYSDEN_TOPDIR/scripts/pwLib_old.sh else echo " ERROR: cannot convert to XSF, because loading of pwLib_old.sh failed " exit 1 fi ####################################### ############# BOHR=0.52917720859; ############# # --------------------------------------------------------------------------- # read PW-output file and print the XSF file according to specified flags pwoPrintCoor() { #set -x pwoUsage "$# -lt 1" \ "$0 --latestcoor|-lc [pw-output-file] or $0 --optcoor|-oc [pw-output-file]" case $1 in --latestcoor|-lc) type=lc; shift;; --optcoor|-oc) type=oc; shift;; esac if [ $# -eq 0 ]; then pwNucleiCharges - pw.$$ cat - >> pw.$$ else pwNucleiCharges $1 pw.$$ for i in `ForLoop 1 $#` do cat $1 >> pw.$$ shift done fi inp=pw.$$ cat "$inp" | awk -v bohr=$BOHR -v t=$type -- ' function isInt(__num) { if ( __num ~ /^[0-9]+$/ ) return 1; else return 0; } function PrintItyp(__ityp) { if ( __ityp ~ /^[0-9]+$/ ) return atn[ __ityp ]; else return __ityp; } BEGIN { line=0; optc=0; for (i=0; i<100; i++) atn[i]=i; getline; ntyp=$1; for (i=0; i pwo2xsf.xsf_out cat pwo2xsf.xsf_out } # --------------------------------------------------------------------------- # read PW-output file and print the animated-XSF file pwoAnimXSF() { #set -x pwoUsage "$# -lt 1" "$0 --animxsf|-a [pw-output-file1] ..." only_init=0 case $1 in --inicoor|-ic) only_init=1;; esac if [ $# -eq 1 ]; then pwNucleiCharges - pw.$$ cat - >> pw.$$ else pwNucleiCharges $2 pw.$$ # if "pw-output-file" is glob expresion -> must merge all outputs for i in `ForLoop 2 $#` do cat $2 >> pw.$$ shift done fi inp=pw.$$ nstep=`egrep "Final estimate of positions|Search of equilibrium positions|Entering Dynamics;" $inp | wc | awk '{print $1}'` # add also initial coordinates nstep=`expr $nstep + 1` cat "$inp" | awk -v bohr=$BOHR -v astep=$nstep -v onlyinit=$only_init -- ' function isInt(__num) { if ( __num ~ /^[0-9]+$/ ) return 1; else return 0; } function PrintItyp(__ityp) { if ( __ityp ~ /^[0-9]+$/ ) return atn[ __ityp ]; else return __ityp; } function PrintPrimCoor(nstep, nat, atn, ityp, x, y, z, fx, fy, fz) { if (onlyinit) { print " PRIMCOORD"; } else { print " PRIMCOORD", nstep; } print nat, 1; for(i=1; i<=nat; i++) { printf "% 3s ", PrintItyp(ityp[i]); printf "% 15.10f % 15.10f % 15.10f % 15.10f % 15.10f % 15.10f\n", x[i], y[i], z[i], fx[i], fy[i], fz[i]; } } function GetInitCoor(nstep, nat, scale, ityp, x, y, z) { for(i=1; i<=nat; i++) { ityp[i]=$2; split($0,rec,"("); split(rec[3],coor," "); x[i]= scale*coor[1]; y[i]=scale*coor[2]; z[i]=scale*coor[3]; getline; } } function GetPrimCoor(nstep, nat, scale, ityp, x, y, z) { for(i=1; i<=nat; i++) { if (isInt($4)) { x[i]=scale*$1; y[i]=scale*$2; z[i]=scale*$3; ityp[i]=$4; } else { x[i]=scale*$2; y[i]=scale*$3; z[i]=scale*$4; ityp[i]=$1; } getline; } } function GetForces(nstep, nat, ityp, fx, fy, fz) { for(i=1; i<=nat; i++) { #if (nstep==1) ityp[i]=$4; fx[i]=$7; fy[i]=$8; fz[i]=$9; getline; } } BEGIN { nstep=1; print_celldm=1; for (i=0; i<100; i++) atn[i]=i; getline; ntyp=$1; for (i=0; i pwo2xsf.xsf_out if [ $only_init -eq 0 ]; then # Assign the number of ANIMSTEPS here. The reason is that the # output file (queue runs) is the result of several job runs, then # some of them might be terminated on the "wrong" place, and the # initial ANIMSTEPS might be wrong. The most secure way is to extract the # sequential digit from the last "PRIMCOORD id" record. nsteps=`grep PRIMCOORD pwo2xsf.xsf_out | tail -1 | awk '{print $2}'` echo " ANIMSTEPS $nsteps" > pwo2xsf.xsf1 cp pwo2xsf.xsf_out pwo2xsf.xsf2 cat pwo2xsf.xsf1 pwo2xsf.xsf2 > pwo2xsf.xsf_out fi cat pwo2xsf.xsf_out } ####################################################################### #### MAIN ### ####################################################################### if [ $# -eq 0 ]; then cat pwo2xsfUsage.$$ pwoExit 1 fi r=0 if [ "$1" = "-r" ]; then r=1 shift fi case $1 in --inicoor|-ic) pwoAnimXSF $@;; --latestcoor|-lc) pwoPrintCoor $@;; --optcoor|-oc) pwoPrintCoor $@;; --animxsf|-a) pwoAnimXSF $@;; *) cat pwo2xsfUsage.$$; pwoExit;; esac if [ $r -eq 1 ]; then rm nuclei.charges fi pwoExit 0 xcrysden-1.6.2/scripts/g98toxsf.sh0000755000175000017500000002277213515530754015616 0ustar tonetone#!/bin/sh ############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/g98toxsf.sh # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # set locales to C LANG=C LC_ALL=C export LANG LC_ALL if [ $# -eq 0 ]; then input=- elif [ $# -eq 1 ]; then input=$1 else echo " Usage: g98toxsf.sh G98-output > XSF-file or g98toxsf.sh < G98-output > XSF-file " exit 1 fi #-------------------------------------------------------------------------- # this is an experimental Gaussian98 To XSF converter. Use at your own risk # # Usage: g98toxsf.sh G98-output > XSF-file # or # g98toxsf.sh < G98-output > XSF-file # # The order of coordinates searching is the following: # # ---- # 1.) first check if the following is present # # 0 Center Atomic Forces (Hartrees/Bohr) # 1 Number Number X Y Z # 2 ------------------------------------------------------------------- # 3 1 8 -.051649003 .000000000 -.039990931 # 4 2 1 .017695138 .000000000 .030494684 # 5 3 1 .033953865 .000000000 .009496247 # 6 ------------------------------------------------------------------- # # if YES, then look for: # # 0 Input orientation: # 1 --------------------------------------------------------------------- # 2 Center Atomic Atomic Coordinates (Angstroms) # 3 Number Number Type X Y Z # 4 --------------------------------------------------------------------- # 5 1 8 0 .000000 .000000 .000000 # 6 2 1 0 .000000 .000000 1.000000 # 7 3 1 0 .968148 .000000 -.250380 # 8 --------------------------------------------------------------------- # # ---- # 2.) if forces are not present, then look for: # # Standard orientation: # --------------------------------------------------------------------- # Center Atomic Atomic Coordinates (Angstroms) # Number Number Type X Y Z # --------------------------------------------------------------------- # 1 46 0 .000000 .000000 1.077941 # 2 8 0 .000000 .000000 -1.088059 # 3 7 0 .000000 .000000 -2.335059 # 4 7 0 .000000 .000000 -3.505059 # --------------------------------------------------------------------- # # ---- # 3.) if Standard orientation is not present, then look for: # # Z-Matrix orientation: # --------------------------------------------------------------------- # Center Atomic Atomic Coordinates (Angstroms) # Number Number Type X Y Z # --------------------------------------------------------------------- # 1 46 0 .000000 .000000 .000000 # 2 8 0 .000000 .000000 2.166000 # 3 7 0 .000000 .000000 3.413000 # 4 7 0 .000000 .000000 4.583000 # --------------------------------------------------------------------- # #------------------------------------------------------------------------ forces_exists=`egrep 'Forces \(Hartrees\/Bohr\)' $input` input_exists=`grep ' Input orientation:' $input` standard_exists=`grep ' Standard orientation:' $input` Zmatrix_exist=`grep ' Z-Matrix orientation:' $input` if [ "x$forces_exists" != "x" -a "x$input_exists" != "x" ]; then # # search for: # # 0 Center Atomic Forces (Hartrees/Bohr) # 1 Number Number X Y Z # 2 ------------------------------------------------------------------- # 3 1 8 -.051649003 .000000000 -.039990931 # 4 2 1 .017695138 .000000000 .030494684 # 5 3 1 .033953865 .000000000 .009496247 # 6 ------------------------------------------------------------------- # # if YES, then look for: # # 0 Input orientation: # 1 --------------------------------------------------------------------- # 2 Center Atomic Atomic Coordinates (Angstroms) # 3 Number Number Type X Y Z # 4 --------------------------------------------------------------------- # 5 1 8 0 .000000 .000000 .000000 # 6 2 1 0 .000000 .000000 1.000000 # 7 3 1 0 .968148 .000000 -.250380 # 8 --------------------------------------------------------------------- # cat $input | awk ' { if ( $0 ~ / +Input orientation:|Z-Matrix orientation:/ ) { i=0; getline; getline; getline; getline; getline; while ( $1 !~ /\-\-/ ) { #print "COOR:", $0; atn[i] = $2; x[i] = $4; y[i] = $5; z[i++] = $6; getline; } atoms_printed = 0; } } { if ( $0 ~ /Forces \(Hartrees\/Bohr\)/ ) { #print "LINE:", $0; i=0; getline; getline; getline; printf " %s\n", "ATOMS"; while ( $1 !~ /\-\-/ ) { printf "%3d %15.10f %15.10f %15.10f %15.10f %15.10f %15.10f\n", atn[i], x[i], y[i], z[i], $3, $4, $5; i++; getline; } atoms_printed = 1; } } END { if ( !atoms_printed ) { # print OPTIMIZED or the LAST coordinates printf " %s\n", "ATOMS"; for (ia=0; ia g98toxsf.$$ elif [ "$Zmatrix_exist" != "" ]; then # # search for: # # Z-Matrix orientation: # --------------------------------------------------------------------- # Center Atomic Atomic Coordinates (Angstroms) # Number Number Type X Y Z # --------------------------------------------------------------------- # 1 46 0 .000000 .000000 .000000 # 2 8 0 .000000 .000000 2.166000 # 3 7 0 .000000 .000000 3.413000 # 4 7 0 .000000 .000000 4.583000 # --------------------------------------------------------------------- cat $input | awk ' { if ( $0 ~ / +Z-Matrix orientation:/ ) { getline; getline; getline; getline; getline; printf " %s\n", "ATOMS"; while ( $1 !~ /\-\-/ ) { printf "%3d %15.10f %15.10f %15.10f\n", $2, $4, $5, $6; getline; } } }' > g98toxsf.$$ elif [ "$standard_exists" != "" ]; then # # search for: # # Standard orientation: # --------------------------------------------------------------------- # Center Atomic Atomic Coordinates (Angstroms) # Number Number Type X Y Z # --------------------------------------------------------------------- # 1 46 0 .000000 .000000 1.077941 # 2 8 0 .000000 .000000 -1.088059 # 3 7 0 .000000 .000000 -2.335059 # 4 7 0 .000000 .000000 -3.505059 # --------------------------------------------------------------------- cat $input | awk ' { if ( $0 ~ / +Standard orientation:/ ) { getline; getline; getline; getline; getline; printf " %s\n", "ATOMS"; while ( $1 !~ /\-\-/ ) { printf "%3d %15.10f %15.10f %15.10f\n", $2, $4, $5, $6; getline; } } }' > g98toxsf.$$ fi if [ -f g98toxsf.$$ ]; then # this is common to all !!! nstep=`grep ATOMS g98toxsf.$$ | wc | awk '{print $1}'` if [ $nstep -gt 1 ]; then # make a AXSF file cat g98toxsf.$$ | awk -v ns=$nstep ' BEGIN { printf " %s %d\n", "ANIMSTEPS", ns; } /ATOMS/ { printf " %s %d\n", "ATOMS", ++i; next; } /a*/ { print; }' else cat g98toxsf.$$ fi rm -f g98toxsf.$$ exit 0 else # coordinates were not extracted ... exit 1 fi xcrysden-1.6.2/scripts/xc_cleanscratch0000755000175000017500000000365213521270415016622 0ustar tonetone#!/bin/sh ############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/xc_cleanscratch # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# if test "x$XCRYSDEN_SCRATCH" = "x"; then echo "Exiting; XCRYSDEN_SCRATCH does not exists !!!" exit 0 fi DELETE_FILES=$XCRYSDEN_SCRATCH/xc_* Question () { echo " XCRYSDEN_SCRATCH directory: $XCRYSDEN_SCRATCH/ will be cleaned (i.e. rm -rf $DELETE_FILES). The following files/directories will be deleted: " files=`ls $XCRYSDEN_SCRATCH/* 2> /dev/null` if [ "$files" = "" ]; then echo " XCRYSDEN_SCRATCH directory is empty !!! " exit fi echo "$files" | grep xc_ $ECHO_n " Really delete? ([yes]/[n]o) " read ans if [ \( x"$ans" != x"yes" \) -a \( x"$ans" != x"n" \) ]; then echo " -- Please answer yes or n !!!" Question fi } # # assuming user shell is csh or tcsh or sh # if [ "`echo -n a`" = "-n a" ]; then ECHO_n=echo else ECHO_n="echo -n" fi Question if [ "$ans" = yes ]; then $ECHO_n " Deleting $DELETE_FILES ... " cd $XCRYSDEN_SCRATCH/ rm -rf xc_* echo "OK " fi xcrysden-1.6.2/scripts/pwd.sh0000755000175000017500000000004211712736221014671 0ustar tonetone#!/bin/sh # a simple wrapper pwdxcrysden-1.6.2/scripts/pwo2xsf_opt.awk0000644000175000017500000001056713522024111016540 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/pwo2xsf_opt.awk # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # Purpose: extract the LATEST or OPTIMIZED coordinates for PWscf-v2.0 or latter # # Written by Tone Kokalj on Mon Feb 9 12:48:10 CET 2004 # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function PrintSpecies() { if (dimen==0) print "MOLECULE"; else if (dimen==1) print "POLYMER"; else if (dimen==2) print "SLAB"; else print "CRYSTAL"; } function CheckAtoms() { if (nat < 1) { print "ERROR: no atoms found"; error_status=1; exit 1; } } function CrysToCartCoor(i,v,a,b,c) { # Crystal --> Cartesian (ANGSTROM units) conversion x[i] = v[0,0]*a + v[1,0]*b + v[2,0]*c; y[i] = v[0,1]*a + v[1,1]*b + v[2,1]*c; z[i] = v[0,2]*a + v[1,2]*b + v[2,2]*c; } function make_error(message,status) { printf "ERROR: %s\n", message; error_status=status; exit status; } BEGIN { nat=0; opt_coor_found=0; error_status=0; bohr=0.52917720859; } /celldm\(1\)=/ { a0=$2*bohr; scale=a0; l_scale=a0; } /number of atoms/ { nat=$NF; } /crystal axes:/ { # read the lattice-vectors for (i=0; i<3; i++) { getline; split($0,rec,/\(/); split(rec[3],vecstr," "); for (j=1; j<4; j++) v[i,j-1] = vecstr[j] * a0; } } $1 == "CELL_PARAMETERS" { # read the lattice-vectors (type=OPTIMIZED) opt_coor_found=1; ff=l_scale; if ( $2 ~ /alat/ ) { if ( $0 ~ /=/ ) { n=split($NF, res, "="); split(res[n], alat_, ")"); a0=bohr*alat_[1]; } ff=a0; } else if ( $2 ~ /angstrom/ ) ff=1.0; else if ( $2 ~ /bohr/ ) ff=bohr; CheckAtoms(); for (i=0; i<3; i++) { getline; if (NF != 3) make_error("error reading CELL_PARAMETERS records",1); for (j=1; j<4; j++) { v[i,j-1] = ff * $j; } } } $1 == "ATOMIC_POSITIONS" { crystal_coor=0; if ( $2 ~ /alat/ ) scale=a0; else if ( $2 ~ /angstrom/ ) scale=1.0; else if ( $2 ~ /bohr/ ) scale=bohr; else if ( $2 ~ /crystal/ ) { scale=1.0; crystal_coor=1; } CheckAtoms(); for(i=0; i pwo2xsfUsage.$$ <2) printf "%d.%d%d\n", vv[0],vv[1],vv[2]; else printf "%d.%d\n", vv[0], vv[1]; }' } pwoCheckPWSCFVersion() { # # Usage: $0 option file # # Purpose: if PWSCF version < 1.3 execute the old pwo2xsf_old.sh # script and exit version=`pwoGetVersion $input` result=`echo "$version < 1.3"|bc -l` if test x"$result" = x1 ; then if test -f $scriptdir/pwo2xsf_old.sh ; then # execute pwo2xsf_old.sh $scriptdir/pwo2xsf_old.sh $1 $2 pwoExit $? else echo "ERROR: PWscf output generated by version < 1.3 !!!" pwoExit 1 fi fi } # ------------------------------------------------------------------------ # Function: pwoGetIbrav # Extract: ibrav from pw.x output file # ------------------------------------------------------------------------ pwoGetIbrav() { echo `egrep "bravais-lattice index +=" $1 | tail -1 | awk '{print $NF}'` } pwoAnimSteps() { cp xsf.$$ xsf2.$$ nsteps=`grep PRIMCOORD xsf.$$ | wc | awk '{print $1}'` echo "ANIMSTEPS $nsteps" > xsf.$$ cat xsf2.$$ >> xsf.$$ rm -f xsf2.$$ } # ------------------------------------------------------------------------ # Function: pwoConvVec # Purpose: tries to assign the CONVVEC based on PRIMVEC and ibrav and # prints to standard output the modified XSF file that # contains the CONVVECs #------------------------------------------------------------------------ pwoConvVec() { ibrav=`pwoGetIbrav $input` if test "x$ibrav" = x; then # ibrav not found; do nothing cat xsf.$$ elif test "x$dim" = x3; then # ibrav was found and structure was not reduced; try to assign CONVVEC $PWO_XSF2XSF $ibrav < xsf.$$ else # dimensionality of structure has bin reduced; do nothing cat xsf.$$ fi } # ------------------------------------------------------------------------ # Function: pwoOptCoor # Extract: OPTIMIZED or LATEST coordinates # Perform: read PW-output file and print the XSF file according to # specified flags # ------------------------------------------------------------------------ pwoOptCoor() { #set -x pwoUsage "$# -lt 1" \ "$0 --latestcoor|-lc [pw-output-file] or $0 --optcoor|-oc [pw-output-file]" option=$1 case $1 in --latestcoor|-lc) type=LATEST; shift;; --optcoor|-oc) type=OPTIMIZED; shift;; esac if test $# -eq 0 ; then input=pw.$$ cat - >> $input else input=$1 fi pwoCheckPWSCFVersion $option $input if test $type = "OPTIMIZED" ; then # Check for the presence of "Begin final coordinates" # and/or: # Check also for the PWSCF-v.1.3.0 which uses the # "Final estimate of positions" record if test \( "`grep \"Begin final coordinates\" $input`" = "" \) \ -a \( "`grep 'Final estimate of positions' $input`" = "" \) \ -a \( "`grep ' bfgs converged in' $input`" = "" \); then echo "ERROR: OPTIMIZED coordinates does not exists" pwoExit 1 fi fi cat "$input" | awk -v t=$type -v dimen=$dim -f $scriptdir/pwo2xsf_opt.awk > xsf.$$ pwoConvVec } # ------------------------------------------------------------------------ # Function: pwoAnimCoor # Extract: INITIAL or ALL coordinates # Perform: read PW-output file and print the XSF file according to # specified flags # ------------------------------------------------------------------------ pwoAnimCoor() { #set -x pwoUsage "$# -lt 1" "$0 --animcoor|-ac|--animxsf|-a [pw-output-file1] or $0 --inicoor|-ic [pw-output-file]" option=$1 only_init=0 case $1 in --inicoor|-ic) only_init=1; shift;; --animcoor|-ac|--animxsf|-a) only_init=0; shift;; esac if test $# -eq 0 ; then input=pw.$$ cat - >> $input else input=$1 fi pwoCheckPWSCFVersion $option $input ncoor=`awk '$1 ~ /ATOMIC_POSITIONS/ { npos++; } END { # add another step for initial coordinates print npos+1; }' $input`; nvec=`awk '$1 ~ /CELL_PARAMETERS/ { nvec++; } END { print nvec; }' $input` cat "$input" | awk \ -v ncoor=$ncoor \ -v nvec=$nvec \ -v dimen=$dim \ -v onlyinit=$only_init -f $scriptdir/pwo2xsf_anim.awk > xsf.$$ if test $only_init -eq 0 ; then # Assign the number of ANIMSTEPS here. The reason is that the # output file (queue runs) is the result of several job runs, # then some of them might be terminated on the "wrong" place, # and the initial ANIMSTEPS might be wrong. The most secure # way is to extract the sequential digit from the last # "PRIMCOORD id" record. pwoAnimSteps fi pwoConvVec } # ------------------------------------------------------------------------ # Function: pwoNebCoor # Extract: all coordinates and forces found in PW.out file # ------------------------------------------------------------------------ pwoNebCoor() { #set -x pwoUsage "$# -lt 1" "$0 --nebcoor|-nc [PW.out]" option=$1; shift if test $# -eq 0 ; then input=pw.$$ cat - >> $input else input=$1 fi cat "$input" | awk \ -v dimen=$dim \ -f $scriptdir/pwo2xsf_neb.awk > xsf.$$ # Assign the number of ANIMSTEPS here. The reason is that the # output file (queue runs) is the result of several job runs, then # some of them might be terminated on the "wrong" place, and the # initial ANIMSTEPS might be wrong. The most secure way is to extract the # sequential digit from the last "PRIMCOORD id" record. pwoAnimSteps # conventional-vectors pwoConvVec } ####################################################################### #### MAIN ### ####################################################################### if test "x`which readlink`" = "x"; then # no readlink cmd; make a function-substitute readlink_f() { file=`ls -l "$1" | awk '{print $NF}'` while test -h "$file"; do file=`ls -l "$file" | awk '{print $NF}'` done echo $file } else readlink_f() { readlink -f "$1" } fi pathname() { file=`which "$1"` if test $? -gt 0; then file=`type "$1"` if test $? -gt 0; then # give-up file="$1" else file=`echo $file | awk 'BEGIN {FS="is "} {print $NF}'` fi fi echo $file } pathdir() { file=`pathname "$1"` while test -h "$file"; do file=`readlink_f "$file"` done dir=`dirname "$file"` ( cd $dir; pwd ) } if test -z $XCRYSDEN_TOPDIR; then # XCRYSDEN_TOPDIR does not exists, guess it from the process scriptdir=`pathdir $0` export XCRYSDEN_TOPDIR=`(cd $scriptdir/..; pwd)` else scriptdir=$XCRYSDEN_TOPDIR/scripts fi AWK=`which awk` if test "$AWK" = ""; then echo "ERROR: awk program not found" pwoExit 1 fi PWO_XSF2XSF=pwo_xsf2xsf if test -f $XCRYSDEN_TOPDIR/bin/pwo_xsf2xsf ; then PWO_XSF2XSF=$XCRYSDEN_TOPDIR/bin/pwo_xsf2xsf elif test -f $XCRYSDEN_LIB_BINDIR/pwo_xsf2xsf ; then PWO_XSF2XSF=$XCRYSDEN_LIB_BINDIR/pwo_xsf2xsf fi if [ $# -eq 0 ]; then cat pwo2xsfUsage.$$ pwoExit 1 fi dim=3 if test $1 = "-r"; then dim=$2; shift 2 fi case $1 in --inicoor|-ic) pwoAnimCoor $@;; --latestcoor|-lc) pwoOptCoor $@;; --optcoor|-oc) pwoOptCoor $@;; --animcoor|-ac|--animxsf|-a) pwoAnimCoor $@;; --nebcoor|-nc) pwoNebCoor $@;; --help|-h) cat pwo2xsfUsage.$$;; *) cat pwo2xsfUsage.$$; pwoExit 1;; esac pwoExit 0 xcrysden-1.6.2/scripts/xcConfigure_definitions.sh0000644000175000017500000003543113525505313020755 0ustar tonetone# ------------------------------------------------------------------------ # FUNCTIONS # ------------------------------------------------------------------------ type_p() { which $1 #| awk '{print $NF}' } CustomDir () { $ECHO_n " I am about to create the \$HOME/.xcrysden/custom-definitions file, which is XCRYSDEN's customization file. Press to continue ... " read ans } ExeWarning () { if [ ! -x "$1" ]; then echo " WARNING: file $1 is not executable !!!" fi } BackupName() { # usage: $0 # return backup name such that the file with this name does not yet exists head=$1 file=$1 i=1 while test -f $file do file=$head.$i i=`expr $i + 1` done echo $file } QueryProgram() { # usage: QueryProgram msg1 mesg2 deafult variable $ECHO_n "$1 ([y]es/[n]o): " read ans; if [ \( "$ans" != "y" \) -a \( "$ans" != "n" \) ]; then echo " Please answer y or n !!! " QueryProgram "$1" "$2" "$3" "$4" return elif [ "$ans" = "y" ]; then $ECHO_n "$2 (default: $3): " read prog; if [ "$prog" = "" ]; then prog=$3 fi ExeWarning "$prog" eval $4=\"$prog\" else unset $4 #eval $4="" fi } GetYesNoAnswer() { # Usage: $0 text variable $ECHO_n "$1 ([y]es/[n]o): " read ans_ if test \( "$ans_" != "y" \) -a \( "$ans_" != "n" \) ; then echo " Please answer y or n !!! " GetYesNoAnswer "$1" "$2" return else eval $2=\"$ans_\" fi } CustomDef () { # # Query the CRYSTAL program # echo " CRYSTAL is an electronic structure program for periodic systems. (http://www.crystal.unito.it/) " GetYesNoAnswer " Do you have a CRYSTAL package" cXX echo "" > $tempdir/customFile.$$ if [ "$cXX" = "y" ]; then cry_def=`type_p crystal` if test "x$cry_def" = "x"; then cry_def=/usr/local/bin/crystal fi $ECHO_n " Specify CRYSTAL's crystal module (default: $cry_def): " read cry if [ "$cry" = "" ]; then cry=$cry_def fi ExeWarning "$cry" pro_def=`type_p properties` if test "x$pro_def" = "x"; then pro_def=/usr/local/bin/properties fi $ECHO_n " Specify CRYSTAL's properties module (default: $pro_def): " read pro if [ "$pro" = "" ]; then pro=$pro_def fi ExeWarning "$pro" echo " # ------------------------------------------------------------------------ # do we have CRYSTAL package # ------------------------------------------------------------------------ set system(c95_exist) 1 # ------------------------------------------------------------------------ # CRYSTAL modules # ------------------------------------------------------------------------ set system(c95_crystal) $cry set system(c95_properties) $pro " >> $tempdir/customFile.$$ else echo " # ------------------------------------------------------------------------ # do we have CRYSTAL package # --------------------------- set system(c95_exist) 0 # ------------------------------------------------------------------------ # CRYSTAL modules # ------------------------------------------------------------------------ #set system(c95_crystal) /full/path/to/crystal #set system(c95_properties) /full/path/to/properties " >> $tempdir/customFile.$$ fi echo " # ------------------------------------------------------------------------ # xcrysden can use several encoder programs for creating animated GIF # (convert, gifsicle, whirlgif) and AVI/MPEG movies # (mencoder/ppmtompeg) # ------------------------------------------------------------------------ # what program we use for animated-gif encoding #set xcMisc(gif_encoder) convert # what program we use for AVI/MPEG encoding #set xcMisc(movie_encoder) mencoder # ------------------------------------------------------------------------ # NOTICE: Starting from version 1.6, xcrysden tries to automatically # find various external packages, nevertheless user can still set # them explicitly, as shown below (if you want to do so, uncomment # corresponding lines) # ------------------------------------------------------------------------ #set xcMisc(gifsicle) /full/path/to/gifsicle #set xcMisc(ppmtompeg) /full/path/to/ppmtompeg # ------------------------------------------------------------------------ # An image conversion program: we need PPM to PNG/JPG/GIF/... conversion. # The \"convert\" program of ImageMagick (http://www.imagemagick.org/) is # a convinient choice. # # It is possible to specify the command-line options. For example: # # set xcMisc(ImageMagick.convert) \"/usr/bin/convert \\ # -quality 90 -border 3x3 -bordercolor black\" # # We can also specify convert options separately as: # # set xcMisc(ImageMagick.convertOptions) \"-quality 90 -antialias \\ # -blur 1x1 -trim -bordercolor white \\ # -border 20x20 -bordercolor black -border 3x3\" # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # How many decimal digits should the \"Measurer\" report for distances # and angles (including dihedral). The syntax is: # # set select(dist_precision) number-of-decimal digits; # for distances # set select(angl_precision) number-of-decimal digits; # for angles # # Example: # # set select(dist_precision) 4 # set select(angl_precision) 3 # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # Custom setting of the atomic radii. The syntax is: # # set atmRad(atomic_number) radius # # Example: # # set atmRad(1) 0.5; # custom radius for Hydrogen # set atmRad(8) 1.2; # custom radius for Oxygen # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # Custom setting of the atomic colors. The syntax is: # # set atmCol(atomic_number) {red gren blue} # # The components (red,gren,blue) must be in range [0,1] # # Example: # # set atmCol(1) {0.5 0.5 0.5}; # custom color for Hydrogen # set atmCol(8) {0.0 1.0 0.0}; # custom color for Oxygen # ------------------------------------------------------------------------ # ------------------------------------------------------------------------- # Custom setting for a variety of molecular display parameters, such as # ball-factors, specefill scale factors, tessellation factors, etc. # # Below are the default values. If you would like to change the # default for a particular parameter, then uncomment the appropriate # line and set the value according to your needs. # ------------------------------------------------------------------------ ## spacefill scale factor #set myParam(ATRAD_SCALE) 1.40 # ## tesselation factor #set myParam(TESSELLATION) 15.0 # ## RGB color of unibonds (each compoenent must be within [0,1]) #set myParam(UNIBONDCOLOR) {1.00 1.00 1.00} # ## Perspective Fovy, Front and Back parameters. The smaller the Fovy ## the larger the perception of perspective. Front and Back parameters ## determine the front and back clipping planes. The smaller the Back ## parameter the more the structure is clipped from the back side. The ## Front parameter is counter-intuitive, meaning the smaller it is the ## more the structure is clipped from the front side. # #set myParam(PERSPECTIVEFOVY) 2.5 #set myParam(PERSPECTIVEFRONT) 0.65 #set myParam(PERSPECTIVEBACK) 3.0 # ## ball-factor #set myParam(BALLF) 0.4 # ## rod-factor #set myParam(RODF) 0.6 # ## line-width of wireframe display-mode (in pixels) #set myParam(WFLINEWIDTH) 1 # ## line-width of pointline display-mode (in pixels) #set myParam(PLLINEWIDTH) 1 # ## line-width of crystal cell's frames #set myParam(FRAMELINEWIDTH) 1 # ## Lighting-Off outline width #set myParam(OUTLINEWIDTH) 1 # ## Lighting-On wire line width #set myParam(WF3DLINEWIDTH) 1 # ## point-size of pointline display-mode (in pixels) #set myParam(PLRADIUS) 6 # ## chemical connectivity factor #set myParam(COV_SCALE) 1.05 # ## RGB color of crystal frame (each compoenent must be within [0,1]) #set myParam(FRAMECOL) {0.88 1.00 0.67} # ## line-width of crystal frame #set myParam(FRAMELINEWIDTH) 1 # ## rod-factor of crystal frame #set myParam(FRAMERODF) 0.1 # ## RGB background of XCRYSDEN display window ## (each compoenent must be within [0,1]) #set myParam(BACKGROUND) {0.00 0.00 0.00} # ## maximum number of cells per direction for CRYSTALs #set myParam(CRYSTAL_MAXCELL) 10 # ## maximum number of cells per direction for SLABs #set myParam(SLAB_MAXCELL) 20 # ## maximum number of cells for POLYMERs #set myParam(POLYMER_MAXCELL) 50 # ## default atomic-label's font (in X11 XLFD format) #set myParam(ATOMIC_LABEL_FONT) -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1 # ## default atomic-label's bright and dark color (in clamped-float RGB format) #set myParam(ATOMIC_LABEL_BRIGHTCOLOR) {1.0 1.0 1.0} #set myParam(ATOMIC_LABEL_DARKCOLOR) {0.0 0.0 0.0} # # ## this are the parameters for the \"mpeg_encode\" program: ##--BEGIN:: #set myParam(MPEG_ENCODE_PARAM_FILE) { #PATTERN IBBPBBPBBPBBPBBP #OUTPUT \$output_file #BASE_FILE_FORMAT PPM #INPUT_FORMAT UCB #\$input_convert #GOP_SIZE 16 #SLICES_PER_FRAME 1 #INPUT_DIR \$input_dir #INPUT #\$input_files #END_INPUT #PIXEL FULL #RANGE 10 #PSEARCH_ALG LOGARITHMIC #BSEARCH_ALG CROSS2 #IQSCALE 8 #PQSCALE 10 #BQSCALE 25 #REFERENCE_FRAME ORIGINAL #BIT_RATE 1000000 #BUFFER_SIZE 327680 #FRAME_RATE 30 #} ##--END # # ------------------------------------------------------------------------ # # ------------------------------------------------------------------------ # Here go custom user-specified options # ------------------------------------------------------------------------ # In order to add an --unknown option to the Xcrysden allowed options, # do the following # # Usage: # addOption option converterProgram description # # Arguments: # option ... option to add to XCRYSDEN options # converterProgram ... program that converts from an "unknown" to XSF format; # this program must be supplied by the user !!! # description ... description of the options that will appear in the # help message (i.e. xcrysden --help). # Example: # addOption --unknown /home/tone/utils/unknown2xsf { # load structure from unknown file format # } # " >> $tempdir/customFile.$$ if [ "x$cXX" = "xy" ]; then echo " You have specified the following definitions: --------------------------------------------- " echo " CRYSTAL's crystal module: $cry CRYSTAL's properties module: $pro " fi GetYesNoAnswer " Is this correct" cor if [ \( "$cor" != "y" \) -a \( "$cor" != "yes" \) ]; then $CLEAR echo " You answered NO. Therefore, please answer again to all the questions !!! " CustomDef return fi $CLEAR if test -f $HOME/.xcrysden/custom-definitions ; then backup_name=`BackupName $HOME/.xcrysden/custom-definitions` echo " backing-up existing custom-definitions file to $backup_name" cp $HOME/.xcrysden/custom-definitions $backup_name fi $ECHO_n " creating new $HOME/.xcrysden/custom-definitions file ... " cp $tempdir/customFile.$$ $HOME/.xcrysden/custom-definitions if [ $? -eq 0 ]; then echo OK else echo " ERROR: failed to create $HOME/.xcrysden/custom-definitions file !!!" fi echo " Press to continue ..." read ans $CLEAR # $ECHO_n " #Would you like to edit ~/.xcrysden/custom-definitions file now ([y]es/[n]o):" # read edit # if [ \( "$edit" = "y" \) -o \( "$edit" = "yes" \) ]; then # ${EDITOR:-vi} $HOME/.xcrysden/custom-definitions # fi if test -d $HOME/Desktop; then GetYesNoAnswer " Would you like to add xcrysden icon to the desktop" desktop if test "$desktop" = "y"; then $ECHO_n " creating xcrysden dekstop icon via $HOME/Desktop/xcrysden.desktop file ... " echo " [Desktop Entry] Encoding=UTF-8 Name=xcrysden Exec=$XCRYSDEN_TOPDIR/xcrysden Type=Application Icon=$XCRYSDEN_TOPDIR/images/xcrysden.png " > $HOME/Desktop/xcrysden.desktop if [ $? -eq 0 ]; then echo OK else echo " ERROR: failed to create $HOME/Desktop/xcrysden.desktop file !!!" fi fi fi # # print message about the programs xcrysden uses # echo " XCRYSDEN uses a few external utility programs. These are the following: 1.) the \"Open Babel\" program is needed to display molecular structure from Gaussian Z-matrix file. 2.) the ImageMagick's suit of programs is used to print-to-file (PNG/JPG/GIF/...), to create animated-GIFs, and to screen dump windows. 3.) the \"Mplayer's mencoder\" program is used to create AVI/MPEG movies from the animation snapshots. 4.) xcrysden may also use other programs such as gifsicle, xwd, ppmtompeg, ... Links -- Open BABEL: http://openbabel.org/ IMAGEMAGICK: http://www.imagemagick.org/ MENCODER: http://www.mplayerhq.hu/ Press to continue ... " | $MORE read ans } # ------------------------------------------------------------------------ # MAIN # ------------------------------------------------------------------------ if [ \( -d /tmp \) -a \( -w /tmp \) ]; then tempdir=/tmp else # set tempdir to $HOME tempdir=$HOME fi CustomDir echo " Answer the following question(s) please: ----------------------------------------" if [ ! -d $HOME/.xcrysden ]; then mkdir $HOME/.xcrysden fi CustomDef if [ -f $tempdir/customFile.$$ ]; then rm -f $tempdir/customFile.$$ fi $CLEAR echo " Please report BUGS to Tone.Kokalj@ijs.si. TERMS OF USE: ------------- XCRYSDEN is released under the GNU General Public License. Whenever graphics generated by XCrySDen are used in scientific publications, it shall be greatly appreciated to include an explicit reference. The preferred form is the following: [ref] A. Kokalj, Comp. Mater. Sci., Vol. 28, p. 155, 2003. Code available from http://www.xcrysden.org/. XCRYSDEN tips: - try: xcrysden --help - occasionally clean the xcrysden scratch directory (you can use the \"xc_cleanscratch\" utility) Press to continue ... " | $MORE read ans $CLEAR if [ \( "$xcv" != "" \) ]; then $CLEAR echo " BEWARE: please edit manually your profile (i.e. $profile) to make the XCRYSDEN section as: "| cat - $install_file | $MORE fi echo " FINAL NOTICE: before running xcrysden please load (source) your profile, i.e.: - for bash: source ~/.bashrc - for csh or tcsh: source ~/.cshrc - for sh: . ~/.profile Then type: xcrysden " xcrysden-1.6.2/scripts/pwLib_old.sh0000644000175000017500000000621711712736221016021 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/pwLib_old.sh # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# ForLoop() { # Usege: $0 from to incr from=$1 to=$2 if test $# -eq 2 ; then incr=1 else incr=$3 fi op=-le if test $incr -lt 0 ; then op=-ge fi i=$from while [ $i $op $to ] do printf "%d " $i i=`expr $i + $incr` done } pwError() { # Usage: $0 message status echo " ======================================================================== $1 ======================================================================== " if [ "$2" -ge 0 ]; then exit $2 fi } # -------------------------------------------------------------------------- # pwNucleiCharges -- # # Purpose: ityp->nat conversion data # # Usage: pwNucleiCharges pw_input|pw_output outfile # # Side efect: creates nuclei.charges file # -------------------------------------------------------------------------- pwNucleiCharges() { # # if file nuclei.charges does not exists prompt for ityp->nat conversion !! # if [ \( "$1" = "" \) -o \( "$2" = "" \) ]; then pwError "Usage: pwNucleiCharges pw_input|pw_output outfile" 1 fi # do we have PW-INPUT or PW-OUTPUT file ??? if [ "`cat $1 | egrep -i '&input|&system'`" != "" ]; then # it is PW-INPUT ntyp=`cat "$1" | awk '{gsub(",","\n"); print}' | grep ntyp \ | awk '{split($0,a,"=|,"); print a[2];}'` else # PW-OUTPUT ntyp=`cat "$1" | grep 'number of atomic types' | \ head -1 | awk '{print $NF}'` #echo 'NTYP=$ntyp' if [ "$ntyp" = "" ]; then # some older PWSCF versions didn't have "number of atomic # types" printout -> user will have to make nuclei.charges # file by himself/herself !!! pwError "This is either non PW-output file or is a PW-output file produced with some old PWSCF version" -1 echo -n "How many ityp->nat replacements ? " read ntyp fi fi if [ ! -f nuclei.charges ]; then echo -n "Please enter $ntyp ityp->nat replacements !!! " echo $ntyp > nuclei.charges i=0 while [ $i -lt "$ntyp" ] do i=`echo "$i + 1"|bc` echo "" echo "Replacement #${i}: ityp->nat" echo -n "ityp[$i]=$i; nat[$i]="; read nat echo "$i $nat" >> nuclei.charges done fi cat nuclei.charges > "$2" } xcrysden-1.6.2/scripts/pwo2xsf_neb.awk0000644000175000017500000000654513174035657016527 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/scripts/pwo2xsf_neb.awk # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # Purpose: extract all coordinates and forces from the NEB (path) PW.out file for PWscf-v2.0 or latter # BEWARE: NEB (path) and variable-cell is currently not supported # # Written by Tone Kokalj on Thu Jan 5 14:16:36 CET 2006 # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function PrintSpecies() { if (dimen==0) print "MOLECULE"; else if (dimen==1) print "POLYMER"; else if (dimen==2) print "SLAB"; else print "CRYSTAL"; } function PrintPrimVec(is_vc,ith,vec) { if (!is_vc) printf "PRIMVEC\n"; else printf "PRIMVEC %d\n",ith; printf " %15.10f %15.10f %15.10f\n", v[0,0], v[0,1], v[0,2]; printf " %15.10f %15.10f %15.10f\n", v[1,0], v[1,1], v[1,2]; printf " %15.10f %15.10f %15.10f\n", v[2,0], v[2,1], v[2,2]; } function PrintPrimCoor(istep, nat, atom, x, y, z, fx, fy, fz) { print " PRIMCOORD", istep; print nat, 1; for(i=0; i Cartesian (ANGSTROM units) conversion x[i] = v[0,0]*a + v[1,0]*b + v[2,0]*c; y[i] = v[0,1]*a + v[1,1]*b + v[2,1]*c; z[i] = v[0,2]*a + v[1,2]*b + v[2,2]*c; } function make_error(message,status) { printf "ERROR: %s\n", message; error_status=status; exit status; } BEGIN { bohr=0.52917720859; istep=1; error_status=0; if (nvec>1 || (nvec==1 && ncoor==2)) { is_vc=1; # variable-cell } else { is_vc=0; } } /celldm\(1\)=/ { a0=$2*bohr; scale=a0; l_scale=a0; } /number of atoms/ { nat=$NF; } /crystal axes:/ { # read the initial lattice-vectors for (i=0; i<3; i++) { getline; split($0,rec,/\(/); split(rec[3],vecstr," "); for (j=1; j<4; j++) v[i,j-1] = vecstr[j] * a0; } if (istep==1) { PrintSpecies(); PrintPrimVec(is_vc,istep,v); } } /^ +Cartesian axes/ { # read INITIAL coordinates getline; getline; getline; if (istep == 1) GetInitCoor(nat, a0, atom, x, y, z); } $1 == "CELL_PARAMETERS" { # read the lattice-vectors ff=l_scale; if ( $2 ~ /alat/ ) { if ( $0 ~ /=/ ) { n=split($NF, res, "="); split(res[n], alat_, ")"); a0=bohr*alat_[1]; } ff=a0; } else if ( $2 ~ /angstrom/ ) ff=1.0; else if ( $2 ~ /bohr/ ) ff=bohr; for (i=0; i<3; i++) { getline; if (NF != 3) { print "bogus line:",$0; make_error("error reading CELL_PARAMETERS records",1); } for (j=1; j<4; j++) { v[i,j-1] = ff * $j; } } if (is_vc) PrintPrimVec(is_vc,istep,v); } $1 == "ATOMIC_POSITIONS" { # read atomic positions crystal_coor=0; if ( $2 ~ /alat/ ) scale=a0; else if ( $2 ~ /angstrom/ ) scale=1.0; else if ( $2 ~ /bohr/ ) scale=bohr; else if ( $2 ~ /crystal/ ) { scale=1.0; crystal_coor=1; } for(i=0; i to continue ..." | $MORE read ans $CLEAR # # get the scratch directory # xc_scratch=$XCRYSDEN_SCRATCH if [ "$XCRYSDEN_SCRATCH" = "" ]; then ScratchDir fi XCRYSDEN_SCRATCH=$xc_scratch # # get the user-shell # if test -z $SHELL; then echo " WARNING: the SHELL variable does not exists. This is weird !!! " fi user_shell=`echo $SHELL | awk '{n=split($0,shell,"/"); print shell[n]}'` # for Csh-based shells echo " #------------------------------------------------------------------------ # this is for XCRYSDEN $VER; added by XCRYSDEN installation on # $date #------------------------------------------------------------------------ setenv XCRYSDEN_TOPDIR $XCRYSDEN_TOPDIR setenv XCRYSDEN_SCRATCH $xc_scratch set path = (\$XCRYSDEN_TOPDIR \$path \$XCRYSDEN_TOPDIR/scripts \$XCRYSDEN_TOPDIR/util) " > $tempdir/xcInstall-csh.$$ # for sh-based shells echo " #------------------------------------------------------------------------ # this is for XCRYSDEN $ver; added by XCRYSDEN installation on # $date #------------------------------------------------------------------------ XCRYSDEN_TOPDIR=$XCRYSDEN_TOPDIR XCRYSDEN_SCRATCH=$xc_scratch export XCRYSDEN_TOPDIR XCRYSDEN_SCRATCH PATH=\"\$XCRYSDEN_TOPDIR:\$PATH:\$XCRYSDEN_TOPDIR/scripts:\$XCRYSDEN_TOPDIR/util\" " > $tempdir/xcInstall-sh.$$ # # get the profile and corresponding install_file # if test \( x"$user_shell" = x"csh" \) -o \( x"$user_shell" = x"tcsh" \) ; then # Csh and Tcsh profile=$HOME/.cshrc install_file=$tempdir/xcInstall-csh.$$ elif test x"$user_shell" = x"bash" ; then # Bash profile=$HOME/.bashrc install_file=$tempdir/xcInstall-sh.$$ elif test -n $user_shell ; then # assuming some Sh-based shell profile=$HOME/.profile install_file=$tempdir/xcInstall-sh.$$ else profile="" install_file=/dev/null echo " You will have to edit your profile (\$HOME/.bashrc or \$HOME/.profile or \$HOME/.csh) manually and add the following: " PrintTwoProfileBlocks fi # # write (if possible) to profile # grep_result= if test -n $profile ; then if [ -f $profile ]; then grep_result=`grep XCRYSDEN_TOPDIR $profile` fi if [ \( "$xcv" = "" \) -o \( "$grep_result" = "" \) ]; then # update profile if [ -f $profile ]; then if [ ! -w $profile ]; then echo " ERROR: cannot write to $profile because it is write-protected !!! You will have to edit your profile manually and add the following: " cat $install_file fi cp $profile $profile.orig else touch $profile.orig fi $ECHO_n " Updating profile file $profile ... " cat $profile.orig $install_file > $profile if [ $? -eq 0 ]; then echo OK else echo FAILED fi echo " The following record was inserted into $profile: " | cat - $install_file else echo " ======================================================================== WARNING *** WARNING *** XCRYSDEN_TOPDIR enviromental variable is already defined. WARNING *** You will have to edit your profile (i.e. \$HOME/.chsrc or \$HOME/.bashrc or \$HOME/.profile) manually and make the XCRYSDEN section as shown below: " | cat - $install_file | $MORE echo " Press to continue ..." read ans $CLEAR fi fi xcrysden-1.6.2/Makefile0000644000175000017500000002261013556022211013511 0ustar tonetone#------------------------------------------------------------------------ # # XCRYSDEN Top Makefile # #------------------------------------------------------------------------ SHELL = /bin/sh TOPDIR = $(CURDIR) TCL_INDEX = $(TOPDIR)/util/tcl_index include make.include what: @clear; $(SHELL) make-usage # some varibales ... all: tcl tk mesa togl fftw xcrysden # meschach xcrysden: usage bwidget bindir src-C src-F src-Tcl usage: $(TOPDIR)/docs/xcrysden.1 man $(TOPDIR)/docs/xcrysden.1 | awk 'BEGIN {lprint=0; print "## do not edit changes will be lost (file automatically generated)\n"; } /SYNOPSIS/ { lprint=1; } /SEE ALSO/ { lprint=0; } /a*/ { if (lprint) print; }' > usage check-make-sys: @if test ! -f Make.sys ; then \ echo ""; \ echo " First copy an appropriate system/Make.* file to ./Make.sys "; \ echo " and edit it to suit your needs."; \ echo ""; exit 1; fi help: @. make-usage bindir: if test ! -d bin ; then mkdir bin; fi tcl: check-make-sys if test -d external/src ; then \ cd external/src; $(MAKE) "TOPDIR=$(TOPDIR)" tcl; \ fi tk: check-make-sys if test -d external/src ; then \ cd external/src; $(MAKE) "TOPDIR=$(TOPDIR)" tk; \ fi togl: check-make-sys if test -d external/src ; then \ cd external/src; $(MAKE) "TOPDIR=$(TOPDIR)" togl; \ fi mesa: check-make-sys if test -d external/src ; then \ cd external/src; $(MAKE) "TOPDIR=$(TOPDIR)" mesa; \ fi meschach: check-make-sys if test -d external/src ; then \ cd external/src; $(MAKE) "TOPDIR=$(TOPDIR)" meschach; \ fi fftw: check-make-sys if test -d external/src ; then \ cd external/src; $(MAKE) "TOPDIR=$(TOPDIR)" fftw; \ fi bwidget: check-make-sys if test -d external/src ; then \ cd external/src; $(MAKE) "TOPDIR=$(TOPDIR)" bwidget; \ fi src-C: check-make-sys @echo @echo "#------------------------------#" @echo "# #" @echo "# Compiling XCRYSDEN C-code #" @echo "# #" @echo "#------------------------------#" @echo cd C; $(MAKE) "TOPDIR=$(TOPDIR)" compile src-F: check-make-sys @echo @echo "#------------------------------#" @echo "# #" @echo "# Compiling XCRYSDEN F-code #" @echo "# #" @echo "#------------------------------#" @echo cd F/SRC_nn; $(MAKE) "TOPDIR=$(TOPDIR)" cd F/SRC_spaghetti; $(MAKE) "TOPDIR=$(TOPDIR)" cd F; $(MAKE) "TOPDIR=$(TOPDIR)" src-Tcl: @echo @echo "#------------------------------#" @echo "# #" @echo "# Managing XCRYSDEN Tcl-code #" @echo "# #" @echo "#------------------------------#" @echo cd Tcl; $(MAKE) cd Tcl/fs; $(MAKE) tests: if test -x bin/xcrys ; then cd tests; ./make_all_tests.sh; fi # ------------------------------------------------------------------------ # # clean-targets # # ------------------------------------------------------------------------ clean: clean-C clean-F clean-Tcl wrappers_clean cd examples; $(MAKE) clean veryclean: clean clean-bin clean-docs clean-external distclean: veryclean clean-bck if test -f usage; then rm -f usage; fi if test -d external; then cd external; $(MAKE) distclean; fi clean-bck: -rm -f *~ -rm -f */*~ -rm -f */*/*~ -rm -f */*/*/*~ clean-C: check-make-sys cd C; $(MAKE) "TOPDIR=$(TOPDIR)" clean clean-F: check-make-sys -cd F/SRC_nn; $(MAKE) "TOPDIR=$(TOPDIR)" clean -cd F/SRC_spaghetti; $(MAKE) "TOPDIR=$(TOPDIR)" clean -cd F; $(MAKE) "TOPDIR=$(TOPDIR)" clean clean-Tcl: cd Tcl/fs; $(MAKE) clean cd Tcl; $(MAKE) clean clean-bin: if test -d bin/; then \ rm -f bin/*; \ fi clean-docs: if test -d docs/; then \ cd docs; $(MAKE) "TOPDIR=$(TOPDIR)" veryclean; \ fi clean-external: if test -d external/src ; then \ cd external/src ; $(MAKE) "TOPDIR=$(TOPDIR)" clean; \ fi wrappers_clean: for file in $(addsuffix .wrapper,$(PROGS)); do \ if test -f $$file; then rm -f $$file; fi; \ done # ======================================================================== # # here are targets for making various distributions # # ======================================================================== PROGS = xcrysden pwi2xsf pwo2xsf ptable unitconv README_FILES = \ AUTHORS \ COPYING \ COPYRIGHT \ ChangeLog \ NEWS \ README README.cygwin \ THANKS \ otherLICENSES/ IRON_ITEMS = usage version xcrysden IRON_DIRS = \ Awk/ \ Tcl/*.tcl Tcl/tclIndex Tcl/fs/*.tcl Tcl/fs/tclIndex \ Tcl/Xcrysden_resources Tcl/custom-definitions \ contrib/ \ examples/ \ images/ \ scripts/ \ tests/ \ util/ MAN_PAGES = $(addsuffix .1,$(PROGS)) MAN_FILES = $(addprefix docs/,$(MAN_PAGES)) BAT_FILES = xcrysden.bat IRON_FILES = $(IRON_ITEMS) $(IRON_DIRS) $(MAN_FILES) SRC_ONLY_FILES = \ Makefile make-usage make.include \ C/*.c C/*.h C/Makefile C/make-objects C/*.cygwin \ F/*.f F/*.f90 F/*.inc F/Makefile \ F/*/*.f F/*/*.inc F/*/Makefile \ Tcl/Makefile Tcl/fs/Makefile \ docs/Makefile \ sys_utils/*.sh \ system/ \ EXTERNAL_SRC_FILES = external/Makefile external/src/Makefile EXTERNAL_LIB_BWIDGET = external/lib/bwidget-$(BWIDGET_VER) EXTERNAL_LIB_TCLTK = external/lib/tcl$(TCL_VER2) external/lib/tk$(TCL_VER2) external/lib/Togl$(TOGL_VER) EXTERNAL_LIB = external/lib EXTERNAL_SHAREDLIB_FILES = $(wildcard \ external/lib/libtcl$(TCL_VER2).so* external/lib/libtcl$(TCL_VER2).dylib \ external/lib/libtk$(TCL_VER2).so* external/lib/libtk$(TCL_VER2).dylib \ external/lib/libTogl$(TOGL_VER).so* external/lib/libTogl$(TOGL_VER).dylib \ external/lib/libGL.so* external/lib/libGL.*.dylib* \ external/lib/libGLU.so* external/lib/libGLU.*.dylib* \ external/lib/libmeschach.so* external/lib/libmeschach*.dylib* \ external/lib/libfftw3.so* external/lib/libfftw3*.dylib* \ external/lib/libquadmath.so* external/lib/libquadmath.dylib*) EXTERNAL_GFORTRAN_LIB = #EXTERNAL_GFORTRAN_LIB = external/lib/libgfortran.so.$(GFORTRAN_MINOR_VERSION) BIN_FILES = bin/ # ------------------------------------------------------------------------ # # Target for installing system wide: default localtion is /usr/local # To install to different location run as: prefix=XXXXX make iunstall # # ------------------------------------------------------------------------ prefix ?= /usr/local version := $(shell cat version) xcrysden = xcrysden-$(version) install: xcrysden @echo @echo "#-----" @echo "# " @echo "# Installing XCRYSDEN to: $(prefix)" @echo "# " @echo "#-----" @echo install -m755 -d $(prefix)/share/$(xcrysden) cp -a $(IRON_ITEMS) $(prefix)/share/$(xcrysden) \ for subdir in Awk $(EXTERNAL_LIB_BWIDGET) images scripts Tcl util; do \ if test -d $$subdir; then \ install -m755 -d $(prefix)/share/$(xcrysden)/$$subdir; \ cp -a $$subdir/* $(prefix)/share/$(xcrysden)/$$subdir; \ fi; \ done \ if test -d examples; then \ install -m755 -d $(prefix)/share/doc/$(xcrysden)/examples; \ cp -a examples/* $(prefix)/share/doc/$(xcrysden)/examples; \ ln -sf $(prefix)/share/doc/$(xcrysden)/examples $(prefix)/share/$(xcrysden)/examples; \ fi; \ \ install -m755 -d $(prefix)/share/man/man1 install -m644 $(MAN_FILES) $(prefix)/share/man/man1/ gzip -f $(addprefix $(prefix)/share/man/man1/,$(MAN_PAGES)) \ install -m755 -d $(prefix)/lib/$(xcrysden) install -m755 bin/* $(prefix)/lib/$(xcrysden)/ \ prefix=$(prefix) xcrysden=$(xcrysden) sh sys_utils/wrappers.sh if test ! -d $(prefix)/bin; then install -m755 -d $(prefix)/bin; fi for prog in $(PROGS); do \ install -m755 $$prog.wrapper $(prefix)/bin/$$prog; \ done #------------------------------------------------------------------------ # # SOURCE-distributions # #------------------------------------------------------------------------ srcdist: clean-bck src-Tcl usage _src-dist #------------------------------------------------------------------------ # # BINARY (i.e. precompiled) distributions # #------------------------------------------------------------------------ bindist: bindist-shared; # the default bindist is shared bindist-static: clean-bck xcrysden _bin-dist-static bindist-shared: clean-bck xcrysden _bin-dist-fully-shared bindist-semishared: clean-bck xcrysden _bin-dist-semishared # # sorce distribution # _src-dist: tar -cvf xcrysden.tar $(README_FILES) $(IRON_FILES) $(BAT_FILES) $(SRC_ONLY_FILES) $(EXTERNAL_SRC_FILES) sys_utils/xcRepackage.sh $(TOPDIR) xcrysden.tar # # statically linked binary distribution (with external/lib/tcl/ and external/lib/tk/) # _bin-dist-static: tar -cvf xcrysden.tar $(README_FILES) $(IRON_FILES) $(EXTERNAL_LIB_BWIDGET) $(EXTERNAL_LIB_TCLTK) $(BIN_FILES) sys_utils/xcRepackage.sh $(TOPDIR) xcrysden.tar bin-static # shared linked distribution without shared libs _bin-dist-fully-shared: if test -f $(EXTERNAL_GFORTRAN_LIB); then \ tar -cvf xcrysden.tar $(README_FILES) $(IRON_FILES) $(EXTERNAL_LIB_BWIDGET) $(BIN_FILES) $(EXTERNAL_GFORTRAN_LIB); \ else \ tar -cvf xcrysden.tar $(README_FILES) $(IRON_FILES) $(EXTERNAL_LIB_BWIDGET) $(BIN_FILES); fi sys_utils/xcRepackage.sh $(TOPDIR) xcrysden.tar bin-shared # semi-shared linked distribution with shared libs in external/lib _bin-dist-semishared: -tar -cvf xcrysden.tar \ $(README_FILES) $(IRON_FILES) $(EXTERNAL_LIB_BWIDGET) $(EXTERNAL_LIB_TCLTK) $(EXTERNAL_SHAREDLIB_FILES) $(BIN_FILES); \ status=$$?; \ if test $$status -gt 0; then \ tar -cvf xcrysden.tar \ $(README_FILES) $(IRON_FILES) $(EXTERNAL_LIB) $(BIN_FILES); \ fi sys_utils/xcRepackage.sh $(TOPDIR) xcrysden.tar bin-semishared xcrysden-1.6.2/xcrysden0000755000175000017500000002162413556022163013650 0ustar tonetone#!/bin/sh -f ############################################################################## # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3822 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Copyright (c) 1996--2019 by Anton Kokalj # ############################################################################## # set locales to C LANG=C LC_ALL=C export LANG LC_ALL unset MALLOC_CHECK_; # Lorenzo's suggestion ! XLIB_SKIP_ARGB_VISUALS=1 export XLIB_SKIP_ARGB_VISUALS; # Martin's Kroeker suggestion if test "x`which readlink`" = "x"; then # no readlink cmd; make a function-substitute readlink_f() { file=`ls -l "$1" | awk '{print $NF}'` while test -h "$file"; do file=`ls -l "$file" | awk '{print $NF}'` done echo $file } else readlink_f() { readlink -f "$1" if test $? -gt 0; then # seems readlink does not support -f option file=`readlink "$1"` while test -h "$file"; do file=`readlink "$file"` done echo $file fi } fi pathname() { file=`which "$1"` if test $? -gt 0; then file=`type "$1"` if test $? -gt 0; then # give-up file="$1" else file=`echo $file | awk 'BEGIN {FS="is "} {print $NF}'` fi fi echo $file } pathdir() { file=`pathname "$1"` while test -h "$file"; do file=`readlink_f "$file"` done dir=`dirname "$file"` ( cd $dir; pwd ) } is_writeable() { # check if the directory exist and is writeable result=0 if test -d "$1"; then if test -w "$1"; then result=1 fi fi echo $result } if test -z "$XCRYSDEN_TOPDIR"; then # XCRYSDEN_TOPDIR does not exists, guess it from the process export XCRYSDEN_TOPDIR=`pathdir "$0"` fi if test -z "$XCRYSDEN_SCRATCH"; then # XCRYSDEN_SCRATCH does not exist, find a suitable place tmp=/tmp for dir in $TEMP $TMP $TEMPDIR $TMPDIR do if test ! -z "$dir"; then if test `is_writeable "$dir"`; then tmp=$dir fi fi done export XCRYSDEN_SCRATCH=$tmp fi if test \( "$1" = "-h" \) -o \( "$1" = "--help" \) ; then cat "$XCRYSDEN_TOPDIR/usage" | awk 'BEGIN {lprint=0;} /a*/ { if (lprint) print; } /## do not edit/ { lprint=1; }' exit 0 fi ver=`cat "$XCRYSDEN_TOPDIR/version"` if test \( "$1" = "-v" \) -o \( "$1" = "--version" \) ; then echo "XCrySDen version: $ver" exit 0 fi # ------------------------------------------------------------------------ # parse the following options: -d -t -T # ------------------------------------------------------------------------ valgrind=0 debug=0 USE="" for opt in "$@" do case $opt in -d|--debug) debug=1; shift;; -m|--valgrding) valgrind=1; shift;; -t|--trace) XCRYSDEN_TRACE=1; export XCRYSDEN_TRACE; shift;; -T|--fulltrace) XCRYSDEN_FULLTRACE=1; export XCRYSDEN_FULLTRACE; shift;; -u|--use) shift; USE="-use $1"; shift;; esac done if test \( $debug -eq 1 \) -a \( $valgrind -eq 1 \) ; then echo " XCRYSDEN: cannot use \"-d\" and \"-m\" options simultaneously !!! " exit 1 fi if test ! -d "$XCRYSDEN_SCRATCH" ; then mkdir "$XCRYSDEN_SCRATCH" fi # # handle STDIN !!! # if test \( $# -eq 1 \) -a \( "$1" = "-" \) ; then # # read XSF from stdin # cat - > "$XCRYSDEN_SCRATCH/STDIN.$$" ARGS="--xsf $XCRYSDEN_SCRATCH/STDIN.$$" elif test \( $# -eq 2 \) -a \( "$2" = "-" \) ; then # # read from STDIN (all formats) # cat - > "$XCRYSDEN_SCRATCH/STDIN.$$" ARGS="$1 $XCRYSDEN_SCRATCH/STDIN.$$" fi echo " +-----------------------------------------------------------------+ |*****************************************************************| |* *| |* XCrySDen -- (X-Window) CRYstalline Structures and DENsities *| |* = === = === *| |*---------------------------------------------------------------*| |* *| |* Anton Kokalj (tone.kokalj@ijs.si) *| |* Jozef Stefan Institute, Ljubljana, Slovenia *| |* *| |* Copyright (c) 1996--2019 by Anton Kokalj *| |* *| |*****************************************************************| +-----------------------------------------------------------------+ Version: $ver Please report bugs to: tone.kokalj@ijs.si TERMS OF USE: ------------- XCRYSDEN is released under the GNU General Public License. Whenever graphics generated by XCRYSDEN are used in scientific publications, it shall be greatly appreciated to include an explicit reference. The preferred form is the following: [ref] A. Kokalj, J. Mol. Graph. Model., Vol. 17, pp. 176-179, 1999. Code available from http://www.xcrysden.org/. " # # create SIGNAL HANDLER # . "$XCRYSDEN_TOPDIR/scripts/xcLib.sh" trap 'xcSignalHandler XCrySDen 1' 1 trap 'xcSignalHandler XCrySDen 2' 2 trap 'xcSignalHandler XCrySDen 3' 3 trap 'xcSignalHandler XCrySDen 15' 15 if test -d "$XCRYSDEN_TOPDIR/external/lib" ; then if test -z "${LD_LIBRARY_PATH}"; then LD_LIBRARY_PATH="$XCRYSDEN_TOPDIR/external/lib" else LD_LIBRARY_PATH="$XCRYSDEN_TOPDIR/external/lib:$LD_LIBRARY_PATH" fi export LD_LIBRARY_PATH if test -z "${DYLD_LIBRARY_PATH}"; then DYLD_LIBRARY_PATH="$XCRYSDEN_TOPDIR/external/lib" else DYLD_LIBRARY_PATH="$XCRYSDEN_TOPDIR/external/lib:$DYLD_LIBRARY_PATH" fi export DYLD_LIBRARY_PATH fi for tcl_version in 8.6 8.5 8.4; do if test -f "$XCRYSDEN_TOPDIR/external/lib/tcl$tcl_version/init.tcl" ; then export TCL_LIBRARY=$XCRYSDEN_TOPDIR/external/lib/tcl$tcl_version echo "TCL_LIBRARY=$TCL_LIBRARY" break fi done #### if test ! -z "$XCRYSDEN_LIB_BINDIR"; then XCRYSDEN_XCRYS_DIR=$XCRYSDEN_LIB_BINDIR else XCRYSDEN_XCRYS_DIR=$XCRYSDEN_TOPDIR/bin fi #### if test $debug -eq 1; then ldd "$XCRYSDEN_XCRYS_DIR/xcrys" fi printenv | grep XCRYSDEN_TOPDIR printenv | grep XCRYSDEN_SCRATCH echo "" if test $valgrind -eq 0 ; then if test $debug -eq 0 ; then if test -f "${XCRYSDEN_XCRYS_DIR}/xcrys.dll" ; then # CYGWIN: xcrys.dll will be loaded from xcInit.tcl !!! if test "x$ARGS" != x; then exec wish "${XCRYSDEN_TOPDIR}/Tcl/xcInit.tcl" $USE -- \ "$XCRYSDEN_TOPDIR" "$XCRYSDEN_SCRATCH" $ARGS > /dev/null & else exec wish "${XCRYSDEN_TOPDIR}/Tcl/xcInit.tcl" $USE -- \ "$XCRYSDEN_TOPDIR" "$XCRYSDEN_SCRATCH" "$@" > /dev/null & fi else # testing if test "x$ARGS" != x; then "${XCRYSDEN_XCRYS_DIR}/xcrys" \ "${XCRYSDEN_TOPDIR}/Tcl/xcInit.tcl" $USE -- \ "$XCRYSDEN_TOPDIR" "$XCRYSDEN_SCRATCH" $ARGS > /dev/null & else "${XCRYSDEN_XCRYS_DIR}/xcrys" \ "${XCRYSDEN_TOPDIR}/Tcl/xcInit.tcl" $USE -- \ "$XCRYSDEN_TOPDIR" "$XCRYSDEN_SCRATCH" "$@" > /dev/null & fi wait $! fi else # # DEBUGGING ... # XCRYSDEN_DEBUG=1 export XCRYSDEN_DEBUG DBGFILE=`mktemp -t gdb-XXXXXX` echo "" > $DBGFILE if test -f BREAKS ; then cat BREAKS > $DBGFILE fi echo "" >> $DBGFILE echo "run $XCRYSDEN_TOPDIR/Tcl/xcInit.tcl $XCRYSDEN_TOPDIR $XCRYSDEN_SCRATCH \\" >> $DBGFILE if test "x$ARGS" != x; then echo "$ARGS" >> $DBGFILE else echo "$@" >> $DBGFILE fi if test -f "${XCRYSDEN_XCRYS_DIR}/xcrys.dll" ; then # CYGWIN: I couldn't get debugging running under cygwin (t.k.) echo "Ups, debugging does not yet work under CYGWIN !!!" exit 1 else gdb "$XCRYSDEN_XCRYS_DIR/xcrys" -x $DBGFILE fi fi else if test -f "${XCRYSDEN_XCRYS_DIR}/xcrys.dll" ; then # CYGWIN: xcrys.dll will be loaded from xcInit.tcl !!! echo " WARNING: don't know how to use valgrind on CYGWIN !!! " exit 1 else # # VALGRIND (i.e. memory checking) !!! # # --leak-check=full if test "x$ARGS" != x; then valgrind --leak-check=full "${XCRYSDEN_XCRYS_DIR}/xcrys" \ "${XCRYSDEN_TOPDIR}/Tcl/xcInit.tcl" $USE -- \ "$XCRYSDEN_TOPDIR" "$XCRYSDEN_SCRATCH" $ARGS > /dev/null & else valgrind --leak-check=full "${XCRYSDEN_XCRYS_DIR}/xcrys" \ "${XCRYSDEN_TOPDIR}/Tcl/xcInit.tcl" $USE -- \ "$XCRYSDEN_TOPDIR" "$XCRYSDEN_SCRATCH" $@ > /dev/null & fi wait $! fi fi if test -f "$PWD/core" ; then rm -f core fi exit 0 xcrysden-1.6.2/Tcl/0000755000175000017500000000000013556022211012572 5ustar tonetonexcrysden-1.6.2/Tcl/movieMaker.tcl0000644000175000017500000002207513514344473015416 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/movieMaker.tcl # ------ # # Copyright (c) 2008 by Anton Kokalj # ############################################################################# proc MovieMaker {togl} { global movieMaker xcMisc if { ![info exists xcMisc(gif_encoder)] && ![info exists xcMisc(movie_encoder)] } { # at least one of encoder must exist to create movies return } if { ! [info exists movieMaker(mode)] } { set movieMaker(mode) realtime } if { ! [info exists movieMaker(fps)] } { set movieMaker(fps) 20 } if { ! [info exists movieMaker(count)] } { set movieMaker(count) 0 } if { ! [info exists movieMaker(recording_text)] } { set movieMaker(recording_text) "Start recording" } set c [lindex [split $togl .] end] if { [info exists .movie$c] } { return } # toplevel set t [xcToplevel .movie$c "Movie Maker" "Movie" . -0 0 1] bind $t {movieMaker_close %W} set movieMaker(tplw) $t set movieMaker(togl) $togl set movieMaker(recording) 0 # this is for "Hide" button global unmapWin xcRegisterUnmapWindow $t $unmapWin(frame,main) movie \ -textimage {MovieMaker unmap} bind $t [list xcUnmapWindow unmap %W $t $unmapWin(frame,main) movie] bind $t [list xcUnmapWindow map %W $t $unmapWin(frame,main) movie] # container frames set f1 [labelframe $t.f1 -text "Movie creation mode:"] set f2 [labelframe $t.f2 -text "Movie encoding options:"] set f3 [frame $t.f3] set movieMaker(f1) $f1 set movieMaker(f2) $f2 set movieMaker(f3) $f3 pack $f1 -side top -expand 1 -fill x -padx 2m -pady 2m -ipadx 2m -ipady 2m pack $f2 -side top -expand 1 -fill x -padx 2m -ipadx 5m -ipady 2m pack $f3 -side top pack [set movieMaker(mode_frame) [frame $f1.f]] -side top -expand 1 -fill x -padx 0 -pady 0 -ipadx 0 -ipady 0 # mode radiobuttons foreach text { "real-time capture" "capture every redisplay" "manual" } value { realtime everysnapshot manual } { radiobutton $f1.f.$value -text $text -variable movieMaker(mode) -value $value -anchor w pack $f1.f.$value -side top -padx 5 -pady 0 -fill x -expand 1 } set movieMaker(fps_entryframe) [frame $f1.fe] set movieMaker(buttonframe) [frame $f1.bf] pack $f1.fe -side top -expand 1 -fill x -padx 5 pack $f1.bf -side top -expand 1 -fill x -padx 5 # frequency entry for real-time-capture label $f1.fe.fpsl -text "Real-time capture frequency (frames per second):" -anchor w entry $f1.fe.fpse -relief sunken -textvariable movieMaker(fps) -width 5 pack $f1.fe.fpsl -side left -padx 5 pack $f1.fe.fpse -side left -fill x -expand 1 # buttons set movieMaker(startstop_button) [button $f1.bf.startstop -textvariable movieMaker(recording_text) -command movieMaker_recording_] set movieMaker(startstop_button_bg) [$f1.bf.startstop cget -background] set movieMaker(snapshot_button) [button $f1.bf.snap -image snapshot -command movieMaker_frame] pack $movieMaker(startstop_button) $movieMaker(snapshot_button) -side left -pady 3 -padx 3 # Animated GIF/MPEG/AVI control widgets (from gifAnim.tcl) gifAnim_controlWidgets $f2 $togl # movieMaker_mode_ trace add variable movieMaker(mode) write movieMaker_mode_ # Close/Hide widgets set hide [button $f3.hide -text "Hide" -default active -command [list HideWin $t movie]] set close [button $f3.close -text "Close" -command [list movieMaker_close $t]] pack $hide $close -side left -ipadx 1m -ipady 1m -padx 2m -pady 2m xcUpdateState } proc movieMaker_frame {} { global movieMaker if { ! [info exists movieMaker(count)] } { set movieMaker(count) 0 } incr movieMaker(count) scripting::makeMovie::makeFrame } proc movieMaker_end {} { global movieMaker if { $movieMaker(mode) != "manual" } { global gifAnim set gifAnim(filelist) [xc_realtimemovie $movieMaker(togl) filelist] xc_realtimemovie $movieMaker(togl) end if { $movieMaker(mode) == "realtime" } { $movieMaker(togl) configure -time $movieMaker(togl_timedelay) } } scripting::makeMovie::end set movieMaker(count) 0 } proc movieMaker_manual {} { global movieMaker set movieMaker(mode) "manual" scripting::makeMovie::begin } proc movieMaker_realTimeCapture {{ms 50}} { global movieMaker gifAnim system scripting::makeMovie::begin set gifAnim(frame_files_format) PPM set movieMaker(mode) "realtime" set movieMaker(togl_timedelay) [lindex [$movieMaker(togl) configure -time] end] if { $gifAnim(temp_files_dir) == "pwd" } { set dir $system(PWD) } else { set dir $system(SCRDIR) } $movieMaker(togl) configure -time $ms puts stderr "xc_realtimemovie $movieMaker(togl) begin realtime $dir" xc_realtimemovie $movieMaker(togl) begin realtime $dir } proc movieMaker_everySnapshot {} { global movieMaker gifAnim system scripting::makeMovie::begin set gifAnim(frame_files_format) PPM set movieMaker(mode) "everysnapshot" if { $gifAnim(temp_files_dir) == "pwd" } { set dir $system(PWD) } else { set dir $system(SCRDIR) } xc_realtimemovie $movieMaker(togl) begin everysnapshot $dir } proc movieMaker_mode_ {args} { global movieMaker gifAnim switch -glob -- $movieMaker(mode) { everysnap* { xcDisableAll $movieMaker(fps_entryframe) $movieMaker(snapshot_button) $gifAnim(radio_frame,3) movieMaker_destroy_manualWidgets_ set gifAnim(frame_files_format) PPM } realtime* { xcDisableAll $movieMaker(snapshot_button) $gifAnim(radio_frame,3) xcEnableAll $movieMaker(fps_entryframe) movieMaker_destroy_manualWidgets_ set gifAnim(frame_files_format) PPM } manual { xcDisableAll $movieMaker(fps_entryframe) xcEnableAll $gifAnim(radio_frame,3) _mencoder_temporary_files if { $movieMaker(recording) } { xcEnableAll $movieMaker(snapshot_button) if { ! [winfo exists $movieMaker(togl).snap] } { button $movieMaker(togl).snap -image snapshot -command movieMaker_frame pack $movieMaker(togl).snap -side left -expand 0 -fill none -padx 0 -pady 0 -ipadx 0 -ipady 0 -anchor nw } if { ! [winfo exists $movieMaker(buttonframe).frame] } { pack [label $movieMaker(buttonframe).frame -textvariable movieMaker(count)] -side right -padx 2 pack [label $movieMaker(buttonframe).label -text "No. of recorded frames: "] -side right -padx 2 } } else { xcDisableAll $movieMaker(snapshot_button) movieMaker_destroy_manualWidgets_ } } } } proc movieMaker_destroy_manualWidgets_ {} { global movieMaker if { [winfo exists $movieMaker(togl).snap] } { destroy $movieMaker(togl).snap } if { [winfo exists $movieMaker(buttonframe).frame] } { destroy $movieMaker(buttonframe).label $movieMaker(buttonframe).frame } } proc movieMaker_recording_ {} { global movieMaker if { ! $movieMaker(recording) } { # start recording set movieMaker(recording) 1 set movieMaker(recording_text) "Stop recording" $movieMaker(startstop_button) config -background \#ff4444 xcDisableAll $movieMaker(mode_frame) movieMaker_mode_ switch -glob -- $movieMaker(mode) { everysnap* { movieMaker_everySnapshot } realtime* { set ms [expr round(1.0 / $movieMaker(fps) * 1000)] puts stderr "fps = $movieMaker(fps) ; ms = $ms" movieMaker_realTimeCapture $ms } manual { movieMaker_manual } } } else { # stop recording movieMaker_end set movieMaker(recording) 0 set movieMaker(recording_text) "Start recording" $movieMaker(startstop_button) config -background $movieMaker(startstop_button_bg) xcEnableAll $movieMaker(mode_frame) movieMaker_mode_ } } proc movieMaker_clear {} { global movieMaker movie set movieMaker(count) 0 set movieMaker(recording) 0 if { [info exists ::scripting::makeMovie::movie(notificationMovie)] } { if { [winfo exists $::scripting::makeMovie::movie(notificationMovie)] } { destroy $::scripting::makeMovie::movie(notificationMovie) } } xc_realtimemovie $movieMaker(togl) clear movieMaker_destroy_manualWidgets_ } proc movieMaker_close {t} { movieMaker_clear set movieMaker(tplw) {} destroy $t xcUpdateState } xcrysden-1.6.2/Tcl/popupMenu.tcl0000644000175000017500000000430611712736221015276 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/popupMenu.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc popupMenu {W x y} { if { [winfo exists $W.menu] } { destroy $W.menu } set m [menu $W.menu -tearoff 0] tk_popup $m $x $y popupMenu:popup $m $W } proc popupMenu:popup {m w} { $m add cascade -image colors -menu $m.vmcolor $m add cascade -label "File" -menu $m.vmfile $m add cascade -label "Display" -menu $m.vmdis $m add cascade -label "Modify" -menu $m.vmmod $m add cascade -label "AdvGeom" -menu $m.vmadvg $m add cascade -label "Properties" -menu $m.vmpro $m add cascade -label "Tools" -menu $m.vmdat $m add cascade -label "Help" -menu $m.vmhelp $m add separator $m add command -label "Exit" -command exit_pr ######################################################################## set mcolor [menu $m.vmcolor -tearoff 0] set mfile [menu $m.vmfile -tearoff 0] set mmod [menu $m.vmmod -tearoff 0] set mdis [menu $m.vmdis -tearoff 0] set madvg [menu $m.vmadvg -tearoff 0] set mpro [menu $m.vmpro -tearoff 0] set mdat [menu $m.vmdat -tearoff 0] set mhelp [menu $m.vmhelp -tearoff 0] mainMenu $w $mcolor $mfile $mmod $mdis $madvg $mpro $mdat $mhelp update xcUpdateState $m {} } xcrysden-1.6.2/Tcl/propertyPlane.tcl0000644000175000017500000005167513522564363016174 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/propertyPlane.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc IsoControl2D {} { global isosurf nxdir nydir nzdir periodic xcFonts XCTrace prop \ isoControl unmapWin if { [winfo exists .iso2D] } { return } # # initializations # set isoControl(plane) {} set isoControl(datagridDim) 2 set isoControl(colorplane) 1 set isoControl(isoline) 1 IsoControl_InitVar reloadButtonDisable set t [xcToplevel .iso2D \ "Property-plane Controls" "Property-PlaneControls" . -0 0 1] xcRegisterUnmapWindow $t $unmapWin(frame,main) \ isosurf_control -image unmap-isosurf bind $t [list xcUnmapWindow unmap %W $t \ $unmapWin(frame,main) isosurf_control] bind $t [list xcUnmapWindow map %W $t \ $unmapWin(frame,main) isosurf_control] ######################## ### ColorPLANE frame ### ######################## set f0 [frame $t.f0 -relief raised -bd 2] frame $f0.1 -relief groove -bd 2 pack $f0 -side top -fill both -expand 1 pack $f0.1 -padx 2 -pady 5 -ipady 3 -fill x scale $f0.1.sc -from 1 -to 5 -length 100 \ -variable isosurf(3Dinterpl_degree) -orient horizontal \ -label "Degree of biCubic Spline:" \ -tickinterval 1 -resolution 1 \ -width 7 -sliderlength 20 \ -showvalue true \ -font $xcFonts(small) pack $f0.1.sc -side top -padx 2 -pady 5 -fill both -expand 1 set f1 [frame $t.f1 -relief raised -bd 2] frame $f1.1 -relief groove -bd 2 set f11 [frame $f1.1.f1] set f12 [frame $f1.1.f2] xcMenuEntry $f11 "Select color basis:" 30 \ isoControl(cpl_basis) {MONOCHROME RAINBOW RGB GEOGRAPHIC BLUE-WHITE-RED BLACK-BROWN-WHITE} \ -labelwidth 17 \ -labelfont $xcFonts(small) \ -entryfont $xcFonts(small_entry) \ -labelanchor w xcMenuEntry $f12 "Select scale function:" 30 \ isoControl(cpl_function) \ {LINEAR LOG10 SQRT 3th-ROOT EXP(x) EXP(x^2)} \ -labelwidth 17 \ -labelfont $xcFonts(small) \ -entryfont $xcFonts(small_entry) \ -labelanchor w pack $f1 -side top -fill both -expand 1 pack $f1.1 -padx 2 -pady 5 -ipady 3 -fill x pack $f11 $f12 -side top -in $f1.1 -fill x # # DISPLAY/RANGES/EXPAND/ISOLINE # set f2 [frame $t.f2 -relief raised -bd 2] pack $f2 -side top -fill both -expand 1 IsoControl_DispRanExpIso $f2 ######################################## # BOTTOM FRAME set f3 [frame $t.f3 -relief raised -bd 2] pack $f3 -side top -fill x -expand 1 set hid [button $f3.hid -text "Hide" \ -command [list IsoControl_Hide $t]] set can [button $f3.can -text "Close" \ -command [list IsoControlCan $t 2]] set sav [button $f3.sav -text "Save Grid" \ -command IsoControlSave] set sub [button $f3.sub -text "Submit" \ -command UpdatePropertyPlane] pack $hid $can $sav $sub -side left -pady 5 -expand 1 } proc IsoControl_DispRanExpIso f { global isosurf nxdir nydir nzdir periodic xcFonts XCTrace prop \ isoControl xcColors set f11 [frame $f.1] pack $f11 -side top -fill both -expand 1 -padx 4 -pady 8 set mfb [frame $f11.mfb] set mf [frame $f11.mf -relief raised -bd 2] pack $mfb $mf -side top -padx 2 -fill both -expand 1 set df [frame $mf.d -relief groove -bd 2] set rf [frame $mf.r -relief groove -bd 2] set ef [frame $mf.e -relief groove -bd 2] set ifr [frame $mf.i] set d [button $mfb.d -text "Display" \ -highlightthickness 0 -bd 1 \ -command [list IsoControl_IsoLineShow display \ $mfb.d $mfb.r $mfb.e $mfb.i \ $df $rf $ef $ifr]] set r [button $mfb.r -text "Ranges" \ -highlightthickness 0 -bd 1 \ -command [list IsoControl_IsoLineShow ranges \ $mfb.d $mfb.r $mfb.e $mfb.i \ $df $rf $ef $ifr]] set e [button $mfb.e -text "Expand" \ -highlightthickness 0 -bd 1 \ -command [list IsoControl_IsoLineShow expand \ $mfb.d $mfb.r $mfb.e $mfb.i\ $df $rf $ef $ifr]] set i [button $mfb.i -text "Isoline" \ -highlightthickness 0 -bd 1 \ -command [list IsoControl_IsoLineShow isoline \ $mfb.d $mfb.r $mfb.e $mfb.i\ $df $rf $ef $ifr]] if { $periodic(dim) == 0 } { $e config -state disabled } pack $d $r $e $i -side left -padx 0 -pady 0 -fill both -expand 1 IsoControl_IsoLineShow display $mfb.d $mfb.r $mfb.e $mfb.i \ $df $rf $ef $ifr # # DISPLAY # set l [label $df.l -text "Property-plane display option:"] set lfont [ModifyFont [$df.l cget -font] $df.l -underline 1] $l configure -font $lfont set ck1 [checkbutton $df.c1 \ -text "display color-plane" \ -variable isoControl(colorplane) \ -width 21 \ -anchor w] set ck2 [checkbutton $df.c2 \ -text "display isolines" \ -variable isoControl(isoline) \ -width 21 \ -anchor w] set ck3 [checkbutton $df.c3 \ -text "lighting of color-plane" \ -variable isoControl(colorplane_lighting) \ -width 21 \ -onvalue 1 \ -offvalue 0 \ -anchor w] set ck4 [checkbutton $df.c4 \ -text "transparent color-plane" \ -variable isoControl(cpl_transparency) \ -width 21 \ -onvalue 1 -offvalue 0 \ -anchor w] set ck5 [checkbutton $df.c5 \ -text "display thermometer" \ -variable isoControl(cpl_thermometer) \ -width 21 \ -onvalue 1 -offvalue 0 \ -anchor w] set ck6 [checkbutton $df.c6 \ -text "thermometer in toplevel" \ -variable isoControl(cpl_thermoTplw) \ -width 21 \ -onvalue 1 -offvalue 0 \ -anchor w] set thermo [frame $df.f] grid configure $l -column 0 -row 0 -columnspan 2 grid configure $ck1 -column 0 -row 1 grid configure $ck4 -column 0 -row 2 grid configure $ck2 -column 1 -row 1 grid configure $ck3 -column 1 -row 2 grid configure $ck5 -column 0 -row 3 grid configure $ck6 -column 1 -row 3 grid configure $thermo -column 0 -row 4 -columnspan 2 # thermometer-widgets set tf1 [frame $thermo.1 -relief groove -bd 2] set tf11 [frame $tf1.1] set tf12 [frame $tf1.2] label $tf11.__l -text "Thermometer settings:" -anchor w pack $tf11.__l -side top -fill x FillEntries $tf11 { "Format string:" "Label:" "No. of tics:" } { isoControl(cpl_thermoFmt) isoControl(cpl_thermoLabel) isoControl(cpl_thermoNTics) } 14 20 button $tf12.font -text "Set Font" -command isoControl_thermoFont pack $tf1 -side top -fill both -expand 1 -padx 5 -pady 5 pack $tf11 $tf12 -side left -fill x -expand 1 -padx 5 -pady 5 pack $tf12.font -side top -fill x -expand 1 # # RANGES # set frame_color [lindex \ [GetWidgetConfig frame -background] end] FillEntries $rf {"Minimum 3D grid value:"} \ isosurf(minvalue) \ 25 9 top left \ -e_relief flat -e_state disabled -e_bg $frame_color \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry) FillEntries $rf {"Maximum 3D grid value:"} \ isosurf(maxvalue) \ 25 9 top left \ -e_relief flat -e_state disabled -e_bg $frame_color \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry) set isoControl(2Dlowvalue_entry) [FillEntries $rf \ {"Lowest rendered value:"} isoControl(2Dlowvalue) \ 25 9 top left \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry)] set isoControl(2Dhighvalue_entry) [FillEntries $rf \ {"Highest rendered value:"} isoControl(2Dhighvalue) \ 25 9 top left \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry)] set isoControl(2Dnisoline_entry) [FillEntries $rf \ {"Number of isolines:"} \ isoControl(2Dnisoline) \ 25 9 top left \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry)] # # EXPAND # set f21 [frame $ef.top] set f22 [frame $ef.bot] pack $f21 $f22 -side top -fill both -expand 1 set enable "\ $f22.scX configure -foreground $xcColors(enabled_fg); \ $f22.scY configure -foreground $xcColors(enabled_fg); \ $f22.scZ configure -foreground $xcColors(enabled_fg)" set disable " \ $f22.scX configure -foreground $xcColors(disabled_fg); \ $f22.scY configure -foreground $xcColors(disabled_fg); \ $f22.scZ configure -foreground $xcColors(disabled_fg)" if { $periodic(dim) > 0 } { label $f21.l -text "Expand Property-plane:" -relief flat $f21.l configure -font $lfont set r1 [radiobutton $f21.r1 \ -text "do not expand" \ -variable isosurf(2Dexpand) \ -value "none" \ -anchor w \ -font $xcFonts(small) \ -command "xcDisableAll $f22; catch {eval $disable}"] set r2 [radiobutton $f21.r2 \ -text "to whole structure" \ -variable isosurf(2Dexpand) \ -value "whole" \ -anchor w \ -font $xcFonts(small) \ -command "xcDisableAll $f22; catch {eval $disable}"] set r3 [radiobutton $f21.r3 \ -text "separately in each direction" \ -variable isosurf(2Dexpand) \ -value "specify" \ -anchor w \ -font $xcFonts(small) \ -command "xcEnableAll $f22; catch {eval $enable}"] set XCTrace(2DscX) [scale $f22.scX -from 1 -to $nxdir -length 100 \ -variable isosurf(2Dexpand_X) -orient horizontal \ -label "repeat in X-dir:" -tickinterval 1 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20] # TRACE -- nxdir trace variable nxdir w xcTrace pack $XCTrace(2DscX) -side left -pady 5 -expand 1 -fill x if { $periodic(dim) > 1} { set XCTrace(2DscY) [scale $f22.scY -from 1 -to $nydir \ -length 100 \ -variable isosurf(2Dexpand_Y) -orient horizontal \ -label "repeat in Y-dir:" -tickinterval 1 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20] # TRACE -- nydir trace variable nydir w xcTrace pack $XCTrace(2DscY) -side left -pady 5 -expand 1 -fill x } if { $periodic(dim) > 2 } { set XCTrace(2DscZ) [scale $f22.scZ -from 1 -to $nzdir \ -length 100 \ -variable isosurf(2Dexpand_Z) -orient horizontal \ -label "repeat in Z-dir:" -tickinterval 1 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20] # TRACE -- nzdir trace variable nzdir w xcTrace pack $XCTrace(2DscZ) -side left -pady 5 -expand 1 -fill x } # get correct state for EXPAND options if { $isosurf(2Dexpand) == "none" || $isosurf(2Dexpand) == "whole" } { xcDisableAll $f22; catch {eval $disable} } else { xcEnableAll $f22; catch {eval $enable} } pack $f21.l -side top -expand 1 pack $r1 $r2 $r3 -side top -fill x } # # Isoline # set mf1 [frame $ifr.1 -relief groove -bd 2] set mf2 [frame $ifr.2 -relief groove -bd 2] set mf3 [frame $ifr.3 -relief groove -bd 2] pack $mf1 $mf2 $mf3 -side top -expand 1 -fill both -padx 3 -pady 3 set isoControl(bmc) [button $mf1.b -text "set color" \ -command IsoControl_SetIsolineColor] RadioButVarCmd $mf1 "Isoline Color:" isoControl(isoline_color) \ IsoControl_IsolineColor left top 0 0 \ {monocolor} {property color} pack $isoControl(bmc) -side left -padx 2 RadioBut $mf2 "Isoline Stipple:" isoControl(isoline_stipple) left top 0 1 \ {no stipple} {stipple negative} {full stipple} # this is temporal, since "Isoline Stipple" is not yet working xcDisableAll $mf2 # here goes isoline_width entry set isoControl(2Disolinewidth_entry) [FillEntries $mf3 \ {"Isoline width:"} \ isoControl(isoline_width) \ 14 10 left left] } proc UpdatePropertyPlane {{var {}}} { global prop isosurf periodic isosign isodata isosurf_struct \ isoControl isoControl_struct vec dif_isosurf SetWatchCursor if { ![check_var { {isoControl(2Dlowvalue) real} {isoControl(2Dhighvalue) real} {isoControl(2Dnisoline) posint} {isoControl(isoline_width) posint} } [list \ $isoControl(2Dlowvalue_entry) \ $isoControl(2Dhighvalue_entry) \ $isoControl(2Dnisoline_entry) \ $isoControl(2Disolinewidth_entry)]] } { ResetCursor return } if { $isoControl(2Dnisoline) > $isoControl(max_allowed_2Dnisoline) } { tk_dialog [WidgetName] WARNING "WARNING: more then $isoControl(max_allowed_2Dnisoline) isolines was requested; Maximum number is $isoControl(max_allowed_2Dnisoline) !!! Setting number of isolines to $isoControl(max_allowed_2Dnisoline)" \ warning 0 OK set isoControl(2Dnisoline) $isoControl(max_allowed_2Dnisoline) } if { $isoControl(cpl_basis) == {} } { tk_dialog [WidgetName] ERROR "ERROR: You forgot to specify color basis. Please Do it !" error 0 OK ResetCursor return } if { $isoControl(cpl_function) == {} } { tk_dialog [WidgetName] ERROR "ERROR: You forgot to specify scale function. Please Do it !" error 0 OK ResetCursor return } ################################### # this is needed if spin is changed set upd 0; if { $isosurf_struct(isosign) != $isosign || \ $isosurf_struct(isodata) != $isodata || \ $isosurf_struct(spin) != $isosurf(spin) } { SetXC_Iso 2D eval $isosign xc_iso end isosign eval $isodata xc_isodata make set upd 1 } if { $isosurf_struct(3Dinterpl_degree) != $isosurf(3Dinterpl_degree) } { xc_iso interpolate $isosurf(3Dinterpl_degree) set upd 1 } if { \ $isoControl_struct(cpl_basis) != $isoControl(cpl_basis) || \ $isoControl_struct(cpl_function) != $isoControl(cpl_function) || \ $isoControl_struct(colorplane) != $isoControl(colorplane) || \ $isoControl_struct(isoline) != $isoControl(isoline) || \ $isoControl_struct(colorplane_lighting) != $isoControl(colorplane_lighting) || \ $isoControl_struct(cpl_transparency) != $isoControl(cpl_transparency) || \ $isoControl_struct(cpl_thermometer) != $isoControl(cpl_thermometer) || \ $isoControl_struct(cpl_thermoTplw) != $isoControl(cpl_thermoTplw) || \ $isoControl_struct(cpl_thermoFmt) != $isoControl(cpl_thermoFmt) || \ $isoControl_struct(cpl_thermoLabel) != $isoControl(cpl_thermoLabel) || \ $isoControl_struct(cpl_thermoNTics) != $isoControl(cpl_thermoNTics) || \ $isoControl_struct(cpl_thermoFont) != $isoControl(cpl_thermoFont) || \ $isosurf_struct(2Dexpand) != $isosurf(2Dexpand) || \ $isosurf_struct(2Dexpand_X) != $isosurf(2Dexpand_X) || \ $isosurf_struct(2Dexpand_Y) != $isosurf(2Dexpand_Y) || \ $isosurf_struct(2Dexpand_Z) != $isosurf(2Dexpand_Z) || \ $isoControl_struct(anim_step) != $isoControl(anim_step) || \ $isoControl_struct(current_slide) != $isoControl(current_slide) || \ $isoControl_struct(2Dlowvalue) != $isoControl(2Dlowvalue) || \ $isoControl_struct(2Dhighvalue) != $isoControl(2Dhighvalue) || \ $isoControl_struct(2Dnisoline) != $isoControl(2Dnisoline) || \ $isoControl_struct(isoline_color) != $isoControl(isoline_color) || \ $isoControl_struct(isoline_width) != $isoControl(isoline_width) || \ $isoControl_struct(isoline_monocolor)!= $isoControl(isoline_monocolor) || \ $isoControl_struct(isoline_stipple) != $isoControl(isoline_stipple) } { set upd 1 } if { $upd } { if { $isoControl(colorplane) && !$isoControl(isoline) } { set what "colorplane" } elseif { !$isoControl(colorplane) && $isoControl(isoline) } { set what "isoline" } elseif { $isoControl(colorplane) && $isoControl(isoline) } { set what "both" } else { set what "none" } # # this must be the same as in "isosurf.h" # set COLORBASE_MONO 0 set COLORBASE_RAINBOW 1 set COLORBASE_RGB 2 set COLORBASE_GEOGRAPHIC 3 set COLORBASE_BLUE_WHITE_RED 4 set COLORBASE_BLACK_BROWN_WHITE 5 set SCALE_FUNC_LIN 0 set SCALE_FUNC_LOG 1 set SCALE_FUNC_LOG10 2 set SCALE_FUNC_SQRT 3 set SCALE_FUNC_ROOT3 4 set SCALE_FUNC_GAUSS 5 set SCALE_FUNC_SLATER 6 set basis COLORBASE_MONO set func SCALE_FUNC_LIN switch -exact -- $isoControl(cpl_basis) { MONOCHROME { set basis $COLORBASE_MONO } RAINBOW { set basis $COLORBASE_RAINBOW } RGB { set basis $COLORBASE_RGB } GEOGRAPHIC { set basis $COLORBASE_GEOGRAPHIC } BLUE-WHITE-RED { set basis $COLORBASE_BLUE_WHITE_RED } BLACK-BROWN-WHITE { set basis $COLORBASE_BLACK_BROWN_WHITE } } switch -exact -- $isoControl(cpl_function) { LINEAR { set func $SCALE_FUNC_LIN } LOG { set func $SCALE_FUNC_LOG } LOG10 { set func $SCALE_FUNC_LOG10 } SQRT { set func $SCALE_FUNC_SQRT } 3th-ROOT { set func $SCALE_FUNC_ROOT3 } EXP(x) { set func $SCALE_FUNC_SLATER } EXP(x^2) { set func $SCALE_FUNC_GAUSS } } if { $isoControl(isoline_color) == "monocolor" } { set linecolor [concat monocolor \ [rgb_h2f $isoControl(isoline_monocolor)]] } else { set linecolor polycolor } switch -exact -- $isoControl(isoline_stipple) { {no stipple} { set linedash nodash } {stipple negative} { set linedash negdash } {full stipple} { set linedash fulldash } } xc_iso isoplaneconfig 0 \ -isoplanemin $isoControl(2Dlowvalue) \ -isoplanemax $isoControl(2Dhighvalue) \ -isolinecolor $linecolor \ -isolinedash $linedash \ -isolinewidth $isoControl(isoline_width) \ -isolinenlevels $isoControl(2Dnisoline) \ -isoplanelighting $isoControl(colorplane_lighting) xc_iso isoplane 0 $basis $func $what if { $what != "none" } { xc_isoplane .mesa 0 -planetype $what \ -transparency $isoControl(cpl_transparency) \ -render after ######################################## # now take care of xc_isoexpand # isosurf(expand) ......... none/whole/specify # |-> isosurf(expand_[X,Y,Z]) if { $isosurf(2Dexpand) == "none" } { if { $periodic(dim) == 3 } { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } elseif { $periodic(dim) == 2 } { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } elseif { $periodic(dim) == 1 } { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } else { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } } elseif { $isosurf(2Dexpand) == "whole" } { set expand2D "whole" } else { # expand == specify if { $periodic(dim) == 3 } { set expand2D [list 1 0 0 0 1 0 0 0 1 \ $isosurf(2Dexpand_X) \ $isosurf(2Dexpand_Y) \ $isosurf(2Dexpand_Z)] } elseif { $periodic(dim) == 2 } { set expand2D [list 1 0 0 0 1 0 0 0 1 \ $isosurf(2Dexpand_X) $isosurf(2Dexpand_Y) 0] } elseif { $periodic(dim) == 1 } { set expand2D [list 1 0 0 0 1 0 0 0 1 \ $isosurf(2Dexpand_X) 0 0] } else { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } } xcDebug "Expand2D::::periodic == $periodic(dim)" xcDebug "Expand2D::::expand2D == $expand2D" xc_isoexpand .mesa 0 -repeattype default \ -shape parapipedal -expand $expand2D -render after } ############################ # take care of thermometer # ############################ if { $isoControl(cpl_thermometer) } { # render thermometer !!! foreach wid [list .mesa.thermo .thermo] { if { [winfo exists $wid] } { destroy $wid } } if { $isoControl(cpl_thermoTplw) == 1 } { set prefix {} } else { set prefix .mesa } set tw [thermometerWidget $prefix.thermo {} \ $isoControl(cpl_thermoLabel) \ $isoControl(cpl_thermoFont) \ $isoControl(cpl_thermoFmt) \ $isoControl(cpl_basis) \ $isoControl(cpl_function) \ $isoControl(2Dlowvalue) \ $isoControl(2Dhighvalue) \ $isoControl(cpl_thermoNTics) \ $isoControl(cpl_thermoTplw)] if { $isoControl(cpl_thermoTplw) == 0 } { pack $tw -anchor nw -side top } } else { if { [winfo exists .mesa.thermo] } { destroy .mesa.thermo } elseif { [winfo exists .thermo] } { destroy .thermo } } } # update the display xc_display .mesa # now updata isosurf_struct global variable Set_UpdateIsosurf_Struct ResetCursor } xcrysden-1.6.2/Tcl/openGLpar.tcl0000644000175000017500000003503711712736221015202 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/openGLpar.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# ######################################## # openGL(what).......this is "-what" flag for xc_getGLparam/xc_setGLparam # commands # openGL(type).......material/light/lightmodel # openGL(ambient_R, ambient_G, ambient_B, ambient_A # diffuse_R, ... # specular_R, ... # shininess # emission_R, ...) # openGL(src_blend) SOURCE BLEND FUNCTION # openGL(dst_blend) DESTINATION BLEND FUNCTION # openGL(isoside) CCW/CW proc SetOpenGLPar {item type f {test {}}} { global openGL xcFonts multi_widget_list xcMisc xcDebug "00000000>" if { $type == "ISOSURF" } { # TRANSPARENCY # here QUERY the current BLEND function values switch -glob -- $item { *POS_FRONT_COLOR* { set openGL(type) material set openGL(what) {isosurf pos front} } *POS_BACK_COLOR* { set openGL(type) material set openGL(what) {isosurf pos back} } *NEG_FRONT_COLOR* { set openGL(type) material set openGL(what) {isosurf neg front} } *NEG_BACK_COLOR* { set openGL(type) material set openGL(what) {isosurf neg back} } *ONE_FRONT_COLOR* { set openGL(type) material set openGL(what) {isosurf one front} } *ONE_BACK_COLOR* { set openGL(type) material set openGL(what) {isosurf one back} } *_BLEND_* { set openGL(type) blendfunc set openGL(what) isosurf } } if [string match "*_COLOR_*" $item] { xcDebug "1111111>" set com [concat xc_getGLparam material -what $openGL(what)] set ambient [eval $com -get ambient] set diffuse [eval $com -get diffuse] set specular [eval $com -get specular] set emission [eval $com -get emission] set openGL(shininess) [eval $com -get shininess] SetRGBA {ambient diffuse specular emission} \ [list $ambient $diffuse $specular $emission] } } xcDebug "2222222>" if { [string match "*_BLEND_*" $item] } { # now trim $item $type for "_" character set type [string trim $type _] set item [string trim $item _] set multi_widget_list(post) $f.f1 set bldf [xc_getGLparam blendfunc -what isosurf] set openGL(src_blend) [lindex $bldf 0] set openGL(dst_blend) [lindex $bldf 1] set f1 [frame $f.f1 -relief flat] set f11 [frame $f1.1 -relief groove -bd 2] set f12 [frame $f1.2 -relief groove -bd 2] xcMenuEntry $f11 "Specify source blending type:" 30 \ openGL(src_blend) $openGL(src_blend_list) \ -labelwidth 30 -labelanchor w button $f11.b1 -text "Default" \ -command [list GetOpenGLPar _SRC_${item}_${type}_ \ openGL(src_blend) dummy2 dummy3 dummy4 default] xcMenuEntry $f12 "Specify destination blending type:" 30 \ openGL(dst_blend) $openGL(dst_blend_list) \ -labelwidth 30 -labelanchor w button $f12.b1 -text "Default" \ -command [list GetOpenGLPar _DST_${item}_${type}_ \ openGL(dst_blend) dummy2 dummy3 dummy4 default] pack $f1 -side top -fill both -expand 1 pack $f11 $f12 -side top -fill x -padx 2 -pady 10 -ipady 3 pack $f11.b1 $f12.b1 -side left -padx 5 -pady 5 } set side FRONT if { [string match "*_BACK_*" $item] } { set side BACK } # here COLOR means Material-Properties; FRONT_SIDE if { [string match "*_COLOR_*" $item] || $test == "test" } { set type [string trim $type _] set item [string trim $item _] xcDebug "3333333>" set multi_widget_list(post) $f.f2 set f2 [frame $f.f2 -relief flat] set f2t [frame $f.f2.t -relief flat] set f21 [frame $f.f2.1 -relief groove -bd 2] set f22 [frame $f.f2.2 -relief groove -bd 2] set f23 [frame $f.f2.3 -relief groove -bd 2] set f24 [frame $f.f2.4 -relief groove -bd 2] set f25 [frame $f.f2.5 -relief groove -bd 2] set ltop [label $f2t.l -text "Color parameters for $side SIDE"] # GL_AMBIENT setRGBAwidget $f21 "Ambient color:" \ openGL(ambient_R) openGL(ambient_G) \ openGL(ambient_B) openGL(ambient_A) \ _${item}_${type}_AMBIENT_ # GL_DIFFUSE setRGBAwidget $f22 "Diffuse color:" \ openGL(diffuse_R) openGL(diffuse_G) \ openGL(diffuse_B) openGL(diffuse_A) \ _${item}_${type}_DIFFUSE_ # GL_SPECULAR setRGBAwidget $f23 "Specular color:" \ openGL(specular_R) openGL(specular_G) \ openGL(specular_B) openGL(specular_A) \ _${item}_${type}_SPECULAR_ # GL_EMISSION setRGBAwidget $f24 "Emission color:" \ openGL(emission_R) openGL(emission_G) \ openGL(emission_B) openGL(emission_A) \ _${item}_${type}_EMISSION_ # GL_SHININESS set l [label $f25.l -text "Shininess:"] set sc [scale $f25.sc -from 0 -to 128 \ -length [expr 100 * $xcMisc(resolution_ratio2)] \ -variable openGL(shininess) -orient horizontal \ -label "specular exponent:" -resolution 1 \ -showvalue true -width 7 -sliderlength 20 \ -font $xcFonts(small)] set def [button $f25.b -text "Default" -font $xcFonts(small) \ -command \ [list GetOpenGLPar _${item}_${type}_SHININESS_ \ openGL(shininess) dummy2 dummy3 dummy4 default]] pack $f2 $f2t -side top -fill both -expand 1 pack $ltop -side top -expand 1 pack $f21 $f22 $f23 $f24 $f25 -side left -fill both \ -padx 2 -pady 10 -ipady 3 -expand 1 pack $l -side top -fill x pack $sc -side top -fill y -expand 1 pack $def -side top -pady 3 xcDebug "44444444>" if { $test == "test" } { # findout the geometry of $f2 window tkwait visibility $f2 set wid [winfo width $f2] set hig [winfo height $f2] set hlt [$f2 cget -highlightthickness] $f config -width [expr $wid + 2 * $hlt + 6] $f config -height [expr $hig + 2 * $hlt + 6] pack propagate $f false } } } proc SetRGBA {vars values} { global openGL xcDebug "SetRGBA_values> $values" set n 0 foreach item $vars { set val [lindex $values $n] xcDebug "SetRGBA_val> $val" set openGL(${item}_R) [lindex $val 0] set openGL(${item}_G) [lindex $val 1] set openGL(${item}_B) [lindex $val 2] set openGL(${item}_A) [lindex $val 3] xcDebug "openGL:: openGL(${item}_R) == $openGL(${item}_R)" incr n } } proc setRGBAwidget {parent l_text varR varG varB varA what} { global xcFonts xcMisc upvar $varR R upvar $varG G upvar $varB B upvar $varA A # set current color: set color [SetRGBColor $R $G $B] set color_frame [frame $parent.cf -width 20 -height 20 \ -relief sunken -bd 2 \ -background $color] set l [label $parent.l -text $l_text] set scR [scale $parent.scR -from 0 -to 1 \ -length [expr 100 * $xcMisc(resolution_ratio2)] \ -variable $varR -orient horizontal \ -label "red component:" -resolution 0.01 \ -showvalue true -width 7 -sliderlength 20 \ -font $xcFonts(small) \ -command [list SetColorFrame $color_frame $varR $varG $varB]] set scG [scale $parent.scG -from 0 -to 1 \ -length [expr 100 * $xcMisc(resolution_ratio2)] \ -variable $varG -orient horizontal \ -label "green component:" -resolution 0.01 \ -showvalue true -width 7 -sliderlength 20 \ -font $xcFonts(small) \ -command [list SetColorFrame $color_frame $varR $varG $varB]] set scB [scale $parent.scB -from 0 -to 1 \ -length [expr 100 * $xcMisc(resolution_ratio2)] \ -variable $varB -orient horizontal \ -label "blue component:" -resolution 0.01 \ -showvalue true -width 7 -sliderlength 20 \ -font $xcFonts(small) \ -command [list SetColorFrame $color_frame $varR $varG $varB]] set scA [scale $parent.scA -from 0 -to 1 \ -length [expr 100 * $xcMisc(resolution_ratio2)] \ -variable $varA -orient horizontal \ -label "alpha component:" -resolution 0.01 \ -showvalue true -width 7 -sliderlength 20 \ -font $xcFonts(small)] set def [button $parent.b -text "Default" -font $xcFonts(small) \ -command [list GetOpenGLPar $what $varR $varG $varB $varA \ default $color_frame]] pack $l -side top -fill x pack $scR $scG $scB $scA -side top -fill y -expand 1 pack $color_frame $def -side left -pady 3 -expand 1 if { $what == "_UNKNOWN_" } { pack forget $def pack configure $color_frame -fill x -padx 3 } ### t.k: temporarily #if { $l_text == "Emission color:" } { # xcDisableAll $parent #} ### } proc SetColorFrame {f R G B {val {}}} { # this proc is also used by scale widget and this require aditional # parameter, thatwhy $val is needed upvar $R r upvar $G g upvar $B b if { ! [info exists r] } { return }; # BUG work-around set color [SetRGBColor $r $g $b] $f configure -background $color } proc SetRGBColor {r g b} { set r [d2h [expr int($r * 255)]] set g [d2h [expr int($g * 255)]] set b [d2h [expr int($b * 255)]] xcDebug "RGB: #$r$g$b" return "#$r$g$b" } proc UpdateOpenGLPar {{t {}}} { global openGL puts stderr "UpdateOpenGLPar: $openGL(type), [info exists openGL(specular_R)]" if { $openGL(type) == "material" && [info exists openGL(specular_R)] } { ######################################## # first update COLOR parameters set com [concat xc_setGLparam material -what $openGL(what)] lappend specular [list $openGL(specular_R) $openGL(specular_G) \ $openGL(specular_B) $openGL(specular_A)] lappend ambient [list $openGL(ambient_R) $openGL(ambient_G) \ $openGL(ambient_B) $openGL(ambient_A)] lappend diffuse [list $openGL(diffuse_R) $openGL(diffuse_G) \ $openGL(diffuse_B) $openGL(diffuse_A)] lappend emission [list $openGL(emission_R) $openGL(emission_G) \ $openGL(emission_B) $openGL(emission_A)] eval $com \ -shininess $openGL(shininess) \ -specular $specular \ -ambient $ambient \ -diffuse $diffuse \ -emission $emission # now render the changes .mesa render } if { $openGL(type) == "blendfunc" && [info exists openGL(src_blend)] } { ######################################## # update blendfunc xcDebug "\nxc_setGLparam blendfunc \ -what $openGL(what) \ -sfunc $openGL(src_blend) \ -dfunc $openGL(dst_blend)\n" xc_setGLparam blendfunc \ -what $openGL(what) \ -sfunc $openGL(src_blend) \ -dfunc $openGL(dst_blend) # now render the changes .mesa render } } proc GetOpenGLPar {item var1 var2 var3 var4 {default {}} {color_frame {}}} { upvar #0 $var1 v1 upvar #0 $var2 v2 upvar #0 $var3 v3 upvar #0 $var4 v4 if { $default == "default" } { set get "-get def_" } else { set get "-get " } if [string match "*_COLOR_*" $item] { set type "material" if [string match "*_STRUCTURE_*" $item] { append what "-what structure " } elseif [string match "*_ISOSURF_*" $item] { append what "-what isosurf " if [string match "*_ONE_*" $item] { append what "one " } if [string match "*_POS_*" $item] { append what "pos " } if [string match "*_NEG_*" $item] { append what "neg " } if [string match "*_FRONT_*" $item] { append what "front " } if [string match "*_BACK_*" $item] { append what "back " } } switch -glob -- $item { *_AMBIENT_* { append get "ambient" } *_DIFFUSE_* { append get "diffuse" } *_EMISSION_* { append get "emission" } *_SPECULAR_* { append get "specular" } *_SHININESS_* { append get "shininess" } } } if [string match {*_LIGHT[0-9]_*} $item] { set type "light" regexp -- {_LIGHT[0-9]_} $item light regexp -- {[0-9]} $light n set what "-light $n " switch -glob -- $item { *_AMBIENT_* { append get "ambient" } *_DIFFUSE_* { append get "diffuse" } *_SPECULAR_* { append get "specular" } *_FRACT-POSITION_* { append get "fract_position" } *_SPOT-DIR_* { append get "spot_dir" } *_SPOT-EXP_* { append get "spot_exp" } *_SPOT-CUTOFF_* { append get "spot_cutoff" } *_CONST-ATTEN_* { append get "const_atten" } *_LIN-ATTEN_* { append get "lin_atten" } *_QUAD-ATTEN_* { append get "quad_atten" } } } if [string match "*_LIGHTMODEL_*" $item] { set type "lightmodel" set what {} switch -glob -- $item { *_TWO-SIDE_* { append get "two_side" } *_TWO-SIDE-ISO_* { append get "two_side_iso" } *_AMBIENT_* { append get "ambient" } *_LOCAL-VIEWER_* { append get "local_viewer" } *_IS-LIGHT-ENABLED* { regexp -- {_IS-LIGHT-ENABLED[0-9]_} $item light regexp -- {[0-9]} $light n append get [list [list is_light_enabled $n]] } } } if [string match "*_BLEND_*" $item] { # this has to be comleted if [string match "*_ISOSURF_*" $item] { set bldf [xc_getGLparam blendfunc -what isosurf] xcDebug "bldf:: $bldf" } if { [string match "*_SRC_*" $item] == 1 && $default == "default" } { set v1 [lindex $bldf 2] return $v1 } if [string match "*_SRC_*" $item] { set v1 [lindex $bldf 0] return $v1 } if { [string match "*_DST_*" $item] == 1 && $default == "default" } { set v1 [lindex $bldf 3] return $v1 } if [string match "*_DST_*" $item] { set v1 [lindex $bldf 1] return $v1 } } if { [string match "*_FOG_*" $item] } { set type "fog" set what "" switch -glob -- $item { *_FOGCOLOR_* { append get "fogcolor" } } } #puts stderr "\nopenGLpar> xc_getGLparam $type $what $get\n" set com [concat xc_getGLparam $type $what $get] set result [eval $com] #xcDebug "GetOpenGLPar#2:: result = $result" set n_res [llength $result] for {set i 1} {$i <= $n_res} {incr i} { set ii [expr $i - 1] if { $i == 1 } { set v1 [lindex $result $ii] } if { $i == 2 } { set v2 [lindex $result $ii] } if { $i == 3 } { set v3 [lindex $result $ii] } if { $i == 4 } { set v4 [lindex $result $ii] } } if { $color_frame != {} } { SetColorFrame $color_frame v1 v2 v3 } return $result } xcrysden-1.6.2/Tcl/scriptingScalarField2D.tcl0000644000175000017500000003132711712736221017573 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/scriptingScalarField2D.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # ------------------------------------------------------------------------ #****c* Scripting/scripting::scalarField2D # # NAME # scripting::scalarField2D # # PURPOSE # Encapsulate the scripting interface for manipulating the 2D scalar # field and display of isosurfaces and colorplane+contour plots. A # typical usage of the interface is the following. First the scalar # field is loaded with the "load" command. Then with the "configure" # command the isosurface and/or contours display parameters are set. # Finally the isosurface and/or contours are displayed using the # "render" command. It is possible to make several snapshots of # isosurface and/or contours by changing configuration options, this # would look as: # # load # configure ... # render # configure .. # render # ... # # COMMANDS # # -- scripting::scalarField2D::load # Loads the scalar field. # # -- scripting::scalarField2D::configure # Configure the display parameters for isosurface and/or contours # plot. # # -- scripting::scalarField2D::render # Renders the sosurface and/or contours. #**** # ------------------------------------------------------------------------ namespace eval scripting::scalarField2D { variable scalarField2D set scalarField2D(loaded) 0 set scalarField2D(configured) 0 } # ------------------------------------------------------------------------ #****f* Scripting/scripting::scalarField2D::load # # NAME # scripting::scalarField2D::load # # USAGE # scripting::scalarField2D::load # # PURPOSE # This proc load the 2D scalar field. # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::scalarField2D::load # #**** # ------------------------------------------------------------------------ proc scripting::scalarField2D::load {} { variable scalarField2D # # load datagrid # set dim [DataGridOK [DataGrid]] if { $dim != "2D" } { error "datagrid is not 2D, but $dim" } set scalarField2D(loaded) 1 # # check that the grid is really 2D # # load the scalar-field 2D defaults IsoControl_InitVar } # ------------------------------------------------------------------------ #****f* Scripting/scripting::scalarField2D::configure # # NAME # scripting::scalarField2D::configure # # USAGE # scripting::scalarField2D::configure -option value ?-option value? ... # # PURPOSE # This proc configures the display parameters of colorplane/contours # plot. # # ARGUMENTS # args -- various configuration "-option value" pairs (see Options). # # OPTIONS # ------------------------------------------------------------------------ # OPTION:: ALLOWED-VALUES + Description # ------------------------------------------------------------------------ # -interpolation_degree integer # degree of scalar-field interpolation # # -colorbasis MONOCHROME|RAINBOW|RGB|GEOGRAPHIC|BLUE-WHITE-RED|BLACK-BROWN-WHITE # the color basis for the colorplane # # -scalefunction LINEAR|LOG10|SQRT|3th-ROOT|EXP(x)|EXP(x^2) # the scalefunctions for contour/colorplane plots # # -expand2D none|whole|specify # none = do not expand the contour/colorplane plots # along the periodic directions # whole = expand the contour/colorplane plots # over the whole structure along the # periodic directions # specify = expand the contour/colorplane plots # along the periodic directions as specified # by -expand2D_X, -expand2D_Y, and # -expand2D_Z factors # # -expand2D_X positive-integer # expand contour/colorplane n-times along the 1st # periodic dimension # # # -expand2D_Y positive-integer # expand contour/colorplane n-times along the 2nd # periodic dimension # # -expand2D_Z positive-integer # expand contour/colorplane n-times along the 3rd # periodic dimension # # -colorplane 0|1 # do not display|display the colorplane # # -isoline 0|1 # do not display|display the isolines # # -colorplane_lighting 0|1 # 0 = do not perform lighting for colorplane # 1 = perform lighting for colorplane # # -cpl_transparency 0|1 # 0 = render colorplane as non-transparent # 1 = render colorplane as transparent # # -cpl_thermometer 0|1 # 0 = do not make a legend (i.e. thermometer) for # colorplane colors # 1 = make a legend (i.e. thermometer) for # colorplane colors # # -2Dlowvalue real # minimum rendered value of colorplane/isolines # # -2Dhighvalue real # maximum rendered value of colorplane/isolines # # -2Dnisoline positive-integer # number of isoline # # -isoline_color monocolor|{property color} # monocolor = all isolines have the same color # {property color} = isolines are colorer according # to color-basis # # -isoline_width positive-integer # width (i.e. thickness) of isolines # # -isoline_monocolor #rgb # color of the monolor-type isolines # # ------------------------------------------------------------------------ # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::scalarField2D::configure \ # -interpolation_degree 2 \ # -colorbasis RAINBOW \ # -scalefunction LOG10 \ # -expand2D specify \ # -expand2D_X 1 \ # -expand2D_Y 1 \ # -expand2D_Z 1 \ # -colorplane 1 \ # -isoline 1 \ # -colorplane_lighting 0 \ # -cpl_transparency 0 \ # -cpl_thermometer 1 \ # -2Dlowvalue +0.00001 \ # -2Dhighvalue +0.1 \ # -2Dnisoline 5 \ # -isoline_color monocolor \ # -isoline_width 3 \ # -isoline_monocolor \#ffffff # #**** # ------------------------------------------------------------------------ proc scripting::scalarField2D::configure {args} { variable scalarField2D global isosurf isoControl prop # # assuming the 2D grid !!! # set scalarField2D(configured) 1 # parse the options set i 0 foreach option $args { incr i if { $i%2 } { set tag $option } else { switch -glob -- $tag { "-interpolation_degree" { if { ! [string is integer $option] } { ErrorDialog "expected integer for -interpolationdegree option, but got $option" } elseif { $option < 1 } { ErrorDialog "-interpolationdegree value should be greater then 0, but got $option" } else { set isosurf(3Dinterpl_degree) $option } } "-colorbasis" { switch -exact -- $option { MONOCHROME - RAINBOW - RGB - GEOGRAPHIC - BLUE-WHITE-RED { set cpl_basis $option } default { ErrorDialog "wrong colorbasis $option, must be ..." continue } } } "-scalefunction" { switch -exact -- $option { LINEAR - LOG10 - SQRT - 3th-ROOT - EXP(x) - EXP(x^2) {set cpl_function $option } default { ErrorDialog "wrong scale-function $option, must be ..." continue } } } "-expand2D" { switch -- $option { none - whole - specify { set expand2D $option } default { ErrorDialog "wrong -expand2D value $option, must be none, whole, specify" continue } } } "-expand2D_X" - "-expand2D_Y" - "-expand2D_Z" { if { ! [string is integer $option] } { ErrorDialog "expected integer for $tag option, but got $option" } elseif { $option < 1 } { ErrorDialog "$tag value should be greater then 0, but got $option" } else { set var [string trimleft $tag -] set $var $option } } "-colorplane" - "-isoline" - "-colorplane_lighting" - "-cpl_transparency" - "-cpl_thermometer" - "-2Dlowvalue" - "-2Dhighvalue" - "-2Dnisoline" - "-isoline_color" - "-isoline_width" - "-isoline_monocolor" { set var [string trimleft $tag -] set $var $option } } } } if { $i%2 } { ErrorDialog "scripting::scalarField2D::configure called with an odd number of arguments !!!" } if { [info exists 2Dexpand] } { set isosurf(2Dexpand) $2Dexpand } if { [info exists 2Dexpand_X] } { set isosurf(2Dexpand_X) $2Dexpand_X } if { [info exists 2Dexpand_Y] } { set isosurf(2Dexpand_Y) $2Dexpand_Y } if { [info exists 2Dexpand_Z] } { set isosurf(2Dexpand_Z) $2Dexpand_Z } if { [info exists cpl_basis] } { set isoControl(cpl_basis) $cpl_basis } if { [info exists cpl_function] } { set isoControl(cpl_function) $cpl_function } if { [info exists colorplane] } { set isoControl(colorplane) $colorplane } if { [info exists isoline] } { set isoControl(isoline) $isoline } if { [info exists colorplane_lighting] } { set isoControl(colorplane_lighting) $colorplane_lighting } if { [info exists cpl_transparency] } { set isoControl(cpl_transparency) $cpl_transparency } if { [info exists cpl_thermometer] } { set isoControl(cpl_thermometer) $cpl_thermometer } if { [info exists cpl_thermoTplw] } { set isoControl(cpl_thermoTplw) $cpl_thermoTplw } if { [info exists 2Dlowvalue] } { set isoControl(2Dlowvalue) $2Dlowvalue } if { [info exists 2Dhighvalue] } { set isoControl(2Dhighvalue) $2Dhighvalue } if { [info exists 2Dnisoline] } { set isoControl(2Dnisoline) $2Dnisoline } if { [info exists isoline_color] } { set isoControl(isoline_color) $isoline_color } if { [info exists isoline_width] } { set isoControl(isoline_width) $isoline_width } if { [info exists isoline_monocolor] } { set isoControl(isoline_monocolor) $isoline_monocolor } if { [info exists isoline_stipple] } { set isoControl(isoline_stipple) $isoline_stipple } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::scalarField2D::render # # NAME # scripting::scalarField2D::render # # USAGE # scripting::scalarField2D::render # # PURPOSE # # This proc displays the contours or colorplane or both (depending on # the configuration). # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::scalarField2D::render # #**** # ------------------------------------------------------------------------ proc scripting::scalarField2D::render {} { variable scalarField2D if { !$scalarField2D(loaded) } { ErrorDialog "can't render contours, the scalar field was not loaded. Call scripting::scalarField2D::load and scripting::scalarField2D::configure before calling scripting::scalarField2D::render" return } if { !$scalarField2D(configured) } { ErrorDialog "can't render contours, since they were not configured. Call scripting::scalarField2D::configure before calling scripting::scalarField2D::render" return } ############# UpdatePropertyPlane } xcrysden-1.6.2/Tcl/test.tcl0000644000175000017500000000176711712736221014275 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/test.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# xcrysden-1.6.2/Tcl/xsf2Open.tcl0000644000175000017500000000707413515347117015024 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/xsf2Open.tcl # ------ # # Copyright (c) 2017 by Anton Kokalj # ############################################################################# proc xsf2Open {filedir {can .mesa} {update 0}} { global xsf2 system geng xcMisc periodic radio sInfo xsfAnim working_XSF_file if { ! [info exists xcMisc(xsf2_manipulator)] } { ErrorDialog "Cannot open XSF.v2 files: xsf2_manipulator does not exist" CloseCase return } set filedir [gunzipXSF $filedir] UpdateWMTitle $filedir # so far XSF2 does not support ANIMSTEPS set fID [open $filedir] set l1st [gets $fID] close $fID if { [string match "*ANIMSTEP*" $l1st] } { ErrorDialog "An Error occured, while reading XSF.v2 file $filedir.\n\nXSF.v2 currently does not support ANIMSTEPS keyword" if { ! $update } { CloseCase } return } # convert XSF2 to XSF if { [xsf2_ $filedir filexsf] } { if { ! $update } { CloseCase } return } if { ! [info exists xcMisc(reduce_to)] } { set xcMisc(reduce_to) {} } eval {exec $system(BINDIR)/xsf2xsf $filexsf $filexsf.raw} $xcMisc(reduce_to) set filexsf $filexsf.raw # # the working XSF file set working_XSF_file $filexsf if { $update } { GetDimGroupXSF periodic(dim) periodic(igroup) $filexsf puts stderr "*** update XSF: dim = $periodic(dim)" if { $periodic(dim) < 3 && $radio(cellmode) == "conv" } { set radio(cellmode) prim } if { $periodic(dim) > 1 } { CellMode 1 } else { UpdateStruct .mesa $filexsf } xcUpdateState } else { # # now open the file # ResetDispModes if { [catch {xc_openstr xcr $filexsf $can PL}] } { ErrorDialog "An Error occured, while reading XSF file $filexsf" CloseCase return } # # set the proper state # Get_sInfoArray DisplayDefaultMode xcAppendState render xcUpdateState set periodic(dim) $sInfo(dim) # # if the structure is periodic update it according to the "state" # if { $periodic(dim) > 0 } { set geng(M3_ARGUMENT) [GetGengM3Arg ANGS] # the state should be set as well cd $system(SCRDIR) GenGeom $geng(M1_INFO) $geng(M2_CELL) $geng(M3_ARGUMENT) \ 1 1 1 1 xc_gengeom.$system(PID) GetDimGroupXSF periodic(dim) periodic(igroup) $system(SCRDIR)/xc_gengeom.$system(PID) CellMode 1 Get_sInfoArray xcUpdateState } CrysFrames } return } proc xsf2_ {xsf2 xsfVar} { global xcMisc upvar $xsfVar xsf if { ! [info exists xcMisc(xsf2_manipulator)] } { error "variable xcMisc(xsf2_manipulator) does not exist" } set xsf [file rootname $xsf2].xsf if { [string match $xsf2 $xsf] } { set xsf $xsf2.xsf } return [xcCatchExec $xcMisc(xsf2_manipulator) $xsf2 $xsf] } xcrysden-1.6.2/Tcl/check_package.tcl0000644000175000017500000001057213525461464016050 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/check_package.tcl # ------ # # Copyright (c) 1996--2014 by Anton Kokalj # ############################################################################# proc check_package_awk {} { global system if { ![info exists system(awk)] } { # check first for GNU awk set system(awk) [auto_execok gawk] if { $system(awk) == "" } { set system(awk) [auto_execok awk] if { $system(awk) == "" } { WarningDialog "couldn't find \"awk\" program" "some features will not work !!!" } } } } proc check_package_terminal {} { global system env if { ! [info exists system(term)] } { # check for env(TERM) if { [info exists env(TERM)] } { if { $env(TERM) != "dump" } { set system(term) [auto_execok $env(TERM)] if { $system(term) != "" } { return } } } # now we check for these: foreach term {xterm xvt rxvt eterm gnome-teminal konsole roxterm} { set system(term) [auto_execok $term] if { $system(term) != "" } { break } } } } proc check_package_crystal {} { global system if { $system(c95_exist) } { if { [info exists system(c95_crystal)] } { set system(c95_integrals) $system(c95_crystal) } # # CRYSTAL-95/98/03/06/09/14/... # set crystal_module $system(c95_integrals) set input "test\nMOLECULE\n1\n1\n1 0.0 0.0 0.0\nSTOP\nEND" WriteFile xc_inp.$system(PID) $input w set system(c95_integrals) [auto_execok $system(c95_integrals)] set OK 1 if { ! [file exists $system(c95_integrals)] } { set OK 0 ErrorDialog "File \"$crystal_module\" does not exist"; } if { $OK && ! [file executable $system(c95_integrals)] } { set OK 0 ErrorDialog "File \"$crystal_module\" is not executable"; } if { $OK } { set _status [catch { exec $system(c95_integrals) < xc_inp.$system(PID) >& xc_tmp.$system(PID) } _errMsg] if { $_status } { ErrorDialog \ "Couldn't run CRYSTAL package.\n\nPlease check its definition in ~/.xcrysden/custom-definition file.\n\nError Message: $_errMsg" set system(c95_version) none } if { [file exists xc_tmp.$system(PID)] } { set file [ReadFile xc_tmp.$system(PID)] foreach line [split $file \n] { switch -glob -- $line { "*C R Y S T A L*" { set vf [expr [llength $line] - 2] set system(c95_version) [lindex $line $vf] break } "* CRYSTAL03 *" { set system(c95_version) "03" break } "* CRYSTAL06 *" { set system(c95_version) "06" break } "* CRYSTAL09 *" { set system(c95_version) "09" break } "* CRYSTAL14 *" { set system(c95_version) "14" break } "* CRYSTAL17 *" { puts stderr "Package CRYSTAL: version-17 found" puts stderr " (BEWARE: adopting version-14 instead," puts stderr " support for version-17 may not be fully functional)" set system(c95_version) "14" break } } } } if { ! [info exists system(c95_version)] } { puts stderr "Package CRYSTAL: unsupported version" puts stderr " adopting a crystal version 14 (BEWARE: this may not work properly)" set system(c95_version) "14" } puts stderr "Package CRYSTAL: $system(c95_integrals) (version: $system(c95_version))" if { ! [info exists system(c95_scf)] } { set system(c95_scf) $system(c95_integrals) } } else { # !!! OK == 0 !!! set system(c95_exist) 0 set system(c95_version) none } } else { set system(c95_version) none } } xcrysden-1.6.2/Tcl/Grapher.tcl0000644000175000017500000021432411712736221014701 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/Grapher.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # ------------------------------------------------------------------# # grafdata ARRAY definition ----------------------------------------# # ------------------------------------------------------------------# # # grafdata(type) ............ what kind of Graph is rendered (DOSS, BAND, BAR) # grafdata([1..9],[1..9],[1..9]).... values of function (point,segment,graph) # grafdata(magnify$g) .... magnify data in graph $g # grafdata(X[1..9]) .... X point values # grafdata(N_graf) .... number of graphs # grafdata(N_segment) .... number of different line segments # grafdata(N_point) .... number of points in each segment # grafdata(Xmin,$g) .... first X value # grafdata(Xmax,$g) .... last X value # grafdata(RorigX,$g) .... relative (inside graph-place) origin coord # grafdata(RsizeX,$g) .... relative (inside graph-place) X size # grafdata(Xoffset,$g) .... offset before and after last point in X # directions # grafdata(dX,$g) .... X increment # grafdata(Yline[1..9]) .... special horizontal line that occur at Y # grafdata(Xline[1..9]) .... special vertical line that occur at X # grafdata(Xline[1..9]_text) text that goes with Xline[1..9] # grafdata(XYline_textX) .... X coor of X/Yline_text relative to top-right # corner # grafdata(N_Yline) .... number of special Y line # grafdata(N_Xline) .... number of special X line # grafdata(Xtitle) .... title that appear on Xwindow frame # grafdata(Xicon) .... name of icon # grafdata(X_title) .... title of X axe # grafdata(Y_title) .... title of Y axe # grafdata(X_title_X) .... X coordinate of X title # grafdata(N_text) .... number of arbitrary texts # grafdata(text[1..9]) .... arbitrary text, specific for some graph; # this is an array: text1, text2, .... # grafdata(text[1..9]_X) .... X coord of arbitrary text # grafdata(text[1..9]_font) . font of arbitrary text # grafdata(text[1..9]_fontsize) . font-size of arbitrary text # grafdata(text[1..9]_bbox) . 1/0 -> if bbox is drawn around text # grafdata(N_MXtick) .... number of MAJOR X ticks # grafdata(N_mXtick) .... number of MINOR X ticks between two major ticks # grafdata(Xtick[1..9]) .... value of MAJOR X ticks # grafdata(Xtick_draw) 0/1 whether to draw # grafdata(Xtick[1..9]_text) text for Xtick[1..9] tick # grafdata(Xtick_text_draw) 0/1 whether to draw # =========================================================================== # # =========================================================================== # grafsize(bbox,$g) .... bbox for graph $g # grafsize(axe_title_offset) offset of axis's X_title & Y_title # grafsize(X1axe_width) .... width of X1 & Y1 axis # grafsize(X2axe_width) .... width of X2 & Y2 axis # grafsize(margin_X1) .... size of bottom X margin around world # grafsize(canW) .... width of graph's canvas # grafsize(conH) .... heigth of control frame # grafsize(Yscroll) .... Y scroll size of canvas; if there is no # need for Yscroll --> $grafsize(Yscroll) # should be 0 # grafsize(Mtick_size) ... major tick size # grafsize(mtick_size) ... minor tick size # grafsize(tt_offset) ... thich_title offset # grafsize(curve_width) ... width of curve (for all curves, # if not specified otherwise) # grafsize(curve_color) ... color of curve (for all curves, # if not specified otherwise) # grafsize(curve_width_$i) . width of i-th curve # grafsize(curve_color_$1) . color of i-th curve # grafsize(Xline[1..9]_fill) # grafsize(Xline[1..9]_width) # grafsize(Xline[1..9]_stipple) # ..... the same for Yline ..... # grafsize(bar[1..9]_attrib) ... attrib -> attributes for BAR (BARGraph) # ========================================================================== # # ========================================================================== # graf(X1) left X start of graphplace # graf(Y1) upper Y start od graphplace # graf(X2) right X start of graphplace # graf(Y1) bottom Y start od graphplace # graf(active_graf) which graph is currently selected (in case of multygraph) # ========================================================================== # # ========================================================================== # grafselection(allow_move) .......... 1/0 is item currently allowed to move # grafselection(item_allowed_to_move). 1/0 is item allowed to move by # definition # grafselection(active) .......... when selection os on # grafselection(id) .......... ID of selected item # grafselection(ButtonPressed) ....... 1/0 is button pressed and held down # grafselection(lastX) .......... last x-motion coordinate # grafselection(lastY) .......... last y-motion coordinate # grafselection(exist_position_text).. does position text already exists # grafselection(position_text) ....... glbal variable for position text # grafselection(label_window) ........ name of label window, that hold # position text # grafselection(item) .......... decsriptor for selected item; it is the # tag of item # grafselection(it_is_curve) ......... curve was selected # grafselection(sel_curve_num) ....... number of selected curve # grafselection(selcurve_fill) ....... fill atribute of selected curve # grafselection(selcurve_width) ...... width atribute of selected curve proc GrapherID {} { global grapher if ![info exists grapher(id)] { set grapher(id) 1 } else { incr grapher(id) } return $grapher(id) } proc CurrentGrapherID {} { global grapher if ![info exists grapher(id)] { return 0 } return $grapher(id) } proc NextGrapherID {} { global grapher if ![info exists grapher(id)] { return 1 } return [expr $grapher(id) + 1] } proc Grapher {graphtype} { global grafdata grafsize set gID [GrapherID] xcDebug "In Grapher" if ![info exists grafdata($gID,type)] { set grafdata($gID,type) uknown } if ![info exists grafdata($gID,Xtitle)] { set grafdata($gID,Xtitle) $graphtype } if ![info exists grafdata($gID,Xicon)] { set grafdata($gID,Xicon) $graphtype } set top [xcToplevel .graph$gID $grafdata($gID,Xtitle) \ $grafdata($gID,Xicon) . 100 100 0] # INITIALIZATIONS # --------------- # can ... canvas # con ... control widget if ![info exists grafsize($gID,canW)] { set grafsize($gID,canW) $grafsize(canW) } if ![info exists grafsize($gID,canH)] { set grafsize($gID,canH) $grafsize(canH) } set grafsize($gID,conW) $grafsize($gID,canW) set grafsize($gID,conH) 70 PlaceGrapher $gID $graphtype #tkwait visibility $top update set grafsize($gID,tplwH) [winfo height $top] set grafsize($gID,tplwW) [winfo width $top] set grafsize($gID,Yoffset) \ [expr $grafsize($gID,tplwH) - $grafsize($gID,canH) \ - $grafsize($gID,conH)] set grafsize($gID,Xoffset) \ [expr $grafsize($gID,tplwW) - $grafsize($gID,canW)] bind $top [list ResizeGrapher $gID $graphtype] return $top } proc ResizeGrapher {gID com} { global grafsize grafdata graf set h [winfo height .graph$gID] set w [winfo width .graph$gID] set can $graf($gID,can) # update only if size of "toplevel .graph" has changed if { $grafsize($gID,tplwH) != $h || $grafsize($gID,tplwW) != $w } { set grafsize($gID,tplwH) $h set grafsize($gID,tplwW) $w set grafsize($gID,canW) [expr $w - $grafsize($gID,Xoffset)] set grafsize($gID,canH) [expr $h - $grafsize($gID,conH) - \ $grafsize($gID,Yoffset)] $can configure \ -height $grafsize($gID,canH) -width $grafsize($gID,canW) $can delete graf # # do we have radiobuttons # if { $grafdata($gID,N_graf) > 1 } { $can coords radiobuttons [expr $grafsize($gID,canW) - 10] 10 } $com $gID $can } } proc PlaceGrapher {gID command} { global grafsize grafdata graf set f [frame .graph$gID.f -bg "#bbb" -relief raised -bd 2] if { ![info exists grafsize($gID,Yscroll)] } { set grafsize($gID,Yscroll) 0 } if { $grafsize($gID,Yscroll) == 0 } { set can [canvas $f.can -width $grafsize($gID,canW) \ -height $grafsize($gID,canH) -bg "#ffffff"] } else { set region [list 0 0 $grafsize($gID,canW) $grafsize($gID,Yscroll)] set can [canvas $f.can -width $grafsize($gID,canW) \ -height $grafsize($gID,canH) -bg "#ffffff" \ -scrollregion $region \ -yscrollcommand [list $f.yscroll set]] set scroll [scrollbar $f.yscroll -orient vertical \ -command [list $f.can yview]] } set com [frame .graph$gID.con -relief raised -width $grafsize($gID,conW) \ -height $grafsize($gID,conH)] pack $f -side top -fill both -expand 1 pack $can -side left -expand 1 -fill both -padx 3 -pady 3 if { [info exists scroll] } { pack $scroll -side right -fill y } pack $com -side top -expand 1 -fill x # # get the deafult canvas font # $can create text 0 0 -text a -tags testfont set grafdata($gID,deffont) [$can itemcget testfont -font] # default font should not be bold set grafdata($gID,deffont) \ [ModifyFont $grafdata($gID,deffont) $can \ -default 1 \ -weight normal] $can delete testfont # # Canvas(item) Bindings # focus $can $can bind graf <1> [list GrapherSelect $gID $can %x %y] $can bind graf \ [list GrapherSelect $gID $can %x %y $command double $command] $can bind graf <2> \ [list GrapherSelect $gID $can %x %y $command double $command] $can bind graf [list GrapherSelectRelease $gID] bind $can [list GrapherSelectMotion $gID $can %x %y] bind .graph$gID [list GrapherKeyBindings $gID $can left] bind .graph$gID [list GrapherKeyBindings $gID $can right] bind .graph$gID [list GrapherKeyBindings $gID $can up] bind .graph$gID [list GrapherKeyBindings $gID $can down] bind .graph$gID [list GrapherKeyBindings $gID $can delete] bind .graph$gID [list QuitGrapher $gID] ################################################## # Command Buttons # ################################################## set ranges [button $com.ranges \ -text "XY Ranges" \ -command [list ConfigGrapher $gID $command ranges]] set tick [button $com.tics \ -text "Set Tics" \ -command [list ConfigGrapher $gID $command tics]] set grid [button $com.grid \ -text "Set Grid" \ -command [list ConfigGrapher $gID $command grid]] set text [button $com.text \ -text "Text" \ -command [list ConfigGrapher $gID $command init_text]] set marg [button $com.marg \ -text "Margins" \ -command [list ConfigGrapher $gID $command margin]] set empty [frame $com.f -relief raised -bd 2 -highlightthickness 0] set dos [button $com.dos \ -text "DOS" \ -state disabled \ -command [list ConfigGrapher $gID $command dos]] if { $grafdata($gID,type) == "DOSS" } { $dos configure -state normal } set print [button $com.ps \ -text "PostScript" \ -command [list GraphPrint $gID $can]] set quit [button $com.quit \ -text "Close" \ -command [list QuitGrapher $gID]] pack $ranges $tick $grid $text $marg $dos -side left pack $empty -side left -fill both -expand 1 pack $print $quit -side left ################################################## # # if there will be more then one graph -> # radiobuttons for selectiong the graph # set graf($gID,active_graf) 1; # don't remove, please; it won't work if { $grafdata($gID,N_graf) > 1 } { set f [frame $can.f] $can create window [expr $grafsize($gID,canW) - 10] 10 \ -anchor ne \ -window $f \ -tags "radiobuttons" for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g} { set r($g) [radiobutton $f.r$g \ -variable graf($gID,active_graf) \ -text $g \ -value $g \ -command [list GrapherActivate $gID $can] \ -relief raised \ -bd 2] pack $r($g) -side left } } # # remember the pathname of canvas # set graf($gID,can) $can #update tkwait visibility $can ################## $command $gID $can } proc GrapherActivate {gID can} { global graf # # when some new graph is selected, the selected graph should blink # set g $graf($gID,active_graf) BlinkingRectangle $can 3 \ $graf($gID,Xstart,$g) $graf($gID,Ystart,$g) \ $graf($gID,Xend,$g) $graf($gID,Yend,$g) } proc UpdateGrapher {gID can graphcommand} { $can delete graf $graphcommand $gID $can } proc QuitGrapher gID { global graf grafdata grafsize grafselection graf_setgrid graf_setaxe \ graf_settic graf_setticX graf_setticY graf_setmar configGrapher \ quitGrapher # # because we have binding for toplevel, this procedure can # be entered many times; prevent that # if ![info exists quitGrapher($gID)] { set quitGrapher($gID) 0 } else { set quitGrapher($gID) 1 } if $quitGrapher($gID) { return } destroy .graph$gID set array_to_unset {graf grafdata grafsize graf_setgrid graf_setaxe \ graf_setticX graf_setticY graf_setdos graf_setmar \ configGrapher} foreach array $array_to_unset { if [array exists $array] { foreach elem [array names $array $gID,*] { upvar $array ar unset ar($elem) } } xcDebug "array: $array; elem: [array names $array *]\n" } } proc GraphPrint {gID can} { global grafsize # delete selection if { $grafsize($gID,Yscroll) != 0 } { #################### # canvas is scrolled xcPrintCanvas $can -canvas_scrollheight $grafsize($gID,Yscroll) } else { ######################## # canvas is not scrolled xcPrintCanvas $can } } proc gr_isInside {gID x y g} { global grafdata # is_inside_graph_box ??? if { $x >= $grafdata($gID,Xmin,$g) && $x <= $grafdata($gID,Xmax,$g) && \ $y >= $grafdata($gID,Ymin,$g) && $y <= $grafdata($gID,Ymax,$g) } { return 1 } return 0 } proc gr_OIInterp {gID x1 y1 x2 y2 g} { global grafdata # OI - OutIn interpolation set k [expr ($y2 - $y1) / ($x2 - $x1)] set n [expr $y1 - $k * $x1] set Xl $grafdata($gID,Xmin,$g) if { $x1 <= $Xl && $x2 >= $Xl} { return "$Xl [expr $k * $Xl + $n]" } if { $k == 0 } { return "$x2 $y2" } set Yt $grafdata($gID,Ymax,$g) if { $y1 >= $Yt && $y2 <= $Yt } { return "[expr ($Yt - $n) / $k] $Yt" } set Yb $grafdata($gID,Ymin,$g) if { $y1 <= $Yb && $y2 >= $Yb } { return "[expr ($Yb - $n) / $k] $Yb" } # this can happend the fisrt time we enter gr_OIInterp return "$x1 $y1" } proc gr_IOInter {gID x1 y1 x2 y2 g} { global grafdata # IO - InOut interpolation set k [expr ($y2 - $y1) / ($x2 - $x1)] set n [expr $y1 - $k * $x1] set Xr $grafdata($gID,Xmax,$g) if { $x1 <= $Xr && $x2 >= $Xr} { return "$Xr [expr $k * $Xr + $n]" } if { $k == 0 } { return "$x2 $y2" } set Yt $grafdata($gID,Ymax,$g) if { $y1 <= $Yt && $y2 >= $Yt } { return "[expr ($Yt - $n) / $k] $Yt" } set Yb $grafdata($gID,Ymin,$g) if { $y1 >= $Yb && $y2 <= $Yb } { return "[expr ($Yb - $n) / $k] $Yb" } xcDebug "gr_IOInter ERROR: no interpolation found::" xcDebug "$x1 $y1 $x2 $y2; $Yt $Yb $Xr" } proc XYGraph {gID can} { global grafdata grafsize graf GetGraphWorld $gID $can xcDebug "XYGraph" for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g} { set Xs $graf($gID,Xstart,$g) set Xr $graf($gID,Xratio,$g) set Xm $grafdata($gID,Xmin,$g) set XM $grafdata($gID,Xmax,$g) set Ys $graf($gID,Ystart,$g) set Yr $graf($gID,Yratio,$g) set Ym $grafdata($gID,Ymin,$g) set YM $grafdata($gID,Ymax,$g) for {set i 1} {$i <= $grafdata($gID,N_segment,$g)} {incr i} { if [array exists line] {unset line} # display curve ################test-setup #set nl 1 #set oldinside 1 #set inside 1 ################ set nl 0 set oldinside 0 set xold $grafdata($gID,X1,$g) set yold $grafdata($gID,1,$i,$g) for {set j 2} {$j <= $grafdata($gID,N_point,$g)} {incr j} { set x $grafdata($gID,X$j,$g) set y $grafdata($gID,$j,$i,$g) set inside [gr_isInside $gID $x $y $g] #xcDebug "$oldinside $inside" if { $oldinside && $inside } { set X [expr $Xs + ($x - $Xm) * $Xr] set Y [expr $Ys - ($y - $Ym) * $Yr] set xold $x set yold $y append line($nl) "$X $Y " set inside $oldinside continue } if { !$oldinside && $inside } { set xy [gr_OIInterp $gID $xold $yold $x $y $g] set Xold [expr $Xs + ([lindex $xy 0] - $Xm) * $Xr] set Yold [expr $Ys - ([lindex $xy 1] - $Ym) * $Yr] set X [expr $Xs + ($x - $Xm) * $Xr] set Y [expr $Ys - ($y - $Ym) * $Yr] set xold $x set yold $y incr nl append line($nl) "$Xold $Yold $X $Y " set oldinside $inside continue } if { $oldinside && !$inside } { set xy [gr_IOInter $gID $xold $yold $x $y $g] set x [lindex $xy 0] set y [lindex $xy 1] set X [expr $Xs + ($x - $Xm) * $Xr] set Y [expr $Ys - ($y - $Ym) * $Yr] set xold $x set yold $y append line($nl) "$X $Y " set oldinside $inside continue } if { !$oldinside && !$inside } { set xold $x set yold $y continue } } set curve_width $grafsize(curve_width) set curve_color $grafsize(curve_color) if [info exists grafsize($gID,curve_width_$i,$g)] { set curve_width $grafsize($gID,curve_width_$i,$g) } if [info exists grafsize($gID,curve_color_$i,$g)] { set curve_color $grafsize($gID,curve_color_$i,$g) } for {set il 1} {$il <= $nl} {incr il} { eval {$can create line} $line($il) {-width $curve_width \ -tags "graf curve c$g,$i" -smooth 1 \ -fill $curve_color -joinstyle round} } } } ##################################################################### # it may easily happen, that some curve goes outside the graph world, # get rid off that --> make white rectangles (JUST IN CASE) GrapherDummyRect $gID $can GrapherArbitraryText $gID $can XYAxis $gID $can GraphTickLines $gID $can # we must raise the radiobuttons $can raise radiobuttons dummy_rectangles } proc BARGraph {gID can} { global grafdata grafsize graf prop GetGraphWorld $gID $can set grafdata($gID,type) BAR # display BARS for {set i 1} {$i <= $grafdata($gID,N_point,1)} {incr i} { # bar is (1/N_point) - 2*Xoffset*(1/N_point) tick set x1 [expr $grafdata($gID,X$i,1) - \ (1.0 - 2.0 * $grafdata($gID,Xoffset,1)) * \ (0.5 / $grafdata($gID,N_point,1))] set x2 [expr $grafdata($gID,X$i,1) + \ (1.0 - 2.0 * $grafdata($gID,Xoffset,1)) * \ (0.5 / $grafdata($gID,N_point,1))] set Y1 [expr $graf($gID,Ystart,1) - \ ($grafdata($gID,$i,1,1) - $grafdata($gID,Ymin,1)) * \ $graf($gID,Yratio,1)] set Y2 [expr $graf($gID,Ystart,1) - \ ($grafdata($gID,$i,2,1) - $grafdata($gID,Ymin,1)) * \ $graf($gID,Yratio,1)] if { $prop(type_of_run) == "UHF" } { set x4 $x2 set x2 $grafdata($gID,X$i,1) set X4 [expr $graf($gID,Xstart,1) + \ ($x4 - $grafdata($gID,Xmin,1)) * $graf($gID,Xratio,1)] set Y3 [expr $graf($gID,Ystart,1) - \ ($grafdata($gID,$i,1,2) - $grafdata($gID,Ymin,1)) * \ $graf($gID,Yratio,1)] set Y4 [expr $graf($gID,Ystart,1) - \ ($grafdata($gID,$i,2,2) - $grafdata($gID,Ymin,1)) * \ $graf($gID,Yratio,1)] } set X1 [expr $graf($gID,Xstart,1) + \ ($x1 - $grafdata($gID,Xmin,1)) * $graf($gID,Xratio,1)] set X2 [expr $graf($gID,Xstart,1) + \ ($x2 - $grafdata($gID,Xmin,1)) * $graf($gID,Xratio,1)] set X3 $X2; # used just for UHF # # convert "none" to {} # if { $grafsize($gID,bar${i}_stipple,1) == "none" } { set grafsize($gID,bar${i}_stipple,1) {} } if { $prop(type_of_run) == "UHF" } { if { $grafsize($gID,bar${i}_stipple,2) == "none" } { set grafsize($gID,bar${i}_stipple,2) {} } } # # shadow bar # set off 0 if [info exists grafdata($gID,barshadow,1)] { set off 1 if $grafdata($gID,barshadow,1) { $can create rectangle \ [expr $X1 + 2] [expr $Y1 + 2] \ [expr $X2 + 2] [expr $Y2 + 2] \ -fill #ffffff \ -outline #ffffff \ -tags "graf" $can create rectangle \ [expr $X1 + 2] [expr $Y1 + 2] \ [expr $X2 + 2] [expr $Y2 + 2] \ -fill $grafsize($gID,bar${i}_shadow,1) \ -outline $grafsize($gID,bar${i}_shadow,1) \ -stipple $grafsize($gID,bar${i}_stipple,1) \ -width $grafsize($gID,bar${i}_width,1) \ -stipple $grafsize($gID,bar${i}_stipple,1) \ -tags "graf sbar sb1,$i" if { $prop(type_of_run) == "UHF" } { $can create rectangle \ [expr $X3 + 2] [expr $Y3 + 2] \ [expr $X4 + 2] [expr $Y4 + 2] \ -fill #ffffff \ -outline #ffffff \ -tags "graf" $can create rectangle \ [expr $X3 + 2] [expr $Y3 + 2] \ [expr $X4 + 2] [expr $Y4 + 2] \ -fill $grafsize($gID,bar${i}_shadow,2) \ -outline $grafsize($gID,bar${i}_shadow,2) \ -stipple $grafsize($gID,bar${i}_stipple,2) \ -width $grafsize($gID,bar${i}_width,2) \ -stipple $grafsize($gID,bar${i}_stipple,2) \ -tags "graf sbar sb2,$i" } } } $can create rectangle \ [expr $X1 - $off] $Y1 [expr $X2 - $off] $Y2 \ -fill #ffffff \ -outline #ffffff \ -tags "graf" $can create rectangle \ [expr $X1 - $off] $Y1 [expr $X2 - $off] $Y2 \ -fill $grafsize($gID,bar${i}_fill,1) \ -outline $grafsize($gID,bar${i}_outline,1) \ -stipple $grafsize($gID,bar${i}_stipple,1) \ -width $grafsize($gID,bar${i}_width,1) \ -stipple $grafsize($gID,bar${i}_stipple,1) \ -tags "graf bar b1,$i" if { $prop(type_of_run) == "UHF" } { $can create rectangle \ [expr $X3 - $off] $Y3 [expr $X4 - $off] $Y4 \ -fill #ffffff \ -outline #ffffff \ -tags "graf" $can create rectangle \ [expr $X3 - $off] $Y3 [expr $X4 - $off] $Y4 \ -fill $grafsize($gID,bar${i}_fill,2) \ -outline $grafsize($gID,bar${i}_outline,2) \ -stipple $grafsize($gID,bar${i}_stipple,2) \ -width $grafsize($gID,bar${i}_width,2) \ -stipple $grafsize($gID,bar${i}_stipple,2) \ -tags "graf bar b2,$i" } } GrapherDummyRect $gID $can GrapherArbitraryText $gID $can XYAxis $gID $can GraphTickLines $gID $can } proc GrapherArbitraryText {gID can} { global grafdata grafsize # # display arbitrary texts # for {set i 1} {$i <= $grafdata($gID,N_text)} {incr i} { # display text if [info exists grafdata($gID,text${i}_X)] { if ![info exists grafdata($gID,text${i}_font)] { set grafdata($gID,text${i}_font) $grafdata($gID,deffont) } xcDebug "font:: $grafdata($gID,text${i}_font)" $can create text \ [expr [XnMRel2Graph $gID $grafdata($gID,text${i}_X)] + \ $grafsize($gID,margin_Y1)] \ [expr [YnMRel2Graph $gID $grafdata($gID,text${i}_Y)] + \ $grafsize($gID,margin_X2)] \ -anchor nw \ -text $grafdata($gID,text$i) \ -tags "graf text t$i" \ -font $grafdata($gID,text${i}_font) # display bbox ??? if { [info exists grafdata($gID,text${i}_bbox) ] } { if $grafdata($gID,text${i}_bbox) { set bbox [$can bbox t$i] eval {$can create rectangle} $bbox \ {-outline #000 \ -tags "graf text_bbox t_bb$i"} } else { $can delete t_bb$i } } } } } proc GrapherDummyRect {gID can} { global graf grafsize ###################################################################### # this will be used for dummy_rectangles -> look below !!! set cw $grafsize($gID,canW) if { $grafsize($gID,canH) < $grafsize($gID,Yscroll) } { set ch $grafsize($gID,Yscroll) } else { set ch $grafsize($gID,canH) } # left rectangle $can create rectangle 0 0 $graf($gID,X1) $ch \ -fill "#ffffff" \ -outline "#ffffff" \ -tags "graf dummy_rectangles" # top rectangle $can create rectangle 0 0 $cw $graf($gID,Y1) \ -fill "#ffffff" \ -outline "#ffffff" \ -tags "graf dummy_rectangles" # bottom rectangle $can create rectangle 0 $graf($gID,Y2) $cw $ch \ -fill "#ffffff" \ -outline "#ffffff" \ -tags "graf dummy_rectangles" # right rectangle $can create rectangle $graf($gID,X2) 0 $cw $ch \ -fill "#ffffff" \ -outline "#ffffff" \ -tags "graf dummy_rectangles" } proc GraphTickLines {gID can} { global grafdata grafsize graf graf_setgrid graf_setaxe system for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g} { # display Xline if ![info exists grafdata($gID,XYline_textX,$g)] { set grafdata($gID,XYline_textX,$g) $grafdata(XYline_textX) set grafdata($gID,XYline_textY,$g) $grafdata(XYline_textY) } set xt [expr $graf($gID,Xstart,$g) + \ [XnMRel2Graph $gID [expr $graf($gID,RorigX,$g) + \ (1.0 - $grafdata($gID,XYline_textX,$g)) * \ $graf($gID,RsizeX,$g)]]] set yt [expr $graf($gID,Ystart,$g) - \ [YnMRel2Graph $gID [expr $graf($gID,RorigY,$g) + \ (1.0 - $grafdata($gID,XYline_textY,$g)) * \ $graf($gID,RsizeX,$g)]]] if ![info exists grafdata($gID,legendfont)] { set grafdata($gID,legendfont) $grafdata($gID,deffont) } for {set i 1} {$i <= $grafdata($gID,N_Xline,$g)} {incr i} { set Xline [expr $graf($gID,Xstart,$g) + \ ($grafdata($gID,Xline$i,$g) - \ $grafdata($gID,Xmin,$g)) * $graf($gID,Xratio,$g)] puts stdout "Xline: $Xline" if { $Xline > $graf($gID,Xstart,$g) && \ $Xline < $graf($gID,Xend,$g) } { $can create line \ $Xline $graf($gID,Ystart,$g) \ $Xline $graf($gID,Yend,$g) \ -width $grafsize($gID,Xline${i}_width,$g) \ -fill $grafsize($gID,Xline${i}_fill,$g) \ -stipple $grafsize($gID,Xline${i}_stipple,$g) \ -tags "graf Xline Xl$g,$i" # is there any label for Xline$i if [info exists grafdata($gID,Xline${i}_text,$g)] { $can create line \ [expr $xt - 20] $yt $xt $yt \ -width $grafsize($gID,Xline${i}_width,$g) \ -fill $grafsize($gID,Xline${i}_fill,$g) \ -stipple $grafsize($gID,Xline${i}_textstipple,$g) \ -tags "graf legend l$g Xline_textline Xl_tl$g,$i" $can create text \ [expr $xt - 25] $yt \ -text $grafdata($gID,Xline${i}_text,$g) \ -anchor e \ -fill $grafsize($gID,Xline${i}_fill,$g) \ -tags "graf legend l$g Xline_text Xl_t$g,$i" \ -font $grafdata($gID,legendfont) # t.k - this is strange set yt [expr $yt + 20]; #MAKE THIS BETTER IN THE FUTURE } } } # display Yline for {set i 1} {$i <= $grafdata($gID,N_Yline,$g)} {incr i} { set Yline [expr $graf($gID,Ystart,$g) - \ ($grafdata($gID,Yline$i,$g) - \ $grafdata($gID,Ymin,$g)) * $graf($gID,Yratio,$g)] if { $Yline < $graf($gID,Ystart,$g) && \ $Yline > $graf($gID,Yend,$g) } { $can create line \ $graf($gID,Xstart,$g) $Yline \ $graf($gID,Xend,$g) $Yline \ -width $grafsize($gID,Yline${i}_width,$g) \ -fill $grafsize($gID,Yline${i}_fill,$g) \ -stipple $grafsize($gID,Yline${i}_stipple,$g) \ -tags "graf Yline Yl$g,$i" # is there any label for Yline$i if [info exists grafdata($gID,Yline${i}_text,$g)] { $can create line \ [expr $xt - 20] $yt $xt $yt \ -width $grafsize($gID,Yline${i}_width,$g) \ -fill $grafsize($gID,Yline${i}_fill,$g) \ -stipple $grafsize($gID,Yline${i}_stipple,$g) \ -tags "graf legend l$g Yline_textline Yl_tl$g,$i" $can create text [expr $xt - 25] $yt \ -text $grafdata($gID,Yline${i}_text,$g) \ -anchor e \ -fill $grafsize($gID,Yline${i}_fill,$g) \ -tags "graf legend l$g Yline_text Yl_t$g,$i" \ -font $grafdata($gID,legendfont) set yt [expr $yt + 20]; #MAKE THIS BETTER IN THE FUTURE } } } # display X ticks if ![info exists grafdata($gID,Xtick_draw,$g)] { set grafdata($gID,Xtick_draw,$g) $grafdata(Xtick_draw) } if ![info exists graf_setaxe($gID,mirrorXaxe,$g)] { set graf_setaxe($gID,mirrorXaxe,$g) $graf_setaxe(mirrorXaxe) } if ![info exists grafdata($gID,Xtick_text_draw,$g)] { set grafdata($gID,Xtick_text_draw,$g) $grafdata(Xtick_text_draw) } if ![info exists grafdata($gID,Xtickfont)] { set grafdata($gID,Xtickfont) $grafdata($gID,deffont) } for {set i 1} {$i <= $grafdata($gID,N_MXtick,$g)} {incr i} { set Xth [XGraphValue $gID $grafdata($gID,Xtick$i,$g) $g] set Yth [expr $graf($gID,Ystart,$g) + $grafsize(tt_offset)] set Yth1 [expr $graf($gID,Ystart,$g) - $grafsize(Mtick_size)] set Yth2 $graf($gID,Ystart,$g) # mirror axis: set mYth [expr $graf($gID,Yend,$g) - $grafsize(tt_offset)] set mYth1 [expr $graf($gID,Yend,$g) + $grafsize(Mtick_size)] set mYth2 $graf($gID,Yend,$g) if { $Xth >= [XGraphValue $gID $grafdata($gID,Xmin,$g) $g] && \ $Xth <= [XGraphValue $gID $grafdata($gID,Xmax,$g) $g] } { if $grafdata($gID,Xtick_draw,$g) { $can create line \ $Xth $Yth1 $Xth $Yth2 \ -width 2 \ -fill "#000" \ -tags "graf XMtick XMt$g" # display X mirror tics ??? if $graf_setaxe($gID,mirrorXaxe,$g) { $can create line \ $Xth $mYth1 $Xth $mYth2 \ -width 2 \ -fill "#000" \ -tags "graf XMtick mXaxe mXMt$g mXa$g" } } if $grafdata($gID,Xtick_text_draw,$g) { $can create text \ $Xth $Yth \ -text $grafdata($gID,Xtick${i}_text,$g) \ -anchor n \ -tags "graf tickXValue tXV$g" \ -font $grafdata($gID,Xtickfont) } # # display X major grid if graf_setgrid is set # if ![info exists graf_setgrid($gID,Xmajor,$g)] { set graf_setgrid($gID,Xmajor,$g) $graf_setgrid(Xmajor) set graf_setgrid($gID,Xminor,$g) $graf_setgrid(Xminor) set graf_setgrid($gID,Ymajor,$g) $graf_setgrid(Ymajor) set graf_setgrid($gID,Yminor,$g) $graf_setgrid(Yminor) set graf_setgrid($gID,Xmajor_exist,$g) \ $graf_setgrid(Xmajor_exist) set graf_setgrid($gID,Ymajor_exist,$g) \ $graf_setgrid(Ymajor_exist) set graf_setgrid($gID,Xminor_exist,$g) \ $graf_setgrid(Xminor_exist) set graf_setgrid($gID,Yminor_exist,$g) \ $graf_setgrid(Yminor_exist) set graf_setaxe($gID,mirrorXaxe,$g) \ $graf_setaxe(mirrorXaxe) set graf_setaxe($gID,mirrorYaxe,$g) \ $graf_setaxe(mirrorYaxe) } if $graf_setgrid($gID,Xmajor,$g) { set graf_setgrid($gID,Xmajor_exist,$g) 1 $can create line \ $Xth $graf($gID,Yend,$g) \ $Xth $graf($gID,Ystart,$g) \ -width 0.5 \ -fill "#999" \ -tags "graf XMgrid XMg$g" \ -stipple @$system(BMPDIR)/dot1x3V.bmp # gridlines must be the lowest ones $can lower XMgrid graf } elseif { $graf_setgrid($gID,Xmajor,$g) == 0 && \ $graf_setgrid($gID,Xmajor_exist,$g) == 1 } { # delete gridlines $can delete XMg$g set graf_setgrid($gID,Xmajor_exist,$g) 0 } } if { $i < $grafdata($gID,N_MXtick,$g) } { set ii [expr $i + 1] set dx [expr ($grafdata($gID,Xtick$ii,$g) - \ $grafdata($gID,Xtick$i,$g)) \ * $graf($gID,Xratio,$g) / \ ($grafdata($gID,N_mXtick,$g) + 1)] for {set j 1} {$j <= $grafdata($gID,N_mXtick,$g)} {incr j} { set xth [expr $Xth + $j * $dx] set yth1 [expr $graf($gID,Ystart,$g) - \ $grafsize(mtick_size)] set myth1 [expr $graf($gID,Yend,$g) + \ $grafsize(mtick_size)] if { $xth >= \ [XGraphValue $gID $grafdata($gID,Xmin,$g) $g] \ && $xth <= \ [XGraphValue $gID $grafdata($gID,Xmax,$g) $g] } { if $grafdata($gID,Xtick_draw,$g) { $can create line \ $xth $yth1 $xth $Yth2 \ -width 1 \ -fill "#000" \ -tags "graf Xmtick Xmt$g" # display X mirror tics ??? if $graf_setaxe($gID,mirrorXaxe,$g) { $can create line \ $xth $myth1 $xth $mYth2 \ -width 1 \ -fill "#000" \ -tags "graf Xmtick mXaxe mXmt$g mXa$g" } } # # display X minor grid if graf_setgrid is set # if $graf_setgrid($gID,Xminor,$g) { set graf_setgrid($gID,Xminor_exist,$g) 1 $can create line \ $xth $graf($gID,Yend,$g) \ $xth $graf($gID,Ystart,$g) \ -width 0.5 \ -fill "#999" \ -tags "graf Xmgrid Xmg$g" \ -stipple @$system(BMPDIR)/dot1x3V.bmp # gridlines must be the lowest ones $can lower Xmg$g graf } elseif { $graf_setgrid($gID,Xminor,$g) == 0 && \ $graf_setgrid($gID,Xminor_exist,$g) == 1 } { # delete gridlines $can delete Xmg$g set graf_setgrid($gID,Xminor_exist,$g) 0 } } } } } # display Y ticks if ![info exists grafdata($gID,Ytick_draw,$g)] { set grafdata($gID,Ytick_draw,$g) $grafdata(Ytick_draw) } if ![info exists graf_setaxe($gID,mirrorYaxe,$g)] { set graf_setaxe($gID,mirrorYaxe,$g) $graf_setaxe(mirrorYaxe) } if ![info exists grafdata($gID,Ytick_text_draw,$g)] { set grafdata($gID,Ytick_text_draw,$g) $grafdata(Ytick_text_draw) } if ![info exists grafdata($gID,Ytickfont)] { set grafdata($gID,Ytickfont) $grafdata($gID,deffont) } for {set i 1} {$i <= $grafdata($gID,N_MYtick,$g)} {incr i} { set Xth [expr $graf($gID,Xstart,$g) - $grafsize(tt_offset)] set Yth [YGraphValue $gID $grafdata($gID,Ytick$i,$g) $g] set Xth1 $graf($gID,Xstart,$g) set Xth2 [expr $graf($gID,Xstart,$g) + $grafsize(Mtick_size)] # mirror Axis set mXth [expr $graf($gID,Xend,$g) + $grafsize(tt_offset)] set mXth1 $graf($gID,Xend,$g) set mXth2 [expr $graf($gID,Xend,$g) - $grafsize(Mtick_size)] # # WARNING: point (0,0) -> upper left corner of canvas # >>> take care of that <<< # if { $Yth <= [YGraphValue $gID $grafdata($gID,Ymin,$g) $g] && \ $Yth >= [YGraphValue $gID $grafdata($gID,Ymax,$g) $g] } { if $grafdata($gID,Ytick_draw,$g) { $can create line \ $Xth1 $Yth $Xth2 $Yth \ -width 2 \ -fill "#000" \ -tags "graf YMtick YMt$g" # display mirror tics ??? if $graf_setaxe($gID,mirrorYaxe,$g) { $can create line \ $mXth1 $Yth $mXth2 $Yth \ -width 2 \ -fill "#000" \ -tags "graf YMtick mYaxe mYMt$g mXa$g" } } if $grafdata($gID,Ytick_text_draw,$g) { $can create text $Xth $Yth \ -text $grafdata($gID,Ytick${i}_text,$g) \ -anchor e \ -tags "graf tickYValue tYV$g" \ -font $grafdata($gID,Ytickfont) } # # display Y major grid if graf_setgrid is set # if $graf_setgrid($gID,Ymajor,$g) { set graf_setgrid($gID,Ymajor_exist,$g) 1 $can create line \ $graf($gID,Xstart,$g) $Yth \ $graf($gID,Xend,$g) $Yth \ -width 0.5 \ -fill "#999" \ -tags "graf YMgrid YMg$g" \ -stipple @$system(BMPDIR)/dot1x3H.bmp # gridlines must be the lowest ones $can lower YMgrid graf } elseif { $graf_setgrid($gID,Ymajor,$g) == 0 && \ $graf_setgrid($gID,Ymajor_exist,$g) == 1 } { # delete gridlines $can delete YMg$g set graf_setgrid($gID,Ymajor_exist,$g) 0 } } if { $i < $grafdata($gID,N_MYtick,$g) } { set ii [expr $i + 1] set dy [expr ($grafdata($gID,Ytick$ii,$g) - \ $grafdata($gID,Ytick$i,$g)) \ * $graf($gID,Yratio,$g) / \ ($grafdata($gID,N_mYtick,$g) + 1)] for {set j 1} {$j <= $grafdata($gID,N_mYtick,$g)} {incr j} { set yth [expr $Yth - $j * $dy] set xth2 [expr $graf($gID,Xstart,$g) + \ $grafsize(mtick_size)] # mirror tics set mxth2 [expr $graf($gID,Xend,$g) - \ $grafsize(mtick_size)] if { $yth <= [YGraphValue \ $gID $grafdata($gID,Ymin,$g) $g] \ && \ $yth >= [YGraphValue \ $gID $grafdata($gID,Ymax,$g) $g] } { if $grafdata($gID,Ytick_draw,$g) { $can create line \ $Xth1 $yth $xth2 $yth \ -width 1 \ -fill "#000" \ -tags "graf Ymtick Ymt$g" if $graf_setaxe($gID,mirrorYaxe,$g) { $can create line \ $mXth1 $yth $mxth2 $yth \ -width 1 \ -fill "#000" \ -tags "graf Ymtick mYaxe mYmt$g mYa$g" } } puts stdout "mticks: $Xth1 $yth $xth2 $yth" # # display Y minor grid if graf_setgrid is set # if $graf_setgrid($gID,Yminor,$g) { set graf_setgrid($gID,Yminor_exist,$g) 1 $can create line \ $graf($gID,Xstart,$g) $yth \ $graf($gID,Xend,$g) $yth \ -width 0.5 \ -fill "#999" \ -tags "graf Ymgrid Ymg$g" \ -stipple @$system(BMPDIR)/dot1x3H.bmp # gridlines must be the lowest ones $can lower Ymgrid graf } elseif { $graf_setgrid($gID,Yminor,$g) == 0 && \ $graf_setgrid($gID,Yminor_exist,$g) == 1 } { # delete gridlines $can delete Ymg$g set graf_setgrid($gID,Yminor_exist,$g) 0 } } } } } } } proc XGraphValue {gID value g} { global grafdata graf return [expr $graf($gID,Xstart,$g) + \ ($value - $grafdata($gID,Xmin,$g)) * $graf($gID,Xratio,$g)] } proc YGraphValue {gID value g} { global grafdata graf return [expr $graf($gID,Ystart,$g) - \ ($value - $grafdata($gID,Ymin,$g)) * $graf($gID,Yratio,$g)] } proc XDataValue {gID value g} { global grafdata graf return [expr $grafdata($gID,Xmin,$g) + \ double($value - $graf($gID,Xstart,$g)) / $graf($gID,Xratio,$g)] } proc YDataValue {gID value g} { global grafdata graf return [expr $grafdata($gID,Ymin,$g) - \ double($value - $graf($gID,Ystart,$g)) / $graf($gID,Yratio,$g)] } proc XPix2Coor {gID value g} { global graf return [expr double($value) / $graf($gID,Xratio,$g)] } proc YPix2Coor {gID value g} { global graf return [expr -1.0 * double($value) / $graf($gID,Yratio,$g)] } proc XRel2Graph {gID value} { global grafsize return [expr $value * double($grafsize($gID,canW))] } proc YRel2Graph {gID value} { global grafsize if { $grafsize($gID,canH) < $grafsize($gID,Yscroll) } { return [expr $value * double($grafsize($gID,Yscroll))] } else { return [expr $value * double($grafsize($gID,canH))] } } proc XGraph2Rel {gID value} { global grafsize return [expr double($value) / double($grafsize($gID,canW))] } proc YGraph2Rel {gID value} { global grafsize if { $grafsize($gID,canH) < $grafsize($gID,Yscroll) } { return [expr double($value) / double($grafsize($gID,Yscroll))] } else { return [expr double($value) / double($grafsize($gID,canH))] } } proc XnMRel2Graph {gID value} { global grafsize return [expr $value * double($grafsize($gID,canW) - \ $grafsize($gID,margin_Y1) - $grafsize($gID,margin_Y2))] } proc YnMRel2Graph {gID value} { global grafsize if { $grafsize($gID,canH) < $grafsize($gID,Yscroll) } { return [expr $value * double($grafsize($gID,Yscroll) - \ $grafsize($gID,margin_X1) - $grafsize($gID,margin_X2))] } else { return [expr $value * double($grafsize($gID,canH) - \ $grafsize($gID,margin_X1) - $grafsize($gID,margin_X2))] } } proc XGraph2nMRel {gID value} { global grafsize return [expr double($value) / double($grafsize($gID,canW) - \ $grafsize($gID,margin_Y1) - $grafsize($gID,margin_Y2))] } proc YGraph2nMRel {gID value} { global grafsize if { $grafsize($gID,canH) < $grafsize($gID,Yscroll) } { return [expr double($value) / double($grafsize($gID,Yscroll) - \ $grafsize($gID,margin_X1) - $grafsize($gID,margin_X2))] } else { return [expr double($value) / double($grafsize($gID,canH) - \ $grafsize($gID,margin_X1) - $grafsize($gID,margin_X2))] } } proc XYAxis {gID can} { global grafdata grafsize graf set cw $grafsize($gID,canW) if { $grafsize($gID,canH) < $grafsize($gID,Yscroll) } { set ch $grafsize($gID,Yscroll) } else { set ch $grafsize($gID,canH) } for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g} { # Y1-axe $can create line $graf($gID,Xstart,$g) $graf($gID,Yend,$g) \ $graf($gID,Xstart,$g) $graf($gID,Ystart,$g) \ -width $grafsize(X1axe_width) \ -tags "graf xyaxis Y1axe Y1a$g" # X1-axe $can create line $graf($gID,Xstart,$g) $graf($gID,Ystart,$g) \ $graf($gID,Xend,$g) $graf($gID,Ystart,$g) \ -width $grafsize(X1axe_width) \ -tags "graf xyaxis X1axe X1a$g" # X2-axe $can create line $graf($gID,Xend,$g) $graf($gID,Ystart,$g) \ $graf($gID,Xend,$g) $graf($gID,Yend,$g) \ -width $grafsize(X2axe_width) \ -tags "graf xyaxis X2axe X2a$g" # Y2-axe $can create line $graf($gID,Xend,$g) $graf($gID,Yend,$g) \ $graf($gID,Xstart,$g) $graf($gID,Yend,$g) \ -width $grafsize(X2axe_width) \ -tags "graf xyaxis Y2axe Y2a$g" # # Y-title # if ![info exists grafdata($gID,Ytitlefont)] { set grafdata($gID,Ytitlefont) $grafdata($gID,deffont) } if [info exists grafdata($gID,Y_title,$g)] { if ![info exists grafdata($gID,Y_title_X,$g)] { if ![info exists grafsize($gID,Yaxe_title_offset)] { set grafdata($gID,Y_title_X,$g) \ -$grafsize(axe_title_offset) } else { set grafdata($gID,Y_title_X,$g) \ -$grafsize($gID,Yaxe_title_offset) } set grafdata($gID,Y_title_Y,$g) 0.5 } $can create text \ [expr $graf($gID,Xstart,$g) + \ $grafdata($gID,Y_title_X,$g)] \ [expr $grafsize($gID,margin_X2) + \ [YnMRel2Graph $gID [expr $graf($gID,RorigY,$g) + \ $graf($gID,RsizeY,$g) * $grafdata($gID,Y_title_Y,$g)]]] \ -anchor e \ -text $grafdata($gID,Y_title,$g) \ -tags "graf xyaxis Ytitle Yti$g" \ -font $grafdata($gID,Ytitlefont) } # # X-title # if ![info exists grafdata($gID,Xtitlefont)] { set grafdata($gID,Xtitlefont) $grafdata($gID,deffont) } if [info exists grafdata($gID,X_title,$g)] { if ![info exists grafdata($gID,X_title_X,$g)] { set grafdata($gID,X_title_X,$g) 0.5 if ![info exists grafsize($gID,Xaxe_title_offset)] { set grafdata($gID,X_title_Y,$g) \ $grafsize(axe_title_offset) } else { set grafdata($gID,X_title_Y,$g) \ $grafsize($gID,Xaxe_title_offset) } } $can create text \ [expr $grafsize($gID,margin_Y1) + \ [XnMRel2Graph $gID [expr $graf($gID,RorigX,$g) + \ $graf($gID,RsizeX,$g) * $grafdata($gID,X_title_X,$g)]]] \ [expr $graf($gID,Ystart,$g) + \ $grafdata($gID,X_title_Y,$g)] \ -anchor n \ -text $grafdata($gID,X_title,$g) \ -tags "graf xyaxis Xtitle Xti$g" \ -font $grafdata($gID,Xtitlefont) } } } proc GetGraphWorld {gID can} { global grafdata grafsize graf # variable "type" is obsolete now; its is here just for compatibility ######################################################################### # axis square set cw $grafsize($gID,canW) if { $grafsize($gID,canH) < $grafsize($gID,Yscroll) } { set ch $grafsize($gID,Yscroll) } else { set ch $grafsize($gID,canH) } if ![info exists grafsize($gID,margin_X1)] { set grafsize($gID,margin_X1) $grafsize(margin_X1) set grafsize($gID,margin_X2) $grafsize(margin_X2) set grafsize($gID,margin_Y1) $grafsize(margin_Y1) set grafsize($gID,margin_Y2) $grafsize(margin_Y2) } set graf($gID,X1) $grafsize($gID,margin_Y1) set graf($gID,Y1) $grafsize($gID,margin_X2) set graf($gID,X2) [expr $cw - $grafsize($gID,margin_Y2)] set graf($gID,Y2) [expr $ch - $grafsize($gID,margin_X1)] set graf($gID,dX) [expr abs($graf($gID,X2) - $graf($gID,X1))] set graf($gID,dY) [expr abs($graf($gID,Y2) - $graf($gID,Y1))] if ![info exists grafdata($gID,N_graf)] { set grafdata($gID,N_graf) 1 } for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g} { # Xoffset is 0.1 --> 1.1 set graf($gID,Xrange,$g) \ [expr $grafdata($gID,Xmax,$g) - $grafdata($gID,Xmin,$g)] set graf($gID,Yrange,$g) \ [expr $grafdata($gID,Ymax,$g) - $grafdata($gID,Ymin,$g)] set graf($gID,Xratio,$g) \ [expr $graf($gID,dX) \ * $graf($gID,RsizeX,$g) / $graf($gID,Xrange,$g)] set graf($gID,Xstart,$g) \ [expr $graf($gID,X1) + \ [XnMRel2Graph $gID $graf($gID,RorigX,$g)]] set graf($gID,Yratio,$g) \ [expr $graf($gID,dY) \ * $graf($gID,RsizeY,$g) / $graf($gID,Yrange,$g)] set graf($gID,Ystart,$g) \ [expr $graf($gID,Y2) - \ [YnMRel2Graph $gID $graf($gID,RorigY,$g)]] set graf($gID,Xend,$g) \ [expr $graf($gID,X1) + \ [XnMRel2Graph $gID [expr $graf($gID,RorigX,$g) + \ $graf($gID,RsizeX,$g)]]] set graf($gID,Yend,$g) \ [expr $graf($gID,Y2) - \ [YnMRel2Graph $gID [expr $graf($gID,RorigY,$g) + \ $graf($gID,RsizeY,$g)]]] } } proc TickFormat {x {dx 1}} { # return formated tick's number if [IsEqual 1e-7 $x 0.0] { return [format "%6.3f" $x] } elseif { abs($x) < 0.01 || abs($x) >= 100 } { return [format "%6.3E" $x] } else { return [format "%6.3f" $x] } } proc GraphInit {} { global grafsize grafdata properties graf_setgrid \ graf_setaxe grafselection xcDebug "GraphInit" # # some initializations for Grapher # set grafsize(canW) 600 set grafsize(canH) 450 set grafsize(margin_X1) 60 set grafsize(margin_X2) 60 set grafsize(margin_Y1) 90 set grafsize(margin_Y2) 60 set grafsize(X1axe_width) 2 set grafsize(X2axe_width) 2 set grafsize(axe_title_offset) 30 set grafsize(curve_width) 0.5 set grafsize(curve_color) #000 set grafsize(Yline_width) 1 set grafsize(Xline_width) 1 set grafsize(Mtick_size) 8 set grafsize(mtick_size) 4 set grafsize(tt_offset) 4 set grafdata(N_text) 0 set grafdata(XYline_textX) 0.05 set grafdata(XYline_textY) 0.05 set grafdata(Xtick_draw) 1 set grafdata(Xtick_text_draw) 1 set grafdata(Ytick_draw) 1 set grafdata(Ytick_text_draw) 1 #set properties(N,1) -1 #set properties(NDM1,1) 1 set properties(TICK1) GAMMA set properties(TICK2) M set properties(TICK3) K set properties(TICK4) GAMMA set properties(TICK5) K set properties(TICK6) L # # grid definition: Default: grid off # set graf_setgrid(Xmajor) 1 set graf_setgrid(Ymajor) 1 set graf_setgrid(Xminor) 1 set graf_setgrid(Yminor) 1 set graf_setgrid(Xmajor_exist) 1 set graf_setgrid(Ymajor_exist) 1 set graf_setgrid(Xminor_exist) 1 set graf_setgrid(Yminor_exist) 1 # # axis definition # set graf_setaxe(mirrorXaxe) 1 set graf_setaxe(mirrorYaxe) 1 # # selection # set grafselection(ButtonPressed) 0 set grafselection(active) 0 set grafselection(allow_move) 0 set grafselection(it_is_curve) 0 set grafselection(item_allowed_to_move) 0 global prop if ![info exists prop(type_of_run)] { # due to stupid programming XCrySDen->CRYSTAL set prop(type_of_run) RHF } } proc GrapherSelect {gID can x y {graphcommand {}} {doubleclick {}} \ {graphcommand {}}} { global grafdata grafselection graf set selection 0 # # some cleaning up # if [info exists grafselection($gID,it_is_curve)] { if $grafselection($gID,it_is_curve) { # make the previous selected curve back to normal $can itemconfigure c$grafselection($gID,selcurve_num) \ -width $grafselection($gID,selcurve_width) \ -fill $grafselection($gID,selcurve_fill) \ -stipple {} set grafselection($gID,it_is_curve) 0 } } $can dtag graf selected $can delete selection if [info exists grafselection($gID,item)] { unset grafselection($gID,item) } if [info exists grafselection($gID,id)] { unset grafselection($gID,id) } if [info exists grafselection($gID,X_textline_i)] { unset grafselection($gID,X_textline_i) } if [info exists grafselection($gID,Y_textline_i)] { unset grafselection($gID,Y_textline_i) } if [info exists grafselection($gID,tickXValue_g)] { unset grafselection($gID,tickXValue_g) } if [info exists grafselection($gID,tickYValue_g)] { unset grafselection($gID,tickYValue_g) } set grafselection($gID,item_allowed_to_move) 0 set grafselection($gID,allow_move) 0 set grafselection($gID,active) 0 # # tags of Grapher items # # curve c$i # text t$i # dummy_rectangles # Xline Xl$i # Xline_textline Xl_tl$i # Xline_text Xl_t$i # Yline Yl$i # Yline_textline Yl_tl$i # Yline_text Yl_t$i # xyaxis X1axe X1$g # xyaxis X2axe X2$g # xyaxis Y1axe Y1$g # xyaxis Y2axe Y2$g # xyaxis Xtitle Xti$g # xyaxis Ytitle Xti$g set id [$can find closest $x $y] xcDebug "GrapherSelect id:: $id" # # definitions for some items - what can be done with them # # bboxitems - bbox will be drawn around them # moveitems - items that are alowed to be moved # # if item is bboxitem --> we have selection set item_found 0 set bboxitems { xyaxis text Xline_text Yline_text tickXValue tickYValue bar } foreach tagOrld $bboxitems { foreach item [$can find withtag $tagOrld] { if { $item == $id } { $can addtag selected withtag $id for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g } { # check if tickXValue or tickYValue foreach itemid [$can find withtag tXV$g] { if { $itemid == $id } { set grafselection($gID,tickXValue_g) $g set bbox [$can bbox tXV$g] $can addtag selected withtag tXV$g break } } foreach itemid [$can find withtag tYV$g] { if { $itemid == $id } { set grafselection($gID,tickYValue_g) $g set bbox [$can bbox tYV$g] $can addtag selected withtag tYV$g break } } # check if item is [X|Y]line_text for {set i 1} {$i <= $grafdata($gID,N_Xline,$g)} {incr i} { if { [$can find withtag Xl_t$g,$i] == $id } { set grafselection($gID,X_textline_i) $i set grafselection($gID,X_textline_g) $g set bbox [$can bbox Xl_t$g,$i Xl_tl$g,$i] $can addtag selected withtag l$g break } } for {set i 1} {$i <= $grafdata($gID,N_Yline,$g)} {incr i} { if { [$can find withtag Yl_t$g,$i] == $id } { set grafselection($gID,Y_textline_i) $i set grafselection($gID,Y_textline_g) $g set bbox [$can bbox Yl_t$g,$i Yl_tl$g,$i] $can addtag selected withtag l$g break } } } # check if it is bar # bar can be very small and its selection will not be visible # - thatwhy enlarge the bounding box if { $grafdata($gID,type) == "BAR" } { for {set i 1} {$i <= $grafdata($gID,N_point,1)} {incr i} { for {set j 1} {$j <= $grafdata($gID,barn,1)} {incr j} { if { [$can find withtag b$j,$i] == $id } { if $grafdata($gID,barshadow,1) { set bbox [$can bbox b$j,$i sb$j,$i] $can addtag selected withtag sb$j,$i } set bbox [$can bbox b$j,$i] set x1 [expr [lindex $bbox 0] - 2] set y1 [expr [lindex $bbox 1] - 5] set x2 [expr [lindex $bbox 2] + 2] set y2 [expr [lindex $bbox 3] + 5] set bbox [list $x1 $y1 $x2 $y2] $can addtag selected withtag b$j,$i break } } } } # check if item is an arbitrary text for {set i 1} {$i <= $grafdata($gID,N_text)} {incr i} { if { [$can find withtag t$i] == $id } { $can addtag selected withtag t_bb$i } } if ![info exists bbox] { set bbox [$can bbox $id] } set x1 [lindex $bbox 0] set y1 [lindex $bbox 1] set x2 [lindex $bbox 2] set y2 [lindex $bbox 3] $can create line \ $x1 $y1 $x1 $y2 $x1 $y2 $x2 $y2 \ $x2 $y2 $x2 $y1 $x2 $y1 $x1 $y1 \ -fill "#f00" \ -width 2 \ -stipple gray25 \ -tags "graf selection" set selection 1 set grafselection(active) 1 if { $doubleclick != {} } { BlinkingRectangle $can 3 $x1 $y1 $x2 $y2 } set item_found 1 break } } if $item_found { break } } set move 0 set moveitems {Xtitle Ytitle text Xline_text Yline_text} foreach tagOrld $moveitems { foreach item [$can find withtag $tagOrld] { if { $item == $id } { set move 1 } } } if $move { set grafselection($gID,allow_move) 1 set grafselection($gID,item_allowed_to_move) 1 } # # goes trough items and locate the item's ID # for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g} { # # maybe curve-tag for {set i 1} {$i <= $grafdata($gID,N_segment,$g)} {incr i} { # one curve might be composed from several lines foreach tmp_id [$can find withtag "c$g,$i"] { #xcDebug "GrapherSelect tmp_id:: $tmp_id" if { $id == $tmp_id } { set grafselection($gID,id) $id set grafselection($gID,item) c$g,$i set grafselection($gID,it_is_curve) 1 set grafselection($gID,selcurve_num) $g,$i set grafselection($gID,selcurve_fill) \ [$can itemcget $tmp_id -fill] set grafselection($gID,selcurve_width) \ [$can itemcget $tmp_id -width] $can itemconfigure c$g,$i -width 3 -fill "#f00" $can raise c$g,$i curve $can addtag selected withtag c$g,$i if { $doubleclick != {} } { foreach aaa {1 2 3} { $can itemconfigure c$g,$i -width 0 xcPause 0.1 $can itemconfigure c$g,$i -width 3 xcPause 0.1 } SetCurveOptions $gID $can $i $g } } } } # # maybe Xtitle if { [$can find withtag Xti$g] == $id } { if { $doubleclick != {} } { xcDebug "Text_fontname:: $grafdata($gID,Xtitlefont)" xcSetTextAtrib "Set X Title #$g" .graph$gID "Set X Title #$g" \ grafdata($gID,X_title,$g) $can \ grafdata($gID,Xtitlefont) Xti$g \ grafdata($gID,Xtitle_fontsize) \ grafdata($gID,Xtitle_fontfamily) \ grafdata($gID,Xtitle_fontweight) \ grafdata($gID,Xtitle_fontslant) \ grafdata($gID,Xtitle_fontunderline) \ grafdata($gID,Xtitle_fontoverstrike) \ grafdata($gID,Xtitle_bbox) # update font set grafdata($gID,Xtitlefont) \ [ModifyFont $grafdata($gID,Xtitlefont) $can \ -size $grafdata($gID,Xtitle_fontsize) \ -family $grafdata($gID,Xtitle_fontfamily) \ -weight $grafdata($gID,Xtitle_fontweight) \ -slant $grafdata($gID,Xtitle_fontslant) \ -underline $grafdata($gID,Xtitle_fontunderline) \ -overstrike $grafdata($gID,Xtitle_fontoverstrike)] } set grafselection($gID,id) $id set grafselection($gID,item) Xti$g } # # maybe Ytitle if { [$can find withtag Yti$g] == $id } { if { $doubleclick != {} } { xcDebug "Text_fontname:: $grafdata($gID,Ytitlefont)" xcSetTextAtrib "Set Y Title #$g" .graph$gID "Set Y Title #$g" \ grafdata($gID,Y_title,$g) $can \ grafdata($gID,Ytitlefont) Yti$g \ grafdata($gID,Ytitle_fontsize) \ grafdata($gID,Ytitle_fontfamily) \ grafdata($gID,Ytitle_fontweight) \ grafdata($gID,Ytitle_fontslant) \ grafdata($gID,Ytitle_fontunderline) \ grafdata($gID,Ytitle_fontoverstrike) \ grafdata($gID,Ytitle_bbox) # update font set grafdata($gID,Ytitlefont) \ [ModifyFont $grafdata($gID,Ytitlefont) $can \ -size $grafdata($gID,Ytitle_fontsize) \ -family $grafdata($gID,Ytitle_fontfamily) \ -weight $grafdata($gID,Ytitle_fontweight) \ -slant $grafdata($gID,Ytitle_fontslant) \ -underline $grafdata($gID,Ytitle_fontunderline) \ -overstrike $grafdata($gID,Ytitle_fontoverstrike)] } set grafselection($gID,id) $id set grafselection($gID,item) Yti$g } # # maybe Xaxe if { [$can find withtag X1a$g] == $id || \ [$can find withtag X2a$g] == $id } { if { $doubleclick != {} } { set graf($gID,active_graf) $g GrapherActivate $gID $can ConfigGrapher $gID $graphcommand axe } set grafselection($gID,id) $id if { [$can find withtag X1a$g] == $id } { set grafselection($gID,item) X1a$g } else { set grafselection($gID,item) X2$g } } # # maybe Yaxe if { [$can find withtag Y1a$g] == $id || \ [$can find withtag Y2a$g] == $id } { if { $doubleclick != {} } { set graf($gID,active_graf) $g GrapherActivate $gID $can ConfigGrapher $gID $graphcommand axe } set grafselection($gID,id) $id if { [$can find withtag Y1a$g] == $id } { set grafselection($gID,item) Y1a$g } else { set grafselection($gID,item) Y2a$g } } } # # maybe bar if { $grafdata($gID,type) == "BAR" } { for {set i 1} {$i <= $grafdata($gID,N_point,1)} {incr i} { for {set j 1} {$j <= $grafdata($gID,barn,1)} {incr j} { if { [$can find withtag b$j,$i] == $id } { set grafselection($gID,id) $id set grafselection($gID,item) b$j,$i if { $doubleclick != {} } { SetBarAtrib $gID $j $i } } } } } # # maybe Xline_text if [info exists grafselection($gID,X_textline_i)] { set i $grafselection($gID,X_textline_i) set g $grafselection($gID,X_textline_g) set grafselection($gID,id) $id set grafselection($gID,item) Xl_t$g,$i if { $doubleclick != {} } { xcSetTextAtrib "Set Legend #$i,$g" \ .graph$gID "Set Legend #$i,$g" \ grafdata($gID,Xline${i}_text,$g) $can \ grafdata($gID,legendfont) Xl_t$g,$i \ grafdata($gID,legend_fontsize) \ grafdata($gID,legend_fontfamily) \ grafdata($gID,legend_fontweight) \ grafdata($gID,legend_fontslant) \ grafdata($gID,legend_fontunderline) \ grafdata($gID,legend_fontoverstrike) \ grafdata($gID,legend_bbox) # update font set grafdata($gID,legendfont) \ [ModifyFont $grafdata($gID,legendfont) $can \ -size $grafdata($gID,legend_fontsize) \ -family $grafdata($gID,legend_fontfamily) \ -weight $grafdata($gID,legend_fontweight) \ -slant $grafdata($gID,legend_fontslant) \ -underline $grafdata($gID,legend_fontunderline) \ -overstrike $grafdata($gID,legend_fontoverstrike)] xcDebug "Text_fontname:: $grafdata($gID,legendfont)" } } # # maybe Yline_text if [info exists grafselection($gID,Y_textline_i)] { set i $grafselection($gID,Y_textline_i) set g $grafselection($gID,Y_textline_g) set grafselection($gID,id) $id set grafselection($gID,item) Yl_t$g,$i if { $doubleclick != {} } { xcSetTextAtrib "Set Legend #$i,$g" \ .graph$gID "Set Legend #$i,$g" \ grafdata($gID,Yline${i}_text,$g) $can \ grafdata($gID,legendfont) Yl_t$g,$i \ grafdata($gID,legend_fontsize) \ grafdata($gID,legend_fontfamily) \ grafdata($gID,legend_fontweight) \ grafdata($gID,legend_fontslant) \ grafdata($gID,legend_fontunderline) \ grafdata($gID,legend_fontoverstrike) \ grafdata($gID,legend_bbox) # update font set grafdata($gID,legendfont) \ [ModifyFont $grafdata($gID,legendfont) $can \ -size $grafdata($gID,legend_fontsize) \ -family $grafdata($gID,legend_fontfamily) \ -weight $grafdata($gID,legend_fontweight) \ -slant $grafdata($gID,legend_fontslant) \ -underline $grafdata($gID,legend_fontunderline) \ -overstrike $grafdata($gID,legend_fontoverstrike)] xcDebug "Text_fontname:: $grafdata($gID,legendfont)" } } # # maybe tickXValue if [info exists grafselection($gID,tickXValue_g)] { set g $grafselection($gID,tickXValue_g) set grafselection($gID,id) $id set grafselection($gID,item) tXV$g if { $doubleclick != {} } { xcSetTextAtrib "Set Font for X-Tics #$g" \ .graph$gID "Set Font for X-Tics #$g" \ {} $can \ grafdata($gID,Xtickfont) tXV$g \ grafdata($gID,Xtick_fontsize) \ grafdata($gID,Xtick_fontfamily) \ grafdata($gID,Xtick_fontweight) \ grafdata($gID,Xtick_fontslant) \ grafdata($gID,Xtick_fontunderline) \ grafdata($gID,Xtick_fontoverstrike) \ grafdata($gID,Xtick_bbox) # update font set grafdata($gID,Xtickfont) \ [ModifyFont $grafdata($gID,Xtickfont) $can \ -size $grafdata($gID,Xtick_fontsize) \ -family $grafdata($gID,Xtick_fontfamily) \ -weight $grafdata($gID,Xtick_fontweight) \ -slant $grafdata($gID,Xtick_fontslant) \ -underline $grafdata($gID,Xtick_fontunderline) \ -overstrike $grafdata($gID,Xtick_fontoverstrike)] xcDebug "Text_fontname:: $grafdata($gID,Xtickfont)" } } # # maybe tickYValue if [info exists grafselection($gID,tickYValue_g)] { set g $grafselection($gID,tickYValue_g) set grafselection($gID,id) $id set grafselection($gID,item) tYV$g if { $doubleclick != {} } { xcSetTextAtrib "Set Font for Y-Tics #$g" \ .graph$gID "Set Font for Y-Tics #$g" \ {} $can \ grafdata($gID,Ytickfont) tYV$g \ grafdata($gID,Ytick_fontsize) \ grafdata($gID,Ytick_fontfamily) \ grafdata($gID,Ytick_fontweight) \ grafdata($gID,Ytick_fontslant) \ grafdata($gID,Ytick_fontunderline) \ grafdata($gID,Ytick_fontoverstrike) \ grafdata($gID,Ytick_bbox) # update font set grafdata($gID,Ytickfont) \ [ModifyFont $grafdata($gID,Ytickfont) $can \ -size $grafdata($gID,Ytick_fontsize) \ -family $grafdata($gID,Ytick_fontfamily) \ -weight $grafdata($gID,Ytick_fontweight) \ -slant $grafdata($gID,Ytick_fontslant) \ -underline $grafdata($gID,Ytick_fontunderline) \ -overstrike $grafdata($gID,Ytick_fontoverstrike)] xcDebug "Text_fontname:: $grafdata($gID,Ytickfont)" } } # # maybe arbitrary text for {set i 1} {$i <= $grafdata($gID,N_text)} {incr i} { if { [$can find withtag t$i] == $id } { set grafselection($gID,id) $id set grafselection($gID,item) t$i if { $doubleclick != {} } { xcSetTextAtrib "Set Text #$i" .graph$gID "Set Text #$i" \ grafdata($gID,text$i) $can \ grafdata($gID,text${i}_font) t$i \ grafdata($gID,text${i}_fontsize) \ grafdata($gID,text${i}_fontfamily) \ grafdata($gID,text${i}_fontweight) \ grafdata($gID,text${i}_fontslant) \ grafdata($gID,text${i}_fontunderline) \ grafdata($gID,text${i}_fontoverstrike) \ grafdata($gID,text${i}_bbox) # update font set grafdata($gID,text${i}_font) \ [ModifyFont $grafdata($gID,text${i}_font) $can \ -size $grafdata($gID,text${i}_fontsize) \ -family $grafdata($gID,text${i}_fontfamily) \ -weight $grafdata($gID,text${i}_fontweight) \ -slant $grafdata($gID,text${i}_fontslant) \ -underline $grafdata($gID,text${i}_fontunderline) \ -overstrike $grafdata($gID,text${i}_fontoverstrike)] xcDebug "Text_fontname:: $grafdata($gID,text${i}_font)" } } } # # this is used with conjuction of GrapherSelectMotion # set grafselection($gID,ButtonPressed) 1 set grafselection($gID,lastX) $x set grafselection($gID,lastY) $y # # # if it was double-click do the following if { $doubleclick != {} } { set grafselection($gID,ButtonPressed) 0 set grafselection($gID,allow_move) 0 # now update the Grapher UpdateGrapher $gID $can $graphcommand $can raise position dummy_rectangles } } proc GrapherSelectMotion {gID can x y} { global grafselection grafselection grafdata graf if ![info exists grafselection($gID,allow_move)] { set grafselection($gID,allow_move) 0 set grafselection($gID,ButtonPressed) 0 } xcDebug "GrapherSelectMotion:: $grafselection($gID,allow_move)" # # in the upper left corner of Grapher the current position of # mouse pointer will be displayed # if { ![info exists grafselection($gID,exist_position_text)] } { set grafselection($gID,position_text) \ [format "(%f, %f)" \ [XDataValue $gID $x $graf($gID,active_graf)] \ [YDataValue $gID $y $graf($gID,active_graf)]] set grafselection($gID,label_window) [label $can.l -relief sunken \ -textvariable grafselection($gID,position_text) \ -font $grafdata($gID,deffont) \ -width 20 \ -bd 2] $can create window 10 10 \ -anchor nw \ -window $grafselection($gID,label_window) \ -tags "graf position" set grafselection($gID,exist_position_text) 1 } elseif { [$can find withtag position] == {} } { # # the "position" item was deleted; recreate # $can create window 10 10 \ -anchor nw \ -window $grafselection($gID,label_window) \ -tags "graf position" } else { set grafselection($gID,position_text) \ [format "(%f, %f)" \ [XDataValue $gID $x $graf($gID,active_graf)] \ [YDataValue $gID $y $graf($gID,active_graf)]] } if { $grafselection($gID,ButtonPressed) == 1 && \ [info exists grafselection($gID,id)] && \ $grafselection($gID,allow_move) } { if ![info exist grafselection($gID,lastX)] { set grafselection($gID,lastX) $x set grafselection($gID,lastY) $y return } set dx [expr $x - $grafselection($gID,lastX)] set dy [expr $y - $grafselection($gID,lastY)] xcDebug "(dx,dy):: $dx , $dy" # move selected item and its bounding box # maybe there are more th $can move selected $dx $dy $can move selection $dx $dy set grafselection($gID,lastX) $x set grafselection($gID,lastY) $y # for some items the current coordinates must be updated GrapherMoveCoor $gID $dx $dy } } proc GrapherMoveCoor {gID dx dy} { global grafdata grafselection # # is it X/Ytitle item for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g} { if { $grafselection($gID,item) == "Xti$g" } { set grafdata($gID,X_title_X,$g) \ [expr $grafdata($gID,X_title_X,$g) + \ [XGraph2nMRel $gID $dx]] set grafdata($gID,X_title_Y,$g) \ [expr $grafdata($gID,X_title_Y,$g) + $dy] break } if { $grafselection($gID,item) == "Yti$g" } { set grafdata($gID,Y_title_X,$g) \ [expr $grafdata($gID,Y_title_X,$g) + $dx] set grafdata($gID,Y_title_Y,$g) \ [expr $grafdata($gID,Y_title_Y,$g) + \ [YGraph2nMRel $gID $dy]] break } } # # check if item is [X|Y]line_text set xyline 0 for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g } { for {set i 1} {$i <= $grafdata($gID,N_Xline,$g)} {incr i} { if { $grafselection($gID,item) == "Xl_t$g,$i" } { set xyline 1 break } } for {set i 1} {$i <= $grafdata($gID,N_Yline,$g)} {incr i} { if { $grafselection($gID,item) == "Yl_t$g,$i" } { set xyline 1 break } } if $xyline { set grafdata($gID,XYline_textX,$g) \ [expr $grafdata($gID,XYline_textX,$g) - \ [XGraph2nMRel $gID $dx]] set grafdata($gID,XYline_textY,$g) \ [expr $grafdata($gID,XYline_textY,$g) + \ [YGraph2nMRel $gID $dy]] break } } # # check for "text" items if [string match t\[0-9\]* $grafselection($gID,item)] { for {set i 1} {$i <= $grafdata($gID,N_text)} {incr i} { if { $grafselection($gID,item) == "t$i" } { if [info exists grafdata($gID,text${i}_X)] { xcDebug "--text recognized--" set grafdata($gID,text${i}_X) \ [expr $grafdata($gID,text${i}_X) + \ [XGraph2nMRel $gID $dx]] set grafdata($gID,text${i}_Y) \ [expr $grafdata($gID,text${i}_Y) + \ [YGraph2nMRel $gID $dy]] } } } } } proc GrapherSelectRelease gID { global grafselection set grafselection($gID,ButtonPressed) 0 set grafselection($gID,allow_move) 0 } proc GrapherKeyBindings {gID can what} { global grafselection grafdata xcDebug "GrapherKeyBindings" if ![info exists grafselection($gID,id)] { return } set dx 0 set dy 0 set id [$can find withtag selected] xcDebug "GrapherKeyBindings $can $what; $grafselection($gID,item)" switch -exact -- $what { left {set dx -1} right {set dx 1} up {set dy -1} down {set dy 1} delete { # only arbitrary texts can be deleted so far for {set i 1} {$i <= $grafdata($gID,N_text)} {incr i} { if { [$can find withtag t$i] == $grafselection($gID,id) } { $can delete selected selection t_bb$i unset grafdata($gID,text$i) unset grafdata($gID,text${i}_X) unset grafdata($gID,text${i}_Y) } } } default { return } } if $grafselection($gID,item_allowed_to_move) { $can move selected $dx $dy $can move selection $dx $dy GrapherMoveCoor $gID $dx $dy } } proc BlinkingRectangle {can ntime x1 y1 x2 y2} { xcDebug "BlinkingRectangle:: $can $ntime $x1 $y1 $x2 $y2" for {set i 0} {$i < $ntime} {incr i} { $can create rectangle $x1 $y1 $x2 $y2 \ -fill "#f00" \ -tags "blinking_rectangle" \ -stipple gray50 update xcPause 0.1 $can delete blinking_rectangle update xcPause 0.1 } } #lappend auto_path "/home/tone/src/xcrysden0.0/src" #lappend auto_path [pwd] # #set system(TOPDIR) [pwd] #set system(SCRDIR) /tmp #set system(PWD) [pwd] #set system(PID) [pid] #set system(FORDIR) $system(TOPDIR)/F #set system(TCLDIR) $system(TOPDIR) #set system(BINDIR) $system(TOPDIR) #set system(BMPDIR) $system(TOPDIR)/bitmap #GraphInit # #button .b -text TONE #entry .e -text TONE #set xcFonts(normal) [lindex [.b configure -font] end] #set xcFonts(normal_entry) [lindex [.e configure -font] end] #set xcFonts(small) [ModifyFontSize .b 10 \ # {-family helvetica -slant r -weight bold}] #set xcFonts(small_entry) [ModifyFontSize .e 10 \ # {-family helvetica -slant r -weight normal}] #destroy .b .e # #trace variable grafdata(X_title_X) w PrintTrace #trace variable grafdata(X_title_Y) w PrintTrace #trace variable grafdata(Y_title_X) w PrintTrace #trace variable grafdata(Y_title_Y) w PrintTrace # #proc PrintTrace {array elem op} { # set var "${array}(${elem})" # upvar $var varn # # xcDebug "PrintTrace:: $var == $varn" #} # #set prop(type_of_run) RHF #set prop(N,1) 1 #set prop(NDM,1) 1 #set prop(N,2) 1 #set prop(NDM,2) 2 #set prop(N,3) 1 #set prop(NDM,3) 3 # #set prop(dir) /home/tone/pt/bulk/scanbulk/band_doss # ##set prop(file) doss_spd.f ##DOSSGraph 3 ##Grapher XYGraph # #set prop(file) bwid.out #BWIDGraph $prop(dir)/$prop(file) #Grapher BARGraph # ##set prop(file) LDAVWN_pband111.f ##BANDGraph 3 ##Grapher XYGraph # xcrysden-1.6.2/Tcl/header.tcl0000644000175000017500000000172111712736221014534 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/__file__ # ------ # # Copyright (c) 1996--2004 by Anton Kokalj # ############################################################################# xcrysden-1.6.2/Tcl/selection.tcl0000644000175000017500000006231012720023660015266 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/selection.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # warning:: some outer procs use select global variable as well, so # You should never unset the select variable after done/selected/cancel # button was closed # proc SelCheck {com oper} { global maxsel nsel #com .... command to exexute if OK #oper ... name of command/operation to execute if OK if { $maxsel != $nsel } { dialog .selcheck Warning "WARNING: You must select $maxsel \ atoms for $oper" warning 0 OK return } else { eval $com } } proc Done {w com {tplw {}}} { global maxsel nsel select SelPlane SelAtomCL SelHoleCL SelLabel SelLine # w...name of canvas # tlpw...name of selection toplevel if { $nsel == $maxsel } { for {set i 1} {$i <= $maxsel} {incr i} { selectRecordToFields_ $i } # this 'ifs' are for PLANE SELECTION -- AdvOption puts stderr "Selection Done: com == $com" if { [lindex $com 0] != "PlaneSel" && \ [lindex $com 0] != "PlaneSelSel" && \ [lindex $com 0] != "SelCentreAtomCLSel" && \ [lindex $com 0] != "LabelSelSel" && \ [lindex $com 0] != "LineSelSel" && \ [lindex $com 0] != "ParalleSel" && \ [lindex $com 0] != "AtomSel" } { eval $com return } elseif { [lindex $com 0] == "PlaneSel" } { Plane return } elseif { [lindex $com 0] == "SelCentreAtomCL" } { SelCentreAtomCL return } elseif { [lindex $com 0] == "PlaneSelSel" } { set SelPlane(plane) [Plane] DeSel $tplw $w set SelPlane(done) 1 return $SelPlane(plane) } elseif { [lindex $com 0] == "SelCentreAtomCLSel" } { set SelAtomCL(centre) [SelCentreAtomCL] DeSel $tplw $w set SelAtomCL(done) 1 return $SelAtomCL(centre) } elseif { [lindex $com 0] == "LabelSelSel" } { set SelLabel(label) [LabelSel] set SelLabel(done) 1 DeSel $tplw $w return $SelLabel(label) } elseif { [lindex $com 0] == "LineSelSel" } { set SelLine(coor) [LineSel] set SelLine(done) 1 DeSel $tplw $w return $SelLine(coor) } elseif { [lindex $com 0] == "ParalleSel" || \ [lindex $com 0] == "AtomSel"} { DeSel $tplw $w set select(done) 1 return } } else { # for SelCentreHoleCLSel its not needed that $nsel == $maxsel for {set i 1} {$i <= $nsel} {incr i} { selectRecordToFields_ $i #set select(Nat$i) [lindex $select(obj,$i) 2] #set select(X$i) [lindex $select(obj,$i) 3] #set select(Y$i) [lindex $select(obj,$i) 4] #set select(Z$i) [lindex $select(obj,$i) 5] } if { [lindex $com 0] == "SelCentreHoleCL" } { SelCentreHoleCL return } elseif { [lindex $com 0] == "SelCentreHoleCLSel" } { set SelHoleCL(done) 1 set SelHoleCL(centre) [SelCentreHoleCL] DeSel $tplw $w return $SelHoleCL(centre) } } } proc NextSel {com} { global select maxsel nsel xc_select .mesa clean xc_select .mesa begin set select(initialized) 1 # delete all text $select(textWid) config -state normal $select(textWid) delete 0.0 end # update "iron text" set nsel 0 selectUpdateText $com #VoidTextSel $select(textWid) $com $maxsel } #----------------------------------------------------------------------------- # this is for Line-Adding type of ATOMINSE command proc LineSel {{w {}}} { global select maxsel SelLine err system ######################################## # CD to $system(SCRDIR) cd $system(SCRDIR) ######################################## # is fraction of line-length specified correctly check_var {{SelLine(fract) fract}} $SelLine(entry) if $err { return } # R = R1 + t*(R2-R1); t...fraction of R2-R1 set t $SelLine(fract) set x [expr $select(X1) + $t*($select(X2) - $select(X1))] set y [expr $select(Y1) + $t*($select(Y2) - $select(Y1))] set z [expr $select(Z1) + $t*($select(Z2) - $select(Z1))] # translate point to first cell set fileID [open "$system(SCRDIR)/xc_tmp.$system(PID)" w] puts $fileID "0 $x $y $z" flush $fileID close $fileID $select(textWid) config -state normal # t.k.: atomlab return coordinates in Angs units if { [catch {set coor [exec $system(FORDIR)/atomlab 2 \ $system(SCRDIR)/xc_struc.$system(PID) \ $system(SCRDIR)/xc_tmp.$system(PID)]} errmsg] } { $select(textWid) delete [expr $maxsel + 4].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 5].0 $errmsg $select(textWid) config -state disabled } else { set xx [lindex $coor 0] set yy [lindex $coor 1] set zz [lindex $coor 2] set coor [coorToUnit $select(unit) $x $y $z] set tr_coor [coorToUnit $select(unit) $xx $yy $zz] $select(textWid) insert [expr $maxsel + 4].0 "Coordinates of point are: \ [eval {format {%6.10f %6.10f %6.10f}} $coor]\n" if { abs($x-$xx) > 1e-5 || abs($y-$yy) > 1e-5 || abs($z-$zz) > 1e-5 } { $select(textWid) insert [expr $maxsel + 5].0 "Coordinates translated to: \ [eval {format {%6.10f %6.10f %6.10f}} $tr_coor]\n" } $select(textWid) config -state disabled return "$xx $yy $zz" } } # ------------------------------------------------------------------------- # this is for selecting a centre of CLUSTER (AdvGeom option) # WE NEED TO SELECT ONE ATOM proc SelCentreAtomCL {{w {}}} { global select maxsel set coor [coorToUnit $select(unit) $select(X1) $select(Y1) $select(Z1)] $select(textWid) config -state normal $select(textWid) delete [expr $maxsel + 5].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 5].0 "Coordinates of selected atom are: $coor\n" $select(textWid) config -state disabled return "$select(X1) $select(Y1) $select(Z1)" } # ------------------------------------------------------------------------- # this is for selecting a centre of CLUSTER (AdvGeom option) # WE NEED TO SELECT A HOLE (geometrical centre of several atoms) proc SelCentreHoleCL {{w {}}} { global select nsel maxsel SelHoleCL system #nsel ... number of selected atoms ######################################## # CD to $system(SCRDIR) cd $system(SCRDIR) ######################################## set xc 0.0 set yc 0.0 set zc 0.0 for {set i 1} {$i <= $nsel} {incr i} { set xc [expr $xc + $select(X$i)] set yc [expr $yc + $select(Y$i)] set zc [expr $zc + $select(Z$i)] } set xc [expr $xc / $nsel] set yc [expr $yc / $nsel] set zc [expr $zc / $nsel] $select(textWid) config -state normal $select(textWid) delete [expr $nsel + 3].0 [expr $maxsel + 5].end $select(textWid) insert [expr $nsel + 3].0 \ "\n----------------------------------------------------------------------------------\n\n" # if SetHoleCL(transl) exists --> translate hole to basic cell if { [info exists SelHoleCL(transl)] } { WriteFile "$system(SCRDIR)/xc_tmp.$system(PID)" "0 $xc $yc $zc" if { [catch {set label [exec $system(FORDIR)/atomlab 2 \ $system(SCRDIR)/xc_struc.$system(PID) \ $system(SCRDIR)/xc_tmp.$system(PID)]} errmsg] } { $select(textWid) delete [expr $maxsel + 4].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 5].0 $errmsg $select(textWid) config -state disabled } else { # todo: if the point wasn't translated, don't make the # message: "coordinates translated to ..." set x [lindex $label 0] set y [lindex $label 1] set z [lindex $label 2] set coor [coorToUnit $select(unit) $xc $yc $zc] set tr_coor [coorToUnit $select(unit) $x $y $z] $select(textWid) insert [expr $maxsel + 4].0 "Coordinates of \"hole\" are: \ [eval {format {%6.10f %6.10f %6.10f}} $coor]\n" if { abs($x-$xc) > 1e-5 || abs($y-$yc) > 1e-5 || abs($z-$zc) > 1e-5 } { $select(textWid) insert [expr $maxsel + 5].0 "Coordinates translated to: \ [eval {format {%6.10f %6.10f %6.10f}} $tr_coor]\n" } $select(textWid) config -state disabled return "$x $y $z" } } else { set coor [coorToUnit $select(unit) $xc $yc $zc] $select(textWid) insert [expr $nsel + 5].0 \ "Coordinates of \"hole\" are: [eval {format {%6.10f %6.10f %6.10f}} $coor]\n" $select(textWid) config -state disabled return "$xc $yc $zc" } } proc Plane {{w {}}} { global select maxsel Plane system ######################################## # CD to $system(SCRDIR) cd $system(SCRDIR) ######################################## #---------------------------------------------- # I THINK THAT $w is NOT NEEDED -CHECK THIS # if I gonna remove $w, than it should be also removed from the # Angle Dihedral Distance procs & from all calls #----------------------------------------------- # first check for linear dependence of atomic positions set x21 [expr $select(X1) - $select(X2)] set y21 [expr $select(Y1) - $select(Y2)] set z21 [expr $select(Z1) - $select(Z2)] set d21 [expr sqrt( $x21 * $x21 + $y21 * $y21 + $z21 * $z21)] set x32 [expr $select(X2) - $select(X3)] set y32 [expr $select(Y2) - $select(Y3)] set z32 [expr $select(Z2) - $select(Z3)] set d32 [expr sqrt( $x32 * $x32 + $y32 * $y32 + $z32 * $z32)] set ab [expr $x21 * $x32 + $y21 * $y32 + $z21 * $z32] set dif [ expr abs($ab - $d21 * $d32) ] $select(textWid) config -state normal if { $dif < 0.01 } { $select(textWid) delete [expr $maxsel + 4].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 5].0 \ "WARNING: linear dependence of atomic positions !!!" return } # puts the coor of 3 sel. points into $system(SCRDIR)/xc_tmp.$pid set plncrd [open "$system(SCRDIR)/xc_tmp.$system(PID)" w] puts $plncrd "$select(X1) $select(Y1) $select(Z1)" puts $plncrd "$select(X2) $select(Y2) $select(Z2)" puts $plncrd "$select(X3) $select(Y3) $select(Z3)" flush $plncrd close $plncrd puts stdout "$select(X1) $select(Y1) $select(Z1)" puts stdout "$select(X2) $select(Y2) $select(Z2)" puts stdout "$select(X3) $select(Y3) $select(Z3)\n##############" #eval [list exec cat $system(SCRDIR)/xc_tmp.$system(PID)] ReadFile $system(SCRDIR)/xc_tmp.$system(PID) # now calculate a plane xcDebug "$system(FORDIR)/calplane \ $system(SCRDIR)/xc_struc.$system(PID) \ $system(SCRDIR)/xc_tmp.$system(PID)" set fileID [open "|$system(FORDIR)/calplane \ $system(SCRDIR)/xc_struc.$system(PID) \ $system(SCRDIR)/xc_tmp.$system(PID)"] set Plane [read $fileID] set Plane1 [lrange $Plane 0 2] set Plane2 [lrange $Plane 3 5] close $fileID $select(textWid) delete [expr $maxsel + 4].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 4].0 \ "Unrounded Miller indexes: $Plane1\n" $select(textWid) insert [expr $maxsel + 5].0 \ "Miller indexes rounded to: $Plane2" $select(textWid) config -state disabled # $select(textWid) insert [expr $maxsel + 3].0 "$Plane" return $Plane2 } proc Dihedral {w} { global select maxsel set pi 3.14159265358979323844 # we've three vectors: 21,32,34 # vector 32 is normal vector set x21 [expr $select(X1) - $select(X2)] set y21 [expr $select(Y1) - $select(Y2)] set z21 [expr $select(Z1) - $select(Z2)] # normal vector: set x32 [expr $select(X2) - $select(X3)] set y32 [expr $select(Y2) - $select(Y3)] set z32 [expr $select(Z2) - $select(Z3)] set x34 [expr $select(X4) - $select(X3)] set y34 [expr $select(Y4) - $select(Y3)] set z34 [expr $select(Z4) - $select(Z3)] # now vectror ar...projection of 21 on surface R (n is norm.v. of R) # br...projection of 34 on surface R # la -lambda a; factor # lb -lambda b; factor set sd32 [expr $x32 * $x32 + $y32 * $y32 + $z32 * $z32] set la [expr ( $x21 * $x32 + $y21 * $y32 + $z21 * $z32 ) / $sd32 ] set lb [expr ( $x34 * $x32 + $y34 * $y32 + $z34 * $z32 ) / $sd32 ] set xar [expr $x21 - $la * $x32] set yar [expr $y21 - $la * $y32] set zar [expr $z21 - $la * $z32] set ar [expr sqrt($xar * $xar + $yar * $yar + $zar * $zar)] set xbr [expr $x34 - $lb * $x32] set ybr [expr $y34 - $lb * $y32] set zbr [expr $z34 - $lb * $z32] set br [expr sqrt($xbr * $xbr + $ybr * $ybr + $zbr * $zbr)] set arbr [expr $ar * $br] $select(textWid) config -state normal if { $arbr < 0.01 } { $select(textWid) delete [expr $maxsel + 5].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 5].0 \ "WARNING: Linear dependance of atomic positions !!!" return } set var [expr ( $xar * $xbr + $yar * $ybr + $zar * $zbr ) / \ ( $arbr )] # $var colud be greater than one, due to roundoff error if { $var > 1.0 } {set var 1.0} if { $var < -1.0 } {set var -1.0} puts stdout "acos:: $var" set dihedr [expr acos($var) * 180.0 / $pi] $select(textWid) delete [expr $maxsel + 5].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 5].0 [format "Dihedral Angle is %.${select(angl_precision)}f deg" $dihedr] $select(textWid) config -state disabled return $dihedr } proc Angle {w} { global select maxsel nsel set pi 3.14159265358979323844 # this is just for testing if { $nsel == $maxsel } { set x21 [expr $select(X1) - $select(X2)] set y21 [expr $select(Y1) - $select(Y2)] set z21 [expr $select(Z1) - $select(Z2)] set dist21 [expr sqrt($x21 * $x21 + $y21 * $y21 + $z21 * $z21)] set x23 [expr $select(X3) - $select(X2)] set y23 [expr $select(Y3) - $select(Y2)] set z23 [expr $select(Z3) - $select(Z2)] set dist23 [expr sqrt($x23 * $x23 + $y23 * $y23 + $z23 * $z23)] set var [expr ( $x21 * $x23 + $y21 * $y23 + $z21 * $z23 ) / \ ( $dist21 * $dist23 )] # var could be greater than 1.0, due to roundoff error if { $var > 1.0 } {set var 1.0} if { $var < -1.0 } {set var -1.0} set angl [expr acos($var) * 180.0 / $pi] $select(textWid) config -state normal $select(textWid) delete [expr $maxsel + 5].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 5].0 [format "Angle is %.${select(angl_precision)}f deg" $angl] $select(textWid) config -state disabled return $angl } } proc Distance {w} { global select maxsel nsel Const # this is just for testing if { $nsel == $maxsel } { puts stdout "DISTANCE BETWEEN ATOMS: \n\ $select(X1) $select(Y1) $select(Z1) \n\ $select(X2) $select(Y2) $select(Z2)" set dx [expr $select(X1) - $select(X2)] set dy [expr $select(Y1) - $select(Y2)] set dz [expr $select(Z1) - $select(Z2)] set dist [expr sqrt($dx * $dx + $dy * $dy + $dz * $dz)] set distBohr [expr $dist / $Const(bohr)] # first delete, then insert $select(textWid) config -state normal $select(textWid) delete [expr $maxsel + 5].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 5].0 [format "Distance is %.${select(dist_precision)}f ANGSTROMS = %.${select(dist_precision)}f Bohrs" $dist $distBohr] $select(textWid) config -state disabled return $dist } } proc AtomInfo {{w {}}} { # this is dummy procedure return } proc SelectAtom { com x y } { global select nsel maxsel Xor Yor df zoom xcDebug -debug "SelectAtom" # if we click the atom first time --> SELECTION # if we click the atom second time --> DESELECTION set sel 1 set obj [xc_select .mesa sqn $x $y] # if $obj == 0 -> no atom was selected if { $obj == 0 } { xcDebug -debug "AtomSelect End" return } $select(textWid) config -state normal for {set i 1} {$i <= $nsel} {incr i} { if { $obj == $select(atomID,$i) } { # DESELECT ATOM xc_deselect .mesa atom $obj set sel 0 for {set j $i} {$j < $nsel} {incr j} { set jj [expr $j + 1] set select(atomID,$j) $select(atomID,$jj) set select(obj,$j) $select(obj,$jj) } incr nsel -1 selectUpdateText $com # this is for selection bond-lines rearranging if { $nsel >= 1 } { xc_deselect .mesa line } for {set j 1} {$j < $nsel} {incr j} { set jj [expr $j + 1] set select(lineID,$j) [xc_select .mesa line \ $select(atomID,$j) $select(atomID,$jj)] } # finish changes xc_select .mesa finish return } } if { $nsel < $maxsel && $sel == 1} { incr nsel set select(atomID,$nsel) $obj set select(obj,$nsel) [xc_select .mesa atom $obj] selectUpdateText $com } # draw a line between select atom & previous selected atom if { $nsel <= $maxsel && $nsel > 1 } { set nsel1 [expr $nsel - 1] set select(lineID,$nsel1) [xc_select .mesa line \ $select(atomID,$nsel1) $select(atomID,$nsel)] } $select(textWid) config -state disabled # now flush to display all changes xc_select .mesa finish xcDebug -debug "AtomSelect End" update } proc PreSel {w c topname title com m} { global maxsel nsel SelLine select check periodic # PreSel ...PrepareSelection # w ... name of topwidget # c ... name of canvas # topname . name of toplevel # title ... title # com ..... command to exexute # m ....... set maxsel $m if { $check(perspective) } { set select(revert_to_perspective) 1 set check(perspective) 0 Perspective } else { set select(revert_to_perspective) 0 } set select(selection_mode) 1 # some initializations $c config -cursor cross bind $c [list SelectAtom $com %x %y] # due to configuring of $c the display of $c vanish, # to fix that call "update" update xc_select .mesa begin set select(initialized) 1 set nsel 0 set maxsel $m # make selection toplevel widget if { [winfo exists $w] } { return } xcToplevel $w $topname "Selection" . 0 0 1 AlwaysOnTopON . $w bind $w [list DeSel $w $c] focus $w set topfrm [frame $w.topfrm -class StressText] set titl [label $topfrm.lbl -text $title -relief groove -bd 2] pack $topfrm -side top -expand 1 -fill x pack $titl -expand 1 -fill x -ipady 3 -ipadx 10 -pady 10 -padx 10 #set frm [frame $w.frm -bd 1] if { $maxsel <= 4 } { set height [expr $maxsel + 5] set select(textWid) [text $w.text -relief sunken \ -width 82 -height $height -font TkFixedFont] } else { # for SelCentreHoleCL maxsel could be up to 15 set height 12 set fts [frame $w.f1] pack $fts -side top -expand 1 set select(textWid) [text $fts.text -relief sunken -width 82 -height \ $height -yscrollcommand "$fts.sy set" -font TkFixedFont] scrollbar $fts.sy -orient vert -command "$select(textWid) yview" pack $fts.sy -side right -fill y } # lengt units radiobuttons if { ! [info exists select(unit)] } { set select(unit) angs } set midfrm [labelframe $w.midfrm -text "Display coordinates in units:"] foreach unit { angs bohr conv prim alat } txt { Angstrom Bohr Crystal-Convetional Crystal-Primitive Alat } { radiobutton $midfrm.$unit -text $txt -variable select(unit) -value $unit -anchor w pack $midfrm.$unit -side left -padx 2 -pady 0 -fill x -expand 1 } if { $periodic(dim) == 0 } { # disable conv prim alat radiobuttons foreach unit {conv prim alat} { $midfrm.$unit configure -state disabled } } _select_unit $com select unit "" trace add variable select(unit) write [list _select_unit $com] # buttons "Done", "Next", "Close" set botfrm [frame $w.botfrm] # if $comm == "LineSel" -> there must also be entry for specifying the # line-length fraction if { $com == "LineSel" } { set llf [frame $botfrm.llf -relief groove -bd 2] pack $llf -side left -expand 1 -padx 20 -pady 10 Entries $llf {{Line-Length Fraction:}} SelLine(fract) 10 # remember which entry to focus in case of error set SelLine(entry) $llf.frame.entry1 } if { $com != "AtomInfo" && $com != "AtomSel" && $com != "ParalleSel" } { set but1 [button $botfrm.done -text "Done" -command \ [list Done $c "$com $c"]] pack $but1 -side left -padx 5 -pady 3 -expand 1 } set but2 [button $botfrm.next -text "Next" \ -command [list NextSel $com]] set but3 [button $botfrm.can -text "Close" -command \ [list DeSel $w $c]] pack $select(textWid) -side top -padx 10 -pady 3 -fill x -expand 1 pack $midfrm -side top -padx 10 -fill x -expand 1 pack $botfrm -side top -fill both -expand 1 pack $but2 $but3 -side left -padx 5 -pady 3 -expand 1 # extra button when we are selecting a Plane or "Centre of # Cluster" for AdvGeom if { $com == "PlaneSel" || $com == "SelCentreAtomCL" || \ $com == "SelCentreHoleCL" || $com == "LabelSel" || \ $com == "LineSel" } { set but4 [button $botfrm.sel -text "Selected" -command \ [list Done $c "${com}Sel $c" $w]] pack $but4 -side left -padx 5 -pady 3 -expand 1 } # extra button when we are selecting the IsoSpace/IsoPlane if { $com == "AtomSel" || $com == "ParalleSel" } { set but4 [button $botfrm.sel -text "Selected" -command \ [list Done $c ${com} $w]] pack $but4 -side left -padx 5 -pady 3 -expand 1 } selectUpdateText $com #VoidTextSel $select(textWid) $com $maxsel return $w } #proc VoidTextSel {textWid com maxsel} { # $textWid config -state normal # $textWid insert 1.0 \ # " ID Sym Atm.Num X/ANGSTROMS Y/ANGSTROMS Z/ANGSTROMS\n" # $textWid insert 2.0 \ # "--------------------------------------------------------------------------------\n" # for {set i 1} {$i <= $maxsel} {incr i} { # if { $com != "SelCentreHoleCL" } { # $textWid insert [expr $i + 2].0 "Selected Atom No.$i: \n" # } # } # # if $com == "SelCentreHoleCL", we do not know how many atoms will be # # selected, but for all other $com we do know # if { $com != "SelCentreHoleCL" } { # $textWid insert [expr $maxsel + 3].0 \ # "--------------------------------------------------------------------------------\n\n" # } # # $textWid config -state disabled #} proc DeSel {w c} { global xcCursor select check xcDebug "DeSel" if { $select(initialized) } { # in order to clean, initialization should be performed first !!! xc_select .mesa clean } set select(selection_mode) 0 set select(initialized) 0 $c config -cursor $xcCursor(default) bind $c {} if { [winfo exists $w] } { bind $w {} destroy $w } if { $select(revert_to_perspective) } { set check(perspective) 1 Perspective } } proc selectRecordToFields_ {i} { global select set select(Sqn$i) [lindex $select(obj,$i) 0] set select(Sym$i) [lindex $select(obj,$i) 1] set select(Nat$i) [lindex $select(obj,$i) 2] set select(X$i) [lindex $select(obj,$i) 3] set select(Y$i) [lindex $select(obj,$i) 4] set select(Z$i) [lindex $select(obj,$i) 5] } proc selectDisplayCoor_ {i} { global select selectRecordToFields_ $i set coor [coorToUnit $select(unit) $select(X$i) $select(Y$i) $select(Z$i)] set select(disp_X$i) [lindex $coor 0] set select(disp_Y$i) [lindex $coor 1] set select(disp_Z$i) [lindex $coor 2] } proc selectUpdateText {{com ""}} { global select maxsel nsel switch -- $select(unit) { bohr { set unit Bohr } prim { set unit CrystalPrim } conv { set unit CrystalConv } alat { set unit Alat } angs - default { set unit Angstrom } } for {set i 1} {$i <= $nsel} {incr i} { selectDisplayCoor_ $i } $select(textWid) config -state normal $select(textWid) delete 0.0 end $select(textWid) insert 1.0 \ [format "%21s ID Sym Atm.Num X/%-12s Y/%-12s Z/%-9s\n" { } $unit $unit $unit] $select(textWid) insert 2.0 \ "----------------------------------------------------------------------------------\n" for {set i 1} {$i <= $nsel} {incr i} { set data [format " %-3d %-3s %-3d %+14.9f %+14.9f %+14.9f" \ $select(Sqn$i) $select(Sym$i) $select(Nat$i) $select(disp_X$i) $select(disp_Y$i) $select(disp_Z$i)] $select(textWid) insert [expr $i + 2].0 "Selected Atom No.$i: $data\n" } for {set i [expr $nsel + 1]} {$i <= $maxsel} {incr i} { if { $com != "SelCentreHoleCL" } { $select(textWid) insert [expr $i + 2].0 "Selected Atom No.$i: \n" } } # if $com == "SelCentreHoleCL", we do not know how many atoms will be # selected, but for all other $com we do know if { $com != "SelCentreHoleCL" } { $select(textWid) insert [expr $maxsel + 3].0 \ "----------------------------------------------------------------------------------\n\n" } $select(textWid) config -state disabled } proc _select_unit {com name1 name2 ops} { global select if { $name1 != "select" && $name2 != "unit" } { return } selectUpdateText $com } xcrysden-1.6.2/Tcl/wnDensity.tcl0000644000175000017500000004674212352551636015312 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnDensity.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc wnDensity dir { global system geng set filehead [file tail $dir] if { ! [file isdirectory $dir] } { # $dir is not a directory; ERROR ErrorDialog "couldn't find directory \"$dir\" while trying to render wnDensity" return 0 } #cd $system(SCRDIR) #exec cp $dir/$filehead.struct $filehead.struct #if [catch {exec $system(FORDIR)/str2xcr $filehead}] { # tk_dialog [WidgetName] ERROR \ # "ERROR while executing \"str2xcr\" program" \ # error 0 OK # return #} # #set geng(M3_ARGUMENT) [GetGengM3Arg BOHR 95] ##set xcMisc(titlefile) $filehead #xcCatchExecReturn $system(FORDIR)/gengeom $geng(M1_PRIM) $geng(M2_CELL) \ # $geng(M3_ARGUMENT) 1 1 1 1 \ # $system(SCRDIR)/xc_struc.$system(PID) \ # $system(SCRDIR)/$filehead.xcr # # *.output5 & *.rho file must exists!!! # foreach file [list $dir/$filehead.output5 $dir/$filehead.rho] { if { ! [file exists $file] } { # $dir is not a directory; ERROR ErrorDialog "couldn't find file \"$file\" while trying to render wnDensity" return 0 } } #xcCatchExecReturn $system(awk) -f $system(AWKDIR)/getOV.awk $dir/$filehead.output5 if { [catch {set vec [exec $system(awk) -f $system(AWKDIR)/getOV.awk \ $dir/$filehead.output5]}] } { ErrorDialog "error while executing \"getOV.awk\" program" return } # # since wnOpenSFile routine was called before wnDensity, the struct file # already converted to $system(SCRDIR)/xc_struc.$system(PID) set geom [ReadFile $system(SCRDIR)/xc_struc.$system(PID)] update set fID [open $dir/$filehead.rho r] set outID [open $system(SCRDIR)/xc_struc.$system(PID) w] ################################ # make XCRYSDEN STRUCTURE FILE # ################################ puts $outID $geom puts $outID "BEGIN_BLOCK_DATAGRID2D" puts $outID "Density_by_WIEN____FILE_generated_by_XCrySDen" puts $outID "DATAGRID_2D_Total_Density" # # WARNING: WIEN is writing grid as (den(i,j),j=1,ny),i=1,nx, BUT # XCrySDen is reading it as (den(i,j),i=1,nx),j=1,ny # FIXING: interchange vec-X with vec-Y and interchange nx with ny # set i 0 foreach line [split [read -nonewline $fID] \n] { if { $i == 0 } { puts $outID [concat [lindex $line 1] [lindex $line 0]] puts $outID $vec } else { # read the rest of the file and write to datagrid puts $outID $line } incr i } puts $outID "END_DATAGRID_2D" puts $outID "END_BLOCK_DATAGRID2D" flush $outID close $outID close $fID # # now execute xc_updatestr and ... # UpdateStruct .mesa $system(SCRDIR)/xc_struc.$system(PID) Get_sInfoArray xc_isodatagrid info xc_isodatagrid 0 0 1.0 DataGrid2Isosurf IsoControl2D } proc wnDensity2D_or_3D dir { global prop wn set wn(filehead) [file tail $dir] if { ! [file isdirectory $dir] } { # $dir is not a directory; ERROR ErrorDialog "couldn't find directory \"$dir\" while trying to render wnDensity" exit_pr } set wn(dir) $dir # check if *.clmval[up|dn] exists #if { [glob -nocomplain -- $dir/$filehead.clm*] == {} } { # tk_dialog [WidgetName] ERROR \ # "ERROR: no \"$filehead.clm*\" files were found !!!" error 0 OK # exit_pr # return 0 #} set wn(lapw5) {x lapw5} if { $wn(complex) } { set wn(lapw5) {x lapw5 -c} } # # this is to prevent inconveniences; otherwise prop is used for CRYSTALXX # set prop(type_of_run) RHF set wn(done) 0 SetIsoSurfArray # # ask user what to do: 2D/3D # set t [xcToplevel [WidgetName] "wnDensity: 2D/3D plot" \ "wnDensity" . 25 50 1] catch { grab $t } set f [frame $t.f -relief raised -bd 2 -class StressText] pack $f -fill both -expand 1 label $f.l -text "Choose 2D/3D Density Plot" -relief groove -bd 2 set d2 [button $f.d2 -text "2D Density Plot" \ -command {global wn; set wn(plot_dim) 2D}] set d3 [button $f.d3 -text "3D Density Plot" \ -command {global wn; set wn(plot_dim) 3D}] pack $f.l $d2 $d3 -side top -padx 20 -pady 10 -ipadx 10 -ipady 10 tkwait variable wn(plot_dim) catch { grab release $t } destroy $t SetIsoGridSpace \ "wnDensity $wn(plot_dim) Map - Grid Specification" "Grid" \ {WIEN} $wn(plot_dim) tkwait variable wn(done) } proc wnMakeIn5_2D3D {pov {dim 2D}} { global wn isosurf system # 2D ... pov stands for points # 3D ... pov stands for origin & vectors a,b,c set t [WidgetName] wnDensityFlags $t tkwait window $t set in5_file $wn(filehead).in5 if $wn(complex) { set in5_file ${in5_file}c } if { $dim == "2D" } { # point 1 will be taken for origin # point 2 as X-end of plot # point 3 as Y-end of plot # # 0--3 Y/0 # | | | # 1--2 O/1--X/2 # # points are in angstroms!!! # X-vector set v(0,0) [expr [lindex $pov 6] - [lindex $pov 3]] set v(0,1) [expr [lindex $pov 7] - [lindex $pov 4]] set v(0,2) [expr [lindex $pov 8] - [lindex $pov 5]] # Y-vector set v(1,0) [expr [lindex $pov 0] - [lindex $pov 3]] set v(1,1) [expr [lindex $pov 1] - [lindex $pov 4]] set v(1,2) [expr [lindex $pov 2] - [lindex $pov 5]] } elseif { $dim == "3D" } { # pov == origin # vec1 # vec2 # vec3 set o(0) [lindex $pov 0] set o(1) [lindex $pov 1] set o(2) [lindex $pov 2] xcDebug -debug "Pov:: $pov" xcDebug -debug "Origin:: $o(0) $o(1) $o(2)" for {set i 0} {$i < 3} {incr i} { for {set j 0} {$j <3} {incr j} { set index [expr 3 + $i*3 + $j] set v($i,$j) [lindex $pov $index] } xcDebug -debug "Vector:: $v($i,0) $v($i,1) $v($i,2)" } } else { xcDebug -stderr "************\nunknown dim $dim, must be 2D or 3D\n************" return } set distX [expr sqrt($v(0,0)*$v(0,0) + $v(0,1)*$v(0,1) + $v(0,2)*$v(0,2))] set distY [expr sqrt($v(1,0)*$v(1,0) + $v(1,1)*$v(1,1) + $v(1,2)*$v(1,2))] if { $isosurf(res_type) == "points" } { # let this be number of points in X-dir set wn(nx) $isosurf(resol_poi) set res [expr $distX / $wn(nx)] } else { if { $isosurf(mb_angs/bohr) == "Angstroms" } { set res [expr double($isosurf(resol_ang))] } else { set res [Bohr2Angs $isosurf(resol_ang)] } set wn(nx) [expr round( $distX / $res )] } set wn(ny) [expr round( $distY / $res )] if { $dim == "3D" } { set distZ [expr sqrt($v(2,0)*$v(2,0) + $v(2,1)*$v(2,1) + $v(2,2)*$v(2,2))] set wn(nz) [expr round( $distZ / $res )] } # find out the crystal lattice type from *.struct file??? This is save !!! # WIENXX convention: # P -> primitive # F,B,C -> conventional # H -> hexagonal primitive # R -> hexagonal primitive (that is conventional for R) switch -glob -- $wn(lattice_type) { P* { set vtype prim } F* { set vtype conv } B* { set vtype conv } CXY* { set vtype conv } CYZ* { set vtype conv } CXZ* { set vtype conv } R* { set vtype prim } H* { set vtype prim } } if { $dim == "2D" } { set frpoi [xc_isospacesel .mesa fractcoor -vtype $vtype] set m 1.0e7 set im [expr round($m)] for {set i 0} {$i < 3} {incr i} { set y($i) [expr round([lindex $frpoi [expr 0 + $i]] * $m)] set o($i) [expr round([lindex $frpoi [expr 3 + $i]] * $m)] set x($i) [expr round([lindex $frpoi [expr 6 + $i]] * $m)] } append in5 "[format %12d%12d%12d%14d $o(0) $o(1) $o(2) $im]\n" append in5 "[format %12d%12d%12d%14d $x(0) $x(1) $x(2) $im]\n" append in5 "[format %12d%12d%12d%14d $y(0) $y(1) $y(2) $im]\n" append in5 "$wn(xnsh) $wn(ynsh) $wn(znsh)\n" append in5 "$wn(nx) $wn(ny)\n" append in5 [format "%-4s%-4s\n" $wn(den_flag) $wn(spin_flag)] append in5 [format "%-4s%-4s%-4s\n" \ $wn(unit_flag) $wn(norm_flag) $wn(debu_flag)] append in5 "NONORTHO\n" ######################################################### # now give user the opportunity to check the *.in5 file # ######################################################### set t [xcToplevel $t "wnDensity: check the $in5_file file" \ "wnDensity" . 25 50 1] set f1 [frame $t.1 -relief raised -bd 2] set f2 [frame $t.2 -relief raised -bd 2] pack $f1 -side top -expand 1 -fill both pack $f2 -side top -expand 1 -fill x set text [DispText $f1.f $in5 60 15] set ok [DefaultButton $f2.ok -text OK \ -command [list wnMakeIn5_2D_OK $t $text $in5_file]] pack $ok -padx 5 -pady 10 -expand 1 } elseif { $dim == "3D" } { # convert from Cartesian to Fractional set orig [xc_fractcoor -ctype $vtype -coor [list $o(0) $o(1) $o(2)]] set ori(0) [lindex $orig 0] set ori(1) [lindex $orig 1] set ori(2) [lindex $orig 2] for {set i 0} {$i < 3} {incr i} { set lvec [xc_fractcoor -ctype $vtype -coor [list $v($i,0) $v($i,1) $v($i,2)]] for {set j 0} {$j < 3} {incr j} { set vec($i,$j) [lindex $lvec $j] } } set t [xcToplevel [WidgetName] "Calculating 3D grid of points" \ "Calculating" . 100 250 1] set f [frame $t.f -relief raised -bd 2 -width 400] pack $f -expand 1 set wn(calc_slice_text) "\ \n\ *** WIEN is calculating 3D grid of points ***\n\ \n\ Number of 2D slices to calculate: $wn(nz)\n\ Progress: 0 / $wn(nz)\n" set m [label $f.m \ -textvariable wn(calc_slice_text) \ -justify left \ -relief groove -bd 2] set ff [frame $f.f] pack $m $ff -side top -expand 1 -ipadx 10 -ipady 10 -padx 10 -pady 10 set w [expr round(300 / $wn(nz))] for {set i 1} {$i <= $wn(nz)} {incr i} { frame $ff.$i -width $w -height 8m -relief raised -bd 2 grid $ff.$i -row 0 -column $i } file delete $system(SCRDIR)/xc_rho.$system(PID) ############################# # vec(-1,$) is DUMMY & must be (0.0, 0.0, 0.0)!!!!!!!! set vec(-1,0) 0.0 set vec(-1,1) 0.0 set vec(-1,2) 0.0 for {set i 0} {$i < $wn(nz)} {incr i} { ############################ # calculate $wn(nz) slices # ############################ if { $wn(nz) > 1 } { set f [expr $i / [expr $wn(nz) - 1.0]] } else { set f 1.0 } for {set j -1} {$j < 2} {incr j} { set jj [expr $j + 1] set v($i,$jj,0) \ [expr $ori(0) + $vec($j,0) + $f * $vec(2,0)] set v($i,$jj,1) \ [expr $ori(1) + $vec($j,1) + $f * $vec(2,1)] set v($i,$jj,2) \ [expr $ori(2) + $vec($j,2) + $f * $vec(2,2)] xcDebug "Factor:: $f\nEndPoints:: $v($i,$jj,0) $v($i,$jj,1) $v($i,$jj,2)\n" } set m 1.0e7 set im [expr round($m)] for {set j 0} {$j < 3} {incr j} { set io($j) [expr round( $v($i,0,$j) * $m)] set ix($j) [expr round( $v($i,1,$j) * $m)] set iy($j) [expr round( $v($i,2,$j) * $m)] } set in5 {} append in5 "[format %12d%12d%12d%14d $io(0) $io(1) $io(2) $im]\n" append in5 "[format %12d%12d%12d%14d $ix(0) $ix(1) $ix(2) $im]\n" append in5 "[format %12d%12d%12d%14d $iy(0) $iy(1) $iy(2) $im]\n" append in5 "$wn(xnsh) $wn(ynsh) $wn(znsh)\n" append in5 "$wn(nx) $wn(ny)\n" append in5 [format "%-4s%-4s\n" $wn(den_flag) $wn(spin_flag)] append in5 [format "%-4s%-4s%-4s\n" \ $wn(unit_flag) $wn(norm_flag) $wn(debu_flag)] append in5 "NONORTHO\n" xcDebug "****************************" xcDebug "Calculating slice::::\n$in5" xcDebug "****************************" if { $i > 0 } { file copy -force $in5_file ${in5_file}.$i } WriteFile $wn(dir)/$in5_file $in5 w # # now run WIEN2k # if { ![wnRunWIEN $wn(exe_flag) {WIEN program is calculating the grid of points now. It can take some time, so PLEASE WAIT!!!} \ $wn(dir)/$wn(filehead).output5] } { # exit, since an error occured destroy $t exit_pr return } # now append the *.rho file to $system(SCRDIR)/xc_rho.$$ wnAppendRhoFile # update "progress" window set ii [expr $i + 1] set wn(calc_slice_text) "\ \n\ *** WIEN is calculating 3D grid of points ***\n\ \n\ Number of 2D slices to calculate: $wn(nz)\n\ Progress: $ii / $wn(nz)\n" $ff.$ii config -bg "#5f5" update } # destro progress widget destroy $t ################################ # make XCRYSDEN STRUCTURE FILE # ################################ # since wnOpenSFile routine was called before wnDensity, # the struct file already converted to # $system(SCRDIR)/xc_struc.$system(PID) set geom [ReadFile $system(SCRDIR)/xc_struc.$system(PID)] update set fID [open $system(SCRDIR)/xc_rho.$system(PID) r] set outID [open $system(SCRDIR)/xc_struc.$system(PID) w] # # WARNING: WIEN is writing grid as (den(i,j),j=1,ny),i=1,nx, BUT # XCrySDen is reading it as (den(i,j),i=1,nx),j=1,ny # FIXING: interchange vec-X with vec-Y and interchange nx with ny # puts $outID $geom puts $outID "BEGIN_BLOCK_DATAGRID3D" puts $outID "Density_by_WIEN____FILE_generated_by_XCrySDen" puts $outID "DATAGRID_3D_Total_Density" puts $outID "$wn(ny) $wn(nx) $wn(nz)" puts $outID "$o(0) $o(1) $o(2)" puts $outID "$v(1,0) $v(1,1) $v(1,2)" puts $outID "$v(0,0) $v(0,1) $v(0,2)" puts $outID "$v(2,0) $v(2,1) $v(2,2)" foreach line [split [read -nonewline $fID] \n] { # read the rho file and write to struct file puts $outID $line } puts $outID "END_DATAGRID_3D" puts $outID "END_BLOCK_DATAGRID3D" flush $outID close $outID close $fID # rho file is no more needed, delete it file delete $system(SCRDIR)/xc_rho.$system(PID) # # now execute xc_updatestr and render isosurface # UpdateStruct .mesa $system(SCRDIR)/xc_struc.$system(PID) Get_sInfoArray xc_isodatagrid info xc_isodatagrid 0 0 1.0 DataGrid2Isosurf IsoControl } } proc wnAppendRhoFile {} { global wn system set out [ReadFile -nonewline $wn(dir)/$wn(filehead).rho] set il 0 foreach line [split $out \n] { if { $il > 0 } { append output "$line\n" } incr il } #if { ! [file exists $system(SCRDIR)/xc_rho.$system(PID)] } { # #exec touch $system(SCRDIR)/xc_rho.$system(PID) # WriteFile $system(SCRDIR)/xc_rho.$system(PID) {} #} WriteFile $system(SCRDIR)/xc_rho.$system(PID) $output a } proc wnMakeIn5_2D_OK {t textw in5_file} { global wn # t ... toplevel # textw ... text widget set text [$textw get 1.0 end] xcDebug "${in5_file}::\n$text" WriteFile $wn(dir)/$in5_file $text w CancelProc $t # # now run WIEN2k # if ![wnRunWIEN $wn(exe_flag) {WIEN program is calculating the grid of points now. It can take some time, so PLEASE WAIT!!!} \ $wn(dir)/$wn(filehead).output5] { # exit, since an error occured exit_pr return } wnDensity $wn(dir) } proc wnDensityFlags t { global wn # some parameters must be queried xcToplevel $t "wnDensity - Specify Flags" "wnDensity" . 25 50 1 set f1 [frame $t.f1 -relief raised -bd 2] set f2 [frame $t.f2 -relief raised -bd 2] pack $f1 $f2 -side top -expand 1 -fill both set wn(exe_flag) $wn(lapw5) if { $wn(spin_polarized) == 1 } { set wn(exe_flag) [concat $wn(lapw5) -up] } set wn(xnsh) 3 set wn(ynsh) 2 set wn(znsh) 3 set wn(den_flag) RHO set wn(spin_flag) ADD set wn(unit_flag) ATU set wn(norm_flag) VAL set wn(debu_flag) NODEBUG frame $f1.f FillEntries $f1.f {"# of X shells:" "# of Y shells:" "# of Z shells:"} \ {wn(xnsh) wn(ynsh) wn(znsh)} 14 10 xcDebug -debug "wn(spin_polarized) = $wn(spin_polarized)" if $wn(spin_polarized) { set mt1 [concat $wn(lapw5) -up] set mt2 [concat $wn(lapw5) -dn] set mb_exeflag [xcMenuButton $f1 -labeltext "Execution Flag:" \ -labelwidth 14 \ -textvariable wn(exe_flag) \ -menu [list \ $mt1 {set wn(exe_flag) [concat $wn(lapw5) -up]} \ $mt2 {set wn(exe_flag) [concat $wn(lapw5) -dn]}]] } set mb_den [xcMenuButton $f1 -labeltext "Density Flag:" -labelwidth 14 \ -textvariable wn(den_flag) \ -menu { "SCF Density (RHO)" {set wn(den_flag) RHO} "Difference Density (DIFF)" {set wn(den_flag) DIFF} "Superposition of Atomic Density (OVER)" {set wn(den_flag) OVER} }] set mb_spin [xcMenuButton $f1 -labeltext "Spin Flag:" -labelwidth 14 \ -textvariable wn(spin_flag) \ -menu { "Total Density (ADD)" {set wn(spin_flag) ADD} "Spin Density (SUB)" {set wn(spin_flag) SUB} }] if !$wn(spin_polarized) { xcDisableAll $mb_spin } set mb_unit [xcMenuButton $f1 -labeltext "Unit Flag:" -labelwidth 14 \ -textvariable wn(unit_flag) \ -menu { "e / a.u.^3 (ATU)" {set wn(unit_flag) ATU} "e / A^3 (ANG)" {set wn(unit_flag) ANG} }] set mb_norm [xcMenuButton $f1 -labeltext "Norm. Flag:" -labelwidth 14 \ -textvariable wn(norm_flag) \ -menu { "Valence Density (VAL)" {set wn(norm_flag) VAL} "Total Density (TOT)" {set wn(norm_flag) TOT} }] set mb_debu [xcMenuButton $f1 -labeltext "Debug Flag:" -labelwidth 14 \ -textvariable wn(debu_flag) \ -menu { "No Debugging (NODEBUG)" {set wn(debu_flag) NODEBUG} "Debugging (DEBUG)" {set wn(debu_flag) DEBUG} }] grid $f1.f -column 0 -row 0 -sticky w -padx 10 -pady 5 if $wn(spin_polarized) { grid $mb_exeflag -column 0 -row 1 -sticky w -padx 10 -pady 5 } grid $mb_den -column 0 -row 2 -sticky w -padx 10 -pady 5 grid $mb_spin -column 0 -row 3 -sticky w -padx 10 -pady 5 grid $mb_unit -column 0 -row 4 -sticky w -padx 10 -pady 5 grid $mb_norm -column 0 -row 5 -sticky w -padx 10 -pady 5 grid $mb_debu -column 0 -row 6 -sticky w -padx 10 -pady 5 # let the user determine also execution type set ok [DefaultButton $f2.ok -text OK \ -command [list wnDensityFlagsOK $t]] set can [button $f2.can -text Cancel -command exit_pr] pack $can $ok -side left -padx 5 -pady 10 -expand 1 } proc wnDensityFlagsOK t { global wn # # so far user will have to choose correct flags, # no checking will be performed # CancelProc $t set wn(done1) 1; #this is not needed !!! } # tmp proc:: #proc PrintDecIdv list { # # set idv [lindex $list 3] # # set i0 [expr double([lindex $list 0]) / double($idv)] # set i1 [expr double([lindex $list 1]) / double($idv)] # set i2 [expr double([lindex $list 2]) / double($idv)] # xcDebug "$i0 $i1 $i2" #} #lappend auto_path "/home/tone/prog/XCrys/XCrySDen0.1" #button .b -text TONE #entry .e -text TONE #set xcFonts(normal) [lindex [.b configure -font] end] #set xcFonts(normal_entry) [lindex [.e configure -font] end] #set xcFonts(small) [ModifyFontSize .b 10 \ # {-family helvetica -slant r -weight bold}] #set xcFonts(small_entry) [ModifyFontSize .e 10 \ # {-family helvetica -slant r -weight normal}] #destroy .b .e # #wnDensityFlags [WidgetName] xcrysden-1.6.2/Tcl/tclIndex0000644000175000017500000020733613556022211014302 0ustar tonetone# Tcl autoload index file, version 2.0 # This file is generated by the "auto_mkindex" command # and sourced to set up indexing information for one or # more commands. Typically each line is a command that # sets an element in the auto_index array, where the # element name is the name of a command and the value is # a script that loads the command. set auto_index(GrapherID) [list source [file join $dir Grapher.tcl]] set auto_index(CurrentGrapherID) [list source [file join $dir Grapher.tcl]] set auto_index(NextGrapherID) [list source [file join $dir Grapher.tcl]] set auto_index(Grapher) [list source [file join $dir Grapher.tcl]] set auto_index(ResizeGrapher) [list source [file join $dir Grapher.tcl]] set auto_index(PlaceGrapher) [list source [file join $dir Grapher.tcl]] set auto_index(GrapherActivate) [list source [file join $dir Grapher.tcl]] set auto_index(UpdateGrapher) [list source [file join $dir Grapher.tcl]] set auto_index(QuitGrapher) [list source [file join $dir Grapher.tcl]] set auto_index(GraphPrint) [list source [file join $dir Grapher.tcl]] set auto_index(gr_isInside) [list source [file join $dir Grapher.tcl]] set auto_index(gr_OIInterp) [list source [file join $dir Grapher.tcl]] set auto_index(gr_IOInter) [list source [file join $dir Grapher.tcl]] set auto_index(XYGraph) [list source [file join $dir Grapher.tcl]] set auto_index(BARGraph) [list source [file join $dir Grapher.tcl]] set auto_index(GrapherArbitraryText) [list source [file join $dir Grapher.tcl]] set auto_index(GrapherDummyRect) [list source [file join $dir Grapher.tcl]] set auto_index(GraphTickLines) [list source [file join $dir Grapher.tcl]] set auto_index(XGraphValue) [list source [file join $dir Grapher.tcl]] set auto_index(YGraphValue) [list source [file join $dir Grapher.tcl]] set auto_index(XDataValue) [list source [file join $dir Grapher.tcl]] set auto_index(YDataValue) [list source [file join $dir Grapher.tcl]] set auto_index(XPix2Coor) [list source [file join $dir Grapher.tcl]] set auto_index(YPix2Coor) [list source [file join $dir Grapher.tcl]] set auto_index(XRel2Graph) [list source [file join $dir Grapher.tcl]] set auto_index(YRel2Graph) [list source [file join $dir Grapher.tcl]] set auto_index(XGraph2Rel) [list source [file join $dir Grapher.tcl]] set auto_index(YGraph2Rel) [list source [file join $dir Grapher.tcl]] set auto_index(XnMRel2Graph) [list source [file join $dir Grapher.tcl]] set auto_index(YnMRel2Graph) [list source [file join $dir Grapher.tcl]] set auto_index(XGraph2nMRel) [list source [file join $dir Grapher.tcl]] set auto_index(YGraph2nMRel) [list source [file join $dir Grapher.tcl]] set auto_index(XYAxis) [list source [file join $dir Grapher.tcl]] set auto_index(GetGraphWorld) [list source [file join $dir Grapher.tcl]] set auto_index(TickFormat) [list source [file join $dir Grapher.tcl]] set auto_index(GraphInit) [list source [file join $dir Grapher.tcl]] set auto_index(GrapherSelect) [list source [file join $dir Grapher.tcl]] set auto_index(GrapherSelectMotion) [list source [file join $dir Grapher.tcl]] set auto_index(GrapherMoveCoor) [list source [file join $dir Grapher.tcl]] set auto_index(GrapherSelectRelease) [list source [file join $dir Grapher.tcl]] set auto_index(GrapherKeyBindings) [list source [file join $dir Grapher.tcl]] set auto_index(BlinkingRectangle) [list source [file join $dir Grapher.tcl]] set auto_index(ViewMol) [list source [file join $dir Viewer.tcl]] set auto_index(exit_viewer) [list source [file join $dir Viewer.tcl]] set auto_index(scrollControlToolboxCmd) [list source [file join $dir Viewer.tcl]] set auto_index(ResizeGlobWin) [list source [file join $dir Viewer.tcl]] set auto_index(PlaceGlobWin) [list source [file join $dir Viewer.tcl]] set auto_index(ViewMolFrame1) [list source [file join $dir Viewer.tcl]] set auto_index(ViewMolFrame2) [list source [file join $dir Viewer.tcl]] set auto_index(Rotate) [list source [file join $dir Viewer.tcl]] set auto_index(Transl) [list source [file join $dir Viewer.tcl]] set auto_index(Viewer:_clickAndClick) [list source [file join $dir Viewer.tcl]] set auto_index(MouseZoom) [list source [file join $dir Viewer.tcl]] set auto_index(MouseZoomBrelease) [list source [file join $dir Viewer.tcl]] set auto_index(MouseWheelZoom) [list source [file join $dir Viewer.tcl]] set auto_index(WindowsMouseWheel) [list source [file join $dir Viewer.tcl]] set auto_index(RelB1) [list source [file join $dir Viewer.tcl]] set auto_index(MainGeom) [list source [file join $dir Viewer.tcl]] set auto_index(maximizeDisplay) [list source [file join $dir Viewer.tcl]] set auto_index(maximizeDisplay:popupMenu) [list source [file join $dir Viewer.tcl]] set auto_index(Style3D) [list source [file join $dir Viewer.tcl]] set auto_index(bindCB) [list source [file join $dir Viewer.tcl]] set auto_index(Viewer:rotZoomButtonMode) [list source [file join $dir Viewer.tcl]] set auto_index(doubleOnly) [list source [file join $dir Viewer.tcl]] set auto_index(addOption) [list source [file join $dir addOption.tcl]] set auto_index(addOption:parse) [list source [file join $dir addOption.tcl]] set auto_index(addOption:register) [list source [file join $dir addOption.tcl]] set auto_index(addOption:printCustomUsage) [list source [file join $dir addOption.tcl]] set auto_index(addOption:hardcoded) [list source [file join $dir addOption.tcl]] set auto_index(addOption:reload) [list source [file join $dir addOption.tcl]] set auto_index(CutSlab) [list source [file join $dir advGeom.tcl]] set auto_index(CutSlabOK) [list source [file join $dir advGeom.tcl]] set auto_index(Cancel) [list source [file join $dir advGeom.tcl]] set auto_index(SelPlane) [list source [file join $dir advGeom.tcl]] set auto_index(CutCluster) [list source [file join $dir advGeom.tcl]] set auto_index(SelClusCoor) [list source [file join $dir advGeom.tcl]] set auto_index(CentreAtomCL) [list source [file join $dir advGeom.tcl]] set auto_index(CentreHoleCL) [list source [file join $dir advGeom.tcl]] set auto_index(CutClusOK) [list source [file join $dir advGeom.tcl]] set auto_index(CutCLInput1) [list source [file join $dir advGeom.tcl]] set auto_index(NeighAnal) [list source [file join $dir advGeom.tcl]] set auto_index(NeighAnalOK) [list source [file join $dir advGeom.tcl]] set auto_index(NeighAnalCan) [list source [file join $dir advGeom.tcl]] set auto_index(CoorNum) [list source [file join $dir advGeom.tcl]] set auto_index(NCoorOK) [list source [file join $dir advGeom.tcl]] set auto_index(GetCoorNum) [list source [file join $dir advGeom.tcl]] set auto_index(CoorNumOK) [list source [file join $dir advGeom.tcl]] set auto_index(CoorNumCan) [list source [file join $dir advGeom.tcl]] set auto_index(SetNMO) [list source [file join $dir advGeom.tcl]] set auto_index(DispFirstRun) [list source [file join $dir advGeom.tcl]] set auto_index(ClusInfo) [list source [file join $dir advGeom.tcl]] set auto_index(ViewCluster) [list source [file join $dir advGeom.tcl]] set auto_index(How2BordMod) [list source [file join $dir advGeom.tcl]] set auto_index(BordModSeq) [list source [file join $dir advGeom.tcl]] set auto_index(BordMod) [list source [file join $dir advGeom.tcl]] set auto_index(NBordM) [list source [file join $dir advGeom.tcl]] set auto_index(BordModOK) [list source [file join $dir advGeom.tcl]] set auto_index(xcRenderCluster) [list source [file join $dir advGeom.tcl]] set auto_index(AtomSubs) [list source [file join $dir advGeom2.tcl]] set auto_index(SelAtomLabel) [list source [file join $dir advGeom2.tcl]] set auto_index(LabelSel) [list source [file join $dir advGeom2.tcl]] set auto_index(AtomRemo) [list source [file join $dir advGeom2.tcl]] set auto_index(AtomLabOK) [list source [file join $dir advGeom2.tcl]] set auto_index(AtomInse) [list source [file join $dir advGeom2.tcl]] set auto_index(AddAtom) [list source [file join $dir advGeom2.tcl]] set auto_index(AddAtomOKCan) [list source [file join $dir advGeom2.tcl]] set auto_index(CellAdding) [list source [file join $dir advGeom2.tcl]] set auto_index(SuperCell) [list source [file join $dir advGeom2.tcl]] set auto_index(SuperCell_Show) [list source [file join $dir advGeom2.tcl]] set auto_index(SuperCell_TestIt) [list source [file join $dir advGeom2.tcl]] set auto_index(SuperCell_OK) [list source [file join $dir advGeom2.tcl]] set auto_index(SuperCell_ValidEMatrix) [list source [file join $dir advGeom2.tcl]] set auto_index(SuperCell_Run95) [list source [file join $dir advGeom2.tcl]] set auto_index(AtomDisp) [list source [file join $dir advGeom2.tcl]] set auto_index(Elastic) [list source [file join $dir advGeom2.tcl]] set auto_index(Elastic_TestIt) [list source [file join $dir advGeom2.tcl]] set auto_index(Elastic_OK) [list source [file join $dir advGeom2.tcl]] set auto_index(Elastic_ValidEMatrix) [list source [file join $dir advGeom2.tcl]] set auto_index(Elastic_Run95) [list source [file join $dir advGeom2.tcl]] set auto_index(RotFrame) [list source [file join $dir advGeom2.tcl]] set auto_index(RotFrame_TestIt) [list source [file join $dir advGeom2.tcl]] set auto_index(RotFrame_OK) [list source [file join $dir advGeom2.tcl]] set auto_index(RotFrame_Valid_IJK) [list source [file join $dir advGeom2.tcl]] set auto_index(RotFrame_Run95) [list source [file join $dir advGeom2.tcl]] set auto_index(ModAtomLabels) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:_font_and_color) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:selectAtom) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:atomFontUpdate) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:fontBrowser) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:CloseUpdate) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:advancedCheckButton) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:advancedSelectAtom) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:advancedSelectType) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:advancedCloseUpdate) [list source [file join $dir atomLabels.tcl]] set auto_index(ModAtomLabels:advancedClearCustomLabels) [list source [file join $dir atomLabels.tcl]] set auto_index(xcPlace) [list source [file join $dir auxil.tcl]] set auto_index(Nat2Aname) [list source [file join $dir auxil.tcl]] set auto_index(Aname2Nat) [list source [file join $dir auxil.tcl]] set auto_index(AnameExt2Nat) [list source [file join $dir auxil.tcl]] set auto_index(AtomNames) [list source [file join $dir auxil.tcl]] set auto_index(exit_pr) [list source [file join $dir auxil.tcl]] set auto_index(clean_exit) [list source [file join $dir auxil.tcl]] set auto_index(ModifyFontSize) [list source [file join $dir auxil.tcl]] set auto_index(ModifyFont) [list source [file join $dir auxil.tcl]] set auto_index(SetFont) [list source [file join $dir auxil.tcl]] set auto_index(GetFontAtribute) [list source [file join $dir auxil.tcl]] set auto_index(AlwaysOnTopON) [list source [file join $dir auxil.tcl]] set auto_index(xcRaiseRegister) [list source [file join $dir auxil.tcl]] set auto_index(xcRaise) [list source [file join $dir auxil.tcl]] set auto_index(AlwaysOnTopOFF) [list source [file join $dir auxil.tcl]] set auto_index(CancelProc) [list source [file join $dir auxil.tcl]] set auto_index(DestroyWid) [list source [file join $dir auxil.tcl]] set auto_index(winGeom) [list source [file join $dir auxil.tcl]] set auto_index(GetDimGroupXSF) [list source [file join $dir auxil.tcl]] set auto_index(GetDimGroup) [list source [file join $dir auxil.tcl]] set auto_index(GenGeomDisplay) [list source [file join $dir auxil.tcl]] set auto_index(Bohr2Angs) [list source [file join $dir auxil.tcl]] set auto_index(Angs2Bohr) [list source [file join $dir auxil.tcl]] set auto_index(WidgetName) [list source [file join $dir auxil.tcl]] set auto_index(GetWidgetConfig) [list source [file join $dir auxil.tcl]] set auto_index(FileHead) [list source [file join $dir auxil.tcl]] set auto_index(FilePossix) [list source [file join $dir auxil.tcl]] set auto_index(DummyProc) [list source [file join $dir auxil.tcl]] set auto_index(IsEqual) [list source [file join $dir auxil.tcl]] set auto_index(IsLEQ) [list source [file join $dir auxil.tcl]] set auto_index(xcPause) [list source [file join $dir auxil.tcl]] set auto_index(rgb_h2d) [list source [file join $dir auxil.tcl]] set auto_index(rgb_h2f) [list source [file join $dir auxil.tcl]] set auto_index(rgb_f2h) [list source [file join $dir auxil.tcl]] set auto_index(rgb_f2d) [list source [file join $dir auxil.tcl]] set auto_index(rgb_ac_f2h) [list source [file join $dir auxil.tcl]] set auto_index(rgb_d2f) [list source [file join $dir auxil.tcl]] set auto_index(h2df) [list source [file join $dir auxil.tcl]] set auto_index(d2h) [list source [file join $dir auxil.tcl]] set auto_index(d2f) [list source [file join $dir auxil.tcl]] set auto_index(xcOnPower) [list source [file join $dir auxil.tcl]] set auto_index(SetWatchCursor) [list source [file join $dir auxil.tcl]] set auto_index(CursorUpdate) [list source [file join $dir auxil.tcl]] set auto_index(ResetCursor) [list source [file join $dir auxil.tcl]] set auto_index(xcSwapBuffers) [list source [file join $dir auxil.tcl]] set auto_index(FtnName) [list source [file join $dir auxil.tcl]] set auto_index(capitalize) [list source [file join $dir auxil.tcl]] set auto_index(filehead) [list source [file join $dir auxil.tcl]] set auto_index(WriteFile) [list source [file join $dir auxil.tcl]] set auto_index(ReadFile) [list source [file join $dir auxil.tcl]] set auto_index(GetAbsoluteFileName) [list source [file join $dir auxil.tcl]] set auto_index(GetFracCoor) [list source [file join $dir auxil.tcl]] set auto_index(coorToUnit) [list source [file join $dir auxil.tcl]] set auto_index(xcDebug) [list source [file join $dir auxil.tcl]] set auto_index(xcEditFile) [list source [file join $dir auxil.tcl]] set auto_index(xcDeleteAllChildren) [list source [file join $dir auxil.tcl]] set auto_index(gunzipFile) [list source [file join $dir auxil.tcl]] set auto_index(destroyWelcome) [list source [file join $dir auxil.tcl]] set auto_index(ErrorDialogInfo) [list source [file join $dir auxil.tcl]] set auto_index(xcCatchExec) [list source [file join $dir auxil.tcl]] set auto_index(xcCatchExecRedirectStdErr) [list source [file join $dir auxil.tcl]] set auto_index(xcCatchExecReturn) [list source [file join $dir auxil.tcl]] set auto_index(xcCatchExecReturnRedirectStdErr) [list source [file join $dir auxil.tcl]] set auto_index(ErrorDialog) [list source [file join $dir auxil.tcl]] set auto_index(WarningDialog) [list source [file join $dir auxil.tcl]] set auto_index(ErrorIn) [list source [file join $dir auxil.tcl]] set auto_index(xcSkipEmptyLines) [list source [file join $dir auxil.tcl]] set auto_index(xcCatchEval) [list source [file join $dir auxil.tcl]] set auto_index(repeat) [list source [file join $dir auxil.tcl]] set auto_index(wait) [list source [file join $dir auxil.tcl]] set auto_index(positiveInteger) [list source [file join $dir auxil.tcl]] set auto_index(nonnegativeInteger) [list source [file join $dir auxil.tcl]] set auto_index(rgba) [list source [file join $dir auxil.tcl]] set auto_index(allowedValue) [list source [file join $dir auxil.tcl]] set auto_index(destroyWelcomeWindow) [list source [file join $dir auxil.tcl]] set auto_index(xcTempFile) [list source [file join $dir auxil.tcl]] set auto_index(evalInScratch) [list source [file join $dir auxil.tcl]] set auto_index(evalInDir) [list source [file join $dir auxil.tcl]] set auto_index(evalInPWD) [list source [file join $dir auxil.tcl]] set auto_index(putsFlush) [list source [file join $dir auxil.tcl]] set auto_index(fileCopy) [list source [file join $dir auxil.tcl]] set auto_index(lineRead) [list source [file join $dir auxil.tcl]] set auto_index(getAllDescendantWid) [list source [file join $dir auxil.tcl]] set auto_index(getAllDescendantWid_) [list source [file join $dir auxil.tcl]] set auto_index(ifset) [list source [file join $dir auxil.tcl]] set auto_index(BANDGraph) [list source [file join $dir band.tcl]] set auto_index(grapher_ReadBARFile) [list source [file join $dir bar.tcl]] set auto_index(grapher_BARGraph) [list source [file join $dir bar.tcl]] set auto_index(BWIDGraph) [list source [file join $dir bwid.tcl]] set auto_index(bxsfOpenMenu) [list source [file join $dir bxsfOpen.tcl]] set auto_index(BAND_Init) [list source [file join $dir bz.tcl]] set auto_index(Bz_MakeToplevel) [list source [file join $dir bz.tcl]] set auto_index(Bz_ShowBZ) [list source [file join $dir bz.tcl]] set auto_index(Bz_RenderBZ) [list source [file join $dir bz.tcl]] set auto_index(Bz_DeletePoints) [list source [file join $dir bz.tcl]] set auto_index(Bz_ViewPort) [list source [file join $dir bz.tcl]] set auto_index(Bz_ButtonPressed) [list source [file join $dir bz.tcl]] set auto_index(Bz_ButtonReleased) [list source [file join $dir bz.tcl]] set auto_index(Bz_Motion) [list source [file join $dir bz.tcl]] set auto_index(Bz_BindDestroy) [list source [file join $dir bz.tcl]] set auto_index(Bz_SetState) [list source [file join $dir bz.tcl]] set auto_index(Bz_ManualRotate) [list source [file join $dir bz.tcl]] set auto_index(Bz_OK) [list source [file join $dir bz.tcl]] set auto_index(Bz_OK_OK) [list source [file join $dir bz.tcl]] set auto_index(Bz_ManualZoom) [list source [file join $dir bz.tcl]] set auto_index(Bz_MouseWheel) [list source [file join $dir bz.tcl]] set auto_index(check_package_awk) [list source [file join $dir check_package.tcl]] set auto_index(check_package_terminal) [list source [file join $dir check_package.tcl]] set auto_index(check_package_crystal) [list source [file join $dir check_package.tcl]] set auto_index(ColorMenu) [list source [file join $dir colormenu.tcl]] set auto_index(ColorSchemeState) [list source [file join $dir colors.tcl]] set auto_index(ColorSchemeUpdate) [list source [file join $dir colors.tcl]] set auto_index(ColorSchemeClose) [list source [file join $dir colors.tcl]] set auto_index(ColorSchemeCancel) [list source [file join $dir colors.tcl]] set auto_index(ColorSchemeCoor) [list source [file join $dir colors.tcl]] set auto_index(ColorScheme) [list source [file join $dir colors.tcl]] set auto_index(ColorScheme:fromAbsToFrac) [list source [file join $dir colors.tcl]] set auto_index(ColorScheme:fromFracToAbs) [list source [file join $dir colors.tcl]] set auto_index(ConfigGrapher) [list source [file join $dir configGrapher.tcl]] set auto_index(ConfigGrapherOK) [list source [file join $dir configGrapher.tcl]] set auto_index(Prepare_and_Map_TickVar) [list source [file join $dir configGrapher.tcl]] set auto_index(SpecifyTick) [list source [file join $dir configGrapher.tcl]] set auto_index(SpecifyTicsState) [list source [file join $dir configGrapher.tcl]] set auto_index(SpecifyTickLabels) [list source [file join $dir configGrapher.tcl]] set auto_index(SpecifyTickLabelsOK) [list source [file join $dir configGrapher.tcl]] set auto_index(WhatIsTickMode) [list source [file join $dir configGrapher.tcl]] set auto_index(SetCurveOptions) [list source [file join $dir configGrapher.tcl]] set auto_index(SetCurveOptionsOK) [list source [file join $dir configGrapher.tcl]] set auto_index(xcSetTextAtrib) [list source [file join $dir configGrapher.tcl]] set auto_index(xcSetTextAtribBut) [list source [file join $dir configGrapher.tcl]] set auto_index(SetBarAtrib) [list source [file join $dir configGrapher.tcl]] set auto_index(SetBarAtribColor) [list source [file join $dir configGrapher.tcl]] set auto_index(cxxAdvGeom.manualOption) [list source [file join $dir cxxAdvGeom.tcl]] set auto_index(cxxAdvGeom.viewScript) [list source [file join $dir cxxAdvGeom.tcl]] set auto_index(cxxAdvGeom.manualEdit) [list source [file join $dir cxxAdvGeom.tcl]] set auto_index(cxxAdvGeom.testINPUT) [list source [file join $dir cxxAdvGeom.tcl]] set auto_index(cxxHandleEXTPRT) [list source [file join $dir cxxAdvGeom.tcl]] set auto_index(DiffIsoSurf_Widget) [list source [file join $dir difIsoSurf.tcl]] set auto_index(DiffIsoSurf_LeftCmd) [list source [file join $dir difIsoSurf.tcl]] set auto_index(DiffIsoSurf_RightCmd) [list source [file join $dir difIsoSurf.tcl]] set auto_index(LoadAnotherUnit9) [list source [file join $dir difIsoSurf.tcl]] set auto_index(DiffIsoSurf_WidgetOK) [list source [file join $dir difIsoSurf.tcl]] set auto_index(C95Name2Com) [list source [file join $dir difIsoSurf.tcl]] set auto_index(Lighting) [list source [file join $dir dispModes.tcl]] set auto_index(Display2D) [list source [file join $dir dispModes.tcl]] set auto_index(Mode3D) [list source [file join $dir dispModes.tcl]] set auto_index(DisplayOver3D) [list source [file join $dir dispModes.tcl]] set auto_index(DispBool3D) [list source [file join $dir dispModes.tcl]] set auto_index(From3Dto3D) [list source [file join $dir dispModes.tcl]] set auto_index(Invert3D) [list source [file join $dir dispModes.tcl]] set auto_index(From2Dto3D) [list source [file join $dir dispModes.tcl]] set auto_index(From3Dto2D) [list source [file join $dir dispModes.tcl]] set auto_index(DeleteWid) [list source [file join $dir dispModes.tcl]] set auto_index(ResetDispModes) [list source [file join $dir dispModes.tcl]] set auto_index(ConfigControlWid) [list source [file join $dir dispModes.tcl]] set auto_index(DisplayDefaultMode) [list source [file join $dir dispModes.tcl]] set auto_index(DisplayMode3D) [list source [file join $dir dispModes.tcl]] set auto_index(DisplayMode2D) [list source [file join $dir dispModes.tcl]] set auto_index(DOSSGraph) [list source [file join $dir dos.tcl]] set auto_index(dumpWindow) [list source [file join $dir dumpWindow.tcl]] set auto_index(dumpWindowByID) [list source [file join $dir dumpWindow.tcl]] set auto_index(dumpWindow_queryFilename) [list source [file join $dir dumpWindow.tcl]] set auto_index(defaultEditor) [list source [file join $dir edit.tcl]] set auto_index(defaultEditor_cancel) [list source [file join $dir edit.tcl]] set auto_index(defaultEditor_close) [list source [file join $dir edit.tcl]] set auto_index(defaultEditor_done) [list source [file join $dir edit.tcl]] set auto_index(defaultEditor_save) [list source [file join $dir edit.tcl]] set auto_index(defaultEditor_saveAs) [list source [file join $dir edit.tcl]] set auto_index(fhiPreset) [list source [file join $dir fhiPreset.tcl]] set auto_index(fhiPresetOK) [list source [file join $dir fhiPreset.tcl]] set auto_index(fhiPresetCan) [list source [file join $dir fhiPreset.tcl]] set auto_index(fileselectResources) [list source [file join $dir fileselect.tcl]] set auto_index(fileselect) [list source [file join $dir fileselect.tcl]] set auto_index(fileselectBindings) [list source [file join $dir fileselect.tcl]] set auto_index(PreOptMenu) [list source [file join $dir fileselect.tcl]] set auto_index(OptMenu) [list source [file join $dir fileselect.tcl]] set auto_index(Print) [list source [file join $dir fileselect.tcl]] set auto_index(fileselectList) [list source [file join $dir fileselect.tcl]] set auto_index(fileselectOK) [list source [file join $dir fileselect.tcl]] set auto_index(fileselectCancel) [list source [file join $dir fileselect.tcl]] set auto_index(fileselectClick) [list source [file join $dir fileselect.tcl]] set auto_index(fileselectTake) [list source [file join $dir fileselect.tcl]] set auto_index(fileselectComplete) [list source [file join $dir fileselect.tcl]] set auto_index(find_package) [list source [file join $dir find_package.tcl]] set auto_index(check_package) [list source [file join $dir find_package.tcl]] set auto_index(find_package_imagemagick) [list source [file join $dir find_package.tcl]] set auto_index(query_imagemagick) [list source [file join $dir find_package.tcl]] set auto_index(find_package_gifsicle) [list source [file join $dir find_package.tcl]] set auto_index(query_gifsicle) [list source [file join $dir find_package.tcl]] set auto_index(find_package_whirlgif) [list source [file join $dir find_package.tcl]] set auto_index(query_whirlgif) [list source [file join $dir find_package.tcl]] set auto_index(find_package_mencoder) [list source [file join $dir find_package.tcl]] set auto_index(query_mencoder) [list source [file join $dir find_package.tcl]] set auto_index(find_package_ppmtompeg) [list source [file join $dir find_package.tcl]] set auto_index(query_ppmtompeg) [list source [file join $dir find_package.tcl]] set auto_index(find_package_babel) [list source [file join $dir find_package.tcl]] set auto_index(query_babel) [list source [file join $dir find_package.tcl]] set auto_index(find_package_xwd) [list source [file join $dir find_package.tcl]] set auto_index(query_xwd) [list source [file join $dir find_package.tcl]] set auto_index(find_package_xsf2_manipulator) [list source [file join $dir find_package.tcl]] set auto_index(query_xsf2_manipulator) [list source [file join $dir find_package.tcl]] set auto_index(fontToplevelWidget) [list source [file join $dir fontWidget.tcl]] set auto_index(_fontWidgetDestroy) [list source [file join $dir fontWidget.tcl]] set auto_index(_fontWidgetUnset) [list source [file join $dir fontWidget.tcl]] set auto_index(fontWidget) [list source [file join $dir fontWidget.tcl]] set auto_index(fontUpdate) [list source [file join $dir fontWidget.tcl]] set auto_index(forceVectors) [list source [file join $dir forces.tcl]] set auto_index(forceVectorsSet) [list source [file join $dir forces.tcl]] set auto_index(forceUpdate) [list source [file join $dir forces.tcl]] set auto_index(forceVectors_Color) [list source [file join $dir forces.tcl]] set auto_index(forceVectors_ColorOK) [list source [file join $dir forces.tcl]] set auto_index(forceVectors_ResetAttributes) [list source [file join $dir forces.tcl]] set auto_index(g98Cube) [list source [file join $dir g98.tcl]] set auto_index(g98Cube:cube2xsf) [list source [file join $dir g98.tcl]] set auto_index(g98Cube:selectFile) [list source [file join $dir g98.tcl]] set auto_index(RadioButtons) [list source [file join $dir genWidget.tcl]] set auto_index(RadioBut) [list source [file join $dir genWidget.tcl]] set auto_index(RadioButCmd) [list source [file join $dir genWidget.tcl]] set auto_index(RadioButVarCmd) [list source [file join $dir genWidget.tcl]] set auto_index(CheckButVarCmd) [list source [file join $dir genWidget.tcl]] set auto_index(CheckButtons) [list source [file join $dir genWidget.tcl]] set auto_index(CheckVarButtons) [list source [file join $dir genWidget.tcl]] set auto_index(Entries) [list source [file join $dir genWidget.tcl]] set auto_index(OneEntries) [list source [file join $dir genWidget.tcl]] set auto_index(dialog) [list source [file join $dir genWidget.tcl]] set auto_index(xcToplevel) [list source [file join $dir genWidget.tcl]] set auto_index(DispText) [list source [file join $dir genWidget.tcl]] set auto_index(OneEntryToplevel) [list source [file join $dir genWidget.tcl]] set auto_index(OneEntryOK) [list source [file join $dir genWidget.tcl]] set auto_index(ScrollEntries) [list source [file join $dir genWidget.tcl]] set auto_index(ScrolledListbox2) [list source [file join $dir genWidget.tcl]] set auto_index(xcMenuEntry) [list source [file join $dir genWidget.tcl]] set auto_index(FillEntries) [list source [file join $dir genWidget.tcl]] set auto_index(DisplayUpdateWidget) [list source [file join $dir genWidget.tcl]] set auto_index(DefaultButton) [list source [file join $dir genWidget.tcl]] set auto_index(xcCheckButton) [list source [file join $dir genWidget.tcl]] set auto_index(xcCheckButtonCom) [list source [file join $dir genWidget.tcl]] set auto_index(xcCheckButtonDummy) [list source [file join $dir genWidget.tcl]] set auto_index(xcCheckButtonRow) [list source [file join $dir genWidget.tcl]] set auto_index(xcModifyColorID) [list source [file join $dir genWidget.tcl]] set auto_index(xcModifyColorGetID) [list source [file join $dir genWidget.tcl]] set auto_index(xcModifyColor) [list source [file join $dir genWidget.tcl]] set auto_index(_xcModifyColorSet) [list source [file join $dir genWidget.tcl]] set auto_index(xcModifyColorSet) [list source [file join $dir genWidget.tcl]] set auto_index(xcModifyColorGet) [list source [file join $dir genWidget.tcl]] set auto_index(xcUpdateWindow) [list source [file join $dir genWidget.tcl]] set auto_index(xcMenuButton) [list source [file join $dir genWidget.tcl]] set auto_index(xcTextImageButton) [list source [file join $dir genWidget.tcl]] set auto_index(xcHideButton) [list source [file join $dir genWidget.tcl]] set auto_index(xcDisplayFileText) [list source [file join $dir genWidget.tcl]] set auto_index(xcDisplayVarText) [list source [file join $dir genWidget.tcl]] set auto_index(XCRYSDEN_Logo) [list source [file join $dir genWidget.tcl]] set auto_index(GetGengM3Arg) [list source [file join $dir gengeom.tcl]] set auto_index(GenGeom) [list source [file join $dir gengeom.tcl]] set auto_index(gifAnimWidPack) [list source [file join $dir gifAnim.tcl]] set auto_index(gifAnimMake) [list source [file join $dir gifAnim.tcl]] set auto_index(gifAnimPrintCurrent) [list source [file join $dir gifAnim.tcl]] set auto_index(gifAnim:editParam) [list source [file join $dir gifAnim.tcl]] set auto_index(gifAnim_controlWidgets) [list source [file join $dir gifAnim.tcl]] set auto_index(_mencoder_temporary_files) [list source [file join $dir gifAnim.tcl]] set auto_index(glLight) [list source [file join $dir glLight.tcl]] set auto_index(glLight:update) [list source [file join $dir glLight.tcl]] set auto_index(glLight:loadValues) [list source [file join $dir glLight.tcl]] set auto_index(glLight:save) [list source [file join $dir glLight.tcl]] set auto_index(glLight:load) [list source [file join $dir glLight.tcl]] set auto_index(glModParam) [list source [file join $dir glModParam.tcl]] set auto_index(glModParam:Materials) [list source [file join $dir glModParam.tcl]] set auto_index(glModParam:Materials:Update) [list source [file join $dir glModParam.tcl]] set auto_index(glModParam:DepthCuing) [list source [file join $dir glModParam.tcl]] set auto_index(glModParam:DepthCuing:_widget) [list source [file join $dir glModParam.tcl]] set auto_index(glModParam:DepthCuing:Update) [list source [file join $dir glModParam.tcl]] set auto_index(glModParam:AntiAlias) [list source [file join $dir glModParam.tcl]] set auto_index(glModParam:AntiAlias:Update) [list source [file join $dir glModParam.tcl]] set auto_index(CalStru) [list source [file join $dir go2crys.tcl]] set auto_index(MakeInput) [list source [file join $dir go2crys.tcl]] set auto_index(SetUnDefPar) [list source [file join $dir go2crys.tcl]] set auto_index(SetIsoGridSpace) [list source [file join $dir grid.tcl]] set auto_index(SetIsoGridSpaceOK) [list source [file join $dir grid.tcl]] set auto_index(CheckSpin) [list source [file join $dir grid.tcl]] set auto_index(IsoCellSel) [list source [file join $dir grid.tcl]] set auto_index(IsoSpaceUpdate) [list source [file join $dir grid.tcl]] set auto_index(group_sel) [list source [file join $dir groupSel.tcl]] set auto_index(GroupSelectStart) [list source [file join $dir groupSel.tcl]] set auto_index(GroupSelectEnd) [list source [file join $dir groupSel.tcl]] set auto_index(group_sel_cancel) [list source [file join $dir groupSel.tcl]] set auto_index(group_sel_ok) [list source [file join $dir groupSel.tcl]] set auto_index(IsNotStandardGroup) [list source [file join $dir groupSel.tcl]] set auto_index(point_group) [list source [file join $dir groups.tcl]] set auto_index(line_group) [list source [file join $dir groups.tcl]] set auto_index(plane_group) [list source [file join $dir groups.tcl]] set auto_index(space_group) [list source [file join $dir groups.tcl]] set auto_index(gzmat) [list source [file join $dir gzmat.tcl]] set auto_index(gzmat_menu) [list source [file join $dir gzmat.tcl]] set auto_index(Hbonds) [list source [file join $dir hbonds.tcl]] set auto_index(HbondsSetting) [list source [file join $dir hbonds.tcl]] set auto_index(HbondsSetting:update) [list source [file join $dir hbonds.tcl]] set auto_index(_HbondsSetting:Init) [list source [file join $dir hbonds.tcl]] set auto_index(IsoControl_InitVar) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_SetColorPlaneVar) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_UpdateColorplane) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_Show) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_IsoLineShow) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_Hide) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_SetIsolineColorOK) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_SetIsolineColor) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_IsolineColor) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_Animate) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControl_SetCurrentSlide) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControlCan) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControlSave) [list source [file join $dir isoControl.tcl]] set auto_index(_IsoControlSave) [list source [file join $dir isoControl.tcl]] set auto_index(ConvertTwoSideVar) [list source [file join $dir isoControl.tcl]] set auto_index(RevertIsoSides) [list source [file join $dir isoControl.tcl]] set auto_index(RevertIsoNormals) [list source [file join $dir isoControl.tcl]] set auto_index(SurfaceSmoothing) [list source [file join $dir isoControl.tcl]] set auto_index(SurfaceSmoothingOK) [list source [file join $dir isoControl.tcl]] set auto_index(IsoControlCommand) [list source [file join $dir isoControl.tcl]] set auto_index(isoControl_thermoFont) [list source [file join $dir isoControl.tcl]] set auto_index(xcPrepareIsosurf) [list source [file join $dir isoRender.tcl]] set auto_index(UpdateIsosurf) [list source [file join $dir isoRender.tcl]] set auto_index(Set_UpdateIsosurf_Struct) [list source [file join $dir isoRender.tcl]] set auto_index(SetXC_Iso) [list source [file join $dir isoStuff.tcl]] set auto_index(MakeIsoData) [list source [file join $dir isoStuff.tcl]] set auto_index(GetCrystalVec) [list source [file join $dir isoStuff.tcl]] set auto_index(GetCageVecOrig) [list source [file join $dir isoStuff.tcl]] set auto_index(GetNPY) [list source [file join $dir isoStuff.tcl]] set auto_index(GetNumberOfPoints) [list source [file join $dir isoStuff.tcl]] set auto_index(IsoCalc) [list source [file join $dir isoStuff.tcl]] set auto_index(igroup2BravaisLattice) [list source [file join $dir kLabels.tcl]] set auto_index(getLatticeVec_) [list source [file join $dir kLabels.tcl]] set auto_index(getKLabel) [list source [file join $dir kLabels.tcl]] set auto_index(kLabels_Note) [list source [file join $dir kLabels.tcl]] set auto_index(load_kLabels) [list source [file join $dir kLabels.tcl]] set auto_index(kPath) [list source [file join $dir kPath.tcl]] set auto_index(kPath_XCrySDen) [list source [file join $dir kPath.tcl]] set auto_index(kPath_PWscf) [list source [file join $dir kPath.tcl]] set auto_index(xsfLoadAttributes) [list source [file join $dir loadAttributes.tcl]] set auto_index(defLoadAttributes) [list source [file join $dir loadAttributes.tcl]] set auto_index(load_myParam) [list source [file join $dir loadAttributes.tcl]] set auto_index(ViewMolMenu) [list source [file join $dir menu.tcl]] set auto_index(mainMenu) [list source [file join $dir menu.tcl]] set auto_index(OpenXYZPDB) [list source [file join $dir menu.tcl]] set auto_index(OpenXSFStruct) [list source [file join $dir menu.tcl]] set auto_index(UpdateStruct) [list source [file join $dir menu.tcl]] set auto_index(SaveXSFStruct) [list source [file join $dir menu.tcl]] set auto_index(SaveCrystalInput) [list source [file join $dir menu.tcl]] set auto_index(CellMode) [list source [file join $dir menu.tcl]] set auto_index(xcHexaRhomboEntryState) [list source [file join $dir menu.tcl]] set auto_index(ModConst) [list source [file join $dir menu.tcl]] set auto_index(ModFactor) [list source [file join $dir menu.tcl]] set auto_index(ModFacFOK) [list source [file join $dir menu.tcl]] set auto_index(ModFacDef) [list source [file join $dir menu.tcl]] set auto_index(ModFacClear) [list source [file join $dir menu.tcl]] set auto_index(CrdSist) [list source [file join $dir menu.tcl]] set auto_index(AtomLabels) [list source [file join $dir menu.tcl]] set auto_index(CrysFrames) [list source [file join $dir menu.tcl]] set auto_index(Unibond) [list source [file join $dir menu.tcl]] set auto_index(DispFramesAs) [list source [file join $dir menu.tcl]] set auto_index(ModCellCol) [list source [file join $dir menu.tcl]] set auto_index(CellColor) [list source [file join $dir menu.tcl]] set auto_index(CellColLoad) [list source [file join $dir menu.tcl]] set auto_index(CellColOK) [list source [file join $dir menu.tcl]] set auto_index(CellColUpD) [list source [file join $dir menu.tcl]] set auto_index(ModUnibondCol) [list source [file join $dir menu.tcl]] set auto_index(ModUnibondCol_Update) [list source [file join $dir menu.tcl]] set auto_index(ModUnibondCol_Close) [list source [file join $dir menu.tcl]] set auto_index(ModUnibondCol_Cancel) [list source [file join $dir menu.tcl]] set auto_index(ModXYZCol) [list source [file join $dir menu.tcl]] set auto_index(ModXYZCol_Update) [list source [file join $dir menu.tcl]] set auto_index(ModXYZCol_Close) [list source [file join $dir menu.tcl]] set auto_index(ModXYZCol_Cancel) [list source [file join $dir menu.tcl]] set auto_index(CloseCase) [list source [file join $dir menu.tcl]] set auto_index(xcMesaChangeBg) [list source [file join $dir menu.tcl]] set auto_index(Perspective) [list source [file join $dir menu.tcl]] set auto_index(DepthCuing) [list source [file join $dir menu.tcl]] set auto_index(AntiAlias) [list source [file join $dir menu.tcl]] set auto_index(ToggleMenuCheckbutton) [list source [file join $dir menu.tcl]] set auto_index(ToggleMenuRadiobutton) [list source [file join $dir menu.tcl]] set auto_index(ModPerspective) [list source [file join $dir menu.tcl]] set auto_index(ModPerspective_Cancel) [list source [file join $dir menu.tcl]] set auto_index(ModPerspective_Update) [list source [file join $dir menu.tcl]] set auto_index(ModPerspective_Close) [list source [file join $dir menu.tcl]] set auto_index(scriptOpenMenu) [list source [file join $dir menu.tcl]] set auto_index(ModAtomCol) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtomColBind) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(Color) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtomColSelect) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtomColLoad) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtomColOK) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtomColUpD) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtomColReset) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(ModAtomRad) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtRadUpdateConF) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtRadUpdateScale) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtRadUpD) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtRadLoad) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtRadReset) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtRadOK) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtomRadSelect) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtRadDef) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(AtRadClr) [list source [file join $dir modAtomAtrib.tcl]] set auto_index(NumCellDrawn) [list source [file join $dir modify.tcl]] set auto_index(NumCellDrawnOK) [list source [file join $dir modify.tcl]] set auto_index(NumCellDrawnCan) [list source [file join $dir modify.tcl]] set auto_index(determine_movie_encoders) [list source [file join $dir movieEncoders.tcl]] set auto_index(encode_movie) [list source [file join $dir movieEncoders.tcl]] set auto_index(cmdLine_ppmtompeg) [list source [file join $dir movieEncoders.tcl]] set auto_index(cmdLine_mencoder) [list source [file join $dir movieEncoders.tcl]] set auto_index(encode_gif) [list source [file join $dir movieEncoders.tcl]] set auto_index(cmdLine_convert) [list source [file join $dir movieEncoders.tcl]] set auto_index(cmdLine_gifsicle) [list source [file join $dir movieEncoders.tcl]] set auto_index(cmdLine_whirlgif) [list source [file join $dir movieEncoders.tcl]] set auto_index(exec_gifsicle) [list source [file join $dir movieEncoders.tcl]] set auto_index(MovieMaker) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_frame) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_end) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_manual) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_realTimeCapture) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_everySnapshot) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_mode_) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_destroy_manualWidgets_) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_recording_) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_clear) [list source [file join $dir movieMaker.tcl]] set auto_index(movieMaker_close) [list source [file join $dir movieMaker.tcl]] set auto_index(mpegCreateParamFile) [list source [file join $dir mpegParam.tcl]] set auto_index(MultiWidget) [list source [file join $dir multiWid.tcl]] set auto_index(PostMultiWidget) [list source [file join $dir multiWid.tcl]] set auto_index(new_file) [list source [file join $dir newInput.tcl]] set auto_index(ChooseSpecies) [list source [file join $dir newInput.tcl]] set auto_index(Molecule) [list source [file join $dir newInput.tcl]] set auto_index(Polymer) [list source [file join $dir newInput.tcl]] set auto_index(Slab) [list source [file join $dir newInput.tcl]] set auto_index(Crystal) [list source [file join $dir newInput.tcl]] set auto_index(crys_slab_sym) [list source [file join $dir newInput.tcl]] set auto_index(CheckGroup) [list source [file join $dir newInput.tcl]] set auto_index(gotoGeom) [list source [file join $dir newInput.tcl]] set auto_index(geom_sym_input) [list source [file join $dir newInput.tcl]] set auto_index(geom_sym_prev) [list source [file join $dir newInput.tcl]] set auto_index(set_origin) [list source [file join $dir newInput.tcl]] set auto_index(orig_coord) [list source [file join $dir newInput.tcl]] set auto_index(n_atoms) [list source [file join $dir newInput.tcl]] set auto_index(atom_num_coord) [list source [file join $dir newInput.tcl]] set auto_index(contrl_var) [list source [file join $dir newInput.tcl]] set auto_index(NewInputCancelProc) [list source [file join $dir newInput.tcl]] set auto_index(check_var) [list source [file join $dir number.tcl]] set auto_index(number) [list source [file join $dir number.tcl]] set auto_index(xcNumber) [list source [file join $dir number.tcl]] set auto_index(openExtStruct:reload) [list source [file join $dir openExtStruct.tcl]] set auto_index(openExtStruct) [list source [file join $dir openExtStruct.tcl]] set auto_index(SetOpenGLPar) [list source [file join $dir openGLpar.tcl]] set auto_index(SetRGBA) [list source [file join $dir openGLpar.tcl]] set auto_index(setRGBAwidget) [list source [file join $dir openGLpar.tcl]] set auto_index(SetColorFrame) [list source [file join $dir openGLpar.tcl]] set auto_index(SetRGBColor) [list source [file join $dir openGLpar.tcl]] set auto_index(UpdateOpenGLPar) [list source [file join $dir openGLpar.tcl]] set auto_index(GetOpenGLPar) [list source [file join $dir openGLpar.tcl]] set auto_index(OpenCyrstalInput) [list source [file join $dir openInput.tcl]] set auto_index(OpenCyrstalInputModify) [list source [file join $dir openInput.tcl]] set auto_index(cxxManageExternal) [list source [file join $dir openInput.tcl]] set auto_index(Agr2Igr) [list source [file join $dir openInput.tcl]] set auto_index(Igr2Agr) [list source [file join $dir openInput.tcl]] set auto_index(OpFile2ViewMol) [list source [file join $dir openInput.tcl]] set auto_index(ModGroup) [list source [file join $dir openInput.tcl]] set auto_index(UpdateStatus) [list source [file join $dir openInput.tcl]] set auto_index(StatusWidget) [list source [file join $dir openInput.tcl]] set auto_index(PreSetOrigin) [list source [file join $dir openInput.tcl]] set auto_index(PreGeom_sym_input) [list source [file join $dir openInput.tcl]] set auto_index(DestroyOpfl) [list source [file join $dir openInput.tcl]] set auto_index(parseComLinArg) [list source [file join $dir parseComLinArg.tcl]] set auto_index(UpdateWMTitle) [list source [file join $dir parseComLinArg.tcl]] set auto_index(XCrySDenUsage) [list source [file join $dir parseComLinArg.tcl]] set auto_index(parseDGInfo) [list source [file join $dir parseDataGrid.tcl]] set auto_index(DG_CreateBlock) [list source [file join $dir parseDataGrid.tcl]] set auto_index(DG_CreateSubBlock) [list source [file join $dir parseDataGrid.tcl]] set auto_index(DG_RadioBind) [list source [file join $dir parseDataGrid.tcl]] set auto_index(DG_CheckCom) [list source [file join $dir parseDataGrid.tcl]] set auto_index(DataGridOK) [list source [file join $dir parseDataGrid.tcl]] set auto_index(DataGrid2Isosurf) [list source [file join $dir parseDataGrid.tcl]] set auto_index(DataGrid) [list source [file join $dir parseDataGrid.tcl]] set auto_index(DG_RadiobuttonCmd) [list source [file join $dir parseDataGrid.tcl]] set auto_index(pdfUpdate) [list source [file join $dir pdb.tcl]] set auto_index(IsoPlaneGrid) [list source [file join $dir planeselect.tcl]] set auto_index(IsoPlaneGrid_State) [list source [file join $dir planeselect.tcl]] set auto_index(IsoPlaneGrid_Update) [list source [file join $dir planeselect.tcl]] set auto_index(popupMenu) [list source [file join $dir popupMenu.tcl]] set auto_index(popupMenu:popup) [list source [file join $dir popupMenu.tcl]] set auto_index(printTogl) [list source [file join $dir print.tcl]] set auto_index(printTogl_bitmap) [list source [file join $dir print.tcl]] set auto_index(printTogl_queryFilename) [list source [file join $dir print.tcl]] set auto_index(printTogl_Antialias) [list source [file join $dir print.tcl]] set auto_index(printWidget) [list source [file join $dir print.tcl]] set auto_index(printToglEPS) [list source [file join $dir print.tcl]] set auto_index(printToglEPS_Print) [list source [file join $dir print.tcl]] set auto_index(printSetup) [list source [file join $dir print.tcl]] set auto_index(printSetup:traceOptions) [list source [file join $dir print.tcl]] set auto_index(xcPrintCanvas) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintDrawPaper) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintDrawPic) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintPaperFormat) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintOrient) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintPrintTo) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintSetSize) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintPix2MM) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintMM2Pix) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintBBox) [list source [file join $dir printCanvas.tcl]] set auto_index(xcPrintFilename) [list source [file join $dir printCanvas.tcl]] set auto_index(PropC95Cmd) [list source [file join $dir propC95.tcl]] set auto_index(NEWK_Init) [list source [file join $dir propC95.tcl]] set auto_index(NEWK_RadioButCmd) [list source [file join $dir propC95.tcl]] set auto_index(NEWK_IS_ISHF_ISP) [list source [file join $dir propC95.tcl]] set auto_index(NEWK_IS_Can) [list source [file join $dir propC95.tcl]] set auto_index(NEWK_Can) [list source [file join $dir propC95.tcl]] set auto_index(NEWK_OK) [list source [file join $dir propC95.tcl]] set auto_index(SelBandIntv) [list source [file join $dir propC95.tcl]] set auto_index(SelEnerIntv) [list source [file join $dir propC95.tcl]] set auto_index(DOSS_Init) [list source [file join $dir propC95.tcl]] set auto_index(DOSS_InitCan) [list source [file join $dir propC95.tcl]] set auto_index(DOSS_Init2) [list source [file join $dir propC95.tcl]] set auto_index(PDOSS_Init) [list source [file join $dir propC95.tcl]] set auto_index(PDOSS_InitOK) [list source [file join $dir propC95.tcl]] set auto_index(SelectSequence) [list source [file join $dir propC95.tcl]] set auto_index(SelectItems) [list source [file join $dir propC95.tcl]] set auto_index(SelectItemsOK) [list source [file join $dir propC95.tcl]] set auto_index(DispC95Output) [list source [file join $dir propC95.tcl]] set auto_index(DispC95Output_Hide) [list source [file join $dir propC95.tcl]] set auto_index(PropC95) [list source [file join $dir propInit.tcl]] set auto_index(PropC95Init) [list source [file join $dir propInit.tcl]] set auto_index(GetC95Info) [list source [file join $dir propInit.tcl]] set auto_index(IsoControl2D) [list source [file join $dir propertyPlane.tcl]] set auto_index(IsoControl_DispRanExpIso) [list source [file join $dir propertyPlane.tcl]] set auto_index(UpdatePropertyPlane) [list source [file join $dir propertyPlane.tcl]] set auto_index(PseudoDensity) [list source [file join $dir pseudoDen.tcl]] set auto_index(PseudoDenDefaults) [list source [file join $dir pseudoDen.tcl]] set auto_index(PseudoDenGenNew) [list source [file join $dir pseudoDen.tcl]] set auto_index(PseudoDenConfigWid) [list source [file join $dir pseudoDen.tcl]] set auto_index(PseudoDenNoteBook) [list source [file join $dir pseudoDen.tcl]] set auto_index(PseudoDenUpdate) [list source [file join $dir pseudoDen.tcl]] set auto_index(PseudoDen:_xc_molsurf) [list source [file join $dir pseudoDen.tcl]] set auto_index(PseudoDenUpdateSurf) [list source [file join $dir pseudoDen.tcl]] set auto_index(PseudoDenChangeCol) [list source [file join $dir pseudoDen.tcl]] set auto_index(ptable) [list source [file join $dir ptable.tcl]] set auto_index(ptableClose) [list source [file join $dir ptable.tcl]] set auto_index(ptableSelectElement) [list source [file join $dir ptable.tcl]] set auto_index(ptableSelectAtomicNumber) [list source [file join $dir ptable.tcl]] set auto_index(scroll_ptableSelectNAT) [list source [file join $dir ptable.tcl]] set auto_index(pwInputPreset) [list source [file join $dir pwPreset.tcl]] set auto_index(pwOutputPreset) [list source [file join $dir pwPreset.tcl]] set auto_index(pwOutputPresetWhat) [list source [file join $dir pwPreset.tcl]] set auto_index(pwPreset) [list source [file join $dir pwPreset.tcl]] set auto_index(pwPresetOK) [list source [file join $dir pwPreset.tcl]] set auto_index(pwPresetCan) [list source [file join $dir pwPreset.tcl]] set auto_index(ReadFTN25) [list source [file join $dir read25.tcl]] set auto_index(FTN25_MustBeNumber) [list source [file join $dir read25.tcl]] set auto_index(read_param) [list source [file join $dir readParam.tcl]] set auto_index(WhichPar2Read) [list source [file join $dir readParam.tcl]] set auto_index(WhichPar2Print) [list source [file join $dir readParam.tcl]] set auto_index(reloadRegister) [list source [file join $dir reload.tcl]] set auto_index(reloadUpdateDefault) [list source [file join $dir reload.tcl]] set auto_index(reloadCapable) [list source [file join $dir reload.tcl]] set auto_index(reloadButton) [list source [file join $dir reload.tcl]] set auto_index(reloadButtonEnable) [list source [file join $dir reload.tcl]] set auto_index(reloadButtonDisable) [list source [file join $dir reload.tcl]] set auto_index(reloadButtonQueryState) [list source [file join $dir reload.tcl]] set auto_index(reloadButtonState_) [list source [file join $dir reload.tcl]] set auto_index(reloadCmd) [list source [file join $dir reload.tcl]] set auto_index(RunAndGetC95Output) [list source [file join $dir runC95.tcl]] set auto_index(RunC95) [list source [file join $dir runC95.tcl]] set auto_index(C95FileEvent) [list source [file join $dir runC95.tcl]] set auto_index(C95Error) [list source [file join $dir runC95.tcl]] set auto_index(RunC95_advGeom) [list source [file join $dir runC95.tcl]] set auto_index(Get_sInfoArray) [list source [file join $dir sInfo.tcl]] set auto_index(saveState) [list source [file join $dir saveState.tcl]] set auto_index(saveStruct:_writeState) [list source [file join $dir saveState.tcl]] set auto_index(saveStruct:_queryFilename) [list source [file join $dir saveState.tcl]] set auto_index(saveStruct:_writeStructure) [list source [file join $dir saveState.tcl]] set auto_index(saveState:_foreachAtomicType) [list source [file join $dir saveState.tcl]] set auto_index(saveState:header) [list source [file join $dir saveState.tcl]] set auto_index(saveState:beginHeader) [list source [file join $dir saveState.tcl]] set auto_index(saveState:endHeader) [list source [file join $dir saveState.tcl]] set auto_index(saveState:displayMode) [list source [file join $dir saveState.tcl]] set auto_index(saveState:fontCreate) [list source [file join $dir saveState.tcl]] set auto_index(saveState:_saveDatagrid) [list source [file join $dir saveState.tcl]] set auto_index(saveStruct:_writeInfoHead) [list source [file join $dir saveState.tcl]] set auto_index(::scripting::source) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::oldscript) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::open) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::save) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::exec) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::multiScript) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::lighting) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::display) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::displayMode3D) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::displayMode2D) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::mainWindow) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::displayWindow) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::zoom) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::rotate) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::printToFile) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::_printToFile_imageConvert) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::load_myParam) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::buildCrystal) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::chdir) [list source [file join $dir scripting.tcl]] set auto_index(::scripting::atomicLabels::_loadDefaults) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::global) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::atomID) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::atomType) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::render) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::_toggleValue) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::_antiToggleValue) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::clear) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::_parseOptions) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::_mapCustomValues) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::_unknownOption) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::_checkAtomID) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::atomicLabels::_getAtomicNumber) [list source [file join $dir scriptingAtomicLabels.tcl]] set auto_index(::scripting::filter::gXXcube) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::g98cube) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::crystalInput) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::pwscfInput) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::pwscfOutput) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::_pwscf) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::_pwscfInputCheckItypNatList) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::_pwscfOutputCheckItypNatList) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::fhiInpini) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::fhiCoord) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::_fhi) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::_pp_common) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::_init) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::filter::_absoluteFilename) [list source [file join $dir scriptingFilter.tcl]] set auto_index(::scripting::makeMovie::init) [list source [file join $dir scriptingMakeMovie.tcl]] set auto_index(::scripting::makeMovie::begin) [list source [file join $dir scriptingMakeMovie.tcl]] set auto_index(::scripting::makeMovie::makeFrame) [list source [file join $dir scriptingMakeMovie.tcl]] set auto_index(::scripting::makeMovie::end) [list source [file join $dir scriptingMakeMovie.tcl]] set auto_index(::scripting::scalarField2D::load) [list source [file join $dir scriptingScalarField2D.tcl]] set auto_index(::scripting::scalarField2D::configure) [list source [file join $dir scriptingScalarField2D.tcl]] set auto_index(::scripting::scalarField2D::render) [list source [file join $dir scriptingScalarField2D.tcl]] set auto_index(::scripting::scalarField3D::load) [list source [file join $dir scriptingScalarField3D.tcl]] set auto_index(::scripting::scalarField3D::configure) [list source [file join $dir scriptingScalarField3D.tcl]] set auto_index(::scripting::scalarField3D::render) [list source [file join $dir scriptingScalarField3D.tcl]] set auto_index(mouseWheelScroll) [list source [file join $dir scroll.tcl]] set auto_index(SelCheck) [list source [file join $dir selection.tcl]] set auto_index(Done) [list source [file join $dir selection.tcl]] set auto_index(NextSel) [list source [file join $dir selection.tcl]] set auto_index(LineSel) [list source [file join $dir selection.tcl]] set auto_index(SelCentreAtomCL) [list source [file join $dir selection.tcl]] set auto_index(SelCentreHoleCL) [list source [file join $dir selection.tcl]] set auto_index(Plane) [list source [file join $dir selection.tcl]] set auto_index(Dihedral) [list source [file join $dir selection.tcl]] set auto_index(Angle) [list source [file join $dir selection.tcl]] set auto_index(Distance) [list source [file join $dir selection.tcl]] set auto_index(AtomInfo) [list source [file join $dir selection.tcl]] set auto_index(SelectAtom) [list source [file join $dir selection.tcl]] set auto_index(PreSel) [list source [file join $dir selection.tcl]] set auto_index(DeSel) [list source [file join $dir selection.tcl]] set auto_index(selectRecordToFields_) [list source [file join $dir selection.tcl]] set auto_index(selectDisplayCoor_) [list source [file join $dir selection.tcl]] set auto_index(selectUpdateText) [list source [file join $dir selection.tcl]] set auto_index(_select_unit) [list source [file join $dir selection.tcl]] set auto_index(SetIsoSurfArray) [list source [file join $dir setIsosurfArray.tcl]] set auto_index(ProbeResolution) [list source [file join $dir sizes.tcl]] set auto_index(SetImageSizes) [list source [file join $dir sizes.tcl]] set auto_index(xcDisableEntry) [list source [file join $dir state.tcl]] set auto_index(xcEnableEntry) [list source [file join $dir state.tcl]] set auto_index(xcAll:wlist) [list source [file join $dir state.tcl]] set auto_index(xcDisableAll) [list source [file join $dir state.tcl]] set auto_index(_xcDisableAll) [list source [file join $dir state.tcl]] set auto_index(xcDisableMenuOne) [list source [file join $dir state.tcl]] set auto_index(xcDisableOne) [list source [file join $dir state.tcl]] set auto_index(xcDisableMenuentryOne) [list source [file join $dir state.tcl]] set auto_index(xcEnableAll) [list source [file join $dir state.tcl]] set auto_index(_xcEnableAll) [list source [file join $dir state.tcl]] set auto_index(xcEnableMenuOne) [list source [file join $dir state.tcl]] set auto_index(xcEnableOne) [list source [file join $dir state.tcl]] set auto_index(xcEnableMenuentryOne) [list source [file join $dir state.tcl]] set auto_index(xcConfigAll) [list source [file join $dir state.tcl]] set auto_index(xcIsActive) [list source [file join $dir state.tcl]] set auto_index(xcUpdateState) [list source [file join $dir state.tcl]] set auto_index(xcAppendState) [list source [file join $dir state.tcl]] set auto_index(xcDeleteState) [list source [file join $dir state.tcl]] set auto_index(xcTrace) [list source [file join $dir state.tcl]] set auto_index(xcTraceDelete) [list source [file join $dir state.tcl]] set auto_index(xcAdvGeomState) [list source [file join $dir state.tcl]] set auto_index(check_stereo) [list source [file join $dir stereo.tcl]] set auto_index(funcLinear) [list source [file join $dir thermometer.tcl]] set auto_index(funcLog) [list source [file join $dir thermometer.tcl]] set auto_index(funcExp) [list source [file join $dir thermometer.tcl]] set auto_index(funcSqrt) [list source [file join $dir thermometer.tcl]] set auto_index(funcPow2) [list source [file join $dir thermometer.tcl]] set auto_index(func3thRoot) [list source [file join $dir thermometer.tcl]] set auto_index(funcPow3) [list source [file join $dir thermometer.tcl]] set auto_index(funcExp2) [list source [file join $dir thermometer.tcl]] set auto_index(funcSqrtLog) [list source [file join $dir thermometer.tcl]] set auto_index(thermometerSetIntv) [list source [file join $dir thermometer.tcl]] set auto_index(thermometerWidget) [list source [file join $dir thermometer.tcl]] set auto_index(toglOptDefault) [list source [file join $dir toglOpt.tcl]] set auto_index(toglZoom) [list source [file join $dir toglZoom.tcl]] set auto_index(toglZoom:zoom) [list source [file join $dir toglZoom.tcl]] set auto_index(toglZoom:relB1) [list source [file join $dir toglZoom.tcl]] set auto_index(toglZoom:discreteZoom) [list source [file join $dir toglZoom.tcl]] set auto_index(UndoMenuMotion) [list source [file join $dir undoAdvGeom.tcl]] set auto_index(Undo) [list source [file join $dir undoAdvGeom.tcl]] set auto_index(GetUndoRedoList) [list source [file join $dir undoAdvGeom.tcl]] set auto_index(Redo) [list source [file join $dir undoAdvGeom.tcl]] set auto_index(GenCommUndoRedo) [list source [file join $dir undoAdvGeom.tcl]] set auto_index(CreateUndoRedoMenu) [list source [file join $dir undoAdvGeom.tcl]] set auto_index(ClearUndoRedoBuffer) [list source [file join $dir undoAdvGeom.tcl]] set auto_index(xcRegisterUnmapWindow) [list source [file join $dir unmapWin.tcl]] set auto_index(xcUnmapWindow) [list source [file join $dir unmapWin.tcl]] set auto_index(HideWin) [list source [file join $dir unmapWin.tcl]] set auto_index(HowManyUnmapWin) [list source [file join $dir unmapWin.tcl]] set auto_index(UnmapCleanAll) [list source [file join $dir unmapWin.tcl]] set auto_index(SetWignerSeitzInit) [list source [file join $dir wigner.tcl]] set auto_index(SetWignerSeitz) [list source [file join $dir wigner.tcl]] set auto_index(SetWignerSeitz_Radio) [list source [file join $dir wigner.tcl]] set auto_index(SetWignerSeitz_BindCan) [list source [file join $dir wigner.tcl]] set auto_index(SetWignerSeitz_OK) [list source [file join $dir wigner.tcl]] set auto_index(SetWignerSeitz_Cancel) [list source [file join $dir wigner.tcl]] set auto_index(WignerSeitz) [list source [file join $dir wigner.tcl]] set auto_index(WignerSeitzInit) [list source [file join $dir wigner.tcl]] set auto_index(wnDensity) [list source [file join $dir wnDensity.tcl]] set auto_index(wnDensity2D_or_3D) [list source [file join $dir wnDensity.tcl]] set auto_index(wnMakeIn5_2D3D) [list source [file join $dir wnDensity.tcl]] set auto_index(wnAppendRhoFile) [list source [file join $dir wnDensity.tcl]] set auto_index(wnMakeIn5_2D_OK) [list source [file join $dir wnDensity.tcl]] set auto_index(wnDensityFlags) [list source [file join $dir wnDensity.tcl]] set auto_index(wnDensityFlagsOK) [list source [file join $dir wnDensity.tcl]] set auto_index(wnDetComOpt) [list source [file join $dir wnDetComOpt.tcl]] set auto_index(wnKPath) [list source [file join $dir wnKPath.tcl]] set auto_index(wnMultiSlab) [list source [file join $dir wnMultiSlab.tcl]] set auto_index(wnMultiSlabOK) [list source [file join $dir wnMultiSlab.tcl]] set auto_index(wn_nn_def) [list source [file join $dir wnMultiSlab.tcl]] set auto_index(wnOpenSFileUpdate) [list source [file join $dir wnOpen.tcl]] set auto_index(wnOpenDirectory) [list source [file join $dir wnOpen.tcl]] set auto_index(wnOpenSFile) [list source [file join $dir wnOpen.tcl]] set auto_index(wnOpenRenderDensity) [list source [file join $dir wnOpen.tcl]] set auto_index(wnOpenCalcAndRenderDensity) [list source [file join $dir wnOpen.tcl]] set auto_index(wnOpenKPath) [list source [file join $dir wnOpen.tcl]] set auto_index(wnOpenFS) [list source [file join $dir wnOpen.tcl]] set auto_index(wnRun_IsERROR) [list source [file join $dir wnRunWIEN.tcl]] set auto_index(wnRunWIEN) [list source [file join $dir wnRunWIEN.tcl]] set auto_index(wnRunWIENEvent) [list source [file join $dir wnRunWIEN.tcl]] set auto_index(wnRunWIENError) [list source [file join $dir wnRunWIEN.tcl]] set auto_index(wnRunWEIN_IsParallel) [list source [file join $dir wnRunWIEN.tcl]] set auto_index(wnRunWIEN_DeleteOutputFile) [list source [file join $dir wnRunWIEN.tcl]] set auto_index(wnRunWIEN_ReadOutputFile) [list source [file join $dir wnRunWIEN.tcl]] set auto_index(wnRunWIEN_NProc) [list source [file join $dir wnRunWIEN.tcl]] set auto_index(wnSaveSFile) [list source [file join $dir wnSaveSFile.tcl]] set auto_index(xcAbout) [list source [file join $dir xcAbout.tcl]] set auto_index(InitGlobalVar) [list source [file join $dir xcInit.tcl]] set auto_index(xcInit) [list source [file join $dir xcInit.tcl]] set auto_index(clean_xcrysden_scratch) [list source [file join $dir xcInit.tcl]] set auto_index(centerWelcome) [list source [file join $dir xcInit.tcl]] set auto_index(xctr_proc) [list source [file join $dir xctr.tcl]] set auto_index(xcTkFontName2XLFD) [list source [file join $dir xlfd.tcl]] set auto_index(X11Font_MatchFamily) [list source [file join $dir xlfd.tcl]] set auto_index(xsf2Open) [list source [file join $dir xsf2Open.tcl]] set auto_index(xsf2_) [list source [file join $dir xsf2Open.tcl]] set auto_index(xsfAnimOpenMenu) [list source [file join $dir xsfAnim.tcl]] set auto_index(xsfAnimInit) [list source [file join $dir xsfAnim.tcl]] set auto_index(xsfAnimWid) [list source [file join $dir xsfAnim.tcl]] set auto_index(xsfAnimWidClose) [list source [file join $dir xsfAnim.tcl]] set auto_index(xsfAnimAction) [list source [file join $dir xsfAnim.tcl]] set auto_index(xsfAnimRenderCurrent) [list source [file join $dir xsfAnim.tcl]] set auto_index(xsfParseAnim) [list source [file join $dir xsfAnim.tcl]] set auto_index(_xsfAnimParse_getVec) [list source [file join $dir xsfAnim.tcl]] set auto_index(xsfUpdate) [list source [file join $dir xsfOpen.tcl]] set auto_index(xsfAddBlankLine) [list source [file join $dir xsfOpen.tcl]] set auto_index(gunzipXSF) [list source [file join $dir xsfOpen.tcl]] set auto_index(xsfOpenMenu) [list source [file join $dir xsfOpen.tcl]] set auto_index(xsfOpenParsed) [list source [file join $dir xsfOpen.tcl]] set auto_index(xsfOpen) [list source [file join $dir xsfOpen.tcl]] set auto_index(xsfOpen_) [list source [file join $dir xsfOpen.tcl]] set auto_index(xsfAtmSym2Nat) [list source [file join $dir xsfOpen.tcl]] set auto_index(_xsfAtmSym2Nat) [list source [file join $dir xsfOpen.tcl]] set auto_index(xyzOpen) [list source [file join $dir xyz.tcl]] xcrysden-1.6.2/Tcl/Makefile0000644000175000017500000000027413556022211014235 0ustar tonetoneTOPDIR = $(PWD)/.. TCL_INDEX = $(TOPDIR)/util/tcl_index include ../Make.sys .tcl: tclIndex: *.tcl XCRYSDEN_TOPDIR=$(TOPDIR); \ export XCRYSDEN_TOPDIR; $(TCL_INDEX) clean: -rm -f *~ xcrysden-1.6.2/Tcl/addOption.tcl0000644000175000017500000001036013531257130015222 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/addOption.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # # addOption --unknown /path/converterProgram -xterm proc addOption {option converterProgram description {args {}}} { global addOption lappend addOption(optionList) $option lappend addOption(converterList) $converterProgram lappend addOption(description) $description # # here some preprocessing of the args # ... insert HERE ... lappend addOption(args) $args lappend addOption(usage) [format " %s \n%s\n" $option $description] } proc addOption:parse {option filedir} { global addOption system if { ! [info exists addOption(optionList)] } { #wm withdraw .title if { [winfo exists .title] } { destroy .tilte } ErrorDialog "bad option \"$option\"" XCrySDenUsage } set head [file rootname [file tail $filedir]] set ind [lsearch $addOption(optionList) $option] if { $ind >= 0 } { set addOption(converter) [lindex $addOption(converterList) $ind] # # take care of args (tey to be done) if { [eval xcCatchExec $addOption(converter) $filedir > $system(SCRDIR)/$head.xsf] } { exit 1 } ViewMol . xsfOpenParsed $system(SCRDIR)/$head.xsf } else { ErrorDialog "ERROR: Bad option: $option" XCrySDenUsage } } proc addOption:register {} { global system env if { [file exists $system(TOPDIR)/addOptions] } { source $system(TOPDIR)/addOptions } } proc addOption:printCustomUsage {} { global addOption if { ! [info exists addOption(optionList)] } { return } puts stderr "-----------------------" puts stderr " Custom User options" puts stderr "-----------------------\n" foreach usage $addOption(usage) { puts stderr $usage } puts stderr {} } proc addOption:hardcoded {converter {filedir {}} {openwhat {}} {viewmol_exists {}}} { global system addOption xcMisc set addOption(converter) $converter if { $filedir == {} } { set filedir [tk_getOpenFile -defaultextension .xsf \ -filetypes { { {All Files} {.*} } } -initialdir $system(PWD) -title $openwhat] if { $filedir == "" } { return } set viewmol_exists 1 # activate "Reload" button reloadRegister $filedir addOption:reload } set xcMisc(titlefile) $filedir set filedir [gunzipFile $filedir] set head [file rootname [file tail $filedir]] if { [eval xcCatchExec $addOption(converter) $filedir > $system(SCRDIR)/$head.xsf] } { exit 1 } if { $viewmol_exists == "" } { ViewMol . } # # update the title of "." # wm title . "XCrySDen: [file tail $xcMisc(titlefile)]" xsfOpenParsed $system(SCRDIR)/$head.xsf } # this proc is executed when "reload structure" button is pressed # BEWARE: the last "update" argument is needed for generality, because # this proc is called from reloadUpdateDefault, whose reloadCmd is # expectd to have three arguments proc addOption:reload {filedir can {update 1}} { global addOption system if { ! [info exists addOption(converter)] } { error "addOption:reload called before addOption:hardcoded" } set filedir [gunzipFile $filedir] set head [file rootname [file tail $filedir]] if { [eval xcCatchExec $addOption(converter) $filedir > $system(SCRDIR)/$head.xsf] } { exit 1 } xsfOpenParsed $system(SCRDIR)/$head.xsf $can 1 } xcrysden-1.6.2/Tcl/gengeom.tcl0000644000175000017500000000607012352531154014726 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/gengeom.tcl # # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# proc GetGengM3Arg {mode3 {mode4 {}}} { global geng if { $mode3 == "ANGS" } { set m31 1 } elseif { $mode3 == "BOHR" } { set m31 2 } if { $mode4 == "95" } { set m32 1 } elseif { $mode4 == "98" || $mode4 == "03" || $mode4 == "06" || $mode4 == "09" || $mode4 == "14" } { set m32 2 } else { set m32 1 } return ${m31}${m32} } proc GenGeom {m1 m2 m3 igroup nx ny nz output} { global system xcMisc periodic working_XSF_file if { [xcIsActive c95] || [xcIsActive external34] } { # for CRYSTALXX or EXTERNAL34 read from unit 34 xcDebug -debug "exec $system(BINDIR)/gengeom \ $m1 $m2 $m3 $igroup $nx $ny $nz $output" xcCatchExecReturn $system(BINDIR)/gengeom $m1 $m2 $m3 $igroup $nx $ny $nz $output } elseif [xcIsActive wien] { # for WIENXX read from xc_str2xcr.$$ xcDebug -debug "exec $system(BINDIR)/gengeom \ $m1 $m2 $m3 $igroup $nx $ny $nz $output \ $system(SCRDIR)/xc_str2xcr.$system(PID)" xcCatchExecReturn $system(BINDIR)/gengeom $m1 $m2 $m3 $igroup \ $nx $ny $nz $output $system(SCRDIR)/xc_str2xcr.$system(PID) } elseif [xcIsActive external] { # for EXTERNAL read from $xcMisc(external_xsf_name) xcDebug -debug "exec $system(BINDIR)/gengeom \ $m1 $m2 $m3 $igroup $nx $ny $nz $output \ $xcMisc(external_xsf_name)" xcCatchExecReturn $system(BINDIR)/gengeom $m1 $m2 $m3 $igroup \ $nx $ny $nz $output $xcMisc(external_xsf_name) } elseif { [info exists working_XSF_file] } { # it must be some XSF struct file xcDebug -debug "exec $system(BINDIR)/gengeom \ $m1 $m2 $m3 $igroup $nx $ny $nz $output $working_XSF_file" xcCatchExecReturn $system(BINDIR)/gengeom $m1 $m2 $m3 $igroup \ $nx $ny $nz $output $working_XSF_file } else { ErrorDialog "don't know what to do in GenGeom (this is a bug)" return } # # query dimensionality of the sistem # set channel [open $output r] set dim 0 while { ! [eof $channel] } { set line [gets $channel] if { [string match *DIM* $line] } { set dim [lindex [gets $channel] 0] break } } close $channel set periodic(dim) $dim } xcrysden-1.6.2/Tcl/xsfOpen.tcl0000644000175000017500000001671613522564256014750 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/xsfOpen.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc xsfUpdate {filedir {can .mesa}} { global select if { [info exists select(selection_mode)] && $select(selection_mode) } { tk_dialog [WidgetName] "WARNING !!!" "WARNING: structure can not be reloaded while in selection mode. First exit from the selection mode, then reload" warning 0 OK return } # we assume that if .iso or .iso2D windows exist we are in DataGrid mode if { [winfo exists .iso2D] || [winfo exists .iso] } { tk_dialog [WidgetName] "WARNING !!!" "WARNING: structure can not be reloaded while showing datagrids." warning 0 OK reloadButtonDisable return } xsfOpen_ $filedir $can 1 } proc xsfAddBlankLine {filedir} { ########################################## # add a blank line at the end of XSF file set ch [open $filedir a] puts $ch "" flush $ch close $ch ########################################## } proc gunzipXSF {file} { global system xcDebug -debug "gunzipXSF: file = $file" set name [file tail $file] cd $system(SCRDIR) # maybe file is already locate in $system(SCRDIR) if { [file dirname $file] != $system(SCRDIR) && $file != $name } { #file copy -force $file $name fileCopy $file $name catch {exec -- chmod +rw $name} } #################### set gunzipName $name #################### if { [string match *.gz $name] } { xcDebug -debug "gunzipXSF: string matches" catch {exec -- gzip -fd $name} set gunzipName [string trimright $name .gz] catch {exec -- chmod +rw $gunzipName} if { ![file exists $gunzipName] } { ErrorDialog "error when gunzip-ing file $file" uplevel 1 { return } } } set gunzipName $system(SCRDIR)/$gunzipName xcDebug -debug "gunzipXSF: gunziped-file = $gunzipName" xsfAddBlankLine $gunzipName return $gunzipName } # # this proc is called form menu File->...->(Open XSF File) # proc xsfOpenMenu {can {dir {}}} { global fileselect system if { $dir == {} } { set dir $system(PWD) } set fileselect(path) [tk_getOpenFile -defaultextension .xsf \ -filetypes { {{All Files} {.*} } {{XSF Files} {.xsf}} {{GZipped XSF Files} {.xsf.gz}} {{Animated XSF Files} {.axsf}} {{GZipped Animated XSF Files} {.axsf.gz}} } -initialdir $dir -title "Open XSF File"] if { $fileselect(path) == "" } { return } reloadRegister $fileselect(path) XSF xsfOpen $fileselect(path) $can } # call this proc when the XSF file to open is a result of parsing from other file formats proc xsfOpenParsed {filedir {can .mesa} {update 0}} { xsfOpen_ $filedir $can $update } # call this proc only for direct opening of the XSF file (for parsed XSF files, call xsfOpenParsed instead) proc xsfOpen {filedir {can .mesa}} { UpdateWMTitle $filedir xsfOpen_ $filedir $can } proc xsfOpen_ {filedir can {update 0}} { global system geng xcMisc periodic radio sInfo periodic xsfAnim working_XSF_file set filedir [gunzipXSF $filedir] if { ! [info exists xcMisc(reduce_to)] } { set xcMisc(reduce_to) {} } eval {exec $system(BINDIR)/xsf2xsf $filedir $filedir.raw} $xcMisc(reduce_to) set filedir $filedir.raw # # check if xsf is AXSF (Animation XSF) # set fID [open $filedir] set l1st [gets $fID] close $fID if { [string match "*ANIMSTEP*" $l1st] } { # yes we have AXSF file if { $xsfAnim(not_anim) != 1 } { puts stderr "*** xsfAnimInit $filedir .mesa" xsfAnimInit $filedir .mesa $update return } } # # the working XSF file set working_XSF_file $filedir if { $update != 0 } { GetDimGroupXSF periodic(dim) periodic(igroup) $filedir puts stderr "*** update XSF: dim = $periodic(dim)" if { $periodic(dim) < 3 && $radio(cellmode) == "conv" } { set radio(cellmode) prim } if { $periodic(dim) > 1 } { CellMode 1 } else { UpdateStruct .mesa $filedir } xcUpdateState return } # # now open the file # ResetDispModes if { [catch {xc_openstr xcr $filedir $can PL}] } { ErrorDialog "An Error occured, while reading XSF file $filedir" CloseCase return } # # set the proper state # Get_sInfoArray DisplayDefaultMode xcAppendState render xcUpdateState set periodic(dim) $sInfo(dim) # # if the structure is periodic update it according to the "state" # if { $periodic(dim) == 0 } { # save $filedir to xc_struc.$system(PID) so that SaveXSFStruct will work file copy -force $filedir $system(SCRDIR)/xc_struc.$system(PID) } else { set geng(M3_ARGUMENT) [GetGengM3Arg ANGS] # the state should be set as well cd $system(SCRDIR) GenGeom $geng(M1_INFO) $geng(M2_CELL) $geng(M3_ARGUMENT) \ 1 1 1 1 xc_gengeom.$system(PID) set fileID [open "$system(SCRDIR)/xc_gengeom.$system(PID)" r] GetDimGroup periodic(dim) periodic(igroup) $fileID close $fileID #: t.k. Mon Jan 27 15:24:44 CET 2003 CellMode 1 #/ Get_sInfoArray xcUpdateState } CrysFrames #DEBUG: #xc_setatomlabel .mesa 1 "1st atom" "" {1.0 1.0 0.0 } {0.0 0.0 0.5} #/ return } ######################################################################## # check if XSF uses atomic symbols instead of atomic numbers # if it does convert to atomic numbers ... proc xsfAtmSym2Nat {filedir} { global system file copy -force $filedir $system(SCRDIR)/tmp.xsf # open existing XSF file ... set fID [open $system(SCRDIR)/tmp.xsf r] # create a new file ... set newFile $filedir set newID [open $newFile w] # search for ATOMS, PRIMCOORD, CONVCOORD section and replace ... set read_atoms 0 while { ! [eof $fID] } { gets $fID line if { [regexp -- "^ *ATOMS" $line] } { set read_atoms 1 } elseif { [regexp -- "^ *PRIMCOORD|^ *CONVCOORD" $line] } { puts $newID $line gets $fID line set read_atoms 1 } elseif { $read_atoms == 1 } { set len [llength $line] if { $len != 4 && $len != 7 } { set read_atoms 0 } else { set line [_xsfAtmSym2Nat $line] } } puts $newID $line } close $fID close $newID return $newFile } proc _xsfAtmSym2Nat {line} { set f1 [lindex $line 0] if { ! [string is integer $f1] } { set f1 [AnameExt2Nat $f1] } return [concat $f1 [lrange $line 1 end]] } xcrysden-1.6.2/Tcl/unmapWin.tcl0000644000175000017500000001217511712736221015107 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/unmapWin.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # If one wants to hide toplevel with "Hide", then Toplevel must be # registered with the following command # proc xcRegisterUnmapWindow {w bframe what {args {}}} { global unmapWin # w ........ unmap toplevel to register # bframe ... button's frame, i.e. which frame will hold the button # what ..... some kind of identifier set image {} set bitmap {} set text {} set textimage {} set i 0 foreach option $args { incr i if { $i%2 } { set tag $option } else { switch -- $tag { "-image" {set image $option} "-bitmap" {set bitmap $option} "-text" {set text $option} "-textimage" {set textimage $option} default { tk_dialog .mb_error Error \ "ERROR: Bad xRegisterUnmapWindow's button configure option $tag" \ error 0 OK return } } } } if { $i%2 } { tk_dialog .mb_error1 Error "ERROR: You called xcMenuEntry with an odd number of args !" \ error 0 OK return 0 } lappend unmapWin($bframe,registered) $w if ![info exists unmapWin($bframe,column)] { set unmapWin($bframe,column) 0 set unmapWin($bframe,count) 0 } else { incr unmapWin($bframe,column) incr unmapWin($bframe,count) } if { $textimage == {} } { set unmapWin(but,$w,$what) \ [button $bframe.unmap$unmapWin($bframe,count) -bd 1 \ -text $text -bitmap $bitmap -image $image \ -highlightthickness 0 \ -command [list xcUnmapWindow map $w $w $bframe $what]] } else { set text [lindex $textimage 0] set image [lindex $textimage 1] set unmapWin(but,$w,$what) \ [xcHideButton $bframe.unmap$unmapWin($bframe,count) \ $image right -text $text \ -command [list xcUnmapWindow map $w $w $bframe $what]] } set unmapWin($w,$what,column) $unmapWin($bframe,column) # this should be changed: set unmapWin($w,$what,row) 0 } # # the "Hide" toplevel window must be have special bindings; # here is the procedure for bindings # proc xcUnmapWindow {event type w bframe what} { global unmapWin # event ..... what event (map/unmap) # type, w ... to check if event was triggered by toplevel window # bframe .... button's frame, i.e. which frame will hold the button # what .... some kind of identifier if { $type != $w } { # event wasn't triggered by toplevel window return } #xcDebug "Event:: $event $type" # # check if $w was registered # if ![info exists unmapWin($bframe,registered)] { return } set registered 0 foreach win $unmapWin($bframe,registered) { if { $win == $w } { set registered 1 break } } if !$registered { return } if { $event == "unmap" } { #xcDebug "Action: unmap" if ![winfo ismapped $bframe] { eval pack $bframe $unmapWin(packinfo,$bframe) } elseif ![info exists unmapWin(packinfo,$bframe)] { set unmapWin(packinfo,$bframe) [pack info $bframe] } grid configure $unmapWin(but,$w,$what) \ -column $unmapWin($w,$what,column) -row $unmapWin($w,$what,row) } elseif { $event == "map" } { #xcDebug "Action: map" grid forget $unmapWin(but,$w,$what) xcDebug "HowManyUnmapWin:::: [HowManyUnmapWin $bframe]; bframe=$bframe" if { [HowManyUnmapWin $bframe] == 0 } { pack forget $bframe } wm deiconify $w } } # # this is command that the "Hide" button calls # proc HideWin {t what} { global unmapWin wm withdraw $t xcUnmapWindow unmap $t $t $unmapWin(frame,main) $what } #------------------------------------------------------------------------------ # from here on are procedures needed for Hide technology # proc HowManyUnmapWin bframe { global unmapWin set count 0 foreach elem [array names unmapWin but,*] { if [winfo ismapped $unmapWin($elem)] { incr count } } return $count } proc UnmapCleanAll {} { global unmapWin foreach elem [array names unmapWin but,*] { xcDebug "unmapWin Button::: $elem" if [winfo exists $unmapWin($elem)] { destroy $unmapWin($elem) } } # unset all unmapWin elements, but the bframes and packinfo,* foreach pattern { *,registered but,* *,column *,row *,count } { foreach elem [array names unmapWin $pattern] { unset unmapWin($elem) } } } xcrysden-1.6.2/Tcl/sInfo.tcl0000644000175000017500000000443111712736221014363 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/sInfo.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # Tools menu path is is .menu.vmdat proc Get_sInfoArray {} { global sInfo periodic xcDebug "######################################" if { [array exists sInfo] } { xcDebug -debug [array get sInfo *] } else { xcDebug "array s Info does not EXISTS" } xcDebug "######################################" set m .menu.vmdat if { $sInfo(ldatagrid2D) || $sInfo(ldatagrid3D) } { $m.menu entryconfig "Data Grid" -state normal } else { $m.menu entryconfig "Data Grid" -state disabled } if { $sInfo(lprimvec) || $sInfo(lconvvec) } { set periodic(igroup) $sInfo(groupn) } set periodic(dim) $sInfo(dim) if { !$sInfo(lprimvec) && !$sInfo(lconvvec) } { set periodic(dim) 0 } if { $periodic(dim) == 0 } { $m.menu entryconfig {k-path Selection} -state disabled } else { $m.menu entryconfig {k-path Selection} -state normal } xcDebug -stderr "sInfo(dim) = $sInfo(dim); periodic(dim) = $periodic(dim)" if { $sInfo(lforce) } { .menu.vmdis.menu entryconfig {Forces} -state normal .menu.vmmod.menu entryconfig {Force Settings} -state normal } else { .menu.vmdis.menu entryconfig {Forces} -state disabled .menu.vmmod.menu entryconfig {Force Settings} -state disabled } # initialize WignerSeitz WignerSeitzInit } xcrysden-1.6.2/Tcl/toglOpt.tcl0000644000175000017500000000334213555572342014746 0ustar tonetone#------------------------------------------------------------------------ # Set default options for Togl widget #------------------------------------------------------------------------ proc toglOptDefault {} { global toglOpt tcl_platform set toglOpt(rgba) true set toglOpt(redsize) 1 set toglOpt(greensize) 1 set toglOpt(bluesize) 1 set toglOpt(double) true set toglOpt(depth) true set toglOpt(depthsize) 1 set toglOpt(accum) true set toglOpt(accumredsize) 1 set toglOpt(accumgreensize) 1 set toglOpt(accumbluesize) 1 set toglOpt(accumalphasize) 1 set toglOpt(alpha) false set toglOpt(alphasize) 1 set toglOpt(stencil) false set toglOpt(stencilsize) 1 set toglOpt(auxbuffers) 0 set toglOpt(overlay) false set toglOpt(stereo) none set toglOpt(time) 100 # on Mac OS X/X11, Cygwin, and Windows-WSL xcrysden crashes if # toglOpt(accum) = true ... if { [string match -nocase *Darwin* $tcl_platform(os)] \ || [string match -nocase *CYGWIN* $tcl_platform(os)] \ || [string match -nocase *Microsoft* $tcl_platform(osVersion)] \ } { # disable accumulation buffer set toglOpt(accum) false } # Togl2.0 fails to print-to-file for Cygwin and Windows-WSL; use # Imagemagick for printing instead if { [string match -nocase *CYGWIN* $tcl_platform(os)] \ || [string match -nocase *Microsoft* $tcl_platform(osVersion)] \ } { global printSetup set printSetup(dumpWindow) 1 } } xcrysden-1.6.2/Tcl/xcInitLib.tcl0000644000175000017500000002660713523023605015200 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/xcInitLib.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # # Modified by Eric Verfaillie ericverfaillie@yahoo.fr EV # # may 2004 # # modifications are near EV comments # ############################################################################# ######################### # CRYSTALXX executables # ######################### set system(c95_exist) 0 set system(c95_integrals) crystal set system(c95_scf) crystal set system(c95_scfdir) crystal set system(c95_properties) properties ############# # DEBUGGING # ############# set xcMisc(debug) 0 ################################### # measurements: distances, angles # ################################### set select(dist_precision) 4 set select(angl_precision) 3 ######################################################################## # some Window Managers doesn't handle proper the "Maxi" command button # # therefore user may specify necessary offsets in order that Maxi # # covers the whole root window starting on upper left corner of the # # screen; when I used fvwm2 WM I had to spefify # # ${rootX}x${rootY}+6+23; # # Now I am using enlightenment and there is no needed offset. This # # definition here is the DEFAULT; each user shoud specify its own # # settings in $HOME/.xcrysden/custom-definitions file !!! # ######################################################################## set xcMisc(wm_rootXshift) 0 set xcMisc(wm_rootYshift) 0 #check_packages_awk set system(PWD) [pwd] set system(PID) [pid] set system(TCLDIR) $system(TOPDIR)/Tcl set system(BMPDIR) $system(TOPDIR)/images set system(UTIL) $system(TOPDIR)/util set system(AWKDIR) $system(TOPDIR)/Awk if { [info exists env(XCRYSDEN_LIB_BINDIR)] && [file isdirectory $env(XCRYSDEN_LIB_BINDIR)] } { # used by system-wide installation made by "make install" or by linux distros set system(FORDIR) $env(XCRYSDEN_LIB_BINDIR) set system(BINDIR) $env(XCRYSDEN_LIB_BINDIR) } else { set system(FORDIR) $system(TOPDIR)/bin set system(BINDIR) $system(TOPDIR)/bin } # make non-writable core if { ![file exists $system(PWD)/core] } { catch {exec touch $system(PWD)/core} } catch {exec chmod -w $system(PWD)/core} ################################################################# # make more save algorithm for assigning the SCRDIR in the future # if { [file isdirectory $system(SCRDIR)/xc_$system(PID)] } { file delete -force $system(SCRDIR)/xc_$system(PID) } elseif { [file exists $system(SCRDIR)/xc_$system(PID)] } { file delete -force $system(SCRDIR)/xc_$system(PID) } file mkdir $system(SCRDIR)/xc_$system(PID) set system(SCRDIR) $system(SCRDIR)/xc_$system(PID) ################################################################# ############################################################################# # THIS IS FOR AUTO-LOAD; this is very dengerous if only tclsh has been loaded lappend auto_path $system(TCLDIR) $system(TCLDIR)/fs # # the following lines are executed only if shell is wish # if { [string match *Tk* [package names]] } { ########################################################### # SETTING X RESOURCES - loading database .xcrysden_defaults if { [file exists $system(TCLDIR)/Xcrysden_resources] } { option readfile $system(TCLDIR)/Xcrysden_resources } if { [file exists $env(HOME)/.xcrysden/Xcrysden_resources] } { option readfile $env(HOME)/.xcrysden/Xcrysden_resources } # load palette set palette [option get . palette Palette] if { $palette != "" } { tk_setPalette $palette } else { tk_setPalette [. cget -background] } ########################################################### # changed: Wed Dec 30 14:33:46 CET 1998 # now fonts are managed in ''ProbeResolution'' ########################################################### # FONTS -- FONTS -- FONTS; (AUTO-LOAD must be before FONTS !!!!) #button .b -text TONE #entry .e -text TONE # #set xcFonts(normal) [lindex [.b configure -font] end] #set xcFonts(normal_entry) [lindex [.e configure -font] end] #set xcFonts(small) [ModifyFontSize .b 10 \ # {-family helvetica -slant r -weight bold}] #set xcFonts(small_entry) [ModifyFontSize .e 10 \ # {-family helvetica -slant r -weight normal}] #destroy .b .e ###################################################################### # COLORS -- COLORS -- COLORS -- COLORS -- COLORS -- COLORS set xcColors(disabled_fg) [lindex \ [GetWidgetConfig button -disabledforeground] end] set xcColors(enabled_fg) [lindex \ [GetWidgetConfig scale -foreground] end] set xcColors(normal_bg) [lindex \ [GetWidgetConfig button -background] end] #xcDebug -stderr "xcColors(normal_bg)=$xcColors(normal_bg)" #xcDebug -stderr "xcColors(enabled_fg)=$xcColors(enabled_fg)" #xcDebug -stderr "xcColors(disabled_fg)=$xcColors(disabled_fg)" ########################################################### # CURSORS --- CURSORS --- CURSORS set xcCursor(default) [. cget -cursor] set xcCursor(watch) watch #################################### # set precision to double precission #set tcl_precision 17; # this is legacy stuff ##################################################### # CREATE IMAGES --- CREATE IMAGES --- CREATE IMAGES # ##################################################### # rotation images set xcMisc(status_init_label) "Creating images ..." # K-path selection buttons (no rescaling) image create photo printer -format gif \ -file $system(BMPDIR)/printer.gif image create photo rotXmin -format gif \ -file $system(BMPDIR)/rotXmin.gif image create photo rotXplus -format gif \ -file $system(BMPDIR)/rotXplus.gif image create photo rotYmin -format gif \ -file $system(BMPDIR)/rotYmin.gif image create photo rotYplus -format gif \ -file $system(BMPDIR)/rotYplus.gif image create photo rotZmin -format gif \ -file $system(BMPDIR)/rotZmin.gif image create photo rotZplus -format gif \ -file $system(BMPDIR)/rotZplus.gif image create photo zoomUp -format gif \ -file $system(BMPDIR)/zoomup.gif image create photo zoomDown -format gif \ -file $system(BMPDIR)/zoomdown.gif # animation images (no rescaling) image create photo first -format gif -file $system(BMPDIR)/first.gif image create photo last -format gif -file $system(BMPDIR)/last.gif image create photo previous -format gif -file $system(BMPDIR)/previous.gif image create photo next -format gif -file $system(BMPDIR)/next.gif image create photo backward -format gif -file $system(BMPDIR)/backward.gif image create photo forward -format gif -file $system(BMPDIR)/forward.gif image create photo stop -format gif -file $system(BMPDIR)/stop.gif image create photo pause -format gif -file $system(BMPDIR)/pause.gif image create photo snapshot -format gif -file $system(BMPDIR)/camera-photo.gif # unmapWin images: should be Nx16 dimension (no rescaling) image create photo unmap-isosurf -format gif \ -height 16 -width 80 \ -file $system(BMPDIR)/unmap-isosurface.gif image create photo unmap-C95output -format gif \ -height 16 -width 80 \ -file $system(BMPDIR)/unmap-C95output.gif image create photo unmap-empty -format gif \ -height 16 -width 80 \ -file $system(BMPDIR)/unmap-empty.gif image create photo unmap -format gif \ -height 16 \ -file $system(BMPDIR)/unmap.gif # palette image (no rescaling) image create photo colors -format gif -file $system(BMPDIR)/mini-colors.gif # nice images (no rescaling) #image create photo titleImg -format gif -file $system(BMPDIR)/xcrysden-picture.gif # FermiSurface images (no rescaling) foreach image {bz cell nocell nocrop solidcell solidwirecell wirecell} { image create photo fs_$image -format gif -file $system(BMPDIR)/$image.gif } # Viewer Rotate & Orientate buttons set b 26; #this is button size lappend xcMisc(rescale_image_list) \ [image create photo up -format gif \ -file $system(BMPDIR)/up1.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo down -format gif \ -file $system(BMPDIR)/down1.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo left -format gif \ -file $system(BMPDIR)/left1.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo right -format gif \ -file $system(BMPDIR)/right1.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo center -format gif \ -file $system(BMPDIR)/center_nice.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo rotXY -format gif \ -file $system(BMPDIR)/rotXY1.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo rotXZ -format gif \ -file $system(BMPDIR)/rotXZ1.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo rotYZ -format gif \ -file $system(BMPDIR)/rotYZ1.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo rotAB -format gif \ -file $system(BMPDIR)/rotAB.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo rotAC -format gif \ -file $system(BMPDIR)/rotAC.gif -width $b -height $b] lappend xcMisc(rescale_image_list) \ [image create photo rotBC -format gif \ -file $system(BMPDIR)/rotBC.gif -width $b -height $b] # displayMode + displayStyle images (rescale image) foreach image { wireframes_2d pointlines_2d pipeballs_2d ballsticks2_2d ballsticks1_2d spacefills_2d spacefills_3d ballsticks_3d pipeballs_3d sticks_3d dm_wire dm_solid dm_anaglyph dm_stereo dm_smooth dm_flat rep_unit rep_asym } { lappend xcMisc(rescale_image_list) [image create photo $image -format gif -file $system(BMPDIR)/$image.gif] } ################################## # Get Fonts, Images & Other Sizes set xcMisc(status_init_label) "Probing screen dimensions ..." ProbeResolution SetImageSizes # load default options for Togl widgets toglOptDefault # the below "FoucIn" doesn't work well: ## let's select the content of the entry widget upon FocuIn # #bind Entry { # %W selection from 0 # %W selection to end # %W icursor end #} } xcrysden-1.6.2/Tcl/reload.tcl0000644000175000017500000001202613515350163014552 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/reload.tcl # ------ # # Copyright (c) 1996--2019 by Anton Kokalj # ############################################################################# #------------------------------------------------------------------------ # This proc is called before a reloadable file is opened, so that we # register what to do when reoad button is pressed #------------------------------------------------------------------------ proc reloadRegister {filedir type} { global reload set reload(capable) 1 set reload(file) $filedir set allowed_types { XSF XSF2 XYZ GZMAT PDB addOption:reload openExtStruct:reload WIEN2k } if { [lsearch $allowed_types $type] > -1 } { set reload(type) $type } else { error "unsupported reload type $type; must be one of [join $allowed_types {, }]" } } #------------------------------------------------------------------------ # This proc is the deafult command for reloading the structure #------------------------------------------------------------------------ proc reloadUpdateDefault {reloadCmd filedir {can .mesa}} { if { [info exists select(selection_mode)] && $select(selection_mode) } { tk_dialog [WidgetName] "WARNING !!!" "WARNING: structure can not be reloaded while in selection mode. First exit from the selection mode, then reload" warning 0 OK return } $reloadCmd $filedir $can 1 } #------------------------------------------------------------------------ # This proc return 1 if we are reload-capable and 0 otherwise #------------------------------------------------------------------------ proc reloadCapable {} { global reload if { [info exists reload(capable)] && $reload(capable) } { return 1 } return 0 } #------------------------------------------------------------------------ # This proc register's reload button #------------------------------------------------------------------------ proc reloadButton {buttonWidget} { global reload set reload(buttonWidget) $buttonWidget reloadButtonQueryState } #------------------------------------------------------------------------ # This proc enables reload button #------------------------------------------------------------------------ proc reloadButtonEnable {} { reloadButtonState_ normal } #------------------------------------------------------------------------ # This proc disables reload button #------------------------------------------------------------------------ proc reloadButtonDisable {} { reloadButtonState_ disabled } #------------------------------------------------------------------------ # This proc enables (disables) reload button if reload-capable (reload-incapable) #------------------------------------------------------------------------ proc reloadButtonQueryState {} { expr { [reloadCapable] ? [reloadButtonEnable] : [reloadButtonDisable] } } # internal proc ... (do not call directly) proc reloadButtonState_ {state} { global reload if { ! [info exists reload(buttonWidget)] } { return } if { [winfo exists $reload(buttonWidget)] } { $reload(buttonWidget) configure -state $state } } #------------------------------------------------------------------------ # This proc is a reload-command; it is executed when reload button is pressed #------------------------------------------------------------------------ proc reloadCmd {{togl .mesa}} { global reload if { ! [info exists reload(type)] } { error "reloadRegister or reloadRegisterCmd must be called before reloadCmd" } switch -- $reload(type) { XSF { xsfUpdate $reload(file) $togl } XSF2 { reloadUpdateDefault xsf2Open $reload(file) $togl } XYZ { reloadUpdateDefault xyzOpen $reload(file) $togl } GZMAT { reloadUpdateDefault gzmat $reload(file) $togl } addOption:reload - openExtStruct:reload { reloadUpdateDefault $reload(type) $reload(file) $togl } PDB { pdfUpdate $reload(file) $togl } WIEN2k { wnOpenSFileUpdate $reload(file) $togl } default { error "unsupported reload type $type" } } } xcrysden-1.6.2/Tcl/dos.tcl0000644000175000017500000001674611712736221014106 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/dos.tcl # ------ # # Copyright (c) 1996--2004 by Anton Kokalj # ############################################################################# proc DOSSGraph { NPRO } { global prop ftn25 grafdata grafsize graf system set fileID [open $prop(dir)/$prop(file)25 r] # # query GrapherID # set gID [NextGrapherID] xcDebug "GrapherID:: -- $gID --" set Ymax 0.0 if { $prop(type_of_run) == "UHF" } { set N_segm 2 } else { set N_segm 1 } # first PROJECTED DOS, if any set grafdata($gID,N_text) 0 for {set j 1} {$j <= $N_segm} {incr j} { set i 1; # don't change for {} {$i <= $NPRO} {incr i} { xcDebug "DOSSGraph:: i=$i, j=$j" ReadFTN25 DOSS $fileID $gID $j $i if { $ftn25(Ymax) > $Ymax } { set Ymax $ftn25(Ymax) } if { $prop(type_of_run) == "UHF" && abs($ftn25(Ymin)) > $Ymax } { set Ymax abs($ftn25(Ymin)) } } # now TOTAL DOS ReadFTN25 DOSS $fileID $gID $j $i } for {set i 1} {$i <= $NPRO} {incr i} { # someday makes this better set atoms "" set AOs "" if { $prop(N,$i) < 0 } { append atoms "$prop(NDM,$i) " set grafdata($gID,text$i) \ "DOS projected to atoms: $atoms" incr grafdata($gID,N_text) } else { append AOs "$prop(NDM,$i) " set grafdata($gID,text$i) \ "DOS projected to AOs: $AOs" incr grafdata($gID,N_text) } } if { $ftn25(Ymax) > $Ymax } { set Ymax $ftn25(Ymax) } if { $prop(type_of_run) == "UHF" && abs($ftn25(Ymin)) > $Ymax } { set Ymax abs($ftn25(Ymin)) } set grafdata($gID,text$i) "Total DOS" incr grafdata($gID,N_text) close $fileID # Yoffset is 0.1 --> 1.1 set Yoffset 1.1 set dX $ftn25(X4) set grafdata($gID,N_graf) [expr $NPRO + 1]; # N of graphs set grafdata($gID,type) DOSS set grafdata($gID,X_title,[expr $NPRO + 1]) "E \[a.u.\]" set grafsize($gID,canW) 600 if { $NPRO == 0 } { set grafsize($gID,canH) 400 } if { $NPRO == 1 } { set grafsize($gID,canH) 500 } if { $NPRO == 2 } { set grafsize($gID,canH) 600 } if { $NPRO <= 2 } { set grafsize($gID,Yscroll) 0 } else { set grafsize($gID,Yscroll) [expr ($NPRO + 1) * 200] } for {set g 1} {$g < $grafdata($gID,N_graf)} {incr g} { set grafdata($gID,Xtick_text_draw,$g) 0 } set ftn25(X2) [FTN25_MustBeNumber $ftn25(X2) 0.0 \ "An Error has occured while reading unit 25; Energy corresponding to the first point can not be read. A value of 0.0 will be taken for first energy point instead !"] set ftn25(X4) [FTN25_MustBeNumber $ftn25(X4) 1.0 \ "An Error has occured while reading unit 25; Energy increment can not be read. A value of 1.0 will be taken for energy increment instead !"] set ftn25(X5) [FTN25_MustBeNumber $ftn25(X5) 0.0 \ "An Error has occured while reading unit 25; Fermi energy can not be read. A value of 0.0 will be taken for Fermi energy instead !"] for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g} { set grafdata($gID,Ytick_text_draw,$g) 0 set grafdata($gID,Y_title,$g) " DOS\n(arb. un.)" set grafdata($gID,Ymax,$g) [expr $Yoffset * $Ymax] set grafdata($gID,Yoffset,$g) 0.0 set grafdata($gID,Xoffset,$g) 0.05 set grafdata($gID,Xmin,$g) $ftn25(X2); # min Energy set grafdata($gID,Xmax,$g) \ [expr $ftn25(X2) + $ftn25(NCOL) * $ftn25(X4)] set grafdata($gID,Xline1,$g) $ftn25(X5); # Fermi Energy set grafdata($gID,Xline2,$g) 0.5 set grafdata($gID,N_Xline,$g) 1; set grafdata($gID,N_point,$g) $ftn25(NCOL); # N of point per graph set grafdata($gID,Xline1_text,$g) "E_Fermi" set grafsize($gID,Xline1_textstipple,$g) @$system(BMPDIR)/dotH.bmp set grafsize($gID,Xline1_fill,$g) "#ff0000" set grafsize($gID,Xline1_width,$g) 1 set grafsize($gID,Xline1_stipple,$g) @$system(BMPDIR)/dotV.bmp set grafsize($gID,margin_X1) $grafsize(margin_X1) set grafsize($gID,margin_X2) $grafsize(margin_X2) set grafsize($gID,margin_Y1) $grafsize(margin_Y1) set grafsize($gID,margin_Y2) $grafsize(margin_Y2) set grafsize($gID,Yaxe_title_offset) 15 if { $prop(type_of_run) == "UHF" } { set grafdata($gID,Ymin,$g) -$grafdata($gID,Ymax,$g) set grafdata($gID,N_Yline,$g) 1 set grafdata($gID,Yline1,$g) 0.0 set grafsize($gID,Yline1_fill,$g) "#000000" set grafsize($gID,Yline1_width,$g) 1 set grafsize($gID,Yline1_stipple,$g) {} set grafdata($gID,N_segment,$g) 2 } else { # RHF set grafdata($gID,Ymin,$g) 0.0 set grafdata($gID,N_Yline,$g) 0 set grafdata($gID,N_segment,$g) 1 } set graf($gID,RorigX,$g) 0.0 set graf($gID,RorigY,$g) \ [expr double($NPRO + 1 - $g) / double($NPRO + 1)] set graf($gID,RsizeX,$g) 1.0 set graf($gID,RsizeY,$g) \ [expr 1.0 / double($NPRO + 1) - [XGraph2nMRel $gID 5]] xcDebug "origin:: $graf($gID,RorigX,$g) $graf($gID,RorigY,$g)" xcDebug "size:: $graf($gID,RsizeX,$g) $graf($gID,RsizeY,$g)" set grafdata($gID,text${g}_X) 0.02 set grafdata($gID,text${g}_Y) \ [expr double($g - 0.9) / double($NPRO + 1)] # X vales of points for {set i 1} {$i <= $grafdata($gID,N_point,$g)} {incr i} { set grafdata($gID,X$i,$g) \ [expr $grafdata($gID,Xmin,$g) + $dX * ($i - 1)] } # take care of X ticks set grafdata($gID,N_mXtick,$g) 2 set grafdata($gID,N_MXtick,$g) 5 set dx [expr abs(($grafdata($gID,Xmax,$g) - \ $grafdata($gID,Xmin,$g)) / \ ($grafdata($gID,N_MXtick,$g) - 1))] for {set i 1} {$i <= $grafdata($gID,N_MXtick,$g)} {incr i} { set grafdata($gID,Xtick$i,$g) \ [expr $grafdata($gID,Xmin,$g) + ($i - 1) * $dx] if { abs($grafdata($gID,Xtick$i,$g)) < 0.01 || \ abs($grafdata($gID,Xtick$i,$g)) >= 100 } { set grafdata($gID,Xtick${i}_text,$g) \ [format "%6.3E" $grafdata($gID,Xtick$i,$g)] } else { set grafdata($gID,Xtick${i}_text,$g) \ [format "%6.3f" $grafdata($gID,Xtick$i,$g)] } } # take care of X ticks set grafdata($gID,N_mYtick,$g) 2 set grafdata($gID,N_MYtick,$g) 5 set dy [expr abs(($grafdata($gID,Ymax,$g) - \ $grafdata($gID,Ymin,$g)) / \ ($grafdata($gID,N_MYtick,$g) - 1))] for {set i 1} {$i <= $grafdata($gID,N_MYtick,$g)} {incr i} { set grafdata($gID,Ytick$i,$g) \ [expr $grafdata($gID,Ymin,$g) + ($i - 1) * $dy] if { abs($grafdata($gID,Ytick$i,$g)) < 0.01 || \ abs($grafdata($gID,Ytick$i,$g)) >= 100 } { set grafdata($gID,Ytick${i}_text,$g) \ [format "%6.3E" $grafdata($gID,Ytick$i,$g)] } else { set grafdata($gID,Ytick${i}_text,$g) \ [format "%6.3f" $grafdata($gID,Ytick$i,$g)] } } } xcDebug "Ymax, Ymin:: $grafdata($gID,Ymax,1), $grafdata($gID,Ymin,1)" } xcrysden-1.6.2/Tcl/advGeom.tcl0000644000175000017500000006452612352550303014676 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/advGeom.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # --------------------------------------------------------------------------- # # ADV_GEOM OPTIONS --- ADV_GEOM OPTIONS # # in this file: SLAB # CLUSTER options are implemented # --------------------------------------------------------------------------- # # --------------------------------------------------------------------------- # PART#1>> # CAT A SLAB # ^^^^^^^^^^ proc CutSlab {} { global H K L ISUP NL cutslabfoclist species nxdir nydir XCState periodic # there must be manual & 'graphical' way of doing it # slab could be cut only if $species == "Crystal" #if XCState is not c95, we can not cut a slab if { [xcIsActive c95] == 0 || [xcIsActive render] == 0 } { return } puts stderr "SPECIES: $species" puts stderr "DIM: $periodic(dim)" set ok 1 if { $species == "external" } { if { $periodic(dim) != 3 } { set ok 0 } } else { if { $species != "crystal" } { set ok 0 } } if { ! $ok } { tk_dialog .cutslabwarning "Warning" "WARNING: \"Cut a Slab\" \ option can be applied only for CRYSTALS !!!" warning 0 OK return } if [winfo exists .cutslab] { return } set t [xcToplevel .cutslab "Cut a Slab" "Cut a Slab" . 100 0 1] set cutslabfoclist {} set f2 [frame $t.f2 -relief raised -bd 1] set f3 [frame $t.f3 -relief raised -bd 1] pack $f2 $f3 -side top -fill both -expand true # FRAME #1 has been deleted # in FRAME #2 goes three entries & button set fr2 [frame $f2.fr -relief groove -bd 2] pack $fr2 -side top -padx 7 -pady 7 -ipadx 7 -ipady 7 -fill x set l1 [label $fr2.l1 -text "Miller idices of a plane:"] pack $l1 -side top -expand 1 Entries $fr2 "H: K: L:" "H K L" 3 append cutslabfoclist " $fr2.frame.entry1 $fr2.frame.entry2 \ $fr2.frame.entry3" focus $fr2.frame.entry1 set b [button $fr2.b -text "Select the Plane" \ -command [list SelPlane $t]] pack $b -expand 1 set frm2 [frame $f2.frm -relief groove -bd 2] pack $frm2 -side top -padx 7 -pady 7 -ipadx 7 -ipady 7 -fill x set f21 [frame $frm2.1] pack $f21 -side top -fill both -expand 1 Entries $f21 {{Label of Surface layer:}} ISUP 3 set f22 [frame $frm2.2] pack $f22 -side top -fill both -expand 1 Entries $f22 {{Number of layers:}} NL 3 # here will be specification of number of cells to be drawn in X&Y dir set frm21 [frame $f2.frm1 -relief groove -bd 2] pack $frm21 -side top -padx 7 -pady 7 -ipadx 7 -ipady 7 -fill x set l2 [label $frm21.lbl -text "Specify number of cells to be drawn in"] pack $l2 -side top -padx 3 -pady 7 set f23 [frame $frm21.3] pack $f23 -side top -fill both -expand 1 Entries $f23 {{in X-dir:} {in Y-dir:}} {nxdir nydir} 3 append cutslabfoclist " $f21.frame.entry1 $f22.frame.entry1\ $f23.frame.entry1 $f23.frame.entry2" # in FRAME #3 there will be OK & CANCEL BUTTON # make a ring around OK button set okf [frame $f3.okf -relief sunken -bd 2] set ok [button $okf.ok -text OK -command [list CutSlabOK $t]] set can [button $f3.can -text Cancel -command [list Cancel $t]] pack $okf -side left -expand 1 -padx 5m -pady 2m pack $can -side left -expand 1 -padx 5m -pady 2m -ipadx 1m -ipady 1m pack $ok -padx 1m -pady 1m -ipadx 1m -ipady 1m } proc CutSlabOK {t} { global H K L ISUP NL cutslabfoclist nxdir nydir AdvGeom err radio puts stdout $cutslabfoclist # first we must check a variables check_var {{H int} {K int} {L int} {ISUP int} {NL posint} {nxdir posint}\ {nydir posint}} $cutslabfoclist # check_var return $err; if $err --> mistake -> RETURN if $err { return } # if we come so far --> everything is OK set n [xcAdvGeomState new] set AdvGeom($n,slab) "$H $K $L \n$ISUP $NL\n" destroy $t set radio(cellmode) "prim" # t.k global XCState xcDebug "state is: $XCState(state)" # this is for UNDO/REDO GenCommUndoRedo "Cut a SLAB" CalStru } proc Cancel {t} { destroy $t uplevel return } proc SelPlane {t} { global H K L ISUP NL cutslabfoclist species nxdir nydir SelPlane set grab 0 if { [grab current] == "$t" } { set grab 1 catch { grab release $t } } puts stdout "GRAB IS> [grab status $t]" PreSel .sel_plane .mesa "Select a Plane" \ "For Plane Click on three atoms" PlaneSel 3 tkwait variable SelPlane(done) puts stdout "Plane> $SelPlane(plane)" set H [lindex $SelPlane(plane) 0] set K [lindex $SelPlane(plane) 1] set L [lindex $SelPlane(plane) 2] puts stdout "HKL> $H $K $L" if { $grab } { catch { grab $t } } } # ----------------------------------------------------------------------------- # PART#2>> # CUT A CLUSTER # ^^^^^^^^^^^^^ proc CutCluster {} { global cutCL cutclusfoclist species XCState anal coorn brdmod # cutCL .... all variables needed for crystal's CLUSTER data are herein # cutclusfoclist .... list of Entries; numbers in Entries must be checked # when OK button is pressed #if XCState is not c95, we can not cut a cluster if { [xcIsActive c95] == 0 || [xcIsActive render] == 0 } { return } # species must be a periodic one if { $species == "molecule" } { tk_dialog .cutslabwarning "Warning" "WARNING:\"Cut a Cluster\" \ option can't be applied for MOLECULES !!!" warning 0 OK return } if [winfo exists .cutslab] { return } set t [toplevel .cutclus] xcPlace . .cutclus 530 25 wm title $t "Cut a Cluster" wm iconname $t "Cut a Cluster" set f1 [frame $t.f1 -relief groove -bd 2] set f2 [frame $t.f2 -relief groove -bd 2] set f3 [frame $t.f3 -relief groove -bd 2] set f4 [frame $t.f4 -relief groove -bd 2] set f5 [frame $t.f5] pack $f1 -side top -padx 7 -pady 7 \ -ipadx 7 -ipady 7 -fill x -expand 1 pack $f2 -side top -padx 7 \ -ipadx 7 -ipady 7 -fill x -expand 1 pack $f3 -side top -padx 7 -pady 7 \ -ipadx 7 -ipady 7 -fill x -expand 1 pack $f4 -side top -padx 7 \ -ipadx 7 -ipady 7 -fill x -expand 1 pack $f5 -side top -padx 7 -pady 7 \ -ipadx 7 -ipady 7 -fill x -expand 1 # ---f1-f1-f1-f1-f1-f1-f1-f1--------------------------------- set fr11 [frame $f1.1] set fr12 [frame $f1.2] set fr13 [frame $f1.3] pack $fr11 $fr12 $fr13 -side top -pady 5 -fill x set l1 [label $fr11.l1 -text "Coordinates of the centre of the cluster:"] pack $l1 -side top -expand 1 Entries $fr11 "X: Y: Z:" "cutCL(X) cutCL(Y) cutCL(Z)" 7 set cutclusfoclist " $fr11.frame.entry1 $fr11.frame.entry2 \ $fr11.frame.entry3" focus $fr11.frame.entry1 set b [button $fr11.b -text "Select the Coordinates" \ -command [list SelClusCoor $t]] pack $b -expand 1 set l1 [label $fr12.l1 -text "Maximum number of stars:"] set e1 [entry $fr12.e1 -relief sunken -width 3 -textvariable cutCL(NST)] set l2 [label $fr13.l2 -text "Radius of sphere centered at XYZ:"] set e2 [entry $fr13.e2 -relief sunken -width 5 -textvariable cutCL(RMAX)] pack $l1 $e1 $l2 $e2 -side left -expand 1 append cutclusfoclist " $e1 $e2" # ---f2-f2-f2-f2-f2------------------------------------------- set cutCL(NNA) 0 set anal No RadioButCmd $f2 "Print nearest neighbour\nanalysis of cluster atoms:" \ anal NeighAnal left left 0 1 2 "Yes" "No" # ---f3-f3-f3-f3-f3------------------------------------------- set cutCL(NCN) 0 set coorn No RadioButCmd $f3 "Define user-defined\ncoordination numbers:" \ coorn CoorNum left left 0 1 2 "Yes" "No" # ---f4-f4-f4-f4-f4------------------------------------------- set cutCL(NMO) 0 set brdmod No RadioButCmd $f4 "Modify border atoms:" \ brdmod SetNMO left left 0 1 2 "Yes" "No" # ---f5-f5-f5-f5-f5------------------------------------------- set okf [frame $f5.okf -relief sunken -bd 2] set ok [button $okf.ok -text "OK" \ -command [list CutClusOK $t]] set can [button $f5.can -text "Cancel" -command [list Cancel $t]] pack $okf -side left -expand 1 -padx 5m -pady 2m pack $can -side left -expand 1 -padx 5m -pady 2m -ipadx 1m -ipady 1m pack $ok -padx 1m -pady 1m -ipadx 1m -ipady 1m } proc SelClusCoor {w} { global done if { [winfo exists .how2sel] } { return } set t [xcToplevel .how2sel "Choose" "Choose" . 581 74] set l1 [label $t.l1 -text "How to select centre of cluster:"] set b1 [button $t.b1 -text "Centre on Atom" \ -command [list CentreAtomCL $t]] set b2 [button $t.b2 -text "Centre on Hole" \ -command [list CentreHoleCL $t]] pack $l1 -side top -expand 1 -padx 10 -pady 10 pack $b1 $b2 -side top -padx 10 -pady 5 -ipadx 5 -ipady 5 \ -expand 1 -fill x tkwait visibility $t tkwait variable done } proc CentreAtomCL {w} { global done cutCL SelAtomCL destroy $w PreSel .catom .mesa "Coordinates of the Centre of the Cluster" \ "To select the centre of the cluster click on one atom" \ SelCentreAtomCL 1 tkwait variable SelAtomCL(done) set cutCL(X) [lindex $SelAtomCL(centre) 0] set cutCL(Y) [lindex $SelAtomCL(centre) 1] set cutCL(Z) [lindex $SelAtomCL(centre) 2] set done 1 } proc CentreHoleCL {w} { global done cutCL SelHoleCL destroy $w PreSel .catom .mesa "Coordinates of the Centre of the Cluster" \ "A \"hole\" is geometrical centre of several atoms!!!\n\ To select the hole click on desired number of atoms" \ SelCentreHoleCL 15; # 15 is maximum allowed number of # selected atoms tkwait variable SelHoleCL(done) set cutCL(X) [lindex $SelHoleCL(centre) 0] set cutCL(Y) [lindex $SelHoleCL(centre) 1] set cutCL(Z) [lindex $SelHoleCL(centre) 2] set done 1 } proc CutClusOK {t} { global cutCL cutclusfoclist AdvGeom err system radio # t... toplevel # brdmod... flag for border modification # first we must check a variables check_var {{cutCL(X) real} {cutCL(Y) real} {cutCL(Z) real} \ {cutCL(NST) posint} {cutCL(RMAX) real}} $cutclusfoclist # check_var return $err; if $err --> mistake -> RETURN if $err { return } # if we come so far --> everything is OK # assign AdvGeom set n [xcAdvGeomState new] CutCLInput1 destroy $t # # set cellmode to PRIMITIVE # set radio(cellmode) "prim" puts stdout "BORDER MODIFICATION: $cutCL(NMO)" puts stdout "CLUSTER" puts stdout $AdvGeom($n,cluster) # do we have border modification??? if { $cutCL(NMO) == 0 } { # everything is ok --> cut a slab append AdvGeom($n,cluster) "$cutCL(NMO)\n" xcRenderCluster } else { # BORDER MODIFICATION:: # first prepare for border modification --> do first run to get # sequential cluster number # for frist run set cutCL(NMO) to 0 set cutCL(NMO) 0 append AdvGeom($n,cluster) "$cutCL(NMO)\n"; #THIS IS TEMPORARY set firstRun [MakeInput] if { ! [RunC95 $system(c95_integrals) {} $firstRun] } { #tk_dialog .err "ERROR" "ERROR: $err" error 0 OK return } puts stdout "CRYSTAL INPUT:\n $firstRun" puts stdout "CRYSTAL-95/98/03: OUTPUT" set output [ReadFile $system(SCRDIR)/xc_output.$system(PID)] # make a toplevel for DISPLAYING CRYSTAL OUTPUT set display [DispFirstRun $output] # make another toplevel for specifying BORDER MODIFICATION How2BordMod } } proc CutCLInput1 {} { global AdvGeom cutCL # if we come so far --> everything is OK set n [xcAdvGeomState current] set AdvGeom($n,cluster) \ "$cutCL(X) $cutCL(Y) $cutCL(Z) $cutCL(NST) $cutCL(RMAX)\n" append AdvGeom($n,cluster) "$cutCL(NNA) $cutCL(NCN)\n" if { $cutCL(NNA) != 0 } { append AdvGeom($n,cluster) "$cutCL(RNNA)\n" } if { $cutCL(NCN) > 0 } { for {set i 1} {$i <= $cutCL(NCN)} {incr i} { append AdvGeom($n,cluster) "$cutCL(L,$i) $cutCL(MCONN,$i)\n" } } return $n } proc NeighAnal {var} { global cutCL done # NeighAnal is procedure for neighbour nearest analysis for CLUSTER option if { $var == "No" } { # set cutCL(NNA) to zero set cutCL(NNA) 0 return } elseif { $var == "Yes" } { set cutCL(NNA) 1 if { [winfo exists .neigh] } { return } set top [toplevel .neigh] xcPlace . .neigh 720 200 wm title $top "Radius of Sphere" wm iconname $top "Radius" # some decorations set f1 [frame $top.f1 -relief raised -bd 2] set f2 [frame $top.f2 -relief raised -bd 2] pack $f1 $f2 -side top -padx 0 -pady 0 -ipadx 7 -ipady 7 -fill both set m [message $f1.msg -justify center -aspect 400 -text \ "Radius of sphere in which to search for neighbours:"] pack $m -expand 1 -padx 5 -pady 5 set e1 [entry $f1.ent -relief sunken -width 5 \ -textvariable cutCL(RNNA)] pack $e1 -side top -expand 1 focus $e1 set ok [button $f2.ok -text "OK" -command [list NeighAnalOK $top $e1]] set can [button $f2.can -text "Cancel" \ -command [list NeighAnalCan $top]] pack $ok $can -side left -padx 5 -pady 5 -ipadx 3 -ipady 3 -expand 1 tkwait visibility $top catch { grab $top } tkwait variable done catch { grab release $top } destroy $top } } proc NeighAnalOK {t e} { global cutCL err done #check if cutCL(RNNA) is real check_var {{cutCL(RNNA) real}} $e if $err {return} set done 1 } proc NeighAnalCan {t} { global cutCL done anal set done 1 set cutCL(NNA) 0 set anal "No" } proc CoorNum {var} { global cutCL nfoclist # NeighAnal is procedure for neighbour nearest analysis for CLUSTER option if { $var == "No" } { # set cutCL(NNA) to zero set cutCL(NCN) 0 return } elseif { $var == "Yes" } { if [winfo exists .coorn] { return } set top [toplevel .coorn] xcPlace . .coorn 720 250 wm title $top "Number" wm iconname $top "Number" # some decorations set f1 [frame $top.f1 -relief raised -bd 2] set f2 [frame $top.f2 -relief raised -bd 2] pack $f1 $f2 -side top -padx 0 -pady 0 -ipadx 7 -ipady 7 -fill both set m [message $f1.msg -justify center -aspect 400 -text \ "Number of user-defined coordination numbers:"] pack $m -expand 1 -padx 5 -pady 5 if { $cutCL(NCN) == 0 } {set cutCL(NCN) ""} set e1 [entry $f1.ent -relief sunken -width 5 \ -textvariable cutCL(NCN)] focus $e1 pack $e1 -side top -expand 1 append nfoclist " $e1 " set ok [button $f2.ok -text "OK" -command [list NCoorOK $top $e1]] pack $ok -side top -padx 5 -pady 5 -ipadx 3 -ipady 3 -expand 1 tkwait visibility $top } } proc NCoorOK {t e} { global nfoclist err cutCL # check if culCL(NCN) is positive integer check_var {{cutCL(NCN) point}} $nfoclist if $err {return} destroy $t GetCoorNum } proc GetCoorNum {} { global cutCL varlist foclist done if [winfo exists .getcoorn] { return } toplevel .getcoorn wm title .getcoorn "Custom Coordination Numbers" xcPlace . .getcoorn 580 190 catch { grab .getcoorn } # bottom frame where OK button will be set fb [frame .getcoorn.fb] pack $fb -side bottom -expand true -fill both # and one frame where canvas&scrollbar will be!! set ft [frame .getcoorn.ft -relief sunken -bd 2] pack $ft -side top -expand true -fill both set c [canvas $ft.canv -yscrollcommand [list $ft.yscroll set]] set scb [scrollbar $ft.yscroll -orient vertical -command [list $c yview]] pack $scb -side right -fill y pack $c -side left -fill both -expand true # create FRAME to hold every LABEL&ENTRY set f [frame $c.f -bd 0] $c create window 0 0 -anchor nw -window $f set varlist "" set foclist "" for {set i 1} {$i <= $cutCL(NCN)} {incr i 1} { frame $f.fr$i -relief groove -bd 2 pack $f.fr$i -padx 5 -pady 5 label $f.fr${i}.label$i -text "Atom N.: $i" pack $f.fr${i}.label$i -anchor w -padx 7 -pady 7 frame $f.fr${i}.frm$i pack $f.fr${i}.frm$i -side top -anchor w Entries $f.fr${i}.frm$i \ {{Atomic Number:} {Coordination Number:}} \ [list cutCL(L,$i) cutCL(MCONN,$i)] 4 # make a varlist & foclist for PROC CHECK_VAR lappend varlist [list cutCL(L,$i) nat] [list cutCL(MCONN,$i) posint] lappend foclist \ $f.fr${i}.frm$i.frame.entry1 $f.fr${i}.frm$i.frame.entry2 } puts stdout "FOCLIST: $foclist\n\n" puts stdout "VARLIST: $varlist" set child [lindex [pack slaves $f] 0] # set the focus to first entry that upper FOR-LOOP create focus $f.fr1.frm1.frame.entry1 tkwait visibility $child set width [winfo width $f] set height [winfo height $f] if { $cutCL(NCN) < 3 } { $c config -width $width -height $height } else { $c config -width $width -height \ [expr $height / $cutCL(NCN) * 3] \ -scrollregion "0 0 $width $height" } button $fb.butok -text OK -command \ [list CoorNumOK .getcoorn] button $fb.butcan -text Cancel -command \ [list CoorNumCan .getcoorn] pack $fb.butok $fb.butcan -side left \ -expand 1 -padx 10 -pady 10 tkwait variable done catch { grab release .getcoorn } destroy .getcoorn } proc CoorNumOK {t} { global cutCL done err varlist foclist # check if variables were correctly assigned check_var $varlist $foclist if $err {return} set done 1 } proc CoorNumCan {t} { global cutCL done coorn set done 1 set cutCL(NCN) 0 set coorn "No" } proc SetNMO {var} { global cutCL if { $var == "No" } { # set cutCL(NNA) to zero set cutCL(NMO) 0 } else { set cutCL(NMO) 1 } } proc DispFirstRun {output} { # procedure displays first crystal95 run --> to get cluster atoms # sequential numbers if [winfo exist .disp1run] {return} set t [toplevel .disp1run] wm title $t "Crystal95: Output" wm iconname $t "Crystal95: Output" xcPlace . .disp1run -50 70 # in upper frame crystal output will be displayed set text [DispText $t.f1 $output 80 35] set f2 [frame $t.f2 -height 10] pack $f2 -side bottom -before $t.f1 -fill x set close [button $f2.cl -text "Close" -command [list destroy $t]] set view [button $f2.vi -text "View Cluster" -command ViewCluster] set num [button $f2.fi -text "Cluster Information" \ -command [list ClusInfo $text]] pack $close $view $num \ -side left -expand 1 -ipadx 2 -ipady 2 -pady 10 return $t } proc ClusInfo {tw} { #tw .... textwidget set index [$tw search -exact "CLUSTER CALCULATION" 1.0] $tw yview $index } proc ViewCluster {} { global cutCL AdvGeom CutCLInput1 # temporary put zero for NMO set n [xcAdvGeomState current] append AdvGeom($n,cluster) "0\n" xcRenderCluster } proc How2BordMod {} { set t [xcToplevel .how2 "Modification of Border" "Border-Atoms" \ . 573 470] set l1 [label $t.l1 -text "Specify modification of border atoms:"] set b1 [button $t.b1 -text "separately to each atom" \ -command [list BordMod 1]] set b2 [button $t.b2 -text "to a group of atoms" \ -command [list BordMod 2]] pack $l1 -side top -expand 1 -padx 10 -pady 10 pack $b1 $b2 -side top -padx 10 -pady 5 -ipadx 5 -ipady 5 \ -expand 1 -fill x } proc BordModSeq {} { global cutCL varlist foclist set varlist "" set foclist "" set t [xcToplevel .bordmod "Border Atoms" "Border Atoms" . 450 135] # and one frame where canvas&scrollbar will be!! set ft [frame $t.ft -relief sunken -bd 2] pack $ft -side top -expand true -fill both set c [canvas $ft.canv -yscrollcommand [list $ft.yscroll set]] set scb [scrollbar $ft.yscroll -orient vertical -command [list $c yview]] pack $scb -side right -fill y pack $c -side left -fill both -expand true # create FRAME to hold every LABEL&ENTRY set f [frame $c.f -bd 0] $c create window 0 0 -anchor nw -window $f for {set i 1} {$i <= $cutCL(NMO)} {incr i 1} { frame $f.fr$i -relief groove -bd 2 pack $f.fr$i -padx 5 -pady 5 -side top label $f.fr${i}.label$i -text "Atom N.: $i" pack $f.fr${i}.label$i -anchor w -padx 7 -pady 7 frame $f.fr${i}.frm$i pack $f.fr${i}.frm$i -side top -anchor w Entries $f.fr${i}.frm$i \ {"Label of atom:" "Number of stars:"} \ [list cutCL(IPAD,$i) cutCL(NVIC,$i)] 4 # make a varlist & foclist for PROC CHECK_VAR lappend varlist [list cutCL(IPAD,$i) posint] \ [list cutCL(NVIC,$i) posint] lappend foclist \ $f.fr${i}.frm$i.frame.entry1 $f.fr${i}.frm$i.frame.entry2 frame $f.fr$i.fram pack $f.fr${i}.fram -side top -anchor w if ![info exists cutCL(IPAR,$i)] [list set cutCL(IPAR,$i) 0] set chk [checkbutton $f.fr$i.fram.chk -text "Hydrogen Saturation" \ -variable cutCL(IPAR,$i) ] set l21 [label $f.fr$i.fram.l1 -text "Hydrogen bond length:"] set e21 [entry $f.fr$i.fram.e1 -relief sunken -width 7 \ -textvariable cutCL(BOND,$i)] pack $chk $l21 $e21 -side left -padx 5 -pady 5 -expand 1 # update a varlist & foclist for PROC CHECK_VAR lappend varlist [list cutCL(BOND,$i) real] lappend foclist $f.fr$i.fram.e1 } puts stdout "FOCLIST: $foclist\n\n" puts stdout "VARLIST: $varlist" set child [lindex [pack slaves $f] 0] # set the focus to first entry that upper FOR-LOOP create focus $f.fr1.frm1.frame.entry1 tkwait visibility $child set width [winfo width $f] set height [winfo height $f] if { $cutCL(NMO) < 3 } { $c config -width $width -height $height } else { $c config -width $width -height \ [expr $height / $cutCL(NMO) * 3] \ -scrollregion "0 0 $width $height" } return $t } proc BordMod {var} { global cutCL ok varlist foclist destroy .how2 if { $var == 1 } { # SEPARATELY TO EACH ATOM # HOW MANY ATOMS TO MODIFY set t [xcToplevel .brdatm "Modification of Border" \ "Border Atoms" . 576 482] set f1 [frame $t.f1 -relief raised -bd 2] set f2 [frame $t.f2 -relief raised -bd 2] pack $f1 $f2 -side top -padx 0 -pady 0 \ -ipadx 10 -ipady 10 -fill both -expand 1 set l11 [label $f1.l1 -text "Number of border atoms to be modified:"] set cutCL(NMO) "" set e11 [entry $f1.e1 -relief sunken -width 3 -textvariable cutCL(NMO)] focus $e11 set b21 [button $f2.ok -text "OK" -command [list NBordM $e11]] pack $l11 $e11 -side top -expand 1 pack $b21 -side top -ipadx 5 -ipady 5 -expand 1 # wait unitl ok is set, then destroy $t tkwait variable ok destroy $t # specify MODIFICATIONS: for each atom separately set t [BordModSeq]; # BordModSeq returns a name for toplevel } else { set t [xcToplevel .brdatm "Modification of Border" \ "Border Atoms" . 340 380] set cutCL(NMO) -1 set f1 [frame $t.f1 -relief groove -bd 2] pack $f1 -padx 5 -pady 5 -side top Entries $f1 \ {"Label of first atom:" "Label of last atom:" \ "Number of stars:"} \ [list cutCL(IMIN) cutCL(IMAX) cutCL(NVIC,1)] 4 focus $f1.frame.entry1 # make a varlist & foclist for PROC CHECK_VAR set varlist "" lappend varlist [list cutCL(IMIN) posint] \ [list cutCL(IMAX) posint] [list cutCL(NVIC,1) posint] set foclist "$f1.frame.entry1 \ $f1.frame.entry2 $f1.frame.entry3" puts stdout "VARLIST: $varlist" puts stdout "FOCLIST: $foclist" frame $f1.fr pack $f1.fr -side top set chk [checkbutton $f1.fr.chk -text "Hydrogen Saturation" \ -variable cutCL(IPAR,1) ] set l21 [label $f1.fr.l1 -text "Hydrogen bond length:"] set e21 [entry $f1.fr.e1 -relief sunken -width 7 \ -textvariable cutCL(BOND,1)] pack $chk $l21 $e21 -side left -padx 5 -pady 5 -expand 1 # update a varlist & foclist for PROC CHECK_VAR lappend varlist [list cutCL(BOND,1) real] lappend foclist $f1.fr.e1 } set f3 [frame $t.f3] pack $f3 -side top -fill x -expand 1 set okf [frame $f3.okf -relief sunken -bd 2] set ok [button $okf.ok -text "OK" \ -command [list BordModOK $t]] set can [button $f3.can -text "Cancel" -command [list Cancel $t]] pack $okf -side left -expand 1 -padx 5m -pady 2m pack $can -side left -expand 1 -padx 5m -pady 2m -ipadx 1m -ipady 1m pack $ok -padx 1m -pady 1m -ipadx 1m -ipady 1m } proc NBordM {foclist} { global cutCL err ok check_var {{cutCL(NMO) posint}} $foclist if $err {return} set ok 1 } proc BordModOK {t} { global AdvGeom cutCL foclist varlist err # first we must check a variables if { $cutCL(NMO) == -1 } { # border modification of a group of atoms puts stdout "VARLIST: $varlist" puts stdout "FOCLIST: $foclist" check_var $varlist $foclist # check_var return $err; if $err --> mistake -> RETURN if $err { return } destroy $t # first part of CLUSTER INPUT set n [xcAdvGeomState current] CutCLInput1 append AdvGeom($n,cluster) "$cutCL(NMO)\n" append AdvGeom($n,cluster) "$cutCL(IMIN) $cutCL(IMAX) $cutCL(NVIC,1) \ $cutCL(IPAR,1) $cutCL(BOND,1)\n" puts stdout "\n\nCRYSTAL INPUT::" puts stdout $AdvGeom($n,cluster) } elseif { $cutCL(NMO) > 0 } { check_var $varlist $foclist if $err {return} destroy $t CutCLInput1 append AdvGeom($n,cluster) "$cutCL(NMO)\n" for {set i 1} {$i <= $cutCL(NMO)} {incr i} { append AdvGeom($n,cluster) "$cutCL(IPAD,$i) $cutCL(NVIC,$i) \ $cutCL(IPAR,$i) $cutCL(BOND,$i)\n" } } # calculate CLUSTER xcRenderCluster } proc xcRenderCluster {} { global system n_groupsel err # this is for UNDO/REDO GenCommUndoRedo "Cut a Cluster" CalStru # update structure GenGeomDisplay 1 #set input [MakeInput] #puts stdout "CRYSTAL INPUT:\n $input" #if { ! [RunC95 $system(c95_integrals) {} $input] } { # #tk_dialog .err "ERROR" "ERROR: $err" error 0 OK # return #} # ## this is for UNDO/REDO #GenCommUndoRedo "Cut a Cluster" # ## update structure #GenGeomDisplay 1 } xcrysden-1.6.2/Tcl/parseDataGrid.tcl0000644000175000017500000002317013521052222016010 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/parseDataGrid.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc parseDGInfo info { global sInfo DG system # # parse datagrid INFO record # set DG(n_block) [lindex $info 0] for {set i 1} {$i <= $DG(n_block)} {incr i} { set im [expr $i - 1] set block [lindex $info $i] set DG(type,$im) [lindex $block 0] set DG(ident,$im) [lindex $block 1] set DG(n_subblock,$im) [lindex $block 2] set subblock [lindex $block 3] xcDebug " Block Number: $i" xcDebug " type: $DG(type,$im)" xcDebug " ident: $DG(ident,$im)" xcDebug " # of subblocks: $DG(n_subblock,$im)" xcDebug " subblock: $subblock" for {set j 0} {$j < $DG(n_subblock,$im)} {incr j} { set DG(subident,$im,$j) [lindex $subblock $j] } } set t [xcToplevel .dg "DataGrid: data presentation" \ "DataGrid" . 50 0 1] set f1 [frame $t.1] set f2 [frame $t.2] set c [canvas $f1.c -yscrollcommand [list $f1.sy set] \ -xscrollcommand [list $f2.sx set] \ -width 550 -height 300 \ -bg "#ffffff"] set sy [scrollbar $f1.sy -orient vertical \ -command [list $f1.c yview]] set sx [scrollbar $f2.sx -orient horizontal \ -command [list $f1.c xview]] set pad [expr [$sy cget -width] + \ 2 * ([$sy cget -bd] + [$sy cget -highlightthickness])] set fpad [frame $f2.pad -width $pad -height $pad] pack $f1 -side top -fill both -expand 1 pack $f2 -side top -fill x pack $c -side left -fill both -expand true pack $sy -side left -fill y pack $fpad -side right pack $sx -side bottom -fill x button .__b set font [.__b cget -font] set datagrid_font [ModifyFont $font .__b \ -family courier -size 20 -weight bold -default 1] destroy .__b # image dimension: 109x39 image create photo datagrid -format gif \ -file $system(BMPDIR)/datagrid.gif set x0 30; # x position of main vertical line set y0 30; # y center position of datagrid image set x1 60; # x center position of datagrdi image set xvl 70; # x position of subblock vertical line $c create line $x0 $y0 $x1 $y0 \ -width 4 -tags mainLine0 -arrow last \ -tags mainLine0 -fill #000 $c create image $x1 $y0 -image datagrid -anchor center -tags image if { ![info exists DG(radio)] } { set DG(radio) 0 set DG(cb0,0) 1 } set Ys $y0 for {set i 0} {$i < $DG(n_block)} {incr i} { DG_CreateBlock $c $x1 $Ys $i if {$i == 0} { $c coords mainLine0 $x0 $y0 $x0 $DG(ystart) $x1 $DG(ystart) $c coords winBlock0 $x1 $DG(ystart) } else { $c create line $x0 $Ys_old $x0 $DG(ystart) $x1 $DG(ystart) \ -width 4 -tags mainLine$i -arrow last \ -tags mainLine$i -fill #000 } for {set j 0} {$j < $DG(n_subblock,$i)} {incr j} { set ys [expr $DG(ystart) + $j * ($DG(bh) + $DG(yspace))] DG_CreateSubBlock $c $xvl $ys $i $j } set Ys_old $DG(ystart) set DG(ystart) [expr $ys + 2 * $DG(bh) + $DG(yspace) + $DG(YSpace)] set Ys $DG(ystart) } set bbox [$c bbox all] set x2 [expr $DG(bw) + $x0 + $xvl] set y2 [expr [lindex $bbox 3] + $DG(bh)] $c config -scrollregion [list 0 0 $x2 $y2] DG_RadioBind $DG(r0) 0 ## OK & Cancel Button set f3 [frame $t.f3] pack $f3 -side top -fill x DefaultButton $f3.ok -text OK -command [list DataGridOK $t] button $f3.can -text Cancel -command [list CancelProc $t] pack $f3.can $f3.ok -padx 10 -pady 10 -side left -expand 1 # t.k. return $t } proc DG_CreateBlock {c xs ys ib} { global DG set f [frame $c.f$ib -relief raised -bd 1 -class DataGridBlock] $c create window $xs $ys -anchor w -window $f -tags winBlock$ib if ![info exists DG(blockFont)] { label $f.l$ib -text "Block #$ib; dim = $DG(type,$ib)" -anchor w set DG(blockFont) [ModifyFont [$f.l$ib cget -font] $f.l$ib \ -underline 1 -default 1] $f.l$ib config -font $DG(blockFont) } else { label $f.l$ib -text "Block #$ib; dim = $DG(type,$ib)" \ -font $DG(blockFont) -anchor w } set DG(r$ib) [radiobutton $f.r$ib -variable DG(radio) \ -text "Identifier: $DG(ident,$ib)" \ -command DG_RadiobuttonCmd \ -value $ib -anchor w] bind $f.r$ib [list DG_RadioBind %W $ib] pack $f.l$ib $f.r$ib -side top -fill x update if ![info exists DG(bh)] { set DG(bh) [expr [winfo height $f] + \ 2 * ([$f cget -bd] + [$f cget -highlightthickness])] set DG(YSpace) 15; # y-space between block windows set DG(yspace) 5; # y-space between subblock windows set DG(ystart) [expr $ys + 19 + $DG(YSpace) + $DG(bh)/2]; #y center position for block0 } set bw [expr [winfo width $f] + \ 2 * ([$f cget -bd] + [$f cget -highlightthickness])] if ![info exists DG(bw)] { set DG(bw) $bw } elseif { $bw > $DG(bw) } { set DG(bw) $bw } } proc DG_CreateSubBlock {c xs ys ib isb} { global DG xcColors set xsb [expr $xs + 20] set sf [frame $c.sf${ib}_$isb -relief raised -bd 1 -class DataGridSubBlock] $c create line $xs $ys \ $xs [expr $ys + $DG(bh) + $DG(yspace)] \ $xsb [expr $ys + $DG(bh) + $DG(yspace)] \ -width 2 -tags horSubLine -arrow last -fill #000 $c create window $xsb [expr $ys + $DG(bh) + $DG(yspace)] -anchor w \ -window $sf -tags winSubBlock_${ib}_${isb} label $sf.l -text "Sub-block #$isb" -font $DG(blockFont) -anchor w if ![info exists DG(envar$ib,$isb)] { set DG(envar$ib,$isb) 1.0 } frame $sf.1 set DG(c$ib,$isb) [checkbutton $sf.r -variable DG(cb$ib,$isb) \ -text "Identifier: $DG(subident,$ib,$isb)" -anchor w \ -command [list DG_CheckCom $ib $isb]] set DG(l$ib,$isb) [label $sf.l2 -text " Multiply factor: " \ -fg $xcColors(disabled_fg)] set DG(e$ib,$isb) [entry $sf.e -relief sunken -bd 0 \ -textvariable DG(envar$ib,$isb) -width 4] pack $sf.l $sf.1 -side top -fill x pack $sf.r $sf.l2 -side left -fill x -in $sf.1 pack $sf.e -side left -fill x -in $sf.1 -padx 1m update set bw [expr [winfo width $sf] + \ 2 * ([$sf cget -bd] + [$sf cget -highlightthickness])] if { $bw > $DG(bw) } { set DG(bw) $bw } } proc DG_RadioBind {w ib} { global DG xcColors for {set i 0} {$i < $DG(n_block)} {incr i} { for {set j 0} {$j < $DG(n_subblock,$i)} {incr j} { if { $i == $ib } { $DG(c$i,$j) config -state normal DG_CheckCom $i $j } else { $DG(c$i,$j) config -state disabled $DG(l$i,$j) config -fg $xcColors(disabled_fg) $DG(e$i,$j) config -bd 0 } } } } proc DG_CheckCom {ib isb} { global DG xcColors for {set j 0} {$j < $DG(n_subblock,$ib)} {incr j} { if { $DG(cb$ib,$isb) } { $DG(l$ib,$isb) config -fg $xcColors(enabled_fg) $DG(e$ib,$isb) config -bd 1 } else { $DG(l$ib,$isb) config -fg $xcColors(disabled_fg) $DG(e$ib,$isb) config -bd 0 } } } proc DataGridOK {{t {}}} { global DG DataGrid set ib $DG(radio) set datarec $ib for {set i 0} {$i < $DG(n_subblock,$ib)} {incr i} { if $DG(cb$ib,$i) { if { ! [number DG(envar$ib,$i) real] } { return } append datarec " $i $DG(envar$ib,$i)" } } if { $t != "" } { CancelProc $t } eval xc_isodatagrid $datarec if { $DG(type,$ib) == "2D" } { set DataGrid(launch_command) IsoControl2D set DataGrid(dim) "2D" DataGrid2Isosurf IsoControl2D return "2D" } elseif { $DG(type,$ib) == "3D" } { set DataGrid(launch_command) IsoControl set DataGrid(dim) "3D" DataGrid2Isosurf IsoControl return "3D" } } proc DataGrid2Isosurf {} { global isosurf prop isosurf_struct isosign isodata set isosurf(minvalue) [xc_iso minvalue] set isosurf(maxvalue) [xc_iso maxvalue] set isosurf(rangevalue) [expr $isosurf(maxvalue) - $isosurf(minvalue)] set prop(type_of_run) RHF # set isosurf_struct(isosign) "" # set isosurf_struct(isodata) "" # set isosurf_struct(spin) "" set isosurf_struct(3Dinterpl_degree) 1 trace variable isosurf(3Dinterpl_degree) w xcTrace set isosign "" set isodata "" SetIsoSurfArray ConvertTwoSideVar; # to get correct value of isosurf(twoside_lighting) Set_UpdateIsosurf_Struct } proc DataGrid {} { global sInfo DG DataGrid if { ! [info exists DataGrid(first_time)] } { set DataGrid(first_time) exists } else { # DataGrid(first_time) already exists, simple launch the last datagrid eval $DataGrid(launch_command) } # .dg is the toplevel for DataGrid if { [winfo exists .dg] || [winfo exists .iso] || \ [winfo exists .iso2D] } { return } set info [xc_isodatagrid info] update if { [array exists DG] } { unset DG } # t.k. return [parseDGInfo $info] } proc DG_RadiobuttonCmd {} { global DG set DG(cb${DG(radio)},0) 1 } xcrysden-1.6.2/Tcl/dumpWindow.tcl0000644000175000017500000000644613521047056015453 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/__file__ # ------ # # Copyright (c) 2008 by Anton Kokalj # ############################################################################# proc dumpWindow {window {outfile ""}} { raise $window dumpWindowByID [winfo id $window] $outfile } proc dumpWindowByID {id {outfile ""}} { global xcMisc system printSetup SetWatchCursor update update idletask if { $outfile == "" } { set outfile [dumpWindow_queryFilename] } if { [info exists xcMisc(ImageMagick.import)] } { if { [info exists printSetup(useOptions) ] } { set tmpFile [file join $system(SCRDIR) [file tail $outfile]] } else { set tmpFile $outfile } xcCatchExecReturn $xcMisc(ImageMagick.import) -window $id $tmpFile if { [info exists printSetup(useOptions) ] } { scripting::_printToFile_imageConvert $tmpFile $outfile } } elseif { [info exists xcMisc(xwd)] } { xcCatchExecReturn $xcMisc(xwd) -id $id -out $system(SCRDIR)/tmp.xwd if { [info exists xcMisc(ImageMagick.convert)] } { # convert by ImageMagick scripting::_printToFile_imageConvert $system(SCRDIR)/tmp.xwd $outfile } else { # try to convert by netbmp set head [file rootname $outfile] file copy -force $system(SCRDIR)/test.xwd $head.xwd set ext [string trim [file extension $outfile] .] switch $ext { jpg { set ext jpeg } tif { set ext tiff } eps { set ext ps } } set xwdtopnm [auto_execok xwdtopnm] set pnmtoext [auto_execok pnmto$ext] if { $xwdtopnm != "" && $pnmtoext != "" } { catch {exec $xwdtopnm $head.xwd > $head.pnm} catch {exec $pnmtoext $head.pnm > $head.$ext} } } } else { ErrorDialog "cannot make windowDump: neither \"import\" nor \"xwd\" programs are available" } ResetCursor } proc dumpWindow_queryFilename {} { global xcMisc system set head [file rootname [file tail $xcMisc(titlefile)]] set deffile $head.png set defext .png set filetypes { {{PNG} {.png} } {{JPEG} {.jpg .jpeg} } {{GIF} {.gif} } {{TIFF} {.tif .tiff}} {{EPS} {.eps .ps} } {{All Files} * } } set sfile [tk_getSaveFile -initialdir $system(PWD) \ -title "Print to File" \ -defaultextension $defext \ -initialfile $deffile \ -filetypes $filetypes] if { $sfile == {} } { return -code return } return $sfile } xcrysden-1.6.2/Tcl/propC95.tcl0000644000175000017500000006271412352551345014561 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/propC95.tcl # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# proc PropC95Cmd {cmd} { global prop system grafdata periodic err xcDebug "\nIn PropC95Cmd; prop(newk) == $prop(newk); cmd == $cmd\n" # there are some properties, that are caracteristic for periodic systems set perlist [list BWID DOSS BAND] foreach com $perlist { if { $cmd == $com && $periodic(dim) == 0} { #return silently return } } # delete old unit-25 if { [file exists $prop(dir)/$prop(file)25] } { file delete $prop(dir)/$prop(file)25 } # INFO set info 0 if { $cmd == "INFO" } { set input "BASE\n0\n" if { $periodic(dim) > 0 } { set button [tk_dialog [WidgetName] Question \ "Do You want \"band widths\" to be included in INFO record" question 0 Yes No] if { $button == 0 } { set info 1 if ![RunC95 $system(c95_properties) err "END\n"] { return } append input [NEWK_Init] GetC95Info BWID $system(SCRDIR)/xc_output.$system(PID) append input "BWID\n1 $prop(n_band)\n" } } append input "END\n" if ![RunC95 $system(c95_properties) err $input] { return } DispC95Output $system(SCRDIR) {} "INFO: $prop(unit9)" 1 return } # # do user want to run PropC95Cmd that require NEWK ???? # NOTE: band do not require NEWK, but if we want correct Fermi Energy # to be displayed on the spaghetti-graphs, this is needed !!! # set newk_cmd_list [list BWID DOSS BAND] foreach newkcmd $newk_cmd_list { if { $cmd == $newkcmd } { set prop(newk) 1 set prop(newk_script) [NEWK_Init] if { $prop(newk_script) == "" } { set prop(newk) 0 return } break } } if { $cmd == "BWID" } { GetC95Info BWID $system(SCRDIR)/xc_output.$system(PID) # SINTAX selband will be {{alfa band} {betaband}} # SelBandIntv $prop(n_band) set input "$prop(newk_script)BWID\n1 $prop(n_band)\nEND\n" # run properties program if { ![RunC95 $system(c95_properties) {message "CRYSTAL program is calculating band widths.\nIt can take some time, so PLEASE WAIT !!!"} $input \ {} "BAND LIMITS" $system(SCRDIR)] } { # error occure #tk_dialog .err "ERROR" "ERROR: $err" error 0 OK return } # update crystal95's output DispC95Output $system(SCRDIR) {} {} 1 # now load a Graph set id [NextGrapherID] set grafdata($id,Xtitle) "Band Widths: $prop(unit9)" set grafdata($id,Xicon) "Band Widths" BWIDGraph $system(SCRDIR)/xc_output.$system(PID) Grapher BARGraph set cmd "" return } if { $cmd == "DOSS" } { global doneDOSS if ![info exists prop(NPRO)] { set prop(NPRO) 0 } GetC95Info DOSS $system(SCRDIR)/xc_output.$system(PID) DOSS_Init if { $doneDOSS == 0 } { return } xcDebug "after DOSS_Init" # T.K.: now I must set prop(N,$i) for each $i for {set i 1} {$i <= $prop(NPRO)} {incr i} { set prop(N,$i) [llength $prop(NDM,$i)] } set input "$prop(newk_script)" append input "DOSS\n" append input "$prop(NPRO) $prop(NPT) $prop(firstband) \ $prop(lastband) 1 $prop(NPOL) $prop(NPR)\n" if { $prop(firstband) < 0 && $prop(lastband) < 0 } { append input "$prop(BMI) $prop(BMA)\n" } for {set i 1} {$i <= $prop(NPRO)} {incr i} { if { $prop(proj_NPRO,$i) != "set of N AOs" && $prop(N,$i) > 0} { set prop(N,$i) -$prop(N,$i) } append input "$prop(N,$i) $prop(NDM,$i)\n" } append input "END\n" # run properties program if ![RunC95 $system(c95_properties) err $input {} {} $system(SCRDIR)] { # error occure #tk_dialog .err "ERROR" "ERROR: $err" error 0 OK return } xcDebug "BEFORE DOSSGraph" # update crystal95's output DispC95Output $system(SCRDIR) # now load a Graph set id [NextGrapherID] set grafdata($id,Xtitle) "Density of States: $prop(unit9)" set grafdata($id,Xicon) "Density of States" DOSSGraph $prop(NPRO) Grapher XYGraph return } if { $cmd == "BAND" } { global BzOK if { ! [info exists prop(NPRO)] } { set prop(NPRO) 0 } GetC95Info DOSS $system(SCRDIR)/xc_output.$system(PID) if { [Bz_MakeToplevel] == 0 } { return } #if { $BzOK(done) == 0 } { # # cancel button was pressed; RETURN # return #} append prop(c95_BAND_script) "END\n" xcDebug "BAND_Init: 1" if { ![RunC95 $system(c95_properties) err $prop(c95_BAND_script) \ {} {} $system(SCRDIR)] } { # error occure #tk_dialog .err "ERROR" "ERROR: $err" error 0 OK return } xcDebug "BEFORE BANDGraph" # update crystal95's output DispC95Output $system(SCRDIR) # now load a Graph set id [NextGrapherID] set grafdata($id,Xtitle) "Band Structure: $prop(unit9)" set grafdata($id,Xicon) "Band Structure" BANDGraph $prop(NLINE) Grapher XYGraph return } } ############################################################################## # NEWK # proc return NEWK-block for runing "properties" program proc NEWK_Init {} { global periodic done newk prop system if { ! [info exists prop(IS)] } { set prop(IS) 0 } if { ! [info exists prop(ISHF)] } { set prop(ISHF) 0 } if { ! [info exists prop(ISP)] } { set prop(ISP) 0 } if { $periodic(dim) > 0 } { set t [xcToplevel .bwid "NEWK Options" "NEWK" . 100 50 1] catch { grab $t } set f1 [frame $t.f1 -relief raised -bd 2] pack $f1 -side top -fill both -ipady 10 frame $f1.f1 -relief flat frame $f1.f2 -relief flat if ![info exists newk(option)] { set newk(option) "Same as in SCF" } if ![info exists newk(IFE)] { set newk(IFE) "Yes" } pack $f1.f1 $f1.f2 -side top -padx 10 -fill both -expand 1 if { $system(c95_version) != "06" && $system(c95_version) != "09" && $system(c95_version) != "14" } { # # CRYSTAL prior to version-06 # RadioButVarCmd $f1.f1 "Which (IS,ISHF,ISP) values to take:" \ newk(option) NEWK_RadioButCmd top left 1 1 \ "Same as in SCF" "New (IS,ISHF,ISP) values" } else { # # CRYSTAL06 or later # RadioButVarCmd $f1.f1 "Which (IS,ISP) values to take:" \ newk(option) NEWK_RadioButCmd top left 1 1 \ "Same as in SCF" "New (IS,ISP) values" } RadioBut $f1.f2 "Calculate Fermi Energy:" \ newk(IFE) left left 1 1 \ "Yes" "No" message $f1.msg -justify center -aspect 400 -text \ "\nWARNING: In order to obtain correct Fermi energy and \ eigenvalues spectra when a shift of eigenvalues was \ requested in SCF (LEVSHIFT, SPINLOCK)\n it is required to\ re-calculate Fermi energy" pack $f1.msg -side bottom -padx 10 -pady 10 set f2 [frame $t.f2 -relief raised -bd 2] set ok [button $f2.ok -text "OK" -command [list NEWK_OK $t]] set can [button $f2.can -text "Cancel" -command [list NEWK_Can $t]] pack $f2 -side bottom -fill x pack $ok $can -side left -expand 1 -padx 10 -pady 10 } tkwait variable done # if cancel button was pressed, return 0 if $newk(cancel) { return } if { $newk(IFE) == "Yes" } { set prop(IFE) 1 } else { set prop(IFE) 0 } set prop(NPR) 0 # # NEWK # is (ishf) isp # if (is==0 && dim>0) is1 is2 is3 # ife npr # set input "NEWK\n" if { $system(c95_version) != "06" && $system(c95_version) != "09" && $system(c95_version) != "14" } { # # CRYSTAL prior to version-06 # append input "$prop(IS) $prop(ISHF) $prop(ISP)\n" } else { # # CRYSTAL06 or later # append input "$prop(IS) $prop(ISP)\n" } if { $periodic(dim) > 0 } { # add IS1 IS2 IS3 support #append input "$prop(IS1) $prop(IS2) $prop(IS3)\n" } append input "$prop(IFE) $prop(NPR)\n" return $input } proc NEWK_RadioButCmd {what} { global prop if { $what == "Same as in SCF" } { set prop(IS) 0 set prop(ISHF) 0 set prop(ISP) 0 } else { NEWK_IS_ISHF_ISP } } proc NEWK_IS_ISHF_ISP {} { global prop ok system periodic set oldgrab [grab current] set t [xcToplevel .newkis "Enter values" "NEWK" . 120 70 1] set f1 [frame $t.f1 -relief raised -bd 2] set f11 [frame $t.f11 -relief raised -bd 2] set f2 [frame $t.f2 -relief raised -bd 2] if { $system(c95_version) != "06" && $system(c95_version) != "09" && $system(c95_version) != "14" } { # # CRYSTAL prior to version-06 # Entries $f1 {IS: ISHF: ISP:} {prop(IS) prop(ISHF) prop(ISP)} 3 set varlist [list {prop(IS) posint} {prop(ISHF) posint} {prop(ISP) posint}] set foclist [list $f1.frame.entry1 $f1.frame.entry2 $f1.frame.entry3] } else { # # CRYSTAL06 or later # Entries $f1 {IS: ISP:} {prop(IS) prop(ISP)} 2 set varlist [list {prop(IS) posint} {prop(ISP) posint}] set foclist [list $f1.frame.entry1 $f1.frame.entry2] } # if { $periodic(dim) > 0 } { # # add IS1 IS2 IS3 support # Entries $f11 {IS1 IS2 IS3} {prop(IS1) prop(IS2) prop(IS3)} 3 # append varlist " {prop(IS1) posint} {prop(IS2) posint} {prop(IS3) posint}" # append foclist " $f11.frame.entry1 $f11.frame.entry2 $f11.frame.entry3" # } focus $f1.frame.entry1 set ok [button $f2.ok -text OK \ -command [list check_var $varlist $foclist]] set can [button $f2.can -text Cancel -command NEWK_IS_Can] pack $f1 $f11 $f2 -side top -fill both pack $ok $can -side left -expand 1 -padx 10 -pady 10 update catch { grab $t } tkwait variable ok if { [winfo exists $t] } { catch { grab release $t } destroy $t } if { $oldgrab != "" } { catch { grab $oldgrab } } } proc NEWK_IS_Can {} { global prop ok newk set prop(IS) 0 set prop(ISHF) 0 set prop(ISP) 0 set newk(option) "Same as in SCF" set ok 1 } proc NEWK_Can {t} { global done newk set done 1 set newk(cancel) 1 if { [winfo exists $t] } { catch { grab release $t } destroy $t } } proc NEWK_OK {t} { global done newk puts stdout "NEWK_OK" set done 1 set newk(cancel) 0 if { [winfo exists $t] } { catch { grab release $t } destroy $t } } proc SelBandIntv w { global prop done set l [label $w.l \ -text "Number of Bands: $prop(n_band)" \ -relief flat -anchor w] set font [$l cget -font] set font [ModifyFont $font $l -underline 1 -weight bold] $l config -font $font set l1 [label $w.l1 -text \ "Please choose the range of bands to consider:" \ -relief flat -anchor w] pack $l $l1 -side top -padx 5 -fill x -expand 1 set foclist [OneEntries $w {"First band to consider:" \ "Last band to consider:"} \ {prop(firstband) prop(lastband)} 37 8 5 -fill x -expand 1] return $foclist } proc SelEnerIntv {w} { global prop ok # in future I will have to make some mechanism to check in energy # interval is correctly entered xcDebug "inSelEnerIntv" set l1 [label $w.l1 -text \ "Please enter energy interval for DOSS calculation:\n(Boundaries of energy interval must be in a band gap !!!)" \ -relief flat -justify left -anchor w] pack $l1 -side top -pady 5 -fill x -expand 1 OneEntries $w {"Minimum Energy:" "Maximum Energy:"} \ {prop(BMI) prop(BMA)} 37 8 } #proc checkIntv {varlist foclist lastvar last focus} { # global ok done # upvar #0 $lastvar var # # puts stdout "lastvar = $lastvar" # check_var $varlist $foclist # # if [info exist ok] { # if $ok { # if { $last >= $var } { # set done 1 # } else { # tk_dialog .num ERROR "ERROR !\nYou have specified to large \ # number for \"$lastvar\" variable. It should be \ # lower or equal to $last" error 0 OK # set focus $focus # } # } # } #} ############################################################################## # DENSITY OF STATES proc DOSS_Init {} { global prop doneDOSS set doneDOSS 0 set t [xcToplevel [WidgetName] "Density od States" "DOSS" . 100 50 1] catch { grab $t } set f [frame $t.f -relief raised -bd 2] set f2 [frame $t.f2 -relief raised -bd 2] set f3 [frame $t.f3 -relief raised -bd 2] set f4 [frame $t.f4 -relief raised -bd 2] set f5 [frame $t.f5 -relief raised -bd 2] pack $f $f2 $f3 $f4 $f5 -expand 1 -fill both -side top set ff1 [frame $f.1 -relief groove -borderwidth 2] pack $ff1 -side top -padx 2 -pady 2 -fill x -expand 1 set sc [scale $ff1.scale -from 0 -to 10 -length 100 -variable prop(NPRO) \ -orient horizontal -label "Number of DOS projections:" \ -tickinterval 2 \ -digits 2 -resolution 1 -showvalue true -width 10] pack $sc -side top -fill x -padx 5 if ![info exists prop(doss_criteria)] { set prop(doss_criteria) "band-interval criteria" } set ff2 [frame $f.2 -relief flat] RadioBut $ff2 "Select criteria for spanning DOS:" \ prop(doss_criteria) top left 1 1 \ "band-interval criteria" "energy-interval criteria" trace variable prop(doss_criteria) w xcTrace ########################################################################## OneEntries $f2 {"Number of uniformly spaced energy points:" \ "Number of Legendre polynomials:"} \ {prop(NPT) prop(NPOL)} 37 8 focus $f2.frame1.entry1 set varlist [list {prop(NPT) posint} {prop(NPOL) posint}] set foclist [list $f2.frame1.entry1 $f2.frame2.frame1] pack $ff2 -side top -expand 1 -fill x ########################################################################### # BAND INTERVAL SelBandIntv $f3 set prop(bandIntv_labels) \ [list $f3.l $f3.l1 $f3.frame1.lab1 $f3.frame2.lab2] set prop(bandIntv_entries) [list $f3.frame1.entry1 $f3.frame2.entry2] append varlist " {prop(firstband) posint} {prop(lastband) posint}" append foclist " $f3.frame1.entry1 $f3.frame2.entry2" ########################################################################### # ENERGY INTERVAL SelEnerIntv $f4 set prop(enerIntv_labels) [list $f4.l1 $f4.frame1.lab1 $f4.frame2.lab2] set prop(enerIntv_entries) [list $f4.frame1.entry1 $f4.frame2.entry2] append varlist " {prop(BMI) real} {prop(BMA) real}" append foclist " $f4.frame1.entry1 $f4.frame2.entry2" proc DOSS_Init_BandIntv {} { global prop set dis_c [GetWidgetConfig button -disabledforeground] set ena_c [GetWidgetConfig button -foreground] # disable "ENERGY-INTERVAL" foreach lab $prop(enerIntv_labels) { $lab config -fg $dis_c } foreach entry $prop(enerIntv_entries) { $entry config -relief flat -state disabled } # enable "BAND-INTERVAL" foreach lab $prop(bandIntv_labels) { $lab config -fg $ena_c } foreach entry $prop(bandIntv_entries) { $entry config -relief sunken -state normal } } proc DOSS_Init_EnerIntv {} { global prop set dis_c [GetWidgetConfig button -disabledforeground] set ena_c [GetWidgetConfig button -foreground] # enable "ENERGY-INTERVAL" foreach lab $prop(enerIntv_labels) { $lab config -fg $ena_c } foreach entry $prop(enerIntv_entries) { $entry config -relief sunken -state normal } foreach lab $prop(bandIntv_labels) { $lab config -fg $dis_c } foreach entry $prop(bandIntv_entries) { $entry config -relief flat -state disabled } } # # query the prop(doss_criteria) state # trace variable prop(doss_criteria) w xcTrace xcTrace prop doss_criteria w set ok [button $f5.ok -text "OK" \ -command [list DOSS_Init2 $t $varlist $foclist]] set can [button $f5.can -text "Cancel" -command [list DOSS_InitCan $t]] pack $can $ok -side left -expand 1 -padx 10 -pady 10 tkwait variable doneDOSS # delete prop(doss_criteria)'s trace xcTraceDelete prop(doss_criteria) xcDebug "end of DOSS_Init" return 1 } proc DOSS_InitCan tplw { global doneDOSS xcTraceDelete prop(doss_criteria) CancelProc $tplw doneDOSS } proc DOSS_Init2 {t varlist foclist} { global prop doneDOSS if { $prop(doss_criteria) == "band-interval criteria" } { set varl [lrange $varlist 0 3] } else { set varl [lrange $varlist 0 1] append varl " [lrange $varlist 4 5]" set prop(firstband) -1 set prop(lastband) -1 } if ![check_var $varl $foclist] { return } # check if band interval is specified correctly: if { $prop(doss_criteria) == "band-interval criteria" } { if { $prop(firstband) < 1 } { tk_dialog [WidgetName] ERROR \ "ERROR: Lowest boundary of band-interval \"$prop(firstband)\" is out of range, should be greater than 0. Try Again !!!" \ error 0 OK focus [lindex $foclist 2] return } if { $prop(lastband) > $prop(n_band) } { tk_dialog [WidgetName] ERROR \ "ERROR: Upper boundary of band-interval \"$prop(firstband)\" is out of range, should be lower or equal than $prop(n_band). Try Again !!!" error 0 OK focus [lindex $foclist 3] return } if { $prop(firstband) > $prop(lastband) } { tk_dialog [WidgetName] ERROR \ "ERROR: Lowest boundary of band-interval \"$prop(firstband)\" greater than upper boundary \"$prop(lastband)\". Try Again !!!" \ error 0 OK focus [lindex $foclist 2] return } } xcDebug "DOSS_Init2:: $prop(NPRO) $prop(doss_criteria)" if { [winfo exists $t] } { catch { grab release $t } destroy $t } if { $prop(NPRO) > 0 } { global donePDOSS PDOSS_Init set doneDOSS $donePDOSS } else { set doneDOSS 1 } } proc PDOSS_Init {} { global prop donePDOSS set t [xcToplevel .npro "Projected DOSS" "PDOSS" . 100 50 1] catch { grab $t } set fb [frame $t.fb] pack $fb -side bottom -expand true -fill both # and one frame where canvas&scrollbar will be!! set ft [frame $t.ft -relief sunken -bd 2] pack $ft -side top -expand true -fill both set c [canvas $ft.canv -yscrollcommand [list $ft.yscroll set]] set scb [scrollbar $ft.yscroll -orient vertical -command [list $c yview]] pack $scb -side right -fill y pack $c -side left -fill both -expand true # create FRAME to hold every LABEL&ENTRY set f [frame $c.f -bd 0] $c create window 0 0 -anchor nw -window $f set varlist "" set foclist "" for {set i 1} {$i <= $prop(NPRO)} {incr i 1} { set gro [frame $f.fr$i -relief groove -bd 2] pack $f.fr$i -padx 5 -pady 5 if ![info exists prop(proj_NPRO,$i)] { set prop(proj_NPRO,$i) "set of N AOs" } RadioBut $gro "Density of states projected onto:" \ prop(proj_NPRO,$i) top left \ 0 1 "set of N AOs" "set of all AOs of the N atoms" set e [Entries $gro \ {"Specify sequence numbers of AOs/Atoms for projection:"} \ prop(NDM,$i) 40 1 top -fill x] button $gro.b -text "Select sequence" \ -command [list SelectSequence $i prop(NDM,$i)] pack $gro.b -side left -padx 10 -pady 10 lappend varlist [list prop(NDM,$i) posint] append foclist " $e" } focus $f.fr1.frame.entry1 puts stdout "FOCLIST: $foclist\n\n" puts stdout "VARLIST: $varlist" set child [lindex [pack slaves $f] 0] # set the focus to first entry that upper FOR-LOOP create tkwait visibility $child set width [winfo width $f] set height [winfo height $f] if { $prop(NPRO) < 3 } { $c config -width $width -height $height } else { $c config -width $width -height \ [expr $height / $prop(NPRO) * 3] \ -scrollregion "0 0 $width $height" } button $fb.butok -text OK -command \ [list PDOSS_InitOK $t $varlist $foclist] button $fb.butcan -text Cancel -command \ [list CancelProc $t donePDOSS] pack $fb.butok $fb.butcan -side left \ -expand 1 -padx 10 -pady 10 tkwait variable donePDOSS catch { grab release $t } destroy $t } proc PDOSS_InitOK {t varlist foclist} { global donePDOSS # varlist has the following shape {varname posint} {varname posint} set n 0 foreach var $varlist { xcDebug "PDOSS_InitOK:: var=$var" set varn [lindex $var 0] upvar #0 $varn val set type [lindex $var 1] xcDebug "PDOSS_InitOK:: varn=$varn ; val=$val ; type=$type" if { $val == "" } { tk_dialog .number2 ERROR "ERROR !\nYou forget to specify \ the \"$varn\" variable. Please do so !" error 0 OK focus [lindex $foclist $n] return } foreach value $val { if { [catch {expr abs($value)}] } { # this CATCH specify if $var is a number; # if we get 1 --> not number, else number # string is not a number dialog .number1 ERROR "ERROR !\nYou have specified a character instead of number for \"$varn\" variable.\ TRY AGAIN \!" error 0 OK focus [lindex $foclist $n] return } if { $value != int($value) || [string match *.* $value] } { tk_dialog .number2 ERROR "ERROR !\nYou have specified \ a non-integer number instead of \ positive integer number \ for \"$varn\" variable. TRY AGAIN \!" error 0 OK focus [lindex $foclist $n] return } if { $value < 0 } { tk_dialog .number2 ERROR "ERROR !\nYou have specified \ a negative integer number instead of positive \ integer number \ for \"$varn\" variable. TRY AGAIN \!" error 0 OK focus [lindex $foclist $n] return } } incr n } set donePDOSS 1 } proc SelectSequence {i var} { global prop set what $prop(proj_NPRO,$i) xcDebug "SelectSequence $what $var" if { $what == "set of N AOs" } { set $var [SelectItems "Select the AOs" $prop(n_band)] } elseif { $what == "set of all AOs of the N atoms" } { set $var [SelectItems "Select Atoms" $prop(n_atom)] } } proc SelectItems {title num} { global prop done value set oldgrab [grab current] # if .sband already exists, return silenlty if [winfo exists .sband] { return } set t [xcToplevel .sband $title $title . 100 50 1] catch { grab $t } # in the future I will have to know whether I'm dealing with # close or open shell set bandlist "" for {set i 1} {$i <= $num} {incr i} { append bandlist " $i" } if { $num > 15 } { set h 15 } else { set h $num } set title "$title\n(to select multiple items:\nCTRL-key + mouse-click)" label $t.l -text $title -relief flat pack $t.l -side top set scr [ScrolledListbox2 $t.f -width 10 -height $h -setgrid true \ -selectmode extended] eval {$scr insert 0} $bandlist button $t.ok -text OK -command [list SelectItemsOK $scr] pack $t.ok -side left -padx 10 -pady 10 tkwait variable done destroy $t if { $oldgrab != "" } { catch { grab $oldgrab } } return $value } proc SelectItemsOK {scr} { global done value set done 1 set value "" set vals [$scr curselection] foreach va $vals { set v [expr $va + 1] append value "$v " } } proc DispC95Output {output_dir {file {}} {title {}} {newWin 0}} { global system prop dispC95out unmapWin if ![info exists dispC95out(offset)] { set dispC95out(offset) 0 } else { incr dispC95out(offset) 15 if { $dispC95out(offset) > 200 } { set dispC95out(offset) 0 } } set x [expr -50 + $dispC95out(offset)] set y [expr 70 + $dispC95out(offset)] # newWin ...... if newWin == 1 --> always make a new Toplevel if { $file == {} } { set file xc_output.$system(PID) } set fileID [open $output_dir/$file r] set output [read $fileID] xcDebug "CRYSTAL OUTPUT output::\n\n$output" # if .dispC95 already exists, we will just update the display if { $title == {} } { set title "Crystal95: Output" } set update 1 if $newWin { set dispC95out(tplw) [xcToplevel [WidgetName] $title $title . $x $y 1] set update 0 tkwait visibility $dispC95out(tplw) set t $dispC95out(tplw) xcRegisterUnmapWindow $t $unmapWin(frame,main) \ C95output_$t -image unmap-C95output bind $t [list xcUnmapWindow unmap %W $t \ $unmapWin(frame,main) C95output_$t] bind $t [list xcUnmapWindow map %W $t \ $unmapWin(frame,main) C95output_$t] } elseif ![winfo exists .dispC95] { set dispC95out(tplw) [xcToplevel .dispC95 $title $title . $x $y 1] set update 0 tkwait visibility $dispC95out(tplw) set t $dispC95out(tplw) xcRegisterUnmapWindow $t $unmapWin(frame,main) \ C95output_$t -image unmap-C95output bind $t [list xcUnmapWindow unmap %W $t \ $unmapWin(frame,main) C95output_$t] bind $t [list xcUnmapWindow map %W $t \ $unmapWin(frame,main) C95output_$t] } else { # wm title $t $title ; } if !$update { set f2 [frame $dispC95out(tplw).f2 -height 10] pack $f2 -side bottom -fill x set close [button $f2.cl -text "Close" \ -command [list destroy $dispC95out(tplw)]] set hid [button $f2.hid -text "Hide" \ -command [list DispC95Output_Hide $t]] pack $hid $close -side left -expand 1 -ipadx 2 -ipady 2 -pady 10 tkwait visibility $hid } set text [DispText $dispC95out(tplw).f1 $output 80 35 1] $text configure -state disabled close $fileID return $dispC95out(tplw) } proc DispC95Output_Hide t { global unmapWin wm withdraw $t xcUnmapWindow unmap $t $t $unmapWin(frame,main) C95output_$t } #set system(PWD) [pwd] #set system(PID) [pid] #set periodic(dim) 3 #set prop(n_band) 20 #set prop(n_atom) 4 #lappend auto_path /home/tone/prog/XCrys/Mesa #DOSS_Init xcrysden-1.6.2/Tcl/kPath.tcl0000644000175000017500000001735013522305634014361 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/kPath.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc kPath {{saveonly 0}} { global kpath prop BzOK system if { $saveonly == 0 } { set BzOK(done) 0 if { ! [Bz_MakeToplevel generic] } { return } } # so OK button was pressed # save prop(c95_BAND_script) set filetypes { {{XCRYSDEN k-Path File } {.kpf} } {{PWscf K_POINTS File } {.pwscf} } {{CRYSTAL Property Input File} {.d3 } } {{All Files } {* } } } set sfile [tk_getSaveFile -initialdir $system(PWD) \ -title "Save k-Path" \ -defaultextension .kpf \ -filetypes $filetypes] # maybe Cancel button was pressed if { $sfile == {} } { set kpath(active) 0 return } # # write the klist file in appropriate format # set ext [file extension $sfile] if { $ext == ".kpf" } { # # XCRYSDEN's kPath file # set content [kPath_XCrySDen] WriteFile $sfile $content w } elseif { [string match -nocase "*pwscf*" $ext] } { # # PWscf K_POINTS card # kPath_PWscf $sfile } elseif { $ext == ".d3" } { # # write CRYSTAL d3 file # set content $prop(c95_BAND_script) WriteFile $sfile $content w } else { # # supported format # WarningDialog "unknown k-list file type \"$ext\". Choose among supported file-types" kPath 1 return } set kpath(active) 0 } # # Save selected k-path file in kind of xcrysden k-path info file # proc kPath_XCrySDen {} { global kpath BzOK set content { #------------------------------------------------------------------------ # This is an XCRYSDEN k-Path File. Here you will find the # data about the selected special k-point coordinates !!! #------------------------------------------------------------------------ #------------------------------------------------------------------------ # WARNING: # special k-point coordinates in this file are in "CRYSTAL" # (i.e. fractional) coordinates, which are expressed either # in the basis of "primitive" or "conventional" reciprocal # lattice vectors. See below !!! #------------------------------------------------------------------------ k-point coordinates are expressed in the basis: } append content [format "%s\n" $kpath(basis)] append content { # # #-------------------------------------# # # INTEGER FORM of k-point COORDINATES # # #-------------------------------------# # # some programs want an integer form of k-point coordinates, # this looks like: # # k-point == (M*kx, M*ky, M*kz), where M is an integer multiplier # # Actual k-point coordinates are then calculated as: # # k-point == 1/M * (M*kx, M*ky, M*kz) #------------------------------------------------------------------------ Multiplier M: } append content [format "%s\n" $BzOK(iss)] append content "\nInteger form of k-point coordinates (M*kx,M*ky,M*kz,label):\n" append content [format "%s\n" $kpath(point_labels)] append content { # # #----------------------------------# # # REAL FORM of k-point COORDINATES # # #----------------------------------# # } append content "\nReal form of k-point coordinates (kx,ky,kz,label):\n" foreach line [split $kpath(point_labels) \n] { if { [llength $line] >= 3 } { for {set i 0} {$i < 3} {incr i} { set k($i) \ [expr double([lindex $line $i]) / double($BzOK(iss))] } set label [lindex $line 3] if { $label == {} } { set label A } append content [format "%15.10f %15.10f %15.10f %s\n" \ $k(0) $k(1) $k(2) $label] } } append content { # # #-------------# # # END of FILE # # #-------------# # } } proc kPath_PWscf {sfile} { global system wnKP BzOK Bz set k_list_file $system(SCRDIR)/xc_pwklist.$system(PID) set k_list "$wnKP(npoi) $BzOK(nK)\n" append k_list "$wnKP(type)\n" for {set i 1} {$i <= $wnKP(npoi)} {incr i} { append k_list "$wnKP(poi,$i,1) $wnKP(poi,$i,2) $wnKP(poi,$i,3) $wnKP(label,$i)\n" } WriteFile $k_list_file $k_list w xcDebug -stderr "XCRYSDEN-to-PWscf k-list file:" xcDebug -stderr "-----------------------------" xcDebug -stderr $k_list xcCatchExecReturn \ $system(FORDIR)/pwKPath \ $system(SCRDIR)/xc_struc.$system(PID) $k_list_file > $sfile # # print some supporting information # if { $wnKP(type) == "prim" } { set type "RECIPROCAL-PRIMITIVE" } else { set type "RECIPROCAL-CONVENTIONAL" } set supportInfo "================================================================\n" append supportInfo " * * * S U P P O R T I N G I N F O R M A T I O N * * * \n" append supportInfo "================================================================\n" append supportInfo "\n" #append supportInfo "BEWARE: the conversion of selected k-point coordinates to format\n" #append supportInfo " suitable for the PWscf is a new and untested feature.\n" #append supportInfo "\n" #append supportInfo " !!! USE AT YOUR OWN RISK !!!\n" #append supportInfo " !!! PLEASE CHECK BELOW DATA FOR CONSISTENCY !!!\n" #append supportInfo "\n" append supportInfo "Number of selected k-points: $wnKP(npoi)\n\n" append supportInfo "**ORIGINAL DATASET**\n" append supportInfo "--------------------\n" append supportInfo "THE FOLLOWING k-POINT WERE SELECTED:\n" append supportInfo "(crystal coordinates with respect to $type vectors)\n\n" for {set i 1} {$i <= $wnKP(npoi)} {incr i} { append supportInfo [format " % 10.5f % 10.5f %10.5f %s\n" \ $wnKP(poi,$i,1) $wnKP(poi,$i,2) $wnKP(poi,$i,3) $wnKP(label,$i)] } append supportInfo "\n**REPRODUCED(TRANSFORMED) DATASET for PWscf**\n" append supportInfo "----------------------------------------------\n" append supportInfo "IMPORTANT:\n" append supportInfo "Check if the data presented below are consistent with the data from ORIGINAL DATASET !!!\n\n" append supportInfo [ReadFile supportInfo-1.kpath] append supportInfo "\n" #append supportInfo "Transformed selected k-points for PWscf:\n" #append supportInfo "----------------------------------------\n" #append supportInfo [ReadFile supportInfo-2.kpath] #append supportInfo "\n" append supportInfo "The content of the generated PWscf K_POINTS file is the following:\n" append supportInfo "----------------------------------------------------------------\n" append supportInfo [ReadFile $sfile] WriteFile $system(PWD)/supportInfo.kpath $supportInfo w if { [file exists supportInfo-1.kpath] } { file delete supportInfo-1.kpath } if { [file exists supportInfo-2.kpath] } { file delete supportInfo-2.kpath } set t [xcDisplayVarText $supportInfo "k-path: Supporting Information"] if { [winfo exists $t.f1.t] } { catch {$t.f1.t configure -height 30 -width 90} catch {$t.f1.t configure -state disabled} } tkwait window $t } xcrysden-1.6.2/Tcl/parseComLinArg.tcl0000644000175000017500000002343613531163617016165 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/parseComLinArg.tcl # # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc parseComLinArg comopt { global system xcMisc set load_attributes 0 set i 0 foreach option $comopt { incr i # odd cycles are tags, even options if { $i%2 } { set tag $option switch -exact -- $tag { "-?" { XCrySDenUsage } "--help" { XCrySDenUsage } "--quiet" { # quiet run -- without welcome window !!! ViewMol . return } } } else { switch -glob -- $tag { "-r" - "--reduce*" { set xcMisc(reduce_to) $option continue } "--print" { # print the structure to a file and exit if { [winfo exists .mesa] } { set filedir [GetAbsoluteFileName $option] raise . update update idletask printTogl .mesa $filedir update exit 0 } } } set filedir [GetAbsoluteFileName $option] if { ! [file exists $filedir] && $tag != "--wien_struct" } { destroy .title ErrorDialog "file \"$filedir\" does not exist !!!" exit } switch -glob -- $tag { "-a" - "--attrib*" { set load_attributes 1 set file_attributes $filedir } "-l" - "--light*" { glLight:load $filedir } "-c" - "--custom" { uplevel #0 "source $filedir" } "--xsf" - "--xcr" - "--animxsf" - "--axsf" { # reload-capable reloadRegister $filedir XSF ViewMol . xsfOpen $filedir .mesa } "--xsf2" { # reload-capable reloadRegister $filedir XSF2 ViewMol . xsf2Open $filedir .mesa } "--xmol" - "--xyz" { reloadRegister $filedir XYZ ViewMol . xyzOpen $filedir } "--pdb" { reloadRegister $filedir PDB ViewMol . OpenXYZPDB .mesa pdb $filedir } "--fermi" - "--bxsf" { set xcMisc(titlefile) $filedir if { [file isfile $filedir] } { genFSInit $filedir } else { ErrorDialog "file $filedir doesn't exists\n(or is not a regular file) !!!" exit } } "--pw_inp" - "--pwi" { # reload-capable if { [file exists $filedir] } { reloadRegister $filedir openExtStruct:reload ViewMol . openExtStruct 3 crystal external \ [list sh $system(TOPDIR)/scripts/pwi2xsf.sh] \ pwi2xsf.xsf_out \ {PWSCF Input File} ANGS \ -file $filedir \ -preset pwInputPreset } else { ErrorDialog "$filedir doesn't exists !!!" exit } } "--pw_out" - "--pwo" { # reload-capable if { [file exists $filedir] } { reloadRegister $filedir openExtStruct:reload ViewMol . openExtStruct 3 crystal external \ [list sh $system(TOPDIR)/scripts/dummy.sh] \ pwo2xsf.xsf \ {PWSCF Output File} ANGS \ -file $filedir \ -preset pwOutputPreset } else { ErrorDialog "$filedir doesn't exists !!!" exit } } "--fhi_inpini" { if { [file exists $filedir] } { reloadRegister $filedir openExtStruct:reload ViewMol . openExtStruct 3 crystal external34 \ $system(BINDIR)/fhi_inpini2ftn34 \ $system(ftn_name).34 {FHI98MD "ini.inp"} \ BOHR -file $filedir \ -preset [list fhiPreset inpini] } else { ErrorDialog "$filedir doesn't exists !!!" exit } } "--fhi_coord" { if { [file exists $filedir] } { reloadRegister $filedir openExtStruct:reload ViewMol . openExtStruct 3 crystal external \ $system(BINDIR)/fhi_coord2xcr \ fhi_coord.xcr {FHI98MD "coord.out"} \ BOHR -file $filedir \ -preset [list fhiPreset coord] } else { ErrorDialog "$filedir doesn't exists !!!" exit } } # -------------------------------------------------- # --crystal_* options are intended as CRYSTAL-95/98/03 interfacing # -------------------------------------------------- "--crystal_inp" { if { [file exists $filedir] } { ViewMol . OpenCyrstalInput $filedir } else { ErrorDialog "$filedir doesn't exists !!!" exit } } "--crystal_f9" { if { [file exists $filedir] } { ViewMol . PropC95 $filedir } else { ErrorDialog "$filedir doesn't exists !!!" exit } } # -------------------------------------------------- # --wien_* options are intended as WIEN2k interfacing # -------------------------------------------------- "--wien_struct" { # option can be directory, filehead or file if { [file isdirectory $filedir] } { set filehead [file tail $filedir] set file $filedir/$filehead.struct } elseif { [file exists $filedir.struct] } { set file $filedir.struct } elseif { [file exists $filedir] } { set file $filedir } else { ErrorDialog "$filedir is neither directory, neither filehead, niether file" exit } reloadRegister $file WIEN2k ViewMol . wnOpenSFile $file } "--wien_kpath" { # struct file must be read, and converted # pop-up just BZ Window if { [file isdirectory $filedir] } { wnDetComOpt $filedir wnKPath $filedir } elseif { [file isfile $filedir] } { set dir [file dirname $filedir] wnDetComOpt $dir wnKPath $filedir } else { ErrorDialog "$filedir directory|file does not exist !!!" exit } } "--wien_renderdensity" { # use wnDensity proc and pop-up Viewer and 2D isoControl # toplevel if { [file isdirectory $filedir] } { set filehead [file tail $filedir] set file $filedir/$filehead.struct ViewMol . wnOpenSFile $file wnDensity $filedir } else { ErrorDialog "$filedir directory does not exist !!!" exit } } "--wien_density" { # popup Viewer & another toplevel for inquiring 2D or 3D # plots; then grid window is displayed if { [file isdirectory $filedir] } { set filehead [file tail $filedir] set file $filedir/$filehead.struct ViewMol . wnOpenSFile $file wnDetComOpt $filedir # pop-up decision window wnDensity2D_or_3D $filedir } else { ErrorDialog "$filedir directory does not exist !!!" exit } } "--wien_f*" { # struct file must be read, and converted if [file isdirectory $filedir] { wnDetComOpt $filedir wnFSInit $filedir } else { ErrorDialog "$filedir directory does not exist !!!" exit } } "--gzmat" { reloadRegister $filedir GZMAT ViewMol . gzmat $filedir } "--g98_out" - "--gXX_out" - "--gxx_out" - "--gaussian_out" { # reload-capable reloadRegister $filedir addOption:reload # this option is done via new addOption interface ... addOption:hardcoded \ [list sh $system(TOPDIR)/scripts/g98toxsf.sh] $filedir } "--cube" - "--gxx_cube" - "--gXX_cube" - "--g98_cube" { g98Cube $filedir } "--orca_out" { # reload-capable reloadRegister $filedir addOption:reload # this option is done via new addOption interface ... addOption:hardcoded \ [list sh $system(TOPDIR)/scripts/orca2xsf.sh] $filedir } "-s" - "--script" { scripting::source $filedir } "--os" - "--oldscript" { scripting::oldscript $filedir } default { # # check for user-custom options reloadRegister $filedir addOption:reload addOption:parse $tag $filedir } } } } if { $i%2 } { XCrySDenUsage } unset i if { $load_attributes && [winfo exists .mesa] } { xsfLoadAttributes $file_attributes } # open the xcrysden main window if it is not already opened update if { ! [winfo exists .mesa] && ! [winfo exists .xcrysden_logo] } { ViewMol . } } proc UpdateWMTitle {file} { global xcMisc system set xcMisc(titlefile) $file wm title . "XCrySDen: [file tail $file]" # if file exists (does not always) copy it if { [file exists $file] } { # the following copy is used if someone wants to save # file as WIEN2k STRUCT FILE file copy -force $file $system(SCRDIR)/xc_struc.$system(PID) } } proc XCrySDenUsage {} { global system wm withdraw . set message [ReadFile $system(TOPDIR)/usage] puts stderr "\n$message\n" addOption:printCustomUsage flush stderr exit 1 } xcrysden-1.6.2/Tcl/pseudoDen.tcl0000644000175000017500000003674311717504603015250 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/pseudoDen.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc PseudoDensity {} { global pDen check # incoming ... # THIS ... #if { ! $check(pseudoDens) && ![info exists pDen(nsurface)] } { # return #} #/ if { $check(pseudoDens) } { if { ![info exists pDen(nsurface)] } { PseudoDenDefaults 0 set pDen(nsurface) 1 set pDen(0,ident) [xc_molsurfreg .mesa] SetWatchCursor update xc_molsurf .mesa \ -ident $pDen(0,ident) \ -type $pDen(0,type) \ -radius $pDen(0,radius) \ -level $pDen(0,level) \ -cutoff $pDen(0,cutoff) \ -colorscheme $pDen(0,colorscheme) \ -drawstyle $pDen(0,drawstyle) \ -transparent $pDen(0,transparent) \ -shademodel $pDen(0,shademodel) \ -monocolor $pDen(0,monocolor) \ -surfacetype $pDen(0,surfacetype) \ -resolution $pDen(0,resolution) \ -smoothsteps $pDen(0,smoothsteps) \ -smoothweight $pDen(0,smoothweight) \ -tessellation $pDen(0,tessellation) \ -normals $pDen(0,normals) set pDen(0,new) 0 ResetCursor return; } } if { ![info exists pDen(nsurface)] } { return } for {set i 0} {$i < $pDen(nsurface)} {incr i} { xcDebug -debug "xc_molsurfconfig: $check(pseudoDens)" xc_molsurfconfig .mesa \ -ident $pDen($i,ident) \ -render $check(pseudoDens) } } proc PseudoDenDefaults ind { global pDen set pDen($ind,render) 1 set pDen($ind,type) $pDen(type) set pDen($ind,radius) $pDen(radius) set pDen($ind,level) [expr $pDen(level) - $ind * 0.2] set pDen($ind,cutoff) $pDen(cutoff) set pDen($ind,colorscheme) $pDen(colorscheme) set pDen($ind,drawstyle) $pDen(drawstyle) set pDen($ind,surfacetype) $pDen(surfacetype) set pDen($ind,resolution) $pDen(resolution) set pDen($ind,smoothsteps) $pDen(smoothsteps) set pDen($ind,smoothweight) $pDen(smoothweight) set pDen($ind,transparent) $pDen(transparent) set pDen($ind,shademodel) $pDen(shademodel) set pDen($ind,tessellation) $pDen(tessellation) set pDen($ind,normals) $pDen(normals) set pDen($ind,type_old) $pDen($ind,type) set pDen($ind,radius_old) $pDen($ind,radius) set pDen($ind,level_old) $pDen($ind,level) set pDen($ind,cutoff_old) $pDen($ind,cutoff) set pDen($ind,surfacetype_old) $pDen($ind,surfacetype) set pDen($ind,resolution_old) $pDen($ind,resolution) if { $ind == 0 } { set pDen($ind,monocolor) $pDen(monocolor) } else { set i [expr $ind - 1] set r [expr [lindex $pDen($i,monocolor) 0] + 0.2] if { $r > 1.0 } { set r [expr $r - 1] } set g [expr [lindex $pDen($i,monocolor) 1] + 0.2] if { $g > 1.0 } { set g [expr $g - 1] } set b [expr [lindex $pDen($i,monocolor) 2] + 0.2] if { $b > 1.0 } { set b [expr $b - 1] } trace vdelete pDen($ind,monocolor) w xcTrace set pDen($ind,monocolor) [list $r $g $b] trace variable pDen($ind,monocolor) w xcTrace } set pDen($ind,t_type) $pDen(t_type) set pDen($ind,t_radius) $pDen(t_radius) set pDen($ind,t_colorscheme) $pDen(t_colorscheme) set pDen($ind,t_drawstyle) $pDen(t_drawstyle) set pDen($ind,t_surfacetype) $pDen(t_surfacetype) set pDen($ind,t_shademodel) $pDen(t_shademodel) set pDen($ind,t_tessellation) $pDen(t_tessellation) set pDen($ind,t_normals) $pDen(t_normals) set pDen($ind,new) 1 } proc PseudoDenGenNew t { global pDen set i $pDen(nsurface) PseudoDenDefaults $i incr pDen(nsurface) $pDen(nb) insert $i n$i -text "Surf #$i" set f [$pDen(nb) getframe n$i] PseudoDenNoteBook $i $f $t $pDen(nb) raise n$i set pDen($i,ident) [xc_molsurfreg .mesa] #SetWatchCursor #update #xc_molsurf .mesa \ # -ident $pDen($i,ident) \ # -type $pDen($i,type) \ # -radius $pDen($i,radius) \ # -level $pDen($i,level) \ # -cutoff $pDen($i,cutoff) \ # -colorscheme $pDen($i,colorscheme) \ # -transparent $pDen($i,transparent) \ # -shademodel $pDen($i,shademodel) \ # -monocolor $pDen($i,monocolor) \ # -drawstyle $pDen($i,drawstyle) \ # -surfacetype $pDen($i,surfacetype) \ # -resolution $pDen($i,resolution) \ # -smoothsteps $pDen($i,smoothsteps) \ # -smoothweight $pDen($i,smoothweight) #ResetCursor } proc PseudoDenConfigWid {} { global pDen check set t [xcToplevel [WidgetName] "Molecular Surface Settings\ " "Molecular Surface" . 0 0 1] button $t.b1 -text "Generate new molecular-surface" \ -command [list PseudoDenGenNew $t] pack $t.b1 -side top -expand 1 -fill x -padx 5m -pady 2m set nb $t.n set pDen(nb) $nb #tixNoteBook $nb # now we use BWidgets NoteBook $nb pack $nb set ind 0 if { ![info exists pDen(nsurface)] } { set pDen(nsurface) 0 PseudoDenGenNew $t set ind 1 } for {set i $ind} {$i < $pDen(nsurface)} {incr i} { $nb insert $i n$i -text "Surf #$i" set f [$nb getframe n$i] PseudoDenNoteBook $i $f $t $nb raise n$i } } proc PseudoDenNoteBook {ind f t} { global pDen # -ident # -type gauss|exp|unigauss|uniexp # -radius cov|VdW # -level # -cutoff # -colorscheme atomic|monochrome # -drawstyle solid|wire|dot # -surfacetype molsurf|gap # -resolution # -smoothsteps # -smoothweight set f1 [frame $f.1] set f2 [frame $f.2 -relief ridge -bd 2] pack $f1 $f2 -side top -padx 2m -pady 2m -fill x checkbutton $f1.cb0 -text "Display surface:" -variable pDen($ind,render) \ -command [list PseudoDenUpdateSurf $ind] pack $f1.cb0 -side top -pady 2 set mb1 [xcMenuButton $f1 \ -labeltext "Function type:" -labelwidth 20 \ -textvariable pDen($ind,t_type) \ -menu [list \ GAUSSIAN [list set pDen($ind,t_type) GAUSSIAN] \ EXPONENTIAL [list set pDen($ind,t_type) EXPONENTIAL] \ {constant GAUSSIAN} [list set pDen($ind,t_type) {constant GAUSSIAN}] \ {constant EXPONENTIAL} [list set pDen($ind,t_type) {constant EXPONENTIAL}] \ {distance FUNCTION} [list set pDen($ind,t_type) {distance FUNCTION}]] ] set mb2 [xcMenuButton $f1 \ -labeltext "Radius type:" -labelwidth 20 \ -textvariable pDen($ind,t_radius) \ -menu [list \ {Covalent radii} [list set pDen($ind,t_radius) {Covalent radii}] \ {Van der Waals radii} [list set pDen($ind,t_radius) {Van der Waals radii}]] ] set mb3 [xcMenuButton $f1 \ -labeltext "Color Scheme:" -labelwidth 20 \ -textvariable pDen($ind,t_colorscheme) \ -menu [list \ {Atomic colors} [list set pDen($ind,t_colorscheme) {Atomic colors}] \ {Monocolor} [list set pDen($ind,t_colorscheme) {Monocolor}]] ] set mb4 [xcMenuButton $f1 \ -labeltext "Draw Style:" -labelwidth 20 \ -textvariable pDen($ind,t_drawstyle) \ -menu [list \ Solid [list set pDen($ind,t_drawstyle) Solid] \ Wire [list set pDen($ind,t_drawstyle) Wire] \ Dot [list set pDen($ind,t_drawstyle) Dot]] ] set mb5 [xcMenuButton $f1 \ -labeltext "Shade Model:" -labelwidth 20 \ -textvariable pDen($ind,t_shademodel) \ -menu [list \ {Smooth} [list set pDen($ind,t_shademodel) {Smooth}] \ {Flat} [list set pDen($ind,t_shademodel) {Flat}]] ] set mb51 [xcMenuButton $f1 \ -labeltext "Surface tessellation type:" -labelwidth 20 \ -textvariable pDen($ind,t_tessellation) \ -menu [list \ {Cube} [list set pDen($ind,t_tessellation) {Cube}] \ {Tetrahedron} [list set pDen($ind,t_tessellation) {Tetrahedron}]] ] set mb52 [xcMenuButton $f1 \ -labeltext "Surface normals type:" -labelwidth 20 \ -textvariable pDen($ind,t_normals) \ -menu [list \ {Gradient} [list set pDen($ind,t_normals) {Gradient}] \ {Triangle} [list set pDen($ind,t_normals) {Triangle}]] ] set mb6 [xcMenuButton $f1 \ -labeltext "Surface Type:" -labelwidth 20 \ -textvariable pDen($ind,t_surfacetype) \ -menu [list \ {Pseudo density} [list set pDen($ind,t_surfacetype) {Pseudo density}] \ {Gap analysis} [list set pDen($ind,t_surfacetype) {Gap analysis}]] ] ########################################################### # TEMPORAL: until the C-code for GAP-ANALYSIS for slabs-polymers-molecules # is written global periodic if { $periodic(dim) < 3 } { $mb6.mb.menu entryconfig {Gap analysis} -state disabled } ########################################################### pack $mb1 $mb2 $mb3 $mb4 $mb5 $mb51 $mb52 $mb6 -side top -expand 1 -fill x -padx 2m -pady 2 global fillEntries set e [FillEntries $f1 [list \ "Isovalue (between \[0.0,2.0\]):" "Cutoff:" \ "Resolution (in Angs.):" "N. of smoothing steps:" \ "Smoothing weight:"] \ [list pDen($ind,level) pDen($ind,cutoff) pDen($ind,resolution) \ pDen($ind,smoothsteps) pDen($ind,smoothweight)] \ 30 7] set foclist $fillEntries set varlist [list pDen($ind,level) \ pDen($ind,cutoff) pDen($ind,resolution) \ pDen($ind,smoothsteps) pDen($ind,smoothweight)] set f11 [frame [WidgetName $f1]] set b [button $f11.b -text "Set Surface Monocolor" \ -command [list PseudoDenChangeCol $ind]] set l [label $f11.l -text "Current monocolor:"] set pDen($ind,colbut) [button $f11.colb \ -bg [rgb_f2h $pDen($ind,monocolor)] -width 5 \ -state disabled -relief sunken -bd 1] trace variable pDen($ind,monocolor) w xcTrace pack $f11 -side top -pady 2m -fill x pack $b $l $pDen($ind,colbut) -side left -pady 2 -fill x checkbutton $f1.cb -text "Surface transparency:" \ -variable pDen($ind,transparent) pack $f1.cb -side top -pady 2 button $f2.1 -text "Close" -command [list CancelProc $t] button $f2.2 -text "Update" \ -command [list PseudoDenUpdate $ind $varlist $foclist] pack $f2.1 $f2.2 -side left -expand 1 -padx 2m -pady 3 } proc PseudoDenUpdate {ind varlist foclist} { global pDen set all(type) { {GAUSSIAN gauss} {EXPONENTIAL exp} {{constant GAUSSIAN} unigauss} {{constant EXPONENTIAL} uniexp} {{distance FUNCTION} distf} } set all(radius) { {{Covalent radii} cov} {{Van der Waals radii} VdW} } set all(colorscheme) { {{Atomic colors} atomic} {Monocolor monochrome} {{Distance colors} distance} {{Slab colors} slab} } set all(drawstyle) { {Solid solid} {Wire wire} {Dot dot} } set all(shademodel) { {Smooth smooth} {Flat flat} } set all(surfacetype) { {{Pseudo density} molsurf} {{Gap analysis} gap} } set all(tessellation) { {Cube cube} {Tetrahedron tetrahedron} } set all(normals) { {Gradient gradient} {Triangle triangle} } foreach var {type radius colorscheme drawstyle shademodel surfacetype tessellation normals} { set match 0 foreach item $all($var) { set text [lindex $item 0] set value [lindex $item 1] if { $text == $pDen($ind,t_$var) } { set pDen($ind,$var) $value set match 1 } } if { !$match } { tk_dialog [WidgetName] Error "PseudoDenUpdate Error" error 0 OK } } if { ![check_var $varlist $foclist] } { return } PseudoDenUpdateSurf $ind } proc PseudoDen:_xc_molsurf {ind} { global pDen xc_molsurf .mesa \ -ident $pDen($ind,ident) \ -type $pDen($ind,type) \ -radius $pDen($ind,radius) \ -level $pDen($ind,level) \ -cutoff $pDen($ind,cutoff) \ -colorscheme $pDen($ind,colorscheme) \ -transparent $pDen($ind,transparent) \ -shademodel $pDen($ind,shademodel) \ -monocolor $pDen($ind,monocolor) \ -drawstyle $pDen($ind,drawstyle) \ -surfacetype $pDen($ind,surfacetype) \ -resolution $pDen($ind,resolution) \ -smoothsteps $pDen($ind,smoothsteps) \ -smoothweight $pDen($ind,smoothweight) \ -tesselation $pDen($ind,tessellation) \ -normals $pDen($ind,normals) } proc PseudoDenUpdateSurf ind { global pDen check if { ( $pDen($ind,type_old) != $pDen($ind,type) || \ $pDen($ind,radius_old) != $pDen($ind,radius) || \ $pDen($ind,cutoff_old) != $pDen($ind,cutoff) || \ $pDen($ind,surfacetype_old) != $pDen($ind,surfacetype) || \ $pDen($ind,resolution_old) != $pDen($ind,resolution) ) \ || \ $pDen($ind,new) == 1 } { set pDen($ind,new) 0 PseudoDen:_xc_molsurf $ind } else { xc_molsurfconfig .mesa \ -ident $pDen($ind,ident) \ -render $pDen($ind,render) \ -level $pDen($ind,level) \ -colorscheme $pDen($ind,colorscheme) \ -transparent $pDen($ind,transparent) \ -shademodel $pDen($ind,shademodel) \ -monocolor $pDen($ind,monocolor) \ -drawstyle $pDen($ind,drawstyle) \ -smoothsteps $pDen($ind,smoothsteps) \ -smoothweight $pDen($ind,smoothweight) \ -tessellation $pDen($ind,tessellation) \ -normals $pDen($ind,normals) } set pDen($ind,type_old) $pDen($ind,type) set pDen($ind,radius_old) $pDen($ind,radius) set pDen($ind,level_old) $pDen($ind,level) set pDen($ind,cutoff_old) $pDen($ind,cutoff) set pDen($ind,surfacetype_old) $pDen($ind,surfacetype) set pDen($ind,resolution_old) $pDen($ind,resolution) set check(pseudoDens) 1 } proc PseudoDenChangeCol ind { global pDen set c1 [d2h [expr [lindex $pDen($ind,monocolor) 0] * 255]] set c2 [d2h [expr [lindex $pDen($ind,monocolor) 1] * 255]] set c3 [d2h [expr [lindex $pDen($ind,monocolor) 2] * 255]] set t [xcToplevel [WidgetName] "Set Canvas Background" "SetBg" . 0 0 1] xcModifyColor $t "Set Surface Monocolor" #${c1}${c2}${c3} groove \ left left 100 100 70 5 20 proc PseudoDenChangeColOK {type t ind} { global mody_col mody pDen if { $type == "OK" } { set cID [xcModifyColorGetID] set pDen($ind,monocolor) [list $mody_col($cID,red) $mody_col($cID,green) $mody_col($cID,blue) 1.0] set pDen($ind,colbut) [rgb_f2h [list $mody_col($cID,red) $mody_col($cID,green) $mody_col($cID,blue)]] } destroy $t } set ok [DefaultButton [WidgetName $t] -text "OK" \ -command [list PseudoDenChangeColOK OK $t $ind]] set can [button [WidgetName $t] -text "Cancel" \ -command [list PseudoDenChangeColOK Cancel $t $ind]] pack $ok $can -padx 10 -pady 10 -expand 1 } xcrysden-1.6.2/Tcl/isoRender.tcl0000644000175000017500000006303211720423272015237 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/isoRender.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc xcPrepareIsosurf {command {dim 3D}} { global system isostack isosign isodata isofiles vec prop isosurf # RENDER ISOSURFACE # ---------------------------------------------------------------------- # to xc_isopoints 3D we submit point1, point2, point3: # # * Z -> point 3 # * # * origin -> point 0 # * * # point 1 <- X * * Y-> point 2 # ---------------------------------------------------------------------- SetWatchCursor # from Bohr to Angstroms for {set i 0} {$i < 3} {incr i} { for {set j 0} {$j < 3} {incr j} { set vec($i,$j) [Bohr2Angs $vec($i,$j)] } set isosurf(origin,$i) [Bohr2Angs $isosurf(origin,$i)] } # origin shift:: set xs $isosurf(origin,0) set ys $isosurf(origin,1) set zs $isosurf(origin,2) ######################################## # make some nice output regsub -all -- ";" $isostack \n isostack_output regsub -all -- ";" $isosign \n isosign_output regsub -all -- ";" $isodata \n isodata_output xcDebug "****************************************" xcDebug "xc_iso init" xcDebug $isostack_output xcDebug "xc_iso end isostack\n" xcDebug $isosign_output xcDebug "xc_iso end isosign\n" xcDebug "xc_isofiles $system(SCRDIR)/xc_binVrt.$system(PID) $system(SCRDIR)/xc_bin.$system(PID) $isofiles\n" if { $dim == "3D" } { xcDebug "xc_isopoints 0 3D \ $xs $ys $zs \ [expr $xs + $vec(0,0)] [expr $ys + $vec(0,1)] [expr $zs + $vec(0,2)] \ [expr $xs + $vec(1,0)] [expr $ys + $vec(1,1)] [expr $zs + $vec(1,2)] \ [expr $xs + $vec(2,0)] [expr $ys + $vec(2,1)] [expr $zs + $vec(2,2)]" } else { xcDebug "xc_isopoints 0 2D \ $xs $ys $zs \ [expr $xs + $vec(0,0)] [expr $ys + $vec(0,1)] [expr $zs + $vec(0,2)] \ [expr $xs + $vec(1,0)] [expr $ys + $vec(1,1)] [expr $zs + $vec(1,2)]" xcDebug $isodata_output xcDebug "xc_isodata make\n" xcDebug "****************************************" } # END_OF_OUTPUT SECTION ######################################## xc_iso init eval $isostack xc_iso end isostack # assign singns to all stck-levels eval $isosign xc_iso end isosign eval xc_isofiles $system(SCRDIR)/xc_binVrt.$system(PID) $system(SCRDIR)/xc_bin.$system(PID) $isofiles xcDebug "xc_isofiles $system(SCRDIR)/xc_binVrt.$system(PID) $system(SCRDIR)/xc_bin.$system(PID) $isofiles" if { $dim == "3D" } { xc_isopoints 0 3D \ $xs $ys $zs \ [expr $xs + $vec(0,0)] [expr $ys + $vec(0,1)] [expr $zs + $vec(0,2)] \ [expr $xs + $vec(1,0)] [expr $ys + $vec(1,1)] [expr $zs + $vec(1,2)] \ [expr $xs + $vec(2,0)] [expr $ys + $vec(2,1)] [expr $zs + $vec(2,2)] } elseif { $dim == "2D" } { xc_isopoints 0 2D \ $xs $ys $zs \ [expr $xs + $vec(0,0)] [expr $ys + $vec(0,1)] [expr $zs + $vec(0,2)] \ [expr $xs + $vec(1,0)] [expr $ys + $vec(1,1)] [expr $zs + $vec(1,2)] } eval $isodata xc_isodata make # # if isosurf(3Dinterpl_degree) > 1; perform triCubic spline interpolation # if { $isosurf(3Dinterpl_degree) > 1 } { xc_iso interpolate $isosurf(3Dinterpl_degree) } # get MIN-ISO-VALUE & MAX-ISO-VALUE if { $isosurf(spin) == "ALPHA" || \ $isosurf(spin) == "BETA" } { # in C95 "spin-dependent" properties are ECHD & ECHG, # first record is ALPHA+BETA, second is ALPHA-BETA, so: # ALPHA = (record1 + record2) / 2, but in C-code I just use # (record1 + record2), so we must correct it here by factor 2.0 set isosurf(minvalue) [expr [xc_iso minvalue] / 2.0] set isosurf(maxvalue) [expr [xc_iso maxvalue] / 2.0] } else { set isosurf(minvalue) [xc_iso minvalue] set isosurf(maxvalue) [xc_iso maxvalue] } set isosurf(rangevalue) [expr $isosurf(maxvalue) - $isosurf(minvalue)] ResetCursor } proc UpdateIsosurf {{var {}}} { global prop isosurf periodic isosign isodata isosurf_struct \ isoControl isoControl_struct vec dif_isosurf # var.......because this routine is used also by RadioButCmd, and this # routine pass one parameter to command, we must make "var" here a # dummy variable ############################################### # before anything is done, check $prop(isovalue) SetWatchCursor xcDebug "1,current_slide:: $isoControl(1,current_slide)" xcDebug "2,current_slide:: $isoControl(2,current_slide)" xcDebug "3,current_slide:: $isoControl(3,current_slide)" # # ISOSURFACE-SECTION # xcDebug "\nUpdateIsosurf\n" xcDebug " xc_isosurf .mesa 0 \ -drawstyle $isosurf(type_of_isosurf) \ -shademodel $isosurf(shade_model) \ -transparency $isosurf(transparency)" if { $isoControl(isosurf) == 1 } { if { $var != {} && ![info exists prop(isolevel)] } { ResetCursor return } } if { $var != {} && $prop(isolevel) == {} } { ResetCursor return } if { $isoControl(isosurf) == 1 } { if ![check_var {{prop(isolevel) real}} $isosurf(isovalue_entry)] { ResetCursor return } } ############## # ISOSURFACE # ############## set polygonise 0; # do we need to call xc_iso polygonise set expand {0 0 0} ######################### # this is needed if spin is changed if { $isosurf_struct(isosign) != $isosign || \ $isosurf_struct(isodata) != $isodata || \ $isosurf_struct(spin) != $isosurf(spin) } { SetXC_Iso eval $isosign xc_iso end isosign eval $isodata xc_isodata make set polygonise 1 } ######################### if { $isosurf_struct(3Dinterpl_degree) != $isosurf(3Dinterpl_degree) } { xc_iso interpolate $isosurf(3Dinterpl_degree) # # now IsoPlane will have to be updated, because ***plvertex was # reallocated with xc_iso interpolate # set upd {1 2 3} } if { $isoControl(isosurf) } { if { $isosurf_struct(isolevel) != $prop(isolevel) || \ $isosurf_struct(pm_isolevel) != $prop(pm_isolevel) || \ $isosurf_struct(3Dinterpl_degree) != $isosurf(3Dinterpl_degree) || \ $isosurf_struct(tessellation_type) != $isosurf(tessellation_type) || \ $isosurf_struct(normals_type) != $isosurf(normals_type) || \ $isosurf_struct(shade_model) != $isosurf(shade_model) } { if { $isosurf(spin) == "ALPHA" || \ $isosurf(spin) == "BETA" } { # in C95 "spin-dependent" properties are ECHD & ECHG, # first record is ALPHA+BETA, second is ALPHA-BETA, so: # ALPHA = (record1 + record2) / 2, but in C-code I just use # (record1 + record2), so we must correct it here by factor 2.0 if { !$prop(pm_isolevel) || \ [IsEqual [expr $isosurf(rangevalue) / 1.0e7] \ $prop(isolevel)] } { # # render just isolevel isosurface # xc_iso isolevel [expr $prop(isolevel) * 2.0] } else { # # render +/- isolevel isosurface # xc_iso isolevel \ [expr $prop(isolevel) * 2.0] \ [expr $prop(isolevel) * -2.0] } } else { if { !$prop(pm_isolevel) || \ [IsEqual \ [expr $isosurf(rangevalue) / 1.0e7] $prop(isolevel)] } { # # render just isolevel isosurface # xcDebug "ISOSURFACE: +isovalue" xc_iso isolevel $prop(isolevel) } else { # # render +/- isolevel isosurface # xcDebug "ISOSURFACE: +/-isovalue" xc_iso isolevel $prop(isolevel) [expr $prop(isolevel) * -1.0] } } set polygonise 1 } if { $polygonise } { xc_iso polygonise -algorithm $isosurf(tessellation_type) -shademodel $isosurf(shade_model) -normals $isosurf(normals_type) } xc_isosurf .mesa \ -drawstyle $isosurf(type_of_isosurf) \ -shademodel $isosurf(shade_model) \ -transparency $isosurf(transparency) if { $isosurf(spin) == "ALPHA" || \ $isosurf(spin) == "BETA" } { # in C95 "spin-dependent" properties are ECHD & ECHG, # first record is ALPHA+BETA, second is ALPHA-BETA, so: # ALPHA = (record1 + record2) / 2, but in C-code I just use # (record1 + record2), so we must correct it here by factor 2.0 set isosurf(minvalue) [expr [xc_iso minvalue] / 2.0] set isosurf(maxvalue) [expr [xc_iso maxvalue] / 2.0] } else { set isosurf(minvalue) [xc_iso minvalue] set isosurf(maxvalue) [xc_iso maxvalue] } ######################################## # now take care of xc_isoexpand # isosurf(expand) ......... none/whole/specify # |-> isosurf(expand_[X,Y,Z]) if { $isosurf(expand) == "none" } { if { $periodic(dim) == 3 } { set expand {1 1 1} } elseif { $periodic(dim) == 2 } { set expand {1 1 0} } elseif { $periodic(dim) == 1 } { set expand {1 0 0} } else { set expand {0 0 0} } } elseif { $isosurf(expand) == "whole" } { set expand "whole" } else { # expand == specify if { $periodic(dim) == 3 } { set expand [list $isosurf(expand_X) $isosurf(expand_Y) \ $isosurf(expand_Z)] } elseif { $periodic(dim) == 2 } { set expand [list $isosurf(expand_X) $isosurf(expand_Y) 0] } elseif { $periodic(dim) == 1 } { set expand [list $isosurf(expand_X) 0 0] } else { set expand {0 0 0} } } xc_isoexpand .mesa 0 -repeattype default \ -shape parapipedal -expand $expand -render after } else { # # do not render an isosurface # xc_isosurf .mesa -isosurf none } ################################################ # should PROPERTY-PLANE THERMOMETER be updated # ################################################ set upd_thermo {} foreach i {1 2 3} { if { \ $isoControl_struct($i,cpl_basis) != $isoControl($i,cpl_basis) || \ $isoControl_struct($i,cpl_function) != $isoControl($i,cpl_function) || \ $isoControl_struct($i,colorplane) != $isoControl($i,colorplane) || \ $isoControl_struct($i,cpl_thermometer) != $isoControl($i,cpl_thermometer) || \ $isoControl_struct($i,cpl_thermoTplw) != $isoControl($i,cpl_thermoTplw) || \ $isoControl_struct($i,cpl_thermoFmt) != $isoControl($i,cpl_thermoFmt) || \ $isoControl_struct($i,cpl_thermoLabel) != $isoControl($i,cpl_thermoLabel) || \ $isoControl_struct($i,cpl_thermoNTics) != $isoControl($i,cpl_thermoNTics) || \ $isoControl_struct($i,cpl_thermoFont) != $isoControl($i,cpl_thermoFont) || \ $isoControl_struct($i,2Dlowvalue) != $isoControl($i,2Dlowvalue) || \ $isoControl_struct($i,2Dhighvalue) != $isoControl($i,2Dhighvalue) } { append upd_thermo " $i" } } ############################################# # should PROPERTY-PLANE be rendered as well # ############################################# # # if it is something has changed from the last time, # then all three planes should be updated, else just current plane # if ![info exists upd] { set upd {} foreach i {1 2 3} { if { \ $isoControl_struct($i,cpl_basis) != $isoControl($i,cpl_basis) || \ $isoControl_struct($i,cpl_function) != $isoControl($i,cpl_function) || \ $isoControl_struct($i,colorplane) != $isoControl($i,colorplane) || \ $isoControl_struct($i,isoline) != $isoControl($i,isoline) || \ $isoControl_struct($i,colorplane_lighting) != $isoControl($i,colorplane_lighting) || \ $isoControl_struct($i,cpl_transparency) != $isoControl($i,cpl_transparency) || \ $isoControl_struct($i,cpl_thermometer) != $isoControl($i,cpl_thermometer) || \ $isoControl_struct($i,cpl_thermoTplw) != $isoControl($i,cpl_thermoTplw) || \ $isoControl_struct($i,cpl_thermoFmt) != $isoControl($i,cpl_thermoFmt) || \ $isoControl_struct($i,cpl_thermoLabel) != $isoControl($i,cpl_thermoLabel) || \ $isoControl_struct($i,cpl_thermoNTics) != $isoControl($i,cpl_thermoNTics) || \ $isoControl_struct($i,cpl_thermoFont) != $isoControl($i,cpl_thermoFont) || \ $isosurf_struct($i,2Dexpand) != $isosurf($i,2Dexpand) || \ $isosurf_struct($i,2Dexpand_X) != $isosurf($i,2Dexpand_X) || \ $isosurf_struct($i,2Dexpand_Y) != $isosurf($i,2Dexpand_Y) || \ $isosurf_struct($i,2Dexpand_Z) != $isosurf($i,2Dexpand_Z) || \ $isoControl_struct($i,anim_step) != $isoControl($i,anim_step) || \ $isoControl_struct($i,current_slide) != $isoControl($i,current_slide) || \ $isoControl_struct($i,2Dlowvalue) != $isoControl($i,2Dlowvalue) || \ $isoControl_struct($i,2Dhighvalue) != $isoControl($i,2Dhighvalue) || \ $isoControl_struct($i,2Dnisoline) != $isoControl($i,2Dnisoline) || \ $isoControl_struct($i,isoline_color) != $isoControl($i,isoline_color) || \ $isoControl_struct($i,isoline_width) != $isoControl($i,isoline_width) || \ $isoControl_struct($i,isoline_monocolor)!= $isoControl($i,isoline_monocolor) || \ $isoControl_struct($i,isoline_stipple) != $isoControl($i,isoline_stipple) } { append upd " $i" } } } xcDebug --stderr "UpdateIsosurf -- upd == $upd" foreach i $upd { if { $isoControl($i,colorplane) && !$isoControl($i,isoline) } { set what "colorplane" } elseif { !$isoControl($i,colorplane) && $isoControl($i,isoline) } { set what "isoline" } elseif { $isoControl($i,colorplane) && $isoControl($i,isoline) } { set what "both" } else { set what "none" } if { $isoControl($i,cpl_basis) == {} } { tk_dialog [WidgetName] ERROR "ERROR: You forgot to specify color basis for plane #$i. Please Do it !" error 0 OK ResetCursor return } if { $isoControl($i,cpl_function) == {} } { tk_dialog [WidgetName] ERROR "ERROR: You forgot to specify scale function for plane #$i. Please Do it !" error 0 OK ResetCursor return } # # this must be the same as in "isosurf.h" # set COLORBASE_MONO 0 set COLORBASE_RAINBOW 1 set COLORBASE_RGB 2 set COLORBASE_GEOGRAPHIC 3 set COLORBASE_BLUE_WHITE_RED 4 set COLORBASE_BLACK_BROWN_WHITE 5 set SCALE_FUNC_LIN 0 set SCALE_FUNC_LOG 1 set SCALE_FUNC_LOG10 2 set SCALE_FUNC_SQRT 3 set SCALE_FUNC_ROOT3 4 set SCALE_FUNC_GAUSS 5 set SCALE_FUNC_SLATER 6 switch -exact -- $isoControl($i,cpl_basis) { MONOCHROME { set basis $COLORBASE_MONO } RAINBOW { set basis $COLORBASE_RAINBOW } RGB { set basis $COLORBASE_RGB } GEOGRAPHIC { set basis $COLORBASE_GEOGRAPHIC } BLUE-WHITE-RED { set basis $COLORBASE_BLUE_WHITE_RED } BLACK-BROWN-WHITE { set basis $COLORBASE_BLACK_BROWN_WHITE } } switch -exact -- $isoControl($i,cpl_function) { LINEAR { set func $SCALE_FUNC_LIN } LOG { set func $SCALE_FUNC_LOG } LOG10 { set func $SCALE_FUNC_LOG10 } SQRT { set func $SCALE_FUNC_SQRT } 3th-ROOT { set func $SCALE_FUNC_ROOT3 } EXP(x) { set func $SCALE_FUNC_SLATER } EXP(x^2) { set func $SCALE_FUNC_GAUSS } } if { $isoControl(isoline_color) == "monocolor" } { set linecolor \ [concat monocolor [rgb_h2f $isoControl(isoline_monocolor)]] } else { set linecolor polycolor } switch -exact -- $isoControl(isoline_stipple) { {no stipple} { set linedash nodash } {stipple negative} { set linedash negdash } {full stipple} { set linedash fulldash } } xc_iso isoplaneconfig $i \ -isoplanemin $isoControl($i,2Dlowvalue) \ -isoplanemax $isoControl($i,2Dhighvalue) \ -isolinecolor $linecolor \ -isolinewidth $isoControl($i,isoline_width) \ -isolinedash $linedash \ -isolinenlevels $isoControl($i,2Dnisoline) \ -isoplanelighting $isoControl($i,colorplane_lighting) xc_iso isoplane $i $basis $func $what $isoControl($i,current_slide) if { $what != "none" } { xc_isoplane .mesa $i -planetype $what \ -transparency $isoControl($i,cpl_transparency) \ -render after ######################################## # now take care of xc_isoexpand # isosurf(expand) ......... none/whole/specify # |-> isosurf(expand_[X,Y,Z]) if { $isosurf($i,2Dexpand) == "none" } { if { $periodic(dim) == 3 } { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } elseif { $periodic(dim) == 2 } { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } elseif { $periodic(dim) == 1 } { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } else { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } } elseif { $isosurf($i,2Dexpand) == "whole" } { set expand2D "whole" } else { # expand == specify if { $periodic(dim) == 3 } { set expand2D [list 1 0 0 0 1 0 0 0 1 \ $isosurf($i,2Dexpand_X) \ $isosurf($i,2Dexpand_Y) \ $isosurf($i,2Dexpand_Z)] } elseif { $periodic(dim) == 2 } { set expand2D [list 1 0 0 0 1 0 0 0 1 \ $isosurf($i,2Dexpand_X) $isosurf($i,2Dexpand_Y) 0] } elseif { $periodic(dim) == 1 } { set expand2D [list 1 0 0 0 1 0 0 0 1 \ $isosurf($i,2Dexpand_X) 0 0] } else { set expand2D {1 0 0 0 1 0 0 0 1 0 0 0} } } xc_isoexpand .mesa $i -repeattype default \ -shape parapipedal -expand $expand2D -render after } } ############################ # take care of thermometer # ############################ foreach i $upd_thermo { if { $isoControl($i,cpl_thermometer) } { # render thermometer !!! foreach wid [list .mesa.thermo$i .thermo$i] { if { [winfo exists $wid] } { destroy $wid } } if { $isoControl($i,cpl_thermoTplw) == 1 } { set prefix {} } else { set prefix .mesa } set tw [thermometerWidget $prefix.thermo$i $i \ $isoControl($i,cpl_thermoLabel) \ $isoControl($i,cpl_thermoFont) \ $isoControl($i,cpl_thermoFmt) \ $isoControl($i,cpl_basis) \ $isoControl($i,cpl_function) \ $isoControl($i,2Dlowvalue) \ $isoControl($i,2Dhighvalue) \ $isoControl($i,cpl_thermoNTics) \ $isoControl($i,cpl_thermoTplw)] if { $isoControl($i,cpl_thermoTplw) == 0 } { pack $tw -anchor nw -side top } } else { if { [winfo exists .mesa.thermo$i] } { destroy .mesa.thermo$i } elseif { [winfo exists .thermo$i] } { destroy .thermo$i } } } ###################### # end PROPERTY-PLANE # ###################### # update the display #xc_display .mesa .mesa render # now updata isosurf_struct global variable Set_UpdateIsosurf_Struct $expand ResetCursor } proc Set_UpdateIsosurf_Struct {{expand {}}} { global isosurf_struct isostack isosign isodata prop isosurf \ isoControl isoControl_struct if [info exists isosurf(3Dinterpl_degree)] { set isosurf_struct(3Dinterpl_degree) $isosurf(3Dinterpl_degree) } else { set isosurf(3Dinterpl_degree) 1 set isosurf_struct(3Dinterpl_degree) 1 } ############################################# if [info exists isosurf(spin)] { set isosurf_struct(spin) $isosurf(spin) } else { set isosurf_struct(spin) {} } ############################################# if [info exists isostack] { set isosurf_struct(isostack) $isostack } else { set isosurf_struct(isostack) {} } ############################################# if [info exists isosign] { set isosurf_struct(isosign) $isosign } else { set isosurf_struct(isosign) {} } ############################################## if [info exists isodata] { set isosurf_struct(isodata) $isodata } else { set isosurf_struct(isodata) {} } ############################################# if [info exists prop(isolevel)] { set isosurf_struct(isolevel) $prop(isolevel) } else { set isosurf_struct(isolevel) {} } ############################################# if [info exists prop(pm_isolevel)] { set isosurf_struct(pm_isolevel) $prop(pm_isolevel) } else { set isosurf_struct(pm_isolevel) 0 } ############################################# if [info exists isosurf(shade_model)] { set isosurf_struct(shade_model) $isosurf(shade_model) } ############################################# if [info exists isosurf(tessellation_type)] { set isosurf_struct(tessellation_type) $isosurf(tessellation_type) } ############################################# if [info exists isosurf(normals_type)] { set isosurf_struct(normals_type) $isosurf(normals_type) } ############################################# if [info exists isosurf(expand)] { set isosurf_struct(expand) $isosurf(expand) } ############################################# # now here we will do a little different if ![info exists isosurf_struct(expand_XYZ)] { set isosurf_struct(expand_XYZ) {} } if { $expand != {} } { set isosurf_struct(expand_XYZ) $expand } ############################################# # isoControl array for PROPERTY PLANE # ############################################# # # have we already call IsoControl_InitVar ??? # if ![info exists isoControl(cpl_basis)] { IsoControl_InitVar } foreach i {1 2 3} { set isoControl_struct($i,cpl_basis) $isoControl($i,cpl_basis) set isoControl_struct($i,cpl_function) $isoControl($i,cpl_function) set isoControl_struct($i,colorplane) $isoControl($i,colorplane) set isoControl_struct($i,isoline) $isoControl($i,isoline) set isoControl_struct($i,colorplane_lighting) $isoControl($i,colorplane_lighting) set isoControl_struct($i,cpl_transparency) $isoControl($i,cpl_transparency) set isoControl_struct($i,cpl_thermometer) $isoControl($i,cpl_thermometer) set isoControl_struct($i,cpl_thermoTplw) $isoControl($i,cpl_thermoTplw) set isoControl_struct($i,cpl_thermoFmt) $isoControl($i,cpl_thermoFmt) set isoControl_struct($i,cpl_thermoLabel) $isoControl($i,cpl_thermoLabel) set isoControl_struct($i,cpl_thermoNTics) $isoControl($i,cpl_thermoNTics) set isoControl_struct($i,cpl_thermoFont) $isoControl($i,cpl_thermoFont) set isosurf_struct($i,2Dexpand) $isosurf($i,2Dexpand) set isosurf_struct($i,2Dexpand_X) $isosurf($i,2Dexpand_X) set isosurf_struct($i,2Dexpand_Y) $isosurf($i,2Dexpand_Y) set isosurf_struct($i,2Dexpand_Z) $isosurf($i,2Dexpand_Z) set isoControl_struct($i,anim_step) $isoControl($i,anim_step) set isoControl_struct($i,current_slide) $isoControl($i,current_slide) set isoControl_struct($i,2Dlowvalue) $isoControl($i,2Dlowvalue) set isoControl_struct($i,2Dhighvalue) $isoControl($i,2Dhighvalue) set isoControl_struct($i,2Dnisoline) $isoControl($i,2Dnisoline) set isoControl_struct($i,isoline_color) $isoControl($i,isoline_color) set isoControl_struct($i,isoline_width) $isoControl($i,isoline_width) set isoControl_struct($i,isoline_monocolor) $isoControl($i,isoline_monocolor) set isoControl_struct($i,isoline_stipple) $isoControl($i,isoline_stipple) } # # ISOOBJ_BASE == 2D:: # set isoControl_struct(cpl_basis) $isoControl(cpl_basis) set isoControl_struct(cpl_function) $isoControl(cpl_function) set isoControl_struct(colorplane) $isoControl(colorplane) set isoControl_struct(isoline) $isoControl(isoline) set isoControl_struct(colorplane_lighting) $isoControl(colorplane_lighting) set isoControl_struct(cpl_transparency) $isoControl(cpl_transparency) set isoControl_struct(cpl_thermometer) $isoControl(cpl_thermometer) set isoControl_struct(cpl_thermoTplw) $isoControl(cpl_thermoTplw) set isoControl_struct(cpl_thermoFmt) $isoControl(cpl_thermoFmt) set isoControl_struct(cpl_thermoLabel) $isoControl(cpl_thermoLabel) set isoControl_struct(cpl_thermoNTics) $isoControl(cpl_thermoNTics) set isoControl_struct(cpl_thermoFont) $isoControl(cpl_thermoFont) set isosurf_struct(2Dexpand) $isosurf(2Dexpand) set isosurf_struct(2Dexpand_X) $isosurf(2Dexpand_X) set isosurf_struct(2Dexpand_Y) $isosurf(2Dexpand_Y) set isosurf_struct(2Dexpand_Z) $isosurf(2Dexpand_Z) set isoControl_struct(anim_step) $isoControl(anim_step) set isoControl_struct(current_slide) $isoControl(current_slide) set isoControl_struct(2Dlowvalue) $isoControl(2Dlowvalue) set isoControl_struct(2Dhighvalue) $isoControl(2Dhighvalue) set isoControl_struct(2Dnisoline) $isoControl(2Dnisoline) set isoControl_struct(isoline_color) $isoControl(isoline_color) set isoControl_struct(isoline_width) $isoControl(isoline_width) set isoControl_struct(isoline_monocolor) $isoControl(isoline_monocolor) set isoControl_struct(isoline_stipple) $isoControl(isoline_stipple) } xcrysden-1.6.2/Tcl/gifAnim.tcl0000644000175000017500000002554711720514424014670 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/gifAnim.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc gifAnimWidPack {frame can} { global gifAnim if { $gifAnim(button_text) == "Animated GIF/MPEG/AVI >>" } { pack $frame -side top -padx 0 -pady 2 set gifAnim(button_text) "<< Animated GIF/MPEG/AVI" set gifAnim(anim_ctrl_widgets) 1 if { [info exists gifAnim(radioframes,$frame)] } { # dirty hack set i 0 foreach rf $gifAnim(radioframes,$frame) { set gifAnim(radio_frame,$i) $rf incr i } } _mencoder_temporary_files } else { pack forget $frame set gifAnim(button_text) "Animated GIF/MPEG/AVI >>" set gifAnim(anim_ctrl_widgets) 0 } xcUpdateState } proc gifAnimMake {can {play_frame ""} {record_button ""} {outfile {}}} { global gifAnim xcMisc mesa_bg system if { $gifAnim(make_gifAnim) == 0 } { # -------------------------------------------------- # The "Start Recording Animation" button was pressed # # This means we start recording. Also change the label of the # button to "Stop Recording and Save" # -------------------------------------------------- set gifAnim(make_gifAnim) 1 set gifAnim(filelist) {} set gifAnim(nframe) 0 if { $play_frame != "" } { set gifAnim(make_text) "Stop Recording and Save" set gifAnim(play_frame_bg) [$play_frame cget -bg] set gifAnim(record_button_bg) [$record_button cget -bg] $play_frame configure -background \#ff4444 $record_button configure -background \#ff4444 $record_button configure -relief sunken } if { [info exists gifAnim(radio_frame,1)] } { if { [winfo exists $gifAnim(radio_frame,1)] } { # disable the radiobuttons xcDisableAll $gifAnim(radio_frame,0) $gifAnim(radio_frame,1) $gifAnim(radio_frame,2) $gifAnim(radio_frame,3) $gifAnim(radio_frame,4) } } } else { # -------------------------------------------------- # The "Stop Recording and Save" button was pressed # # This means we save the Animated-GIF/MPEG file. Also change the # label of the button to "Start Recording Animated-GIF/MPEG" # -------------------------------------------------- set gifAnim(make_gifAnim) 0 if { $play_frame != "" } { set gifAnim(make_text) "Start Recording Animation" $play_frame configure -background $gifAnim(play_frame_bg) $record_button configure -background $gifAnim(record_button_bg) $record_button configure -relief raised # enable the radiobuttons } if { [info exists gifAnim(radio_frame,1)] } { if { [winfo exists $gifAnim(radio_frame,1)] } { xcEnableAll $gifAnim(radio_frame,0) $gifAnim(radio_frame,1) $gifAnim(radio_frame,2) $gifAnim(radio_frame,3) $gifAnim(radio_frame,4) _mencoder_temporary_files gifAnim movie_format "" } } set first_frame [lindex $gifAnim(filelist) 0] set last_frame [lindex $gifAnim(filelist) end] set first {} set last {} if { $gifAnim(ntime_first_frame) > 1 } { for {set i 1} {$i < $gifAnim(ntime_first_frame)} {incr i} { append first "${first_frame} " } } if { $gifAnim(ntime_last_frame) > 1 } { for {set i 1} {$i < $gifAnim(ntime_last_frame)} {incr i} { append last "${last_frame} " } } set filelist [format "%s %s %s" $first $gifAnim(filelist) $last] if { $gifAnim(movie_format) == "gif" } { # -------------------------------------------------- # create Animated GIF # -------------------------------------------------- if { $outfile == "" } { set outfile [tk_getSaveFile -defaultextension .gif \ -filetypes { {{GIF File} {.gif}} {{All Files} {.*}} } \ -defaultextension .gif \ -initialdir $system(PWD) \ -title "Save Animated GIF File"] if { $outfile == "" } { return } } encode_gif $filelist $outfile } else { # -------------------------------------------------- # create AVI/MPEG # -------------------------------------------------- if { $outfile == "" } { set filetypes { {{AVI File} {.avi}} {{MPEG File} {.mpg .mpeg}} {{All Files} {.*}} } set defExt .avi if { $xcMisc(movie_encoder) == "ppmtompeg" } { set filetypes { {{MPEG File} {.mpg .mpeg}} {{All Files} {.*}} } set defExt .mpg } set outfile [tk_getSaveFile -defaultextension .mpg \ -filetypes $filetypes \ -defaultextension $defExt \ -initialdir $system(PWD) \ -title "Save AVI/MPEG File"] if { $outfile == "" } { return } } encode_movie $filelist $outfile } } } proc gifAnimPrintCurrent {can} { global gifAnim xcMisc mesa_bg system movieMaker if { $gifAnim(temp_files_dir) == "pwd" } { set dir $system(PWD) } else { set dir $system(SCRDIR) } if { [info exists movieMaker(mode)] && [info exists movieMaker(recording)] } { # movieMaker's everysnapshot and realtime does not use printing via this proc if { $movieMaker(mode) != "manual" && $movieMaker(recording) } { return } } set abs_head [file join $dir anim-[format "%04d" $gifAnim(nframe)]] set ext [string tolower $gifAnim(frame_files_format)] if { $gifAnim(movie_format) == "gif" } { set abs_file $abs_head.gif if { [info exists xcMisc(gif_encoder)] } { if { $xcMisc(gif_encoder) == "convert" } { # ImageMagick's convert can use whatever format set abs_file $abs_head.$ext } } append gifAnim(filelist) " $abs_file" } else { set abs_file $abs_head.$ext append gifAnim(filelist) " $abs_file" } incr gifAnim(nframe) # now update the display (maybe $can was obscured) scripting::printToFile $abs_file } proc gifAnim:editParam {comlin} { global gifAnim system set comlin [subst { # ------------------------------------------------------------------------ # You may edit the movie encoder command below (don't touch this comment) # ------------------------------------------------------------------------ $comlin }] if { $gifAnim(temp_files_dir) == "pwd" } { set dir $system(PWD) } else { set dir $system(SCRDIR) } set file [file join $dir encode.sh] WriteFile $file $comlin w xcEditFile $file foreground # drop the comments from the file set content {} foreach line [split [ReadFile -nonewline $file] \n] { if { ! [regexp {^#} [string trim $line]] } { if { $line != {} } { append content [format "%s\n" $line] } } } return $content } proc gifAnim_controlWidgets {parent can {slide_label ""}} { global gifAnim # groovy frames for checkbuttons+radiobuttons+entries set gifAnim(radioframes,$parent) "" foreach i { 0 1 2 3 4 5 } text { {Animated-GIF options:} {Movie format:} {Store temporary image frame files in:} {Format of temporary frame files:} {Movie options:} {Encoding:} } { set f($i) [labelframe $parent.$i -text $text -bd 2] pack $f($i) -side top -padx 3 -pady 5 -expand 1 -fill x set gifAnim(radio_frame,$i) $f($i) lappend gifAnim(radioframes,$parent) $f($i) } # checkbuttons foreach \ cb [list $f(0).cb1 $f(0).cb2 $f(0).cb3] \ elem [list gif_global_colormap gif_minimize gif_transp] \ onvalue "1 1 1" offvalue "0 0 0" \ text { "use global color-map" "minimize GIF file size" "make transparent background" } { checkbutton $cb -text $text -variable gifAnim($elem) \ -onvalue $onvalue -offvalue $offvalue -anchor w pack $cb -side top -padx 5 -pady 0 -expand 1 -fill x } # radiobuttons foreach \ rb [list $f(1).r1 $f(1).r2 $f(2).r1 $f(2).r2 $f(3).r1 $f(3).r2 $f(3).r3] \ pack {left left left left top top top} \ value {mpeg gif pwd tmp PPM PNG JPEG} \ elem { movie_format movie_format temp_files_dir temp_files_dir frame_files_format frame_files_format frame_files_format} \ text { "AVI/MPEG" "Animated-GIF" "current working directory" "scratch directory" "non-compressed PPM" "compressed PNG" "compressed JPEG" } { radiobutton $rb -text $text -variable gifAnim($elem) -value $value -anchor w pack $rb -side $pack -padx 5 -pady 0 -fill x -expand 1 } set gifAnim(radiobutton_movie_format_mpeg) $f(1).r1 set gifAnim(radiobutton_movie_format_gif) $f(1).r2 _mencoder_temporary_files gifAnim movie_format "" trace add variable gifAnim(movie_format) write _mencoder_temporary_files # entries FillEntries $f(4) { {Repeat first frame No. times:} {Repeat last frame No. times:} {Time delay between slides (1/100 sec):} {Loop animation number of times (0=forever):} } { gifAnim(ntime_first_frame) gifAnim(ntime_last_frame) gifAnim(delay) gifAnim(loop) } 38 8 checkbutton $f(5).cb -text "Edit flags or parameter-file before encoding" \ -variable gifAnim(edit_param) -onvalue 1 -offvalue 0 -anchor w pack $f(5).cb -side top -expand 1 -fill both -padx 5 -pady 2 } proc _mencoder_temporary_files {args} { global gifAnim xcMisc if { ![info exists xcMisc(movie_encoder)] && ![info exists xcMisc(gif_encoder)]} { return } if { ! [info exists xcMisc(movie_encoder)] } { set gifAnim(movie_format) "gif" catch { $gifAnim(radiobutton_movie_format_mpeg) config -state disabled } } elseif { ! [info exists xcMisc(gif_encoder)] } { set gifAnim(movie_format) "mpeg" catch { $gifAnim(radiobutton_movie_format_gif) config -state disabled } } if { $gifAnim(movie_format) == "mpeg" && $xcMisc(movie_encoder) == "mencoder" } { puts stderr ::::::::MPEG xcDisableAll $gifAnim(radio_frame,0) xcDisableOne $gifAnim(radio_frame,3).r1 set to_png 1 global movieMaker if { [info exists movieMaker(recording)] } { if { $movieMaker(recording) && $movieMaker(mode) != "manual" } { # for realtime and everysnapshot movie modes we don't convert to png on the fly set to_png 0 } } if { $gifAnim(frame_files_format) == "PPM" && $to_png } { set gifAnim(frame_files_format) PNG } } else { puts stderr ::::::::GIF xcEnableAll $gifAnim(radio_frame,0) xcEnableOne $gifAnim(radio_frame,3).r1 } } xcrysden-1.6.2/Tcl/undoAdvGeom.tcl0000644000175000017500000001300411712736221015511 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/undoAdvGeom.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc UndoMenuMotion {menu y} { global undoMenu set n [$menu index $y] # it may easily happen that $n is not an integer if [catch {expr abs($n)}] { return } for {set i 0} {$i < $n} {incr i} { $menu entryconfigure $i \ -foreground $undoMenu(active_fg) \ -background $undoMenu(active_bg) } set m [$menu yposition end] for {set i $n} {$i < $m} {incr i} { $menu entryconfigure $i \ -foreground $undoMenu(default_fg) \ -background $undoMenu(default_bg) } } proc Undo {menu redo index} { global undoAdvGeom set n $index set ld [expr $n - $undoAdvGeom(start_index)] set undoAdvGeom(redo_list) \ [GetUndoRedoList [lrange $undoAdvGeom(list) 0 $ld] \ $undoAdvGeom(redo_list)] $undoAdvGeom(menu) entryconfigure "Redo ..." -state normal set undoAdvGeom(list) [lrange $undoAdvGeom(list) [expr $ld + 1] end] if { $undoAdvGeom(list) == {} } { $undoAdvGeom(menu) entryconfigure "Undo ..." -state disabled } CreateUndoRedoMenu $undoAdvGeom(list) $menu $redo Undo \ undoAdvGeom(start_index) undoAdvGeom(current_index) CreateUndoRedoMenu $undoAdvGeom(redo_list) $redo $menu Redo \ undoAdvGeom(redo_start_index) undoAdvGeom(redo_current_index) # insert the real UNDO command here !!! xcAdvGeomState undo [expr $ld + 1] CalStru ### } proc GetUndoRedoList {listnew listold} { # # we must revert the order of newlist # set n [llength $listnew] set redo_list {} for {set i $n} {$i > 0} {incr i -1} { set ii [expr $i - 1] lappend redo_list [lindex $listnew $ii] } return [concat $redo_list $listold] } proc Redo {redo menu index} { global undoAdvGeom set n $index set ld [expr $n - $undoAdvGeom(redo_start_index)] set undoAdvGeom(list) \ [GetUndoRedoList [lrange $undoAdvGeom(redo_list) 0 $ld] \ $undoAdvGeom(list)] $undoAdvGeom(menu) entryconfigure "Undo ..." -state normal set undoAdvGeom(redo_list) \ [lrange $undoAdvGeom(redo_list) [expr $ld + 1] end] if { $undoAdvGeom(redo_list) == {} } { $undoAdvGeom(menu) entryconfigure "Redo ..." -state disabled } CreateUndoRedoMenu $undoAdvGeom(list) $menu $redo Undo \ undoAdvGeom(start_index) undoAdvGeom(current_index) CreateUndoRedoMenu $undoAdvGeom(redo_list) $redo $menu Redo \ undoAdvGeom(redo_start_index) undoAdvGeom(redo_current_index) # insert the real REDO command here !!! xcAdvGeomState new [expr $ld + 1] CalStru } proc GenCommUndoRedo item { global undoAdvGeom undoMenu $undoAdvGeom(menu) entryconfigure "Undo ..." -state normal ########################## #generate command HERE !!! #^^^^^^^^^^^^^^^^^^^^^^^^^ set item [list $item] set undo $undoMenu(undo) set redo $undoMenu(redo) #----------- set undoAdvGeom(list) [concat "$item" $undoAdvGeom(list)] CreateUndoRedoMenu $undoAdvGeom(list) $undo $redo Undo \ undoAdvGeom(start_index) undoAdvGeom(current_index) # delete redo-list $undoAdvGeom(menu) entryconfigure "Redo ..." -state disabled set undoAdvGeom(redo_list) {} $redo delete 0 end } proc CreateUndoRedoMenu {list menu1 menu2 command start_index current_index} { global undoMenu upvar #0 $start_index start $current_index current # first delete the whole list, then rebuilt $menu1 delete 0 end set start $current foreach item $list { $menu1 add command -label $item \ -command [list $command $menu1 $menu2 $current] \ -foreground $undoMenu(default_fg) \ -background $undoMenu(default_bg) \ -activeforeground $undoMenu(active_fg) \ -activebackground $undoMenu(active_bg) incr current } } proc ClearUndoRedoBuffer {} { global undoAdvGeom set undoAdvGeom(start_index) 0 set undoAdvGeom(current_index) 0 set undoAdvGeom(list) {} set undoAdvGeom(redo_start_index) 0 set undoAdvGeom(redo_current_index) 0 set undoAdvGeom(redo_list) {} } #set m [menubutton .advgeom -text AdvGeom -menu .advgeom.ur] # #set menu [menu .advgeom.ur -tearoff 0] # #$menu add cascade -label Undo -menu $menu.undo #$menu add cascade -label Redo -menu $menu.redo #$menu entryconfig Undo -state disabled #$menu entryconfig Redo -state disabled #set undoAdvGeom(menu) $menu # # #set undo [menu $menu.undo -tearoff 0] #set redo [menu $menu.redo -tearoff 0] #button .b -text "Generate Command" -command [list GenComm $undo $redo] #pack $m .b -side left # # #bind $undo [list UndoMenuMotion $undo @%y] #bind $redo [list UndoMenuMotion $redo @%y] # #flush stdout xcrysden-1.6.2/Tcl/runC95.tcl0000644000175000017500000002205212352551575014401 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/runC95.tcl # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# proc RunAndGetC95Output {command bg_how input_var} { global system set out $system(SCRDIR)/xc_output.$system(PID) if { ! [RunC95 $command $bg_how $input_var $out ] } { return 0 } return [ReadFile $out] } proc RunC95 {command bg_how input_var \ {output_file {}} {is_string {}} {dir {}}} { global system prop runC95 # command ... one of integrals, scf, scfdir, properties # # bg_how ... how to handle background execution: # $bg_how == {} | {message } | bg # {} ... calculation is fast; give no feed-back to the user # message . calculation can be long; display some message to # the user # bg ... calculation is probably very long; # just submit to the background and forget about it. # "{}" & "message" works via fileevent, whereas bg submit the # job to background and forget about it. # # input_var ... variable where input is stored # # output_file ... name of output file # # is_string ... check if $is_string appear in crystal95's output # this is just in any case set runC95(output) {} # # check if the $command is allowed command # set match 0 foreach com [list $system(c95_integrals) $system(c95_scf) \ $system(c95_scfdir) $system(c95_properties)] { if { $com == $command } { set match 1 } } if { ! $match } { tk_dialog [WidgetName] "ERROR" "ERROR: CRYSTAL-$system(c95_version)'s command \"${command}:\" not found, must be one of: $system(c95_integrals), $system(c95_scf), $system(c95_scfdir), $system(c95_properties)" error 0 OK return 0 } # # if dir is not defined, use default one # if { $dir == "" } { set dir $system(SCRDIR) } # # what is the output file ??? # if { $output_file == "" } { set output_file $system(SCRDIR)/xc_output.$system(PID) } set runC95(output_file) $output_file set inp $dir/xc_tmp.$system(PID) WriteFile $inp $input_var # # if the species is EXTERNAL # cxxManageExternal ####CD DIR####### # now go to dir # cd $dir xcDebug -stderr "Crystal Input:\n--------------\n$input_var" xcDebug "PWD = [pwd]" if { $bg_how != "bg" } { if { [lindex $bg_how 0] == "message" } { ################################################################### # calculation can take some time, it's needed to # give some feed back to the user. set oldgrab [grab current] set mw [DisplayUpdateWidget "Calculating" [lindex $bg_how 1]] catch { grab $mw } } # # change cursor to watch, to indicate that something is going on # SetWatchCursor # ================================ # run CRYSTAL in background mode # ================================ set runC95(command) $command set runC95(fileID) [open "| $command < $inp 2> /dev/null" r] fconfigure $runC95(fileID) -blocking 0 fileevent $runC95(fileID) readable C95FileEvent tkwait variable runC95(done) ResetCursor xcSwapBuffers if { [lindex $bg_how 0] == "message" } { destroy $mw if { $oldgrab != {} } { catch { grab $oldgrab } } } # # has an error occured during CRYSTAL execution # if { $runC95(error) == 1 } { #if [catch {exec $command < $inp > $output_file} err] #C95Error $command $output_file $err cd $system(SCRDIR) unset runC95 ResetCursor return 0 } else { # if CRYSTAL has exited nicely, it does not mean that an # error didn't occure; check for ERROR string (here # CRYSTAL06 and later seems aexception when keyword STOP # is used) set is_str 0 set is_err 0 set fileID [open $output_file r] foreach line [split [read $fileID] \n] { if { [string match "*ERROR \*\*\*\**" $line] } { # check for CRYSTAL06 line: "... STOP KEYWORD - EXECUTION STOPS" if { ($system(c95_version) == "06" || $system(c95_version) == "09" || $system(c95_version) == "14") \ && [string match "*STOP KEYWORD - EXECUTION STOPS*" $line] } { # OK, we don't have error continue } else { close $fileID C95Error cd $system(SCRDIR) unset runC95 ResetCursor return 0 } } if { $is_string != "" } { if [string match "*${is_string}*" $line] { set is_str 1 } } } if { $is_string != "" && $is_str == 0} { tk_dialog [WidgetName] "CRYSTAL ERROR" "ERROR: pattern \"$is_string\" not found in CRYSTAL-$system(c95_version)'s output; this may be bug in program - please report to author !!! \nCode: RunC95 -pattern not found-" error 0 OK close $fileID cd $system(SCRDIR) unset runC95 ResetCursor return 0 } close $fileID # t.k: zakaj skopira unit 34 ?????? if { $dir != $system(SCRDIR) } { # copy ftn34 to $system(SCRDIR) if [file exists $dir/$prop(file)34] { file copy -force $dir/$prop(file)34 $system(SCRDIR)/$prop(file)34 } } cd $system(SCRDIR) unset runC95 ResetCursor xcDebug "end of RunC95" return 1 } } } proc C95FileEvent {} { global runC95 if { ! [eof $runC95(fileID)] } { append runC95(output) [gets $runC95(fileID)]\n return } else { xcDebug "In C95FileEvent" set runC95(error) 0 if { [catch {close $runC95(fileID)}] } { xcDebug "In C95FileEvent: error while closing the process" set runC95(error) 1 } # # write $output to runC95(output_file) # set fileID [open $runC95(output_file) w] puts $fileID $runC95(output) flush $fileID close $fileID # # if we have an error display tk_dialog # if { $runC95(error) } { C95Error } set runC95(done) 1 } } proc C95Error {} { global c95error runC95 system set button [tk_dialog [WidgetName] ERROR \ "ERROR occured while executing CRYSTAL-$system(c95_version) command: $runC95(command)" \ error 0 OK Details] if { $button == 1} { set oldgrab [grab current] set t [xcToplevel [WidgetName] "CRYSTAL ERROR" "ERROR" \ . 100 100 1] catch { grab $t } set fileID [open $runC95(output_file) r] set output [read $fileID] close $fileID set text [DispText $t.f $output 80 35] set fric [lindex [$text yview] 1] $text yview moveto [expr 1.0 - $fric] $text config -state disabled proc C95ErrorCan {} { global c95error set c95error(done) 1 } set f2 [frame $t.f2 -height 10] pack $f2 -side bottom -before $t.f -fill x set close [button $f2.cl -text "Close" \ -command C95ErrorCan] pack $close -side left -expand 1 -ipadx 2 -ipady 2 -pady 10 tkwait variable c95error(done) unset c95error catch { grab release $t } destroy $t if { $oldgrab != "" } { catch { grab $oldgrab } } } } # # Purpose: driver proc for executing CRYSTAL for Advanced-Geom manipulations # proc RunC95_advGeom {input option error_text} { global system # cd to SCRATCH dir cd $system(SCRDIR) set output xc_output.$system(PID) cxxManageExternal if { [catch {exec $system(c95_integrals) < $input > $output} errMsg] } { # printing the "FORTRAN STOP" to stderr cause the error. Check !!! if { $errMsg != "FORTRAN STOP" } { # a real error occurred ErrorDialog "an error occured for option: $option. Please try Again !!!" $errMsg # delete last AdvGeom state xcAdvGeomState delete ResetCursor return 0 } } # if CRYSTAL has exited nicely, it does not mean that an error # didn't occure; check for ERROR (here CRYSTAL06 and later seems # an exception when keyword STOP is used) set file [ReadFile $output] foreach line [split $file \n] { if { [string match "*ERROR \*\*\*\**" $line] } { # check for CRYSTAL06 line: "... STOP KEYWORD - EXECUTION STOPS" if { ($system(c95_version) == "06" || $system(c95_version) == "09" || $system(c95_version) == "14") \ && [string match "*STOP KEYWORD - EXECUTION STOPS*" $line] } { # OK, we don't have error continue } else { ErrorDialogInfo "$error_text Please try Again !!!" $file # delete last AdvGeom state xcAdvGeomState delete ResetCursor return 0 } } } return 1 } xcrysden-1.6.2/Tcl/thermometer.tcl0000644000175000017500000001753311725625042015651 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/thermometer.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# set tc(GEOGRAPHIC) { { 0./255. 0./255. 204./255. 1.0 } { 150./255. 153./255. 255./255. 1.0 } { 192./255. 216./255. 255./255. 1.0 } { 0./255. 192./255. 3./255. 1.0 } { 103./255. 255./255. 51./255. 1.0 } { 206./255. 255./255. 51./255. 1.0 } { 255./255. 255./255. 124./255. 1.0 } { 223./255. 191./255. 143./255. 1.0 } { 157./255. 48./255. 152./255. 1.0 } { 255./255. 0./255. 255./255. 1.0 } { 255./255. 255./255. 255./255. 1.0 } } set tc(RAINBOW) { { 1.0 0.0 0.0 1.0 } { 1.0 1.0 0.0 1.0 } { 0.0 1.0 0.0 1.0 } { 0.0 1.0 1.0 1.0 } { 0.0 0.0 1.0 1.0 } { 0.97 0.0 1.0 1.0 } } set tc(RGB) { { 1.0 0.0 0.0 1.0 } { 0.0 1.0 0.0 1.0 } { 0.0 0.0 1.0 1.0 } } set tc(MONOCHROME) { { 0.1 0.1 0.1 1.0 } { 1.0 1.0 1.0 1.0 } }; set tc(BLUE-WHITE-RED) { {0.0 0.0 1.0 1.0} {0.6 0.6 1.0 1.0} {1.0 1.0 1.0 1.0} {1.0 0.6 0.6 1.0} {1.0 0.0 0.0 1.0} } set tc(BLACK-BROWN-WHITE) { {0.00 0.00 0.00 0.75} {0.48 0.14 0.02 0.75} {0.78 0.63 0.07 0.75} {1.00 1.00 1.00 0.75} } proc funcLinear {x} { return $x } proc funcLog {x} { return [expr log($x)] } proc funcExp {x} { return [expr exp($x)] } proc funcSqrt {x} { return [expr sqrt($x)] } proc funcPow2 {x} { return [expr $x*$x] } proc func3thRoot {x} { return [expr exp(log($x)/3.0)] } proc funcPow3 {x} { return [expr $x*$x*$x] } proc funcExp2 {x} { return [expr exp($x*$x)] } proc funcSqrtLog {x} { return [expr sqrt(log(exp($x)))] } proc thermometerSetIntv {termoVar scaleFunc colorBasis from to nstep} { global tc upvar #0 $termoVar termo if { $scaleFunc == "LINEAR" } { set function funcLinear set invFunction funcLinear } if { $scaleFunc == "LOG10" } { set function funcLog set invFunction funcExp } if { $scaleFunc == "SQRT" } { set function funcSqrt set invFunction funcPow2 } if { $scaleFunc == "3th-ROOT" } { set function func3thRoot set invFunction funcPow3 } if { $scaleFunc == "EXP(x)" } { set function funcExp set invFunction funcLog } if { $scaleFunc == "EXP(x^2)" } { set function funcExp2 set invFunction funcSqrtLog } set shift 0.0 if { ( \ $scaleFunc == "LOG10" || \ $scaleFunc == "SQRT" || \ $scaleFunc == "3th-ROOT" || \ $scaleFunc == "EXP(x^2)" ) && $from < 1.0e-7 } { set shift [expr -$from + 1.0e-7] set from 1.0e-7 set to [expr $shift + $to] } set min [$function $from] set max [$function $to] set range [expr $max - $min] # # first the basic intervals # set i 0 set N [llength $tc($colorBasis)] set N1 [expr $N - 1] set STEP [expr double($range) / double($N1)] set termo(STEP) $STEP foreach color $tc($colorBasis) { for {set j 0} {$j < 3} {incr j} { set termo(basic_col,$i,$j) [lindex $color $j] } set termo(basic_intv,$i) [expr double($i) * $STEP] incr i } # # now the actual intervals # set nstep1 [expr $nstep - 1] set step [expr double($range) / double($nstep1)] for {set i 0} {$i < $nstep} {incr i} { set termo(intv,$i) [expr double($i) * $step] set termo(tic,$i) [$invFunction \ [expr $min + $termo(intv,$i) - $shift]] } } proc thermometerWidget {w iplane labeltext font fmt colorbasis scalefunc from to nstep {toplevel 0}} { global tc ## IN/OUT: w name of the widget ## IN: iplane planes index (i.e. 1/2/3) ## IN: labeltext text of label ## IN: font display font-name ## IN: fmt format for the numeric-labels ## IN: colorbasis which colorbasis ## IN: from starting value ## IN: to ending value ## IN: nstep number of steps global $w upvar #0 $w termo if { $toplevel == 0 } { frame $w -relief solid -bd 2 -bg \#ffffff } else { xcToplevel $w "Thermometer: $iplane" "Thermometer: $iplane" } set frame_atrib "-bg \#ffffff -relief flat -bd 0" set con [eval frame $w.f $frame_atrib] pack $con -fill both -expand 1 set canvas [eval frame $con.f -bg \#ffffff -relief flat -bd 2] if { $font == {} } { set font fixed } label $con.l \ -text $labeltext \ -font $font \ -bg \#ffffff \ -relief solid \ -bd 2 pack $con.l -side top -fill y -padx 5 -pady 5 -expand 1 -ipadx 5 set fontsize [font actual $font -size] if { $fontsize < 0 } { set scale [tk scaling] set fontsize [expr round(abs($fontsize*$scale))] } # calculate the intervals thermometerSetIntv $w $scalefunc $colorbasis $from $to $nstep set N [llength $tc($colorbasis)] set N1 [expr $N - 1] # # now plot the Thermometer # set nstep1 [expr $nstep - 1] for {set i 0} {$i < $nstep} {incr i} { set value $termo(intv,$i) for {set j 0} {$j < $N1} {incr j} { set j1 [expr $j + 1] if { $value >= $termo(basic_intv,$j) && $value <= $termo(basic_intv,$j1) } { set f [expr ($value - $termo(basic_intv,$j)) / $termo(STEP)] for {set k 0} {$k < 3} {incr k} { set delta [expr \ $termo(basic_col,$j1,$k) - \ $termo(basic_col,$j,$k)] set col($i,$k) [expr \ $termo(basic_col,$j,$k) + $f * $delta] } set rgb($i) [format "\#%02x%02x%02x" \ [expr int($col($i,0)*255.0)] \ [expr int($col($i,1)*255.0)] \ [expr int($col($i,2)*255.0)] ] break } } if { ![info exists rgb($i)] } { # if we come here, the assign the "last" color set rgb($i) [format "\#%02x%02x%02x" \ [expr int($termo(basic_col,$N1,0)*255.0)] \ [expr int($termo(basic_col,$N1,1)*255.0)] \ [expr int($termo(basic_col,$N1,2)*255.0)] ] } set container [eval frame $canvas.f$i $frame_atrib] set cof [frame $container.c \ -width $fontsize \ -height $fontsize \ -background $rgb($i) \ -relief solid \ -bd 2] set text [format $fmt $termo(tic,$i)] set lab [eval label $container.l \ -text $text \ -justify left \ -font $font \ -width 10 \ -bg \#ffffff] pack $cof -padx 3 -pady 1 -side left -anchor e pack $lab -padx 3 -pady 1 -side left -fill x -anchor e pack $container -side top -fill x \ -padx 0 -pady 0 -ipadx 0 -ipady 0 -anchor e } pack $canvas -padx 5 -pady 5 -ipadx 2 -ipady 2 -anchor s -fill both if { $toplevel == 1 } { button $w.b -text "Print Thermo" \ -font $font -command [list dumpWindow $con] pack $w.b -side top -fill x -expand 1 } return $w } xcrysden-1.6.2/Tcl/modify.tcl0000644000175000017500000001214411712736221014574 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/modify.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# #=========================== # OPTION: NumCellDrawn #=========================== proc NumCellDrawn {} { global species nxdir nydir nzdir nxdirold nydirold nzdirold \ NumCellDrawn periodic XCState myParam if { $periodic(dim) == 0 } { return } #just in any case if { [info exists NumCellDrawn(done)] } { unset NumCellDrawn(done) } # this option is only for $species != molecule #if { $periodic(dim) == 0 } { # tk_dialog .nmdwarning "Warning" "WARNING:\"Number of Units Drawn\" \ # option can not be applied for MOLECULES/CLUSTERS !!!" \ # warning 0 OK # return #} # if $species is not defined (whan we are using viewer just for viewing) if { [info exist species] == 0 && [xcIsActive properties] == 0 } { return } if [winfo exists .ncd] { return } set t [xcToplevel .ncd "Modify Number of Units Drawn" "Modify" \ . 100 50 1] # some decorations set f1 [frame $t.f1 -relief groove -bd 2] pack $f1 -side top -padx 7 -pady 7 -ipadx 7 -ipady 7 -fill x set m [message $f1.msg -justify center -width 200 -text \ "Specify number of cells to be drawn for each dimension:"] pack $m -expand 1 -padx 5 -pady 5 if [info exists nxdir] {set nxdirold $nxdir} if [info exists nydir] {set nydirold $nydir} if [info exists nzdir] {set nzdirold $nzdir} puts stdout "nxdir,nydir,nzdir> $nxdir $nydir $nzdir" # display entries for specifying nxdir,nydir,nzdir if { $periodic(dim) == 3 } { if { [info exists myParam(CRYSTAL_MAXCELL)] } { set max $myParam(CRYSTAL_MAXCELL) } else { set max 10 } set dirs {x y z} } elseif { $periodic(dim) == 2 } { if { [info exists myParam(SLAB_MAXCELL)] } { set max $myParam(SLAB_MAXCELL) } else { set max 20 } set dirs {x y} } elseif { $periodic(dim) == 1 } { if { [info exists myParam(POLYMER_MAXCELL)] } { set max $myParam(POLYMER_MAXCELL) } else { set max 50 } set dirs x } set res [expr {int($max/10)}] foreach i $dirs { set sc [scale $f1.sc$i -from 1 -to $max \ -length 200 \ -variable n${i}dirold \ -orient horizontal \ -label "In [string toupper $i]-dir:" \ -tickinterval $res \ -digits 1 \ -resolution 1 \ -showvalue true \ -width 10] pack $sc -side top -fill x -expand 1 -padx 5 -pady 5 } set okf [frame $t.okf -relief sunken -bd 2] set ok [button $okf.ok -text OK -command [list NumCellDrawnOK $t]] set upd [button $t.upd -text Update \ -command [list NumCellDrawnOK $t update]] set can [button $t.can -text Cancel -command [list NumCellDrawnCan $t]] pack $okf -side left -expand 1 -padx 5m -pady 2m pack $upd -side left -expand 1 -padx 5m -pady 2m -ipadx 1m -ipady 1m pack $can -side left -expand 1 -padx 5m -pady 2m -ipadx 1m -ipady 1m pack $ok -padx 1m -pady 1m -ipadx 1m -ipady 1m } proc NumCellDrawnOK {t {update 0}} { global nxdir nydir nzdir nxdirold nydirold nzdirold \ species mode NumCellDrawn err system periodic # for $species == molecule it is inpossible to come here !!! # ndirx must be specified for POLYMERS, SLABS, CRYSTALS check_var {{nxdirold posint}} .ncd.f1.frame.entry1 # check_var return $err; if $err --> mistake -> RETURN if $err { return } if { $periodic(dim) > 1 } { check_var {{nydirold posint}} .ncd.f1.frame.entry2 } if $err { return } if { $periodic(dim) == 3 } { check_var {{nzdirold posint}} .ncd.f1.frame.entry3 } if $err { return } # if we come so far everything is good, update a structure if { $update == 0 } { destroy $t } # check for AdvGeom options; # in future this should be replaced with $periodic(dim) !!! if { [info exists AdvGeom(slab)] } { set nzdirold 0 } # if OK/UPDATE button was pressed, than set nxdir/nydir/nzdir values if { [info exists nxdirold] } { set nxdir $nxdirold } if { [info exists nydirold] } { set nydir $nydirold } if { [info exists nzdirold] } { set nzdir $nzdirold } GenGeomDisplay 1 } proc NumCellDrawnCan {t} { destroy $t return } xcrysden-1.6.2/Tcl/wigner.tcl0000644000175000017500000006013613531513715014606 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wigner.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc SetWignerSeitzInit {} { global periodic check ws if { $periodic(dim) < 3 } { return } if ![info exists periodic(igroup)] { return } if { $check(wigner) == 0 } { if ![info exists ws(not_config_yet)] { WignerSeitzInit } else { if $ws(not_config_yet) { WignerSeitzInit } } } set igroup $periodic(igroup) if { $igroup == 9 } { set igroup 8 } SetWignerSeitz $igroup } proc SetWignerSeitz nc { global ws wsc wsp ws_lfpos ws_npos set ws(c_type) $nc set ws(normal_pos_color) "#ef0000" set ws(selected_pos_color) "#33ff66" # # cage definitions: BEGIN # set CON13 0.3333333333333333 set CON23 0.6666666666666667 set pc 1 set ac 2 set bc 3 set cc 4 set fc 5 set ic 6 set rc 7 set hc 8 set rcc 9 set hcc 10 set rpcc 11 set ws_npos($pc) 8 set ws_npos($ac) 10 set ws_npos($bc) 10 set ws_npos($cc) 10 set ws_npos($ic) 9 set ws_npos($fc) 14 set ws_npos($hc) 12 set ws_npos($rc) 10 set ws_npos($hcc) 8 set ws_npos($rcc) 8 set ws_npos($rpcc) 8 set lpos($pc) { -0.341936 -0.270062 -0.748429 -0.614030 -0.589584 0.159244 -0.341936 0.673770 -0.418063 -0.614030 0.354248 0.489610 0.614030 -0.354248 -0.489610 0.341936 -0.673770 0.418063 0.614030 0.589584 -0.159244 0.341936 0.270062 0.748429 } set lpos($ac) { -0.341936 -0.270062 -0.748429 -0.481125 0.042093 -0.129410 -0.614030 -0.589584 0.159244 -0.341936 0.673770 -0.418063 -0.614030 0.354248 0.489610 0.614030 -0.354248 -0.489610 0.481125 -0.042093 0.129410 0.341936 -0.673770 0.418063 0.614030 0.589584 -0.159244 0.341936 0.270062 0.748429 } set lpos($bc) { -0.341936 -0.270062 -0.748429 0.003142 -0.471916 -0.165183 -0.614030 -0.589584 0.159244 -0.341936 0.673770 -0.418063 -0.003142 0.471916 0.165183 -0.614030 0.354248 0.489610 0.614030 -0.354248 -0.489610 0.341936 -0.673770 0.418063 0.614030 0.589584 -0.159244 0.341936 0.270062 0.748429 } set lpos($cc) { -0.341936 -0.270062 -0.748429 0.136047 0.159761 -0.453837 -0.614030 -0.589584 0.159244 -0.136047 -0.159761 0.453837 -0.341936 0.673770 -0.418063 -0.614030 0.354248 0.489610 0.614030 -0.354248 -0.489610 0.341936 -0.673770 0.418063 0.614030 0.589584 -0.159244 0.341936 0.270062 0.748429 } set lpos($fc) { -0.341936 -0.270062 -0.748429 0.136047 0.159761 -0.453837 -0.481125 0.042093 -0.129410 0.003142 -0.471916 -0.165183 -0.614030 -0.589584 0.159244 -0.136047 -0.159761 0.453837 -0.341936 0.673770 -0.418063 -0.003142 0.471916 0.165183 -0.614030 0.354248 0.489610 0.614030 -0.354248 -0.489610 0.481125 -0.042093 0.129410 0.341936 -0.673770 0.418063 0.614030 0.589584 -0.159244 0.341936 0.270062 0.748429 } set lpos($ic) { -0.341936 -0.270062 -0.748429 0.000000 0.000000 0.000000 -0.614030 -0.589584 0.159244 -0.341936 0.673770 -0.418063 -0.614030 0.354248 0.489610 0.614030 -0.354248 -0.489610 0.341936 -0.673770 0.418063 0.614030 0.589584 -0.159244 0.341936 0.270062 0.748429 } set lpos($hc) { -0.500000 -0.615661 -0.788011 0.500000 -0.080352 -0.571732 -0.500000 0.454958 -0.355452 -0.500000 -0.990268 0.139173 0.500000 -0.454958 0.355452 -0.500000 0.080352 0.571732 -1.500000 0.990268 -0.139173 -1.500000 0.615661 0.788011 1.500000 -0.615661 -0.788011 1.500000 -0.990268 0.139173 0.500000 0.990268 -0.139173 0.500000 0.615661 0.788011 } set lpos($hcc) { -0.500000 -0.615661 -0.788011 -0.500000 -0.990268 0.139173 -1.500000 0.990268 -0.139173 -1.500000 0.615661 0.788011 1.500000 -0.615661 -0.788011 1.500000 -0.990268 0.139173 0.500000 0.990268 -0.139173 0.500000 0.615661 0.788011 } set lpos($rc) { -0.500000 -0.615661 -0.788011 0.500000 -0.205220 -0.262670 -0.500000 0.205220 0.262670 -0.500000 -0.990268 0.139173 -1.500000 0.990268 -0.139173 -1.500000 0.615661 0.788011 1.500000 -0.615661 -0.788011 1.500000 -0.990268 0.139173 0.500000 0.990268 -0.139173 0.500000 0.615661 0.788011 } set lpos($rcc) { -0.500000 -0.615661 -0.788011 -0.500000 -0.990268 0.139173 -1.500000 0.990268 -0.139173 -1.500000 0.615661 0.788011 1.500000 -0.615661 -0.788011 1.500000 -0.990268 0.139173 0.500000 0.990268 -0.139173 0.500000 0.615661 0.788011 } set lpos($rpcc) { 0.212675 -0.368363 -2.412276 0.063295 -1.264331 -0.630444 -0.921512 0.441406 -0.977740 -1.070892 -0.454562 0.804092 1.070892 0.454562 -0.804092 0.921512 -0.441406 0.977740 -0.063295 1.264331 0.630444 -0.212675 0.368363 2.412276 } set ws_lfpos($pc) { 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } set ws_lfpos($ac) { 0.000000 0.000000 0.000000 0.000000 0.500000 0.500000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.500000 0.500000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } set ws_lfpos($bc) { 0.000000 0.000000 0.000000 0.500000 0.000000 0.500000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.500000 1.000000 0.500000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } set ws_lfpos($cc) { 0.000000 0.000000 0.000000 0.500000 0.500000 0.000000 0.000000 0.000000 1.000000 0.500000 0.500000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } set ws_lfpos($fc) { 0.000000 0.000000 0.000000 0.500000 0.500000 0.000000 0.000000 0.500000 0.500000 0.500000 0.000000 0.500000 0.000000 0.000000 1.000000 0.500000 0.500000 1.000000 0.000000 1.000000 0.000000 0.500000 1.000000 0.500000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.500000 0.500000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } set ws_lfpos($ic) { 0.000000 0.000000 0.000000 0.500000 0.500000 0.500000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } set ws_lfpos($hc) { 0.000000 0.000000 0.000000 0.666667 0.333333 0.000000 0.333333 0.666667 0.000000 0.000000 0.000000 1.000000 0.666667 0.333333 1.000000 0.333333 0.666667 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } set ws_lfpos($rc) { 0.000000 0.000000 0.000000 0.666667 0.333333 0.333333 0.333333 0.666667 0.666667 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 } # # cage definitions: END # # # Widgets building block # if [winfo exists .wgnset] { return } set t [xcToplevel .wgnset \ "Wigner-Seitz Cell" "Wigner-Seitz Sell" . 0 0 1] set f0 [frame $t.f0] set f1 [frame $t.f1] set f2 [frame $t.f2 -relief raised -bd 2] pack $f0 $f1 $f2 -side top -fill both proc SetWignerSeitz_Show {type f f1 f2 b1 b2} { global ws wsp wsc set ws(type) $type pack forget $f2 pack $f1 -in $f -side top -fill both $b1 configure -bd 3 $b2 configure -bd 1 } set ws(prim_b) [button $f0.prim \ -text "Wigner-Seitz settings\nfor primitive cell mode" \ -command [list SetWignerSeitz_Show \ prim $f1 $t.f1p $t.f1c $f0.prim $f0.conv] \ -highlightthickness 0 \ -bd 3] set ws(conv_b) [button $f0.conv \ -text "Wigner-Seitz settings\nfor conventional cell mode" \ -command [list SetWignerSeitz_Show \ conv $f1 $t.f1c $t.f1p $f0.conv $f0.prim] \ -highlightthickness 0 \ -bd 1] pack $ws(prim_b) $ws(conv_b) -side left -fill both set f1p [frame $t.f1p -relief raised -bd 2] set f1c [frame $t.f1c -relief raised -bd 2] pack $f1p -in $f1 -side top -fill both set can [button $f2.can -text "Cancel" \ -command [list SetWignerSeitz_Cancel $t]] set tst [button $f2.tst -text "Test It" \ -command [list SetWignerSeitz_OK test $t]] set ok [button $f2.ok -text "OK" \ -command [list SetWignerSeitz_OK OK $t]] pack $can $tst $ok -side left -expand 1 -padx 5 -pady 5 # # make widgets for primitive & conventional modes # if { ![info exists wsp(mode)] } { set wsp(mode) "every" } if { ![info exists wsc(mode)] } { set wsc(mode) "every" } foreach f [list [list $f1c wsc] [list $f1p wsp]] { set w [lindex $f 0] set varname [lindex $f 1] if { $varname == "wsp" } { if { $nc == $hc } { set nc $hcc } elseif { $nc == $rc } { set nc $rpcc } else { set nc $pc } } set pp $pc if { $nc == $hc || $nc == $hcc } { set pp $hcc } elseif { $nc == $rc } { set pp $rcc } elseif { $nc == $rpcc } { set pp $rpcc } set off 2.0 if { $nc == $hc || $nc == $rc || $nc == $hcc || $nc == $rpcc } { set off 4.0 } set off2 [expr $off / 2.0] puts stdout "$varname $nc" upvar #0 $varname var set f1l [frame $w.l -relief sunken -bd 2] set f1r [frame $w.r] pack $f1l $f1r -side left -fill both -padx 2m -pady 2m # # Canvas # set w 170 set h 170 set var(can) [canvas $f1l.c -width $w -height $h -bg "#ffffff"] pack $var(can) set rfw $w set rfh $h set Zmin 0.0 set Zmax 0.0 for {set i 0} {$i < $ws_npos($nc)} {incr i} { set pos($i,0) [lindex $lpos($nc) [expr $i * 3 + 0]] set pos($i,1) [lindex $lpos($nc) [expr $i * 3 + 1]] set pos($i,2) [lindex $lpos($nc) [expr $i * 3 + 2]] if { $pos($i,2) < $Zmin } { set Zmin $pos($i,2) } if { $pos($i,2) > $Zmax } { set Zmax $pos($i,2) } } set dZ [expr $Zmax - $Zmin] for {set i 0} {$i < $ws_npos($pp)} {incr i} { set p($i,0) [lindex $lpos($pp) [expr $i * 3 + 0]] set p($i,1) [lindex $lpos($pp) [expr $i * 3 + 1]] set p($i,2) [lindex $lpos($pp) [expr $i * 3 + 2]] set p($i,0) [expr ($p($i,0) + $off2) * $rfw / $off] set p($i,1) [expr ($off2 - $p($i,1)) * $rfh / $off] #puts stdout "$i $p($i,0) $p($i,1)" } $var(can) create polygon \ $p(1,0) $p(1,1) $p(3,0) $p(3,1) \ $p(7,0) $p(7,1) $p(5,0) $p(5,1) \ -fill {} -outline $ws(normal_pos_color) -width 3 -tags cagepoly $var(can) create polygon \ $p(3,0) $p(3,1) $p(2,0) $p(2,1) \ $p(6,0) $p(6,1) $p(7,0) $p(7,1) \ -fill {} -outline $ws(normal_pos_color) -width 3 -tags cagepoly $var(can) create polygon \ $p(4,0) $p(4,1) $p(5,0) $p(5,1) \ $p(7,0) $p(7,1) $p(6,0) $p(6,1) \ -fill {} -outline $ws(normal_pos_color) -width 3 -tags cagepoly $var(can) create line $p(0,0) $p(0,1) \ $p(1,0) $p(1,1) -fill $ws(normal_pos_color) \ -width 1 -arrow last -arrowshape {15 15 4} -tags cageline $var(can) create line $p(0,0) $p(0,1) \ $p(2,0) $p(2,1) -fill $ws(normal_pos_color) \ -width 1 -arrow last -arrowshape {15 15 4} -tags cageline $var(can) create line $p(0,0) $p(0,1) \ $p(4,0) $p(4,1) -fill $ws(normal_pos_color) \ -width 1 -arrow last -arrowshape {15 15 4} -tags cageline $var(can) create text [expr $p(4,0) + 8] $p(4,1) \ -text a -anchor w -tags text $var(can) create text $p(2,0) [expr $p(2,1) - 8] \ -text b -anchor s -tags text $var(can) create text [expr $p(1,0) - 11] $p(1,1) \ -text c -anchor e -tags text for {set i 0} {$i < $ws_npos($nc)} {incr i} { set pos($i,0) [expr ($pos($i,0) + $off2) * $rfw / $off] set pos($i,1) [expr ($off2 - $pos($i,1)) * $rfh / $off] set r [expr 4.0 + ($pos($i,2) - $Zmin) / $dZ * 3.0] $var(can) create oval \ [expr $pos($i,0) - $r] [expr $pos($i,1) - $r] \ [expr $pos($i,0) + $r] [expr $pos($i,1) + $r] \ -fill $ws(normal_pos_color) \ -outline $ws(normal_pos_color) -tags "cage pos p$i" #puts stdout "$i $pos($i,0) $pos($i,1)" } # # maybe Wigner-Seitz cell option was not configured yet; # and this is consistent with the default settings # the DEFAULT setting is: the 0 0 0 position selected # if { $ws(not_config_yet) } { set id [$var(can) find withtag p0] set var(sel,$id) 1 $var(can) itemconfigure $id -fill $ws(selected_pos_color) \ -outline $ws(selected_pos_color) } else { foreach id [$var(can) find withtag pos] { if [info exists var(sel,$id)] { if $var(sel,$id) { $var(can) itemconfigure $id \ -fill $ws(selected_pos_color) \ -outline $ws(selected_pos_color) } } } } $var(can) bind pos <1> [list SetWignerSeitz_BindCan %W %x %y] # # left frame:: radiobuttons, checkbuton & button # set f1rt [frame $f1r.t -relief groove -bd 2] pack $f1rt -side top -padx 2m -pady 0 radiobutton $f1r.rb0 \ -text "Display Wigner-Seitz cell on every node" \ -value "every" \ -variable ${varname}(mode) \ -command [list SetWignerSeitz_Radio $var(can)] \ -anchor w radiobutton $f1r.rb1 \ -text "Display Wigner-Seitz on selected node" \ -value "selected" \ -variable ${varname}(mode) \ -command [list SetWignerSeitz_Radio $var(can)] \ -anchor w set f1rf [frame $f1r.f] checkbutton $f1rf.ck \ -text "Transparent Wigner-Seitz cell" -anchor w \ -variable ws(transparent) proc SetWignerSeitz_ColorOK {type t} { global ws mody_col if { $type == "OK" } { set cID [xcModifyColorGetID] set ws(color) "#$mody_col($cID,hxred)$mody_col($cID,hxgreen)$mody_col($cID,hxblue)" } destroy $t } proc SetWignerSeitz_Color t { global ws set t [xcToplevel [WidgetName] \ "Set Wigner-Seitz Cell's Color" \ "Set Wigner-Seitz Cell's Color" $t 300 90 1] xcModifyColor $t "Set Wigner-Seitz Cell's Color:" \ $ws(color) \ groove left left 100 100 70 5 20 set ok [DefaultButton [WidgetName $t] -text "OK" \ -command [list SetWignerSeitz_ColorOK OK $t]] set can [button [WidgetName $t] -text "Cancel" \ -command [list SetWignerSeitz_ColorOK Cancel $t]] pack $ok $can -padx 10 -pady 10 -expand 1 } button $f1rf.b -text "Color" -command [list SetWignerSeitz_Color $t] pack $f1r.rb0 $f1r.rb1 -in $f1rt -side top -fill x -pady 10 pack $f1rf -side top -fill x -pady 10 pack $f1rf.ck $f1rf.b -side left -expand 1 } set ws(type) prim SetWignerSeitz_Radio $wsp(can) set ws(type) conv SetWignerSeitz_Radio $wsc(can) SetWignerSeitz_Show \ prim $f1 $t.f1p $t.f1c $f0.prim $f0.conv } proc SetWignerSeitz_Radio can { global ws wsp wsc if { $ws(type) == "prim" } { set mode $wsp(mode) set varname wsp } else { set mode $wsc(mode) set varname wsc } upvar #0 $varname var if { $mode == "every" } { # cageline foreach item [$can find withtag cageline] { set ${varname}(color,$item) [$can itemcget $item -fill] } foreach item [$can find withtag cagepoly] { set ${varname}(color,$item) [$can itemcget $item -outline] } foreach item [$can find withtag text] { set ${varname}(color,$item) [$can itemcget $item -fill] } foreach item [$can find withtag pos] { set ${varname}(color,$item) [$can itemcget $item -fill] } $can itemconfigure cageline -fill $ws(can_disable_color) $can itemconfigure cagepoly -outline $ws(can_disable_color) $can itemconfigure text -fill $ws(can_disable_color) $can itemconfigure pos -fill $ws(can_disable_color) \ -outline $ws(can_disable_color) } else { foreach item [$can find withtag cageline] { if [info exists var(color,$item)] { $can itemconfigure $item -fill $var(color,$item) } } foreach item [$can find withtag cagepoly] { if [info exists var(color,$item)] { $can itemconfigure $item -outline $var(color,$item) } } foreach item [$can find withtag text] { if [info exists var(color,$item)] { $can itemconfigure $item -fill $var(color,$item) } } foreach item [$can find withtag pos] { if [info exists var(color,$item)] { $can itemconfigure $item -fill $var(color,$item) \ -outline $var(color,$item) } } } } proc SetWignerSeitz_BindCan {can x y} { global ws wsp wsc if { $ws(type) == "prim" } { set mode $wsp(mode) set varname wsp } else { set mode $wsc(mode) set varname wsc } upvar #0 $varname var if { $mode == "every" } { return } set id [$can find closest $x $y] # did "find closest find the "pos" item or some other item ??? set find 0 foreach item [$can find withtag pos] { if { $id == $item } { set find 1 } } if !$find { return } if ![info exists var(sel,$id)] { set var(sel,$id) 0 } # # if position was unselected -> select it # if position was selected -> unselect it # if $var(sel,$id) { # UNSELECT $can itemconfigure $id -fill $ws(normal_pos_color) \ -outline $ws(normal_pos_color) set var(sel,$id) 0 } else { # SELECT $can itemconfigure $id -fill $ws(selected_pos_color) \ -outline $ws(selected_pos_color) set var(sel,$id) 1 } } proc SetWignerSeitz_OK {mode {t {}}} { global ws wsp wsc ws_lfpos ws_npos system radio check # # now Wigner_Seitz settings has been configured # set ws(not_config_yet) 0 proc GetWignerSeitz_NSel varname { upvar #0 $varname var set n 0 if ![winfo exists $var(can)] { return 0 } foreach item [$var(can) find withtag pos] { if [info exists var(sel,$item)] { if $var(sel,$item) { incr n } } } return $n } # # settings for PRIMITIVE cell mode # set render after if { $radio(cellmode) == "prim" } { set render now } if { [info exists wsp(mode)] && $wsp(mode) == "selected" } { if { [winfo exists $wsp(can)] } { set n [GetWignerSeitz_NSel wsp] set outID [open $system(SCRDIR)/xc_ndsfp.$system(PID) w] puts $outID "$n" for {set i 0} {$i < $ws_npos($ws(pc))} {incr i} { set id [$wsp(can) find withtag p$i] if $wsp(sel,$id) { puts $outID "\ [lindex $ws_lfpos($ws(pc)) [expr $i * 3 + 0]] \ [lindex $ws_lfpos($ws(pc)) [expr $i * 3 + 1]] \ [lindex $ws_lfpos($ws(pc)) [expr $i * 3 + 2]]" } } flush $outID close $outID } xc_wigner .mesa prim \ -nodesfile $system(SCRDIR)/xc_ndsfp.$system(PID) \ -transparency $ws(transparent) \ -color [rgb_h2f $ws(color)] \ -render $render } else { xc_wigner .mesa prim \ -transparency $ws(transparent) \ -color [rgb_h2f $ws(color)] \ -render $render } # # settings for CONVENTIONAL cell mode # set render after if { $radio(cellmode) == "conv" } { set render now } if { [info exists wsc(mode)] && $wsc(mode) == "selected" } { if { [winfo exists $wsp(can)] } { set n [GetWignerSeitz_NSel wsc] set outID [open $system(SCRDIR)/xc_ndsfc.$system(PID) w] puts $outID "$n" for {set i 0} {$i < $ws_npos($ws(c_type))} {incr i} { set id [$wsc(can) find withtag p$i] if $wsc(sel,$id) { puts $outID "\ [lindex $ws_lfpos($ws(c_type)) [expr $i * 3 + 0]] \ [lindex $ws_lfpos($ws(c_type)) [expr $i * 3 + 1]] \ [lindex $ws_lfpos($ws(c_type)) [expr $i * 3 + 2]]" } } flush $outID close $outID } xc_wigner .mesa conv \ -nodesfile $system(SCRDIR)/xc_ndsfc.$system(PID) \ -transparency $ws(transparent) \ -color [rgb_h2f $ws(color)] \ -render $render } else { xc_wigner .mesa conv \ -transparency $ws(transparent) \ -color [rgb_h2f $ws(color)] \ -render $render } if { $mode == "OK" } { if { [winfo exists $t] } { destroy $t } set check(wigner) 1 } } proc SetWignerSeitz_Cancel {{t {}}} { global check wsp ws xc_wigner .mesa clear set check(wigner) 0 # this is temporary solution # set ws(not_config_yet) 1 if { $t != {} } { CancelProc $t } } proc WignerSeitz {} { global ws wsp wsc periodic check system radio # # so far just for CRYSTALS # if { $periodic(dim) < 3 } { set check(wigner) 0 return } # # maybe we are in "Wigner-Seitz Settings" mode # if { [winfo exists .wgnset] } { if { $check(wigner) == 0 } { set check(wigner) 1 } else { set check(wigner) 0 } return } if { ![info exists ws(not_config_yet)] } { set ws(not_config_yet) 1 } if { $ws(not_config_yet) } { #WignerSeitzInit if $check(wigner) { # # INITIAL settings for PRIMITIVE cell mode # set wsp(mode) "selected" set outID [open $system(SCRDIR)/xc_ndsfp.$system(PID) w] puts $outID "1\n0.0 0.0 0.0" flush $outID close $outID set render after if { $radio(cellmode) == "prim" } { set render now } xc_wigner .mesa prim \ -nodesfile $system(SCRDIR)/xc_ndsfp.$system(PID) \ -transparency $ws(transparent) \ -color [rgb_h2f $ws(color)] \ -render $render # # INITIAL settings for CONVENTIONAL cell mode # set wsc(mode) "selected" set outID [open $system(SCRDIR)/xc_ndsfc.$system(PID) w] puts $outID "1\n0.0 0.0 0.0" flush $outID close $outID set render after if { $radio(cellmode) == "conv" } { set render now } xc_wigner .mesa conv \ -nodesfile $system(SCRDIR)/xc_ndsfc.$system(PID) \ -transparency $ws(transparent) \ -color [rgb_h2f $ws(color)] \ -render $render } } elseif $check(wigner) { SetWignerSeitz_OK test } if { !$check(wigner) } { SetWignerSeitz_Cancel } } proc WignerSeitzInit {} { global ws wsp wsc xcDebug "In WignerSeitzInit" set ws(pc) 1 set ws(ac) 2 set ws(bc) 3 set ws(cc) 4 set ws(fc) 5 set ws(ic) 6 set ws(rc) 7 set ws(hc) 8 set ws(rcc) 9 set ws(hcc) 10 set ws(rpcc) 11 set ws(normal_pos_color) "#ef0000" set ws(selected_pos_color) "#33ff66" set ws(can_disable_color) #eeeeee set ws(color) #55eeff set ws(transparent) 0 # # initialize wsx(sel,$i); 50 is more then enough # (there is never more then 50 atoms) for {set i 0} {$i < 50} {incr i} { set wsp(sel,$i) 0 set wsc(sel,$i) 0 } set ws(not_config_yet) 1 } xcrysden-1.6.2/Tcl/scriptingAtomicLabels.tcl0000644000175000017500000005445613513646621017610 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/scriptingAtomicLabels.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # ------------------------------------------------------------------------ #****c* Scripting/scripting::atomicLabels # # NAME # scripting::atomicLabels # # PURPOSE # This namespace provide the scripting interface for editing # atomic-labels (fonts, font-colors, label-texts). There are two # levels of atomic-labels, so-called, global and custom. The global # labels are kind of default labels with the text of atomic-symbols. # The global labels are all those atomic-labels, that were not yet # explicitly edited on per-atom basis. The custom labels are those # that were edited on per-atom basis. # # Atomic labels have two different font colors, so-called, # bright-color and dark-color. The bright font color is used for all # Lighting-On display modes, and for WireFrame-like Lighting Off # display modes. On the other hand the dark-color is used for # Lighting-Off BallStick and SpaceFill display modes. # # COMMANDS # -- scripting::atomicLabels::global # Edits the fonts and font-colors of global atomic labels. # # --scripting::atomicLabels::atomID # Edits the fonts, font-colors of custom atomic label on per-atom basis. # # -- scripting::atomicLabels::atomType # Edits the fonts, font-colors of custom atomic label on per-atom type basis. # # -- scripting::atomicLabels::render # Toggles the display of global or custom atomic labels # # -- scripting::atomicLabels::clear # Clears the custom label according to specified mode, which is either # all, atomID, or atomType. # # SOURCE namespace eval scripting::atomicLabels { variable atomicLabels # -------------------------------------------------- # atomicLabels array-variable has these elements # -------------------------------------------------- # # atomicLabels(global.font) # atomicLabels(global.brightcolor) # atomicLabels(global.darkcolor) # # atomicLabels(custom.label) # atomicLabels(custom.font) # atomicLabels(custom.brightcolor) # atomicLabels(custom.darkcolor) # # -------------------------------------------------- # in addition it also contains the following elements: # -------------------------------------------------- # # atomicLabels(atomID.*) # # where "*" resperesnt the same elements as for custom.* } #**** # ------------------------------------------------------------------------ proc scripting::atomicLabels::_loadDefaults {} { variable atomicLabels set atomicLabels(global.font) "" set atomicLabels(global.brightcolor) "" set atomicLabels(global.darkcolor) "" set atomicLabels(custom.label) "" set atomicLabels(custom.font) "" set atomicLabels(custom.brightcolor) "" set atomicLabels(custom.darkcolor) "" } # ------------------------------------------------------------------------ #****f* Scripting/scripting::atomicLabels::global # # NAME # scripting::atomicLabels::global # # USAGE # scripting::atomicLabels::global \ # -xfont font \ # -tkfont tkfontname \ # -brightcolor rgb \ # -darkcolor rgb # # PURPOSE # This proc edits the fonts (i.e. font-type and size) and font-colors # of global atomic labels. One can specify either XLFD font name, i.e., # those that look as: -*-itc bookman-demi-r-normal-*-13-*-*-*-*-*-*-*, or # Tk font name. The Tk font names are those created by the "font create ..." # Tk command. # # ARGUMENTS # args -- various configuration "-option value" pairs (see Options) # # OPTIONS # ------------------------------------------------------------------------ # OPTION ALLOWED-VALUES + DESCRIPTION # ------------------------------------------------------------------------ # -xfont xfontname --> X11's XLFD font name # # -tkfont tkfontname --> Tk font name, previously create by the # "font create ..." Tk command. If both -xfont # and -tkfont options are specified the value # of -tkfont option is taken/ # # -brightcolor rgb --> the red-green-blue specification of bright # font-color color (see scripting::atomicLabels # for the description) of bright and dark font # colors). Color can be specified either in # hexadecimal forms (i.e. #rrggbb) or as a list # of three floats in range [0,1] (i.e. # {0.5 0.5 0.5}). # # -darkcolor rgb --> the red-green-blue specification of dark # font-color color (see scripting::atomicLabels # for the description) of bright and dark font # colors). Color can be specified either in # hexadecimal forms (i.e. #rrggbb) or as a list # of three floats in range [0,1] (i.e. # {0.5 0.5 0.5}). # ------------------------------------------------------------------------ # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::atomicLabels::global \ # -xfont -*-itc bookman-demi-r-normal-*-13-*-*-*-*-*-*-* \ # -brightcolor #ffffff \ # -darkcolor #000000 # #**** # ------------------------------------------------------------------------ proc scripting::atomicLabels::global {args} { variable atomicLabels _parseOptions global $args xc_setfont .mesa \ $atomicLabels(global.font) \ $atomicLabels(global.brightcolor) \ $atomicLabels(global.darkcolor) } # ------------------------------------------------------------------------ #****f* Scripting/scripting::atomicLabels::atomID # # NAME # scripting::atomicLabels::atomID # # USAGE # scripting::atomicLabels::atomID atomID \ # -label string \ # -xfont xfont \ # -tkfont tkfontname \ # -brightcolor rgb \ # -darkcolor rgb # # PURPOSE # This proc edits a custom atomic label on per-atom (i.e. atomID) # basis. It is possible to edit the label-text, font (i.e. font-type # and size) and font-colors. One can specify either XLFD font name, # i.e., those that look as: # -*-itc bookman-demi-r-normal-*-13-*-*-*-*-*-*-*, or Tk font name. # The Tk font names are those created by the "font create ..." Tk # command. # # ARGUMENTS # atomID -- the ID (i.e. sequential number) of an atom # args -- various configuration "-option value" pairs (see Options) # # OPTIONS # ------------------------------------------------------------------------ # OPTION ALLOWED-VALUES + DESCRIPTION # ------------------------------------------------------------------------ # -label string --> the label-text # # -xfont xfontname --> X11's XLFD font name # # -tkfont tkfontname --> Tk font name, previously create by the # "font create ..." Tk command. If both -xfont # and -tkfont options are specified the value # of -tkfont option is taken/ # # -brightcolor rgb --> the red-green-blue specification of bright # font-color color (see scripting::atomicLabels # for the description) of bright and dark font # colors). Color can be specified either in # hexadecimal forms (i.e. #rrggbb) or as a list # of three floats in range [0,1] (i.e. # {0.5 0.5 0.5}). # # -darkcolor rgb --> the red-green-blue specification of dark # font-color color (see scripting::atomicLabels # for the description) of bright and dark font # colors). Color can be specified either in # hexadecimal forms (i.e. #rrggbb) or as a list # of three floats in range [0,1] (i.e. # {0.5 0.5 0.5}). # ------------------------------------------------------------------------ # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::atomicLabels::atomID 10 \ # -label "Fe(spin up)" # -xfont -*-itc bookman-demi-r-normal-*-13-*-*-*-*-*-*-* \ # -brightcolor #ffffff \ # -darkcolor #000000 # #**** # ------------------------------------------------------------------------ proc scripting::atomicLabels::atomID {atomID args} { variable atomicLabels _parseOptions atomID $args _checkAtomID atomID $atomID _mapCustomValues $atomID xc_setatomlabel .mesa $atomID \ $atomicLabels(atomID.$atomID.label) \ $atomicLabels(atomID.$atomID.font) \ $atomicLabels(atomID.$atomID.brightcolor) \ $atomicLabels(atomID.$atomID.darkcolor) } # ------------------------------------------------------------------------ #****f* Scripting/scripting::atomicLabels::atomType # # NAME # scripting::atomicLabels::atomType # # USAGE # scripting::atomicLabels::atomType atomType \ # -label string \ # -xfont xfont \ # -tkfont tkfontname \ # -brightcolor rgb \ # -darkcolor rgb # # PURPOSE # This proc edits a custom atomic labels on per-atom-type # (i.e. atomType) basis. It is possible to edit the label-texts, font # (i.e. font-type and size) and font-colors. One can specify either # XLFD font name, i.e., those that look as: # -*-itc bookman-demi-r-normal-*-13-*-*-*-*-*-*-*, or Tk font name. # The Tk font names are those created by the "font create ..." Tk # command. # # ARGUMENTS # atomType -- atomic-number or atomic-symbol # args -- various configuration "-option value" pairs (see Options) # # OPTIONS # ------------------------------------------------------------------------ # OPTION ALLOWED-VALUES + DESCRIPTION # ------------------------------------------------------------------------ # -label string --> the label-text # # -xfont xfontname --> X11's XLFD font name # # -tkfont tkfontname --> Tk font name, previously create by the # "font create ..." Tk command. If both -xfont # and -tkfont options are specified the value # of -tkfont option is taken/ # # -brightcolor rgb --> the red-green-blue specification of bright # font-color color (see scripting::atomicLabels # for the description) of bright and dark font # colors). Color can be specified either in # hexadecimal forms (i.e. #rrggbb) or as a list # of three floats in range [0,1] (i.e. # {0.5 0.5 0.5}). # # -darkcolor rgb --> the red-green-blue specification of dark # font-color color (see scripting::atomicLabels # for the description) of bright and dark font # colors). Color can be specified either in # hexadecimal forms (i.e. #rrggbb) or as a list # of three floats in range [0,1] (i.e. # {0.5 0.5 0.5}). # ------------------------------------------------------------------------ # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::atomicLabels::atomType Zn \ # -label "Fe(spin up)" # -xfont -*-itc bookman-demi-r-normal-*-13-*-*-*-*-*-*-* \ # -brightcolor #ffffff \ # -darkcolor #000000 # #**** # ------------------------------------------------------------------------ proc scripting::atomicLabels::atomType {atomType args} { variable atomicLabels ::global mody _parseOptions atomType $args set natoms [xc_getvalue $mody(GET_NATOMS)] set nat [_getAtomicNumber atomType $atomType] # search for all atomType atoms and update for {set id 1} {$id <= $natoms} {incr id} { if { [xc_getvalue $mody(GET_NAT) $id] == $nat } { _mapCustomValues $id xc_setatomlabel .mesa $id \ $atomicLabels(atomID.$id.label) \ $atomicLabels(atomID.$id.font) \ $atomicLabels(atomID.$id.brightcolor) \ $atomicLabels(atomID.$id.darkcolor) } } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::atomicLabels::render # # NAME # scripting::atomicLabels::render # # USAGE # scripting::atomicLabels::render global on|off # or # scripting::atomicLabels::render custom on|off # or # scripting::atomicLabels::render atomID id on|off # or # scripting::atomicLabels::render atomType type on|off # # SYNOPSIS # scripting::atomicLabels::render labelType args # # PURPOSE # This proc toggles the display of global or custom atomic labels. # # scripting::atomicLabels::render global -- toggles the display of all # global atomic labels # # scripting::atomicLabels::render custom -- toggles the display of all # custom atomic labels. # # scripting::atomicLabels::render atomID id -- toggles the display of # a particular atomic-label (i.e. that of id-th atom). The argument # "id" is the an atomic id, i.e., sequential number. # # scripting::atomicLabels::render atomType type -- toggles the display # of all labels of a give atomic-type. The argument "type" is either # atomic symbol or atomic number. # # ARGUMENTS # labelType -- must be one of globa, custom, atomID or atomType # args -- the rest of the arguments (depends on the labelType) # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::atomicLabels::render atomType Mg off # #**** # ------------------------------------------------------------------------ proc scripting::atomicLabels::render {labelType args} { variable atomicLabels ::global mody switch -exact -- $labelType { "global" { # usage: render global on|off set toggle [_toggleValue $args] xc_newvalue .mesa $mody(SET_GLOBALATOMLABEL_DO_DISPLAY) $toggle } "custom" { # usage: render custom on|off set antiToggle [_antiToggleValue $args] foreach id [xc_getvalue $mody(GET_ATOMLABEL_ALL_ID)] { xc_newvalue .mesa $mody(SET_DO_NOT_DISPLAY_ATOMLABEL) $id $antiToggle } } "atomID" { # usage: render atomID id on|off set id [lindex $args 0] set antiToggle [_antiToggleValue [lindex $args 1]] set natoms [xc_getvalue $mody(GET_NATOMS)] _checkAtomID render $id xc_newvalue .mesa $mody(SET_DO_NOT_DISPLAY_ATOMLABEL) $id $antiToggle } "atomType" { # usage: render atomType type on|off set nat [_getAtomicNumber render [lindex $args 0]] set antiToggle [_antiToggleValue [lindex $args 1]] set natoms [xc_getvalue $mody(GET_NATOMS)] for {set id 1} {$id <= $natoms} {incr id} { if { [xc_getvalue $mody(GET_NAT) $id] == $nat } { xc_newvalue .mesa $mody(SET_DO_NOT_DISPLAY_ATOMLABEL) $id $antiToggle } } } default { ErrorIn scripting::atomicLabels::render \ "wrong type of atomic label $labelType, must be global, custom, atomID, or atomType" return } } } proc scripting::atomicLabels::_toggleValue {toggle} { if { $toggle == "on" } { return 1 } elseif { $toggle == "off" } { return 0 } else { ErrorIn scripting::atomicLabels::render \ "wrong toggle value $toggle, must be \"on\" or \"off\"" return -code return } } proc scripting::atomicLabels::_antiToggleValue {toggle} { if { $toggle == "on" } { return 0 } elseif { $toggle == "off" } { return 1 } else { ErrorIn scripting::atomicLabels::render \ "wrong toggle value $toggle, must be \"on\" or \"off\"" return -code return } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::atomicLabels::clear # # NAME # scripting::atomicLabels::clear # # USAGE # scripting::atomicLabels::clear all # or # scripting::atomicLabels::clear atomID id # or # scripting::atomicLabels::clear atomType type # # SYNOPSIS # scripting::atomicLabels::clear mode args # # PURPOSE # This proc clears the custom label according to specified mode, which # is either all, atomID, or atomType. # # scripting::atomicLabels::clear all -- clears all custom labels, # meaning that all labels become global-labels # # scripting::atomicLabels::clear atomID id -- clears the custom label # of id-th atom. Its label become the global label # # scripting::atomicLabels::clear atomType type -- clears all custom # labels of a given atomic type. These labels become global labels. # # ARGUMENTS # mode -- must be one of all, atomID, or atomType # args -- either atom-ID or atom-Type for atomID or atomType, respectively # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::atomicLabels::clear atomType Mg # #**** # ------------------------------------------------------------------------ proc scripting::atomicLabels::clear {mode args} { ::global mody switch -exact -- $mode { "all" { # usage: clear all xc_clearatomlabel .mesa all } "atomID" { # usage: render atomID id on|off _checkAtomID render $args xc_clearatomlabel .mesa $args } "atomType" { # usage: render atomType type on|off set nat [_getAtomicNumber render $args] set natoms [xc_getvalue $mody(GET_NATOMS)] for {set id 1} {$id <= $natoms} {incr id} { if { [xc_getvalue $mody(GET_NAT) $id] == $nat } { xc_clearatomlabel .mesa $id } } } default { ErrorDialog "wrong mode \"$mode\" for scripting::atomicLabels::clear command, must be all, atomID, or atomType" return } } } # ------------------------------------------------------------------------ #****if* Scripting/scripting::atomicLabels::_parseOptions # # NAME # scripting::atomicLabels::_parseOptions # # USAGE # scripting::atomicLabels::_parseOptions ?-options value? ... # # PURPOSE # This proc is to parse the options of scripting::atomicLabels::**** # class of commands. For internal use only. # # ARGUMENTS # args -- the "-option value" pairs # # RETURN VALUE # Undefined. #**** # ------------------------------------------------------------------------ proc scripting::atomicLabels::_parseOptions {cmd args} { variable atomicLabels # # load default values # _loadDefaults set labelType $cmd switch -exact -- $labelType { "global" { set type global set allowed_options { -xfont -brightcolor -darkcolor } } "atomID" - "atomType" { set type custom set allowed_options { -label -xfont -brightcolor -darkcolor } } default { ErrorIn scripting::atomicLabels::_parseOptions \ "unknown labelType $labelType, must be global, atomID, or atomType" return -code return } } set xfont "" set tkfont "" set i 0 foreach option [lindex $args 0] { incr i if { $i%2 } { set tag $option } else { switch -glob -- $tag { "-label" { if { $type == "global" } { _unknownOption $cmd $tag $allowed_options return -code return } set label $option set atomicLabels($type.label) $option } "-xfont" { set xfont $option } "-tkfont" { set tkfont $option } "-brightcolor" - "-darkcolor" { set colortype [string trim $tag -] if { [string range $option 0 0] == "#"} { # color in hexadecimal #rrggbb form set atomicLabels($type.$colortype) [rgb_h2f $option] } else { # assuming color in float format, i.e. {1.0 0.5 0.3} set atomicLabels($type.$colortype) $option } } "-render" { switch -exact -- [string tolower $option] { yes - on - 1 { set atomicLabels($type.render) 1 } no - off - 0 { set atomicLabels($type.render) 0 } default { ErrorIn scripting::atomicLabels::$cmd \ "wrong value $option for -render option, must be on or off" return -code return } } } default { _unknownOption $cmd $tag $allowed_options return -code return } } } } if { $i%2 } { ErrorIn scripting::atomicLabels::$cmd \ "odd number of arguments for \"-option value\" pairs" return -code return } # TkFontname has priority over XFontname if { $tkfont != "" } { set atomicLabels($type.font) [xcTkFontName2XLFD $tkfont] } elseif { $xfont != "" } { set atomicLabels($type.font) $xfont } return 1 } proc scripting::atomicLabels::_mapCustomValues {atomID} { variable atomicLabels foreach elem {label font brightcolor darkcolor} { if { ! [info exists atomicLabels(atomID.$atomID.$elem)] \ || $atomicLabels(custom.$elem) != "" } { set atomicLabels(atomID.$atomID.$elem) $atomicLabels(custom.$elem) } } } proc scripting::atomicLabels::_unknownOption {where tag args} { ErrorIn scripting::atomicLabels::$where "unknown option $tag, must be obe of $args" } proc scripting::atomicLabels::_checkAtomID {where id} { ::global mody set natoms [xc_getvalue $mody(GET_NATOMS)] if { ! [string is integer $id] } { ErrorIn scripting::atomicLabels::$where "$id is not atomic ID" return -code return } if { $id < 1 || $id > $natoms} { ErrorIn scripting::atomicLabels::$where "atomic ID $id out of range, must be within [1,$natoms]" return -code return } return 1 } proc scripting::atomicLabels::_getAtomicNumber {where atomType} { set nat [Aname2Nat $atomType] if { ! [string is integer $nat] } { ErrorIn scripting::atomicLabels::$where "$atomType is not atomic symbol" return -code return } return $nat }xcrysden-1.6.2/Tcl/bxsfOpen.tcl0000644000175000017500000000267211712736221015076 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/bxsfOpen.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc bxsfOpenMenu {{can {}}} { global system set file [tk_getOpenFile -defaultextension .bxsf \ -filetypes { {{All Files} {.*} } {{BXSF XSF Files} {.bxsf} } {{GZipped BXSF Files} {.bxsf.gz}} {{XSF Files} {.xsf} } {{GZipped XSF Files} {.xsf.gz} } } \ -initialdir $system(PWD) \ -title "Open BXSF (i.e. Fermi Surface) File"] if { $file == "" } { return } genFSInit $file } xcrysden-1.6.2/Tcl/loadAttributes.tcl0000644000175000017500000001524113515524266016303 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/loadAttributes.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc xsfLoadAttributes {file} { global mody set elementcolor 0 set elementradius 0 set genericattr 0 foreach line [split [ReadFile $file] \n] { xcDebug -stderr "---> $elementradius ;;; $line" if { [llength $line] == 0 } { # an empty-line --> skip it continue } elseif { [regexp -- {^[a-zA-Z]a*} $line] } { set keyword [string trim $line { }]; # get rid of trailing white-spaces switch -glob -- $keyword { "ELEMENTCOL*" { set elementcolor 1 set elementradius 0 set genericattr 0 } "ELEMENTRAD*" { set elementcolor 0 set elementradius 1 set genericattr 0 } default { set elementcolor 0 set elementradius 0 set genericattr 1 set key [lindex $keyword 0] set values [lrange $keyword 1 end] xcDebug -stderr "----> generic option: $keyword $values" if { ! [info exists mody($key)] } { ErrorDialog "while parsing attribute file \"$file\", while reading string \"$keyword\"" } if { [catch {eval {xc_newvalue .mesa $mody($key)} $values} error ] } { ErrorDialog "while parsing attribute file \"$file\", while reading string \"$keyword\".\n\nError message: $error" } } } } else { if { $elementcolor } { if { [llength $line] != 4 } { ErrorDialog "should get 4 numbers (i.e. atomic-number r g b), but got: $line\nwhile reading attribute file: $file" return } xc_newvalue .mesa $mody(L_ATCOL_ONE) [lindex $line 0] \ [lindex $line 1] [lindex $line 2] [lindex $line 3] } elseif { $elementradius } { if { [llength $line] != 2 } { ErrorDialog "should get 2 numbers (i.e. atomic-number atomic-radius), but got: $line\nwhile reading attribute file: $file" return } xc_newvalue .mesa $mody(L_ATRAD_ONE) [lindex $line 0] \ [lindex $line 1] xc_newvalue .mesa $mody(L_RCOV_ONE) [lindex $line 0] \ [lindex $line 1] } } } } # ------------------------------------------------------------------------ # loads the attributes from a definition file such as # ~/.xcrysden/custom-definitions # ------------------------------------------------------------------------ proc defLoadAttributes {} { global mody atmRad atmCol # # load atmRad # foreach atmNum [array names atmRad] { if { $atmNum < 0 || $atmNum > 100 } { ErrorDialog "atomic number out of range. Check the atmRad array in the deifinition file" } foreach code [list $mody(L_ATRAD_ONE) $mody(L_RCOV_ONE)] { xcCatchEval \ [list xc_newvalue .mesa $code $atmNum $atmRad($atmNum)] \ "Can't change the atomic radius for atomic-number $atmNum. Check the definition of atmRad($atmNum) in the definition file." } } # # load atmCol # foreach atmNum [array names atmCol] { if { $atmNum < 0 || $atmNum > 100 } { ErrorDialog "atomic number out of range. Check the atmCol array in the deifinition file" } xcCatchEval \ [concat xc_newvalue .mesa $mody(L_ATCOL_ONE) $atmNum $atmCol($atmNum)] \ "Can't change the atomic color for atomic-number $atmNum. Check the definition of atmCol($atmNum) in the definition file." } # # load myParam # load_myParam } proc load_myParam {} { global myParam mody if { [info exists myParam] } { foreach _elem [array names myParam] { switch -exact -- $_elem { "ATRAD_SCALE" - "TESSELLATION" - "UNIBONDCOLOR" - "PERSPECTIVEFOVY" - "PERSPECTIVEFRONT" - "PERSPECTIVEBACK" - "BALLF" - "RODF" - "WFLINEWIDTH" - "PLLINEWIDTH" - "FRAMELINEWIDTH" - "OUTLINEWIDTH" - "WF3DLINEWIDTH" - "PLRADIUS" - "COV_SCALE" - "FRAMECOL" - "FRAMELINEWIDTH" - "FRAMERODF" - "BACKGROUND" { # myParam array element is OK !!! set elem L_$_elem xcCatchEval \ [list eval "xc_newvalue .mesa $mody($elem)" $myParam($_elem)] \ "Can't change the $_elem attribute. Check the definition of myParam($_elem) in the definition file." } "CRYSTAL_MAXCELL" - "SLAB_MAXCELL" - "POLYMER_MAXCELL" - "MPEG_ENCODE_PARAM_FILE" { continue } "ATOMIC_LABEL_FONT" - "ATOMIC_LABEL_BRIGHTCOLOR" - "ATOMIC_LABEL_DARKCOLOR" { global atomLabel if { ! [info exists myParam(ATOMIC_LABEL_BRIGHTCOLOR)] } { set myParam(ATOMIC_LABEL_BRIGHTCOLOR) [xc_getvalue .mesa $mody(GET_GLOBALATOMLABEL_BRIGHTCOLOR)] } if { ! [info exists myParam(ATOMIC_LABEL_DARKCOLOR)] } { set myParam(ATOMIC_LABEL_DARKCOLOR) [xc_getvalue .mesa $mody(GET_GLOBALATOMLABEL_DARKCOLOR)] } if { ! [info exists myParam(ATOMIC_LABEL_FONT)] } { set myParam(ATOMIC_LABEL_FONT) raster } set atomLabel(globalFont.brightColor) $myParam(ATOMIC_LABEL_BRIGHTCOLOR) set atomLabel(globalFont.darkColor) $myParam(ATOMIC_LABEL_DARKCOLOR) puts stderr "DEBUG> xc_setfont .mesa $myParam(ATOMIC_LABEL_FONT) \ $myParam(ATOMIC_LABEL_BRIGHTCOLOR) \ $myParam(ATOMIC_LABEL_DARKCOLOR)" xc_setfont .mesa $myParam(ATOMIC_LABEL_FONT) \ $myParam(ATOMIC_LABEL_BRIGHTCOLOR) \ $myParam(ATOMIC_LABEL_DARKCOLOR) } "FS_BACKGROUND" - "FS_CELLTYPE" - "FS_CROPBZ" - "FS_DISPLAYCELL" - "FS_CELLDISPLAYTYPE" - "FS_DRAWSTYLE" - "FS_TRANSPARENT" - "FS_SHADEMODEL" - "FS_INTERPOLATIONDEGREE" - "FS_FRONTFACE" - "FS_REVERTNORMALS" - "FS_WIRECELLCOLOR" - "FS_SOLIDCELLCOLOR" - "FS_ANTIALIAS" - "FS_DEPTHCUING" { # # Fermi-Surface customizations (do nothing) # DummyProc } default { # myParam array element is not recognized !!! ErrorDialog "syntax error in custom-definition file: myParam array element \"$_elem\" is not recognized. Check the deifinition file." } } } } } xcrysden-1.6.2/Tcl/xyz.tcl0000644000175000017500000000640613515342514014144 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/xyz.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc xyzOpen {{file {}} {can .mesa} {update 0}} { global system if { $file == {} } { # get-file set file [tk_getOpenFile -defaultextension .xyz \ -filetypes { {{XYZ Files} {.xyz} } {{All Files} {.*} } } -initialdir $system(PWD) \ -title "Open XYZ File"] if { $file == "" } { return } } else { if { ![file exists $file] } { ErrorDialog "File \"$file\" does not exist !!!" return } } reloadRegister $file XYZ UpdateWMTitle $file # uncompress the file is necessary set file [gunzipFile $file] set head [file rootname [file tail $file]] set xsfFile $system(SCRDIR)/$head.xsf # open the XYZ(read) and XSF(write) file set xyzID [open $file r] set xsfID [open $xsfFile w] # -------------------------------------------------- # first-pass read (estimate number of animsteps) # -------------------------------------------------- gets $xyzID line set natoms [lindex $line 0] if { ![string is integer $natoms] } { ErrorDialog "error parsing XYZ file: \"$file\" !!!" return } set nline 0 seek $xyzID 0 start while {[gets $xyzID line] > -1} { incr nline } # calculate number of animsteps set animsteps [expr {int($nline / ($natoms + 2))}] if { $animsteps > 1 } { puts $xsfID "ANIMSTEPS $animsteps" } # -------------------------------------------------- # second-pass read: write XSF file # -------------------------------------------------- seek $xyzID 0 start set iframe 0 while {[gets $xyzID line] > -1} { incr iframe if { [llength $line] == 0 } { # skip empty line continue } set natoms [lindex $line 0] if { ![string is integer $natoms] } { ErrorDialog "error parsing XYZ file: \"$file\" !!!" return } # read comment line gets $xyzID lin # read atoms if { $animsteps > 1} { puts $xsfID "ATOMS $iframe" } else { puts $xsfID "ATOMS" } for {set ia 0} {$ia < $natoms} {incr ia} { if {[gets $xyzID line] < 0} { ErrorDialog "error parsing XYZ file: \"$file\" !!!" return } puts $xsfID $line } } # close files close $xyzID close $xsfID # load the structure ... xsfOpenParsed $xsfFile $can $update } xcrysden-1.6.2/Tcl/toglZoom.tcl0000644000175000017500000000674013513646153015131 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/toglZoom.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc toglZoom {title togl} { global toglZoom if { ! [info exists toglZoom(counter)] } { set toglZoom(counter) 1 } else { incr toglZoom(counter) } if { ! [info exists toglZoom($togl)] } { set toglZoom($togl) 1.0 } if { ! [info exists toglZoom($togl,zoomStep)] } { set toglZoom($togl,zoomStep) 0.05 } if { ! [info exists toglZoom($togl,window)] } { set toglZoom($togl,window) .toglzoom$toglZoom(counter) } if { [winfo exists $toglZoom($togl,window)] } { return } set t [xcToplevel $toglZoom($togl,window) Zoom Zoom . 0 0 1] set f0 [frame $t.0 -class StressText] set l0 [label $f0.l -text $title] set f1 [frame $t.1] set f2 [frame $t.2] set f3 [frame $t.3] ############### # Zoom + Zoom - set zoom1 [button $f1.zoom1 -text "Zoom +"] set zoom2 [button $f1.zoom2 -text "Zoom -"] bind $zoom1 [list toglZoom:zoom $togl $zoom1 +] bind $zoom2 [list toglZoom:zoom $togl $zoom2 -] bind $zoom1 [list toglZoom:relB1] bind $zoom2 [list toglZoom:relB1] ###################### # SCALE for translationStep set sc [scale $f2.scale -from 0 -to 0.95 \ -length 200 \ -variable toglZoom($togl,zoomStep) \ -orient horizontal -label "Zoom Step:" -tickinterval 0.25 \ -digits 3 -resolution 0.05 -showvalue true \ -width 10] set close [button $f3.close -text Close \ -command [list CancelProc $t]] pack $f0 $l0 $f1 $f2 $f3 -side top -fill both -expand 1 -padx 10 -pady 10 pack $zoom1 $zoom2 -side left -expand 1 -fill both pack $sc -expand 1 -pady 10 pack $close -expand 1 } proc toglZoom:zoom {togl button sign} { global toglZoom if { $sign == "+" } { set zoom $toglZoom($togl,zoomStep) } else { set zoom [expr -1.0 * $toglZoom($togl,zoomStep)] } #--Sunken $button configure -relief sunken #-- set toglZoom(B1down) 1 while { $toglZoom(B1down) } { # a way-around of BUG #if { [string match $toglZoom($togl) "nan"] } { # set toglZoom($togl) 1.0 #} cry_toglzoom $togl $zoom update } #--Raised $button configure -relief raised return -code break } proc toglZoom:relB1 {} { global toglZoom set toglZoom(B1down) 0 } proc toglZoom:discreteZoom {togl sign} { global toglZoom if { $sign == "+" } { set zoom $toglZoom($togl,zoomStep) } else { set zoom [expr -1.0 * $toglZoom($togl,zoomStep)] } cry_toglzoom $togl $zoom update } xcrysden-1.6.2/Tcl/multiWid.tcl0000644000175000017500000001035311712736221015103 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/multiWid.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc MultiWidget {t args} { global multi_widget_list set i 0 set ic 0 set ib 0 set create_tplw 0 foreach option $args { incr i # odd cycles are tags, even options if { $i%2 } { set tag $option } else { switch -- $tag { "-create_tplw" {set create_tplw $option} "-tplw_args" {set tplw_args $option} "-testbutton" {set testbutton [expr $option - 1]} "-width" {set width $option} "-height" {set height $option} "-b_height" {set b_height $option} "-b_width" {set b_width $option} "-command" { foreach item $option { set b_text($ic) [lindex $item 0] set b_com($ic) [lindex $item 1] incr ic } } "-bottom_button" { foreach item $option { set botb_text($ib) [lindex $item 0] set botb_com($ib) [lindex $item 1] incr ib } } default { tk_dialog .mb_error Error \ "ERROR: Bad FillEntries configure option $tag" \ error 0 OK return 0 } } } } if { $i%2 } { tk_dialog .mb_error1 Error \ "ERROR: You called MultiWidget with an odd number of args !" \ error 0 OK return 0 } ######################################## # is it needed to create toplevel ????? if $create_tplw { set t [eval $tplw_args] } ######################################## set multi_widget_list(post) {} set mas [frame $t.mas] set top [frame $mas.top -highlightthickness 0] set bot [frame $mas.bot -relief raised -bd 3 \ -highlightthickness 0 ] if [info exists width] { $bot configure -width $width } if [info exists height] { $bot configure -height $height} set multi_widget_list(buttons) {} for {set i 0} {$i < $ic} {incr i} { set b($i) [button $top.b$i -text $b_text($i) \ -relief raised -bd 1 \ -highlightthickness 0 \ -command [list PostMultiWidget $bot $top.b$i $b_com($i)]] lappend multi_widget_list(buttons) $b($i) if [info exists b_height] { $b($i) config -height $b_height } if [info exists b_width] { $b($i) config -width $b_width } pack $b($i) -side left -expand 1 -fill both } pack $mas -padx 10 -pady 10 -fill both pack $top $bot -side top -fill both -padx 0 -pady 0 \ -ipadx 0 -ipady 0 -expand 1 # BOTTOM-BUTTONS # get toplevel window set tplw [winfo toplevel $t] for {set i 0} {$i < $ib} {incr i} { button $mas.b$i \ -relief raised -bd 3 \ -highlightthickness 0 \ -text $botb_text($i) \ -command [list eval $botb_com($i) $tplw] pack $mas.b$i -side left -expand 1 -fill both -ipady 2 } # test geometry of largest window PostMultiWidget $bot $top.b$testbutton $b_com($testbutton) test # default Posted widget is first one PostMultiWidget $bot $top.b0 $b_com(0) puts stdout $mas } proc PostMultiWidget {f b com_list {test {}}} { global multi_widget_list foreach but $multi_widget_list(buttons) { $but configure -bd 1 } $b configure -bd 3 xcDebug "PostMultiWidget:: $multi_widget_list(post)" foreach wid $multi_widget_list(post) { if [winfo exists $wid] { destroy $wid } } set multi_widget_list(post) {} if { $test == {} } { eval $com_list $f } else { eval $com_list $f $test } } xcrysden-1.6.2/Tcl/difIsoSurf.tcl0000644000175000017500000001630511712736221015365 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/difIsoSurf.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc DiffIsoSurf_Widget {{dim 3D}} { global prop dif_isosurf # if window already exist destroy it and create new one catch {destroy .isodif} set t [xcToplevel .isodif "Difference Maps" "Diff. Maps" . 100 50] set top [frame $t.top -relief raised -bd 2] frame $t.mid set left [frame $t.mid.left -relief raised -bd 2] set right [frame $t.mid.right -relief raised -bd 2] set bot [frame $t.bot -relief raised -bd 2] pack $top $t.mid $bot -side top -expand 1 -fill both pack $left $right -side left -expand 1 -fill both set l [label $top.l -text "Difference Map == Map A - Map B"] set ll [label $left.ll -text "Map A:" -relief ridge -bd 2] set lr [label $right.lr -text "Map B:" -relief ridge -bd 2] pack $l -padx 10 -pady 10 -expand 1 pack $ll $lr -side top -padx 10 -pady 5 -ipadx 20 -ipady 5 ######################################## # make everything that goes in LEFT FRAME frame $left.f1 -relief groove -bd 2 set cb [checkbutton $left.f1.cb -text "" -anchor w] $cb invoke $cb config -state disabled set l [label $left.f1.l -textvariable dif_isosurf(file_textvar_A) \ -relief flat -anchor w] pack $cb $l -side top -fill x -padx 5 -pady 5 frame $left.f2 -relief groove -bd 2 xcMenuEntry $left.f2 "Specify Property:" 30 \ dif_isosurf(prop_A) $prop(dif_prop3D_list) \ -labelwidth 16 pack $left.f1 $left.f2 -padx 2 -pady 10 -ipady 3 -fill x RadioButVarCmd $left "Density matrix to use:" \ dif_isosurf(denmat_A) DiffIsoSurf_LeftCmd \ top top 1 1 \ "SCF density matrix" \ "Density matrix as superposition of atomic densities" checkbutton $left.f.cb \ -text "Give new basis set/electron configuration" \ -variable prop(PATO_newbasis_A) \ -onvalue 1 \ -offvalue 0 \ -anchor e $left.f.cb config -state disabled pack $left.f.cb DiffIsoSurf_LeftCmd $dif_isosurf(denmat_A) ######################################## # make everything that goes in RIGHT FRAME frame $right.f1 -relief groove -bd 2 set cb [checkbutton $right.f1.cb \ -text "Load Crystal95's unit 9 from another file" \ -variable dif_isosurf(load_another_unit9) \ -onvalue 1 -offvalue 0 \ -command LoadAnotherUnit9 \ -anchor w] set l [label $right.f1.l -textvariable dif_isosurf(file_textvar_B) \ -relief flat -anchor w] pack $cb $l -side top -fill x -padx 5 -pady 5 frame $right.f2 -relief groove -bd 2 xcMenuEntry $right.f2 "Specify Property:" 30 \ dif_isosurf(prop_B) $prop(dif_prop3D_list) \ -labelwidth 16 pack $right.f1 $right.f2 -side top -padx 2 -pady 10 -ipady 3 -fill x RadioButVarCmd $right "Density matrix to use:" \ dif_isosurf(denmat_B) DiffIsoSurf_RightCmd \ top top 1 1 \ "SCF density matrix" \ "Density matrix as superposition of atomic densities" checkbutton $right.f.cb \ -text "Give new basis set/electron configuration" \ -variable prop(PATO_newbasis_B) \ -onvalue 1 \ -offvalue 0 \ -anchor e $right.f.cb config -state disabled pack $right.f.cb DiffIsoSurf_RightCmd $dif_isosurf(denmat_B) ######################################## # bottom frame set can [button $bot.can -text "Cancel" -command [list CancelProc $t]] set ok [button $bot.ok -text "OK" \ -command [list DiffIsoSurf_WidgetOK $t $dim]] pack $can $ok -side left -expand 1 -padx 10 -pady 10 } proc DiffIsoSurf_LeftCmd item { global prop if { $item == "SCF density matrix" } { #.isodif.mid.left.f.cb configure -state disabled set prop(PATO_newbasis_A) 0 } else { #.isodif.mid.left.f.cb configure -state normal } } proc DiffIsoSurf_RightCmd item { global prop if { $item == "SCF density matrix" } { #.isodif.mid.right.f.cb configure -state disabled set prop(PATO_newbasis_B) 0 } else { #.isodif.mid.right.f.cb configure -state normal } } proc LoadAnotherUnit9 {} { global dif_isosurf fileselect # if we turn off the "load another Crystal95's unit 9" if { $dif_isosurf(load_another_unit9) == 0 } { set dif_isosurf(file_textvar) "loaded UNIT 9:\nsame as in Map A" return } fileselect "Load another Crystal95's unit 9" # maybe CANCEL button was pressed if { $fileselect(path) == "" } { set dif_isosurf(file_textvar) "loaded UNIT 9:\nsame as in Map A" set dif_isosurf(load_another_unit9) 0 return } set dif_isosurf(file_textvar_B) "loaded Unit 9:\n$fileselect(path)" set dif_isosurf(unit9_B) $fileselect(path) } proc DiffIsoSurf_WidgetOK {t {dim 3D}} { global prop dif_isosurf system set match_A 0 set match_B 0 foreach item $prop(dif_prop3D_list) { if { $item == [string toupper $dif_isosurf(prop_A)] } { set match_A 1 } if { $item == [string toupper $dif_isosurf(prop_B)] } { set match_B 1 } } # replace {,} with " in prop(dif_prop3D_lis) and write to $p_list regsub -all -- \{ $prop(dif_prop3D_list) \" p_list regsub -all -- \} $p_list \" p_list if { $match_A == 0 } { tk_dialog [WidgetName] ERROR "ERROR: unknown property_A \"$dif_isosurf(prop_A)\", should be of $p_list" error 0 OK focus .isodif.mid.left.f2.e return } if { $match_B == 0 } { tk_dialog [WidgetName] ERROR "ERROR: unknown property_B \"$dif_isosurf(prop_A)\", should be of $p_list" error 0 OK focus .isodif.mid.right.f2.e return } # we come so far, so everything is OK set dif_isosurf(prop_A) [string toupper $dif_isosurf(prop_A)] set dif_isosurf(prop_B) [string toupper $dif_isosurf(prop_B)] if [winfo exist $t] {destroy $t} # now map from $dif_isosurf(prop_X) to {ECHG ECHD POTM} set propA [C95Name2Com $dif_isosurf(prop_A)] set propB [C95Name2Com $dif_isosurf(prop_B)] # now space-selection must be specefied SetIsoGridSpace "Difference 3D Map - Grid Specifications" "Grid" \ [list $propA $propB] $dim } proc C95Name2Com name { # thiw proc map from property-name to C95's propertiy-command if { $name == "CHARGE DENSITY" } { return ECHG\n0 } elseif { $name == "CHARGE DENSITY GRADIENT" } { return ECHG\n1 } elseif { $name == "ELECTROSTATIC POTENTIAL" } { return POTM } return 0 } xcrysden-1.6.2/Tcl/scriptingFilter.tcl0000644000175000017500000004641313515364502016465 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/scriptingFilter.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # ------------------------------------------------------------------------ #****c* Scripting/scripting::filter # # NAME # scripting::filter # # PURPOSE # This namespace provide the filter functions for loading crystal # (molecular) structures from various formats. The filter functions # are similar to "scripting::open --format file.format". However for # some formats using the latter form will query interactively some # parameters, for instance, atomic numbers are usually not known in # I/O files of pseudopotential-codes and are therefore # queried. Instead by using the filter functions, the necessary # information is supplied in function call, thus avoiding interactive # querying. This makes the filter functions suitable for use in # scripts. For example, if one wants to make 100 figures, the 100 # interactive queries would be very cumbersome, therefore one can use # the filter functions instead. # # COMMANDS # # scripting::filter::g98cube -- loads the Gaussian98 CUBE file # scripting::filter::crystalInput -- loads the CRYSTAL input file # scripting::filter::pwscfInput -- loads the PWSCF input file # scripting::filter::pwscfOutput -- loads the PWSCF output file # scripting::filter::fhiInpini -- loads the FHI98MD inp.ini file # scripting::filter::fhiCoord -- loads the FHI98MD coord.out file # #**** # ------------------------------------------------------------------------ namespace eval scripting::filter {} # ------------------------------------------------------------------------ #****f* Scripting/scripting::filter::g98cube # # NAME # scripting::filter::gXXcube # # USAGE # scripting::filter::gXXcube cube_file mo_index # # PURPOSE # This proc is used in XCRYSDEN scripts to display a particular # molecular orbital (MO) from Gaussian cube-file by specifying the # "mo_index", which is the ID of the MO as specified in the Gaussian # cube-file. Using instead the "scripting::open --gXX_cube cube_file" # proc will result in querying the mo_index. Hence this proc differs # from "scripting::open --gXX_cube cube_file" in that the mo_index is # already specified explicitly and is therefore not queried. # # ARGUMENTS # cube_file -- name of Gaussian cube file. # mo_index -- which Molecular Orbital to display # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::filter::gXXcube molecular_orbitals.cube 11 #**** # ------------------------------------------------------------------------ proc scripting::filter::gXXcube {cube_file mo_index} { uplevel { scripting::filter::g98cube $cube_file $mo_index } } proc scripting::filter::g98cube {cube_file mo_index} { global g98 set cube_file [_init $cube_file] set files [g98Cube:cube2xsf $cube_file] set mo_file mo-[format %3.3d $mo_index].xsf set ind [lsearch $files $mo_file] if { $ind == -1 } { ErrorDialog "molecular orbital with index $mo_index does not exist in cube file: $cube_file" exit } set mo_file [lindex $files $ind] xsfOpen $g98(cube_dir)/$mo_file .mesa } # ------------------------------------------------------------------------ #****f* Scripting/scripting::filter::crystalInput # # NAME # scripting::filter::crystalInput # # USAGE # scripting::filter::crystalInput crystalInput_file # # PURPOSE # This proc is used in XCRYSDEN scripts to display a the structure # from the CRYSTAL input file. Using instead the "scripting::open # --crystal_inp file" call will result in interactive query of some # action. Instead this proc immediately displays the structure and the # interactive query is turned off. # # ARGUMENTS # crystalInput_file -- name of CRYSTAL input file. # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::filter::crystalInput urea.c98 #**** # ------------------------------------------------------------------------ proc scripting::filter::crystalInput {crystalInput_file} { global crystalInput set crystalInput_file [_init $crystalInput_file] OpenCyrstalInput $crystalInput_file if { [xcIsActive c95] } { CalStru foreach t $crystalInput(two_toplevels) { destroy $t } } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::filter::pwscfInput # # NAME # scripting::filter::pwscfInput -- Filter for PWscf-Input files # # USAGE # scripting::filter::pwscfInput pwscfInput_file reduce ?itypNatList? # # PURPOSE # This proc is used in XCRYSDEN scripts to display crystal structure # from PWSCF input file. It is similar to "scripting::open --pw_inp # file" call. The latter call will result in querying the atomic # numbers for PWscf version < 1.3, while this information is supplied # in the function call by itypNatList argument. One can also specify a # possible reduction of the structure dimensionality. For example, if # the structure is a molecule, then one can get rid of 3D unit cell, # by reducing the dimensionality to 0D. # # ARGUMENTS # pwscfInput_file -- name of PWSCF input file. # reduce -- reduce dimenionality to "reduce"-D. # itypNatList -- used for PWSCF < 1.2 only. # PWSCF's ityp --> atomic-number (i.e. nat) mapping list. # The format of the list is the following: # {ityp1 nat1 ityp2 nat2 ...} # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::filter::pwscfInput water.inp 0 {1 8 2 1} ; # for PWSCF < 1.2 # scripting::filter::pwscfInput water.inp 0 ; # for PWSCF >= 1.2 #**** # ------------------------------------------------------------------------ proc scripting::filter::pwscfInput {pwscfInput_file reduce {itypNatList {}}} { global system xcMisc # the structure of itypNatList is the following: # ---------------------------------------------- # set itypNatList [list ityp1 nat1 ityp2 nat2] # standard PWSCF pre-setting set pwscfInput_file [_absoluteFilename $pwscfInput_file] _pwscfInputCheckItypNatList $pwscfInput_file $itypNatList _pwscf scripting::filter::pwscfInput $pwscfInput_file $reduce $itypNatList # reload-capable reloadRegister $pwscfInput_file openExtStruct:reload # load the structure openExtStruct 3 crystal external \ [list sh $system(TOPDIR)/scripts/pwi2xsf.sh] \ $system(SCRDIR)/pwi2xsf.xsf_out \ {PWSCF Input File} \ ANGS \ -file $pwscfInput_file } # ------------------------------------------------------------------------ #****f* Scripting/scripting::filter::pwscfOutput # # NAME # scripting::filter::pwscfOutput -- Filter for PWscf-Output files # # USAGE # scripting::filter::pwscfOutput option pwscfOutput_file reduce ?itypNatList? # # PURPOSE # This proc is used in XCRYSDEN scripts to display crystal structure # from PWSCF output file. It is similar to "scripting::open --pw_out # file" call. The latter call will result in querying the atomic # numbers, ... Contrary, this information is supplied in the function # call by itypNatList argument (used only for PWSCF outputs < # 1.2). One can also specify possible reduction of the structure # dimensionality. For example, if the structure is a molecule, then # one can get rid of 3D unit cell, by reducing the dimensionality to # 0D. Since PWSCF output file may contains several structures, one # should specify which one to display using the option argument. # # ARGUMENTS # option -- which structure to render. Possibilities: # --initcoor or -ic ... render initial structure # --latestcoor or -lc ... latest structure in the file # --optcoor or -oc ... optimized structure # --animxsf or -a ... extract all structure (animation) # pwscfOutput_file -- name of PWSCF output file # reduce -- reduce dimenionality to "reduce"-D # itypNatList -- used for PWSCF < 1.2 only. # PWSCF's ityp --> atomic-number (i.e. nat) mapping list. # The format of the list is the following: # {ityp1 nat1 ityp2 nat2 ...} # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::filter::pwscfOutput --optcoor water.out 0 {1 8 2 1} ; # for PWSCF < 1.2 # scripting::filter::pwscfOutput --optcoor water.out 0 ; # for PWSCF >= 1.2 # #**** # ------------------------------------------------------------------------ proc scripting::filter::pwscfOutput {option pwscfOutput_file reduce {itypNatList {}}} { global system xcMisc pw # the structure of itypNatList is the following: # set itypNatList [list ityp1 nat1 ityp2 nat2] # standard PWSCF pre-setting set pwscfOutput_file [_absoluteFilename $pwscfOutput_file] _pwscfOutputCheckItypNatList $pwscfOutput_file $itypNatList _pwscf scripting::filter::pwscfOutput $pwscfOutput_file $reduce $itypNatList # reload-capable global openExtStruct set openExtStruct(state) external set openExtStruct(program) [list sh $system(TOPDIR)/scripts/dummy.sh] set openExtStruct(program_output) pwo2xsf.xsf reloadRegister $pwscfOutput_file openExtStruct:reload # load the structure switch -exact -- $option { --inicoor - -ic - --optcoor - -oc - --latestcoor - -lc - --animxsf - -a { set pw(output_flag) $option } default { ErrorDialog "wrong option $option, must be one of --initcor, --latestcoor, --optcoor, or --animxsf" exit } } pwOutputPresetWhat dummy $pwscfOutput_file set xsf [ReadFile $system(SCRDIR)/pwo2xsf.xsf] xsfOpenParsed $system(SCRDIR)/pwo2xsf.xsf .mesa } proc scripting::filter::_pwscf {procname file reduce itypNatList} { global system # the structure of itypNatList is the following: # set itypNatList [list ityp1 nat1 ityp2 nat2] set len [_pp_common $procname $file $reduce $itypNatList] if { $itypNatList != "" } { # write the nuclei.charges file set out "[expr $len / 2]\n" foreach {ityp nat} $itypNatList { append out "$ityp $nat\n" } } else { # workaround for PWscf version 1.2 set out 0 } evalInScratch {WriteFile nuclei.charges $out w} } # ------------------------------------------------------------------------ # scripting::filter::_pwscfInputCheckItypNatList -- # # Check the PWscf Input-file if the itypNatList argument is # necessary !!! # ------------------------------------------------------------------------ proc scripting::filter::_pwscfInputCheckItypNatList {file itypNatList} { set ntyp 0 set is_new_input 0 set is_old_input 0 foreach line [split [ReadFile $file] \n] { foreach field [split $line ,] { if { [string match -nocase *ntyp* $field] } { set ntyp [lindex [split $field =] 1] break } } if { [string match -nocase *&input* $line] } { set is_old_input 1 } if { [string match -nocase *&system* $line] } { set is_new_input 1 } } puts stderr "File = file" if { $ntyp == 0 || (!$is_new_input && !$is_old_input) } { # the file is not PW-input file ErrorDialog "file \"$file\" is not a PWSCF Input file !!!\n\nTrace:\nntyp=$ntyp\nis_new_input=$is_new_input\nis_old_input=$is_old_input\n\nApplication will Exit." exit 1 } if { $is_old_input && $itypNatList == "" } { ErrorDialog "please specify itypNatList argument for PWscf Input file < 1.3 !!!\n\nApplication will Exit." exit 1 } } # ------------------------------------------------------------------------ # scripting::filter::_pwscfOutputCheckItypNatList -- # # Check the PWscf Output-file if the itypNatList argument is # necessary !!! # ------------------------------------------------------------------------ proc scripting::filter::_pwscfOutputCheckItypNatList {file itypNatList} { set version 0.0 set fid [open $file r] while { ! [eof $fid] } { gets $fid line if { [string match "* Program PWSCF *" $line] } { # # get the PWscf version of the output # set ver [split [string trimleft [lindex $line 2] {v.}] .] set version [lindex $ver 0].[lindex $ver 1] if { [llength $ver] == 3 } { append version [lindex $ver 2] } break } } close $fid if { $version < 1.2 && $itypNatList == "" } { ErrorDialog "please specify itypNatList argument for PWscf Output file < 1.3 !!!\n\nApplication will Exit." exit 1 } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::filter::fhiInpini # # NAME # scripting::filter::fhiInpini # # USAGE # scripting::filter::fhiInpini fhiInpini_file reduce itypNatList # # PURPOSE # This proc is used in XCRYSDEN scripts to display crystal structure # from FHI98MD inp.ini file. It is similar to "scripting::open # --fhi_inpini file" call. The latter call will result in querying the # atomic numbers. Contrary, this information is supplied in function # call of the scripting::filter::fhiInpini. Also one can specify # possible reduction of the structure dimensionality. For example, if # the structure is a molecule, then one can get rid of 3D unit cell, # by reducing the dimensionality to 0D. # # ARGUMENTS # fhiInpini_file -- name of FHI98MD input file. # reduce -- reduce dimenionality to "reduce"-D # itypNatList -- FHI98MD's atomic-name --> atomic-number (i.e. nat) # mapping list. The format of the list is the following: # {name1 nat1 name2 nat2 ...} # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::filter::fhiInpini inp.ini 0 {oxygen 8 hydrogen 1} #**** # ------------------------------------------------------------------------ proc scripting::filter::fhiInpini {fhiInpini_file reduce nameNatList} { global system # the structure of nameNatList is the following: # set nameNatList [list name1 nat1 name2 nat2] set fhiInpini_file [_absoluteFilename $fhiInpini_file] _fhi scripting::filter::fhiInpini $fhiInpini_file $reduce $nameNatList # reload-capable reloadRegister $fhiInpini_file openExtStruct:reload openExtStruct 3 crystal external34 \ $system(BINDIR)/fhi_inpini2ftn34 \ $system(ftn_name).34 {FHI98MD "ini.inp"} \ BOHR \ -file $fhiInpini_file } # ------------------------------------------------------------------------ #****f* Scripting/scripting::filter::fhiCoord # # NAME # scripting::filter::fhiCoord # # USAGE # scripting::filter::fhiCoord fhiCoord_file reduce itypNatList # # PURPOSE # This proc is used in XCRYSDEN scripts to display crystal structure # from FHI98MD coord.out file. It is similar to "scripting::open # --fhi_coord file" call. The latter call will result in querying the # atomic numbers. Contrary, this information is supplied in function # call of the scripting::filter::fhiCoord. Also one can specify # possible reduction of the structure dimensionality. For example, if # the structure is a molecule, then one can get rid of 3D unit cell, # by reducing the dimensionality to 0D. # # ARGUMENTS # fhiCoord_file -- name of FHI98MD input file. # reduce -- reduce dimenionality to "reduce"-D # itypNatList -- FHI98MD's atomic-name --> atomic-number (i.e. nat) # mapping list. The format of the list is the following: # {name1 nat1 name2 nat2 ...} # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::filter::fhiCoord coord.out 0 {oxygen 8 hydrogen 1} #**** # ------------------------------------------------------------------------ proc scripting::filter::fhiCoord {fhiCoord_file reduce nameNatList} { global system # the structure of nameNatList is the following: # set nameNatList [list name1 nat1 name2 nat2] set fhiCoord_file [_absoluteFilename $fhiCoord_file] _fhi scripting::filter::fhiCoord $fhiCoord_file $reduce $nameNatList reloadRegister $fhiCoord_file openExtStruct:reload openExtStruct 3 crystal external \ $system(BINDIR)/fhi_coord2xcr \ fhi_coord.xcr {FHI98MD "coord.out"} \ BOHR \ -file $fhiCoord_file } proc scripting::filter::_fhi {procname file reduce nameNatList} { global system xcMisc # the structure of nameNatList is the following: # set nameNatList [list name1 nat1 name2 nat2] set len [_pp_common $procname $file $reduce $nameNatList] # get the list of atom names if { [namespace tail $procname] == "fhiInpini" } { xcCatchExecReturn $system(BINDIR)/fhi_inpini2ftn34 $file getlist #if { [catch {exec $system(BINDIR)/fhi_inpini2ftn34 $file getlist}] } { # ErrorDialog "error while executing \"fhi_inpini2ftn34 $file getlist\" program" # return 0 #} } else { # type == fhiCoord xcCatchExecReturn $system(BINDIR)/fhi_coord2xcr $file getlist #if { [catch {exec $system(BINDIR)/fhi_coord2xcr $file getlist}] } { # ErrorDialog "error while executing \"fhi_coord2xcr $file getlist\" program" # return 0 #} } # get the atom names set atomNames [lrange [ReadFile $system(SCRDIR)/fhi_species_name.list] 1 end] # write the nuclei.charges file set out "[expr $len / 2]\n" foreach {name nat} $nameNatList { set Nat($name) $nat } # the order in nameNatList and atomNames might be different, the # atomNames order is the right one foreach name $atomNames { append out $Nat($name)\n } # ------------------------------------------------------------------------ # cd to SCRATCH directory and write the file cd $system(SCRDIR) WriteFile fhi_species_nat.list $out w # ------------------------------------------------------------------------ } # pp_common == pseudo-potential common proc scripting::filter::_pp_common {procname file reduce atomMappingList} { global xcMisc set file [_init $file] # REDUCE factor is used for reducing the periodic structure to # lower dimensions if { ! [string is digit $reduce] } { ErrorIn $procname "reduce-factor must be an integer, but got $reduce" } else { if { $reduce > -1 && $reduce < 4 } { set xcMisc(reduce_to) $reduce } } # check the length itypNatList set len [llength $atomMappingList] if { $len % 2 } { ErrorIn $procname "odd number of elements in atomMappingList list" exit } return $len } proc scripting::filter::_init {file} { # pop-up the Viewer ViewMol . # destroy the welcome window destroyWelcomeWindow set file [_absoluteFilename $file] if { ! [file exists $file] } { ErrorDialog "File $file does not exist" exit } return $file } proc scripting::filter::_absoluteFilename {file} { if { [file pathtype $file] != "absolute" } { global system evalInPWD { set file [file join [pwd] $file] } } return $file } xcrysden-1.6.2/Tcl/cygwin.tcl0000644000175000017500000000514012373053743014610 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/cygwin.tcl # ------ # # Copyright (c) 2004 by Anton Kokalj # ############################################################################# # # this file contains a few very dirty hacks needed to run under CYGWIN # if { $xcrys(platform) == "windows" } { # testing ... rename exec _tcl_exec proc exec {args} { global env # first try a normal exec set result {} if { [catch {set result [uplevel 1 [list eval _tcl_exec $args]]}] } { # try to execute via "launch.sh" wrapper set result [uplevel 1 [list eval _tcl_exec sh $env(XCRYSDEN_TOPDIR)/scripts/launch.sh] $args] } return $result } } if { $xcrys(platform) == "cygwin" } { rename pwd _tcl_pwd rename exec _tcl_exec rename tk_getSaveFile _tk_getSaveFile rename tk_getOpenFile _tk_getOpenFile proc exec {args} { global env # first try a normal exec set result {} if { [catch {set result [uplevel 1 [list eval _tcl_exec $args]]}] } { # try to execute via "launch.sh" wrapper set result [uplevel 1 [list eval _tcl_exec sh $env(XCRYSDEN_TOPDIR)/scripts/launch.sh] $args] } return $result } proc pwd {} { global env # Don't use Tcl pwd command, it will return C:\cygwin\..., # and CYGWIN can't handle it. Use a pwd.sh wrapper instead. return [exec $env(XCRYSDEN_TOPDIR)/scripts/pwd.sh] } proc tk_getSaveFile {args} { set sfile [eval _tk_getSaveFile $args] return [cygwin_unixpath $sfile] } proc tk_getOpenFile {args} { set sfile [eval _tk_getOpenFile $args] return [cygwin_unixpath $sfile] } proc cygwin_unixpath {path} { if { [regexp -- {^[A-Z]:/} $path] } { set drive [string tolower [string index $path 0]] regsub {^[A-Z]:} $path /cygdrive/$drive path } return $path } } xcrysden-1.6.2/Tcl/grid.tcl0000644000175000017500000010152411712736221014233 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/grid.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# ############################################################################### # some properties can be rendered as ALPHA/BETA/ALPHA+BETA/ALPHA-BETA if # type_of_run == UHF. Such properties are ECHD & ECHG # # for ECHD & ECHG first record is ALPHA+BETA and second one is: ALPHA-BETA # so ALPHA = 0.5 * (record1 + record2) # BETA = 0.5 * (record1 - record2) ############################################################################### ############################################################################### # isosurf(res_type)........resolution type for isosurface, can be points, # angstroms, bohrs # isosurf(resol_poi).......resolution of grid for isosurfaces in points # isosurf(resol_ang).......resolution of grid for isosurfaces in angstroms # isosurf(mb_angs/bohr)....are resolution specified in Angstoms/Bohrs # isosurf(3Dinterpl_degree)...degree of tri cubic spline interpolation # isosurf(space_sel).......how space is selected (whole_cell/manually) # isosurf(Y_Sel)...........how Y-space is selected (centered/min_max/offset) # isosurf(Y_size)..........size of Y-space (for $isosurf(Y_sel) == centered) # isosurf(Y_min)...........minimun Y (for) $isosurf(Y_sel) == min_max # isosurf(Y_max)...........maximum_Y # isosurf(Y_offset)........Y offset for $isosurf(Y_sel) == "offset" # isosurf(Z_Sel) # isosurf(Z_size) # isosurf(Z_min) # isosurf(Z_max) # isosurf(Z_offset) ########## # isosurf(minvalue)........minimal grid value # isosurf(maxvalue)........maximum grid value # isosurf(rangevalue)......[expr $isosurf(maxvalue) - $isosurf(minvalue)] # isosurf(isolevel)........isovalue to render # isosurf(type_of_surf)....type of isosurface; solid/wire # isosurf(shade_model).....smooth/flat # isosurf(twoside_lighting)...off/on # isosurf(transparency).......off/on ########## # isosurf(spin)............what spin to take for UHF type_of_run ########## # isosurf(isovalue_entry)..this is name of entry-widget for specifying # isolevel ############################################################################## proc SetIsoGridSpace {title iconname comlist {dim 3D}} { global periodic isosurf varlist foclist isogrid_space prop \ dif_isosurf spin_entry isoplane set varlist {} set foclist {} set t [xcToplevel .isoget $title $iconname . 100 50 1] set f1 [frame $t.f1 -relief raised -bd 2] set f2 [frame $t.f2 -relief raised -bd 2] set f3 [frame $t.f3 -relief raised -bd 2] #this is the name of OK button at the bottom of the window set isoplane(OK) $f3.ok set isoplane(editButton) $f3.edit set com1 [lindex $comlist 0] set spinmatch 0 set prop(spin_case) 0 if { ! [info exists prop(spin_prop_list)] } { # for WIEN2k this variable doesn't exists set prop(spin_prop_list) NONEXISTENT } if { [string match "Difference*" $title] } { # we have difference map set com2 [lindex $comlist 1] set dif_isosurf(dif_map) 1 # do we have to deal with spin-dependent properties foreach _com $prop(spin_prop_list) { if { [string match "*$com1*" $_com] || \ [string match "*$com2*" $_com] } { set spinmatch 1 break } } } else { # we don't have difference map foreach _com $prop(spin_prop_list) { if { [string match "*$com1*" $_com] } { set spinmatch 1 break } } set dif_isosurf(dif_map) 0 } ########################################################### # for UHF there is a need to specify what spin to take, # but just if we are dealing with spin dependent properties if { $prop(type_of_run) == "UHF" && $spinmatch } { ####################### # we have "SPIN_CASE" # ####################### set prop(spin_case) 1 ####################### set f0 [frame $t.f0 -relief raised -bd 2] frame $f0.1 -relief groove -bd 2 set spin_entry [xcMenuEntry $f0.1 "What SPIN to take:" 30 \ isosurf(spin) {ALPHA BETA ALPHA+BETA ALPHA-BETA} \ -labelwidth 16] pack $f0 -side top -fill both pack $f0.1 -padx 2 -pady 5 -ipady 3 -fill x } pack $f1 $f2 $f3 -side top -fill both ######################################## # SPECIFY GRID RESOLUTION set f11 [frame $f1.f1 -relief groove -bd 2] set l11 [label $f11.l -text "Specify Grid Resolution" -relief flat] proc SetIsoGridSpace_com1 {} { focus .isoget.f1.f1.e1 .isoget.f1.f1.e1 configure -state normal -relief sunken .isoget.f1.f1.e2 configure -state disabled -relief flat .isoget.f1.f1.mb1 configure -state disabled } proc SetIsoGridSpace_com2 {} { focus .isoget.f1.f1.e2 .isoget.f1.f1.e1 configure -state disabled -relief flat .isoget.f1.f1.e2 configure -state normal -relief sunken .isoget.f1.f1.mb1 configure -state normal } set f111 [frame $f11.1 -relief flat] set r11 [radiobutton $f11.r1 \ -text "Number of points along one grid-segment:" \ -variable isosurf(res_type) \ -value "points" \ -width 41 \ -command SetIsoGridSpace_com1 \ -anchor w] set e11 [entry $f11.e1 \ -textvariable isosurf(resol_poi) \ -width 10] lappend varlist {isosurf(resol_poi) posint} lappend foclist $f11.e1 set f112 [frame $f11.2 -relief flat] set r12 [radiobutton $f11.r2 \ -text "Resolution in Angstroms/Bohrs:" \ -variable isosurf(res_type) \ -value "angstroms" \ -width 41 \ -command SetIsoGridSpace_com2 \ -anchor w] set e12 [entry $f11.e2 \ -textvariable isosurf(resol_ang) \ -width 10] lappend varlist {isosurf(resol_ang) posreal} lappend foclist $f11.e2 set mb11 [menubutton $f11.mb1 \ -textvariable isosurf(mb_angs/bohr) \ -menu $f11.mb1.menu \ -indicatoron 1 \ -relief raised \ -width 9 \ -anchor w] set menu11 [menu $mb11.menu -relief raised -tearoff 0] $menu11 add command -label "Angstroms" \ -command [list set isosurf(mb_angs/bohr) "Angstroms"] $menu11 add command -label "Bohrs" \ -command [list set isosurf(mb_angs/bohr) "Bohrs"] if ![info exists isosurf(3Dinterpl_degree)] { set isosurf(3Dinterpl_degree) 1 } if { $dim == "3D" } { set label "Degree of triCubic Spline Interpolation:" } elseif { $dim == "2D" } { set label "Degree of biCubic Spline Interpolation:" } set f113 [frame $f11.3 -relief flat] scale $f11.sc -from 1 -to 4 -length 100 \ -variable isosurf(3Dinterpl_degree) -orient horizontal \ -label $label \ -tickinterval 1 -resolution 1 \ -showvalue true trace variable isosurf(3Dinterpl_degree) w xcTrace ########## # get init states if { $isosurf(res_type) == "points" } { SetIsoGridSpace_com1 } else { SetIsoGridSpace_com2 } pack $f11 -side top -fill both -padx 2 -pady 5 pack $l11 -side top -expand 1 pack $f111 -side top -padx 5 -fill x pack $r11 -side left -in $f111 pack $e11 -side left -in $f111 -fill x -expand 1 pack $f112 -side top -padx 5 -fill x pack $r12 -side left -in $f112 -pady 5 pack $e12 -side left -in $f112 -pady 5 -fill x -expand 1 pack $mb11 -side left -in $f112 -pady 5 pack $f113 -side top -padx 5 -fill x pack $f11.sc -side left -in $f113 -pady 5 -padx 5 -fill x -expand 1 ######################################## # SPACE SELECTIONS ######################################## if { $dim == "3D" } { proc SetIsoGridSpace_com3 {} { xcEnableAll {.isoget.f2.f1.mar .isoget.f2.f1.1 .isoget.f2.f1.2} set p0 .isoget.f2.f1.mar set p1 .isoget.f2.f1.1 set p2 .isoget.f2.f1.2 set p3 .isoget.f2.f1.3 foreach ent { e1 e2 e3 e4 e5 e6 } { catch {$p0.$ent configure -relief sunken} catch {$p1.$ent configure -relief sunken} catch {$p2.$ent configure -relief sunken} catch {$p3.$ent configure -relief sunken} } } set f21 [frame $f2.f1 -relief groove -bd 2] set l21 [label $f21.l -text "Select Space for Isosurface Evaluation" \ -relief flat] pack $f21 -side top -fill both -padx 2 -pady 5 pack $l21 -side top -expand 1 if { $periodic(dim) == 3 } { ########### # CRYSTAL # ########### set r21 [radiobutton $f21.r1 \ -text "Whole unit cell" \ -variable isosurf(space_sel) \ -value "whole_cell" \ -command SetIsoGridSpace_com3 \ -width 41 \ -anchor w] pack $r21 -side top -fill x -expand 1 -padx 5 IsoCellSel } elseif { $periodic(dim) < 3 && $periodic(dim) > 0 } { ################### # SLAB & POLYMER # ################### if { $periodic(dim) == 2 } { set r21text "Whole unit cell in XY plane" set ii 1 } if { $periodic(dim) == 1 } { set r21text "Whole unit cell along X line" set ii 2 } set r21 [radiobutton $f21.r1 \ -text $r21text \ -variable isosurf(space_sel) \ -value "whole_cell" \ -width 41 \ -command SetIsoGridSpace_com3 \ -anchor w] pack $r21 -side top -fill x -expand 1 -padx 5 IsoCellSel ########## # get init states if { $isosurf(space_sel) == "whole_cell" } { SetIsoGridSpace_com3 } if { $periodic(dim) == 1 } { #################### # determine Y-space set f211 [frame $f21.1 -relief flat] set f211a [frame $f211.a -relief flat -width 40] set f211b [frame $f211.b -relief flat] set l211b0 [label $f211.l0 -text "Determine Y-space:" \ -relief flat -anchor w] proc SetIsoGridSpace_com4 {} { focus .isoget.f2.f1.1.e1 .isoget.f2.f1.1.e1 configure -state normal -relief sunken .isoget.f2.f1.1.e2 configure -state disabled -relief flat .isoget.f2.f1.1.e3 configure -state disabled -relief flat .isoget.f2.f1.1.e4 configure -state disabled -relief flat } proc SetIsoGridSpace_com5 {} { focus .isoget.f2.f1.1.e2 .isoget.f2.f1.1.e1 configure -state disabled -relief flat .isoget.f2.f1.1.e2 configure -state normal -relief sunken .isoget.f2.f1.1.e3 configure -state normal -relief sunken .isoget.f2.f1.1.e4 configure -state disabled -relief flat } proc SetIsoGridSpace_com6 {} { focus .isoget.f2.f1.1.e4 .isoget.f2.f1.1.e1 configure -state disabled -relief flat .isoget.f2.f1.1.e2 configure -state disabled -relief flat .isoget.f2.f1.1.e3 configure -state disabled -relief flat .isoget.f2.f1.1.e4 configure -state normal -relief sunken } set f211c1 [frame $f211.c1 -relief flat] set r211c1 [radiobutton $f211.r1 \ -text "set center of Y at Y=0.0;" \ -variable isosurf(Y_Sel) \ -value "centered" \ -command SetIsoGridSpace_com4 \ -anchor w] set l211c1 [label $f211.l1 -text "Y-size:" \ -width 10 \ -anchor e] set e211c1 [entry $f211.e1 \ -textvariable isosurf(Y_size) \ -width 20] lappend varlist {isosurf(Y_size) real} lappend foclist $f211.e1 set f211c2 [frame $f211.c2 -relief flat -width 150] set r211c2 [radiobutton $f211.r2 \ -text "min Y:" \ -variable isosurf(Y_Sel) \ -value "min_max" \ -command SetIsoGridSpace_com5 \ -anchor w ] set e211c2 [entry $f211.e2 \ -textvariable isosurf(Y_min) \ -width 20] lappend varlist {isosurf(Y_min) real} lappend foclist $f211.e2 set l211c3 [label $f211.l2 -text " max Y:" \ -width 10 \ -anchor e] set e211c3 [entry $f211.e3 \ -textvariable isosurf(Y_max) \ -width 20] lappend varlist {isosurf(Y_max) real} lappend foclist $f211.e3 set f211c4 [frame $f211.c4 -relief flat] set r211c4 [radiobutton $f211.r4 \ -text "whole structure per cell with Y-offset;" \ -variable isosurf(Y_sel) \ -value "offset" \ -anchor w \ -command SetIsoGridSpace_com6] set l211c4 [label $f211.l4 -text "Y-offset:" \ -anchor e \ -width 10] set e211c4 [entry $f211.e4 \ -textvariable isosurf(Y_offset) \ -width 20] lappend varlist {isosurf(Y_offset) real} lappend foclist $e211c4 pack $f211 -side top -fill x -expand 1 -padx 5 pack $f211a -side left pack $f211b -side left -expand 1 -fill x pack $l211b0 -in $f211b -side top -expand 1 -fill x pack $f211c1 $f211c2 $f211c4 -in $f211b -side top -fill x pack $r211c1 -in $f211c1 -side left -fill x pack $l211c1 -in $f211c1 -side left -fill x -expand 1 pack $e211c1 -in $f211c1 -side left pack $r211c2 $e211c2 -in $f211c2 -side left -fill x pack $l211c3 -in $f211c2 -side left -fill x -expand 1 pack $e211c3 -in $f211c2 -side left pack $r211c4 $l211c4 -in $f211c4 -side left -fill x pack $e211c4 -in $f211c4 -side left ########## # get init states if { $isosurf(Y_Sel) == "centered" } { SetIsoGridSpace_com4 } if { $isosurf(Y_Sel) == "min_max" } { SetIsoGridSpace_com5 } if { $isosurf(Y_Sel) == "offset" } { SetIsoGridSpace_com6 } } #################### # determine Z-space set f211 [frame $f21.2 -relief flat] set f211a [frame $f211.a -relief flat -width 40] set f211b [frame $f211.b -relief flat] proc SetIsoGridSpace_com7 {} { focus .isoget.f2.f1.2.e1 .isoget.f2.f1.2.e1 configure -state normal -relief sunken .isoget.f2.f1.2.e2 configure -state disabled -relief flat .isoget.f2.f1.2.e3 configure -state disabled -relief flat .isoget.f2.f1.2.e4 configure -state disabled -relief flat } proc SetIsoGridSpace_com8 {} { focus .isoget.f2.f1.2.e2 .isoget.f2.f1.2.e1 configure -state disabled -relief flat .isoget.f2.f1.2.e2 configure -state normal -relief sunken .isoget.f2.f1.2.e3 configure -state normal -relief sunken .isoget.f2.f1.2.e4 configure -state disabled -relief flat } proc SetIsoGridSpace_com9 {} { focus .isoget.f2.f1.2.e4 .isoget.f2.f1.2.e1 configure -state disabled -relief flat .isoget.f2.f1.2.e2 configure -state disabled -relief flat .isoget.f2.f1.2.e3 configure -state disabled -relief flat .isoget.f2.f1.2.e4 configure -state normal -relief sunken } set text "Determine Z-space:" set l211b0 [label $f211.l0 -text "Determine Z-space:" \ -relief flat -anchor w] set f211c1 [frame $f211.c1 -relief flat] set r211c1 [radiobutton $f211.r1 \ -text "set center of Z at Z=0.0;" \ -variable isosurf(Z_Sel) \ -value "centered" \ -anchor w \ -command SetIsoGridSpace_com7] set l211c1 [label $f211.l1 -text "Z-size:" \ -width 10 \ -anchor e] set e211c1 [entry $f211.e1 \ -textvariable isosurf(Z_size) \ -width 20] lappend varlist {isosurf(Z_size) real} lappend foclist $f211.e1 set f211c2 [frame $f211.c2 -relief flat -width 150] set r211c2 [radiobutton $f211.r2 \ -text "min Z:" \ -variable isosurf(Z_Sel) \ -value "min_max" \ -anchor w \ -command SetIsoGridSpace_com8] set e211c2 [entry $f211.e2 \ -relief sunken \ -bd 2 \ -textvariable isosurf(Z_min) \ -width 20] lappend varlist {isosurf(Z_min) real} lappend foclist $f211.e2 set l211c3 [label $f211.l2 -text " max Z:" \ -width 10 \ -anchor e] set e211c3 [entry $f211.e3 \ -textvariable isosurf(Z_max) \ -width 20] lappend varlist {isosurf(Z_max) real} lappend foclist $f211.e3 set f211c4 [frame $f211.c4 -relief flat] set r211c4 [radiobutton $f211.r4 \ -text "whole structure per cell with Z-offset;" \ -variable isosurf(Z_Sel) \ -value "offset" \ -anchor w \ -command SetIsoGridSpace_com9] set l211c4 [label $f211.l4 -text "Z-offset:" \ -anchor e \ -width 10] set e211c4 [entry $f211.e4 \ -textvariable isosurf(Z_offset) \ -width 20] lappend varlist {isosurf(Z_offset) real} lappend foclist $e211c4 pack $f211 -side top -fill x -expand 1 -padx 5 pack $f211a -side left pack $f211b -side left -expand 1 -fill x pack $l211b0 -in $f211b -side top -expand 1 -fill x pack $f211c1 $f211c2 $f211c4 -in $f211b -side top -fill x pack $r211c1 -in $f211c1 -side left -fill x pack $l211c1 -in $f211c1 -side left -fill x -expand 1 pack $e211c1 -in $f211c1 -side left pack $r211c2 $e211c2 -in $f211c2 -side left -fill x pack $l211c3 -in $f211c2 -side left -fill x -expand 1 pack $e211c3 -in $f211c2 -side left pack $r211c4 $l211c4 -in $f211c4 -side left -fill x pack $e211c4 -in $f211c4 -side left ########## # get init states if { $isosurf(Z_Sel) == "centered" } { SetIsoGridSpace_com7 } if { $isosurf(Z_Sel) == "min_max" } { SetIsoGridSpace_com8 } if { $isosurf(Z_Sel) == "offset" } { SetIsoGridSpace_com9 } } elseif { $periodic(dim) == 0 } { ############ # MOLECULE # ############ proc SetIsoGridSpace_com10 {} { foreach ent {.isoget.f2.f1.1.e1 .isoget.f2.f1.2.e2 \ .isoget.f2.f1.3.e3} { $ent configure -state normal -relief sunken } } set r21 [radiobutton $f21.r1 \ -text "Whole structure with offsets" \ -variable isosurf(space_sel) \ -value "whole_cell" \ -width 41 \ -anchor w \ -command SetIsoGridSpace_com10] pack $r21 -side top -fill x -expand 1 -padx 5 frame $f21.1 -relief flat frame $f21.2 -relief flat frame $f21.3 -relief flat label $f21.1.l1 -text " X-offset: " -anchor w -width 18 label $f21.2.l2 -text " Y-offset: " -anchor w -width 18 label $f21.3.l3 -text " Z-offset: " -anchor w -width 18 entry $f21.1.e1 -textvariable isosurf(X_offset) -width 20 entry $f21.2.e2 -textvariable isosurf(Y_offset) -width 20 entry $f21.3.e3 -textvariable isosurf(Z_offset) -width 20 append varlist { {isosurf(X_offset) real} \ {isosurf(Y_offset) real} \ {isosurf(Z_offset) real} } lappend foclist $f21.1.e1 $f21.2.e2 $f21.3.e3 pack $f21.1 $f21.2 $f21.3 -side top -padx 5 -fill x pack $f21.1.l1 $f21.2.l2 $f21.3.l3 -side left pack $f21.1.e1 $f21.2.e2 $f21.3.e3 -side left IsoCellSel ########## # get init states if { $isosurf(space_sel) == "whole_cell" } { SetIsoGridSpace_com10 } } proc SetIsoGridSpace_com11 {} { xcDisableAll {.isoget.f2.f1.mar \ .isoget.f2.f1.1 .isoget.f2.f1.2 .isoget.f2.f1.3} set p0 .isoget.f2.f1.mar set p1 .isoget.f2.f1.1 set p2 .isoget.f2.f1.2 set p3 .isoget.f2.f1.3 foreach ent { e1 e2 e3 e4 e5 e6 } { catch {$p0.$ent configure -relief flat } catch {$p1.$ent configure -relief flat } catch {$p2.$ent configure -relief flat } catch {$p3.$ent configure -relief flat } } } set r22 [radiobutton $f21.r2 \ -text "Manually selected space" \ -variable isosurf(space_sel) \ -value "manually" \ -width 41 \ -command SetIsoGridSpace_com11 \ -anchor w] ### t.k.: temporarily $r22 config -state disabled ### pack $r22 -side top -fill x -expand 1 -padx 5 } elseif { $dim == "2D" } { IsoPlaneGrid $f2 } # warning: $ok should be equal to isoplane(OK); look 5 lines above !!! set ok [button $isoplane(OK) -text "Submit" \ -command [list SetIsoGridSpaceOK $t $comlist $dim]] if { [xcIsActive properties] } { set edit [button $isoplane(editButton) -text "Edit Script & Submit" \ -command [list SetIsoGridSpaceOK $t $comlist $dim edit]] } if { $isoplane(OK) == "2D" } { $ok config -state disabled if { [info exists edit] } { config -state disabled } } proc SetIsoGridSpace_Cancel {t dim} { global isoplane xc_isospacesel .mesa clear if [xcIsActive wien] { # if cancel button was pressed warn the user that # application will exit exit_pr } else { CancelProc $t } } set can [button $f3.can -text "Cancel" \ -command [list SetIsoGridSpace_Cancel $t $dim]] pack $can -side left -expand 1 -padx 10 -pady 10 if { [info exists edit] } { pack $edit -side left -expand 1 -padx 10 -pady 10 } pack $ok -side left -expand 1 -padx 10 -pady 10 ########## # get init states if { $isosurf(space_sel) == "manually" } { SetIsoGridSpace_com11 } } proc SetIsoGridSpaceOK {t comlist {dim 3D} {edit {}}} { global varlist foclist isosurf periodic prop radio vec system \ dif_isosurf isostack isosign isodata isofiles mody \ spin_entry isoplane # radio(cellmode).......which mode for crystal cell; prim/conv set f0 $t.f0 set f2 $t.f2 # if UHF, check that spin was specified if { [winfo exists $f0] } { if { ! [info exists isosurf(spin)] } { set isosurf(spin) "" } if { $isosurf(spin) == "" } { dialog .number2 ERROR "ERROR !\nYou forgot to specify the spin" error 0 OK return } } if { $edit == {} } { set prop(editScript) 0 } else { set prop(editScript) 1 } # check if spin was entered correctly if { $prop(spin_case) } { if { ! [CheckSpin $spin_entry] } { return } } set ie {} if { $isosurf(res_type) == "points" } { lappend ie 1 } else { lappend ie 2 } if { $dim == "3D" } { if { $isosurf(space_sel) == "whole_cell" } { if { $periodic(dim) == 0 } { append ie { 3 4 5} } if { $periodic(dim) == 1 } { append ie { 3 6} if { $isosurf(Y_Sel) == "centered" } { lappend ie 9 } elseif { $isosurf(Y_sel) == "min_max" } { append ie { 10 11} } else { lappend ie 12 } if { $isosurf(Z_Sel) == "centered" } { lappend ie 13 } elseif { $isosurf(Z_Sel) == "min_max" } { append ie { 14 15} } else { lappend ie 16 } } if { $periodic(dim) == 2 } { append ie { 3 4 6 7} if { $isosurf(Z_Sel) == "centered" } { lappend ie 9 } elseif { $isosurf(Z_Sel) == "min_max" } { append ie { 10 11} } else { lappend ie 12 } } } } elseif { $dim == "2D" } { # # was the isoplane correctly selected if { $isoplane(plane_sel) == {} } { return } #xc_isospacesel .mesa clear } foreach i $ie { incr i -1 lappend new_varlist [lindex $varlist $i] lappend new_foclist [lindex $foclist $i] } if { ! [check_var $new_varlist $new_foclist] } { return } if { $dim == "2D" && ! [info exists isosurf(origVec)] } { # the "Update-Display" button was not pressed for 2D; update a display IsoPlaneGrid_Update $f2 } if { $comlist == "UPDATE_DISPLAY" } { # we should just update display and return IsoSpaceUpdate $periodic(dim) set isosurf(origVec) [xc_isospacesel .mesa cell3D \ -ctype $radio(cellmode) \ -margins [list $isosurf(A_margin) $isosurf(B_margin) \ $isosurf(C_margin) $isosurf(A*_margin) \ $isosurf(B*_margin) $isosurf(C*_margin)]] return 0 } if { [winfo exists $t] } { destroy $t } ################################################################### # OK now everything need to be prepared for isosurface evaluation # ################################################################### # initialise origin of "isosurf cell" for {set i 0} {$i < 3} {incr i} { set isosurf(origin,$i) 0.0 } ###################### # for difference-maps we have two command in $comlist, but # NPX,NPY & NPZ must be equal for both, so take the first command # and determine NPX, NPZ, NPY set command [lindex $comlist 0] if { $dim == "3D" } { # t.k:: # next two lines are not tested for CRYSTALXX (if & xc_isosp...) if { ! [info exists isosurf(origVec)] } { IsoSpaceUpdate $periodic(dim) set isosurf(origVec) [xc_isospacesel .mesa cell3D \ -ctype $radio(cellmode) \ -margins [list $isosurf(A_margin) $isosurf(B_margin) \ $isosurf(C_margin) $isosurf(A*_margin) \ $isosurf(B*_margin) $isosurf(C*_margin)]] } xc_isospacesel .mesa clear if { $comlist == "WIEN" } { global wn # --wien_density option; # "whole_cell" & "manual" option !!!! wnMakeIn5_2D3D $isosurf(origVec) 3D set wn(done) 1 return } else { # # this is for CRYSTALXX # # delete old unit-25 if { [file exists $prop(dir)/$prop(file)25] } { file delete $prop(dir)/$prop(file)25 } if { $isosurf(space_sel) == "whole_cell" } { GetCageVecOrig $isosurf(origVec) GetNPY $command GetNumberOfPoints $command 3 } } } elseif { $dim == "2D" } { xc_isospacesel .mesa clear # order of points in isoplane(points):: # 0--3 # | | # 1--2; p1 will be set to origin, vec0 = p2 - p1, vec1 = p0 - p1 # # CRYSTAL or WIEN ???? # if { $comlist == "WIEN" } { global wn # --wien_density option; wnMakeIn5_2D3D $isoplane(points) 2D set wn(done) 1 return } else { # CRYSTALXX set p $isoplane(points) xcDebug "\npoints:: $isoplane(points)\n" set isosurf(origin,0) [Angs2Bohr [lindex $p 3]] set isosurf(origin,1) [Angs2Bohr [lindex $p 4]] set isosurf(origin,2) [Angs2Bohr [lindex $p 5]] set vec(0,0) [Angs2Bohr [expr [lindex $p 6] - [lindex $p 3]]] set vec(0,1) [Angs2Bohr [expr [lindex $p 7] - [lindex $p 4]]] set vec(0,2) [Angs2Bohr [expr [lindex $p 8] - [lindex $p 5]]] set vec(1,0) [Angs2Bohr [expr [lindex $p 0] - [lindex $p 3]]] set vec(1,1) [Angs2Bohr [expr [lindex $p 1] - [lindex $p 4]]] set vec(1,2) [Angs2Bohr [expr [lindex $p 2] - [lindex $p 5]]] set vec(2,0) 0.0 set vec(2,1) 0.0 set vec(2,2) 0.0 GetNPY $command set prop(NPZ) 1 } } ######################################## # now caclulate isosurfaces set n_com [llength $comlist] set com1 [lindex $comlist 0] set com2 [lindex $comlist 1] xcDebug "\nCOMLIST>> $com1 $com2" ############# CALCULATE map_A update update idletask if { ! [IsoCalc 1 $com1] } { return } update ############# set prop(unit25_1) $system(SCRDIR)/$prop(file)25.A file rename -force $system(SCRDIR)/$prop(file)25 $prop(unit25_1) # If diff. map calculate map B # For diff. map we may use one unit9 or load each map from separate unit9 # For diff. maps we always make two units 25 if { $n_com > 1 } { set dirB $system(SCRDIR) if { $dif_isosurf(load_another_unit9) == 1 } { file copy -force $dif_isosurf(unit9_B) $system(SCRDIR_1)/$prop(file)9 set dirB $system(SCRDIR_1) } ############### CALCULATE map_B if { ! [IsoCalc 2 $com2 $dirB/xc_output.$system(PID) $dirB] } { return } ############### set prop(unit25_2) $system(SCRDIR)/$prop(file)25.B file rename -force $dirB/$prop(file)25 $prop(unit25_2) } ################################################### # now we have to determine xc_isostack parameters # ################################################### ####################### # ISOFILES parameters # ####################### set isofiles "$prop(unit25_1) " if { $n_com > 1 } { append isofiles "$prop(unit25_2)" } ####################### # ISOSTACK parameters # ####################### set isostack {} if { $dif_isosurf(dif_map) == 0 } { ####################### # NOT DIFFERENCE MAPS # ####################### append isostack "xc_isostack 3; " append isostack "xc_isostack 0 2 1; " append isostack "xc_isostack 0 1 $prop(NPZ); " } elseif { $dif_isosurf(dif_map) == 1 } { ################### # DIFFERENCE MAPS # ################### append isostack "xc_isostack 4; " append isostack "xc_isostack 0 3 2; " append isostack "xc_isostack 0 2 1; " append isostack "xc_isostack 1 2 1; " append isostack "xc_isostack 0 1 $prop(NPZ); " append isostack "xc_isostack 1 1 $prop(NPZ); " } ######################### # set isosign & isodata # ######################### SetXC_Iso $dim ######################################## # PREPARE ISOSURFACE/PROPERTYPLANE # ######################################## xcPrepareIsosurf $com1 $dim ################################################################# # now make isosurf_struct global variable, which will be used for # isoControl tracking system of "isoControl" changes Set_UpdateIsosurf_Struct ####################### # display IsoControls # if { $dim == "3D" } { set prop(datagridDim) 3 IsoControl } elseif { $dim == "2D" } { set prop(datagridDim) 2 IsoControl2D } } proc CheckSpin {foc} { global isosurf set s_list "\"ALPHA\" \"BETA\" \"ALPHA-BETA\" \"ALPHA+BETA\"" if ![string match "*$isosurf(spin)*" $s_list] { tk_dialog [WidgetName] ERROR "ERROR: unknown spin \"$isosurf(spin)\", should be of $s_list" error 0 OK focus $foc return 0 } return 1 } proc IsoCellSel {} { uplevel 1 { frame $f21.mar -relief flat pack $f21.mar -expand 1 array set isosurf {A_margin 0.0 B_margin 0.0 C_margin 0.0 \ A*_margin 0.0 B*_margin 0.0 C*_margin 0.0} label $f21.mar.l1 -text " A margin: " -anchor e -width 12 label $f21.mar.l2 -text " B margin: " -anchor e -width 12 label $f21.mar.l3 -text " C margin: " -anchor e -width 12 label $f21.mar.l4 -text "A* margin: " -anchor e -width 12 label $f21.mar.l5 -text "B* margin: " -anchor e -width 12 label $f21.mar.l6 -text "C* margin: " -anchor e -width 12 entry $f21.mar.e1 -textvariable isosurf(A_margin) -width 7 entry $f21.mar.e2 -textvariable isosurf(B_margin) -width 7 entry $f21.mar.e3 -textvariable isosurf(C_margin) -width 7 entry $f21.mar.e4 -textvariable isosurf(A*_margin) -width 7 entry $f21.mar.e5 -textvariable isosurf(B*_margin) -width 7 entry $f21.mar.e6 -textvariable isosurf(C*_margin) -width 7 append varlist { {isosurf(A_margin) real} \ {isosurf(B_margin) real} \ {isosurf(C_margin) real} \ {isosurf(A*_margin) real} \ {isosurf(B*_margin) real} \ {isosurf(C*_margin) real} } lappend foclist $f21.mar.e1 $f21.mar.e2 $f21.mar.e3 $f21.mar.e4 $f21.mar.e5 $f21.mar.e6 set list {} if { $periodic(dim) == 1 } { set list {1 4} } elseif { $periodic(dim) == 2 } { set list {1 2 4 5} } elseif { $periodic(dim) == 3 } { set list {1 2 3 4 5 6} } set j 0 foreach i $list { set ii [expr ($i-1) * 2 - $j*6] grid $f21.mar.l$i -row $j -column $ii -pady 3 grid $f21.mar.e$i -row $j -column [expr $ii + 1] -pady 3 if { $i == $periodic(dim) } { incr j } } frame $f21.mar.2 -relief raised -bd 1 set upd [button $f21.mar.2.upd -text "Update Display" -bd 1 \ -command [list SetIsoGridSpaceOK $t UPDATE_DISPLAY 3D]] if { $periodic(dim) < 1 } { grid $f21.mar.2 -row 2 -column 0 \ -columnspan 2 -sticky ew -pady 5 } else { grid $f21.mar.2 -row 2 -column [expr $periodic(dim) - 1] \ -columnspan 2 -sticky ew -pady 5 } pack $upd -pady 3 } } proc IsoSpaceUpdate dim { global mody isosurf if { $dim < 3 && $dim > 0 } { if { $isosurf(Z_Sel) == "centered" } { # isosurf(Z_size) set z2 [expr $isosurf(Z_size) / 2.0] set isosurf(C_margin) $z2 set isosurf(C*_margin) $z2 } elseif { $isosurf(Z_Sel) == "min_max" } { set isosurf(C_margin) [expr -1.0 * $isosurf(Z_min)] set isosurf(C*_margin) $isosurf(Z_max) } elseif { $isosurf(Z_Sel) == "offset" } { set isosurf(C_margin) [expr -1.0 * \ [xc_getvalue $mody(GET_SS_MINZ)] + $isosurf(Z_offset)] set isosurf(C*_margin) [expr \ [xc_getvalue $mody(GET_SS_MAXZ)] + $isosurf(Z_offset)] } } if { $dim == 1 } { if { $isosurf(Y_Sel) == "centered" } { # isosurf(Y_size) set y2 [expr $isosurf(Y_size) / 2.0] set isosurf(B_margin) $y2 set isosurf(B*_margin) $y2 } elseif { $isosurf(Y_Sel) == "min_max" } { set isosurf(B_margin) [expr -1.0 * $isosurf(Y_min)] set isosurf(B*_margin) $isosurf(Y_max) } elseif { $isosurf(Y_Sel) == "offset" } { set isosurf(B_margin) [expr -1.0 * \ [xc_getvalue $mody(GET_SS_MINY)] + $isosurf(Y_offset)] set isosurf(B*_margin) [expr \ [xc_getvalue $mody(GET_SS_MAXY)] + $isosurf(Y_offset)] } } if { $dim == 0 } { set isosurf(C_margin) [expr -1.0 * \ [xc_getvalue $mody(GET_SS_MINZ)] + $isosurf(Z_offset)] set isosurf(C*_margin) [expr \ [xc_getvalue $mody(GET_SS_MAXZ)] + $isosurf(Z_offset)] set isosurf(B_margin) [expr -1.0 * \ [xc_getvalue $mody(GET_SS_MINY)] + $isosurf(Y_offset)] set isosurf(B*_margin) [expr \ [xc_getvalue $mody(GET_SS_MAXY)] + $isosurf(Y_offset)] set isosurf(A_margin) [expr -1.0 * \ [xc_getvalue $mody(GET_SS_MINX)] + $isosurf(X_offset)] set isosurf(A*_margin) [expr \ [xc_getvalue $mody(GET_SS_MAXX)] + $isosurf(X_offset)] } } xcrysden-1.6.2/Tcl/xsfAnim.tcl0000644000175000017500000004055013514632541014716 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/xsfAnim.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # tis proc is called form menu File->...->(Open XSF File) # proc xsfAnimOpenMenu {can} { global fileselect system set fileselect(path) [tk_getOpenFile -defaultextension .xsf \ -filetypes { {{All Files} {.*} } {{Animated XSF Files} {.axsf}} {{XSF Files} {.xsf}} {{GZipped Animated XSF Files} {.axsf.gz}} {{GZipped XSF Files} {.xsf.gz}} } -initialdir $system(PWD) -title "Open AXSF File"] if { $fileselect(path) == "" } { return } reloadRegister $fileselect(path) XSF xsfOpen $fileselect(path) $can #xsfAnimInit $fileselect(path) $can } proc xsfAnimInit {filedir can {update 0}} { global system geng xcMisc periodic radio sInfo periodic xsfAnim set FileName [file tail $filedir] ################################## # everything must happen in SCRDIR cd $system(SCRDIR) set xsfAnim(nstep) [xsfParseAnim $filedir] if { $xsfAnim(nstep) < 0 } { # an Error has occured tk_dialog [WidgetName] "ERROR" "ERROR: An error occured when parsing AXSF file $FileName !!!" error 0 OK return 0 } elseif { $xsfAnim(nstep) == 0 } { tk_dialog [WidgetName] "NOTIFICATION" "NOTIFICATION: Specified file $FileName seems to be an ordinary XSF file !!!" warning 0 OK set xsfAnim(not_anim) 1 xsfOpen $filedir $can return 1 } set xsfAnim(anim_step) 1 set xsfAnim(current) 1 set xsfAnim(label_text_current) "Current slide: $xsfAnim(current)/$xsfAnim(nstep)" xsfOpenParsed $system(SCRDIR)/$FileName.1 $can $update set xsfAnim(filename) $FileName xsfAnimWid $can } proc xsfAnimWid can { global xsfAnim gifAnim xcMisc if { ! [info exists xsfAnim(nstep)] } { return } if { $xsfAnim(nstep) < 1 } { return } # set the daley between slides (in msec) set xsfAnim(delay) 50 set c [lindex [split $can .] end] if { [winfo exists .anim$c] } { return } set xsfAnim(label_text_current) "Current slide: $xsfAnim(current)/$xsfAnim(nstep)" set gifAnim(anim_ctrl_widgets) 0 # from here on is just the widget managing set t [xcToplevel .anim$c "Animation Control" "Animation" . -0 0 1] set xsfAnim(tplw) $t bind $t {xsfAnimWidClose %W} # this is for "Hide" button global unmapWin xcRegisterUnmapWindow $t $unmapWin(frame,main) anim \ -textimage {Animate unmap} bind $t [list xcUnmapWindow unmap %W $t \ $unmapWin(frame,main) anim] bind $t [list xcUnmapWindow map %W $t \ $unmapWin(frame,main) anim] # container frames set f1 [frame $t.f1 -relief ridge -bd 2] set f2 [frame $t.f2 -relief ridge -bd 2] set f3 [frame $t.f3] pack $f1 -side top -expand 1 -fill x \ -padx 2m -pady 2m -ipadx 2m -ipady 2m pack $f2 -side top -expand 1 -fill x \ -padx 2m -ipadx 2m -ipady 1m pack $f3 -side top # -------------------------------------------------- # xsfAnim widgets # -------------------------------------------------- set e1 [OneEntries $f1 \ {"Delay between slides (in msec):" "Animation step:"} \ {xsfAnim(delay) xsfAnim(anim_step)} 31 15 5 -side top] set slide_label [label $f1.l1 -textvariable xsfAnim(label_text_current) -anchor c] set lfont [ModifyFont [$slide_label cget -font] $slide_label -size 18 -underline 1] $slide_label configure -font $lfont set f_play [frame $f1.1] set first [button $f_play.1st -image first -anchor center \ -command [list xsfAnimAction $can first]] set backw [button $f_play.bck -image backward -anchor center \ -command [list xsfAnimAction $can backward]] set previ [button $f_play.prv -image previous -anchor center \ -command [list xsfAnimAction $can previous]] set stop [button $f_play.sto -image stop -anchor center \ -command [list xsfAnimAction $can stop]] set next [button $f_play.nxt -image next -anchor center \ -command [list xsfAnimAction $can next]] set forw [button $f_play.frw -image forward -anchor center \ -command [list xsfAnimAction $can forward]] set last [button $f_play.lst -image last -anchor center \ -command [list xsfAnimAction $can last]] pack $slide_label $f_play -side top -expand 1 -pady 1m pack $first $backw $previ $stop $next $forw $last -side left foreach {wid text} { 1st "First image" bck "Play backward" prv "Previous image" sto "Stop playing" nxt "Next image" frw "Play forward" lst "Last image" } { set path $f_play.$wid DynamicHelp::register $path balloon $text } # -------------------------------------------------- # gifAnim widgets # -------------------------------------------------- set gifAnim(make_gifAnim) 0 set gifAnim(button_text) "Animated GIF/MPEG/AVI >>" set f_animgif [frame $f2.1] set gifb [button $f2.gifb \ -textvariable gifAnim(button_text) \ -command [list gifAnimWidPack $f_animgif $can]] pack $gifb -side top -padx 10 -pady 3 -fill x -expand 1 set xsfAnim(anim_ctrl_button) $gifb if { ![info exists xcMisc(gif_encoder)] && ![info exists xcMisc(movie_encoder)] } { $gifb config -state disabled } # make a movie-control windgets gifAnim_controlWidgets $f_animgif $can $slide_label set gifAnim(make_text) "Start Recording Animation" set gifAnim(make_gifAnim) 0 set makeGIF [button $f_animgif.make -textvariable gifAnim(make_text) \ -command [list gifAnimMake $can $slide_label $f_animgif.make]] pack $makeGIF -side top -padx 5 -pady 5 # # CLOSE/HIDE widgets # set hide [button $f3.hide -text "Hide" \ -default active -command [list HideWin $t anim]] set close [button $f3.close -text "Close" \ -command [list destroy $t]] pack $hide $close -side left -ipadx 1m -ipady 1m -padx 2m -pady 2m xcUpdateState } proc xsfAnimWidClose {t} { global gifAnim if { [winfo exists $t] } { destroy $t } set gifAnim(anim_ctrl_widgets) 0 xcUpdateState } proc xsfAnimAction {can what} { global xsfAnim if { ![info exists xsfAnim(stop)] } { set xsfAnim(stop) 0 } if { ![info exists xsfAnim(anim_step)] } { set xsfAnim(anim_step) 1 } if { $xsfAnim(anim_step) < 1 } { set xsfAnim(anim_step) 1 } if { ![number xsfAnim(delay)] } { tk_dialog [WidgetName] "ERROR" "ERROR: Please specify a number for delay !!!" error 0 OK return 0 } switch -exact -- $what { stop { set xsfAnim(stop) [expr {$xsfAnim(stop) ? 0 : 1}] } first { if { $xsfAnim(current) == 1 } { return } set xsfAnim(current) 1 xsfAnimRenderCurrent $can } backward { while { $xsfAnim(current) > 1 && ! $xsfAnim(stop)} { incr xsfAnim(current) -$xsfAnim(anim_step) if { $xsfAnim(current) < 1 } { set xsfAnim(current) 1 } xsfAnimRenderCurrent $can update set xsfAnim(label_text_current) \ "Current slide: $xsfAnim(current)/$xsfAnim(nstep)" after $xsfAnim(delay) } set xsfAnim(stop) 0 return } previous { if { $xsfAnim(current) > 1 } { incr xsfAnim(current) -$xsfAnim(anim_step) if { $xsfAnim(current) < 1 } { set xsfAnim(current) 1 } xsfAnimRenderCurrent $can } else { return } } next { if { $xsfAnim(current) < $xsfAnim(nstep) } { incr xsfAnim(current) $xsfAnim(anim_step) if { $xsfAnim(current) > $xsfAnim(nstep) } { set xsfAnim(current) $xsfAnim(nstep) } xsfAnimRenderCurrent $can } else { return } } forward { while { $xsfAnim(current) < $xsfAnim(nstep) && ! $xsfAnim(stop) } { incr xsfAnim(current) $xsfAnim(anim_step) if { $xsfAnim(current) > $xsfAnim(nstep) } { set xsfAnim(current) $xsfAnim(nstep) } xsfAnimRenderCurrent $can update set xsfAnim(label_text_current) \ "Current slide: $xsfAnim(current)/$xsfAnim(nstep)" after $xsfAnim(delay) } set xsfAnim(stop) 0 return } last { if { $xsfAnim(current) == $xsfAnim(nstep) } { return } set xsfAnim(current) $xsfAnim(nstep) xsfAnimRenderCurrent $can } } set xsfAnim(label_text_current) "Current slide: $xsfAnim(current)/$xsfAnim(nstep)" } proc xsfAnimRenderCurrent can { global xsfAnim gifAnim periodic nxdir nydir nzdir geng system \ working_XSF_file SetWatchCursor set working_XSF_file $xsfAnim(filename).$xsfAnim(current) if { $periodic(dim) > 0 } { # new: tk Mon Jan 27 15:27:23 CET 2003 CellMode 1 #GenGeom $geng(M1_PRIM) $geng(M2_CELL) 11 1 $nxdir $nydir $nzdir \ # xc_struc.$system(PID) #UpdateStruct $can xc_struc.$system(PID) } else { UpdateStruct $can $system(SCRDIR)/$working_XSF_file } ResetCursor if { $gifAnim(make_gifAnim) == 1 } { # # Animated-GIF option: print this snapshot to GIF file gifAnimPrintCurrent $can } return } # sample AXSF file (fixed-cell): #------------------ # ANIMSTEPS 18 # DIM-GROUP # 3 1 # PRIMVEC # 5.8859563944 0.0000000000 0.0000000000 # 0.0000000000 5.8859563944 0.0000000000 # 0.0000000000 0.0000000000 23.3615963678 # PRIMCOORD 1 #32 1 # 47 3.8888048966 4.1163007841 19.5974532965 # 47 3.8888048966 1.7696556103 19.5974532965 # 47 1.9971514978 4.1163007841 19.5974532965 # 47 1.9971514978 1.7696556103 19.5974532965 # 6 2.9429781972 3.5961067857 19.2368415845 # 6 2.9429781972 2.2898496088 19.2368415845 # .............. # sample AXSF file (variable-cell): #------------------ # ANIMSTEPS 18 # DIM-GROUP # 3 1 # PRIMVEC 1 # 5.8859563944 0.0000000000 0.0000000000 # 0.0000000000 5.8859563944 0.0000000000 # 0.0000000000 0.0000000000 23.3615963678 # PRIMCOORD 1 #32 1 # 47 3.8888048966 4.1163007841 19.5974532965 # 47 3.8888048966 1.7696556103 19.5974532965 # 47 1.9971514978 4.1163007841 19.5974532965 # 47 1.9971514978 1.7696556103 19.5974532965 # 6 2.9429781972 3.5961067857 19.2368415845 # 6 2.9429781972 2.2898496088 19.2368415845 # .............. ###################################################################### # xsfParseAnim -- # Converts AXSF file to sequence of XSF files. If the AXSF tail of # filename is "name", then the generated sequence of XSF files will # be named "name.n", where "n" is the sequent number starting from # 1 and up. The files are generated in `pwd`. # # Arguments: # file file is the the FULL-PATH/FILENAME # # Results: # Returns the number of XSF files genetared. It return 0 if # ANIMSTEP keyword is not found and -1 if parsing error occurs proc xsfParseAnim file { # default type of animated XSF file set axsf_type fixed-cell set filetail [file tail $file] set file [gunzipXSF $file] set content [ReadFile -nonewline $file] set ConList [split $content \n] unset content # read NUMBER of ANIMATION STEPS set AnimSteps [lindex [lindex $ConList \ [lsearch -glob $ConList "*ANIMSTEP*"]] 1] if { $AnimSteps < 0 } { return 0 } # read HEADER of FILE set ind [lsearch -glob $ConList "*DIM-GROUP*"] if { $ind >= 0 } { lappend HList [lrange $ConList $ind [expr $ind + 1]] } set ind [lsearch -regexp $ConList "^ *MOLECULE*"] if { $ind >= 0 } { lappend HList [linedex $ConList $ind] } set ind [lsearch -regexp $ConList "^ *POLYMER*"] if { $ind >= 0 } { lappend HList [lindex $ConList $ind] } set ind [lsearch -regexp $ConList "^ *SLAB*"] if { $ind >= 0 } { lappend HList [lindex $ConList $ind] } set ind [lsearch -regexp $ConList "^ *CRYSTAL*"] if { $ind >= 0 } { lappend HList [lindex $ConList $ind] } set ind [lsearch -glob $ConList "*PRIMVEC*"] if { $ind >= 0 } { # check if it is variable- or fixed-cell animated XSF if { [llength [lindex $ConList $ind]] == 1 } { # fixed-cell XSF set axsf_type "fixed-cell" lappend HList [lrange $ConList $ind [expr $ind + 3]] } else { # variable-cell XSF set axsf_type "variable-cell" } } set ind [lsearch -glob $ConList "*CONVVEC*"] if { $ind >= 0 } { if { [llength [lindex $ConList $ind]] == 1 } { # fixed-cell XSF lappend HList [lrange $ConList $ind [expr $ind + 3]] } } # transform HList for writing to XSF file if { [info exists HList] } { foreach record $HList { foreach elem $record { append Header ${elem}\n } } unset HList } else { set Header {} } # check if there is a PRIMCOORD record and if it is composed like: # PRIMCOORD , where n is a number set ind [lsearch -glob $ConList "*PRIMCOORD*"] if { $ind >= 0 && [llength [lindex $ConList $ind]] > 1 } { # parse PRIMCOORD records and write sequence of XSF files for {set i 1} {$i <= $AnimSteps} {incr i} { set FileName $filetail.$i append FileContent $Header # # for variable-cell XSF we should write the vectors !!! # if { $axsf_type == "variable-cell" } { # PRIMVEC set ind [lsearch -glob $ConList "*PRIMVEC*$i*"] if { $ind < 0 } { # mandatory keyword: ERROR parsing AXSF file return -1 } append FileContent [_xsfAnimParse_getVec $ConList $ind] # CONVVEC set ind [lsearch -glob $ConList "*CONVVEC*$i*"] if { $ind >= 0 } { # optional keyword append FileContent [_xsfAnimParse_getVec $ConList $ind] } } # PRIMCOORD set ind [lsearch -glob $ConList "*PRIMCOORD*$i*"] if { $ind < 0 } { # mandatory keyword: ERROR parsing AXSF file return -1 } incr ind set Natm [lindex [lindex $ConList $ind] 0] set AList [lrange $ConList $ind [expr $ind + $Natm]] append FileContent "PRIMCOORD\n" foreach elem $AList { append atoms ${elem}\n } append FileContent $atoms WriteFile $FileName $FileContent w unset FileContent atoms } } else { # must be ATOMS type of AXSF file set ind [lsearch -glob $ConList "*ATOMS*"] if { $ind >= 0 && [llength [lindex $ConList $ind]] > 1 } { # parse ATOMS records and write sequence of XSF files for {set i 1} {$i <= $AnimSteps} {incr i} { set FileName $filetail.$i set ind [lsearch -glob $ConList "*ATOMS*$i*"] if { $ind < 0 } { # ERROR parsing AXSF file return -1 } # ATOMS section does not specify how many atoms there is, # hence search for next ATOMS string !!! if { $i < $AnimSteps } { set ii [expr $i + 1] set ind1 [lsearch -glob $ConList "*ATOMS*$ii*"] set AList [lrange $ConList \ [expr $ind + 1] [expr $ind1 - 1]] } else { set AList [lrange $ConList [expr $ind + 1] end] } #append FileContent $Header append FileContent ATOMS\n foreach elem $AList { append atoms ${elem}\n } if { [info exists atoms] } { append FileContent $atoms WriteFile $FileName $FileContent w #xcDebug -stderr "ANIMSTEP: $i" #xcDebug -stderr $FileContent unset FileContent atoms } } } } return $AnimSteps } # # utility library: returns the whole PRIMVEC or CONVVEC section # proc _xsfAnimParse_getVec {ConList ind} { append _vec [lindex [lindex $ConList $ind] 0]\n incr ind append _vec [lindex $ConList $ind]\n incr ind append _vec [lindex $ConList $ind]\n incr ind append _vec [lindex $ConList $ind]\n return $_vec } xcrysden-1.6.2/Tcl/ptable.tcl0000644000175000017500000001745012675207551014571 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/ptable.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc ptable {tplw {args {}}} { global ptable tcl_platform if { $tcl_platform(platform) == "windows" } { set bw 2 } else { set bw 1 } # tplw .... according to which toplevel the ptable's toplevel should be # placed by xcToplevel command # args: # -command command .... which command to execute when an # element button is pressed; should set # the ptable(result) variable set oldgrab [grab current] # if ptable(ptable_script) var exists we are running ptable as utility # so make no toplevel if { ![info exists ptable(ptable_script)] } { set t [xcToplevel [WidgetName] "XCrySDen: Periodic Table of Elements" \ "Periodic Table" [winfo toplevel $tplw] 10 10] } else { set t . wm title . "XCrySDen: Periodic Table of Elements" wm iconname . "Periodic Table" } catch { grab $t } set i 0 set command DummyProc set variable ptable(dummy_var) foreach option $args { incr i # odd cycles are tags, even options if { $i%2 } { set tag $option } else { switch -- $tag { "-command" {set command $option} "-variable" {set variable $option} default { tk_dialog [WidgetName] Error \ "ERROR: Bad \"ptable\" configuration option $tag" \ error 0 OK return 0 } } } } if { $i%2 } { tk_dialog [WidgetName] \ "ERROR: You called \"ptable\" with an odd number of args !" \ error 0 OK return 0 } set row(0) {{} 1a 2a 3b 4b 5b 6b 7b 8_3 1b 2b 3a 4a 5a 6a 7a 8a} set row(1) {I H x16 He} set row(2) {II Li Be x10 B C N O F Ne} set row(3) {III Na Mg x10 Al Si P S Cl Ar} set row(4) {IV K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr} set row(5) {V Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe} set row(6) {VI Cs Ba La Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn} set row(7) {VII Fr Ra Ac Rf Ha Sg Ns Hs Mt x9} set row(9) {Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb Lu} set row(10) {Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr} set col(0) "#ffffbb" set col(1) "#ff6688" set col(2) $col(1) foreach i {3 4 5 6 7 8 9 10 11 12} { set col($i) "#77bbff" } foreach i {13 14 15 16 17 18} { set col($i) "#ffcccc" } foreach el {3,13 4,13 5,13 6,13 4,14 5,14 6,14 5,15 6,15 6,16} { set col($el) $col(1) } . configure -bg "#ffffff" set f [frame $t.f -bg "#ffffff"] set f1 [frame $f.f1 -bg "#ffffff"] set f2 [frame $f.f2 -bg "#ffffff"] set font [font create] font configure $font \ -family Times \ -size 20 \ -weight bold \ -underline 1 label $f.l -text "Periodic Table of Elements" -relief groove -bd 2 -font $font pack $f.l -side top -expand 1 -padx 10 -ipadx 5 -ipady 2 focus $f.l #set f [frame .f] pack $f $f1 $f2 -ipadx 10 -ipady 10 -side top # take care of row(0) set ic 0 foreach item $row(0) { set sticky {} set span 1 if [string match *_* $item] { set c [string last _ $item] set span [string range $item [expr $c + 1] end] set sticky ew set item [string range $item 0 [expr $c - 1]] puts stdout "$c $span $item" } if { $ic != 0 } { puts stdout "$ic $span $item" set b [button $f1.0_$ic \ -text $item \ -relief ridge -bd 2 \ -width $bw \ -bg $col($ic) -disabledforeground "#000000" \ -state disabled] grid $b grid configure $b -column $ic -row 0 \ -columnspan $span -sticky $sticky -in $f1 -pady 5 if { $span > 1 } { incr ic [expr $span - 1] } } incr ic } for {set ir 1} {$ir <= 7} {incr ir} { set ic 0 foreach item $row($ir) { if { $ic == 0 } { set b [button $f1.${ir}_0 \ -command [list eval $command $t $item] \ -text $item \ -relief ridge -bd 2 \ -width $bw \ -bg $col($ic) -disabledforeground "#000000" \ -state disabled] grid $b grid configure $b -column 0 -row $ir -in $f1 -padx 5 incr ic continue } if { [string index $item 0] == "x" } { set n [string range $item 1 end] incr ic $n continue } set color $col($ic) if [info exists col($ir,$ic)] { set color $col($ir,$ic) } set b [button $f1.${ir}_${ic} \ -command [list eval $command $t $item] \ -text $item \ -width $bw \ -bg $color] grid $b grid configure $b -column $ic -row $ir -in $f1 incr ic } } set color "#99bbff" button $f2.9_0 -text "Lantanides" \ -bg $color -state disabled \ -relief ridge -bd 2 \ -bg $color \ -disabledforeground "#000000" button $f2.10_0 -text "Actinides" \ -bg $color -state disabled \ -relief ridge -bd 2 \ -bg $color \ -disabledforeground "#000000" grid $f2.9_0 $f2.10_0 grid configure $f2.9_0 -column 0 -row 9 -columnspan 3 -sticky we -in $f2 grid configure $f2.10_0 -column 0 -row 10 -columnspan 3 -sticky we -in $f2 set color "#99ddff" for {set ir 9} {$ir <= 10} {incr ir} { set ic 3 foreach item $row($ir) { set b [button $f2.${ir}_$ic \ -command [list eval $command $t $item] \ -text $item \ -width $bw \ -bg $color] grid $b grid configure $b -column $ic -row $ir -in $f2 incr ic } } DefaultButton $f.b -text Close -command [list ptableClose $t] pack $f.b -side top -padx 10 -pady 10 tkwait window $t if { $oldgrab != {} } { catch { grab $oldgrab } } upvar #0 $variable var set var $ptable(result) return $ptable(result) } proc ptableClose t { global ptable set ptable(result) {} CancelProc $t } proc ptableSelectElement {t el} { global ptable set ptable(result) $el CancelProc $t } proc ptableSelectAtomicNumber {t el} { global ptable set ptable(result) [Aname2Nat $el] CancelProc $t } proc scroll_ptableSelectNAT {t globarrayname arrel i} { upvar #0 $globarrayname array # globarrayname .... name of global array # arrel .... name of array element # i .... i-th element of array with element arrel set array($arrel,$i) [ptable $t -command ptableSelectAtomicNumber] } #lappend auto_path "/home/tone/prog/XCrys/Mesa" #ptable . -command ptableSelectElement xcrysden-1.6.2/Tcl/bwid.tcl0000644000175000017500000001572213246207661014244 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/bwid.tcl # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# proc BWIDGraph {file} { global properties ftn25 grafdata grafsize system prop graf # FIX THIS if { ![file exists $file] } { tk_dialog .err ERROR "ERROR! \nFile \"$file\" does not exist !!! \ This is bug in brogram, please report to author !!!\n\ Code: BWIDGraph -file not found-" error 0 OK return } set fileID [open $file r] # # query GrapherID # set gID [NextGrapherID] xcDebug "GrapherID:: -- $gID --" set grafdata($gID,N_graf) 1 set grafdata($gID,N_segment,1) 2; # one is min band E, one is max band E set grafdata($gID,N_text) 1 set grafdata($gID,barshadow,1) 0 set graf($gID,RorigX,1) 0.0 set graf($gID,RorigY,1) 0.0 set graf($gID,RsizeX,1) 1.0 set graf($gID,RsizeY,1) 1.0 set done 0 while { !$done } { gets $fileID line if { $system(c95_version) == "03" || $system(c95_version) == "06" \ || $system(c95_version) == "09" || $system(c95_version) == "14" } { # # CRYSTAL03 # # grep line: N. OF SCF CYCLES 8 FERMI ENERGY -0.511E-01 set pattern1 "*N. OF SCF CYCLES*FERMI ENERGY*" set pattern2 "*EFERMI(AU)*" } else { set pattern1 "*TOTAL *FERMI ENERGY*" set pattern2 "*EFERMI (A.U.)*" } if { [string match $pattern1 $line] } { putsFlush stderr "EF line: $line" set grafdata($gID,N_Yline,1) 1 set grafdata($gID,Yline1,1) [lindex $line end] set grafdata($gID,Yline1_text,1) "E_Fermi" set grafsize($gID,Yline1_fill,1) #ff0000 set grafsize($gID,Yline1_width,1) 1 set grafsize($gID,Yline1_stipple,1) @$system(BMPDIR)/dotH.bmp } # may be Fremi energy was recalculated if { [string match $pattern2 $line] } { puts stdout "EF line: $line" set grafdata($gID,Yline1,1) [lindex $line 5] } if { [regexp "BAND LIMITS" $line] } { xcDebug "$line" set band1 [lindex $line 4] set band2 [lindex $line 7] # read blank line gets $fileID line set done 1 break; # leave this break - otherwise it doesn't work (I don't know why) } xcDebug $line } set grafdata($gID,X_title,1) "BAND number" set grafdata($gID,Y_title,1) "E \[a.u.\]" set grafdata($gID,N_point,1) [expr $band2 - $band1 + 1] set grafdata($gID,N_Xline,1) [expr $grafdata($gID,N_point,1) - 1] set grafdata($gID,firstbar,1) $band1 set grafdata($gID,lastbar,1) $band2 # arbitrarily we set: Xmin to 0 & Xmax to 1 set grafdata($gID,Xmin,1) 0.0 set grafdata($gID,Xmax,1) 1.0 set grafdata($gID,Xoffset,1) 0.2 set grafdata($gID,Yoffset,1) 0.05 set grafdata($gID,N_MXtick,1) $grafdata($gID,N_point,1) set grafdata($gID,N_mXtick,1) 0 set grafsize($gID,Mtick_size,1) 0 set grafsize($gID,mtick_size,1) 0 if { $grafdata($gID,N_point,1) < 1 } { tk_dialog .dialog WARNING "WARNING: Number of BANDs to plot is 0!!!" \ error 0 OK return } set ng 1 if { $prop(type_of_run) == "UHF" } { set ng 2 } set grafdata($gID,barn,1) $ng set l [expr 1.0 / $grafdata($gID,N_point,1)] puts stdout "Npoint: $grafdata($gID,N_point,1); lll: $l" for {set ig 1} {$ig <= $ng} {incr ig} { if { $ig == 2 } { set done 0 while { !$done } { gets $fileID line if { [regexp "BAND LIMITS" $line] } { set done 1 break } } # read blank line gets $fileID line } for {set i 1} {$i <= $grafdata($gID,N_point,1)} {incr i} { gets $fileID line # t.k.: while { [llength $line] == 0 } { gets $fileID line } #/ if { $ig == 1 } { set grafdata($gID,Xtick${i}_text,1) [lindex $line 1] set grafdata($gID,Xtick$i,1) [expr ($i - 1) * $l + $l / 2] set grafdata($gID,X$i,1) [expr ($i - 1) * $l + $l / 2] set grafsize($gID,bar${i}_fill,1) #ff0000 set grafsize($gID,bar${i}_outline,1) #ff0000 set grafsize($gID,bar${i}_shadow,1) #aaaaaa if { $i < $grafdata($gID,N_point,1) } { set grafdata($gID,Xline$i,1) [expr $i * $l] set grafsize($gID,Xline${i}_fill,1) #000 set grafsize($gID,Xline${i}_width,1) 1 set grafsize($gID,Xline${i}_stipple,1) \ @$system(BMPDIR)/dotV.bmp } } else { set grafsize($gID,bar${i}_fill,2) #0000ff set grafsize($gID,bar${i}_outline,2) #0000ff set grafsize($gID,bar${i}_shadow,2) #999999 } # Y values if { [llength $line] >= 5 } { set grafdata($gID,$i,1,$ig) [lindex $line 3] set grafdata($gID,$i,2,$ig) [lindex $line 5] puts stdout "VALUES: $grafdata($gID,$i,1,$ig) $grafdata($gID,$i,2,$ig)" } else { set grafdata($gID,$i,1,$ig) +999 set grafdata($gID,$i,2,$ig) -999 } if { $i == 1 && $ig == 1 } { set Ymin $grafdata($gID,$i,1,$ig) set Ymax $grafdata($gID,$i,2,$ig) } else { if { $grafdata($gID,$i,1,$ig) < $Ymin } { set Ymin $grafdata($gID,$i,1,$ig) } if { $grafdata($gID,$i,2,$ig) > $Ymax } { set Ymax $grafdata($gID,$i,2,$ig) } } set grafsize($gID,bar${i}_stipple,$ig) gray50 set grafsize($gID,bar${i}_width,$ig) 1 } } set yrange [expr $Ymax - $Ymin] set grafdata($gID,Ymin,1) \ [expr $Ymin - $yrange * $grafdata($gID,Yoffset,1)] set grafdata($gID,Ymax,1) \ [expr $Ymax + $yrange * $grafdata($gID,Yoffset,1)] puts stdout "YMin YMax:: $grafdata($gID,Ymin,1) $grafdata($gID,Ymax,1)" set grafdata($gID,N_MYtick,1) 6 set grafdata($gID,N_mYtick,1) 2 set dy [expr ($grafdata($gID,Ymax,1) - $grafdata($gID,Ymin,1)) / \ ($grafdata($gID,N_MYtick,1) - 1)] for {set i 1} {$i <= $grafdata($gID,N_MYtick,1)} {incr i} { set grafdata($gID,Ytick$i,1) [expr $Ymin + ($i - 1) * $dy] set grafdata($gID,Ytick${i}_text,1) \ [TickFormat $grafdata($gID,Ytick$i,1)] puts stdout "YTICK:: $grafdata($gID,Ytick$i,1)" } set grafsize($gID,canW) 600 set grafsize($gID,canH) 450 close $fileID } xcrysden-1.6.2/Tcl/xcInit.tcl0000644000175000017500000005031613522036115014542 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/xcInit.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# ############################################################################### # xcrysden TEMPORARY FILES: # # xc_gengeom.$$ --- produced with gengeom with M1_INFO # xc_struc.$$ --- produced with gengeom with .not. M1_INFO -> used by xcrys # xc_str2xcr.$$ --- produced by str2xcr program (converted WIEN2k struct file # to "xsf" format) # xc_wnstr.struct--- temporary WIEN2k struct file # xc_wienstruct.$$-- wien struct file (copy of original WIEN2k struct file) # xc_inp.$$ --- crystal95's input (also xc_tmp.$$) # xc_output.$$ --- crystal95's output # xc_tmp.$$ --- something insignificant # xc_bin.$$ --- binary file produced by "xcrys" interpreter; used # for isosurface evaluation # xc_binVrt.$$ --- binary file produced by "xcrys" interpreter; used # to stote the current gridvertices # xc_datagrid.$$ --- binary file where datagrid from DATAGRIDXD is stored # xc_ndsfp.$$ --- Wigner-Seitz nodes:: nodes for primitive cell mode # xc_ndsfc.$$ --- Wigner-Seitz nodes:: nodes for conventional cell mode # xc_klist.$$ --- k-list-file for the kPath program # xc_rho.$$ --- rho-3Ddatagrid file for WIEN # here are variables that need to be initialised more than once proc InitGlobalVar {} { global species nxdir nydir nzdir \ periodic \ inp n_groupsel groupsel AdvGeom \ prop \ XCState \ dispmode mode2D \ geng \ ws \ colSh \ sInfo \ system \ isoControl \ openGL \ undoMenu undoAdvGeom \ pDen \ colSh \ xsfAnim gifAnim \ light \ glLight \ atomLabel \ toglEPS # # array xcMisc will be used for various things; it is to prevent to many # global variables # # xcMisc(titlefile) ... name of the file that appears on the main window # title set species {} set nxdir 1 set nydir 1 set nzdir 1 # PERIODIC global variable -> data about dimensionality goes here # periodic(dim) ... what is the dimensionality of the system set periodic(dim) 0 set periodic(igroup) 1; #igroup according to gengeom program set dispmode(style) 3D set mode2D(WF) Off set mode2D(PL) Off set mode2D(PB) Off set mode2D(BS1) Off set mode2D(BS2) Off set mode2D(SF) Off set arraylist [list inp AdvGeom XCState prop] set varlist [list n_groupsel groupsel] foreach array $arraylist { if [array exists $array] { unset $array } } foreach var $varlist { if [info exists $var] { unset $var } } #default #3 gengeom's argument is 1 if { ! [info exists system(c95_version)] } { set system(c95_version) none } set geng(M3_ARGUMENT) [GetGengM3Arg ANGS $system(c95_version)] # what to do with IsoXXXX ??? # close all other toplevels ??? # WIGNER-SEITZ CELL set ws(not_config_yet) 1 # initialization of mody array ModConst # this is associated with XCRYSDEN INFO RECORD (core xcrys interpreter) if { [info exists sInfo] } { unset sInfo } if ![info exists colSh] { set colSh(scheme) atomic set colSh(slab_fractional) 1 set colSh(slab_dir) "-z" set colSh(slab_colbas) monochrome set colSh(slab_coltyp) combined set colSh(slab_alpha) 0.65 set colSh(dist_x) 0.0 set colSh(dist_y) 0.0 set colSh(dist_z) 0.0 set colSh(dist_r) 1.0 set colSh(dist_colbas) monochrome set colSh(dist_coltyp) combined set colSh(dist_alpha) 0.65 } # this should be the same as ISOLINE_MAXLEVEL in isosurf.h file set isoControl(max_allowed_2Dnisoline) 100 ################################ # initialization of openGL array ################################ set openGL(src_blend_list) { GL_ZERO GL_ONE GL_DST_COLOR GL_ONE_MINUS_DST_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA GL_SRC_ALPHA_SATURATE } set openGL(dst_blend_list) { GL_ZERO GL_ONE GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA } xc_setGLparam frontface -what isosurf_one -frontface CCW xc_setGLparam frontface -what isosurf_pos -frontface CCW xc_setGLparam frontface -what isosurf_neg -frontface CCW set pos [xc_getGLparam frontface -what isosurf_pos] set neg [xc_getGLparam frontface -what isosurf_neg] #xcDebug -stderr "Pos: $pos" #xcDebug -stderr "Neg: $neg" set openGL(isoside_pos) [lindex $pos 0] set openGL(isoside_neg) [lindex $neg 0] set openGL(front_ambient_R) 0 set openGL(front_ambient_G) 0 set openGL(front_ambient_B) 0 set openGL(front_diffuse_R) 0 set openGL(front_diffuse_G) 0 set openGL(front_diffuse_B) 0 set openGL(front_specular_R) 0 set openGL(front_specular_G) 0 set openGL(front_specular_B) 0 set openGL(front_emission_R) 0 set openGL(front_emission_G) 0 set openGL(front_emission_B) 0 #### set openGL(back_ambient_R) 0 set openGL(back_ambient_G) 0 set openGL(back_ambient_B) 0 set openGL(back_diffuse_R) 0 set openGL(back_diffuse_G) 0 set openGL(back_diffuse_B) 0 set openGL(back_specular_R) 0 set openGL(back_specular_G) 0 set openGL(back_specular_B) 0 set openGL(back_emission_R) 0 set openGL(back_emission_G) 0 set openGL(back_emission_B) 0 set undoMenu(active_fg) #ffffff set undoMenu(active_bg) #0000ff set undoMenu(default_fg) #000000 set undoMenu(default_bg) #ffffff set undoAdvGeom(start_index) 0 set undoAdvGeom(current_index) 0 set undoAdvGeom(list) {} set undoAdvGeom(redo_start_index) 0 set undoAdvGeom(redo_current_index) 0 set undoAdvGeom(redo_list) {} if [info exists pDen(nsurface)] { unset pDen(nsurface) } set pDen(type) gauss set pDen(radius) cov set pDen(level) 1.0 set pDen(cutoff) 1.0 set pDen(colorscheme) atomic set pDen(drawstyle) wire set pDen(surfacetype) molsurf set pDen(resolution) 0.35 set pDen(smoothsteps) 0 set pDen(smoothweight) 0.2 set pDen(transparent) 0 set pDen(shademodel) smooth set pDen(monocolor) {0.8 0.8 0.2} set pDen(tessellation) cube set pDen(normals) gradient set pDen(t_type) GAUSSIAN set pDen(t_radius) {Covalent radii} set pDen(t_colorscheme) {Atomic colors} set pDen(t_drawstyle) Wire set pDen(t_surfacetype) {Pseudo density} set pDen(t_shademodel) Smooth set pDen(t_tessellation) Cube set pDen(t_normals) Gradient set colSh(slabrange_min) 0.00 set colSh(slabrange_max) 1.00 set xsfAnim(not_anim) 0 set gifAnim(create) 0 set gifAnim(gif_transp) 0 set gifAnim(gif_minimize) 0 set gifAnim(gif_global_colormap) 0 set gifAnim(edit_param) 1 set gifAnim(movie_format) mpeg set gifAnim(temp_files_dir) tmp set gifAnim(frame_files_format) PPM set gifAnim(ntime_first_frame) 1 set gifAnim(ntime_last_frame) 1 set gifAnim(delay) 10 set gifAnim(loop) 0 set gifAnim(make_gifAnim) 0 set atomLabel(fontBrowser) "Simple Font Browser" set atomLabel(globalFont) "" set atomLabel(globalFont.brightColor) {1.0 1.0 1.0} set atomLabel(globalFont.darkColor) {0.0 0.0 0.0} set atomLabel(globalFont.do_display) 1 set atomLabel(atomFont) "" set atomLabel(atomFont.id) "" set atomLabel(atomFont.label) "" set atomLabel(atomFont.brightColor) {1.0 1.0 1.0} set atomLabel(atomFont.darkColor) {0.0 0.0 0.0} set atomLabel(atomFont.do_display) 1 set light On #if { ! [info exists glLight(nlights)] } { # set glLight(nlights) 6 #} set toglEPS(DRAW_BACKGROUND) 0 set toglEPS(SIMPLE_LINE_OFFSET) 0 set toglEPS(SILENT) 0 set toglEPS(BEST_ROOT) 1 set toglEPS(OCCLUSION_CULL) 1 set toglEPS(NO_TEXT) 0 set toglEPS(LANDSCAPE) 0 set toglEPS(NO_PS3_SHADING) 0 set toglEPS(NO_PIXMAP) 0 set toglEPS(NO_BLENDING) 0 } proc xcInit {} { #global system Const geng # take care of the scratch directory if { ! [file isdirectory $system(SCRDIR)] } { puts stderr "ERROR: SCRATCH directory \"$system(SCRDIR)\" does not exist" exit 1 } if { ! [file writable $system(SCRDIR)] } { error "SCRATCH directory \"$system(SCRDIR)\" is not writeable" exit 1 } set system(USER_DIR) $system(TOPDIR) ###################################################################### # initialize XCRYSDEN'S LIBRARY: variables needed for keeping xcrysden # alive will be loaded here set xcMisc(status_init_label) "Initializing library ..." source $system(TOPDIR)/Tcl/xcInitLib.tcl ########################################################## # now read the user-custom file; USER MAY CHANGE SOMETHING # if ![user-custom-file present] if { [file exists $env(HOME)/.xcrysden/custom-definitions] } { source $env(HOME)/.xcrysden/custom-definitions } else { source $system(TOPDIR)/Tcl/custom-definitions } # backward compatibility; now in custom-definitions we use # xcMisc(printCommand) for consistency if { [info exists xcMisc(printCommand)] } { set printCanvas(printCommand) $xcMisc(printCommand) } #if $xcMisc(debug) { # #debug # #lappend auto_path $xcMisc(dev_dir) #} # ------------------------------------------------------------------------ # GOTO $system(SCRDIR) cd $system(SCRDIR) # ------------------------------------------------------------------------ # make the 444 core file on $system(SCRDIR) catch {exec touch core} catch {exec chmod 444 core} ########################### # make some subdirectories; so far we need just 1 if { [file isdirectory $system(SCRDIR)/dir1] } { file delete -force $system(SCRDIR)/dir1 } file mkdir $system(SCRDIR)/dir1 set system(SCRDIR_1) $system(SCRDIR)/dir1 set xcMisc(status_init_label) "Checking packages ..." ####################################################################### # check software packages check_package_awk check_package_terminal check_package_crystal find_package_imagemagick find_package_gifsicle find_package_whirlgif find_package_mencoder find_package_ppmtompeg find_package_babel find_package_xwd find_package_xsf2_manipulator determine_movie_encoders ####################################################################### ################### # FORTRAN UNIT NAME set system(ftn_name) [FtnName] ################################################# # IMPORTANT CONSTANTS # ----------------------------------------------- set Const(bohr) 0.529177; # conversion factor for Ang/Bohr in c95 ################################################## # INITIALIZATION OF GLOBAL VARIABLES # ------------------------------------------------ set xcMisc(status_init_label) "Creating initializing variables ..." InitGlobalVar ################################################## # load atom names AtomNames ################################################### # THIS IS FOR GENGEOM PROGRAM # usage of "gengeom" program: # # gengeom MODE1 MODE2 MODE3 IGRP NXDIR NYDIR NZDIR OUTPUT INPUT # 0 1 2 3 4 5 6 7 8 9 # set geng(M1_INFO) 0; #INFO mode set geng(M1_PRIM) 1; #PRIMITIV CELL; in case of H/R PARAPIPEDAL SHAPE set geng(M1_CONV) 2; #CONVENTIONAL CELL; in case of H/R it is PARAP. SHAPE set geng(M1_HEXA_SHAPE) 3; #THREEPLE CELL for H/R; HEXAGONAL SHAPE set geng(M1_PRIM3) 4; #PRIMITIV cell for H/R; HEXAGONAL SHAPE set geng(M2_CELL) 1; #CELL is unit of repetition set geng(M2_TR_ASYM_UNIT) 2; #translation asymetric unit is unit of repetition #default gengeom's #3 argument set geng(M3_ARGUMENT) [GetGengM3Arg ANGS $system(c95_version)] set geng(IGRP_HEXA) 8; # hexagonal groups set geng(IGRP_TRIG) 9; # trigonal groups wm iconbitmap . @$system(BMPDIR)/xcrysden.xbm #wm iconmask . @$system(BMPDIR)/xcrysden_mask.xbm set xcMisc(status_init_label) "Building GUI ..." } ################################################################### ### MAIN --- MAIN --- MAIN --- MAIN --- MAIN --- MAIN --- MAIN ### ################################################################### package provide Tk ; #puts stderr tk_version=$tk_version # ------------------------------------------------------------------------ # First process the "argc/argv". The order of arguments is # XCRYSDEN_TOPDIR XCRYSDEN_SCRATCH and the user specified command line # options # ------------------------------------------------------------------------ set system(TOPDIR) [lindex $argv 0] set system(SCRDIR) [lindex $argv 1] # ------------------------------------------------------------------------ # Load xcrys.dll # ------------------------------------------------------------------------ if { [file exists $system(TOPDIR)/bin/xcrys.dll] } { load $system(TOPDIR)/bin/xcrys.dll } elseif { [info exists env(XCRYSDEN_LIB_BINDIR)] && [file exists $env(XCRYSDEN_LIB_BINDIR)/xcrys.dll] } { load $env(XCRYSDEN_LIB_BINDIR)/xcrys.dll } # ------------------------------------------------------------------------ # some dirty fixes needed to get the program work under CYGWIN # ------------------------------------------------------------------------ source $system(TOPDIR)/Tcl/cygwin.tcl # ------------------------------------------------------------------------ # Load Bwidgets package # ------------------------------------------------------------------------ set bwidget [glob -nocomplain $system(TOPDIR)/external/lib/bwidget-*] if { $bwidget != "" } { set BWidget_dir $bwidget lappend auto_path $BWidget_dir } package require BWidget # ------------------------------------------------------------------------ # take care of trace/fulltrace utility # ------------------------------------------------------------------------ if { [info exists env(XCRYSDEN_TRACE)] || [info exists env(XCRYSDEN_FULLTRACE)] } { # BWidget needs some special treatment if XCTR is enabled foreach file [glob $BWidget_dir/*.tcl] { if { $file != "$BWidget_dir/pkgIndex.tcl" && [file exists $file] } { source $file } } # take care of XCTR set xctr(recording) 0 source [file join $system(TOPDIR) Tcl xctr.tcl] } #source $system(TOPDIR)/Tcl/parseComLinArg.tcl # ------------------------------------------------------------------------ # Palette # ------------------------------------------------------------------------ # this was the 0.3 palette: #tk_setPalette "#ddd" #tk_setPalette "#b5b193" #tk_setPalette "#ee9" #tk_setPalette "#bbb" # ------------------------------------------------------------------------ # check for stale files in $env(XCRYSDEN_SCRATCH) # ------------------------------------------------------------------------ proc clean_xcrysden_scratch {} { global env set time [clock seconds] set five_days [expr 5*24*3600] foreach item [glob -nocomplain -directory $env(XCRYSDEN_SCRATCH) xc_*] { set item_time [file atime $item] if { [expr {$time - $item_time}] > $five_days } { lappend stale_item $item } } if { [info exists stale_item] > 0 } { set respond [tk_messageBox -parent . -type yesno -default yes -icon question \ -title "Cleaning XCRYSDEN_SCRATCH ?" \ -message "Possible stale files older then 10 days exist in XCRYSDEN_SCRATCH directory.\n\nDo you want to delete them?"] if { $respond == "yes" } { puts stderr "*** cleaning XCRYSDEN_SCRATCH directory: $stale_item" catch { eval file delete -force $stale_item } } } } clean_xcrysden_scratch # ------------------------------------------------------------------------ # Welcome images # ------------------------------------------------------------------------ image create photo kpath -format gif \ -file $system(TOPDIR)/images/xcrysden_kpath.gif image create photo welcome -format gif \ -file $system(TOPDIR)/images/xcrysden-welcome.gif -width 480 -height 320 # ------------------------------------------------------------------------ # make a WELCOME window # ------------------------------------------------------------------------ proc centerWelcome {thisWin} { set w 500 set h 350 # root window height/width set rh [winfo screenheight $thisWin] set rw [winfo screenwidth $thisWin] set reqX [expr {($rw-$w)/2}] set reqY [expr {($rh-$h)/2}] wm geometry $thisWin +${reqX}+${reqY} } puts stderr "Running on platform : $xcrys(platform)" puts stderr " Operating system : $tcl_platform(os)" if { "[lindex $argv 2]" != "--quiet" } { # MACOSX has problems with wm iconify/wm deiconify requests, so # don't use them if { $tcl_platform(os) != "Darwin" } { #catch {wm iconify .} catch {wm withdraw .} toplevel .title frame .title.f -relief flat -bd 0 -bg #fff label .title.f.l -image welcome -anchor center -relief flat -bd 0 set xcMisc(status_init_label) "Initializing ..." label .title.f.l2 -textvariable xcMisc(status_init_label) \ -relief flat -bd 0 pack .title.f pack .title.f.l .title.f.l2 -side top -fill both -padx 0m -pady 0m centerWelcome .title wm overrideredirect .title true update } } # ------------------------------------------------------------------------ # load necessary initialization # ------------------------------------------------------------------------ eval [info body xcInit] # ------------------------------------------------------------------------ # start recording the tracing # ------------------------------------------------------------------------ set xctr(recording) 1 # ------------------------------------------------------------------------ # do renaming such that exit is associated with clean_exit that cleans the TMPDIR # ------------------------------------------------------------------------ rename exit exit_tcl rename clean_exit exit # provide a custom "cd" when in debug mode to trace changing directories if { [info exists env(XCRYSDEN_DEBUG)] } { rename cd cd_tcl proc cd_debug {dir} { puts stderr "*** " puts stderr "*** cd into $dir" puts stderr "*** " cd_tcl $dir } rename cd_debug cd } # create a photo image "container" for printing into PPM files # (see file xcAppInit.c & togl_ppm.c) image create photo $xcrys(print.image) ## simple variable debugger #proc tracer {varname args} { # upvar #0 $varname var # puts stderr "$varname was updated to be \"$var\" # from # [info level 0] # from # [info level 1] # from # [info level 2]" #} #trace add variable xcMisc(titlefile) write "tracer xcMisc(titlefile)" # ------------------------------------------------------------------------ # parse command-line options or simple start the Viewer # ------------------------------------------------------------------------ if { [llength $argv] > 2 } { parseComLinArg [lrange $argv 2 end] } else { ViewMol . } xcrysden-1.6.2/Tcl/openExtStruct.tcl0000644000175000017500000001735213531247076016150 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/openExtStruct.tcl # # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc openExtStruct:reload {filedir can {update 1}} { global openExtStruct system if { ! [info exists openExtStruct(state)] } { error "openExtStruct:reload called before openExtStruct" } set file [gunzipFile $filedir] set program_output $openExtStruct(program_output) if { $program_output != "stdout" } { if { $program_output != "pwo2xsf.xsf" } { eval xcCatchExecReturn $openExtStruct(program) $file } else { # a bit special case for PWscf output files eval xcCatchExecReturn $openExtStruct(program) $file > $program_output } } else { set program_output $system(SCRDIR)/xc_out.$system(PID) eval xcCatchExecReturn $openExtStruct(program) < $file > $program_output } if { $openExtStruct(state) != "external34" } { # default xsfOpenParsed $program_output $can 1 } else { global geng xcCatchExecReturn $system(BINDIR)/gengeom $geng(M1_INFO) 1 $geng(M3_ARGUMENT) 1 1 1 1 $system(SCRDIR)/xc_gengeom.$system(PID) GetDimGroupXSF periodic(dim) periodic(igroup) $system(SCRDIR)/xc_gengeom.$system(PID) CellMode 1 xcUpdateState } } proc openExtStruct {dim spec state program program_output file_type unit {args {}}} { global fileselect system periodic species geng xcMisc wn openExtStruct # # dim # ... dimension of the structure # spec # ... structure (i.e. species) name (molecule/polymer/slab/crystal) # state # ... could be either external or external34 # program # ... name of the converting program (full-path name) # program_output # ... output file-name created by converting program; # # if $program_output==stdout, then converting # program reads from stdin and writes to stdout !!! # # file_type # ... type of file; it is just a name like "PWSCF Input File" # unit # ... lenghth unit (ANGS/BOHR) for $program_oputput # args # ... additional arguments like: # # -preset ... presetting procedure (used for pseudopotential codes, # where atomic numbers should be queried: see files # fhiPreset.tcl & pwPreset.tcl) # -file ... filename to open; used when launched as command line # option # set openExtStruct(state) $state set openExtStruct(program) $program set openExtStruct(program_output) $program_output # # internal checking of parameters !!! # if { $unit != "ANGS" && $unit != "BOHR" } { xcDebug -stderr "openExtStruct: Syntax Error -- unit must be ANGS or BOHR" exit 1 } if { $state != "external" && $state != "external34" } { xcDebug -stderr "openExtStruct: Syntax Error -- state must be external or external34" exit 1 } if { $dim < 0 || $dim > 3 } { xcDebug -stderr "openExtStruct: Syntax Error -- dim must be within \[0,3\]" exit 1 } ################ # parsing args # ################ set i 0 set file {} set preset {} foreach option $args { incr i # odd cycles are tags, even options if { $i%2 } { set tag $option } else { xcDebug -debug "openExtStruct Options:: $tag $option" switch -- $tag { "-file" {set file $option} "-preset" {set preset $option} default { tk_dialog .mb_error Error "ERROR: Bad \"openExtStruct\" configure option $tag" error 0 OK return 0 } } } } if { $i%2 } { tk_dialog .mb_error1 Error "ERROR: You called openExtStruct with an odd number of args !" error 0 OK return 0 } # # check/set $file # if { $file == {}} { global system set file [tk_getOpenFile -defaultextension .in \ -filetypes { {{All Files} {.*}} {{Input Files} {.in .inp}} {{Output Files} {.out}} } \ -initialdir $system(PWD) \ -title "Open $file_type File"] if { $file == "" } { return } # active "Reload button" reloadRegister $file openExtStruct:reload } if { ![file exists $file] } { tk_dialog .update \ "WARNING !!!" "WARNING: File \"$file\" does not exist !!!" \ warning 0 OK return } # # update the title of "." # set xcMisc(titlefile) $file wm title . "XCrySDen: [file tail $file]" set file [gunzipFile $file] # ***************** # check/set $preset # ***************** # RETURN status: # 0 ... CANCEL button was pressed OR an ERROR occured -- # -- (should be taken care within $preset routine) # 1 ... $preset routine ended successfully if { $preset != {} } { if { ![eval $preset $file] } { return 0 } } # for GenGeom to know from which file to read XSF set xcMisc(external_xsf_name) $program_output set periodic(dim) $dim set species $spec file copy -force $file $system(SCRDIR)/xc_${state}.$system(PID) ############################## cd $system(SCRDIR) ############################## # execute CONVERTING program # ############################## if { $program_output != "stdout" } { eval xcCatchExecReturn $program $file } else { set program_output $system(SCRDIR)/xc_out.$system(PID) eval xcCatchExecReturn $program < $file > $program_output } # check if $program_output was created ?!! if { ! [file exists $program_output] } { tk_dialog [WidgetName] ERROR "openExtStruct ERROR:: $program_output file does not exist !!!" error 0 OK return } set geng(M3_ARGUMENT) [GetGengM3Arg $unit 95] # # determine periodic(igroup) # if { $state == "external34" } { xcAppendState $state xcCatchExecReturn $system(BINDIR)/gengeom $geng(M1_INFO) 1 $geng(M3_ARGUMENT) \ 1 1 1 1 $system(SCRDIR)/xc_gengeom.$system(PID) set fileID [open "$system(SCRDIR)/xc_gengeom.$system(PID)" r] GetDimGroup periodic(dim) periodic(igroup) $fileID close $fileID ResetDispModes CellMode OpenXSFStruct .mesa $system(SCRDIR)/xc_struc.$system(PID) set light On Lighting On # append 'render' to XCState(state) if "render" is not defines yet xcAppendState render xcUpdateState return } else { # state == external (means the format of $program_output is XSF) xsfOpenParsed $program_output .mesa return #xcCatchExecReturn $system(BINDIR)/gengeom $geng(M1_INFO) 1 $geng(M3_ARGUMENT) \ # 1 1 1 1 $system(SCRDIR)/xc_gengeom.$system(PID) \ # $program_output } } xcrysden-1.6.2/Tcl/propInit.tcl0000644000175000017500000002331213514607361015114 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/propInit.tcl # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# ############################################### # prop(unit9) .. name of Crystal95's unit 9 - it's path # prop(unit25_1).name of first Crystal95's unit25 on it's scratch directory # prop(unit25_2).name of second Crystal95's unit25 # prop(dir) .... name of directory, where fortran units are stored # prop(file) ... name of fortran unit (without possix) # prop(n_band) . number of bands # prop(band) ... selected bands # prop(firstband) ... first band for BWID # prop(lastband) ... last band for BWID # prop(newk) ... 0 = newk not yet set; 1 = newk already set # prop(newk_script) . newk's script # prop(doss_criteria) "band-interval criteria" or "energy-interval criteria" # prop(n_atom) ...... number of atoms per shell # prop(type_of_run) . RHF/UHF ########## # prop(NPY) ...... number of point along B-A segment (used by C95 by 2D grid # points evaluation # prop(NPZ) ...... number of point along third segment (used by C95 by # 3D grid points evaluation # prop(datagridDim) ..... dimensionality of datagrid # prop(isolevel)..... isolevel to extract in 3D isosurface evaluation # prop(pm_isolevel).. whether to render +/- of isolevel ########## # prop(dif_prop3D_list) .... list of properties that can be rendered as # isosurface difference maps # prop(spin_prop_list) .... list of spin dependent properties # prop(spin_case) .... 0/1; we may deal with UHF & spin-undependent # property and so prop(spin_case) is zero # prop(PATO_newbasis_A) .... when we select density matrix to be superposition # of atomic densities, than we can specify new basis # set # prop(PATO_newbasis_B) .... when using difference maps or properties on # surfaces we have to cards (A & B) ########## # prop(c95_BAND_script) .... script for band structure for c95's properties # prop(NLINE) .... # of lines in reciprocal space to be explored ############################################### ############################################### # dif_isosurf(dif_map) 0/1; 1 when diffrential map is on # dif_isosurf(denmat_A) what density matrix_A to take # dif_isosurf(file_textvar_A) label_text for left frame; # dif_isosurf(prop_A) properties A # dif_isosurf(spin_A) spin A ########## # dif_isosurf(load_another_unit9) 1 if another unit9 is reqursted; else 0 # dif_isosurf(unit9_B) another unit9 # dif_isosurf(file_textvar_B) label text for right frame # dif_isosurf(prop_B) properties B # dif_isosurf(denmat_B) what density matrix_B to take # dif_isosurf(spin_B) spin B ############################################### # for definition of ISOSURF array luks in "grid.tcl" file ############################################### ############################################################################## # THIS PROC IS CALLED WHEN WE OPEN CRYSTAL PROPERTIES ############################################################################## proc PropC95 {{path {}}} { global prop system err periodic nxdir nydir nzdir \ dif_isosurf xcMisc # some initializations PropC95Init GraphInit if { $path == "" } { set path [fileselect {Open CRYSTAL's unit 9}] } if { $path == "" } { return } xcAppendState c95 xcAppendState properties xcUpdateState # # update the title of toplevel # wm title . "XCrySDen: [file tail $path]" set xcMisc(titlefile) [file tail $path] set prop(unit9) $path append dif_isosurf(file_textvar_A) $path; #now we completed we element # this is just for now set prop(dir) $system(SCRDIR) ######################################## # CD to $system(SCRDIR) cd $system(SCRDIR) #catch {file delete -force __fort_unit} #file mkdir __fort_unit #cd __fort_unit # find out what is the name of fortran units (without number) set prop(file) [FtnName]. puts stderr $prop(file) cd $system(SCRDIR) # now copy prop(unit9) to $prop(dir)/$prop(file)9 file copy -force $prop(unit9) $system(SCRDIR)/$prop(file)9 # now we will get some info about \"case\" and we will render a structure set input "BASE\n0\nEXTPRT\nCOORPRT\nEND" if { ! [RunC95 $system(c95_properties) {} $input {} {} $system(SCRDIR)] } { #tk_dialog .err "ERROR" "ERROR: $err" error 0 OK return } GetC95Info EXTPRT $system(SCRDIR)/xc_struc.$system(PID) GetC95Info TYPE_OF_RUN $system(SCRDIR)/xc_output.$system(PID) puts stderr "Dimension of system: $periodic(dim)" # maybe structure is not 3 dimensional if { $periodic(dim) < 3 } { set nzdir 0 } if { $periodic(dim) < 2 } { set nydir 0 } if { $periodic(dim) < 1 } { set nxdir 0 } xcAppendState render xcUpdateState GenGeomDisplay OpenXSFStruct .mesa $system(SCRDIR)/xc_struc.$system(PID) } proc PropC95Init {} { global prop dif_isosurf isosurf openGL if [array exists prop] { unset prop } if [array exists dif_isosurf] { unset dif_isosurf } # initialize prop array set prop(newk) 0 set prop(NPRO) 0 set prop(PATO_newbasis_A) 0 set prop(PATO_newbasis_B) 0 set prop(datagridDim) 0 #set prop(dif_prop3D_list) { \ # {CHARGE DENSITY} \ # {CHARGE DENSITY GRADIENT} \ # {ELECTROSTATIC POTENTIAL} } set prop(dif_prop3D_list) { \ {CHARGE DENSITY} \ {ELECTROSTATIC POTENTIAL} } set prop(spin_prop_list) {ECHD "ECHG\n0"} set prop(isolevel) {} set prop(pm_isolevel) 0 # initialize dif_isosurf array set dif_isosurf(denmat_A) "SCF density matrix" set dif_isosurf(load_another_unit9) 0 set dif_isosurf(file_textvar_A) "default UNIT 9:\n" set dif_isosurf(denmat_B) \ "Density matrix as superposition of atomic densities" set dif_isosurf(file_textvar_B) "loaded UNIT 9:\nsame as in Map A" # initialization of dif_isosurf array SetIsoSurfArray ConvertTwoSideVar; # this is to switch isosurf(twoside_lighting) from 0/1 -> on/off } proc GetC95Info {whatlist file {dir {}}} { global system periodic geng prop if { $dir == {} } { ######################################## # CD to $system(SCRDIR) cd $system(SCRDIR) ######################################## } else { cd $dir } # whatlist:: lists of "whats" type of info needed foreach what $whatlist { if { $what == "EXTPRT" } { # usage of "gengeom" program: # # gengeom MODE1 MODE2 MODE3 IGRP NXDIR NYDIR NZDIR OUTPUT INPUT # 0 1 2 3 4 5 6 7 8 9 # # FIND FROM UNIT34 THE DIMENSIONALITY OF THE SYSTEM if { $system(c95_version) == "95" } { set geng(M3_ARGUMENT) [GetGengM3Arg BOHR 95] } elseif { $system(c95_version) == "98" } { set geng(M3_AGRUMENT) [GetGengM3Arg ANGS 98] } elseif { $system(c95_version) == "03" } { set geng(M3_AGRUMENT) [GetGengM3Arg ANGS 03] } elseif { $system(c95_version) == "06" } { set geng(M3_AGRUMENT) [GetGengM3Arg ANGS 06] } elseif { $system(c95_version) == "09" } { set geng(M3_AGRUMENT) [GetGengM3Arg ANGS 09] } elseif { $system(c95_version) == "14" } { set geng(M3_AGRUMENT) [GetGengM3Arg ANGS 14] } set file $system(SCRDIR)/xc_gengeom.$system(PID) xcCatchExecReturn $system(BINDIR)/gengeom $geng(M1_INFO) 1 $geng(M3_ARGUMENT) 1 1 1 1 $file set fileID [open $file r] GetDimGroup periodic(dim) periodic(igroup) $fileID close $fileID puts stdout "dim igroup:: $periodic(dim) $periodic(igroup)" } if { $what == "BWID" || $what == "DOSS" || $what == "BAND" } { # find out the number of bands set fileID [open $file r] foreach line [split [read $fileID] \n] { if [string match "*NUMBER OF AO*" $line] { set prop(n_band) [lindex $line 3] } if [string match "*N\. OF ATOMS PER CELL*" $line] { set prop(n_atom) [lindex $line 5] } } close $fileID } if { $what == "TYPE_OF_RUN" } { # allowed prop(type_of_run) values: UHF/RHF set fileID [open $file r] foreach line [split [read $fileID] \n] { if { [string match "*TYPE OF CALCULATION*" $line] } { if { $system(c95_version) == "03" || $system(c95_version) == "06" || $system(c95_version) == "09" || $system(c95_version) == "14" } { # # CRYSTAL03/06/09/14 # if { [string match "*UNRESTRICTED*" $line] } { set prop(type_of_run) UHF } else { set prop(type_of_run) RHF } } else { # # CRYSTAL-95/98 # set prop(type_of_run) [lindex $line end] } xcDebug -stderr "Type of CRYSTAL run: $prop(type_of_run)" } } } } } xcrysden-1.6.2/Tcl/movieEncoders.tcl0000644000175000017500000001515611712736221016115 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/__file__ # ------ # # Copyright (c) 2008 by Anton Kokalj # ############################################################################# proc determine_movie_encoders {} { global xcMisc set gif_encoder_priority_list {convert gifsicle whirlgif} set movie_encoder_priority_list {mencoder ppmtompeg} if { [info exists xcMisc(gif_encoder)] } { set gif_encoder_priority_list [linsert $gif_encoder_priority_list 0 [file tail $xcMisc(gif_encoder)]] } if { [info exists xcMisc(movie_encoder)] } { set movie_encoder_priority_list [linsert $movie_encoder_priority_list 0 [file tail $xcMisc(movie_encoder)]] } foreach enc $gif_encoder_priority_list { if { [info exists xcMisc($enc)] } { set xcMisc(gif_encoder) $enc break } } foreach enc $movie_encoder_priority_list { if { [info exists xcMisc($enc)] } { set xcMisc(movie_encoder) $enc break } } } # ------------------------------------------------------------------------ # # AVI/MPEG movies # # ------------------------------------------------------------------------ proc encode_movie {filelist outfile} { global gifAnim xcMisc system if { $gifAnim(temp_files_dir) == "pwd" } { set dir $system(PWD) cd $system(PWD) } else { set dir $system(SCRDIR) cd $system(SCRDIR) } set cmdLine [cmdLine_$xcMisc(movie_encoder) $filelist $outfile $dir] set cw [DisplayUpdateWidget "Encoding" "Encoding the movie"] eval xcCatchExecReturnRedirectStdErr $cmdLine destroy $cw } proc cmdLine_ppmtompeg {filelist outfile input_dir} { global xcMisc return "$xcMisc(ppmtompeg) [mpegCreateParamFile $outfile $input_dir [join $filelist\n]]" } proc cmdLine_mencoder {filelist outfile input_dir} { global gifAnim xcMisc if { [regexp {\.ppm[ \n\r,]|\.ppm$} $filelist] } { # we need to convert all *.PPM files to *.PNG files set cw [DisplayUpdateWidget "Converting" "Converting frame files to PNG format"] foreach image $gifAnim(filelist) { set newfile [file rootname $image].png scripting::_printToFile_imageConvert $image $newfile } set tmplist $filelist regsub -all -- {\.ppm} $tmplist .png filelist destroy $cw } set delay [expr {$gifAnim(delay) <= 0.0 ? 1 : $gifAnim(delay)}] set fps [expr 100.0 / $delay] set cmdLine "$xcMisc(mencoder) mf://[join $filelist ,]" if { [string toupper [file extension $outfile]] == ".AVI" } { # create AVI file append cmdLine " -mf fps=$fps -o $outfile -ovc lavc -lavcopts vcodec=mpeg4" } else { # create MPEG file append cmdLine " -of mpeg -mf fps=$fps -o $outfile -ovc lavc -lavcopts vcodec=mpeg2video" } if { $gifAnim(edit_param) } { set cmdLine [gifAnim:editParam $cmdLine] } return $cmdLine } # ------------------------------------------------------------------------ # # Animated GIF # # ------------------------------------------------------------------------ proc encode_gif {filelist outfile} { global gifAnim xcMisc mesa_bg system # determine the background color if { $gifAnim(gif_transp) } { if { ! [info exists mesa_bg(current)] } { set mesa_bg(current) \#000000 } if { [string index $mesa_bg(current) 0] == "#" } { set bg_color $mesa_bg(current) } else { set bg_color [rgb_f2h $mesa_bg(current)] } set gifAnim(bg_color) $bg_color } # construct the execution command-line for encoding set cmdLine [cmdLine_$xcMisc(gif_encoder) $filelist $outfile] # encode ... if { $gifAnim(temp_files_dir) == "pwd" } { cd $system(PWD) } else { cd $system(SCRDIR) } if { $gifAnim(edit_param) } { set cmdLine [gifAnim:editParam $cmdLine] } puts stderr "cmdLine=$cmdLine" flush stderr set cw [DisplayUpdateWidget "Encoding" "Encoding the Animated-GIF movie"] if { $xcMisc(gif_encoder) != "gifsicle" } { eval xcCatchExecReturnRedirectStdErr $cmdLine } else { eval exec_gifsicle $cmdLine } destroy $cw } proc cmdLine_convert {filelist outfile} { global gifAnim xcMisc if { $gifAnim(gif_transp) } { append comlin " -dispose Previous" } append comlin " $filelist -set delay $gifAnim(delay) -loop $gifAnim(loop)" if { $gifAnim(gif_global_colormap) && !$gifAnim(gif_transp) } { append comlin " +map" } if { $gifAnim(gif_transp) } { append comlin " -transparent $gifAnim(bg_color)" } if { $gifAnim(gif_minimize) } { append comlin " -layers optimize" } return [format "%s %s %s" $xcMisc(convert) $comlin $outfile] } proc cmdLine_gifsicle {filelist outfile} { global gifAnim xcMisc set flags "--no-warnings --delay $gifAnim(delay) --loopcount=$gifAnim(loop)" if { $gifAnim(gif_transp) } { append flags " --disposal background --transparent=$gifAnim(bg_color)" } if { $gifAnim(gif_minimize) } { append flags " -O2" } if { $gifAnim(gif_global_colormap) } { # ignored } return [format "%s %s %s > %s" $xcMisc(gifsicle) $flags $filelist $outfile] } proc cmdLine_whirlgif {filelist outfile} { global gifAnim xcMisc set flags " -time $gifAnim(delay) -loop $gifAnim(loop)" if { $gifAnim(gif_minimize) } { append flags " -minimize" } if { $gifAnim(gif_global_colormap) } { append flags " -globalmap" } if { $gifAnim(gif_transp) } { append flags " -disp prev -trans $gifAnim(bg_color)" } return [format "%s %s %s %s %s" $xcMisc(whirlgif) $flags -o $outfile $filelist] } proc exec_gifsicle {args} { xcDebug -stderr "Executing: $args" if { [catch {eval exec $args 2> gifsicle.stderr} errMsg] } { # gifsicle returns wrong status of 1 when -transparent option # is used set msg [ReadFile gifsicle.stderr] if { [string match {*Usage: gifsicle*} $msg] } { ErrorDialogInfo "while executing\nexec $args" $msg\n$errMsg uplevel 1 { return 1 } } } return 0 }xcrysden-1.6.2/Tcl/glLight.tcl0000644000175000017500000002263713513646153014714 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/glLight.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc glLight {{togl .mesa}} { global glLight xcFonts if { ! [info exists glLight(nlights)] } { set glLight(nlights) 6 } set t .gl_light if { [winfo exists $t] } { return } xcToplevel $t "Lights Setting" "Lights" set nb [NoteBook $t.nb] pack $nb -expand 1 -fill both for {set i 0} {$i < $glLight(nlights)} {incr i} { glLight:loadValues $i # insert page $nb insert $i light$i -text "Light \#.$i" set page [$nb getframe light$i] set cb [checkbutton $page.cb -text "Enable Light No.$i" -font $xcFonts(big) \ -relief raised -bd 1 \ -onvalue 1 -offvalue 0 \ -variable glLight($i)] pack $cb -side top -ipadx 5 -ipady 5 -padx 5 -pady 5 -fill x set f1 [frame $page.1 -relief groove -bd 2] pack $f1 -side top -expand 1 -fill both -padx 5 -pady 5 set cb1 [checkbutton $f1.cb -text "Local viewer lightmodel" \ -onvalue 1 -offvalue 0 \ -relief raised -bd 1 \ -variable glLight(lightmodel_local_viewer)] pack $cb1 -side top -padx 5 -pady 5 -fill x # in frame $f1 first goes the LIGHTMODEL ambient light set la [frame $f1.lightmodel_ambient -relief groove -bd 2] pack $la -side left -fill both -padx 2 -pady 5 -ipady 3 -expand 1 setRGBAwidget $la "Lightmodel\nambient light:" \ glLight(lightmodel_ambient_R) glLight(lightmodel_ambient_G) \ glLight(lightmodel_ambient_B) glLight(lightmodel_ambient_A) \ _LIGHTMODEL_AMBIENT_ # # in frame $f1 the RGBA widgets for ambient, diffuse, and # specular light will go. # foreach f {ambient diffuse specular} { set frame($f) [frame $f1.$f -relief groove -bd 2] pack $frame($f) -side left -fill both -padx 2 -pady 5 -ipady 3 -expand 1 setRGBAwidget $frame($f) "[string totitle $f] light:\n" \ glLight($i,${f}_R) glLight($i,${f}_G) glLight($i,${f}_B) glLight($i,${f}_A) \ _LIGHT${i}_[string toupper $f]_ } # # if frame $f2 goes the rest ... # # -fract_position {x y z w} # -spot_dir {x,y,z} # -spot_exp {v} # -spot_cutoff {v} # -const_atten {v} # -lin_atten {v} # -quad_atten {v} # LIGHT-POSITION set fracpos [frame $page.fracpos -relief groove -bd 2] set l1 [label $fracpos.__l -text "Light position (in fractions of molecular size)"] pack $fracpos -side top -fill x -padx 5 -pady 5 pack $l1 -side top -fill x set x [Entries $fracpos "X: Y: Z: W:" \ [list \ glLight($i,fract_position_X) \ glLight($i,fract_position_Y) \ glLight($i,fract_position_Z) \ glLight($i,fract_position_W)] \ 10 1 left -fill x] # add here code for entry-checking # SPOT-DIRECTION set spotdir [frame $page.spotdir -relief groove -bd 2] set l2 [label $spotdir.__l -text "Specular spot direction (in fractions of molecular size)"] pack $spotdir -side top -fill x -padx 5 -pady 5 pack $l2 -side top -fill x set x [Entries $spotdir "X: Y: Z:" \ [list \ glLight($i,spot_dir_X) \ glLight($i,spot_dir_Y) \ glLight($i,spot_dir_Z)] \ 10 1 left -fill x ] # add here code for entry-checking # the REST of the coeeficients set coef [frame $page.coef -relief groove -bd 2 ] pack $coef -side top -fill x -padx 5 -pady 5 FillEntries $coef { "Specular spot exponent:" "Specular spot cuttof:" "Constant light attenuation:" "Linear light attenuation:" "Quadratic light attenuation:" } [list \ glLight($i,spot_exp) \ glLight($i,spot_cutoff) \ glLight($i,const_atten) \ glLight($i,lin_atten) \ glLight($i,quad_atten) \ ] \ 27 10 # add here code for entry-checking # # in bottom frame goes the "Close|Update" buttons # set bottom [frame $page.bottom] pack $bottom -side top -fill x -padx 5 -pady 5 set close [button $bottom.close -text "Close" -command [list CancelProc $t]] set save [button $bottom.save -text "Save Lights" -command glLight:save] set load [button $bottom.load -text "Load Lights" -command glLight:load] set update [button $bottom.update -text "Update" -command [list glLight:update $togl $i]] pack $close $save $load $update -side left -padx 5 -pady 5 -ipadx 3 -ipady 3 -expand 1 } # show the page for light #.0 $nb raise light0 } proc glLight:update {togl i} { global glLight # load LIGHTMODEL if { $glLight($i) } { xcDebug "LIGHTMODEL> xc_setGLparam lightmodel -enable_light $i" xc_setGLparam lightmodel -enable_light $i } else { xcDebug "LIGHTMODEL> xc_setGLparam lightmodel -disable_light $i" xc_setGLparam lightmodel -disable_light $i } xc_setGLparam lightmodel -ambient \ [list \ $glLight(lightmodel_ambient_R) $glLight(lightmodel_ambient_G) \ $glLight(lightmodel_ambient_B) $glLight(lightmodel_ambient_A)] xc_setGLparam lightmodel -local_viewer $glLight(lightmodel_local_viewer) # load LIGHTS xc_setGLparam light \ -light $i \ -ambient [list $glLight($i,ambient_R) $glLight($i,ambient_G) $glLight($i,ambient_B) $glLight($i,ambient_A)] \ -diffuse [list $glLight($i,diffuse_R) $glLight($i,diffuse_G) $glLight($i,diffuse_B) $glLight($i,diffuse_A)] \ -specular [list $glLight($i,specular_R) $glLight($i,specular_G) $glLight($i,specular_B) $glLight($i,specular_A)] \ -fract_position [list \ $glLight($i,fract_position_X) $glLight($i,fract_position_Y) \ $glLight($i,fract_position_Z) $glLight($i,fract_position_W)] \ -spot_dir [list $glLight($i,spot_dir_X) $glLight($i,spot_dir_Y) $glLight($i,spot_dir_Z)] \ -spot_exp $glLight($i,spot_exp) \ -spot_cutoff $glLight($i,spot_cutoff) \ -const_atten $glLight($i,const_atten) \ -lin_atten $glLight($i,lin_atten) \ -quad_atten $glLight($i,quad_atten) # now do Togl_PostRedisplay(".mesa") to update the change ... # t.k. # BEWARE: this is dirty and usefull only for present purpose if { $togl != {} } { if { $togl == ".mesa" } { $togl render } else { # force updating the projection and correspondingly lights position cry_toglzoom $togl 0.0 } } } proc glLight:loadValues {i} { global glLight set glLight($i) [xc_getGLparam lightmodel -get [list is_light_enabled $i]] GetOpenGLPar _LIGHTMODEL_AMBIENT_ \ glLight(lightmodel_ambient_R) glLight(lightmodel_ambient_G) \ glLight(lightmodel_ambient_B) glLight(lightmodel_ambient_A) GetOpenGLPar _LIGHTMODEL_LOCAL-VIEWER_ \ glLight(lightmodel_local_viewer) d1 d2 d3 foreach f {ambient diffuse specular} { set F [string toupper $f] GetOpenGLPar _LIGHT${i}_${F}_ glLight($i,${f}_R) glLight($i,${f}_G) glLight($i,${f}_B) glLight($i,${f}_A) } GetOpenGLPar _LIGHT${i}_FRACT-POSITION_ \ glLight($i,fract_position_X) glLight($i,fract_position_Y) \ glLight($i,fract_position_Z) glLight($i,fract_position_W) GetOpenGLPar _LIGHT${i}_SPOT-DIR_ \ glLight($i,spot_dir_X) glLight($i,spot_dir_Y) glLight($i,spot_dir_Z) d1 GetOpenGLPar _LIGHT${i}_SPOT-EXP_ glLight($i,spot_exp) d1 d2 d3 GetOpenGLPar _LIGHT${i}_SPOT-CUTOFF_ glLight($i,spot_cutoff) d1 d2 d3 GetOpenGLPar _LIGHT${i}_CONST-ATTEN_ glLight($i,const_atten) d1 d2 d3 GetOpenGLPar _LIGHT${i}_LIN-ATTEN_ glLight($i,lin_atten) d1 d2 d3 GetOpenGLPar _LIGHT${i}_QUAD-ATTEN_ glLight($i,quad_atten) d1 d2 d3 } proc glLight:save {} { global glLight system set file [tk_getSaveFile -defaultextension .lights \ -filetypes { {{XCRYSDEN Lights File} {.lights}} {{All Files} {.*} } } \ -initialdir $system(PWD) \ -initialfile my_lights.lights \ -title "Save XCRYSDEN Lights File"] if { $file == "" } { return } puts stderr "Lights File: $file" puts stderr "Content: [array get glLight]" WriteFile $file [array get glLight] w } proc glLight:load {{file {}}} { global glLight system if { $file != "" } { if { ! [file exists $file] } { ErrorDialog "file \"$file\" does not exist !!!" return } } else { set file [tk_getOpenFile -defaultextension .lights \ -filetypes { {{XCRYSDEN Lights File} {.lights}} {{All Files} {.*} } } \ -initialdir $system(PWD) \ -title "Load XCRYSDEN Lights File"] if { $file == "" } { return } } # load the lights array set glLight [ReadFile $file] # update the lights if { ! [info exists glLight(nlights)] } { set glLight(nlights) 6 } for {set i 0} {$i < $glLight(nlights)} {incr i} { if { $glLight($i) } { glLight:update "" $i } } } xcrysden-1.6.2/Tcl/printCanvas.tcl0000644000175000017500000004032712352551166015605 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/printCanvas.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc xcPrintCanvas {can {args {}}} { global printCanvas system # first query canvas dimension # WARNING:: if canvas is scrolled we will get just viewable dimesions; # in that case user can specified scroll-dimensions!!! if [info exists printCanvas(printCommand)] { set com $printCanvas(printCommand) } if [array exists printCanvas] { unset printCanvas } if [info exists com] { set printCanvas(printCommand) $com } set printCanvas(gnuplot_print) 0 if { $can == "none" } { set printCanvas(c_w) 300 set printCanvas(c_h) 300 } else { set printCanvas(c_w) [$can cget -width] set printCanvas(c_h) [$can cget -height] } set i 0 foreach option $args { incr i # odd cycles are tags, even options if { $i%2 } { set tag $option } else { # # practically non of the option is supported yet # switch -exact -- $tag { -canvas_scrollwidth { set printCanvas(c_w) $option } -canvas_scrollheight { set printCanvas(c_h) $option } -colormap { set printCanvas(colormap) $option } -colormode { set printCanvas(colormode) $option } -file { set printCanvas(file) $option } -fontmap { set printCanvas(fontmap) $option } -height { set printCanvas(height) $option } -pageanchor { set printCanvas(pageanchor) $option } -pageheight { set printCanvas(pageheight) $option } -pagewidth { set printCanvas(pagewidth) $option } -pagex { set printCanvas(pagex) $option } -pagey { set printCanvas(pagey) $option } -rotate { set printCanvas(rotate) $option } -width { set printCanvas(width) $option } -x { set printCanvas(x) $option } -y { set printCanvas(y) $option } -gnuplot_print { set printCanvas(gnuplot_print) $option } default { tk_dialog [WidgetName] Error \ "ERROR: Bad xcPrintCanvas configure option $tag" \ error 0 OK } } } } if { $i%2 } { tk_dialog [WidgetName] Error "ERROR: You called xcPrintCanvas with an odd number of args !" \ error 0 OK return 0 } if { $can == "none" && $printCanvas(gnuplot_print) != 1 } { tk_dialog [WidgetName] Error "ERROR: xcPrintCanvas was misused; code: none && !gnuplot_print" error 0 OK return 0 } # # how much is one screen-pixel # #set sp2cm [winfo fpixels $can 1c] #set sp2in [winfo fpixels $can 1i] #puts "$sp2cm $sp2in" # # initialize variables # set printCanvas(margin) 2c if ![info exists printCanvas(paperSize)] { set printCanvas(paperFormat) A4 set printCanvas(paperSize) {209.9m 297m} } if ![info exists printCanvas(paperOrient)] { set printCanvas(paperOrient) Portrait } if ![info exists printCanvas(printTo)] { set printCanvas(printTo) Printer } if ![info exists printCanvas(printCommand)] { set printCanvas(printCommand) lpr } set oldgrab [grab current] set t [xcToplevel [WidgetName] Print Print . 100 100 1] catch { grab $t } set printCanvas(toplevel) $t set f1 [frame $t.f1] set f2 [frame $t.f2 -relief raised -bd 2] set f3 [frame $t.f3 -relief raised -bd 2] pack $f1 $f2 $f3 -side top -expand 1 -fill both -ipady 5 # # upper frame - f1: left -> canvas; right -> options # set f1l [frame $f1.l -relief raised -bd 2] set f1r [frame $f1.r] pack $f1l $f1r -side left -expand 1 -fill both -ipady 5 # f1-left set c [canvas $f1l.c -width 200 -height 200 -relief sunken -bd 2] set printCanvas(can) $c if { $can == "none" } { set can $c } # create background rectangle $c create rectangle -2 -2 210 210 \ -fill "#999" \ -outline "#999" \ -stipple gray25 \ -tags "bg" set f1l1 [frame $f1l.1] set min [button $f1l1.min \ -bitmap "@$system(BMPDIR)/xcPrintCanvas_left.xbm" \ -command [list xcPrintDrawPic $c lt]] set maj [button $f1l1.maj \ -bitmap "@$system(BMPDIR)/xcPrintCanvas_right.xbm" \ -command [list xcPrintDrawPic $c gt]] set max [button $f1l1.max -text "Max" \ -command [list xcPrintDrawPic $c max]] pack $c $f1l1 -side top -expand 1 -padx 10 pack $min $maj $max -side left -expand 1 -padx 10 # f1-right: up set f1ru [frame $f1r.up -relief raised -bd 2] pack $f1ru -side top -fill both -ipady 5 -expand 1 RadioButCmd $f1ru {Paper Size:} printCanvas(paperFormat) \ xcPrintPaperFormat top left 1 0 3 \ A4 {8.5"x11"} RadioButCmd $f1ru {Paper Orientation:} printCanvas(paperOrient) \ xcPrintOrient top left 1 0 3 \ Portrait Landscape set f1ruu [frame $f1ru.fu -relief groove -bd 2] pack $f1ruu -side top -padx 3 -pady 3 -expand 1 -fill both set f1ru1 [frame $f1ru.f1] set f1ru2 [frame $f1ru.f2] set f1ru3 [frame $f1ru.f3] pack $f1ru1 $f1ru2 $f1ru3 -in $f1ruu -side top -fill both -expand 1 set lt [label $f1ru1.lt -text "Picture Size:"] pack $lt -side top set ls [label $f1ru1.ls -text "Current Size:"] set es [label $f1ru1.es \ -textvariable printCanvas(currentSize)] pack $ls $es -side left -pady 5 set sw [label $f1ru2.ss -text "Set Width:" -width 11] set ew [entry $f1ru2.ew -textvariable printCanvas(cw_m) -width 3] set lw [label $f1ru2.lw -text "mm"] bind $ew [list xcPrintSetSize $c $ew] if { $printCanvas(gnuplot_print) != 1 } { set upd [button $f1ru2.upd -text "Update" \ -width 4 \ -command [list xcPrintSetSize $c $ew]] pack $sw $ew $lw $upd -side left -pady 5 } else { set sh [label $f1ru3.ss -text "Set Height:" -width 11] set eh [entry $f1ru3.ew -textvariable printCanvas(ch_m) -width 3] set lh [label $f1ru3.lw -text "mm"] set upd [button $f1ru3.upd -text "Update" \ -width 4 \ -command [list xcPrintSetSize $c $ew $eh]] bind $eh [list xcPrintSetSize $c $ew $eh] pack $sw $ew $lw -side left -pady 5 pack $sh $eh $lh $upd -side left -pady 5 } # f1-right: down set f1rd [frame $f1r.dn -relief raised -bd 2] pack $f1rd -side top -fill x -ipady 3 RadioButCmd $f1rd {Print to:} printCanvas(printTo) \ xcPrintPrintTo top left 1 1 3 \ Printer File # # frame f2: Print Command # set f21 [frame $f2.1] set f22 [frame $f2.2] set f22l [frame $f22.l] set f22r [frame $f22.r] pack $f21 $f22 -side top -expand 1 -fill both pack $f22l -side left -expand 1 -fill both pack $f22r -side left -fill both set printCanvas(printWid) $f21 set printCanvas(fileWid) $f22 set printCanvas(printEntry) \ [FillEntries $f21 {"Print Command:"} printCanvas(printCommand) \ 15 {} top left] set printCanvas(fileEntry) \ [FillEntries $f22l {"Filename:"} printCanvas(file) \ 15 {} top left] set types { {{All Files} * } {{PS Files} {.ps} } {{EPS Files} {.eps} } } set fn [button $f22r.b1 -text "Filename" \ -command [list xcPrintFilename $types]] pack $fn -side top -padx 5 # # frame 3: Cancel & Print # set cancel [button $f3.can -text Cancel -command [list CancelProc $t]] set print [DefaultButton $f3.print -text Print \ -done_var printCanvas(done)] pack $cancel $print -side left -padx 5 -expand 1 # # initial setup # xcPrintPrintTo $printCanvas(printTo) xcPrintDrawPaper $c xcPrintDrawPic $c max tkwait variable printCanvas(done) # # now print postscript # if { $printCanvas(paperOrient) == "Portrait" } { set printCanvas(rotate) 0 } else { set printCanvas(rotate) 1 } # # maybe we want to print using gnuplot # if $printCanvas(gnuplot_print) { GnuplotPrint } else { xcDebug "PictureSize:: [xcPrintPix2MM $printCanvas(pic_w)]m" if { $printCanvas(printTo) == "Printer" } { set ps [$can postscript \ -pagewidth [xcPrintPix2MM $printCanvas(pic_w)]m \ -width $printCanvas(c_w) \ -height $printCanvas(c_h) \ -rotate $printCanvas(rotate)] if { [catch {eval exec $printCanvas(printCommand) {<<\n$ps}} error] } { tk_dialog [WidgetName] ERROR \ "ERROR: An Error has occurred when trying to print: $error" error 0 OK destroy $t return 0 } } else { # parse $printCanvas(file) set file [GetAbsoluteFileName $printCanvas(file)] $can postscript \ -pagewidth [xcPrintPix2MM $printCanvas(pic_w)]m \ -width $printCanvas(c_w) \ -height $printCanvas(c_h) \ -file $file \ -rotate $printCanvas(rotate) } } catch { grab release $t } destroy $t if { $oldgrab != "" } { catch { grab $oldgrab } } } proc xcPrintDrawPaper {can} { global printCanvas set ration [expr 190 / [winfo fpixels $can 297m]] if { $printCanvas(paperOrient) == {Portrait} } { set pw [expr $ration * \ [winfo fpixels $can [lindex $printCanvas(paperSize) 0]]] set ph [expr $ration * \ [winfo fpixels $can [lindex $printCanvas(paperSize) 1]]] } else { set pw [expr $ration * \ [winfo fpixels $can [lindex $printCanvas(paperSize) 1]]] set ph [expr $ration * \ [winfo fpixels $can [lindex $printCanvas(paperSize) 0]]] } set bbox [xcPrintBBox $pw $ph] set x1 [lindex $bbox 0] set y1 [lindex $bbox 1] set x2 [lindex $bbox 2] set y2 [lindex $bbox 3] $can delete paper $can create rectangle \ [expr $x1 + 3] [expr $y1 + 3] \ [expr $x2 + 3] [expr $y2 + 3] \ -fill "#000" \ -outline "#000" \ -tags "paper back" $can create rectangle $x1 $y1 $x2 $y2 \ -fill "#ffffff" \ -outline "#000" \ -tags "paper front" } proc xcPrintDrawPic {can {mode {}}} { global printCanvas set ration [expr 190 / [winfo fpixels $can 297m]] switch -exact -- $mode { gt { # magnify by 5% set printCanvas(pic_w) [expr $printCanvas(pic_w) * 1.05] set printCanvas(pic_h) [expr $printCanvas(pic_h) * 1.05] } lt { # shrink set printCanvas(pic_w) [expr $printCanvas(pic_w) / 1.05] set printCanvas(pic_h) [expr $printCanvas(pic_h) / 1.05] } max { set pw [expr $ration * \ [winfo fpixels $can [lindex $printCanvas(paperSize) 0]]] set ph [expr $ration * \ [winfo fpixels $can [lindex $printCanvas(paperSize) 1]]] set maxw [expr $pw - $ration * [winfo fpixels $can \ $printCanvas(margin)]] set maxh [expr $ph - $ration * [winfo fpixels $can \ $printCanvas(margin)]] set pic_w [expr $ration * \ [winfo fpixels $can $printCanvas(c_w)]] set pic_h [expr $ration * \ [winfo fpixels $can $printCanvas(c_h)]] set wr [expr $pic_w / $pw] set hr [expr $pic_h / $ph] # is it higher or wider if { $wr > $hr } { # it is wider set picr [expr $maxw / $pic_w] } else { set picr [expr $maxh / $pic_h] } set printCanvas(pic_w) [expr $picr * $pic_w] set printCanvas(pic_h) [expr $picr * $pic_h] } } # update printCanvas(currentSize) set w [xcPrintPix2MM $printCanvas(pic_w)] set h [xcPrintPix2MM $printCanvas(pic_h)] xcDebug "$printCanvas(pic_w) $printCanvas(pic_h)" set printCanvas(currentSize) [format "%3.0f%2s x %3.0f%2s" $w mm $h mm] set bbox [xcPrintBBox $printCanvas(pic_w) $printCanvas(pic_h)] $can delete picture xcDebug "Pic: $bbox $mode" eval {$can create rectangle} $bbox {\ -fill "#0f0" \ -outline "#000" \ -stipple gray25 \ -tags "picture"} } proc xcPrintPaperFormat item { global printCanvas xcDebug "xcPrintPaperFormat: $item" if { $item == {A4} } { set printCanvas(paperSize) {209.9m 297m} } elseif { $item == {8.5"x11"} } { set printCanvas(paperSize) {8.5i 11i} } xcPrintDrawPaper $printCanvas(can) xcPrintDrawPic $printCanvas(can) } proc xcPrintOrient item { global printCanvas xcDebug "xcPrintOrient: $item" set printCanvas(paperOrient) $item xcPrintDrawPaper $printCanvas(can) xcPrintDrawPic $printCanvas(can) } proc xcPrintPrintTo item { global printCanvas set disabled_color [lindex \ [GetWidgetConfig button -disabledforeground] end] set enabled_color [lindex \ [GetWidgetConfig button -foreground] end] set fileLabel "[string trimright $printCanvas(fileEntry) entry1]lab1" set printLabel "[string trimright $printCanvas(printEntry) entry1]lab1" if { $item == {Printer} } { xcDisableAll $printCanvas(fileWid) xcEnableAll $printCanvas(printWid) $printCanvas(fileEntry) configure -relief flat $printCanvas(printEntry) configure -relief sunken $fileLabel configure -foreground $disabled_color $printLabel configure -foreground $enabled_color } elseif { $item == {File} } { xcDisableAll $printCanvas(printWid) xcEnableAll $printCanvas(fileWid) $printCanvas(fileEntry) configure -relief sunken $printCanvas(printEntry) configure -relief flat $fileLabel configure -foreground $enabled_color $printLabel configure -foreground $disabled_color } } proc xcPrintSetSize {can args} { global printCanvas if { $printCanvas(gnuplot_print) != 1 } { set varlist {{printCanvas(cw_m) posreal}} } else { set varlist {{printCanvas(cw_m) posreal} {printCanvas(ch_m) posreal}} } if [check_var $varlist $args] { set pic_w [xcPrintMM2Pix $printCanvas(cw_m)] set r [expr $pic_w / double($printCanvas(pic_w))] set printCanvas(pic_w) [expr $r * $printCanvas(pic_w)] if { $printCanvas(gnuplot_print) != 1 } { set printCanvas(pic_h) [expr $r * $printCanvas(pic_h)] } else { set pic_h [xcPrintMM2Pix $printCanvas(ch_m)] set r [expr $pic_h / double($printCanvas(pic_h))] set printCanvas(pic_h) [expr $r * $printCanvas(pic_h)] } xcPrintDrawPic $can } } proc xcPrintPix2MM x { return [expr 297. * double($x) / 190.] } proc xcPrintMM2Pix x { return [expr 190. * double($x) / 297.] } proc xcPrintBBox {pw ph} { set x1 [expr (200 - $pw) / 2] set y1 [expr (200 - $ph) / 2] set x2 [expr $x1 + $pw] set y2 [expr $y1 + $ph] return [list $x1 $y1 $x2 $y2] } proc xcPrintFilename types { global printCanvas system set pwd [pwd] cd $system(PWD) set printCanvas(file) [tk_getSaveFile \ -title {Specify Filename} \ -filetypes $types \ -parent $printCanvas(toplevel)] cd $pwd } #lappend auto_path "/home/tone/src/xcrysden0.0/src" #lappend auto_path [pwd] # #set system(TOPDIR) [pwd] #set system(SCRDIR) /tmp #set system(PWD) [pwd] #set system(PID) [pid] #set system(FORDIR) $system(TOPDIR)/F #set system(TCLDIR) $system(TOPDIR) #set system(BINDIR) $system(TOPDIR) #set system(BMPDIR) $system(TOPDIR)/bitmap #button .b -text TONE #entry .e -text TONE #set xcFonts(normal) [lindex [.b configure -font] end] #set xcFonts(normal_entry) [lindex [.e configure -font] end] #set xcFonts(small) [ModifyFontSize .b 10 \ # {-family helvetica -slant r -weight bold}] #set xcFonts(small_entry) [ModifyFontSize .e 10 \ # {-family helvetica -slant r -weight normal}] #destroy .b .e # #set ft [frame .ft -relief sunken -bd 2] #pack $ft -side top -expand true -fill y # #set c [canvas $ft.canv -yscrollcommand [list $ft.yscroll set]] #set scb [scrollbar $ft.yscroll -orient vertical -command [list $c yview]] #pack $scb -side right -fill y #pack $c -side left -fill both -expand true # #$c config -width 300 -height 100 \ # -scrollregion "0 0 300 300" #xcPrintCanvas $c xcrysden-1.6.2/Tcl/colormenu.tcl0000644000175000017500000001274511712736221015317 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/colormenu.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc ColorMenu {can mcolor} { global mody radio mesa_bg xcColors cm set cm(can) $can ########################################################################### # COLOR MENU set mesa_bg(black) {0.0 0.0 0.0 1.0} set mesa_bg(white) {1.0 1.0 1.0 1.0} set mesa_bg(red) {0.6 0.0 0.0 1.0} set mesa_bg(green) {0.0 0.6 0.0 1.0} set mesa_bg(blue) {0.0 0.0 0.6 1.0} set mesa_bg(darkcyan) {0.0 0.362 0.410 1.0} set mesa_bg(lightbrown) {0.699 0.684 0.258 1.0} set mesa_bg(default) [concat [rgb_h2f $xcColors(normal_bg)] 1.0] set mesa_bg(hx_black) [rgb_f2h $mesa_bg(black)] set mesa_bg(hx_white) [rgb_f2h $mesa_bg(white)] set mesa_bg(hx_red) [rgb_f2h $mesa_bg(red)] set mesa_bg(hx_green) [rgb_f2h $mesa_bg(green)] set mesa_bg(hx_blue) [rgb_f2h $mesa_bg(blue)] set mesa_bg(hx_darkcyan) [rgb_f2h $mesa_bg(darkcyan)] set mesa_bg(hx_lightbrown) [rgb_f2h $mesa_bg(lightbrown)] set mesa_bg(hx_default) [rgb_f2h $mesa_bg(default)] set mesa_bg(hx_ac_black) [rgb_ac_f2h $mesa_bg(black)] set mesa_bg(hx_ac_white) [rgb_ac_f2h $mesa_bg(white)] set mesa_bg(hx_ac_red) [rgb_ac_f2h $mesa_bg(red)] set mesa_bg(hx_ac_green) [rgb_ac_f2h $mesa_bg(green)] set mesa_bg(hx_ac_blue) [rgb_ac_f2h $mesa_bg(blue)] set mesa_bg(hx_ac_darkcyan) [rgb_ac_f2h $mesa_bg(darkcyan)] set mesa_bg(hx_ac_lightbrown) [rgb_ac_f2h $mesa_bg(lightbrown)] set mesa_bg(hx_ac_default) [rgb_ac_f2h $mesa_bg(default)] if ![info exists radio($can,bg)] { set radio($can,bg) $mesa_bg(hx_ac_black) } $mcolor add radiobutton -label "black" \ -command [list eval {xc_newvalue $cm(can) \ $mody(L_BACKGROUND) } $mesa_bg(black)]\ -variable radio($can,bg) \ -value $mesa_bg(hx_ac_black) \ -background $mesa_bg(hx_black) -foreground #ffffff \ -activebackground $mesa_bg(hx_ac_black) \ -activeforeground #ffffff # Date: Mon Mar 22 19:39:01 CET 1999 # t.k: I stoped here; update all values to $mesa_bg(hx_ac_XXX) ############################################################## $mcolor add radiobutton -label "white" \ -command [list eval {xc_newvalue $cm(can) \ $mody(L_BACKGROUND)} $mesa_bg(white)] \ -variable radio($can,bg) \ -value $mesa_bg(hx_ac_white) \ -background $mesa_bg(hx_white) -foreground #000000 \ -activebackground $mesa_bg(hx_ac_white) $mcolor add radiobutton -label "red" \ -command [list eval {xc_newvalue $cm(can) \ $mody(L_BACKGROUND)} $mesa_bg(red)]\ -variable radio($can,bg) \ -value $mesa_bg(hx_ac_red) \ -background $mesa_bg(hx_red) -foreground #ffffff \ -activebackground $mesa_bg(hx_ac_red) $mcolor add radiobutton -label "green" \ -command [list eval {xc_newvalue $cm(can) \ $mody(L_BACKGROUND)} $mesa_bg(green)]\ -variable radio($can,bg) \ -value $mesa_bg(hx_ac_green) \ -background $mesa_bg(hx_green) -foreground #ffffff \ -activebackground $mesa_bg(hx_ac_green) $mcolor add radiobutton -label "blue" \ -command [list eval {xc_newvalue $cm(can) \ $mody(L_BACKGROUND)} $mesa_bg(blue)]\ -variable radio($can,bg) \ -value $mesa_bg(hx_ac_blue) \ -background $mesa_bg(hx_blue) -foreground #ffffff \ -activebackground $mesa_bg(hx_ac_blue) $mcolor add radiobutton -label "dark cyan" \ -command [list eval {xc_newvalue $cm(can) \ $mody(L_BACKGROUND)} $mesa_bg(darkcyan)]\ -variable radio($can,bg) \ -value $mesa_bg(hx_ac_darkcyan) \ -background $mesa_bg(hx_darkcyan) -foreground #ffffff \ -activebackground $mesa_bg(hx_ac_darkcyan) $mcolor add radiobutton -label "light brown" \ -command [list eval {xc_newvalue $cm(can) \ $mody(L_BACKGROUND)} $mesa_bg(lightbrown)]\ -variable radio($can,bg) \ -value $mesa_bg(hx_ac_lightbrown) \ -background $mesa_bg(hx_lightbrown) -foreground #ffffff \ -activebackground $mesa_bg(hx_ac_lightbrown) $mcolor add radiobutton -label "default" \ -command [list eval {xc_newvalue $cm(can) \ $mody(L_BACKGROUND)} $mesa_bg(default)] \ -variable radio($can,bg) \ -value $mesa_bg(hx_ac_default) \ -background $mesa_bg(hx_default) \ -activebackground $mesa_bg(hx_ac_default) $mcolor add separator $mcolor add command -label "Custom ..." \ -command [list xcMesaChangeBg $can] trace variable radio($can,bg) w xcTrace }xcrysden-1.6.2/Tcl/setIsosurfArray.tcl0000644000175000017500000000336411712736221016456 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/setIsosurfArray.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc SetIsoSurfArray {} { global isosurf set isosurf(spin) {} set isosurf(res_type) "angstroms" set isosurf(mb_angs/bohr) "Angstroms" set isosurf(space_sel) "whole_cell" set isosurf(Y_Sel) "centered" set isosurf(Z_Sel) "centered" set isosurf(expand) "none" set isosurf(expand_X) 1 set isosurf(expand_Y) 1 set isosurf(expand_Z) 1 set isosurf(type_of_isosurf) "solid" set isosurf(shade_model) "smooth" set isosurf(transparency) "off" set isosurf(twoside_lighting) [xc_getGLparam lightmodel -get two_side_iso] set isosurf(tessellation_type) cubes set isosurf(normals_type) gradient } xcrysden-1.6.2/Tcl/forces.tcl0000644000175000017500000001431311712736221014566 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/forces.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc forceVectors can { global check sInfo if { ! [info exists sInfo(lforce)] } { return } if { ! $sInfo(lforce) } { return } if { $check(forces) } { xc_forces $can on $can render xcSwapBuffers } else { xc_forces $can off $can render xcSwapBuffers } } proc forceVectorsSet can { global check forceVec sInfo if { ! [info exists sInfo(lforce)] } { return } set c [lindex [split $can .] end] if { [winfo exists .force$c] } { return } if { ![info exists forceVec(scalefunction)] } { global mody set forceVec(scalefunction) linear set forceVec(threshold) 0.0005 set forceVec(lengthfactor) 200 set forceVec(rod_thickf) [xc_getdefault $mody(D_FORCE_RODTHICKF)] set forceVec(arr_thickf) [xc_getdefault $mody(D_FORCE_ARRTHICKF)] set forceVec(arr_lenf) [xc_getdefault $mody(D_FORCE_ARRLENF)] set forceVec(color) [xc_getdefault $mody(D_FORCE_COLOR)] puts stderr "forceVec: color == $forceVec(color)" } # from here on: widget managing set t [xcToplevel .force$c "Forces: Settings" "Forces" . -0 0 1] set f1 [frame $t.f1 -relief ridge -bd 2] set f2 [frame $t.f2 -relief ridge -bd 2] set f3 [frame $t.f3] pack $f1 $f2 $f3 -side top -expand 1 -fill x -padx 3m -pady 3m -ipadx 3m -ipady 3m pack $f3 -side top -expand 1 # # FRAME-1: Scale-Function + Threshold + Length-factor # set mb [xcMenuButton $f1 \ -labeltext "Scale Function:" \ -labelwidth 15 \ -textvariable forceVec(scalefunction) \ -menu { \ {Linear} {set forceVec(scalefunction) linear} \ {Natural Logarithm} {set forceVec(scalefunction) log} \ {Decadic Logaritm} {set forceVec(scalefunction) log10} \ {Square Root} {set forceVec(scalefunction) sqrt} \ {Cubic Root} {set forceVec(scalefunction) root3} \ {Exponential} {set forceVec(scalefunction) exp} \ {exp(x*x)} {set forceVec(scalefunction) exp2} \ }] set m1 [message $f1.m1 -justify left -aspect 800 \ -text "Threshold::\ndo not show the forces whose magnitude is smaller then the specified threshold.\n\n\nLength Factor::\nassumed unit for force is Hartree/Angstrom\nforceVector_length == forceVectorSize * LengthFactor"] pack $mb $m1 -side top -fill x -anchor w -expand 1 FillEntries $f1 {Treshold {Length Factor}} \ {forceVec(threshold) forceVec(lengthfactor)} 13 10 top left # # FRAME-2: attributes + Threshold + Length-factor # FillEntries $f2 { "Vectors thickness factor:" "Thickness factor for arrow-cap:" "Length factor for arrow-cap:" } {forceVec(rod_thickf) forceVec(arr_thickf) forceVec(arr_lenf)} 31 10 top left button $f2.button -text "Set vector's color" -command [list forceVectors_Color $t] button $f2.reset -text "Reset vector's attributes" -command forceVectors_ResetAttributes pack $f2.button -side left -padx 5 -pady 5 pack $f2.reset -side right -padx 5 -pady 5 # # FRAME-3: Close + Update buttons # set b1 [button $f3.close -text "Close" -command [list DestroyWid $t]] set b2 [button $f3.update -text "Update" \ -command [list forceUpdate $can]] pack $b1 $b2 -side left -padx 3m -pady 3m -expand 1 } proc forceUpdate can { global forceVec mody xc_forces $can scalefunction $forceVec(scalefunction) xc_forces $can threshold $forceVec(threshold) xc_forces $can lengthfactor $forceVec(lengthfactor) xc_newvalue .mesa $mody(R_FORCE_RODTHICKF) $forceVec(rod_thickf) xc_newvalue .mesa $mody(R_FORCE_ARRTHICKF) $forceVec(arr_thickf) xc_newvalue .mesa $mody(R_FORCE_ARRLENF) $forceVec(arr_lenf) eval xc_newvalue .mesa $mody(R_FORCE_COLOR) $forceVec(color) $can render xcSwapBuffers } proc forceVectors_Color {parent} { global forceVec set t [xcToplevel [WidgetName] \ "Set Color of Vectors" "Vector's color" $parent 0 0 1] set init_color [rgb_f2h $forceVec(color)] xcModifyColor $t "Set Color of Vectors" $init_color \ groove left left 100 100 70 5 20 set forceVec(colorID) [xcModifyColorGetID] set ok [DefaultButton [WidgetName $t] -text "OK" \ -command [list forceVectors_ColorOK $t]] set can [button [WidgetName $t] -text "Cancel" \ -command [list destroy $t]] pack $ok $can -padx 10 -pady 10 -expand 1 } proc forceVectors_ColorOK {t} { global forceVec mody_col mody set id $forceVec(colorID) set alpha [lindex $forceVec(color) 3] set forceVec(color) [list $mody_col($id,red) $mody_col($id,green) $mody_col($id,blue) $alpha] # update vector's color eval xc_newvalue .mesa $mody(L_FORCE_COLOR) $forceVec(color) destroy $t } proc forceVectors_ResetAttributes {} { global forceVec mody # reset attributes xc_resetvar .mesa $mody(R_FORCE_RODTHICKF) xc_resetvar .mesa $mody(R_FORCE_ARRTHICKF) xc_resetvar .mesa $mody(R_FORCE_ARRLENF) xc_resetvar .mesa $mody(R_FORCE_COLOR) # now reload default values to forceVec set forceVec(rod_thickf) [xc_getdefault $mody(D_FORCE_RODTHICKF)] set forceVec(arr_thickf) [xc_getdefault $mody(D_FORCE_ARRTHICKF)] set forceVec(arr_lenf) [xc_getdefault $mody(D_FORCE_ARRLENF)] set forceVec(color) [xc_getdefault $mody(D_FORCE_COLOR)] } xcrysden-1.6.2/Tcl/g98.tcl0000644000175000017500000001017713523236535013725 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/g98.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc g98Cube {{file {}} {viewmol_exists {}}} { global g98 system # delete welcome window set title_off 0 if {[winfo exists .title]} { destroy .title set title_off 1 } if { $file == {} } { # get-file set file [tk_getOpenFile -defaultextension .cube \ -filetypes { {{All Files} {.*} } } -initialdir $system(PWD) \ -title "Open Gaussian CUBE File"] if { $file == "" } { return } } else { if { ![file exists $file] } { ErrorDialog "WARNING: File \"$file\" does not exist !!!" return } } # now create a Viewer ... if { $viewmol_exists == "" } { if { $title_off } { wm deiconify . } ViewMol . } # parse the cube file ... set files [lsort -increasing [g98Cube:cube2xsf $file]] # ------------------------------------------------------------------------ # Now we have either one or several XSF files. If there is only one, # simply load it, otherwise ask for which one to load !!! # ------------------------------------------------------------------------ set nfiles [llength $files] # ... and load the structure if { $nfiles == 0 } { ErrorDialog "An ERROR occured: cube2xsf has failed !!!" return } elseif { $nfiles == 1 } { set file $files } else { # make a selection-list, where user will select a directory !!! set file [g98Cube:selectFile $files] } xsfOpen $g98(cube_dir)/$file .mesa } proc g98Cube:cube2xsf {file} { global g98 system SetWatchCursor # uncompress the file is necessary set file [gunzipFile $file] # make a new directory where converting files will be placed set dir $system(SCRDIR)/g98cube file mkdir $dir cd $dir set g98(cube_dir) [pwd] # execute cube2xsf set cw [DisplayUpdateWidget "Calculating" "Converting GAUSSIAN CUBE file to XSF"] update xcCatchExec $system(BINDIR)/cube2xsf 1 $file destroy $cw ResetCursor return [glob -nocomplain *.xsf] } proc g98Cube:selectFile {files} { global g98cube set result "" set t [xcToplevel .g98cube "Select File" "Select File"] set f1 [frame $t.1 -class StressText] set f2 [frame $t.2] set f3 [frame $t.3] pack $f1 $f2 $f3 -side top -padx 10 -pady 10 -ipadx 10 -ipady 10 set m [message $f1.m -text "Your CUBE file contain several molecular orbitals, therefore several XSF files were created.\n\nPlease select a particular XSF file that you would like to analyze." -width 400 -justify left] pack $m -side top -fill both -expand 1 -padx 3 -pady 3 set ind 1 set g98cube(xsf_file) [lindex $files 0] set irow 1 set icol 1 foreach file $files { set r [radiobutton $f2.r$ind \ -variable g98cube(xsf_file) \ -text "File: $file" \ -value $file \ -relief ridge \ -bd 2 \ -anchor w] grid $r -row $irow -column $icol -padx 3 -pady 3 -sticky we incr icol if { $icol > 3 } { set icol 1 incr irow } incr ind } set b [button $f3.b -text "Continue" -command [list CancelProc $t]] pack $b -side top -ipadx 5 -ipady 5 tkwait window $t return $g98cube(xsf_file) } xcrysden-1.6.2/Tcl/fontWidget.tcl0000644000175000017500000001515513516060164015424 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 177 3523 # # Jozef Stefan Institute Fax: x 386 1 177 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/TclisoControl.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc fontToplevelWidget {w labeltext {font {}} {allFonts {}}} { xcToplevel $w "Set Font Attributes" Font set wid [fontWidget $w.wid $labeltext $font $allFonts] pack $wid global $wid upvar \#0 $wid clientData set clientData(update) 0 set upd [button $w.update -text "Close & Update" \ -command [list _fontWidgetDestroy $wid update]] set can [button $w.can -text "Cancel" \ -command [list _fontWidgetDestroy $wid]] pack $can $upd -side left -expand 1 -padx 5 -pady 5 tkwait window $wid set update $clientData(update) set font $clientData(font) #puts stderr "*** fontToplevelWidget : font = $font" #puts stderr "*** fontToplevelWidget : update = $update" unset clientData destroy $w if { $update } { return $font } else { return {} } } proc _fontWidgetDestroy {w {update {}}} { global $w upvar \#0 $w clientData if { $update != {} } { set clientData(update) 1 } # destrot the fontWidget destroy ${w} } proc _fontWidgetUnset {w} { # destroy the fontWidget data unset $w } proc fontWidget {w labeltext {font {}} {allFonts {}}} { global system global $w upvar \#0 $w data if { $font == {} } { # # create new font # set data(font) [font create] font configure $data(font) -size 14 -family $data(family) } elseif { $font eq "fixed" } { set data(font) [font create] eval {font configure $data(font)} [font actual $font] } else { set data(font) $font } set data(size) [font actual $data(font) -displayof . -size] #set data(family) [font actual $data(font) -displayof . -family] set data(family) [X11Font_MatchFamily [font actual $data(font) -displayof . -family]] if { $data(size) < 0 } { set scale [tk scaling] set data(size) [expr $data(size) * $scale] } if { [font actual $data(font) -displayof . -weight] == "normal" } { set data(bold) 0 } else { set data(bold) 1 } if { [font actual $data(font) -displayof . -slant] == "roman" } { set data(italic) 0 } else { set data(italic) 1 } set data(underline) \ [font actual $data(font) -displayof . -underline] set data(overstrike) \ [font actual $data(font) -displayof . -overstrike] set data(w) ${w} set cont [frame $data(w)] set f1 [frame $cont.f1 -relief groove -bd 2] pack $f1 -side top -expand 1 -fill both -padx 5 -pady 5 # label for diplaying sample text set f1lf [frame $f1.f1 \ -relief flat \ -class StressText \ -width 300 \ -height 100 \ -relief groove \ -bg \#ffffff \ -bd 2] set data(label) [label $f1lf.l \ -text $labeltext \ -font $data(font) \ -relief flat \ -bg \#ffffff \ -bd 2] pack $f1lf -side top -expand 0 -padx 5 -pady 5 -ipadx 0 -ipady 0 pack propagate $f1lf false pack $data(label) -side top -expand 1 -ipadx 10 -ipady 2 -padx 10 -pady 5 # container frames set f11 [frame $f1.1] set f12 [frame $f1.2] set f121 [frame $f1.2.1] set f122 [frame $f1.2.2] pack $f11 $f12 -side top -fill both -padx 2 -pady 2 pack $f121 $f122 -side left -fill both -padx 2 # # Font Size (frame #1) # scale $f11.scale -from 4 -to 100 \ -length 300 \ -variable ${w}(size) \ -orient horizontal -label "Font size:" \ -digits 3 \ -resolution 1 \ -showvalue true \ -highlightthickness 0 \ -command [list fontUpdate $w] pack $f11.scale -fill y -expand 1 # # Font Family (frame #2) # if { $allFonts != "" } { if { ! [info exists data(ComboBox.currentValue)] } { set data(ComboBox.currentValue) $data(family) } set label [label $f121.l -text "Font Family:"] set data(combo) [ComboBox $f121.combo \ -height 15 \ -values [font families] \ -text $data(ComboBox.currentValue) \ -editable false \ -modifycmd [list fontUpdate $w -1]] pack $label $data(combo) -side left -fill x -expand 1 -padx 1 -pady 3 } else { #set fixed [font actual fixed -family] set familyMenu [xcMenuButton $f121 -labeltext "Font Family:" -labelwidth 12 \ -textvariable ${w}(family) \ -menu [list \ "Helvetica" [list fontUpdate $w -1 Helvetica] \ "Times" [list fontUpdate $w -1 Times] \ "Courier" [list fontUpdate $w -1 Courier] \ "Fixed" [list fontUpdate $w -1 Fixed]] ] pack $familyMenu -side left -fill x -expand 1 } # # Miscellaneous attributes (frame #3) # xcCheckButtonRow $f122 4 \ [list \ @$system(BMPDIR)/bold.xbm \ @$system(BMPDIR)/italic.xbm \ @$system(BMPDIR)/underline.xbm \ @$system(BMPDIR)/overstrike.xbm] \ [list \ ${w}(bold) \ ${w}(italic) \ ${w}(underline) \ ${w}(overstrike)] \ [list \ [list fontUpdate $w] \ [list fontUpdate $w] \ [list fontUpdate $w] \ [list fontUpdate $w]] \ left return $w } proc fontUpdate {w {size -1} {family {}}} { global $w upvar \#0 $w data if { $data(bold) == 0 } { set weight normal } else { set weight bold } if { $data(italic) == 0 } { set slant roman } else { set slant italic } if { $size > -1 } { set data(size) $size } #if { [info exists data(combo)] } { # set data(family) [$data(combo) cget -text] #} if { $family != {} } { set data(family) $family } font configure $data(font) \ -size $data(size) \ -family $data(family) \ -weight $weight \ -slant $slant \ -underline $data(underline) \ -overstrike $data(overstrike) $data(label) config -font $data(font) } xcrysden-1.6.2/Tcl/state.tcl0000644000175000017500000005357013524216222014432 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/state.tcl # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# ############################################################################## # DISABLE WIDGETS: # --------------- # disable all children of parent $w if possible #proc xcDisableAll {wlist} { # # foreach w $wlist { # if ![winfo exists $w] continue # set children [winfo children $w] # if { $children == "" } { # #puts stdout $w # catch [list $w configure -state disabled] # } else { # foreach child $children { # xcDisableAll $child # } # } # } #} proc xcDisableEntry {args} { global xcColors foreach entry $args { $entry config -bd 0 -fg $xcColors(disabled_fg) -state disabled } } proc xcEnableEntry {args} { global xcColors foreach entry $args { $entry config -state normal -bd 2 -fg $xcColors(enabled_fg) } } proc xcAll:wlist {wlist} { global XCstate if { [lindex $wlist 0] == "-disabledfg" } { set XCstate(-disabledfg) 1 return [lrange $wlist 1 end] } else { set XCstate(-disabledfg) 0 return $wlist } } proc xcDisableAll {args} { set wlist [xcAll:wlist $args] _xcDisableAll $wlist } proc _xcDisableAll {wlist} { global xcColors XCstate foreach w $wlist { if { ![winfo exists $w] } continue set children [winfo children $w] if { $children != "" } { foreach child $children { _xcDisableAll $child } } catch [list $w configure -state disabled] if { $XCstate(-disabledfg) } { catch [list $w configure -fg $xcColors(disabled_fg)] } } } proc xcDisableMenuOne {menu list} { foreach {w e} $list { lappend wlist $w lappend elist $e } xcDisableOne $wlist xcDisableMenuentryOne $menu $elist } # disable only widgets in $wlist proc xcDisableOne {wlist} { foreach wid $wlist { catch [list $wid configure -state disabled] } } proc xcDisableMenuentryOne {menu elist} { foreach entry $elist { catch {$menu entryconfigure $entry -state disabled} } } ############################################################################## # ENABLE WIDGETS: # -------------- # enable all children of parent $w if possible proc xcEnableAll {args} { _xcEnableAll [xcAll:wlist $args] } proc _xcEnableAll {wlist} { global xcColors XCstate foreach w $wlist { if { ![winfo exists $w] } { continue } set children [winfo children $w] if { $children != "" } { foreach child $children { _xcEnableAll $child } } catch [list $w configure -state normal] if { $XCstate(-disabledfg) } { catch [list $w configure -fg $xcColors(enabled_fg)] } } } proc xcEnableMenuOne {menu list} { foreach {w e} $list { lappend wlist $w lappend elist $e } xcEnableOne $wlist xcEnableMenuentryOne $menu $elist } # enable only widgets in $wlist proc xcEnableOne {wlist} { foreach wid $wlist { catch [list $wid configure -state normal] } } proc xcEnableMenuentryOne {menu elist} { foreach entry $elist { catch {$menu entryconfigure $entry -state normal} } } proc xcConfigAll {wlist args} { foreach w $wlist { if { ![winfo exists $w] } continue set children [winfo children $w] if { $children != "" } { foreach child $children { xcConfigAll $child $args catch {eval $child configure $args} } } } } proc xcIsActive {word} { global XCState #-------- # states: #-------- # c95 .... c95 case (newinput, openinput, .. # newinput .... new input will be/has been made # openinput .... existeing input is opened # render .... structure is rendered # properties .... crytal fort.9 is opened # wien .... when dealing with WIEN2k # multislab .... when dealing with WIEN2k multi-slab # external .... when reading structre from some external file format # external34 .... when reading structre from some external file format # via FORT.34; !!! *** probably temporal *** !!! if { ![info exists XCState(state)] } { return 0 } return [string match *${word}* $XCState(state)] } ############################################################################ proc xcUpdateState {{menu .menu} {menu2 .menu}} { global XCState dispmode periodic radio sInfo system xsfAnim xcMisc # disable all entries but exit&print-setup-entry in file-menu foreach entry { {New CRYSTAL Input} {Open Structure ...} {Open PWscf ...} {Open CRYSTAL ...} {Open WIEN2k ...} Close {Save XSF Structure} {Save Current State and Structure} {Save Current State} {Save CRYSTAL Input} {Save WIEN2k Struct File} Print* {XCrySDen Examples ...} } { $menu.vmfile${menu2} entryconfig $entry -state disabled } # disable all menus xcDisableMenuOne $menu [list \ $menu.vmfile "File" \ $menu.vmdis "Display" \ $menu.vmmod "Modify" \ $menu.vmadvg "AdvGeom" \ $menu.vmpro "Properties" \ $menu.vmdat "Tools"] xcDisableOne {.mea.f2.sty .mea.f2.shd} # when we start the program XCState array is not set if { ![array exists XCState] } { # enable File menu xcEnableMenuOne $menu [list $menu.vmfile File] # disable all widgets in CONTROL-MAIN FRAME & MEASURE-MAIN FRAME xcDisableAll .ctrl .mea # in file menu enable new*/open* entries foreach entry { {New CRYSTAL Input} {Open Structure ...} {Open PWscf ...} {Open CRYSTAL ...} {Open WIEN2k ...} {XCrySDen Examples ...} } { $menu.vmfile${menu2} entryconfig $entry -state normal } } if { ![xcIsActive render] } { # Enable just File menu xcEnableMenuOne $menu [list $menu.vmfile File] # disable all widgets in CONTROL-MAIN FRAME & MEASURE-MAIN FRAME xcDisableAll .ctrl .mea } else { xcEnableMenuOne $menu [list \ $menu.vmfile "File" \ $menu.vmdis "Display" \ $menu.vmmod "Modify" \ $menu.vmdat "Tools"] # for "render state" enable in File menu: foreach entry { Close {Save XSF Structure} {Save Current State and Structure} {Save Current State} Print* } { $menu.vmfile${menu2} entryconfig $entry -state normal } # if structure is CRYSTAL, disable all cell options if { $periodic(dim) < 3 } { foreach entry { {Primitive Cell Mode} {Conventional Cell Mode} {Hexagonal/Rhombohedral ...} {Wigner-Seitz Cells} } { $menu.vmdis${menu2} entryconfig $entry -state disabled } $menu.vmmod${menu2} entryconfig {Wigner-Seitz Cell Settings} \ -state disabled } else { foreach entry { {Primitive Cell Mode} {Conventional Cell Mode} {Wigner-Seitz Cells} } { $menu.vmdis${menu2} entryconfig $entry -state normal } $menu.vmmod${menu2} entryconfig {Wigner-Seitz Cell Settings} \ -state normal #if { $periodic(igroup) < 7 } { # $menu.vmdis${menu2} entryconfig {Hexagonal/Rhombohedral ...} \ # -state disabled #} else { # $menu.vmdis${menu2} entryconfig {Hexagonal/Rhombohedral ...} \ # -state normal #} if { [array exists sInfo] } { if { !$sInfo(lprimvec) } { #$menu.vmdis${menu2} entryconfig {Hexagonal/Rhombohedral ...} \ # -state disabled $menu.vmdis${menu2} entryconfig {Primitive Cell Mode} \ -state disabled set radio(cellmode) conv } if { !$sInfo(lconvvec) } { #$menu.vmdis${menu2} entryconfig {Hexagonal/Rhombohedral ...} \ # -state disabled $menu.vmdis${menu2} entryconfig {Conventional Cell Mode} \ -state disabled set radio(cellmode) prim } } } if { $periodic(dim) == 0 } { foreach entry { {Crystal Cells} {Wigner-Seitz Cells} {Crystal Cells As ...} {Primitive Cell Mode} {Conventional Cell Mode} {Hexagonal/Rhombohedral ...} {Unit of Repetition ...} } { $menu.vmdis${menu2} entryconfig $entry -state disabled } $menu.vmmod${menu2} entryconfig {Wigner-Seitz Cell Settings} \ -state disabled } else { foreach entry { {Crystal Cells} {Crystal Cells As ...} {Unit of Repetition ...} } { $menu.vmdis${menu2} entryconfig $entry -state normal } #$menu.vmmod${menu2} entryconfig {Wigner-Seitz Cell Settings} \ # -state normal } if { ![info exists xsfAnim(nstep)] } { $menu.vmmod${menu2} entryconfig {Animation Controls} \ -state disabled } else { if { $xsfAnim(nstep) < 1 } { $menu.vmmod${menu2} entryconfig {Animation Controls} \ -state disabled } else { $menu.vmmod${menu2} entryconfig {Animation Controls} \ -state normal } } if { $dispmode(style) == "2D" } { xcDisableOne { .mea.f2.sty .mea.f2.shd } } else { xcEnableOne { .mea.f2.sty .mea.f2.shd } } # enable all widgets in CONTROL-MAIN FRAME & MEASURE-MAIN FRAME xcEnableAll .ctrl .mea # disable PLANE button (temporarily) #xcDisableOne .mea.f1.pln reloadButtonQueryState } if { [xcIsActive render] && [xcIsActive c95] && ![xcIsActive properties]} { xcEnableMenuOne $menu [list $menu.vmadvg "AdvGeom"] } if { [xcIsActive c95] || [xcIsActive newinput] || \ [xcIsActive openinput] } { # enable the following entries in File menu foreach entry { Close {Save XSF Structure} {Save Current State and Structure} {Save Current State} {Save CRYSTAL Input} } { $menu.vmfile${menu2} entryconfig $entry -state normal } } if { [xcIsActive properties] && [xcIsActive render] } { xcEnableMenuOne $menu [list $menu.vmpro "Properties"] foreach entry { Close {Save XSF Structure} {Save Current State and Structure} {Save Current State} {Save CRYSTAL Input} {Save WIEN2k Struct File} } { $menu.vmfile${menu2} entryconfig $entry -state normal } } if { $periodic(dim) == 0 } { $menu.vmdat${menu2} entryconfig {k-path Selection} -state disabled } if { ![array exists sInfo] } { $menu.vmdat${menu2} entryconfig {Data Grid} -state disabled } elseif { !$sInfo(ldatagrid2D) && !$sInfo(ldatagrid3D) } { $menu.vmdat${menu2} entryconfig {Data Grid} -state disabled } if { $dispmode(style) == "2D" } { $menu.vmdis${menu2} entryconfig {Wigner-Seitz Cells} -state disabled } else { if { $periodic(dim) == 3 } { $menu.vmdis${menu2} entryconfig {Wigner-Seitz Cells} -state normal } } if { [xcIsActive render] && [xcIsActive c95] && \ ([xcIsActive openinput] || [xcIsActive newinput]) && \ $periodic(dim) == 2 } { foreach entry { {Atoms & Cell Manipulation ...} {Cut a SLAB} {Cut a non-Periodical Structure ...} } { $menu.vmadvg${menu2} entryconfig $entry -state normal } $menu.vmadvg${menu2}.3 entryconfig {Create a Multi-Slab} -state normal } else { $menu.vmadvg${menu2}.3 entryconfig {Create a Multi-Slab} -state disabled } if { [xcIsActive multislab] } { xcEnableMenuOne $menu [list $menu.vmadvg "AdvGeom"] set end [$menu.vmadvg${menu2} index end] for {set i 0} {$i <= $end} {incr i} { catch {$menu.vmadvg${menu2} entryconfig $i -state disabled} } $menu.vmadvg${menu2} entryconfig {Multi-Slab ...} -state normal $menu.vmadvg${menu2}.3 entryconfig {Change Multi-Slab Vacuum Thickness} \ -state normal } else { $menu.vmadvg${menu2}.3 entryconfig {Change Multi-Slab Vacuum Thickness} \ -state disabled } if { [xcIsActive render] && $periodic(dim) == 3 } { $menu.vmfile${menu2} entryconfig {Save WIEN2k Struct File} \ -state normal } if { $periodic(dim) == 0 } { $menu.vmmod${menu2} entryconfig {Number of Units Drawn} -state disabled .mea.f2.unit config -state disabled .mea.f2.asym config -state disabled } else { $menu.vmmod${menu2} entryconfig {Number of Units Drawn} -state normal .mea.f2.unit config -state active .mea.f2.asym config -state active } if { $system(c95_exist) == 0 } { foreach entry { {New CRYSTAL Input} {Open CRYSTAL ...} } { $menu.vmfile${menu2} entryconfig $entry -state disabled } } global xcMisc if { ! [info exists xcMisc(babel)] } { catch { $menu.vmfile${menu2}.opstr entryconfig "Gaussian Z-Matrix File" -state disabled } } # t.k.: this is temporal if { ![info exists xcMisc(0.2.x_hexa/rhombo_debug)] } { $menu.vmdis${menu2} entryconfig "Hexagonal/Rhombohedral ..." -state disabled } if { ![info exists xcMisc(movie_encoder)] && ![info exists xcMisc(gif_encoder)]} { $menu.vmdat${menu2} entryconfig {Movie Maker} -state disabled } else { # prevent simultaneous AnimationControl's and MovieMaker's animation capability global gifAnim if { [info exists gifAnim(anim_ctrl_widgets)] } { if { $gifAnim(anim_ctrl_widgets) == 1 } { # AnimationControl's "movie options" are On, disable MovieMaker menu $menu.vmdat${menu2} entryconfig {Movie Maker} -state disabled } else { if { [info exists xcMisc(movie_encoder)] || [info exists xcMisc(gif_encoder)]} { $menu.vmdat${menu2} entryconfig {Movie Maker} -state normal } } } global movieMaker xsfAnim if { [info exists movieMaker(tplw)] } { if { [winfo exists $movieMaker(tplw)] } { if { [info exists xsfAnim(anim_ctrl_button)] } { if { [winfo exists $xsfAnim(anim_ctrl_button)] } { $xsfAnim(anim_ctrl_button) config -state disabled } } } else { if { [info exists xsfAnim(anim_ctrl_button)] } { if { [winfo exists $xsfAnim(anim_ctrl_button)] } { $xsfAnim(anim_ctrl_button) config -state normal } } } } } # stereo button should be always disabled if stereo is not supported global stereo_visual if { $stereo_visual == "false" } { .mea.f2.stereo configure -state disable } } ############################################################################ # proc append word to XCState variable proc xcAppendState {word} { global XCState set app 1 # maybe XCState do not exists or XCstate(state) is empty if ![info exists XCState(state)] { set XCState(state) $word return } if { $XCState(state) == "" } { set XCState(state) $word return } # if word is already in XCState(state), do not append set statelist [split $XCState(state) _] foreach item $statelist { if { $item == $word } { set app 0 } } if $app { append XCState(state) _$word } # we will return 1 if appending was successful return $app } ############################################################################ # proc delete word form XCState variable proc xcDeleteState {word} { global XCState # if XCState does not exist, there is nothing to delete; return silently if ![info exists XCState(state)] { return } set statelist [split $XCState(state) _] set XCState(state) "" foreach item $statelist { if { $item != $word } { append XCState(state) "${item}_" } } if { $XCState(state) != "" } { string trimright $XCState(state) _ } } ############################################################################# # TRACE utility procedure proc xcTrace {name1 name2 op} { global species groupsel XCTrace nxdir nydir nzdir prop \ isoControl isosurf radio pDen # this is for Print command in File-menu if { $name1 == "species" } { set name [capitalize $species] .menu.vmfile.menu entryconfig Print* -label "Print $name to File" } elseif { $name1 == "groupsel" } { # in MODIFY/CHANGE toplevel there is # "Type of Cell for Rhombohedral Groups" button, which is activ # only if $groupsel in RHOMBOHEDRAL ONE if { [winfo exists $XCTrace(RHOMBO_TYPE_BUTTON)] } { if { [lindex $groupsel 0] == "R" } { $XCTrace(RHOMBO_TYPE_BUTTON) config -state normal } else { $XCTrace(RHOMBO_TYPE_BUTTON) config -state disabled } } } elseif { $name1 == "nxdir" } { # look in isoControl.tcl file if [info exists XCTrace(scX)] { if [winfo exists $XCTrace(scX)] { $XCTrace(scX) config -to $nxdir } } if [info exists XCTrace(2DscX)] { if [winfo exists $XCTrace(2DscX)] { $XCTrace(2DscX) config -to $nxdir } } } elseif { $name1 == "nydir" } { # look in isoControl.tcl file if [info exists XCTrace(scY)] { if [winfo exists $XCTrace(scY)] { $XCTrace(scY) config -to $nydir } } if [info exists XCTrace(2DscY)] { if [winfo exists $XCTrace(2DscY)] { $XCTrace(2DscY) config -to $nydir } } } elseif { $name1 == "nzdir" } { # look in isoControl.tcl file if [info exists XCTrace(scZ)] { if [winfo exists $XCTrace(scZ)] { $XCTrace(scZ) config -to $nzdir } } if [info exists XCTrace(2DscZ)] { if [winfo exists $XCTrace(2DscZ)] { $XCTrace(2DscZ) config -to $nzdir } } } elseif { $name1 == "prop" } { if { $name2 == "doss_criteria" } { # enable or disable the scale for specifying number if { $prop(doss_criteria) == "band-interval criteria" } { DOSS_Init_BandIntv } else { DOSS_Init_EnerIntv } } } elseif { $name1 == "isosurf" } { if { $name2 == "3Dinterpl_degree" } { # determine the number of slides for ISO_PLANE123 # xc_iso grid returns {nx, ny, nz} if ![info exists isosurf(3Dinterpl_degree_old)] { set isosurf(3Dinterpl_degree_old) $isosurf(3Dinterpl_degree) } set n $isosurf(3Dinterpl_degree) set n_old $isosurf(3Dinterpl_degree_old) xcDebug "XCTrace::::3Dinterpl_degree: n=$n; n_old=$n_old" set r(1) [expr double($n) / double($n_old)] set r(2) [expr double($n) / double($n_old)] set r(3) [expr double($n) / double($n_old)] set isoControl(1,nslide) \ [expr ([lindex [xc_iso grid] 2] - 1) * $n + 1] set isoControl(2,nslide) \ [expr ([lindex [xc_iso grid] 1] - 1) * $n + 1] set isoControl(3,nslide) \ [expr ([lindex [xc_iso grid] 0] - 1) * $n + 1] xcDebug "XCTrace::::3Dinterpl_degree: 1,2,3,plane: $isoControl(1,nslide) $isoControl(2,nslide) $isoControl(3,nslide)" if ![info exists isoControl(current_slide)] { set isoControl(current_slide) 1 } foreach i {1 2 3} { if ![info exists isoControl($i,current_slide)] { set isoControl($i,current_slide) 1 } else { if { $r($i) > 1.0 } { set r($i) 1.0 }; # just in any case set isoControl($i,current_slide) [expr round(\ ($isoControl($i,current_slide) - 1) * $r($i)) + 1] # just in any case if { $isoControl($i,current_slide) > \ $isoControl($i,nslide) } { set isoControl($i,current_slide) \ $isoControl($i,nslide) } if { $isoControl($i,current_slide) < 1 } { set isoControl($i,current_slide) 1 } } set isoControl($i,current_text_slide) "Current slide: $isoControl($i,current_slide) / $isoControl($i,nslide)" xcDebug "XCTrace::::3Dinterpl_degree: text_slide $isoControl($i,current_text_slide)" } } set isosurf(3Dinterpl_degree_old) $isosurf(3Dinterpl_degree) } elseif { $name1 == "radio" } { if { $name2 == ".mesa,bg" } { global radio mesa_bg .mesa.unmap config -bg $radio($name2) set mesa_bg(current) $radio($name2) } } elseif { $name1 == "pDen" } { for {set i 0} {$i < $pDen(nsurface)} {incr i} { if { $name2 == "$i,monocolor" } { $pDen($i,colbut) config -bg [rgb_f2h $pDen($i,monocolor)] } } } elseif { $name1 == "colSh" } { global colSh if { $name2 == "slabrange_min" } { if { [winfo exists colSh(scMax)] } { $colSh(scMax) config -from $colSh(slabrange_min) } } elseif { $name2 == "slabrange_max" } { $colSh(scMin) config -to $colSh(slabrange_max) } elseif { $name2 == "slab_fractional" } { if { $colSh(slab_fractional) } { # from absolute --> fractional $colSh(scMin) config -from 0 $colSh(scMax) config -to 1 ColorScheme:fromAbsToFrac } else { # from fractional --> absolute $colSh(scMin) config -from $colSh(slab_absrange_min_from) $colSh(scMax) config -to $colSh(slab_absrange_max_to) ColorScheme:fromFracToAbs } } } elseif { $name1 == "toglEps" } { global toglEps if { $name2 == "EPStype" } { if { $toglEps(EPStype) == "BITMAP" } { xcDisableAll $toglEps(frame2) } else { # VECTORIAL xcEnableAll $toglEps(frame2) } } } } # delete trace on "var" if it exists proc xcTraceDelete {var} { set tr [trace vinfo $var] if { $tr != "" } { trace vdelete $var } } ############################################################################### proc xcAdvGeomState {type {num 1}} { global advGeomState AdvGeom if { $type == "reset" } { if [array exists AdvGeom] { unset AdvGeom } set advGeomState(count) 0 } elseif { $type == "new" } { if ![info exists advGeomState(count)] { set advGeomState(count) 0 } incr advGeomState(count) $num xcDebug "\nxcAdvGeomState:: count == $advGeomState(count)\n" } elseif { $type == "undo" } { # just decrease count by 1; leave AvdGeom($count,*) alive incr advGeomState(count) -$num } elseif { $type == "current" } { return $advGeomState(count) } elseif { $type == "delete" } { # decrease count by 1 and unset AdvGeom($count,*) for {set i 0} {$i < $num} {incr i} { set alist [array names AdvGeom $advGeomState(count),*] foreach name $alist { unset AdvGeom($name) } incr advGeomState(count) -1 } } return $advGeomState(count) } xcrysden-1.6.2/Tcl/wnSaveSFile.tcl0000644000175000017500000000567711712736221015510 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnSaveSFile.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc wnSaveSFile {} { global system periodic if { ![xcIsActive render] && $periodic(dim) != 3 } { return } #if [file exists $system(SCRDIR)/xc_wienstruct.$system(PID)] { # set file $system(SCRDIR)/xc_wienstruct.$system(PID) #} # t.k: I have disabled above "if", see the effects !!! # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ if { 0 } { ; } else { if { [catch {exec $system(FORDIR)/savestruct \ $system(SCRDIR)/xc_struc.$system(PID) > \ $system(SCRDIR)/xc_wnstr.$system(PID)}] } { tk_dialog [WidgetName] ERROR \ "ERROR while saving WIEN2k STRUCT FILE" \ error 0 OK return } set pwd [pwd] cd $system(SCRDIR) set def [wn_nn_def xc_wnstr $system(PID)] WriteFile nn.def $def w set tmp $system(SCRDIR)/xc_tmp.$system(PID) WriteFile $tmp 2.0 w # later $system(FORDIR) should be replaced by WIEN2k's nn-path catch {exec $system(FORDIR)/nn nn.def < $tmp} error switch -glob -- $error { {*NN ENDS*} { # file was OK file copy -force xc_wnstr.$system(PID) xc_wnstr.struct } {*NN created*} { # new file was created and is writen to xc_wnstr.struct ; } default { # an error has occured tk_dialog [WidgetName] ERROR \ "ERROR while executing \"nn\" program;\n\ ERORR Code: $error" \ error 0 OK return } } cd $pwd set file $system(SCRDIR)/xc_wnstr.struct } set filetypes { {{WIEN2k Struct File} {.struct} } {{All Files} * } } set sfile [tk_getSaveFile -initialdir $system(PWD) \ -title "Save WIEN2k Struct File" \ -defaultextension .struct \ -filetypes $filetypes \ -parent .] # maybe Cancel button was pressed if { $sfile == {} } { return } if [catch {file copy -force $file $sfile}] { tk_dialog [WidgetName] ERROR \ "ERROR saving file $sfile" error 0 OK return } wm title . "XCrySDen: [file tail $sfile]" set xcMisc(titlefile) $sfile return } xcrysden-1.6.2/Tcl/modAtomAtrib.tcl0000644000175000017500000003361111712736221015671 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/modAtomAtrib.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# #=============================================================================# # ATOMIC COLORS --- ATOMIC COLORS --- ATOMIC COLORS # #=============================================================================# proc ModAtomCol {} { global atcol Alist mody # Alist - AtomNameLists set top .atomcol # just in case in window already exists if { [winfo exists $top] } { return } toplevel .atomcol wm title $top "Atomic Colors" wm iconname $top "Atomic Colors" #grab $top # place $top according to "." xcPlace . $top 100 50 # there will be three frames left, right and bottom set l [frame $top.l -relief raised -bd 2] set r [frame $top.r -relief raised -bd 2] set b [frame $top.b -relief raised -bd 2] pack $b -side bottom -padx 0 -pady 0 -ipadx 0 -ipady 0 \ -fill both -expand 1 pack $l $r -side left -padx 0 -pady 0 -ipadx 0 -ipady 0 \ -fill both -expand 1 # in LEFT-FRAME there will be Entrie & scrolllistbox Entries $l "Atom:" atcol(atom) 6 bind $l.frame.entry1 { AtomColBind } set lbox [ScrolledListbox2 $l.lb -width 12 -height 20 -setgrid true] bind $lbox [list AtomColSelect %W %y] # we must rebuilt Alist so that after each atom we add "\n" set n 0 foreach elem $Alist { if { $n < 10 } { lappend Atoms " $n: $elem" } elseif { $n < 100 } { lappend Atoms " $n: $elem" } else { lappend Atoms "$n: $elem" } incr n } eval {$lbox insert 0} $Atoms # RIGHT-FRAME --- RIGHT-FRAME # before we select any atom from above Listbox, a default will be H set color [xc_getvalue $mody(D_ATCOL_ONE) 0] set atcol(red) [lindex $color 0] set atcol(green) [lindex $color 1] set atcol(blue) [lindex $color 2] set atcol(atom) "X" set atcol(nat) 0 set atcol(hxred) [ d2h [expr int($atcol(red) * 255) ] ] set atcol(hxgreen) [ d2h [expr int($atcol(green) * 255)] ] set atcol(hxblue) [ d2h [expr int($atcol(blue) * 255) ] ] set fr [frame $r.1 -relief sunken -bd 2] set col [frame $fr.col -bd 0 \ -bg "#$atcol(hxred)$atcol(hxgreen)$atcol(hxblue)" \ -width 150 -height 150] scale $r.red -from 0 -to 1 -length 150 -variable atcol(red) \ -orient horizontal -label "Red:" -tickinterval 1.0 \ -digits 3 -resolution 0.01 -showvalue true -width 10 \ -command Color scale $r.green -from 0 -to 1 -length 150 \ -variable atcol(green) \ -orient horizontal -label "Green:" -tickinterval 0.5 \ -digits 3 -resolution 0.01 -showvalue true -width 10 \ -command Color scale $r.blue -from 0 -to 1 -length 150 \ -variable atcol(blue) \ -orient horizontal -label "Blue:" -tickinterval 0.5 \ -digits 3 -resolution 0.01 -showvalue true -width 10 \ -command Color pack $fr -side top -fill both -expand 1 -padx 30 -pady 15 -ipadx 0 -ipady 0 pack $col -side top -fill both -expand 1 -padx 0 -pady 0 pack $r.red $r.green $r.blue -side top -fill both -expand 1 # BOTTOM FRAME --- BOTTOM FRAME # OK, Default & Cancel Button set col [button $b.upd -text "Update Color" \ -command AtomColUpD] set def [button $b.def -text "Default Color" \ -command [list AtomColLoad default]] set can [button $b.can -text "Reset All" \ -command AtomColReset] set clo [button $b.clo -text "Close" -command [list AtomColOK $top]] pack $col $def $can $clo -side left -expand 1 -pady 10 -padx 5 return } proc AtomColBind {} { global atcol set atcol(nat) [Aname2Nat $atcol(atom)] if ![regexp {[0-9]+} $atcol(nat)] { tk_dialog .atradup "ERROR" $atcol(nat) error 0 OK return } AtomColLoad return } proc Color { {trash {}} } { global atcol set atcol(hxred) [ d2h [expr int($atcol(red) * 255)] ] set atcol(hxgreen) [ d2h [expr int($atcol(green) * 255)] ] set atcol(hxblue) [ d2h [expr int($atcol(blue) * 255)] ] .atomcol.r.1.col configure \ -bg "#$atcol(hxred)$atcol(hxgreen)$atcol(hxblue)" } proc AtomColSelect { w y } { global atcol mody # $w is the name of listbox widget who contains groups # $y is the vertical position of "selection" puts stdout "$w select anchor [$w nearest $y]" $w select anchor [$w nearest $y] set nline [$w curselection] set atom [$w get $nline] # now we must purify atom variable, because it's sometning like " 8: O" # we will take a number instead of name (communication with xcrys) regexp {[0-9]+} $atom atcol(nat) # to update entry we also need atom name regexp {[A-Za-z]+} $atom atcol(atom) AtomColLoad return } proc AtomColLoad { {type {}} } { global mody atcol if { $type == "default"} { set color [xc_getdefault $mody(D_ATCOL_ONE) $atcol(nat)] } else { puts stdout "GETVALUE::" set color [xc_getvalue $mody(D_ATCOL_ONE) $atcol(nat)] } set atcol(red) [lindex $color 0] set atcol(green) [lindex $color 1] set atcol(blue) [lindex $color 2] Color puts stdout "ATOM=\"$atcol(nat)\"; NAME=$atcol(atom)" flush stdout } proc AtomColOK {top} { global atcol if { [winfo exists $top] } { #grab release $top destroy $top } return } proc AtomColUpD {} { global mody atcol puts stdout "xc_newvalue .mesa $mody(L_ATCOL_ONE) $atcol(nat) $atcol(red) $atcol(green) $atcol(blue)" flush stdout xc_newvalue .mesa $mody(L_ATCOL_ONE) $atcol(nat) \ $atcol(red) $atcol(green) $atcol(blue) return } proc AtomColReset {} { global mody atcol # reset atomic colors xc_resetvar .mesa $mody(R_ATCOL) # update display AtomColLoad return } #=============================================================================# # ATOMIC RADII --- ATOMIC RADII --- ATOMIC RADII # #=============================================================================# proc ModAtomRad {} { global atrad Alist mody # Alist - AtomNameLists set top .atomrad # just in case in window already exists if { [winfo exists $top] } { return } toplevel $top wm title $top "Atomic Radii" wm iconname $top "Atomic Radii" #grab $top # place $top according to "." xcPlace . $top 100 50 # there will be three frames left, right and bottom set l [frame $top.l -relief raised -bd 2] set r [frame $top.r -relief raised -bd 2] set b [frame $top.b -relief raised -bd 2] pack $b -side bottom -padx 0 -pady 0 -ipadx 0 -ipady 0 \ -fill both -expand 1 pack $l $r -side left -padx 0 -pady 0 -ipadx 0 -ipady 0 \ -fill both -expand 1 # in LEFT-FRAME there will be a scrolllistbox set lbox [ScrolledListbox2 $l.lb -width 12 -height 15 -setgrid true] bind $lbox [list AtomRadSelect %W %y] # we must rebuilt Alist so that after each atom we add "\n" set n 0 foreach elem $Alist { if { $n < 10 } { lappend Atoms " $n: $elem" } elseif { $n < 100 } { lappend Atoms " $n: $elem" } else { lappend Atoms "$n: $elem" } incr n } eval {$lbox insert 0} $Atoms # RIGHT-FRAME --- RIGHT-FRAME # before we select any atom from above Listbox, a default will be X set atrad(covf) [xc_getvalue $mody(D_COVF)] set atrad(scale) [xc_getvalue $mody(D_ATRAD_SCALE)] set atrad(atom) "X" set atrad(rad) [xc_getvalue $mody(D_ATRAD_ONE) 0] set atrad(covrad) [xc_getvalue $mody(D_RCOV_ONE) 0] set atrad(nat) 0 set atrad(covf_old) $atrad(covf) set atrad(scale_old) $atrad(scale) set f11 [frame $r.1 -relief groove -bd 2] Entries $f11 {"Chemical connectivity factor:"} atrad(covf) 8 0 set b12 [button $f11.frame.b12 -text "Clear" \ -command [list AtRadClr atrad(covf) $f11.frame.entry1]] set b11 [button $f11.frame.b11 -text "Default" \ -command [list AtRadDef atrad(covf) D_COVF]] set b13 [button $f11.frame.b13 -text "Update" \ -command AtRadUpdateConF] pack $f11 -side top -padx 5 -pady 5 -fill x -ipady 10 pack $b12 $b11 $b13 -side left -side left -padx 5 -pady 5 focus $f11.frame.entry1 set f21 [frame $r.2 -relief groove -bd 2] Entries $f21 {"SpaceFill/Ball scale factor:"} atrad(scale) 8 0 set b22 [button $f21.frame.b22 -text "Clear" \ -command [list AtRadClr atrad(scale) $f21.frame.entry1]] set b21 [button $f21.frame.b21 -text "Default" \ -command [list AtRadDef atrad(scale) D_ATRAD_SCALE]] set b23 [button $f21.frame.b23 -text "Update" \ -command AtRadUpdateScale] pack $f21 -side top -padx 5 -pady 5 -expand 1 -fill x -ipady 10 pack $b22 $b21 $b23 -side left -side left -padx 5 -pady 5 # t.k.: start here ... set f31 [frame $r.3 -relief groove -bd 2] set lbl [label $f31.lbl -text "Change radius:" -relief flat] pack $lbl -side top #set f311 [frame $f31.1] #set f312 [frame $f31.2] #pack $f311 $f312 -side top -fill x Entries $f31 {"Atom:" "Display radius:" "Covalent radius:"} { {atrad(atom)} {atrad(rad)} {atrad(covrad)} } 8 0 set b3 [button $f31.frame.b3 -text "Clear" -command [list AtRadClr atrad(rad) $f31.frame.entry2]] pack $b3 -side left -side left -padx 5 -pady 5 set b31 [button $f31.b31 -text "Update Radius" -command AtRadUpD] set res [button $f31.res -text "Reset All" -command AtRadReset] set b32 [button $f31.b32 -text "Default Radius" -command [list AtRadLoad default]] pack $f31 -side top -padx 5 -pady 5 -fill x -ipady 10 pack $b31 $res $b32 -side left -side left -padx 5 -pady 5 -expand 1 # /t.k. # BOTTOM FRAME --- BOTTOM FRAME # OK button set clo [button $b.clo -text "OK" -command [list AtRadOK $top]] pack $clo -side left -expand 1 -pady 10 -padx 5 return } proc AtRadUpdateConF {} { global atrad mody if { $atrad(covf_old) != $atrad(covf) } { xc_newvalue .mesa $mody(L_COV_SCALE) $atrad(covf) } set atrad(covf_old) $atrad(covf) } proc AtRadUpdateScale {} { global atrad mody if { $atrad(scale_old) != $atrad(scale) } { xc_newvalue .mesa $mody(L_ATRAD_SCALE) $atrad(scale) } set atrad(scale_old) $atrad(scale) } proc AtRadUpD {} { global mody atrad # from atrad(atom) --> atrad(nat) set atrad(nat) [Aname2Nat $atrad(atom)] if ![regexp {[0-9]+} $atrad(nat)] { tk_dialog .atradup "ERROR" $atrad(nat) error 0 OK return } xc_newvalue .mesa $mody(L_ATRAD_ONE) $atrad(nat) $atrad(rad) xc_newvalue .mesa $mody(L_RCOV_ONE) $atrad(nat) $atrad(covrad) return } proc AtRadLoad { {type {}} } { global mody atrad # from atrad(atom) -> atrad(nat) puts stdout "AtRadLoad:: $atrad(nat)" flush stdout if { $type == "default"} { set atrad(rad) [xc_getdefault $mody(D_ATRAD_ONE) $atrad(nat)] set atrad(covrad) [xc_getdefault $mody(D_RCOV_ONE) $atrad(nat)] } else { set atrad(rad) [xc_getvalue $mody(D_ATRAD_ONE) $atrad(nat)] set atrad(covrad) [xc_getvalue $mody(D_RCOV_ONE) $atrad(nat)] } return } proc AtRadReset {} { global mody # reset atomic radius xc_resetvar .mesa $mody(R_ATRAD) # t.k.: insert the RCOV code here ... xc_resetvar .mesa $mody(R_RCOV) # update a display AtRadLoad return } proc AtRadOK {top} { global atrad mody puts stdout "AtRadOK:: mody(L_COV_SCALE) = $atrad(covf)" puts stdout "AtRadOK:: mody(L_ATRAD_SCALE) $atrad(scale)" flush stdout # update all parameters # first Chemical connectivity factor if { $atrad(covf_old) != $atrad(covf) } { xc_newvalue .mesa $mody(L_COV_SCALE) $atrad(covf) } # spacefill/ball scale factor if { $atrad(scale_old) != $atrad(scale) } { xc_newvalue .mesa $mody(L_ATRAD_SCALE) $atrad(scale) } # is atomname ok #set atrad(nat) [Aname2Nat $atrad(atom)] #if ![regexp {[0-9]+} $atrad(nat)] { # tk_dialog .atradup "ERROR" $atrad(nat) error 0 OK # return #} #xc_newvalue .mesa $mody(L_ATRAD_ONE) $atrad(nat) $atrad(rad) # now we can exit if { [winfo exists $top] } { #grab release $top destroy $top } } proc AtomRadSelect { w y } { global atrad mody # $w is the name of listbox widget who contains groups # $y is the vertical position of "selection" puts stdout "$w select anchor [$w nearest $y]" $w select anchor [$w nearest $y] set nline [$w curselection] set atom [$w get $nline] # now we must purify atom variable, because it's sometning like " 8: O" # we will take a number instead of name (communication with xcrys) regexp {[0-9]+} $atom atrad(nat) # to update entry we also need atom name regexp {[A-Za-z]+} $atom atrad(atom) AtRadLoad return } proc AtRadDef {var const} { upvar #0 $var varn global mody set varn [xc_getdefault $mody($const)] return } proc AtRadClr {var w} { upvar #0 $var varn set varn "" focus $w return } xcrysden-1.6.2/Tcl/xcAbout.tcl0000644000175000017500000000460113556022130014704 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/xcAbout.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc xcAbout {} { global system set version [ReadFile $system(TOPDIR)/version] set text { ===================================================================== About XCrySDen (version: $version) ===================================================================== Copyright (C) 1996--2019 Anton Kokalj (tone.kokalj@ijs.si) Jozef Stefan Institute, Ljubljana, Slovenia XCrySDen was written by Anton Kokalj, following a project of Mauro Causa. The project was initiated because Mauro Causa and Anton Kokalj felt a growing need for a simple visualization tool aimed at displaying the crystalline structures. Programming started in 1996 and the first implementation of the program was made available in 1999. 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. } set text [subst $text] set t [xcDisplayVarText $text "XCrySDen: About"] if { [winfo exists $t.f1.t] } { catch {$t.f1.t configure -state disabled} } } xcrysden-1.6.2/Tcl/scripting.tcl0000644000175000017500000007337613524241666015334 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/scripting.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # ------------------------------------------------------------------------ #****h* XCRYSDEN/Scripting *** # # NAME # scripting -- Scripting facility (v0.1) of XCRYSDEN # # COPYRIGHT # Anton Kokalj (C) 2003 # # FUNCTION # # Often a mechanism for automating a particular job is desirable. For # example, one might want to produce several plots of molecular # orbitals of a given molecule. It would be desirable that the display # parameters are exactly the same for all plots. By using the # XCRYSDEN's GUI one would need to open each file and repeat all the # operations for each molecular orbital, and this is largely # redundant. Once the display parameters for one plot are determined # one could produce the others using script which automates the task. # This is the purpose of the "Scripting" class of functions, namely, # to provide an XCRYSDEN shell-script mechanism for achieving such # jobs. # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2003 # # NOTES # # At this stage the API of Scripting is not yet completely fixed and # is used for testing the "scripting" possibility, that is, loading # the tasks from a Tcl script. # #**** # ------------------------------------------------------------------------ namespace eval scripting { variable scripting set scripting(verbosity) 1 } # ------------------------------------------------------------------------ #****if* Scripting/scripting::source # # NAME # scripting::source # # USAGE # scripting::source scriptfile # # PURPOSE # This proc is used to source the an XCRYSDEN script. The proc is for # internal use only, namely, the XCRYSDEN uses this proc to sources # the scriptFile. # # ARGUMENTS # scriptfile -- name of scripting file # # RETURN VALUE # Undefined. #**** # ------------------------------------------------------------------------ proc scripting::source {scriptfile} { global scriptFile set scriptFile $scriptfile # execute script in global level -- uplevel \#0 { cd $system(PWD) SetWatchCursor source [gunzipFile $scriptFile] ResetCursor } } #------------------------------------------------------------------------ # This function is used to convert the old xcrysden script (xcrysden # version < 1.6) to new syntax (xcrysden version >= 1.6) #------------------------------------------------------------------------ proc scripting::oldscript {scriptfile} { global system set toglCmdsRe {(xc_rotate|xc_translate|xc_B1motion|xc_ShiftB1motion|xc_B2motion|xc_Brelease|xc_dump2eps|cry_gl2psPrintTogl|cry_dump2ppm|cry_toglzoom|xc_realtimemovie|xc_setfont|xc_setatomlabel|xc_clearatomlabel|xc_queryfont)} WriteFile $system(SCRDIR)/script.xcrysden \ [regsub -all -- ".mesa $toglCmdsRe" [ReadFile $scriptfile] {\1 .mesa}] scripting::source $system(SCRDIR)/script.xcrysden } # ------------------------------------------------------------------------ #****f* Scripting/scripting::open # # NAME # scripting::open # # USAGE # scripting::open option file ?option file? ... # # PURPOSE # This proc is used in XCRYSDEN scripts to open structure files. The # usage is very similar to that of xcrysden command, that is, instead # of "xcrysden option file" one calls "scripting::open option file". # # ARGUMENTS # args -- the command line arguments (those of xcrysden program) # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::open --xsf file.xsf #**** # ------------------------------------------------------------------------ proc scripting::open {args} { parseComLinArg $args update } # ------------------------------------------------------------------------ #****f* Scripting/scripting::save # # NAME # scripting::save # # USAGE # scripting::save ?format? file # # PURPOSE # This proc is used in XCRYSDEN scripts to save the structure # information of the current structure. So far only the XSF format is # supported. # # ARGUMENTS # format -- the format to be used for saved [OPTIONAL] # filename -- the name of the file to save into # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::save --xsf file.xsf #**** # ------------------------------------------------------------------------ proc scripting::save {args} { set len [llength $args] if { $len < 1 || $len > 2 } { ErrorDialog "wrong number of arguments, $len. Must be ::scripting::save ?format? filename" return } set fmt xsf if { $len == 2 } { set fmt [lindex $args 0] switch $fmt { xsf { DummyProc } default { ErrorDialog "wrong format in ::scripting::save, $fmt. Must be \"xsf\"." return } } } set filename [lindex $args end] SaveXSFStruct $filename return 1 } # ------------------------------------------------------------------------ #****f* Scripting/scripting::exec # # NAME # scripting::exec # # USAGE # scripting::exec option file ?option file? ... # # PURPOSE # This proc is used inside majorScript of scripting::multiScript. # Instead of calling "xcrysden option file" one calls "scripting::exec # option file". # # ARGUMENTS # args -- the command line arguments (those of xcrysden program) # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::exec --xsf file.xsf #**** # ------------------------------------------------------------------------ proc scripting::exec {args} { global env system variable scripting # support the following: cd $dir; scripting::exec *** set system(PWD) [pwd] set script "namespace eval ::scripting \{\n" if { [regexp -- {^--} [lindex $args 0]] } { # we have an option, i.e., --option file append script "scripting::open $args\n" } else { # we have a filter-routine, i.e., scripting::filter file append script $args\n } if { [info exists scripting(minorScript)] } { append script $scripting(minorScript) } append script "\n\}\n" # write a script file set script_file [file join $system(PWD) xc_script.tcl.$system(PID)] WriteFile $script_file $script w switch -- [string tolower $scripting(verbosity)] { 1 - yes - on { puts stderr "From scripting::exec executing a minor-script::" puts stderr "-----------------------------------------------\n$script" } } # load a script file #catch {::exec sh $env(XCRYSDEN_TOPDIR)/xcrysden --script $script_file >& $system(SCRDIR)/log} xcCatchExec sh $env(XCRYSDEN_TOPDIR)/xcrysden --script $script_file >& $system(SCRDIR)/log # check for a Tcl-error set log [ReadFile $system(SCRDIR)/log] if { [string match {*Error in startup script:*} $log] } { puts stderr $log exit 1 } # delete the script file if { [file exists $script_file] } { file delete $script_file } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::multiScript # # NAME # scripting::multiScript # # USAGE # scripting::multiScript majorScript minorScript # # PURPOSE # This proc is for multiple-task jobs. For example, one might want to # produce several plots of molecular orbitals of a given molecule. It # would be desirable that the display parameters are exactly the same # for all plots. This proc is provided to facilitate such jobs. In # majorScript one specifies how many times to run XCRYSDEN and what # files to load, and in minorScript one specify what to do with this # files. For example the instruction in minorScript would be how to # render molecular orbitals for each provided file in majorScript (see # example). # # ARGUMENTS # majorScript -- a major script # minorScript -- a minor script # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::multiScript { # # ------------------------------------------------------------------------ # # This is the MAJOR script # # # # Lets open a structures from several files (one at a time), and # # print them. # # ------------------------------------------------------------------------ # # foreach file {file1.xsf file2.xsf} { # scripting::exec --xsf $file # file rename -force print.png $file.png # } { # } { # # ------------------------------------------------------------------------ # # This is the MINOR script # # # # It renders and print a structure # # ------------------------------------------------------------------------ # # scripting::lighting On # scripting::displayMode3D BallStick # scripting::zoom +0.5 # scripting::rotate x -90 # scripting::rotate y -30 # scripting::printToFile print.png windowdump # } # #**** # ------------------------------------------------------------------------ proc scripting::multiScript {majorScript minorScript} { variable scripting global system if { [winfo exists .title] } { destroy .title update } set scripting(majorScript) $majorScript set scripting(minorScript) $minorScript #puts stderr "DEBUG> multiScript::" #puts stderr "$scripting(majorScript)" #puts stderr "" cd $system(PWD) eval $scripting(majorScript) exit 0 } # ------------------------------------------------------------------------ #****f* Scripting/scripting::lighting # # NAME # scripting::lighting # # USAGE # scripting::lighting On|Off # # PURPOSE # This proc toggles the lighing Off/On display mode. # # ARGUMENTS # mode -- the lighting mode (must be On or Off) # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::lighting On #**** # ------------------------------------------------------------------------ proc scripting::lighting {mode} { global light switch -glob [string totitle $mode] { "On" { set light On; Lighting On } "Off" { set light Off; Lighting Off } default { ErrorDialog "wrong lighting-mode $mode, should one On or Off" return } } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::display # # NAME # scripting::display # # USAGE # scripting::display on|off coordinate-system|atomic-labels|crystal-cells| # unicolor-bonds|wigner-seitz-cell|molecular-surface # or # scripting::display on|off perspective ?near-factor? ?far-factor? # or # scripting::display as ball|spacefill covalent|vad-der-waals # or # scripting::display as crystal-cells rods|lines # or # scripting::display as cell-mode primitive|convetional # or # scripting::display as cell-unit cell|asymm # # PURPOSE # This proc is used to set the display property of various objects, # such as coordinate system, atomic symbols, perspective projection # etc. The "scripting::display on|off" command will display or # not-display a requested object, while "scripting::display as" will # display particular object as requested. # # ARGUMENTS # mode -- the mode of command, must be one of on|off|as # what -- what object to display # args -- the rest of arguments (as requested by particular object) # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::display on coordinate-system # or # scripting::display as cell-mode primitive #**** # ------------------------------------------------------------------------ proc scripting::display {mode what args} { global check radio switch $mode { yes - on - 1 { set mode 1 } no - off - 0 { set mode 0 } as { ; } default { ErrorDialog "wrong scripting::display mode $mode, should be on or off" return } } if { $mode == "1" || $mode == "0" } { # ------------------------------------------------------------------------ # scripting::display on|off ... # ------------------------------------------------------------------------ switch -glob [string tolower $what] { "coor*" { set check(crds) $mode; CrdSist } "atom*" - "label*" { set check(labels) $mode AtomLabels } "cryst*" - "cell*" { set check(frames) $mode CrysFrames } "unicol*" - "unibon*" { set check(unibond) $mode Unibond } "force*" - { set check(forces) $mode forceVectors .mesa } "wigner*" - { set check(wigner) $mode WignerSeitz } "molec*" - "molsurf*" { set check(pseudoDens) $mode PseudoDensity } "persp*" { set check(perspective) $mode if { $args != "" } { # args1 = near-factor; args2 = far-factor set i 0 foreach var $args { set var($i) [lindex $args $i] if { ! [string is double $var($i)] } { ErrorDialog "expected double, but got $var($i), while executing scripting::display $mode $what $args" } if { $i == 0 } { xc_newvalue .mesa $mody(L_PERSPECTIVEFOVY) $var($i) } else { xc_newvalue .mesa $mody(L_PERSPECTIVEBACK) $var($i) } incr i } } Perspective } } } elseif { $mode == "as" } { # ------------------------------------------------------------------------ # scripting::display as ... # ------------------------------------------------------------------------ switch -glob [string tolower $what] { "ball*" { switch -glob [string tolower $args] { "cova*" { set radio(ball) "Balls based on covalent radii" xc_newvalue .mesa $mody(L_BALL_COV) } "van*" { set radio(ball) "Balls based on Van der Waals radii" xc_newvalue .mesa $mody(L_BALL_VDW) } } } "spacefill*" { switch -glob [string tolower $args] { "cova*" { set radio(space) "SpaceFill based on covalent radii" xc_newvalue .mesa $mody(L_SPACE_COV) } "van*" { set radio(space) "SpaceFill based on Van der Waals radii" xc_newvalue .mesa $mody(L_SPACE_VDW) } } } "crystal-c" - "crystal-f" - "frame*" { switch -glob [string tolower $args] { "rod*" { set radio(frames) rods DispFramesAs } "line*" { set radio(frames) lines DispFramesAs } } } "cell-s*" - "cell-m*" { switch -glob [string tolower $args] { "prim*" { set radio(cellmode) prim CellMode 1 } "conv*" { set radio(cellmode) conv CellMode 1 } } } "cell-u*" - "unit of rep*" { switch -glob [string tolower $args] { "cell*" { set radio(unitrep) cell CellMode 1 } "asym*" { set radio(unitrep) asym CellMode 1 } } } } } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::displayMode3D # # NAME # scripting::displayMode3D # # USAGE # scripting::lighting sticks|pipe&ball|ballstick|spacefill # # PURPOSE # Switch to requested 3D (i.e. Lighting-On) display mode # # ARGUMENTS # mode -- one of allowed 3D display modes # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::displayMode3D ballstick #**** # ------------------------------------------------------------------------ proc scripting::displayMode3D {mode} { switch -glob [string tolower $mode] { "stick*" { DisplayOver3D S } "pipe&ball*" { DisplayOver3D PB } "ballstick*" { DisplayOver3D BS } "spacefill*" { DisplayOver3D SF } default { ErrorDialog "wrong 3D display-mode $mode, should one of Stick, Pipe&Ball, BallStick, or SpaceFill" return } } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::displayMode2D # # NAME # scripting::displayMode2D # # USAGE # scripting::lighting wireframe|pointline|pipe&ball|ballstick-1|ballstick-2|spacefill # # PURPOSE # Switch to requested 2D (i.e. Lighting-Off) display mode # # ARGUMENTS # mode -- one of allowed 2D display modes # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::displayMode2D ballstick #**** # ------------------------------------------------------------------------ proc scripting::displayMode2D {mode} { switch -glob [string tolower $mode] { "wireframe*" { Display2D WF } "pointline*" { Display2D PL } "pipe&ball*" { Display2D PB } "ballstick-1" { Display2D BS1 } "ballstick*" { Display2D BS2 } "spacefill*" { Display2D SF } default { ErrorDialog "wrong 2D display-mode $mode, should one of WireFrame, PointLine, Pipe&Ball, BallStick-1, BallStick-2, or SpaceFill" return } } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::mainWindow # # NAME # scripting::mainWindow # # USAGE # scripting::mainWindow maximize # or # scripting::mainWindow resize width height # # PURPOSE # Resize the XCRYSDEN main window. # # ARGUMENTS # action -- mode od resizing (maximize or resize) # args -- width and height for resize mode # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::mainWindow resize 500 500 #**** # ------------------------------------------------------------------------ proc scripting::mainWindow {action args} { switch -exact -- $action { maximize { global maingeom set maingeom Maxi MainGeom } resize { set len [llength $args] if { $len != 2 } { ErrorDialog "wrong number of arguments $len, should be \"scripting::mainWindow resize width height" return } set w [lindex $args 0] set h [lindex $args 0] foreach num $args { if { ! [string is integer $num] } { ErrorDialog "expected integer but got $num, while executing w scripting::mainWindow $action $w $h" } } PlaceGlobWin 1 $w $h } default { ErrorDialog "wrong subcommand $action, should be maximize or resize, while executing scripting::mainWindow ..." } } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::displayWindow # # NAME # scripting::displayWindow # # USAGE # scripting::displayWindow fullscreen # or # scripting::displayWindow resize width height # # PURPOSE # Resize the XCRYSDEN display window of XCRYSDEN's main window. # # ARGUMENTS # action -- mode od resizing (fullscren or resize) # args -- width and height for resize mode # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::displayWindow resize 500 500 #**** # ------------------------------------------------------------------------ proc scripting::displayWindow {action args} { switch -exact -- $action { maximize - fullscreen { maximizeDisplay } resize { set len [llength $args] if { $len != 2 } { ErrorDialog "wrong number of arguments $len, should be \"scripting::displayWindow resize width height" return } set w [lindex $args 0] set h [lindex $args 1] foreach num $args { if { ! [string is integer $num] } { ErrorDialog "expected integer but got $num, while executing scripting::displayWindow $action $w $h" } } PlaceGlobWin display_resize $w $h } default { ErrorDialog "wrong subcommand $action, should be maximize or resize, while executing scripting::displayWindow ..." } } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::zoom # # NAME # scripting::zoom # # USAGE # scripting::zoom step ?nsteps? # # PURPOSE # This proc zooms the displayed structure. The optional argument # nsteps determines the number of zooming steps. If it is omitted only # one zooming is performed. The unit of step is fractional, unless % # sign is appended to the step number. In this case the step is in # percentage unit. # # ARGUMENTS # step -- the zooming step (typical values between 0 and 1) # nstep -- number of zooming step (default=1) # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::zoom 0.05 # scripting::zoom 5% # #**** # ------------------------------------------------------------------------ proc scripting::zoom {step {ntimes 1}} { if { ! [string is integer $ntimes] } { ErrorDialog "wanted integer, but got $ntimes, while executing scripting::zoom $step $ntimes" return } if { [string range $step end end] == "%" } { set step [string trim $step %] if { ! [string is double $step] } { ErrorDialog "wanted double, but got $step, while executing scripting::zoom $step $ntimes" } set step [expr {$step / 100.0}] } elseif { ! [string is double $step] } { ErrorDialog "wanted double, but got $step, while executing scripting::zoom $step $ntimes" } for {set i 0} {$i < $ntimes} {incr i} { xc_translate .mesa +z $step update } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::rotate # # NAME # scripting::rotate # # USAGE # scripting::rotate x|y|z rotationstep ?nsteps? # or # scripting::rotate xy|xz|yz rotstep_dir1 rotstep_dir2 ?nsteps? # # PURPOSE # This proc rotates the displayed objects, either around x, y, or z # axes (x|y|z modes), or around x-and-y, x-and-z, y-and-z axes # (xy|xz|yz modes). In the latter case the rotste_dir1 is the rotation # step for the first axis, while rotstep_dir2 is the rotation step for # second axis. The optional argument nsteps determines the number of # rotation steps. If it is omitted only one rotation is performed. # # ARGUMENTS # dir -- direction of rotation (must be one one x, y, z, xy, xz, or yz) # args -- the rest of arguments as requested by particular mode # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::rotate x 5 # or # scripting::rotate x 5 10 # or # scripting::rotate xy 5 5 # or # scripting::rotate xy 5 5 10 #**** # ------------------------------------------------------------------------ proc scripting::rotate {dir args} { switch -- $dir { xy - xz - yz { set argc [llength $args] if { $argc < 2 && $argc > 4 } { ErrorDialog "wrong number of scripting::rotate ++ arguments" return } set step1 [lindex $args 0] set step2 [lindex $args 1] set n_step [lindex $args 2] if { $n_step == "" } { set n_step 1 } if { ! [string is integer $n_step] } { ErrorDialog "wanted integer, but got $ntimes, while executing scripting::rotate $dir $args" return } for {set i 0} {$i < $n_step} {incr i} { xc_rotate .mesa ++$dir $step1 $step2 update } } x - y - z { set argc [llength $args] if { $argc < 1 && $argc > 2 } { ErrorDialog "wrong number of scripting::rotate arguments" return } set step [lindex $args 0] set n_step [lindex $args 1] if { $n_step == "" } { set n_step 1 } if { ! [string is integer $n_step] } { ErrorDialog "wanted integer, but got $ntimes, while executing scripting::rotate $dir $args" return } for {set i 0} {$i < $n_step} {incr i} { xc_rotate .mesa +$dir $step update } } } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::printToFile # # NAME # scripting::printToFile # # USAGE # scripting::printToFile ?filename? ?windowdump? ?togl? # # PURPOSE # This proc prints to a file the content of the display window. If # windowdump is specified, the display window is dumped to a file.In # the windowdump case make sure that no other window obscures the # display window, as it will appear on the dump. If togl option is # omitted the XCRYSDEN main display window is assumed. # # ARGUMENTS # filename -- the name of the file to print to (if not specified or # void, the filename will be queried) # windowdump -- if non-void, the a display window dump is performed # togl -- the pathName of the display window # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::printToFile print.png #**** # ------------------------------------------------------------------------ proc scripting::printToFile {{filename {}} {windowdump {}} {togl .mesa}} { global xcMisc system printSetup light toglEPS # # check if we have converting program # if { $filename == "" } { set filename [printTogl_queryFilename] if { $filename == "" } { return } } cd $system(PWD) set ext [file extension [file tail $filename]] set EXT [string trimleft [string toupper $ext] .] SetWatchCursor global printSetup if { ![info exists printSetup(dumpWindow)] } { set printSetup(dumpWindow) 0 } # windowdump == 0 --> no window dumping if { $windowdump != 0 } { if { $windowdump != "" || $printSetup(dumpWindow) } { dumpWindow $togl $filename return } } set fmt GL2PS_EPS set vectorial 0 switch -exact -- $EXT { PS - EPS - PDF - SVG { set vectorial 1 set fmt GL2PS_$EXT } } if { $light == "Off" && $vectorial } { # # ligting-OFF mode : print vectorial # if { ! [info exists toglEPS(pointsize)] } { set toglEPS(pointsize) 2.0 } if { ! [info exists toglEPS(linewidth)] } { set toglEPS(linewidth) 2.0 } cry_gl2psPrintTogl $togl $fmt GL2PS_NO_SORT GL2PS_NONE \ $toglEPS(pointsize) $toglEPS(linewidth) $filename } else { printTogl_Antialias begin if { $EXT == "PPM" } { cry_dump2ppm $togl $filename } else { if { ! [info exists xcMisc(ImageMagick.convert)] } { ErrorDialog "cannot print to [file tail $filename], the variable xcMisc(ImageMagick.convert) is not defined in \$HOME/.xcrysden/custom-definition file." return } cry_dump2ppm $togl $system(SCRDIR)/tmp.ppm scripting::_printToFile_imageConvert $system(SCRDIR)/tmp.ppm $filename } printTogl_Antialias end } ResetCursor } # ------------------------------------------------------------------------ #****if* Scripting/scripting::_printToFile_imageConvert # # NAME # scripting::_printToFile_imageConvert # # USAGE # scripting::printToFile infile outfile # # PURPOSE # This proc performs the PPM to PNG/GIF/JPEG image conversion. It is used # internally by printToFile proc. # # ARGUMENTS # infile -- name of PPM file to convert (input) # outfile -- name of converted file (output) # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::_printToFile_imageConvert tmp.ppm print.png #**** # ------------------------------------------------------------------------ proc scripting::_printToFile_imageConvert {infile outfile} { global printSetup xcMisc if { ! [info exists printSetup(useOptions) ] } { # see the printSetup proc set printSetup(useOptions) 0 } if { ! [info exists xcMisc(ImageMagick.convertOptions)] } { set xcMisc(ImageMagick.convertOptions) "" } if { [info exists xcMisc(ImageMagick.convert)] } { if { $printSetup(useOptions) } { eval xcCatchExecReturn $xcMisc(ImageMagick.convert) $xcMisc(ImageMagick.convertOptions) $infile $outfile } else { eval xcCatchExecReturn $xcMisc(ImageMagick.convert) $infile $outfile } } else { ErrorDialog "cannot print to [file tail $outfile], because ImageMagick's \"convert\" program was not found." return } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::load_myParam # # NAME # scripting::load_myParam # # USAGE # scripting::load_myParam # # PURPOSE # This proc loads the myParam values defined in the script. # # ARGUMENTS # None. # # RETURN VALUE # Undefined. # # EXAMPLE # set myParam(TESSELLATION) 50.0 # set myParam(ATRAD_SCALE) 1.00 # scripting::load_myParam # #**** # ------------------------------------------------------------------------ proc scripting::load_myParam {} { ::load_myParam } # ------------------------------------------------------------------------ #****f* Scripting/scripting::buildCrystal # # NAME # scripting::buildCrystal # # USAGE # scripting::buildCrystal nx ?ny? ?nz? # # PURPOSE # This proc builds (i.e. generate) a crystal, that is, nx-cells in 1st # direction, ny-cells in second direction, and nz-cells in 3rd # direction. # # ARGUMENTS # nx -- number of cells in 1st crystallographic direction # ny -- number of cells in 2nd crystallographic direction # nz -- number of cells in 3rd crystallographic direction # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::buildCrystal 3 3 3 # #**** # ------------------------------------------------------------------------ proc scripting::buildCrystal {nx {ny 0} {nz 0}} { global periodic nxdir nydir nzdir foreach num [list $nx $ny $nz] { if { ! [string is integer $num] } { ErrorDialog "expected integer but got $num, while executing scripting::buildCrystal $nx $ny $nz" return } if { $num < 0 } { ErrorDialog "expected positive integer but got $num, while executing scripting::buildCrystal $nx $ny $nz" return } } if { $periodic(dim) == 0 } { return } if { $periodic(dim) < 2 } { set ny 0 } if { $periodic(dim) < 3 } { set nz 0 } set nxdir $nx set nydir $ny set nzdir $nz GenGeomDisplay 1 } # ------------------------------------------------------------------------ #****f* Scripting/scripting::chdir # # NAME # scripting::chdir -- an enhanced version of cd # # USAGE # scripting::chdir newdir # # PURPOSE # This proc is an enhancement of standard "cd" routine. It changes the # directory to $newdir and updates system(PWD) variable. # # ARGUMENTS # newdir -- new directory to chdir into # # RETURN VALUE # The absolute path of $newdir. # # EXAMPLE # scripting::chdir ../ # #**** # ------------------------------------------------------------------------ proc scripting::chdir {newdir} { global system cd $newdir set system(PWD) [pwd] return $system(PWD) } xcrysden-1.6.2/Tcl/cxxAdvGeom.tcl0000644000175000017500000001246411712736221015357 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/cxxAdvGeom.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc cxxAdvGeom.manualOption {{retry 0}} { global system AdvGeom set file $system(SCRDIR)/CRYSTAL.option set helpText {# # Please add an "advanced geometrical" option manually. Refer # to CRYSTAL Manual if you want to get a help on # "advanced geometrical option" # # Start at the begining of next line: } if { $retry == 0 } { WriteFile $file $helpText w } else { set old [ReadFile -nonewline $file] set text [format "%s%s\n" $helpText $old] WriteFile $file $text w } update xcEditFile $file -foreground # # drop the comments from file # set content {} foreach line [split [ReadFile -nonewline $file] \n] { if { [string match *\#* $line] == 0 } { if { $line != {} } { append option [format "%s\n" $line] } } } xcDebug -stderr "manualOption:" xcDebug -stderr "-------------" xcDebug -stderr $option # # register the option # set n [xcAdvGeomState new] set AdvGeom($n,option) $option # # check if option is OK # set cxxInput [MakeInput] set inp xc_inp.$system(PID) set out xc_out.$system(PID) WriteFile $inp $cxxInput w set status [cxxAdvGeom.testINPUT $inp $out] if { $status == "noretry" } { xcAdvGeomState delete return 0 } elseif { $status == "retry" } { xcAdvGeomState delete set status [cxxAdvGeom.manualOption retry] return $status } else { # # option is OK -> update the display # GenCommUndoRedo "Add an Option Manually" CalStru xcUpdateState return 1 } } proc cxxAdvGeom.viewScript {} { xcDisplayVarText [MakeInput] {CRYSTAL Input Script} } proc cxxAdvGeom.manualEdit {{retry 0}} { global system cxx AdvGeom if { $retry == 0 } { set input [MakeInput] } else { set input $cxx(tmpInputContent) } # # edit a file # cd $system(SCRDIR) set inp xc_inp.$system(PID) set out xc_out.$system(PID) WriteFile $inp $input w update xcEditFile $inp -foreground # handle correctly the EXTPRT/COORPRT/STOP keywords set cxx(tmpInputContent) [cxxHandleEXTPRT [ReadFile -nonewline $inp]] WriteFile $inp $cxx(tmpInputContent) w # # test a new file # set status [cxxAdvGeom.testINPUT $inp $out] if { $status == "noretry" } { return 0 } elseif { $status == "retry" } { set status [cxxAdvGeom.manualEdit retry] return $status } else { # # option is OK -> proceed # # register the option set n [xcAdvGeomState new] set AdvGeom($n,edit) $cxx(tmpInputContent) GenCommUndoRedo "Edit Manually" CalStru xcUpdateState return 1 } } proc cxxAdvGeom.testINPUT {inp out} { global system set catchCode [catch {exec $system(c95_integrals) < $inp > $out} errMsg] if { $errMsg == {} } { set errMsg "CRYSTAL module: $system(c95_integrals) exited with and exit status 0, but the \"ERROR ****\" string exists in the output" } if { $errMsg == "FORTRAN STOP" && $catchCode } { # printing the "FORTRAN STOP" to stderr caused the error. set catchCode 0 } set content [ReadFile $out] if { [string match "*ERROR \*\*\*\**" $content] || $catchCode > 0 } { # option is BAD - and error occured!!! set id [tk_dialog [WidgetName] ERROR \ "An ERROR occur while executing CRYSTAL module: $system(c95_integrals)" error 0 OK ErrorInfo {View Crystal Ouput}] if { $id == 1 } { set t [xcDisplayVarText $errMsg {Error Info}] tkwait window $t } elseif { $id == 2 } { set cxxOutput [ReadFile $out] set t [xcDisplayVarText $cxxOutput {Crystal Ouput}] tkwait window $t } # ask user "Do you want top retry? set id [tk_dialog [WidgetName] QUESTION \ "Do You want to retry ?" question 1 No Yes] if { $id == 1 } { return retry } else { return noretry } } else { return 1 } } proc cxxHandleEXTPRT {geoInput} { # maybe EXTPRT/COORPRT/STOP are already specified, but there may # be some additional geometry manipulation after EXTPRT keyword, # so the only safe thing is to throw that out and specifying it # again xcDebug -debug "bug-fixing: geoInput: $geoInput" set swap $geoInput regsub -all EXTPRT|COORPRT|STOP $swap {} geoInput append geoInput "\nEXTPRT\nCOORPRT\nSTOP\n" # skip empty lines set geoInput [xcSkipEmptyLines $geoInput] xcDebug -debug "bug-fixing: geoInput_new: $geoInput" return $geoInput }xcrysden-1.6.2/Tcl/mpegParam.tcl0000644000175000017500000000575113514346454015233 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/mpegParam.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc mpegCreateParamFile {output_file input_dir input_files} { global system gifAnim myParam if { $gifAnim(frame_files_format) == "PPM" } { set input_convert "INPUT_CONVERT cat *" } else { set input_convert "INPUT_CONVERT jpegtopnm *" } if { [info exists myParam(MPEG_ENCODE_PARAM_FILE)] } { # encode_param file parameters are specified in the definition file set encode_param [subst $myParam(MPEG_ENCODE_PARAM_FILE)] } else { # load the dafult definition set encode_param [subst { # ------------------------------------------------------------------------ # Please edit this ppmtompeg (MPEG_ENCODE) parameter file to suit your needs # ------------------------------------------------------------------------ PATTERN IBBPBBPBBPBBPBBP OUTPUT $output_file BASE_FILE_FORMAT PPM # ------------------------------------------------------------------------ # Put here the appropriate image conversion/nahdling program. # Native format is PPM, therefore if your frame-files are in # PPM format put: # # INPUT_CONVERT cat * # # if your files are in JPEG format, then the following would do: # # INPUT_CONVERT jpegtopnm * # ------------------------------------------------------------------------ $input_convert GOP_SIZE 16 SLICES_PER_FRAME 1 #INPUT_DIR $input_dir INPUT_DIR / INPUT [join $input_files \n] END_INPUT PIXEL FULL RANGE 10 PSEARCH_ALG EXHAUSTIVE BSEARCH_ALG CROSS2 IQSCALE 7 PQSCALE 10 BQSCALE 15 REFERENCE_FRAME DECODED BUFFER_SIZE 327680 FRAME_RATE 23.976 BIT_RATE 10000000 # There are many more options, see the users manual for examples.... # ASPECT_RATIO, USER_DATA, GAMMA, IQTABLE, etc. }] } if { $gifAnim(temp_files_dir) == "pwd" } { set dir $system(PWD) } else { set dir $system(SCRDIR) } set file [file join $dir mpeg_encode.param] WriteFile $file $encode_param w if { $gifAnim(edit_param) } { xcEditFile $file foreground } return $file } xcrysden-1.6.2/Tcl/bz.tcl0000644000175000017500000006540713525473624013743 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/bz.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc BAND_Init {} { if { ! [Bz_MakeToplevel] } { return 0 } return 1 } proc Bz_MakeToplevel {{what {}}} { global Bz BzOK gengeom periodic #--- # For k-labels lookup: try to determine the Bravais-lattice type # from periodic(igroup) # load_kLabels set Bz(lattice_type) [igroup2BravaisLattice $periodic(igroup)] #xcDebug -stderr "tk: LATTICE-TYPE: $Bz(lattice_type)" #kLabels_Note #--- set Bz(what) $what set BzOK(done) 0 if { ! [info exists BzOK(wien_kpath)] } { set Bz(tplw) [xcToplevel [WidgetName] "Band Path Selection" \ "Path Selection" . 100 100 1] } else { # k-path selection for WIENXX program update set dir [file tail $BzOK(wien_dir)] set Bz(tplw) [xcToplevel [WidgetName] \ "*** XCrySDen *** K-path selection: $dir" \ "Path Selection" . 290 000 1] } catch { grab $Bz(tplw) } wm resizable $Bz(tplw) 0 0 set f1 [frame $Bz(tplw).f1 -highlightthickness 0] set f2 [frame $Bz(tplw).f2 -highlightthickness 0] pack $f1 $f2 -side top -fill x ############ # FRAME #1 # ############ set Bz(primBZbutton) [button $f1.b1 \ -text "Primitive Brillouin Zone" \ -bd 3 \ -highlightthickness 0 \ -command [list Bz_ShowBZ prim]] set Bz(convBZbutton) [button $f1.b2 \ -text "Conventional Brillouin Zone" \ -bd 1 \ -highlightthickness 0 \ -command [list Bz_ShowBZ conv]] pack $Bz(primBZbutton) $Bz(convBZbutton) -side left -fill y if { $periodic(dim) < 3 } { $Bz(convBZbutton) configure -state disabled } ############ # FRAME #2 # ############ set f21 [frame $f2.1] set f22 [frame $f2.2] set Bz(primBZframe) $f21 set Bz(convBZframe) $f22 # # check if primitive or conventional BZ really exists # foreach type {prim conv} { if { [xc_bz exists $type] } { Bz_RenderBZ $type } else { $Bz(${type}BZbutton) config -state disabled } } if { [xc_bz exists prim] } { # primitive BZ is default pack $f21 -fill both set Bz(rendered) prim } elseif { [xc_bz exists conv] && $periodic(dim) == 3 } { # if there is no primitive BZ, show conventional Bz_ShowBZ conv } else { ErrorDialog "ERROR" "Something has gone wrong. I can't find any Brillouin Zone. It is either bug in the program or you've done something wrong" destroy $Bz(tplw) return 0 } tkwait variable BzOK(done) return $BzOK(done) } proc Bz_ShowBZ {type} { global Bz # maybe already "active" button was pressed if { $Bz(rendered) == $type } { return } if { $type == "prim" } { pack forget $Bz(convBZframe) pack $Bz(primBZframe) set Bz(rendered) prim $Bz(primBZbutton) configure -bd 3 $Bz(convBZbutton) configure -bd 1 } else { pack forget $Bz(primBZframe) pack $Bz(convBZframe) set Bz(rendered) conv $Bz(primBZbutton) configure -bd 1 $Bz(convBZbutton) configure -bd 3 } } proc Bz_RenderBZ {type} { global Bz BzOK set fl [frame $Bz(${type}BZframe).l] set fr [frame $Bz(${type}BZframe).r] pack $fl $fr -side left -fill y -expand 1 ############## # frame: $fl # ############## frame $fl.df -relief raised -bd 3 pack $fl.df -ipadx 3 -ipady 3 set can [xc_bz init $type $fl.can \ {-width 15c -height 15c -bg "#ffffff"}] pack $can -side top -fill both -expand 1 -in $fl.df # clear previous k-point coordinates if { [info exists Bz($can,coor1)] } { array unset Bz $can,coor* } ### some buttons for rotations set f [frame $can.f] $can create window 1 1 \ -anchor nw \ -window $f set text "Primitive Brillouin Zone" if { $type == "conv" } { set text "Conventional Brillouin Zone (use only for curiosity)" } $can create text 7.5c 0.2c \ -text $text \ -anchor n set Bz($can,rot) 5 set rxp [button $f.rxp -image rotXplus\ -highlightthickness 0 \ -command [list Bz_ManualRotate $can +x]] set rxm [button $f.rxm -image rotXmin \ -highlightthickness 0 \ -command [list Bz_ManualRotate $can -x]] set ryp [button $f.ryp -image rotYplus \ -highlightthickness 0 \ -command [list Bz_ManualRotate $can +y]] set rym [button $f.rym -image rotYmin \ -highlightthickness 0 \ -command [list Bz_ManualRotate $can -y]] set rzp [button $f.rzp -image rotZplus \ -highlightthickness 0 \ -command [list Bz_ManualRotate $can +z]] set rzm [button $f.rzm -image rotZmin \ -highlightthickness 0 \ -command [list Bz_ManualRotate $can -z]] set zup [button $f.zup -image zoomUp \ -highlightthickness 0 \ -command [list Bz_ManualZoom $can 0.05]] set zdn [button $f.zdn -image zoomDown \ -highlightthickness 0 \ -command [list Bz_ManualZoom $can -0.05]] set prn [button $f.prn -image printer \ -highlightthickness 0 \ -command [list xcPrintCanvas $can]] pack $rxp $rxm $ryp $rym $rzp $rzm $zup $zdn $prn -side top set Bz(${type}can) $can set Bz($can,npoint) [xc_bz get $can npoint] set Bz($can,npoly) [xc_bz get $can npoly] set Bz($can,nselected) [xc_bz get $can nselected] set Bz($can,last_selected) -1 set Bz($can,B1down) 0 set Bz($can,motionB1down) 0 set Bz($can,state_points) 1 xc_bz viewport $can xc_bz render $can bind $can [list Bz_ViewPort %W] bind $can [list Bz_ButtonPressed %W %x %y] bind $can [list Bz_Motion %W %x %y] bind $can [list Bz_ButtonReleased %W] bind $can [list Bz_BindDestroy %W] bind $can [list Bz_MouseWheel %W +] bind $can [list Bz_MouseWheel %W -] #$can bind point <1> [list Bz_PointButtonPressed %W %x %y] #$can bind polygon <1> [list Bz_PolyButtonPressed %W %x %y] set bf [frame $fl.fb] pack $bf -side bottom -fill x checkbutton $bf.r1 \ -relief raised \ -bd 2 \ -variable Bz($can,state_points) \ -anchor w \ -text "Display Special Points" \ -command [list Bz_SetState $can points] checkbutton $bf.r2 \ -relief raised \ -bd 2 \ -variable Bz($can,state_vectors) \ -anchor w \ -text "Display Reciprocal Vectors" \ -command [list Bz_SetState $can vectors] #checkbutton $bf.r3 \ # -text "Display Symbols" \ # -relief raised \ # -bd 2 \ # -state disabled pack $bf.r1 $bf.r2 -side left -fill x -expand 1 ############## # frame: $fr # ############## frame $fr.f set h 0 set b1 [button $fr.f.b1 \ -highlightthickness 1 \ -text "Delete Last\nSelected Point" \ -height 2 \ -command [list Bz_DeletePoints last $can] \ -width 11] set bhlt [$b1 cget -highlightthickness] incr h [winfo reqheight $b1] xcDebug "tcl: button-width: [winfo reqheight $b1]" set b2 [button $fr.f.b2 \ -highlightthickness 1 \ -text "Delete All\nSelected Points" \ -height 2 \ -command [list Bz_DeletePoints all $can] \ -width 11] # make the font size 10 set Bz(font) [$b2 cget -font] set Bz(font) [ModifyFont $Bz(font) $b1 -size 10] #$b1 config -font $Bz(font) #$b2 config -font $Bz(font) set f1 [frame $fr.f1 -relief raised -bd 2 \ -highlightthickness 1] set l1 [label $f1.l1 \ -width 18 \ -anchor w \ -height 1 \ -text "Rotation Step:"] incr h [winfo reqheight $l1] set e1 [entry $f1.e1 \ -textvariable Bz($can,rot) \ -bd 1 \ -width 3] set f2 [frame $fr.f2 -relief raised -bd 2 \ -highlightthickness 1] set l2 [label $f2.l2 \ -width 18 \ -anchor w \ -height 1 \ -text "# of Selected Points:"] incr h [winfo reqheight $l2] set e2 [entry $f2.e2 \ -textvariable Bz($can,nselected) \ -bd 1 \ -width 3] #set f2a [frame $fr.f2a -relief raised -bd 2\ # -highlightthickness 1] #set l2a [label $f2a.l2 \ # -width 18 \ # -anchor w \ # -height 2 \ # -justify left \ # -text "Total # of k-points\nalong the path:"] #incr h [winfo reqheight $l2a] #set e2a [entry $f2a.e2 \ # -textvariable Bz($can,nK) \ # -bd 1 \ # -width 3] #set Bz($can,nK_entry) $e2a pack $fr.f $f1 $f2 -side top -fill x pack $b1 $b2 -side left -fill x -expand 1 pack $l1 $l2 -side left pack $e1 $e2 -side left -pady 2 -padx 2 -expand 1 -fill x incr h 4 set efont [$e1 cget -font] set Bz(efont) [ModifyFont $efont $b1 -size 10] # # SCROLLED-CANVAS # set f3 [frame $fr.f3 -relief raised -bd 2 \ -highlightthickness 1] pack $f3 -fill both set Bz($can,scrollcan) [canvas $f3.can \ -width 200 \ -yscrollcommand [list $f3.yscroll set]] set scb [scrollbar $f3.yscroll \ -orient vertical -command [list $Bz($can,scrollcan) yview]] pack $scb -side right -fill y pack $Bz($can,scrollcan) -side left -fill y -expand true -padx 2 # create FRAME to hold everything set f [frame $Bz($can,scrollcan).f -bd 0] set Bz($can,frame) $f $Bz($can,scrollcan) create window 1 1 -anchor nw -window $f # now create the first line and compute its width & height set cf1 [frame $f.f0] set cl1 [label $cf1.l1 -text "#" \ -width 2 \ -height 1 \ -anchor w \ -relief sunken -bd 1 \ -font $Bz(font)] set bg [$cl1 cget -bg] # format 6-2-6-2-6 -> width==22 set Bz(text1) " reciprocal coordinates" set ce1 [entry $cf1.e1 -textvariable Bz(text1) \ -bg $bg \ -width 22 \ -relief sunken -bd 1 \ -font $Bz(efont)] set Bz(text2) "label" set ce2 [entry $cf1.e2 -textvariable Bz(text2) \ -bg $bg \ -width 7 \ -relief sunken -bd 1 \ -font $Bz(efont)] pack $cf1 -side top -padx 2 pack $cl1 $ce1 $ce2 -side left $ce1 config -state disabled $ce2 config -state disabled set lhlt [$cl1 cget -highlightthickness] set ehlt [$ce1 cget -highlightthickness] # compute the desired canvas width & height set w [expr [winfo reqwidth $ce1] + [winfo reqwidth $ce2] + \ [winfo reqwidth $cl1] + 2 * $lhlt + 2 * $ehlt] set h [expr [winfo fpixels . 15c] - (1.5 * $h)] set Bz($can,width) $w $Bz($can,scrollcan) config -width $w -height $h # compute how many window items can be rendered set item_height [expr [winfo reqheight $cl1] + 2] set Bz($can,item_height) $item_height set Bz($can,n_item) [expr int($h / $item_height)] xcDebug "tcl: n_item: $Bz($can,n_item)" for {set i 1} {$i <= $Bz($can,n_item) - 1} {incr i} { set cf [frame $Bz($can,frame).f$i] set cl [label $cf.l -text $i \ -width 2 \ -height 1 \ -anchor w \ -relief sunken -bd 1 \ -font $Bz(font)] # format 6-2-6-2-6 -> width==22 set ce1 [entry $cf.e1 -textvariable Bz($can,coor$i) \ -width 22 \ -relief sunken -bd 1 \ -font $Bz(efont) \ -state disabled] set Bz($can,coor_entry$i) $ce1 set ce2 [entry $cf.e2 -textvariable Bz($can,label$i) \ -width 7 \ -relief sunken -bd 1 \ -font $Bz(efont) \ -state normal] pack $cf -side top -padx 2 pack $cl $ce1 $ce2 -side left } set f4 [frame $fr.f4 -relief raised -bd 2 -highlightthickness 1] pack $f4 -side top -fill both -expand 1 set ok [DefaultButton $f4.ok -text "OK" -command [list Bz_OK $can $type]] set can [button $f4.can -text "Cancel" \ -command [list CancelProc $Bz(tplw) BzOK(done)]] pack $ok $can -side left -expand 1 } proc Bz_DeletePoints {what can} { global Bz xcDebug "COMMAND:: Bz_DeletePoints" if { $what == "last" } { set Bz($can,coor$Bz($can,nselected)) {} set Bz($can,label$Bz($can,nselected)) {} set Bz($can,nselected) [xc_bz deselect $can] set Bz($can,last_selected) [xc_bz get $can last_selected] } elseif { $what == "all" } { for {set i 1} {$i <= $Bz($can,nselected)} {incr i} { set Bz($can,coor$i) {} set Bz($can,label$i) {} } set Bz($can,nselected) [xc_bz deselectall $can] set Bz($can,last_selected) [xc_bz get $can last_selected] } } #proc Bz_PolyButtonPressed {can x y} { # # set id [$can find closest $x $y] # xcDebug "Id: $id" # for {set i 0} {$i < 12} {incr i} { # set pid [$can find withtag p$i] # if { $id == $pid } { # xcDebug "LINE:: polygon #: $i" # } # } #} #proc Bz_PointButtonPressed {can x y} { # global Bz # # set id [$can find closest $x $y] # xcDebug "Id: $id" # for {set i 0} {$i < $Bz($can,npoint)} {incr i} { # set pid [$can find withtag pt$i] # if { $id == $pid } { # xcDebug "tcl: Selected point #: $i" # xc_bz select $can $i # } # } #} proc Bz_ViewPort can { xcDebug "COMMAND:: Bz_ViewPort" xc_bz viewport $can xc_bz render $can } proc Bz_ButtonPressed {can x y} { global Bz xcDebug "COMMAND:: Bz_ButtonPressed" # debuging xcDebug "LINE:: polyID [$can find overlapping \ [expr $x - 3] [expr $y - 3] [expr $x + 3] [expr $y + 3]]" xcDebug "LINE:: STACKING ORDER == [$can find withtag polygon]\n" # maybe a point was selected set ps [$can find enclosed \ [expr $x - 10] [expr $y - 10] [expr $x + 10] [expr $y + 10]] set nps [expr [llength $ps] - 1] # upper items are at the end of ps list, so: for {set i $nps} {$i > -1} {incr i -1} { set id [lindex $ps $i] for {set j 0} {$j < $Bz($can,npoint)} {incr j} { set pid [$can find withtag pt$j] if { $id == $pid } { if { $j == $Bz($can,last_selected) } { # deselect xcDebug "tcl: Deselected point #: $j" set Bz($can,coor$Bz($can,nselected)) {} set Bz($can,label$Bz($can,nselected)) {} set Bz($can,nselected) [xc_bz deselect $can] set Bz($can,last_selected) [xc_bz get $can last_selected] xcDebug "tcl: last_selected: $Bz($can,last_selected)" } else { # select xcDebug "tcl: Selected point #: $j" set list [xc_bz select $can $j] set Bz($can,nselected) [lindex $list 0] # # assigning the coordinate of selected k-point # set Bz($can,coor$Bz($can,nselected)) "" foreach item [lrange $list 1 end] { append Bz($can,coor$Bz($can,nselected)) \ [format {% 1.5f} $item] append Bz($can,coor$Bz($can,nselected)) { } } # # For k-labels lookup: try to set the K-points label # set Bz($can,label$Bz($can,nselected)) [eval {getKLabel $Bz(lattice_type)} $Bz($can,coor$Bz($can,nselected))] # number of selected k-points set Bz($can,last_selected) $j # take care if nselected is greater than number of entries if { $Bz($can,nselected) > $Bz($can,n_item) - 1 } { # make new entries that will hold coords & label set cf [frame $Bz($can,frame).f$Bz($can,nselected)] set cl [label $cf.l -text $Bz($can,nselected) \ -width 2 \ -height 1 \ -anchor w \ -relief sunken -bd 1 \ -font $Bz(font)] # format 6-2-6-2-6 -> width==22 set ce1 [entry $cf.e1 \ -textvariable \ Bz($can,coor$Bz($can,nselected)) \ -width 22 \ -relief sunken -bd 1 \ -font $Bz(efont) \ -state normal] set ce2 [entry $cf.e2 \ -textvariable \ Bz($can,label$Bz($can,nselected)) \ -width 4 \ -relief sunken -bd 1 \ -font $Bz(efont) \ -state normal] pack $cf -side top -padx 2 pack $cl $ce1 $ce2 -side left incr Bz($can,n_item) set h [expr ($Bz($can,nselected) + 1) * \ $Bz($can,item_height) + 5] $Bz($can,scrollcan) config \ -scrollregion "0 0 $Bz($can,width) $h" } } set i -1 } } } set Bz($can,B1down) 1 } proc Bz_ButtonReleased can { global Bz xcDebug "COMMAND:: Bz_ButtonReleassed" set Bz($can,B1down) 0 set Bz($can,motionB1down) 0 } proc Bz_Motion {can x y} { global Bz xcDebug "COMMAND:: Bz_Motion" if $Bz($can,B1down) { if !$Bz($can,motionB1down) { set Bz($can,motionB1down) 1 } else { xc_bz rotate $can \ [expr $x - $Bz($can,oldX)] [expr $y - $Bz($can,oldY)] 0 } set Bz($can,oldX) $x set Bz($can,oldY) $y } } proc Bz_BindDestroy can { global Bz set ren $Bz(rendered) unset Bz set Bz(rendered) $ren; #this is used for --wien_kpath } proc Bz_SetState {can what} { global Bz xcDebug "COMMAND:: Bz_SetState $what $Bz($can,state_$what)" if { $what == "points" } { xc_bz state $can points $Bz($can,state_points) } elseif { $what == "vectors" } { xc_bz state $can vectors $Bz($can,state_vectors) } } proc Bz_ManualRotate {can type} { global Bz xcDebug "COMMAND:: Bz_ManualRotate" switch -exact -- $type { "+x" { xc_bz degrotate $can -$Bz($can,rot) 0 0 } "-x" { xc_bz degrotate $can $Bz($can,rot) 0 0 } "+y" { xc_bz degrotate $can 0 -$Bz($can,rot) 0 } "-y" { xc_bz degrotate $can 0 $Bz($can,rot) 0 } "+z" { xc_bz degrotate $can 0 0 -$Bz($can,rot) } "-z" { xc_bz degrotate $can 0 0 $Bz($can,rot) } } } proc Bz_OK {can type} { global Bz prop BzOK fillEntries set input {} set title {} if { $type == "conv" } { append input "CONVCELL\n" } append input "BAND\n" # at least two points must have been selected; check that if { $Bz($can,nselected) < 2 } { tk_dialog [WidgetName] ERROR "ERROR !\nAt least two points must be selected for \"band structure\". Please do so !" error 0 OK focus $Bz($can,coor_entry1) return } set BzOK(iss) [xc_bz iss $can] # t.k.: Thu Feb 26 22:17:52 CET 2004 global wnKP set wnKP(npoi) $Bz($can,nselected) set wnKP(M) $BzOK(iss) set wnKP(type) $type #/ # COPY significant data from Bz() array before it will destroyed by # binding command set nselected $Bz($can,nselected) for {set i 1} {$i <= $Bz($can,nselected)} {incr i} { # foreach c $Bz($can,coor$i) { append coorlabel "[format {% 4d} [expr round($c * $BzOK(iss))]] " } append coorlabel " $Bz($can,label$i)\n" # t.k: set ipol 1 foreach c $Bz($can,coor$i) { set wnKP(poi,$i,$ipol) $c incr ipol } #/ } catch { grab release $Bz(tplw) } if { $Bz(tplw) != "." } { destroy $Bz(tplw) } # maybe user want's to modify something set t [xcToplevel [WidgetName] "Band Structure Script" \ "BAND" . 100 100 1] catch { grab $t } set f1 [frame $t.f1 -relief raised -bd 2] set f2 [frame $t.f2 -relief raised -bd 2] pack $f1 $f2 -side top -fill both -expand 1 set text { NOTES: 1. Please check if k-point coordinates looks OK. These k-points have integer coordinates, calculated as (kx*M, ky*M, kz*M), where M is an integer multiplier. Actual k-point coordinates are then obtained as: 1/M * (kx*M, ky*M, kz*M) !!! 2. You can also specify some new k-points manually. 3. The k-path is obtained by connecting the k-points together. } message $f1.msg -aspect 300 -relief ridge -bd 2 -text $text pack $f1.msg -side top -padx 5 -pady 5 FillEntries $f1 { "M multiplier was set to:" "Total number of k-points along the path:" } [list BzOK(iss) BzOK(nK)] 37 8 top left # t.k: are the any side-effect for setting prop(n_band) to non-number ??? if { ! [info exists prop(n_band)] } { set prop(n_band) XX set prop(firstband) 1 set prop(lastband) 10 } set BzOK(foclist) $fillEntries if { ! [info exists BzOK(wien_kpath)] } { set fl3 [SelBandIntv $f1] set BzOK(varlist) { {BzOK(iss) posint} {BzOK(nK) posint} {prop(firstband) posint} {prop(lastband) posint} } } else { # specify energy range # set l1 [label $f1.l1 -text \ # "Please enter energy interval for BAND structure calculation !!!" \ # -relief flat -justify left -anchor w] # # pack $l1 -side top -pady 5 -fill x -expand 1 # FillEntries $f1 { # "Minimum Energy:" # "Maximum Energy:" # } {BzOK(Emin) BzOK(Emax)} 37 8 top left # set BzOK(foclist) [concat $BzOK(foclist) $fillEntries] set BzOK(varlist) { {BzOK(iss) posint} {BzOK(nK) posint} } # {BzOK(Emin) real} # {BzOK(Emax) real} # this is needed to complete c95_BAND_script set prop(firstband) 1 set prop(lastband) 10 } set f2l [frame $f2.l] set f2r [frame $f2.r] set f2ll [frame $f2l.l] set f2lr [frame $f2l.r] set f2llu [frame $f2ll.u] set f2llb [frame $f2ll.b] pack $f2l -side left -fill y -padx 5 -pady 5 pack $f2r -side left -fill both -expand 1 pack $f2ll $f2lr -side left -fill y pack $f2llu $f2llb -side top set l1 [text $f2ll.l1 -width 30 -height 1] $l1 insert 1.0 [format "%7s %4s %4s %4s %7s" Format: M*kx M*ky M*kz label] $l1 config -state disabled $l1 config -bg [$f2l cget -bg] set t1_h [expr $nselected + 1] if { $t1_h < 10 } { set t1_h 10 } set t1 [text $f2ll.t1 \ -setgrid true \ -wrap none \ -width 30 \ -height $t1_h \ -yscrollcommand "$f2lr.sy set"] set sy [scrollbar $f2lr.sy -orient vert \ -command "$f2ll.t1 yview"] pack $l1 $t1 -side top -padx 2 -pady 2 -fill y pack $sy -side left -padx 2 -pady 2 -fill y # this ...: $t1 insert 1.0 $coorlabel set ok [DefaultButton $f2r.ok -text "OK" \ -command [list Bz_OK_OK $t $type $t1]] set can [button $f2r.can -text "Cancel" \ -command [list CancelProc $t BzOK(done)]] pack $ok $can -side top -expand 1 -padx 5 -pady 5 } proc Bz_OK_OK {tplw type coor_label} { global BzOK prop properties kpath wnKP set coorlabeltext [$coor_label get 1.0 end] xcDebug -stderr "Coorlabel text:\n $coorlabeltext" # first check the entry-variables if { ! [check_var $BzOK(varlist) $BzOK(foclist)] } { return } # # assign default labels # # since we have automatic k-point labeling such a naming might be # misleading #set labels {A B C D E F G H I J K L M N O P R S T U V Z X Y W a b c d e f g h i j k l m n o p r s t u v z x y w} for {set i 1} {$i < 100} {incr i} { append labels " K.$i" } set errorText {ERROR: you have mistype the k-point coordinates. Please try again !} # # parse coorlabeltext and assign coordinates and labels # set ith 0 foreach line [split $coorlabeltext \n] { #if { [llength $line] < 3 || [llength $line] > 4 } { # tk_dialog [WidgetName] ERROR $errorText error 0 OK # return #} if { [llength $line] == 3 || [llength $line] == 4 } { for {set k 0} {$k < 3} {incr k} { set poi($ith,$k) [lindex $line $k] if { ! [string is integer -strict $poi($ith,$k)] } { ErrorDialog $errorText return } } set lab($ith) [lindex $line 3] if { $lab($ith) == {} } { set lab($ith) [lindex $labels $ith] } # t.k. set wnKP(label,[expr $ith + 1]) $lab($ith) #/ incr ith } } set kpath(point_labels) {} for {set i 0} {$i < $ith} {incr i} { set ii [expr $i + 1] set properties(TICK$ii) $lab($i) append title $lab($i)- append kpath(point_labels) \ [format "%3d %3d %3d %s\n" \ $poi($i,0) $poi($i,1) $poi($i,2) $lab($i)] # } set title [string trimright $title -] if { ! [info exists prop(newk_script)] } { set prop(newk_script) "" } set prop(c95_BAND_script) $prop(newk_script) if { $type == "conv" } { set kpath(basis) "CONVENTIONAL" append prop(c95_BAND_script) "CONVCELL\n" } else { set kpath(basis) "PRIMITIVE" } set prop(NLINE) [expr $ith - 1] append prop(c95_BAND_script) "BAND\n$title\n" append prop(c95_BAND_script) \ "$prop(NLINE) $BzOK(iss) $BzOK(nK) $prop(firstband) $prop(lastband) 1 0\n" for {set i 0} {$i < $prop(NLINE)} {incr i} { set ii [expr $i + 1] append prop(c95_BAND_script) \ "$poi($i,0) $poi($i,1) $poi($i,2) $poi($ii,0) $poi($ii,1) $poi($ii,2)\n" } xcDebug -stderr "CRYSTALxx Band Structure Script:" xcDebug -stderr "--------------------------------" xcDebug -stderr $prop(c95_BAND_script) catch { grab release $tplw } destroy $tplw set BzOK(done) 1 } proc Bz_ManualZoom {can initstep} { global Bz xc_bz zoom $can [expr $initstep * $Bz($can,rot)] } proc Bz_MouseWheel {can dir} { set zoom 0.075 xc_bz zoom $can ${dir}$zoom } #proc Bz_CheckScript can { # global Bz # # # CHECK THE FOLLOWING:: # # 1.) at least two points must have been selected # # 2.) check if the coordinates are specified correctly. # # # 1.) # #if { $Bz($can,nK) == "" } { # # tk_dialog [WidgetName] ERROR "ERROR !\nYou forget to specify \ # # the \"Bz($can,nK)\" variable. Please do so !" error 0 OK # # focus $Bz($can,nK_entry) # # return 0 # #} # #if ![check_var [list [list Bz($can,nK) posint]] $Bz($can,nK_entry)] { # # return 0 # #} # # # 1.) # if { $Bz($can,nselected) < 2 } { # tk_dialog [WidgetName] ERROR "ERROR !\nAt least two points must be selected for \"band structure\". Please do so !" error 0 OK # focus $Bz($can,coor_entry1) # return 0 # } # # ## 2.) # #for {set i 1} {$i <= $Bz($can,nselected)} {incr i} { # # if { $Bz($can,coor$i) == "" } { # # tk_dialog [WidgetName] ERROR "ERROR !\nYou forget to specify \ # # coordinates for point #$i. Please do so !" error 0 OK # # focus $Bz($can,coor_entry$i) # # return 0 # # } # # set n 0 # # foreach num $Bz($can,coor$i) { # # if [catch {expr abs($num)}] { # # dialog .number1 ERROR "ERROR !\nYou have specified a character instead of numbers for coordinates of point #$i. Try again !" error 0 OK # # focus $Bz($can,coor_entry$i) # # return 0 # # } # # incr n # # } # # if { $n < 3 } { # # dialog .number1 ERROR "ERROR !\nYou have badly specified the coordinates of point #$i. Intead of 3 numbers, You specified just $n numbers. Try again !" error 0 OK # # focus $Bz($can,coor_entry$i) # # return 0 # # } # #} # # return 1 #} xcrysden-1.6.2/Tcl/planeselect.tcl0000644000175000017500000002641111712741377015616 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/planeselect.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc IsoPlaneGrid w { global isoplane # # initialize "xc_isospacesel" command # xc_isospacesel .mesa init set fp [frame $w.fp] set fp1 [frame $w.fp.1 -relief groove -bd 2] set l1 [label $fp1.l \ -text "Select Plane for Property Evaluation" -relief flat] # # PARALLELOGRAM SELECTION # proc IsoGrid_ParaPlaneSel t { global isoplane xcColors select IsoPlaneGrid_State $t set select(done) 0 set selw .igpps if [winfo exists .igpps] { # we already have this toplevel displayed return } PreSel $selw .mesa "Select Parallelogram" "Select a three-atoms spanning parallelogram. Please click on three atoms" ParalleSel 3 tkwait window $selw if !$select(done) { set isoplane(plane_sel) {} IsoPlaneGrid_State $t return } # # here I will have to set the four corners # isoplane(X/Y/Z,#) for {set i 1} {$i <= 3} {incr i} { set isoplane(1,$i) $select(X$i) set isoplane(2,$i) $select(Y$i) set isoplane(3,$i) $select(Z$i) } # 1---4 # | | # 2---3 # # point4 == point3 + point1 - point2 foreach i {1 2 3} { set isoplane($i,4) [expr $isoplane($i,3) + \ $isoplane($i,1) - $isoplane($i,2)] } # # END of IsoGrid_ParaPlaneSel } if ![info exists isoplane(plane_sel)] { set isoplane(plane_sel) {} } set r1 [radiobutton $fp1.r1 \ -text "Three-atoms spanning parallelogram selection" \ -variable isoplane(plane_sel) \ -value "para" \ -width 41 \ -command [list IsoGrid_ParaPlaneSel $w] \ -anchor w] pack $fp -side top -fill both pack $fp1 -side top -fill both -padx 2 -pady 5 grid $l1 -row 0 -column 0 -columnspan 3 -sticky we grid $r1 -row 1 -column 0 -columnspan 3 -sticky we set isoplane(AB_margin) 0.0 set isoplane(CD_margin) 0.0 set isoplane(AD_margin) 0.0 set isoplane(BC_margin) 0.0 set f [frame $fp1.f] grid $f -row 2 -column 1 -rowspan 4 -sticky wens FillEntries $f {{AB margin:} {CD margin:} {AD margin:} {BC margin:}} \ {isoplane(AB_margin) isoplane(CD_margin) isoplane(AD_margin) \ isoplane(BC_margin)} 10 10 set c11 [checkbutton $fp1.c11 \ -text "Rectangular parallelogram" \ -variable isoplane(rectangular) \ -command [list IsoPlaneGrid_Update $w] \ -anchor w] grid $c11 -row 6 -column 1 -columnspan 3 -rowspan 2 -sticky wen # # CENTERED SELECTION # proc IsoGrid_CenterPlaneSel t { global isoplane xcColors isogrid_center IsoPlaneGrid_State $t if [winfo exists .igcps] { # we already have this toplevel displayed return } set isogrid_center {} set tp [xcToplevel .igcps "Atom centered selection" \ "Atom centered selection" . -0 0 1] set f [frame $tp.f -class StressText] pack $f -padx 5 -pady 5 set m1 [message $f.l \ -text "Atom centered selection is composed of two tasks:\n 1.) select an atom center\n 2.) Select a plane direction" \ -aspect 500 \ -justify left \ -relief groove -bd 2] pack $m1 -side top proc IsoGrid_SelCenter {} { global select isoplane xcColors set select(done) 0 set selw [WidgetName] PreSel $selw .mesa "Select an Atom Center" "For selecting an atom center click one atom" AtomSel 1 tkwait window $selw if !$select(done) { return } # # here get the data # set isoplane(c,X) $select(X1) set isoplane(c,Y) $select(Y1) set isoplane(c,Z) $select(Z1) set isoplane(but_center) "Select an atom center\n(done)" $isoplane(b1) config -background $xcColors(normal_bg) if { $isoplane(but_center) == "Select an atom center\n(done)" && \ $isoplane(but_nml) == "Select a plane direction\n(done)" } { $isoplane(ok) config -state normal } } proc IsoGrid_SelDirection {} { global select isoplane xcColors set select(done) 0 set selw [WidgetName] PreSel $selw .mesa "Select a Plane Direction" "For selecting a plane direction click three atoms that determine the desired direction" \ ParalleSel 3 tkwait window $selw if !$select(done) { return } # 1 # | # 2--3; vec1 = p1 - p2, vec2 = p3 - p2 # nml = vec1 x vec2; vec = v(X/Y/Z,#) foreach i {X Y Z} { set v($i,1) [expr $select(${i}1) - $select(${i}2)] set v($i,2) [expr $select(${i}3) - $select(${i}2)] } set isoplane(nml,1) [expr $v(Y,1) * $v(Z,2) - $v(Y,2) * $v(Z,1)] set isoplane(nml,2) [expr $v(Z,1) * $v(X,2) - $v(Z,2) * $v(X,1)] set isoplane(nml,3) [expr $v(X,1) * $v(Y,2) - $v(X,2) * $v(Y,1)] set isoplane(but_nml) "Select a plane direction\n(done)" $isoplane(b2) config -background $xcColors(normal_bg) if { $isoplane(but_center) == "Select an atom center\n(done)" && \ $isoplane(but_nml) == "Select a plane direction\n(done)" } { $isoplane(ok) config -state normal } } set isoplane(but_center) "Select an atom center\n(to be done)" set isoplane(but_nml) "Select a plane direction\n(to be done)" set isoplane(b1) [button $f.b1 -textvariable isoplane(but_center) \ -bg "#ffffdd" -command IsoGrid_SelCenter] set isoplane(b2) [button $f.b2 -textvariable isoplane(but_nml) \ -bg "#ffffdd" -command IsoGrid_SelDirection] pack $isoplane(b1) $isoplane(b2) -side left -padx 5 -pady 5 proc IsoGrid_CenterCan {t t1} { global isogrid_center isoplane set isoplane(plane_sel) {} IsoPlaneGrid_State $t1 unset isogrid_center CancelProc $t } proc IsoGrid_CenterOK {t w} { global isogrid_center # check if both steps (center & direction) have been determined destroy $t IsoPlaneGrid_Update $w unset isogrid_center } set can [button $tp.can -text Cancel \ -command [list IsoGrid_CenterCan $tp $t]] set ok [DefaultButton $tp.ok -text OK \ -command [list IsoGrid_CenterOK $tp $t]] pack $can $ok -side right -padx 10 -pady 5 set isoplane(ok) $ok.b $isoplane(ok) config -state disabled # # END of IsoGrid_CenterPlaneSel } set r2 [radiobutton $fp1.r2 \ -text "Atom centered selection" \ -variable isoplane(plane_sel) \ -value "center" \ -width 41 \ -command [list IsoGrid_CenterPlaneSel $w] \ -anchor w] if ![info exists isoplane(r)] { set isoplane(r) 1.0 } if ![info exists isoplane(rot)] { set isoplane(rot) 0.0 } grid $r2 -row 8 -column 0 -columnspan 3 -sticky we set f [frame $fp1.ff] grid $f -row 9 -column 1 -rowspan 2 -sticky wens FillEntries $f {radius: rotate:} {isoplane(r) isoplane(rot)} 10 10 set rot [button $fp1.rot -text "rotate" \ -command [list IsoPlaneGrid_Update $w 1]] grid $rot -row 10 -column 2 -sticky s frame $fp1.fupd -relief raised -bd 1 set upd [button $fp1.upd -text "Update Display" -bd 1 \ -command [list IsoPlaneGrid_Update $w]] grid $fp1.fupd -row 11 -column 0 -columnspan 3 -sticky we -padx 3 -pady 3 pack $upd -in $fp1.fupd -pady 3 # # get the correct state # IsoPlaneGrid_State $w } proc IsoPlaneGrid_State t { global isoplane xcColors if { $isoplane(plane_sel) == "para" } { foreach i {1 2 3 4} { $t.fp.1.f.f1.$i.entry$i config -state normal -relief sunken $t.fp.1.f.f1.$i.lab$i config -foreground $xcColors(enabled_fg) } $t.fp.1.c11 config -state normal $t.fp.1.ff.f1.1.entry1 config -state disabled -relief flat $t.fp.1.ff.f1.1.lab1 config -foreground $xcColors(disabled_fg) $t.fp.1.ff.f1.2.entry2 config -state disabled -relief flat $t.fp.1.ff.f1.2.lab2 config -foreground $xcColors(disabled_fg) $t.fp.1.rot config -state disabled $t.fp.1.upd config -state normal } elseif { $isoplane(plane_sel) == "center" } { foreach i {1 2 3 4} { $t.fp.1.f.f1.$i.entry$i config -state disabled -relief flat $t.fp.1.f.f1.$i.lab$i config -foreground $xcColors(disabled_fg) } $t.fp.1.c11 config -state disabled $t.fp.1.ff.f1.1.entry1 config -state normal -relief sunken $t.fp.1.ff.f1.1.lab1 config -foreground $xcColors(enabled_fg) $t.fp.1.ff.f1.2.entry2 config -state normal -relief sunken $t.fp.1.ff.f1.2.lab2 config -foreground $xcColors(enabled_fg) $t.fp.1.rot config -state normal $t.fp.1.upd config -state normal } else { foreach i {1 2 3 4} { $t.fp.1.f.f1.$i.entry$i config -state disabled -relief flat $t.fp.1.f.f1.$i.lab$i config -foreground $xcColors(disabled_fg) } $t.fp.1.c11 config -state disabled $t.fp.1.ff.f1.1.entry1 config -state disabled -relief flat $t.fp.1.ff.f1.1.lab1 config -foreground $xcColors(disabled_fg) $t.fp.1.ff.f1.2.entry2 config -state disabled -relief flat $t.fp.1.ff.f1.2.lab2 config -foreground $xcColors(disabled_fg) $t.fp.1.rot config -state disabled $t.fp.1.upd config -state disabled } } proc IsoPlaneGrid_Update {w {rot 0}} { global isoplane if { $isoplane(plane_sel) == "para" } { set varlist { {isoplane(AB_margin) real} {isoplane(CD_margin) real} \ {isoplane(AD_margin) real} {isoplane(BC_margin) real} } set foclist [list \ $w.fp.1.f.f1.1.entry1 $w.fp.1.f.f1.2.entry2 \ $w.fp.1.f.f1.3.entry3 $w.fp.1.f.f1.4.entry4] if ![check_var $varlist $foclist] { return; } set isoplane(points) [xc_isospacesel .mesa paralle2D \ -points [list \ $isoplane(1,1) $isoplane(2,1) $isoplane(3,1) \ $isoplane(1,2) $isoplane(2,2) $isoplane(3,2) \ $isoplane(1,3) $isoplane(2,3) $isoplane(3,3) \ $isoplane(1,4) $isoplane(2,4) $isoplane(3,4)] \ -margins [list \ $isoplane(AB_margin) $isoplane(CD_margin) \ $isoplane(AD_margin) $isoplane(BC_margin)] \ -rectangular $isoplane(rectangular)] # set the main OK button to normal state $isoplane(OK) config -state normal if { [winfo exists $isoplane(editButton)] } { $isoplane(editButton) config -state normal } } elseif { $isoplane(plane_sel) == "center" } { set varlist { {isoplane(r) real} {isoplane(rot) real} } set foclist [list $w.fp.1.ff.f1.1.entry1 $w.fp.1.ff.f1.2.entry2] if ![check_var $varlist $foclist] { return; } set rotate 0.0 if $rot { # rotate button was pressed set rotate $isoplane(rot) } set isoplane(points) [xc_isospacesel .mesa center2D \ -center [list $isoplane(c,X) \ $isoplane(c,Y) $isoplane(c,Z)] \ -normal [list $isoplane(nml,1) \ $isoplane(nml,2) $isoplane(nml,3)] \ -size $isoplane(r) \ -rotate $rotate] # set the main OK button to normal state $isoplane(OK) config -state normal if { [winfo exists $isoplane(editButton)] } { $isoplane(editButton) config -state normal } } } xcrysden-1.6.2/Tcl/fileselect.tcl0000644000175000017500000004077512352550723015441 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/tonefile.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc fileselectResources {} { # path is used to enter the file name option add *Fileselect*path.relief sunken startup option add *Fileselect*path.background white startup option add *Fileselect*path.foreground black startup # Text for the OK and Cancel buttons option add *Fileselect*ok*text OK startup option add *Fileselect*ok*underline 0 startup option add *Fileselect*cancel.text Cancel startup option add *Fileselect*cancel.underline 0 startup # Size of the listbox option add *Fileselect*list.width 20 startup option add *Fileselect*list.height 15 startup # Size of the directory option add *Fileselect*menub.width 30 startup } # fileselect returns the selected pathname, or {} proc fileselect {{why "File Selection"} {default {}} {mustExist 1} \ {seldir {0}}} { global fileselect system ######################################## # CD to $system(PWD) xcDebug "pwd = [pwd]" cd $system(PWD) ######################################## # if seldir -> select a directory set fileselect(seldir) $seldir puts stdout "fileselect(seldir):: $fileselect(seldir)" set t [toplevel .fileselect -bd 4 -class Fileselect] xcPlace . .fileselect 50 100 wm title $t "File Browser" wm iconname $t "Open Structure" wm transient $t focus $t # if toplevel is destroyed we must cd back to $system(SCRDIR) bind $t { cd $system(SCRDIR) } fileselectResources message $t.msg \ -aspect 1000 \ -text $why \ -relief groove $t.msg config -font [ModifyFontSize $t.msg 18] pack $t.msg -side top -expand 1 -padx 10 -pady 10 # a custom optionMenu where UpDirs will be set tfrm [frame $t.tfrm] pack $tfrm -expand 1 -fill x -pady 10 set dlab [label $tfrm.lbl -text "Directory:" -padx 0] set fileselect(optMenu) [menubutton $tfrm.menub -relief raised \ -text "Listing ..." -menu $tfrm.menub.m -indicatoron 1 -padx 0] pack $dlab -side left pack $fileselect(optMenu) -side left -fill x -expand 1 set fileselect(menu) [menu $tfrm.menub.m -tearoff 0] # Create an entry for the pathname # The value is kept in fileselect(path) frame $t.top if $seldir { label $t.top.l -text "Directory:" -padx 0 } else { label $t.top.l -text "File:" -padx 0 } set e [entry $t.top.path \ -textvariable fileselect(path)] pack $t.top -side top -fill x pack $t.top.l -side left pack $t.top.path -side right -fill x -expand true # Create two listboxes to hold the directory contents # one for files; one for subdirs set tm [frame $t.mid -relief groove -bd 2] pack $tm -side top -fill both -expand 1 -pady 15 -ipadx 3 -ipady 3 set lb1 [ScrolledListbox2 $tm.lb1] if !$seldir { set lb2 [ScrolledListbox2 $tm.lb2] } # Create the OK and Cancel buttons # The OK button has a rim to indicate it is the default frame $t.buttons frame $t.buttons.ok -bd 2 -relief sunken set ok [button $t.buttons.ok.b \ -command [list fileselectOK $seldir]] set can [button $t.buttons.cancel \ -command fileselectCancel] # Pack the list, scrollbar, and button box # in a horizontal stack below the upper widgets pack $t.buttons -side bottom -expand 1 -pady 5 pack $t.buttons.ok $t.buttons.cancel \ -side left -padx 10 -pady 5 -expand 1 pack $t.buttons.ok.b -padx 4 -pady 4 -expand 1 puts stdout "1." if $seldir { fileselectBindings $t $e $lb1 {} $ok $can } else { fileselectBindings $t $e $lb1 $lb2 $ok $can } puts stdout "2." # Initialize variables and list the directory if {[string length $default] == 0} { set fileselect(path) {} if $fileselect(seldir) { set fileselect(path) $system(PWD) } set diry $system(PWD) } else { set fileselect(path) [file tail $default] puts stdout $fileselect(path) set diry [file dirname $default] } set fileselect(dir) {} set fileselect(done) 0 set fileselect(mustExist) $mustExist # Wait for the listbox to be visible so # we can provide feedback during the listing if $seldir { tkwait visibility .fileselect.mid.lb1.list } else { tkwait visibility .fileselect.mid.lb2.list } fileselectList $diry catch { grab $t } tkwait variable fileselect(done) destroy $t return $fileselect(path) } proc fileselectBindings { t e lb1 lb2 ok can } { global fileselect # t - toplevel # e - name entry # lb - listbox # ok - OK button # can - Cancel button # Elimate the all binding tag because we # do our own focus management if $fileselect(seldir) { set binlist [list $e $lb1 $ok $can] } else { set binlist [list $e $lb1 $lb2 $ok $can] } foreach w $binlist { bindtags $w [list $t [winfo class $w] $w] } # Dialog-global cancel binding bind $t fileselectCancel # Entry bindings bind $e fileselectOK bind $e fileselectComplete # A single click, or , puts the name in the entry # A double-click, or , selects the name bind $lb1 "fileselectTake %W ; focus $e" bind $lb1 \ "fileselectClick %W %y ; focus $e" bind $lb1 "fileselectTake %W ; fileselectOK" bind $lb1 \ "fileselectClick %W %y ; fileselectOK" if !$fileselect(seldir) { bind $lb2 "fileselectTake %W ; focus $e" bind $lb2 \ "fileselectClick %W %y ; focus $e" bind $lb2 "fileselectTake %W ; fileselectOK" bind $lb2 \ "fileselectClick %W %y ; fileselectOK" } # Focus management. # or selects the name. bind $e "focus $lb1 ; $lb1 select set 0" if !$fileselect(seldir) { bind $lb1 "focus $lb2; $lb2 select set 0" bind $lb2 "focus $e" } else { bind $lb1 "focus $e" } # Button focus. Extract the underlined letter # from the button label to use as the focus key. foreach but [list $ok $can] { set char [string tolower [string index \ [$but cget -text] [$but cget -underline]]] bind $t "focus $but ; break" } bind $ok "focus $can" bind $can "focus $ok" # Set up for type in focus $e } proc PreOptMenu {name} { global fileselect dir set dir $name set fileselect(dir) $name set path $fileselect(path) set fileselect(path) "" fileselectOK set fileselect(path) $path if $fileselect(seldir) { set fileselect(path) $name } puts stdout "PreOptMenu:: $path" OptMenu $name puts stdout "OptMenu:> $name" } proc OptMenu {dirnames} { global dir fileselect set dirnames [split $dirnames /] set dirnames [lrange $dirnames 1 end] set dirnames [Print $dirnames] set sel [lindex $dirnames [expr [llength $dirnames] - 1]] destroy $fileselect(optMenu) menubutton $fileselect(optMenu) -text $sel -menu $fileselect(menu) \ -indicatoron 1 -relief raised pack $fileselect(optMenu) -side left -fill x -expand true menu $fileselect(menu) -tearoff 0 foreach name $dirnames { $fileselect(menu) add command -label $name -command \ [list PreOptMenu $name] } } proc Print {names} { set prev {} set lis {} # $names could be "" puts stdout "NAMES> $names" set lis "/ " foreach el $names { if { $el != "" && $el != "."} { append lis "$prev/$el " set prev "$prev/$el" } } return [format "%s" $lis] } proc fileselectList { diry {files {}} } { global fileselect dir set dir $diry # Update the directory display destroy $fileselect(optMenu) puts stdout "DIR> $dir" set dirnames [lrange [split $dir /] 1 end] set dirnames [Print $dirnames] set sel [lindex $dirnames [expr [llength $dirnames] - 1]] menubutton $fileselect(optMenu) -text $sel -menu $fileselect(menu) \ -indicatoron 1 -relief raised pack $fileselect(optMenu) -side right -fill x -expand 1 menu $fileselect(menu) -tearoff 0 foreach name $dirnames { $fileselect(menu) add command -label $name -command \ [list PreOptMenu $name] } .fileselect.mid.lb1.list delete 0 end if !$fileselect(seldir) { .fileselect.mid.lb2.list delete 0 end } set fileselect(dir) $dir puts stdout "fileselectList.1 $fileselect(dir)" if ![file isdirectory $dir] { .fileselect.mid.lb1.list insert 0 "Bad Directory" return } if !$fileselect(seldir) { .fileselect.mid.lb2.list insert 0 Listing... } else { .fileselect.mid.lb1.list insert 0 Listing... } update idletasks if !$fileselect(seldir) { .fileselect.mid.lb2.list delete 0 } else { .fileselect.mid.lb1.list delete 0 } if {[string length $files] == 0} { # List the directory and add an # entry for the parent directory if {[catch {glob -nocomplain $fileselect(dir)/*}]} { tk_messageBox -message "Can not change to directory \"\ $fileselect(dir)\" \ Permission denied." -type ok -icon warning } else { set files [glob -nocomplain $fileselect(dir)/*] puts stdout "@ $fileselect(dir)" if { $fileselect(dir) != "//." && $fileselect(dir) != "/." && \ $fileselect(dir) != "/"} { .fileselect.mid.lb1.list insert end ../ } } } # Sort the directories in lb1 & files in lb2 set dirs {} set others {} foreach f [lsort $files] { if [file isdirectory $f] { lappend dirs [file tail $f]/ } else { lappend others [file tail $f] } } foreach f $dirs { .fileselect.mid.lb1.list insert end $f } if !$fileselect(seldir) { foreach f $others { .fileselect.mid.lb2.list insert end $f } } } proc fileselectOK {{okbut {0}}} { global fileselect # $fileselect(seldir) == 1 when opening directory if { $fileselect(path) == "/" } { if $fileselect(seldir) { set fileselect(path) / } else { set fileselect(path) {} } set fileselect(dir) $fileselect(path) } # Handle the parent directory specially & current dir (./) if {[regsub {^\.\./?} $fileselect(path) {} newpath] != 0} { set fileselect(path) $newpath set fileselect(dir) [file dirname $fileselect(dir)] puts stdout "fileselect(dir).1> $fileselect(dir)" fileselectOK return } if { $fileselect(seldir) && \ [regsub {/\.\.} $fileselect(path) {} newpath] != 0} { set fileselect(path) [file dirname $newpath] set fileselect(dir) [file dirname $fileselect(dir)] } # this is to prevent the //./ if {[regsub {^//\./?} $fileselect(dir) / newdir] != 0} { set fileselect(dir) $newdir puts stdout "fileselect(dir).2> $fileselect(dir)" fileselectOK return } # if fileselect(path) != '/' then if { $fileselect(path) != "/" } { set path [string trimright $fileselect(dir)/$fileselect(path) /] } else { set path "" } if { [file isdirectory $path] && $fileselect(seldir) == 0 } { set fileselect(path) {} puts stdout "back to fileselectList" fileselectList $path return } if { [file isdirectory $fileselect(path)] && $fileselect(seldir) == 1 && \ $okbut == 0 } { fileselectList $fileselect(path) return } if { $fileselect(seldir) == 1 && [file isdirectory $fileselect(path)] && \ $okbut == 1 } { set fileselect(path) $fileselect(path) set fileselect(done) 1 return } elseif { [file exists $path] && $fileselect(seldir) == 0 } { set fileselect(path) $path set fileselect(done) 1 return } # Neither a file or a directory. # See if glob will find something if [catch {glob $path} files] { # No, perhaps the user typed a new # absolute pathname if [catch {glob $fileselect(path)} path] { puts stdout "#" tk_messageBox -message "File/Directory \"$fileselect(path)\" \ does not exist !" -icon error -type ok raise .fileselect . set fileselect(dir) [file dirname $fileselect(dir)] set fileselect(path) {} fileselectOK return } #else # OK - try again # set fileselect(dir) [file dirname $fileselect(dir)] # set fileselect(path) [file tail $fileselect(path)] # puts stdout "here" # fileselectOK #return } else { # Ok - current directory is ok, # either select the file or list them. if {[llength [split $files]] == 1} { if { $fileselect(seldir) && $fileselect(dir) == "/" } { set fileselect(path) "/" } else { set fileselect(path) $files } puts stdout "go back to fileselectOK" fileselectOK } else { set fileselect(dir) [file dirname [lindex $files 0]] puts stdout "OK.1> $files" puts stdout "OK.2> $fileselect(dir)" #append the directorys to files; also ../ if { $fileselect(dir) != "//." && $fileselect(dir) != "/"} { append files " ../" } set allfiles [glob -nocomplain $fileselect(dir)/*] foreach f $allfiles { #set f [file tail $f] if {[file isdirectory $f]} { # if dir is not yet on the list-->append if { [lsearch -exact $files $f] == -1} { append files " $f" } } } fileselectList $fileselect(dir) $files } } } proc fileselectCancel {} { global fileselect set fileselect(done) 1 set fileselect(path) {} } proc fileselectClick { lb y } { # Take the item the user clicked on global fileselect set fileselect(path) [$lb get [$lb nearest $y]] if $fileselect(seldir) { set fileselect(path) [string trimright $fileselect(path) /] set fileselect(path) $fileselect(dir)/$fileselect(path) } } proc fileselectTake { lb } { # Take the currently selected list item global fileselect set fileselect(path) [$lb get [$lb curselection]] } proc fileselectComplete {} { global fileselect # Do file name completion # Nuke the space that triggered this call set fileselect(path) [string trim $fileselect(path) \t\ ] # Figure out what directory we are looking at # dir is the directory # tail is the partial name if {[string match /* $fileselect(path)]} { set dir [file dirname $fileselect(path)] set tail [file tail $fileselect(path)] } elseif [string match ~* $fileselect(path)] { if [catch {file dirname $fileselect(path)} dir] { return ;# Bad user } set tail [file tail $fileselect(path)] } else { set path $fileselect(dir)/$fileselect(path) set dir [file dirname $path] set tail [file tail $path] } # See what files are there set files [glob -nocomplain $dir/$tail*] if {[llength [split $files]] == 1} { # Matched a single file set fileselect(dir) $dir set fileselect(path) [file tail $files] } else { if {[llength [split $files]] > 1} { # Find the longest common prefix set l [expr [string length $tail]-1] set miss 0 # Remember that files has absolute paths set file1 [file tail [lindex $files 0]] while {!$miss} { incr l if {$l == [string length $file1]} { # file1 is a prefix of all others break } set new [string range $file1 0 $l] foreach f $files { if ![string match $new* [file tail $f]] { set miss 1 incr l -1 break } } } set fileselect(path) [string range $file1 0 $l] } #append the directorys to files; also ../ puts stdout ">>> $fileselect(dir)" if { $fileselect(dir) != "//." && $fileselect(dir) != "/" } { append files " ../" } set allfiles [glob -nocomplain $dir/*] foreach f $allfiles { #set f [file tail $f] if {[file isdirectory $f]} { # if dir is not yet on the list-->append if { [lsearch -exact $files $f] == -1} { append files " $f" } } } puts "FILES= $files" fileselectList $dir $files } } #lappend auto_path /net/surf/users/tone/prog/XCrys/TCL #set pwd [pwd] #lappend auto_path /home/tone/prog/XCrys/Mesa #puts stdout "END:: [fileselect {Open Directory} {} 1 1]" xcrysden-1.6.2/Tcl/genWidget.tcl0000644000175000017500000011657213514604716015241 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/genWidget.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # in this file are GENERAL WIDGET procedures like DIALOGS, ... !!! proc RadioButtons { parent varname side args } { # side -- value for -side option set f [frame $parent.choices -relief groove -borderwidth 2] set b 0 foreach item $args { radiobutton $f.$b -variable $varname \ -text $item -value $item -anchor sw pack $f.$b -side $side -fill both -padx 10 -pady 5 incr b } pack $f -side top -ipadx 3 -ipady 3 -padx 5 -pady 5 } proc RadioBut { parent labeltext varname lside rside ring \ expand args } { # labeltext -- text to display in label # varname -- name of variable # lside -- value for -side option for label # rside -- value for -side option for radiobutton # ring -- wheather $f's relief is groove or not !!! # expand -- value for -expand option set wlist {} if { $ring == 1 } { set f [frame $parent.f -relief groove -borderwidth 2] } else { set f [frame $parent.f -borderwidth 0] } set f1 [frame $f.lbl -bd 0] set f2 [frame $f.f2 -bd 0] set lbl [label $f1.lbl -text $labeltext -anchor center] pack $f1 $f2 $lbl -side $lside -padx 0 -padx 0 \ -ipadx 0 -ipady 0 -expand $expand -fill both set wlist $lbl set b 0 foreach item $args { radiobutton $f2.$b -variable $varname \ -text $item -value $item -anchor sw pack $f2.$b -side $rside -fill both -padx 0 -pady 0 \ -ipadx 0 -ipady 0 -expand $expand lappend wlist $f2.$b incr b } pack $f -side $lside -ipadx 0 -ipady 0 -padx 2 -pady 2 \ -fill x -expand $expand return $wlist } proc RadioButCmd { parent labeltext varname cmd lside rside ring \ expand padx args } { global radio_but_cmd_frame # labeltext -- text to display in label # varname -- name of variable # cmd -- command to execute--> a value of $item is passed to cmd # ^^^^^ # lside -- value for -side option for label # rside -- value for -side option for radiobutton # ring -- wheather $f's relief is groove or not !!! # padx -- padx value for groove frame # expand -- value for -expand option set wlist {} if { $ring == 1 } { set f [frame [WidgetName $parent] -relief groove -borderwidth 2] } else { set f [frame [WidgetName $parent] -borderwidth 0] } set radio_but_cmd_frame $f set f1 [frame $f.lbl -bd 0] set f2 [frame $f.f2 -bd 0] set lbl [label $f1.lbl -text $labeltext -anchor center] pack $f1 $f2 $lbl $lbl -side $lside -padx 0 -pady 0 \ -ipadx 0 -ipady 0 -expand $expand set wlist $lbl set b 0 foreach item $args { radiobutton $f2.$b -variable $varname \ -text $item -value $item \ -anchor center \ -command [list $cmd $item] pack $f2.$b -side $rside -fill both -padx 0 -pady 0 \ -ipadx 0 -ipady 0 -expand $expand lappend wlist $f2.$b incr b } pack $f -side $lside -ipadx 0 -ipady 0 -padx $padx -pady 2 \ -fill x -expand $expand return $wlist } proc RadioButVarCmd { parent labeltext varname cmd lside rside ring \ expand args } { # labeltext -- text to display in label # varname -- name of variable # cmd -- command to execute--> a value of $varname is passed to cmd # ^^^^^^^^ # lside -- value for -side option for label # rside -- value for -side option for radiobutton # ring -- wheather $f's relief is groove or not !!! # expand -- value for -expand option if { $ring == 1 } { set f [frame $parent.f -relief groove -borderwidth 2] } else { set f [frame $parent.f -borderwidth 0] } set f1 [frame $f.lbl -bd 0] set f2 [frame $f.f2 -bd 0] set lbl [label $f1.lbl -text $labeltext -anchor center] pack $f1 $f2 $lbl $lbl -side $lside -padx 0 -padx 0 \ -ipadx 0 -ipady 0 set b 0 foreach item $args { radiobutton $f2.$b -variable $varname \ -text $item -value $item \ -command [list $cmd $varname] -anchor sw pack $f2.$b -side $rside -fill both -padx 0 -pady 0 \ -ipadx 0 -ipady 0 incr b } pack $f -side $lside -ipadx 0 -ipady 0 -padx 2 -pady 2 \ -fill x -expand $expand } proc CheckButVarCmd { parent varname cmd side ring expand args } { # varname -- name of variable # cmd -- command to execute--> a value of $varname is passed to cmd # ^^^^^^^^ # side -- value for -side option for radiobutton # ring -- wheather $f's relief is groove or not !!! # expand -- value for -expand option if { $ring == 1 } { set f [frame $parent.f -relief groove -borderwidth 2] } else { set f [frame $parent.f -borderwidth 0] } set b 0 foreach item $args { checkbutton $f.$b -variable $varname \ -onvalue On -offvalue Off -text $item \ -command [list $cmd $varname] -anchor sw pack $f.$b -side $side -fill both -padx 0 -pady 0 \ -ipadx 0 -ipady 0 incr b } pack $f -side $side -ipadx 0 -ipady 0 -padx 2 -pady 2 \ -fill x -expand $expand return $f } proc CheckButtons { parent args } { set f [frame $parent.booleans -borderwidth 5] set b 0 foreach item $args { checkbutton $f.$b -text $item -variable $item pack $f.$b -side left incr b } pack $f -side top } proc CheckVarButtons { parent labellist varlist side {onvalue 1} {offvalue 0} } { set f [frame $parent.booleans -borderwidth 5] set b 0 foreach label $labellist var $varlist { frame $f.$b checkbutton $f.$b.cb -text $label -variable $var \ -onvalue $onvalue -offvalue $offvalue pack $f.$b -side $side -fill x -expand 1 pack $f.$b.cb -side left incr b } pack $f -side top } proc Entries { w lablist entrylist width {expand {1}} {side {left}} \ {args {}}} { # w - widget # lablist - list of labels # entrylist - list of entries variables # width - width of entry # expand - parameter for -expand option frame $w.frame pack $w.frame -expand $expand set n 1 foreach ebl $entrylist { set m [expr $n - 1] label $w.frame.lab$n -text [lindex $lablist $m] entry $w.frame.entry$n -relief sunken -width $width \ -textvariable $ebl eval {pack $w.frame.lab$n $w.frame.entry$n -side $side \ -padx 5 -pady 5 -anchor w} $args incr n } return $w.frame.entry1 } proc OneEntries { w lablist entrylist labelwidth ewidth {pady 5} {args {}}} { # w - widget # lablist - list of labels # entrylist - list of entries variables # labelwidth - width of label # ewidth - width of entry set n 1 foreach ebl $entrylist { frame $w.frame$n if { $args != {} } { eval {pack $w.frame$n} $args } else { pack $w.frame$n } set m [expr $n - 1] label $w.frame${n}.lab$n -text [lindex $lablist $m] \ -width $labelwidth \ -anchor w entry $w.frame${n}.entry$n -relief sunken \ -textvariable $ebl \ -width $ewidth lappend foclist $w.frame${n}.entry$n pack $w.frame${n}.lab$n -side left -padx 5 -pady $pady pack $w.frame${n}.entry$n -side right -padx 5 -pady $pady \ -fill x -expand 1 incr n } return $foclist } proc dialog {win title text bitmap default args} { global button #win - name of top level window #title - title of toplevel window #text/bitmap - text/bitmap to be dispayed in the Dialog #default - index of default button; -1 if none #args - strings to be displayed in the buttons # from where do we came here, that we'll be able to set # the grab back where it was before set oldgrab [grab current] # 1. create TOP_LEVEL & divdide into TOP & BOTTOM toplevel $win -class Dialog wm title $win $title wm iconname $win Dialog frame $win.top -relief raised -bd 1 pack $win.top -side top -fill both frame $win.bot -relief raised -bd 1 pack $win.bot -side bottom -fill both xcPlace . $win 200 200 # 2. fill TOP with bitmap & message message $win.top.msg -text $text -aspect 500 set font [ModifyFont fixed $win.top.msg \ -family helvetica -weight bold -size 12] $win.top.msg config -font $font pack $win.top.msg -side right -expand 1 -fill both \ -padx 5m -pady 5m if {$bitmap != "" } { label $win.top.bitmap -bitmap $bitmap pack $win.top.bitmap -side left -padx 5m -pady 5m } # 3. create a row of buttons at the BOTTOM set i 0 foreach but $args { if {$i == $default} { frame $win.bot.default -relief sunken -bd 2 button $win.bot.default.button$i -text $but \ -command "set button $i" pack $win.bot.default -side left -expand 1 \ -padx 5m -pady 2m pack $win.bot.default.button$i -side left \ -padx 2m -pady 2m -ipadx 2m -ipady 1m focus $win.bot.default.button$i } else { frame $win.bot.rest -bd 10 button $win.bot.rest.button$i -text $but \ -command "set button $i" pack $win.bot.rest -side left -expand 1 \ -padx 5m -pady 2m pack $win.bot.rest.button$i -side left -expand 1 \ -padx 2m -pady 2m -ipadx 2m -ipady 1m } incr i } # 4. Set up binding for if {$default > 0} { bind $win.bot.default.button$default \ "$win.bot.default.button$default flash; \ set button $default" } # set a grab tkwait visibility $win catch { grab $win } # 5. Wait for the user to respond, then release the grab # and return the index of the selected button. tkwait variable button destroy $win catch { grab release $win } # set grab to "old one" if { $oldgrab != {} } { catch { grab $oldgrab } } return $button } proc xcToplevel {w title iconname {master {.}} {x {0}} {y {0}} {transient 1}} { # w............name of toplevel # title........title of toplevel # iconname # master.......name of widow that will be used to place toplevel # x,y..........where to place toplevel #if { [winfo exist $w] } { # xcDebug -stderr "\n\n\n DEBUG> toplevel \"$w\" already exist!!!!\n\ # ERROR: please report to autor: Tone.Kokalj@ijs.si\n" # return #} if { [winfo exist $w] } { # toplevel already exists; return from the calling proc return -code return } toplevel $w if { $master != "" } { xcPlace $master $w $x $y raise $w } wm title $w $title wm iconname $w $iconname if { $transient } { wm transient $w [winfo toplevel [winfo parent $w]] } return $w } # make text widget with xscrollball & yscrollbar and insert text proc DispText {f text w h {update 0}} { # f... window (YET TO BE CREATED) # text... text to be displayed # w... width of text widget # h... height of text widget # update if $f elready exists && update=1 -> just update the text # # PROC RETURNS name of text widget or 0 if it fails!!!!!!! # frame $f may already exists if { ![winfo exists $f] } { xcDebug -debug "#1" frame $f pack $f -side top -expand true -fill both set fb [frame $f.bottom ] set font [SetFont text -family courier -size 14] set t [text $f.t -setgrid true -wrap none -width $w -height $h \ -font $font \ -yscrollcommand "$f.sy set" -xscrollcommand "$fb.sx set"] puts stderr "TEXT-WIDGET: $t" scrollbar $f.sy -orient vert -command "$f.t yview" scrollbar $fb.sx -orient hori -command "$f.t xview" xcDebug -debug "#2" #set tplw .[lindex [split $f .] 1]; # whatfore is that used ???? # Create padding based on the scrollbar width and border set pad [expr [$f.sy cget -width] + 2 * \ ([$f.sy cget -bd] + \ [$f.sy cget -highlightthickness])] frame $fb.pad -width $pad -height $pad xcDebug -debug "#3" pack $fb -side bottom -fill x pack $fb.pad -side right pack $fb.sx -side bottom -fill x pack $f.sy -side right -fill y pack $f.t -side left -fill both -expand true xcDebug -debug "#4" $f.t insert end $text $f.t config -state disabled return $f.t } elseif $update { # just update text set dis 0 if { [$f.t cget -state] == "disabled" } { set dis 1 $f.t configure -state normal } $f.t delete 1.0 end $f.t insert 1.0 $text if $dis { $f.t configure -state disabled } return $f.t } return 0 } proc OneEntryToplevel {w title iconname text width varname vartype x y} { global done oneentry upvar $varname var if ![info exist var] { set var {} } set oneentry $var update xcDebug "OneEntryToplevel:: $oneentry" xcToplevel $w $title $iconname . $x $y set f1 [frame $w.f1 -relief raised -bd 2] set f2 [frame $w.f2 -relief raised -bd 2] set l1 [label $f1.l1 -text $text] set e1 [entry $f1.e1 -relief sunken -width $width -textvariable oneentry] focus $e1 set varlist [list "oneentry $vartype"] set foclist $e1 puts stdout "varlist:: $varlist" puts stdout "foclist:: $foclist" set b1 [button $f2.ok -text "OK" \ -command [list OneEntryOK $varlist $foclist]] set b2 [button $f2.can -text "Cancel" \ -command [list CancelProc $w]] pack $f1 $f2 -side top -fill both -padx 0 -pady 0 pack $l1 $e1 -side top -expand 1 -padx 10 -pady 5 pack $b1 $b2 -side left -expand 1 -padx 5 -pady 5 bind $e1 [list OneEntryOK $varlist $foclist] bind $b1 [list OneEntryOK $varlist $foclist] tkwait visibility $w # check if there is some window grabed set oldgrab [grab current] catch { grab $w } tkwait variable done destroy $w if { $oldgrab != ""} { catch { grab $oldgrab } } set var $oneentry xcDebug "OneEntryToplevel:: $oneentry" return $varname } proc OneEntryOK {varlist foclist} { global err done check_var $varlist $foclist if $err {return} set done 1 } # proc makes Scrolled Entries on a Canvas proc ScrollEntries { parent nn label labellist arraylist arraytypelist \ width globvar buttonlist cheight } { global varlist foclist puts stdout "GLOBVAR NAME:: $globvar" # nn .... number of Entries # label ........ top label # labellist .... list of labels # arraylist .... list of array elements # expamle: set arraylist "LB, NA," # name of variables is completed as: # $globvar(${varitem},$i) # arraytypelist . type of variable in array # width .... width of entries # globvar name of global variable # buttonlist .... 0 -> button do not exists # 1 -> " " -> 1 button exist # 2 -> " " " " -> 2 buttons exists # n -> "list #1" "list #2" ... "list #n" # cheight .... height of canvas (Entries are units of height) # frame where canvas&scrollbar will be!! set ft [frame $parent.ft -relief sunken -bd 2] pack $ft -side top -expand true -fill y set c [canvas $ft.canv -yscrollcommand [list $ft.yscroll set]] set scb [scrollbar $ft.yscroll -orient vertical -command [list $c yview]] pack $scb -side right -fill y pack $c -side left -fill both -expand true # create FRAME to hold every LABEL&ENTRY set f [frame $c.f -bd 0] $c create window 0 0 -anchor nw -window $f -tags frame set varlist "" set foclist "" for {set i 1} {$i <= $nn} {incr i 1} { frame $f.fr$i -relief groove -bd 2 pack $f.fr$i -padx 5 -pady 5 -expand 1 label $f.fr${i}.label$i -text "$label $i" pack $f.fr${i}.label$i -anchor w -padx 7 -pady 7 frame $f.fr${i}.frm$i pack $f.fr${i}.frm$i -side top -anchor center # coplite the varlist set tmplist "" set n 0 foreach item $arraylist { set var ${globvar}(${item},${i}) append tmplist " $var " puts stdout "TMPLIST:: $var" # make a varlist for PROC CHECK_VAR lappend varlist "$var [lindex $arraytypelist $n]" incr n } Entries $f.fr${i}.frm$i $labellist $tmplist $width set nb [lindex $buttonlist 0] for {set j 1} {$j <= $nb} {incr j} { set com [lindex $buttonlist $j] puts stdout "COM::: [list $com $i]" set b [button $f.fr${i}.frm$i.b$j -text [lindex $com 0] \ -command [concat [lrange $com 1 end] $i]] pack $b -side right -before $f.fr${i}.frm$i.frame -padx 10 -pady 5 } # make a foclist for PROC CHECK_VAR lappend foclist \ $f.fr${i}.frm$i.frame.entry1 $f.fr${i}.frm$i.frame.entry2 } puts stdout "FOCLIST: $foclist\n\n" puts stdout "VARLIST: $varlist" set child [lindex [pack slaves $f] 0] # set the focus to first entry that upper FOR-LOOP create focus $f.fr1.frm1.frame.entry1 tkwait visibility $child set width [winfo width $f] set height [winfo height $f] if { $nn < $cheight } { $c config -width $width -height $height } else { $c config -width $width -height [expr $height / $nn * $cheight] \ -scrollregion "0 0 $width $height" } return [list $varlist $foclist] } #----------------------------- # SCROLLEDLISTBOX2 #----------------------------- proc ScrolledListbox2 { parent args } { frame $parent pack $parent -side left -fill both -expand true -padx 5 -pady 10 # Create listbox attached to scrollbars, pass thru $args eval {listbox $parent.list \ -yscrollcommand [list $parent.sy set] \ -xscrollcommand [list $parent.sx set]} $args scrollbar $parent.sy -orient vertical \ -command [list $parent.list yview] # Create extra frame to hold pad and horizontal scrollbar frame $parent.bottom scrollbar $parent.sx -orient horizontal \ -command [list $parent.list xview] # Create padding based on the scrollbar width and border set pad [expr [$parent.sy cget -width] + 2* \ ([$parent.sy cget -bd] + \ [$parent.sy cget -highlightthickness])] frame $parent.pad -width $pad -height $pad # Arrange everything in the parent frame pack $parent.bottom -side bottom -fill x pack $parent.pad -in $parent.bottom -side right pack $parent.sx -in $parent.bottom -side bottom -fill x pack $parent.sy -side right -fill y pack $parent.list -side left -fill both -expand true return $parent.list } #------------------------------------ # END OF SCROLLEDLISTBOX2 #------------------------------------ proc xcMenuEntry {parent l_text e_width e_var m_list {args {}}} { global system # parent ... parent widget # l_text ... text for label # e_width ... width of entry # e_var ... entry's textvariable # m_list ... list of menu's entries # args ... additional argumets that must be processed; # -entryXXXXX means XXXXX atribute for entry set l [label $parent.l -text $l_text] set e [entry $parent.e -textvariable $e_var -width $e_width] set mb [menubutton $parent.mb \ -bitmap "@$system(BMPDIR)/xcMenuEntry_down.xbm" \ -menu $parent.mb.menu -relief raised] set menu [menu $mb.menu -tearoff 0 -relief raised] foreach word $m_list { $menu add command -label $word -command [list set $e_var "$word"] } # take care of options in $args if {$args == {}} { return 1 } set i 0 foreach option $args { incr i if { $i%2 } { set tag $option } else { switch -- $tag { "-labelrelief" {$l configure -relief $option} "-labelwidth" {$l configure -width $option} "-labelanchor" {$l configure -anchor $option} "-labelfont" {$l configure -font $option} "-entryrelief" {$e configure -relief $option} "-entryfont" {$e configure -font $option} "-entrystate" {$e configure -state $option} "-menubuttonrelief" {$mb configure -relief $option} "-menurelief" {$menu configure -relief $option} default { tk_dialog .mb_error Error \ "ERROR: Bad xcMenuEntry configure option $tag" \ error 0 OK } } } } if { $i%2 } { tk_dialog .mb_error1 Error "ERROR: You called xcMenuEntry with an odd number of args !" \ error 0 OK return 0 } pack $l -side left -padx 5 -pady 5 pack $e -side left -fill x -pady 5 pack $mb -side left -ipadx 2 -ipady 2 -pady 5 -padx 5 return $e } proc FillEntries { w lablist entrylist l_width e_width \ {f_side top} {side left} {args {}}} { global xcFonts fillEntries # w - parent widget # lablist - list of labels # entrylist - list of entries variables # l_width - width of label # e_width - width of entry # f_side - how to pack frame that holds frame & entry # side - how to pack label & entry # args - configuring options set e_rel sunken set e_sta normal set e_bg [GetWidgetConfig entry -background] set e_font $xcFonts(normal_entry) set l_font $xcFonts(normal) set i 0 xcDebug "FillEntries Args:: $args" foreach option $args { incr i # odd cycles are tags, even options if { $i%2 } { set tag $option } else { xcDebug "FillEntries Options:: $tag $option" switch -- $tag { "-e_relief" {set e_rel $option} "-e_state" {set e_sta $option} "-e_bg" {set e_bg $option} "-e_font" {set e_font $option} "-l_font" {set l_font $option} default { tk_dialog .mb_error Error \ "ERROR: Bad FillEntries configure option $tag" \ error 0 OK return 0 } } } } if { $i%2 } { tk_dialog .mb_error1 Error \ "ERROR: You called FillEntries with an odd number of args !" \ error 0 OK return 0 } set i 1 for {} {1} {incr i} { if ![winfo exists $w.f$i] { set f $w.f$i break } } frame $f pack $f -expand 1 -fill both -side $f_side ############################## set n 1 if { $e_width == {} } { set e_option [list -relief $e_rel \ -state $e_sta \ -bg $e_bg \ -font $e_font] } else { set e_option [list -relief $e_rel \ -width $e_width \ -state $e_sta \ -bg $e_bg \ -font $e_font] } set fillEntries "" foreach ebl $entrylist { set m [expr $n - 1] set fn [frame $f.$n] label $fn.lab$n -text [lindex $lablist $m] \ -width $l_width -anchor w -font $l_font lappend fillEntries $fn.entry$n eval {entry $fn.entry$n -textvariable $ebl} $e_option pack $fn -side $f_side -expand 1 -fill both -padx 5 -pady 2 eval {pack $fn.lab$n -side $side} eval {pack $fn.entry$n -side $side -fill x -expand 1} incr n } return $f.1.entry1 } proc DisplayUpdateWidget {title text} { set t [xcToplevel [WidgetName] $title $title . 200 100 1] set m [message $t.m \ -text $text \ -aspect 500 \ -justify center\ -relief raised -bd 2 \ -background "#f88" ] pack $m -expand 1 -ipadx 20 -ipady 20 -padx 0 -pady 0 update #update idletask return $t } proc DefaultButton {name {args {}}} { set frame [frame $name -relief sunken -bd 2] xcDebug "DefaultButton Args:: $args" # args - configuring options set i 0 set text "" set command "" foreach option $args { incr i # odd cycles are tags, even options if { $i%2 } { set tag $option } else { xcDebug "DefaultButton Options:: $tag $option" switch -- $tag { "-text" {set text $option} "-command" {set command $option} "-done_var" {set done_var $option} default { tk_dialog [WidgetName] Error \ "ERROR: Bad DefaultButton configure option $tag" \ error 0 OK return 0 } } } } if { $i%2 } { tk_dialog .mb_error1 Error \ "ERROR: You called DefaultButton with an odd number of args !" \ error 0 OK return 0 } if { $command != "" } { button $name.b -text $text -command [list eval $command] } else { button $name.b -text $text -command [list set $done_var 1] } pack $name.b -side left -padx 1m -pady 1m focus $name.b return $frame } ############################################################################### # imitate pretty well the tk checkbutton, i.e takes the same option + # option -image is possible, but does or have -indicatoron option # proc xcCheckButton {w args} { global checkButton # # get "-command" option out of $args # set id [button $w] set checkButton($id,pressed) 0 set checkButton($id,is_variable) 0 if {$args == {}} { set args "-command xcCheckButtonDummy" } # # set default on/off value # set checkButton($id,offvalue) 0 set checkButton($id,onvalue) 1 set com 0 set i 0 set arg $args foreach option $arg { incr i if { $i%2 } { set tag $option } else { set j [lsearch $args $tag] switch -- $tag { "-command" { set com 1 set args [lreplace $args $j [expr $j + 1]] set command $option } "-offvalue" { set args [lreplace $args $j [expr $j + 1]] set checkButton($id,offvalue) $option } "-onvalue" { set args [lreplace $args $j [expr $j + 1]] set checkButton($id,onvalue) $option } "-selectcolor" { set args [lreplace $args $j [expr $j + 1]] set checkButton($id,selectcolor) $option } "-variable" { set args [lreplace $args $j [expr $j + 1]] set checkButton($id,is_variable) 1 set checkButton($id,variable) $option xcDebug "var:: $checkButton($id,variable)" } } } } if !$com { set command xcCheckButtonDummy } puts stdout "args:: $args\n" flush stdout # # now configure the xcCheckButton # eval {$id configure} $args # this should be also tried with binding $id configure -command [concat xcCheckButtonCom $id $command] set checkButton($id,normalcolor) [$id cget -bg] if ![info exists checkButton($id,selectcolor)] { set checkButton($id,selectcolor) $checkButton($id,normalcolor) } # # set the correct state # if $checkButton($id,is_variable) { upvar #0 $checkButton($id,variable) varn if { $varn == $checkButton($id,onvalue) } { set checkButton($id,pressed) 1 $id configure -relief sunken \ -bg $checkButton($w,selectcolor) } } return $id } proc xcCheckButtonCom {w args} { global checkButton if $checkButton($w,is_variable) { upvar #0 $checkButton($w,variable) varn } puts stdout "Com:: $w $varn $args" if !$checkButton($w,pressed) { # button was pressed set checkButton($w,pressed) 1 if $checkButton($w,is_variable) { set varn $checkButton($w,onvalue) } $w configure \ -relief sunken \ -bg $checkButton($w,selectcolor) } else { # button was releassed set checkButton($w,pressed) 0 if $checkButton($w,is_variable) { set varn $checkButton($w,offvalue) } $w configure \ -relief raised \ -bg $checkButton($w,normalcolor) } eval $args } proc xcCheckButtonDummy {} { return 0 } proc xcCheckButtonRow {parent n bitmaplist varlist comlist \ {fside left} {cbside left}} { # # n ... number of xcCheckButtons # fside ... side of frame to pack # cbside ... side of checkbuttons to pack set f [frame $parent.f] pack $f -side $fside -expand 1 for {set i 0} {$i < $n} {incr i } { set bmp [lindex $bitmaplist $i] set var [lindex $varlist $i] set com [lindex $comlist $i] puts stdout "$i: $bmp, $var, $com" set cb($i) [xcCheckButton $f.cb$i \ -bitmap $bmp \ -highlightthickness 0 \ -selectcolor "#ffffff" \ -command $com \ -variable $var] pack $cb($i) -side $cbside } } # ------------------------------------------------------------------------ # xcModifyColor and related routines # ------------------------------------------------------------------------ proc xcModifyColorID {} { global mody_col if ![info exists mody_col(ID)] { set mody_col(ID) 1 } else { incr mody_col(ID) } return $mody_col(ID) } proc xcModifyColorGetID {} { global mody_col if ![info exists mody_col(ID)] { return 0 } else { return $mody_col(ID) } } proc xcModifyColor {parent labeltext init_color \ frame_relief frame_side scale_side width height \ scale_length scale_width slider_length {cID {}}} { global mody_col if { $cID == {} } { set cID [xcModifyColorID] } set f [frame [WidgetName $parent] -relief $frame_relief -bd 2] set l [label $f.l -text $labeltext -anchor w] pack $f -side $frame_side -padx 3 -pady 3 -ipadx 0 -ipady 0 \ -fill both -expand 1 if ![info exists mody_col($cID,red)] { set color [rgb_h2f $init_color] xcDebug "color:: $color" set mody_col($cID,red) [lindex $color 0] set mody_col($cID,green) [lindex $color 1] set mody_col($cID,blue) [lindex $color 2] } set fr [frame $f.1 -relief sunken -bd 2] set mody_col($cID,col) [frame $fr.col -bd 0 -width $width -height $height] _xcModifyColorSet $cID set f2 [frame $f.f2 -relief flat] scale $f2.red -from 0 -to 1 \ -length $scale_length \ -variable mody_col($cID,red) \ -orient horizontal -label "Red:" \ -digits 4 -resolution 0.001 -showvalue true \ -width $scale_width \ -sliderlength $slider_length \ -highlightthickness 0 \ -command [list _xcModifyColorSet $cID] scale $f2.green -from 0 -to 1 \ -length $scale_length \ -variable mody_col($cID,green) \ -orient horizontal -label "Green:" \ -digits 4 -resolution 0.001 -showvalue true \ -width $scale_width \ -sliderlength $slider_length \ -highlightthickness 0 \ -command [list _xcModifyColorSet $cID] scale $f2.blue -from 0 -to 1 \ -length $scale_length \ -variable mody_col($cID,blue) \ -orient horizontal -label "Blue:" \ -digits 4 -resolution 0.001 -showvalue true \ -width $scale_width \ -sliderlength $slider_length \ -highlightthickness 0 \ -command [list _xcModifyColorSet $cID] pack $l -side top -fill x -expand 1 -padx 10 pack $fr $f2 -side $scale_side \ -fill both -expand 1 -padx 10 -pady 10 -ipadx 0 -ipady 0 pack $mody_col($cID,col) -side top -fill both -expand 1 -padx 0 -pady 0 pack $f2.red $f2.green $f2.blue -side top -fill both -expand 1 \ -ipadx 0 -ipady 1 -pady 0 return $f } proc _xcModifyColorSet {cID {dummy {}}} { global mody_col set mody_col($cID,hxred) [d2h [expr round($mody_col($cID,red) * 255)]] set mody_col($cID,hxgreen) [d2h [expr round($mody_col($cID,green) * 255)]] set mody_col($cID,hxblue) [d2h [expr round($mody_col($cID,blue) * 255)]] $mody_col($cID,col) configure \ -bg "#$mody_col($cID,hxred)$mody_col($cID,hxgreen)$mody_col($cID,hxblue)" } proc xcModifyColorSet {cID format type color} { global mody_col # NOTE: type is RGB or RGBA and is dummy for D and F (for # compatibility with xcModifyColorGet) switch -glob -- $format { D - d* { # D or decimal set fc [rgb_d2f $color] set mody_col($cID,red) [lindex $fc 0] set mody_col($cID,green) [lindex $fc 1] set mody_col($cID,blue) [lindex $fc 2] _xcModifyColorSet $cID } F - f* { # F or float set mody_col($cID,red) [lindex $color 0] set mody_col($cID,green) [lindex $color 1] set mody_col($cID,blue) [lindex $color 2] _xcModifyColorSet $cID } H - h* { # H or hexadecimal if { [string toupper $type] == "RGBA" } { set len [expr {3 * ([string length $color] / 4)}] set color [string range $color $len] } set fc [rgb_h2f $color] set mody_col($cID,red) [lindex $fc 0] set mody_col($cID,green) [lindex $fc 1] set mody_col($cID,blue) [lindex $fc 2] _xcModifyColorSet $cID } deafult { ErrorDialog "wrong format $format, must be one of D, F, or H" return } } } proc xcModifyColorGet {cID format type} { global mody_col switch -glob -- $format { D - d* { # D or decimal set color [rgb_f2d [list $mody_col($cID,red) $mody_col($cID,green) $mody_col($cID,blue)]] if { [string toupper $type] == "RGBA" } { append color " 255" } } F - f* { # F or float set color [list $mody_col($cID,red) $mody_col($cID,green) $mody_col($cID,blue)] if { [string toupper $type] == "RGBA" } { append color " 1.0" } } H - h* { set color [list $mody_col($cID,hxred) $mody_col($cID,hxgreen) $mody_col($cID,hxblue)] if { [string toupper $type] == "RGBA" } { append color "ff" } } default { ErrorDialog "wrong format $format, must be one of D, F, or H" return "" } } return $color } # ------------------------------------------------------------------------ # END:: xcModifyColor # ------------------------------------------------------------------------ # xcUpdate is toplevel window with Cancel, Update & Close button proc xcUpdateWindow {{args {}}} { # options: # -name # -title # -cancelcom # -closecom # -updatecom # -frameside # -buttonside # -canceltext # -closetext # -updatetext # defaults set title "Color Scheme" set updatecom xcDummyProc set closecom xcDummyProc set cancelcom xcDummyProc set frameside top set buttonside left set updatetext Update set closetext Close set canceltext Cancel set name [WidgetName] # parse args: set i 0 foreach option $args { incr i if { $i%2 } { set tag $option } else { switch -- $tag { "-name" {set name $option} "-title" {set title $option} "-updatecom" {set updatecom $option} "-closecom" {set closecom $option} "-cancelcom" {set cancelcom $option} "-frameside" {set frameside $option} "-buttonside" {set buttonside $option} "-updatetext" {set updatetext $option} "-closetext" {set closetext $option} "-canceltext" {set canceltext $option} default { tk_dialog .mb_error Error \ "ERROR: Bad xcUpdateWindow configure option $tag" \ error 0 OK } } } } if { $i%2 } { tk_dialog .mb_error1 Error "ERROR: You called xcUpdateWindow with an odd number of args !" \ error 0 OK return 0 } set t [xcToplevel $name $title [lrange $title 0 2] . 0 0 1] set f1 [frame $t.f1 -class RaisedFrame] set f2 [frame $t.f2 -class RaisedFrame] pack $f1 $f2 -side $frameside -fill both -expand 1 set can [button $f2.can -text $canceltext -command [list eval $cancelcom]] set upd [button $f2.upd -text $updatetext -command [list eval $updatecom]] set clo [button $f2.clo -text $closetext -command [list eval $closecom]] pack $can $upd $clo -side $buttonside \ -padx 10 -pady 10 -expand 1 return $f1 } proc xcMenuButton {w {args {}}} { # options: # -labeltext # -labelwidth # -textvariable # -menu {menutext1 menucom1 ...} # defaults: set labeltext {} set labelwidth {} set textv xcMisc(dummy) set menu {{} xcDummyProc} set side left # parse args: set i 0 set wid 0 foreach option $args { incr i if { $i%2 } { set tag $option } else { switch -- $tag { "-labeltext" {set labeltext $option} "-labelwidth" {set labelwidth $option} "-textvariable" {set textv $option} "-side" {set side $option} "-menu" { set nm 0 set wid 0 foreach {t c} $option { set wi [string length $t] if { $wid < $wi } { set wid $wi } set text($nm) $t set com($nm) $c incr nm } incr wid 2 } default { tk_dialog .mb_error Error \ "ERROR: Bad xcMenuButton configure option $tag" \ error 0 OK } } } } if { $i%2 } { tk_dialog .mb_error1 Error "ERROR: You called xcMenuButton with an odd number of args !" \ error 0 OK return 0 } set f [frame [WidgetName $w]] label $f.l -text $labeltext -relief flat -bd 0 -anchor w if { $labelwidth != {} } { $f.l config -width $labelwidth } upvar $textv value if { [info exists value] } { set len [string length $value] if { $len > $wid } { set wid $len } } menubutton $f.mb \ -width $wid \ -textvariable $textv \ -menu $f.mb.menu \ -indicatoron 1 \ -relief raised set m [menu $f.mb.menu -tearoff 0] for {set i 0} {$i < $nm} {incr i} { $m add command -label $text($i) -command [list eval $com($i)] } pack $f.l $f.mb -side $side -padx 1 -fill x -anchor w return $f } # # xcTextImageButton -- # Create button with text+image but does not pack it # # Arguments: # w name of TextImageButton (it must be packed by the user) # text text of textimagebutton # image image of textimagebutton # side how text and image is packed # args arguments to button command # # Results: # Returns the name of the textimagebutton proc xcTextImageButton {w image side args} { button $w -highlightthickness 0 $w config -state disabled set b [eval {button $w.b} $args {-bd 0 -highlightthickness 0}] set l [label $w.l -image $image -bg "#00f" \ -anchor c -bd 1 -highlightthickness 0] #foreach a [list $lt $li] b [list $li $lt] { # bind $a +[list $b config -state active] # bind $a +[list $b config -state normal] #} pack $b $l -side $side -fill both return $w } # # special xcTextImageButton for "Hide" proc xcHideButton {w image side args} { global xcFonts set font [SetFont button -size $xcFonts(small_size) -weight bold] eval {xcTextImageButton $w $image $side} $args {-bg "#00f" -fg "#fff" \ -activebackground "#88f" -activeforeground "#fff" -font $font} } # # display content of a file in a separate toplevel window # with scroll-text and Close widgets # proc xcDisplayFileText {file {title {Displayed Text}} \ {w .} {x 0} {y 0} {transient 0}} { global system prop dispC95out unmapWin set f_content [ReadFile $file] return [xcDisplayVarText $f_content $title $w $x $y $transient] } proc xcDisplayVarText {varText {title {Displayed Text}} \ {w .} {x 0} {y 0} {transient 0}} { set t [xcToplevel [WidgetName] $title $title $w $x $y $transient] DispText $t.f1 $varText 80 20 set f2 [frame $t.f2 -relief flat] pack $t.f1 -side top -expand 1 -fill both -padx 3 -pady 3 pack $f2 -side top -fill x -padx 3 -pady 3 button $f2.close -text "Close" -command [list destroy $t] pack $f2.close -side top -expand 1 -padx 3 -pady 3 return $t } proc XCRYSDEN_Logo {file} { global xcMisc system # eval destroy [winfo children .] bind . {} bind . {} #/ wm resizable . 0 0 label .xcrysden_logo -image kpath -relief sunken -bd 2 pack .xcrysden_logo -padx 2m -pady 2m -fill both -expand 1 wm geometry . +30+30 wm deiconify . wm iconbitmap . @$system(BMPDIR)/xcrysden.xbm wm title . "*** XCrySDen *** " update } xcrysden-1.6.2/Tcl/saveState.tcl0000644000175000017500000006111513531514760015251 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/saveState.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # saveState ?state_and_structure? --> save structure and state # saveState state --> sane only state proc saveState {{what state_and_structure}} { global saveState # get the filename to write the script into saveStruct:_queryFilename $what # open the channel for writing the script into set wID [open $saveState(file) w] set saveState(wID) $wID # write the top info-head saveStruct:_writeInfoHead $wID $what # write the Structure if { $what == "state_and_structure" } { saveStruct:_writeStructure $wID } # write the State saveStruct:_writeState $wID # close the channel flush $wID close $wID } proc saveStruct:_writeState {wID} { puts $wID { # ======================================================================== # # # # STATE-PART OF THE FILE # # # # ======================================================================== # } # -------------------------------------------------- # definition of xcMisc & printSetup # -------------------------------------------------- global xcMisc saveState:header "definition of xcMisc array" puts $wID "array set xcMisc [list [array get xcMisc]]" global printSetup if { [array exists printSetup] } { saveState:header "definition of printSetup" puts $wID "array set printSetup [list [array get printSetup]]" } # -------------------------------------------------- # display watch-cursor # -------------------------------------------------- saveState:header "display \"waiting\" toplevel and watch-cursor" puts $wID "set wait_window \[DisplayUpdateWidget \"Reconstructing\" \"Reconstructing the structure and display parameters. Please wait\"\]" puts $wID "SetWatchCursor" puts $wID "set xcCursor(dont_update) 1" # -------------------------------------------------- # remember the size of the main window # -------------------------------------------------- saveState:header "size of the main window" set w [winfo width .] set h [winfo height .] puts $wID "wm geometry . ${w}x${h}" # -------------------------------------------------- # create all fonts # -------------------------------------------------- saveState:beginHeader "create fonts" foreach font [font names] { puts $wID "saveState:fontCreate $font [font actual $font]" } saveState:endHeader # -------------------------------------------------- # display-mode # -------------------------------------------------- global light mode2D mode3D dispmode style3D viewer translationStep rotstep saveState:beginHeader "take care of display-mode" puts $wID "set translationStep $translationStep" puts $wID "set rotstep $rotstep" puts $wID "set light $light" puts $wID "Lighting $light" puts $wID "array set mode2D [list [array get mode2D]]" puts $wID "array set mode3D [list [array get mode3D]]" puts $wID "array set dispmode [list [array get dispmode]]" puts $wID "saveState:displayMode" puts $wID "set style3D(draw) $style3D(draw); Style3D draw $style3D(draw)" puts $wID "set style3D(shade) $style3D(shade); Style3D shade $style3D(shade)" puts $wID "set viewer(rot_zoom_button_mode) $viewer(rot_zoom_button_mode); Viewer:rotZoomButtonMode" saveState:endHeader # ------------------------------------------------------------------------ # Take care of MODIFY menu parameters # ------------------------------------------------------------------------ # N.B: loading of script is very slow if (nxdir,nydir,nzdir) are # specified that soon, consider shifting just befor the xc_rotationmatrix # t.k. TESTING: let's how it works if this is shifted down !!! # # This item must be the first one: # # Number of Units Drawn (must be after DISPLAY-menu checkbuttons) # global nxdir nydir nzdir # saveState:header "Number of Units Drawn" # puts $wID "set nxdir $nxdir" # puts $wID "set nydir $nydir" # puts $wID "set nzdir $nzdir" saveState:beginHeader "Various colors" # Atomic-Color global mody saveState:_foreachAtomicType $mody(L_ATCOL_ONE) $mody(D_ATCOL_ONE) # Unibond-Color puts $wID "xc_newvalue .mesa $mody(L_UNIBONDCOLOR) [xc_getvalue $mody(D_UNIBONDCOLOR)] 1.0" # Crystal Cell's Color global cellcol puts $wID "xc_newvalue .mesa $mody(L_FRAMECOL) [xc_getvalue $mody(D_FRAMECOL)]" saveState:endHeader # balls/spacefill based on covalent or van der Waals ? global radio #if { $radio(ball) == "Balls based on covalent radii" } { # puts $wID "xc_newvalue .mesa $mody(L_BALL_COV)" #} elseif { $radio(ball) == "Balls based on Van der Waals radii" } { # puts $wID "xc_newvalue .mesa $mody(L_BALL_VDW)" #} if { $radio(space) == "SpaceFill based on covalent radii" } { puts $wID "xc_newvalue .mesa $mody(L_SPACE_COV)" } elseif { $radio(space) == "SpaceFill based on Van der Waals radii" } { puts $wID "xc_newvalue .mesa $mody(L_SPACE_VDW)" } # chemical connectivity factor, ball-factor, ball/stick ratio, point-radius, ... saveState:header "Various parameters" # on Thu 17 Aug, this has been skipped from below loop L_ATRAD_SCALE D_ATRAD_SCALE foreach {newValueID getValueID} { L_COV_SCALE D_COVF L_BALLF D_BALLF L_RODF D_RODF L_WFLINEWIDTH D_WFLINEWIDTH L_PLLINEWIDTH D_PLLINEWIDTH L_FRAMELINEWIDTH D_FRAMELINEWIDTH L_OUTLINEWIDTH D_OUTLINEWIDTH L_WF3DLINEWIDTH D_WF3DLINEWIDTH L_PLRADIUS D_PLRADIUS L_FRAMERODF D_FRAMERODF L_TESSELLATION D_TESSELLATION L_PERSPECTIVEBACK D_PERSPECTIVEBACK L_PERSPECTIVEFOVY D_PERSPECTIVEFOVY L_PERSPECTIVEFRONT D_PERSPECTIVEFRONT L_BACKGROUND D_BACKGROUND } { puts $wID "xc_newvalue .mesa $mody($newValueID) [xc_getvalue $mody($getValueID)]" } # Lights global glLight if { [info exists glLight(nlights)] } { saveState:beginHeader "OpenGL Lights" puts $wID "array set glLight [list [array get glLight]]" for {set i 0} {$i < $glLight(nlights)} {incr i} { puts $wID "glLight:update .mesa $i" } saveState:endHeader } # Materials/Fog/Antialias global glModParam if { [array exists glModParam] } { saveState:beginHeader "Materials/Fog/Antialias" puts $wID "array set glModParam [list [array get glModParam]]" puts $wID "glModParam:Materials:Update .mesa" puts $wID "glModParam:DepthCuing:Update .mesa" puts $wID "glModParam:AntiAlias:Update .mesa" saveState:endHeader } # Forces ... global forceVec if { [array exists forceVec] } { saveState:beginHeader "Forces" puts $wID "array set forceVec [list [array get forceVec]]" puts $wID "xc_forces .mesa scalefunction $forceVec(scalefunction)" puts $wID "xc_forces .mesa threshold $forceVec(threshold)" puts $wID "xc_forces .mesa lengthfactor $forceVec(lengthfactor)" puts $wID "forceUpdate .mesa" saveState:endHeader } # H-bonds global Hbonds if { [array exists Hbonds] } { if { [info exists Hbonds(colorID)] } { set _hbonds_color_id $Hbonds(colorID) unset Hbonds(colorID) } saveState:beginHeader "H-bonds" puts $wID "array set Hbonds [list [array get Hbonds]]" puts $wID "HbondsSetting:update .mesa" saveState:endHeader if { [info exists _hbonds_color_id] } { set Hbonds(colorID) $_hbonds_color_id } } # Molecular Surfaces ... global pDen if { [info exists pDen(nsurface)] } { saveState:beginHeader "Molecular-Surface" puts $wID "array set pDen [list [array get pDen]]" for {set i 0} {$i < $pDen(nsurface)} {incr i} { set pDen($i,type_old) unknown puts $wID "set pDen($i,ident) \[xc_molsurfreg .mesa\]" puts $wID "PseudoDen:_xc_molsurf $i" } saveState:endHeader } # ------------------------------------------------------------------------ # DISPLAY-menu checkbuttons # ------------------------------------------------------------------------ global check saveState:header "Various displays (i.e. checkbuttons of DISPLAY menu)" puts $wID "array set check [list [array get check]]" foreach cmd { CrdSist AtomLabels CrysFrames Unibond {forceVectors .mesa} {Hbonds .mesa} WignerSeitz Perspective } { puts $wID $cmd } # ------------------------------------------------------------------------ # DISPLAY-menu radiobuttons # ------------------------------------------------------------------------ global periodic saveState:header "Various displays (i.e. radiobuttons DISPLAY menu)" puts $wID "array set radio [list [array get radio]]" if { $periodic(dim) > 0 } { foreach cmd { {CellMode 1} DispFramesAs } { puts $wID $cmd } } global radio if { $radio(ball) == "Balls based on covalent radii" } { puts $wID "xc_newvalue .mesa $mody(L_BALL_COV)" } elseif { $radio(ball) == "Balls based on Van der Waals radii" } { puts $wID "xc_newvalue .mesa $mody(L_BALL_VDW)" } # ------------------------------------------------------------------------ # This is from MODIFY menu, but should presumably be here ?!?!? # # Wigner-Seitz Cell (BEWARE: for Wigner-Setz we should know the # cell-mode [prim,conv]) # ------------------------------------------------------------------------ global ws wsp wsc ws_lfpos ws_npos if { $periodic(dim) > 2 } { saveState:beginHeader "Wigner-Seitz Cell" puts $wID "set check(wigner) 1" puts $wID "WignerSeitz" foreach array {ws wsp wsc ws_lfpos ws_npos} { if { [array exists $array] } { puts $wID "array set $array [list [array get $array]]" } } puts $wID "SetWignerSeitzInit; update; SetWignerSeitz_OK test; SetWignerSeitz_Cancel .wgnset" saveState:endHeader } # t.k: testing # Atomic Radii saveState:beginHeader "Atomic radii" saveState:_foreachAtomicType $mody(L_ATRAD_ONE) $mody(D_ATRAD_ONE) saveState:_foreachAtomicType $mody(L_RCOV_ONE) $mody(D_RCOV_ONE) saveState:endHeader # t.k./ # ------------------------------------------------------------------------ # TOOLS-menu # ------------------------------------------------------------------------ xcDebug -stderr "saving colSh ..." # color scheme global colSh if { [array exists colSh] } { saveState:header "load appropriate color-scheme" puts $wID "array set colSh [list [array get colSh]]" puts $wID "ColorSchemeUpdate .mesa" } # -------------------------------------------------- # take care of 2D|3D datagrid # -------------------------------------------------- xcDebug -stderr "saving datagrid ..." global sInfo DataGrid DG isoControl prop isosurf if { ! [info exists prop(datagridDim)] } { set prop(datagridDim) 0 } if { $sInfo(ldatagrid2D) || $sInfo(ldatagrid3D) \ || $prop(datagridDim) == 2 || $prop(datagridDim) == 3 } { if { [info exists DataGrid(launch_command)] } { # the scalar field is rendered saveState:beginHeader "scalar field (controur or isosurface) settings" puts $wID "array set DG [list [array get DG]]" puts $wID "DataGridOK" foreach array {isoControl prop isosurf} { puts $wID "array set $array [list [array get $array]]" } if { $DataGrid(dim) == "2D" } { puts $wID "UpdatePropertyPlane" } else { puts $wID "UpdateIsosurf" } if { [info exists DataGrid(first_time)] } { puts $wID "array set DataGrid [list [array get DataGrid]]" } saveState:endHeader } } # Isosurfaces ... global openGL if { [array exists openGL] } { saveState:beginHeader "Isosurface colors/transparency ..." # colors foreach what { {isosurf pos front} {isosurf pos back} {isosurf neg front} {isosurf neg back} {isosurf one front} {isosurf one back} } { set com [concat xc_getGLparam material -what $what] set ambient [eval $com -get ambient] set diffuse [eval $com -get diffuse] set specular [eval $com -get specular] set emission [eval $com -get emission] set shininess [eval $com -get shininess] puts $wID "xc_setGLparam material -what $what \\" puts $wID " -shininess [list $shininess] \\" puts $wID " -specular [list $specular] \\" puts $wID " -ambient [list $ambient] \\" puts $wID " -diffuse [list $diffuse] \\" puts $wID " -emission [list $emission]" } # blendfunc set bldf [xc_getGLparam blendfunc -what isosurf] set src_blend [lindex $bldf 0] set dst_blend [lindex $bldf 1] puts $wID "xc_setGLparam blendfunc -what isosurf -sfunc $src_blend -dfunc $dst_blend" saveState:endHeader } # t.k. EXPERIMENTAL: testing for faster speed !!! global nxdir nydir nzdir saveState:header "Number of Units Drawn" puts $wID "set nxdir $nxdir" puts $wID "set nydir $nydir" puts $wID "set nzdir $nzdir" # -------------------------------------------------- # PseudoDensity & Anti-Aliasing & Depth Cuing (they are the most # time consuming, so we do it at end # -------------------------------------------------- xcDebug -stderr "saving anti-alias ..." saveState:header "Anti-Aliasing & Depth-Cuing & PseudoDensity (these are time consuming)" puts $wID "DepthCuing; PseudoDensity; AntiAlias" # update the display if { $periodic(dim) > 0 } { saveState:header "update the display" puts $wID "CellMode 1" } #------------------------------------------------------------------------ # Atomic-Labels/Fonts #------------------------------------------------------------------------ global atomLabel saveState:beginHeader "Atomic-Labels/Fonts" puts $wID "array set atomLabel [list [array get atomLabel]]" puts $wID "set t \[ModAtomLabels\]" puts $wID "xc_setfont .mesa \ [list $atomLabel(globalFont)] \ [list $atomLabel(globalFont.brightColor)] \ [list $atomLabel(globalFont.darkColor)]" foreach name [array names atomLabel *.atomFont.label] { #regsub ?switches? exp string subSpec varName regsub -- {\.atomFont\.label$} $name {} id puts $wID "xc_setatomlabel .mesa $id \ [list $atomLabel($id.atomFont.label)] \ [list $atomLabel($id.atomFont.font)] \ [list $atomLabel($id.atomFont.brightColor)] \ [list $atomLabel($id.atomFont.darkColor)]" } puts $wID "ModAtomLabels:advancedCheckButton default" puts $wID "ModAtomLabels:advancedCheckButton custom" puts $wID "ModAtomLabels:advancedCloseUpdate dummy update" puts $wID "CancelProc \$t" saveState:endHeader # -------------------------------------------------- # rotation matrix and zooming factor, and translation displacements # -------------------------------------------------- xcDebug -stderr "saving rotations/translations ..." saveState:header "rotation matrix and zooming factor, and translation displacements" puts $wID "xc_rotationmatrix set [xc_rotationmatrix get]" puts $wID "xc_translparam set [xc_translparam get]" puts $wID "" puts $wID "# this is used to force the update of display" puts $wID "cry_toglzoom .mesa 0.0" # -------------------------------------------------- # reset cursor and delete the "waiting" window # -------------------------------------------------- saveState:header "reset cursor" puts $wID "set xcCursor(dont_update) 0" puts $wID "ResetCursor" puts $wID "destroy \$wait_window" } proc saveStruct:_queryFilename {what} { global system saveState if { ![xcIsActive render] } { return -code return } set filetypes { {{XCrySDen Files} {.xcrysden} } {{Gzipped XCrySDen Files} {.xcrysden.gz} } {{All Files} * } } if { $what == "state" } { set title "Save Current State" } else { set title "Save Current State and Structure" } set saveState(file) [tk_getSaveFile -initialdir $system(PWD) \ -title $title \ -defaultextension .xcrysden \ -filetypes $filetypes] # maybe Cancel button was pressed if { $saveState(file) == "" } { return -code return } # open the channel for writing the script into set saveState(wID) [open $saveState(file) w] return $saveState(wID) } proc saveStruct:_writeStructure {wID} { global system mody # -------------------------------------------------- # non-XSF to XSF transformations (i.e. Take care of PDB & XYZ files) # -------------------------------------------------- set FORMAT_NONE 0 set FORMAT_XSF 1 set FORMAT_XYZ 2 set FORMAT_PDB 3 set format [xc_getvalue $mody(D_CURRENTFILEFORMAT)] if { $format == $FORMAT_NONE } { return -code return } set xsf_tmp_file [xcTempFile xc_xsf] xc_writeXSF $xsf_tmp_file # ------------------------------ # Take care of CRYSTAL98 Properties # ------------------------------ if { [xcIsActive c95] && [xcIsActive properties] } { global prop # we are dealing with CRYSTAL98 properties. If we are # rendering the isosurface/contours, then this requires some # special treatment. if { $prop(datagridDim) == 2 || $prop(datagridDim) == 3 } { saveState:_saveDatagrid $xsf_tmp_file } } # -------------------------------------------------- # the XSF file is stored in $xsf_tmp_file, write the XSF part of # *.xcrysden script # -------------------------------------------------- puts $wID { # ======================================================================== # # # # STRUCTURE-PART OF THE FILE # # # # ======================================================================== # } saveState:beginHeader "XSF structure data" set xsfFile "\$system(SCRDIR)/xc_xsf.\$system(PID)" puts $wID "# Store the content of the XSF file in the xsfStructure variable" puts $wID "" puts $wID "set xsfStructure \{" set rID [open $xsf_tmp_file r] fcopy $rID $wID close $rID # check for scalar field global sInfo prop DataGrid if { ! [info exists prop(datagridDim)] } { set prop(datagridDim) 0 } if { ! [xcIsActive c95] } { # NOTE: for CRYSTALxx program the datagrids are handled separately if { $sInfo(ldatagrid2D) || $sInfo(ldatagrid3D) \ || $prop(datagridDim) == 2 || $prop(datagridDim) == 3 } { if { [info exists DataGrid(launch_command)] } { # the scalar field is rendered set sfile [xcTempFile xc_tmp] set ident1 "UNKNOWN" set ident2 "DataGrid_Generated_by_XCrySDen" set dg "DATAGRID${DataGrid(dim)}D" xc_iso save $sfile $ident1 puts $wID "BEGIN_BLOCK_$dg" puts $wID "$ident2" puts $wID [ReadFile -nonewline $sfile] puts $wID "\nEND_BLOCK_$dg" } } } puts $wID "\}" puts $wID "# END of defintion of xsfStructure variable" puts $wID "" puts $wID "WriteFile $xsfFile \$xsfStructure w" puts $wID "" puts $wID "::scripting::open --xsf $xsfFile" saveState:endHeader return $wID } proc saveState:_foreachAtomicType {newValueID getValueID} { global mody saveState foreach atom [AtomNames] { set nat [Aname2Nat $atom] puts $saveState(wID) \ "xc_newvalue .mesa $newValueID $nat [xc_getvalue $getValueID $nat]" } } proc saveState:header {text} { global saveState set wID $saveState(wID) puts $wID "\n\# ------------------------------------------------------------------------\n\# $text\n\# ------------------------------------------------------------------------\n" set saveState(headerText) $text } proc saveState:beginHeader {text} { global saveState set wID $saveState(wID) puts $wID "\n\# ------------------------------------------------------------------------\n\# BEGIN: $text\n\# ------------------------------------------------------------------------\n" set saveState(headerText) $text } proc saveState:endHeader {} { global saveState set wID $saveState(wID) puts $wID "\n\# ------------------------------------------------------------------------\n\# END: $saveState(headerText)\n\# ------------------------------------------------------------------------\n\n" } proc saveState:displayMode {} { global light mode2D mode3D dispmode if { $light == "On" } { if { $dispmode(mode3D) == "Preset" } { DisplayOver3D $dispmode(mode3D_name) } else { # $dispmode(mode3D) == "Logic" --> revert to preset mode Mode3D Preset } } else { Display2D $dispmode(mode2D_name) } } proc saveState:fontCreate {font args} { set fonts [font names] if { [lsearch $fonts $font] < 0 } { # font does not yet exists eval font create $font $args } } proc saveState:_saveDatagrid {xsf_tmp_file} { global xcMisc system isoControl DataGrid DG set gridFile [xcTempFile xc_xsf_datagrid] set ident UNKNOWN xc_iso save $gridFile $ident set ident DataGrid_Generated_By_XCrySDen # set DG correspondingly set DG(radio) 0 set DG(n_subblock,0) 1 set DG(cb0,0) 1 set DG(envar0,0) 1.0 set DataGrid(first_time) exists # replace this ... if { $isoControl(datagridDim) == 3 } { # 3D set dg DATAGRID3D set DataGrid(launch_command) IsoControl set DataGrid(dim) 3 set DG(type,0) 3D } else { #2D set dg DATAGRID2D set DataGrid(launch_command) IsoControl2D set DataGrid(dim) 2 set DG(type,0) 2D } # take care about the newlines set content [ReadFile -nonewline $xsf_tmp_file] set datablock 0 set out {} foreach line [split $content \n] { if {[string match BEGIN_BLOCK_* $line]} { set datablock 1 } if {!$datablock} { append out "$line\n" } if {[string match END_BLOCK_* $line]} { set datablock 0 } } append out "BEGIN_BLOCK_$dg\n" append out "$ident\n" append out [ReadFile -nonewline $gridFile] append out "\nEND_BLOCK_$dg" WriteFile $xsf_tmp_file $out w } proc saveStruct:_writeInfoHead {wID what} { global saveState env set date "Xxx Xxx XX XX:XX:XX CEST 20XX" set user "unknown" set hostname "localhost" set domain "local" catch {set date [clock format [clock seconds]]} catch {set user $env(USER)} catch {set hostname $env(HOSTNAME)} catch {set domain [exec dnsdomainname]} if { $what != "state" } { puts $wID [subst { # ------------------------------------------------------------------------ # This is the script saved via the "File-->Save Current State and # Structure" menu. This feature saves the currently displayed # structure. When it will be loaded again it will recall all the # display parameters, such as orientation, zoom, perspective, ... # # Execute this script as: xcrysden --script $saveState(file) # # File created by $user on $hostname.$domain # File creation date: $date # ------------------------------------------------------------------------ }] } else { puts $wID [subst { # ------------------------------------------------------------------------ # This is a script saved via the "File-->Save Current State" menu. It # is useful for the user written scripts as to get the desired "state" # of display, but as standalone this script is useless. # # File created by $user on $hostname.$domain # File creation date: $date # ------------------------------------------------------------------------ }] } } xcrysden-1.6.2/Tcl/stereo.tcl0000644000175000017500000000151713513644334014614 0ustar tonetoneproc check_stereo {} { global stereo_visual set togl [togl [WidgetName .] -stereo native \ -rgba true \ -redsize 1 \ -greensize 1 \ -bluesize 1 \ -double true \ -depth true \ -depthsize 1 \ -accum true \ -accumredsize 1 \ -accumgreensize 1 \ -accumbluesize 1 \ -accumalphasize 1 \ -alpha false \ -alphasize 1 \ -stencil false \ -stencilsize 1 \ -auxbuffers 0 \ -overlay false] pack $togl update set stereo [lindex [$togl configure -stereo] end] #set stereo [xc_stereo] if { $stereo != "none" } { set stereo_visual true } else { set stereo_visual false } destroy $togl } xcrysden-1.6.2/Tcl/groupSel.tcl0000644000175000017500000002245512352531115015107 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/groupSel.tcl # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# proc group_sel { w type groups } { global groupsel n_groupsel done but_press # this Procedure "select" and return a GROUP (point, line, plane, # space group) # # w - name of toplevel widget # ^ # type - name for type of group (point, line, plane, space ) # # groups - list of groups # ^^^^^^ # groupsel - selected group # ^^^^^^^^ # groupsel is global; proc group_sel wait unit $but_press is TRUE # and then exit; gropusel is returned if ![info exists groupsel ] {set groupsel {}} set but_press 0 xcToplevel $w "Select a $type group" "Selection" . 120 70 1 # make a top_frame & bottom_frame frame $w.top -relief raised -bd 1 pack $w.top -side top -fill both frame $w.bot -relief raised -bd 1 pack $w.bot -side bottom -fill both # name of widget goes in the top frame label $w.top.lab -text "Select a $type group" pack $w.top.lab -side top -expand 1 -fill both -padx 5m -pady 5m # in the top of BOTTOM frame will be an ENTRY for selected group; # bellow will be "selection listbox" label $w.top.label -text "Group:" -padx 0 #------------------------------------------------------ # take care of this ENTRY and groupsel textvariable #------------------------------------------------------ entry $w.top.entry -relief sunken -textvariable groupsel focus $w.top.entry # make LEFT & RIGHT frame in bottom frame; # in LEFT goes LISTBOX; # in RIGHT go OK & CANCEL buttons frame $w.bot.left frame $w.bot.right frame $w.bot.right.ok set ok [button $w.bot.right.ok.ok -text OK -command [list group_sel_ok $groups]] set can [button $w.bot.right.can -text Cancel \ -command [list group_sel_cancel $w]] # now we'll create LISTBOX; it's ScrolledListbox2 from the book of # Brent B. Welch ScrolledListbox2 $w.bot.left.lb -width 20 -height 20 -setgrid true # now we'll pack what we create so far pack $w.top.label -side left -pady 10 -padx 5 pack $w.top.entry -side left -fill x -expand true -pady 10 -padx 5 pack $w.bot.left -side left -fill both pack $w.bot.right -side left -fill both pack $w.bot.right.ok $can -side top -padx 10 -pady 5 pack $ok -padx 4 -pady 4 # now we'll create a bindings for ENTRY bind $w.top.entry "set done 1" # now we'll create BINDINGs for this LISTBOX bind $w.bot.left.lb.list {GroupSelectStart %W %y} bind $w.bot.left.lb.list \ [list GroupSelectEnd %W %y] # now we'll insert the GROUPS in the listbox; # GROUPS variable holds all groups eval {$w.bot.left.lb.list insert 0} $groups # wait unit $done is specefied tkwait variable but_press destroy $w return $groupsel } #----------------------------- # END OF GROUP_SEL PROC #----------------------------- #------------------------------------ # here are auxiliary procs #------------------------------------ proc GroupSelectStart { w y } { $w select anchor [$w nearest $y] } proc GroupSelectEnd { w y } { global groupsel # $w is the name of listbox widget who contains groups # $y is the vertical position of "selection" $w select anchor [$w nearest $y] # nline is index of selected line set nline [$w curselection] set groupsel [$w get $nline] # now we must get rid of seq_num: (ex. 20: GROUP) # ^^^^^^^ ^^^ # i=position/index of the first caracter og group which is 4 more than # index of : # j=lenght_of$groupsel set i [expr [string first : $groupsel] + 4] set j [string length $groupsel] # assing "pure" group to groupsel set groupsel [string range $groupsel $i $j] } proc group_sel_cancel { w } { global groupsel but_press set groupsel {} set but_press 1 } proc group_sel_ok { groups } { global groupsel n_groupsel done but_press err # $groups is a list of groups # err is used by contrl_var variable set err 0 # translate $groupsel to UPPER CASE set groupsel [string toupper $groupsel] # check if specified group is OK # $groups contanins "inpurities" (ex.{ 5: P 1 1 2 }), # but $groupsel could also contains white_space inpurity set ok 0 set n 1 # pure the groupsel # NOTE: this REGEXP is extremly complex, but it looks that it works regexp {(([A-Z0-9] )|[A-Z0-9\/\-])+[A-Z0-9]} $groupsel groupsel foreach word $groups { # pure the $word set last [ string length $word ] set word [ string range $word 5 $last ] regexp {(([A-Z0-9] )|[A-Z0-9\/\-])+[A-Z0-9]} $word word if { $groupsel == $word } { set ok 1 set n_groupsel $n } incr n } # if "ok" is still is still 0, it maybe not a standard group; # but that is just for crystals if { $ok == 0 } { set ok [IsNotStandardGroup $groupsel] set n_groupsel 999 } if { $ok == 0} { # specefied group is WRONG dialog .group_sel_warning Warning \ "Group \"$groupsel\" is false. You probably mistype the group.\ Try again or select one from the list" warning 0 OK set err 1 } else { # group is OK # we have selected; so $done will be set to 1 set done 1 #this is used for GROUP_SEL PROC set but_press 1 } } ############################################################################# # this proc is used when non-standard group is used that is not on # $space_group list; we check if it is valid and which parameters are needed # for it!!! proc IsNotStandardGroup {group} { global class inp system set par(1) 11.00111 set par(2) 22.00222 set par(3) 33.00333 set par(4) 44.00444 set par(5) 55.00555 set par(6) 66.00666 set cla {} set cl(1) A set cl(2) B set cl(3) C set cl(4) ALFA set cl(5) BETA set cl(6) GAMMA set input "EOF" append input "XCrySDen 1.0\n" append input "CRYSTAL\n" append input "1 0 0\n" append input "$group\n" append input "$par(1) $par(2) $par(3) $par(4) $par(5) $par(6)\n" append input "1\n" append input "1 0.0 0.0 0.0\n" append input "STOP\n" append input "XCrySDen 1.0\n" append input "EOF" set nlat 0 set num "" cd $system(SCRDIR) set output [RunAndGetC95Output $system(c95_integrals) {} $input] xcDebug "output: \n$output" # check if error occured set is_error 0 if { [string match *ERROR* $output] } { set is_error 1 if { ($system(c95_version) == "06" || $system(c95_version) == "09" || $system(c95_version) == "14" ) && [string match "*STOP KEYWORD - EXECUTION STOPS*" $output] } { # OK, we don't have error set is_error 0 } } if { $is_error } { return 0 } else { set output [split $output \n] foreach line $output { if [string match "*CRYSTAL FAMILY*" $line] { set inp(CRY_FAM) [lrange $line 3 end] } if [string match "*CRYSTAL CLASS*" $line] { set inp(CRY_CLASS) [lrange $line 6 end] } # LATTICE PARAMETERS if { $nlat == 2 } { for {set i 1} {$i <= 6} {incr i} { set ii [expr $i - 1] set re($i) [lindex $line $ii] for {set j 1} {$j <= 6} {incr j} { if { $re($i) == $par($j) } { append cla "$cl($i) " # delete element that was found from "par" array set par($j) "" } } } incr nlat } if { $nlat == 1 } { incr nlat } if { [string match "*ICE PAR*" $line] && $nlat == 0 } { incr nlat } } if { ! [info exists cla] } { tk_messageBox -message "Ups! This is a bug in the program. Please report it to: tone.kokalj@ijs.si with the detailed explanation what yoy were doing and if possible also Email the CRYSTAL input file you have been working on when the error occured !\n\nThe application will exit now." -type ok -icon info exit_pr immediately } foreach item $cla { if { $item == "A" || $item == "B" || $item == "C" } { append class1 "$item " } else { append class2 "$item " } } # get rid of last space-character in class1 & class2 set class1 [string trimright $class1 " "] if [info exists class2] { set class2 [string trimright $class2 " "] } set class "" lappend class $class1 if [info exists class2] { lappend class $class2 } #set class [list $class] puts stdout "GROUP: $group CLASS: $class" return 1 } } xcrysden-1.6.2/Tcl/xctr.tcl0000644000175000017500000000447011712736221014270 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/xctr.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc xctr_proc {name args body} { global xctr #set xctr(procName) $name #set xctr(argsVars) $args set _body [subst -nocommands { global env xctr set __args__ "" if { [list $args] != [list ""] } { foreach __arg__ [list $args] { set __var__ [lindex \$__arg__ 0] upvar 0 \$__var__ __value__ #puts stderr "XCTRvar> \$__var__" lappend __args__ \$__value__ } } if { [info exists env(XCRYSDEN_TRACE)] && (1 >= [info level]) } { if { \$xctr(recording) } { puts $xctr(traceID) [concat $name \$__args__] flush $xctr(traceID) puts stderr [concat XCTRexec> $name \$__args__ , level == [info level]] } } elseif { [info exists env(XCRYSDEN_FULLTRACE)] } { set level "; level == [info level]" puts $xctr(fulltraceID) [concat $name \$__args__ \$level] #puts $xctr(fulltraceID) "[format %[expr [info level]*3]s { }]$name $args" flush $xctr(fulltraceID) } $body }] tcl_proc $name $args $_body } if { [info exists env(XCRYSDEN_TRACE)] || [info exists env(XCRYSDEN_FULLTRACE)] } { #set xctr(traceID) [open [file join $env(XCRYSDEN_SCRATCH) xc_trace.[pid]] w] #set xctr(fulltraceID) [open [file join $env(XCRYSDEN_SCRATCH) xc_fulltrace.[pid]] w] set xctr(traceID) stderr set xctr(fulltraceID) stderr rename proc tcl_proc rename xctr_proc proc } xcrysden-1.6.2/Tcl/pdb.tcl0000644000175000017500000000261713516010412014045 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/pdb.tcl # ------ # # Copyright (c) 2019 by Anton Kokalj # ############################################################################# proc pdfUpdate {filedir {can .mesa}} { global select if { [info exists select(selection_mode)] && $select(selection_mode) } { tk_dialog [WidgetName] "WARNING !!!" "WARNING: structure can not be reloaded while in selection mode. First exit from the selection mode, then reload" warning 0 OK return } set file [gunzipXSF $filedir] if { ! [UpdateStruct $can $file pdb] } { return } xcUpdateState return } xcrysden-1.6.2/Tcl/atomLabels.tcl0000644000175000017500000004055513516060351015375 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/atomLabels.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc ModAtomLabels {} { global atomLabel # # make three-pages: # page.1: for globalAtomLabel properties # page.2: for each-atom-label properties # page.3: advanced setting set t .atom_label if { [winfo exists $t] } { return } xcToplevel $t "Edit Atom labels & fonts" "Atom Labels" set nb [NoteBook $t.nb] pack $nb -expand 1 -fill both # -------------------------------------------------- # page #.1: globalAtomLabel # -------------------------------------------------- $nb insert 0 globalAtomLabel -text "Global Atom-Labels Font" set page [$nb getframe globalAtomLabel] ModAtomLabels:_font_and_color $t $page globalFont # -------------------------------------------------- # page #.2: atomLabel # -------------------------------------------------- $nb insert 1 atomLabel -text "Edit Custom Atom-Labels and Fonts" set page [$nb getframe atomLabel] set atom_frame [frame $page.atom -relief groove -bd 2] pack $atom_frame -side top -expand 1 -fill both -padx 3 -pady 3 -ipadx 3 -ipady 3 foreach i {1 2} text { "Atom ID:" "ID's Atom Label:" } var { atomLabel(atomFont.id) atomLabel(atomFont.label) } ew { 5 25 } { set l [label $atom_frame.l$i -text $text] set e [entry $atom_frame.e$i -textvariable $var -width $ew] pack $l $e -side left -padx 1 -pady 3 if { $i == 1 } { bind $e [list ModAtomLabels:atomFontUpdate $atomLabel(atomFont.id)] set atomLabel(atomFont.entry) $e set select [button $atom_frame.selectbutton \ -text "Select Atom" -command ModAtomLabels:selectAtom] pack $select -side left -padx 0 -pady 5 } } ModAtomLabels:_font_and_color $t $page atomFont # -------------------------------------------------- # page #.3: advanced # -------------------------------------------------- $nb insert 2 advanced -text "Advanced" set page [$nb getframe advanced] set check_frame [frame $page.check -relief groove -bd 2] set entry_frame(1) [frame $page.entry1 -relief groove -bd 2] set entry_frame(2) [frame $page.entry2 -relief groove -bd 2] set button_frame [frame $page.button] pack $check_frame $entry_frame(1) $entry_frame(2) -side top \ -fill x -padx 3 -pady 3 -ipady 2 pack $button_frame -side bottom -fill x -padx 3 -pady 3 -ipady 10 # check-buttons ... foreach i {cb1 cb2} text { "do not display all default atomic symbols" "do not display all custom atomic labels" } onvalue {0 0} offvalue {1 1} var { atomLabel(globalFont.do_display) atomLabel(atomFont.do_display) } command { {ModAtomLabels:advancedCheckButton default} {ModAtomLabels:advancedCheckButton custom} } { set cb($i) [checkbutton $check_frame.$i -text $text \ -onvalue $onvalue -offvalue $offvalue \ -variable $var -command $command -anchor w] pack $cb($i) -side top -padx 3 -pady 3 -fill x } set b [button $check_frame.b1 -text "Clear all custom atomic labels" \ -command ModAtomLabels:advancedClearCustomLabels] pack $b -side left -padx 3 -pady 3 # entries .. foreach i {1 2} text { "do not display label for atoms (enter atom ID's):" "do not display labels for the following type of\natoms (enter atomic symbols):" } textvariable { atomLabel(atomIDs.do_not_display) atomLabel(atomTypes.do_not_display) } b1text { "Select Atom" "Select Atomic Type" } b2text { "De-select Atom" "De-select Atomic Type" } b1com { {ModAtomLabels:advancedSelectAtom select} {ModAtomLabels:advancedSelectType select} } b2com { {ModAtomLabels:advancedSelectAtom deselect} {ModAtomLabels:advancedSelectType deselect} } { set f1($i) [frame $entry_frame($i).1$i] set f2($i) [frame $entry_frame($i).2$i] set la($i) [label $f1($i).l$i -text $text -anchor w] set en($i) [entry $f1($i).e$i -textvariable $textvariable -width 40] set b1($i) [button $f2($i).b1$i -text $b1text -width 14 -command $b1com] set b2($i) [button $f2($i).b2$i -text $b2text -width 21 -command $b2com] pack $f1($i) $f2($i) -side top -expand 1 -fill both -padx 2 -pady 2 pack $la($i) -side left -padx 1 pack $en($i) -side top -padx 1 -fill x -expand 1 pack $b1($i) $b2($i) -side left -padx 1 } # buttons ... set cancel [button $button_frame.can -text "Cancel" \ -command [list CancelProc $t]] set close [button $button_frame.close -text "Close" \ -command [list ModAtomLabels:advancedCloseUpdate $t close]] set update [button $button_frame.update -text "Update" \ -command [list ModAtomLabels:advancedCloseUpdate $t update]] pack $cancel $close $update -side left -expand 1 -padx 7 -pady 7 -ipadx 2 -ipady 2 # -------------------------------------------------- # raise the globalAtomLabel page # -------------------------------------------------- $nb raise globalAtomLabel return $t } proc ModAtomLabels:_font_and_color {t page whichFont} { global atomLabel if { $whichFont != "atomFont" && $whichFont != "globalFont" } { ErrorDialog "wrong whichFont $whichFont for ModAtomLabels:_font_and_color" return } set font_frame [frame $page.font -relief groove -bd 2] set color_frame [frame $page.color -relief groove -bd 2] set button_frame [frame $page.button] pack $font_frame $color_frame $button_frame -side top -expand 1 \ -fill both -padx 3 -pady 3 -ipady 2 # font ... FillEntries $font_frame {"Font:"} atomLabel($whichFont) 5 60 set b [button $font_frame.browse -textvariable atomLabel(fontBrowser) \ -width 19 \ -command [list ModAtomLabels:fontBrowser $whichFont]] # TEMPORARY global tcl_platform if { $tcl_platform(platform) == "windows" } { # disable font-browser, as it does not work under windows $b config -state disabled } #/ foreach i {s c} value { "Simple Font Browser" "Font Browser" } text { "use basic fonts only" "use all available fonts" } { set rb($i) [radiobutton $font_frame.rb$i \ -text $text \ -value $value \ -variable atomLabel(fontBrowser)] } pack $b $rb(s) $rb(c) -side left -padx 5 -pady 5 $rb(c) configure -state disabled; # disable "use all available fonts" as it does not work Togl-font problem # font-colors ... #proc xcModifyColor {parent labeltext init_color \ # frame_relief frame_side scale_side width height \ # scale_length scale_width slider_length {cID {}}} set f1 [frame $color_frame.1] set f2 [frame $color_frame.2] pack $f1 $f2 -side left -expand 1 -padx 5 -pady 5 if { ! [info exists atomLabel($whichFont.brightID)] } { set atomLabel($whichFont.brightID) [xcModifyColorID] set atomLabel($whichFont.darkID) [xcModifyColorID] } set brightColor [rgb_f2h $atomLabel($whichFont.brightColor)] set darkColor [rgb_f2h $atomLabel($whichFont.darkColor)] xcModifyColor $f1 "Set Bright Font Color:" \ $brightColor groove left left 100 100 70 5 20 \ $atomLabel($whichFont.brightID) xcModifyColor $f2 "Set Dark Font Color:" \ $darkColor groove left left 100 100 70 5 20 \ $atomLabel($whichFont.darkID) #if { $whichFont == "atomFont" } { # if { [trace vinfo atomLabel(atomFont.brightColor)] != "" } { # trace variable atomLabel(atomFont.brightColor) w ModAtomLabels:trace # } # if { [trace vinfo atomLabel(atomFont.darkColor)] != "" } { # trace variable atomLabel(atomFont.darkColor) w ModAtomLabels:trace # } #} # buttons ... set cancel [button $button_frame.can -text "Cancel" \ -command [list CancelProc $t]] set close [button $button_frame.close -text "Close" \ -command [list ModAtomLabels:CloseUpdate $t $whichFont close]] set update [button $button_frame.update -text "Update" \ -command [list ModAtomLabels:CloseUpdate $t $whichFont update]] pack $cancel $close $update -side left -expand 1 -padx 7 -pady 7 -ipadx 2 -ipady 2 } proc ModAtomLabels:selectAtom {} { global select atomLabel if { ! [info exists atomLabel(selecAtomWindow)] } { set atomLabel(selecAtomWindow) .atom_label_selectiton } if { [winfo exists $atomLabel(selecAtomWindow)] } { return } set select(done) 0 PreSel $atomLabel(selecAtomWindow) .mesa "Select an Atom" \ "For selecting an atom click on particular atom" AtomSel 1 tkwait window $atomLabel(selecAtomWindow) if { !$select(done) } { return } set atomLabel(atomFont.id) $select(Sqn1) set atomLabel(atomFont.label) $select(Sym1) ModAtomLabels:atomFontUpdate $select(Sqn1) } proc ModAtomLabels:atomFontUpdate {id} { global atomLabel mody if { ! [string is integer $id] || $id == "" } { return } # query the label of atom $id set label [xc_getvalue $mody(GET_ATOMLABEL_LABEL) $id] if { $label != "" } { set atomLabel(atomFont.label) $label } # query the font-colors atom $id set atomLabel(atomFont.brightColor) [xc_getvalue $mody(GET_ATOMLABEL_BRIGHTCOLOR) $id] set atomLabel(atomFont.darkColor) [xc_getvalue $mody(GET_ATOMLABEL_DARKCOLOR) $id] xcModifyColorSet $atomLabel(atomFont.brightID) float rgb $atomLabel(atomFont.brightColor) xcModifyColorSet $atomLabel(atomFont.darkID) float rgb $atomLabel(atomFont.darkColor) } proc ModAtomLabels:fontBrowser {whichFont} { global atomLabel set t .atomlabelfontbrowser if { [winfo exists $t] } { return } if { ! [info exists atomLabel(lastfont) ] } { #set atomLabel(lastfont) "" #set atomLabel(lastfont) "-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1" set atomLabel(lastfont) [font create \ -family Helvetica \ -size 18 \ -weight bold \ -slant roman] } set allFonts "" if { $atomLabel(fontBrowser) == "Font Browser" } { set allFonts 1 } set font [fontToplevelWidget .atomlabelfontbrowser "Sample Text" $atomLabel(lastfont) $allFonts] #puts stderr "*** ModAtomLabels:fontBrowser : font = $font" if { $font != "" } { set atomLabel(lastfont) $font set atomLabel($whichFont) [xcTkFontName2XLFD $font] } } proc ModAtomLabels:CloseUpdate {t type action} { global atomLabel mody_col if { $type != "atomFont" && $type != "globalFont" } { ErrorDialog "wrong type $type for ModAtomLabels:CloseUpdate" return } set font $atomLabel($type) set bright_color [xcModifyColorGet $atomLabel($type.brightID) float RGB] set dark_color [xcModifyColorGet $atomLabel($type.darkID) float RGB] if { $type == "globalFont" } { set atomLabel(globalFont.brightColor) $bright_color set atomLabel(globalFont.darkColor) $dark_color #puts stderr "*** ModAtomLabels:CloseUpdate: xc_setfont .mesa $font $bright_color $dark_color" xc_setfont .mesa $font $bright_color $dark_color } elseif { $type == "atomFont" } { # here set id $atomLabel($type.id) set atomLabel($id.$type.label) $atomLabel($type.label) set atomLabel($id.$type.font) $font set atomLabel($id.$type.brightColor) $bright_color set atomLabel($id.$type.darkColor) $dark_color xc_setatomlabel .mesa $id $atomLabel($type.label) $font $bright_color $dark_color } if { $action == "close" } { CancelProc $t } } # ------------------------------------------------------------------------ # ModAtomLabels:advanced* procs # ------------------------------------------------------------------------ proc ModAtomLabels:advancedCheckButton {mode} { global atomLabel mody if { $mode == "default" } { # # do not display all global atom labels # if { $atomLabel(globalFont.do_display) } { xc_newvalue .mesa $mody(SET_GLOBALATOMLABEL_DO_DISPLAY) 1 } else { xc_newvalue .mesa $mody(SET_GLOBALATOMLABEL_DO_DISPLAY) 0 } } else { # # do not display all custom atom labels # set customLabelIDs [xc_getvalue $mody(GET_ATOMLABEL_ALL_ID)] if { $atomLabel(atomFont.do_display) } { set display 1 } else { set display 0 } foreach id $customLabelIDs { # here checking for do_display xc_newvalue .mesa $mody(SET_ATOMLABEL_DO_DISPLAY) $id $display } } } proc ModAtomLabels:advancedSelectAtom {action} { global atomLabel select set select(done) 0 set selw [WidgetName] if { $action == "select" } { PreSel [WidgetName] .mesa "Select an Atom" \ "For selecting an atom click on particular atom" AtomSel 1 } else { # action == deselect PreSel [WidgetName] .mesa "(De-)Select an Atom" \ "For (de-)selecting an atom click on particular atom" AtomSel 1 } tkwait window $selw if { ! $select(done) } { return } if { $action == "select" } { lappend atomLabel(atomIDs.do_not_display) $select(Sqn1) } else { # action == deselect set ind [lsearch $atomLabel(atomIDs.do_not_display) $select(Sqn1)] if { $ind > -1 } { set atomLabel(atomIDs.do_not_display) \ [lreplace $atomLabel(atomIDs.do_not_display) $ind $ind] } } } proc ModAtomLabels:advancedSelectType {action} { global atomLabel ptable ptable . -command ptableSelectElement if { $ptable(result) == "" } { return } if { $action == "select" } { lappend atomLabel(atomTypes.do_not_display) $ptable(result) } else { # action == deselect set ind [lsearch $atomLabel(atomTypes.do_not_display) $ptable(result)] if { $ind > -1 } { set atomLabel(atomTypes.do_not_display) \ [lreplace $atomLabel(atomTypes.do_not_display) $ind $ind] } } } proc ModAtomLabels:advancedCloseUpdate {t action} { global atomLabel mody # build an do_not_display ID-list, we have: # # atomLabel(atomIDs.do_not_display) # atomLabel(atomTypes.do_not_display) if { ! [info exists atomLabel(atomIDs.do_not_display)] } { set atomLabel(atomIDs.do_not_display) "" } if { ! [info exists atomLabel(atomTypes.do_not_display)] } { set atomLabel(atomTypes.do_not_display) "" } # IDs-part from atomIDs ... set IDs $atomLabel(atomIDs.do_not_display) # IDs-part from atomTypes ... set natList "" foreach type $atomLabel(atomTypes.do_not_display) { set _nat [Aname2Nat $type] if { ! [string is integer $_nat] } { ErrorDialog "$type is not atomic symbol" } else { lappend natList $_nat } } if { $natList != "" } { set natoms [xc_getvalue $mody(GET_NATOMS)] for {set i 1} {$i <= $natoms} {incr i} { set ind [lsearch $natList [xc_getvalue $mody(GET_NAT) $i]] if { $ind > -1 } { lappend IDs $i } } } if { ! [info exists atomLabel(atomIDs.do_no_display.previous)] } { set atomLabel(atomIDs.do_no_display.previous) "" } # make visible all the labels that were disabled in the last call # to ModAtomLabels:advancedCloseUpdate foreach id $atomLabel(atomIDs.do_no_display.previous) { xc_newvalue .mesa $mody(SET_DO_NOT_DISPLAY_ATOMLABEL) $id 0 } # disable all curently specified labels foreach id $IDs { xc_newvalue .mesa $mody(SET_DO_NOT_DISPLAY_ATOMLABEL) $id 1 } # current IDs list become previous-list set atomLabel(atomIDs.do_no_display.previous) $IDs if { $action == "close" } { CancelProc $t } } proc ModAtomLabels:advancedClearCustomLabels {} { set button [tk_messageBox -message "All custom atomic labels are about to be cleared. All your custom atomic-label editings will be lost.\n\nDo you really want to do it?" \ -type yesno -icon question] if { $button == "yes" } { xc_clearatomlabel .mesa all } } xcrysden-1.6.2/Tcl/gzmat.tcl0000644000175000017500000000477613515532751014450 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/gzmat.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # ------------------------------------------------------------------------ # loads structure from Gaussian input file (requires babel) # ------------------------------------------------------------------------ proc gzmat {filedir {can .mesa} {update 0}} { global xcMisc env system if { ! [info exists xcMisc(babel)] } { if [winfo exists .title] { destroy .title } ErrorDialog "--gzmat option requires the definition of xcMisc(babel) in the ~/.xcrysden/custom-definitions" exit } else { set env(BABEL) $xcMisc(babel) } # OpenBabel seems not to need BABEL_DIR variable !!! if { [info exists xcMisc(babel_dir)] } { set env(BABEL_DIR) $xcMisc(babel_dir) } set head [file rootname [file tail $filedir]] #xcCatchExecReturnRedirectStdErr set cmd "exec sh $system(TOPDIR)/scripts/gzmat2xsf.sh $filedir > $system(SCRDIR)/$head.xsf 2> /dev/null" xcDebug -stderr "Executing: $cmd" if { [catch $cmd] } { destroyWelcome #ErrorDialog "an error occured while executing BABEL program." ErrorDialog "an error occured while parsing Gaussian Z-matrix input file" if { ![xcIsActive render] } { CloseCase } return } xsfOpenParsed $system(SCRDIR)/$head.xsf $can $update } proc gzmat_menu {openwhat} { global system set filedir [tk_getOpenFile -defaultextension .xsf \ -filetypes { { {All Files} {.*} } } -initialdir $system(PWD) -title $openwhat] if { $filedir == "" } { return } reloadRegister $filedir GZMAT gzmat $filedir } xcrysden-1.6.2/Tcl/find_package.tcl0000644000175000017500000001273413521045320015676 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/__file__ # ------ # # Copyright (c) 2008 by Anton Kokalj # ############################################################################# proc find_package {package packageVar recognizeCmd} { # package -- name or fullpath for package to query/find # packageVar -- where to store the found fullpath of package # recognizeCmd -- procedure that checks if the found package is the proper one upvar #0 $packageVar pkgVar # check first if user has explicitly set the package by the packageVar if { [info exists pkgVar] } { if { [set path [check_package $pkgVar $recognizeCmd]] != "" } { # package $pkgVar is OK set pkgVar $path return } } # try to guess the fullpath of package if { [set path [check_package $package $recognizeCmd]] != "" } { set pkgVar $path } else { if { [info exists pkgVar] } { unset pkgVar } } } proc check_package {package recognizeCmd} { set path [auto_execok $package] if { $path != "" } { if { [$recognizeCmd $path] } { return $path } } else { puts stdout "can't find package: $package" } return "" } # # Find: ImageMagick # proc find_package_imagemagick {} { global xcMisc # convert find_package convert xcMisc(ImageMagick.convert) query_imagemagick if { [info exists xcMisc(ImageMagick.convert)] } { # variable xcMisc(convert) will be used for animated GIF encoding set xcMisc(convert) $xcMisc(ImageMagick.convert) puts stderr "Package ImageMagick's convert: $xcMisc(ImageMagick.convert)" } # import find_package import xcMisc(ImageMagick.import) query_imagemagick if { [info exists xcMisc(ImageMagick.import)] } { puts stderr "Package ImageMagick's import: $xcMisc(ImageMagick.import)" } } proc query_imagemagick {package} { catch {set result [exec -- $package -version]} if { ! [info exists result] } { return 0 } if { [string match -nocase *imagemagick* $result] } { return 1 } return 0 } # # Find: Gifsicle # proc find_package_gifsicle {} { global xcMisc find_package gifsicle xcMisc(gifsicle) query_gifsicle if { [info exists xcMisc(gifsicle)] } { puts stderr "Package Gifsicle: $xcMisc(gifsicle)" } } proc query_gifsicle {package} { # gifsicle tends to be rather unique name, we don't permorm any checkings return 1 } # # Find: Whirlgif # proc find_package_whirlgif {} { global xcMisc find_package whirlgif xcMisc(whirlgif) query_whirlgif if { [info exists xcMisc(whirlgif)] } { puts stderr "Package Whirlgif: $xcMisc(whirlgif)" } } proc query_whirlgif {package} { # whirlgif tends to be rather unique name, we don't permorm any checkings return 1 } # # Find: Mencoder # proc find_package_mencoder {} { global xcMisc find_package mencoder xcMisc(mencoder) query_mencoder if { [info exists xcMisc(mencoder)] } { puts stderr "Package Mencoder: $xcMisc(mencoder)" } } proc query_mencoder {package} { # mencoder seems to be rather unique name, we don't permorm any checkings return 1 } # # Find: Ppmtompeg # proc find_package_ppmtompeg {} { global xcMisc # backward compatibility ppmtompeg --> mpeg_encode if { [info exists xcMisc(mpeg_encode)] } { set xcMisc(ppmtompeg) $xcMisc(mpeg_encode) } find_package ppmtompeg xcMisc(ppmtompeg) query_ppmtompeg if { [info exists xcMisc(ppmtompeg)] } { puts stderr "Package Ppmtompeg: $xcMisc(ppmtompeg)" } } proc query_ppmtompeg {package} { # ppmtompeg seems to be rather unique name, we don't permorm any checkings return 1 } # # Find: Babel # proc find_package_babel {} { global xcMisc find_package babel xcMisc(babel) query_babel if { [info exists xcMisc(babel)] } { puts stderr "Package Babel: $xcMisc(babel)" } } proc query_babel {package} { catch {set result [exec $package -H]} if { ! [info exists result] } { return 0 } if { [string match -nocase *babel* $result] } { return 1 } return 0 } # # Find: Xwd # proc find_package_xwd {} { global xcMisc find_package xwd xcMisc(xwd) query_xwd if { [info exists xcMisc(xwd)] } { puts stderr "Package Xwd: $xcMisc(xwd)" } } proc query_xwd {package} { # xwd tends to be rather unique name, we don't perform any checkings return 1 } # # Find: Xsf2_manipulator # proc find_package_xsf2_manipulator {} { global xcMisc find_package xsf2_manipulator xcMisc(xsf2_manipulator) query_xsf2_manipulator if { [info exists xcMisc(xsf2_manipulator)] } { puts stderr "Package Xsf2_manipulator: $xcMisc(xsf2_manipulator)" } } proc query_xsf2_manipulator {package} { # xsf2_manipulator tends to be rather unique name, we don't perform any checkings return 1 } xcrysden-1.6.2/Tcl/custom-definitions0000644000175000017500000002566113555570764016376 0ustar tonetone# ------------------------------------------------------------------------ # Printing options ... # # if "Print To File" produces blank images, uncomment the line below # (i.e. use screen-dump instead): # ------------------------------------------------------------------------ #set printSetup(dumpWindow) 1 # ------------------------------------------------------------------------ # Options for OpenGL display # # If you experience "X Error of failed request:" crashes, set the # toglOpt(accum) to false. # # N.B. for all possible options of toglOpt(option) see file # $XCRYSDEN_TOPDIR/Tcl/toglOpt.tcl # ------------------------------------------------------------------------ #set toglOpt(accum) false #set toglOpt(stereo) none # ------------------------------------------------------------------------ # do we have CRYSTAL package # ------------------------------------------------------------------------ set system(c95_exist) 0 # ------------------------------------------------------------------------ # CRYSTAL modules # ------------------------------------------------------------------------ #set system(c95_integrals) /home/tone/src/CRYSTAL03/bin/Linux-pgf/v1_0_2/crystal #set system(c95_scf) /home/tone/src/CRYSTAL03/bin/Linux-pgf/v1_0_2/crystal #set system(c95_properties) /home/tone/src/CRYSTAL03/bin/Linux-pgf/v1_0_2/properties # ------------------------------------------------------------------------ # xcrysden can use several encoder programs for creating animated GIF # (convert, gifsicle, whirlgif) and AVI/MPEG movies # (mencoder/ppmtompeg) # ------------------------------------------------------------------------ #set xcMisc(gif_encoder) convert #set xcMisc(movie_encoder) mencoder # ------------------------------------------------------------------------ # NOTICE: Starting from version 1.5, xcrysden tries to automatically # find various external packages, nevertheless user can still set # them explicitly, as shown below (if you want to do so, uncomment # corresponding lines) # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # An image conversion program: we need PPM to PNG/JPG/GIF/... conversion. # The "convert" program of ImageMagick (http://www.imagemagick.org/) is # a convenient choice. # # It is possible to specify the command-line options. For example: # # set xcMisc(ImageMagick.convert) "/usr/bin/convert \ # -quality 90 -border 3x3 -bordercolor black" # # Instead one can also use something like: # # set xcMisc(ImageMagick.convertOptions) "-quality 90 -antialias \ # -blur 1x1 -trim -bordercolor white \ # -border 20x20 -bordercolor black -border 3x3" # ------------------------------------------------------------------------ #set xcMisc(ImageMagick.convert) "/usr/bin/convert" #set xcMisc(ImageMagick.convertOptions) "-quality 90 -bordercolor black -border 3x3" # ------------------------------------------------------------------------ # With "gifsicle" program XCRYSDEN can create an Animated-GIF image # ------------------------------------------------------------------------ #set xcMisc(gifsicle) /usr/bin/gifsicle # ------------------------------------------------------------------------ # PPMTOMPEG for creating the MPEG movies # ------------------------------------------------------------------------ #set xcMisc(ppmtompeg) /usr/bin/ppmtompeg # ------------------------------------------------------------------------ # BABEL program # ------------------------------------------------------------------------ #set xcMisc(babel) /home/tone/bin/babel # this is the same as environmental BABEL_DIR variable. Note: if # BABEL_DIR is defined, then this is not needed!!! #set xcMisc(babel_dir) $env(HOME)/lib/babel # ------------------------------------------------------------------------ # Custom setting of the atomic radii. The syntax is: # ------------------------------------------------------------------------ # set atmRad(atomic_number) radius # # Example: # # set atmRad(1) 0.5; # custom radius for Hydrogen # set atmRad(8) 1.2; # custom radius for Oxygen # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # Custom setting of the atomic colors. The syntax is: # ------------------------------------------------------------------------ # set atmCol(atomic_number) {red gren blue} # # The components (red,gren,blue) must be in range [0,1] # # Example: # # set atmCol(1) {0.5 0.5 0.5}; # custom color for Hydrogen # set atmCol(8) {0.0 1.0 0.0}; # custom color for Oxygen # # ------------------------------------------------------------------------ #------------------------------------------------------------------------ # Turn-on old atomic colors (colors prior to xcrysden v-1.6) #------------------------------------------------------------------------ #xc_oldatmcol #------------------------------------------------------------------------ # ------------------------------------------------------------------------- # Custom setting for a variety of molecular display parameters, such as # ball-factors, specefill scale factors, tessellation factors, etc. # # Below are the default values. If you would like to change the # default for a particular parameter, then uncomment the appropriate # line and set the value according to your needs. # ------------------------------------------------------------------------ ## spacefill scale factor #set myParam(ATRAD_SCALE) 1.40 # ## tesselation factor #set myParam(TESSELLATION) 15.0 # ## RGB color of unibonds (each compoenent must be within [0,1]) #set myParam(UNIBONDCOLOR) {1.00 1.00 1.00} # ## Perspective Fovy, Front and Back parameters. The smaller the Fovy ## the larger the perception of perspective. Front and Back parameters ## determine the front and back clipping planes. The smaller the Back ## parameter the more the structure is clipped from the back side. The ## Front parameter is counter-intuitive, meaning the smaller it is the ## more the structure is clipped from the front side. # #set myParam(PERSPECTIVEFOVY) 2.5 #set myParam(PERSPECTIVEFRONT) 0.65 #set myParam(PERSPECTIVEBACK) 3.0 # ## ball-factor #set myParam(BALLF) 0.4 # ## rod-factor #set myParam(RODF) 0.6 # ## line-width of wireframe display-mode (in pixels) #set myParam(WFLINEWIDTH) 1 # ## line-width of pointline display-mode (in pixels) #set myParam(PLLINEWIDTH) 1 # ## line-width of crystal cell's frames #set myParam(FRAMELINEWIDTH) 1 # ## Lighting-Off outline width #set myParam(OUTLINEWIDTH) 1 # ## Lighting-On wire line width #set myParam(WF3DLINEWIDTH) 1 # ## point-size of pointline display-mode (in pixels) #set myParam(PLRADIUS) 6 # ## chemical connectivity factor #set myParam(COV_SCALE) 1.05 # ## RGB color of crystal frame (each compoenent must be within [0,1]) #set myParam(FRAMECOL) {0.88 1.00 0.67} # ## line-width of crystal frame #set myParam(FRAMELINEWIDTH) 1 # ## rod-factor of crystal frame #set myParam(FRAMERODF) 0.1 # ## RGB background of XCRYSDEN display window ## (each compoenent must be within [0,1]) #set myParam(BACKGROUND) {0.00 0.00 0.00} # ## maximum number of cells per direction for CRYSTALs #set myParam(CRYSTAL_MAXCELL) 10 # ## maximum number of cells per direction for SLABs #set myParam(SLAB_MAXCELL) 20 # ## maximum number of cells for POLYMERs #set myParam(POLYMER_MAXCELL) 50 # ## default atomic-label's font (in X11 XLFD format) #set myParam(ATOMIC_LABEL_FONT) -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1 # ## default atomic-label's bright and dark color (in clamped-float RGB format) #set myParam(ATOMIC_LABEL_BRIGHTCOLOR) {1.0 1.0 0.0} #set myParam(ATOMIC_LABEL_DARKCOLOR) {1.0 0.0 0.0} # # ## this are the parameters for the "ppmtompeg" program: ##--BEGIN:: #set myParam(MPEG_ENCODE_PARAM_FILE) { #PATTERN IBBPBBPBBPBBPBBP #OUTPUT $output_file #BASE_FILE_FORMAT PPM #INPUT_FORMAT UCB #$input_convert #GOP_SIZE 16 #SLICES_PER_FRAME 1 #INPUT_DIR / #INPUT #$input_files #END_INPUT #PIXEL FULL #RANGE 10 #PSEARCH_ALG LOGARITHMIC #BSEARCH_ALG CROSS2 #IQSCALE 8 #PQSCALE 10 #BQSCALE 25 #REFERENCE_FRAME ORIGINAL #BIT_RATE 1000000 #BUFFER_SIZE 327680 #FRAME_RATE 30 #} ##--END # # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # # Custom settings for FERMI-SURFACE-VIEWER # # ------------------------------------------------------------------------ ## RGB background of Fermi Viewer (each of r,g,b components must be within [0,1]) #set myParam(FS_BACKGROUND) {0.0 0.0 0.0} ## the type of the cell: bz | para #set myParam(FS_CELLTYPE) bz ## do we crop the BZ: 1 or 0 #set myParam(FS_CROPBZ) 1 ## display type for the cell: none | wire | solid | solidwire #set myParam(FS_CELLDISPLAYTYPE) wire ## draw style for the Fermi-surface: solid | wire | dot #set myParam(FS_DRAWSTYLE) solid ## draw transparent Fermi Surface: 0 | 1 #set myParam(FS_TRANSPARENT) 0 ## shade model for Fermi surface: smooth | flat #set myParam(FS_SHADEMODEL) smooth ## set the interpolation (should be small integer number, e.g., 1 2 3 #set myParam(FS_INTERPOLATIONDEGREE) 1 ## what is the frontface of the surface: CW or CCW #set myParam(FS_FRONTFACE) CW ## revert the normals of Fermi surface (determines the outside surface): 0 | 1 #set myParam(FS_REVERTNORMALS) 0 ## color of the wire-cell (each of r,g,b,a components must be within [0,1]) #set myParam(FS_WIRECELLCOLOR) {1.00 0.00 1.00 1.00} ## color of the solid-cell (each of r,g,b,a components must be within [0,1]) #set myParam(FS_SOLIDCELLCOLOR) {0.00 0.95 0.95 0.40} ## use antialiaing: 0 | 1 #set myParam(FS_ANTIALIAS) 0 ## use depth cuing: 0 | 1 #set myParam(FS_DEPTHCUING) 0 # END of settings for FERMI-SURFACE-VIEWER # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # Here go custom user-specified options # ------------------------------------------------------------------------ # In order to add an --unknown option to the Xcrysden allowed options, # do the following # # Usage: # addOption option converterProgram description # # Arguments: # option ... option to add to XCRYSDEN options # converterProgram ... program that converts from an unknown to XSF format; # this program must be supplied by the user !!! # description ... description of the options that will appear in the # help message (i.e. xcrysden --help). # Example: # addOption --unknown /home/tone/utils/unknown2xsf { # load structure from unknown file format # } # # turn debugging off set xcMisc(debug) 0 xcrysden-1.6.2/Tcl/openInput.tcl0000644000175000017500000005254313531250653015276 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/openInput.tcl # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# proc OpenCyrstalInput {{file {}}} { global fileselect distext Alist species speciesName \ type_group type_group1 job_title \ inp n_groupsel groupsel crdatom XCState system \ AdvGeom xcMisc crystalInput if { $system(c95_exist) == 0 } { ErrorDialog "can't open CRYSTAL-95/98/03 input File. CRYSTAL package is not installed !!!" return } # distext .... here go informations to be displayed in # information text widget if { $file == "" } { #fileselect "Open CRYSTAL Input" set fileselect(path) [tk_getOpenFile -defaultextension .r1 \ -filetypes { {{All Files} {.*}} {{CRYSTAL Input Files} {.r1}} } -initialdir $system(PWD) -title "Open CRYSTAL Input"] } elseif { [file isdirectory $file]} { set fileselect(path) [tk_getOpenFile -defaultextension .r1 \ -filetypes { {{All Files} {.*} } {{CRYSTAL Input Files} {.r1}} } -initialdir $file \ -title "Open CRYSTAL Input"] if { $fileselect(path) == "" } { return } } else { set fileselect(path) $file } # maybe CANCEL button was pressed if { $fileselect(path) == "" } { xcDeleteState c95 xcDeleteState openinput xcUpdateState return } ################# # initialisation set XCState(state) c95_openinput xcUpdateState xcAdvGeomState reset # # reset the title of "." # wm title . "XCrySDen: [file tail $fileselect(path)]" set xcMisc(titlefile) [file tail $fileselect(path)] # OK button was pressed # check if selected file is Crystal95 file; # the best way for doing it is to go and check it with Crystal95 ######################################## # CD to $system(SCRDIR) cd $system(SCRDIR) ######################################## # test only geom part of the input file (this is quick) # xc_inp.$system(PID)...here just geom input will be stored xcCatchExecReturn $system(AWKDIR)/ginp.awk \ $fileselect(path) > $system(SCRDIR)/xc_inp.$system(PID) puts stdout "FILE: $fileselect(path)" puts stdout "FILTERED INPUT" catch {ReadFile $system(SCRDIR)/xc_inp.$system(PID)} # BEGIN t.k. # for EXTERNAL: copy also fort.34 if { [file exists $system(PWD)/$system(ftn_name).34 ] } { file copy -force $system(PWD)/$system(ftn_name).34 $system(SCRDIR)/external_unit34 file copy -force $system(SCRDIR)/external_unit34 $system(SCRDIR)/$system(ftn_name).34 } # END t.k. # if we catch error than selected file is of the right type, # but is corrupted if { [catch {exec $system(c95_integrals) < \ $system(SCRDIR)/xc_inp.$system(PID) >& \ $system(SCRDIR)/xc_tmp.$system(PID)} errmsg] } { set idx [tk_dialog .idx1 ERROR "Selected file seems to be \ Crystal95 input file, but is corrupted" error 0 OK Details] if { $idx == 1 } { #user want's to see details tk_dialog .errm Details "ERROR MESSAGE:\n$errmsg" {} 0 OK } catch {file delete $system(SCRDIR)/xc_tmp.$system(PID)} OpenCyrstalInput return } else { # if Crystal95 find out that file is "bad", it has exited # nicely, but with ERROR message; grep ERROR --> if grep # doesn't find anything, we must catch the grep error #eval [list exec grep ERROR $system(SCRDIR)/xc_tmp.$system(PID)] if { ! [catch {exec grep ERROR $system(SCRDIR)/xc_tmp.$system(PID)}] } { set is_error 1 global system if { $system(c95_version) == "06" || $system(c95_version) == "09" || $system(c95_version) == "14" } { # if the "STOP KEYWORD - EXECUTION STOPS" is found then everything is OK" if { ! [catch {exec grep "STOP KEYWORD - EXECUTION STOPS" $system(SCRDIR)/xc_tmp.$system(PID)}] } { # OK, we don't have error set is_error 0 } } if { $is_error } { puts stdout "grep ERROR catched" tk_dialog .idx2 ERROR "Selected file is bad !!" error 0 OK file delete $system(SCRDIR)/xc_tmp.$system(PID) OpenCyrstalInput return } } } # it Looks that Selected file is good !!! # READ THE FILE; "distext" variable collects a information to be displayed set input [open "$system(SCRDIR)/xc_inp.$system(PID)"] set job_title [gets $input] set distext "> TITLE::\n$job_title\n" append distext "--------------------------------------------------\n\n" # just in any case (lindex 0) if there is anything bisides the "$species" set species [string tolower [lindex [gets $input] 0]] append distext "> SPECIES:: $species\n" append distext "--------------------------------------------------\n\n" if { $species == "external" } { # EXTERNAL OPTION CalStru return } elseif { $species == "crystal" } { # ========================== # SPECIES == CRYSTAL # ========================== set type_group "space" set type_group1 "Space" set ifl [gets $input] set inp(IFLAG) [lindex $ifl 0] set inp(IFHR) [lindex $ifl 1] set inp(IFSO) [lindex $ifl 2] append distext "> CRYSTAL FLAGS::\n" append distext "IFLAG: $inp(IFLAG), IFHR: $inp(IFHR), IFSO: $inp(IFSO)\n" append distext "--------------------------------------------------\n\n" # =================================================== # WHAT ABOUT sequ. number or alfanum. code for "group" if { $inp(IFLAG) == 0 } { # n_groupsel is synonym for IGR; (lindex 0) is just in any case set n_groupsel [lindex [gets $input] 0] set groupsel [Igr2Agr $n_groupsel space_group] append distext "> SPACE GROUP::\n" append distext "IGR = $n_groupsel --> AGR = $groupsel\n" append distext "--------------------------------------------------\n\n" } else { # $groupsel & $AGR are synonyms set inp(AGR) [gets $input] set n_groupsel [Agr2Igr $inp(AGR)] set groupsel $inp(AGR); #gropusel & AGR are synonyms append distext "> SPACE GROUP::\n" append distext "AGR = $groupsel --> IGR = $n_groupsel\n\n" append distext "--------------------------------------------------\n\n" } if { $inp(IFSO) > 1} { # non-standard shift of the ORIGIN set ixyz [gets $input] set inp(IX) [lindex $ixyz 0] set inp(IY) [lindex $ixyz 1] set inp(IZ) [lindex $ixyz 2] append distext "> NON-STANDARD ORIGIN SHIFT::\n" append distext "IX = $inp(IX), IY = $inp(IY), IZ = $inp(IZ)\n" append distext "--------------------------------------------------\n\n" } # verify which unit-cell parameter must be read & read it !!! WhichPar2Read $input } elseif { $species == "slab" } { set type_group "plane" set type_group1 "Plane" # n_groupsel is synonym for IGR; (lindex 0) is just in any case set n_groupsel [lindex [gets $input] 0] set groupsel [Igr2Agr $n_groupsel plane_group] append distext "> LAYER GROUP::\n" append distext "IGR = $n_groupsel --> $groupsel\n" append distext "--------------------------------------------------\n\n" # verify which unit-cell parameter must be read & read it !!! WhichPar2Read $input } elseif { $species == "polymer" } { set type_group "line" set type_group1 "Line" # n_groupsel is synonym for IGR; (lindex 0) is just in any case set n_groupsel [lindex [gets $input] 0] set groupsel [Igr2Agr $n_groupsel line_group] append distext "> ROD GROUP::\n" append distext "IGR = $n_groupsel --> $groupsel\n" append distext "--------------------------------------------------\n\n" # for all polymers we must read just A parameter set inp(A) [gets $input] append distext "> UNIT CELL PARAMETER::\nA: $inp(A)\n" append distext "--------------------------------------------------\n\n" } elseif { $species == "molecule" } { set type_group "point" set type_group1 "Point" # n_groupsel is synonym for IGR; (lindex 0) is just in any case set n_groupsel [lindex [gets $input] 0] set groupsel [Igr2Agr $n_groupsel point_group] append distext "> POINT GROUP::\n" append distext "IGR = $n_groupsel --> $groupsel\n" append distext "--------------------------------------------------\n\n" } # =============================================== # THIS IS COMMON FOR ALL SPECIES # inp(NATR); (lindex 0) is just in any case to be save set inp(NATR) [lindex [gets $input] 0] # crdatom is used for checking the variables set crdatom 1 append distext "> NUMBER OF NON-EQUIVALENT ATOMS::\nNATR = $inp(NATR)\n\n" append distext "> ATOMIC NUMBERS & COORDINATES OF NON-EQUIVALENT ATOMS::\n" # read Nat,X,Y,Z for {set i 1} {$i <= $inp(NATR)} {incr i} { set natrx [gets $input] set inp(NAT,$i) [lindex $natrx 0] set inp(X,$i) [lindex $natrx 1] set inp(Y,$i) [lindex $natrx 2] set inp(Z,$i) [lindex $natrx 3] # this is to load atom names AtomNames append distext [format "%-3d %-4s %10.5f %10.5f %10.5f\n" \ $inp(NAT,$i) [Nat2Aname $inp(NAT,$i)] $inp(X,$i) $inp(Y,$i) $inp(Z,$i)] } append distext "--------------------------------------------------\n\n" set speciesName $species ####################################### # check for ADVANCE GEOMETRICAL INPUT # ####################################### set line [gets $input] if { $line != "STOP" } { ############################# # ADVANCE GEOMETRICAL INPUT # ############################# set AdvGeom(input) "$line\n" while { [set line [gets $input]] != "STOP" } { append AdvGeom(input) "$line\n" } xcDebug "\nADVANCE GEOMETRICAL INPUT FOUND::\n$AdvGeom(input)\n" append distext " #########################################\n" append distext " # GEOMETRY MANIPULATION INPUT was found #\n" append distext " #########################################\n\n" append distext "Geometry manipulation input::\n" append distext "$AdvGeom(input)\n" # chack if dimensionality of the system has changed during # the geometry manipulation foreach word $AdvGeom(input) { switch -glob -- $word { *SLAB* { set speciesName "slab" } *MOLECULE* { set speciesName "molecule" } *CLUSTER* { set speciesName "cluster" } } } } # ============================================================ # INPUT FILE HAS BEEN READ OUT !!!!!!!! # # make a toplevel where some information about selected file # will be printed out # # there will be text widget & OK button # for text widged there is a DispText procedure; # all will be displayed after the input file will be read out # # produce some toplevel where it will # be possible to modify different parameters # ============================================================= # StatusWidget creates Status Widget & return path of toplevel set tx [StatusWidget] # TOPLEVEL FOR DECISION (VIEWER,MODIFY) set td [xcToplevel .opfd "Open Crystal Input" "Open Crystal Input" \ . 50 100] set crystalInput(two_toplevels) {.opfd .opftx} AlwaysOnTopON . $crystalInput(two_toplevels) focus $td set l [label $td.lbl -text "What to do?" -relief raised -bd 2] set f [frame $td.frm] set b1 [button $f.but1 -text "Modify File" -command \ [list OpenCyrstalInputModify $tx $td]] puts stdout "tx> $tx" set b2 [button $f.but2 -text "View $speciesName" -command \ [list OpFile2ViewMol $tx $td]] pack $l $f -side top -expand 1 -fill both -ipadx 10 -ipady 10 pack $b1 $b2 -side left -expand 1 -padx 7 } proc OpenCyrstalInputModify {tx td} { global fileselect distext species type_group type_group1 \ inp n_groupsel groupsel XCState XCTrace CancelProc $td # MODIFY TOPLEVEL set t [xcToplevel .openfile "Modify" "Modify" \ . 50 100] # .opftx -- status widget AlwaysOnTopON . {.openfile .opftx} focus $t # because what ever I choose there will apper some new toplevel, that will # override AlwaysOnTop flag for .openfile & .opftx toplevels, # so we must set #set XCState(toplevel) {.openfile .opftx} puts stdout "species: $species" flush stdout # label goes on the top set l [label $t.lbl -text "MODIFY/CHANGE:" -relief groove -bd 2] pack $l -side top -expand 1 -fill x -padx 7 -pady 7 -ipady 7 -ipadx 10 # for every option/parameter make a button set spe [button $t.b1 -text "Species" \ -command ChooseSpecies] # if you will change $species you must change name of this button # this is possible throuh buutn-entry combination set igr [button $t.b4 -text "Group" \ -command [list ModGroup $t]] # Only for rhombohedral group is not meanningless to specify IHFR # so doit by CheckGroup proc set ifhr [button $t.b2 -text "Type of Cell for \n\ Rhombohedral Groups" -command CheckGroup] set ifso [button $t.b3 -text "Origin Setting" \ -command PreSetOrigin] set par [button $t.b5 -text "Cell Parameters" \ -command [list PreGeom_sym_input .opflgeom $t]] set coor [button $t.b6 -text "Atomic Coordinates &\n\ Atomic Numbers" -command atom_num_coord] set view [button $t.b8 -text "View Structure" \ -command [list OpFile2ViewMol $tx $t]] set close [button $t.b9 -text "Close" \ -command [list DestroyOpfl $t $tx]] if { $species == "crystal" } { pack $spe $igr $ifhr $ifso $par $coor $view $close \ -fill x -expand 1 -padx 5 -pady 3 -ipadx 0 -ipady 0 if { [lindex $groupsel 0] != "R" } { $ifhr config -state disabled set XCTrace(RHOMBO_TYPE_BUTTON) $ifhr trace variable groupsel w xcTrace } } elseif { $species == "slab" || $species == "polymer"} { pack $spe $igr $par $coor $view $close -fill x -expand 1 \ -padx 5 -pady 3 -ipadx 0 -ipady 0 } else { pack $spe $igr $coor $view $close -fill x -expand 1 \ -padx 5 -pady 3 -ipadx 0 -ipady 0 } } proc cxxManageExternal {} { global species system # if the species is external we need to copy # $system(SCRDIR)/external_unit34 to # $system(SCRDIR)/$system(ftn_name).34 # (see proc OpenCyrstalInput) xcDebug -stderr "cxxManageExternal:: species = $species" if { $species == "external" } { file copy -force $system(SCRDIR)/external_unit34 $system(SCRDIR)/$system(ftn_name).34 } } proc Agr2Igr {agr} { global group_list # "load" a $group_list space_group set n 1 # assign a sequ. number to $igr that correspond to $agr foreach word $group_list { # pure the $word set last [ string length $word ] set word [ string range $word 5 $last ] regexp {(([A-Z0-9] )|[A-Z0-9\/\-])+[A-Z0-9]} $word word if { $agr == $word } { set igr $n } incr n } puts stdout "Agr2Igr> agr = $agr" flush stdout # puts stdout " igr = $igr" # maybe "agr"symbol is not standard one if ![info exists igr] { return "\"$agr\" is not a standard space group" } return $igr } proc Igr2Agr {igr comm} { global group_list # "load" a $group_list eval $comm set n 1 # assign asymbol to $agr that correspond to $igr foreach word $group_list { # purify the $word if { $igr == $n } { set last [ string length $word ] set word [ string range $word 5 $last ] regexp {(([A-Z0-9] )|[A-Z0-9\/\-])+[A-Z0-9]} $word word set agr $word } incr n } return $agr } proc OpFile2ViewMol {tx td} { # there maybe trace on "groupsel" variable xcTraceDelete groupsel CancelProc $tx CancelProc $td # CHECK THE VARIABLES --> variables must be checked everytimes- # we do sometning in Modify; so if we are here everything is OK CalStru return } proc ModGroup {t} { global species if { $species == "molecule" } { # load point groups point_group geom_sym_input .opflmod $t } elseif { $species == "polymer" } { # load groups line_group geom_sym_input .opflmod $t } elseif { $species == "slab" } { # load groups plane_group crys_slab_sym .opflmod $t } elseif {$species == "crystal" } { # load groups space_group crys_slab_sym .opflmod $t } } proc UpdateStatus {t} { global fileselect distext Alist species type_group type_group1 job_title \ inp n_groupsel groupsel crdatom #t....text-widget-path # put updated information in $distext set distext "> TITLE::\n$job_title\n" append distext "--------------------------------------------------\n\n" append distext "> SPECIES:: $species\n" append distext "--------------------------------------------------\n\n" # ========================== # SPECIES == CRYSTAL # ========================== if { $species == "crystal" } { append distext "> CRYSTAL FLAGS::\n" append distext "IFLAG: $inp(IFLAG), IFHR: $inp(IFHR), IFSO: $inp(IFSO)\n" append distext "--------------------------------------------------\n\n" if { $n_groupsel == 999 } { set n_groupsel "\"$groupsel\" is not a standard space group" } if { $inp(IFLAG) == 0 } { append distext "> SPACE GROUP::\n" append distext "IGR = $n_groupsel --> AGR = $groupsel\n" append distext "--------------------------------------------------\n\n" } else { append distext "> SPACE GROUP::\n" append distext "AGR = $groupsel --> IGR = $n_groupsel\n\n" append distext "--------------------------------------------------\n\n" } if { $inp(IFSO) > 1} { append distext "> NON-STANDARD ORIGIN SHIFT::\n" append distext "IX = $inp(IX), IY = $inp(IY), IZ = $inp(IZ)\n" append distext "--------------------------------------------------\n\n" } # verify which unit-cell parameter must be read & read it !!! WhichPar2Print } elseif { $species == "slab" } { append distext "> LAYER GROUP::\n" append distext "IGR = $n_groupsel --> $groupsel\n" append distext "--------------------------------------------------\n\n" # verify which unit-cell parameter must be read & read it !!! WhichPar2Print } elseif { $species == "polymer" } { append distext "> ROD GROUP::\n" append distext "IGR = $n_groupsel --> $groupsel\n" append distext "--------------------------------------------------\n\n" append distext "> UNIT CELL PARAMETER::\nA: $inp(A)\n" append distext "--------------------------------------------------\n\n" } elseif { $species == "molecule" } { append distext "> POINT GROUP::\n" append distext "IGR = $n_groupsel --> $groupsel\n" append distext "--------------------------------------------------\n\n" } append distext "> NUMBER OF NON-EQUIVALENT ATOMS::\nNATR = $inp(NATR)\n\n" append distext "> ATOMIC NUMBERS & COORDINATES OF NON-EQUIVALENT ATOMS::\n" # read Nat,X,Y,Z for {set i 1} {$i <= $inp(NATR)} {incr i} { AtomNames append distext [format "%-3d %-4s %10.5f %10.5f %10.5f\n" \ $inp(NAT,$i) [Nat2Aname $inp(NAT,$i)] $inp(X,$i) $inp(Y,$i) $inp(Z,$i)] } append distext "--------------------------------------------------" # now display the updated information # first delete old text if nessecary if { [winfo exists $t] } { set text [DispText $t $distext 50 25 1] $text config -state disabled } else { set t [StatusWidget] } } proc StatusWidget {} { global distext # TOPLEVEL WITH TEXT set tx [xcToplevel .opftx "Crystal Input: status" "Crystal Input" \ . 330 100] AlwaysOnTopON . .opftx set text [DispText $tx.frm1 $distext 50 25] $text config -state disabled set frm [frame $tx.f -height 10] pack $frm -side bottom -before $tx.frm1 -fill x set ok [button $frm.ok -text "Close" -command "destroy $tx"] set updat [button $frm.upd -text "Update Status" \ -command [list UpdateStatus $tx.frm1]] pack $ok $updat -side left -expand 1 -ipadx 2 -ipady 2 -pady 10 return $tx } proc PreSetOrigin {} { global n_groupsel species inp # Origin settings is just for crystals & rhombohedral one; # if user has changed $species or group --> if origin settings become # meaningless, make a note to user if { $species != "crystal" } { set b [tk_dialog .preorgset WARNING "Species has been changed \ and is not any more a CRYSTAL, so Origin Setting is \ meaningless !!" warning 0 OK] return } set_origin } proc PreGeom_sym_input {w t} { global species set b 1 if { $species == "molecule" } { set b [tk_dialog .pregeom WARNING "Species has been changed to \ Molecule & for Molecules there is no Cell Parameters!!" \ warning 0 OK] } if { $b == 1 } { geom_sym_input .opflgeom $t } return } proc DestroyOpfl {t1 t2} { # delete trace on groupsel variable xcDeleteState c95 xcDeleteState openinput xcUpdateState xcTraceDelete groupsel CancelProc $t1 CancelProc $t2 return } xcrysden-1.6.2/Tcl/scriptingMakeMovie.tcl0000644000175000017500000002356311712736221017114 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/scriptingMakeMovie.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # ------------------------------------------------------------------------ #****c* Scripting/scripting::makeMovie # # NAME # scripting::makeMovie # # PURPOSE # This namespace provide the scripting interface for making # MPEG/Animated-GIF movies. The scripting::makeMovie namespace # interface is kind of state machine. The "init" command initializes # the process, and then the movie creation is encapsulated between # "begin" and "end" commands. Every movie frame is created within the # "begin" and "end" commands with "makeFrame" command. One can create # several movies within one scripting file. Make sure the sequence of # makeMovie calls will have the following order: # # init # begin # makeFrame # makeFrame # ... # end # # init # begin # makeFrame # makeFrame # ... # end # # # COMMANDS # -- scripting::makeMovie::init # Initializes the movie creation process. It must be called before # making movie. One passes several configuration options to init call. # # -- scripting::makeMovie::begin # Marks the begining of movie creation. # # -- scripting::makeMovie::makeFrame # Makes one movie frame, that is, saves (i.e. prints to file) the # content of the currently displayed object. # # -- scripting::makeMovie::end # Finishes the movie creation and encodes the movie. # #**** # ------------------------------------------------------------------------ namespace eval scripting::makeMovie { variable movie set movie(makeMovie) 0 set movie(movieFile) "" set movie(notificationMovie) "" } # ------------------------------------------------------------------------ #****f* Scripting/scripting::makeMovie::init # # NAME # scripting::makeMovie::init # # USAGE # scripting::makeMovie::init -option value ?-option value? ... # # PURPOSE # This proc initializes the movie creation processes. One can pass several # configuration options, which determine the technical details of the # movie. # # ARGUMENTS # args -- various configuration "-option value" pairs # # OPTIONS # ------------------------------------------------------------------------ # OPTION ALLOWED-VALUES + DESCRIPTION # ------------------------------------------------------------------------ # # -gif_transp 0|1 --> make oblique|transparent animated-GIF # # -gif_minimize 0|1 --> don't-minimize|minimize animateg-GIF # # -gif_global_colormap 0|1 --> don't-use|use global colormap for animated-GIF # # -movieformat avi|mpeg|gif --> create AVI|MPEG|Animated-GIF # # -dir tmp|pwd --> put temporary (i.e. frame) files to # scratch(tmp) or current working # directory(pwd) # # -frameformat PPM|PNG|JPEG --> format of the frame-files # # -firstframe positive-integer --> repeat first frame n-times # # -lastframe positive-integer --> repeat first frame n-times # # -delay positive-integer --> time dalay between frames # in 1/100 sec # -loop repeat in movie animation number of times (0=forever) # # -save_to_file file --> if specified the movie will be saved to file # otherwise the filename will be queried # # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::makeMovie::init \ # -movieformat mpeg \ # -dir tmp \ # -frameformat PPM \ # -firstframe 10 \ # -lastframe 10 \ # -delay 0 # #**** # ------------------------------------------------------------------------ proc scripting::makeMovie::init {args} { variable movie global gifAnim if { $movie(makeMovie) } { error "makeMovie::init called within makeMovie::begin/makeMovie::end, should be called before makeMovie::begin" } # load defaults set gifAnim(gif_transp) 0 set gifAnim(gif_minimize) 0 set gifAnim(gif_global_colormap) 0 set gifAnim(edit_param) 1 set gifAnim(movie_format) mpeg set gifAnim(temp_files_dir) tmp set gifAnim(frame_files_format) PPM set gifAnim(ntime_first_frame) 1 set gifAnim(ntime_last_frame) 1 set gifAnim(delay) 0 set gifAnim(loop) 0 set movie(movieFile) "" set i 0 foreach option $args { incr i if { $i%2 } { set tag $option } else { switch -glob -- $tag { "-gif_transp" - "-gif_minimize" - "-gif_global_colormap" - "-edit_param" { set tag [string trimleft $tag -] switch $option { 1 - on - yes { set gifAnim($tag) 1 } 0 - off - no { set gifAnim($tag) 0 } default { ErrorDialog "wrong value $option for $tag option, should be 0 or 1" } } } "-movieformat" { set option [string tolower $option] switch $option { mpeg - gif { set gifAnim(movie_format) $option } avi { set gifAnim(movie_format) mpeg } default { ErrorDialog "wrong value $option for $tag option, should be \"mpeg\" or \"gif\"" } } } "-dir" { switch $option { tmp - pwd { set gifAnim(temp_files_dir) $option } default { ErrorDialog "wrong value $option for $tag option, should be \"tmp\" or \"pwd\"" } } } "-frameformat" { set option [string toupper $option] switch $option { PPM - PNG - JPEG { set gifAnim(frame_files_format) $option } default { ErrorDialog "wrong value $option for $tag option, should be \"PPM\" or \"JPEG\"" } } } "-ntime_first_frame" - "-firstframe" { if { [nonnegativeInteger $option] } { set gifAnim(ntime_first_frame) $option } else { ErrorDialog "expected integer, but got $option for $tag option" } } "-ntime_last_frame" - "-lastframe" { if { [nonnegativeInteger $option] } { set gifAnim(ntime_last_frame) $option } else { ErrorDialog "expected integer, but got $option for $tag option" } } "-delay" - "-loop" { if { [nonnegativeInteger $option] } { set elem [string trimleft $tag -] set gifAnim($elem) $option } else { ErrorDialog "expected integer, but got $option for $tag option" } } "-save_to_file" { set movie(movieFile) $option } } } } if { $i%2 } { ErrorDialog "scripting::makeMovie::init called with an odd number of arguments !!!" } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::makeMovie::begin # # NAME # scripting::makeMovie::begin # # USAGE # scripting::makeMovie::begin # # PURPOSE # # This proc marks the beginning of movie creation. # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::makeMovie::begin # #**** # ------------------------------------------------------------------------ proc scripting::makeMovie::begin {} { variable movie global gifAnim set movie(makeMovie) 1 if { $gifAnim(movie_format) == "mpeg" } { set fmt MPEG } else { set fmt Animated-GIF } set movie(notificationMovie) [DisplayUpdateWidget "Recording" "Recording $fmt movie."] set gifAnim(make_gifAnim) 0 gifAnimMake .mesa } # ------------------------------------------------------------------------ #****f* Scripting/scripting::makeMovie::makeFrame # # NAME # scripting::makeMovie::makeFrame # # USAGE # scripting::makeMovie::makeFrame # # PURPOSE # This proc makes one movie frame, that is, it flushes (i.e. prints # to file) the content of the currently displayed object. # # WARNINGS # Note that this proc should be called within scripting::makeMovie::begin # and scripting::makeMovie::end calls. The scripting::makeMovie::init # should be called before "begin; makeFrame; ...; end" sequence. # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::makeMovie::makeFrame # #**** # ------------------------------------------------------------------------ proc scripting::makeMovie::makeFrame {} { variable movie if { $movie(makeMovie) } { gifAnimPrintCurrent .mesa } else { error "makeMovie::makeFrame called outside makeMovie::begin/makeMovie::end" } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::makeMovie::end # # NAME # scripting::makeMovie::end # # USAGE # scripting::makeMovie::end # # PURPOSE # This proc finishes the movie creation and encodes the movie. # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::makeMovie::end # #**** # ------------------------------------------------------------------------ proc scripting::makeMovie::end {} { variable movie global gifAnim if { [winfo exists $movie(notificationMovie)] } { destroy $movie(notificationMovie) } if { $gifAnim(filelist) == "" } { return } if { $movie(makeMovie) } { if { $movie(movieFile) == "" } { gifAnimMake .mesa } else { gifAnimMake .mesa {} {} $movie(movieFile) } set movie(makeMovie) 0 } else { error "makeMovie::end called before makeMovie::begin" } } xcrysden-1.6.2/Tcl/glModParam.tcl0000644000175000017500000004264311712736221015337 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/glModParam.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc glModParam {} { global glModParam # # this proc is used for setting: # # 1.) material-properties for atoms # 2.) fog parameters # 3.) Lighting-On AntiAlias parameters # set t .glpar if { [winfo exists $t] } { return } xcToplevel $t "Parameters Setting" "Setting" set nb [NoteBook $t.nb] pack $nb -expand 1 -fill both # # Material-properties for atoms (specular color and shininess) # $nb insert 0 materials -text "Material Properties" set page [$nb getframe materials] glModParam:Materials $t $page $nb insert 1 depthcuing -text "Depth-Cuing Properties" set page [$nb getframe depthcuing] glModParam:DepthCuing $t $page $nb insert 2 antialias -text "AntiAlias Properties" set page [$nb getframe antialias] glModParam:AntiAlias $t $page $nb raise materials } # ------------------------------------------------------------------------ # # Atomic MATERIALS properties # # ------------------------------------------------------------------------ proc glModParam:Materials {t page} { global glModParam xcFonts mody set sf [frame $page.stress -class StressText -relief groove -bd 2] set m [message $sf.m -justify left -anchor center -width 300 \ -text {Here you can set the atomic specular, emission and shininess material properties.}] pack $sf -padx 3 -pady 3 -fill x pack $m -side top -expand 1 -fill x -padx 0 -pady 0 -ipadx 3 -ipady 3 set specular [xc_getGLparam material -what structure -get specular] set emission [xc_getGLparam material -what structure -get emission] set shininess [xc_getGLparam material -what structure -get shininess] set glModParam(material,emission_R) [lindex $emission 0] set glModParam(material,emission_G) [lindex $emission 1] set glModParam(material,emission_B) [lindex $emission 2] set glModParam(material,emission_A) [lindex $specular 3] set glModParam(material,specular_R) [lindex $specular 0] set glModParam(material,specular_G) [lindex $specular 1] set glModParam(material,specular_B) [lindex $specular 2] set glModParam(material,specular_A) [lindex $specular 3] set glModParam(material,shininess) $shininess set f_color [frame $page.f] pack $f_color -side top -expand 1 -fill both -padx 3 -pady 3 # EMISSION & SPECULAR colors foreach type {emission specular} { set frame($type) [frame $f_color.$type -relief groove -bd 2] pack $frame($type) -side left -fill both -padx 2 -pady 0 -ipady 3 -expand 1 setRGBAwidget $frame($type) "[string totitle $type] color:" \ glModParam(material,${type}_R) glModParam(material,${type}_G) \ glModParam(material,${type}_B) glModParam(material,${type}_A) \ _COLOR_STRUCTURE_[string toupper $type]_ } # GL_SHININESS set frame(shininess) [frame $f_color.shininess -relief groove -bd 2] pack $frame(shininess) -side left -fill both -padx 2 -pady 0 -ipady 3 -expand 1 set l [label $frame(shininess).l -text "Shininess:"] set sc [scale $frame(shininess).sc -from 0 -to 128 -length 100 \ -variable glModParam(material,shininess) -orient horizontal \ -label "specular exponent:" -resolution 1 \ -showvalue true -width 7 -sliderlength 20 \ -font $xcFonts(small)] set def [button $frame(shininess).b -text "Default" -font $xcFonts(small) \ -command \ [list GetOpenGLPar _COLOR_STRUCTURE_SHININESS_ \ glModParam(material,shininess) dummy2 dummy3 dummy4 default]] pack $l -side top -fill x pack $sc -side top -fill y -expand 1 pack $def -side top -pady 3 # AMBIENT_BY_DIFFUSE factor: set glModParam(material,ambient_by_diffuse) [xc_getvalue $mody(D_AMBIENT_BY_DIFFUSE)] set frame(ambient_by_diffuse) [frame $page.abd -relief groove -bd 2] pack $frame(ambient_by_diffuse) -side top -fill x -padx 2 -pady 0 -ipady 3 -expand 1 set sc [scale $frame(ambient_by_diffuse).sc -from 0 -to 2.0 -length 300 \ -variable glModParam(material,ambient_by_diffuse) -orient horizontal \ -label "Ambient/Diffuse factor:" -resolution 0.01 \ -tickinterval 0.25 -digits 3 \ -showvalue true -width 7 -sliderlength 20] pack $sc -side top -fill x -padx 5 -pady 5 # # in bottom frame goes the "Close|Update" buttons # set bottom [frame $page.bottom] pack $bottom -side top -fill x -padx 3 -pady 3 set close [button $bottom.close -text "Close" -command [list CancelProc $t]] set update [button $bottom.update -text "Update" -command [list glModParam:Materials:Update]] pack $close $update -side left -padx 3 -pady 3 -ipadx 3 -ipady 3 -expand 1 } proc glModParam:Materials:Update {{t {}}} { global glModParam mody set emission [list $glModParam(material,emission_R) $glModParam(material,emission_G) \ $glModParam(material,emission_B) $glModParam(material,emission_A)] set specular [list $glModParam(material,specular_R) $glModParam(material,specular_G) \ $glModParam(material,specular_B) $glModParam(material,specular_A)] xc_setGLparam material -what structure \ -shininess $glModParam(material,shininess) \ -specular $specular \ -emission $emission xc_newvalue .mesa $mody(L_AMBIENT_BY_DIFFUSE) $glModParam(material,ambient_by_diffuse) # now render the changes .mesa render } # ------------------------------------------------------------------------ # # DEPTH-CUING properties # # ------------------------------------------------------------------------ proc glModParam:DepthCuing {t page {togl .mesa}} { global glModParam xcFonts mody # this must be the same as in struct.h set XC_FOG_BGCOLOR 0 set XC_FOG_CUSTOMCOLOR 1 set XC_FOG_LINEAR 2 set XC_FOG_EXP 3 set XC_FOG_EXP2 4 set glModParam(fog,mode) [xc_getvalue $mody(GET_FOG_MODE)] set glModParam(fog,colormode) [xc_getvalue $mody(GET_FOG_COLORMODE)] set glModParam(fog,density) [xc_getvalue $mody(GET_FOG_DENSITY)] set glModParam(fog,ort_start_f) [xc_getvalue $mody(GET_FOG_ORT_START_F)] set glModParam(fog,ort_end_f) [xc_getvalue $mody(GET_FOG_ORT_END_F)] set glModParam(fog,persp_f1) [xc_getvalue $mody(GET_FOG_PERSP_F1)] set glModParam(fog,persp_f2) [xc_getvalue $mody(GET_FOG_PERSP_F2)] #puts stderr "DEBUG> glModParam(fog,colormode) == $glModParam(fog,colormode)" #puts stderr "DEBUG> glModParam(fog,mode) == $glModParam(fog,mode)" if { $glModParam(fog,colormode) == $XC_FOG_BGCOLOR } { set glModParam(fog,colormode_txt) "use background color" } else { set glModParam(fog,colormode_txt) "use custom color" } if { $glModParam(fog,mode) == $XC_FOG_LINEAR } { set glModParam(fog,mode_txt) "Linear" } elseif { $glModParam(fog,mode) == $XC_FOG_EXP } { set glModParam(fog,mode_txt) "Exponential" } else { set glModParam(fog,mode_txt) "Gaussian" } foreach f {1 2} { set frame($f) [frame $page.$f -relief groove -bd 2] pack $frame($f) -side top -expand 1 -fill both -padx 3 -pady 3 } set f1l [frame $frame(1).left] set f1r [frame $frame(1).right -relief groove -bd 2] pack $f1l -side left -padx 3 -pady 3 -fill both pack $f1r -side right -padx 6 -pady 8 -fill y set sf [frame $f1l.stress -class StressText -relief groove -bd 2] set m [message $sf.m -justify left -anchor center -width 200 \ -text {Depth-Cuing, also known as fog, make objects fade into the distance.}] pack $sf -padx 5 -pady 5 -fill x pack $m -side top -expand 1 -fill x -padx 0 -pady 0 -ipadx 3 -ipady 3 set f1l1 [frame $f1l.1] set f1l2 [frame $f1l.2] pack $f1l1 $f1l2 -side top -fill x -pady 3 -padx 3 RadioBut $f1l1 "Fog color-mode:" glModParam(fog,colormode_txt) top top 1 0 \ "use background color" "use custom color" RadioBut $f1l2 "Fog mode:" glModParam(fog,mode_txt) top top 1 0 \ "Linear" "Exponential" "Gaussian" trace variable glModParam(fog,colormode_txt) w glModParam:DepthCuing:_widget trace variable glModParam(fog,mode_txt) w glModParam:DepthCuing:_widget #set m1 [xcMenuButton $f1l1 \ # -labeltext "Fog color mode:" \ # -labelwidth 15 \ # -side top \ # -textvariable glModParam(fog,colormode) \ # -menu { # "use background color" {glModParam:DepthCuing:Set colormode XC_FOG_BGCOLOR} # "use custom color" {glModParam:DepthCuing:Set colormode XC_FOG_CUSTOMCOLOR} # }] #set m2 [xcMenuButton $f1l2 \ # -labeltext "Fog mode:" \ # -labelwidth 15 \ # -textvariable glModParam(fog,mode) \ # -side top \ # -menu { # "Linear" {glModParam:DepthCuing:Set mode XC_FOG_LINEAR} # "Exponential" {glModParam:DepthCuing:Set mode XC_FOG_EXP} # "Gaussian" {glModParam:DepthCuing:Set mode XC_FOG_EXP2} # }] #pack $m1 $m2 -side top -padx 3 -expand 1 -fill x set fogcolor [xc_getGLparam fog -get fogcolor] set glModParam(fog,color_R) [lindex $fogcolor 0] set glModParam(fog,color_G) [lindex $fogcolor 1] set glModParam(fog,color_B) [lindex $fogcolor 2] set glModParam(fog,color_A) [lindex $fogcolor 3] set glModParam(fog,fogcolor_framewidget) $f1r setRGBAwidget $f1r "Fog color:" \ glModParam(fog,color_R) glModParam(fog,color_G) \ glModParam(fog,color_B) glModParam(fog,color_A) \ _FOG_FOGCOLOR_ set glModParam(fog,density_entrywidget) [FillEntries $frame(2) { "Fog DENSITY:" "Fog START factor (for Orthographic projection):" "Fog END factor (for Orthographic projection):" "Fog NEAR factor (for Perspective projection):" "Fog FAR factor (for Perspective projection):" } { glModParam(fog,density) glModParam(fog,ort_start_f) glModParam(fog,ort_end_f) glModParam(fog,persp_f1) glModParam(fog,persp_f2) } 40 10] #puts stderr "DEBUG> fog: [winfo exists $glModParam(fog,density_entrywidget)]" # # in bottom frame goes the "Close|Update" buttons # set bottom [frame $page.bottom] pack $bottom -side top -fill x -padx 3 -pady 3 set close [button $bottom.close -text "Close" -command [list CancelProc $t]] set update [button $bottom.update -text "Update" -command [list glModParam:DepthCuing:Update $togl]] pack $close $update -side left -padx 3 -pady 3 -ipadx 5 -ipady 5 -expand 1 glModParam:DepthCuing:_widget glModParam fog,colormode_txt init glModParam:DepthCuing:_widget glModParam fog,mode_txt init } proc glModParam:DepthCuing:_widget {name1 name2 op} { global glModParam regsub -- {1.entry1$} $glModParam(fog,density_entrywidget) {} core set start_entrywidget ${core}2.entry2 set end_entrywidget ${core}3.entry3 set near_entrywidget ${core}4.entry4 set far_entrywidget ${core}5.entry5 if { $name2 == "fog,colormode_txt" } { if { [winfo exists $glModParam(fog,fogcolor_framewidget)] } { if { $glModParam(fog,colormode_txt) == "use background color" } { xcDisableAll -disabledfg $glModParam(fog,fogcolor_framewidget) } else { # "use custom color" xcEnableAll -disabledfg $glModParam(fog,fogcolor_framewidget) } } } else { # *_entrywidget if { [winfo exists $glModParam(fog,density_entrywidget)] } { if { $glModParam(fog,mode_txt) == "Linear" } { xcDisableEntry $glModParam(fog,density_entrywidget) xcEnableEntry $start_entrywidget $end_entrywidget \ $near_entrywidget $far_entrywidget } else { xcEnableEntry $glModParam(fog,density_entrywidget) xcDisableEntry $start_entrywidget $end_entrywidget \ $near_entrywidget $far_entrywidget } } } } proc glModParam:DepthCuing:Update {togl} { global glModParam mody # this must be the same as in struct.h set XC_FOG_BGCOLOR 0 set XC_FOG_CUSTOMCOLOR 1 set XC_FOG_LINEAR 2 set XC_FOG_EXP 3 set XC_FOG_EXP2 4 # # FOG-COLOR mode # if { $glModParam(fog,colormode_txt) == "use background color" } { set glModParam(fog,colormode) $XC_FOG_BGCOLOR xcDisableAll $glModParam(fog,fogcolor_framewidget) } else { # "use custom color" set glModParam(fog,colormode) $XC_FOG_CUSTOMCOLOR set fogcolor [list $glModParam(fog,color_R) $glModParam(fog,color_G) \ $glModParam(fog,color_B) $glModParam(fog,color_A)] xcEnableAll $glModParam(fog,fogcolor_framewidget) xc_setGLparam fog -color $fogcolor } # # FOG-MODE # if { $glModParam(fog,mode_txt) == "Linear" } { set glModParam(fog,mode) $XC_FOG_LINEAR } elseif { $glModParam(fog,mode_txt) == "Exponential" } { set glModParam(fog,mode) $XC_FOG_EXP } else { # Gaussian set glModParam(fog,mode) $XC_FOG_EXP2 } if { ! [string is double $glModParam(fog,density) ] } { WarningDialog "wanted double, but got $glModParam(fog,density), for \"Fog DENSITY\"" return } if { ! [string is double $glModParam(fog,ort_start_f) ] } { WarningDialog "wanted double, but got $glModParam(fog,ort_start_f), for \"Fog START factor\"" return } if { ! [string is double $glModParam(fog,ort_end_f) ] } { WarningDialog "wanted double, but got $glModParam(fog,ort_end_f), for \"Fog END factor\"" return } if { ! [string is double $glModParam(fog,persp_f1) ] } { WarningDialog "wanted double, but got $glModParam(fog,persp_f1), for \"Fog NEAR factor\"" return } if { ! [string is double $glModParam(fog,persp_f2) ] } { WarningDialog "wanted double, but got $glModParam(fog,persp_f2), for \"Fog FAR factor\"" return } xc_newvalue $togl $mody(SET_FOG_MODE) $glModParam(fog,mode) xc_newvalue $togl $mody(SET_FOG_COLORMODE) $glModParam(fog,colormode) xc_newvalue $togl $mody(SET_FOG_DENSITY) $glModParam(fog,density) xc_newvalue $togl $mody(SET_FOG_ORT_START_F) $glModParam(fog,ort_start_f) xc_newvalue $togl $mody(SET_FOG_ORT_END_F) $glModParam(fog,ort_end_f) xc_newvalue $togl $mody(SET_FOG_PERSP_F1) $glModParam(fog,persp_f1) xc_newvalue $togl $mody(SET_FOG_PERSP_F2) $glModParam(fog,persp_f2) # now render the changes $togl render } # ------------------------------------------------------------------------ # # ANTI-ALIAS properties # # ------------------------------------------------------------------------ proc glModParam:AntiAlias {t page {togl .mesa}} { global glModParam mody set glModParam(antialias,degree) [xc_getvalue $mody(GET_ANTIALIAS_DEGREE)] set glModParam(antialias,offset) [xc_getvalue $mody(GET_ANTIALIAS_OFFSET)] set sf [frame $page.stress -class StressText -relief groove -bd 2] set m [message $sf.m -justify left -anchor center -width 300 \ -text {Here you can set the two parameters (degree & offset) for multi-sampling anti-aliasing, which is used for Lighting-On display mode. The degree of anti-aliasing determine the number of samplings (degree=1 --> 9 samplings; degree=2 --> 25 samplings, degree=3 --> 36 samplings, etc). The larger the degree the more time consuming the anti-aliasing. The multi-sampling is very time consuming, so its typical use is for printing.}] pack $sf -padx 3 -pady 3 -fill x pack $m -side top -expand 1 -fill x -padx 0 -pady 0 -ipadx 3 -ipady 3 foreach i {1 2} { set f($i) [frame $page.f$i -relief groove -bd 2] pack $f($i) -side top -fill x -padx 3 -pady 5 } set sc1 [scale $f(1).sc -from 1 -to 5 -length 300 \ -variable glModParam(antialias,degree) -orient horizontal \ -label "Degree of multi-sample Antialiasing:" -resolution 1 \ -tickinterval 1 -digits 1 \ -showvalue true -width 7 -sliderlength 20] set sc2 [scale $f(2).sc -from 0.01 -to 1.99 -length 300 \ -variable glModParam(antialias,offset) -orient horizontal \ -label "Offset for multi-sample Antialiasing:" -resolution 0.01 \ -tickinterval 0.25 -digits 3 \ -showvalue true -width 7 -sliderlength 20] pack $sc1 $sc2 -side top -fill y -expand 1 -padx 5 -pady 5 # # in bottom frame goes the "Close|Update" buttons # set bottom [frame $page.bottom] pack $bottom -side bottom -fill x -padx 3 -pady 3 set close [button $bottom.close -text "Close" -command [list CancelProc $t]] set update [button $bottom.update -text "Update" -command [list glModParam:AntiAlias:Update $togl]] pack $close $update -side left -padx 3 -pady 3 -ipadx 5 -ipady 5 -expand 1 } proc glModParam:AntiAlias:Update {togl} { global glModParam mody xc_newvalue $togl $mody(SET_ANTIALIAS_DEGREE) $glModParam(antialias,degree) xc_newvalue $togl $mody(SET_ANTIALIAS_OFFSET) $glModParam(antialias,offset) # now render the changes $togl render } xcrysden-1.6.2/Tcl/pwPreset.tcl0000644000175000017500000002657213515364357015142 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/pwPreset.tcl # # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc pwInputPreset {file} { global system pw # just for any case cd $system(SCRDIR) if { [file exists $system(SCRDIR)/nuclei.charges] } { file delete $system(SCRDIR)/nuclei.charges } #------------------------------------------------------------------------ # first scan the "file" and found the "ntyp" (i.e. number # of different atomic species) #------------------------------------------------------------------------ set f_content [ReadFile $file] set pw(ntyp) 0 set is_new_input 0 set is_old_input 0 foreach line [split $f_content \n] { foreach field [split $line ,] { if [string match -nocase *ntyp* $field] { set pw(ntyp) [lindex [split $field =] 1] break } } if { [string match -nocase *&input* $line] } { set is_old_input 1 } if { [string match -nocase *&system* $line] } { set is_new_input 1 } } if { $pw(ntyp) == 0 || (!$is_new_input && !$is_old_input) } { # the file is not PW-input file ErrorDialog "file \"[file tail $file]\" is not a PWSCF Input File !!!" CloseCase return 0 } if { $is_old_input } { set pw(input) old } elseif { $is_new_input } { set pw(input) new } uplevel 1 { pwPreset $file Input } return $pw(status) } proc pwOutputPreset {file} { global system pw # just for any case cd $system(SCRDIR) if { [file exists $system(SCRDIR)/nuclei.charges] } { file delete $system(SCRDIR)/nuclei.charges } #------------------------------------------------------------------------ # first scan the "file" and found the "number of atomic types" # (i.e. number of different atomic species) #------------------------------------------------------------------------ set pw(ntyp) 0 set pw(version) {} set fid [open $file r] while { ! [eof $fid] } { gets $fid line if { [string match "* Program PWSCF *" $line] } { # # get the PWscf version of the output # set ver [split [string trimleft [lindex $line 2] {v.}] .] set pw(version) [lindex $ver 0].[lindex $ver 1] if { [llength $ver] == 3 } { append pw(version) [lindex $ver 2] } xcDebug -stderr "PWSCF version of the output: $pw(version)" } if [string match {*number of atomic types*} $line] { set pw(ntyp) [lindex $line end] break } } close $fid if { $pw(ntyp) == 0 } { set pw(status) 0 # some older PWSCF versions didn't have "number of atomic # types" printout -> user will have to make nuclei.charges # file by himself/herself !!! # todo: "exec xterm" should in future be replaced by some Tcl Console if { [catch {exec \ xterm -geometry 80x15 \ -e $system(TOPDIR)/scripts/pwGetNC.sh output $file} \ errMsg] } { # the file is not PW-input file set id [tk_dialog [WidgetName] Error \ "ERROR: File \"[file tail $file]\" is not a PWSCF Output File !" error 0 OK {Error Info}] if { $id == 1 } { set t1 [xcDisplayVarText $errMsg {Error Info}] tkwait window $t1 } CloseCase return } set pw(status) 1 } else { uplevel 1 { pwPreset $file Output } } # # Query what user would like to do: -lc|-oc|-a # if { $pw(status) == 1 } { set t [xcToplevel [WidgetName] "Question" "Question"] set f [frame $t.f -class StressText] set l [label $t.f.l -text "What would you like to do:" \ -relief groove -bd 2] pack $f $l -side top -expand 1 -fill both \ -padx 5 -pady 5 -ipadx 3 -ipady 3 set pw(output_what) {Display Optimized Coordinates} RadioButtons $f pw(output_what) top \ {Display Initial Coordinates} \ {Display Optimized Coordinates} \ {Display Latest Coordinates} \ {Display All Coordinates as Animation} button $f.continue -text "Continue" \ -command [list pwOutputPresetWhat $t $file] \ -default active pack $f.continue -side top -expand 1 -padx 5 -pady 5 # # check which type of coordinates are present in the output # file (and enable only the corresponding radiobuttons) # # radiobuttons = $f.choices."digit": # 0 = initial # 1 = optimized # 2 = latest # 3 = anim set ctypes "initial" set ctypes [xcCatchExecReturn $system(awk) -f $system(AWKDIR)/pwo_coortype.awk $file] puts stderr "ctypes = $ctypes" if { [catch {set ctypes [exec $system(awk) -f $system(AWKDIR)/pwo_coortype.awk $file]}] } { ErrorDialog "error while executing \"pwo_coortype.awk\" program" return } if { ! [string match *init* $ctypes] } { $f.choices.0 configure -state disabled } else { set pw(output_what) {Display Initial Coordinates} } if { ! [string match *inter* $ctypes] } { if { ! [string match *opt* $ctypes] } { $f.choices.3 configure -state disabled } $f.choices.2 configure -state disabled } else { set pw(output_what) {Display Latest Coordinates} } if { [string match *dyna* $ctypes] } { set pw(output_what) {Display All Coordinates as Animation} } if { ! [string match *opt* $ctypes] } { $f.choices.1 configure -state disabled } else { set pw(output_what) {Display Optimized Coordinates} } tkwait window $t } return $pw(status) } proc pwOutputPresetWhat {t file} { global system pw openExtStruct if { [info exists pw(output_flag)] } { # calling pwOutputPresetWhat from scripting filter set flag $pw(output_flag) } else { if { $pw(output_what) == {Display Initial Coordinates} } { set flag {--inicoor} } elseif { $pw(output_what) == {Display Optimized Coordinates} } { set flag {--optcoor} } elseif [string match $pw(output_what) {Display Latest Coordinates}] { set flag {--latestcoor} } else { set flag {--animxsf} } } cd $system(SCRDIR) xcDebug -stderr "pwOutputPresetWhat: $system(TOPDIR)/scripts/pwo2xsf.sh $flag $file" set openExtStruct(program) [list sh $system(TOPDIR)/scripts/pwo2xsf.sh $flag] if { [xcCatchExec sh $system(TOPDIR)/scripts/pwo2xsf.sh $flag $file > pwo2xsf.xsf] } { CloseCase return } if { [winfo exists $t] } { destroy $t } } proc pwPreset {file {filetype {Input}}} { global system pw xcMisc #------------------------------------------------------------------------ # now ask user for ityp->nat replacement #------------------------------------------------------------------------ set grab [grab current] catch { grab release $grab } set t [xcToplevel [WidgetName] \ "PWscf $filetype: \"[file tail $file]\"" "PWSCF $filetype" . 0 0 1] set pw(disptext) [xcDisplayFileText $file \ "PWscf $filetype File: \"[file tail $file]\"" . 200 200 1] set f1 [frame $t.1] set f2 [frame $t.2] set f3 [frame $t.3] pack $f1 $f2 $f3 -side top -padx 10 -pady 10 -fill x if { ! [info exists pw(input)] } { set pw(input) none } if { ! [info exists pw(version)] } { set pw(version) 0.0 } if { $pw(input) != "new" && $pw(version) < 1.2 } { frame $f1.title -class StressText label $f1.title.l -text "Specify Atomic Numbers of Species" \ -relief groove -bd 2 $f1.title.l config -font [ModifyFontSize $f1.title.l 18] pack $f1.title -side top -expand 1 pack $f1.title.l -ipadx 10 -ipady 3 -padx 10 -pady 10 -expand 1 for {set i 0} {$i < $pw(ntyp)} {incr i} { set ii [expr $i + 1] set pw(ityp,$ii) $ii } set labellist [list "Atom type:" "Atomic Number:"] set arraylist [list ityp nat] set arraytype [list posint posint] set buttonlist [list 1 \ [list {Periodic Table} scroll_ptableSelectNAT $t pw nat]] ScrollEntries \ $f1 \ $pw(ntyp) \ "Set Atomic Number for Species #" \ $labellist \ $arraylist \ $arraytype \ 15 \ pw \ $buttonlist \ 3 update set width [winfo width $f1] } else { set width 400 } # old + new input set mf [frame $f2.f -class StressText -relief groove -bd 2] set m [message $mf.m -justify left -anchor e \ -width [expr $width - 25] -text {Multi-slab and Molecule-in-a-Box Note: If your structure is a so-called multi-slab model of the surface, then a nicer display is yielded if only a single slab is rendered. If you want to render multi-slab as a single slab, then select the "reduce dimension to 2D" radiobutton below. In case you have molecule-in-a-box then select the "reduce dimension to 0D" radiobutton below.}] set xcMisc(reduce_to) 3 set rb3 [radiobutton $mf.rb3 -text "do not reduce dimensionality" \ -variable xcMisc(reduce_to) -value 3] set rb2 [radiobutton $mf.rb2 -text "reduce dimension to 2D" \ -variable xcMisc(reduce_to) -value 2] set rb1 [radiobutton $mf.rb1 -text "reduce dimension to 1D" \ -variable xcMisc(reduce_to) -value 1] set rb0 [radiobutton $mf.rb0 -text "reduce dimension to 0D" \ -variable xcMisc(reduce_to) -value 0] pack $mf $m $rb3 $rb2 $rb1 $rb0 -side top -expand 1 -fill both \ -padx 5 -pady 5 -ipadx 3 -ipady 3 # OK and cancel button should be cerated as well set ok [button $f3.ok -text OK -command [list pwPresetOK $t] \ -default active] set can [button $f3.can -text Cancel -command [list pwPresetCan $t]] pack $can $ok -side left -expand 1 -padx 10 update if { [winfo exists $pw(disptext)] } { raise $pw(disptext) . raise $t $pw(disptext) } tkwait window $t if { $grab != "" } { catch { grab $grab } } } # # When OK button is preset, then "nuclei.charges" file should be written # to $system(SCRDIR) directory # proc pwPresetOK t { global varlist foclist pw system if { $pw(input) != "new" && $pw(version) < 1.2 } { # PWscf < 1.2 if { ![check_var $varlist $foclist] } { return 0 } # its seems OK; write the "nuclei.charges" file and destroy # the toplevel window set out "$pw(ntyp)\n" for {set i 1} {$i <= $pw(ntyp)} {incr i} { append out "$pw(ityp,$i) $pw(nat,$i)\n" } } else { # PWscf >= 1.2: we need 0 ityp->nat conversion set out 0 } # always write the nuclei.charges file (some workaround for PWscf # version 1.2) evalInScratch { WriteFile nuclei.charges $out w } destroy $t if { [winfo exists $pw(disptext)] } { destroy $pw(disptext) } set pw(status) 1 } proc pwPresetCan t { global pw system #################### # just in any case # cd $system(SCRDIR) #################### if [file exists nuclei.charges] { file delete nuclei.charges } destroy $t if { [winfo exists $pw(disptext)] } { destroy $pw(disptext) } set pw(status) 0 } xcrysden-1.6.2/Tcl/groups.tcl0000644000175000017500000004134111712736221014625 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/groups.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc point_group {} { global group_list set group_list [ list \ { 1: P 1 } \ { 2: P -1 } \ { 3: P 2 1 1 } \ { 4: P 1 2 1 } \ { 5: P 1 1 2 } \ { 6: P M 1 1 } \ { 7: P 1 M 1 } \ { 8: P 1 1 M } \ { 9: P 2/M 1 1 } \ { 10: P 1 2/M 1 } \ { 11: P 1 1 2/M } \ { 12: P 2 2 2 } \ { 13: P 2 M M } \ { 14: P M 2 M } \ { 15: P M M 2 } \ { 16: P M M M } \ { 17: P 4 } \ { 18: P -4 } \ { 19: P 4/M } \ { 20: P 4 2 2 } \ { 21: P 4 M M } \ { 22: P -4 2 M } \ { 23: P -4 M 2 } \ { 24: P 4/M M M } \ { 25: P 3 } \ { 26: P -3 } \ { 27: P 3 2 1 } \ { 28: P 3 1 2 } \ { 29: P 3 M 1 } \ { 30: P 3 1 M } \ { 31: P -3 M 1 } \ { 32: P -3 1 M } \ { 33: P 6 } \ { 34: P -6 } \ { 35: P 6/M } \ { 36: P 6 2 2 } \ { 37: P 6 M M } \ { 38: P -6 M 2 } \ { 39: P -6 2 M } \ { 40: P 6/M M M } \ { 41: P 2 3 } \ { 42: P M 3 } \ { 43: P 4 3 2 } \ { 44: P -4 3 M } \ { 45: P M 3 M } ] } proc line_group {} { global group_list set group_list [ list \ { 1: P 1 } \ { 2: P -1 } \ { 3: P 1 1 2 } \ { 4: P 1 1 21 } \ { 5: P 1 2 1 } \ { 6: P 2 1 1 } \ { 7: P 1 1 M } \ { 8: P 1 M 1 } \ { 9: P 1 C 1 } \ { 10: P M 1 1 } \ { 11: P C 1 1 } \ { 12: P 1 1 2/M } \ { 13: P 1 1 21/M } \ { 14: P 1 2/M 1 } \ { 15: P 1 2/C 1 } \ { 16: P 2/M 1 1 } \ { 17: P 2/C 1 1 } \ { 18: P 2 2 2 } \ { 19: P 2 2 21 } \ { 20: P M M 2 } \ { 21: P M C 21 } \ { 22: P C M 21 } \ { 23: P C C 2 } \ { 24: P M 2 M } \ { 25: P C 2 M } \ { 26: P 2 M M } \ { 27: P 2 C M } \ { 28: P M M M } \ { 29: P C C M } \ { 30: P C M M } \ { 31: P M C M } \ { 32: P 4 } \ { 33: P 41 } \ { 34: P 42 } \ { 35: P 43 } \ { 36: P -4 } \ { 37: P 4/M } \ { 38: P 42/M } \ { 39: P 4 2 2 } \ { 40: P 41 2 2 } \ { 41: P 42 2 2 } \ { 42: P 43 2 2 } \ { 43: P 4 M M } \ { 44: P 42 C M } \ { 45: P 4 C C } \ { 46: P 42 M C } \ { 47: P -4 2 M } \ { 48: P -4 2 C } \ { 49: P -4 M 2 } \ { 50: P -4 C 2 } \ { 51: P 4/M M M } \ { 52: P 4/M C C } \ { 53: P 42/M M C } \ { 54: P 42/M C M } \ { 55: P 3 } \ { 56: P 31 } \ { 57: P 32 } \ { 58: P -3 } \ { 59: P 3 1 2 } \ { 60: P 31 1 2 } \ { 61: P 32 1 2 } \ { 62: P 3 2 1 } \ { 63: P 31 2 1 } \ { 64: P 32 2 1 } \ { 65: P 3 M 1 } \ { 66: P 3 C 1 } \ { 67: P 3 1 M } \ { 68: P 3 1 C } \ { 69: P -3 1 M } \ { 70: P -3 1 C } \ { 71: P -3 M 1 } \ { 72: P -3 C 1 } \ { 73: P 6 } \ { 74: P 61 } \ { 75: P 65 } \ { 76: P 62 } \ { 77: P 64 } \ { 78: P 63 } \ { 79: P -6 } \ { 80: P 6/M } \ { 81: P 63/M } \ { 82: P 6 2 2 } \ { 83: P 61 2 2 } \ { 84: P 65 2 2 } \ { 85: P 62 2 2 } \ { 86: P 64 2 2 } \ { 87: P 63 2 2 } \ { 88: P 6 M M } \ { 89: P 6 C C } \ { 90: P 63 C M } \ { 91: P 63 M C } \ { 92: P -6 M 2 } \ { 93: P -6 C 2 } \ { 94: P -6 2 M } \ { 95: P -6 2 C } \ { 96: P 6/M M M } \ { 97: P 6/M C C } \ { 98: P 63/M C M } \ { 99: P 63/M M C } ] } proc plane_group {} { global group_list set group_list [ list \ { 1: P 1 } \ { 2: P -1 } \ { 3: P 1 1 2 } \ { 4: P 1 1 M } \ { 5: P 1 1 A } \ { 6: P 1 1 2/M } \ { 7: P 1 1 2/A } \ { 8: P 2 1 1 } \ { 9: P 21 1 1 } \ { 10: C 2 1 1 } \ { 11: P M 1 1 } \ { 12: P B 1 1 } \ { 13: C M 1 1 } \ { 14: P 2/M 1 1 } \ { 15: P 21/M 1 1 } \ { 16: C 2/M 1 1 } \ { 17: P 2/B 1 1 } \ { 18: P 21/B 1 1 } \ { 19: P 2 2 2 } \ { 20: P 2 21 2 } \ { 21: P 21 21 2 } \ { 22: C 2 2 2 } \ { 23: P M M 2 } \ { 24: P M A 2 } \ { 25: P B A 2 } \ { 26: C M M 2 } \ { 27: P 2 M M } \ { 28: P 21 A M } \ { 29: P 21 M A } \ { 30: P 2 M B } \ { 31: P 21 M N } \ { 32: P 2 A A } \ { 33: P 21 A B } \ { 34: P 2 A N } \ { 35: C 2 M M } \ { 36: C 2 M B } \ { 37: P M M M } \ { 38: P M A M } \ { 39: P M M A } \ { 40: P M M N } \ { 41: P B A M } \ { 42: P M A A } \ { 43: P M A N } \ { 44: P B M A } \ { 45: P B A A } \ { 46: P B A N } \ { 47: C M M M } \ { 48: C M M A } \ { 49: P 4 } \ { 50: P -4 } \ { 51: P 4/M } \ { 52: P 4/N } \ { 53: P 4 2 2 } \ { 54: P 4 21 2 } \ { 55: P 4 M M } \ { 56: P 4 B M } \ { 57: P -4 2 M } \ { 58: P -4 21 M } \ { 59: P -4 M 2 } \ { 60: P -4 B 2 } \ { 61: P 4/M M M } \ { 62: P 4/N B M } \ { 63: P 4/M B M } \ { 64: P 4/N M M } \ { 65: P 3 } \ { 66: P -3 } \ { 67: P 3 1 2 } \ { 68: P 3 2 1 } \ { 69: P 3 M 1 } \ { 70: P 3 1 M } \ { 71: P -3 1 M } \ { 72: P -3 M 1 } \ { 73: P 6 } \ { 74: P -6 } \ { 75: P 6/M } \ { 76: P 6 2 2 } \ { 77: P 6 M M } \ { 78: P -6 M 2 } \ { 79: P -6 2 M } \ { 80: P 6/M M M } ] } proc space_group {} { global group_list set group_list [ list \ { 1: P 1 } \ { 2: P -1 } \ { 3: P 2 } \ { 4: P 21 } \ { 5: C 2 } \ { 6: P M } \ { 7: P C } \ { 8: C M } \ { 9: C C } \ { 10: P 2/M } \ { 11: P 21/M } \ { 12: C 2/M } \ { 13: P 2/C } \ { 14: P 21/C } \ { 15: C 2/C } \ { 16: P 2 2 2 } \ { 17: P 2 2 21 } \ { 18: P 21 21 2 } \ { 19: P 21 21 21 } \ { 20: C 2 2 21 } \ { 21: C 2 2 2 } \ { 22: F 2 2 2 } \ { 23: I 2 2 2 } \ { 24: I 21 21 21 } \ { 25: P M M 2 } \ { 26: P M C 21 } \ { 27: P C C 2 } \ { 28: P M A 2 } \ { 29: P C A 21 } \ { 30: P N C 2 } \ { 31: P M N 21 } \ { 32: P B A 2 } \ { 33: P N A 21 } \ { 34: P N N 2 } \ { 35: C M M 2 } \ { 36: C M C 21 } \ { 37: C C C 2 } \ { 38: A M M 2 } \ { 39: A B M 2 } \ { 40: A M A 2 } \ { 41: A B A 2 } \ { 42: F M M 2 } \ { 43: F D D 2 } \ { 44: I M M 2 } \ { 45: I B A 2 } \ { 46: I M A 2 } \ { 47: P M M M } \ { 48: P N N N } \ { 49: P C C M } \ { 50: P B A N } \ { 51: P M M A } \ { 52: P N N A } \ { 53: P M N A } \ { 54: P C C A } \ { 55: P B A M } \ { 56: P C C N } \ { 57: P B C M } \ { 58: P N N M } \ { 59: P M M N } \ { 60: P B C N } \ { 61: P B C A } \ { 62: P N M A } \ { 63: C M C M } \ { 64: C M C A } \ { 65: C M M M } \ { 66: C C C M } \ { 67: C M M A } \ { 68: C C C A } \ { 69: F M M M } \ { 70: F D D D } \ { 71: I M M M } \ { 72: I B A M } \ { 73: I B C A } \ { 74: I M M A } \ { 75: P 4 } \ { 76: P 41 } \ { 77: P 42 } \ { 78: P 43 } \ { 79: I 4 } \ { 80: I 41 } \ { 81: P -4 } \ { 82: I -4 } \ { 83: P 4/M } \ { 84: P 42/M } \ { 85: P 4/N } \ { 86: P 42/N } \ { 87: I 4/M } \ { 88: I 41/A } \ { 89: P 4 2 2 } \ { 90: P 4 21 2 } \ { 91: P 41 2 2 } \ { 92: P 41 21 2 } \ { 93: P 42 2 2 } \ { 94: P 42 21 2 } \ { 95: P 43 2 2 } \ { 96: P 43 21 2 } \ { 97: I 4 2 2 } \ { 98: I 41 2 2 } \ { 99: P 4 M M } \ {100: P 4 B M } \ {101: P 42 C M } \ {102: P 42 N M } \ {103: P 4 C C } \ {104: P 4 N C } \ {105: P 42 M C } \ {106: P 42 B C } \ {107: I 4 M M } \ {108: I 4 C M } \ {109: I 41 M D } \ {110: I 41 C D } \ {111: P -4 2 M } \ {112: P -4 2 C } \ {113: P -4 21 M } \ {114: P -4 21 C } \ {115: P -4 M 2 } \ {116: P -4 C 2 } \ {117: P -4 B 2 } \ {118: P -4 N 2 } \ {119: I -4 M 2 } \ {120: I -4 C 2 } \ {121: I -4 2 M } \ {122: I -4 2 D } \ {123: P 4/M M M } \ {124: P 4/M C C } \ {125: P 4/N B M } \ {126: P 4/N N C } \ {127: P 4/M B M } \ {128: P 4/M N C } \ {129: P 4/N M M } \ {130: P 4/N C C } \ {131: P 42/M M C } \ {132: P 42/M C M } \ {133: P 42/N B C } \ {134: P 42/N N M } \ {135: P 42/M B C } \ {136: P 42/M N M } \ {137: P 42/N M C } \ {138: P 42/N C M } \ {139: I 4/M M M } \ {140: I 4/M C M } \ {141: I 41/A M D } \ {142: I 41/A C D } \ {143: P 3 } \ {144: P 31 } \ {145: P 32 } \ {146: R 3 } \ {147: P -3 } \ {148: R -3 } \ {149: P 3 1 2 } \ {150: P 3 2 1 } \ {151: P 31 1 2 } \ {152: P 31 2 1 } \ {153: P 32 1 2 } \ {154: P 32 2 1 } \ {155: R 3 2 } \ {156: P 3 M 1 } \ {157: P 3 1 M } \ {158: P 3 C 1 } \ {159: P 3 1 C } \ {160: R 3 M } \ {161: R 3 C } \ {162: P -3 1 M } \ {163: P -3 1 C } \ {164: P -3 M 1 } \ {165: P -3 C 1 } \ {166: R -3 M } \ {167: R -3 C } \ {168: P 6 } \ {169: P 61 } \ {170: P 65 } \ {171: P 62 } \ {172: P 64 } \ {173: P 63 } \ {174: P -6 } \ {175: P 6/M } \ {176: P 63/M } \ {177: P 6 2 2 } \ {178: P 61 2 2 } \ {179: P 65 2 2 } \ {180: P 62 2 2 } \ {181: P 64 2 2 } \ {182: P 63 2 2 } \ {183: P 6 M M } \ {184: P 6 C C } \ {185: P 63 C M } \ {186: P 63 M C } \ {187: P -6 M 2 } \ {188: P -6 C 2 } \ {189: P -6 2 M } \ {190: P -6 2 C } \ {191: P 6/M M M } \ {192: P 6/M C C } \ {193: P 63/M C M } \ {194: P 63/M M C } \ {195: P 2 3 } \ {196: F 2 3 } \ {197: I 2 3 } \ {198: P 21 3 } \ {199: I 21 3 } \ {200: P M 3 } \ {201: P N 3 } \ {202: F M 3 } \ {203: F D 3 } \ {204: I M 3 } \ {205: P A 3 } \ {206: I A 3 } \ {207: P 4 3 2 } \ {208: P 42 3 2 } \ {209: F 4 3 2 } \ {210: F 41 3 2 } \ {211: I 4 3 2 } \ {212: P 43 3 2 } \ {213: P 41 3 2 } \ {214: I 41 3 2 } \ {215: P -4 3 M } \ {216: F -4 3 M } \ {217: I -4 3 M } \ {218: P -4 3 N } \ {219: F -4 3 C } \ {220: I -4 3 D } \ {221: P M 3 M } \ {222: P N 3 N } \ {223: P M 3 N } \ {224: P N 3 M } \ {225: F M 3 M } \ {226: F M 3 C } \ {227: F D 3 M } \ {228: F D 3 C } \ {229: I M 3 M } \ {230: I A 3 D } ] } xcrysden-1.6.2/Tcl/sizes.tcl0000644000175000017500000001074111712736221014443 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/sizes.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc ProbeResolution {} { global xcMisc xcFonts set w [winfo screenwidth .] set h [winfo screenheight .] # Debugging: testing different screen resolutions: #------------------------------------------------- #set w 800 #set h 600 set xcMisc(resolution) ${w}x${h} set xcMisc(resolutionX) $w set xcMisc(resolutionY) $h set xcMisc(resolution_ratio1) 1.0 set xcMisc(resolution_ratio2) 1.0 set xcFonts(normal_size) [font actual TkDefaultFont -size] set xcFonts(small_size) [expr $xcFonts(normal_size) - 2] set xcFonts(big_size) [expr $xcFonts(normal_size) + 2] set xcMisc(resolution_ratio1) 0.65 set xcMisc(resolution_ratio2) 0.75 if { $xcMisc(resolutionX) > 700 } { set xcMisc(resolution_ratio1) 0.75 set xcMisc(resolution_ratio2) 0.85 } if { $xcMisc(resolutionX) > 1000 } { set xcMisc(resolution_ratio1) 0.9 set xcMisc(resolution_ratio2) 1.0 } if { $xcMisc(resolutionX) > 1200 } { set xcMisc(resolution_ratio1) 1.0 set xcMisc(resolution_ratio2) 1.0 } # # now set the default fonts # foreach widclass { {button Button} {checkbutton Checkbutton} {entry Entry} {label Label} {listbox Listbox} {menu Menu} {menubutton Menubutton} {message Message} {radiobutton Radiobutton} {scale Scale} {text Text}} { set widget [lindex $widclass 0] set class [lindex $widclass 1] $widget .test_widget set font \ [ModifyFont [.test_widget cget -font] .test_widget \ -size $xcFonts(normal_size) -default 1] ############################################### if { $xcMisc(resolutionX) < 1000 } { option add *$class.font $font interactive } ############################################### if { $widget == "button" } { set xcFonts(normal) $font set xcFonts(small) [ModifyFont [.test_widget cget -font] .test_widget \ -size $xcFonts(small_size) -default 1] set xcFonts(big) [ModifyFont [.test_widget cget -font] .test_widget \ -size $xcFonts(big_size) -default 1] } elseif { $widget == "entry" } { set xcFonts(normal_entry) $font set xcFonts(small_entry) \ [ModifyFont [.test_widget cget -font] .test_widget \ -size $xcFonts(small_size) -default 1] } destroy .test_widget } # configure the balloon help if { [info commands "DynamicHelp::configure"] != "" } { DynamicHelp::configure -delay 100 -font $xcFonts(normal) } xcDebug "Taking settings for $xcMisc(resolution) screen-resolution !!!" xcDebug "-------------------" xcDebug "Small Font Size set to: $xcFonts(small_size)" xcDebug "Normal Font Size set to: $xcFonts(normal_size)" #xcDebug "Big Font Size set to:" } proc SetImageSizes {} { global xcMisc foreach image $xcMisc(rescale_image_list) { set h [image height $image] set w [image width $image] #xcDebug "h=$h" set f $xcMisc(resolution_ratio2) if { $f < 0.75 } { set f 0.75 } set hs [expr round( $h * $f )] set ws [expr round( $w * $f )] set x1 [expr {($w - $ws)/2}] set y1 [expr {($h - $hs)/2}] set x2 [expr {($w - $x1)}] set y2 [expr {($h - $y1)}] image create photo swap_image -width $ws -height $hs swap_image copy $image -from $x1 $y1 $x2 $y2 $image blank $image configure -height $hs -width $ws $image copy swap_image image delete swap_image #$image configure -height $hs -width $ws # debugging only #xcDebug "Image dim:: ${w}x$h" #button .$image -image $image -anchor center #pack .$image -side left } } xcrysden-1.6.2/Tcl/go2crys.tcl0000644000175000017500000002340413514607315014701 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/go2crys.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # calculate & display STRUCTURE proc CalStru {} { global nxdir nydir nzdir n_groupsel system periodic geng inp \ n_groupsel groupsel err species xcDebug -debug "IN CalStru" if { $species == "external" } { set groupsel "P 1" set n_groupsel 1 set inp(IFLAG) 0 } else { if { ![info exists inp(IGR)] } { set inp(IGR) $n_groupsel } if { ![info exists inp(AGR)] } { set inp(AGR) $groupsel } } # update xcState xcUpdateState set geoInput [MakeInput] xcDebug -debug "CRYSTAL INPUT:\n $geoInput" xcDebug -debug "NXDIR NYDIR NZDIR: $nxdir $nydir $nzdir" if { ! [RunC95 $system(c95_integrals) {} $geoInput] } { return 0 } # workaround of crystal-bug in EXTPRT (it prints number-of-atoms only up to 999 atoms, and then ***) if { $species == "external" } { file copy -force $system(SCRDIR)/external_unit34 $system(SCRDIR)/$system(ftn_name).34 } # usage of "gengeom" program: # # gengeom MODE1 MODE2 MODE3 IGRP NXDIR NYDIR NZDIR OUTPUT INPUT # 0 1 2 3 4 5 6 7 8 9 # # FIND FROM UNIT34 THE DIMENSIONALITY OF THE SYSTEM cd $system(SCRDIR) GenGeom $geng(M1_INFO) 1 $geng(M3_ARGUMENT) 1 1 1 1 $system(SCRDIR)/xc_gengeom.$system(PID) #xcCatchExecReturn $system(BINDIR)/gengeom $geng(M1_INFO) 1 $geng(M3_ARGUMENT) 1 1 1 1 $system(SCRDIR)/xc_gengeom.$system(PID) set fileID [open "$system(SCRDIR)/xc_gengeom.$system(PID)" r] GetDimGroup periodic(dim) periodic(igroup) $fileID close $fileID if { $periodic(dim) == 3 && $nzdir == 0 } { # this can happen for "EXTERNAL" set nzdir 1 } # in periodic(dim) != 3 than updata (nxdir,nydir,nzdir) if { $periodic(dim) <= 2 } { set nzdir 0 } if { $periodic(dim) <= 1 } { set nydir 0 } if { $periodic(dim) == 0 } { set nxdir 0 # try this: due to problem reported by Klauss Doll GenGeom $geng(M1_PRIM) 1 $geng(M3_ARGUMENT) 1 1 1 1 $system(SCRDIR)/xc_struc.$system(PID) } #exec rm -f $system(SCRDIR)/xc_tmp.$system(PID) xcDebug -debug "GENGEOM>> dim igroup:: $periodic(dim) $periodic(igroup)" if { $periodic(dim) == 3 } { # take special care of hexagonal and trigonal systems if { $periodic(igroup) == 1 } { # group can still be trigonal or hexagonal if { $inp(IFLAG) == 0 } { if { $n_groupsel >= 143 && $n_groupsel < 168 } { set periodic(igroup) $geng(IGRP_TRIG) } if { $n_groupsel >= 168 && $n_groupsel < 195 } { set periodic(igroup) $geng(IGRP_HEXA) } } else { set tt [lindex $inp(AGR) 1] if { [string match "3*" $tt] || [string match "-3*" $tt] } { set periodic(igroup) $geng(IGRP_TRIG) } if { [string match "6*" $tt] || [string match "-6*" $tt] } { set periodic(igroup) $geng(IGRP_HEXA) } } } } puts stdout "igroup:: $periodic(igroup)" flush stdout if { [xcIsActive render] } { # CellMode will do all the job GenGeomDisplay 1 } else { GenGeomDisplay OpenXSFStruct .mesa $system(SCRDIR)/xc_struc.$system(PID) } CrysFrames return 1 } proc MakeInput {} { global job_title n_groupsel groupsel species speciesName \ periodic inp AdvGeom H K L ISUP NL nxdir nydir nzdir mode \ cxx # $save is used by SaveCrystalInput proc if { ! [info exists cxx(inputContent)] } { # JOB TITLE if { $job_title == "" } { set job_title "Input file constructed by XCrySDen" } set geoInput "$job_title\n" # SPECIES append geoInput [string toupper $species\n] if { $species != "external" } { # GEOM-SYMM input for CRYSTAL if { $species == "crystal" } { # RECORD: IFLAG IFHR IFSO append geoInput "$inp(IFLAG) $inp(IFHR) $inp(IFSO)\n" # RECORD: IGR if { $inp(IFLAG) == 0 } { append geoInput "$n_groupsel\n" } else { append geoInput "$groupsel\n" } puts stdout "#################GROUPSEL:: $groupsel" if { $inp(IFSO) > 1 } { append geoInput "$inp(IX) $inp(IY) $inp(IZ)\n" } } if { $species != "crystal" } { append geoInput "$n_groupsel\n" } if { $species != "molecule" } { # RECORD: min. set of crystall. par. xcDebug "inp(A) = $inp(A)" SetUnDefPar append geoInput "$inp(A) $inp(B) $inp(C) \ $inp(ALFA) $inp(BETA) $inp(GAMMA)\n" } # NATR & Nst X Y Z append geoInput "$inp(NATR)\n" for {set i 1} {$i <= $inp(NATR)} {incr i} { append geoInput "$inp(NAT,$i) $inp(X,$i) $inp(Y,$i) $inp(Z,$i)\n" } if [info exists speciesName] { set spec $speciesName } else { set spec $species } # take care of (nxdir,nydir,nzdir) if { $spec == "crystal" } { if { $nxdir == 0 } { set nxdir 1 } if { $nydir == 0 } { set nydir 1 } if { $nzdir == 0 } { set nzdir 1 } set periodic(dim) 3 } if { $spec == "slab" } { if { $nxdir == 0 } { set nxdir 1 } if { $nydir == 0 } { set nydir 1 } set periodic(dim) 2 set nzdir 0 } if { $spec == "polymer" } { if { $nxdir == 0 } { set nxdir 1 } set periodic(dim) 1 set nydir 0 set nzdir 0 } if { $spec == "molecule" } { set periodic(dim) 0 set nxdir 0 set nydir 0 set nzdir 0 } } } else { set geoInput $cxx(inputContent) } ############################### # ADVANCE GEOMETRICAL OPTIONS # ############################### # check first if there is $AdvGeom(input) present if [info exists AdvGeom(input)] { append geoInput $AdvGeom(input) } # does user already make some AdvGeom set na [xcAdvGeomState current] xcDebug "\n\n ADV_GEOM ARRAY NAMES:: [array names AdvGeom *] $na\n\n" for {set i 1} {$i <= $na} {incr i} { if [info exists AdvGeom($i,rotate)] { ########## # ROTATE # ########## xcDebug -debug "ROTATE OPTION" # fisrt puts symm flag append geoInput "$AdvGeom($i,rotate)" } if [info exists AdvGeom($i,superCell)] { ############# # SUPERCELL # ############# xcDebug -debug "SUPERCELL OPTION" # fisrt puts symm flag append geoInput "$AdvGeom($i,superCell)" } if [info exists AdvGeom($i,elastic)] { ########### # ELASTIC # ########### xcDebug -debug "ELASTIC OPTION" # fisrt puts symm flag append geoInput "$AdvGeom($i,elastic)" } if [info exists AdvGeom($i,atomRemo)] { ############ # ATOMREMO # ############ xcDebug -debug "ATOMREMO OPTION" # fisrt puts symm flag append geoInput "$AdvGeom($i,atomRemo)" } if [info exists AdvGeom($i,atomSub)] { ############ # ATOMSUBS # ############ xcDebug -debug "ATOMSUBS OPTION:: $AdvGeom($i,atomSub)" # fisrt puts symm flag append geoInput "$AdvGeom($i,atomSub)" } if [info exists AdvGeom($i,atomInse)] { ############ # ATOMINSE # ############ xcDebug -debug "ATOMINSE OPTION:: $AdvGeom($i,atomInse)" # fisrt puts symm flag append geoInput "$AdvGeom($i,atomInse)" } if [info exists AdvGeom($i,atomDisp)] { ############ # ATOMDISP # ############ xcDebug -debug "ATOMDISP OPTION:: $AdvGeom($i,atomDisp)" # fisrt puts symm flag append geoInput "$AdvGeom($i,atomDisp)" } if [info exists AdvGeom($i,slab)] { ######## # SLAB # ######## xcDebug -debug "SLAB OPTION" append geoInput "SLAB\n" append geoInput "$AdvGeom($i,slab)" # we are going from crystal --> slab so nzdir must be 0 set nzdir 0 set periodic(dim) 2 } if [info exists AdvGeom($i,cluster)] { ########### # CLUSTER # ########### xcDebug -debug "CLUSTER OPTION" append geoInput "CLUSTER\n" append geoInput "$AdvGeom($i,cluster)" set periodic(dim) 0 } if [info exists AdvGeom($i,option)] { ################# # manual Option # ################# xcDebug -debug "MANUAL OPTION" append geoInput "$AdvGeom($i,option)" } if [info exists AdvGeom($i,edit)] { ############### # manual EDIT # ############### xcDebug -debug "MANUAL EDIT" # this option is different, as the $AdvGeom($i,edit) holds # the whole input !!! set geoInput "$AdvGeom($i,edit)" } } # next line is experimental !!! xcUpdateState # handle correctly the EXTPRT/COORPRT/STOP keywords set geoInput [cxxHandleEXTPRT $geoInput] # debug:: global periodic xcDebug -debug "dim= $periodic(dim), species= $species" return $geoInput } proc SetUnDefPar {} { global inp # proc 'set' undefined parameters if ![info exists inp(A)] {set inp(A) {}} if ![info exists inp(B)] {set inp(B) {}} if ![info exists inp(C)] {set inp(C) {}} if ![info exists inp(ALFA)] {set inp(ALFA) {}} if ![info exists inp(BETA)] {set inp(BETA) {}} if ![info exists inp(GAMMA)] {set inp(GAMMA) {}} } xcrysden-1.6.2/Tcl/Viewer.tcl0000644000175000017500000011424213533241056014550 0ustar tonetone############################################################################ # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/Viewer.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # # ------ # # Modified by Eric Verfaillie ericverfaillie@yahoo.fr EV # # may 2004 # ############################################################################# proc ViewMol {top {file {}} } { global light mode2D widsize maingeom fileselect style3D radio xcMisc system \ dispmode xcFonts if { [winfo exists .mesa] } { return } set top . wm title $top "XCrySDen" wm iconname $top "XCrySDen" #wm geometry $top +100+100 # --------------- # INITIALIZATIONS # --------------- set fac1 $xcMisc(resolution_ratio1) set fac2 $xcMisc(resolution_ratio2) set widsize(conW) [expr round(130 * $fac2)] set widsize(menH) [expr round(35 * $fac1)] set widsize(meaH) [expr round(35 * $fac1)] # make a global widget arrangement, that is menu, mesawin, control & mea PlaceGlobWin 0 [expr round(670 * $fac1)] [expr round(670 * $fac1)] #if { [winfo exists .title] } { #wm deiconify . #} catch {wm deiconify .} focus $top #tkwait visibility .mesa # # create Menubar # ViewMolMenu .menu .mesa # # bindings # bind $top { exit_pr } bind $top { maximizeDisplay on } bind $top { ResizeGlobWin } bind .mesa { maximizeDisplay on } bind .mesa { bindCB {xc_B1motion .mesa %x %y }} bind .mesa { bindCB {xc_B2motion .mesa %x %y }} bind .mesa { bindCB {xc_Brelease .mesa B1}; MouseZoomBrelease %W } bind .mesa { bindCB {xc_Brelease .mesa B2}; ResetCursor; } bind .mesa { popupMenu %W %X %Y } bind .mesa { MouseZoom %W %X %Y } bind .mesa { MouseZoomBrelease %W } global tcl_platform if { $tcl_platform(platform) == "unix" } { bind .mesa { MouseWheelZoom %W + } bind .mesa { MouseWheelZoom %W - } } else { bind . { WindowsMouseWheel .mesa %D } } # ------------------------------------------------------------------------ # CONTROL FRAME # ------------------------------------------------------------------------ # Control Frame will consist from more frames, such as: # special frame for DisplayModes, special frame for Translation, Rotation, # etc. # ------------------------------------------------------------------------ set c [canvas .ctrl.c -yscrollcommand [list .ctrl.s set]] scrollbar .ctrl.s -width 8 -orient vertical -command [list .ctrl.c yview] pack .ctrl.s -side right -fill y pack .ctrl.c -side left -expand 1 # here get the requested width of scrollbar set widsize(scrW) [winfo reqwidth .ctrl.s] set widsize(canW) [expr round(130 * $fac2) - $widsize(scrW) + 1] # create FRAME to hold every LABEL&ENTRY set fc [frame .ctrl.c.f -bd 0 -width $widsize(canW)] $c create window 0 0 -anchor nw -window $fc -width $widsize(canW) \ -tags frame # define various frames for above reason set f1 [frame $fc.fr1 -relief raised -bd 1] set f2 [frame $fc.fr2 -relief raised -bd 1 -class ctrl] set f3 [frame $fc.fr3 -relief raised -bd 1] # miscellaneous images image create photo ak -format gif -file $system(BMPDIR)/xcrysden_big.gif set fdummy [button $fc.fdummy -image ak -relief ridge -bd 4 \ -anchor center -height 100 -command xcAbout] # ------------------------------------------------------------------------ # FRAME #1 for translation # ------------------------------------------------------------------------ ViewMolFrame1 $f1 # ------------------------------------------------------------------------ # FRAME #2 for rotation # ------------------------------------------------------------------------ ViewMolFrame2 $f2 pack $f1 $f2 -side top -fill x -padx 0 -pady 0 \ -ipadx 2 -ipady 2 pack $f3 -side top -fill both -expand 1 -padx 0 -pady 0 \ -ipadx 2 -ipady 2 pack $fdummy -side bottom -fill both -expand 1 # ------------------------------------------------------------------------ # FRAME #3 for DISPLAYMODES # do we want Lighting (3D or 2D DisplayModes) # ------------------------------------------------------------------------ set f31 [frame $f3.1 -class Radios] set f32 [frame $f3.2 -class Radios] set light On #canvas $f3.canv -width $widsize(conW) canvas $f3.canv pack $f31 $f32 -side top -fill x -expand 1 pack $f3.canv -side top -expand 1 set dispmode(mode3D_f2_packinfo) [pack info $f32] tkwait visibility $f3.canv set rs [RadioButCmd $f31 "Lighting:" light Lighting top left 1 1 5 "On" "Off"] foreach r [lrange $rs 1 end] { #$r config -indicatoron 0 -font $xcFonts(small) $r config -indicatoron 0 pack configure $r -padx 1 -pady 3 -ipadx 5 -ipady 1 -fill x -expand 1 } #Lighting On #$f3.canv configure -height [winfo reqwidth $f3.canv] # ------------------------------------------------------------------------ # CONTROL FRAME - END - END - END - END - END - END - END - END # ======================================================================== # ------------------------------------------------------------------------ # CLOSE FRAME # ------------------------------------------------------------------------ set maingeom "Maxi" set b0 [button .close.0 -text "F" -width 1 -command maximizeDisplay] set b1 [button .close.1 -textvariable maingeom -width 3 -command MainGeom] set b2 [button .close.2 -text "Exit" -width 3 -command exit_pr] pack $b0 $b1 $b2 -side left -padx 0 -pady 0 -ipadx 0 -ipady 0 -expand 1 -fill x set mode2D(WF) On set mode2D(PL) Off set mode2D(BS1) Off set mode2D(BS2) Off # ------------------------------------------------------------------------ # MEASURE FRAME # ------------------------------------------------------------------------ set meaF [frame .mea.f1 -relief ridge -bd 2 -class mea] set atmi [button $meaF.ainf \ -highlightthickness 1 -text "Atoms Info" -command \ [list PreSel .sel_dist .mesa "Atoms Info" \ "For \"Atom Info\" click on the atom" AtomInfo 20]] set flbd [button $meaF.dis \ -highlightthickness 1 -text "Distance" -command \ [list PreSel .sel_dist .mesa "Distance" \ "For \"Distance\" click on two atoms" Distance 2]] set flba [button $meaF.ang \ -highlightthickness 1 -text "Angle" -command \ [list PreSel .sel_dist .mesa "Angle" \ "For \"Angle\" click on three atoms" Angle 3]] set flbdi [button $meaF.dih \ -highlightthickness 1 -text "Dihedral" -command \ [list PreSel .sel_dist .mesa "Dihedral" \ "For \"Dihedral\" click on four atoms" Dihedral 4]] #set flbp [button $meaF.pln \ # -highlightthickness 0 -text "Plane" -command \ # [list PreSel .sel_plane .mesa "Plane" \ # "For \"Plane\" click on three atoms" Plane 3]] #$flbp config -state disabled set style3D(draw) "solid" set style3D(shade) "smooth" set style3D(anaglyph) 0 set style3D(stereo) 1 set style3D(point) "1" set modl [frame .mea.f2 -relief raised -bd 1] set r_solid [radiobutton $modl.solid -image dm_solid -highlightthickness 1 \ -variable style3D(draw) -value solid -indicatoron 0 \ -selectcolor \#ff2222 -anchor center \ -command [list Style3D draw solid]] set r_wire [radiobutton $modl.wire -image dm_wire -highlightthickness 1 \ -variable style3D(draw) -value wire -indicatoron 0 \ -selectcolor \#ff2222 -anchor center \ -command [list Style3D draw wire]] set r_anaglyph [checkbutton $modl.anaglyph -image dm_anaglyph -highlightthickness 1 \ -variable style3D(anaglyph) -indicatoron 0 \ -selectcolor \#4444ff -anchor center \ -command [list Style3D draw anaglyph]] set r_stereo [checkbutton $modl.stereo -image dm_stereo -highlightthickness 1 \ -variable style3D(stereo) -indicatoron 0 \ -selectcolor \#4444ff -anchor center \ -command [list Style3D draw stereo]] set separator_1 [frame $modl.s1 -width 2 -relief raised -bd 1] set separator_2 [frame $modl.s2 -width 2 -relief raised -bd 1] set separator_3 [frame $modl.s3 -width 2 -relief raised -bd 1] set r_smooth [radiobutton $modl.smooth -image dm_smooth -highlightthickness 1 \ -variable style3D(shade) -value smooth -indicatoron 0 \ -selectcolor \#44ff44 -anchor center \ -command [list Style3D shade smooth]] set r_flat [radiobutton $modl.flat -image dm_flat -highlightthickness 1 \ -variable style3D(shade) -value flat -indicatoron 0 \ -selectcolor \#44ff44 -anchor center \ -command [list Style3D shade flat]] set rep_unit [radiobutton $modl.unit -image rep_unit -highlightthickness 1 \ -variable radio(unitrep) -value "cell" -indicatoron 0 \ -selectcolor \#4444ff -anchor center \ -command [list CellMode 1]] set rep_asym [radiobutton $modl.asym -image rep_asym -highlightthickness 1 \ -variable radio(unitrep) -value "asym" -indicatoron 0 \ -selectcolor \#4444ff -anchor center \ -command [list CellMode 1]] # reload button set separator_4 [frame $modl.s4 -width 2 -relief raised -bd 1] set b_reload [button $modl.reload -text "Reload" -command reloadCmd] set b_pack_option {-side left -fill y -padx 0 -pady 0 -ipadx 0 -ipady 0} set s_pack_option {-side left -fill y -padx 2 -pady 0 -ipadx 0 -ipady 0} eval pack $separator_1 $s_pack_option eval pack $rep_unit $rep_asym $b_pack_option eval pack $separator_2 $s_pack_option eval pack $r_solid $r_wire $r_anaglyph $b_pack_option ; #$r_stereo eval pack $separator_3 $s_pack_option eval pack $r_smooth $r_flat $b_pack_option eval pack $separator_4 $s_pack_option eval pack $b_reload $b_pack_option -pady 2 reloadButton $b_reload global xcFonts foreach {wid text} { solid "solid molecular draw-style" wire "wire molecular draw-style" anaglyph "anaglyph molecular draw-style" stereo "stereo display mode" smooth "smooth molecular shading" flat "flat molecular shading" unit "nicely-cut unit cell" asym "translational asymmetric unit" xsf2 "update XSF2 structure" } { set path $modl.$wid if { [winfo exists $path] } { DynamicHelp::register $path balloon $text } } pack $meaF -side left -fill y pack $modl -ipadx 5 -expand 1 -fill both -side left pack $atmi $flbd $flba $flbdi -side left -padx 0 -ipadx 0 -expand 1 -fill y #pack $atmi $flbd $flba $flbdi \ # $styl $sty $shdl $shd -side left -padx 0 # before opening a structure, a xc_mesacontext must be made !!!!! # xc_mesacontext .mesa #--------------------------------------# # configure control canvas & scrollbar # #--------------------------------------# update set width [expr [winfo width .ctrl] - $widsize(scrW)] set height [winfo height .ctrl] set h [winfo reqheight $fc] $c config -width $width -height $height \ -scrollregion "0 0 $width $h" #----------------------------------------------------# # END -- configure control canvas & scrollbar -- END # #----------------------------------------------------# if { $file != {} } { # open file and display it !!! OpenXSFStruct .mesa $file } # disable all neccessary widgets xcUpdateState # # delete WELCOME window # destroyWelcome # load the attributes from the definition file ... defLoadAttributes # scrolling of the control toolbox scrollControlToolboxCmd {.ctrl.c .ctrl.s} global exit_viewer_win set exit_viewer_win . bind . { exit_viewer . } } proc exit_viewer {w} { global exit_viewer_win if { ! [winfo exists $w] } { bind $w {} clean_exit } } proc scrollControlToolboxCmd {wlist} { set B4 [list .ctrl.c yview scroll -2 units] set B5 [list .ctrl.c yview scroll +2 units] # TODO: please tune the %D on windows set Wheel [list .ctrl.c yview scroll %D units] foreach w $wlist { mouseWheelScroll $w $B4 $B5 $Wheel } } proc ResizeGlobWin {} { global w h if { ! [info exists w] } { set w 0 } if { ! [info exists h] } { set h 0 } # update only if size of "toplevel ." has changed if { $w != [winfo width .] || $h != [winfo height .] } { set w [winfo width .] set h [winfo height .] PlaceGlobWin 1 $w $h update ConfigControlWid } } proc PlaceGlobWin {type w h} { global widsize unmapWin # type == 0 --> initial arrangement # type == 1 --> rearrangement # type == display_resize --> display-window was requested to be resized # type == fullscreen-off --> fullscreen-mode was turned off if { $type == 0 } { # this is for toplevel width & height set w [expr $w + $widsize(conW)] set h [expr $h + $widsize(menH) + $widsize(meaH)] . configure -width $w -height $h #tkwait visibility . } # on TOP will be MENU; on left xc_mesawin -> that is a custom widget # made for XCrySDen; # on right will be frame, that will hold everything --> this frame's name # will be control !!! # On BOTTOM there will be a MEASURE frame -> this frame's name will # be "mea" # On RIGHT BOTTOM there will be another frame that will hold Close button # some calculation for PLACEing the three widged mentioned above # frame if { $type != "display_resize" } { set controlW $widsize(conW) set controlH [expr $h - $widsize(meaH)] set controlX [expr $w - $controlW] set controlY 0 set widsize(conH) $controlH set menuX 0 set menuY 0 set menuW [expr $w - $controlW] #set menuW $w set menuH $widsize(menH) #new #set controlH [expr $controlH - $menuH] #set controlY $menuH #/ set meaH $widsize(meaH) set meaW $menuW set mesaX 0 set mesaY $menuH set mesaW [expr $w - $controlW] set mesaH [expr $h - $menuH - $meaH] set meaX 0 set meaY [expr $menuH + $mesaH] set closeX [expr $w - $controlW] set closeY $meaY set closeW $controlW set closeH $meaH } else { set mesaX 0 set mesaY $widsize(menH) set mesaW $w set mesaH $h set controlW $widsize(conW) set controlH $h set controlX $w set controlY 0 set widsize(conH) $controlH set menuX 0 set menuY 0 set menuW $w set menuH $widsize(menH) set meaH $widsize(meaH) set meaW $menuW set meaX 0 set meaY [expr $menuH + $mesaH] set closeX [expr $w - $controlW] set closeY $meaY set closeW $controlW set closeH $meaH set topW [expr $mesaW + $controlW] set topH [expr $menuH + $mesaH + $meaH] . config -width $topW -height $topH } # initial arrangement of GlobWid if { $type == 0 } { # definition of above widgets set menuWid [frame .menu -relief raised -bd 1 -class MenuBar] #set mesaWid [xc_mesawin .mesa -bg "#000"] global tcl_platform stereo_visual set stereo true if { ( $tcl_platform(platform) eq "windows" ) || ($tcl_platform(os) eq "Darwin" ) } { set stereo false } global toglOpt # N.B. -stereo is set to none at the moment set mesaWid [togl .mesa \ -width 400 \ -height 400 \ -ident .mesa \ -rgba $toglOpt(rgba) \ -redsize $toglOpt(redsize) \ -greensize $toglOpt(greensize) \ -bluesize $toglOpt(bluesize) \ -double $toglOpt(double) \ -depth $toglOpt(depth) \ -depthsize $toglOpt(depthsize) \ -accum $toglOpt(accum) \ -accumredsize $toglOpt(accumredsize) \ -accumgreensize $toglOpt(accumgreensize) \ -accumbluesize $toglOpt(accumbluesize) \ -accumalphasize $toglOpt(accumalphasize) \ -alpha $toglOpt(alpha) \ -alphasize $toglOpt(alphasize) \ -stencil $toglOpt(stencil) \ -stencilsize $toglOpt(stencilsize) \ -auxbuffers $toglOpt(auxbuffers) \ -overlay $toglOpt(overlay) \ -stereo $toglOpt(stereo) \ -time $toglOpt(time) \ -create togl_create \ -display togl_display \ -reshape togl_reshape \ -destroy togl_destroy \ -timer togl_timer ] puts stderr "Viewer: mesaWid = $mesaWid" set conWid [frame .ctrl -relief flat -bd 0 -class Viewer] set meaWid [frame .mea -relief flat -bd 0 -class Viewer] set closeWid [frame .close -relief raised -bd 1 -class Viewer] set unmapWin(frame,main) [frame .mesa.unmap -bg "#000"] # place the above widgets place $menuWid -x $menuX -y $menuY \ -width $menuW -height $menuH -anchor nw place $mesaWid -x $mesaX -y $mesaY \ -width $mesaW -height $mesaH -anchor nw place $conWid -x $controlX -y $controlY \ -width $controlW -height $controlH -anchor nw place $meaWid -x $meaX -y $meaY \ -width $meaW -height $meaH -anchor nw place $closeWid -x $closeX -y $closeY \ -width $closeW -height $closeH -anchor nw pack $unmapWin(frame,main) -anchor sw -side bottom set unmapWin(packinfo,$unmapWin(frame,main)) \ [pack info $unmapWin(frame,main)] after idle { # check if stereo is supported global stereo_visual #set stereo [xc_stereo] set stereo [lindex [.mesa configure -stereo] end] if { $stereo != "none" } { #puts stderr "\n*** the hardware supports the stereo ***\n" set stereo_visual true } else { #puts stderr "\n*** the hardware does not support the stereo ***\n" set stereo_visual false } } } elseif { $type == "fullscreen-off" } { place .menu -x $menuX -y $menuY \ -width $menuW -height $menuH -anchor nw place .mesa -x $mesaX -y $mesaY \ -width $mesaW -height $mesaH -anchor nw place .ctrl -x $controlX -y $controlY \ -width $controlW -height $controlH -anchor nw place .mea -x $meaX -y $meaY \ -width $meaW -height $meaH -anchor nw place .close -x $closeX -y $closeY \ -width $closeW -height $closeH -anchor nw } else { # configure above widgets place configure .menu -x $menuX -y $menuY \ -width $menuW -height $menuH -anchor nw place configure .mesa -x $mesaX -y $mesaY \ -width $mesaW -height $mesaH -anchor nw place configure .ctrl -x $controlX -y $controlY \ -width $controlW -height $controlH -anchor nw place configure .mea -x $meaX -y $meaY \ -width $meaW -height $meaH -anchor nw place configure .close -x $closeX -y $closeY \ -width $closeW -height $closeH -anchor nw #place configure $unmapWin(frame,main) -width 100 -height 100 \ # -x 0 -y $mesaH -anchor sw } return } proc ViewMolFrame1 {f} { global translationStep system xcMisc widsize mody viewer set fac1 $xcMisc(resolution_ratio1) set fac2 $xcMisc(resolution_ratio2) #proc _translationStepChanged {name1 name2 op} { # global translationStep # # this is a way-around of uncorrected BUG # puts stderr "----->translationStep: $translationStep" # #set a # if { [string match $translationStep "nan"] } { # set translationStep 0.05 # } # #puts stderr "translationStep: $translationStep" #} ##initial value of translationStep # ##set translationStep 0.05 #trace variable translationStep rw _translationStepChanged set translationStep 0.05 # make a frame that will hold UP, DOWN, LEFT & RIGHT button set w [expr round(122 * $fac2) - $widsize(scrW)] set h [expr round(122 * $fac2) - $widsize(scrW)] # set w [expr round(122 * $fac2)] # set h [expr round(122 * $fac2)] set cpad [expr round(4 * $fac1)] set ff [frame $f.1 -relief groove -bd 2 -width $w -height $h] pack $ff -side top -expand 1 -padx $cpad -pady $cpad # add something to $b bacause of button's borders set b [expr round(26 * $fac2) + 8]; set b1 [button $ff.b1 -image up -anchor center \ -anchor center -width $b -height $b] set b2 [button $ff.b2 -image down -anchor center \ -anchor center -width $b -height $b] set b3 [button $ff.b3 -image left -anchor center \ -anchor center -width $b -height $b] set b4 [button $ff.b4 -image right -anchor center \ -anchor center -width $b -height $b] set b5 [button $ff.b5 -image center -anchor center \ -anchor center -width $b -height $b] # now place the buttons set fw [expr $w / 2 - round(4 * $fac1)] set fh [expr $h / 2 - round(2 * $fac1)] set offset 0 place $b1 -x $fw -y [expr $fh - ( $b + $offset )] \ -anchor center -width $b -height $b place $b2 -x $fw -y [expr $fh + ( $b + $offset )] \ -anchor center -width $b -height $b place $b3 -x [expr $fw - ( $b + $offset )] -y $fh \ -anchor center -width $b -height $b place $b4 -x [expr $fw + ( $b + $offset )] -y $fh \ -anchor center -width $b -height $b place $b5 -x $fw -y $fh -anchor center -width $b -height $b foreach {wid text} { b1 "translate up" b2 "translate down" b3 "translate left" b4 "translate right" b5 "translate back to center" } { set path $ff.$wid DynamicHelp::register $path balloon $text } ############### # Zoom + Zoom - global tcl_platform if { $tcl_platform(platform) != "unix" } { set _w 6 } else { set _w 4 } set f2 [frame $f.2 -relief flat -bd 0] set zoom1 [button $f2.zoom1 -text "Zoom +" -width $_w ] set zoom2 [button $f2.zoom2 -text "Zoom -" -width $_w ] # define the bindings set viewer(bind) "" foreach {path name script} { b1 up {Transl %W +y} b2 down {Transl %W -y} b3 left {Transl %W -x} b4 right {Transl %W +x} b5 center { bindCB [list xc_newvalue .mesa $mody(L_TR_XTRANSL) 0.0] bindCB [list xc_newvalue .mesa $mody(L_TR_YTRANSL) 0.0] } } { lappend viewer(bind) $name set viewer(bind,path,$name) $ff.$path set viewer(bind,script,$name) $script } foreach {path name script} { zoom1 zoom1 {Transl %W +z} zoom2 zoom2 {Transl %W -z} } { lappend viewer(bind) $name set viewer(bind,path,$name) $f2.$path set viewer(bind,script,$name) $script } ###################### # SCALE for translationStep set f3 [frame $f.3 -bd 2 -relief groove] set sc [scale $f3.scale111 -from 0 -to 0.55 \ -length [expr round(115 * $fac2) - $widsize(scrW)] \ -variable translationStep \ -orient horizontal -tickinterval 0.25 \ -digits 2 -resolution 0.05 -showvalue true \ -width [expr round(10 * $fac2)]] set trlab [label $f3.lab -text "Translation\nStep:" -justify right] set trentry [entry $f3.entry -relief sunken \ -textvariable translationStep \ -width [expr round(5 * $fac2)] \ -validate key -validatecommand {doubleOnly %P}] pack $sc -side bottom pack $trlab $trentry -side left -expand 1 -padx 0 -pady 0 pack $zoom1 $zoom2 -side left -expand 1 pack $f2 -side top -fill x -expand 1 -pady 1 set i5 [expr round(5 * $fac2)] set i15 [expr round(15 * $fac2)] pack $f3 -side bottom -expand 1 -pady $i5 -padx $i5 -ipadx $i15 -ipady $i5 # check if we need to adjust the width of .ctrl frame set w_zoom [expr [winfo reqwidth $zoom1] * 2] if { $w_zoom > $w } { set widsize(conW) [expr $w_zoom + $widsize(scrW) + 4] set w [winfo width .] set h [winfo height .] PlaceGlobWin 1 $w $h .ctrl.c itemconfigure frame -width [expr $widsize(conW) - $widsize(scrW) + 1] } } proc ViewMolFrame2 {f} { global rotstep downB1 xcMisc system xcFonts xcColors viewer #initial value of rotstep set rotstep 10 set fac2 $xcMisc(resolution_ratio2) global tcl_platform if { $tcl_platform(platform) != "unix" } { set w [expr round(6 * $fac2)] } else { set w [expr round(4 * $fac2)] } set f1 [frame $f.1 -relief flat -bd 0] set rx1 [button $f1.rx1 -text "Rot +X" -width $w -highlightthickness 1] set rx2 [button $f1.rx2 -text "Rot -X" -width $w -highlightthickness 1] bind $rx1 {Rotate %W +x} bind $rx2 {Rotate %W -x} bind $rx1 RelB1 bind $rx2 RelB1 set f2 [frame $f.2 -relief flat -bd 0] set ry1 [button $f2.ry1 -text "Rot +Y" -width $w -highlightthickness 1] set ry2 [button $f2.ry2 -text "Rot -Y" -width $w -highlightthickness 1] bind $ry1 {Rotate %W +y} bind $ry2 {Rotate %W -y} bind $ry1 RelB1 bind $ry2 RelB1 set f3 [frame $f.3 -relief flat -bd 0] set rz1 [button $f3.rz1 -text "Rot +Z" -width $w -highlightthickness 1] set rz2 [button $f3.rz2 -text "Rot -Z" -width $w -highlightthickness 1] bind $rz1 {Rotate %W +z} bind $rz2 {Rotate %W -z} bind $rz1 RelB1 bind $rz2 RelB1 # t.k foreach {name script} { rx1 {Rotate %W +x} rx2 {Rotate %W -x} } { lappend viewer(bind) $name set viewer(bind,path,$name) $f1.$name set viewer(bind,script,$name) $script } foreach {name script} { ry1 {Rotate %W +y} ry2 {Rotate %W -y} } { lappend viewer(bind) $name set viewer(bind,path,$name) $f2.$name set viewer(bind,script,$name) $script } foreach {name script} { rz1 {Rotate %W +z} rz2 {Rotate %W -z} } { lappend viewer(bind) $name set viewer(bind,path,$name) $f3.$name set viewer(bind,script,$name) $script } #/ set f4 [frame $f.4 -bd 2 -relief groove] set sc [scale $f.4.scale -from -180 -to 180 \ -length [expr round(115 * $fac2)] -variable rotstep \ -orient horizontal -tickinterval 180 \ -digits 3 -resolution 1 -showvalue true \ -width [expr round(10 * $fac2)]] set rotlab [label $f4.lab -text "Rotation\nStep:" -justify right] set rotentry [entry $f4.entry -relief sunken \ -textvariable rotstep \ -width [expr round(5 * $fac2)] \ -validate key -validatecommand {doubleOnly %P}] pack $sc -side bottom pack $rotlab $rotentry -side left -expand 1 -padx 0 -pady 0 pack $f1 $f2 $f3 -side top -fill x -expand 1 -pady 1 set i5 [expr round(5 * $fac2)] set i15 [expr round(15 * $fac2)] set f5 [frame $f.5 -bd 0 -relief flat] set b [expr round(26 * $fac2)] foreach {row col bt im com text} [list \ 0 0 $f5.xy rotXY {xc_rotate .mesa xy 0.0} "orient to XY plane" \ 0 1 $f5.yz rotYZ {xc_rotate .mesa yz 0.0} "orient to YZ plane" \ 0 2 $f5.xz rotXZ {xc_rotate .mesa xz 0.0} "orient to XZ plane" \ 1 0 $f5.ac rotAC {xc_rotate .mesa ac 0.0} "orient to AC plane" \ 1 1 $f5.ab rotAB {xc_rotate .mesa ab 0.0} "orient to AB plane" \ 1 2 $f5.bc rotBC {xc_rotate .mesa bc 0.0} "orient to BC plane" ] { button $bt -image $im -command $com -width $b -height $b -anchor center grid $bt -row $row -column $col -padx 1 -pady 1 DynamicHelp::register $bt balloon $text } pack $rx1 $rx2 $ry1 $ry2 $rz1 $rz2 -side left \ -expand 1 -padx 0 -pady 0 -ipadx 0 -ipady 0 pack $f5 -side bottom -expand 1 -pady 2 -padx 1 pack $f4 -side bottom -expand 1 -pady $i5 -padx $i5 \ -ipadx $i15 -ipady $i5 # discrete/continuous checkbutton set viewer(rot_zoom_button_mode) "Discrete" set rot_zoom_mode_w [RadioButCmd $f "Rotation+zoom\nbuttons mode:" \ viewer(rot_zoom_button_mode) Viewer:rotZoomButtonMode \ top top 1 1 5 \ "Discrete" "Click-and-hold" "Click-and-click"] set viewer(rot_zoom_button_mode_rbs) [lrange $rot_zoom_mode_w 1 end] foreach r $viewer(rot_zoom_button_mode_rbs) { $r config -indicatoron 0 #$r config -indicatoron 0 -font $xcFonts(small) pack configure $r -padx 1 -pady 1 -ipadx 5 -ipady 1 -fill x -expand 1 } Viewer:rotZoomButtonMode } proc Rotate {b dir} { global rotstep B1down err viewer # check if $rotstep is real number number rotstep real if { $err == 1 } { return } if { $viewer(rot_zoom_button_mode) == "Click-and-hold" } { $b configure -relief sunken set B1down 1 while { $B1down } { xc_rotate .mesa $dir $rotstep update } $b configure -relief raised return -code break } elseif { $viewer(rot_zoom_button_mode) == "Discrete" } { xc_rotate .mesa $dir $rotstep update } elseif { $viewer(rot_zoom_button_mode) == "Click-and-click" } { if { ! [info exists viewer($b,$dir)] } { set viewer($b,$dir) 0 } if { ! $viewer($b,$dir) } { Viewer:_clickAndClick start $b $dir set B1down 1 while { $B1down } { xc_rotate .mesa $dir $rotstep update } Viewer:_clickAndClick end $b $dir return -code break } else { set viewer($b,$dir) 0 RelB1 } } } proc Transl {b dir} { global translationStep B1down err viewer # check if $rotstep is real number number translationStep real if { $err == 1 } { return } if { $viewer(rot_zoom_button_mode) == "Click-and-hold" } { $b configure -relief sunken set B1down 1 while { $B1down } { xc_translate .mesa $dir $translationStep update } $b configure -relief raised return -code break } elseif { $viewer(rot_zoom_button_mode) == "Discrete" } { xc_translate .mesa $dir $translationStep update } elseif { $viewer(rot_zoom_button_mode) == "Click-and-click" } { if { ! [info exists viewer($b,$dir)] } { set viewer($b,$dir) 0 } if { ! $viewer($b,$dir) } { Viewer:_clickAndClick start $b $dir set B1down 1 while { $B1down } { xc_translate .mesa $dir $translationStep update } Viewer:_clickAndClick end $b $dir return -code break } else { set viewer($b,$dir) 0 RelB1 } } } proc Viewer:_clickAndClick {mode b dir} { global viewer if { $mode == "start" } { set viewer($b,$dir) 1 foreach name $viewer(bind) { $viewer(bind,path,$name) configure -state disabled } $b configure -relief sunken -state normal foreach rb $viewer(rot_zoom_button_mode_rbs) { $rb config -state disabled } } elseif { $mode == "end" } { foreach name $viewer(bind) { $viewer(bind,path,$name) configure -state normal -relief raised } foreach rb $viewer(rot_zoom_button_mode_rbs) { $rb config -state normal } } } proc MouseZoom {W x y} { global mouseZoom # register Shift-B1-Motion event xc_ShiftB1motion $W if { ! [info exists mouseZoom($W,oldX)] } { set mouseZoom($W,oldX) $x set mouseZoom($W,oldY) $y } #set w [winfo width $W] #set fx [expr {double($mouseZoom($W,oldX) - $x)/double($w/2.0)}] #set f [expr {abs($fx) > abs($fy) ? $fx : $fy}] set h [winfo height $W] set fy [expr {double($mouseZoom($W,oldY) - $y)/double($h/2.0)}] set sign [expr { $fy > 0 ? "+" : "-"}] cry_toglzoom $W $fy set mouseZoom($W,oldX) $x set mouseZoom($W,oldY) $y } proc MouseZoomBrelease {W} { global mouseZoom # unregister Shift-B1-Motion event xc_Brelease $W Shift-B1 if { [info exists mouseZoom($W,oldX)] } { unset mouseZoom($W,oldX) } if { [info exists mouseZoom($W,oldY)] } { unset mouseZoom($W,oldY) } } proc MouseWheelZoom {W dir} { set fy 0.075 cry_toglzoom $W ${dir}${fy} } proc WindowsMouseWheel {win step} { if { $step > 0 } { MouseWheelZoom $win + } elseif { $step < 0 } { MouseWheelZoom $win - } } proc RelB1 {} { global B1down set B1down 0 } # # arguments: # F ... fullscreen proc MainGeom { {F {}} } { global oldgeom maingeom global xcMisc if { ![info exists oldgeom] } { set oldgeom 0 } # go to Maxi if { $maingeom == "Maxi" } { set maingeom "Mini" set oldgeom [winfo geometry .] set w [winfo screenwidth .] set h [winfo screenheight .] ############################### # testing "FULLSCREEN" option # ############################### if { $F != {} } { wm withdraw . wm overrideredirect . true update wm deiconify . } ############################### #wm geometry . ${w}x${h}+$xcMisc(wm_rootXshift)+$xcMisc(wm_rootYshift) update wm attributes . -fullscreen 1 } else { set maingeom "Maxi" ############################### # testing "FULLSCREEN" option # ############################### if { $F != {} } { wm withdraw . wm overrideredirect . false update wm deiconify . } ############################### wm geometry . $oldgeom wm attributes . -fullscreen 0 wm withdraw . wm overrideredirect . false update wm deiconify . wm geometry . $oldgeom } } proc maximizeDisplay {{action on}} { global widsize unmapWin maximizeDisplay switch -exact -- $action { on { # nonFS_geometry == non full-screen geometry set maximizeDisplay(nonFS_geometry) [wm geometry .] bind . {} set w [winfo screenwidth .] set h [winfo screenheight .] wm geometry . ${w}x${h}+0+0 update wm withdraw . wm overrideredirect . true wm deiconify . wm geometry . ${w}x${h}+0+0 place configure .mesa -x 0 -y 0 -width $w -height $h -anchor nw foreach wid {.menu .ctrl .mea .close} { place forget $wid } place configure .mesa -x 0 -y 0 -width $w -height $h -anchor nw set maximizeDisplay(.mesa_bind_script) [bind .mesa ] bind .mesa { maximizeDisplay:popupMenu %W %X %Y } bind .mesa { bindCB {xc_Brelease .mesa B1} maximizeDisplay off } bind . { maximizeDisplay off } } off { if { ![info exists maximizeDisplay(nonFS_geometry)] } { return } wm geometry . $maximizeDisplay(nonFS_geometry) wm withdraw . wm overrideredirect . false update wm deiconify . wm geometry . $maximizeDisplay(nonFS_geometry) PlaceGlobWin fullscreen-off [winfo width .] [winfo height .] bind .mesa "bindCB [list $maximizeDisplay(.mesa_bind_script)]" bind .mesa { bindCB {xc_Brelease .mesa B1} maximizeDisplay on } bind . {ResizeGlobWin} bind . {maximizeDisplay on} } default { ErrorDialog "wrong action $action for maximizeDisplay, should be on or off" } } } proc maximizeDisplay:popupMenu {W x y} { if { ! [winfo exists $W] } { return } if { [winfo exists $W.menu] } { destroy $W.menu } set m [menu $W.menu -tearoff 0] tk_popup $m $x $y $m add command -label "Exit from full-screen mode" \ -command {maximizeDisplay off} $m add separator $m add command -label "Zoom" -command [list toglZoom "Zoom" .mesa] $m add cascade -label "Lighting Off Display Modes" -menu $m.light_off $m add cascade -label "Lighting On Display Modes" -menu $m.light_on set moff [menu $m.light_off -tearoff 0] set mon [menu $m.light_on -tearoff 0] $moff add command -label "WireFrame" -command [list Display2D WF] $moff add command -label "PointLine" -command [list Display2D PL] $moff add command -label "Pipe&Ball" -command [list Display2D PB] $moff add command -label "BallStick-1" -command [list Display2D BS1] $moff add command -label "BallStick-2" -command [list Display2D BS2] $moff add command -label "SpaceFill" -command [list Display2D SF] $mon add command -label "Stick" -command [list DisplayOver3D S] $mon add command -label "Pipe&Ball" -command [list DisplayOver3D PB] $mon add command -label "BallStick" -command [list DisplayOver3D BS] $mon add command -label "SpaceFill" -command [list DisplayOver3D SF] $m add separator popupMenu:popup $m .mesa } proc Style3D {what how} { global style3D if {$what == "draw"} { if { $how == "stereo" } { global stereo_visual if { $stereo_visual == "false" } { WarningDialog "Stereo mode is not supported by your computer" } } elseif { $how != "anaglyph" } { set style3D(draw) $how } xc_drawStyle3D .mesa $how } if {$what == "shade"} { set style3D(shade) $how xc_shadeModel3D .mesa $how } if {$what == "point"} { set style3D(point) $how puts stdout "style3D(point)" xc_pointSize .mesa $how } } proc bindCB {cmd} { eval $cmd } proc Viewer:rotZoomButtonMode {{value {}}} { global viewer #set viewer(bind,path,$name) $ff.$path #set viewer(bind,script,$name) $script # "Discrete" "Click-and-hold" "Click-and-click" if { $viewer(rot_zoom_button_mode) == "Click-and-hold" } { foreach name $viewer(bind) { bind $viewer(bind,path,$name) $viewer(bind,script,$name) bind $viewer(bind,path,$name) RelB1 } } elseif { $viewer(rot_zoom_button_mode) == "Discrete" } { foreach name $viewer(bind) { bind $viewer(bind,path,$name) {} bind $viewer(bind,path,$name) $viewer(bind,script,$name) } } elseif { $viewer(rot_zoom_button_mode) == "Click-and-click" } { foreach name $viewer(bind) { bind $viewer(bind,path,$name) {} bind $viewer(bind,path,$name) $viewer(bind,script,$name) } } } # used for entry validation; it does not allow empty string proc doubleOnly {str} { if { $str == {} } { return false } return [string is double $str] } xcrysden-1.6.2/Tcl/colors.tcl0000644000175000017500000002763311717504603014621 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/colors.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc ColorSchemeState {f1 f2 f3} { global colSh xcEnableAll $f1 xcDisableAll $f2 xcDisableAll $f3 xcEnableOne [list $colSh(r1) $colSh(r2) $colSh(r3)] } proc ColorSchemeUpdate w { global colSh puts stderr "------------------------------> ColorSchemeUpdate" switch -- $colSh(scheme) { atomic { xc_colorscheme structure $w -default } slab { if { $colSh(slab_fractional) } { set min $colSh(slabrange_min) set max $colSh(slabrange_max) } else { global mody if { [string match ?x $colSh(slab_dir)] } { set size2 [xc_getvalue $mody(GET_AT_MAXX)] } elseif { [string match ?y $colSh(slab_dir)] } { set size2 [xc_getvalue $mody(GET_AT_MAXY)] } else { set size2 [xc_getvalue $mody(GET_AT_MAXZ)] } set min [expr {0.5 * ($colSh(slabrange_min) + $size2) / $size2}] set max [expr {0.5 * ($colSh(slabrange_max) + $size2) / $size2}] } puts stderr "------------------------------> min,max = $min, $max" xc_colorscheme structure $w -slab $colSh(slab_dir) \ -slabrange [list $min $max] \ -colorscheme $colSh(slab_colbas) \ -colortype $colSh(slab_coltyp) -alpha $colSh(slab_alpha) } dist { xc_colorscheme structure $w \ -nn [list $colSh(dist_x) $colSh(dist_y) $colSh(dist_z)] \ -colorscheme $colSh(dist_colbas) \ -colortype $colSh(dist_coltyp) -alpha $colSh(dist_alpha) \ -r $colSh(dist_r) } } } proc ColorSchemeClose w { ColorSchemeUpdate $w ColorSchemeCancel } proc ColorSchemeCancel {} { global colSh set t [winfo toplevel $colSh(f)] CancelProc $t unset colSh(f) } proc ColorSchemeCoor {} { global colSh SelHoleCL if [info exists SelHoleCL(transl)] {unset SelHoleCL(transl)} PreSel .addatom .mesa "Select coordinates" \ "Select coordinates by clicking on desired number of atoms.\n\ Selected coorinates are geometrical center of selected atoms." \ SelCentreHoleCL 15; # 15 is maximum allowed number of tkwait variable SelHoleCL(done) set colSh(dist_x) [lindex $SelHoleCL(centre) 0] set colSh(dist_y) [lindex $SelHoleCL(centre) 1] set colSh(dist_z) [lindex $SelHoleCL(centre) 2] } proc ColorScheme {} { global colSh mody if { [info exists colSh(f)] } { if { [winfo exists $colSh(f)] } { return } } set f [xcUpdateWindow -cancelcom ColorSchemeCancel \ -closecom "ColorSchemeClose .mesa" \ -updatecom "ColorSchemeUpdate .mesa"] set colSh(f) $f # # container frames # set f1 [frame $f.1 -class GrooveFrame] set f2 [frame $f.2 -class GrooveFrame] set f3 [frame $f.3 -class GrooveFrame] #-------------------------------------------------- # Atomic Colors #-------------------------------------------------- set colSh(r1) [radiobutton $f1.r1 \ -text "Colors according to atomic numbers" \ -variable colSh(scheme) -value atomic -anchor w \ -command [list ColorSchemeState $f1 $f2 $f3]] pack $f1 $f2 $f3 $colSh(r1) -side top -padx 10 -pady 10 -fill both #-------------------------------------------------- # SLAB colors #-------------------------------------------------- if { ! [info exists colSh(slab_min_from)] } { # X set max [xc_getvalue $mody(GET_AT_MAXX)] # Y set _max [xc_getvalue $mody(GET_AT_MAXY)] set max [expr {$_max < $max ? $_max : $max}] # Z set _max [xc_getvalue $mody(GET_AT_MAXZ)] set max [expr {$_max < $max ? $_max : $max}] set colSh(slab_min_from) [expr -1.5 * $max] set colSh(slab_min_to) [expr +1.5 * $max] set colSh(slab_max_from) $colSh(slab_min_from) set colSh(slab_max_to) $colSh(slab_min_to) set colSh(slab_absrange_min_from) $colSh(slab_min_from) set colSh(slab_absrange_min_to) $colSh(slab_min_to) set colSh(slab_absrange_max_from) $colSh(slab_min_from) set colSh(slab_absrange_max_to) $colSh(slab_min_to) set colSh(slab_absrange_min) $colSh(slab_absrange_min_from) set colSh(slab_absrange_max) $colSh(slab_absrange_max_to) if { $colSh(slab_fractional) } { set colSh(slab_min_from) 0.0 set colSh(slab_min_to) $colSh(slabrange_max) set colSh(slab_max_from) $colSh(slabrange_min) set colSh(slab_max_to) 1.0 } } frame $f2.left pack $f2.left -fill both -side left set colSh(r2) [radiobutton $f2.r2 -text "Slab colors" \ -variable colSh(scheme) -value slab -anchor w \ -command [list ColorSchemeState $f2 $f1 $f3]] set mb1 [xcMenuButton $f2 -labeltext "Direction:" -labelwidth 12 \ -textvariable colSh(slab_dir) \ -menu { +x {set colSh(slab_dir) +x} -x {set colSh(slab_dir) -x} +y {set colSh(slab_dir) +y} -y {set colSh(slab_dir) -y} +z {set colSh(slab_dir) +z} -z {set colSh(slab_dir) -z} }] set mb2 [xcMenuButton $f2 -labeltext "Color basis:" -labelwidth 12 \ -textvariable colSh(slab_colbas) \ -menu { monochrome {set colSh(slab_colbas) monochrome} rgb {set colSh(slab_colbas) rgb} rainbow {set colSh(slab_colbas) rainbow} geographic {set colSh(slab_colbas) geographic} }] set mb3 [xcMenuButton $f2 -labeltext "Color type:" -labelwidth 12 \ -textvariable colSh(slab_coltyp) \ -menu { override {set colSh(slab_coltyp) override} combined {set colSh(slab_coltyp) combined} }] frame $f2.f FillEntries $f2.f "Alpha:" colSh(slab_alpha) 12 10 set cb [checkbutton $f2.cb -text "Specify slab-ranges in fractional units" \ -onvalue 1 -offvalue 0 -variable colSh(slab_fractional)] set colSh(scMin) [scale $f2.scmin \ -from $colSh(slab_min_from) -to $colSh(slab_min_to) \ -variable colSh(slabrange_min) \ -orient horizontal \ -label "Slab-range -- minimum:" \ -digits 3 \ -resolution 0.01 \ -tickinterval 0.2 \ -showvalue true \ -width 10] set colSh(scMax) [scale $f2.scmax \ -from $colSh(slab_max_from) -to $colSh(slab_max_to) \ -variable colSh(slabrange_max) \ -orient horizontal \ -label "Slab-range -- maximum:" \ -digits 3 \ -resolution 0.01 \ -tickinterval 0.2 \ -showvalue true \ -width 10] trace variable colSh(slab_fractional) w xcTrace trace variable colSh(slabrange_max) w xcTrace trace variable colSh(slabrange_min) w xcTrace #frame $f2.f1 #frame $f2.f2 #FillEntries $f2.f1 {"Fixed minimum:"} colSh(slab_fixmin) 14 8 top top #FillEntries $f2.f2 {"Fixed maximum:"} colSh(slab_fixmax) 14 8 top top grid $colSh(r2) -in $f2.left -column 0 -row 0 -sticky w -padx 10 -pady 5 grid $mb1 -in $f2.left -column 0 -row 1 -sticky w -padx 10 -pady 5 grid $mb2 -in $f2.left -column 1 -row 1 -sticky e -padx 10 -pady 5 grid $mb3 -in $f2.left -column 0 -row 2 -sticky w -padx 10 -pady 5 grid $f2.f -in $f2.left -column 1 -row 2 -sticky we -padx 10 -pady 5 grid $cb -in $f2.left -column 0 -row 3 -sticky w \ -columnspan 2 -padx 10 -pady 5 grid $colSh(scMin) -in $f2.left -column 0 -row 4 -sticky we \ -columnspan 2 -padx 10 -pady 5 grid $colSh(scMax) -in $f2.left -column 0 -row 5 -sticky we \ -columnspan 2 -padx 10 -pady 5 #grid $f2.f1 -in $f2.left -column 1 -row 3 -sticky we \ # -columnspan 1 -padx 10 -pady 5 #grid $f2.f2 -in $f2.left -column 1 -row 4 -sticky we \ # -columnspan 1 -padx 10 -pady 5 #-------------------------------------------------- # distance colors #-------------------------------------------------- set colSh(r3) [radiobutton $f3.r3 -text "Distance colors" \ -variable colSh(scheme) -value dist -anchor w \ -command [list ColorSchemeState $f3 $f1 $f2]] frame $f3.f1 label $f3.f1.l -text Coordinates: pack $f3.f1.l -side left FillEntries $f3.f1 {X: Y: Z:} \ {colSh(dist_x) colSh(dist_y) colSh(dist_z)} 2 8 left left button $f3.f1.b -text "Select Coor" -command ColorSchemeCoor pack $f3.f1.b -side left set mb1 [xcMenuButton $f3 -labeltext "Color basis:" -labelwidth 12 \ -textvariable colSh(dist_colbas) \ -menu { monochrome {set colSh(dist_colbas) monochrome} rgb {set colSh(dist_colbas) rgb} rainbow {set colSh(dist_colbas) rainbow} geographic {set colSh(dist_colbas) geographic} }] set mb2 [xcMenuButton $f3 -labeltext "Color type:" -labelwidth 12 \ -textvariable colSh(dist_coltyp) \ -menu { override {set colSh(dist_coltyp) override} combined {set colSh(dist_coltyp) combined} }] frame $f3.f2 FillEntries $f3.f2 "Alpha:" colSh(dist_alpha) 12 10 set colSh(scR) [scale $f3.scr \ -from 0 -to 1 \ -variable colSh(dist_r) \ -orient horizontal \ -label "Distance-range:" \ -digits 3 \ -resolution 0.01 \ -tickinterval 0.2 \ -showvalue true \ -width 10] grid $colSh(r3) -column 0 -row 0 -sticky w -padx 10 -pady 5 grid $f3.f1 -column 0 -row 1 -columnspan 2 -sticky w -padx 10 -pady 5 grid $mb1 -column 0 -row 2 -sticky w -padx 10 -pady 5 grid $mb2 -column 1 -row 2 -sticky e -padx 10 -pady 5 grid $f3.f2 -column 0 -row 3 -sticky w -padx 10 -pady 5 grid $f3.scr -column 0 -row 4 -columnspan 3 -sticky ew -padx 10 -pady 5 switch -- $colSh(scheme) { atomic {ColorSchemeState $f1 $f2 $f3} slab {ColorSchemeState $f2 $f1 $f3} dist {ColorSchemeState $f3 $f1 $f2} } } proc ColorScheme:fromAbsToFrac {} { global colSh mody if { [string match ?x $colSh(slab_dir)] } { set size2 [xc_getvalue $mody(GET_AT_MAXX)] } elseif { [string match ?y $colSh(slab_dir)] } { set size2 [xc_getvalue $mody(GET_AT_MAXY)] } else { set size2 [xc_getvalue $mody(GET_AT_MAXZ)] } set _min [expr {0.5 * ($colSh(slabrange_min) + $size2) / $size2}] set _max [expr {0.5 * ($colSh(slabrange_max) + $size2) / $size2}] if { $_min < 0.0 } { set _min 0.0 } if { $_min > 1.0 } { set _min 1.0 } if { $_max < 0.0 } { set _max 0.0 } if { $_max > 1.0 } { set _max 1.0 } set colSh(slabrange_min) $_min set colSh(slabrange_max) $_max } proc ColorScheme:fromFracToAbs {} { global colSh mody if { [string match ?x $colSh(slab_dir)] } { set size2 [xc_getvalue $mody(GET_AT_MAXX)] } elseif { [string match ?y $colSh(slab_dir)] } { set size2 [xc_getvalue $mody(GET_AT_MAXY)] } else { set size2 [xc_getvalue $mody(GET_AT_MAXZ)] } set min [expr 2.0 * $colSh(slabrange_min) * $size2 - $size2] set max [expr 2.0 * $colSh(slabrange_max) * $size2 - $size2] puts stderr "min,max:: $min,$max" #trace vdelete colSh(slabrange_min) w xcTrace #trace vdelete colSh(slabrange_max) w xcTrace #$colSh(scMin) set $min #$colSh(scMax) set $max set colSh(slabrange_min) $min set colSh(slabrange_max) $max puts stderr "colSh(slabrange_min): $colSh(slabrange_min), $min" puts stderr "colSh(slabrange_max): $colSh(slabrange_max), $max" #trace variable colSh(slabrange_min) w xcTrace #trace variable colSh(slabrange_max) w xcTrace } xcrysden-1.6.2/Tcl/edit.tcl0000644000175000017500000000665113246207661014245 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/__file__ # ------ # # Copyright (c) 2008 by Anton Kokalj # ############################################################################# proc defaultEditor {{file ""}} { global edit set t [xcToplevel [WidgetName] "File: $file" "Editor"] set edit(saveFile,$t) $file # scrolled text set edit(sw,$t) [ScrolledWindow $t.sw -auto both -scrollbar both] set edit(tw,$t) [text $edit(sw,$t).text -width 80 -heigh 25] #pack $edit(sw,$t) $edit(tw,$t) -side top -expand 1 -fill both pack $edit(sw,$t) -side top -expand 1 -fill both $edit(sw,$t) setwidget $edit(tw,$t) if { $file != "" } { if { [file readable $file] } { set content [ReadFile $file] $edit(tw,$t) insert 1.0 $content } else { ErrorDialog "file \"$file\" does not exist or is not readable" } } set bb [frame $t.f] pack $bb -side top -fill x # buttons foreach c { cancel save saveAs close } text { Cancel Save "Save As" "Save & Close" } { set b [string tolower $c] button $bb.$b -text $text -command [list defaultEditor_$c $t] pack $bb.$b -side left -expand 1 } tkwait visibility $edit(tw,$t) focus $edit(tw,$t) return $t } proc defaultEditor_cancel {t} { set button [tk_messageBox \ -message "Changes will be lost. Really close this window?" \ -type yesno -icon question] if { $button == "yes" } { defaultEditor_done $t } } proc defaultEditor_close {t} { defaultEditor_save $t defaultEditor_done $t } proc defaultEditor_done {t} { global edit array unset edit *,$t destroy $t } proc defaultEditor_save {t} { global edit if { $edit(saveFile,$t) != "" } { set content [$edit(tw,$t) get 1.0 end] WriteFile $edit(saveFile,$t) $content } else { defaultEditor_saveAs $t } } proc defaultEditor_saveAs {t} { global edit system set filetypes { {{Text Files} {.txt .text}} {{Shell Scripts} {.sh}} {{Input Files} {.in .inp}} {{All Files} * } } set saveFile [tk_getSaveFile \ -initialdir $system(PWD) \ -title "Save File As" \ -defaultextension "" \ -filetypes $filetypes] # maybe Cancel button was pressed if { $saveFile == "" } { return } # now save the file set edit(saveFile,$t) $saveFile defaultEditor_save $t wm title $t "File: [file tail $saveFile]" } #set system(TOPDIR) [pwd] #set system(PWD) [pwd] #lappend auto_path . #set BWidget_dir $system(TOPDIR)/external/lib/bwidget1.8.0 #lappend auto_path $BWidget_dir #package require BWidget #defaultEditor xcrysden-1.6.2/Tcl/kLabels.tcl0000644000175000017500000003142613522304630014662 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/kLabels.tcl # # ------ # # Copyright (c) 2005 by Anton Kokalj # # # # --------------------------------------------------------------------------- # The labelling of k-labels is based on the idea and lookup table of Peter Blaha. # --------------------------------------------------------------------------- # Peter BLAHA, Inst.f.Techn.Elektrochemie, TU Vienna, A-1060 Vienna # Phone: +43-1-58801-5187 FAX: +43-1-5868937 # Email: pblaha@email.tuwien.ac.at WWW: http://www.tuwien.ac.at/theochem/ # --------------------------------------------------------------------------- # # This proc determines the Bravais lattice type on the basis of XSF's # igroup and primitive and convetional lattice vectors. The following # lattices are currently supported for k-point labelling: # # P-cubic, F-cubic, I-cubic # hexagonal # P-tetragonal, I-tetragonal # P-orthorhombic # # The proc returns one among above string or the "not-supported" string. # proc igroup2BravaisLattice {igroup} { global kLabels # dummy defs, so that these vars exists set vec(0,0) 0.0 set vec_len(0) 0.0 set dot(0,0) 0.0 switch -- $igroup { 1 { # P-lattice, possibilities: cubic, tetragonal, orthorhombic getLatticeVec_ primvec vec vec_len dot # check if lattice is orthogonal if { [IsEqual 1e-6 0.0 $dot(0,1) $dot(0,2) $dot(1,2)] } { # check the lengths of lattice vectors if { [IsEqual 1e-6 $vec_len(0) $vec_len(1) $vec_len(2)] } { set lattice "P-cubic" } elseif { [IsEqual 1e-6 $vec_len(0) $vec_len(1)] } { set lattice "P-tetragonal" } else { set lattice "not-supported" } } else { set lattice "not-supported" } } 2 { set lattice "not-supported" } 3 { set lattice "not-supported" } 4 { set lattice "not-supported" } 5 { set lattice "F-cubic" } 6 { # I-lattice, possibilities: cubic, tetragonal # made a similar check as for P-lattice, but with conventional vectors getLatticeVec_ convvec vec vec_len dot # check if lattice is orthogonal if { [IsEqual 1e-6 0.0 $dot(0,1) $dot(0,2) $dot(1,2)] } { # check the lengths of lattice vectors if { [IsEqual 1e-6 $vec_len(0) $vec_len(1) $vec_len(2)] } { set lattice "I-cubic" } elseif { [IsEqual 1e-6 $vec_len(0) $vec_len(1)] } { set lattice "I-tetragonal" } else { xcDebug -stderr "*** igroup2BravaisLattice: impossible Bravais lattice (I); check code" set lattice "not-supported" } } else { set lattice "not-supported" } } 7 { set lattice "not-supported" } 8 { set lattice "hexagonal" } 9 { set lattice "not-supported" } default { set lattice "not-supported" } } return $lattice } # # Private proc used by igroup2BravaisLattice, to get the attributes # of primitive or conventional. # proc getLatticeVec_ {type vec_ vec_len_ dot_} { global sInfo upvar $vec_ vec upvar $vec_len_ vec_len upvar $dot_ dot #xcDebug -stderr "tk: SINFO(primvec) == $sInfo(primvec)" #xcDebug -stderr "tk: SINFO(convvec) == $sInfo(convvec)" # get the primitive lattice vectors and its lengths for {set i 0} {$i < 3} {incr i} { for {set j 0} {$j < 3} {incr j} { set ind [expr $i*3 + $j] set vec($i,$j) [lindex $sInfo($type) $ind] } set vec_len($i) [expr sqrt($vec($i,0)*$vec($i,0) + $vec($i,1)*$vec($i,1) + $vec($i,2)*$vec($i,2))] #xcDebug -stderr "tk: VEC_LEN($i) == $vec_len($i)" } set dot(0,1) [expr $vec(0,0)*$vec(1,0) + $vec(0,1)*$vec(1,1) + $vec(0,2)*$vec(1,2)] set dot(0,2) [expr $vec(0,0)*$vec(2,0) + $vec(0,1)*$vec(2,1) + $vec(0,2)*$vec(2,2)] set dot(1,2) [expr $vec(1,0)*$vec(2,0) + $vec(1,1)*$vec(2,1) + $vec(1,2)*$vec(2,2)] #xcDebug -stderr "tk: $type DOT:: $dot(0,1) $dot(0,2) $dot(1,2)" } # # This proc tries to return the label of selected k-point based on # table-lookup. # proc getKLabel {latticeType kx ky kz} { global kLabels if { $latticeType == "not-supported" } { return "" } if { ! [info exists kLabels($latticeType)] } { return "" } foreach {kxx kyy kzz label} $kLabels($latticeType) { #xcDebug -stderr "tk: PREDIFINED: $kxx $kyy $kzz <--- SELECTED: $kx $ky $kz" if { [IsEqual 1e-5 $kx $kxx] && [IsEqual 1e-5 $ky $kyy] && [IsEqual 1e-5 $kz $kzz] } { #xcDebug -stderr "tk: LABEL == $label" return $label } } return "" } proc kLabels_Note {} { global Bz periodic kLabels # WARNING: since labeling of the k-points is a new feature, read carefully # below warnings: set msg { NEW FEATURE: automatic labeling of the k-points ----------------------------------------------- 1. For a few "supported" Bravais lattices several k-points will be labeled automatically (Ref: http://www.cryst.ehu.es/cryst/get_kvec.html) 2. The information within the XSF file are sometimes insufficient to determine the Bravais lattice type. The labelling of the k-points will be hopefully correct only if correct Bravais lattice type was determined *** CHECK THIS DATA: - the guessed BRAVAIS LATTICE TYPE : $Bz(lattice_type) ((the XSF's group number is $periodic(igroup))) } set Msg [subst -nocommands $msg] set t [xcDisplayVarText $Msg "Automatic labeling of k-points"] tkwait window $t #if { ! [info exists kLabels(warning_window)] } { # set t [xcDisplayVarText $Msg "Automatic labeling of k-points"] #} elseif { ! [winfo exists $kLabels(warning_window)] } { # set kLabels(warning_window) [xcDisplayVarText $Msg "Automatic labeling of k-points"] #} } # # this proc loads the k-label's lookup table # proc load_kLabels {} { global kLabels # not supported lattices set kLabels(not-supported) {} # lattice type: P cubic (eg. SG 221 Pm-3m) set kLabels(P-cubic) { 0.0 0.0 0.0 GAMMA 0.5 0.5 0.5 R -.5 0.5 0.5 R 0.5 -.5 0.5 R 0.5 0.5 -.5 R 0.5 -.5 -.5 R -.5 -.5 0.5 R -.5 0.5 -.5 R -.5 -.5 -.5 R 0.5 0.0 0.0 X 0.0 0.5 0.0 X 0.0 0.0 0.5 X -.5 0.0 0.0 X 0.0 -.5 0.0 X 0.0 0.0 -.5 X 0.5 0.5 0.0 M -.5 0.5 0.0 M 0.5 -.5 0.0 M -.5 -.5 0.0 M 0.5 0.0 0.5 M -.5 0.0 0.5 M 0.5 0.0 -.5 M -.5 0.0 -.5 M 0.0 0.5 0.5 M 0.0 -.5 0.5 M 0.0 0.5 -.5 M 0.0 -.5 -.5 M } # lattice type: F cubic (eg. SG 225 Fm-3m) set kLabels(F-cubic) { 0.0 0.0 0.0 GAMMA 0.5 0.5 0.5 L -0.5 -0.5 -0.5 L 0.5 0.0 0.0 L 0.0 0.5 0.0 L 0.0 0.0 0.5 L -.5 0.0 0.0 L 0.0 -.5 0.0 L 0.0 0.0 -.5 L 0.5 0.5 0.0 X 0.5 0.0 0.5 X 0.0 0.5 0.5 X -0.5 -0.5 0.0 X -0.5 0.0 -0.5 X 0.0 -0.5 -0.5 X 0.25000 0.50000 0.75000 W -0.25000 0.25000 0.50000 W -0.25000 0.50000 0.25000 W 0.25000 0.75000 0.50000 W -0.50000 0.25000 -0.25000 W -0.75000 -0.25000 -0.50000 W -0.50000 -0.25000 -0.75000 W -0.25000 0.25000 -0.50000 W -0.25000 -0.50000 -0.75000 W -0.25000 -0.75000 -0.50000 W 0.25000 -0.50000 -0.25000 W 0.25000 -0.25000 -0.50000 W 0.50000 -0.25000 0.25000 W 0.25000 -0.25000 0.50000 W 0.50000 0.25000 0.75000 W 0.75000 0.25000 0.50000 W 0.75000 0.50000 0.25000 W 0.50000 0.75000 0.25000 W 0.25000 0.50000 -0.25000 W 0.50000 0.25000 -0.25000 W -0.50000 -0.75000 -0.25000 W -0.25000 -0.50000 0.25000 W -0.50000 -0.25000 0.25000 W -0.75000 -0.50000 -0.25000 W 0.75000 0.37500 0.37500 K 0.37500 0.00000 -0.37500 K 0.37500 -0.37500 0.00000 K -0.37500 -0.75000 -0.37500 K 0.00000 -0.37500 0.37500 K -0.75000 -0.37500 -0.37500 K -0.37500 -0.37500 -0.75000 K 0.00000 0.37500 -0.37500 K -0.37500 0.37500 0.00000 K 0.37500 0.75000 0.37500 K 0.37500 0.37500 0.75000 K -0.37500 0.00000 0.37500 K } # lattice type: I cubic (eg. SG 230 Ia-3d) (I == body-centered) set kLabels(I-cubic) { 0.0 0.0 0.0 GAMMA .5 .5 -.5 H .5 -.5 .5 H -.5 .5 .5 H -.5 -.5 .5 H .5 -.5 -.5 H -.5 .5 -.5 H -0.25000 0.75000 -0.25000 P -0.75000 0.25000 0.25000 P -0.25000 -0.25000 -0.25000 P -0.25000 -0.25000 0.75000 P 0.25000 -0.75000 0.25000 P 0.75000 -0.25000 -0.25000 P 0.25000 0.25000 0.25000 P 0.25000 0.25000 -0.75000 P 0.5 0.0 0.0 N 0.0 0.5 0.0 N 0.0 0.0 0.5 N -.5 0.0 0.0 N 0.0 -.5 0.0 N 0.0 0.0 -.5 N 0.50000 0.00000 -0.50000 N 0.00000 0.50000 -0.50000 N -0.50000 0.50000 0.00000 N -0.50000 0.00000 0.50000 N 0.00000 -0.50000 0.50000 N 0.50000 -0.50000 0.00000 N } # Hexagonal lattice (eg. 194 P63/mMc) set kLabels(hexagonal) { 0.0 0.0 0.0 GAMMA 0.0 0.0 0.5 A 0.0 0.0 -.5 A 0.5 0.0 0.0 M -.5 0.0 0.0 M 0.0 0.5 0.0 M 0.0 -.5 0.0 M 0.5 -.5 0.0 M -.5 0.5 0.0 M 0.5 0.0 0.5 L -.5 0.0 0.5 L 0.0 0.5 0.5 L 0.0 -.5 0.5 L 0.5 -.5 0.5 L -.5 0.5 0.5 L 0.5 0.0 -.5 L -.5 0.0 -.5 L 0.0 0.5 -.5 L 0.0 -.5 -.5 L 0.5 -.5 -.5 L -.5 0.5 -.5 L 0.333333 0.333333 0.0 K -.333333 -.333333 0.0 K 0.333333 -.666667 0.0 K 0.666667 -.333333 0.0 K -.333333 0.666667 0.0 K -.666667 0.333333 0.0 K 0.333333 0.333333 0.5 H -.333333 -.333333 0.5 H 0.333333 -.666667 0.5 H 0.666667 -.333333 0.5 H -.333333 0.666667 0.5 H -.666667 0.333333 0.5 H 0.333333 0.333333 -.5 H -.333333 -.333333 -.5 H 0.333333 -.666667 -.5 H 0.666667 -.333333 -.5 H -.333333 0.666667 -.5 H -.666667 0.333333 -.5 H } # P tetragonal (123 P4/mmm) Coordinates require a=b ne c ! (not guaranteed) set kLabels(P-tetragonal) { 0.0 0.0 0.0 GAMMA 0.0 0.0 0.5 Z 0.0 0.0 -.5 Z 0.5 0.0 0.0 X 0.0 0.5 0.0 X -.5 0.0 0.0 X 0.0 -.5 0.0 X 0.5 0.5 0.0 M -.5 0.5 0.0 M 0.5 -.5 0.0 M -.5 -.5 0.0 M 0.5 0.0 0.5 R 0.0 0.5 0.5 R -.5 0.0 0.5 R 0.0 -.5 0.5 R 0.5 0.0 -.5 R 0.0 0.5 -.5 R -.5 0.0 -.5 R 0.0 -.5 -.5 R 0.5 0.5 0.5 A -.5 0.5 0.5 A 0.5 -.5 0.5 A -.5 -.5 0.5 A 0.5 0.5 -.5 A -.5 0.5 -.5 A 0.5 -.5 -.5 A -.5 -.5 -.5 A } # I-tetragonal, (c is "tetragonal") (139 I4/mmm) (I == body-centered) set kLabels(I-tetragonal) { 0.0 0.0 0.0 GAMMA 0.0 0.0 0.5 X 0.0 0.0 -.5 X 0.5 -.5 0.0 X -.5 0.5 0.0 X 0.5 0.0 0.0 N 0.0 0.5 0.0 N -.5 0.0 0.0 N 0.0 -.5 0.0 N 0.5 0.0 -.5 N 0.0 0.5 -.5 N -.5 0.0 0.5 N 0.0 -.5 0.5 N 0.25 0.25 0.25 P -.25 0.75 -.25 P 0.75 -.25 -.25 P 0.25 0.25 -.75 P -.25 -.25 -.25 P 0.25 -.75 0.25 P -.75 0.25 0.25 P -.25 -.25 0.75 P -.5 0.5 -.5 M -.5 0.5 0.5 M 0.5 -.5 0.5 M 0.5 -.5 -.5 M 0.5 0.5 -.5 Z -.5 -.5 0.5 Z } # Note: for above M and Z points "acessibility depends on c/a" # P orthorhombic (47 Pmmm) set kLabels(P-orthorhombic) { 0.0 0.0 0.0 GAMMA 0.0 0.0 0.5 Z 0.0 0.0 -.5 Z 0.5 0.0 0.0 X 0.0 0.5 0.0 Y -.5 0.0 0.0 X 0.0 -.5 0.0 Y 0.5 0.5 0.0 S -.5 0.5 0.0 S 0.5 -.5 0.0 S -.5 -.5 0.0 S 0.5 0.0 0.5 U 0.0 0.5 0.5 T -.5 0.0 0.5 U 0.0 -.5 0.5 T 0.5 0.0 -.5 U 0.0 0.5 -.5 T -.5 0.0 -.5 U 0.0 -.5 -.5 T 0.5 0.5 0.5 R -.5 0.5 0.5 R 0.5 -.5 0.5 R -.5 -.5 0.5 R 0.5 0.5 -.5 R -.5 0.5 -.5 R 0.5 -.5 -.5 R -.5 -.5 -.5 R } # additional comments (PB): # -------------------------- # Trigonal (Rhombohedral) case (2 cases, a,c) # # B orthorhombic case (2 cases, depending on a,b,c) # # F orthorhombic cases (3 different cases, depending on a,b,c) # # C orthorhombic lattice (CXY, and a<>b, CXZ, CYZ, ...) # # C monoclinic lattice (with monoclinic angle gamma, depends on a,b,c and gamma) # # P monoclinic lattice (with monoclinic angle gamma, depends on a,b, and gamma) # # triclinic } xcrysden-1.6.2/Tcl/scriptingScalarField3D.tcl0000644000175000017500000004540013142543133017566 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/scriptingScalarField3D.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # ------------------------------------------------------------------------ #****c* Scripting/scripting::scalarField3D # # NAME # scripting::scalarField3D # # PURPOSE # Encapsulate the scripting interface for manipulating the 3D scalar # field and display of isosurfaces and colorplane+contour plots. A # typical usage of the interface is the following. First the scalar # field is loaded with the "load" command. Then with the "configure" # command the isosurface and/or contours display parameters are set. # Finally the isosurface and/or contours are displayed using the # "render" command. It is possible to make several snapshots of # isosurface and/or contours by changing configuration options, this # would look as: # # load # configure ... # render # configure .. # render # ... # # COMMANDS # # -- scripting::scalarField3D::load # Loads the scalar field. # # -- scripting::scalarField3D::configure # Configure the display parameters for isosurface and/or contours # plot. # # -- scripting::scalarField3D::render # Renders the sosurface and/or contours. #**** # ------------------------------------------------------------------------ namespace eval scripting::scalarField3D { variable scalarField3D set scalarField3D(loaded) 0 set scalarField3D(configured) 0 set scalarField3D(basalplane) -1 } # ------------------------------------------------------------------------ #****f* Scripting/scripting::scalarField3D::load # # NAME # scripting::scalarField3D::load # # USAGE # scripting::scalarField3D::load # # PURPOSE # This proc loads the 3D scalar field. Prior to calling this routine # the XSF file with the description of 3D scalar filed should be # loaded by "scripting::open --xsf file.xsf" call. # # RETURN VALUE # Undefined. # # WARNINGS # Prior to calling this routine the XSF file with the description of # 3D scalar filed should be loaded by "scripting::open --xsf file.xsf" # call. # # EXAMPLE # scripting::open --xsf file.xsf # scripting::scalarField3D::load # #**** # ------------------------------------------------------------------------ proc scripting::scalarField3D::load {} { variable scalarField3D # # load datagrid # set dim [DataGridOK [DataGrid]] if { $dim != "3D" } { error "datagrid is not 3D, but $dim" } set scalarField3D(loaded) 1 # load the scalar-field 3D defaults IsoControl_InitVar } # ------------------------------------------------------------------------ #****f* Scripting/scripting::scalarField3D::configure # # NAME # scripting::scalarField3D::configure # # USAGE # scripting::scalarField3D::configure -option value ?-option value? ... # # PURPOSE # This proc configures the display parameters of isosurface and/or # contours plot. # ARGUMENTS # args -- various configuration "-option value" pairs (see Options). # # OPTIONS # ------------------------------------------------------------------------ # OPTION:: ALLOWED-VALUES + Description # ------------------------------------------------------------------------ # -isosurface 0|1 # 0 = do not render isosurface # 1 = render isosurface # # -interpolation_degree integer # degree of scalar-field interpolation # # -isolevel real # the isovalue of isosurface # # -plusminus 0|1 # 0 = display only the isosurface of isovalue # specified by -isolevel # 1 = display the two isosurfaces of +-isovalue # # -revertsides pos|neg|{pos neg} # pos = revert the front- and back-side of isovalue # isosurface # neg = revert the front- and back-side of -isovalue # isosurface # -revertnormals pos|neg|{pos neg} # pos = revert the normals of isovalue isosurface # neg = revert the normals of -isovalue isosurface # # -expand none|whole|specify # none = do not expand the isosurface along the # periodic directions # whole = expand the isosurface over the # whole structure along the periodic # directions # specify = expand the isosurface along the # periodic directions as specified by # -expand_X, -expand_Y, and -expand_Z # factors # # -expand_X positive-integer # expand isosurface n-times along the 1st # periodic dimension # # # -expand_Y positive-integer # expand isosurface n-times along the 2nd # periodic dimension # # -expand_Z positive-integer # expand isosurface n-times along the 3rd # periodic dimension # # -basalplane 1|2|3 # show the ith basal plane (1=xy, 2=xz, 3=yz) # as colorplane and/or isolines (as specified by # -colorplane and -isoline options) # # -colorbasis MONOCHROME|RAINBOW|RGB|GEOGRAPHIC|BLUE-WHITE-RED|BLACK-BROWN-WHITE # the color basis for the colorplane # # -scalefunction LINEAR|LOG10|SQRT|3th-ROOT|EXP(x)|EXP(x^2) # the scalefunctions for contour/colorplane plots # # -expand2D none|whole|specify # none = do not expand the contour/colorplane plots # along the periodic directions # whole = expand the contour/colorplane plots # over the whole structure along the # periodic directions # specify = expand the contour/colorplane plots # along the periodic directions as specified # by -expand2D_X, -expand2D_Y, and # -expand2D_Z factors # # -expand2D_X positive-integer # expand contour/colorplane n-times along the 1st # periodic dimension # # # -expand2D_Y positive-integer # expand contour/colorplane n-times along the 2nd # periodic dimension # # -expand2D_Z positive-integer # expand contour/colorplane n-times along the 3rd # periodic dimension # # -colorplane 0|1 # do not display|display the colorplane # # -isoline 0|1 # do not display|display the isolines # # -colorplane_lighting 0|1 # 0 = do not perform lighting for colorplane # 1 = perform lighting for colorplane # # -cpl_transparency 0|1 # 0 = render colorplane as non-transparent # 1 = render colorplane as transparent # # -cpl_thermometer 0|1 # 0 = do not make a legend (i.e. thermometer) for # colorplane colors # 1 = make a legend (i.e. thermometer) for # colorplane colors # # -2Dlowvalue real # minimum rendered value of colorplane/isolines # # -2Dhighvalue real # maximum rendered value of colorplane/isolines # # -2Dnisoline positive-integer # number of isoline # # -anim_step positive-integer # animation step # # -current_slide positive-integer # iD (i.e. sequential number) of colorplane # # -isoline_color monocolor|{property color} # monocolor = all isolines have the same color # {property color} = isolines are colorer according # to color-basis # # -isoline_width positive-integer # width (i.e. thickness) of isolines # # -isoline_monocolor #rgb # color of the monolor-type isolines # # ------------------------------------------------------------------------ # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::scalarField3D::configure \ # -isosurface 1 \ # -interpolation_degree 2 \ # -isolevel 0.1 \ # -plusminus 1 \ # -revertsides {pos neg} \ # -revertnormal {pos neg} \ # -expand specify \ # -expand_X 1 \ # -expand_Y 1 \ # -expand_Z 1 \ # -basalplane 1 \ # -colorbasis BLUE-WHITE-RED \ # -scalefunction LINEAR \ # -expand2D specify \ # -expand2D_X 1 \ # -expand2D_Y 1 \ # -expand2D_Z 1 \ # -colorplane 1 \ # -isoline 1 \ # -colorplane_lighting 0 \ # -cpl_transparency 0 \ # -cpl_thermometer 1 \ # -2Dlowvalue -0.1 \ # -2Dhighvalue +0.1 \ # -2Dnisoline 11 \ # -anim_step 1 \ # -current_slide 30 \ # -isoline_color monocolor \ # -isoline_width 3 \ # -isoline_monocolor \#000000 # #**** # ------------------------------------------------------------------------ proc scripting::scalarField3D::configure {args} { variable scalarField3D global isosurf isoControl prop # # assuming the 3D grid !!! # set scalarField3D(configured) 1 # if the colorplane/isolines are to be rendered, then "-basalplane # whichplane" should be specigied, and the iplane will be assigned # accordingly set iplane $scalarField3D(basalplane) # parse the options set i 0 foreach option $args { incr i if { $i%2 } { set tag $option } else { switch -glob -- $tag { "-isosurface" { switch -- $option { on - 1 { set isoControl(isosurf) 1 } off - 0 { set isoControl(isosurf) 0 } default { ErrorDialog "wrong -isosurface value $option, must be 0 or 1" } } } "-interpolation_degree" { if { ! [string is integer $option] } { ErrorDialog "expected integer for -interpolationdegree option, but got $option" } elseif { $option < 1 } { ErrorDialog "-interpolationdegree value should be greater then 0, but got $option" } else { set isosurf(3Dinterpl_degree) $option } } "-isolevel" { if { ! [string is double $option] } { ErrorDialog "expected real-number for -isolevel option, but got $option" } else { set prop(isolevel) $option } } "-plusminus" { switch -- $option { yes - on - 1 { set prop(pm_isolevel) 1 } no - off - 0 { set prop(pm_isolevel) 0 } default { ErrorDialog "wrong -isosurface value $option, must be 0 or 1" } } IsoControlCommand } "-revertside*" { foreach side $option { switch -- [string tolower $side] { pos { RevertIsoSides pos } neg { RevertIsoSides neg } default { ErrorDialog "the value of -revertsides must be pos or neg, but got $option" } } } } "-revertnormal*" { foreach side $option { switch -- [string tolower $side] { pos { RevertIsoNormals pos } neg { RevertIsoNormals neg } default { ErrorDialog "the value of -revertnormals must be pos or neg, but got $option" } } } } "-basalplane" { switch $option { 1 { set iplane 1 } 2 { set iplane 2 } 3 { set iplane 3 } default { ErrorDialog "the value of -basalplane must be 1, 2, or 3, but got $option" continue } } set scalarField3D(basalplane) $iplane set t .iso set ft $t.ft set fb1 $t.fb1 set fb2 $t.fb2 IsoControl_Show colorplane$iplane $fb1 $fb2 $ft.b1 $ft.b2 $ft.b3 $ft.b4 } "-colorbasis" { switch -exact -- $option { MONOCHROME - RAINBOW - RGB - GEOGRAPHIC - BLUE-WHITE-RED - BLACK-BROWN-WHITE { set cpl_basis $option } default { ErrorDialog "wrong colorbasis $option, must be ..." continue } } } "-scalefunction" { switch -exact -- $option { LINEAR - LOG10 - SQRT - 3th-ROOT - EXP(x) - EXP(x^2) {set cpl_function $option } default { ErrorDialog "wrong scale-function $option, must be ..." continue } } } "-expand" - "-expand2D" { set var [string trimleft $tag -] switch -- $option { none - whole - specify { set $var $option } default { ErrorDialog "wrong $tag value $option, must be none, whole, specify" continue } } } "-expand_X" - "-expand_Y" - "-expand_Z" - "-expand2D_X" - "-expand2D_Y" - "-expand2D_Z" { if { ! [string is integer $option] } { ErrorDialog "expected integer for $tag option, but got $option" } elseif { $option < 1 } { ErrorDialog "$tag value should be greater then 0, but got $option" } else { set var [string trimleft $tag -] set $var $option } } "-colorplane" - "-isoline" - "-colorplane_lighting" - "-cpl_transparency" - "-cpl_thermometer" - "-2Dlowvalue" - "-2Dhighvalue" - "-2Dnisoline" - "-anim_step" - "-current_slide" - "-isoline_color" - "-isoline_width" - "-isoline_monocolor" { set var [string trimleft $tag -] set $var $option } } } } if { $i%2 } { ErrorDialog "scripting::scalarField3D::configure called with an odd number of arguments !!!" } if { [info exists expand] } { set isosurf(expand) $expand } if { [info exists expand_X] } { set isosurf(expand_X) $expand_X } if { [info exists expand_Y] } { set isosurf(expand_Y) $expand_Y } if { [info exists expand_Z] } { set isosurf(expand_Z) $expand_Z } if { $iplane > 0 } { if { [info exists cpl_basis] } { set isoControl($iplane,cpl_basis) $cpl_basis } if { [info exists cpl_function] } { set isoControl($iplane,cpl_function) $cpl_function } if { [info exists colorplane] } { set isoControl($iplane,colorplane) $colorplane } if { [info exists isoline] } { set isoControl($iplane,isoline) $isoline } if { [info exists colorplane_lighting] } { set isoControl($iplane,colorplane_lighting) $colorplane_lighting } if { [info exists cpl_transparency] } { set isoControl($iplane,cpl_transparency) $cpl_transparency } if { [info exists cpl_thermometer] } { set isoControl($iplane,cpl_thermometer) $cpl_thermometer } if { [info exists cpl_thermoTplw] } { set isoControl($iplane,cpl_thermoTplw) $cpl_thermoTplw } if { [info exists 2Dlowvalue] } { set isoControl($iplane,2Dlowvalue) $2Dlowvalue } if { [info exists 2Dhighvalue] } { set isoControl($iplane,2Dhighvalue) $2Dhighvalue } if { [info exists 2Dnisoline] } { set isoControl($iplane,2Dnisoline) $2Dnisoline } if { [info exists expand2D] } { set isosurf($iplane,2Dexpand) $expand2D } if { [info exists expand2D_X] } { set isosurf($iplane,2Dexpand_X) $expand2D_X } if { [info exists expand2D_Y] } { set isosurf($iplane,2Dexpand_Y) $expand2D_Y } if { [info exists expand2D_Z] } { set isosurf($iplane,2Dexpand_Z) $expand2D_Z } if { [info exists anim_step] } { set isoControl($iplane,anim_step) $anim_step } if { [info exists current_slide] } { set isoControl($iplane,current_slide) $current_slide set isoControl(current_text_slide) "Current slide: $isoControl($iplane,current_slide) / $isoControl($iplane,nslide)" } if { [info exists isoline_color] } { set isoControl($iplane,isoline_color) $isoline_color } if { [info exists isoline_width] } { set isoControl($iplane,isoline_width) $isoline_width } if { [info exists isoline_monocolor] } {set isoControl($iplane,isoline_monocolor) $isoline_monocolor } if { [info exists isoline_stipple] } { set isoControl($iplane,isoline_stipple) $isoline_stipple } # register the colorplane values IsoControl_SetColorPlaneVar 2nd $iplane } } # ------------------------------------------------------------------------ #****f* Scripting/scripting::scalarField3D::render # # NAME # scripting::scalarField3D::render # # USAGE # scripting::scalarField3D::render # # PURPOSE # This proc displays the either isosurface or contours/colorplanes or # both (depending on the configuration). # # RETURN VALUE # Undefined. # # EXAMPLE # scripting::scalarField3D::render # #**** # ------------------------------------------------------------------------ proc scripting::scalarField3D::render {} { variable scalarField3D if { !$scalarField3D(loaded) } { ErrorDialog "can't render isosurface/contours, the scalar field was not loaded. Call scripting::scalarField3D::load and scripting::scalarField3D::configure before calling scripting::scalarField3D::render" return } if { !$scalarField3D(configured) } { ErrorDialog "can't render isosurface/contours, since they were not configured. Call scripting::scalarField3D::configure before calling scripting::scalarField3D::render" return } ############# UpdateIsosurf } xcrysden-1.6.2/Tcl/Xcrysden_resources0000644000175000017500000000557011712741425016424 0ustar tonetone# ------------------------------------------------------------------------ # if you have problems with fonts uncomment see the end of this file # ------------------------------------------------------------------------ ########### # MenuBar # ########### *MenuBar.relief: raised *MenuBar.borderWidth: 2 *MenuBar*activeBackground: #007d8d *MenuBar*activeForeground: #ffffff *Viewer*activeBackground: #007d8d *Viewer*activeForeground: #ffffff #---------------------------- # this is STANDARD !!! #---------------------------- *Entry.background: #daa *SilentEntry*Entry.background: #ddd *Text.background: #daa *Listbox.background: #daa *Checkbutton.selectColor: #ffffff *Radiobutton.selectColor: #ffffff *RaisedFrame.relief: raised *RaisedFrame.borderWidth: 2 *GrooveFrame.relief: groove *GrooveFrame.borderWidth: 2 #------------------------------------------------------------------------ # stressed color: #cfbab6 (testing the #b5a266 ; #b19a4b ; #bfaaa6 ; #9f8a86) #------------------------------------------------------------------------ *ctrl*Button.background: #b5a266 *ctrl*Radiobutton.background: #b5a266 *ctrl*Checkbutton.background: #b5a266 *ctrl*Button.foreground: #000000 *ctrl*Radiobutton.foreground: #000000 *ctrl*Checkbutton.foreground: #000000 *ctrl*Button.highlightBackground: #000000 *ctrl*Radiobutton.highlightBackground: #000000 *ctrl*Checkbutton.highlightBackground: #b5a266 *mea*Radiobutton.highlightBackground: #000000 *mea*Checkbutton.highlightBackground: #000000 *mea*Button.highlightBackground: #000000 *close*Button.background: #b5a266 *close*Button.highlightBackground: #000 *close*Button.foreground: #000000 *mea*Button.background: #b5a266 *StressText*Frame.reliaf: ridge *StressText*borderWidth.reliaf: 2 *StressText*Message.background: #b5a266 *StressText*Label.background: #b5a266 *Fileselect*Message.background: #b5a266 *DataGridBlock*Frame.background: #ffce61 *DataGridBlock*Label.background: #ffce61 *DataGridBlock*Radiobutton.background: #ffce61 *DataGridSubBlock*Frame.background: #ffff9d *DataGridSubBlock*Label.background: #ffff9d *DataGridSubBlock*Entry.background: #daa *DataGridSubBlock*Checkbutton.background: #99ddaa *DataGridSubBlock*Checkbutton.selectColor: #9999ff #------------------------------------------------------------------------ # if you have problems with fonts try with one of below lines #------------------------------------------------------------------------ %*font:fixed %*font:TkFontFixed %*font: -*-helvetica-medium-r-normal--10-*-*-*-*-*-*- xcrysden-1.6.2/Tcl/wnKPath.tcl0000644000175000017500000002107613522305661014666 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnKPath.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc wnKPath {dir} { global Bz BzOK prop system geng periodic xcMisc # now struct file should be read and then BZ toplevel displayed # with XCrySDen's k-Path Selection: directory XCRYSDEN_Logo $dir set xcMisc(titlefile) $dir if [winfo exists .title] { destroy .title } ########################################## # in WIEN2k there it is always 3D system # ########################################## set periodic(dim) 3 set species crystal cd $system(SCRDIR) set BzOK(wien_kpath) 1 set BzOK(wien_dir) [file tail $dir] # # check if $dir is a struct file or a directory !!! # if { [file isfile $dir] } { # it's a struct-file set filehead [file rootname $dir] } else { # it's a case directory set filehead $dir/[file tail $dir] } # # read the struct file and produce xc_struc.$$ # xcDebug "Executing: $system(FORDIR)/str2xcr $filehead, PWD=[pwd]" if { [catch {exec $system(FORDIR)/str2xcr $filehead} errMsg] } { ErrorDialog "while executing \"str2xcr\" program." $errMsg CloseCase } # now copy $filehead.xcr to $system(SCRDIR)/xc_str2xcr.$$ file rename -force ${filehead}.xcr $system(SCRDIR)/xc_str2xcr.$system(PID) # # WIEN2k struct file is in BOHRs, thatwhy xc_str2xcr.$$ is in BOHRs # set geng(M3_ARGUMENT) [GetGengM3Arg BOHR 95] xcAppendState wien set periodic(igroup) 1 xcDebug "Going to GenGeom" GenGeom $geng(M1_PRIM) $geng(M2_CELL) $geng(M3_ARGUMENT) \ $periodic(igroup) \ 1 1 1 $system(SCRDIR)/xc_struc.$system(PID) # determine the periodic(igroup) set fileID [open "$system(SCRDIR)/xc_struc.$system(PID)" r] GetDimGroup periodic(dim) periodic(igroup) $fileID close $fileID xcDebug "Going to xc_readXSF" ################################################ xc_readXSF $system(SCRDIR)/xc_struc.$system(PID) ################################################ # # render the k-Path selector window # set BzOK(done) 0 Bz_MakeToplevel # # OK, either the k-path was selected or a cancel button was pressed # if { !$BzOK(done) } { # Cancel button was pressed; EXIT exit_pr -silent exit } #---------------------------------- # Prepare k_list-file: #---------------------------------- # band structure script looks like: # # BAND # a-b-c-d- # 3 8 200 1 100 1 0 # 0 0 0 4 4 0 # 4 4 0 4 2 -2 # 4 2 -2 5 3 0 # set script [split $prop(c95_BAND_script) \n] if { [lindex $script 0] == "CONVCELL" } { set script [lrange $script 1 end] } set labels [split [lindex $script 1] -] set idv $BzOK(iss) set kp [expr $prop(NLINE) + 1] set nk $BzOK(nK) # set emin $BzOK(Emin) # set emax $BzOK(Emax) set emin -8.0 set emax 8.0 for {set i 3} {$i < [expr 2 + $prop(NLINE)]} {incr i} { set line [lindex $script $i] set ii [expr $i - 3] set coor(x,$ii) [lindex $line 0] set coor(y,$ii) [lindex $line 1] set coor(z,$ii) [lindex $line 2] } set line [lindex $script $i] set ii [expr $i - 3] set coor(x,$ii) [lindex $line 0] set coor(y,$ii) [lindex $line 1] set coor(z,$ii) [lindex $line 2] incr ii set coor(x,$ii) [lindex $line 3] set coor(y,$ii) [lindex $line 4] set coor(z,$ii) [lindex $line 5] # now we are ready to construct k_list file set k_list "$kp $nk $idv $emin $emax\n" # set k_list "$kp $nk $idv \n" append k_list "$Bz(rendered)\n" set unk 0 for {set i 0} {$i <= $ii} {incr i} { set l [lindex $labels $i] if { $l == {} } { set l X$unk incr unk } set l [format "'%-10s'" $l] append k_list "$coor(x,$i) $coor(y,$i) $coor(z,$i) $l\n" } xcDebug -stderr "XCRYSDEN-to-WIEN k-list file:" xcDebug -stderr "-----------------------------" xcDebug -stderr $k_list # prompt for a name of final k-list file WriteFile $system(SCRDIR)/xc_klist.$system(PID) $k_list w set filetypes { {{WIEN2k K-List File} {.klist} } {{All Files} * } } set sfile [tk_getSaveFile -initialdir $system(PWD) \ -title "Save WIEN2k K-List File" \ -defaultextension .klist \ -filetypes $filetypes] # maybe Cancel button was pressed if { $sfile == {} } { exit_pr -silent; exit } # # finaly execute a kPath program and save the klist into $sfile # xcDebug "exec $system(FORDIR)/kPath \ $system(SCRDIR)/xc_struc.$system(PID) \ $system(SCRDIR)/xc_klist.$system(PID)" cd $system(SCRDIR) if { [catch {exec $system(FORDIR)/kPath \ $system(SCRDIR)/xc_struc.$system(PID) \ $system(SCRDIR)/xc_klist.$system(PID) > \ $sfile} errMsg] } { ErrorDialog "while executing \"kPath\" program." $errMsg } # # provide some supporting information to check if the generated k-points are OK # global wnKP #set wnKP(npoi) $Bz($can,nselected) #set wnKP(M) $BzOK(iss) #set wnKP(type) $type #/ if { $wnKP(type) == "prim" } { set type "RECIPROCAL-PRIMITIVE" } else { set type "RECIPROCAL-CONVENTIONAL" } set supportInfo "================================================================\n" append supportInfo " * * * S U P P O R T I N G I N F O R M A T I O N * * * \n" append supportInfo "================================================================\n" append supportInfo "\n" #append supportInfo "BEWARE: the conversion of selected k-point coordinates to format\n" #append supportInfo " suitable for the WIEN2k program is buggy.\n" #append supportInfo "\n" #append supportInfo " !!! USE AT YOUR OWN RISK !!!\n" #append supportInfo " !!! PLEASE CHECK BELOW DATA FOR CONSISTENCY !!!\n" #append supportInfo "\n" append supportInfo "Number of selected k-points: $wnKP(npoi)\n\n" append supportInfo "**ORIGINAL DATASET**\n" append supportInfo "--------------------\n" append supportInfo "THE FOLLOWING k-POINT WERE SELECTED:\n" append supportInfo "(crystal coordinates with respect to $type vectors)\n\n" for {set i 1} {$i <= $wnKP(npoi)} {incr i} { append supportInfo [format " % 10.5f % 10.5f %10.5f %s\n" \ $wnKP(poi,$i,1) $wnKP(poi,$i,2) $wnKP(poi,$i,3) $wnKP(label,$i)] } append supportInfo "\n**REPRODUCED(TRANSFORMED) DATASET for WIEN2k**\n" append supportInfo "----------------------------------------------\n" append supportInfo "IMPORTANT:\n" append supportInfo "Check if the data presented below are consistent with the data from ORIGINAL DATASET !!!\n\n" append supportInfo [ReadFile supportInfo-1.kpath] append supportInfo "\n" append supportInfo "Transformed selected k-points for WIEN2k:\n" append supportInfo "----------------------------------------\n" append supportInfo [ReadFile supportInfo-2.kpath] append supportInfo "\n" append supportInfo "The content of the generated WIEN2k k-list file is the following:\n" append supportInfo "----------------------------------------------------------------\n" append supportInfo [ReadFile $sfile] WriteFile $system(PWD)/supportInfo.kpath $supportInfo w if { [file exists supportInfo-1.kpath] } { file delete supportInfo-1.kpath } if { [file exists supportInfo-2.kpath] } { file delete supportInfo-2.kpath } set t [xcDisplayVarText $supportInfo "k-path: Supporting Information"] if { [winfo exists $t.f1.t] } { catch {$t.f1.t configure -height 30 -width 90} catch {$t.f1.t configure -state disabled} } tkwait window $t exit_pr -silent exit } xcrysden-1.6.2/Tcl/advGeom2.tcl0000644000175000017500000010231412352604624014752 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/advGeom2.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # --------------------------------------------------------------------------- # PART#1>> # ATOMSUBS # ^^^^^^^^ proc AtomSubs {} { global atomSub XCState doneAL #if XCState is not c95, we can not substitute an atom puts stdout $XCState(state) if { [xcIsActive c95] == 0 || [xcIsActive render] == 0 } { return } if [winfo exists .atsubs] { return } # how many atoms to substitute OneEntryToplevel .atsubs "Substitute Atoms" "AtomSubs" \ "Number of atoms to be substituted" 3 atomSub(NSOST) posint 310 60 # make a toplevel with enries for AtomSubs if [winfo exists .atmsub] { return } set t [xcToplevel .atmsub "Substitute Atoms" "AtomSubs" . 180 0 1] set fb [frame $t.fb1] set atomSub(sym) "BREAKSYM" RadioBut $fb "Symmetry option::" atomSub(sym) \ left left 1 1 "BREAKSYM" "KEEPSYMM" pack $fb -side bottom -expand true -padx 10 -pady 10 -anchor center # ------------------------------- # SCROLLENTRIES --- SCROLLENTRIES ScrollEntries .atmsub $atomSub(NSOST) "Atom N.:" \ {{Atomic Label:} {New Atomic Number:}} {LB NA} {posint nat} \ 3 atomSub [list 2 \ [list {Periodic Table} scroll_ptableSelectNAT .atmsub atomSub NA] \ [list {Select AtomSubs} SelAtomLabel .atmsub atomSub LB \ {Select an atom to substitute it} \ {To select the atom click on the atom}]] 3 button $fb.butok -text OK -command \ [list AtomLabOK $t atomSub] button $fb.butcan -text Cancel -command [list CancelProc $t] pack $fb.butok $fb.butcan -side left -expand 1 -padx 10 -pady 10 tkwait window $t } proc SelAtomLabel {t type elem title text i} { global SelLabel atomSub atomRemo atomDisp # array..... name of global array # elem...... array's element # i......... global array is of type globvarname($elem,$i) set grab 0 if { [grab current] == $t } { set grab 1 catch { grab release $t } } set selwin [PreSel .selatom .mesa $title $text LabelSel 1] tkwait variable SelLabel(done) if { $type == "atomSub" } { # ATOMSUB set atomSub(${elem},${i}) $SelLabel(label) } elseif { $type == "atomRemo" } { # ATOMREMO set atomRemo(${elem},${i}) $SelLabel(label) } elseif { $type == "atomDisp" } { # ATOMDISP set atomDisp(${elem},${i}) $SelLabel(label) } if { $grab } { catch { grab $t } } } proc LabelSel {{w {}}} { global select maxsel system WriteFile "$system(SCRDIR)/xc_tmp.$system(PID)" \ "$select(Nat1) $select(X1) $select(Y1) $select(Z1)" set com [list exec $system(FORDIR)/atomlab 1 \ $system(SCRDIR)/xc_struc.$system(PID) \ $system(SCRDIR)/xc_tmp.$system(PID)] if { $system(c95_version) != 95 } { set com [concat $com cr98] } # now exec a atomsel program; catch the error if it occure $select(textWid) config -state normal xcDebug -stderr "Executing: $com" if { [catch {set label [string trim [eval $com]]} errmsg] } { error "error executing atomlab: $errmsg" $select(textWid) delete [expr $maxsel + 4].0 [expr $maxsel + 4].end $select(textWid) insert [expr $maxsel + 4].0 $errmsg file delete $system(SCRDIR)/xc_tmp.$system(PID) $select(textWid) config -state disabled return "Error" } else { $select(textWid) delete [expr $maxsel + 5].0 [expr $maxsel + 5].end $select(textWid) insert [expr $maxsel + 5].0 "Selected atom has label: $label" file delete $system(SCRDIR)/xc_tmp.$system(PID) $select(textWid) config -state disabled return [string trim $label] } } # ---------------------------------------------------------------------------- # PART#2 >> # ATOMREMO # ^^^^^^^^ proc AtomRemo {} { global atomRemo XCState doneAL #if XCState is not c95, we can not cut a cluster if { [xcIsActive c95] == 0 || [xcIsActive render] == 0 } { return } if [winfo exists .atremo] { return} # how many atoms to remove OneEntryToplevel .atremo "Remove Atoms" "AtomRemo" \ "Number of atoms to be removed" 3 atomRemo(NL) posint 310 60 # make a toplevel with enries for AtomRemo if [winfo exists .atmrem] { return } set t [xcToplevel .atmrem "Remove Atoms" "AtomRemo" . 180 0 1] set fb [frame $t.fb1] set fb2 [frame $t.fb2] set atomRemo(sym) "BREAKSYM" RadioBut $fb "Symmetry option::" atomRemo(sym) \ left left 1 1 "BREAKSYM" "KEEPSYMM" pack $fb2 $fb -side bottom -expand true -padx 10 -pady 10 -anchor center \ -fill x # ------------------------------------- # SCROLLENTRIES --- SCROLLENTRIES ##### ScrollEntries .atmrem $atomRemo(NL) "Atom N.:" \ {{Atomic Label:}} LB posint \ 3 atomRemo [list 1 \ [list {Select AtomRemo} SelAtomLabel $t atomRemo LB \ {Select an atom to remove it} \ {To select the atom click on the atom}]] 3 button $fb2.butok -text OK -command \ [list AtomLabOK $t atomRemo] button $fb2.butcan -text Cancel \ -command [list CancelProc $t] pack $fb2.butok $fb2.butcan -side left \ -expand 1 -padx 10 tkwait window $t } proc AtomLabOK {t type} { global doneAL varlist foclist err atomSub atomRemo atomDisp \ AdvGeom system nxdir nydir nzdir n_groupsel periodic puts stdout "ARRAY ELEMENTS:: [array names atomRemo]" check_var $varlist $foclist if $err {return} set n [xcAdvGeomState new] if { $type == "atomSub" } { puts stdout "ATOMSUBS:: $atomSub(NSOST) $atomSub(LB,1) $atomSub(NA,1)" set AdvGeom($n,atomSub) "$atomSub(sym)\n" append AdvGeom($n,atomSub) "ATOMSUBS\n" append AdvGeom($n,atomSub) "$atomSub(NSOST)\n" for {set i 1} {$i <= $atomSub(NSOST)} {incr i} { append AdvGeom($n,atomSub) "$atomSub(LB,$i) $atomSub(NA,$i)\n" } } elseif { $type == "atomRemo" } { puts stdout "SYMM:: $atomRemo(sym)" set AdvGeom($n,atomRemo) "$atomRemo(sym)\n" append AdvGeom($n,atomRemo) "ATOMREMO\n" append AdvGeom($n,atomRemo) "$atomRemo(NL)\n" for {set i 1} {$i <= $atomRemo(NL)} {incr i} { append AdvGeom($n,atomRemo) "$atomRemo(LB,$i) " } puts stdout "ATOMREMO:: $AdvGeom($n,atomRemo)" append AdvGeom($n,atomRemo) "\n" } elseif { $type == "atomDisp" } { set AdvGeom($n,atomDisp) "$atomDisp(sym)\n" append AdvGeom($n,atomDisp) "ATOMDISP\n" append AdvGeom($n,atomDisp) "$atomDisp(NDISP)\n" for {set i 1} {$i <= $atomDisp(NDISP)} {incr i} { append AdvGeom($n,atomDisp) "$atomDisp(LB,$i) $atomDisp(DX,$i) $atomDisp(DY,$i) $atomDisp(DZ,$i)\n" } } # run crystal95 set input [MakeInput] xcDebug -debug "CRYSTAL INPUT:\n$input" if { ![RunC95 $system(c95_integrals) {} $input] } { #tk_dialog .err "ERROR" "ERROR: $err" error 0 OK return } # this is for UNDO/REDO switch -exact -- $type { atomSub {GenCommUndoRedo "Substitute Atom"} atomRemo {GenCommUndoRedo "Remove Atom"} atomDisp {GenCommUndoRedo "Displace Atom"} } GenGeomDisplay 1 destroy $t } # this is old routine (Thu Sep 2 11:11:18 CEST 1999) #proc AtomLabOK {t type} { # global doneAL varlist foclist err atomSub atomRemo AdvGeom \ # system nxdir nydir nzdir n_groupsel periodic # # puts stdout "ARRAY ELEMENTS:: [array names atomRemo]" # # check_var $varlist $foclist # if $err {return} # # set n [xcAdvGeomState new] # # if { $type == "atomSub" } { # puts stdout "ATOMSUBS:: $atomSub(NSOST) $atomSub(LB,1) $atomSub(NA,1)" # set AdvGeom($n,atomSub) "$atomSub(sym)\n" # append AdvGeom($n,atomSub) "ATOMSUBS\n" # append AdvGeom($n,atomSub) "$atomSub(NSOST)\n" # for {set i 1} {$i <= $atomSub(NSOST)} {incr i} { # append AdvGeom($n,atomSub) "$atomSub(LB,$i) $atomSub(NA,$i)\n" # } # } elseif { $type == "atomRemo" } { # puts stdout "SYMM:: $atomRemo(sym)" # set AdvGeom($n,atomRemo) "$atomRemo(sym)\n" # append AdvGeom($n,atomRemo) "ATOMREMO\n" # append AdvGeom($n,atomRemo) "$atomRemo(NL)\n" # for {set i 1} {$i <= $atomRemo(NL)} {incr i} { # append AdvGeom($n,atomRemo) "$atomRemo(LB,$i) " # } # puts stdout "ATOMREMO:: $AdvGeom($n,atomRemo)" # append AdvGeom($n,atomRemo) "\n" # } # # run crystal95 # set input [MakeInput] # puts stdout "CRYSTAL INPUT:\n $input" # if ![RunC95 $system(c95_integrals) {} $input] { # #tk_dialog .err "ERROR" "ERROR: $err" error 0 OK # return # } # # GenGeomDisplay 1 # destroy $t #} # ---------------------------------------------------------------------------- # PART#3 >> # ATOMINSE # ^^^^^^^^ proc AtomInse {} { global atomInse XCState doneAI #if XCState is not c95, we can not cut a cluster if { [xcIsActive c95] == 0 || [xcIsActive render] == 0} { return } if [winfo exists .atinse] { return } # how many atoms to add OneEntryToplevel .atinse "Insert Atoms" "AtomInse" \ "Number of atoms to be added" 3 atomInse(NINS) posint 310 60 # make a toplevel with enries for AtomInse if [winfo exists .atins] { return } set t [xcToplevel .atmins "Insert Atoms" "AtomInse" . 180 0 1] # two bottom frames, one for "select AtomInse" & KEEPSYMM, # second for OK button set fb [frame $t.fb1] set atomInse(how2) "Hole-Adding" RadioBut $fb "How to add the atom:" atomInse(how2) \ left left 1 1 "Hole-Adding" "Cell-Adding" "Line-Adding" pack $fb -side top -expand true -padx 10 -pady 10 -anchor center set fb2 [frame $t.fb2] set fb3 [frame $t.fb3] pack $fb2 $fb3 -side top -expand true -fill both # ------------------------------- # SCROLLENTRIES --- SCROLLENTRIES ScrollEntries $fb2 $atomInse(NINS) "Atom N.:" \ {{Atm Num:} X: Y: Z:} {NA X Y Z} {nat real real real} \ 7 atomInse [list 2 \ [list {Select AtomInse} AddAtom $t] \ [list {Periodic Table} scroll_ptableSelectNAT $t atomInse NA]] 2 set fb3f [frame $fb3.f] set fb3a [frame $fb3.f.a] set fb3b [frame $fb3.f.b] pack $fb3f -side left -expand true -fill both pack $fb3a $fb3b -side top -expand true -fill both set atomInse(sym) "BREAKSYM" set atomInse(coor_type) "FRACTION" RadioBut $fb3a "Symmetry option::" atomInse(sym) \ left left 1 1 "BREAKSYM" "KEEPSYMM" RadioBut $fb3b "Coordinates unit::" atomInse(coor_type) \ left left 1 1 "FRACTION" "ANGSTROM" button $fb3.butok -text "OK" -command \ [list AddAtomOKCan ok $t] button $fb3.butcan -text Cancel -command \ [list AddAtomOKCan can $t] pack $fb3.butok $fb3.butcan -side left \ -expand 1 -padx 10 -pady 10 tkwait window $t } proc AddAtom {t i} { global periodic addAtom SelHoleCL atomInse SelLine \ atompos system af bf cf set SelHoleCL(transl) 1 # atomInse(how2) can be Hole-Adding or Cell-Adding if { $atomInse(how2) == "Hole-Adding" } { # here I will use "SelCentreHoleCL" proc that was designd # for CutCluster PreSel .addatom .mesa "Coordinates of the atom to be added" \ "A \"hole\" is geometrical centre of several atoms!!!\n\ To select the hole click on desired number of atoms" \ SelCentreHoleCL 15; # 15 is maximum allowed number of # selected atoms tkwait variable SelHoleCL(done) if { [info exists SelHoleCL(transl)] } {unset SelHoleCL(transl)} if { $atomInse(coor_type) == "ANGSTROM" } { set coor $SelHoleCL(centre) } else { # factional units set coor [GetFracCoor $SelHoleCL(centre)] } set atomInse(X,$i) [lindex $coor 0] set atomInse(Y,$i) [lindex $coor 1] set atomInse(Z,$i) [lindex $coor 2] } elseif { $atomInse(how2) == "Cell-Adding" } { # if periodic(dim) == 0 --> return silently if { $periodic(dim) == 0 } { return } set tplw [xcToplevel .cell "Coordinates of the atom to be added" \ "AtomInse" . 30 0] set f1 [frame $tplw.f1 -relief raised -bd 2] set f2 [frame $tplw.f2 -relief raised -bd 2] pack $f1 $f2 -side top -fill both -expand 1 set af 0.3 set bf 0.3 set cf 0.3 if { $periodic(dim) == 3 } { Entries $f1 {fract-A: fract-B: fract-C:} {af bf cf} 8 1 } elseif { $periodic(dim) == 2 } { Entries $f1 {fract-A: fract-B: Z:} {af bf cf} 8 1 } elseif { $periodic(dim) == 1 } { Entries $f1 {fract-A: Y: Z:} {af bf cf} 8 1 } else { tk_dialog .dialog ERROR \ "Wrong dimensionality of structure. Goodbye!!!" \ error 0 OK return } # initialise atomadd procedure set atompos [xc_atomadd .mesa begin] set f11 [frame $f1.1 -relief flat] set l1 [label $f11.l1 -text "Current ATOMINSE position:" -relief flat] set l2 [label $f11.l2 -textvar atompos -relief sunken -bd 2 -width 45] pack $f11 -side top -fill both -expand 1 pack $l1 $l2 -side left -padx 5 -pady 5 set upd [button $f2.upd -text "Update" -command [list CellAdding upd]] set ok [button $f2.ok -text "OK" -command [list CellAdding ok]] set can [button $f2.can -text "Cancel" -command [list CellAdding can]] pack $upd $ok $can -side left -expand 1 -padx 5 -pady 5 tkwait variable addAtom(done) if { $atomInse(coor_type) == "ANGSTROM" } { set atomInse(X,$i) [lindex $atompos 0] set atomInse(Y,$i) [lindex $atompos 1] set atomInse(Z,$i) [lindex $atompos 2] } else { # factional units set atomInse(X,$i) $af set atomInse(Y,$i) $bf set atomInse(Z,$i) $cf } destroy $tplw } elseif { $atomInse(how2) == "Line-Adding" } { # there must also be some entry for specifying the fraction of # line from first atom --> that is the adding atom position PreSel .addatom .mesa "Coordinates of the atom to be added" \ "For Line-Adding it is necessary to select two atoms\n \ & to specify the fraction of line-length from first atom \ in FRACTIONAL units" \ LineSel 2 tkwait variable SelLine(done) if { $atomInse(coor_type) == "ANGSTROM" } { set coor $SelLine(coor) } else { # factional units set coor [GetFracCoor $SelLine(coor)] } set atomInse(X,$i) [lindex $coor 0] set atomInse(Y,$i) [lindex $coor 1] set atomInse(Z,$i) [lindex $coor 2] } } proc AddAtomOKCan {type w} { global varlist foclist err atomInse AdvGeom \ system nxdir nydir nzdir n_groupsel periodic if { $type == "ok" } { puts stdout "ARRAY ELEMENTS:: [array names atomRemo]" check_var $varlist $foclist if $err {return} set n [xcAdvGeomState new] puts stdout "ATOMINSE:: $atomInse(NINS) \ $atomInse(NA,1) $atomInse(X,1) $atomInse(Y,1) $atomInse(Z,1)" set AdvGeom($n,atomInse) "$atomInse(coor_type)\n$atomInse(sym)\n" append AdvGeom($n,atomInse) "ATOMINSE\n" append AdvGeom($n,atomInse) "$atomInse(NINS)\n" for {set i 1} {$i <= $atomInse(NINS)} {incr i} { append AdvGeom($n,atomInse) \ "$atomInse(NA,$i) $atomInse(X,$i) $atomInse(Y,$i) \ $atomInse(Z,$i)\n" } # run crystal95 set input [MakeInput] xcDebug -debug "CRYSTAL INPUT:\n$input" if { ![RunC95 $system(c95_integrals) {} $input] } { #tk_dialog .err "ERROR" "ERROR: $err" error 0 OK return } # this is for UNDO/REDO GenCommUndoRedo "Insert Atom" GenGeomDisplay 1 } # this is for type == ok & can if [winfo exists $w] { destroy $w } } proc CellAdding {type} { global addAtom atompos af bf cf # updating:: if { $type == "upd" } { puts stdout "CellAdding upd ATOMPOS: $af $bf $cf" set atompos [xc_atomadd .mesa update $af $bf $cf] puts stdout "CellAdding upd ATOMPOS: $atompos" } elseif { $type == "ok" } { # OK:: if [info exists addAtom(done)] { unset addAtom(done) } set atompos [xc_atomadd .mesa update $af $bf $cf] puts stdout "CellAdding ok ATOMPOS: $atompos" xc_atomadd .mesa clean set addAtom(done) 1 } elseif { $type == "can" } { # Cancel:: xc_atomadd .mesa clean destroy .cell } } # ---------------------------------------------------------------------------- # PART#4 >> # SUPERCELL # ^^^^^^^^^ proc SuperCell {} { global AdvGeom superCell periodic # if XCState is not c95, we can not generate a supercell if { [xcIsActive c95] == 0 || [xcIsActive render] == 0 } { return } # SuperCell option is available just for periodic systems if { $periodic(dim) == 0 } { return } # # initialize SuperCell Option # SetWatchCursor xc_supercell .mesa init ResetCursor set t [xcToplevel [WidgetName] "Generation of a SuperCell" \ "SuperCell" . 180 0 1] set f1 [frame $t.f1 -highlightthickness 0] set f2 [frame $t.f2 -relief raised -bd 2 -highlightthickness 0] pack $f1 $f2 -side top -fill x ############ # FRAME #1 # ############ set f21 [frame $f2.1 -relief raised -bd 1] set f22 [frame $f2.2 -relief raised -bd 1] set f2a [frame $f2.a] set f2b [frame $f2.b] pack $f21 -side left -fill both -expand 1 pack $f22 -side left -fill both pack $f2a -side left -fill both -in $f21 -padx 5 -pady 5 set b1 [button $f1.b1 \ -text "Specify an Expansion Matrix" \ -bd 3 \ -highlightthickness 0 \ -command [list SuperCell_Show matrix $f2a $f2b $f21 $f1.b1 $f1.b2]] set b2 [button $f1.b2 \ -text "Elongate Unit-Cell Vectors" \ -bd 1 \ -highlightthickness 0 \ -command [list SuperCell_Show elongate $f2a $f2b $f21 $b1 $f1.b2]] pack $b1 $b2 -side left -fill y ############ # FRAME #2 # ############ # # frame $f2a set superCell(type) matrix set superCell(matrix_varlist) {} set superCell(matrix_foclist) {} label $f2a.lt -text "New_Vectors == Expansion_Matrix x Vectors" -anchor w grid $f2a.lt -column 0 -row 0 -columnspan 4 -sticky w -pady 10 label $f2a.ll -text "Expansion Matrix ==" if { $periodic(dim) == 3 } { set row 2 } else { set row 1 } grid $f2a.ll -column 0 -row $row for {set i 1} {$i <= $periodic(dim)} {incr i} { for {set j 1} {$j <= $periodic(dim)} {incr j} { set e [entry $f2a.e${i}_$j \ -textvariable superCell(e$i,e$j) -width 5] lappend superCell(matrix_varlist) [list superCell(e$i,e$j) real] lappend superCell(matrix_foclist) $e grid $e -column $j -row $i -padx 3 -pady 3 } } focus [lindex $superCell(matrix_foclist) 0] tkwait visibility $f2a.e1_1 set w [winfo width $f21] set h [winfo height $f21] pack propagate $f21 false # # frame $f2b set superCell(elongate_varlist) {} set superCell(elongate_foclist) {} label $f2b.lt -text "New_Vector(i) == factor(i) Vector(i)" -anchor w grid $f2b.lt -column 0 -row 0 -columnspan 4 -sticky w -pady 10 for {set i 1} {$i <= $periodic(dim)} {incr i} { label $f2b.l$i -text "factor($i) ==" grid $f2b.l$i -column 0 -row $i -sticky w set e [entry $f2b.e$i \ -textvariable superCell(e$i) -width 5] lappend superCell(elongate_varlist) [list superCell(e$i) real] lappend superCell(elongate_foclist) $e grid $e -column 1 -row $i -padx 3 -pady 3 -sticky w } # # frame $f22 --> Test It/OK/Cancel # proc SuperCell_Can t { global superCell unset superCell # # clear the SuperCell OPTION # SetWatchCursor xc_supercell .mesa clear # go back to previous render state CalStru ResetCursor xcSwapBuffers CancelProc $t } set testit [button $f22.test -text "Test It" \ -command [list SuperCell_TestIt $f22.ok]] set ok [button $f22.ok -text "OK" -command [list SuperCell_OK $t]] set can [button $f22.can -text "Cancel" \ -command [list SuperCell_Can $t]] pack $testit $ok $can -side top -padx 5 -pady 5 -fill x $ok configure -state disabled xcSwapBuffers } proc SuperCell_Show {type fmatrix felongate parent bmatrix belongate} { global superCell if { $type == "matrix" } { set superCell(type) matrix $bmatrix config -bd 3 $belongate config -bd 1 pack forget $felongate pack $fmatrix -side left -fill both -in $parent -padx 5 -pady 5 focus [lindex $superCell(matrix_foclist) 0] } else { set superCell(type) elongate $bmatrix config -bd 1 $belongate config -bd 3 pack forget $fmatrix pack $felongate -side left -fill both -in $parent -padx 5 -pady 5 focus [lindex $superCell(elongate_foclist) 0] } } proc SuperCell_TestIt okbut { $okbut configure -state normal SetWatchCursor update if { ![SuperCell_ValidEMatrix] } { ResetCursor xcSwapBuffers return 0 } if { ![SuperCell_Run95] } { ResetCursor xcSwapBuffers return 0 } # everything looks OK GenGeomDisplay 1 xc_supercell .mesa testit xcAdvGeomState delete ResetCursor xcSwapBuffers return 1 } proc SuperCell_OK tplw { global superCell SetWatchCursor update if ![SuperCell_ValidEMatrix] { ResetCursor xcSwapBuffers return 0 } if ![SuperCell_Run95] { ResetCursor xcSwapBuffers return 0 } # this is for UNDO/REDO GenCommUndoRedo "SuperCell" xc_supercell .mesa clear ResetCursor xcSwapBuffers destroy $tplw } proc SuperCell_ValidEMatrix {} { global superCell periodic set type $superCell(type) if ![check_var $superCell(${type}_varlist) $superCell(${type}_foclist)] { return 0 } xcDebug -debug "Periodic(dim) == $periodic(dim)" if { $superCell(type) == "matrix" } { for {set i 1} {$i <= $periodic(dim)} {incr i} { for {set j 1} {$j <= $periodic(dim)} {incr j} { set superCell($i,$j) $superCell(e$i,e$j) } } } else { for {set i 1} {$i <= $periodic(dim)} {incr i} { for {set j 1} {$j <= $periodic(dim)} {incr j} { if { $i != $j } { set superCell($i,$j) 0.0 } else { if { $superCell(e$i) == 0 } { tk_dialog [WidgetName] ERROR \ "ERROR !\nYou have badly specified the $i factor. Please try again !" error 0 OK focus [lindex $superCell(elongate_foclist) \ [expr $i - 1]] return 0 } set superCell($i,$i) $superCell(e$i) } } } } return 1 } proc SuperCell_Run95 {} { global superCell periodic system AdvGeom # now set the AdvGeom variable set n [xcAdvGeomState new] set AdvGeom($n,superCell) "SUPERCELL\n" for {set i 1} {$i <= $periodic(dim)} {incr i} { for {set j 1} {$j <= $periodic(dim)} {incr j} { append AdvGeom($n,superCell) "$superCell($i,$j) " } append AdvGeom($n,superCell) " " } append AdvGeom($n,superCell) \n set input [MakeInput] set output $system(SCRDIR)/xc_output.$system(PID) set inp $system(SCRDIR)/xc_tmp.$system(PID) set fileID [open $inp w] puts $fileID $input flush $fileID close $fileID xcDebug -debug "CRYSTAL INPUT:\n$input" return [RunC95_advGeom $inp SUPERCELL \ "super-cell was badly choosen or the upper limit for the number of atoms in SUPERCELL was exceeded."] } # --------------------------------------------------------------------------- # PART#5>> # ATOMDISP # ^^^^^^^^ proc AtomDisp {} { global atomDisp XCState doneAL # if XCState is not c95, we can not substitute an atom if { [xcIsActive c95] == 0 || [xcIsActive render] == 0 } { return } # how many atoms to substitute if [winfo exists .atdisp] { return } OneEntryToplevel .atdisp "Displace Atoms" "atomDisp" \ "Number of atoms to be displaced" 3 atomDisp(NDISP) posint 310 60 # make a toplevel with enries for atomDisp if [winfo exists .atmdis] { return } set t [xcToplevel .atmdis "Displace Atoms" "atomDisp" . 180 0 1] set fb [frame $t.fb1] set atomDisp(sym) "BREAKSYM" RadioBut $fb "Symmetry option::" atomDisp(sym) \ left left 1 1 "BREAKSYM" "KEEPSYMM" pack $fb -side bottom -expand true -padx 10 -pady 10 -anchor center # ------------------------------------- # SCROLLENTRIES --- SCROLLENTRIES ##### ScrollEntries .atmdis $atomDisp(NDISP) "Atom N.:" \ {{Atomic Label:} DX: DY: DZ:} {LB DX DY DZ} \ {posint real real real} 3 atomDisp [list 1 \ [list {Select AtomDisp} SelAtomLabel $t atomDisp LB \ {Select an atom to substitute} \ {To select an atom click on the atom}]] 3 button $fb.butok -text OK -command \ [list AtomLabOK $t atomDisp] button $fb.butcan -text Cancel -command [list CancelProc $t] pack $fb.butok $fb.butcan -side left \ -expand 1 -padx 10 -pady 10 tkwait window $t } # ---------------------------------------------------------------------------- # PART#6 >> # ELASTIC # ^^^^^^^ proc Elastic {} { global AdvGeom elastic periodic # if XCState is not c95, we can not do ELATSIC if { [xcIsActive c95] == 0 || [xcIsActive render] == 0 } { return } # Elastic option is available just for periodic systems # I think just for CRYSTALS ??? if { $periodic(dim) == 0 } { return } # # initialize SuperCell Option # (I will do the same feedback as for SuperCell) SetWatchCursor xc_supercell .mesa init ResetCursor set t [xcToplevel [WidgetName] "Elastic Deformation" \ "Elastic" . 180 0 1] set elastic(type) Z_vol set elastic(varlist) {} set elastic(foclist) {} set f1 [frame $t.1 -relief raised -bd 1] set f2 [frame $t.2 -relief raised -bd 1] set f1a [frame $f1.a -relief groove -bd 2] set f1b [frame $f1.b -relief groove -bd 2] pack $f1 -side left -fill both -expand 1 pack $f2 -side left -fill both pack $f1a $f1b -side top -fill both -padx 1m -pady 1m label $f1a.1 -text \ "Deformation through \"Z\" matrix is defined as:\nL' == L + Z" label $f1a.2 -text \ "Deformation through \"e\" matrix is defined as:\nL' == (I + e)L" pack $f1a.1 $f1a.2 -side top -fill both set textlist { {Z matrix deformation -- volume CONSERVING} {Z matrix deformation -- NOT volume conserving} {e matrix deformation -- volume CONSERVING} {e matrix deformation -- NOT volume conserving} } set valuelist { Z_vol Z e_vol e } foreach text $textlist value $valuelist i {1 2 3 4} { radiobutton $f1a.r$i -variable elastic(type) \ -text $text -value $value -anchor sw pack $f1a.r$i -side top -fill both -padx 10 -pady 5 } label $f1b.l -text "Specify Matrix:" grid $f1b.l -row 0 -padx 3 -pady 3 -columnspan $periodic(dim) -sticky w for {set i 1} {$i <= $periodic(dim)} {incr i} { for {set j 1} {$j <= $periodic(dim)} {incr j} { set e [entry $f1b.e${i}_$j \ -textvariable elastic(e$i,e$j) -width 5] lappend elastic(varlist) [list elastic(e$i,e$j) real] lappend elastic(foclist) $e grid $e -column $j -row $i -padx 3 -pady 3 } } focus [lindex $elastic(foclist) 0] tkwait visibility $f1b.e1_1 # # frame $f2 --> Test It/OK/Cancel # proc Elastic_Can t { global elastic unset elastic # # clear the SuperCell OPTION # SetWatchCursor xc_supercell .mesa clear # go back to previous render state CalStru ResetCursor xcSwapBuffers CancelProc $t } set testit [button $f2.test -text "Test It" \ -command [list Elastic_TestIt $f2.ok]] set ok [button $f2.ok -text "OK" -command [list Elastic_OK $t]] set can [button $f2.can -text "Cancel" \ -command [list Elastic_Can $t]] pack $testit $ok $can -side top -padx 5 -pady 5 -fill x $ok configure -state disabled xcSwapBuffers } proc Elastic_TestIt okbut { $okbut configure -state normal SetWatchCursor update if {![Elastic_ValidEMatrix] } { ResetCursor xcSwapBuffers return 0 } if { ![Elastic_Run95] } { ResetCursor xcSwapBuffers return 0 } # everything looks OK GenGeomDisplay 1 xc_supercell .mesa testit xcAdvGeomState delete ResetCursor xcSwapBuffers return 1 } proc Elastic_OK tplw { global elastic SetWatchCursor update if { ![Elastic_ValidEMatrix] } { ResetCursor xcSwapBuffers return 0 } if { ![Elastic_Run95] } { ResetCursor xcSwapBuffers return 0 } # this is for UNDO/REDO GenCommUndoRedo "Elastic Deformation" xc_supercell .mesa clear ResetCursor xcSwapBuffers destroy $tplw } proc Elastic_ValidEMatrix {} { global elastic periodic set type $elastic(type) if ![check_var $elastic(varlist) $elastic(foclist)] { return 0 } for {set i 1} {$i <= $periodic(dim)} {incr i} { for {set j 1} {$j <= $periodic(dim)} {incr j} { set elastic($i,$j) $elastic(e$i,e$j) } } return 1 } proc Elastic_Run95 {} { global elastic periodic system AdvGeom switch -exact -- $elastic(type) { Z_vol { set idef +1 } Z { set idef -1 } e_vol { set idef +2 } e { set idef -2 } } # now set the AdvGeom variable set n [xcAdvGeomState new] set AdvGeom($n,elastic) "ELASTIC\n$idef\n" for {set i 1} {$i <= $periodic(dim)} {incr i} { for {set j 1} {$j <= $periodic(dim)} {incr j} { append AdvGeom($n,elastic) "$elastic($i,$j) " } if { $i < $periodic(dim) } { append AdvGeom($n,elastic) "\n" } } append AdvGeom($n,elastic) \n set input [MakeInput] set output $system(SCRDIR)/xc_output.$system(PID) set inp $system(SCRDIR)/xc_tmp.$system(PID) set fileID [open $inp w] puts $fileID $input flush $fileID close $fileID xcDebug -debug "CRYSTAL INPUT:" xcDebug -debug "--------------\n$input" return [RunC95_advGeom $inp ELASTIC "error occured while executing ELASTIC option."] } # ---------------------------------------------------------------------------- # PART#7 >> # ROTATE # ^^^^^^ proc RotFrame {} { global AdvGeom rotFrame periodic # if XCState is not c95, we can not do ELATSIC if { [xcIsActive c95] == 0 || [xcIsActive render] == 0 } { return } # ROTATE option is available just for periodic systems # I think just for CRYSTALS ??? if { $periodic(dim) == 0 } { return } # # initialize SuperCell Option # (I will do the same feedback as for SuperCell) SetWatchCursor xc_supercell .mesa init ResetCursor set t [xcToplevel [WidgetName] "Rotate Cartesian Frame" \ "Rotate" . 180 0 1] set rotFrame(varlist) {} set rotFrame(foclist) {} set f1 [frame $t.1 -relief raised -bd 1] set f2 [frame $t.2 -relief raised -bd 1] pack $f1 -side left -fill both -expand 1 pack $f2 -side left -fill both label $f1.1 -text \ "Specify Miller indices of the basal layer of the new 3D unit cell" pack $f1.1 -side top -fill both set rotFrame(foclist) \ [Entries $f1 {I: J: K:} {rotFrame(I) rotFrame(J) rotFrame(K)} 4 1] set whead [string trimright $rotFrame(foclist) 1] lappend rotFrame(foclist) ${whead}2 ${whead}3 set rotFrame(varlist) { {rotFrame(I) int} {rotFrame(J) int} {rotFrame(K) int} } # # frame $f2 --> Test It/OK/Cancel # proc RotFrame_Can t { global rotFrame unset rotFrame # # clear the SuperCell OPTION # SetWatchCursor xc_supercell .mesa clear # go back to previous render state CalStru ResetCursor xcSwapBuffers CancelProc $t } set testit [button $f2.test -text "Test It" \ -command [list RotFrame_TestIt $f2.ok]] set ok [button $f2.ok -text "OK" -command [list RotFrame_OK $t]] set can [button $f2.can -text "Cancel" \ -command [list RotFrame_Can $t]] pack $testit $ok $can -side top -padx 5 -pady 5 -fill x $ok configure -state disabled xcSwapBuffers } proc RotFrame_TestIt okbut { $okbut configure -state normal SetWatchCursor update if ![RotFrame_Valid_IJK] { ResetCursor xcSwapBuffers return 0 } if ![RotFrame_Run95] { ResetCursor xcSwapBuffers return 0 } # everything looks OK GenGeomDisplay 1 xc_supercell .mesa testit xcAdvGeomState delete ResetCursor xcSwapBuffers return 1 } proc RotFrame_OK tplw { global rotFrame SetWatchCursor update if ![RotFrame_Valid_IJK] { ResetCursor xcSwapBuffers return 0 } if ![RotFrame_Run95] { ResetCursor xcSwapBuffers return 0 } # this is for UNDO/REDO GenCommUndoRedo "Rotate Cartesian Frame" xc_supercell .mesa clear ResetCursor xcSwapBuffers destroy $tplw } proc RotFrame_Valid_IJK {} { global rotFrame periodic if ![check_var $rotFrame(varlist) $rotFrame(foclist)] { return 0 } return 1 } proc RotFrame_Run95 {} { global rotFrame periodic system AdvGeom set n [xcAdvGeomState new] set AdvGeom($n,rotate) "ROTATE\n$rotFrame(I) $rotFrame(J) $rotFrame(K)\n" set input [MakeInput] set output $system(SCRDIR)/xc_output.$system(PID) set inp $system(SCRDIR)/xc_tmp.$system(PID) set fileID [open $inp w] puts $fileID $input flush $fileID close $fileID xcDebug -debug "CRYSTAL INPUT:" xcDebug -debug "--------------\n$input" return [RunC95_advGeom $inp ROTATE "an error occured while executing ROTATE option"] } xcrysden-1.6.2/Tcl/print.tcl0000644000175000017500000003411313524762173014451 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/print.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc printTogl {{togl .mesa} {sfile {}}} { global xcMisc system printSetup if { $sfile == "" } { set sfile [printTogl_queryFilename] } if { $sfile == "" } { return 0 } set ext [file extension [file tail $sfile]] set EXT [string trimleft [string toupper $ext] .] SetWatchCursor switch -exact -- $EXT { PS - EPS - PDF - SVG { # vectorial printToglEPS $togl $sfile } default { printTogl_bitmap $togl $EXT $sfile } } ResetCursor } proc printTogl_bitmap {togl EXT sfile} { global system xcrys printSetup if { ! [info exists printSetup(dumpWindow) ] } { set printSetup(dumpWindow) 0 } set EXT [string trimleft [string toupper $EXT] .] # print in bitmap printTogl_Antialias begin if { $printSetup(dumpWindow) } { # # This is a workaround for Togl2.0 (to be used when Togl2.0 makes blank images) # dumpWindow $togl $sfile } else { if { $EXT == "PPM" } { cry_dump2ppm $togl $sfile #$togl takephoto $xcrys(print.image) #$xcrys(print.image) write $sfile -format ppm } else { cry_dump2ppm $togl $system(SCRDIR)/tmp.ppm #$togl takephoto $xcrys(print.image) #$xcrys(print.image) write $system(SCRDIR)/tmp.ppm -format ppm scripting::_printToFile_imageConvert $system(SCRDIR)/tmp.ppm $sfile } } printTogl_Antialias end } proc printTogl_queryFilename {} { global xcMisc system if { ! [info exists xcMisc(titlefile)] } { xcDebug -stderr "WARNING: xcMisc(titlefile) does not exists" set head print } else { set head [file rootname [file tail $xcMisc(titlefile)]] } set defext .eps # # check if we have converting program # if { [info exists xcMisc(ImageMagick.convert)] } { set deffile $head.png set defext .png set filetypes { {{PNG} {.png} } {{JPEG} {.jpg} } {{EPS} {.eps} } {{PDF} {.pdf} } {{SVG} {.svg} } {{GIF} {.gif} } {{TIFF} {.tiff}} {{PPM} {.ppm} } {{PGM} {.pgm} } {{All Files} * } } } else { set filetypes { {{EPS} {.eps} } {{PDF} {.pdf} } {{SVG} {.svg} } {{PPM} {.ppm} } {{All Files} * } } set deffile $head.eps } set sfile [tk_getSaveFile -initialdir $system(PWD) \ -title "Print to File" \ -defaultextension $defext \ -initialfile $deffile \ -filetypes $filetypes] return $sfile } proc printTogl_Antialias {mode} { global check printSetup if { $mode == "begin" } { if { [info exists printSetup(useAntialias)] } { if { $printSetup(useAntialias) && !$check(antialias) } { set printSetup(useAntialias_switch) 1 puts stderr "printTogl: Turning ON anti-aliasing ..." set check(antialias) 1 AntiAlias } } } elseif { $mode == "end" } { if { [info exists printSetup(useAntialias_switch)] } { if { $printSetup(useAntialias_switch) } { set printSetup(useAntialias_switch) 0 puts stderr "printTogl: Turning OFF anti-aliasing ..." set check(antialias) 0 AntiAlias } } } else { ErrorIn printTogl_Antialias \ "wrong mode \"$mode\", must be begin or end" } } proc printWidget {widget} { # NOTICE: obsolete command, use dumpWindow proc instead global xcMisc system if { ! [info exists xcMisc(titlefile)] } { xcDebug -stderr "WARNING: xcMisc(titlefile) does not exists" set head print } else { set head [file rootname [file tail $xcMisc(titlefile)]] } set defext .eps # # check if we have convert program # if { [info exists xcMisc(ImageMagick.convert)] } { tk_messageBox -message "WARNING:\n\nYou are about to dump the content of a widget.Please make sure that no window obscures the widget to be printed. This is because XCRYSDEN's print is an XWD window dump." -type ok -icon warning set deffile $head.jpg set defext .jpg set filetypes { {{JPEG} {.jpg} } {{EPS} {.eps} } {{PNG} {.png} } {{GIF} {.gif} } {{TIFF} {.tiff}} {{All Files} * } } } else { tk_messageBox -message "WARNING:\n\nIn order to dump an xcMisc(ImageMagick.convert) variables must be defined. Please define it in the \$HOME/.xcrysden/custom-definitions file. The variable should hold the path of the XWD-to-xxx (xxx=PNG,GIF,JPG,...) format. Example:\n\n set xcMisc(ImageMagick.convert) /usr/bin/convert" -type ok -icon warning return } set sfile [tk_getSaveFile -initialdir $system(PWD) \ -title "Print to File" \ -defaultextension $defext \ -initialfile $deffile \ -filetypes $filetypes] if { $sfile == {} } { return 0 } set ext [file extension [file tail $sfile]] SetWatchCursor # # first dump with xwd and then convert to wanted format # set head [file rootname [file tail $xcMisc(titlefile)]] raise $widget update after 1000 set id [winfo id $widget] puts stderr "PRINTING WINDOW: $id [winfo id .mesa]" after idle [list xcCatchExecReturn xwd -id $id -out $system(SCRDIR)/$head.xwd] update idletasks # convert -gaussian 2x2 -geometry 200% # THIS SHOULD be catched !!! eval xcCatchExecReturn $xcMisc(ImageMagick.convert) $system(SCRDIR)/$head.xwd $sfile ResetCursor } proc printToglEPS {togl file} { global light toglEPS set EXT [string toupper [file extension [file tail $file]]] set EXT [string trimleft $EXT .] switch -exact -- $EXT { PS - EPS - PDF - SVG { set toglEPS(format) $EXT } } set t [xcToplevel [WidgetName] "$EXT Printing Options" "Print" . 100 100 1] if { ! [info exists toglEPS(format)] } { set toglEPS(format) EPS } if { ! [info exists toglEPS(pointsize)] } { set toglEPS(pointsize) 2.0 } if { ! [info exists toglEPS(linewidth)] } { set toglEPS(linewidth) 2.0 } if { $light == "On" } { # # ligting-ON mode # set toglEPS(sort) BSP_SORT set toglEPS(EPStype) BITMAP } else { # # ligting-OFF mode # set toglEPS(sort) NO_SORT set toglEPS(EPStype) VECTORIAL } set f1 [frame $t.1] set f2 [frame $t.2] set f0 [frame $t.0] set f3 [frame $t.3] pack $f1 $f2 -side top -expand 1 -fill x pack $f0 -fill both pack $f3 -side bottom -expand 0 -fill x set toglEPS(frame2) $f2 if { $toglEPS(format) == "SVG" } { # SVG is "just" vectorial set toglEPS(EPStype) VECTORIAL set menuentries { VECTORIAL {set toglEPS(EPStype) VECTORIAL} } } else { set menuentries { BITMAP {set toglEPS(EPStype) BITMAP} VECTORIAL {set toglEPS(EPStype) VECTORIAL} } } set m [xcMenuButton $f1 \ -labeltext "Type of PostScript:" \ -labelwidth 19 \ -textvariable toglEPS(EPStype) \ -menu $menuentries] pack $m -side top -padx 5 -expand 1 -fill x trace variable toglEPS(EPStype) w xcTrace set f21 [frame $f2.1] set f22 [frame $f2.2] set f23 [frame $f2.3] set f24 [frame $f2.4] pack $f21 $f22 $f23 $f24 -side top -padx 5 -expand 1 -fill x # format sort options pointsize linewidth #m1 [xcMenuButton $f21 \ # -labeltext "Output format:" \ # -labelwidth 19 \ # -textvariable toglEPS(format) \ # -menu { # PS {set toglEPS(format) PS} # EPS {set toglEPS(format) EPS} # PDF {set toglEPS(format) PDF} # SVG {set toglEPS(format) SVG} # }] set m2 [xcMenuButton $f22 \ -labeltext "Sorting:" \ -labelwidth 19 \ -textvariable toglEPS(sort) \ -menu { NO_SORT {set toglEPS(sort) NO_SORT} SIMPLE_SORT {set toglEPS(sort) SIMPLE_SORT} BSP_SORT {set toglEPS(sort) BSP_SORT} }] pack $m2 -side top -padx 5 -pady 5 -expand 1 -fill x Entries $f23 {"Point size:" "Line width:"} { toglEPS(pointsize) toglEPS(linewidth)} 5 label $f23.__l -text "Don't touch below settings,\nunless you know what you are doing !!!" -relief ridge -bd 2 pack $f23.__l -side top -padx 5 -pady 5 -ipadx 5 -ipady 5 -fill x -expand 0 label $f24.__l -text "GL2PS Options:" pack $f24.__l -side left CheckVarButtons $f24 { DRAW_BACKGROUND SIMPLE_LINE_OFFSET SILENT BEST_ROOT OCCLUSION_CULL NO_TEXT LANDSCAPE NO_PS3_SHADING NO_PIXMAP NO_BLENDING } { toglEPS(DRAW_BACKGROUND) toglEPS(SIMPLE_LINE_OFFSET) toglEPS(SILENT) toglEPS(BEST_ROOT) toglEPS(OCCLUSION_CULL) toglEPS(NO_TEXT) toglEPS(LANDSCAPE) toglEPS(NO_PS3_SHADING) toglEPS(NO_PIXMAP) toglEPS(NO_BLENDING) } top # bottom buttons set ok [button $f3.print -text "Print" -default active \ -command [list printToglEPS_Print $t $togl $file]] set can [button $f3.cancel -text "Cancel" \ -command [list CancelProc $t]] pack $ok $can -side right -padx 5 -pady 10 -expand 1 } proc printToglEPS_Print {t togl file} { global toglEPS light set EXT [string toupper [file extension [file tail $file]]] if { $toglEPS(EPStype) == "BITMAP" } { destroy $t if { $EXT == ".SVG" } { set type [string trimleft $EXT .] set file [file rootname $file].pdf tk_messageBox -message "WARNING:\n\nCannot print the $type file in a bitmap form.\n\nThe PDF file will be saved instead: [file tail $file]" -type ok -icon warning } printTogl_bitmap $togl $EXT $file return } else { if { $light == "On" } { set ans [tk_messageBox -icon info -message "NOTICE: Printing to vectorial file in \"Ligting-On mode\" may take long time and the file size can reach up to several 100 MB.\n\nWould you like to continue?" -type yesno] if { $ans == "no" } { return } } destroy $t set _options GL2PS_NONE foreach elem { DRAW_BACKGROUND SIMPLE_LINE_OFFSET SILENT BEST_ROOT OCCLUSION_CULL NO_TEXT LANDSCAPE NO_PS3_SHADING } { if { $toglEPS($elem) == 1 } { lappend _options GL2PS_$elem } } xcDebug -stderr "Executing: cry_gl2psPrintTogl $togl \ GL2PS_$toglEPS(format) \ GL2PS_$toglEPS(sort) \ $_options $toglEPS(pointsize) $toglEPS(linewidth) $file" SetWatchCursor cry_gl2psPrintTogl $togl \ GL2PS_$toglEPS(format) \ GL2PS_$toglEPS(sort) \ $_options $toglEPS(pointsize) $toglEPS(linewidth) $file ResetCursor } } proc printSetup {} { global xcMisc printSetup if { ! [info exists xcMisc(ImageMagick.convertOptions)] } { #set xcMisc(ImageMagick.convertOptions) "-quality 90 -antialias -blur 1x1 -trim -bordercolor white -border 20x20 -bordercolor black -border 3x3" set xcMisc(ImageMagick.convertOptions) "-bordercolor black -border 3x3" } if { ! [info exists printSetup(useAntialias) ] } { set printSetup(useAntialias) 0 } if { ! [info exists printSetup(useOptions) ] } { set printSetup(useOptions) 0 } if { ! [info exists printSetup(dumpWindow) ] } { set printSetup(dumpWindow) 0 } set t [xcToplevel .print_setup "Print Setup" "Print Setup" . 0 0 1] set f1 [frame $t.1 -relief groove -bd 2] set f2 [frame $t.2] pack $f1 -side top -expand 1 -fill both -padx 5 -pady 5 -ipadx 5 -ipady 5 pack $f2 -side top -expand 1 -fill x -padx 5 -pady 5 -ipadx 5 -ipady 5 set cb0 [checkbutton $f1.__cb0 -text "Use Anti-aliasing" \ -variable printSetup(useAntialias) \ -onvalue 1 -offvalue 0 -relief raised -bd 1] set cb1 [checkbutton $f1.__cb1 -text "Print via screenshot (use if you get blank images otherwise)" \ -variable printSetup(dumpWindow) \ -onvalue 1 -offvalue 0 -relief raised -bd 1] set cb2 [checkbutton $f1.__cb2 -text "Use command-line options" \ -variable printSetup(useOptions) \ -onvalue 1 -offvalue 0 -relief raised -bd 1] pack $cb0 $cb1 $cb2 -side top -fill x -expand 1 -padx 5 -pady 5 set e1 [FillEntries $f1 { "Image conversion PPM to PNG/JPG/GIF program:" "Image conversion program command-line options:" } { xcMisc(ImageMagick.convert) xcMisc(ImageMagick.convertOptions) } 45 80 top top] regsub -- {1.entry1$} $e1 {2.entry2} printSetup(optionEntry) trace variable printSetup(useOptions) w printSetup:traceOptions printSetup:traceOptions printSetup useOptions w set ok [button $f2.ok -text "OK" -command [list CancelProc $t]] pack $ok -side top -expand 1 -ipadx 3 -ipady 3 -padx 5 -pady 5 } proc printSetup:traceOptions {name1 name2 op} { global printSetup if { $printSetup(useOptions) == 0 } { $printSetup(optionEntry) config -relief flat $printSetup(optionEntry) config -fg \#666 xcDisableOne $printSetup(optionEntry) } else { $printSetup(optionEntry) config -relief sunken $printSetup(optionEntry) config -fg \#000000 xcEnableOne $printSetup(optionEntry) } } xcrysden-1.6.2/Tcl/dispModes.tcl0000644000175000017500000003763113514561604015247 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/dispModes.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc Lighting {var} { global dispmode xcFonts xcMisc light # var -- can be On ro Off # On - 3D displayModes # Off - 2D displaymodes if { ![info exists dispmode(mode3D_ModeFrame)] } { set dispmode(mode3D_ModeFrame) {} } if { $var == "Off" || $var == "On" } { set light $var } if { $var == "Off" } { # if 3D widgets exists delete them if {[winfo exists .ctrl.c.f.fr3.canv.mode3D]} { destroy .ctrl.c.f.fr3.canv.mode3D } if {[winfo exists $dispmode(mode3D_ModeFrame)]} { #xcDisableAll $dispmode(mode3D_ModeFrame) destroy $dispmode(mode3D_ModeFrame) } pack forget .ctrl.c.f.fr3.2 # if 2D widgets already exists, just return silently if {[winfo exists .ctrl.c.f.fr3.canv.mode2D]} { return } set f [frame .ctrl.c.f.fr3.canv.mode2D -bd 0] set ff [frame $f.2d] .ctrl.c.f.fr3.canv create window 0 0 \ -tags frame -anchor nw \ -width [winfo width .ctrl.c.f.fr3.canv] \ -height [winfo height .ctrl.c.f.fr3.canv] -window $f set b1 [radiobutton $ff.wire -text "WireFrame" -image wireframes_2d \ -indicatoron 0 -variable dispmode(mode2D_name) -selectcolor \#44ff44 -value WF \ -command [list Display2D WF]] set b2 [radiobutton $ff.point -text "PointLine" -image pointlines_2d \ -indicatoron 0 -variable dispmode(mode2D_name) -selectcolor \#44ff44 -value PL \ -command [list Display2D PL]] set b3 [radiobutton $ff.pipe -text "Pipe&Ball" -image pipeballs_2d \ -indicatoron 0 -variable dispmode(mode2D_name) -selectcolor \#44ff44 -value PB \ -command [list Display2D PB]] set b4 [radiobutton $ff.ball1 -text "BallStick-1" -image ballsticks1_2d \ -indicatoron 0 -variable dispmode(mode2D_name) -selectcolor \#44ff44 -value BS1 \ -command [list Display2D BS1]] set b5 [radiobutton $ff.ball2 -text "BallStick-2" -image ballsticks2_2d \ -indicatoron 0 -variable dispmode(mode2D_name) -selectcolor \#44ff44 -value BS2 \ -command [list Display2D BS2]] set b6 [radiobutton $ff.fill -text "SpaceFill" -image spacefills_2d \ -indicatoron 0 -variable dispmode(mode2D_name) -selectcolor \#44ff44 -value SF \ -command [list Display2D SF]] #set i15 [expr round(15 * $xcMisc(resolution_ratio1))] #pack $b1 $b2 $b3 $b4 $b5 $b6 -side top -padx $i15 -pady 1 -fill x grid $b1 -row 0 -column 0 -pady 1 -padx 1 -sticky nswe grid $b2 -row 0 -column 1 -pady 1 -padx 1 -sticky nswe grid $b3 -row 1 -column 0 -pady 1 -padx 1 -sticky nswe grid $b4 -row 1 -column 1 -pady 1 -padx 1 -sticky nswe grid $b5 -row 2 -column 0 -pady 1 -padx 1 -sticky nswe grid $b6 -row 2 -column 1 -pady 1 -padx 1 -sticky nswe foreach {wid text} [list \ $b1 "WireFrame display-mode" \ $b2 "PointLine display-mode" \ $b3 "Pipe&Ball display-mode" \ $b4 "BallStick-1 display-mode" \ $b5 "BallStick-2 display-mode" \ $b6 "SpaceFill display-mode"] { DynamicHelp::register $wid balloon $text } pack $ff -side top #new set _h [expr [winfo reqheight $b1] * 3 + 10] .ctrl.c.f.fr3.canv configure -height $_h .ctrl.c.f.fr3.canv itemconfigure frame -height $_h #/ bind $b4 ConfigControlWid From3Dto2D } elseif { $var == "On" } { # if 2D widgets exists delete them if [winfo exists .ctrl.c.f.fr3.canv.mode2D] { destroy .ctrl.c.f.fr3.canv.mode2D } # if 3D widgets already exists, just return silently if {[winfo exists .ctrl.c.f.fr3.canv.mode3D]} { return } eval pack .ctrl.c.f.fr3.2 $dispmode(mode3D_f2_packinfo) -after .ctrl.c.f.fr3.1 set f [frame .ctrl.c.f.fr3.canv.mode3D -bd 0] .ctrl.c.f.fr3.canv create window 0 0 \ -tags frame -anchor nw \ -width [winfo width .ctrl.c.f.fr3.canv] \ -height [winfo height .ctrl.c.f.fr3.canv] -window $f if ![info exists dispmode(mode3D)] { set dispmode(mode3D) "Preset" } global radio_but_cmd_frame #if { ![winfo exists $dispmode(mode3D_ModeFrame)] } { # ; #} else { # xcEnableAll $dispmode(mode3D_ModeFrame) #} set rbs [RadioButCmd .ctrl.c.f.fr3.2 "Mode:" dispmode(mode3D) \ Mode3D top left 1 1 5 "Preset" "Logic"] foreach r [lrange $rbs 1 end] { $r config -indicatoron 0 -selectcolor \#4444ff -font $xcFonts(small) pack configure $r -padx 1 -pady 3 -ipadx 5 -ipady 1 -fill x -expand 1 } set dispmode(mode3D_ModeFrame) $radio_but_cmd_frame #set rb1 [lindex $rbs 1] #set rb2 [lindex $rbs 2] #$rb1 configure -font $xcFonts(small) #$rb2 configure -font $xcFonts(small) # display widgets for $dispmode(mode3D) Mode3D $dispmode(mode3D) # what displayMode3D to render From2Dto3D } else { puts stderr "invalid value \"$var\" submitted to proc DispMode, must be one of On, Off" flush stderr return } # add the additional created widgets to the control-toolbar scrolling scrollControlToolboxCmd .ctrl.c return } #============================================================== # instead of xc_displayMode2D this proc should be used !!!!!!!! # ^^^^^^^^^^^^^^^^ proc Display2D {mode} { global mode2D dispmode set mode2D(WF) Off set mode2D(PL) Off set mode2D(PB) Off set mode2D(BS1) Off set mode2D(BS2) Off set mode2D(SF) Off if { $mode == "WF" } { set mode2D(WF) On set dispmode(mode2D_name) WF xc_displayMode2D .mesa WF } elseif { $mode == "PL" } { set mode2D(PL) On set dispmode(mode2D_name) PL xc_displayMode2D .mesa PL } elseif { $mode == "PB" } { set mode2D(PB) On set dispmode(mode2D_name) PB xc_displayMode2D .mesa PB } elseif { $mode == "BS1" } { set mode2D(BS1) On set dispmode(mode2D_name) BS1 xc_displayMode2D .mesa BS1 } elseif { $mode == "BS2" } { set mode2D(BS2) On set dispmode(mode2D_name) BS2 xc_displayMode2D .mesa BS2 } elseif { $mode == "SF" } { set mode2D(SF) On set dispmode(mode2D_name) SF xc_displayMode2D .mesa SF } else { puts stderr "invalid value \"$mode\" submitted to proc Display2D, must be one of WF, PL, PB, BS1, BS2, SF" flush stderr } return } proc Mode3D {mode} { global mode3D xcMisc set f .ctrl.c.f.fr3.canv.mode3D if { $mode == "Preset" } { # if "Boolean/Logic" buttons CheckButtons exists, delete them if { [winfo exists $f.bool] } { destroy $f.bool } if { [winfo exists $f.over] } { return } set f [frame $f.over] set b1 [radiobutton $f.over1 -text "Stick" -image sticks_3d \ -indicatoron 0 -variable dispmode(mode3D_name) -selectcolor \#44ff44 -value S \ -command [list DisplayOver3D S]] set b2 [radiobutton $f.over1a -text "Pipe&Ball" -image pipeballs_3d \ -indicatoron 0 -variable dispmode(mode3D_name) -selectcolor \#44ff44 -value PB \ -command [list DisplayOver3D PB]] set b3 [radiobutton $f.over2 -text "BallStick" -image ballsticks_3d \ -indicatoron 0 -variable dispmode(mode3D_name) -selectcolor \#44ff44 -value BS \ -command [list DisplayOver3D BS]] set b4 [radiobutton $f.over3 -text "SpaceFill" -image spacefills_3d \ -indicatoron 0 -variable dispmode(mode3D_name) -selectcolor \#44ff44 -value SF \ -command [list DisplayOver3D SF]] #set i15 [expr round(15 * $xcMisc(resolution_ratio1))] #pack $b1 $b2 $b3 $b4 -side top -padx $i15 -pady 1 -fill x -ipadx 0 -ipady 0 grid $b1 -row 0 -column 0 -pady 1 -padx 1 -sticky nswe grid $b2 -row 0 -column 1 -pady 1 -padx 1 -sticky nswe grid $b3 -row 1 -column 0 -pady 1 -padx 1 -sticky nswe grid $b4 -row 1 -column 1 -pady 1 -padx 1 -sticky nswe pack $f -side top foreach {wid text} [list \ $b1 "Stick display-mode" \ $b2 "Pipe&Ball display-mode" \ $b3 "BallStick display-mode" \ $b4 "SpaceFill display-mode"] { DynamicHelp::register $wid balloon $text } bind $b4 ConfigControlWid #new set _h [expr [winfo reqheight $b1] * 2 + 10] .ctrl.c.f.fr3.canv configure -height $_h .ctrl.c.f.fr3.canv itemconfigure frame -height $_h #/ } elseif { $mode == "Logic" } { # Logic stands for Boolean if { [winfo exists $f.over] } { destroy $f.over } # create frame where CheckButtons will be displayed set ff [frame $f.bool] pack $ff -side top if { ![info exists mode3D(pipe)] } { set mode3D(pipe) "Off" } if { ![info exists mode3D(sticks)] } { set mode3D(sticks) "Off" } if { ![info exists mode3D(balls)] } { set mode3D(balls) "Off" } if { ![info exists mode3D(space)] } { set mode3D(space) "Off" } set f1 [frame $ff.1] set f2 [frame $ff.2] set f3 [frame $ff.3] checkbutton $f1.cb -variable mode3D(sticks) \ -onvalue On -offvalue Off -text "STICK" \ -command [list DispBool3D mode3D(sticks)] -anchor sw checkbutton $f2.cb -variable mode3D(balls) \ -onvalue On -offvalue Off -text "BALL" \ -command [list DispBool3D mode3D(balls)] -anchor sw checkbutton $f3.cb -variable mode3D(space) \ -onvalue On -offvalue Off -text "SPACEFILL" \ -command [list DispBool3D mode3D(space)] -anchor sw pack $f1.cb $f2.cb $f3.cb -side top -fill both \ -padx 0 -pady 0 -ipadx 0 -ipady 0 pack $f1 $f2 $f3 -side top -fill x -expand 1 bind $f3 ConfigControlWid #new set _h [expr [winfo reqheight $f1.cb] * 3 + 10] .ctrl.c.f.fr3.canv configure -height $_h .ctrl.c.f.fr3.canv itemconfigure frame -height $_h #/ } else { ErrorDialog "invalid value \"$mode\" submitted to proc Mode3D, must be one of Preset, Boolean" } # add the additional created widgets to the control-toolbar scrolling scrollControlToolboxCmd .ctrl.c return } # ============================================================================ # istead of "xc_displayMode3D over" this proc should be used # ^^^^^^^^^^^^^^^^^^^^^ proc DisplayOver3D {mode} { global mode3D dispmode set mode3D(sticks) Off set mode3D(balls) Off set mode3D(space) Off if { $mode == "S" } { set mode3D(sticks) On set dispmode(mode3D_name) S xc_displayMode3D .mesa over S } elseif { $mode == "PB" } { set mode3D(pipe) On set mode3D(sticks) On set mode3D(balls) On set dispmode(mode3D_name) PB xc_displayMode3D .mesa over PB } elseif { $mode == "BS" } { set mode3D(pipe) Off set mode3D(sticks) On set mode3D(balls) On set dispmode(mode3D_name) BS xc_displayMode3D .mesa over BS } elseif { $mode == "SF" } { set mode3D(space) On set dispmode(mode3D_name) SF xc_displayMode3D .mesa over SF } else { ErrorDialog "invalid value \"$mode\" submitted to proc DisplayOver3D, must be one of S, PB, BS, SF" } return } # ============================================================================ # istead of "xc_displayMode3D boolean" this proc should be used # ^^^^^^^^^^^^^^^^^^^^^^^^ proc DispBool3D {var} { global mode3D if { $var == "mode3D(sticks)" } { set mode3D(space) Off Invert3D mode3D(sticks) xc_displayMode3D .mesa boolean S } elseif { $var == "mode3D(balls)" } { set mode3D(space) Off Invert3D mode3D(balls) xc_displayMode3D .mesa boolean B } elseif { $var == "mode3D(space)" } { set mode3D(sticks) Off set mode3D(balls) Off Invert3D mode3D(space) xc_displayMode3D .mesa boolean SF } From3Dto3D return } proc From3Dto3D {} { global mode3D dispmode if { $mode3D(sticks) == "On" && $mode3D(balls) == "Off" } { set dispmode(mode3D_name) S } elseif { $mode3D(balls) == "On" && $mode3D(pipe) =="Off" } { set dispmode(mode3D_name) BS } elseif { $mode3D(balls) == "On" && $mode3D(pipe) == "On" } { set dispmode(mode3D_name) PB } else { set dispmode(mode3D_name) SF } return } # this proc is for DispBool3D proc Invert3D {var} { upvar #0 $var value if { $value == "On" } { set $var Off } else { set $var On } } # this proc map from 2D to 3D and display in 3D proc From2Dto3D {} { global mode2D mode3D dispmode # mapping # (WF & PL) --> Sticks (B) # (BS1 & BS2) --> BallSticks (BS) if ![info exists dispmode(mode3D)] { set dispmode(mode3D) Preset } if { $mode2D(WF) == "On" } { set mode3D(sticks) On set dispmode(mode3D_name) S xc_displayMode3D .mesa over S } elseif { $mode2D(PL) == "On" || $mode2D(PB) == "On" } { set mode3D(pipe) On set mode3D(sticks) On set mode3D(balls) On set dispmode(mode3D_name) PB xc_displayMode3D .mesa over PB } elseif { $mode2D(BS1) == "On" || $mode2D(BS2) == "On" } { set mode3D(pipe) Off set mode3D(sticks) On set mode3D(balls) On set dispmode(mode3D_name) BS xc_displayMode3D .mesa over BS } else { set mode3D(sticks) Off set mode3D(balls) Off set mode3D(space) On set dispmode(mode3D_name) SF xc_displayMode3D .mesa over SF } set mode2D(WF) Off set mode2D(PL) Off set mode2D(PB) Off set mode2D(BS1) Off set mode2D(BS2) Off set mode2D(SF) Off # enable menubuttons for shade-model & draw-style set dispmode(style) 3D xcUpdateState return } # this proc map from 3D to 2D and display in 2D proc From3Dto2D {} { global mode2D mode3D dispmode # mapping: # (S || ~B) --> WF # (B) --> BS2 # (SF) --> BS2 # if dispmode(mode3D) do not exists, just return silenlty, because # we were not yet on 3D modes and thus going from 3D to 2D is absurd if ![info exists dispmode(mode3D)] { puts stdout "3D NOT EXIST" return } if { $mode3D(sticks) == "On" && $mode3D(balls) == "Off" } { set mode2D(WF) On set dispmode(mode2D_name) WF xc_displayMode2D .mesa WF } elseif { $mode3D(balls) == "On" && $mode3D(pipe) =="Off" } { set mode2D(BS2) On set dispmode(mode2D_name) BS2 xc_displayMode2D .mesa BS2 } elseif { $mode3D(balls) == "On" && $mode3D(pipe) == "On" } { set mode2D(PB) On set dispmode(mode2D_name) PB xc_displayMode2D .mesa PB } else { set mode2D(SF) On set dispmode(mode2D_name) SF xc_displayMode2D .mesa SF } set mode3D(pipe) Off set mode3D(sticks) Off set mode3D(balls) Off set mode3D(space) Off # enable menubuttons for shade-model & draw-style set dispmode(style) 2D xcUpdateState return } # this proc deletes all child-widgets of parent proc DeleteWid {parent} { set child [pack slaves $parent] puts stdout "CHILD = $child\n" foreach widget $child { puts stdout "WIDGET = $widget\n" destroy $widget } } # reset mode2D and mode3D arrays proc ResetDispModes {} { global mode2D mode3D light set light Off set mode2D(WF) Off set mode2D(PL) On set mode2D(BS1) Off set mode2D(BS2) Off set dispmode(mode2D_name) PL set mode3D(sticks) Off set mode3D(balls) Off set mode3D(space) Off if { [info exists dispmode(mode3D)] } { unset dispmode(mode3D) } } proc ConfigControlWid {} { global widsize set width [expr [winfo width .ctrl] - $widsize(scrW)] set height [winfo height .ctrl] set h [winfo reqheight .ctrl.c.f] .ctrl.c config -width $width -height $height \ -scrollregion "0 0 $width $h" } proc DisplayDefaultMode {} { global light set light On Lighting On Mode3D Preset DisplayOver3D BS } proc DisplayMode3D {} { global light set light On Lighting On } proc DisplayMode2D {} { global light set light Off Lighting Off } xcrysden-1.6.2/Tcl/wnOpen.tcl0000644000175000017500000001245513554546330014566 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnOpenSFile.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc wnOpenSFileUpdate {{file 0} {can .mesa}} { if { [info exists select(selection_mode)] && $select(selection_mode) } { tk_dialog [WidgetName] "WARNING !!!" "WARNING: structure can not be reloaded while in selection mode. First exit from the selection mode, then reload" warning 0 OK return } wnOpenSFile $file 1 } proc wnOpenDirectory {} { global system set dir [tk_chooseDirectory \ -initialdir $system(PWD) \ -title "Choose WIEN2k case directory" \ -mustexist 1] if { $dir == "" } { return "" } if { ![file isdirectory $dir] } { ErrorDialog "file \"$file\" does not exist !!!" return "" } return $dir } proc wnOpenSFile {{file 0} {update 0}} { global fileselect system periodic species geng xcMisc wn ########################################## # in WIEN2k there it is always 3D system # ########################################## set periodic(dim) 3 set species crystal if { $file == 0} { #fileselect "Open WIEN Struct File" set fileselect(path) [tk_getOpenFile -defaultextension .struct \ -filetypes { {{All Files} {.*} } {{WIEN2k Struct Files} {.struct}} } -initialdir $system(PWD) -title "Open WIEN2k Struct File"] if { $fileselect(path) != "" } { set file $fileselect(path) reloadRegister $file WIEN2k } else { puts stderr "WARNING:: \fileselect(path) = \"\"" flush stderr return } } if { ![file exists $file] } { ErrorDialog "file \"$file\" does not exist !!!" return } # # get the lattice type from struct-file # set fID [open $file r] gets $fID; # title line set wn(lattice_type) [lindex [gets $fID] 0] close $fID # # update the title of "." # set xcMisc(titlefile) $file set tail [file tail $file] set head [file rootname $tail] wm title . "XCrySDen: $tail" #file copy -force $file $system(SCRDIR)/xc_wienstruct.$system(PID) file copy -force $file $system(SCRDIR)/$tail # transform struct file to XSF file set pwd [pwd] cd $system(SCRDIR) xcCatchExecReturn $system(FORDIR)/str2xcr $head # now rename $head.xcr to $system(SCRDIR)/xc_str2xcr.$$ file rename -force $head.xcr xc_str2xcr.$system(PID) cd $pwd # # WIEN2k struct file is in BOHRs, thatwhy xc_str2xcr.$$ is in BOHRs # set geng(M3_ARGUMENT) [GetGengM3Arg BOHR 95] xcAppendState wien # # determine periodic(igroup) # cd $system(SCRDIR) xcCatchExecReturn $system(BINDIR)/gengeom $geng(M1_INFO) 1 $geng(M3_ARGUMENT) \ 1 1 1 1 $system(SCRDIR)/xc_gengeom.$system(PID) \ $system(SCRDIR)/xc_str2xcr.$system(PID) set fileID [open "$system(SCRDIR)/xc_gengeom.$system(PID)" r] GetDimGroup periodic(dim) periodic(igroup) $fileID close $fileID if { $update } { GetDimGroupXSF periodic(dim) periodic(igroup) $system(SCRDIR)/xc_gengeom.$system(PID) CellMode 1 xcUpdateState } else { ResetDispModes DisplayDefaultMode CellMode OpenXSFStruct .mesa $system(SCRDIR)/xc_struc.$system(PID) # append 'render' to XCState(state) if "render" is not defines yet xcAppendState render xcUpdateState } return } proc wnOpenRenderDensity {} { set filedir [wnOpenDirectory] if { $filedir == "" } { return } set filehead [file tail $filedir] set file $filedir/$filehead.struct wnOpenSFile $file if { ! [file exists $file] } { return } wnDensity $filedir } proc wnOpenCalcAndRenderDensity {} { set filedir [wnOpenDirectory] if { $filedir == "" } { return } set filehead [file tail $filedir] set file $filedir/$filehead.struct wnOpenSFile $file wnDetComOpt $filedir wnDensity2D_or_3D $filedir } proc wnOpenKPath {} { set filedir [wnOpenDirectory] if { $filedir == "" } { return } wnDetComOpt $filedir wnKPath $filedir } proc wnOpenFS {} { set filedir [wnOpenDirectory] if { $filedir == "" } { return } wnDetComOpt $filedir wnFSInit $filedir } xcrysden-1.6.2/Tcl/isoStuff.tcl0000644000175000017500000003574311720516026015117 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/isoStuff.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc SetXC_Iso {{dim 3D}} { global isosurf dif_isosurf prop isosign isodata if { ! [info exists dif_isosurf(dif_map)] } { set dif_isosurf(dif_map) 0 } ###################### # ISOSIGN parameters # ###################### set isosign {} append isosign "xc_isosign 3 0 +1; " append isosign "xc_isosign 2 0 +1; " append isosign "xc_isosign 1 all +1; " if { $dif_isosurf(dif_map) == 1 } { ################### # DIFFERENCE MAPS # ################### append isosign "xc_isosign 3 1 -1; " } if { $prop(spin_case) } { ############# # SPIN CASE # ############# if { $isosurf(spin) == "ALPHA" } { append isosign "xc_isosign 0 0 +1; " append isosign "xc_isosign 0 1 +1; " } elseif { $isosurf(spin) == "BETA" } { append isosign "xc_isosign 0 0 +1; " append isosign "xc_isosign 0 1 -1; " } elseif { $isosurf(spin) == "ALPHA+BETA" } { append isosign "xc_isosign 0 0 +1; " append isosign "xc_isosign 0 1 0; " } elseif { $isosurf(spin) == "ALPHA-BETA" } { append isosign "xc_isosign 0 0 0; " append isosign "xc_isosign 0 1 +1; " } } else { ################# # NON-SPIN CASE # ################# append isosign "xc_isosign 0 0 +1; " } ###################### # ISODATA parameters # ###################### set NPZ_1 [expr $prop(NPZ) - 1] set isodata {} if { $dif_isosurf(dif_map) == 0 } { if $prop(spin_case) { if { $isosurf(spin) == "ALPHA+BETA" } { if { $dim == "3D" } { append isodata "xc_isodata 0 0 0-$NPZ_1 0; " } elseif { $dim == "2D" } { append isodata "xc_isodata 0 0 0 0; " } } elseif { $isosurf(spin) == "ALPHA-BETA" } { if { $dim == "3D" } { append isodata "xc_isodata 0 0 0-$NPZ_1 1; " } elseif { $dim == "2D" } { append isodata "xc_isodata 0 0 0 1; " } } elseif { $isosurf(spin) == "ALPHA" || \ $isosurf(spin) == "BETA" } { MakeIsoData $NPZ_1 0 0 } } else { if { $dim == "3D" } { append isodata "xc_isodata 0 0 0-$NPZ_1 0; " } elseif { $dim == "2D" } { append isodata "xc_isodata 0 0 0 0; " } } } elseif { $dif_isosurf(dif_map) == 1 } { ################### # DIFFERENCE MAPS # ################### if $prop(spin_case) { if { $isosurf(spin) == "ALPHA+BETA" } { if { $dim == "3D" } { append isodata "xc_isodata 0 0 0-$NPZ_1 0; " append isodata "xc_isodata 1 0 0-$NPZ_1 0; " } elseif { $dim == "2D" } { append isodata "xc_isodata 0 0 0 0; " append isodata "xc_isodata 1 0 0 0; " } } elseif { $isosurf(spin) == "ALPHA-BETA" } { if { $dim == "3D" } { append isodata "xc_isodata 0 0 0-$NPZ_1 1; " append isodata "xc_isodata 1 0 0-$NPZ_1 1; " } elseif { $dim == "2D" } { append isodata "xc_isodata 0 0 0 1; " append isodata "xc_isodata 1 0 0 1; " } } elseif { $isosurf(spin) == "ALPHA" || \ $isosurf(spin) == "BETA" } { MakeIsoData $NPZ_1 0 0 MakeIsoData $NPZ_1 1 0 } } else { # RHF if { $dim == "3D" } { append isodata "xc_isodata 0 0 0-$NPZ_1 0; " append isodata "xc_isodata 1 0 0-$NPZ_1 0; " } elseif { $dim == "2D" } { append isodata "xc_isodata 0 0 0 0; " append isodata "xc_isodata 1 0 0 0; " } } } } proc MakeIsoData {NPZ_1 stack3 stack2} { global isodata # because xc_isodata must be specified in sequential fashion # care must be taken xcDebug "MakeIsoData:: $NPZ_1" for {set i 0} {$i <= $NPZ_1} {incr i} { append isodata "xc_isodata $stack3 $stack2 $i 0; " append isodata "xc_isodata $stack3 $stack2 $i 1; " } } proc GetCrystalVec {which_vec nvec} { global vec system # which_vec.......either prim, conv; lately converted to PRIMVEC/CONVVEC # nvec............number of vectors to read!!!! if { $which_vec != "prim" && $which_vec != "conv" } { tk_dialog [WidgetName] ERROR "ERROR: this is bug in program, please report to author !!!\nCode: GetCrystalVec {which_vec}" error 0 OK return } # if { $which_vec == "prim" } { set which_vec "PRIMVEC" } # if { $which_vec == "conv" } { set which_vec "CONVVEC" } if { $which_vec == "prim" } { set which_vec "PRIMVEC" } else { set which_vec "CONVVEC" } # xc_gengeom must automatically exists when In properties mode # (c95_properties_render) set fileID [open "$system(SCRDIR)/xc_gengeom.$system(PID)" r] # initialise vec($,$) for {set i 0} {$i < 3} {incr i} { for {set j 0} {$j < 3} {incr j} { set vec($i,$j) 0 } } set n 0 set output [split [read $fileID] \n] foreach line $output { xcDebug "line: $line" if [string match " $which_vec*" $line] { set n1 [expr $n + 1] set n2 [expr $n + 2] set n3 [expr $n + 3] for {set j 0} {$j < $nvec} {incr j} { set vec(0,$j) [Angs2Bohr [lindex [lindex $output $n1] $j]] set vec(1,$j) [Angs2Bohr [lindex [lindex $output $n2] $j]] set vec(2,$j) [Angs2Bohr [lindex [lindex $output $n3] $j]] xcDebug "PRIMVEC: $vec(0,$j) $vec(1,$j) $vec(2,$j)\n" } break } incr n } close $fileID } # this is new routine (Mon May 3 13:02:04 CEST 1999), which is now used # instead of GetCrystalVec, since xc_isospacesel is used now !!! proc GetCageVecOrig pov { global vec isosurf # which_vec.......either prim, conv; lately converted to PRIMVEC/CONVVEC # nvec............number of vectors to read!!!! set isosurf(origin,0) [Angs2Bohr [lindex $pov 0]] set isosurf(origin,1) [Angs2Bohr [lindex $pov 1]] set isosurf(origin,2) [Angs2Bohr [lindex $pov 2]] for {set i 0} {$i < 3} {incr i} { for {set j 0} {$j <3} {incr j} { set index [expr 3 + $i*3 + $j] set vec($i,$j) [Angs2Bohr [lindex $pov $index]] } } } proc GetNPY {com} { global vec prop isosurf # vec.........crystal vectors in Bohrs if { $isosurf(res_type) == "points" } { set prop(NPY) $isosurf(resol_poi) } else { # ANGSTROMS OR BOHRS; convert to NPY if { $com == "ECHD" } { # take vec(1); look at "GetNumberOfPoints" set distY [expr sqrt( \ $vec(1,0) * $vec(1,0) + \ $vec(1,1) * $vec(1,1) + \ $vec(1,2) * $vec(1,2))] } else { # for "ECHG and rest" take vec(0); look at "GetNumberOfPoints" set distY [expr sqrt( \ $vec(0,0) * $vec(0,0) + \ $vec(0,1) * $vec(0,1) + \ $vec(0,2) * $vec(0,2))] } if { $isosurf(mb_angs/bohr) == "Angstroms" } { set res [Angs2Bohr $isosurf(resol_ang)] } else { set res $isosurf(resol_ang) } set prop(NPY) [expr round( $distY / $res )] } } proc GetNumberOfPoints {command dim} { global prop vec # dim.............dimension of map to render 2/3 if { $command == "ECHD" } { ####################################################################### # the order of points submited must to "properties" program must be: # --------------------------------------------------------------------- # for ECHD: # ( 1,NPY) # ( 1, 1) # (NPX, 1) # # so the order of points is: # ECHD_order == point2, point0, point1 # and because point2 is inheriter of vec(1), it is vec(1) who is # criteria for NPY # --------------------------------------------------------------------- set disY [expr sqrt( \ $vec(1,0) * $vec(1,0) + \ $vec(1,1) * $vec(1,1) + \ $vec(1,2) * $vec(1,2))] set dY [expr $disY / [expr $prop(NPY) - 1.0]] xcDebug "distY = $disY; dY = $dY" if { $dim == 3} { set disZ [expr sqrt(\ $vec(2,0) * $vec(2,0) + \ $vec(2,1) * $vec(2,1) + \ $vec(2,2) * $vec(2,2))] set prop(NPZ) [expr round( $disZ / $dY ) + 1] set dZ [expr $disZ / [expr $prop(NPZ) - 1.0]] xcDebug "distZ = $disZ; NPZ = $prop(NPZ)"; xcDebug "NPZ = $prop(NPZ); dZ = $dZ" } } else { ####################################################################### # for ECHG: # ( 1, 1) # (NPY, 1) # (NPY,NPX) # # so the order of points is: # ECHG_order == point0, point1, (point2 + vecA) # and because point1 is inheriter of vec(0), it is vec(0) who is # criteria for NPY # --------------------------------------------------------------------- set disY [expr sqrt( \ $vec(0,0) * $vec(0,0) + \ $vec(0,1) * $vec(0,1) + \ $vec(0,2) * $vec(0,2))] set dY [expr $disY / [expr $prop(NPY) - 1.0]] if { $dim == 3 } { set disZ [expr sqrt(\ $vec(2,0) * $vec(2,0) + \ $vec(2,1) * $vec(2,1) + \ $vec(2,2) * $vec(2,2))] set prop(NPZ) [expr round( $disZ / $dY ) + 1] set dZ [expr $disZ / [expr $prop(NPZ) - 1.0]] } } } proc IsoCalc {n command {c95_output {}} {dir {}}} { global system vec prop isosurf dif_isosurf # n ........ this is used for diff. maps to know is it map A or # map B # c95_output ........ c95's output file # dir ........ working directory for RunC95 ############################# # vec(-1,$) is DUMMY & must be (0.0, 0.0, 0.0)!!!!!!!! set vec(-1,0) 0.0 set vec(-1,1) 0.0 set vec(-1,2) 0.0 for {set i 0} {$i < $prop(NPZ)} {incr i} { if { $prop(NPZ) > 1 } { set f [expr $i / [expr $prop(NPZ) - 1.0]] } else { set f 1.0 } for {set j -1} {$j < 2} {incr j} { set jj [expr $j + 1] set v($i,$jj,0) [expr $isosurf(origin,0) + \ $vec($j,0) + $f * $vec(2,0)] set v($i,$jj,1) [expr $isosurf(origin,1) + \ $vec($j,1) + $f * $vec(2,1)] set v($i,$jj,2) [expr $isosurf(origin,2) + \ $vec($j,2) + $f * $vec(2,2)] xcDebug "$f\n$v($i,$jj,0) $v($i,$jj,1) $v($i,$jj,2)\n" } } ########################################################################## # the order of points submited to "properties" program must be: # # ------------------------------------------------------------------------- # for ECHD: # ( 1,NPY) # ( 1, 1) # (NPX, 1) # # so the order of points is: # ECHD_order == point2, point0, point1 # ------------------------------------------------------------------------- # for ECHG: # ( 1, 1) # (NPY, 1) # (NPY,NPX) # # so the order of points is: # ECHG_order == point0, point1, (point2 + vecA) # ------------------------------------------------------------------------- ############################### # take care of density matrix # ############################### if { $dif_isosurf(dif_map) == 1 } { if { $n == 1 } { if { $dif_isosurf(denmat_A) == "Density matrix as superposition of atomic densities" } { if { $prop(PATO_newbasis_A) == 0 } { set input "PATO\n" append input "0 0\n" } else { ############################### # new basis set was specified # ############################### # insert code here } } } elseif { $n == 2 } { if { $dif_isosurf(denmat_B) == "SCF density matrix" && \ $dif_isosurf(denmat_A) != "SCF density matrix" } { set input "PSCF\n" } if { $dif_isosurf(denmat_B) == "Density matrix as superposition of atomic densities" } { if { $prop(PATO_newbasis_B) == 0 } { set input "PATO\n" append input "0 0\n" } else { ############################### # new basis set was specified # ############################### # insert code here } } } } ########################################################################## # t.k. - this is temporal, just to se the gamma point 5-th band of Rh band ########################################################################## #append input "NEWK\n0 0 0\n0 0\nPBAN\n1 0 1\n1 0 0 0\n10\n" ########################################################################## append input "BOHR\n" ######################################## # prototype model for PBAN # append input "NEWK\n0 0 0\n1 0\n" # append input "PBAN\n2 0\n1 2\n" ######################################## if { $command == "POTM" } { append input "POLI\n4 1\n0\n" } for {set i 0} {$i < $prop(NPZ)} {incr i} { if { $command == "ECHD" } { # ECHD append input "ECHD\n$prop(NPY) 25 0 1\n" append input "$v($i,2,0) $v($i,2,1) $v($i,2,2)\n" append input "$v($i,0,0) $v($i,0,1) $v($i,0,2)\n" append input "$v($i,1,0) $v($i,1,1) $v($i,1,2)\n" } else { # ECHG & REST if { [string match ECHG* $command] } { append input "$command\n$prop(NPY)\nCOORDINA\n" } if { $command == "POTM" } { append input "POTM\n0 5\n$prop(NPY)\nCOORDINA\n" } set p1 [expr $v($i,2,0) + $vec(0,0)] set p2 [expr $v($i,2,1) + $vec(0,1)] set p3 [expr $v($i,2,2) + $vec(0,2)] append input "$v($i,0,0) $v($i,0,1) $v($i,0,2)\n" append input "$v($i,1,0) $v($i,1,1) $v($i,1,2)\n" append input "$p1 $p2 $p3\n" } if { [string match ECHG* $command] || $command == "POTM" } { append input "END\n" } } append input "END\n" xcDebug -stderr "CRYSTALxx INPUT:" xcDebug -stderr "----------------" xcDebug -stderr $input #------------------------------------------------------------------------ # t.k.: here user can make some manuall editing of CRYSTAL d3 input !!! #------------------------------------------------------------------------ if { $prop(editScript) == 1 } { cd $system(SCRDIR) set file CRYSTAL-map$n.d3 WriteFile $file $input w update xcEditFile $file -foreground # can-not chack if editing was OK -> to long to wait -> take a risk !!! # # drop the comments from file # set input {} foreach line [split [ReadFile -nonewline $file] \n] { if { [string match *\#* $line] == 0 } { if { $line != {} } { append input [format "%s\n" $line] } } } } ################################################################### # because calculating "Grid of Points" can take some time, it's needed to # give some feed back to the user -> message mode of RunC95 if ![RunC95 $system(c95_properties) {message "The CRYSTAL program is calculating the grid of points now.\nIt can take some time, so PLEASE WAIT!!!"} \ $input $c95_output {} $dir] { # error occure # tk_dialog .err "ERROR" "ERROR: $err" error 0 OK return 0 } return 1 } xcrysden-1.6.2/Tcl/fs/0000755000175000017500000000000013556022211013202 5ustar tonetonexcrysden-1.6.2/Tcl/fs/bandselect.tcl0000644000175000017500000001343112604724266016030 0ustar tonetone# # FS_bandSelect -- # # Select a bands for Fermi-surface plotting among the all the bands from # small toplevel window. Also a abnd-widths are ploted for orientation # proc FS_bandSelect {spin} { global fs set ncol 1 set nrow 500; # maximum number of bands to display in a single row # for selection checkbuttons # specify fermi energy OneEntryToplevel [WidgetName] "Fermi Energy" "Ferm Energy" \ "Specify the Fermi Energy:" 15 fs(Efermi) float 300 20 # # display the bandwidths in a Text widget # set text [FS_displayBandWidths $fs($spin,bandwidthfile)] wm geometry $text +0-0 raise $text update; update idletasks SetWatchCursor set cw [DisplayUpdateWidget "Please wait" "Please wait: parsing bands data"] # read number of bands & band-widhts set nl 0 foreach lin [split [ReadFile $fs($spin,bandwidthfile)] \n] { if { $nl == 0 } { set fs($spin,nbands) $lin } else { if { $nl <= $fs($spin,nbands) } { set fs($spin,$nl,minE) [lindex $lin 1] set fs($spin,$nl,maxE) [lindex $lin 2] } } incr nl } if { $fs($spin,nbands) < $nrow } { # # make a band-width graph !!! # set xlabel "Band Widths" if { $spin != {} } { append xlabel " (spin type: $spin)" } GraphInit grapher_BARGraph $fs($spin,bandwidthfile) \ -Xtitle $xlabel \ -Ytitle "E" \ -Yline $fs(Efermi) \ -Yline_text Ef set graph [Grapher BARGraph] wm geometry $graph +0+0 raise $graph } SetWatchCursor # # select bands to plot Fermi surface # set t [xcToplevel [WidgetName] "Select bands" "Select Bands" . 0 0 0] raise $t SetWatchCursor label $t.l \ -text "Select bands for Fermi Surface drawing:" \ -relief ridge -bd 2 pack $t.l -side top -expand 1 -fill x -padx 2m -pady 3m \ -ipadx 2m -ipady 2m # we should make a scrolled window # # CANVAS & SCROLLBAR in CANVAS set scroll_frame [frame $t.f -relief sunken -bd 1] set xroll_frame [frame $t.x -relief sunken -bd 1] pack $scroll_frame -side top -expand true -fill y -padx 5 pack $xroll_frame -side top -expand false -fill x set c [canvas $scroll_frame.canv \ -yscrollcommand [list $scroll_frame.yscroll set] \ -xscrollcommand [list $xroll_frame.xscroll set]] set scb [scrollbar $scroll_frame.yscroll \ -orient vertical -command [list $c yview]] set scx [scrollbar $xroll_frame.xscroll \ -orient horizontal -command [list $c xview]] pack $scb -side right -fill y pack $c -side left -fill both -expand true pack $scx -side bottom -fill x # create FRAME to hold all checkbuttons set f [frame $c.f -bd 0] $c create window 0 0 -anchor nw -window $f -tags frame bind $c <4> { %W yview scroll -5 units } bind $c <5> { %W yview scroll +5 units } bind $f <4> " $c yview scroll -5 units " bind $f <5> " $c yview scroll +5 units " # CHECKBUTTONS if { $fs($spin,nbands) < $nrow } { for {set i 1} {$i <= $fs($spin,nbands)} {incr i} { set fs($spin,$i,band_selected) 0 set cb [checkbutton [WidgetName $f] -text "Band number: $i" \ -variable fs($spin,$i,band_selected) -relief ridge -bd 2] pack $cb -padx 2m -pady 1 -fill both -expand 1 } # set child [lindex [pack slaves $f] 0] # } else { # arrange checkbuttuon in matrix with $nrow rows set ncol [expr $fs($spin,nbands) / $nrow] if { $ncol*$nrow < $fs($spin,nbands) } { incr ncol } set nb 1 for {set ir 0} {$ir < $nrow} {incr ir} { for {set ic 0} {$ic < $ncol} {incr ic} { if { $nb <= $fs($spin,nbands) } { set fs($spin,$nb,band_selected) 0 set cb [checkbutton [WidgetName $f] -text "Band #: $nb" \ -variable fs($spin,$nb,band_selected) -relief ridge -bd 2] grid $cb -column $ic -row $ir -padx 1 -pady 1 bind $cb <4> " $c yview scroll -5 units " bind $cb <5> " $c yview scroll +5 units " incr nb } } } # set child [lindex [grid slaves $f] 0] # } # make correct DISPLAY tkwait visibility $child update set width [winfo width $f] set height [winfo height $f] set wsc [expr min([winfo screenwidth $t],1920) - 100] set hsc [expr min([winfo screenheight $t],1080) - 100] set w1 [expr $width / $ncol] set h1 [expr $height / min($nrow,$fs($spin,nbands))] set nw [expr min(10,$wsc/$w1+1)] set nh [expr min(20,$hsc/$h1+1)] #puts stderr "wsc=$wsc, w1=$w1, nw=$nw" #puts stderr "hsc=$hsc, h1=$h1, nh=$nh" # #if { [info exists ncol] } { # puts stderr "FS: width = $width --> [expr min(10,$ncol)*($width / $ncol)] ([winfo reqwidth $f])" #} #puts stderr "FS: height = $height --> [expr min(20,$nrow)*($height / $fs($spin,nbands))] ([winfo reqheight $f])" #puts stderr "FS: nbands = $fs($spin,nbands)" if { $fs($spin,nbands) < $nh } { $c config -width $width -height $height } else { if { $fs($spin,nbands) < $nrow } { $c config \ -width $width -height [expr $nh*$h1] -scrollregion "0 0 $width $height" } else { $c config \ -width [expr $nw*$w1] \ -height [expr $nh*$height / $nrow] \ -scrollregion "0 0 $width $height" } } # # press the "Selected" button when done # set b [button [WidgetName $t] -text "Selected" \ -command [list FS_bandSelect:selected $t $spin]] pack $b -side top -expand 1 -fill x -padx 2m -pady 3m if { $spin != {} } { set l [label [WidgetName $t] -text " Spin type: $spin" \ -relief ridge -bd 4 -anchor w] pack $l -side top -expand 1 -fill x -padx 1m -pady 1m \ -ipadx 2m -ipady 2m } ResetCursor destroy $cw tkwait variable fs($spin,selected) } proc FS_bandSelect:selected {t spin} { global fs set fs($spin,selected) 1 CancelProc $t } xcrysden-1.6.2/Tcl/fs/wnFS.tcl0000644000175000017500000002503612604725347014606 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnFS.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # EXECUTED BY BUTTON: "Generate k-mesh" # proc wnGenKMesh {} { global wn # # order of questions in KGEN: # # 1. "NUMBER OF K-POINTS IN WHOLE CELL:" # 2. "Shift of k-mesh allowed. Do you want to shift:" ########### cd $wn(dir) ########### set input "$wn(fs_nkp)\n" append input "0\n"; # shift of k-mesh is not allowed xcDebug -debug "KGEN INPUT: $input" WriteFile xc_kgen.inp $input w catch {exec x kgen < xc_kgen.inp > xc_kgen.out} exit_status set out [ReadFile xc_kgen.out] dialog [WidgetName] "Notification" \ "K-MESH GENERATED !!!.\nOutput of kgen:\n\n $out\n\nExit status:\n$exit_status" \ info 0 Done } # # EXECUTED BY BUTTON: "Render Fermi Surface" # proc wnFSGo {outkgen {spin {}}} { global wn system SetWatchCursor update xcDebug -stderr "DEBUG -- args: $outkgen $spin" ########### cd $wn(dir) ########### set outkgen [file tail $outkgen] # try outkgen # try $wn(dir)/$wn(filehead).fs_outputkgen # try $wn(dir)/$wn(filehead).outputkgen !!! DANGEROUS if { ! [file exists $outkgen] } { tk_dialog [WidgetName] ERROR \ "Please generate the k-mesh first !!!" error 0 OK ResetCursor; return } set ok 0 foreach line [split [ReadFile $outkgen] \n] { if [string match "*k-vectors:*" $line] { set ok 1 break } } if { ! $ok } { ErrorDialog "Please generate the k-mesh first !!!" ResetCursor return } # # read output1 file by wn_readbands prog !!! # append deffile "6,'$wn(filehead).outputba$spin','unknown','formatted',0\n" append deffile "7,'$wn(filehead).output1$spin' ,'old', 'formatted',0\n" append deffile "8,'$wn(filehead).outputbw$spin','unknown','formatted',0\n" set wn($spin,fs_bandfile) $wn(filehead).outputba$spin set wn($spin,fs_bandwidthfile) $wn(filehead).outputbw$spin WriteFile band.def $deffile w if { [catch {exec $system(BINDIR)/wn_readbands band.def} error_msg] } { ErrorDialog "while executing wn_readbands program !!!" $error_msg ResetCursor return } # # execute program wn_readbakgen # set deffile {} append deffile "7, '$wn(filehead).outputba$spin','unknown','formatted',0\n" append deffile "8, '$outkgen' ,'old' ,'formatted',0\n" append deffile "10,'$wn(filehead).outputfs$spin','unknown','formatted',0\n" WriteFile bakgen.def $deffile w if { [xcCatchExec $system(BINDIR)/wn_readbakgen bakgen.def] } { ResetCursor return } set wn($spin,fs_fsfile) $wn(filehead).outputfs$spin file rename -force -- $wn($spin,fs_fsfile) $system(SCRDIR)/$wn(filehead) set wn($spin,fs_fsfile) $system(SCRDIR)/$wn(filehead)/$wn($spin,fs_fsfile) ResetCursor update ############################################################## # # BAND SELECTION # ############################################################## set wn(fs_Efermi) 0.0 catch {set wn(fs_Efermi) \ [exec grep :FER $wn(filehead).output2$spin | \ tail -1 | awk "{print \$NF}"]} OneEntryToplevel [WidgetName] "Fermi Energy" "Ferm Energy" \ "Specify the Fermi Energy:" 15 wn(fs_Efermi) float 300 20 set ncol 1 set nrow 500; # maximum number of bands to display in a single row # for selection checkbuttons # # display the bandwidths in a Text widget # set text [FS_displayBandWidths $wn($spin,fs_bandwidthfile) $spin] wm geometry $text +0-0 raise $text update; update idletasks SetWatchCursor set cw [DisplayUpdateWidget "Please wait" "Please wait: parsing bands data"] # read number of bands & band-widhts set nl 0 foreach lin [split [ReadFile $wn($spin,fs_bandwidthfile)] \n] { if { $nl == 0 } { set wn($spin,nbands) $lin } else { if { $nl <= $wn($spin,nbands) } { set wn($spin,$nl,minE) [lindex $lin 1] set wn($spin,$nl,maxE) [lindex $lin 2] } } incr nl } if { $wn($spin,nbands) < $nrow } { # # make a band-width graph !!! # set xlabel "Band Widths" if { $spin != {} } { append xlabel " (spin type: $spin)" } GraphInit grapher_BARGraph $wn($spin,fs_bandwidthfile) \ -Xtitle $xlabel \ -Ytitle "E / Ry" \ -Yline $wn(fs_Efermi) \ -Yline_text Ef set graph [Grapher BARGraph] wm geometry $graph -0-0 raise $graph } SetWatchCursor # # select bands window # set t [xcToplevel [WidgetName] "Select bands" "Select Bands" .fs_init 0 0 1] wm geometry $t -0+0 raise $t tkwait visibility $t SetWatchCursor label $t.l \ -text "Select bands for Fermi Surface drawing:" \ -relief ridge -bd 2 pack $t.l -side top -expand 1 -fill x -padx 2m -pady 3m \ -ipadx 2m -ipady 2m # # we should make a scrolled window # # CANVAS & SCROLLBAR in CANVAS set scroll_frame [frame $t.f -relief sunken -bd 1] set xroll_frame [frame $t.x -relief sunken -bd 1] pack $scroll_frame -side top -expand true -fill y -padx 5 pack $xroll_frame -side top -expand false -fill x set c [canvas $scroll_frame.canv \ -yscrollcommand [list $scroll_frame.yscroll set] \ -xscrollcommand [list $xroll_frame.xscroll set]] set scb [scrollbar $scroll_frame.yscroll \ -orient vertical -command [list $c yview]] set scx [scrollbar $xroll_frame.xscroll \ -orient horizontal -command [list $c xview]] pack $scb -side right -fill y pack $c -side left -fill both -expand true pack $scx -side bottom -fill x # create FRAME to hold all checkbuttons set f [frame $c.f -bd 0] $c create window 0 0 -anchor nw -window $f -tags frame bind $c <4> { %W yview scroll -5 units } bind $c <5> { %W yview scroll +5 units } bind $f <4> " $c yview scroll -5 units " bind $f <5> " $c yview scroll +5 units " # CHECKBUTTONS if { $wn($spin,nbands) < $nrow } { for {set i 1} {$i <= $wn($spin,nbands)} {incr i} { set wn($spin,$i,band_selected) 0 set cb [checkbutton [WidgetName $f] -text "Band number: $i" \ -variable wn($spin,$i,band_selected) -relief ridge -bd 2] pack $cb -padx 2m -pady 1 -fill both -expand 1 } # set child [lindex [pack slaves $f] 0] # } else { # arrange checkbuttuon in matrix with $nrow rows set ncol [expr $wn($spin,nbands) / $nrow] if { $ncol*$nrow < $wn($spin,nbands) } { incr ncol } set nb 1 for {set ir 0} {$ir < $nrow} {incr ir} { for {set ic 0} {$ic < $ncol} {incr ic} { if { $nb <= $wn($spin,nbands) } { set wn($spin,$nb,band_selected) 0 set cb [checkbutton [WidgetName $f] -text "Band #: $nb" \ -variable wn($spin,$nb,band_selected) -relief ridge -bd 2] grid $cb -column $ic -row $ir -padx 1 -pady 1 bind $cb <4> " $c yview scroll -5 units " bind $cb <5> " $c yview scroll +5 units " incr nb } } } # set child [lindex [grid slaves $f] 0] # } # make correct DISPLAY tkwait visibility $child update set width [winfo width $f] set height [winfo height $f] set wsc [expr min([winfo screenwidth $t],1920) - 100] set hsc [expr min([winfo screenheight $t],1080) - 100] set w1 [expr $width / $ncol] set h1 [expr $height / min($nrow,$wn($spin,nbands))] set nw [expr min(10,$wsc/$w1+1)] set nh [expr min(20,$hsc/$h1+1)] #puts stderr "wsc=$wsc, w1=$w1, nw=$nw" #puts stderr "hsc=$hsc, h1=$h1, nh=$nh" # #if { [info exists ncol] } { # puts stderr "FS: width = $width --> [expr min(10,$ncol)*($width / $ncol)] ([winfo reqwidth $f])" #} #puts stderr "FS: height = $height --> [expr min(20,$nrow)*($height / $wn($spin,nbands))] ([winfo reqheight $f])" #puts stderr "FS: nbands = $wn($spin,nbands)" if { $wn($spin,nbands) < $nh } { $c config -width $width -height $height } else { if { $wn($spin,nbands) < $nrow } { $c config \ -width $width -height [expr $nh*$h1] -scrollregion "0 0 $width $height" } else { $c config \ -width [expr $nw*$w1] \ -height [expr $nh*$height / $nrow] \ -scrollregion "0 0 $width $height" } } # # press the "Selected" button when done # set b [button [WidgetName $t] -text "Selected" \ -command [list wnToFS $t $spin]] pack $b -side top -expand 1 -fill x -padx 2m -pady 3m if { $spin != {} } { set l [label [WidgetName $t] -text " Spin type: $spin" \ -relief ridge -bd 4 -anchor w] pack $l -side top -expand 1 -fill x -padx 1m -pady 1m \ -ipadx 2m -ipady 2m } ResetCursor destroy $cw } proc wnToFS {t {spin {}}} { global wn fs xcMisc CancelProc $t set fs(titlefile) $wn(filehead) set fs($spin,nbands) $wn($spin,nbands) set fs(Efermi) $wn(fs_Efermi) for {set i 1} {$i <= $fs($spin,nbands)} {incr i} { set fs($spin,$i,band_selected) $wn($spin,$i,band_selected) set fs($spin,$i,minE) $wn($spin,$i,minE) set fs($spin,$i,maxE) $wn($spin,$i,maxE) set fs($spin,$i,isolevel) $fs(Efermi) } # lets read (band)XSF file; xc_readbandXSF return info structure # which look like: # # 1 { grid_index 3D grid_ident grid_nband 1 {subgrid0_ident}} set sinfo [xc_readbandXSF $wn($spin,fs_fsfile)] xcDebug -debug "DEBUG: FS-sinfo: $sinfo" # parse $sinfo set slist [lindex $sinfo 1] set fs($spin,grid_index) [lindex $slist 0] set fs($spin,grid_subindex) [expr [lindex $slist 4] - 1] if { [lindex $slist 3] != $wn($spin,nbands) } { dialog [WidgetName] "ERROR" \ "Mismatch occured while reading FermiSurface File: $wn($spin,fs_fsfile)" error 0 Done } FS_GoFermi $spin } xcrysden-1.6.2/Tcl/fs/header.tcl0000644000175000017500000000172111712736221015144 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/__file__ # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# xcrysden-1.6.2/Tcl/fs/tclIndex0000644000175000017500000001074613522247072014716 0ustar tonetone# Tcl autoload index file, version 2.0 # This file is generated by the "auto_mkindex" command # and sourced to set up indexing information for one or # more commands. Typically each line is a command that # sets an element in the auto_index array, where the # element name is the name of a command and the value is # a script that loads the command. set auto_index(FS_GoFermi) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_PopupMenu) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_ResizeWin) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_InitVar) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_UserBackground) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_UserDefaults) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_RenderSurface) [list source [file join $dir FS_Main.tcl]] set auto_index(FS:cry_surf) [list source [file join $dir FS_Main.tcl]] set auto_index(FS:cry_surfconfig) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_ModifyMenu) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_ViewMenu) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_ViewMenu:_show) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_DisplayMenu) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_fsConfig) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_Config) [list source [file join $dir FS_Main.tcl]] set auto_index(celltype:FS_fsConfig) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_SaveBXSF) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_SetSurfColor) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_SetSurfColor:Update) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_SetSurfColor:_widget) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_SetCellColor) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_SetCellColor:Update) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_SurfSmooth) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_SurfSmoothOK) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_AntiAlias) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_DepthCuing) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_ModAntiAlias) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_ModDepthCuing) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_ToggleMenuCheckbutton) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_getBandIndexFromNoteBookPage) [list source [file join $dir FS_Main.tcl]] set auto_index(FSbind_printTogl) [list source [file join $dir FS_Main.tcl]] set auto_index(FSbind_SetSurfColor) [list source [file join $dir FS_Main.tcl]] set auto_index(FSbind_SetCellColor) [list source [file join $dir FS_Main.tcl]] set auto_index(FSbind_glLight) [list source [file join $dir FS_Main.tcl]] set auto_index(FSbind_ModAntiAlias) [list source [file join $dir FS_Main.tcl]] set auto_index(FSbind_ModDepthCuing) [list source [file join $dir FS_Main.tcl]] set auto_index(FSbutton_SmallToolbox) [list source [file join $dir FS_Main.tcl]] set auto_index(FS_Multi) [list source [file join $dir FS_Multi.tcl]] set auto_index(FS_RenderMultiSurface) [list source [file join $dir FS_Multi.tcl]] set auto_index(FS_bandSelect) [list source [file join $dir bandselect.tcl]] set auto_index(FS_bandSelect:selected) [list source [file join $dir bandselect.tcl]] set auto_index(FS_displayBandWidths) [list source [file join $dir bandwidths.tcl]] set auto_index(genFSInit) [list source [file join $dir genFSInit.tcl]] set auto_index(FS_readBXSF) [list source [file join $dir genFSInit.tcl]] set auto_index(_FSGetFermiEnergy) [list source [file join $dir genFSInit.tcl]] set auto_index(FS_Interpolation:submit) [list source [file join $dir interpolate.tcl]] set auto_index(FS_Toolbox) [list source [file join $dir toolbox.tcl]] set auto_index(FS_RevertIsoSides) [list source [file join $dir toolbox.tcl]] set auto_index(FS_RevertIsoNormals) [list source [file join $dir toolbox.tcl]] set auto_index(wnGenKMesh) [list source [file join $dir wnFS.tcl]] set auto_index(wnFSGo) [list source [file join $dir wnFS.tcl]] set auto_index(wnToFS) [list source [file join $dir wnFS.tcl]] set auto_index(wnFSInit) [list source [file join $dir wnFSInit.tcl]] set auto_index(wnFSSetSpinFlag) [list source [file join $dir wnFSInit.tcl]] set auto_index(wnFS_ExecLapw) [list source [file join $dir wnFSInit.tcl]] set auto_index(wnReadStruct) [list source [file join $dir wnReadStruct.tcl]] xcrysden-1.6.2/Tcl/fs/FS_Main.tcl0000644000175000017500000013100213522037223015161 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/FS_Main.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # NOTE: XSF file and (band)XSF file must alreadu be read !!! # proc FS_GoFermi {{spin {}}} { global fs xcMisc system if { ! [info exists fs(counter)] } { set fs(counter) 0 } else { incr fs(counter) } set fs($spin,togl_w) [expr int(750 * $xcMisc(resolution_ratio1))] set fs($spin,togl_h) $fs($spin,togl_w) xcDebug -debug "FS_GoFermi> xcMisc(resolution_ratio1) = $xcMisc(resolution_ratio1)" # NOTE: #------- # prevent the mass that can be done by going several times trough # the "Render Fermi Surface" process for WIEN set t .fs${spin} if { [winfo exists $t] } { return } toplevel $t if { $spin == "dn" } { wm geometry $t +0-0 } else { wm geometry $t -0+0 } global exit_viewer_win set exit_viewer_win $t bind $t "exit_viewer $t" if { ! [info exists xcMisc(titlefile)] } { set xcMisc(titlefile) $fs(titlefile) } if { $spin != {} } { wm title $t "*** XCrySDen - Fermi Surface ($spin spin): [file tail $xcMisc(titlefile)]" } else { wm title $t "*** XCrySDen - Fermi Surface: [file tail $xcMisc(titlefile)]" } wm iconname $t "Fermi Surface" wm iconbitmap . @$system(BMPDIR)/xcrysden.xbm set nb [NoteBook $t.nb -width $fs($spin,togl_w) -height $fs($spin,togl_h)] pack $nb -expand 1 -fill both set fs($spin,nb) $nb set fs($spin,bandlist) "" set fs($spin,togllist) "" set _first_band -1 putsFlush stderr "NBANDS = $fs($spin,nbands)" for {set i 1} {$i <= $fs($spin,nbands)} {incr i} { if { $fs($spin,$i,band_selected) } { if { $_first_band == -1 } { set _first_band $i } # initialize variables FS_InitVar $i $spin $nb insert $i band$i -text "Band #$i" \ -createcmd [list FS_RenderSurface $i $spin] # # page container frame # set f [$nb getframe band$i] set togl $f.togl$i lappend fs($spin,bandlist) $i lappend fs($spin,togllist) $togl # # toolbox frame # set ft [frame $f.container -relief raised -bd 1] pack $ft -side top -expand 0 -fill x -padx 0m -pady 0m FS_Toolbox $ft $togl $spin $i set fs($spin,$i,show_toolbox_frame) 1 set fs($spin,$i,toolbox_frame) $ft set fs($spin,$i,toolbox_frame_pack) [pack info $ft] set fs($spin,$i,toolbox_frame_packbefore) $togl # # Togl # global toglOpt set fs($spin,$i,togl) \ [togl $togl \ -ident $togl \ -rgba true \ -rgba $toglOpt(rgba) \ -redsize $toglOpt(redsize) \ -greensize $toglOpt(greensize) \ -bluesize $toglOpt(bluesize) \ -double $toglOpt(double) \ -depth $toglOpt(depth) \ -depthsize $toglOpt(depthsize) \ -accum $toglOpt(accum) \ -accumredsize $toglOpt(accumredsize) \ -accumgreensize $toglOpt(accumgreensize) \ -accumbluesize $toglOpt(accumbluesize) \ -accumalphasize $toglOpt(accumalphasize) \ -alpha $toglOpt(alpha) \ -alphasize $toglOpt(alphasize) \ -stencil $toglOpt(stencil) \ -stencilsize $toglOpt(stencilsize) \ -auxbuffers $toglOpt(auxbuffers) \ -overlay $toglOpt(overlay) \ -stereo $toglOpt(stereo) \ -time $toglOpt(time) \ -create togl_create \ -display togl_display \ -reshape togl_reshape \ -destroy togl_destroy \ -timer togl_timer ] pack $togl -fill both -expand 1 update # take care of togl's background FS_UserBackground $togl # bind $fs($spin,$i,togl) { xc_B1motion %W %x %y } bind $fs($spin,$i,togl) { xc_B2motion %W %x %y } bind $fs($spin,$i,togl) { xc_Brelease %W B1; MouseZoomBrelease %W } bind $fs($spin,$i,togl) { xc_Brelease %W B2 } bind $fs($spin,$i,togl) [list FS_PopupMenu %W %X %Y $i $spin] bind $fs($spin,$i,togl) { MouseZoom %W %X %Y } bind $fs($spin,$i,togl) { MouseZoomBrelease %W } global tcl_platform if { $tcl_platform(platform) == "unix" } { bind $fs($spin,$i,togl) { MouseWheelZoom %W +} bind $fs($spin,$i,togl) { MouseWheelZoom %W -} } else { bind $t [list WindowsMouseWheel $fs($spin,$i,togl) %D ] } bind $t exit_pr bind $t [list FSbind_printTogl $spin] bind $t FSbind_printSetup bind $t [list FSbind_SetSurfColor $spin] bind $t [list FSbind_SetCellColor $spin] bind $t [list FSbind_glLight $spin] bind $t [list FSbind_ModDepthCuing $spin] bind $t [list FSbind_ModAntiAlias $spin] bind $t t [list FS_ToggleMenuCheckbutton transparent $spin FS_Config ] bind $t c [list FS_ToggleMenuCheckbutton displaycell $spin FS_fsConfig ] bind $t p [list FS_ToggleMenuCheckbutton cropbz $spin FS_fsConfig ] bind $t d [list FS_ToggleMenuCheckbutton depthcuing $spin FS_DepthCuing] bind $t a [list FS_ToggleMenuCheckbutton antialias $spin FS_AntiAlias ] # # here is some setting optimized for rendering Fermi Surfaces # global mody #xc_setGLparam lightmodel -disable_light 1 xc_newvalue $togl $mody(SET_FOG_DENSITY) 2.0 xc_newvalue $togl $mody(SET_FOG_ORT_START_F) 0.0 xc_newvalue $togl $mody(SET_FOG_ORT_END_F) 0.8 xc_newvalue $togl $mody(SET_ANTIALIAS_DEGREE) 2 xc_newvalue $togl $mody(SET_ANTIALIAS_OFFSET) 0.9 FS_DepthCuing $i $spin set fs($spin,$i,ident) [cry_surfreg $fs($spin,$i,togl)] cry_dispfunc $fs($spin,$i,togl) fermisurface # # small toolbox frame ontop of Togl # set small_toolbox [frame $togl.f -relief raised -bd 1 -class mea] place $small_toolbox -x 0 -y 0 set fs($spin,$i,show_small_toolbox_frame) 1 set fs($spin,$i,small_toolbox_frame) $small_toolbox set fs($spin,$i,toolbox_frame_place) [place info $small_toolbox] set separator_1 [frame $small_toolbox.s1 -height 2 -relief raised -bd 1] set separator_2 [frame $small_toolbox.s2 -height 2 -relief raised -bd 1] set bz_b [radiobutton $small_toolbox.bz -image fs_bz -highlightthickness 1 \ -variable fs($spin,$i,celltype) -value bz -indicatoron 0 \ -selectcolor \#ff4444 -highlightbackground \#000000 \ -command [list FSbutton_SmallToolbox bz $i $spin]] set para_b [radiobutton $small_toolbox.para -image fs_cell -highlightthickness 1 \ -variable fs($spin,$i,celltype) -value para -indicatoron 0 \ -selectcolor \#ff4444 -highlightbackground \#000000 \ -command [list FSbutton_SmallToolbox para $i $spin]] set nocrop_b [checkbutton $small_toolbox.nocrop -image fs_nocrop -highlightthickness 1 \ -selectcolor \#44ff44 -highlightbackground \#000000 \ -variable fs($spin,$i,nocropbz) -command [list FSbutton_SmallToolbox nocrop $i $spin] -indicatoron 0] foreach button {nocell wirecell solidcell solidwirecell} { set ${button}_b [radiobutton $small_toolbox.$button \ -image fs_$button -highlightthickness 1 \ -selectcolor \#4444ff -highlightbackground \#000000 \ -variable fs($spin,$i,radiobutton_celldisplaytype) -value $button -indicatoron 0 \ -command [list FSbutton_SmallToolbox $button $i $spin]] } set b_pack_option {-side top -fill x -padx 0 -pady 0 -ipadx 0 -ipady 0} set s_pack_option {-side top -fill x -padx 0 -pady 2 -ipadx 0 -ipady 0} eval pack $bz_b $para_b $b_pack_option eval pack $separator_1 $s_pack_option eval pack $nocrop_b $b_pack_option eval pack $separator_2 $s_pack_option eval pack $nocell_b $wirecell_b $solidcell_b $solidwirecell_b $b_pack_option global xcFonts foreach {wid text} { bz "display Fermi surface in Brillouin zone" para "display Fermi surface in reciprocal unit cell" nocrop "toggle croping of Fermi surface to Brillouin zone" nocell "do not display cell" wirecell "display wire cell" solidcell "display solid cell" solidwirecell "display solid+wire cell" } { set path $small_toolbox.$wid DynamicHelp::register $path balloon $text } # # Status frame # set ff [frame $f.f -relief ridge -bd 4] pack $ff -side top -expand 0 -fill x -padx 0m -pady 0m #set fs($spin,$i,status_f) $ff set fs($spin,$i,show_status_frame) 1 set fs($spin,$i,status_frame) $ff set fs($spin,$i,status_frame_pack) [pack info $ft] if { $spin != {} } { set l1 [label $ff.l1 -text "Spin: [string toupper $spin]" \ -anchor w -relief sunken -bd 1] pack $l1 -side left -padx 1m -ipadx 1m -ipady 1m } set l2 [label $ff.l2 -text "FERMI Energy: $fs(Efermi)" \ -anchor w -relief sunken -bd 1] set l3 [label $ff.l3 -text "Min Ene: $fs($spin,$i,minE)" \ -anchor w -relief sunken -bd 1] set l4 [label $ff.l4 -text "Max Ene: $fs($spin,$i,maxE)" \ -anchor w -relief sunken -bd 1] set fff [frame $ff.f -relief sunken -bd 1] pack $l2 $l3 $l4 \ -side left -padx 1m -ipadx 1m -ipady 1m pack $fff \ -side right -fill x -padx 1m -ipadx 1m -ipady 1m set l5 [label $fff.l5 -text "Isolevel:"] set e [entry $fff.e \ -width 15 -textvariable fs($spin,$i,isolevel) \ -validate key -validatecommand {string is double %P}] pack $e $l5 -side right -padx 0m -pady 0m bind $e [list FS_Config $i $spin] } } if { $_first_band != -1 } { $nb raise band$_first_band update set fs($spin,toolbox_frame_height) [winfo height $fs($spin,$_first_band,toolbox_frame)] set fs($spin,status_frame_height) [winfo height $fs($spin,$_first_band,status_frame)] xcDebug -debug "fs($spin,toolbox_frame_height) == [winfo height $fs($spin,$_first_band,toolbox_frame)]" xcDebug -debug "fs($spin,status_frame_height) == [winfo height $fs($spin,$_first_band,status_frame)] " } else { WarningDialog "no band selected !!! Aplication will exit." exit 0 } update set fs($spin,togl_w) [winfo width $fs($spin,$_first_band,togl)] set fs($spin,togl_h) [winfo height $fs($spin,$_first_band,togl)] set fs($spin,top_w) [winfo width $t] set fs($spin,top_h) [winfo height $t] set fs($spin,top_togl_dw) [expr $fs($spin,top_w) - $fs($spin,togl_w)] set fs($spin,top_togl_dh) [expr $fs($spin,top_h) - $fs($spin,togl_h)] xcDebug -debug "fs($spin,togl_w) == [winfo width $fs($spin,$_first_band,togl)]" xcDebug -debug "fs($spin,togl_h) == [winfo height $fs($spin,$_first_band,togl)]" xcDebug -debug "fs($spin,top_w) == [winfo width $t] " xcDebug -debug "fs($spin,top_h) == [winfo height $t] " xcDebug -debug "fs($spin,top_togl_dw) == [expr $fs($spin,top_w) - $fs($spin,togl_w)]" xcDebug -debug "fs($spin,top_togl_dh) == [expr $fs($spin,top_h) - $fs($spin,togl_h)]" xcDebug -debug "Notebook's width: [winfo width $nb]" xcDebug -debug "Notebook's height: [winfo height $nb]" #if { $fs($spin,top_h) < $fs($spin,togl_h) } { # set fs($spin,top_h) [expr $fs($spin,togl_h) + $fs($spin,toolbox_frame_height) + $fs($spin,status_frame_height) + 30] # set fs($spin,top_w) [expr $fs($spin,togl_w) + 4] #} #set w $fs($spin,top_w) #set h $fs($spin,top_h) #if { $spin == "dn" } { # wm geometry $t ${w}x${h}+0-0 #} else { # wm geometry $t ${w}x${h}-0+0 #} for {set i 1} {$i <= $fs($spin,nbands)} {incr i} { if { $fs($spin,$i,band_selected) } { set fs($spin,$i,togl_w) [winfo width $fs($spin,$_first_band,togl)] set fs($spin,$i,togl_h) [winfo height $fs($spin,$_first_band,togl)] set fs($spin,$i,top_togl_dw) [expr $fs($spin,top_w) - $fs($spin,togl_w)] set fs($spin,$i,top_togl_dh) [expr $fs($spin,top_h) - $fs($spin,togl_h)] } } FS_Multi $nb $spin bind $t [list FS_ResizeWin %W %w %h $t $spin] } proc FS_PopupMenu {W x y i {spin {}} {multiband {}}} { global fs set togl $fs($spin,$i,togl) if { [winfo exists $W.menu] } { destroy $W.menu } set m [menu $W.menu -tearoff 1] tk_popup $m $x $y #$m add command -label "PopUp Menu" -state disabled #$m add separator # ------------------------------------------------------------------------ # Pop-Up menu # ------------------------------------------------------------------------ if { $multiband == "" } { $m add command -label "Render Surface" \ -command [list FS_RenderSurface $i $spin] #$m add separator #$m add command -label "Interpolation" \ # -command [list FS_Interpolation "Interpolation for band \# $i:" $togl $spin $i] #$m add command -label "Zoom" \ # -command [list toglZoom "Zoom for band \# $i:" $togl] # $m add separator } # Palette-cascade $m add cascade -image colors -menu $m.colors menu $m.colors -tearoff 1 ColorMenu $W $m.colors # File-cascade $m add cascade -label "File" -menu $m.file set mfile [menu $m.file -tearoff 1] $mfile add command -label "Save Fermi Surface(s) in BXSF format" \ -command [list FS_SaveBXSF $i $spin multiband] $mfile add separator $mfile add command -label "Print Setup" -command printSetup -accelerator "Ctlr-Alt-p" $mfile add command -label "Print " -command [list printTogl $togl] -accelerator "Ctrl-p" if { $multiband == "" } { # View-cascade $m add cascade -label "View" -menu $m.view menu $m.view -tearoff 1 # Display-cascade $m add cascade -label "Display" -menu $m.dis menu $m.dis -tearoff 1 # Modify-cascade $m add cascade -label "Modify" -menu $m.mody menu $m.mody -tearoff 1 FS_ViewMenu $m.view $W $i $spin FS_DisplayMenu $m.dis $W $i $spin FS_ModifyMenu $m.mody $W $i $spin #$m add cascade -label "Modify" -menu $m.mod #menu $m.mod -tearoff 1 #FS_ModifyMenu $m.dis $W $i $spin #$m add cascade -label "Tools" -menu $m.tools #menu $m.tools -tearoff 0 #FS_ToolsMenu $m.dis $W $i $spin } $m add separator $m add command -label "Print " -command [list printTogl $togl] -accelerator "Ctrl-p" $m add separator $m add command -label "Exit" -command exit_pr -accelerator "Ctrl-q" } proc FS_ResizeWin {W w h t {spin {}}} { global fs if { $t != $W } { set w [winfo width $t] set h [winfo height $t] } #xcDebug -debug "FS_ResizeWin> (w,h) == ($w,$h)" # update only if size of "toplevel ." has changed #if { $w != $fs($spin,top_w) || $h != $fs($spin,top_h) } { # set fs($spin,top_w) $w # set fs($spin,top_h) $h # for {set i 1} {$i <= $fs($spin,nbands)} {incr i} { # if { $fs($spin,$i,band_selected) } { # set fs($spin,$i,togl_w) [expr $w - $fs($spin,$i,top_togl_dw)] # set fs($spin,$i,togl_h) [expr $h - $fs($spin,$i,top_togl_dh)] # $fs($spin,$i,togl) config \ # -width $fs($spin,$i,togl_w) \ # -height $fs($spin,$i,togl_h) # } # } #} } proc FS_InitVar {i {spin {}}} { global fs # # set monocolor # set rainbow { { 1.0 0.2 0.2 0.5 } { 1.0 1.0 0.2 0.5 } { 0.2 1.0 0.2 0.5 } { 0.2 1.0 1.0 0.5 } { 0.2 0.2 1.0 0.5 } { 1.0 0.2 1.0 0.5 } } foreach rgb $rainbow { set r [expr 1.0 - [lindex $rgb 0]] set g [expr 1.0 - [lindex $rgb 1]] set b [expr 1.0 - [lindex $rgb 2]] set a 0.5 lappend backrainbow [list $r $g $b $a] } # # hard-coded defaults # set im [expr $i - 6 * int( $i / 6)] set fs($spin,$i,celltype) bz set fs($spin,$i,text_celltype) "first Brillouin zone" set fs($spin,$i,cropbz) 1 set fs($spin,$i,nocropbz) 0 set fs($spin,$i,displaycell) 1 set fs($spin,$i,celldisplaytype) wire set fs($spin,$i,drawstyle) solid set fs($spin,$i,transparent) 0 set fs($spin,$i,shademodel) smooth set fs($spin,$i,colormodel) "set front-side color only" set fs($spin,$i,monocolor) [lindex $rainbow $im] set fs($spin,$i,backmonocolor) [lindex $backrainbow $im] set fs($spin,$i,smoothsteps) 0 set fs($spin,$i,smoothweight) 0.2 set fs($spin,$i,interpolationdegree) {1 1 1} set fs($spin,$i,frontface) CW set fs($spin,$i,revertnormals) 0 set fs($spin,$i,wirecellcolor) {1.00 1.00 1.00 1.00} set fs($spin,$i,solidcellcolor) {0.00 0.95 0.95 0.40} set fs($spin,$i,antialias) 0 set fs($spin,$i,depthcuing) 0 set fs($spin,$i,radiobutton_celldisplaytype) $fs($spin,$i,celldisplaytype)cell # try to use user specified defaults FS_UserDefaults $i $spin set fs($spin,$i,old_celltype) $fs($spin,$i,celltype) set fs($spin,$i,old_cropbz) $fs($spin,$i,cropbz) set fs($spin,$i,old_displaycell) $fs($spin,$i,displaycell) set fs($spin,$i,old_celldisplaytype) $fs($spin,$i,celldisplaytype) set fs($spin,$i,old_drawstyle) $fs($spin,$i,drawstyle) set fs($spin,$i,old_transparent) $fs($spin,$i,transparent) set fs($spin,$i,old_shademodel) $fs($spin,$i,shademodel) set fs($spin,$i,old_monocolor) $fs($spin,$i,monocolor) set fs($spin,$i,old_smoothsteps) $fs($spin,$i,smoothsteps) set fs($spin,$i,old_smoothweight) $fs($spin,$i,smoothweight) set fs($spin,$i,old_interpolationdegree) $fs($spin,$i,interpolationdegree) #set fs($spin,$i,old_frontface) $fs($spin,$i,frontface) #set fs($spin,$i,old_revertnormals) $fs($spin,$i,revertnormals) } proc FS_UserBackground {togl} { global myParam mody # BEWARE: the myParam(FS_BACKGROUND) needs a special treatment if { [info exists myParam(FS_BACKGROUND)] } { if { ! [rgba $myParam(FS_BACKGROUND)] } { error "wrong value \"$myParam(FS_BACKGROUND)\" for myParam(FS_BACKGROUND), should be one of rgba type; correct custom-definition file" } else { eval xc_newvalue $togl $mody(L_BACKGROUND) $myParam(FS_BACKGROUND) } } } proc FS_UserDefaults {i {spin {}}} { global fs myParam # BEWARE: the myParam(FS_BACKGROUND) needs a special treatment foreach {fs_item allowed} { FS_CELLTYPE {bz para} FS_CROPBZ {0 1} FS_CELLDISPLAYTYPE {none wire solid solidwire} FS_DRAWSTYLE {solid wire dot} FS_TRANSPARENT {0 1} FS_SHADEMODEL {smooth flat} FS_INTERPOLATIONDEGREE {@ positiveInteger} FS_FRONTFACE {CW CCW} FS_REVERTNORMALS {0 1} FS_WIRECELLCOLOR {@ rgba} FS_SOLIDCELLCOLOR {@ rgba} FS_ANTIALIAS {0 1} FS_DEPTHCUING {0 1} } { if { [info exists myParam($fs_item)] } { regsub ^FS_ $fs_item {} _item set item [string tolower $_item] if { [lindex $allowed 0] == "@" } { # not a literal comparison, but a given type is specified set typeCmd [lindex $allowed 1] if { ! [$typeCmd $myParam($fs_item)] } { error "wrong value \"$myParam($fs_item)\" for myParam($fs_item), should be one of $typeCmd type; correct custom-definition file" } else { # special treatment for FS_INTERPOLATIONDEGREE if { $fs_item eq "FS_INTERPOLATIONDEGREE" } { set fs($spin,$i,$item) [list $myParam($fs_item) $myParam($fs_item) $myParam($fs_item)] } else { set fs($spin,$i,$item) $myParam($fs_item) } } } else { # literal comparison if { ! [allowedValue $myParam($fs_item) $allowed] } { error "wrong value \"$myParam($fs_item)\" for myParam($fs_item), should be one of: $allowed; correct custom-definition file" } else { set fs($spin,$i,$item) $myParam($fs_item) # handle specialties if { $item eq "cropbz" } { set fs($spin,$i,nocropbz) [expr ! $fs($spin,$i,cropbz)] } elseif { $item eq "celldisplaytype" } { switch -- $myParam($fs_item) { none { set fs($spin,$i,displaycell) 0 set fs($spin,$i,celldisplaytype) wire; # just in any case !!! set fs($spin,$i,radiobutton_celldisplaytype) nocell } wire - solid - solidwire { set fs($spin,$i,displaycell) 1 set fs($spin,$i,radiobutton_celldisplaytype) $fs($spin,$i,celldisplaytype)cell } } } } } } } } proc FS_RenderSurface {i {spin {}}} { global fs if { ! [info exist fs($spin,$i,rendered)] } { set fs($spin,$i,rendered) 1 FS:cry_surf $i $spin # next lines are a hack-around a "display-bug" to force the display set w [lindex [$fs($spin,$i,togl) config -width] end] $fs($spin,$i,togl) config -width $w $fs($spin,$i,togl) render $fs($spin,$i,togl) swapbuffers update } } proc FS:cry_surf {i {spin {}}} { global fs # band index-identifiers strats from 0 not from 1 in ReadBandGrid !!! set iband [expr $i - 1] SetWatchCursor update if { $fs($spin,$i,colormodel) == "set front-side color only" } { # monocolor == -monocolor $fs($spin,$i,monocolor) cry_surf $fs($spin,$i,togl) \ -ident $fs($spin,$i,ident) \ -type fermisurface \ -fs [list \ -gridindex $fs($spin,grid_index) \ -gridsubindex $fs($spin,grid_subindex) \ -bandindex $iband \ -celltype $fs($spin,$i,celltype) \ -cropbz $fs($spin,$i,cropbz) \ -displaycell $fs($spin,$i,displaycell) \ -celldisplaytype $fs($spin,$i,celldisplaytype) \ -interpolationdegree $fs($spin,$i,interpolationdegree) \ -wirecellcolor $fs($spin,$i,wirecellcolor) \ -solidcellcolor $fs($spin,$i,solidcellcolor)] \ -level $fs($spin,$i,isolevel) \ -drawstyle $fs($spin,$i,drawstyle) \ -transparent $fs($spin,$i,transparent) \ -shademodel $fs($spin,$i,shademodel) \ -monocolor $fs($spin,$i,monocolor) \ -smoothsteps $fs($spin,$i,smoothsteps) \ -smoothweight $fs($spin,$i,smoothweight) \ -frontface $fs($spin,$i,frontface) \ -revertnormals $fs($spin,$i,revertnormals) } else { # monocolor == -frontmonocolor $fs($spin,$i,monocolor) \ # -backmonocolor $fs($spin,$i,backmonocolor)" cry_surf $fs($spin,$i,togl) \ -ident $fs($spin,$i,ident) \ -type fermisurface \ -fs [list \ -gridindex $fs($spin,grid_index) \ -gridsubindex $fs($spin,grid_subindex) \ -bandindex $iband \ -celltype $fs($spin,$i,celltype) \ -cropbz $fs($spin,$i,cropbz) \ -displaycell $fs($spin,$i,displaycell) \ -celldisplaytype $fs($spin,$i,celldisplaytype) \ -interpolationdegree $fs($spin,$i,interpolationdegree) \ -wirecellcolor $fs($spin,$i,wirecellcolor) \ -solidcellcolor $fs($spin,$i,solidcellcolor)] \ -level $fs($spin,$i,isolevel) \ -drawstyle $fs($spin,$i,drawstyle) \ -transparent $fs($spin,$i,transparent) \ -shademodel $fs($spin,$i,shademodel) \ -frontmonocolor $fs($spin,$i,monocolor) \ -backmonocolor $fs($spin,$i,backmonocolor) \ -smoothsteps $fs($spin,$i,smoothsteps) \ -smoothweight $fs($spin,$i,smoothweight) \ -frontface $fs($spin,$i,frontface) \ -revertnormals $fs($spin,$i,revertnormals) } ResetCursor update } proc FS:cry_surfconfig {i {spin {}}} { global fs if { ! [info exist fs($spin,$i,rendered)] } { return } # band index-identifiers strats from 0 not from 1 in ReadBandGrid !!! set iband [expr $i - 1] SetWatchCursor update if { $fs($spin,$i,colormodel) == "set front-side color only" } { # monocolor == -monocolor $fs($spin,$i,monocolor) cry_surfconfig $fs($spin,$i,togl) \ -ident $fs($spin,$i,ident) \ -fs [list \ -gridindex $fs($spin,grid_index) \ -gridsubindex $fs($spin,grid_subindex) \ -bandindex $iband \ -celltype $fs($spin,$i,celltype) \ -cropbz $fs($spin,$i,cropbz) \ -displaycell $fs($spin,$i,displaycell) \ -celldisplaytype $fs($spin,$i,celldisplaytype) \ -interpolationdegree $fs($spin,$i,interpolationdegree) \ -wirecellcolor $fs($spin,$i,wirecellcolor) \ -solidcellcolor $fs($spin,$i,solidcellcolor)] \ -render 1 \ -level $fs($spin,$i,isolevel) \ -drawstyle $fs($spin,$i,drawstyle) \ -transparent $fs($spin,$i,transparent) \ -shademodel $fs($spin,$i,shademodel) \ -monocolor $fs($spin,$i,monocolor) \ -smoothsteps $fs($spin,$i,smoothsteps) \ -smoothweight $fs($spin,$i,smoothweight) \ -frontface $fs($spin,$i,frontface) \ -revertnormals $fs($spin,$i,revertnormals) } else { # monocolor == -frontmonocolor $fs($spin,$i,monocolor) \ # -backmonocolor $fs($spin,$i,backmonocolor)" cry_surfconfig $fs($spin,$i,togl) \ -ident $fs($spin,$i,ident) \ -fs [list \ -gridindex $fs($spin,grid_index) \ -gridsubindex $fs($spin,grid_subindex) \ -bandindex $iband \ -celltype $fs($spin,$i,celltype) \ -cropbz $fs($spin,$i,cropbz) \ -displaycell $fs($spin,$i,displaycell) \ -celldisplaytype $fs($spin,$i,celldisplaytype) \ -interpolationdegree $fs($spin,$i,interpolationdegree) \ -wirecellcolor $fs($spin,$i,wirecellcolor) \ -solidcellcolor $fs($spin,$i,solidcellcolor)] \ -render 1 \ -level $fs($spin,$i,isolevel) \ -drawstyle $fs($spin,$i,drawstyle) \ -transparent $fs($spin,$i,transparent) \ -shademodel $fs($spin,$i,shademodel) \ -frontmonocolor $fs($spin,$i,monocolor) \ -backmonocolor $fs($spin,$i,backmonocolor) \ -smoothsteps $fs($spin,$i,smoothsteps) \ -smoothweight $fs($spin,$i,smoothweight) \ -frontface $fs($spin,$i,frontface) \ -revertnormals $fs($spin,$i,revertnormals) } ResetCursor update } proc FS_ModifyMenu {m togl i {spin {}}} { global fs $m add command -label "Surface Color" \ -command [list FS_SetSurfColor $i $spin] -accelerator "Shift-s" $m add command -label "Cell Color" \ -command [list FS_SetCellColor $i $spin] -accelerator "Shift-c" $m add separator $m add command -label "Lighting Parameters" -command [list glLight $togl] \ -accelerator "Shift-l" $m add command -label "Depth-Cuing Parameters" \ -command [list FS_ModDepthCuing $i $spin] -accelerator "Shift-d" $m add command -label "Anti-aliasing Parameters" \ -command [list FS_ModAntiAlias $i $spin] -accelerator "Shift-a" } proc FS_ViewMenu {m togl i {spin {}}} { global fs # # Checkbuttons # $m add checkbutton -label "Show Toolbox" \ -variable fs($spin,$i,show_toolbox_frame) \ -command [list FS_ViewMenu:_show toolbox $i $spin] $m add checkbutton -label "Show Small Toolbox" \ -variable fs($spin,$i,show_small_toolbox_frame) \ -command [list FS_ViewMenu:_show small_toolbox $i $spin] $m add checkbutton -label "Show Status Frame" \ -variable fs($spin,$i,show_status_frame) \ -command [list FS_ViewMenu:_show status $i $spin] } proc FS_ViewMenu:_show {which i spin} { global fs set dh 0 switch -exact -- $which { toolbox { # # TOOLBOX # if { $fs($spin,$i,show_toolbox_frame) } { eval pack $fs($spin,$i,toolbox_frame) $fs($spin,$i,toolbox_frame_pack) \ -before $fs($spin,$i,toolbox_frame_packbefore) set dh [expr -1 * $fs($spin,toolbox_frame_height)] } else { pack forget $fs($spin,$i,toolbox_frame) set dh $fs($spin,toolbox_frame_height) } } small_toolbox { # # SMALL-TOOLBOX # if { $fs($spin,$i,show_small_toolbox_frame) } { eval place $fs($spin,$i,small_toolbox_frame) $fs($spin,$i,toolbox_frame_place) } else { place forget $fs($spin,$i,small_toolbox_frame) } } status { # # STATUS-FRAME # if { $fs($spin,$i,show_status_frame) } { eval pack $fs($spin,$i,status_frame) $fs($spin,$i,status_frame_pack) set dh [expr -1 * $fs($spin,status_frame_height)] } else { pack forget $fs($spin,$i,status_frame) set dh $fs($spin,status_frame_height) } } } set h [winfo height $fs($spin,$i,togl)] set fs($spin,$i,top_togl_dh) [expr $fs($spin,$i,top_togl_dh) - $dh] set fs($spin,$i,togl_h) [expr $h + $dh] $fs($spin,$i,togl) config -height $fs($spin,$i,togl_h) FS_ResizeWin . 0 0 [winfo toplevel $fs($spin,$i,togl)] $spin } proc FS_DisplayMenu {m togl i {spin {}}} { global fs if { $fs($spin,$i,celltype) == "para" } { set cell cell } else { set cell "first Brillouin zone" } # # Checkbuttons # $m add checkbutton -label "Transparent Fermi Surface" \ -variable fs($spin,$i,transparent) \ -command [list FS_Config $i $spin] -accelerator "t" $m add checkbutton -label "Display $cell" \ -variable fs($spin,$i,displaycell) \ -command [list FS_fsConfig $i $spin] -accelerator "c" $m add checkbutton -label "Crop Fermi Surface to first BZ" \ -variable fs($spin,$i,cropbz) \ -command [list FS_fsConfig $i $spin] -accelerator "p" if { $fs($spin,$i,celltype) == "para" } { $m entryconfig "Crop Fermi Surface to first BZ" -state disabled } $m add separator $m add checkbutton -label "Depth-Cuing" \ -variable fs($spin,$i,depthcuing) -onvalue 1 -offvalue 0 \ -command [list FS_DepthCuing $i $spin] -accelerator "d" $m add checkbutton -label "Anti-Aliasing" \ -variable fs($spin,$i,antialias) -onvalue 1 -offvalue 0 \ -command [list FS_AntiAlias $i $spin] -accelerator "a" # # CASCADES # $m add separator $m add cascade -label "Cell type ..." -menu $m.celltype $m add cascade -label "Display $cell as ..." -menu $m.discell $m add cascade -label "Surface Drawstyle ..." -menu $m.draw $m add cascade -label "Surface Shademodel ..." -menu $m.shade $m add separator #$m add command -label "Surface Smoothing" \ # -command [list FS_SurfSmooth $i $spin] # CELLTYPE CASCADE menu $m.celltype -tearoff 0 $m.celltype add radiobutton -label "first Brillouin zone" \ -variable fs($spin,$i,text_celltype) \ -command [list celltype:FS_fsConfig $i $spin] $m.celltype add radiobutton -label "reciprocal primitive cell" \ -variable fs($spin,$i,text_celltype) \ -command [list celltype:FS_fsConfig $i $spin] # DISPLAYCELL CASCADE menu $m.discell -tearoff 0 $m.discell add radiobutton -label "solid" \ -variable fs($spin,$i,celldisplaytype) \ -command [list FS_fsConfig $i $spin] $m.discell add radiobutton -label "wire" \ -variable fs($spin,$i,celldisplaytype) \ -command [list FS_fsConfig $i $spin] #$m.discell add radiobutton -label "rod" \ # -variable fs($spin,$i,celldisplaytype) \ # -command [list FS_fsConfig $i $spin] $m.discell add radiobutton -label "solidwire" \ -variable fs($spin,$i,celldisplaytype) \ -command [list FS_fsConfig $i $spin] #$m.discell add radiobutton -label "solidrod" \ # -variable fs($spin,$i,celldisplaytype) \ # -command [list FS_fsConfig $i $spin] #$m.discell entryconfig "rod" -state disabled #$m.discell entryconfig "solidrod" -state disabled ######################################################################### #/ # DRAWSTYLE CASCADE menu $m.draw -tearoff 0 $m.draw add radiobutton -label "solid" \ -variable fs($spin,$i,drawstyle) \ -command [list FS_Config $i $spin] $m.draw add radiobutton -label "wire" \ -variable fs($spin,$i,drawstyle) \ -command [list FS_Config $i $spin] $m.draw add radiobutton -label "dot" \ -variable fs($spin,$i,drawstyle) \ -command [list FS_Config $i $spin] # SHADEMODEL CASCADE menu $m.shade -tearoff 0 $m.shade add radiobutton -label "smooth" \ -variable fs($spin,$i,shademodel) \ -command [list FS_Config $i $spin] $m.shade add radiobutton -label "flat" \ -variable fs($spin,$i,shademodel) \ -command [list FS_Config $i $spin] } proc FS_fsConfig {i {spin {}}} { global fs if { $fs($spin,$i,old_celltype) != $fs($spin,$i,celltype) } { FS:cry_surf $i $spin } else { FS:cry_surfconfig $i $spin } set fs($spin,$i,old_celltype) $fs($spin,$i,celltype) } proc FS_Config {i {spin {}}} { global fs # -level $fs($spin,$i,isolevel) # -drawstyle $fs($spin,$i,drawstyle) # -transparent $fs($spin,$i,transparent) # -shademodel $fs($spin,$i,shademodel) # -monocolor $fs($spin,$i,monocolor) # -smoothsteps $fs($spin,$i,smoothsteps) # -smoothweight $fs($spin,$i,smoothweight) FS:cry_surfconfig $i $spin } proc celltype:FS_fsConfig {i {spin {}}} { global fs if { $fs($spin,$i,text_celltype) == "reciprocal primitive cell" } { set fs($spin,$i,celltype) para } else { set fs($spin,$i,celltype) bz } FS_fsConfig $i $spin } proc FS_SaveBXSF {i {spin {}} {multiband {}}} { global fs system set filetypes { {{BXSF} {.bxsf} } {{All Files} * } } set sfile [tk_getSaveFile \ -initialdir $system(PWD) \ -title "Save BXSF File" \ -defaultextension ".bxsf" \ -filetypes $filetypes] if { $sfile == "" } { return } if { $multiband == "" } { # band index-identifiers strats from 0 not from 1 in ReadBandGrid !!! xc_writebandXSF $fs($spin,$i,ident) $fs(Efermi) $i $sfile } else { foreach band $fs($spin,bandlist) { xc_writebandXSF $fs($spin,$band,ident) $fs(Efermi) $band ${sfile}.band-$band } } } proc FS_SetSurfColor {i {spin {}}} { global fs if { ! [info exists fs($spin,$i,monocolor)] } { return } set fs($spin,$i,monocolor_R) [lindex $fs($spin,$i,monocolor) 0] set fs($spin,$i,monocolor_G) [lindex $fs($spin,$i,monocolor) 1] set fs($spin,$i,monocolor_B) [lindex $fs($spin,$i,monocolor) 2] set fs($spin,$i,monocolor_A) [lindex $fs($spin,$i,monocolor) 3] set fs($spin,$i,backmonocolor_R) [lindex $fs($spin,$i,backmonocolor) 0] set fs($spin,$i,backmonocolor_G) [lindex $fs($spin,$i,backmonocolor) 1] set fs($spin,$i,backmonocolor_B) [lindex $fs($spin,$i,backmonocolor) 2] set fs($spin,$i,backmonocolor_A) [lindex $fs($spin,$i,backmonocolor) 3] if { $spin == "" } { set t [xcToplevel [WidgetName] "Surface Colors for band #$i" "Surface Colors" . 0 0 1] } else { set t [xcToplevel [WidgetName] "Surface Colors for band #$i (spin: $spin)" "Surface Colors" . 0 0 1] } # # widgets # set f1 [frame $t.f1] set f2 [frame $t.f2] set f21 [frame $f2.1 -relief groove -bd 2] set f22 [frame $f2.2 -relief groove -bd 2] set f23 [frame $f2.3] pack $f1 $f2 -side top -padx 5 -pady 5 -fill both -expand 1 pack $f21 $f22 $f23 -side left -padx 3 -pady 3 -fill both set fs($spin,$i,backcolor_frame) $f22 RadioBut $f1 "Color model:" fs($spin,$i,colormodel) top top 1 0 \ "set front-side color only" "set front- and back-side colors" setRGBAwidget $f21 "Front-side color:" \ fs($spin,$i,monocolor_R) fs($spin,$i,monocolor_G) \ fs($spin,$i,monocolor_B) fs($spin,$i,monocolor_A) \ _UNKNOWN_ setRGBAwidget $f22 "Back-side color:" \ fs($spin,$i,backmonocolor_R) fs($spin,$i,backmonocolor_G) \ fs($spin,$i,backmonocolor_B) fs($spin,$i,backmonocolor_A) \ _UNKNOWN_ trace variable fs($spin,$i,colormodel) w FS_SetSurfColor:_widget FS_SetSurfColor:_widget fs $spin,$i,colormodel w # # in bottom frame goes the "Close|Update" buttons # set update [button $f23.update -text "Update" -command [list FS_SetSurfColor:Update $i $spin]] set close [button $f23.close -text "Close" -command [list CancelProc $t]] pack $update $close -side top -padx 5 -pady 5 -ipadx 3 -ipady 3 -fill x } proc FS_SetSurfColor:Update {i spin} { global fs set fs($spin,$i,monocolor) [list \ $fs($spin,$i,monocolor_R) \ $fs($spin,$i,monocolor_G) \ $fs($spin,$i,monocolor_B) \ $fs($spin,$i,monocolor_A)] set fs($spin,$i,backmonocolor) [list \ $fs($spin,$i,backmonocolor_R) \ $fs($spin,$i,backmonocolor_G) \ $fs($spin,$i,backmonocolor_B) \ $fs($spin,$i,backmonocolor_A)] FS_Config $i $spin } proc FS_SetSurfColor:_widget {name1 name2 op} { global fs regsub -- {,colormodel$} $name2 {} spin_i if { $fs($name2) == "set front-side color only" } { xcDisableAll -disabledfg $fs($spin_i,backcolor_frame) } else { xcEnableAll -disabledfg $fs($spin_i,backcolor_frame) } } proc FS_SetCellColor {i {spin {}}} { global fs set t .fs_cellcolor if { [winfo exists $t] } { return } xcToplevel $t "Cell Color" "Cell Color" set fs($spin,$i,wirecellcolor_R) [lindex $fs($spin,$i,wirecellcolor) 0] set fs($spin,$i,wirecellcolor_G) [lindex $fs($spin,$i,wirecellcolor) 1] set fs($spin,$i,wirecellcolor_B) [lindex $fs($spin,$i,wirecellcolor) 2] set fs($spin,$i,wirecellcolor_A) [lindex $fs($spin,$i,wirecellcolor) 3] set fs($spin,$i,solidcellcolor_R) [lindex $fs($spin,$i,solidcellcolor) 0] set fs($spin,$i,solidcellcolor_G) [lindex $fs($spin,$i,solidcellcolor) 1] set fs($spin,$i,solidcellcolor_B) [lindex $fs($spin,$i,solidcellcolor) 2] set fs($spin,$i,solidcellcolor_A) [lindex $fs($spin,$i,solidcellcolor) 3] set f1 [frame $t.1] set f2 [frame $t.2] pack $f1 $f2 -side left -fill both -padx 5 -pady 5 foreach type {wire solid} { set frame($type) [frame $f1.$type -relief groove -bd 2] pack $frame($type) -side left -fill both -padx 5 -pady 0 -ipady 3 -expand 1 setRGBAwidget $frame($type) "[string totitle $type]-cell color:" \ fs($spin,$i,${type}cellcolor_R) fs($spin,$i,${type}cellcolor_G) \ fs($spin,$i,${type}cellcolor_B) fs($spin,$i,${type}cellcolor_A) \ _UNKNOWN_ } # # in bottom frame goes the "Close|Update" buttons # set update [button $f2.update -text "Update" -command [list FS_SetCellColor:Update $i $spin]] set close [button $f2.close -text "Close" -command [list CancelProc $t]] pack $update $close -side top -padx 5 -pady 5 -ipadx 3 -ipady 3 -fill x } proc FS_SetCellColor:Update {i spin} { global fs set fs($spin,$i,wirecellcolor) [list \ $fs($spin,$i,wirecellcolor_R) \ $fs($spin,$i,wirecellcolor_G) \ $fs($spin,$i,wirecellcolor_B) \ $fs($spin,$i,wirecellcolor_A)] set fs($spin,$i,solidcellcolor) [list \ $fs($spin,$i,solidcellcolor_R) \ $fs($spin,$i,solidcellcolor_G) \ $fs($spin,$i,solidcellcolor_B) \ $fs($spin,$i,solidcellcolor_A)] FS_Config $i $spin } proc FS_SurfSmooth {i {spin {}}} { global fs fs_trial set fs_trial($spin,$i,smoothsteps) $fs($spin,$i,smoothsteps) set fs_trial($spin,$i,smoothweight) $fs($spin,$i,smoothweight) set t [xcToplevel [WidgetName] "Surface Smoothing" "SurfSmooth" . 20 20 1] message $t.m -aspect 800 \ -relief groove -bd 2 \ -text "Reasonable values for weight are between 0.1 and 1. Lighter weight will require more steps for smoothing, but will perturb the surface less !!!" pack $t.m -side top -padx 3m -pady 3m -ipadx 1m -ipady 1m set f [frame $t.f] set e [FillEntries $t {"Smoothing steps:" "Smoothing weight:"} \ [list fs_trial($spin,$i,smoothsteps) \ fs_trial($spin,$i,smoothweight)] 17 7] set e1 [string trimright $e 1] set foclist "$e $e1" set varlist [list \ [list fs_trial($spin,$i,smoothsteps) int] \ [list fs_trial($spin,$i,smoothweight) real] ] button $t.b1 -text "Close" -command [list CancelProc $t] button $t.b2 -text "Update" \ -command [list FS_SurfSmoothOK $t $foclist $varlist $i $spin] pack $f -side bottom -expand 1 -fill both -padx 3m -pady 3m pack $t.b1 $t.b2 -side left -expand 1 -padx 2m -pady 2m } proc FS_SurfSmoothOK {t foclist varlist i {spin {}}} { global fs fs_trial if ![check_var $varlist $foclist] { return } set fs($spin,$i,smoothsteps) $fs_trial($spin,$i,smoothsteps) set fs($spin,$i,smoothweight) $fs_trial($spin,$i,smoothweight) FS_Config $i $spin return } proc FS_AntiAlias {i {spin {}}} { global fs mody xc_newvalue $fs($spin,$i,togl) $mody(L_ANTIALIAS) $fs($spin,$i,antialias) # update display $fs($spin,$i,togl) render } proc FS_DepthCuing {i {spin {}}} { global fs mody xc_newvalue $fs($spin,$i,togl) $mody(L_FOG) $fs($spin,$i,depthcuing) # update display $fs($spin,$i,togl) render } proc FS_ModAntiAlias {i {spin {}}} { global fs set t .fs_antialias if { [winfo exists $t] } { return } xcToplevel $t "Anti-aliasing Parameters" "Antialias" glModParam:AntiAlias $t $t $fs($spin,$i,togl) } proc FS_ModDepthCuing {i {spin {}}} { global fs set t .fs_depthcuing if { [winfo exists $t] } { return } xcToplevel $t "Depth-Cuing Parameters" "Depth-Cuing" glModParam:DepthCuing $t $t $fs($spin,$i,togl) } proc FS_ToggleMenuCheckbutton {what spin cmd} { global fs set i [FS_getBandIndexFromNoteBookPage $spin] if { ! [info exists fs($spin,$i,$what)] } { return } if { $fs($spin,$i,$what) } { set fs($spin,$i,$what) 0 } else { set fs($spin,$i,$what) 1 } eval $cmd $i $spin } proc FS_getBandIndexFromNoteBookPage {spin} { global fs set pageName [$fs($spin,nb) raise] if { $pageName == "multiband" } { set index [expr [lindex $fs($spin,bandlist) end] + 1] } else { set index [string trimleft $pageName band] } xcDebug -stderr "FS_getBandIndexFromNoteBookPage:: bandIndex = $index" return $index } proc FSbind_printTogl {spin} { global fs set i [FS_getBandIndexFromNoteBookPage $spin] printTogl $fs($spin,$i,togl) } proc FSbind_SetSurfColor {spin} { global fs if { [$fs($spin,nb) raise] == "multiband" } { return } set i [FS_getBandIndexFromNoteBookPage $spin] FS_SetSurfColor $i $spin } proc FSbind_SetCellColor {spin} { global fs if { [$fs($spin,nb) raise] == "multiband" } { return } set i [FS_getBandIndexFromNoteBookPage $spin] FS_SetCellColor $i $spin } proc FSbind_glLight {spin} { global fs set i [FS_getBandIndexFromNoteBookPage $spin] glLight $fs($spin,$i,togl) } proc FSbind_ModAntiAlias {spin} { global fs set i [FS_getBandIndexFromNoteBookPage $spin] FS_ModAntiAlias $i $spin } proc FSbind_ModDepthCuing {spin} { global fs set i [FS_getBandIndexFromNoteBookPage $spin] FS_ModDepthCuing $i $spin } proc FSbutton_SmallToolbox {button i spin} { global fs switch -exact -- $button { bz { set fs($spin,$i,text_celltype) "first Brillouin zone" celltype:FS_fsConfig $i $spin } para { set fs($spin,$i,text_celltype) "reciprocal primitive cell" celltype:FS_fsConfig $i $spin } nocrop { if { $fs($spin,$i,nocropbz) } { set fs($spin,$i,cropbz) 0 } else { set fs($spin,$i,cropbz) 1 } FS_fsConfig $i $spin } nocell { set fs($spin,$i,displaycell) 0 FS_fsConfig $i $spin } wirecell { set fs($spin,$i,displaycell) 1 set fs($spin,$i,celldisplaytype) wire FS_fsConfig $i $spin } solidcell { set fs($spin,$i,displaycell) 1 set fs($spin,$i,celldisplaytype) solid FS_fsConfig $i $spin } solidwirecell { set fs($spin,$i,displaycell) 1 set fs($spin,$i,celldisplaytype) solidwire FS_fsConfig $i $spin } } } xcrysden-1.6.2/Tcl/fs/Makefile0000644000175000017500000000030213556022211014635 0ustar tonetoneTOPDIR = $(PWD)/../.. TCL_INDEX = $(TOPDIR)/util/tcl_index include ../../Make.sys .tcl: tclIndex: *.tcl XCRYSDEN_TOPDIR=$(TOPDIR); \ export XCRYSDEN_TOPDIR; $(TCL_INDEX) clean: -rm -f *~ xcrysden-1.6.2/Tcl/fs/wnFSInit.tcl0000644000175000017500000001665011712736221015424 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnFSInit.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc wnFSInit filedir { global wn xcMisc XCRYSDEN_Logo $filedir ##################################### set wn(dir) $filedir set wn(filehead) [file tail $filedir] set head $wn(filehead) wnReadStruct $wn(filehead) ###################################### if [winfo exists .title] { destroy .title } set t [xcToplevel .fs_init \ "*** XCrySDen: Fermi Surface Preparation: $head" \ "Fermi Surface" . 290 000 1] set cf .fs_init.f if [winfo exists $cf] { destroy $cf } frame $cf pack $cf # # WIEN flags # set wn(c) {} if $wn(complex) { set wn(c) c } # # check if *.klist exists and assign # of k-points !!! # if { ![info exists wn(fs_nkp)] } { set klist $wn(dir)/$wn(filehead).klist if ![file exists $klist] { ErrorDialog "File \"$wn(dir)/$wn(filehead).klist\" does not exists !!!" exit_pr } # this is bad test set wn(fs_nkp) [exec head -1 $klist | awk "{print \$9}"] if { ! [string is integer $wn(fs_nkp)] || $wn(fs_nkp) == "" } { set wn(fs_nkp) 2000 } } if { ![info exists wn(fs_shift)] } { set wn(fs_shift) 0 } #----------------------------------------- # 1st part of WIEN fermi TASK-LIST #----------------------------------------- # This is the definition of the widgets:: #----------------------------------------- # LABEL: "Number of k-points: " # ENTRY: wn(fs_nkp) # BUTTON: "Generate k-mesh" COM:: wnGenKMesh #set widlist [list \ # [list label -text "Number of k-points: "] \ # [list entry -textvariable wn(fs_nkp) -width 20 -relief sunken] \ # [list checkbutton -text "Allow the shift of k-mesh" \ # -variable wn(fs_shift)] \ # [list button -text "Generate k-mesh" -command wnGenKMesh] \ # [list button -text "Change to unit 5 in $wn(filehead).in1$wn(c)" \ # -command "wnTo5In1 $wn(filehead).in1$wn(c)" ] \ # [list button -text "Edit $wn(filehead).in1$wn(c) file (optional)" \ # -command "xcEditFile $wn(dir)/$wn(filehead).in1$wn(c)"]] set widlist [subst { {label -text "Number of k-points: "} {entry -textvariable wn(fs_nkp) -width 20 -relief sunken} {label -text "NOTE: shift of k-mesh is not supported !!!\n(Fermi surfaces calculated with the shited k-mesh\nwill be erratically displayed !!!)"} {button -text "Generate k-mesh" -command wnGenKMesh} }] # # Widget section !!! # foreach wid $widlist { set w [WidgetName $cf] set com [concat [lindex $wid 0] $w [lrange $wid 1 end]] eval $com pack $w -side top -expand 1 -fill x -padx 2m -pady 1m } # # if SPIN-POLARIZED make a NoteBook for up- & down-spin # if $wn(spin_polarized) { set nb [NoteBook [WidgetName $cf]] pack $nb -side top -expand 1 -fill x -padx 2m -pady 3m $nb insert 0 spin_up -text "Spin type: up" $nb insert 1 spin_dn -text "Spin type: dn" $nb raise spin_up set fup [$nb getframe spin_up] wnFSSetSpinFlag $fup up set fdn [$nb getframe spin_dn] wnFSSetSpinFlag $fdn dn } else { wnFSSetSpinFlag $cf } #----------------------------------------- # 3rd part of WIEN fermi TASK-LIST #----------------------------------------- # This is the definition of the widgets:: #----------------------------------------- # BUTTON: "Exit" set e [button [WidgetName $cf] -text Exit -command exit_pr] pack $e -side top -expand 0 -padx 10m -pady 3m } # # we need this proc to handle correctly the spin polarized case # (up- & down-spin each in its NoteBook tab --> proc called # for each spin) # proc wnFSSetSpinFlag {cf {spin {}}} { global wn set wn(options) {} if {$wn(c) != {}} { append wn(options) " -$wn(c)" } if {$spin != {}} { append wn(options) " -$spin" } set lapw2 [concat $wn(options) -fermi] set wn(updn) $spin set wn(exe_flag) [concat x lapw1 $wn(options)] set wn(lapw2) [concat x lapw2 $lapw2] #----------------------------------------- # 2nd part of WIEN fermi TASK-LIST #----------------------------------------- #----------------------------------------- # This is the definition of the widgets:: #----------------------------------------- # CHECKBUTTON: "Parallel execution of lapw1/lapw2" # BUTTON: "Calculate Eigenvalues (x lapw1)" COM:: wnRunWIEN # BUTTON: "Calculate Fermi energy (x lapw2)" COM:: wnRunWIEN # BUTTON: "Render Fermi Surface" COM:: wnFSGo if { ! [info exists wn(checkbutton_parallel)] } { set wn(checkbutton_parallel) 0 } set cb [checkbutton [WidgetName $cf] -text "Parallel execution of lapw1/lapw2" -variable wn(checkbutton_parallel)] pack $cb -side top -expand 1 -fill x -padx 2m -pady 1m set textlist [list \ "Calculate Eigenvalues \[x lapw1 $wn(options)\]" \ "Calculate Fermi energy \[x lapw2 $lapw2\]" \ "Render Fermi Surface"] set kgen $wn(dir)/$wn(filehead).outputkgen set comlist \ [list \ [list wnFS_ExecLapw $wn(exe_flag) {WIEN program is calculating the eigenvalues. It can take a lot of CPU time. PLEASE WAIT!!!} \ $wn(dir)/$wn(filehead).output1$wn(updn)] \ [list wnFS_ExecLapw $wn(lapw2) {WIEN program is calculating the Fermi energy. PLEASE WAIT!!!} $wn(dir)/$wn(filehead).output2$wn(updn)] \ [list wnFSGo $kgen $spin]] foreach text $textlist com $comlist { set b [button [WidgetName $cf] -text $text -command $com] pack $b -side top -expand 1 -fill x -padx 2m -pady 1m } } proc wnFS_ExecLapw {cmd display_text outputf} { global wn if { $wn(checkbutton_parallel) } { set wn(parallel) 1 append cmd " -p" } else { set wn(parallel) 0 } wnRunWIEN $cmd $display_text $outputf } #set textlist [list \ # "Generate k-mash # "Run SCF cycle first!"\ # "Generate k-list with XCrysDen"\ # "Insert k-Points and change unit to 5 in $case.in1$c" \ # "Calculate Eigenvalues (x lapw1 $cmdopt)"\ # "Edit $case.insp (insert correct EF)"\ # "Calculate Bandstructure (x spaghetti $cmdopt)"\ # "Preview Bandstructure (ghostview $case.spaghetti${fspin}_ps)"\ # "Save Bandstructure"\ # "Reset unit to 4 in $case.in1$c" \ # ] # #set tasklist [list \ # "title" \ # "xcrysden --wien_kpath $workdir" \ # "edit $case.in1$c" \ # "exe x lapw1 $cmdopt"\ # "edit $case.insp"\ # "exe x spaghetti $cmdopt"\ # "exe gv $case.spaghetti${fspin}_ps"\ # "savetask $task"\ # "edit $case.in1$c"\ # ] xcrysden-1.6.2/Tcl/fs/genFSInit.tcl0000644000175000017500000000752711716213712015553 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/genFSInit.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc genFSInit {file} { # # logo window # if { [winfo exists .title] } { destroy .title } XCRYSDEN_Logo $file # # read the BXSF file # set spin [FS_readBXSF $file] # # select bands for Fermi surface plotting ... # FS_bandSelect $spin # # render Fermi surface ... # FS_GoFermi $spin } proc FS_readBXSF {file} { global wn fs xcMisc system set file [gunzipXSF $file] # # lets read (band)XSF file; xc_readband return info structure which look # like: # # 1 { grid_index 3D grid_ident grid_nband 1 {subgrid0_ident}} set spin {} # # we must construct normal XSF file out of BXSF file and # run fsReadBXSF program to construct lattice vectors and Brillouin zone # if { [catch {exec $system(BINDIR)/fsReadBXSF $file \ $system(SCRDIR)/bxsf2xsf.xsf}] } { tk_dialog [WidgetName] ERROR "ERROR: an error occured while executing fsReadBXSF program" error 0 OK exit } xc_readXSF $system(SCRDIR)/bxsf2xsf.xsf # # now read the BXSF file # set fs(titlefile) $file set sinfo [xc_readbandXSF $file] if { $sinfo == "" } { ErrorDialog "error reading the BXSF file: $file" return -code return } # parse $sinfo set slist [lindex $sinfo 1] set fs($spin,nbands) [lindex $slist 3] set fs($spin,grid_index) [lindex $slist 0] set fs($spin,grid_subindex) [expr [lindex $slist 4] - 1] if { ! [info exists fs(Efermi)] } { # read the Fermi level from BXSF file if it exists, # otherwise set it to zero set fs(Efermi) [_FSGetFermiEnergy $file] } # # 1. set MIN & MAX values of the band-grids # 2. write a band-widths file # set fs($spin,bandwidthfile) [file join $system(SCRDIR) band_widths.dat] set bwID [open $fs($spin,bandwidthfile) w] puts $bwID $fs($spin,nbands) for {set i 1} {$i <= $fs($spin,nbands)} {incr i} { set fs($spin,$i,band_selected) 1 set fs($spin,$i,minE) [xc_gridvalue min $fs($spin,grid_index) [expr $i - 1]] set fs($spin,$i,maxE) [xc_gridvalue max $fs($spin,grid_index) [expr $i - 1]] set fs($spin,$i,isolevel) $fs(Efermi) putsFlush stderr "Reading band: $i Min-value: $fs($spin,$i,minE) Max-value: $fs($spin,$i,maxE)" puts $bwID [format "%3d %13.6e %13.6e" $i $fs($spin,$i,minE) $fs($spin,$i,maxE)] } close $bwID return $spin } proc _FSGetFermiEnergy {file} { putsFlush stderr "Querying for fermi energy ..." set fID [open $file r] while { 1 } { set line [gets $fID] #putsFlush stderr "Line: $line" if { [string match -nocase *FERMI*ENERGY* $line] } { set fermi [lindex $line end] break } if { [eof $fID] } { set fermi 0.0 break } } close $fID putsFlush stderr " FERMI ENERGY set to $fermi" if { ! [string is double $fermi] } { set fermi 0.0 } return $fermi } xcrysden-1.6.2/Tcl/fs/FS_Multi.tcl0000644000175000017500000001222713522036665015407 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/FS_Main.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# # # this proc is called withinh FS_Main. Its purpuse is the display of # all merged FS bands. # proc FS_Multi {nb {spin {}}} { global fs xcMisc system set i [expr [lindex $fs($spin,bandlist) end] + 1] $nb insert $i multiband -text "Merged Bands" \ -createcmd [list FS_RenderMultiSurface $fs($spin,bandlist) $spin] # # page container frame # set f [$nb getframe multiband] set togl $f.togl$i # # toolbox frame # set ft [frame $f.container -relief raised -bd 1] pack $ft -side top -expand 0 -fill x -padx 0m -pady 0m FS_Toolbox $ft $togl $spin $i multiband set fs($spin,$i,show_toolbox_frame) 1 set fs($spin,$i,toolbox_frame) $ft set fs($spin,$i,toolbox_frame_pack) [pack info $ft] set fs($spin,$i,toolbox_frame_packbefore) $togl set fs($spin,$i,antialias) 0 set fs($spin,$i,depthcuing) 0 # # Togl # global toglOpt set fs($spin,$i,togl) [togl $togl \ -ident $togl \ -rgba $toglOpt(rgba) \ -redsize $toglOpt(redsize) \ -greensize $toglOpt(greensize) \ -bluesize $toglOpt(bluesize) \ -double $toglOpt(double) \ -depth $toglOpt(depth) \ -depthsize $toglOpt(depthsize) \ -accum $toglOpt(accum) \ -accumredsize $toglOpt(accumredsize) \ -accumgreensize $toglOpt(accumgreensize) \ -accumbluesize $toglOpt(accumbluesize) \ -accumalphasize $toglOpt(accumalphasize) \ -alpha $toglOpt(alpha) \ -alphasize $toglOpt(alphasize) \ -stencil $toglOpt(stencil) \ -stencilsize $toglOpt(stencilsize) \ -auxbuffers $toglOpt(auxbuffers) \ -overlay $toglOpt(overlay) \ -stereo $toglOpt(stereo) \ -time $toglOpt(time) \ -create togl_create \ -display togl_display \ -reshape togl_reshape \ -destroy togl_destroy \ -timer togl_timer ] pack $togl -fill both -expand 1 # take care of togl's background FS_UserBackground $togl bind $fs($spin,$i,togl) { xc_B1motion %W %x %y } bind $fs($spin,$i,togl) { xc_B2motion %W %x %y } bind $fs($spin,$i,togl) { xc_Brelease %W B1; MouseZoomBrelease %W } bind $fs($spin,$i,togl) { xc_Brelease %W B2 } bind $fs($spin,$i,togl) [list FS_PopupMenu %W %X %Y $i $spin multiband] bind $fs($spin,$i,togl) { MouseZoom %W %X %Y } bind $fs($spin,$i,togl) { MouseZoomBrelease %W } bind $fs($spin,$i,togl) { MouseWheelZoom %W +} bind $fs($spin,$i,togl) { MouseWheelZoom %W -} # ------------------------------------------------------------------------ # DISPLAY-FUNCTION # ------------------------------------------------------------------------ cry_dispfuncmultiFS $fs($spin,$i,togl) -togllist $fs($spin,togllist) } proc FS_RenderMultiSurface {bandlist {spin {}}} { global fs foreach i $bandlist { if { ! [info exist fs($spin,$i,rendered)] } { set fs($spin,$i,rendered) 1 FS:cry_surf $i $spin # next lines are a hack-around a "display-bug" to force the display set w [lindex [$fs($spin,$i,togl) config -width] end] $fs($spin,$i,togl) config -width $w $fs($spin,$i,togl) render $fs($spin,$i,togl) swapbuffers update } } } xcrysden-1.6.2/Tcl/fs/bandwidths.tcl0000644000175000017500000000131311712736221016040 0ustar tonetoneproc FS_displayBandWidths {bandWidthFile {spin ""}} { global wn set fID [open $bandWidthFile r] set nbands [gets $fID] set wn($spin,nbands) $nbands set text "Number of bands: $nbands\n" append text "---------------\n\n" #append text "# Band No. Min-ENE Max-ENE\n" while { ! [eof $fID] } { set line [gets $fID] if { [llength $line] == 3 } { set i [lindex $line 0] set e [lindex $line 1] set E [lindex $line 2] append text [format "Band No.: %3d; Min-ENE: %12.6f Max-ENE: %12.6f\n" $i $e $E] } } close $fID # # display the bandwidths in a Text widget # return [xcDisplayVarText $text "Band widths"] } xcrysden-1.6.2/Tcl/fs/interpolate.tcl0000644000175000017500000000236111725616203016244 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/interpolate.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc FS_Interpolation:submit {togl spin iband} { global FS_Interpolation fs set fs($spin,$iband,interpolationdegree) [list \ $FS_Interpolation($togl) \ $FS_Interpolation($togl) \ $FS_Interpolation($togl)] FS_fsConfig $iband $spin } xcrysden-1.6.2/Tcl/fs/wnReadStruct.tcl0000644000175000017500000000400211712736221016334 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnReadStruct.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc wnReadStruct filehead { global system wn geng cd $wn(dir) if [catch {exec $system(FORDIR)/str2xcr $filehead}] { tk_dialog [WidgetName] ERROR \ "ERROR while executing \"str2xcr\" program" \ error 0 OK } # now copy $filehead.xcr to $system(SCRDIR)/xc_str2xcr.$$ exec mv ${filehead}.xcr $system(SCRDIR)/xc_str2xcr.$system(PID) set dirname [file tail $filehead] exec mkdir $system(SCRDIR)/$dirname exec cp ${filehead}.struct $system(SCRDIR)/$dirname cd $system(SCRDIR) # # WIEN97 struct file is in BOHRs, thatwhy xc_str2xcr.$$ is in BOHRs # set geng(M3_ARGUMENT) [GetGengM3Arg BOHR 95] xcAppendState wien set periodic(igroup) 1 xcDebug "Going to GenGeom" GenGeom $geng(M1_PRIM) $geng(M2_CELL) $geng(M3_ARGUMENT) \ $periodic(igroup) \ 1 1 1 $system(SCRDIR)/xc_struc.$system(PID) xcDebug "Going to xc_readXSF" ################################################ xc_readXSF $system(SCRDIR)/xc_struc.$system(PID) ################################################ } xcrysden-1.6.2/Tcl/fs/toolbox.tcl0000644000175000017500000001045711716430066015412 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/toolbox.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc FS_Toolbox {toolbox togl spin iband {multiband ""}} { global FS_Interpolation toglZoom fs # width == 700 * $xcMisc(resolution_ratio1) if { $multiband == "" } { # # Interpolation # if { ! [info exists FS_Interpolation($togl)] } { if { [info exists fs($spin,$iband,interpolationdegree)] } { set FS_Interpolation($togl) [lindex $fs($spin,$iband,interpolationdegree) 0] } else { set FS_Interpolation($togl) 1 } } set f_int [frame $toolbox.int -relief sunken -bd 1] set l1 [label $f_int.l -text "Degree of\nInterpolation:" -font TkFixedFont -anchor w] set sc1 [scale $f_int.scale -from 1 -to 6 \ -font TkFixedFont \ -length 90 \ -variable FS_Interpolation($togl) \ -orient horizontal \ -tickinterval 1 \ -digits 1 \ -resolution 1 \ -showvalue false \ -width 10] set submit [button $f_int.submit -text Submit -font TkFixedFont \ -command [list FS_Interpolation:submit $togl $spin $iband]] pack $f_int -side left -padx 1m -ipadx 0m -ipady 1m pack $l1 $sc1 $submit -side left -padx 1 -pady 0 -ipadx 0 -ipady 0 } # # Zoom # if { ! [info exists toglZoom($togl)] } { set toglZoom($togl) 1.0 } if { ! [info exists toglZoom($togl,zoomStep)] } { set toglZoom($togl,zoomStep) 0.05 } set f_zoom [frame $toolbox.zoom -relief sunken -bd 1] # SCALE for translationStep set l2 [label $f_zoom.l -text "Zoom\nStep:" -font TkFixedFont -anchor w] set sc2 [scale $f_zoom.scale \ -from 0 -to 0.4 \ -font TkFixedFont \ -length 90 \ -variable toglZoom($togl,zoomStep) \ -orient horizontal \ -tickinterval 0.2 \ -digits 1 \ -resolution 0.05 \ -showvalue false \ -width 10] # zoom buttons set zoom1 [button $f_zoom.zoom1 -text "+" -font TkFixedFont] set zoom2 [button $f_zoom.zoom2 -text "-" -font TkFixedFont] #bind $zoom1 [list toglZoom:zoom $togl $zoom1 +] #bind $zoom2 [list toglZoom:zoom $togl $zoom2 -] bind $zoom1 [list toglZoom:discreteZoom $togl +] bind $zoom2 [list toglZoom:discreteZoom $togl -] pack $f_zoom -side left -padx 1m -ipadx 0m -ipady 1m pack $l2 $sc2 $zoom1 $zoom2 -side left -padx 1 -pady 0 -ipadx 0 -ipady 0 if { $multiband == "" } { # Revert Sides + Revert normals buttons set f_revert [frame $toolbox.revert -relief sunken -bd 1] set side [button $f_revert.side -text "Revert Sides" -font TkFixedFont \ -command [list FS_RevertIsoSides $spin $iband]] set norm [button $f_revert.norm -text "Revert Normals" -font TkFixedFont \ -command [list FS_RevertIsoNormals $spin $iband]] pack $f_revert -side right -padx 1m -ipadx 1m pack $side $norm -side top -fill x -expand 1 -padx 1 -pady 0 -ipadx 0 -ipady 0 } } proc FS_RevertIsoSides {spin iband} { global fs if { $fs($spin,$iband,frontface) == "CCW" } { set fs($spin,$iband,frontface) "CW" } else { set fs($spin,$iband,frontface) "CCW" } FS_Config $iband $spin } proc FS_RevertIsoNormals {spin iband} { global fs if { $fs($spin,$iband,revertnormals) } { set fs($spin,$iband,revertnormals) 0 } else { set fs($spin,$iband,revertnormals) 1 } FS_Config $iband $spin } xcrysden-1.6.2/Tcl/fhiPreset.tcl0000644000175000017500000001112112352550700015225 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/fhiPreset.tcl # # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc fhiPreset {type file} { global system fhi if { $type != "inpini" && $type != "coord" } { ErrorDialog "invalid type of fhiPreset !!!" return 0 } # just for any case cd $system(SCRDIR) if { $type == "inpini" } { ############################## # execute CONVERTING program # ############################## xcCatchExecReturn $system(BINDIR)/fhi_inpini2ftn34 $file getlist #if { [catch {exec $system(BINDIR)/fhi_inpini2ftn34 $file getlist}] } { # ErrorDialog "error while executing \"fhi_inpini2ftn34 $file getlist\" program" # return 0 #} } else { # type == coord ############################## # execute CONVERTING program # ############################## xcCatchExecReturn $system(BINDIR)/fhi_coord2xcr $file getlist #if { [catch {exec $system(BINDIR)/fhi_coord2xcr $file getlist}] } { # ErrorDialog "error while executing \"fhi_coord2xcr $file getlist\" program" # return 0 #} } # check if "fhi_species_name.list" was created ?!! if { ! [file exists fhi_species_name.list] } { ErrorDialog "\"FHIxxMD's\" file is probably bad !!!" return 0 } # # pop-up the toplevel with corresponding entries # set t [xcToplevel [WidgetName] "Atomic Numbers of Species" \ "Atomic Numbers" . 0 0 1] set f1 [frame $t.1] set f2 [frame $t.2] pack $f1 $f2 -side top -padx 10 -pady 10 -fill x frame $f1.title -class StressText label $f1.title.l -text "Specify Atomic Numbers of Species" \ -relief groove -bd 2 $f1.title.l config -font [ModifyFontSize $f1.title.l 18] pack $f1.title -side top -expand 1 pack $f1.title.l -ipadx 10 -ipady 3 -padx 10 -pady 10 -expand 1 # # build up for ScrollEntries # set list [split [ReadFile fhi_species_name.list] \n] set fhi(n_species) [lindex $list 0] set species_names [concat [lrange $list 1 end]] for {set i 0} {$i < $fhi(n_species)} {incr i} { set ii [expr $i + 1] set fhi(NAME,$ii) [lindex $species_names $i] } set labellist [list "Species:" "Atomic Number:"] set arraylist [list NAME NAT] set arraytype [list text posint] set buttonlist [list 1 \ [list {Periodic Table} scroll_ptableSelectNAT $t fhi NAT]] ScrollEntries \ $f1 \ $fhi(n_species) \ "Set Atomic Number for Species #" \ $labellist \ $arraylist \ $arraytype \ 15 \ fhi \ $buttonlist \ 3 # OK and cancel button should be cerated as well set ok [button $f2.ok -text OK -command [list fhiPresetOK $t]] set can [button $f2.can -text Cancel -command [list fhiPresetCan $t]] pack $ok $can -side left -expand 1 -padx 10 tkwait window $t return $fhi(status) } # # maybe the program should found out if OK button was pressed by the # presence of "fhi_species_nat.list" file !!! # proc fhiPresetOK t { global varlist foclist fhi system if ![check_var $varlist $foclist] {return 0} # # its seems OK; write the "fhi_species_nat.list" file and destroy # the toplevel window set out "$fhi(n_species)\n" for {set i 1} {$i <= $fhi(n_species)} {incr i} { append out "$fhi(NAT,$i) " } #################### # just in any case # cd $system(SCRDIR) #################### WriteFile fhi_species_nat.list $out w destroy $t set fhi(status) 1 } proc fhiPresetCan t { global fhi system #################### # just in any case # cd $system(SCRDIR) #################### if { [file exists fhi_species_nat.list] } { file delete fhi_species_nat.list } destroy $t set fhi(status) 0 } xcrysden-1.6.2/Tcl/configGrapher.tcl0000644000175000017500000011773412352550431016074 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/configGrapher.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc ConfigGrapher {gID graphcommand what {args {}}} { global grafdata graf grafsize graf_setticX graf_setticY \ configGrapher graf_setgrid graf_setaxe graf_setdos \ graf_setmar system font fillEntries set canvas $graf($gID,can) set g $graf($gID,active_graf) if [info exists configGrapher($gID,done)] { unset configGrapher($gID,done) } Prepare_and_Map_TickVar $gID switch -exact -- $what { ranges {set title Ranges} tics {set title Tics} grid {set title Grid} axe {set title Axis} margin {set title Margin} dos {set title "DOS Plot"} init_text { set n [expr $grafdata($gID,N_text) + 1] set title "Set Text #$n" OneEntryToplevel [WidgetName] $title $title "${title}:" \ 30 grafdata($gID,text$n) text 100 100 if { $grafdata($gID,text$n) != {} } { incr grafdata($gID,N_text) set grafdata($gID,text${n}_X) 0.5 set grafdata($gID,text${n}_Y) 0.5 } # now update the Grapher UpdateGrapher $gID $canvas $graphcommand return } } set t [xcToplevel [WidgetName] "Set $title for Graph #$g" \ "Set $title" . 100 100 1] # f1-frame should be flat so far (we may partition the f1-frame) set f1 [frame $t.f1] set f2 [frame $t.f2 -relief raised -bd 2] set f1l [frame $f1.l -relief raised -bd 2] set f1r [frame $f1.r -relief raised -bd 2] set ok [DefaultButton $f2.ok -text OK \ -command [list ConfigGrapherOK $gID $what]] set can [button $f2.can -text Cancel -command [list CancelProc $t]] set configGrapher($gID,apply_to_all) 0 if { $what != "margin" && $what != "dos" && $grafdata($gID,N_graf) > 1 } { set ckb [checkbutton $f1.cb \ -text "Apply to all Graphs" \ -relief raised -bd 2 \ -variable configGrapher($gID,apply_to_all)] } switch -exact -- $what { ranges { # set the X & Y ranges if { $grafdata($gID,type) == "BAR" } { set el1 [FillEntries $f1l "{First Bar:}" \ graf_setticX($gID,$g,min) \ 8 10 top left] set el2 [FillEntries $f1l "{Last Bar:}" \ graf_setticX($gID,$g,max) \ 8 10 top left] set type [list intrange $grafdata($gID,firstbar,1) \ $grafdata($gID,lastbar,1)] } else { set el1 [FillEntries $f1l "{X min:}" \ graf_setticX($gID,$g,min) \ 5 10 top left] set el2 [FillEntries $f1l "{X max:}" \ graf_setticX($gID,$g,max) \ 5 10 top left] set type real } set er1 [FillEntries $f1r "{Y min:}" \ graf_setticY($gID,$g,min) \ 5 10 top left] set er2 [FillEntries $f1r "{Y max:}" \ graf_setticY($gID,$g,max) \ 5 10 top left] set configGrapher($gID,check_num_list) \ [list \ [list \ [list graf_setticX($gID,$g,min) $type] \ [list graf_setticX($gID,$g,max) $type] \ [list graf_setticY($gID,$g,min) real] \ [list graf_setticY($gID,$g,max) real] \ ] \ [list $el1 $el2 $er1 $er2] ] } tics { # X tics set f1lf [frame $f1l.f -relief flat -class StressText] set xl [label $f1lf.l -text "X Tics" \ -relief groove \ -bd 2] pack $f1lf -side top -fill both pack $xl -side top -expand 1 \ -ipadx 10 -ipady 2 \ -padx 10 -pady 5 set configGrapher($gID,check_num_listX) \ [SpecifyTick $gID $g $f1l graf_setticX X] # Y tics set f1rf [frame $f1r.f -relief flat -class StressText] set yl [label $f1rf.l -text "Y Tics" \ -relief groove \ -bd 2] pack $f1rf -side top -fill both pack $yl -side top -expand 1 \ -ipadx 10 -ipady 2 \ -padx 10 -pady 5 set configGrapher($gID,check_num_listY) \ [SpecifyTick $gID $g $f1r graf_setticY Y] } grid { # X grid set f1lf [frame $f1l.f -relief flat -class StressText] set xl [label $f1lf.l -text "X Grid" \ -relief groove \ -bd 2] pack $f1lf -side top -fill both pack $xl -side top -expand 1 \ -ipadx 10 -ipady 2 \ -padx 10 -pady 5 set XM [checkbutton $f1l.b1 -text "X major grid" \ -variable graf_setgrid($gID,Xmajor,$g)] set Xm [checkbutton $f1l.b2 -text "X minor grid" \ -variable graf_setgrid($gID,Xminor,$g)] pack $XM $Xm -side top -padx 5 -pady 5 -fill x if { [WhatIsTickMode $gID $g X] == "position-label" } { set graf_setgrid($gID,Xminor,$g) 0 $Xm configure -state disabled } # Y grid set f1rf [frame $f1r.f -relief flat -class StressText] set yl [label $f1rf.l -text "Y Grid" \ -relief groove \ -bd 2] pack $f1rf -side top -fill both pack $yl -side top -expand 1 \ -ipadx 10 -ipady 2 \ -padx 10 -pady 5 set YM [checkbutton $f1r.b1 -text "Y major grid" \ -variable graf_setgrid($gID,Ymajor,$g)] set Ym [checkbutton $f1r.b2 -text "Y minor grid" \ -variable graf_setgrid($gID,Yminor,$g)] pack $YM $Ym -side top -padx 5 -pady 5 -fill x if { [WhatIsTickMode $gID $g Y] == "position-label" } { set graf_setgrid($gID,Yminor,$g) 0 $Ym configure -state disabled } } axe { # X axe set f1lf [frame $f1l.f -relief flat -class StressText] set xl [label $f1lf.l -text "X Axe" \ -relief groove \ -bd 2] pack $f1lf -side top -fill both pack $xl -side top -expand 1 \ -ipadx 10 -ipady 2 \ -padx 10 -pady 5 set mX [checkbutton $f1l.b1 -text "mirror X axe" \ -variable graf_setaxe($gID,mirrorXaxe,$g)] # Y axe set f1rf [frame $f1r.f -relief flat -class StressText] set yl [label $f1rf.l -text "Y Axe" \ -relief groove \ -bd 2] pack $f1rf -side top -fill both pack $yl -side top -expand 1 \ -ipadx 10 -ipady 2 \ -padx 10 -pady 5 set mY [checkbutton $f1r.b1 -text "mirror Y axe" \ -variable graf_setaxe($gID,mirrorYaxe,$g)] pack $mX $mY -side top -padx 5 -pady 5 -fill x } margin { # X margins set f1lf [frame $f1l.f -relief flat -class StressText] set xl [label $f1lf.l -text "Set X Margins" \ -relief groove \ -bd 2] pack $f1lf -side top -fill both pack $xl -side top -expand 1 \ -ipadx 10 -ipady 2 \ -padx 10 -pady 5 set e1 [FillEntries $f1l { "Bottom X Margin:" "Top X Margin:" } \ [list graf_setmar($gID,margin_X1) \ graf_setmar($gID,margin_X2)] 17 10] set entryList $fillEntries # Y margin set f1rf [frame $f1r.f -relief flat -class StressText] set xl [label $f1rf.l -text "Set Y Margins" \ -relief groove \ -bd 2] pack $f1rf -side top -fill both pack $xl -side top -expand 1 \ -ipadx 10 -ipady 2 \ -padx 10 -pady 5 set e2 [FillEntries $f1r { "Left Y Margin:" "Right Y Margin:" } \ [list graf_setmar($gID,margin_Y1) \ graf_setmar($gID,margin_Y2)] 17 10] set entryList [concat $entryList $fillEntries] #set e1t [string trimright $e1 entry1] #set e2t [string trimright $e2 entry1] set configGrapher($gID,check_num_list) \ [list \ [list \ [list graf_setmar($gID,margin_X1) real] \ [list graf_setmar($gID,margin_X2) real] \ [list graf_setmar($gID,margin_Y1) real] \ [list graf_setmar($gID,margin_Y2) real]] \ $entryList] } dos { #set f1lf [frame $f1l.f -relief flat -class StressText] #set xl [label $f1lf.l -text "Magnify DOS Plots" \ # -relief groove \ # -bd 2] #pack $f1lf -side top -fill both #pack $xl -side top -expand 1 \ # -ipadx 10 -ipady 2 \ # -padx 10 -pady 5 pack $f1 $f2 -side top -expand 1 -fill both pack $f1l -side top -expand 1 -fill both -ipadx 5 -ipady 5 set configGrapher($gID,check_num_list) \ [ScrollEntries $f1l $grafdata($gID,N_graf) \ {Magnify DOS Plot} \ {{Magnifying Factor:}} $gID,magnify posreal \ 5 graf_setdos 0 4] } } if { $what != "dos" } { pack $f1 $f2 -side top -expand 1 -fill both if { $what != "margin" && $grafdata($gID,N_graf) > 1 } { pack $ckb -side top -expand 1 -fill both } pack $f1l $f1r -side left -expand 1 -fill both -ipadx 5 -ipady 5 } if { $what == "text" } { destroy $f1r } pack $ok $can -side left -expand 1 -padx 10 -pady 5 ###################################### # # # OK button was pressed successfully # # # ###################################### tkwait variable configGrapher($gID,done) xcDebug "ConfigGrapher:: DefaultButton was pressed" destroy $t # # taking into account apply_to_all flag # if $configGrapher($gID,apply_to_all) { for {set i 1} {$i <= $grafdata($gID,N_graf)} {incr i} { append glist "$i " } } else { set glist $g } switch -exact -- $what { ranges { foreach gg $glist { if { $grafdata($gID,type) == "BAR" } { set b1 $graf_setticX($gID,$g,min) set b2 $graf_setticX($gID,$g,max) if { $b1 > $b2 } { set b $b1 set b2 $b1 set b1 $b } set dx [expr 1.0 / \ double($grafdata($gID,N_point,1))] set grafdata($gID,Xmin,$gg) \ [expr $dx * (double($b1) - 1.0)] set grafdata($gID,Xmax,$gg) [expr $dx * double($b2)] } else { set grafdata($gID,Xmin,$gg) $graf_setticX($gID,$g,min) set grafdata($gID,Xmax,$gg) $graf_setticX($gID,$g,max) } set grafdata($gID,Ymin,$gg) $graf_setticY($gID,$g,min) set grafdata($gID,Ymax,$gg) $graf_setticY($gID,$g,max) } } tics { foreach gg $glist { set grafdata($gID,Xtick_draw,$gg) $graf_setticX($gID,$g,tick_draw) set grafdata($gID,Ytick_draw,$gg) $graf_setticY($gID,$g,tick_draw) set grafdata($gID,Xtick_text_draw,$gg) $graf_setticX($gID,$g,tick_text_draw) set grafdata($gID,Ytick_text_draw,$gg) $graf_setticY($gID,$g,tick_text_draw) } # # X tics # if { $graf_setticX($gID,$g,mode) == "start-increment-end" } { foreach gg $glist { set wdone 1 set i 0 set grafdata($gID,N_MXtick,$gg) 0 while $wdone { set x [expr $graf_setticX($gID,$g,start) + \ double($i) * \ $graf_setticX($gID,$g,increment)] if [IsLEQ 0.0001 $x $graf_setticX($gID,$g,end)] { incr i incr grafdata($gID,N_MXtick,$gg) set grafdata($gID,Xtick$i,$gg) $x set grafdata($gID,Xtick${i}_text,$gg) \ [TickFormat $x \ $graf_setticX($gID,$g,increment)] } else { set wdone 0 break } } set grafdata($gID,N_mXtick,$gg) \ $graf_setticX($gID,$g,N_mtick) } } else { # if label-position are manually specified, # the number of minor tics is 0 foreach gg $glist { set grafdata($gID,N_mXtick,$gg) 0 set grafdata($gID,N_MXtick,$gg) \ $graf_setticX($gID,$g,N_Mtick) for {set i 1} {$i <= $graf_setticX($gID,$g,N_Mtick)} \ {incr i} { set grafdata($gID,Xtick$i,$gg) \ $graf_setticX($gID,$g,tick,$i) set grafdata($gID,Xtick${i}_text,$gg) \ $graf_setticX($gID,$g,tick_text,$i) } } } # # Y tics # if { $graf_setticY($gID,$g,mode) == "start-increment-end" } { foreach gg $glist { set wdone 1 set i 0 set grafdata($gID,N_MYtick,$gg) 0 while $wdone { set y [expr $graf_setticY($gID,$g,start) + \ double($i) * \ $graf_setticY($gID,$g,increment)] if [IsLEQ 0.0001 $y $graf_setticY($gID,$g,end)] { incr i incr grafdata($gID,N_MYtick,$gg) set grafdata($gID,Ytick$i,$gg) $y set grafdata($gID,Ytick${i}_text,$gg) \ [TickFormat $y \ $graf_setticY($gID,$g,increment)] } else { set wdone 0 break } } set grafdata($gID,N_mYtick,$gg) \ $graf_setticY($gID,$g,N_mtick) } } else { # if label-position are manually specified, # the number of minor tics is 0 foreach gg $glist { set grafdata($gID,N_mYtick,$gg) 0 set grafdata($gID,N_MYtick,$gg) \ $graf_setticY($gID,$g,N_Mtick) for {set i 1} {$i <= $graf_setticY($gID,$g,N_Mtick)} \ {incr i} { set grafdata($gID,Ytick$i,$gg) \ $graf_setticY($gID,$g,tick,$i) set grafdata($gID,Ytick${i}_text,$gg) \ $graf_setticY($gID,$g,tick_text,$i) } } } } grid { if $configGrapher($gID,apply_to_all) { foreach gg $glist { set graf_setgrid($gID,Xmajor,$gg) \ $graf_setgrid($gID,Xmajor,$g) set graf_setgrid($gID,Xminor,$gg) \ $graf_setgrid($gID,Xminor,$g) set graf_setgrid($gID,Ymajor,$gg) \ $graf_setgrid($gID,Ymajor,$g) set graf_setgrid($gID,Yminor,$gg) \ $graf_setgrid($gID,Yminor,$g) } } } margin { set grafsize($gID,margin_X1) $graf_setmar($gID,margin_X1) set grafsize($gID,margin_X2) $graf_setmar($gID,margin_X2) set grafsize($gID,margin_Y1) $graf_setmar($gID,margin_Y1) set grafsize($gID,margin_Y2) $graf_setmar($gID,margin_Y2) } dos { for {set g 1} {$g <= $grafdata($gID,N_graf)} {incr g} { for {set i 1} {$i <= $grafdata($gID,N_segment,$g)} {incr i} { xcDebug "Magnify:: $graf_setdos($gID,magnify,$g)" for {set j 1} {$j <= $grafdata($gID,N_point,$g)} {incr j} { set grafdata($gID,$j,$i,$g) \ [expr $grafdata($gID,$j,$i,$g) * \ $graf_setdos($gID,magnify,$g) / \ $grafdata($gID,magnify$g)] } } set grafdata($gID,magnify$g) $graf_setdos($gID,magnify,$g) } } axe { foreach gg $glist { set graf_setaxe($gID,mirrorXaxe,$gg) \ $graf_setaxe($gID,mirrorXaxe,$g) set graf_setaxe($gID,mirrorYaxe,$gg) \ $graf_setaxe($gID,mirrorYaxe,$g) } } } # now update the Grapher UpdateGrapher $gID $canvas $graphcommand } proc ConfigGrapherOK {gID what} { global configGrapher grafdata graf_setticX graf_setticY graf set g $graf($gID,active_graf) if [string match *${what}* {grid axe text}] { set configGrapher($gID,done) 1 return } switch -exact -- $what { tics { # we have configGrapher(check_num_listX) & # configGrapher(check_num_listY) # the format of configGrapher(check_num_listX) is the following: # # configGrapher(check_num_listX) -> {varlist2 foclist2} # # varlist2 -> {varlist_a varlist_b} # foclist2 -> {foclist_a foclist_b} set Xvarlist2 [lindex $configGrapher($gID,check_num_listX) 0] set Xfoclist2 [lindex $configGrapher($gID,check_num_listX) 1] set Yvarlist2 [lindex $configGrapher($gID,check_num_listY) 0] set Yfoclist2 [lindex $configGrapher($gID,check_num_listY) 1] # X list if { $graf_setticX($gID,$g,mode) == "start-increment-end" } { set indX 0 } else { set indX 1 } set varlist [lindex $Xvarlist2 $indX] set foclist [lindex $Xfoclist2 $indX] if ![check_var $varlist $foclist] { return } # Y list if { $graf_setticY($gID,$g,mode) == "start-increment-end" } { set indY 0 } else { set indY 1 } set varlist [lindex $Yvarlist2 $indY] set foclist [lindex $Yfoclist2 $indY] if ![check_var $varlist $foclist] { return } } default { # the format of configGrapher(check_num_list) is the following: # # configGrapher(check_num_list) -> {varlist foclist} if ![eval check_var $configGrapher($gID,check_num_list)] { return } } } set configGrapher($gID,done) 1 } proc Prepare_and_Map_TickVar gID { global grafdata graf_setticX graf_setticY graf_setmar grafsize \ graf_setdos graf # WARNING:: # because of some limitation the syntax of graf_setXXX variable will be: # graf_setXXX($gID,$g,*) !!!!!!!!!!!!! # # with some exceptions: grafdata($gID,magnify$g) xcDebug "Prepare_and_Map_TickVar #1" set g $graf($gID,active_graf) if { $grafdata($gID,type) == "BAR" } { set graf_setticX($gID,$g,min) \ [expr round(double($grafdata($gID,N_point,1)) * \ $grafdata($gID,Xmin,$g)) + 1] set graf_setticX($gID,$g,max) \ [expr round(double($grafdata($gID,N_point,1)) * \ $grafdata($gID,Xmax,$g))] } else { set graf_setticX($gID,$g,min) $grafdata($gID,Xmin,$g) set graf_setticX($gID,$g,max) $grafdata($gID,Xmax,$g) } set graf_setticY($gID,$g,min) $grafdata($gID,Ymin,$g) set graf_setticY($gID,$g,max) $grafdata($gID,Ymax,$g) set graf_setticX($gID,$g,N_Mtick) $grafdata($gID,N_MXtick,$g) set graf_setticX($gID,$g,N_mtick) $grafdata($gID,N_mXtick,$g) set graf_setticY($gID,$g,N_Mtick) $grafdata($gID,N_MYtick,$g) set graf_setticY($gID,$g,N_mtick) $grafdata($gID,N_mYtick,$g) set graf_setticX($gID,$g,tick_draw) $grafdata($gID,Xtick_draw,$g) set graf_setticY($gID,$g,tick_draw) $grafdata($gID,Ytick_draw,$g) set graf_setticX($gID,$g,tick_text_draw) $grafdata($gID,Xtick_text_draw,$g) set graf_setticY($gID,$g,tick_text_draw) $grafdata($gID,Ytick_text_draw,$g) set graf_setmar($gID,margin_X1) $grafsize($gID,margin_X1) set graf_setmar($gID,margin_X2) $grafsize($gID,margin_X2) set graf_setmar($gID,margin_Y1) $grafsize($gID,margin_Y1) set graf_setmar($gID,margin_Y2) $grafsize($gID,margin_Y2) for {set i 1} {$i <= $grafdata($gID,N_graf)} {incr i} { if ![info exists grafdata($gID,magnify$i)] { set grafdata($gID,magnify$i) 1 } set graf_setdos($gID,magnify,$i) $grafdata($gID,magnify$i) } WhatIsTickMode $gID $g X WhatIsTickMode $gID $g Y xcDebug "Prepare_and_Map_TickVar" } proc SpecifyTick {gID g w array who} { # w ....... name of parent # array ... $array == global arrayname # who ..... X or Y global graf_setticX graf_setticY if { $array == "graf_setticX" } { set mode graf_setticX($gID,$g,mode) set start graf_setticX($gID,$g,start) set increment graf_setticX($gID,$g,increment) set end graf_setticX($gID,$g,end) set N_Mtick graf_setticX($gID,$g,N_Mtick) set N_mtick graf_setticX($gID,$g,N_mtick) set tick_draw graf_setticX($gID,$g,tick_draw) set tick_text_draw graf_setticX($gID,$g,tick_text_draw) } elseif { $array == "graf_setticY"} { set mode graf_setticY($gID,$g,mode) set start graf_setticY($gID,$g,start) set increment graf_setticY($gID,$g,increment) set end graf_setticY($gID,$g,end) set N_Mtick graf_setticY($gID,$g,N_Mtick) set N_mtick graf_setticY($gID,$g,N_mtick) set tick_draw graf_setticY($gID,$g,tick_draw) set tick_text_draw graf_setticY($gID,$g,tick_text_draw) } xcDebug "SpecifyTick:: $array" set f1lu [frame $w.u -relief groove -bd 2] set r1 [radiobutton $f1lu.r1 \ -text "\"start-increment-end\"" \ -variable $mode \ -value start-increment-end \ -anchor w] pack $r1 -side top set elu1 [FillEntries $f1lu "{Start:}" \ $start \ 17 10 top left] set elu2 [FillEntries $f1lu "{Increment:}" \ $increment \ 17 10 top left] set elu3 [FillEntries $f1lu "{End:}" \ $end \ 17 10 top left] set elu4 [FillEntries $f1lu "{No. of Minor Tics:}" \ $N_mtick \ 17 10 top left] set f1lb [frame $w.b -relief groove -bd 2] set r2 [radiobutton $f1lb.r1 \ -text "\"position & label\"" \ -variable $mode \ -value position-label \ -anchor w] pack $r2 -side top set elb1 [FillEntries $f1lb "{Number of Tics:}" \ $N_Mtick \ 15 10 top left] set blb1 [button $f1lb.b -text "Specify Tics & Labels" \ -command [list SpecifyTickLabels $gID $g $who]] pack $f1lu $f1lb -side top -fill both -expand 1 \ -padx 5 -pady 5 -ipadx 5 -ipady 5 pack $blb1 -side top -expand 1 -padx 5 -pady 5 set f1lbb [frame $w.bb -relief groove -bd 2] set cb1 [checkbutton $f1lbb.cb1 \ -text "display tics" \ -variable $tick_draw \ -onvalue 1 \ -offvalue 0 \ -anchor w] set cb2 [checkbutton $f1lbb.cb2 \ -text "display tics labels" \ -variable $tick_text_draw \ -onvalue 1 \ -offvalue 0 \ -anchor w] pack $f1lbb -side top -fill both -expand 1 \ -padx 5 -pady 5 -ipadx 5 -ipady 5 pack $cb1 $cb2 -side top -fill both -expand 1 # # make diable/enable entries control # $r1 configure -command \ [list SpecifyTicsState [list $elu1 $elu2 $elu3 $elu4] \ $elb1 $blb1 0] $r2 configure -command \ [list SpecifyTicsState $elb1 [list $elu1 $elu2 $elu3 $elu4] \ $blb1 1] xcDebug [list SpecifyTicsState [list $elu1 $elu2 $elu3 $elu4] $elb1 $blb1] upvar $mode m if { $m == "position-label" } { SpecifyTicsState $elb1 [list $elu1 $elu2 $elu3 $elu4] $blb1 1 } else { SpecifyTicsState [list $elu1 $elu2 $elu3 $elu4] $elb1 $blb1 0 } # # prepare for checking the variables # set varlist [list \ [list\ [list $start real] \ [list $increment real] \ [list $end real] \ [list $N_mtick int]] \ [list \ [list $N_Mtick int]]] set foclist [list \ [list $elu1 $elu2 $elu3 $elu4] \ [list $elb1]] return [list $varlist $foclist] } proc SpecifyTicsState {active disabled but butstate} { if $butstate { $but configure -state normal } else { $but configure -state disabled } set disabled_color [lindex \ [GetWidgetConfig button -disabledforeground] end] set enabled_color [lindex \ [GetWidgetConfig button -foreground] end] foreach wid $active { xcDebug "SpecifyTicsState_active:: $wid" # enable entry widget $wid configure -relief sunken -state normal # "enable label" set lab [string trimright $wid entry1]lab1 $lab configure -foreground $enabled_color } foreach wid $disabled { xcDebug "SpecifyTicsState_passive:: $wid" # disable entry widget $wid configure -relief flat -state disabled # "disenable label" set lab [string trimright $wid entry1]lab1 $lab configure -foreground $disabled_color } } proc SpecifyTickLabels {gID g who} { global graf_settic graf_setticX graf_setticY grafdata xcDebug "SpecifyTickLabels" set t [xcToplevel [WidgetName] "${who}-Set Tics & Labels" \ "${who}-Set Tics & Labels" . 100 100 1] set ft [frame $t.ft -relief raised -bd 2] set fb [frame $t.fb -relief raised -bd 2] pack $ft $fb -side top -expand 1 -fill both if { $who == "X" } { if { $graf_setticX($gID,$g,N_Mtick) == 0 } { destroy $t return } set graf_settic($gID,check_num_list) \ [ScrollEntries $ft $graf_setticX($gID,$g,N_Mtick) \ "X-Tic & Label n.:" "${who}-Position: Label:" \ [list $gID,$g,tick $gID,$g,tick_text] {real text} \ 10 graf_setticX 0 4] } elseif { $who == "Y" } { if { $graf_setticY($gID,$g,N_Mtick) == 0 } { destroy $t return } set graf_settic($gID,check_num_list) \ [ScrollEntries $ft $graf_setticY($gID,$g,N_Mtick) \ "Y-Tic & Label n.:" "${who}-Position: Label:" \ [list $gID,$g,tick $gID,$g,tick_text] {real text} \ 10 graf_setticY 0 4] } set ok [DefaultButton $fb.ok -text OK \ -command [list SpecifyTickLabelsOK $gID $t]] set can [button $fb.can -text Cancel -command [list CancelProc $t]] pack $ok $can -side left -expand 1 -padx 10 -pady 5 } proc SpecifyTickLabelsOK {gID t} { global graf_settic if ![eval check_var $graf_settic($gID,check_num_list)] { return } destroy $t } proc WhatIsTickMode {gID g axis} { global grafdata graf_setticX graf_setticY if { $axis == "X" } { if [info exists graf_setticX($gID,$g,mode)] { return $graf_setticX($gID,$g,mode) } else { # now find out if tics are specified in start-increment-end mode # # first X tics # set start_increment_end 1 # maybe grafdata(N_mXtics) == 0, but still the tics are # specified in start-increment-end mode if { $grafdata($gID,N_MXtick,$g) > 1 } { set dXold [expr \ $grafdata($gID,Xtick2,$g) - $grafdata($gID,Xtick1,$g)] for {set i 3} {$i <= $grafdata($gID,N_MXtick,$g)} {incr i} { set ii [expr $i - 1] set dXnew \ [expr $grafdata($gID,Xtick$i,$g) - \ $grafdata($gID,Xtick$ii,$g)] if ![IsEqual 0.0001 $dXnew $dXold] { set start_increment_end 0 break } set dXold $dXnew } # # make one more check # for {set i 1} {$i <= $grafdata($gID,N_MXtick,$g)} {incr i} { # tics value and text must be the same # for position-increment-end mode if ![catch {expr abs($grafdata($gID,Xtick${i}_text,$g))}] { # $grafdata($gID,Xtick${i}_text,$g) is a number if ![IsEqual 0.001 $grafdata($gID,Xtick$i,$g) \ $grafdata($gID,Xtick${i}_text,$g)] { set start_increment_end 0 break } } } set graf_setticX($gID,$g,mode) "position-label" if $start_increment_end { set graf_setticX($gID,$g,mode) "start-increment-end" set graf_setticX($gID,$g,start) $grafdata($gID,Xtick1,$g) set graf_setticX($gID,$g,increment) \ [expr $grafdata($gID,Xtick2,$g) - \ $grafdata($gID,Xtick1,$g)] set last $grafdata($gID,N_MXtick,$g) set graf_setticX($gID,$g,end) $grafdata($gID,Xtick$last,$g) } for {set i 1} {$i <= $grafdata($gID,N_MXtick,$g)} {incr i} { set graf_setticX($gID,$g,tick,$i) \ $grafdata($gID,Xtick$i,$g) set graf_setticX($gID,$g,tick_text,$i) \ $grafdata($gID,Xtick${i}_text,$g) } } else { set graf_setticX($gID,$g,mode) "position-label" if [info exists grafdata($gID,Xtick1,$g)] { set graf_setticX($gID,$g,tick,1) $grafdata($gID,Xtick1,$g) set graf_setticX($gID,$g,tick_text,1) \ $grafdata($gID,Xtick1_text,$g) } } } return $graf_setticX($gID,$g,mode) } if { $axis == "Y" } { if [info exists graf_setticY($gID,$g,mode)] { return $graf_setticY($gID,$g,mode) } else { # now find out if tics are specified in start-increment-end mode # # now, Y tics # set start_increment_end 1 # maybe grafdata(N_mYtics) == 0, but still the tics are # specified in start-increment-end mode if { $grafdata($gID,N_MYtick,$g) > 1 } { set dYold [expr \ $grafdata($gID,Ytick2,$g) - $grafdata($gID,Ytick1,$g)] for {set i 3} {$i <= $grafdata($gID,N_MYtick,$g)} {incr i} { set ii [expr $i - 1] set dYnew [expr $grafdata($gID,Ytick$i,$g) - \ $grafdata($gID,Ytick$ii,$g)] if ![IsEqual 0.0001 $dYnew $dYold] { set start_increment_end 0 break } set dYold $dYnew } # # make one more check # for {set i 1} {$i <= $grafdata($gID,N_MYtick,$g)} {incr i} { # tics value and text must be the same # for position-increment-end mode if ![catch {expr abs($grafdata($gID,Ytick${i}_text,$g))}] { # $grafdata($gID,Ytick${i}_text,$g) is a number if ![IsEqual 0.001 $grafdata($gID,Ytick$i,$g) \ $grafdata($gID,Ytick${i}_text,$g)] { set start_increment_end 0 break } } } set graf_setticY($gID,$g,mode) "position-label" if $start_increment_end { set graf_setticY($gID,$g,mode) "start-increment-end" set graf_setticY($gID,$g,start) $grafdata($gID,Ytick1,$g) set graf_setticY($gID,$g,increment) \ [expr $grafdata($gID,Ytick2,$g) - \ $grafdata($gID,Ytick1,$g)] set last $grafdata($gID,N_MYtick,$g) set graf_setticY($gID,$g,end) $grafdata($gID,Ytick$last,$g) } for {set i 1} {$i <= $grafdata($gID,N_MYtick,$g)} {incr i} { set graf_setticY($gID,$g,tick,$i) \ $grafdata($gID,Ytick$i,$g) set graf_setticY($gID,$g,tick_text,$i) \ $grafdata($gID,Ytick${i}_text,$g) } } else { set graf_setticY($gID,$g,mode) "position-label" if [info exists grafdata($gID,Ytick1)] { set graf_setticY($gID,$g,tick,1) $grafdata($gID,Ytick1,$g) set graf_setticY($gID,$g,tick_text,1) \ $grafdata($gID,Ytick1_text,$g) } } } return $graf_setticY($gID,$g,mode) } } proc SetCurveOptions {gID can i g} { global grafsize done grafselection graf # i ... curve number if ![info exists grafsize($gID,curve_width_$i,$g)] { set grafsize($gID,curve_width_$i,$g) $grafsize(curve_width) } if ![info exists grafsize($gID,curve_color_$i,$g)] { set grafsize($gID,curve_color_$i,$g) $grafsize(curve_color) } set tcan [winfo toplevel $can] set t [xcToplevel [WidgetName] \ "Settings of Curve #$i" "Settings of Curve #$i" $tcan 0 0 1] set f1 [frame $t.up -relief raised -bd 2] set f2 [frame $t.dn -relief raised -bd 2] FillEntries $f1 \ [list "Width of Curve #$i:" "Color of Curve #$i in #RGB:"] \ [list grafsize($gID,curve_width_$i,$g) \ grafsize($gID,curve_color_$i,$g)] \ 24 10 top left set ok [button $f2.ok -text OK \ -command [list SetCurveOptionsOK $gID $g $i]] bind $ok [list SetCurveOptionsOK $gID $g $i] bind $f1.f1.2.entry2 [list SetCurveOptionsOK $gID $g $i] pack $f1 $f2 -side top -fill both -ipady 5 pack $ok -expand 1 -padx 5 tkwait variable done destroy $t $can itemconfigure c$i \ -width $grafsize($gID,curve_width_$i,$g) \ -fill $grafsize($gID,curve_color_$i,$g) # update grafselection(curve_*) set grafselection($gID,selcurve_fill) $grafsize($gID,curve_color_$i,$g) set grafselection($gID,selcurve_width) $grafsize($gID,curve_width_$i,$g) } proc SetCurveOptionsOK {gID g i} { global grafsize done set err 1 if ![number grafsize($gID,curve_width_$i,$g) posreal] { set err 0 } set lenok 0 set length [string length $grafsize($gID,curve_color_$i,$g)] foreach len {4 7 10 13} { if { $len == $length} { set lenok 1 } } set cok 1 for {set ii 1} {$ii < $length} {incr ii} { set c [string index $grafsize($gID,curve_color_$i,$g) $ii] if ![string match \[0-9a-f\] $c] { set cok 0 } } if { $lenok == 0 || $cok == 0 } { tk_dialog [WidgetName] "ERROR" "ERROR: You have badly specified the color of curve $i. Should be specified as #RGB" error 0 OK set err 0 } if $err { set done 1 } } proc xcSetTextAtrib { title master labeltext entryvar canvas \ font_name font_item font_size font_family \ font_weight font_slant font_underline font_overstrike bboxvar} { global system stA # can be more xcSetTextAtrib widows open at ones if ![info exists stA(id)] { set stA(id) 1 } else { incr stA(id) } set id $stA(id) set tplw [xcToplevel [WidgetName] $title {Set Text} $master 100 100] set f1 [frame $tplw.f1 -relief raised -bd 2] set f2 [frame $tplw.f2 -relief raised -bd 2] pack $f1 $f2 -side top -expand 1 -fill both set f1lf [frame $f1.f1 -relief flat -class StressText] set xl [label $f1lf.l -text $labeltext -relief groove -bd 2] pack $f1lf -side top -fill both pack $xl -side top -expand 1 -ipadx 10 -ipady 2 -padx 10 -pady 5 set f1l1 [frame $f1.1] set f1l2 [frame $f1.2] set f1l3 [frame $f1.3] pack $f1l1 $f1l2 $f1l3 -side top -fill both # # query font # set stA($id,fontname) [$canvas itemcget $font_item -font] xcDebug "stA($id,fontname):: $stA($id,fontname) $font_item" set stA($id,fontsize) [GetFontAtribute $stA($id,fontname) $canvas -size] # # frame #1 # if { $entryvar != {} } { set e [Entries $f1l1 Text: $entryvar 30] focus $e } # # frame #2 # xcMenuEntry $f1l2 {Font Size:} 10 \ stA($id,fontsize) \ {6 8 10 12 14 16 18 20 24} \ -entrystate disabled \ -labelwidth 11 \ -labelanchor w set ck [checkbutton $f1l2.b1 \ -text "Bounding Box" \ -variable $bboxvar] pack $ck -side top -padx 5 -pady 5 -fill x # # frame #3 # set stA($id,fontfamily) [GetFontAtribute $stA($id,fontname) $canvas -family] xcMenuEntry $f1l3 {Font Family:} 10 \ stA($id,fontfamily) \ {times helvetica courier} \ -entrystate disabled \ -labelwidth 11 \ -labelanchor w if { [GetFontAtribute $stA($id,fontname) $canvas -weight] == "normal" } { set stA($id,fontbold) 0 } else { set stA($id,fontbold) 1 } if { [GetFontAtribute $stA($id,fontname) $canvas -slant] == "roman" } { set stA($id,fontitalic) 0 } else { set stA($id,fontitalic) 1 } set stA($id,fontunderline) \ [GetFontAtribute $stA($id,fontname) $canvas -underline] set stA($id,fontoverstrike) \ [GetFontAtribute $stA($id,fontname) $canvas -overstrike] xcCheckButtonRow $f1l3 4 [list \ @$system(BMPDIR)/bold.xbm \ @$system(BMPDIR)/italic.xbm \ @$system(BMPDIR)/underline.xbm \ @$system(BMPDIR)/overstrike.xbm] \ [list \ stA($id,fontbold) \ stA($id,fontitalic) \ stA($id,fontunderline) \ stA($id,fontoverstrike)] \ [list \ xcCheckButtonDummy xcCheckButtonDummy \ xcCheckButtonDummy xcCheckButtonDummy] set ok [DefaultButton $f2.ok -text OK \ -command [list xcSetTextAtribBut $id ok]] set can [button $f2.can -text Cancel \ -command [list xcSetTextAtribBut $id can $tplw]] pack $ok $can -side left -expand 1 -padx 10 -pady 5 tkwait variable stA($id,done) upvar #0 \ $font_name fontname \ $font_size fontsize \ $font_family fontfamily \ $font_weight fontweight \ $font_slant fontslant \ $font_underline fontunderline \ $font_overstrike fontoverstrike if $stA($id,fontbold) { set weight bold } else { set weight normal } if $stA($id,fontitalic) { set slant italic } else { set slant roman } set fontname $stA($id,fontname) set fontsize $stA($id,fontsize) set fontfamily $stA($id,fontfamily) set fontweight $weight set fontslant $slant set fontunderline $stA($id,fontunderline) set fontoverstrike $stA($id,fontoverstrike) # # now unset the stA($id,*) array elements # foreach elem [array names stA $id,*] { unset stA($elem) } destroy $tplw } proc xcSetTextAtribBut {id what {top {}}} { global stA if { $what == "can" } { foreach elem [array names stA $id,*] { unset stA($elem) } destroy $top } if { $what == "ok" } { set stA($id,done) 1 } } proc SetBarAtrib {gID j i} { global grafdata grafsize bar_atrib_color mody_col # j ... alpha/beta (for open-shell) # i ... which bar set t [xcToplevel [WidgetName] "Set Bar #$i Attributes" "Set Bar" \ .graph$gID 100 100 1] catch { grab $t } set bar_atrib_color($gID,apply_to_all) 0 set ckb [checkbutton $t.cb \ -text "Apply to all bars" \ -relief raised -bd 2 \ -variable bar_atrib_color($gID,apply_to_all)] set f1 [frame $t.f1 -relief flat -class StressText] set xl [label $f1.l -text "Set Bar Attributes" \ -relief groove \ -bd 2] pack $ckb -side top -fill both -expand 1 pack $f1 -side top -fill both -expand 1 pack $xl -side top -expand 1 -padx 10 -pady 5 -ipadx 10 -ipady 2 set f2 [frame $t.f2] set f3 [frame $t.f3] set f4 [frame $t.f4] set f5 [frame $t.f5] set f6 [frame $t.f6] pack $f2 $f3 $f4 $f5 $f6 -side top -fill both -expand 1 # FRAME #2 set command [list \ [list {Fill Color: } [list SetBarAtribColor $gID $j $i FILL]] \ [list {Outline Color:} [list SetBarAtribColor $gID $j $i OUTLINE]] \ [list {Shadow Color: } [list SetBarAtribColor $gID $j $i SHADOW]]] MultiWidget $f2 -b_height 2 -testbutton 1 \ -create_tplw 0 \ -command $command # FRAME #3 xcMenuEntry $f3 {Outline Width:} 11 \ grafsize($gID,bar${i}_width,1) \ {0 1 2 3 4 5 6 7 8 9} \ -entrystate disabled \ -labelwidth 13 \ -labelanchor w if { $grafsize($gID,bar${i}_stipple,$j) == {} } { set grafsize($gID,bar${i}_stipple,$j) none } # FRAME #4 xcMenuEntry $f4 {Stipple Pattern:} 11 \ grafsize($gID,bar${i}_stipple,$j) \ { none gray75 gray50 gray25 gray12 } \ -entrystate disabled \ -labelwidth 13 \ -labelanchor w # FRAME #5 set bar_atrib_color($gID,xoffset) \ [expr round((1.0 - $grafdata($gID,Xoffset,1)) * 100)] xcMenuEntry $f5 {Bar Width (%):} 11 \ bar_atrib_color($gID,xoffset) \ { 30 40 50 60 65 70 75 80 85 90 95 100 } \ -entrystate disabled \ -labelwidth 13 \ -labelanchor w set ck [checkbutton $f5.cb1 \ -text "Display Shadow" \ -variable grafdata($gID,barshadow,1)] pack $ck -side top # FRAME #6 set ok [DefaultButton $f6.ok -text OK -done_var bar_atrib_color(done)] pack $ok -side top -expand 1 -padx 10 -pady 15 tkwait variable bar_atrib_color(done) set ilist $i if $bar_atrib_color($gID,apply_to_all) { for {set n 1} {$n <= $grafdata($gID,N_point,1)} {incr n} { append ilist "$n " } } foreach ii $ilist { if [info exists bar_atrib_color($gID,fill_cID)] { set cID $bar_atrib_color($gID,fill_cID) set grafsize($gID,bar${ii}_fill,$j) "#$mody_col($cID,hxred)$mody_col($cID,hxgreen)$mody_col($cID,hxblue)" } if [info exists bar_atrib_color($gID,outline_cID)] { set cID $bar_atrib_color($gID,outline_cID) set grafsize($gID,bar${ii}_outline,$j) "#$mody_col($cID,hxred)$mody_col($cID,hxgreen)$mody_col($cID,hxblue)" } if [info exists bar_atrib_color($gID,shadow_cID)] { set cID $bar_atrib_color($gID,shadow_cID) set grafsize($gID,bar${ii}_shadow,$j) "#$mody_col($cID,hxred)$mody_col($cID,hxgreen)$mody_col($cID,hxblue)" } set grafsize($gID,bar${ii}_width,$j) $grafsize($gID,bar${i}_width,$j) if { $grafsize($gID,bar${ii}_width,$j) == 0 } { set grafsize($gID,bar${ii}_outline,$j) "#$mody_col($cID,hxred)$mody_col($cID,hxgreen)$mody_col($cID,hxblue)" } set grafsize($gID,bar${ii}_stipple,$j) \ $grafsize($gID,bar${i}_stipple,$j) } if [info exists bar_atrib_color($gID,fill_cID)] { unset bar_atrib_color($gID,fill_cID) } if [info exists bar_atrib_color($gID,outline_cID)] { unset bar_atrib_color($gID,outline_cID) } if [info exists bar_atrib_color($gID,shadow_cID)] { unset bar_atrib_color($gID,shadow_cID) } set grafdata($gID,Xoffset,1) \ [expr -1.0 * double($bar_atrib_color($gID,xoffset)) / 100.0 + 1.0] destroy $t } proc SetBarAtribColor {gID j i what f {test {}}} { global grafsize multi_widget_list bar_atrib_color switch -exact -- $what { FILL { if ![info exists bar_atrib_color($gID,fill_cID)] { set bar_atrib_color($gID,fill_cID) [xcModifyColorID] } set w [xcModifyColor $f "Fill Color:" \ $grafsize($gID,bar${i}_fill,$j) \ groove left left 100 100 70 5 15 \ $bar_atrib_color($gID,fill_cID)] } OUTLINE { if ![info exists bar_atrib_color($gID,outline_cID)] { set bar_atrib_color($gID,outline_cID) [xcModifyColorID] } set w [xcModifyColor $f "Outline Color:" \ $grafsize($gID,bar${i}_outline,$j) \ groove left left 100 100 70 5 15\ $bar_atrib_color($gID,outline_cID)] } SHADOW { if ![info exists bar_atrib_color($gID,shadow_cID)] { set bar_atrib_color($gID,shadow_cID) [xcModifyColorID] } set w [xcModifyColor $f "Shadow Color:" \ $grafsize($gID,bar${i}_shadow,$j) \ groove left left 100 100 70 5 15 \ $bar_atrib_color($gID,shadow_cID)] } } set multi_widget_list(post) $w if { $test == "test" } { tkwait visibility $w set wid [winfo width $w] set hig [winfo height $w] set hlt [$w cget -highlightthickness] $f config -width [expr $wid + 2 * $hlt + 6] $f config -height [expr $hig + 2 * $hlt + 6] pack propagate $f false } } xcrysden-1.6.2/Tcl/newInput.tcl0000644000175000017500000006446213514607164015135 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/newInput.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# #------------------------------------------------------------- # VARIABLES used for INPUT #------------------------------------------------------------- # job_title ... title of job # A ....... "A" lattice vector # B ....... "B" lattice vector # C ....... "C" lattice vector # ALFA ....... "BC" angle(degrees) - between "B" & "C" # BETA ....... "AC" angle(degrees) - between "A" & "C" # GAMMA .... "AB" angle(degrees) - between "A" & "B" # NATR ....... number of non-equivalent atoms # Nat ....... atomic number (an array) # X,Y,Z ....... atomic coordinates (an array) # IFSO ....... settings for the origin for the crystal reference frame # IX,IY,IZ .... coordinates of non-standard shift of origin #---------------------------------------------------------------------- # --------------------------------------------------- # procedure's block # --------------------------------------------------- proc new_file {} { # $button is used for dialogs global XCState xcMisc system if { ! $system(c95_exist) } { return } set xcMisc(titlefile) Unsaved wm title . "XCrySDen: $xcMisc(titlefile)" # define a state variable XCState as c95 set XCState(state) c95_newinput xcUpdateState; # XCState(state) has changed, so -> xcUpdateState xcAdvGeomState reset ChooseSpecies } proc ChooseSpecies {} { global XCState # this procedure creates window: Choose xcToplevel .cho "XInput: Choose" "SeqTable" . 100 50 AlwaysOnTopON . .cho # TOP & BOTTOM & CLOSE frames; all widget within .cho will be displayed # in one of those frame .cho.top -relief raised -bd 1 frame .cho.bot -relief raised -bd 1 frame .cho.close -relief raised -bd 1 pack .cho.top -side top -fill both -padx 1 -pady 1 pack .cho.bot .cho.close -side top -fill both # in the TOP there will be label, entry & message label .cho.top.label -text "Title:" entry .cho.top.entry -relief sunken -textvariable job_title label .cho.top.lab -text "Title is just a comment;\nnot used otherwise"\ -anchor center pack .cho.top.lab -side bottom -fill both -padx 5 -pady 5 -expand 1 pack .cho.top.label -side left -fill x -padx 3 -pady 10 -expand 1 pack .cho.top.entry -side left -fill x -padx 3 -pady 10 -expand 1 #set focut to .CHO.TOP.ENTRY focus .cho.top.entry # in the BOT there will go label & five buttons (Molecule,Polymer, # Slab,Crystal,External) label .cho.bot.label -text "Choose one of the following:" button .cho.bot.button1 -text "Molecule" -command [list Molecule .cho] button .cho.bot.button2 -text "Polymer" -command [list Polymer .cho] button .cho.bot.button3 -text "Slab" -command [list Slab .cho] button .cho.bot.button4 -text "Crystal" -command [list Crystal .cho] button .cho.close.but -text "Cancel" \ -command [list NewInputCancelProc .cho] pack .cho.bot.label -side top -fill both -expand true -padx 10 -pady 15 pack .cho.bot.button1 .cho.bot.button2 .cho.bot.button3 \ .cho.bot.button4 \ -side top -fill x -expand 1 -padx 25 -pady 10 -ipady 2 pack .cho.close.but -expand 1 -padx 25 -pady 5 return } proc Molecule {tplw} { # do we need all those variables to be global????? global type_group type_group1 species group_list groupsel inp # $tplw is the name of toplevel widget from whom we arrive in this toplevel AlwaysOnTopOFF destroy $tplw set w .mol set type_group point set type_group1 Point set species molecule # now "load" a group_list variable; it's done by point_group PROC point_group set inp(IFHR) 0 #now we are able to call geom_sym_input proc geom_sym_input $w $tplw } proc Polymer {tplw} { global type_group type_group1 species group_list groupsel inp # $tplw is the name of toplevel widget from whom we arrive in this toplevel AlwaysOnTopOFF destroy $tplw set w .poly set type_group line set type_group1 Line set species polymer # now "load" a group_list variable; it's done by line_group PROC line_group set inp(IFHR) 0 #now we are able to call geom_sym_input proc geom_sym_input $w $tplw } proc Slab {tplw} { # do we need all those variables to be global????? global type_group type_group1 species group_list groupsel inp # $tplw is the name of toplevel widget from whom we arrive in this toplevel AlwaysOnTopOFF destroy $tplw set w .slab set type_group plane set type_group1 Plane set species slab # now "load" a plane_list variable; it's done by plane_group PROC plane_group set inp(IFHR) 0 #now we are able to call geom_sym_input proc crys_slab_sym $w $tplw } proc Crystal {tplw} { # do we need all those variables to be global????? global type_group type_group1 species group_list groupsel inp # $tplw is the name of toplevel widget from whom we arrive in this toplevel AlwaysOnTopOFF destroy $tplw set w .crys set type_group space set type_group1 Space set species crystal # now "load" a group_list variable; it's done by space_group PROC space_group set inp(IFLAG) 1 set inp(IFHR) 0 #now we are able to call geom_sym_input proc crys_slab_sym $w tplw } proc crys_slab_sym {w tplw} { global done okay type_group type_group1 species group_list \ groupsel n_groupsel \ crdatom set done {} set okay {} xcToplevel $w "Crystal95's Input: $species" "Input: $species" . 100 50 AlwaysOnTopON . $w frame $w.frame1 -relief raised -bd 1 frame $w.frame2 -relief raised -bd 1 frame $w.frame3 pack $w.frame1 $w.frame2 $w.frame3 -side top -fill both -expand 1 #---------------------------- # FRAME #1 label $w.frame1.lab -text "Symmetry input for $species" pack $w.frame1.lab -expand 1 -fill both -padx 10 -pady 10 #--------------------------- # widgets in FRAME #2 frame $w.frame2.frm label $w.frame2.frm.label -text "$type_group1 group of $species:" entry $w.frame2.frm.entry -relief sunken -textvariable groupsel button $w.frame2.button -text "Select a $type_group group" \ -command [list CheckGroup button] pack $w.frame2.frm -side top pack $w.frame2.button -side bottom -padx 10 -pady 7 pack $w.frame2.frm.label $w.frame2.frm.entry -side left \ -padx 1 -pady 7 -expand 1 # now we made focus & binding for entry focus $w.frame2.frm.entry bind $w.frame2.frm.entry { CheckGroup entry } #--------------------------------------------------------- # widgets in FRAME #3 # -------------------------------------------------------- button $w.frame3.but_prev -text "<< Previous" \ -command "CancelProc $w; ChooseSpecies" button $w.frame3.but_next -text "Next >>" -command gotoGeom pack $w.frame3.but_prev $w.frame3.but_next \ -side left -anchor c -padx 10 -pady 10 -expand 1 tkwait variable okay set tplw $w AlwaysOnTopOFF destroy $w set w ${w}1 geom_sym_input $w $tplw } proc CheckGroup {{act {}}} { # this proc is called by CRYS_SLAB_SYM global done okay type_group type_group1 species group_list \ groupsel n_groupsel crdatom inp var set done "" #puts stdout "CG.1> $act" if { $act == "button" } { #puts stdout "CG.2> $act" group_sel .sel_group $type_group $group_list } else { group_sel_ok $group_list } if { $done == 1 } { # $rhombohexa var. is for rhombo. groups # rhombo. groups are all that are R-centered # this need to be modified T.K_MOD if { [lindex $groupsel 0] == "R" } { # query for rhombo./hexa. axes xcToplevel .ifhr "IFHR" "IFHR" . 120 70 1 catch { grab .ifhr } frame .ifhr.frame -relief raised -bd 2 label .ifhr.frame.lab -text "Select the type of cell for\n\ Rhombohedral Group" pack .ifhr.frame .ifhr.frame.lab -side top -fill both \ -padx 1 -pady 1 # from IFHR we must assign VAR: switch -exact -- $inp(IFHR) { 0 { set var "hexagonal cell" } 1 { set var "rhombohedral cell" } } RadioButtons .ifhr.frame var top "hexagonal cell" \ "rhombohedral cell" button .ifhr.but -text OK -command {set ok 1} pack .ifhr.but -pady 7 -expand 1 # when OK button is pressed toplevel can be destroyed tkwait variable ok destroy .ifhr # now we must assing a value for $IFHR, which is suitable for # crystal program switch -glob -- $var { hexa* { set inp(IFHR) 0 } rhomb* { set inp(IFHR) 1 } } } } } proc gotoGeom {{w {}}} { global okay done type_group type_group1 species group_list groupsel \ crdatom XCState group_sel_ok $group_list if { $done == 1 } { if { [xcIsActive c95] && [xcIsActive openinput] } { if [winfo exists $w] { AlwaysOnTopOFF destroy $w } set okay 1 } else { set okay 1 } } } ############################################################################## proc geom_sym_input {w tplw} { # do we need all those variables to be global????? global err okay done type_group type_group1 species class \ group_list groupsel n_groupsel inp crdatom XCState # $done is used with bind ENTRY {set done 1} # this means when you press return in an entry textvariable is set !!!!! set done 0 if ![info exists class] {set class {}} if ![info exists class] {set crdatom 0} xcToplevel $w "Crystal95's Input: $species" "Input" . 100 50 AlwaysOnTopON . $w frame $w.frame1 -relief raised -bd 1 frame $w.frame2 -relief raised -bd 1 frame $w.frame3 -relief raised -bd 1 frame $w.frame4 -relief raised -bd 1 frame $w.frame5 -bd 1 frame $w.frame6 -bd 1 # now we will pack this frames # $species IS IMPORTANT, BECAUSE THE DISPLAY IS DIFFERENT # FOR EACH SPECIES if { $species == "molecule" } { # there is no FRAME #3 for MOLECULES pack $w.frame1 $w.frame2 $w.frame4 $w.frame5 \ -side top -fill both -expand 1 pack $w.frame6 -padx 40 \ -side top -fill both -expand 1 } elseif { $species == "polymer" } { #pack everything pack $w.frame1 $w.frame2 $w.frame3 $w.frame4 $w.frame5 $w.frame6 \ -side top -fill both -expand 1 pack $w.frame6 -padx 40 \ -side top -fill both -expand 1 } else { pack $w.frame1 $w.frame3 $w.frame4 $w.frame5 $w.frame6 \ -side top -fill both -expand 1 pack $w.frame6 -padx 40 \ -side top -fill both -expand 1 } #--------------------------- # widget in FRAME #1 label $w.frame1.lab -text "Geometry input for $species" pack $w.frame1.lab -expand 1 -fill both -padx 10 -pady 10 #--------------------------- # widgets in FRAME #2; ONLY FOR MOLECULE & POLYMER if {$species == "molecule" || $species == "polymer"} { frame $w.frame2.frm label $w.frame2.frm.label -text "$type_group1 group of $species:" entry $w.frame2.frm.entry -relief sunken -textvariable groupsel button $w.frame2.button -text "Select a $type_group group" \ -command [list group_sel .sel_group $type_group $group_list] pack $w.frame2.frm -side top pack $w.frame2.button -side bottom -padx 10 -pady 7 pack $w.frame2.frm.label $w.frame2.frm.entry -side left \ -padx 1 -pady 7 -expand 1 # now we made focus & binding for entry focus $w.frame2.frm.entry bind $w.frame2.frm.entry { group_sel_ok $group_list } } # IF----IF----IF----IF----IF----IF----IF----IF # FRAME #3 olny for $species != "molecule" #------------------------------------------------------------- # widgets in FRAME #3 # if { $species != "molecule" } { # only for CRYSTALS; about ORIGIN SHIFT (var. inp(IFSO)) # default value for IFSO is set to 0 set inp(IFSO) 0 if { $species == "crystal" } { button $w.frame3.button -text "Set the ORIGIN of the \n\ crystal reference frame" -command set_origin pack $w.frame3.button -side top -ipadx 3 -ipady 3 -pady 7 \ -expand 1 } label $w.frame3.lab -text \ "Minimal set of lattice parameters" pack $w.frame3.lab -side top -expand 1 -fill both -padx 10 -pady 5 # we must read MINIMAL SET OF LATTICE PARAMETERS if ![info exists inp(A)] {set inp(A) {}} if ![info exists inp(B)] {set inp(B) {}} if ![info exists inp(C)] {set inp(C) {}} if ![info exists inp(ALFA)] {set inp(ALFA) {}} if ![info exists inp(BETA)] {set inp(BETA) {}} if ![info exists inp(GAMMA)] {set inp(GAMMA) {}} read_param $w.frame3 frame $w.frame3.frm } #--------------------------------------------------------- # widgets in FRAME #4 # do we need this !!! if ![info exists inp(NATR)] {set inp(NATR) {}} label $w.frame4.lab -anchor center -text \ "Specify atomic numbers and coordinates\nof non-equivalent atoms" button $w.frame4.but -text "Atomic numbers/coordinates" \ -command atom_num_coord pack $w.frame4.lab -side top -padx 10 -pady 7 -fill both -expand true pack $w.frame4.but -side top -padx 10 -pady 7 \ -ipadx 3 -ipady 3 -expand true #--------------------------------------------------------- # widgets in frame #5 button $w.frame5.but_view -text "View $species" \ -command [list contrl_var $w View] # is this OK!!!!!!!!!!!! button $w.frame5.but_prev -text "<< Previous" \ -command [list geom_sym_prev $w $tplw] #button $w.frame5.but_next -text "Next >>" \ #-command [list contrl_var $w Next] puts stdout "GEOM_SYM_INPUT: \$w: $w" pack $w.frame5.but_view $w.frame5.but_prev \ -side left -anchor c -padx 10 -pady 10 -expand 1 #---------------------------------------------------------- # widgets in frame #6 # button Done is displayed only if XCState == c95_openinput if { [xcIsActive c95] && [xcIsActive openinput] } { button $w.frame6.but1 -text "Done" -command [list contrl_var $w Modify] pack $w.frame6.but1 -side left -anchor c \ -padx 10 -pady 10 -expand 1 } else { button $w.frame6.but2 -text "Cancel" \ -command [list NewInputCancelProc $w] pack $w.frame6.but2 -side left -anchor c \ -padx 10 -pady 10 -expand 1 } #__________________________________________________________ # END OF GEOMETRY SPECIFIERS BLOCK #---------------------------------------------------------- tkwait variable okay CancelProc $w # maybe XCState(toplevel) is not empty #if [info exists XCState(toplevel)] { # if { [winfo exists $XCState(toplevel)] || $XCState(toplevel) != "" } { # AlwaysOnTopON . # } #} } proc geom_sym_prev {w tplw} { global done type_group type_group1 species group_list groupsel if [winfo exists $w] { CancelProc $w } if { $tplw == ".cho" } { ChooseSpecies } elseif { $tplw == ".crys" || $tplw == ".slab" || \ ( $tplw == ".opflmod" && ( $species == "slab" ||\ $species == "crystl" ) ) } { crys_slab_sym $tplw $tplw; # THIS IS OK; } } proc set_origin {} { # leave global VAR there, It's needed !!!!!!!!!!!! global var button inp xcToplevel .ifso "Origin Settings" "Origin Settings" . 120 70 1 catch { grab .ifso } frame .ifso.frame -relief raised -bd 2 pack .ifso.frame -side top -fill both -padx 1 -pady 1 # from IFSO we must assign VAR: switch -exact -- $inp(IFSO) { 0 { set var "Origin derived from the symbol (IFSO=0)" } 1 { set var "Standard shift of origin (IFSO=1)" } 2 { set var "Non-standard shift of origin (IFSO=2)" } } RadioButtons .ifso.frame var top \ "Origin derived from the symbol (IFSO=0)" \ "Standard shift of origin (IFSO=1)" \ "Non-standard shift of origin (IFSO=2)" button .ifso.but -text OK -command {set ok 1} pack .ifso.but -pady 7 -expand 1 # when OK button is pressed toplevel can be destroyed tkwait variable ok destroy .ifso # now we must assing a value for $IFSO, which is suitable for # crystal program switch -glob -- $var { Origin* { set inp(IFSO) 0 } Standard* { set inp(IFSO) 1 } Non-standard* { set inp(IFSO) 2 } } # if inp(IFSO)>=1 --> specify coordinates of non-standard shift if { $inp(IFSO) == 2 } { orig_coord } } proc orig_coord {} { global inp ok err geo xcToplevel .orig_coord "Origin Shift" "Origin Shift" . 120 70 1 catch { grab .orig_coord } # this procedure create toplevel, where coord. of origin-shift # will be specified frame .orig_coord.frame -relief raised -bd 2 label .orig_coord.frame.lbl -text "Specify coordinates of Origin-Shift" pack .orig_coord.frame -fill both -expand 1 pack .orig_coord.frame.lbl -side top -padx 7 -pady 10 Entries .orig_coord.frame "Fract-X*24: Fract-Y*24: Fract-Z*24:"\ "inp(IX) inp(IY) inp(IZ)" 6 # DO WE NEED $FOC HERE !!!!! -TEST-TEST focus .orig_coord.frame.frame.entry1 button .orig_coord.but -text OK -command [list check_var {{inp(IX) int}\ {inp(IY) int} {inp(IZ) int}} {.orig_coord.frame.frame.entry1 \ .orig_coord.frame.frame.entry2 .orig_coord.frame.frame.entry3}] pack .orig_coord.but -side top -expand 1 -pady 7 # will this work tkwait variable ok destroy .orig_coord } proc n_atoms {} { global inp crdatom # this PROC display a TOPLEVEL where a number of non-eq. atoms is specefied! # NATR -number of non. eq. atoms xcToplevel .natom "N. of Atoms" "N. of Atoms" . 120 70 1 catch { grab .natom } frame .natom.top -relief raised -bd 1 frame .natom.bot pack .natom.top .natom.bot -side top -expand 1 -fill both label .natom.top.lab -text "Number of non-equivalent atoms:" entry .natom.top.entry -relief sunken -width 4 -textvariable inp(NATR) pack .natom.top.lab -side top -padx 10 -pady 7 -expand 1 pack .natom.top.entry -side bottom -pady 7 -expand 1 bind .natom [list check_var \ {{inp(NATR) posint}} .natom.top.entry] focus .natom.top.entry button .natom.bot.but -text OK -command [list check_var \ {{inp(NATR) posint}} .natom.top.entry] pack .natom.bot.but -side top -pady 7 -expand 1 bind .natom.bot.but [list check_var \ {{inp(NATR) posint}} .natom.top.entry] tkwait variable ok destroy .natom } proc atom_num_coord {} { global inp species ok crdatom # NATR - num. of non-equivalent atoms # n_atom is PROC, where $inp(NATR) is specefied n_atoms # just in any case set ok {} # if $inp(NATR) == {} -> first specify inp(NATR) # WARNING - what if inp(NATR) is not a number if { $inp(NATR) == "" } { dialog .atom1 WARNING "You must first specify a number of \ non-equivalent atoms" warning 0 OK } else { xcToplevel .atom "Atom Coordinates" "Atom Coordinates" . 120 70 1 catch { grab .atom } # bottom frame where OK button will be set Frm [frame .atom.frame] pack .atom.frame -side bottom -expand true -fill both # and one frame where canvas&scrollbar will be!! frame .atom.f -relief sunken -bd 2 pack .atom.f -side top -expand true -fill both canvas .atom.f.canv -yscrollcommand [list .atom.f.yscroll set] scrollbar .atom.f.yscroll -orient vertical -command \ [list .atom.f.canv yview] pack .atom.f.yscroll -side right -fill y pack .atom.f.canv -side left -fill both -expand true # create FRAME to hold every LABELS & ENTRIES set f [frame .atom.f.canv.f -bd 0] .atom.f.canv create window 0 0 -anchor nw -window $f for {set i 1} {$i <= $inp(NATR)} {incr i 1} { frame $f.fr$i -relief groove -bd 2 pack $f.fr$i -padx 5 -pady 5 label $f.fr${i}.label$i -text "Atom N.: $i" pack $f.fr${i}.label$i -anchor w -padx 7 -pady 7 frame $f.fr${i}.frm$i frame $f.fr${i}.frm1_$i frame $f.fr${i}.frm2_$i frame $f.fr${i}.frame$i pack $f.fr${i}.frm1_$i $f.fr${i}.frm2_$i \ -in $f.fr${i}.frm$i -side left -anchor w pack $f.fr${i}.frm$i $f.fr${i}.frame$i -side top -anchor w Entries $f.fr${i}.frm1_$i {{Atomic Number:}} inp(NAT,$i) 5 button $f.fr${i}.frm2_$i.b -text "Periodic Table" \ -command [list ptable .atom \ -command ptableSelectAtomicNumber -variable inp(NAT,$i)] pack $f.fr${i}.frm2_$i.b -side left -padx 5 # make a varlist & foclist for PROC CHECK_VAR lappend varlist [list inp(NAT,$i) nat] lappend foclist $f.fr${i}.frm1_$i.frame.entry1 switch -exact -- $species { molecule { Entries $f.fr${i}.frame$i \ "X: Y: Z:" " inp(X,$i) inp(Y,$i) inp(Z,$i)" 8 # make a varlist for PROC CHECK_VAR lappend varlist inp(X,$i) inp(Y,$i) inp(Z,$i) } polymer { Entries $f.fr${i}.frame$i \ "Fractional-X: Y: Z:" \ " inp(X,$i) inp(Y,$i) inp(Z,$i)" 8 # make a varlist for PROC CHECK_VAR lappend varlist [list inp(X,$i) fract] inp(Y,$i) inp(Z,$i) } slab { Entries $f.fr${i}.frame$i "Fractional-X: \ Fractional-Y: Z:" " inp(X,$i) inp(Y,$i) inp(Z,$i)" 8 # make a varlist for PROC CHECK_VAR lappend varlist [list inp(X,$i) fract] \ [list inp(Y,$i) fract] inp(Z,$i) } crystal { Entries $f.fr${i}.frame$i "Fractional-X: \ Fractional-Y: Fractional-Z:" \ " inp(X,$i) inp(Y,$i) inp(Z,$i)" 8 # make a varlist for PROC CHECK_VAR lappend varlist [list inp(X,$i) fract] \ [list inp(Y,$i) fract] [list inp(Z,$i) fract] } } # make foclist for PROC CHECK_VAR lappend foclist $f.fr${i}.frame$i.frame.entry1 \ $f.fr${i}.frame$i.frame.entry2 \ $f.fr${i}.frame$i.frame.entry3 } puts stdout "FOCLIST: $foclist\n\n" puts stdout "VARLIST: $varlist" set child [lindex [pack slaves $f] 0] # set the focus to first entry that upper FOR-LOOP create focus $f.fr1.frm1_1.frame.entry1 tkwait visibility $child set width [winfo width $f] set height [winfo height $f] if { $inp(NATR) < 5 } { .atom.f.canv config -width $width -height $height } else { .atom.f.canv config -width $width -height \ [expr $height / $inp(NATR) * 4] \ -scrollregion "0 0 $width $height" } button $Frm.butok -text OK -command \ [list check_var $varlist $foclist] button $Frm.butcan -text "Cancel" -command "destroy .atom" bind $Frm.butok [list check_var $varlist $foclist] pack $Frm.butok $Frm.butcan -side left \ -expand 1 -padx 10 -pady 10 tkwait variable ok #=========================================== # THIS IS FOR CHEACKING IN THE GEM_SYM_INPUT set crdatom 1 #=========================================== destroy .atom } } proc contrl_var {topl action} { global crdatom err okay groupsel group_list class species inp XCState # topl -name of toplevel # PROC wait for variable okay; then exit (this means everything is OK # check entries in FRAME #2 --> $groupsel ######## set err 0 group_sel_ok $group_list puts stdout "CLASS, species> $species $class" flush stdout if { $err } { focus $topl.frame2.frm.entry } if { $err == 0 } { # if there is no error in specifying $groupsel, we could proceed # check entries in FRAME #3 --> Min. lattice parameter list set n 1 if {$species != "molecule"} { foreach elem $class { foreach elem1 $elem { lappend varlist inp($elem1) } for {set i 1} {$i <= [llength $elem]} {incr i} { lappend foclist $topl.frame3.$n.frame.entry$i } incr n } # check_var return OK variable; this is not good this time, so: puts stdout "CONTRL_VAR:: $varlist $foclist" check_var $varlist $foclist } } if { $err == 0 } { ############### # CHECKING FRAME #4 if ![info exists crdatom] { tk_dialog [WidgetName] ERROR "ERROR: You forget to specify atomic \ coordinates" error 0 OK set err 1 return 0 } if { $crdatom != "1" } { dialog .crdatm ERROR "ERROR: Your specification of atoms \ coordinates is bad. Try again !!!" error 0 OK set err 1 } } #============================================ if { $err == 0 } { # THIS IS PROBABLY OBSOLETE; CHECK THIS # if there were no ERROR($err=0) --> set ok 1 set okay 1 puts stdout $action if { $action == "View" } { puts stdout "GOING TO CalStru" #append XCState(state) "_render"; CalStru takes care of that CalStru } } #============================================ #puts stdout "RESULT\n\ # =============" #puts stdout "GROUPSEL: $groupsel" #puts stdout "inp(IFSO): $inp(IFSO)" #puts stdout "inp(IX),inp(IY),inp(IZ): $inp(IX) $inp(IY) $inp(IZ)" #puts stdout "A: $inp(A) B: $inp(B) C: $inp(C)\n\ #inp(ALFA): $inp(ALFA) inp(BETA): $inp(BETA) inp(GAMMA): $inp(GAMMA)" #puts stdout "inp(NATR): $inp(NATR)" #for {set i 1} {$i <= $inp(NATR)} {incr i} { # puts stdout "$Nat($i)\n \ # $X($i) $Y($i) $Z($i)" #} } proc NewInputCancelProc {w} { global XCState CancelProc $w if { [info exists XCState] } { unset XCState } xcUpdateState } #proc InputBuilder {} { # global button # # set button {} # label .xfile_top -relief raised -text \ # "XCrySDen\n\nA X-based Interactive Input Builder for Crystal95" \ # -font "-adobe-helvetica-bold-o-normal--25-180-100-100-p-138-iso8859-1" # button .xfile_new -text "New File" -command new_file # button .xfile_open -text "Open File" -command OpenCyrstalInput # # button .xfile_exit -text "Exit" -command exit_pr # # if { $button == 0 } {exit} # # pack .xfile_top -side top -fill x -ipadx 3m -ipady 10m -anchor c # pack .xfile_new .xfile_open .xfile_exit \ # -side left -anchor c -padx 20m -pady 3m -expand 1 #} xcrysden-1.6.2/Tcl/scroll.tcl0000644000175000017500000000320511712736221014601 0ustar tonetone############################################################################ # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/scroll.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # # ------ # ############################################################################# proc mouseWheelScroll {w scrollCmd_B4 scrollCmd_B5 scrollCmd_Wheel} { global scrollWin tcl_platform #if { [info exist scrollWin($w)] } { # # binding already set for $w # return 1 #} # #set scrollWin($w) 1 set scrWin [getAllDescendantWid $w] foreach wid $scrWin { if { [winfo exists $wid] } { if { $tcl_platform(platform) == "unix" } { bind $wid $scrollCmd_B4 bind $wid $scrollCmd_B5 } else { # TODO: please tune the %D on windows bind $wid $scrollCmd_Wheel } } } }xcrysden-1.6.2/Tcl/read25.tcl0000644000175000017500000001463612352530373014400 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/read25.tcl # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# proc ReadFTN25 {what fileID gID {ns 1} {ng 1}} { global grafdata ftn25 system # ns --> N_segment # ng --> N_graf xcDebug "what: $what" # this is used for projected band structure if { $what == "BAND" } { set nproj $ns set ns 1 } xcDebug "ReadFTN25 $what $fileID $gID $ns $ng" set is0 $ns if { $what == "BAND" } { set is0 1 } for {set is $is0} {$is <= $ns} {incr is} { # CRYSTAL-95:: # read FORMAT: A4,A4,2X,6I3,1X,A36,\n) # start: 0 4 8 10 # CRYSTAL98/03:: # read FORMAT: A3,I1,A4,2I4,1P,(3E12.5) # start: 0 4 5 8 16 17 # 1P, 2E12.5 # 6I3,1X,A36 # -%-2DOSS 1 202 0.00000E+00 4.54430E+00-1.84013E-01 # 0.00000E+00-9.05903E+02 # 1 36 0 0 0 0 ********** ################# gets $fileID Line ################# set str [string range $Line 4 7] xcDebug "str:: $str" if { $what != $str } { tk_dialog .dialog WARNING \ "Instead of reading \"$what\" word, \n\ a \"$str\" word has been read!!!\n\ PLEASE report to Tone.Kokalj@ijs.si" error 0 OK return } if { $system(c95_version) == "95" } { for {set i 1} {$i <= 6} {incr i} { set f [expr 10 + ($i - 1)*3] set l [expr $f + 2] set ftn25(I$i) [string range $Line $f $l] xcDebug "ftn25(I$i): $ftn25(I$i)" } #read FORMAT: 2I4, 5F10.6,\n ################# gets $fileID Line ################# set ftn25(NROW) [string range $Line 0 3] set ftn25(NCOL) [string range $Line 4 7] xcDebug "(NROW,NCOL): $ftn25(NROW) $ftn25(NCOL)" for {set i 1} {$i <= 5} {incr i} { set f [expr 8 + ($i - 1)*10] set l [expr $f + 9] set ftn25(X$i) [string range $Line $f $l] xcDebug "ftn25(X$i): $ftn25(X$i)" } } else { if { $system(c95_version) == "98" || $system(c95_version) == "03" } { # read FORMAT: A3,I1,A4,2I4,(3E12.5) # 2E12.5 # 6I3,1X,A36 # -%-2DOSS 1 202 0.00000E+00 4.54430E+00-1.84013E-01 # 0.00000E+00-9.05903E+02 # 1 36 0 0 0 0 ********** set ftn25(NROW) [string range $Line 8 11] set ftn25(NCOL) [string range $Line 12 15] xcDebug "(NROW,NCOL): $ftn25(NROW) $ftn25(NCOL)" set ftn25(X3) [string range $Line 16 27] set ftn25(X4) [string range $Line 28 39] set ftn25(X5) [string range $Line 40 51] ################# gets $fileID Line ################# set ftn25(X1) [string range $Line 0 11] set ftn25(X2) [string range $Line 12 23] } elseif { $system(c95_version) == "06" || $system(c95_version) == "09" || $system(c95_version) == "14" } { # CRYSTAL06 read format: a3,i1,a4,2i5,1p,(3e12.5) **** # 1p,3e12.5 # -%-0DOSS 1 502 0.00000E+00 4.07550E-03-2.97766E-01 # 1 36 0 0 0 0 ********** set ftn25(NROW) [string range $Line 8 12] set ftn25(NCOL) [string range $Line 13 17] xcDebug "(NROW,NCOL): $ftn25(NROW) $ftn25(NCOL)" set ftn25(X3) [string range $Line 18 29] set ftn25(X4) [string range $Line 30 41] set ftn25(X5) [string range $Line 42 54] ################# gets $fileID Line ################# set ftn25(X1) [string range $Line 0 11] set ftn25(X2) [string range $Line 12 23] } xcDebug "ftn25 X#1-5: $ftn25(X1) $ftn25(X2) $ftn25(X3) $ftn25(X4) $ftn25(X5)" ################# gets $fileID Line ################# for {set i 1} {$i <= 6} {incr i} { set f [expr ($i - 1) * 3] set l [expr $f + 2] set ftn25(I$i) [string range $Line $f $l] xcDebug "ftn25: I#$i= $ftn25(I$i)" } } set N [expr $ftn25(NCOL) * $ftn25(NROW)] if { $what == "DOSS" } { set N $ftn25(NCOL) } set c 0 if { $what != "BAND" } { for {set i 1} {$i <= $N} {incr i} { # read FORMAT: 6(1PE12.5) several times if { $c == (6 * ($c / 6)) } { set i6 0 ################# gets $fileID Line ################# } set f [expr $i6 * 12] set l [expr $f + 11] incr c incr i6 set grafdata($gID,$c,$is,$ng) [string range $Line $f $l] xcDebug "value: $c $grafdata($gID,$c,$is,$ng)" if { $c == 1 } { set ftn25(Ymin) $grafdata($gID,1,$is,$ng) set ftn25(Ymax) $grafdata($gID,1,$is,$ng) } else { if { $grafdata($gID,$c,$is,$ng) < $ftn25(Ymin) } { set ftn25(Ymin) $grafdata($gID,$c,$is,$ng) } elseif { $grafdata($gID,$c,$is,$ng) > $ftn25(Ymax) } { set ftn25(Ymax) $grafdata($gID,$c,$is,$ng) } } } } else { # t.k: change for UHF # read BANDS set count 0 for {set i 1} {$i <= $ftn25(NCOL)} {incr i} { set j0 [expr 1 + $ftn25(NROW) * ($nproj - 1)] set jN [expr $ftn25(NROW) * $nproj] set ip [expr $grafdata($gID,N_point,$ng) + $i] xcDebug "(j0,jN,ip): $j0 , $jN , $ip" for {set j $j0} {$j <= $jN } {incr j} { if { $count == (6 * ($count / 6)) } { set i6 0 ################# gets $fileID Line ################# } set f [expr $i6 * 12] set l [expr $f + 11] set grafdata($gID,$ip,$j,$ng) [string range $Line $f $l] incr i6 incr count xcDebug "band: $j; Kpoint: $ip; value: $grafdata($gID,$ip,$j,$ng)" } } } } } proc FTN25_MustBeNumber {value returnvalue text} { global system prop if [catch {expr abs($value)}] { set button [tk_dialog [WidgetName] ERROR $text error 0 OK Details] if $button { DispC95Output $system(SCRDIR) $prop(file)25 \ "CRYSTAL Unit 25" 1 } return $returnvalue } return $value } xcrysden-1.6.2/Tcl/auxil.tcl0000644000175000017500000011720713525460757014451 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/auxil.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc xcPlace {w1 w2 x y} { # this proc place window w2 near w1 # x,y where to place according to w1 # query geom of w1 set geom [wm geometry $w1] set x [expr [lindex [split $geom x+-] 2] + $x] set y [expr [lindex [split $geom x+-] 3] + $y] # now place $w2 to +x +y wm geometry $w2 +$x+$y return } proc Nat2Aname {nat} { global Alist # maybe NAT is greater than 100, so set nat [expr $nat % 100] set selA [lindex $Alist $nat] return $selA } proc Aname2Nat {atom} { global Alist set n 0 set Atom [string toupper $atom] foreach elem $Alist { set Elem [string toupper $elem] if { $Atom == $Elem } { return $n } incr n } # if we come so far we have an illegal atom name return "unknown atom name \"$atom\"" } proc AnameExt2Nat {atom} { # proc names stands for: AtomNameExtended to Nat # # extended atom name is AtomicSymbolCharacters global Alist set n 1 set Nat -1 foreach elem $Alist { if { [string match -nocase $elem* $atom] } { # first compare if it is two-character match # example: S vs. Se if { [string equal -nocase -length 2 $elem $atom] } { return $n } set Nat $n } incr n } if { $Nat > 0 } { return $Nat } else { # if we come so far we have an illegal atom name return 0 } } proc AtomNames {} { global Alist set Alist { X \ H He Li Be B C N O \ F Ne Na Mg Al Si P S \ Cl Ar K Ca Sc Ti V Cr \ Mn Fe Co Ni Cu Zn Ga Ge \ As Se Br Kr Rb Sr Y Zr \ Nb Mo Tc Ru Rh Pd Ag Cd \ In Sn Sb Te I Xe Cs Ba \ La Ce Pr Nd Pm Sm Eu Gd \ Tb Dy Ho Er Tm Yb Lu Hf \ Ta W Re Os Ir Pt Au Hg \ Tl Pb Bi Po At Rn Fr Ra \ Ac Th Pa U Np Pu Am Cm \ Bk Cf Es Fm} return $Alist } proc exit_pr {{arg {}}} { global system set button 1 if { $arg == {} } { set button [tk_messageBox -message "Really quit?" \ -type yesno -icon question] } else { # exit_pr -silent set button yes } if { $button == "yes" } { SetWatchCursor if { ![file exists $system(SCRDIR)] } { exit 0 } catch "cd $system(PWD)" clean_exit } } proc clean_exit {{returnCode 0}} { global system if { [file isdirectory $system(SCRDIR)] } { xcDebug -stderr "************************************************************************" xcDebug -stderr "Deleting directory $system(SCRDIR) ; Please Wait !!!" xcDebug -stderr "************************************************************************" # we catch deleting, since on some strange NFS systems directory # deletion will fail if { ! [catch {file delete -force -- $system(SCRDIR)}] } { xcDebug -stderr "Directory deleted !" } else { xcDebug -stderr "Failed to delete the directory !" } } global exit_viewer_win if { [info exists exit_viewer_win] } { foreach win $exit_viewer_win { if { [winfo exists $win] } { bind $win {} } } } exit_tcl $returnCode } ############################################################################# # this is the old routine for manipulating the font; the new one named # ModifyFont uses internal Tk "font" command proc ModifyFontSize {w size {arg {}}} { global oldsize # take care of $arg:: if { $arg != {} } { set foundry * set family * set weight * set slant * set i 0 foreach option $arg { if { [regexp {^-} $option] } { set tag $option } else { switch -- $tag { "-foundry" {set foundry $option} "-family" {set family $option} "-weight" {set weight $option} "-slant" {set slant $option} default { tk_dialog [WidgetName .a] Error \ "ERROR: Bad option \"$tag\" submited to \n\ ModifyFontSize procedure" error 0 OK return fixed } } } incr i } if { $i%2 } { tk_dialog [WidgetName .a] Error \ "ERROR: You called ModifyFontSize with an \n\ odd number of args !" \ error 0 OK return fixed } set font "-$foundry-$family-$weight-$slant-*-*-$size-*" } else { set font [lindex [$w config -font] 3] } set fontlist [split $font -] #xcDebug "Fontlist:: $fontlist" if { [llength $fontlist] > 7 || $arg != {} } { # X font name # define first four fields; set foundry [lindex [split $font -] 1] set family [lindex [split $font -] 2] set weight [lindex [split $font -] 3] set slant [lindex [split $font -] 4] set font [lindex $font 3] #puts stdout "TTT:: $font" #puts stdout "LLL:: -$foundry-$family-$weight-$slant-*-*-$size-*" #first four fields + pixel fields are impotant for us set done 1 if [catch {$w config -font \ -$foundry-$family-$weight-$slant-*-*-$size-*}] { set done 0 set upsize $size set downsize $size } else { return "-$foundry-$family-$weight-$slant-*-*-$size-*" } for {} {$done != 1} {} { # first try up, than try down set upsize [expr $upsize + 1] set downsize [expr $downsize - 1] #puts "$upsize $downsize" # maybe we have gone to far if { $downsize == 0 || $upsize > [expr $size + 20]} { # use default font if [catch {$w config -font $font}] { $w config -font TkFixedFont return fixed } else { return $font } } if {[catch {$w config -font \ -$foundry-$family-$weight-$slant-*-*-$upsize-*}] == 0} { return "-$foundry-$family-$weight-$slant-*-*-$upsize-*" } elseif {[catch {$w config -font \ -$foundry-$family-$weight-$slant-*-*-$downsize-*}] == 0} { return "-$foundry-$family-$weight-$slant-*-*-$downsize-*" } } } elseif { [llength $fontlist] == 2 } { # maybe alias name is something like: {Helvetica -12 bold} set oldsize [lindex [lindex $fontlist 1] 0] #puts stdout "oldsize:: $oldsize" if [number oldsize posint] { #replace oldsize with size set newfont \ [concat [lindex $fontlist 0] -$size [lindex $fontlist 2]] if [catch {$w config -font $newfont}] { set done 0 set upsize $size set downsize $size } else { return $newfont } for {} {$done != 1} {} { # first try up, than try down set upsize [expr $upsize + 1] set downsize [expr $downsize - 1] #puts "$upsize $downsize" # maybe we have gone to far if { $downsize == 0 || $upsize > [expr $size + 20]} { # use default font if [catch {$w config -font $font}] { $w config -font TkFixedFont return fixed } else { return $font } } set upfont [concat [lindex $fontlist 0] -$upsize \ [lindex $fontlist 2]] set downfont [concat [lindex $fontlist 0] -$downsize \ [lindex $fontlist 2]] if {[catch {$w config -font $upfont}] == 0 } { return $upfont } elseif {[catch {$w config -font $downfont}] == 0 } { return $downfont } } } } else { # give up; use new Tk font Mechanism set font [ModifyFont [$w cget -font] $w -size $size -default 1] } } # # this is the new routine and uses Tk font mechanism # proc ModifyFont {font window {args {}}} { global modifyFont # allowed arguments:: # -default ... create default font (0/1) (IGNORED) # -family ... name # -size ... size # -weight ... weight # -slant ... slant # -underline ... boolean # -overstrike ... boolean # font actual font ?-displayof window? ?option? set default 0 set family [font actual $font -displayof $window -family] set size [font actual $font -displayof $window -size] set weight [font actual $font -displayof $window -weight] set slant [font actual $font -displayof $window -slant] set underline [font actual $font -displayof $window -underline] set overstrike [font actual $font -displayof $window -overstrike] # take care of $arg:: if { $args != {} } { set i 0 foreach option $args { if { [regexp {^-} $option] } { set tag $option } else { switch -- $tag { "-default" {set default $option} "-family" {set family $option} "-size" {set size $option} "-weight" {set weight $option} "-slant" {set slant $option} "-underline" {set underline $option} "-overstrike" {set overstrike $option} default { tk_dialog [WidgetName] Error \ "ERROR: Bad option \"$tag\" submited to \n\ ModifyFont procedure" error 0 OK return fixed } } } incr i } if { $i%2 } { tk_dialog [WidgetName] Error \ "ERROR: You called ModifyFont with an \n\ odd number of args !" \ error 0 OK return fixed } } set new_font [font create] font configure $new_font \ -family $family \ -size $size \ -weight $weight \ -slant $slant \ -underline $underline \ -overstrike $overstrike return $new_font } proc SetFont {widtype args} { set w [$widtype [WidgetName]] set font [$w cget -font] xcDebug -debug "SetFont: $font $w $args" set Font [eval {ModifyFont $font $w} $args] destroy $w return $Font } # # this routine uses Tk font mechanism # proc GetFontAtribute {font window arg} { # take care of $arg:: if { [llength $arg] != 1 } { tk_dialog [WidgetName] Error \ "ERROR: You called GetFontAtribute with wrong \ number of args !" \ error 0 OK return fixed } set tag [lindex $arg 0] set option [lindex $arg 1] switch -- $tag { "-family" {return [font actual $font -displayof $window -family]} "-size" {return [font actual $font -displayof $window -size]} "-weight" {return [font actual $font -displayof $window -weight]} "-slant" {return [font actual $font -displayof $window -slant]} "-underline" { return [font actual $font -displayof $window -underline]} "-overstrike" { return [font actual $font -displayof $window -overstrike]} default { tk_dialog [WidgetName .a] Error \ "ERROR: Bad option \"$tag\" submited to \n\ GetFontAtribute procedure" error 0 OK return 0 } } } # # # # xcTkFontName2XLFD -- # # # # Tries to map TkFontName to XLFD X11 font name, if it does not # # succeed, then returns an empty string. # # # # proc xcTkFontName2XLFD {font} { # global tcl_platform # # if { $tcl_platform(platform) == "windows" } { # set fontAttr [font actual $font] # set font [font create] # eval {font configure $font} $fontAttr # return $font # } # # #puts stderr "*** xcTkFontName2XLFD : font = $font" # #puts stderr "*** xcTkFontName2XLFD : font actual font = [font actual $font]" # # # *** below is for X11 only:: # # # -------------------------------------------------- # # construct the font in the following form: # # -------------------------------------------------- # # -foundry-family-weight-slant-setwidth-addstyle-pixel-point-resx-resy-spacing-width-charset-encoding # # ------------------------------------------------------------------------ # # # -------------------------------------------------- # # Tk allowed fields # # -------------------------------------------------- # # -family name # # -size size # # -weight weight # # -slant slant # # -underline boolean # # -overstrike boolean # # foreach opt {family size weight slant} { # upvar 1 $opt var # set var [font actual $font -$opt] # set $opt $var # # # weight: # # normal = normal | regular | medium | book | light # # bold = bold | extrabold | demi | demibold # # # # slant: # # italic = i | o # # # if { $opt == "weight" } { # # if { $var == "normal" } { # # set weightList { medium normal regular book light } # # } else { # # set weightList { bold extrabold demi demibold } # # } # # } # # if { $opt == "slant" } { # # if { $var == "italic" } { # # set slantList { i o } # # } else { # # set slantList { r } # # } # # } # } # set XLFD_name "-*-$family-$weight-$slant-*-*-$size-*-*-*-*-*-*-*" # #puts stderr "*** xcTkFontName2XLFD : XLFD_name = $XLFD_name" # # return $XLFD_name # # # a hack for Mac OS X, which doesn't like negative sizes # # #global tcl_plaform # #if { $tcl_platform(os) == "Darwin" } { # # if { [string is integer $size] && $size < 0 } { # # set size [expr $size * (-1)] # # } # #} # # # #foreach weight $weightList { # # foreach slant $slantList { # # # example:: "-*-bookman-* -* -*-*-64 -*-*-*-*-*-*-*" # # set XLFD_name "-*-$family-$weight-$slant-*-*-$size-*-*-*-*-*-*-*" # # if { [xc_queryfont .mesa $XLFD_name] > 0 } { # # return $XLFD_name # # } # # } # #} # # # couldn't map tk-font-name --> XLFD name, return tk-font-name # #return $font # } proc AlwaysOnTopON {lower upperlist} { xcDebug -debug "AlwaysOnTopON" #there maybe more than one widget to raise foreach upper $upperlist { xcRaiseRegister $upper $lower } bind $lower [list xcRaise $lower] bind $lower [list xcRaise $lower] bind $lower [list xcRaise $lower] } proc xcRaiseRegister {upper lower} { global xcRaise # # parse xcRaise($lower,toplevels) # if ![info exists xcRaise($lower,toplevels)] { set xcRaise($lower,toplevels) {} } set new_list {} foreach win $xcRaise($lower,toplevels) { if { [winfo exists $win] && $win != $upper } { append new_list "$win " } } set xcRaise($lower,toplevels) [concat $new_list $upper] } proc xcRaise lower { global xcRaise # xcRaise($lower,toplevels) tells if there are some more toplevels # to raise !!! foreach widget $xcRaise($lower,toplevels) { if { [winfo exists $widget] } { raise $widget $lower } } xcDebug -debug "$lower,xcRaise($lower,toplevels) $xcRaise($lower,toplevels)" } proc AlwaysOnTopOFF {{lower {.}}} { puts stdout "AlwaysOnTopOFF" bind $lower {} bind $lower {} bind $lower {} } proc CancelProc {w {var {}}} { upvar $var varn if { [winfo exists $w] } { AlwaysOnTopOFF catch { grab release $w } destroy $w } set varn 0 #uplevel { return 0 } return 0 } # a simple wrapper to be used with widget "-command" proc DestroyWid w { destroy $w } proc winGeom { w } { # procedure determines the geometry of $w and return it return [wm geometry $w] } ############################################################################## # this proc read dimension & group (family) number out of GENGEOM file proc GetDimGroupXSF {dim group xsfFile} { upvar $dim dm upvar $group gr set fileID [open $xsfFile r] GetDimGroup dm gr $fileID close $fileID } proc GetDimGroup {dim group fileID} { upvar $dim dm upvar $group gr # : Thu Jul 13 15:13:57 CEST 2017 set dm 0 set gr 1 # set n 0 set output [split [read $fileID] \n] foreach line $output { switch -regexp -- $line { {^ *DIM-GROUP} { set nn [expr $n + 1] set dimgroup [lindex $output $nn] set dm [lindex $dimgroup 0] set gr [lindex $dimgroup 1] xcDebug "GET-DIM-GROUP:: [lindex $dimgroup 0] [lindex $dimgroup 1]" return } {^ *POLYMER} { set dm 1 set gr 1 return } {^ *SLAB} { set dm 2 set gr 1 return } {^ *CRYSTAL} { set dm 3 set gr 1 return } } incr n } } # this proc is synonym for CellMode proc GenGeomDisplay {{update 0}} { xcDebug "In GenGeomDisplay" CellMode $update } ############################################################################## # conversion between angstrom & bohr proc Bohr2Angs var { global Const return [expr $var * $Const(bohr)] } proc Angs2Bohr var { global Const return [expr $var / $Const(bohr)] } ########################################################### #this proc generate a widget name that do not already exist proc WidgetName {{w {}}} { set i 0 for {} {1} {} { if [winfo exist $w.a$i] { incr i } else { return $w.a$i } } } ############################################################################## proc GetWidgetConfig {widget_com option} { for {set i 1} {1} {incr i} { if ![winfo exists .gwc$i] { set w .gwc$i break } } $widget_com $w set res [$w cget $option] if { $option == "-background" || \ $option == "-bg" || \ $option == "-foreground" || \ $option == "-fg" || \ $option == "-activebackground" || \ $option == "-activeforeground" || \ $option == "-highlightbackground" || \ $option == "-hightlightcolor" || \ $option == "-disabledforeground" || \ $option == "-insertbackground" || \ $option == "-selectbackground" || \ $option == "-selectcolor" || \ $option == "-selectforeground" || \ $option == "-troughcolor" } { if { [string range $res 0 0] != "#" } { set norm [lindex [winfo rgb . white] 0] set rgb [winfo rgb . $res] set res [format "#%02x%02x%02x" \ [expr 256 * [lindex $rgb 0] / $norm] \ [expr 256 * [lindex $rgb 1] / $norm] \ [expr 256 * [lindex $rgb 2] / $norm]] } } destroy $w return $res } ############################################################################## # return the filehead out of filename (file.poss --> file) proc FileHead file { return [file rootname $file] } ############################################################################## # return the possix out of filename (file.poss --> poss) proc FilePossix file { set filename [split $file .] set nfield [llength $filename] set possix [lrange $filename [expr $nfield - 1] [expr $nfield - 1]] return $possix } ##################################### # used by, for example, DefaultButton proc DummyProc {{args {}}} { return } ############################################################### # if numbers specified in $args differ .leq. $limit -> return 1 # else return 0 proc IsEqual {limit args} { set oldnum [lindex $args 1] foreach num $args { if { [expr abs($oldnum - $num)] >= $limit } { return 0 } set oldnum $num } return 1 } ############################################################################### # is a lower_or_equal to b (within $limit) proc IsLEQ {limit a b} { if { $a <= [expr $b + $limit] } { return 1 } else { return 0 } } proc xcPause sec { set iter [lindex [time { for {set i 1} {$i <= 10} {incr i} {update} }] 0] set count [expr int(1e7 * $sec / $iter)] xcDebug "xcPause:: $count" for {set i 1} {$i < $count} {incr i} {update} } proc rgb_h2d rgb { set len [string length $rgb] # len can be 4,7,10,13 set i [expr $len / 3] set norm 1 for {set n 1} {$n <= $i} {incr n} { set norm [expr $norm * 16] } set r [string range $rgb 1 $i] set g [string range $rgb [expr 1 + $i] [expr 2 * $i]] set b [string range $rgb [expr 1 + 2 * $i] end] set r [h2df $r] set g [h2df $g] set b [h2df $b] return [list $r $g $b] } proc rgb_h2f rgb { set len [string length $rgb] # len can be 4,7,10,13 set i [expr $len / 3] set norm 1 for {set n 1} {$n <= $i} {incr n} { set norm [expr $norm * 16] } set r [string range $rgb 1 $i] set g [string range $rgb [expr 1 + $i] [expr 2 * $i]] set b [string range $rgb [expr 1 + 2 * $i] end] set r [h2df $r $norm] set g [h2df $g $norm] set b [h2df $b $norm] return [list $r $g $b] } proc rgb_f2h {rgba} { set r [d2h [expr round([lindex $rgba 0] * 255)]] set g [d2h [expr round([lindex $rgba 1] * 255)]] set b [d2h [expr round([lindex $rgba 2] * 255)]] return #${r}${g}${b} } proc rgb_f2d {rgba} { # f is clamped float in range [0--1] # returns decimal-list {255 255 255} set r [expr round([lindex $rgba 0] * 255)] set g [expr round([lindex $rgba 1] * 255)] set b [expr round([lindex $rgba 2] * 255)] return [list $r $g $b] } proc rgb_ac_f2h rgba { # same as rgb_f2h, just to get color a little briter set r [expr round([lindex $rgba 0] * 280)] set g [expr round([lindex $rgba 1] * 280)] set b [expr round([lindex $rgba 2] * 280)] if { $r > 255 } {set r 255} if { $g > 255 } {set g 255} if { $b > 255 } {set b 255} set r [d2h $r] set g [d2h $g] set b [d2h $b] return #${r}${g}${b} } proc rgb_d2f {rgba} { # f is clamped float in range [0--1] # BEWARE: assuming rgba (INPUT) as {255 255 255} set r [expr double([lindex $rgba 0]) / 255.0] set g [expr double([lindex $rgba 1]) / 255.0] set b [expr double([lindex $rgba 2]) / 255.0] return [list $r $g $b] } proc h2df {h {norm 1}} { # usage: h2df #rrggbb --> returns decimal-list, i.e., {255 255 255} # usage: h2df #rrggbb 255 --> returns float-list, i.e. {1.0 1.0 1.0} set d 0 set len [expr [string length $h] - 1] for {set i $len} {$i >= 0} {incr i -1} { set j [expr $len - $i] switch -regexp -- [set a [string range $h $j $j]] { [fF] {set a 15} [eE] {set a 14} [dD] {set a 13} [cC] {set a 12} [bB] {set a 11} [aA] {set a 10} } set d [expr $d + $a * [xcOnPower 16 $i]] } if { $norm > 1.0 } { return [expr double($d) / double($norm-1)] } else { return [expr int($d)] } } proc d2h {num} { set n1 [expr int( $num / 16 )] set n2 [expr int($num) - $n1 * 16] switch -exact -- $n1 { 15 {set n1 f} 14 {set n1 e} 13 {set n1 d} 12 {set n1 c} 11 {set n1 b} 10 {set n1 a} } switch -exact -- $n2 { 15 {set n2 f} 14 {set n2 e} 13 {set n2 d} 12 {set n2 c} 11 {set n2 b} 10 {set n2 a} } return [format "%s%s" $n1 $n2] } proc d2f {d} { # BEWARE: assuming d (INPUT) in range [0,255] # f is clamped float in range [0--1] return [expr double([lindex $d 0]) / 255.0] } proc xcOnPower {a n} { set res 1 for {set i 1} {$i <= $n} {incr i} { set res [expr $res * $a] } return $res } ##################### # set cursor to watch proc SetWatchCursor {} { global xcCursor foreach t [winfo children .] { catch { puts stderr "SetWatchCursor: $t" } if {"[info commands $t]" != {} } { $t config -cursor $xcCursor(watch) } } . config -cursor $xcCursor(watch) CursorUpdate } proc CursorUpdate {} { global xcCursor if { [info exists xcCursor(dont_update)] } { if { ! $xcCursor(dont_update) } { update } } else { update } } ####################### # set cursor to default proc ResetCursor {} { global xcCursor if { [info exists xcCursor(dont_update)] } { if { $xcCursor(dont_update) } { return } } foreach t [winfo children .] { if {"[info commands $t]" != {} } { $t config -cursor $xcCursor(default) } } CursorUpdate . config -cursor $xcCursor(default) #CursorUpdate } proc xcSwapBuffers {} { if { [winfo exists .mesa] } { update xc_swapbuffer .mesa } } ############################################################################## # # Purpose: find out what is the name of fortran units (without number) # Return: the name of fortran UNIT proc FtnName {} { global system # create an empty $system(SCRDIR)/fort_unit/ directory set pwd [pwd] cd $system(SCRDIR) if { [file exists fort_unit] } { file delete -force fort_unit } file mkdir fort_unit # cd to dirt_unit and run a simple fortran test cd fort_unit xcCatchExecReturn $system(FORDIR)/ftnunit update set file [glob -nocomplain *] regsub {\.99} $file {} ftn_name # delete the fort_unit directory cd .. file delete -force fort_unit cd $pwd return $ftn_name # # this was the old routine # #set cwd [pwd] #cd $system(SCRDIR) #exec $system(FORDIR)/ftnunit #update #set file [file tail [lindex [glob -nocomplain $system(SCRDIR)/*99] 0]] #regsub 99 $file {} file #exec rm -f ${file}99 #cd $cwd #return $file } # # capitalizes the word # proc capitalize word { set w1 [string toupper [string range $word 0 0]] set w2 [string range $word 1 end] return [format %s%s $w1 $w2] } # # return the filehead (filename without extension) # proc filehead {filename} { return [file rootname $filename] } proc WriteFile {filename content {flag w}} { global tcl_platform set fID [open $filename $flag] if { $tcl_platform(platform) == "windows" } { fconfigure $fID -translation {auto lf} } puts $fID $content flush $fID close $fID } proc ReadFile {filename {arg {}}} { # Usage: ReadFile filename OR ReadFile -nonewline filename if { $arg != {} } { set filename $arg } set fID [open $filename r] if { $arg != {} } { set output [read -nonewline $fID] } else { set output [read $fID] } close $fID return $output } proc GetAbsoluteFileName file { global system # try this: return [file normalize [file join $system(PWD) $file]] # if filename starts with / or ~ the absolute file name is assumed, # otherwise absolute filename should be: $system(PWD)/$file #if { $file == "." } { # set file $system(PWD) #} #set file [string trimright $file /] #set c0 [string index $file 0] #if { $c0 == "/" || $c0 == "~" } { # return $file #} else { # return [file normalize [file join $system(PWD) $file]] #} } #----------------------------------------- # convert angstrom unit to fractional unit proc GetFracCoor {coor} { #----------------------------------------- global system set x [lindex $coor 0] set y [lindex $coor 1] set z [lindex $coor 2] xcDebug -debug "exec $system(BINDIR)/fracCoor \ $system(SCRDIR)/xc_struc.$system(PID) $x $y $z" if { [catch {set coor [exec $system(BINDIR)/fracCoor $system(SCRDIR)/xc_struc.$system(PID) $x $y $z]} errmsg] } { ErrorDialog "error occured while executing \"fracCoor\" program.\n\nError Message:\n$errmsg" xcDebug -debug "GetFracCoor: $coor" return {0.0 0.0 0.0} } xcDebug -debug "GetFracCoor: $coor" return $coor } # ----------------------------------------------- # convert coordinates from Angstrom to $unit unit proc coorToUnit {unit x y z} { # unit must be one of: angs bohr prim conv alat global Const switch -- $unit { bohr { return [list [expr $x / $Const(bohr)] [expr $y / $Const(bohr)] [expr $z / $Const(bohr)]] } prim - conv { return [xc_fractcoor -ctype $unit -coor [list $x $y $z]] } alat { global mody set alat [xc_getvalue $mody(GET_ALAT)] return [list [expr $x / $alat] [expr $y / $alat] [expr $z / $alat]] } angs - default { return [list $x $y $z] } } } ############################################################################## # DEBUGING proc xcDebug {line {args {}}} { global xcMisc set channel stdout if { $line == "-stderr" } { set channel stderr set line [string trim $args \{\}] } elseif { $line == "-debug" && $xcMisc(debug) == 1 } { set channel stderr set line [string trim $args \{\}] } if ![catch {puts $channel $line}] { flush $channel } } proc xcEditFile {file {foreground 0}} { global env system if { [info exists env(EDITOR)] && [info exists system(term)] } { if { $foreground != 0 } { exec $system(term) -e $env(EDITOR) $file } else { exec $system(term) -e $env(EDITOR) $file & } } else { if { $foreground != 0 } { tkwait window [defaultEditor $file] } else { defaultEditor $file } } } proc xcDeleteAllChildren {wlist} { foreach w $wlist { if ![winfo exists $w] continue set children [winfo children $w] if { $children != "" } { foreach child $children { xcDeleteAllChildren $child catch [destroy $child] } } } } proc gunzipFile {file} { global system xcDebug -debug "gunzipFile: $file" #################### set gunzipName $file #################### set name [file tail $file] if { [file extension $name] == ".gz" } { set here [pwd] cd $system(SCRDIR) # maybe file is already located in $system(SCRDIR); if not copy it there if { [file dirname $file] != $system(SCRDIR) && $file != $name } { file copy -force $file $name } catch {exec -- gzip -df $name} set gunzipName [file rootname $name] if { ![file exists $gunzipName] } { tk_dialog [WidgetName] "ERROR" \ "ERROR: error when gunzip-ing file $file" warning 0 OK uplevel 1 { return } } set gunzipName $system(SCRDIR)/$gunzipName cd $here } return $gunzipName } # Purpose: clean a welcome window proc destroyWelcome {} { if { [winfo exists .title] } { # destroy WELCOME window destroy .title } } proc ErrorDialogInfo {text {errMsg {}}} { destroyWelcome #error $text set id [tk_dialog [WidgetName] ERROR "ERROR: $text." error 0 OK ErrorInfo] if { $id == 1 } { tkwait window [xcDisplayVarText $errMsg "Error Info"] } } # Purpose: do exec and report an error upon failure # Return: 0 on success, 1 on failure proc xcCatchExec {args} { destroyWelcome xcDebug -stderr "Executing: $args" if { [catch {eval exec $args} errMsg] } { ErrorDialogInfo "while executing\nexec $args" $errMsg return 1 } return 0 } # same as xcCatchExec but with redirection of stdout/stderr !!! proc xcCatchExecRedirectStdErr {args} { destroyWelcome xcDebug -stderr "Executing: $args" if { [catch {eval exec $args 2> /dev/null} errMsg] } { ErrorDialogInfo "while executing\nexec $args" $errMsg return 1 } return 0 } proc xcCatchExecReturn {args} { destroyWelcome xcDebug -stderr "Executing: $args" SetWatchCursor if { [catch {eval exec $args} errMsg] } { ErrorDialogInfo "while executing\nexec $args" $errMsg ResetCursor uplevel 1 { return 1 } } ResetCursor return 0 } # same as xcCatchExecReturn but with redirection of stdout/stderr !!! proc xcCatchExecReturnRedirectStdErr {args} { destroyWelcome xcDebug -stderr "Executing: $args" if { [catch {eval exec $args 2> /dev/null} errMsg] } { ErrorDialogInfo "while executing\nexec $args" $errMsg uplevel 1 { return 1 } } return 0 } proc ErrorDialog {text {errMsg {}}} { destroyWelcome set text "ERROR: $text." if { $errMsg != "" } { append text "\n\nError Mesage:\n$errMsg" } tk_messageBox -title ERROR -message $text -type ok -icon error } proc WarningDialog {text {warnMsg {}}} { if { [winfo exists .title] } { # destroy WELCOME window destroy .title } set text "WARNING: $text" if { $warnMsg != "" } { append text "\n\nWarning Mesage:\n$warnMsg" } tk_messageBox -title WARNING -message $text -type ok -icon warning } proc ErrorIn {where text} { tk_messageBox -title ERROR -message "ERROR: $text\n\nThis error was triggered from $where procedure" -type ok -icon error } # # xcSkipEmptyLines -- # # Purpose: skip empty lines from the variable content proc xcSkipEmptyLines {text} { foreach line [split $text \n] { if { [regexp -- {\w} $line] } { append out [format "%s\n" $line] } } return $out } # ------------------------------------------------------------------------ # evaluate the Tcl commands within the catch command and if error occurs # prints the errorMsg. If errorMsg is void, than prints the error message # returned by the Catch command. # ------------------------------------------------------------------------ proc xcCatchEval {cmd {errorMsg {}}} { if { [catch {eval $cmd} _errorMsg] } { if { $errorMsg == "" } { set errorMsg $_errorMsg } else { append errorMsg "\n$_errorMsg" } ErrorDialog "An ERROR occured while executing:\n$cmd\n\nERROR MESSAGE: $errorMsg" } } # ------------------------------------------------------------------------ #****f* Scripting/repeat # # NAME # repeat # # USAGE # repeat ntimes script # # PURPOSE # This proc is for repetitive execution of a script supllied by # "script" argument. For example: # # repeat 10 { puts "Hello !!!" } # # will print "Hello !!!" 10-times. The repeat is nothing else then # simplified "for" loop. Above example could be also achieved by: # # for {set i 0} {$i < 10} {incr i} { # puts "Hello !!!" # } # # # SIDE EFFECTS # Inside repeat scripts, the "repeat" variable have the value of the current # repeat-iteration. For example: # # repeat 4 { puts "This is the $repeat. iteration !!!" } # # will print: # # This is the 1. iteration # This is the 2. iteration # This is the 3. iteration # This is the 4. iteration # # ARGUMENTS # ntimes -- how many times to execute a script # script -- script to execute # # RETURN VALUE # Undefined. # # EXAMPLE # repeat 10 { # scripting::rotate x 5 # scripting::makeMovie::makeFrame # } # # SOURCE proc repeat {ntimes script} { global repeat_script repeat set repeat_script $script for {set repeat 1} {$repeat <= $ntimes} {incr repeat} { uplevel 1 {eval $repeat_script} } } #**** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****f* Scripting/wait # # NAME # wait # # USAGE # wait ms # # PURPOSE # This proc is similar to the Tcl command "after ms". However before # waiting for period of ms milliseconds, it updates all the events # (the after command does not make the update before waiting !!!) # # ARGUMENTS # ms -- waiting time in milliseconds # # RETURN VALUE # Undefined. # # EXAMPLE # wait 500 # # SOURCE proc wait {ms} { if { ! [string is integer $ms] } { ErrorIn wait "expected integer, but got $ms" return } update after $ms } #**** # ------------------------------------------------------------------------ proc positiveInteger {string} { if { ![string is integer $string] } { return 0 } elseif { $string <= 0 } { return 0 } else { return 1 } } proc nonnegativeInteger {string} { if { ![string is integer $string] } { return 0 } elseif { $string < 0 } { return 0 } else { return 1 } } # return 1 if string is the OpenGL RGBA color spec, 0 otherwise proc rgba {string} { if { [llength $string] != 4 } { return 0 } for {set i 0} {$i < 4} {incr i} { set v [lindex $string $i] if { ! [string is double $v] } { return 0 } elseif { $v > 1.0 || $v < 0.0 } { return 0 } } return 1 } proc allowedValue {value allowedValues} { # returns 1 if $value is among item in $allowedValues list foreach item $allowedValues { if { $value == $item } { return 1 } } return 0 } proc destroyWelcomeWindow {} { if { [winfo exists .title] } { destroy .title } } proc xcTempFile {name} { global system return $system(SCRDIR)/$name.$system(PID) } # # evalInScratch -- evaluate the script in SCRATCH, i.e. $system(SCRDIR), directory # proc evalInScratch {script} { global system set here [pwd] cd $system(SCRDIR) uplevel 1 [list eval $script] cd $here } # # evalInDir -- evaluate the script in $dir directory # proc evalInDir {dir script} { set here [pwd] cd $dir uplevel 1 eval $script cd $here } # evalInPWD -- This is a workaround routine: the code does many times # "cd $system(SCRDIR)", hence the real pwd is lost. There is a global # $system(PWD), but for example user might change in scripting-scripts # the cd then his [pwd] is lost as system(PWD) was not updated. This # routine execute the code either in [pwd], but if [pwd] == # $system(SCRDIR), then it executes the code in $system(PWD) # proc evalInPWD {script} { global system set here [pwd] if { $here != $system(SCRDIR) } { cd $here } else { cd $system(PWD) } uplevel 1 eval $script cd $here } #------------------------------------------------------------------------ #****f* auxil/putsFlush # NAME # putsFlush -- Tcl "puts" + "flush" # USAGE # putsFlush ?-nonewline? ?channelId? string # # DESCRIPTION # Identical to Tcl's puts, but invoke the flush immediately after. # See puts man-page of Tcl. #******** #------------------------------------------------------------------------ proc putsFlush {args} { update; update idletask # puts ?-nonewline? ?channelId? string set ind 0 set flags "" if { [lindex $args $ind] == "-nonewline" } { set flags "-nonewline" incr ind } if { [llength [lrange $args $ind end]] == 1 } { set channel stdout } else { set channel [lindex $args $ind] incr ind } eval puts $flags $channel [lrange $args $ind end] flush $channel } # # Tcl's file copy will copy the link instead of the file. If link has # a relative filename value, that's will be a mass: correct for this. # proc fileCopy {src dst} { catch {set file [file readlink $src]} if { [info exists file] } { global system return [file copy -force [file join $system(PWD) $file] $dst] } else { return [file copy -force $src $dst] } } proc lineRead {var file script} { # PURPOSE # Read entire file line-by-line and at each line execute a # script at one level up. # ARGUMENTS # * var -- name of variable where the content of line will be stored # * file -- name of file to read # * script -- script to execute when line is read # # CREDITS # Based on fileutils::foreachLine from tcllib (almost verbatim). # SOURCE upvar $var line set fid [open $file r] set code 0 set result {} while { ! [eof $fid] } { gets $fid line set code [catch {uplevel 1 $script} result] if {($code != 0) && ($code != 4)} { break } } close $fid if { ($code == 0) || ($code == 3) || ($code == 4) } { return $result } if { $code == 1 } { global errorCode errorInfo return \ -code $code \ -errorcode $errorCode \ -errorinfo $errorInfo \ $result } return -code $code $result } # Purpose: returns all the descendents of the given window (including # itself) proc getAllDescendantWid {w} { global getAllDescendantWid_list if { [info exists getAllDescendantWid_list] } { set getAllDescendantWid_list "" } return [getAllDescendantWid_ $w] } proc getAllDescendantWid_ {wlist} { global getAllDescendantWid_list foreach w $wlist { if { ![winfo exists $w] } continue lappend getAllDescendantWid_list $w set children [winfo children $w] if { $children != "" } { foreach child $children { getAllDescendantWid_ $child } } } return $getAllDescendantWid_list } # set a variable only if it does not exist proc ifset {varName value} { upvar 1 $varName var if { ! [info exists var] } { uplevel 1 $script } } xcrysden-1.6.2/Tcl/wnMultiSlab.tcl0000644000175000017500000001500411712736221015544 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnMultiSlab.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc wnMultiSlab {{change 0}} { global system multiSlab periodic if { $periodic(dim) != 2 && ![xcIsActive multislab] } { # multislab mode is not allowed xcDebug "WARNING: Multi-Slab mode not allowed" return } if { $change == 0 } { set answer [tk_messageBox -message "After performing Multi-Slab option a WIEN2k struct file will be created. This is usually the last AdvGeom option, since AdvGeom options will be disabled after multi-slab will be created\n\nDo You want to Continue?" \ -type yesno -icon question] if { $answer == "no" } { return } } # multislab options: # ------------------ # SYMMINFO # MULTISLAB_NO_INVERSION # MULTISLAB_INVERSION #set inv_center [exec $system(FORDIR)/multislab SYMMINFO \ # $system(SCRDIR)/xc_struc.$system(PID)] ######################################################## # WARNING: multislab SYMMINFO is wrong at the moment !!! # disablbe explotation of center of inversion set inv_center 0 ######################################################## set title "Create a Multi-Slab" if { $change == "change" } { set title "Change Multi-Slab Vacuum Thickness" } set t [xcToplevel [WidgetName] "Multi-Slab" $title . 100 0] set f1 [frame $t.1 -class RaisedFrame] set f2 [frame $t.2 -class RaisedFrame] pack $f1 $f2 -side top -expand 1 -fill both set multiSlab(inv) No if { $inv_center == 1 } { RadioBut $f1 "Structure has center of inversion !!!\nDo You want to exploit it ?" multiSlab(inv) top left 1 1 Yes No #label $f1.1 -text "Structure has center of inversion !!!\nDo You want to exploit it ?" -anchor w #radiobutton $f1.r1 -variable inv -text "Yes" -value yes #radiobutton $f1.r2 -variable inv -text "No" -value no } set entry [Entries $f1 {{Vacuum Thickness:}} multiSlab(vacuum) 10] if ![info exists multiSlab(mb_angs/bohr)] { set multiSlab(mb_angs/bohr) Angstroms } set frame [string trimleft [filehead $entry] \{\}] set mb [menubutton $frame.mb \ -textvariable multiSlab(mb_angs/bohr) \ -menu $frame.mb.menu \ -indicatoron 1 \ -relief raised \ -width 9 \ -anchor w] pack $mb -side left -padx 2 set menu [menu $mb.menu -relief raised -tearoff 0] $menu add command -label "Angstroms" \ -command [list set multiSlab(mb_angs/bohr) "Angstroms"] $menu add command -label "Bohrs" \ -command [list set multiSlab(mb_angs/bohr) "Bohrs"] set can [button $f2.can -text Cancel -command [list CancelProc $t]] set ok [DefaultButton $f2.ok -text OK \ -command [list wnMultiSlabOK $t $entry]] pack $can $ok -padx 10 -pady 10 -side left -expand 1 focus $entry } proc wnMultiSlabOK {t entry} { global multiSlab system geng periodic nzdir if ![check_var {{multiSlab(vacuum) real}} $entry] { return } if { $multiSlab(mb_angs/bohr) == "Bohrs" } { set multiSlab(vacuum) [Bohr2Angs $multiSlab(vacuum)] } if { $multiSlab(inv) == 0 } { set mode MULTISLAB_NO_INVERSION } else { set mode MULTISLAB_INVERSION } WriteFile $system(SCRDIR)/xc_tmp.$system(PID) $multiSlab(vacuum) w xcCatchExecReturn $system(FORDIR)/multislab $mode \ $system(SCRDIR)/xc_struc.$system(PID) < \ $system(SCRDIR)/xc_tmp.$system(PID) > \ $system(SCRDIR)/xc_wnstr.$system(PID) # #if [catch {exec $system(FORDIR)/multislab $mode \ # $system(SCRDIR)/xc_struc.$system(PID) < \ # $system(SCRDIR)/xc_tmp.$system(PID) > \ # $system(SCRDIR)/xc_wnstr.$system(PID)}] { # tk_dialog [WidgetName] ERROR \ # "ERROR while executing \"multislab\" program" \ # error 0 OK # return #} set pwd [pwd] cd $system(SCRDIR) set def [wn_nn_def xc_wnstr $system(PID)] WriteFile nn.def $def w # later $system(FORDIR) should be replaced by WIEN2k's nn-path set tmp $system(SCRDIR)/xc_tmp.$system(PID) WriteFile $tmp 2.0 w catch {exec $system(FORDIR)/nn nn.def < $tmp} error switch -glob -- $error { {*NN ENDS*} { # file was OK file copy -force xc_wnstr.$system(PID) xc_wnstr.struct } {*NN created*} { # new file was created ; } default { # an error has occured tk_dialog [WidgetName] ERROR \ "ERROR while executing \"nn\" program;\n\ ERORR Code: $error" \ error 0 OK return } } cd $pwd xcCatchExecReturn $system(FORDIR)/str2xcr $system(SCRDIR)/xc_wnstr #if [catch {exec $system(FORDIR)/str2xcr $system(SCRDIR)/xc_wnstr}] { # tk_dialog [WidgetName] ERROR \ # "ERROR while executing \"str2xcr\" program" \ # error 0 OK # return #} file rename -force $system(SCRDIR)/xc_wnstr.xcr $system(SCRDIR)/xc_str2xcr.$system(PID) CancelProc $t # # WIEN2k struct file is in BOHRs, thatwhy xc_str2xcr.$$ is in BOHRs # # so far set periodic(group) -> 1 set periodic(igroup) 1 set periodic(dim) 3 set nzdir 1 set radio(cellmode) prim set radio(hexamode) "parapipedal" set geng(M3_ARGUMENT) [GetGengM3Arg BOHR 95] xcAppendState wien xcAppendState multislab foreach state {c95 openinput newinput} { xcDeleteState $state } xcUpdateState CellMode UpdateStruct .mesa $system(SCRDIR)/xc_struc.$system(PID) return } proc wn_nn_def {filehead pid} { return [format "%d,'%s','%s','%s',%d\n%d,'%s','%s','%s',%d\n%d,'%s','%s','%s',%d" \ 66 $filehead.outputnn UNKNOWN FORMATTED 0 \ 20 $filehead.$pid OLD FORMATTED 0 \ 21 $filehead.struct UNKNOWN FORMATTED 0] } xcrysden-1.6.2/Tcl/wnRunWIEN.tcl0000644000175000017500000001467112352551716015115 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnRunWIEN.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc wnRun_IsERROR {} { global system if { [file size [exec $system(BINDIR)/wn_errorfile]] } { return 1 } return 0 } proc wnRunWIEN {command message outf} { global wn runWn system xcMisc wnRunWIEN_DeleteOutputFile $outf set runWn(command) $command set runWn(outf) $outf # # one user has reported that "pipe" execution doesn't work on SUN; # provide "direct" execution as a way out # if { [info exists xcMisc(WIEN_direct_exe)] } { if $xcMisc(WIEN_direct_exe) { cd $wn(dir) ################################################################### # calculation can take some time, it's needed to # give some feed back to the user. set oldgrab [grab current] set mw [DisplayUpdateWidget "Calculating" $message] update catch { grab $mw } #if { [catch "exec $command" err] == 1 } catch {exec $command} err if { [wnRun_IsERROR] } { destroy $mw wnRunWIENError return 0 } destroy $mw return 1 } } ################################################################### # calculation can take some time, it's needed to # give some feed back to the user. set oldgrab [grab current] set mw [DisplayUpdateWidget "Calculating" $message] update catch { grab $mw } # # change cursor to watch, to indicate that something is going on # SetWatchCursor set runWn(outf) $outf cd $wn(dir) set command [concat | $command] # ================================ # run WIENXX in background mode # ================================ set runWn(command) $command set runWn(fileID) [open $command r] fconfigure $runWn(fileID) -blocking 0 fileevent $runWn(fileID) readable wnRunWIENEvent tkwait variable runWn(event_done) ResetCursor xcSwapBuffers destroy $mw if { $oldgrab != {} } { catch { grab $oldgrab } } # # has an error occured during WIEN execution # if { $runWn(error) == 1 } { #if [catch {exec $command < $inp > $output_file} err] #C95Error $command $output_file $err cd $system(SCRDIR) unset runWn ResetCursor return 0 } else { # if we have parallel execution, this will concatenate output files wnRunWIEN_ReadOutputFile $outf } unset runWn ResetCursor return 1 } proc wnRunWIENEvent {} { global runWn if { ![eof $runWn(fileID)] } { append runWn(output) [gets $runWn(fileID)]\n xcDebug "$runWn(output)" return } else { xcDebug "In wnRunWIENEvent" set runWn(error) 0 if { [catch {close $runWn(fileID)}] } { set runWn(error) 1 } # # if we have an error display tk_dialog # if { $runWn(error) } { # is it really an error; check the error file !!! if { [wnRun_IsERROR] } { wnRunWIENError } else { set runWn(error) 0 } } set runWn(event_done) 1 } } proc wnRunWIENError {} { global runWn set button [tk_dialog [WidgetName] ERROR "ERROR occure while executing WIEN2k command: $runWn(command)" error 0 OK Details] if { $button == 1} { set oldgrab [grab current] set t [xcToplevel [WidgetName] "WIEN2k ERROR" "ERROR" \ . 100 100 1] catch { grab $t } set output [wnRunWIEN_ReadOutputFile $runWn(outf)] set text [DispText $t.f $output 80 20] set fric [lindex [$text yview] 1] $text yview moveto [expr 1.0 - $fric] $text config -state disabled proc wnRunWIENErrorClose {} { global runWn set runWn(error_done) 1 } set f2 [frame $t.f2 -height 10] pack $f2 -side bottom -before $t.f -fill x set close [button $f2.cl -text "Close" \ -command wnRunWIENErrorClose] pack $close -side left -expand 1 -ipadx 2 -ipady 2 -pady 10 tkwait variable runWn(error_done) catch { grab release $t } destroy $t if { $oldgrab != "" } { catch { grab $oldgrab } } } } proc wnRunWEIN_IsParallel {} { global wn if { [info exists wn(parallel)] } { if { $wn(parallel) == 1 } { return 1 } } return 0 } proc wnRunWIEN_DeleteOutputFile {outf} { global wn file delete $outf if { [wnRunWEIN_IsParallel] } { file delete [glob -nocomplain ${outf}_*] } } proc wnRunWIEN_ReadOutputFile {outf} { global wn if { [wnRunWEIN_IsParallel] } { # it was a parallel run, concatenate output files set nproc [wnRunWIEN_NProc] puts stderr "wien-parallel: nproc=$nproc" if { $nproc > 0 } { # check if all parallel output files exist and are larger > 0 set concate 1 for {set i 1} {$i<=$nproc} {incr i} { if { ! [file exists ${outf}_$i] } { set concate 0 break } else { if { [file size ${outf}_$i] == 0 } { set concate 0 break } if { [file exists $outf] } { if { [file mtime $outf] > [file mtime ${outf}_$i] } { # the $outf is newer than the ${outf}_$i, use $outf set concate 0 break } } } } if { $concate } { for {set i 1} {$i<=$nproc} {incr i} { puts stderr "wien-parallel: proc=$i, output-file=${outf}_$i" append output [ReadFile ${outf}_$i] } if { [info exists output] } { WriteFile $outf $output return $output } } } } puts stderr "wien: output-file=$outf" return [ReadFile $outf] } proc wnRunWIEN_NProc {} { global wn set pwdDir [pwd] cd $wn(dir) # try with this: catch {set result [exec grep -v init .processes | wc]} cd $pwdDir if { [info exists result] } { return [lindex $result 0] } else { return 0 } } xcrysden-1.6.2/Tcl/number.tcl0000644000175000017500000001527511712736221014605 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/number.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc check_var { varlist foclist } { global err ok # $varlist - list of elements, which are lists themselfs # element = {varname vartype} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^ # if $vartype is not specefied, than default is REAL # (look the: "proc number { varname {type real} }") # # $foclist - list of widgets to focus (if an error occur) set n 0 foreach elem $varlist { set err 0 set varname [lindex $elem 0] set vartype [lindex $elem 1] if { $vartype == "text" } { DummyProc } else { number $varname $vartype if { $err } { focus [lindex $foclist $n] break } incr n } } if { $err == 0 } { set ok 1 return 1 } else { return 0 } } proc number { varname {type real} } { global err upvar #0 $varname var # $varname - name of variable # $var - value of variable # $err - boolean pointer for error determining # $type - type of number (default is REAL) # type of number: int - integer # intlist - list of integers # posint - positive integer # fract - fractional number [-1,1] # real - real number; (all numbers are real # (excluded imaginary)) # posreal - positive real number; # nat - atomic number (0-300; lokk in C95 manual # 0 is ghost atom) # intrange a b - integer interval [a,b] set err 0 #puts stdout "VAR:: \"$var\"" if { ! [info exists var] } { return } # may be $var is not specified at all if { $type == "intlist" } { foreach int $var { if { [catch {expr abs($var)}] || \ $var != int($var) || [string match *.* $var] } { dialog .number2 ERROR "ERROR !\nYou have specified \ a non-integer number instead of integer number \ for \"$varname\" variable.\n\ TRY AGAIN !" error 0 OK set err 1 return [expr 1 - $err] } } } if { $var == "" } { dialog .number1 ERROR "ERROR !\nYou forget to specify \ \"$varname\" variable. PLEASE DO IT \!" error 0 OK set err 1 } elseif { [catch {expr abs($var)}] } { # this CATCH specify if $var is a number; # if we get 1 --> not number, else number # string is not a number dialog .number1 ERROR "ERROR !\nYou have specified a character \ instead of number for \"$varname\" variable.\ TRY AGAIN \!" error 0 OK set err 1 } else { # string is a number # varify if number is a right one switch -glob -- $type { int { if { $var != int($var) || [string match *.* $var] } { dialog .number2 ERROR "ERROR !\nYou have specified \ a non-integer number instead of integer number \ for \"$varname\" variable.\n\ TRY AGAIN !" error 0 OK set err 1 } } posint { if { $var != int($var) || $var < 0 || \ [string match *.* $var] } { dialog .number2 ERROR "ERROR !\nYou have specified \ a non-positive integer instead of positive \ integer for \"$varname\" variable.\n\ TRY AGAIN !" error 0 OK set err 1 } } fra* { if { $var < -1 || $var > 1 } { dialog .number2 ERROR "ERROR !\nYou should specify \ a number between \[-1,1\] for \"$varname\" \ variable. TRY AGAIN !" error 0 OK set err 1 } } nat* { if { $var != int($var) || $var < 0 || $var > 399 || \ [string match *.* $var] } { dialog .number2 ERROR "ERROR !\nYou specify wrong Atomic \ Number; Atomic Number should be between [0-99],\ [100-199] and [200-299], [300-399].\n\ TRY AGAIN !" error 0 OK set err 1 } } posreal { if { $var < 0.0 } { dialog .number2 ERROR \ "ERROR !\nYou specify a negative real number \ instead of positive one.\n TRY AGAIN !" error 0 OK set err 1 } } intrange* { set a [lindex $type 1] set b [lindex $type 2] if { $var != int($var) || $var < $a || $var > $b } { dialog .number2 ERROR \ "ERROR !\nYou specify a number that is either \ non-integer or out of range.\n TRY AGAIN !" \ error 0 OK set err 1 } } } } return [expr 1 - $err] } ############################################################################## # similar as previous, but it return 1 if "varname" is the right type # else it return 0 proc xcNumber { varname {type real} } { global err upvar #0 $varname var # $varname - name of variable # $var - value of variable # $err - boolean pointer for error determining # $type - type of number (default is REAL) # type of number: int - integer # posint - positive integer # fract - fractional number [-1,1] # real - real number; (all numbers are real # (excluded imaginary)) # nat - atomic number (0-98; 98 is a program limitaition; # 0 is ghost atom) set err 0 puts stdout "VAR:: \"$var\"" # may be $var is not specified at all if { $var == "" } { return 0 } elseif { [catch {expr abs($var)}] } { return 0 } else { # string is a number # varify if number is a right one switch -glob -- $type { int* { if { $var != int($var) || [string match *.* $var] } { return 0 } } pos* { if { $var != int($var) || $var < 0 || \ [string match *.* $var] } { return 0 } } fra* { if { $var < -1 || $var > 1 } { return 0 } } nat* { if { $var != int($var) || $var < 0 || $var > 399 || \ [string match *.* $var] } { return 0 } } } } return 1 } xcrysden-1.6.2/Tcl/xlfd.tcl0000644000175000017500000001064313522566121014245 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/__file__ # ------ # # Copyright (c) 1996--2019 by Anton Kokalj # ############################################################################# # # xcTkFontName2XLFD -- # # Tries to map TkFontName to XLFD X11 font name, if it does not # succeed, then returns an empty string. # proc xcTkFontName2XLFD {font} { global tcl_platform if { $tcl_platform(platform) == "windows" } { set fontAttr [font actual $font] set font [font create] eval {font configure $font} $fontAttr return $font } puts stderr "*** xcTkFontName2XLFD : font = $font" puts stderr "*** xcTkFontName2XLFD : font actual font = [font actual $font]" # *** below is for X11 only:: # -------------------------------------------------- # construct the font in the following form: # -------------------------------------------------- # -foundry-family-weight-slant-setwidth-addstyle-pixel-point-resx-resy-spacing-width-charset-encoding # ------------------------------------------------------------------------ # -------------------------------------------------- # Tk allowed fields # -------------------------------------------------- # -family name # -size size # -weight weight # -slant slant # -underline boolean # -overstrike boolean set family_ helvetica foreach opt {family size weight slant} { upvar 1 $opt var set var [font actual $font -$opt] set $opt $var # weight: # normal = normal | regular | medium | book | light # bold = bold | extrabold | demi | demibold # # slant: # italic = i | o if { $opt == "family" } { set family_ [X11Font_MatchFamily $var] } if { $opt == "weight" } { if { $var == "normal" } { set weightList { medium normal regular book light } } else { set weightList { bold extrabold demi demibold } } } if { $opt == "slant" } { if { $var == "italic" } { set slantList { i o } } else { set slantList { r } } } } set family $family_ # a hack for Mac OS X, which doesn't like negative sizes global tcl_plaform if { $tcl_platform(os) == "Darwin" } { if { [string is integer $size] && $size < 0 } { set size [expr $size * (-1)] } } foreach weight $weightList { foreach slant $slantList { # example:: "-*-bookman-* -* -*-*-64 -*-*-*-*-*-*-*" set XLFD_name "-*-$family-$weight-$slant-*-*-$size-*-*-*-*-*-*-*" set result [xc_queryfont .mesa $XLFD_name] #puts stderr "*** xc_queryfont .mesa $XLFD_name ; result = $result" if { $result > 0 } { return $XLFD_name } } } # couldn't map tk-font-name --> XLFD name, return a tk-font name return $font } # dirty fix to map from different Font families to most basic ones supported by X11 proc X11Font_MatchFamily {family} { if { [regexp -nocase Helvetica|Arial|Verdana|Carlito $family] } { set family_ helvetica } elseif { [regexp -nocase Serif|Times|Termes|Math $family] } { set family_ times } elseif { [regexp -nocase Courier|Mono $family] } { set family_ courier } elseif { [regexp -nocase Fixed $family] } { set family_ fixed } else { set family_ helvetica } return $family_ } #togl .mesa #pack .mesa # #foreach font { # TkDefaultFont # TkTextFont # TkFixedFont # TkMenuFont # TkHeadingFont # TkCaptionFont # TkSmallCaptionFont # TkIconFont # TkTooltipFont #} { # puts [xcTkFontName2XLFD TkDefaultFont] #} # xcrysden-1.6.2/Tcl/band.tcl0000644000175000017500000001304511712736221014212 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/band.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc BANDGraph { NLINE {N_proj 1}} { global properties prop ftn25 grafdata grafsize graf system # ftn25(X1) ... Emin # ftn25(X2) ... Emax # ftn25(X3) ... not used # ftn25(X4) ... dK # ftn25(X5) ... Efermi set fileID [open $prop(dir)/$prop(file)25 r] # # query GrapherID # set gID [NextGrapherID] xcDebug "GrapherID:: -- $gID --" set grafsize($gID,canW) 600 if { $prop(type_of_run) == "UHF" } { set N_graf 2 set grafsize($gID,canH) 600 set grafdata($gID,N_text) 2 set grafdata($gID,Xtick_text_draw,1) 0 set grafdata($gID,text1) "Alpha Band Structure" set grafdata($gID,text2) "Beta Band Structure" } else { set N_graf 1 set grafsize($gID,canH) 400 set grafdata($gID,N_text) 0 } set grafdata(Xtick_draw) 0 set grafdata(Xtick_text_draw) 1 set grafdata(Ytick_draw) 1 set grafdata(Ytick_text_draw) 1 set grafdata($gID,N_graf) $N_graf set grafsize($gID,margin_X1) $grafsize(margin_X1) set grafsize($gID,margin_X2) $grafsize(margin_X2) set grafsize($gID,margin_Y1) $grafsize(margin_Y1) set grafsize($gID,margin_Y2) $grafsize(margin_Y2) for {set i 1} {$i <= $N_graf} {incr i} { set grafdata($gID,N_MXtick,$i) [expr $NLINE + 1] set grafdata($gID,N_mXtick,$i) 0 set grafdata($gID,Xtick1,$i) 0.0 set grafdata($gID,Xtick1_text,$i) $properties(TICK1) set grafdata($gID,Xmin,$i) 0.0 set grafdata($gID,N_Xline,$i) [expr $NLINE - 1]; #lines at K-nodes } # # this will be for projected band structure # for {set ig 1} {$ig <= $N_graf} {incr ig} { for {set ip 1} {$ip <= $N_proj} {incr ip} { xcDebug "what1:: # of proj.:: $ip" set grafdata($gID,N_point,$ig) 0 for {set i 1} {$i <= $NLINE} {incr i} { ReadFTN25 BAND $fileID $gID $ip $ig set grafdata($gID,X0,$ig) -$ftn25(X4); # used just here for {set ni 1} {$ni <= $ftn25(NCOL)} {incr ni} { set nxi [expr $grafdata($gID,N_point,$ig) + $ni] set nxi1 [expr $grafdata($gID,N_point,$ig) + $ni - 1] set grafdata($gID,X$nxi,$ig) \ [expr $grafdata($gID,X$nxi1,$ig) + $ftn25(X4)] } set grafdata($gID,N_point,$ig) \ [expr $grafdata($gID,N_point,$ig) + $ftn25(NCOL)] if { $i < $NLINE } { set grafdata($gID,Xline$i,$ig) $grafdata($gID,X$nxi,$ig) set grafsize($gID,Xline${i}_width,$ig) 2 set grafsize($gID,Xline${i}_fill,$ig) "#000" set grafsize($gID,Xline${i}_stipple,$ig) {} } set ii [expr $i + 1] set grafdata($gID,Xtick$ii,$ig) $grafdata($gID,X$nxi,$ig) set grafdata($gID,Xtick${ii}_text,$ig) $properties(TICK$ii) if { $i == 1 && $ig == 1} { set Ymin $ftn25(X1) set Ymax $ftn25(X2) } elseif { $ftn25(X1) < $Ymin } { set Ymin $ftn25(X1) } elseif { $ftn25(X2) > $Ymax } { set Ymax $ftn25(X2) } } } } for {set ig 1} {$ig <= $N_graf} {incr ig} { set yrange [expr $Ymax - $Ymin] set grafdata($gID,Yoffset,$ig) 0.05 set grafdata($gID,Xoffset,$ig) 0.0 set grafdata($gID,Ymin,$ig) \ [expr $Ymin - $yrange * $grafdata($gID,Yoffset,$ig)] set grafdata($gID,Ymax,$ig) \ [expr $Ymax + $yrange * $grafdata($gID,Yoffset,$ig)] set grafdata($gID,text${ig}_X) 0.02 set grafdata($gID,text${ig}_Y) \ [expr double($ig - 0.95) / double($N_graf)] set grafdata($gID,N_segment,$ig) [expr $ftn25(NROW) * $N_proj] set grafdata($gID,X_title,$ig) "" set grafdata($gID,Y_title,$ig) "E / a.u." set grafdata($gID,Xmax,$ig) $grafdata($gID,X$nxi,$ig) set grafdata($gID,Yline1,$ig) $ftn25(X5); # Fermi Energy set grafdata($gID,N_Yline,$ig) 1; set grafdata($gID,Yline1_text,$ig) "E_Fermi" set grafsize($gID,Yline1_stipple,$ig) @$system(BMPDIR)/dotH.bmp set grafsize($gID,Yline1_fill,$ig) "#ff0000" set grafsize($gID,Yline1_width,$ig) 1 set grafdata($gID,N_MYtick,$ig) 6 set grafdata($gID,N_mYtick,$ig) 2 set graf($gID,RorigX,$ig) 0.0 set graf($gID,RorigY,$ig) \ [expr double($N_graf - $ig) / double($N_graf)] set graf($gID,RsizeX,$ig) 1.0 set graf($gID,RsizeY,$ig) \ [expr 1.0 / double($N_graf) - [XGraph2nMRel $gID 5]] # Y tics set dy [expr abs(($grafdata($gID,Ymax,$ig) - \ $grafdata($gID,Ymin,$ig)) / \ ($grafdata($gID,N_MYtick,$ig) - 1))] for {set i 1} {$i <= $grafdata($gID,N_MYtick,$ig)} {incr i} { set grafdata($gID,Ytick$i,$ig) \ [expr $grafdata($gID,Ymin,$ig) + ($i - 1) * $dy] set grafdata($gID,Ytick${i}_text,$ig) \ [TickFormat $grafdata($gID,Ytick$i,$ig) $dy] #puts stdout "TICKS: $grafdata($gID,Ytick$i,$ig)" } } close $fileID } xcrysden-1.6.2/Tcl/hbonds.tcl0000644000175000017500000000666411712736221014574 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/hbonds.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc Hbonds {togl} { global check if { $check(Hbonds) } { xc_hbonds $togl on $togl render xcSwapBuffers } else { xc_hbonds $togl off $togl render xcSwapBuffers } } proc HbondsSetting {togl} { global check Hbonds set t .hbond[lindex [split $togl .] end] if { [winfo exists $t] } { return } _HbondsSetting:Init $togl # from here on: widget managing xcToplevel $t "H-bonds: Settings" "H-bonds" . -0 0 1 set f1 [frame $t.f1] set f2 [frame $t.f2] set f3 [frame $t.f3] pack $f1 $f2 $f3 -side top -expand 1 -fill x -padx 3m -pady 3m # frame-1: simple entries FillEntries $f1 { "H-like atom list:" "O-like atom list:" "Minimum H-bond length:" "Maximum H-bond length:" "Minimum H-bond angle:" "H-bond line width:" "H-bond line pattern:" "H-bond pattern size:" } { Hbonds(H_like_list) Hbonds(O_like_list) Hbonds(length_min) Hbonds(length_max) Hbonds(angle_min) Hbonds(line_width) Hbonds(line_pattern) Hbonds(line_patternsize) } 23 20 top left # frame-2: H-bond color xcModifyColor $f2 "H-bonds color:" [rgb_f2h $Hbonds(color)] \ groove left left 100 100 100 5 20 $Hbonds(colorID) # frame-3: Close/Update buttons set b1 [button $f3.close -text "Close" -command [list DestroyWid $t]] set b2 [button $f3.update -text "Update" -command [list HbondsSetting:update $togl]] pack $b1 $b2 -side left -padx 3m -pady 3m -expand 1 } proc HbondsSetting:update {togl} { global Hbonds # check the values of the HBonds array here ... # ...insert... #-- if { [info exists Hbonds(colorID)] } { set Hbonds(color) [xcModifyColorGet $Hbonds(colorID) float RGB] } xc_hbonds $togl set \ -H_like_list $Hbonds(H_like_list) \ -O_like_list $Hbonds(O_like_list) \ -color $Hbonds(color) \ -length_min $Hbonds(length_min) \ -length_max $Hbonds(length_max) \ -angle_min $Hbonds(angle_min) \ -line_width $Hbonds(line_width) \ -line_pattern $Hbonds(line_pattern) \ -line_patternsize $Hbonds(line_patternsize) $togl render xcSwapBuffers } proc _HbondsSetting:Init {togl} { global Hbonds foreach option { H_like_list O_like_list color length_min length_max angle_min line_width line_pattern line_patternsize } { if { ![info exists Hbonds($option)] } { set Hbonds($option) [xc_hbonds $togl get -$option] } } if { ! [info exists Hbonds(colorID)] } { set Hbonds(colorID) [xcModifyColorID] } } xcrysden-1.6.2/Tcl/bar.tcl0000644000175000017500000001565213246207661014065 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/bar.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# #---------------------- # BARGraph is called as: #---------------------- # grapher_BARGraph $file {$args {}} # Grapher BARGraph ############################# # format of bargarph file is: #---------------------------- # nbar # 1 Ymin1 Ymin2 # .... ############################# proc grapher_ReadBARFile file { global grafdata grafsize gID system set nl 0 foreach lin [split [ReadFile $file] \n] { incr nl set line($nl) $lin } set nbar [lindex $line(1) 0] set grafdata($gID,N_point,1) $nbar set l [expr 1.0 / $grafdata($gID,N_point,1)] set i 0 for {set ii 2} {$ii <= [expr $nbar + 1]} {incr ii} { incr i # X values set grafdata($gID,Xtick${i}_text,1) [lindex $line($ii) 0] set grafdata($gID,Xtick$i,1) [expr ($i - 1) * $l + $l / 2] set grafdata($gID,X$i,1) [expr ($i - 1) * $l + $l / 2] set grafsize($gID,bar${i}_fill,1) #ff0000 set grafsize($gID,bar${i}_outline,1) #ff0000 set grafsize($gID,bar${i}_shadow,1) #aaaaaa # Y values set grafdata($gID,$i,1,1) [lindex $line($ii) 1] set grafdata($gID,$i,2,1) [lindex $line($ii) 2] xcDebug -debug "$grafdata($gID,$i,1,1) $grafdata($gID,$i,2,1)" if { $i < $grafdata($gID,N_point,1) } { set grafdata($gID,Xline$i,1) [expr $i * $l] set grafsize($gID,Xline${i}_fill,1) #000 set grafsize($gID,Xline${i}_width,1) 1 set grafsize($gID,Xline${i}_stipple,1) \ @$system(BMPDIR)/dotV.bmp set grafsize($gID,Xline1_textstipple,1) @$system(BMPDIR)/dotH.bmp } if { $i == 1 } { set Ymin $grafdata($gID,$i,1,1) set Ymax $grafdata($gID,$i,2,1) } else { if { $grafdata($gID,$i,1,1) < $Ymin } { set Ymin $grafdata($gID,$i,1,1) xcDebug -debug "Ymin1: $i,$Ymin,$grafdata($gID,$i,1,1)" } if { $grafdata($gID,$i,2,1) > $Ymax } { set Ymax $grafdata($gID,$i,2,1) } } xcDebug -debug "Ymin: $Ymin" set grafsize($gID,bar${i}_stipple,1) gray50 set grafsize($gID,bar${i}_width,1) 1 } # arbitrarily we set: Xmin to 0 & Xmax to 1 set grafdata($gID,Xmin,1) 0.0 set grafdata($gID,Xmax,1) 1.0 set grafdata($gID,Xoffset,1) 0.2 set grafdata($gID,Yoffset,1) 0.05 set grafdata($gID,N_MXtick,1) $grafdata($gID,N_point,1) set grafdata($gID,N_mXtick,1) 0 set grafdata($gID,barn,1) 1 set grafsize($gID,Mtick_size,1) 0 set grafsize($gID,mtick_size,1) 0 set yrange [expr $Ymax - $Ymin] set grafdata($gID,Ymin,1) \ [expr $Ymin - $yrange * $grafdata($gID,Yoffset,1)] set grafdata($gID,Ymax,1) \ [expr $Ymax + $yrange * $grafdata($gID,Yoffset,1)] set grafdata($gID,N_MYtick,1) 6 set grafdata($gID,N_mYtick,1) 2 set dy [expr ($grafdata($gID,Ymax,1) - $grafdata($gID,Ymin,1)) / \ ($grafdata($gID,N_MYtick,1) - 1)] for {set i 1} {$i <= $grafdata($gID,N_MYtick,1)} {incr i} { set grafdata($gID,Ytick$i,1) [expr $Ymin + ($i - 1) * $dy] set grafdata($gID,Ytick${i}_text,1) \ [TickFormat $grafdata($gID,Ytick$i,1)] } set grafsize($gID,canW) 600 set grafsize($gID,canH) 450 } proc grapher_BARGraph {file {args {}}} { global grafdata grafsize graf system gID # options: # "-Yline" # "-Yline_text" # "-Xline" # "-Xline_text" # "-Xtitle" # "-Ytitle" # "-firstbar" # "-lastbar" if ![file exists $file] { tk_dialog .err ERROR "ERROR! \nFile \"$file\" does not exist !!!" \ error 0 OK return } set gID [NextGrapherID] grapher_ReadBARFile $file set grafdata($gID,N_Yline,1) 0 set grafdata($gID,Yline1,1) {} set grafdata($gID,Yline1_text,1) {} set grafsize($gID,Yline1_fill,1) #ff0000 set grafsize($gID,Yline1_width,1) 1 set grafsize($gID,Yline1_stipple,1) @$system(BMPDIR)/dotH.bmp set grafdata($gID,N_Xline,1) 0 set grafdata($gID,Xline1_text,1) {} set grafsize($gID,Xline1_fill,1) #ff0000 set grafsize($gID,Xline1_width,1) 1 set grafsize($gID,Xline1_stipple,1) @$system(BMPDIR)/dotV.bmp set grafdata($gID,X_title,1) "X title" set grafdata($gID,Y_title,1) "Y title" set grafdata($gID,N_Xline,1) [expr $grafdata($gID,N_point,1) - 1] set grafdata($gID,firstbar,1) 1 set grafdata($gID,lastbar,1) $grafdata($gID,N_point,1) xcDebug "grapher_BARGraph:: $args" set i 0 foreach option $args { incr i # odd cycles are tags, even options if { $i%2 } { set tag $option } else { xcDebug "FillEntries Options:: $tag $option" switch -- $tag { "-Yline" { set grafdata($gID,N_Yline,1) 1 set grafdata($gID,Yline1,1) $option } "-Yline_text" { set grafdata($gID,Yline1_text,1) $option } "-Xline" { set grafdata($gID,N_Xline,1) 1 set grafdata($gID,Xline1,1) $option } "-Xline_text" { set grafdata($gID,Xline1_text,1) $option } "-Xtitle" { set grafdata($gID,X_title,1) $option } "-Ytitle" { set grafdata($gID,Y_title,1) $option } "-firstbar" { set grafdata($gID,firstbar,1) $option } "-lastbar" { set grafdata($gID,lastbar,1) $option } default { tk_dialog .mb_error Error \ "ERROR: Bad graph_BARGraph configure option $tag" \ error 0 OK return 0 } } } } if { $i%2 } { tk_dialog .mb_error1 Error \ "ERROR: You called graph_BARGraph with an odd number of args !" \ error 0 OK return 0 } set fileID [open $file r] set grafdata($gID,N_graf) 1 set grafdata($gID,N_segment,1) 2; # one is min band E, one is max band E set grafdata($gID,N_text) 1 set grafdata($gID,barshadow,1) 0 set graf($gID,RorigX,1) 0.0 set graf($gID,RorigY,1) 0.0 set graf($gID,RsizeX,1) 1.0 set graf($gID,RsizeY,1) 1.0 if { $grafdata($gID,N_point,1) < 1 } { tk_dialog .dialog WARNING "WARNING: Number of BANDs to plot is 0!!!" \ error 0 OK return } } xcrysden-1.6.2/Tcl/wnDetComOpt.tcl0000644000175000017500000000254711712736221015516 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/wnDetComOpt.tcl # # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc wnDetComOpt dir { global wn set wn(complex) 0 set wn(spin_polarized) 0 set fh [file tail $dir] if { [file exists $dir/$fh.in1c] } { if {[file size $dir/$fh.in1c] > 0 } { set wn(complex) 1 } } if { [file exists $dir/$fh.clmdn] } { if {[file size $dir/$fh.clmdn] > 0 } { set wn(spin_polarized) 1 } } } xcrysden-1.6.2/Tcl/readParam.tcl0000644000175000017500000003315711712736221015210 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/readParam.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc read_param { w } { global groupsel n_groupsel species inp class # THIS PROC DETERMINE A CLASS OF SPECIES AND READ MINIMAL # SET OF LATTICE VECTORS & ANGLES # $w - name of parent's widget # $species - type of species (polymer, slab, ..) # n_groupsel - N. of selected group # ---------------------------------------------- # DEFINITIONS of needed SET's of LATTICE VECTORS # ---------------------------------------------- # CLASSES for whom only A is NEEDED: "A" class # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Polymers: -all # Slabs: -square # -hexagonal # Crystals: -cubic # CLASSES for whom only A,B is NEEDED: "AB" class # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Slabs: -rectangular # CLASSES for whom only A,B,GAMMA is NEEDED: "AB_GAMMA" class # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Slabs: -triclinic # CLASSES for whom only A,C is NEEDED: "AC" class # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Crystals: -hexagonal # -rhombohedral-hexagonal # -tetragonal # CLASSES for whom only A,ALFA is NEEDED: "A_ALFA" class # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Crystals: -rhombohedral-rhombohedral # REMARK: the following classes can be handled either RHOMBO., # ------ either HEXA.: 146 R 3 # 148 R -3 # 155 R 3 2 # 160 R 3 M # 161 R 3 C # 166 R -3 M # 167 R -3 C # that is ALL groups that are R-centered # CLASSES for whom only A,B,C is NEEDED: "ABC" class # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Crystals: -orthorhombic # CLASSES for whom only A,B,C,"angle" is NEEDED: "ABC_angle" class # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Crystals: -monoclinic # CLASSES for whom A,B,C,ALFA,BETA,GAMMA is NEEDED: "ABC_all"class # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Crystals: -triclinic frame $w.1 frame $w.2 pack $w.1 $w.2 -expand 1 -fill both # all polymer are in "A" class if { $species == "polymer" } { Entries $w.1 A: inp(A) 10 set class A } # we must determine class's number # if $species == (slab or crystal); if { $species == "slab" } { if { $n_groupsel < 8 } { # TRICLINIC LATTICE Entries $w.1 {A: B:} {inp(A) inp(B)} 10 Entries $w.2 GAMMA: inp(GAMMA) 10 set class {{A B} {GAMMA}} } if { $n_groupsel >= 8 && $n_groupsel < 49 } { # RECTANGULAR LATTICE Entries $w.1 {A: B:} {inp(A) inp(B)} 10 set class {{A B}} } if { $n_groupsel >= 49 && $n_groupsel < 65 } { # SQUARE LATTICE Entries $w.1 A: inp(A) 10 set class A } if { $n_groupsel >= 65 } { # HEXAGONAL LATTICE Entries $w.1 A: inp(A) 10 set class A } } if { $species == "crystal" } { if { $n_groupsel < 3 } { # TRICLINIC LATTICE Entries $w.1 {A: B: C:} {inp(A) inp(B) inp(C)} 10 Entries $w.2 {ALPHA: BETA: GAMMA:} \ {inp(ALFA) inp(BETA) inp(GAMMA)} 10 set class {{A B C} {ALFA BETA GAMMA}} } if { $n_groupsel >= 3 && $n_groupsel < 16 } { # MONOCLINIC LATTICE # WARNING: here are three options !!!! # Entries $w.2 {ALFA: BETA: GAMMA:} {ALFA BETA GAMMA} 10 Entries $w.1 {A: B: C:} {inp(A) inp(B) inp(C)} 10 Entries $w.2 GAMMA: inp(GAMMA) 10 set class {{A B C} {GAMMA}} } if { $n_groupsel >= 16 && $n_groupsel < 75 } { # ORTHOROMBIC LATTICE Entries $w.1 {A: B: C:} {inp(A) inp(B) inp(C)} 10 set class {{A B C}} } if { $n_groupsel >= 75 && $n_groupsel < 143 } { # TETRAGONAL LATTICE Entries $w.1 {A: C:} {inp(A) inp(C)} 10 set class {{A C}} } # 143 -> 167 some TRIGONAL->HEXA, some TRIGONAL->RHOMBO. # 168 -> 194 HEXAGONAL if [info exist inp(IFHR)] { if { $inp(IFHR) == 1 } { # RHOMBOHEDRAL AXES Entries $w.1 {A: ALPHA:} {inp(A) inp(ALFA)} 10 set class {{A} {ALFA}} return } } if { $n_groupsel >= 143 && $n_groupsel < 195 } { # HEXAGONAL LATTICE & TRIGONAL WITH HEXA. AXES Entries $w.1 {A: C:} {inp(A) inp(C)} 10 set class {{A C}} } if { $n_groupsel >= 195 } { # CUBIC LATTICE Entries $w.1 A: inp(A) 10 set class A } } # set focus to the first entry focus $w.1.frame.entry1 } proc WhichPar2Read {input} { global groupsel n_groupsel species \ inp class distext #this procs READ&PRINT parameters in OPEN_FILE mode set param [gets $input] if { $species == "slab" } { append distext "> UNIT CELL PARAMETERS - " if { $n_groupsel < 8 } { # TRICLINIC LATTICE set inp(A) [lindex $param 0] set inp(B) [lindex $param 1] set inp(GAMMA) [lindex $param 2] append distext "TRICLINIC LATTICE::\n" append distext "A = $inp(A), B = $inp(B),\ \n GAMMA = $inp(GAMMA)\n\n" } if { $n_groupsel >= 8 && $n_groupsel < 49 } { # RECTANGULAR LATTICE set inp(A) [lindex $param 0] set inp(B) [lindex $param 1] append distext "RECTANGULAR LATTICE::\n" append distext "A = $inp(A), B = $inp(B)\n\n" } if { $n_groupsel >= 49 && $n_groupsel < 65 } { # SQUARE LATTICE set inp(A) [lindex $param 0] append distext "SQUARE LATTICE::\n" append distext "A = $inp(A)\n\n" } if { $n_groupsel >= 65 } { # HEXAGONAL LATTICE set inp(A) [lindex $param 0] append distext "HEXAGONAL LATTICE::\n" append distext "A = $inp(A)\n\n" } } if { $species == "crystal" } { IsNotStandardGroup $groupsel append distext "> CRYSTAL FAMILY : $inp(CRY_FAM)\n" append distext "> CRYSTAL CLASS (GROTH - 1921): $inp(CRY_CLASS)\n\n" append distext "> UNIT CELL PARAMETERS::\n" if { $n_groupsel <= 230 && [xcNumber n_groupsel int] } { if { $n_groupsel < 3 } { # TRICLINIC LATTICE set inp(A) [lindex $param 0] set inp(B) [lindex $param 1] set inp(C) [lindex $param 2] set inp(ALFA) [lindex $param 3] set inp(BETA) [lindex $param 4] set inp(GAMMA) [lindex $param 5] append distext "A = $inp(A), B = $inp(B), C = $inp(C),\n" append distext "ALPHA = $inp(ALFA), BETA = $inp(BETA), \ GAMMA = $inp(GAMMA)\n\n" } if { $n_groupsel >= 3 && $n_groupsel < 16 } { # MONOCLINIC LATTICE # WARNING: here are three options !!!! set inp(A) [lindex $param 0] set inp(B) [lindex $param 1] set inp(C) [lindex $param 2] set inp(GAMMA) [lindex $param 3] append distext "A = $inp(A), B = $inp(B), C = $inp(C),\n" append distext "GAMMA = $inp(GAMMA)\n\n" } if { $n_groupsel >= 16 && $n_groupsel < 75 } { # ORTHOROMBIC LATTICE set inp(A) [lindex $param 0] set inp(B) [lindex $param 1] set inp(C) [lindex $param 2] append distext "A = $inp(A), B = $inp(B), C = $inp(C),\n\n" } if { $n_groupsel >= 75 && $n_groupsel < 143 } { # TETRAGONAL LATTICE set inp(A) [lindex $param 0] set inp(B) [lindex $param 1] append distext "A = $inp(A), B = $inp(B)\n\n" } # 143 -> 167 some TRIGONAL->HEXA, some TRIGONAL->RHOMBO. # 168 -> 194 HEXAGONAL if { $n_groupsel >= 143 && $n_groupsel < 168 } { # TRIGONAL LATTICE (either rhombo. either hexa. axes) set inp(A) [lindex $param 0] set rhombohexa "146 148 155 160 161 166 167" foreach grp $rhombohexa { if { $n_groupsel == $grp } { # query for rhombo./hexa. axes if { $inp(IFHR) == 1 } { # RHOBOHEDRAL AXES!!! set inp(ALFA) [lindex $param 1] append distext "A = $inp(A), ALPHA = $inp(ALFA)\n\n" return } } } # HEXAGONAL AXES!!! set inp(C) [lindex $param 1] append distext "A = $inp(A), C = $inp(C)\n\n" } if { $n_groupsel >= 168 && $n_groupsel < 195 } { # HEXAGONAL LATTICE set inp(A) [lindex $param 0] set inp(C) [lindex $param 1] append distext "A = $inp(A), C = $inp(C)\n\n" } if { $n_groupsel >= 195 } { # CUBIC LATTICE set inp(A) [lindex $param 0] append distext "A = $inp(A)\n\n" } } else { # do it according to class set i 0 foreach grp $class { foreach item $grp { if { $item == "A" } { set inp(A) [lindex $param $i] append distext "A = $inp(A)" incr i } if { $item == "B" } { set inp(B) [lindex $param $i] append distext ", B = $inp(B)" incr i } if { $item == "C" } { set inp(C) [lindex $param $i] append distext ", C = $inp(C)" incr i } if { $item == "ALFA" } { set inp(ALFA) [lindex $param $i] append distext ",\nALPHA = $inp(ALFA)" incr i } if { $item == "BETA" } { set inp(BETA) [lindex $param $i] append distext ", BETA = $inp(BETA)" incr i } if { $item == "GAMMA" } { set inp(GAMMA) [lindex $param $i] if { [info exists inp(ALFA)] || \ [info exists inp(BETA)] } { append distext ", GAMMA = $inp(GAMMA)" } else { append distext "GAMMA = $inp(GAMMA)" } incr i } } } append distext "\n\n" } } append distext "--------------------------------------------------\n\n" } proc WhichPar2Print {} { global groupsel n_groupsel species \ inp class distext #this procs PRINTS parameters in OPEN_FILE mode if { $species == "slab" } { append distext "> UNIT CELL PARAMETERS - " if { $n_groupsel < 8 } { # TRICLINIC LATTICE append distext "TRICLINIC LATTICE::\n" append distext "A = $inp(A), B = $inp(B),\ \n GAMMA = $inp(GAMMA)\n\n" } if { $n_groupsel >= 8 && $n_groupsel < 49 } { # RECTANGULAR LATTICE append distext "RECTANGULAR LATTICE::\n" append distext "A = $inp(A), B = $inp(B)\n\n" } if { $n_groupsel >= 49 && $n_groupsel < 65 } { # SQUARE LATTICE append distext "SQUARE LATTICE::\n" append distext "A = $inp(A)\n\n" } if { $n_groupsel >= 65 } { # HEXAGONAL LATTICE append distext "HEXAGONAL LATTICE::\n" append distext "A = $inp(A)\n\n" } } if { $species == "crystal" } { IsNotStandardGroup $groupsel append distext "> CRYSTAL FAMILY : $inp(CRY_FAM)\n" append distext "> CRYSTAL CLASS (GROTH - 1921): $inp(CRY_CLASS)\n\n" append distext "> UNIT CELL PARAMETERS::\n" puts stdout "IGR:: $n_groupsel" if { $n_groupsel <= 230 && [xcNumber n_groupsel int] } { if { $n_groupsel < 3 } { # TRICLINIC LATTICE append distext "A = $inp(A), B = $inp(B), C = $inp(C),\n" append distext "ALPHA = $inp(ALFA), BETA = $inp(BETA), \ GAMMA = $inp(GAMMA)\n\n" } if { $n_groupsel >= 3 && $n_groupsel < 16 } { # MONOCLINIC LATTICE # WARNING: here are three options !!!! append distext "A = $inp(A), B = $inp(B), C = $inp(C),\n" append distext "GAMMA = $inp(GAMMA)\n\n" } if { $n_groupsel >= 16 && $n_groupsel < 75 } { # ORTHOROMBIC LATTICE append distext "A = $inp(A), B = $inp(B), C = $inp(C),\n\n" } if { $n_groupsel >= 75 && $n_groupsel < 143 } { # TETRAGONAL LATTICE append distext "A = $inp(A), B = $inp(B)\n\n" } if { $n_groupsel >= 143 && $n_groupsel < 168 } { # TRIGONAL LATTICE (either rhombo. either hexa. axes) set rhombohexa "146 148 155 160 161 166 167" foreach grp $rhombohexa { if { $n_groupsel == $grp } { # query for rhombo./hexa. axes if { $inp(IFHR) == 1 } { # RHOBOHEDRAL AXES!!! append distext "A = $inp(A), ALPHA = $inp(ALFA)\n\n" return } } } # HEXAGONAL AXES!!! append distext "A = $inp(A), C = $inp(C)\n\n" } if { $n_groupsel >= 168 && $n_groupsel < 195 } { # HEXAGONAL LATTICE append distext "A = $inp(A), C = $inp(C)\n\n" } if { $n_groupsel >= 195 } { # CUBIC LATTICE append distext "A = $inp(A)\n\n" } } else { # do it according to class set i 0 foreach grp $class { foreach item $grp { puts stdout "WhichPar2Print:: ITEM> $item" if { $item == "A" } { append distext "A = $inp(A)" incr i } if { $item == "B" } { append distext ", B = $inp(B)" incr i } if { $item == "C" } { append distext ", C = $inp(C)" incr i } if { $item == "ALFA" } { append distext ",\nALPHA = $inp(ALFA)" incr i } if { $item == "BETA" } { append distext ", BETA = $inp(BETA)" incr i } if { $item == "GAMMA" } { if { [info exists inp(ALFA)] || \ [info exists inp(BETA)] } { append distext ", GAMMA = $inp(GAMMA)" } else { append distext "GAMMA = $inp(GAMMA)" } incr i } } } append distext "\n\n" } } append distext "--------------------------------------------------\n\n" } xcrysden-1.6.2/Tcl/menu.tcl0000644000175000017500000020345213531255242014255 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/menu.tcl # ------ # # Copyright (c) 1996-2014 by Anton Kokalj # ############################################################################# proc ViewMolMenu {w can} { global radio check # load constant values for xc_newvalue, xc_resetvar, xc_getvalue # and xc_getdefault # $w --- widget to place MENU in # $can - widget where STRUCTURE is displayed # colors image #image create photo colors -format gif -file $system(BMPDIR)/jpaint.gif menubutton $w.vmcolor -image colors -menu $w.vmcolor.menu menubutton $w.vmfile -text "File" -menu $w.vmfile.menu -underline 0 menubutton $w.vmdis -text "Display" -menu $w.vmdis.menu -underline 0 menubutton $w.vmmod -text "Modify" -menu $w.vmmod.menu -underline 0 menubutton $w.vmadvg -text "AdvGeom" -menu $w.vmadvg.menu -underline 0 menubutton $w.vmpro -text "Properties" -menu $w.vmpro.menu -underline 0 menubutton $w.vmdat -text "Tools" -menu $w.vmdat.menu -underline 0 menubutton $w.vmhelp -text "Help" -menu $w.vmhelp.menu -underline 0 pack $w.vmcolor -side left -padx 3 pack $w.vmfile $w.vmdis $w.vmmod $w.vmadvg $w.vmpro $w.vmdat $w.vmhelp \ -side left -padx 10 -pady 3 ################################################################# set check(crds) 0 set check(labels) 0 set check(frames) 1 set check(unibond) 0 set check(perpective) 0 set radio(cellmode) "conv" set radio(ball) "Balls based on covalent radii" set radio(space) "SpaceFill based on covalent radii" set radio(frames) rods set radio(hexamode) "parapipedal" set radio(unitrep) "cell" ######################################################################## set mcolor [menu $w.vmcolor.menu] set mfile [menu $w.vmfile.menu] set mmod [menu $w.vmmod.menu] set mdis [menu $w.vmdis.menu] set madvg [menu $w.vmadvg.menu] set mpro [menu $w.vmpro.menu] set mdat [menu $w.vmdat.menu] set mhelp [menu $w.vmhelp.menu] mainMenu $can $mcolor $mfile $mmod $mdis $madvg $mpro $mdat $mhelp ### accelerators bind . p {ToggleMenuCheckbutton perspective Perspective} bind . d {ToggleMenuCheckbutton depthcuing DepthCuing} bind . a {ToggleMenuCheckbutton antialias AntiAlias} bind . y {ToggleMenuCheckbutton crds CrdSist} bind . s {ToggleMenuCheckbutton labels AtomLabels} bind . c {ToggleMenuCheckbutton frames CrysFrames} bind . u {ToggleMenuCheckbutton unibond Unibond} bind . h {ToggleMenuCheckbutton Hbonds Hbonds .mesa} bind . f {ToggleMenuCheckbutton forces forceVectors .mesa} bind . w {ToggleMenuCheckbutton wigner WignerSeitz} bind . m {ToggleMenuCheckbutton pseudoDens PseudoDensity} bind . {DisplayMode3D} bind . {DisplayMode2D} bind . {ToggleMenuRadiobutton cellmode prim CellMode 1} bind . {ToggleMenuRadiobutton cellmode conv CellMode 1} } proc mainMenu {can mcolor mfile mmod mdis madvg mpro mdat mhelp} { global mody ball radio check species mesa_bg xcColors system \ undoMenu undoAdvGeom light #------------------------------------------------------------------------ # COLOR MENU (i.e. Palette) #------------------------------------------------------------------------ ColorMenu $can $mcolor #------------------------------------------------------------------------ # FILE MENU #------------------------------------------------------------------------ $mfile add command -label "New CRYSTAL Input" -command new_file $mfile add separator #$mfile add command -label "Open Structure" \ # -command [list OpenXSFStruct $can] $mfile add cascade -label "Open Structure ..." -menu $mfile.opstr $mfile add cascade -label "Open PWscf ..." -menu $mfile.pwscf $mfile add cascade -label "Open CRYSTAL ..." -menu $mfile.crystal $mfile add cascade -label "Open WIEN2k ..." -menu $mfile.wien #$mfile add command -label "Band Path Selection - Test" \ # -command Bz_MakeToplevel $mfile add separator $mfile add command -label "Close" -command CloseCase -accelerator "Crlt-w" bind . CloseCase $mfile add separator $mfile add command -label "Save XSF Structure" -command SaveXSFStruct -accelerator "Ctrl-s" $mfile add command -label "Save Current State and Structure" -command saveState -accelerator "Ctrl-t" $mfile add command -label "Save Current State" -command {saveState state} -accelerator "Ctrl-u" bind . SaveXSFStruct bind . saveState bind . saveState bind . { saveState state } $mfile add command -label "Save CRYSTAL Input" \ -command SaveCrystalInput $mfile add command -label "Save WIEN2k Struct File" -command wnSaveSFile $mfile add separator $mfile add command -label "Print to File" -command {printTogl .mesa} -accelerator "Ctlr-p" bind . {printTogl .mesa} #$mfile add command -label "Print " -command PrintStructure $mfile add command -label "Print Setup" -command printSetup -accelerator "Ctlr-Alt-p" bind . printSetup $mfile add separator $mfile add cascade -label "Utilities ..." -menu $mfile.util $mfile add cascade -label "XCrySDen Examples ..." -menu $mfile.examples $mfile add separator $mfile add command -label "Exit" -command exit_pr -underline 1 -accelerator "Ctrl-q" trace variable species w xcTrace # Open Structure ... set opstr [menu $mfile.opstr -tearoff 0] $opstr add command -label "Open XSF (XCrySDen Structure File)" \ -command [list xsfOpenMenu $can] $opstr add command -label "Open AXSF (Animation XCrySDen Structure File)" \ -command [list xsfAnimOpenMenu $can] $opstr add command -label "Open BXSF (i.e. Fermi Surface Files)" \ -command [list bxsfOpenMenu $can] $opstr add separator $opstr add command -label "Open XCrySDen Scripting File" \ -command [list scriptOpenMenu $can] $opstr add separator $opstr add command -label "Open XYZ" -command xyzOpen $opstr add command -label "Open PDB" \ -command [list OpenXYZPDB $can pdb] $opstr add separator $opstr add command -label "Open Gaussian Z-Matrix File" \ -command [list gzmat_menu {Gaussian Z-Matrix File}] $opstr add command -label "Open Gaussian Output File" \ -command [list addOption:hardcoded \ [list sh $system(TOPDIR)/scripts/g98toxsf.sh] {} \ "Open Gaussian Output File"] $opstr add command -label "Open Gaussian Cube File" \ -command [list g98Cube {} viewmol_exists] $opstr add separator $opstr add command -label "Open Orca Output File" \ -command [list addOption:hardcoded \ [list sh $system(TOPDIR)/scripts/orca2xsf.sh] {} \ "Open Orca Output File"] $opstr add separator $opstr add command -label "Open PWscf Input File" \ -command [list openExtStruct 3 crystal external \ [list sh $system(TOPDIR)/scripts/pwi2xsf.sh] \ pwi2xsf.xsf_out \ {PWSCF Input} ANGS \ -preset pwInputPreset] $opstr add command -label "Open PWscf Output File" \ -command [list openExtStruct 3 crystal external \ [list sh $system(TOPDIR)/scripts/dummy.sh] \ pwo2xsf.xsf \ {PWSCF Output} ANGS \ -preset pwOutputPreset] $opstr add separator $opstr add command -label "Open FHI98MD \"inp.ini\" File" \ -command [list openExtStruct 3 crystal external34 \ $system(BINDIR)/fhi_inpini2ftn34 \ $system(ftn_name).34 {FHI98MD "ini.inp"} BOHR \ -preset [list fhiPreset inpini]] $opstr add command -label "Open FHI98MD \"coord.out\" File" \ -command [list openExtStruct 3 crystal external \ $system(BINDIR)/fhi_coord2xcr \ fhi_coord.xcr {FHI98MD "coord.out"} BOHR \ -preset [list fhiPreset coord]] # Open PWscf ... set pwscf [menu $mfile.pwscf -tearoff 0] $pwscf add command -label "Open PWscf Input File" \ -command [list openExtStruct 3 crystal external \ [list sh $system(TOPDIR)/scripts/pwi2xsf.sh] \ pwi2xsf.xsf_out \ {PWSCF Input} ANGS \ -preset pwInputPreset] $pwscf add command -label "Open PWscf Output File" \ -command [list openExtStruct 3 crystal external \ [list sh $system(TOPDIR)/scripts/dummy.sh] \ pwo2xsf.xsf \ {PWSCF Output} ANGS \ -preset pwOutputPreset] # Open CRYSTAL-95/98/03/06 ... set crystal [menu $mfile.crystal -tearoff 0] $crystal add command -label "Open CRYSTAL Input" -command OpenCyrstalInput $crystal add command -label "Open CRYSTAL Properties (e.g. fort.9)" -command PropC95 # Open WIEN2k set wien [menu $mfile.wien -tearoff 0] $wien add command -label "Open WIEN2k Struct File" \ -command wnOpenSFile $wien add command -label "Render pre-Calculated Density" \ -command wnOpenRenderDensity $wien add command -label "Calculate & Render Density" \ -command wnOpenCalcAndRenderDensity $wien add command -label "Select k-path" \ -command wnOpenKPath $wien add command -label "Fermi Surface" \ -command wnOpenFS set util [menu $mfile.util -tearoff 0] $util add command -label "Periodic Table of Elements" \ -command [list ptable .] # # XCRYSDEN examples !!! # set exam [menu $mfile.examples -tearoff 0] $exam add command -label "XSF Files" \ -command [list xsfOpenMenu $can $system(TOPDIR)/examples/XSF_Files] $exam add command -label "BXSF (i.e. Fermi Surface) Files" \ -command { set file [tk_getOpenFile -defaultextension .bxsf \ -filetypes { {{All Files} {.*} } {{Band XSF Files} {.bxsf}} } -initialdir $system(TOPDIR)/examples/FermiSurface \ -title "Open Fermi Surface (BXSF File)"] if { $file != "" } { genFSInit $file } } #-------------------- $exam add separator #-------------------- # SCRIPTING Files ... $exam add command -label "Scripting Files" \ -command { set file [tk_getOpenFile -defaultextension .tcl \ -filetypes { {{XCrySDen Scripting Files} {.tcl} } {{XCrySDen Scripting Files} {.xcrysden} } {{All Files} {.*} } } -initialdir $system(TOPDIR)/examples/Scripting \ -title "Open Tcl Script File"] if { $file != "" } { scripting::source $file } } #-------------------- $exam add separator #-------------------- $exam add command -label "CRYSTAL Input Files" \ -command { OpenCyrstalInput $system(TOPDIR)/examples/CRYSTALxx_input_files } $exam add command -label "WIEN2k Struct Files" \ -command { set file [tk_getOpenFile -defaultextension .struct \ -filetypes { {{All Files} {.*} } {{WIEN2k Struct Files} {.stuct}} } -initialdir $system(TOPDIR)/examples/WIEN_struct_files \ -title "Open WIEN2k Struct File"] if { $file != "" } { reloadRegister $file WIEN2k wnOpenSFile $file } } $exam add cascade -label "PWSCF Files ..." -menu $exam.pwscf $exam add cascade -label "FHI98MD Files ..." -menu $exam.fhi $exam add cascade -label "GAUSSIAN Files ..." -menu $exam.gaus # ORCA examples $exam add command -label "Orca Output Files ..." \ -command { set file [tk_getOpenFile -defaultextension .out \ -filetypes { {{All Files} {.*} } {{Output Files} {.out}} } \ -initialdir $system(TOPDIR)/examples/Orca_files \ -title "Open ORCA Output File"] if { $file != "" } { reloadRegister $file addOption:reload addOption:hardcoded [list sh $system(TOPDIR)/scripts/orca2xsf.sh] \ $file "Open ORCA Output File" viewmol_exists } } #-------------------- $exam add separator #-------------------- $exam add command -label "PDB Files" \ -command [list OpenXYZPDB $can pdb $system(TOPDIR)/examples/PDB] $exam add command -label "XYZ Files" \ -command { set file [tk_getOpenFile -defaultextension .xyz \ -filetypes { {{All Files} {.*} } {{XYZ Files} {.xyz} } } -initialdir $system(TOPDIR)/examples/XYZ \ -title "Open XYZ File"] if { $file != "" } { xyzOpen $file } } # CASCADES #--------------------- # FHI98MD examples ... set fhi [menu $exam.fhi -tearoff 0] $fhi add command -label "Open FHI98MD \"inp.ini\" File" \ -command { set file [tk_getOpenFile -defaultextension .ini \ -filetypes { {{All Files} {.*} } {{FHI98MD inp.ini Files} {.ini}} } \ -initialdir $system(TOPDIR)/examples/FHI98MD_files \ -title "Open FHI98MD \"inp.ini\" File"] if { $file != "" } { reloadRegister $file openExtStruct:reload openExtStruct 3 crystal external34 \ $system(BINDIR)/fhi_inpini2ftn34 \ $system(ftn_name).34 {FHI98MD "ini.inp"} BOHR \ -preset [list fhiPreset inpini] -file $file } } $fhi add command -label "Open FHI98MD \"coord.out\" File" \ -command { set file [tk_getOpenFile -defaultextension .out \ -filetypes { {{All Files} {.*} } {{FHI98MD coord.out Files} {.out}} } \ -initialdir $system(TOPDIR)/examples/FHI98MD_files \ -title "Open FHI98MD \"coord.out\" File"] if { $file != "" } { reloadRegister $file openExtStruct:reload openExtStruct 3 crystal external \ $system(BINDIR)/fhi_coord2xcr \ fhi_coord.xcr {FHI98MD "coord.out"} BOHR \ -preset [list fhiPreset coord] -file $file } } # PWSCF examples ... set pwscf [menu $exam.pwscf -tearoff 0] $pwscf add command -label "Open PWSCF Input File" \ -command { set file [tk_getOpenFile -defaultextension .inp \ -filetypes { {{All Files} {.*} } {{PWSCF Input Files} {.inp}} } \ -initialdir $system(TOPDIR)/examples/PWSCF_files \ -title "Open PWSCF Input File"] if { $file != "" } { reloadRegister $file openExtStruct:reload openExtStruct 3 crystal external \ [list sh $system(TOPDIR)/scripts/pwi2xsf.sh] \ pwi2xsf.xsf_out \ {PWSCF Input} ANGS \ -preset pwInputPreset -file $file } } $pwscf add command -label "Open PWSCF Output File" \ -command { set file [tk_getOpenFile -defaultextension .out \ -filetypes { {{All Files} {.*} } {{PWSCF Output Files} {.out}} } \ -initialdir $system(TOPDIR)/examples/PWSCF_files \ -title "Open PWSCF Output File"] if { $file != "" } { reloadRegister $file openExtStruct:reload openExtStruct 3 crystal external \ [list sh $system(TOPDIR)/scripts/dummy.sh] \ pwo2xsf.xsf \ {PWSCF Output} ANGS \ -preset pwOutputPreset -file $file } } # GAUSSIAN examples ... set gaus [menu $exam.gaus -tearoff 0] $gaus add command -label "Gaussian Z-Matrix File" \ -command { set file [tk_getOpenFile -defaultextension .com \ -filetypes { {{All Files} {.*} } {{GAUSSIAN Z-Matrix Files} {.gzmat}} {{GAUSSIAN Input Files} {.com}} {{GAUSSIAN Input Files} {.inp}} {{GAUSSIAN Input Files} {.g98}} } \ -initialdir $system(TOPDIR)/examples/GAUSSIAN_files \ -title "Open Gaussian Z-Matrix File"] if { $file != "" } { reloadRegister $file GZMAT gzmat $file } } $gaus add command -label "Gaussian Output File" \ -command { set file [tk_getOpenFile -defaultextension .log \ -filetypes { {{All Files} {.*} } {{GAUSSIAN Output Files} {.log}} {{GAUSSIAN Output Files} {.out}} {{GAUSSIAN Output Files} {.g98_out}} } \ -initialdir $system(TOPDIR)/examples/GAUSSIAN_files \ -title "Open Gaussian Output File"] if { $file != "" } { reloadRegister $file addOption:reload addOption:hardcoded [list sh $system(TOPDIR)/scripts/g98toxsf.sh] \ $file "Open Gaussian Output File" viewmol_exists } } $gaus add command -label "Gaussian Cube File" \ -command { set file [tk_getOpenFile -defaultextension .cube \ -filetypes { {{All Files} {.*} } {{GAUSSIAN Cube Files} {.cube}} } \ -initialdir $system(TOPDIR)/examples/GAUSSIAN_files \ -title "Open Gaussian Cube File"] if { $file != "" } { g98Cube $file viewmol_exists } } #------------------------------------------------------------------------ # DISPLAY MENU #------------------------------------------------------------------------ #$mdis add command -label "WireFrame" -command WireFrame #$mdis add command -label "Points&Lines" -command PointLine $mdis add radiobutton -label "Lighting On" -command {Lighting On} \ -variable light -value On -accelerator "F1" $mdis add radiobutton -label "Lighting Off" -command {Lighting Off} \ -variable light -value Off -accelerator "F2" #---------- $mdis add separator #---------- $mdis add checkbutton -label "Coordinate System" -variable check(crds) \ -command CrdSist -accelerator "y" $mdis add checkbutton -label "Atomic Symbols" -variable check(labels) \ -command AtomLabels -accelerator "s" $mdis add checkbutton -label "Crystal Cells" -variable check(frames) \ -command CrysFrames -accelerator "c" $mdis add checkbutton -label "Unicolor Bonds" -variable check(unibond) \ -command Unibond -accelerator "u" $mdis add checkbutton -label "H-Bonds" -variable check(Hbonds) \ -command [list Hbonds $can] -accelerator "h" $mdis add checkbutton -label "Forces" -variable check(forces) \ -command [list forceVectors $can] -accelerator "f" $mdis add checkbutton -label "Wigner-Seitz Cells" -variable check(wigner) \ -command WignerSeitz -accelerator "w" $mdis add checkbutton -label "Molecular Surface" \ -variable check(pseudoDens) \ -command PseudoDensity -accelerator "m" #---------- $mdis add separator #---------- $mdis add checkbutton -label "Perspective Projection" \ -variable check(perspective) \ -command Perspective \ -accelerator "p" $mdis add checkbutton -label "Depth Cuing" \ -variable check(depthcuing) \ -command DepthCuing \ -accelerator "d" $mdis add checkbutton -label "Anti-Aliasing" \ -variable check(antialias) \ -command AntiAlias \ -accelerator "a" #---------- $mdis add separator #---------- $mdis add cascade -label "Balls As ..." -menu $mdis.ball $mdis add cascade -label "SpaceFill As ..." -menu $mdis.space $mdis add cascade -label "Crystal Cells As ..." -menu $mdis.frames #---------- $mdis add separator #---------- $mdis add radiobutton -label "Primitive Cell Mode" \ -command [list CellMode 1]\ -variable radio(cellmode) \ -value "prim" -accelerator "F3" $mdis add radiobutton -label "Conventional Cell Mode" \ -command [list CellMode 1] \ -variable radio(cellmode) \ -value "conv" -accelerator "F4" $mdis add cascade -label "Hexagonal/Rhombohedral ..." -menu $mdis.1 #---------- $mdis add separator #---------- $mdis add cascade -label "Unit of Repetition ..." -menu $mdis.unitr # BALLS MENU set mdisball [menu $mdis.ball -tearoff 0] $mdisball add radiobutton -label "Balls based on covalent radii" \ -command [list xc_newvalue .mesa $mody(L_BALL_COV)] \ -variable radio(ball) $mdisball add radiobutton -label "Balls based on Van der Waals radii" \ -command [list xc_newvalue .mesa $mody(L_BALL_VDW)] \ -variable radio(ball) # SPACEFILL MENU set mdisspace [menu $mdis.space -tearoff 0] $mdisspace add radiobutton -label "SpaceFill based on covalent radii" \ -command [list xc_newvalue .mesa $mody(L_SPACE_COV)] \ -variable radio(space) $mdisspace add radiobutton -label \ "SpaceFill based on Van der Waals radii" \ -command [list xc_newvalue .mesa $mody(L_SPACE_VDW)] \ -variable radio(space) # FRAMES/CELLS MENU set mdisframes [menu $mdis.frames -tearoff 0] $mdisframes add radiobutton \ -label "Display crystal cells as lines when lighting" \ -value lines \ -variable radio(frames) \ -command DispFramesAs $mdisframes add radiobutton \ -label "Display crystal cells as rods when lighting" \ -value rods \ -variable radio(frames) \ -command DispFramesAs #HEXAGONAL/RHOMBOHEDRAL MENU set mdis1 [menu $mdis.1 -tearoff 0] $mdis1 add radiobutton \ -label "Parapipedal-shaped cell" \ -command [list CellMode 1]\ -variable radio(hexamode) \ -value "parapipedal" $mdis1 add radiobutton \ -label "Hexagonal-shaped cell" \ -command [list CellMode 1]\ -variable radio(hexamode) \ -value "hexagonal" #UNIT OF REPETITION set mdis3 [menu $mdis.unitr -tearoff 0] $mdis3 add radiobutton -label "Unit cell" \ -command [list CellMode 1]\ -variable radio(unitrep) \ -value "cell" $mdis3 add radiobutton -label "Translational asymmetric unit" \ -command [list CellMode 1]\ -variable radio(unitrep) \ -value "asym" ########################################################################### # TEMPORARY #$mdis add command -label {Print Dimenisonality} \ # -command { # global periodic; # xcDebug -stderr "\nPERIODICITY:: $periodic(dim)" #} #------------------------------------------------------------------------ # MODIFY MENU #------------------------------------------------------------------------ #-- # disable "Atomic Symbols/Fonts" for now, because they don't work $mmod add command -label "Atomic Symbols/Fonts" -command ModAtomLabels -accelerator "Shift-s" bind . ModAtomLabels #$mmod entryconfigure "Atomic Symbols/Fonts" -state disabled #-- $mmod add separator $mmod add command -label "Atomic Color" -command ModAtomCol -accelerator "Shift-a" bind . ModAtomCol $mmod add command -label "Unibond Color" -command ModUnibondCol -accelerator "Shift-u" bind . ModUnibondCol $mmod add command -label "Crystal Cell Color" -command ModCellCol -accelerator "Shift-c" bind . ModCellCol $mmod add command -label "Coordinate System Color" -command ModXYZCol -accelerator "Shift-z" bind . ModXYZCol $mmod add separator $mmod add command -label "Atomic Radius" -command ModAtomRad -accelerator "Shift-r" bind . ModAtomRad $mmod add command -label "Ball Factor" \ -command [list ModFactor Ball L_BALLF D_BALLF "Ball Factor"] -accelerator "Shift-b" bind . [list ModFactor Ball L_BALLF D_BALLF "Ball Factor"] $mmod add command -label "Ball/Stick Ratio" \ -command [list ModFactor Stick L_RODF D_RODF "Ball/Stick Ratio"] -accelerator "Shift-q" bind . [list ModFactor Stick L_RODF D_RODF "Ball/Stick Ratio"] $mmod add cascade -label "LineWidth ..." -menu $mmod.1 $mmod add command -label "Point Radius" \ -command [list ModFactor Point L_PLRADIUS D_PLRADIUS \ "Point Radius"] -accelerator "Shift-d" bind . [list ModFactor Point L_PLRADIUS D_PLRADIUS "Point Radius"] $mmod add command -label "Crystal Cell's Rod Factor" \ -command [list ModFactor FrameRod L_FRAMERODF D_FRAMERODF \ "Crystal Cell's Rod Factor"] -accelerator "Shift-o" bind . [list ModFactor FrameRod L_FRAMERODF D_FRAMERODF "Crystal Cell's Rod Factor"] $mmod add separator $mmod add command -label "Tessellation Factor" -command \ [list ModFactor Tessellation L_TESSELLATION D_TESSELLATION "Tessellation Factor"] -accelerator "Shift-t" bind . [list ModFactor Tessellation L_TESSELLATION D_TESSELLATION "Tessellation Factor"] $mmod add command -label "Lighting Parameters" -command glLight -accelerator "Shift-l" bind . glLight $mmod add command -label "Perspective Parameters" -command ModPerspective -accelerator "Shift-p" bind .

ModPerspective #$mmod add command -label "Advanced OpenGL Parameters" -command glModParam -accelerator "Shift-x" $mmod add command -label "Material/Fog/Antialias Parameters" -command glModParam -accelerator "Shift-x" bind . glModParam $mmod add separator $mmod add command -label "Force Settings" \ -command [list forceVectorsSet $can] -accelerator "Shift-f" bind . [list forceVectorsSet $can] $mmod add command -label "H-bonds Settings" \ -command [list HbondsSetting $can] -accelerator "Shift-h" bind . [list HbondsSetting $can] $mmod add command -label "Wigner-Seitz Cell Settings" \ -command SetWignerSeitzInit -accelerator "Shift-w" bind . SetWignerSeitzInit $mmod add command -label "Molecular Surface Settings" \ -command PseudoDenConfigWid -accelerator "Shift-m" bind . PseudoDenConfigWid $mmod add command -label "Animation Controls" \ -command [list xsfAnimWid $can] -accelerator "Shift-z" bind . [list xsfAnimWid $can] # screen factor is no more used !!! #$mmod add separator #$mmod add command -label "Screen Factor" \ # -command [list ModFactor Screen L_SCRF D_SCRF] $mmod add separator $mmod add command -label "Number of Units Drawn" -command NumCellDrawn -accelerator "Shift-n" bind . NumCellDrawn set mmod1 [menu $mmod.1 -tearoff 0] $mmod1 add command -label "WireFrame's line width" \ -command [list ModFactor Wire L_WFLINEWIDTH D_WFLINEWIDTH \ "WireFrame's line width"] $mmod1 add command -label "PointLines's line width" \ -command [list ModFactor Pointline L_PLLINEWIDTH D_PLLINEWIDTH \ "PointLine's line width"] $mmod1 add command -label "Crystal Cell's line width" \ -command [list ModFactor Frame L_FRAMELINEWIDTH D_FRAMELINEWIDTH \ "Crystal cell's line width"] $mmod1 add separator $mmod1 add command -label "Lighting-Off outline width" \ -command [list ModFactor Outline L_OUTLINEWIDTH D_OUTLINEWIDTH \ "Lighting-Off outline width"] $mmod1 add command -label "Lighting-On Wire line width" \ -command [list ModFactor Wire3D L_WF3DLINEWIDTH D_WF3DLINEWIDTH \ "Lighting-On wire line width"] # TEMPORARY #global tcl_platform #if { $tcl_platform(platform) == "windows" } { # # disable the modification of font on windows as it does not # # work ... # # $madvg entryconfig "Atomic Symbols/Fonts" -state disabled #} #/ #------------------------------------------------------------------------ # ADVGEOM MENU #------------------------------------------------------------------------ $madvg add cascade -label "Undo ..." -menu $madvg.undo $madvg add cascade -label "Redo ..." -menu $madvg.redo $madvg add separator $madvg add command -label "Rotate Cartesian Frame" -command RotFrame $madvg add cascade -label "Atoms & Cell Manipulation ..." -menu $madvg.1 $madvg add command -label "Cut a SLAB" -command CutSlab $madvg add cascade -label "Cut a non-Periodical Structure ..." \ -menu $madvg.2 $madvg add separator $madvg add command -label "Add an Option Manually" \ -command cxxAdvGeom.manualOption $madvg add command -label "Edit Manually" \ -command cxxAdvGeom.manualEdit $madvg add command -label "View Input Script" \ -command cxxAdvGeom.viewScript $madvg add separator $madvg add cascade -label "Multi-Slab ..." -menu $madvg.3 # UNDO/REDO set undoAdvGeom(menu) $madvg $madvg entryconfig "Undo ..." -state disabled $madvg entryconfig "Redo ..." -state disabled set undoMenu(undo) [menu $madvg.undo -tearoff 0] set undoMenu(redo) [menu $madvg.redo -tearoff 0] bind $undoMenu(undo) [list UndoMenuMotion $undoMenu(undo) @%y] bind $undoMenu(redo) [list UndoMenuMotion $undoMenu(redo) @%y] set madvg1 [menu $madvg.1 -tearoff 0] $madvg1 add command -label "Substitute Atom" -command AtomSubs $madvg1 add command -label "Remove Atom" -command AtomRemo $madvg1 add command -label "Insert Atom" -command AtomInse $madvg1 add command -label "Displace Atom" -command AtomDisp $madvg1 add separator $madvg1 add command -label "SuperCell" -command SuperCell $madvg1 add command -label "Elastic Deformation" -command Elastic set madvg2 [menu $madvg.2 -tearoff 0] $madvg2 add command -label "Cut a Cluster" -command CutCluster $madvg2 add command -label "Cut a Molecule" -command CutMol $madvg2 entryconfig "Cut a Molecule" -state disabled set madvg3 [menu $madvg.3 -tearoff 0] $madvg3 add command -label "Create a Multi-Slab" -command wnMultiSlab $madvg3 add command -label "Change Multi-Slab Vacuum Thickness" \ -command [list wnMultiSlab change] #------------------------------------------------------------------------ # PROPERTIES MENU #------------------------------------------------------------------------ $mpro add command -label "Get INFO" \ -command [list PropC95Cmd INFO] $mpro add command -label "Display Bandwidths" \ -command [list PropC95Cmd BWID] $mpro add command -label "Density of States" \ -command [list PropC95Cmd DOSS] $mpro add command -label "Band Structure" \ -command [list PropC95Cmd BAND] $mpro add separator $mpro add cascade -label "Isosurfaces ..." -menu $mpro.1 $mpro add cascade -label "Properties on Planes ..." -menu $mpro.2 #$mpro add cascade -label "Properties on Surfaces ..." -menu $mpro.3 ########################### #### THIS IS TEMPORAL #### ########################### #$mpro add separator #$mpro add command -label "Charge Density Maps" \ # -command [list Iso3DInit ECHD "Charge Density Maps" ECHD \ # "Charge Density Maps" 5] #$mpro add command -label "Charge Density Gradient" \ # -command [list Iso3DInit ECHG "Charge Density Gradient" ECHG \ # "Charge Density Gradient" 5] #$mpro add command -label "Charge Density Plane" \ # -command [list Iso3DInit ECHP "Charge Density Plane" ECHP \ # "Charge Density Plane" 5] #$mpro add command -label "Electrostatic potential map" \ # -command [list Iso3DInit POTM "Electrostatic potential map" POTM \ # "Electrostatic potential map" 5] ############################ ############################## # ISOSURFACES set mpro1 [menu $mpro.1 -tearoff 0] $mpro1 add command -label "Charge Density" \ -command [list SetIsoGridSpace \ "Charge Density 3D Map - Grid Specification" "Grid" {ECHG\n0}] $mpro1 add command -label "Electrostatic Potential" \ -command [list SetIsoGridSpace \ "Electrostatic Potential 3D Map - Grid Specification" "Grid" POTM] $mpro1 add separator $mpro1 add command -label "Difference Maps" -command DiffIsoSurf_Widget ############################## # PROPERTIES ON PLANES set mpro2 [menu $mpro.2 -tearoff 0] $mpro2 add command -label "Charge Density" \ -command [list SetIsoGridSpace \ "Charge Density 2D Map - Grid Specification" "Grid" {ECHG\n0} 2D] $mpro2 add command -label "Electrostatic Potential" \ -command [list SetIsoGridSpace \ "Electrostatic Potential 2D Map - Grid Specification" "Grid" \ POTM 2D] $mpro2 add separator $mpro2 add command -label "Difference Maps" \ -command [list DiffIsoSurf_Widget 2D] ############################## # PROPERTIES ON SURFACES set mpro3 [menu $mpro.3 -tearoff 0] #------------------------------------------------------------------------ # TOOLS MENU #------------------------------------------------------------------------ $mdat add command -label "Color Scheme" -command ColorScheme $mdat add command -label "Data Grid" -command DataGrid $mdat add command -label "k-path Selection" -command kPath $mdat add command -label "Movie Maker" -command [list MovieMaker $can] $mdat add separator $mdat add command -label "Periodic Table of Elements" -command [list ptable .] #------------------------------------------------------------------------ # HELP MENU #------------------------------------------------------------------------ $mhelp add command -label "About" -command xcAbout } proc OpenXYZPDB {can {format xyz} {file {}}} { global fileselect mode2D mode3D light xcMisc species system if { $file == {} } { set dir $system(PWD) } elseif { [file isdirectory $file] } { set dir $file set file {} } else { set dir $system(PWD) } if { $species == {} } { set species structure } if { $file == {} } { set title "Open [string toupper $format] File" set filetypes { { {XSF File (XCrySDen Structure File)} {.xsf} } { {XYZ File} {.xyz} } { {PDB File} {.pdb} } { {All Files} * } } if { $format == "xyz" } { set filetypes { { {XYZ File} {.xyz} } { {PDB File} {.pdb} } { {XSF File (XCrySDen Structure File)} {.xsf} } { {All Files} * } } } elseif { $format == "pdb" } { set filetypes { { {PDB File} {.pdb} } { {XYZ File} {.xyz} } { {XSF File (XCrySDen Structure File)} {.xsf} } { {All Files} * } } } set file [tk_getOpenFile -defaultextension .$format \ -filetypes $filetypes \ -initialdir $dir \ -title $title] if { $file == "" } { return } } if { ![file exists $file] } { tk_dialog .update \ "WARNING !!!" "WARNING: File \"$file\" does not exist !!!" \ warning 0 OK return } reloadRegister $file PDB set file [gunzipXSF $file] ResetDispModes if { [catch {xc_openstr $format $file $can PL}] } { tk_dialog [WidgetName] ERROR \ "ERROR: An Error occured, while reading file $file" error 0 OK CloseCase return } Get_sInfoArray DisplayDefaultMode # append 'render' to XCState(state) if "render" is not defines yet xcAppendState render xcUpdateState # # now update the title of the program # set xcMisc(titlefile) $file wm title . "XCrySDen: [file tail $file]" # the following copy is used if someone wants to save the structure into the file file copy -force $file [file join $system(SCRDIR) xc_struc.$system(PID)] return } proc OpenXSFStruct {can {file {}}} { global fileselect mode2D mode3D light xcMisc species system if { $species == {} } { set species structure } set update_title 0 if { $file == "" } { set update_title 1 #fileselect "Open Structure" set fileselect(path) [tk_getOpenFile -defaultextension .xsf \ -filetypes { {{All Files} {.*} } {{XSF Files} {.xsf}} {{GZipped XSF Files} {.xsf.gz}} {{Animated XSF Files} {.axsf}} {{GZipped Animated XSF Files} {.axsf.gz}} } -initialdir $system(PWD) -title "Open XSF Structure"] if { $fileselect(path) != "" } { set file $fileselect(path) } else { puts stderr "WARNING:: \fileselect(path) = \"\"" flush stderr return } } if ![file exists $file] { tk_dialog .update \ "WARNING !!!" "WARNING: File \"$file\" does not exist !!!" \ warning 0 OK return } set file [gunzipXSF $file] ResetDispModes if [catch {xc_openstr xcr $file $can PL}] { tk_dialog [WidgetName] ERROR \ "ERROR: An Error occured, while reading file $file" error 0 OK CloseCase return } Get_sInfoArray DisplayDefaultMode # append 'render' to XCState(state) if "render" is not defines yet xcAppendState render xcUpdateState CrysFrames # # now update the title of the program # (only if it does not yet contain the filename in the title) # #if { [string first : [wm title .]] == -1 } { # wm title . "XCrySDen: [file tail $file]" #} # update the title of the program if $update_title if { $update_title } { set xcMisc(titlefile) $file wm title . "XCrySDen: [file tail $file]" # the following copy is used if someone wants to save file as # WIEN2k STRUCT FILE file copy -force $file $system(SCRDIR)/xc_struc.$system(PID) } return } proc UpdateStruct {can file {fmt xsf}} { global colSh select system # # first check if we are in selection mode # if { [info exists select(selection_mode)] } { if { $select(selection_mode) } { tk_dialog [WidgetName] "WARNING !!!" "WARNING: structure can not be updated while in selection mode. First exit from selection mode, then repeat operation" warning 0 OK return } } if { ![file exists $file] } { tk_dialog .update \ "WARNING !!!" "WARNING: File \"$file\" does not exist !!!" \ warning 0 OK return } if { [catch {xc_updatestr $file $can $fmt} errMsg] } { ErrorDialog "an error occured while trying to update a structure; Error reading file $file\nError Message: $errMsg" #InitGlobalVar #ResetDispModes #DisplayDefaultMode #xcUpdateState #wm title . "XCrySDen" #set xcMisc(titlefile) {} #array set check {crds 0 labels 0 frames 0 wigner 0} #array set radio {cellmode prim} return 0 } # save $file to xc_struc.$system(PID) so that SaveXSFStruct will work file copy -force $file $system(SCRDIR)/xc_struc.$system(PID) # there is a bug associated with crystal-frames in xcrys interpreter; # this is to recover from the bug CrysFrames if { [info exists colSh] } { if { $colSh(scheme) != "atomic" } { # # update colorscheme # ColorSchemeUpdate .mesa } } return 1 } proc SaveXSFStruct {{sfile {}}} { global system xcMisc # this option (SaveXSFStruct is possible only if structure is opened, that # means that render is active if { ![xcIsActive render] } { return } if { $sfile == "" } { set filetypes { {{XCrySDen Structure File} {.xsf} } {{All Files} * } } set sfile [tk_getSaveFile -initialdir $system(PWD) \ -title "Save Structure in XSF Format" \ -defaultextension .xsf \ -filetypes $filetypes] # maybe Cancel button was pressed if { $sfile == {} } { return } } file copy -force $system(SCRDIR)/xc_struc.$system(PID) $sfile # update the title of the program wm title . "XCrySDen: [file tail $sfile]" set xcMisc(titlefile) $sfile } proc SaveCrystalInput {} { global system xcMisc # this option (SaveCrystalInput is posible only if # XCState == c95_openinput || XCState == c95_newinput if ![xcIsActive c95] { return } else { if { ![xcIsActive newinput] && ![xcIsActive openinput] } { return } } set sfile [tk_getSaveFile -initialdir $system(PWD) \ -title "Save Crystal Input"] # maybe Cancel button was pressed if { $sfile == {} } { return } set geoInput [MakeInput] set fileID [open $sfile w] puts $fileID $geoInput flush $fileID close $fileID # update the title of the program wm title . "XCrySDen: [file tail $sfile]" set xcMisc(titlefile) $sfile return } # this proc communicate with gengeom program proc CellMode {{update {0}}} { global nxdir nydir nzdir system radio geng periodic geng if { $periodic(dim) == 0 } { GenGeom $geng(M1_PRIM) 1 $geng(M3_ARGUMENT) 1 1 1 1 $system(SCRDIR)/xc_struc.$system(PID) if { $update } { puts stderr "UpdateStruct .mesa $system(SCRDIR)/xc_struc.$system(PID)" UpdateStruct .mesa $system(SCRDIR)/xc_struc.$system(PID) } return } # usage of "gengeom" program: # # gengeom MODE1 MODE2 MODE3 IGRP NXDIR NYDIR NZDIR OUTPUT INPUT # 0 1 2 3 4 5 6 7 8 9 # # MODE1 .... radio(cellmode), radio(hexamode) # MODE2 .... radio(unitrep) # MODE3 .... still free ######################################## # CD TO $system(SCRDIR) cd $system(SCRDIR) ######################################## puts stdout "cellmode, hexamode, unitrep:: \ $radio(cellmode) $radio(hexamode) $radio(unitrep)" puts stdout "igroup:: $periodic(igroup)" flush stdout # if igroup < 7 disable Hexagonal/Rhomohedral entry, else enable # if igroup == 7 and "prim" -> omly parapipedal shape is possible xcHexaRhomboEntryState if { $radio(unitrep) == "cell"} { set MODE2 $geng(M2_CELL) } elseif { $radio(unitrep) == "asym"} { # radio(hexamode) must be set to parapipedal set radio(hexamode) "parapipedal" # we should disable all hexagonal-shaped menus !!!!! puts stdout "TTT_L" flush stdout .menu.vmdis.menu entryconfig "Hexagonal/Rhombohedral ..." \ -state disabled set MODE2 $geng(M2_TR_ASYM_UNIT) } set MODE3 $geng(M3_ARGUMENT) puts stdout "$geng(M1_PRIM) $MODE2 $MODE3" puts stdout "igroup>> $periodic(igroup)" if { $radio(cellmode) == "prim" } { if { $periodic(igroup) < 8 } { GenGeom $geng(M1_PRIM) $MODE2 $MODE3 $periodic(igroup) \ $nxdir $nydir $nzdir $system(SCRDIR)/xc_struc.$system(PID) } if { $periodic(dim) == 3 && $periodic(igroup) >= 8 } { if { $radio(hexamode) == "parapipedal" } { GenGeom $geng(M1_PRIM) $MODE2 $MODE3 $periodic(igroup) \ $nxdir $nydir $nzdir \ $system(SCRDIR)/xc_struc.$system(PID) } elseif { $radio(hexamode) == "hexagonal" && \ $radio(unitrep) == "cell" } { GenGeom $geng(M1_PRIM3) $MODE2 $MODE3 $periodic(igroup) \ $nxdir $nydir $nzdir \ $system(SCRDIR)/xc_struc.$system(PID) } else { puts stdout "exec $system(BINDIR)/gengeom \ $geng(M1_PRIM) $MODE2 $MODE3 \ $periodic(igroup) \ $nxdir $nydir $nzdir \ $system(SCRDIR)/xc_struc.$system(PID)" # this is hexagonal & tr_asym_unit -> that's not allowed tk_dialog .diag "Error" \ "Error in program; Please report to author!!!\n\ Code: CellMode hexagonal & tr_asym_unit" \ error 0 OK return } } } elseif { $radio(cellmode) == "conv" } { # dim must be 3 if { $periodic(dim) < 3 } { # # conventional cell mode is supported only for CRYSTALs. # Revert to PRIMITIVE cell mode !!! set radio(cellmode) prim CellMode 1 return } if { $periodic(igroup) < 7 || $radio(hexamode) == "parapipedal" } { # just parapipedal shaped cells GenGeom $geng(M1_CONV) $MODE2 $MODE3 $periodic(igroup) \ $nxdir $nydir $nzdir \ $system(SCRDIR)/xc_struc.$system(PID) } elseif { $radio(hexamode) == "hexagonal" } { GenGeom $geng(M1_HEXA_SHAPE) $MODE2 $MODE3 $periodic(igroup) \ $nxdir $nydir $nzdir \ $system(SCRDIR)/xc_struc.$system(PID) } else { tk_dialog .diag "Error" \ "Error in program; Please report to author!!!\n\ Code: CellMode conv & shape" \ error 0 OK return } } if { $update } { UpdateStruct .mesa $system(SCRDIR)/xc_struc.$system(PID) } } # proc check the group and enable/disable Hexagonal/Rhombohedral entry in # Display menu proc xcHexaRhomboEntryState {} { global periodic radio xcDebug "xcHexaRhomboEntryState: igroup == $periodic(igroup)" if { $periodic(igroup) < 7 } { .menu.vmdis.menu entryconfig "Hexagonal/Rhombohedral ..." \ -state disabled } else { .menu.vmdis.menu entryconfig "Hexagonal/Rhombohedral ..." \ -state normal # # t.k.: this is temporal global xcMisc if ![info exists xcMisc(0.2.x_hexa/rhombo_debug)] { .menu.vmdis.menu entryconfig "Hexagonal/Rhombohedral ..." \ -state disabled } } if { $periodic(igroup) == 7 } { if { $radio(cellmode) == "prim" } { .menu.vmdis.menu.1 entryconfig 2 -state disabled } elseif { $radio(cellmode) == "conv" } { .menu.vmdis.menu.1 entryconfig 2 -state normal # # t.k.: this is temporal global xcMisc if ![info exists xcMisc(0.2.x_hexa/rhombo_debug)] { .menu.vmdis.menu entryconfig "Hexagonal/Rhombohedral ..." \ -state disabled } } } } # constants for xc_getdefault, xc_newvalue, xc_resetvar proc ModConst {} { global mody #WARNING: this definitions here must be identical to definitions in # "struct.h" #this definitions here are used for xc_resetvar set mody(R_ATRAD) 0 set mody(R_RCOV) 10000 set mody(R_RBALL) 1 set mody(R_RROD) 2 set mody(R_ATCOL) 3 set mody(R_WFLINEWIDTH) 4 set mody(R_WF3DLINEWIDTH) 10004 set mody(R_OUTLINEWIDTH) 10005 set mody(R_PLLINEWIDTH) 5 set mody(R_PLRADIUS) 6 set mody(R_SCRF) 7 set mody(R_ALL) 8 set mody(R_FRAMECOL) 9 set mody(R_FRAMELINEWIDTH) 10 set mody(R_FRAMERODF) 11 set mody(R_BACKGROUND) 23 set mody(R_TESSELLATION) 24 set mody(R_UNIBOND) 25 set mody(R_UNIBONDCOLOR) 26 set mody(R_PERSPECTIVE) 27 set mody(R_PERSPECTIVEBACK) 28 set mody(R_PERSPECTIVEFOVY) 29 set mody(R_PERSPECTIVEFRONT) 10029 set mody(R_FOG) 30 set mody(R_ANTIALIAS) 31 set mody(R_AMBIENT_BY_DIFFUSE) 32 set mody(R_CURRENTFILEFORMAT) 33 set mody(R_HBOND) 34 set mody(R_FORCE_RODTHICKF) 35 set mody(R_FORCE_ARRTHICKF) 36 set mody(R_FORCE_ARRLENF) 37 set mody(R_FORCE_COLOR) 38 set mody(R_XYZ_AXIS_COLOR) 39 set mody(R_XYZ_XYPLANE_COLOR) 40 #this definitions here are used for xc_newvalue ?values ....? set mody(L_SPACE_COV) 0 set mody(L_SPACE_VDW) 1 set mody(L_BALL_COV) 2 set mody(L_BALL_VDW) 3 set mody(L_RCOV_ONE) 10004 set mody(L_ATRAD_ONE) 4 set mody(L_ATRAD_SCALE) 5 set mody(L_BALLF) 6 set mody(L_RODF) 7 set mody(L_ATCOL_ONE) 8 set mody(L_WFLINEWIDTH) 9 set mody(L_WF3DLINEWIDTH) 10009 set mody(L_OUTLINEWIDTH) 10010 set mody(L_PLLINEWIDTH) 10 set mody(L_PLRADIUS) 11 set mody(L_SCRF) 12 set mody(L_COV_SCALE) 13 set mody(L_XYZ_ON) 14 set mody(L_LABELS_ON) 15 set mody(L_FRAME_ON) 16 set mody(L_FRAMECOL) 17 set mody(L_FRAMELINEWIDTH) 18 set mody(L_FRAMERODF) 19 set mody(L_LINEFRAME) 20 set mody(L_TR_XTRANSL) 21 set mody(L_TR_YTRANSL) 22 set mody(L_BACKGROUND) 23 set mody(L_TESSELLATION) 24 set mody(L_UNIBOND) 25 set mody(L_UNIBONDCOLOR) 26 set mody(L_PERSPECTIVE) 27 set mody(L_PERSPECTIVEBACK) 28 set mody(L_PERSPECTIVEFOVY) 29 set mody(L_PERSPECTIVEFRONT) 10029 set mody(L_FOG) 30 set mody(L_ANTIALIAS) 31 set mody(L_AMBIENT_BY_DIFFUSE) 32 set mody(L_CURRENTFILEFORMAT) 33 set mody(L_HBOND) 34 set mody(L_FORCE_RODTHICKF) 35 set mody(L_FORCE_ARRTHICKF) 36 set mody(L_FORCE_ARRLENF) 37 set mody(L_FORCE_COLOR) 38 set mody(L_XYZ_AXIS_COLOR) 39 set mody(L_XYZ_XYPLANE_COLOR) 40 # this definitions here are used for xc_getdefault set mody(D_SCRF) 0 set mody(D_BALLF) 1 set mody(D_RODF) 2 set mody(D_COVF) 3 set mody(D_ALL) 4 set mody(D_WFLINEWIDTH) 5 set mody(D_WF3DLINEWIDTH) 10005 set mody(D_OUTLINEWIDTH) 10006 set mody(D_PLLINEWIDTH) 6 set mody(D_PLRADIUS) 7 set mody(D_ATCOL_ONE) 8 set mody(D_ATRAD_SCALE) 9 set mody(D_ATRAD_ONE) 10 set mody(D_RCOV_ONE) 10004 set mody(D_FRAMECOL) 11 set mody(D_FRAMELINEWIDTH) 12 set mody(D_FRAMERODF) 13 set mody(D_MAXSTRUCTSIZE) 14 set mody(D_BACKGROUND) 23 set mody(D_TESSELLATION) 24 set mody(D_UNIBOND) 25 set mody(D_UNIBONDCOLOR) 26 set mody(D_PERSPECTIVE) 27 set mody(D_PERSPECTIVEBACK) 28 set mody(D_PERSPECTIVEFOVY) 29 set mody(D_PERSPECTIVEFRONT) 10029 set mody(D_FOG) 30 set mody(D_ANTIALIAS) 31 set mody(D_AMBIENT_BY_DIFFUSE) 32 set mody(D_CURRENTFILEFORMAT) 33 set mody(D_HBOND) 34 set mody(D_FORCE_RODTHICKF) 35 set mody(D_FORCE_ARRTHICKF) 36 set mody(D_FORCE_ARRLENF) 37 set mody(D_FORCE_COLOR) 38 set mody(D_XYZ_AXIS_COLOR) 39 set mody(D_XYZ_XYPLANE_COLOR) 40 # this definitions are used fot xc_getvalue set mody(GET_NATOMS) 100 set mody(GET_NAT) 101 set mody(GET_SS_MINX) 115 set mody(GET_SS_MINY) 116 set mody(GET_SS_MINZ) 117 set mody(GET_SS_MAXX) 118 set mody(GET_SS_MAXY) 119 set mody(GET_SS_MAXZ) 120 set mody(GET_AT_MINX) 10115 set mody(GET_AT_MINY) 10116 set mody(GET_AT_MINZ) 10117 set mody(GET_AT_MAXX) 10118 set mody(GET_AT_MAXY) 10119 set mody(GET_AT_MAXZ) 10120 set mody(GET_ATOMLABEL_LABEL) 121 set mody(GET_ATOMLABEL_BRIGHTCOLOR) 122 set mody(GET_ATOMLABEL_DARKCOLOR) 123 set mody(GET_ATOMLABEL_DO_DISPLAY) 124 set mody(GET_ATOMLABEL_ALL_ID) 125 set mody(GET_GLOBALATOMLABEL_BRIGHTCOLOR) 126 set mody(GET_GLOBALATOMLABEL_DARKCOLOR) 127 set mody(GET_GLOBALATOMLABEL_DO_DISPLAY) 128 set mody(GET_FOG_COLORMODE) 130 set mody(GET_FOG_COLOR) 131 set mody(GET_FOG_MODE) 132 set mody(GET_FOG_DENSITY) 133 set mody(GET_FOG_ORT_START_F) 134 set mody(GET_FOG_ORT_END_F) 135 set mody(GET_FOG_PERSP_F1) 136 set mody(GET_FOG_PERSP_F2) 137 set mody(GET_ATOMLABEL_LABEL) 121 set mody(GET_ATOMLABEL_BRIGHTCOLOR) 122 set mody(GET_ATOMLABEL_DARKCOLOR) 123 set mody(SET_ATOMLABEL_DO_DISPLAY) 200 set mody(SET_GLOBALATOMLABEL_DO_DISPLAY) 201 set mody(SET_DO_NOT_DISPLAY_ATOMLABEL) 202 set mody(GET_ANTIALIAS_DEGREE) 140 set mody(GET_ANTIALIAS_OFFSET) 141 set mody(GET_ALAT) 150 set mody(SET_FOG_COLORMODE) 210 set mody(SET_FOG_COLOR) 211 set mody(SET_FOG_MODE) 212 set mody(SET_FOG_DENSITY) 213 set mody(SET_FOG_ORT_START_F) 214 set mody(SET_FOG_ORT_END_F) 215 set mody(SET_FOG_PERSP_F1) 216 set mody(SET_FOG_PERSP_F2) 217 set mody(SET_ANTIALIAS_DEGREE) 220 set mody(SET_ANTIALIAS_OFFSET) 221 } proc ModFactor { fac l_const d_const {text {}} } { upvar #0 $fac fact global fact mody if { $text == "" } { set text "$fac Factor" } set top .factor # just in case in window already exists if { [winfo exists $top] } { return } xcToplevel $top $text $text . 0 0 1 #grab $top # place $top according to "." xcPlace . $top 100 50 set f [frame $top.f -relief raised -bd 2] set f2 [frame $top.f2 -relief raised -bd 2] pack $f $f2 -side top -expand 1 -fill both -ipadx 10 -ipady 10 # TOP FRAME puts stdout "GET VALUE:: [xc_getvalue $mody($d_const)]" set fact(f) [xc_getvalue $mody($d_const)] Entries $f [list "$text:"] fact(f) 8 0 bind $f.frame.entry1 [list ModFacFOK $top fact $l_const] set b1 [button $f.frame.b1 -text "Default" \ -command [list ModFacDef fact $d_const]] pack $b1 -side left -side left -padx 5 -pady 5 -expand 1 focus $f.frame.entry1 # BOTTOM FRAME set clear [button $f2.cl -text "Clear" -command [list ModFacClear fact $f.frame.entry1] ] set update [button $f2.upd -text "Update" -command [list ModFacFOK $top fact $l_const update] ] set ok [button $f2.ok -text "Close" -command [list ModFacFOK $top fact $l_const] ] bind $ok [list ModFacFOK $top fact $l_const] pack $clear $update $ok -expand 1 -side left -padx 5 } proc ModFacFOK {top fac l_const {update ""}} { upvar #0 $fac fact global mody xc_newvalue .mesa $mody($l_const) $fact(f) if { $update == "" } { if { [winfo exists $top] } { #grab release $top destroy $top } } return } proc ModFacDef {fac d_const} { upvar #0 $fac fact global mody puts stdout "d_const:: $d_const" flush stdout set fact(f) [xc_getdefault $mody($d_const)] puts stdout "set fact(f) [xc_getdefault $mody($d_const)]" return } proc ModFacClear {fac w} { upvar #0 $fac fact global fact set fact(f) "" focus $w return } proc CrdSist {} { global mody check xc_newvalue .mesa $mody(L_XYZ_ON) $check(crds) } proc AtomLabels {} { global mody check xc_newvalue .mesa $mody(L_LABELS_ON) $check(labels) } proc CrysFrames {} { global mody check periodic if { $periodic(dim) == 0 } { set check(frames) 0 return } DispFramesAs xc_newvalue .mesa $mody(L_FRAME_ON) $check(frames) } proc Unibond {} { global mody check xc_newvalue .mesa $mody(L_UNIBOND) $check(unibond) } proc DispFramesAs {} { global mody check radio # if crystal frames are not taken On, return if { $mody(L_FRAME_ON) == 0 } { return } # also if we are in 2D mode return !!!!!!!!!! # OK, proceed switch -glob -- $radio(frames) { line* { xc_newvalue .mesa $mody(L_LINEFRAME) 1 } rod* { xc_newvalue .mesa $mody(L_LINEFRAME) 0 } } } # this proc is for modifying crystal cell's color proc ModCellCol {} { global mody cellcol set top .cellcol # just in case in window already exists if { [winfo exists $top] } { return } toplevel $top wm title $top "Crystal Cell's Color" wm iconname $top "Crystal Cell's Color" #grab $top # place $top according to "." xcPlace . $top 100 50 # there will be three frames left, right and bottom set t [frame $top.t -relief raised -bd 2] set b [frame $top.b -relief raised -bd 2] pack $b -side bottom -padx 0 -pady 0 -ipadx 0 -ipady 0 \ -fill both -expand 1 pack $t -side top -padx 0 -pady 0 -ipadx 0 -ipady 0 \ -fill both -expand 1 # TOP-FRAME --- TOP-FRAME # before we select any atom from above Listbox, a default will be H set color [xc_getvalue $mody(D_FRAMECOL)] set cellcol(red) [lindex $color 0] set cellcol(green) [lindex $color 1] set cellcol(blue) [lindex $color 2] set cellcol(hxred) [ d2h [expr int($cellcol(red) * 255)] ] set cellcol(hxgreen) [ d2h [expr int($cellcol(green) * 255)] ] set cellcol(hxblue) [ d2h [expr int($cellcol(blue) * 255)] ] set fr [frame $t.1 -relief sunken -bd 2] set col [frame $fr.col -bd 0 \ -bg "#$cellcol(hxred)$cellcol(hxgreen)$cellcol(hxblue)" \ -width 100 -height 100] scale $t.red -from 0 -to 1 -length 100 -variable cellcol(red) \ -orient horizontal -label "Red:" -tickinterval 1.0 \ -digits 3 -resolution 0.01 -showvalue true -width 10 \ -command CellColor scale $t.green -from 0 -to 1 -length 100 \ -variable cellcol(green) \ -orient horizontal -label "Green:" -tickinterval 0.5 \ -digits 3 -resolution 0.01 -showvalue true -width 10 \ -command CellColor scale $t.blue -from 0 -to 1 -length 100 \ -variable cellcol(blue) \ -orient horizontal -label "Blue:" -tickinterval 0.5 \ -digits 3 -resolution 0.01 -showvalue true -width 10 \ -command CellColor pack $fr -side top -fill both -expand 1 -padx 30 -pady 15 -ipadx 0 -ipady 0 pack $col -side top -fill both -expand 1 -padx 0 -pady 0 pack $t.red $t.green $t.blue -side top -fill both -expand 1 \ -ipadx 0 -ipady 0 -pady 0 # BOTTOM FRAME --- BOTTOM FRAME # OK, Default & Cancel Button set col [button $b.upd -text "Update Color" -width 9 \ -command CellColUpD] set def [button $b.def -text "Default Color" -width 10 \ -command [list CellColLoad default]] set clo [button $b.clo -text "Close" -command [list CellColOK $top] -width 3] pack $col $def $clo -side left -expand 1 -pady 7 -padx 2 return } proc CellColor { {trash {}} } { global cellcol set cellcol(hxred) [ d2h [expr int($cellcol(red) * 255)] ] set cellcol(hxgreen) [ d2h [expr int($cellcol(green) * 255)] ] set cellcol(hxblue) [ d2h [expr int($cellcol(blue) * 255)] ] .cellcol.t.1.col configure \ -bg "#$cellcol(hxred)$cellcol(hxgreen)$cellcol(hxblue)" } proc CellColLoad { {type {}} } { global mody cellcol if { $type == "default"} { set color [xc_getdefault $mody(D_FRAMECOL)] } else { puts stdout "GETVALUE::" set color [xc_getvalue $mody(D_FRAMECOL)] } set cellcol(red) [lindex $color 0] set cellcol(green) [lindex $color 1] set cellcol(blue) [lindex $color 2] CellColor } proc CellColOK {top} { global cellcol if { [winfo exists $top] } { #grab release $top destroy $top } return } proc CellColUpD {} { global mody cellcol # puts stdout "xc_newvalue .mesa $mody(L_ATCOL_ONE) $atcol(nat) \ # $atcol(red) $atcol(green) $atcol(blue)" # flush stdout xc_newvalue .mesa $mody(L_FRAMECOL) \ $cellcol(red) $cellcol(green) $cellcol(blue) return } proc ModUnibondCol {} { global mody set top .unibondcol if [winfo exists $top] { return } set con [xcUpdateWindow \ -name $top \ -title "Unibond Color" \ -cancelcom [list ModUnibondCol_Cancel $top] \ -updatecom ModUnibondCol_Update \ -closecom [list ModUnibondCol_Close $top]] set hxcol [rgb_f2h [xc_getvalue $mody(D_UNIBONDCOLOR)]] xcModifyColor $con "Unibond Color" \ $hxcol groove left left 100 100 70 5 20 } proc ModUnibondCol_Update {} { global mody mody_col set cID [xcModifyColorGetID] xc_newvalue .mesa $mody(L_UNIBONDCOLOR) \ $mody_col($cID,red) $mody_col($cID,green) $mody_col($cID,blue) 1.0 } proc ModUnibondCol_Close {top} { ModUnibondCol_Update ModUnibondCol_Cancel $top } proc ModUnibondCol_Cancel {top} { destroy $top } proc ModXYZCol {} { global mody xyz set top .xyz if { [winfo exists $top] } { return } set con [xcUpdateWindow \ -name $top \ -title "Coordinate System Color" \ -cancelcom [list ModXYZCol_Cancel $top] \ -updatecom ModXYZCol_Update \ -closecom [list ModXYZCol_Close $top]] set f1 [frame $con.1] set f2 [frame $con.2] pack $f1 $f2 -side left -padx 3m -pady 3m set axis_hxcol [rgb_f2h [xc_getvalue $mody(D_XYZ_AXIS_COLOR)]] set xyplane_hxcol [rgb_f2h [xc_getvalue $mody(D_XYZ_XYPLANE_COLOR)]] xcModifyColor $f1 "Axis Color" \ $axis_hxcol groove left left 100 100 70 5 20 set xyz(axisID) [xcModifyColorGetID] xcModifyColor $f2 "XY-Plane Color" \ $xyplane_hxcol groove left left 100 100 70 5 20 set xyz(xyplaneID) [xcModifyColorGetID] } proc ModXYZCol_Update {} { global mody mody_col xyz set cID $xyz(axisID) xc_newvalue .mesa $mody(L_XYZ_AXIS_COLOR) \ $mody_col($cID,red) $mody_col($cID,green) $mody_col($cID,blue) 1.0 set cID $xyz(xyplaneID) xc_newvalue .mesa $mody(L_XYZ_XYPLANE_COLOR) \ $mody_col($cID,red) $mody_col($cID,green) $mody_col($cID,blue) 1.0 } proc ModXYZCol_Close {top} { ModXYZCol_Update ModXYZCol_Cancel $top } proc ModXYZCol_Cancel {top} { destroy $top } proc CloseCase {} { global xcMisc radio check system # # it is much saver to start new XCRYSDEN application, then # to do a complete clean-up, since the is a great danger that something is # still left # cd $system(PWD) global env tcl_platform exec sh $system(TOPDIR)/xcrysden --quiet & update after idle { exit_pr 1 } } proc xcMesaChangeBg mesa { global radio radio mesa_bg if ![info exists mesa_bg($mesa,last)] { set mesa_bg($mesa,last) $mesa_bg(default) } switch -exact -- $radio($mesa,bg) { black {set col $mesa_bg(black)} white {set col $mesa_bg(white)} red {set col $mesa_bg(red)} green {set col $mesa_bg(green)} blue {set col $mesa_bg(blue)} darkcyan {set col $mesa_bg(darkcyan)} Default {set col $mesa_bg(default)} default {set col $mesa_bg($mesa,last)} } set c1 [d2h [expr [lindex $col 0] * 255]] set c2 [d2h [expr [lindex $col 1] * 255]] set c3 [d2h [expr [lindex $col 2] * 255]] xcDebug #${c1}${c2}${c3} set t [xcToplevel [WidgetName] "Set Canvas Background" "SetBg" . 0 0 1] xcModifyColor $t "Set Canvas Background" #${c1}${c2}${c3} groove \ left left 100 100 70 5 20 proc xcMesaChangeBgOK {type t mesa} { global mody_col mody radio mesa_bg if { $type == "OK" } { set cID [xcModifyColorGetID] set mesa_bg($mesa,last) [list $mody_col($cID,red) \ $mody_col($cID,green) $mody_col($cID,blue) 1.0] xc_newvalue $mesa $mody(L_BACKGROUND) \ $mody_col($cID,red) $mody_col($cID,green) \ $mody_col($cID,blue) 1.0 set radio($mesa,bg) [rgb_f2h [list $mody_col($cID,red) \ $mody_col($cID,green) $mody_col($cID,blue)]] } destroy $t } set ok [DefaultButton [WidgetName $t] -text "OK" \ -command [list xcMesaChangeBgOK OK $t $mesa]] set can [button [WidgetName $t] -text "Cancel" \ -command [list xcMesaChangeBgOK Cancel $t $mesa]] pack $ok $can -padx 10 -pady 10 -expand 1 } proc Perspective {} { global mody check select if { [info exists select(selection_mode)] } { if { $select(selection_mode) } { return } } SetWatchCursor # we zoom for perspective for 33%. This makes the picture to # appear almost the same size for ortho and perspective # projections if { $check(perspective) } { xc_translate .mesa +z 0.33 } else { xc_translate .mesa -z 0.33 } xc_newvalue .mesa $mody(L_PERSPECTIVE) $check(perspective) ResetCursor } #proc TogglePerspective {} { # global check # if { $check(perspective) } { # set check(perspective) 0 # Perspective # } else { # set check(perspective) 1 # Perspective # } #} proc DepthCuing {} { global mody check SetWatchCursor xc_newvalue .mesa $mody(L_FOG) $check(depthcuing) ResetCursor } proc AntiAlias {} { global mody check SetWatchCursor xc_newvalue .mesa $mody(L_ANTIALIAS) $check(antialias) ResetCursor } proc ToggleMenuCheckbutton {which args} { global check SetWatchCursor if { $check($which) } { set check($which) 0 eval $args } else { set check($which) 1 eval $args } ResetCursor } proc ToggleMenuRadiobutton {which value args} { global radio periodic if { $periodic(dim) > 0 } { set radio($which) $value SetWatchCursor eval $args ResetCursor } } proc ModPerspective {} { global mody persp set top .perspective if { [winfo exists $top] } { return } set con [xcUpdateWindow \ -name $top \ -title "Perspective Settings" \ -cancelcom [list ModPerspective_Cancel $top] \ -updatecom ModPerspective_Update \ -closecom [list ModPerspective_Close $top]] set f1 [frame $con.f1] set f2 [frame $con.f2] set f3 [frame $con.f3] pack $f1 $f2 $f3 -side top -fill both -expand 1 set persp(fovy) [xc_getvalue $mody(D_PERSPECTIVEFOVY)] set persp(front) [xc_getvalue $mody(D_PERSPECTIVEFRONT)] set persp(back) [xc_getvalue $mody(D_PERSPECTIVEBACK)] set near [button $f1.b -text Deafult -command { global persp mody set persp(fovy) [xc_getdefault $mody(D_PERSPECTIVEFOVY)] }] set size [button $f2.b -text Default -command { global persp mody set persp(front) [xc_getdefault $mody(D_PERSPECTIVEFRONT)] }] set far [button $f3.b -text Default -command { global persp mody set persp(back) [xc_getdefault $mody(D_PERSPECTIVEBACK)] }] pack $near $far $size -side right -padx 3 -expand 1 FillEntries $f1 {"Perspective fovy factor:"} persp(fovy) 24 8 FillEntries $f2 {"Perspective front factor:"} persp(front) 24 8 FillEntries $f3 {"Perspective back factor:"} persp(back) 24 8 } proc ModPerspective_Cancel {top} { destroy $top } proc ModPerspective_Update {} { global mody persp SetWatchCursor xc_newvalue .mesa $mody(L_PERSPECTIVEFOVY) $persp(fovy) xc_newvalue .mesa $mody(L_PERSPECTIVEBACK) $persp(back) xc_newvalue .mesa $mody(L_PERSPECTIVEFRONT) $persp(front) ResetCursor } proc ModPerspective_Close {top} { ModPerspective_Update ModPerspective_Cancel $top } proc scriptOpenMenu {{togl .mesa}} { global system set file [tk_getOpenFile -defaultextension .xcrysden \ -filetypes { {{All Files} {.*} } {{XCrySDen Scripting File} {.xcrysden}} {{XCrySDen Scripting File} {.tcl}} {{GZipped XCrySDen Scripting File} {.xcrysden.gz}} } \ -initialdir $system(PWD) \ -title "Open XCrySDen Scripting File"] if { $file == "" } { return } scripting::source $file } xcrysden-1.6.2/Tcl/isoControl.tcl0000644000175000017500000015552613522564340015456 0ustar tonetone############################################################################# # Author: # # ------ # # Anton Kokalj Email: Tone.Kokalj@ijs.si # # Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 # # Jozef Stefan Institute Fax: x 386 1 477 3811 # # Jamova 39, SI-1000 Ljubljana # # SLOVENIA # # # # Source: $XCRYSDEN_TOPDIR/Tcl/isoControl.tcl # ------ # # Copyright (c) 1996-2003 by Anton Kokalj # ############################################################################# proc IsoControl_InitVar {} { global isoControl prop isosurf #--- # default font for thermometer set def_font [font create] eval {font configure $def_font} [font actual fixed] font configure $def_font -size [expr int([font actual fixed -size] * 1.5)] #--- if { ![info exists isoControl(cpl_basis)] } { # this "if" is used in isoRender.tcl as an indication if # IsoControl_InitVar was already called set isoControl(cpl_basis) MONOCHROME } if { ![info exists isoControl(cpl_function)] } { set isoControl(cpl_function) LINEAR } if { ![info exists isoControl(colorplane)] } {set isoControl(colorplane) 0} if { ![info exists isoControl(isoline)] } {set isoControl(isoline) 0} if { ![info exists isoControl(colorplane_lighting)] } {set isoControl(colorplane_lighting) 0} if { ![info exists isoControl(cpl_transparency)] } {set isoControl(cpl_transparency) 0} if { ![info exists isoControl(cpl_thermometer)] } {set isoControl(cpl_thermometer) 0} if { ![info exists isoControl(cpl_thermoTplw)] } {set isoControl(cpl_thermoTplw) 0} if { ![info exists isoControl(cpl_thermoFmt)] } {set isoControl(cpl_thermoFmt) %+8.4f} if { ![info exists isoControl(cpl_thermoLabel)] } {set isoControl(cpl_thermoLabel) " Scale: [encoding convertfrom symbol D] n(r)"} if { ![info exists isoControl(cpl_thermoNTics)] } {set isoControl(cpl_thermoNTics) 6} if { ![info exists isoControl(cpl_thermoFont)] } {set isoControl(cpl_thermoFont) $def_font} if { ![info exists isosurf(2Dexpand)] } { set isosurf(2Dexpand) none } if { ![info exists isosurf(2Dexpand_X)] } { set isosurf(2Dexpand_X) 1 } if { ![info exists isosurf(2Dexpand_Y)] } { set isosurf(2Dexpand_Y) 1 } if { ![info exists isosurf(2Dexpand_Z)] } { set isosurf(2Dexpand_Z) 1 } if { ![info exists isosurf(tessellation_type)] } { set isosurf(tessellation_type) cubes } if { ![info exists isosurf(normals_type)] } { set isosurf(normals_type) gradient } if { ![info exists isoControl(anim_step)] } { set isoControl(anim_step) 1 } if { ![info exists isoControl(time_delay)] } { set isoControl(time_delay) 100 } if { ![info exists isoControl(cbfn_apply_to_all)] } { set isoControl(cbfn_apply_to_all) 0 } if { ![info exists isoControl(disp_apply_to_all)] } { set isoControl(disp_apply_to_all) 0 } if { ![info exists isoControl(anim_apply_to_all)] } { set isoControl(anim_apply_to_all) 0 } # # just in case # if { ![info exists isoControl(3Dinterpl_degree)] } { set isoControl(3Dinterpl_degree) 1 } set n $isoControl(3Dinterpl_degree) if { ![info exists isoControl(1,nslide)] } { set isoControl(1,nslide) \ [expr ([lindex [xc_iso grid] 2] - 1) * $n + 1] } if { ![info exists isoControl(2,nslide)] } { set isoControl(2,nslide) \ [expr ([lindex [xc_iso grid] 1] - 1) * $n + 1] } if { ![info exists isoControl(3,nslide)] } { set isoControl(3,nslide) \ [expr ([lindex [xc_iso grid] 0] - 1) * $n + 1] } if { ![info exists isoControl(current_slide)] } { set isoControl(current_slide) 1 set isoControl(current_text_slide) "Current slide: $isoControl(current_slide) / $isoControl(1,nslide)" } if { ![info exists isoControl(2Dlowvalue)] } { set isoControl(2Dlowvalue) $isosurf(minvalue) } if { ![info exists isoControl(2Dhighvalue)] } { set isoControl(2Dhighvalue) $isosurf(maxvalue) } if { ![info exists isoControl(2Dnisoline)] } { set isoControl(2Dnisoline) 15 } if { ![info exists isoControl(isoline_color)] } { set isoControl(isoline_color) monocolor } if { ![info exists isoControl(isoline_width)] } { set isoControl(isoline_width) 2 } if { ![info exists isoControl(isoline_monocolor)] } { set isoControl(isoline_monocolor) #000000 } if { ![info exists isoControl(isoline_stipple)] } { set isoControl(isoline_stipple) {no stipple} } foreach i {1 2 3} { if { ![info exists isoControl($i,cpl_basis)] } { set isoControl($i,cpl_basis) $isoControl(cpl_basis) } if { ![info exists isoControl($i,cpl_function)] } { set isoControl($i,cpl_function) $isoControl(cpl_function) } if { ![info exists isoControl($i,colorplane)] } { set isoControl($i,colorplane) $isoControl(colorplane) } if { ![info exists isoControl($i,isoline)] } { set isoControl($i,isoline) $isoControl(isoline) } if { ![info exists isoControl($i,colorplane_lighting)] } { set isoControl($i,colorplane_lighting) $isoControl(colorplane_lighting) } if { ![info exists isoControl($i,cpl_transparency)] } { set isoControl($i,cpl_transparency) $isoControl(cpl_transparency) } if { ![info exists isoControl($i,cpl_thermometer)] } { set isoControl($i,cpl_thermometer) $isoControl(cpl_thermometer) } if { ![info exists isoControl($i,cpl_thermoTplw)] } { set isoControl($i,cpl_thermoTplw) $isoControl(cpl_thermoTplw) } if { ![info exists isoControl($i,cpl_thermoFmt)] } { set isoControl($i,cpl_thermoFmt) $isoControl(cpl_thermoFmt) } if { ![info exists isoControl($i,cpl_thermoLabel)] } { set isoControl($i,cpl_thermoLabel) $isoControl(cpl_thermoLabel) } if { ![info exists isoControl($i,cpl_thermoNTics)] } { set isoControl($i,cpl_thermoNTics) $isoControl(cpl_thermoNTics) } if { ![info exists isoControl($i,cpl_thermoFont)] } { set isoControl($i,cpl_thermoFont) $isoControl(cpl_thermoFont) } if { ![info exists isosurf($i,2Dexpand)] } { set isosurf($i,2Dexpand) $isosurf(2Dexpand) } if { ![info exists isosurf($i,2Dexpand_X)] } { set isosurf($i,2Dexpand_X) $isosurf(2Dexpand_X) } if { ![info exists isosurf($i,2Dexpand_Y)] } { set isosurf($i,2Dexpand_Y) $isosurf(2Dexpand_Y) } if { ![info exists isosurf($i,2Dexpand_Z)] } { set isosurf($i,2Dexpand_Z) $isosurf(2Dexpand_Z) } if { ![info exists isoControl($i,anim_step)] } { set isoControl($i,anim_step) $isoControl(anim_step) } if { ![info exists isoControl($i,time_delay)] } { set isoControl($i,time_delay) $isoControl(time_delay) } if { ![info exists isoControl($i,current_slide)] } { set isoControl($i,current_slide) $isoControl(current_slide) } if { ![info exists isoControl($i,2Dlowvalue)] } { set isoControl($i,2Dlowvalue) $isoControl(2Dlowvalue) } if { ![info exists isoControl($i,2Dhighvalue)] } { set isoControl($i,2Dhighvalue) $isoControl(2Dhighvalue) } if { ![info exists isoControl($i,2Dnisoline)] } { set isoControl($i,2Dnisoline) $isoControl(2Dnisoline) } if { ![info exists isoControl($i,isoline_color)] } { set isoControl($i,isoline_color) $isoControl(isoline_color) } if { ![info exists isoControl($i,isoline_width)] } { set isoControl($i,isoline_width) $isoControl(isoline_width) } if { ![info exists isoControl($i,isoline_monocolor)] } { set isoControl($i,isoline_monocolor) $isoControl(isoline_monocolor) } if { ![info exists isoControl($i,isoline_stipple)] } { set isoControl($i,isoline_stipple) $isoControl(isoline_stipple) } } # check if close-isocontrol button was pressed previously if { [info exists isoControl(close,isosurf) ] } { set isoControl(isosurf) $isoControl(close,isosurf) } if { [info exists isoControl(close,colorplane) ] } { set isoControl(colorplane) $isoControl(close,colorplane) } if { [info exists isoControl(close,isoline) ] } { set isoControl(isoline) $isoControl(close,isoline) } foreach i {1 2 3} { if { [info exists isoControl(close,$i,colorplane)] } { set isoControl($i,colorplane) $isoControl(close,$i,colorplane) } if { [info exists isoControl(close,$i,isoline)] } { set isoControl($i,isoline) $isoControl(close,$i,isoline) } } } proc IsoControl_SetColorPlaneVar {type i} { global isoControl prop isosurf xcDebug "#1 Animation: def = $isoControl(current_slide)" xcDebug "#1 Animation: 1 = $isoControl(1,current_slide)" xcDebug "#1 Animation: 2 = $isoControl(2,current_slide)" xcDebug "#1 Animation: 3 = $isoControl(3,current_slide)" if { $type == "1st" } { set isoControl($i,cpl_basis) $isoControl(cpl_basis) set isoControl($i,cpl_function) $isoControl(cpl_function) set isoControl($i,colorplane) $isoControl(colorplane) set isoControl($i,isoline) $isoControl(isoline) set isoControl($i,colorplane_lighting) $isoControl(colorplane_lighting) set isoControl($i,cpl_transparency) $isoControl(cpl_transparency) set isoControl($i,cpl_thermometer) $isoControl(cpl_thermometer) set isoControl($i,cpl_thermoTplw) $isoControl(cpl_thermoTplw) set isoControl($i,cpl_thermoFmt) $isoControl(cpl_thermoFmt) set isoControl($i,cpl_thermoLabel) $isoControl(cpl_thermoLabel) set isoControl($i,cpl_thermoNTics) $isoControl(cpl_thermoNTics) set isoControl($i,cpl_thermoFont) $isoControl(cpl_thermoFont) set isosurf($i,2Dexpand) $isosurf(2Dexpand) set isosurf($i,2Dexpand_X) $isosurf(2Dexpand_X) set isosurf($i,2Dexpand_Y) $isosurf(2Dexpand_Y) set isosurf($i,2Dexpand_Z) $isosurf(2Dexpand_Z) set isoControl($i,anim_step) $isoControl(anim_step) #set isoControl($i,current_slide) $isoControl(current_slide) set isoControl($i,2Dlowvalue) $isoControl(2Dlowvalue) set isoControl($i,2Dhighvalue) $isoControl(2Dhighvalue) set isoControl($i,2Dnisoline) $isoControl(2Dnisoline) set isoControl($i,isoline_color) $isoControl(isoline_color) set isoControl($i,isoline_width) $isoControl(isoline_width) set isoControl($i,isoline_monocolor) $isoControl(isoline_monocolor) set isoControl($i,isoline_stipple) $isoControl(isoline_stipple) } else { set isoControl(cpl_basis) $isoControl($i,cpl_basis) set isoControl(cpl_function) $isoControl($i,cpl_function) set isoControl(colorplane) $isoControl($i,colorplane) set isoControl(isoline) $isoControl($i,isoline) set isoControl(colorplane_lighting) $isoControl($i,colorplane_lighting) set isoControl(cpl_transparency) $isoControl($i,cpl_transparency) set isoControl(cpl_thermometer) $isoControl($i,cpl_thermometer) set isoControl(cpl_thermoTplw) $isoControl($i,cpl_thermoTplw) set isoControl(cpl_thermoFmt) $isoControl($i,cpl_thermoFmt) set isoControl(cpl_thermoLabel) $isoControl($i,cpl_thermoLabel) set isoControl(cpl_thermoNTics) $isoControl($i,cpl_thermoNTics) set isoControl(cpl_thermoFont) $isoControl($i,cpl_thermoFont) set isosurf(2Dexpand) $isosurf($i,2Dexpand) set isosurf(2Dexpand_X) $isosurf($i,2Dexpand_X) set isosurf(2Dexpand_Y) $isosurf($i,2Dexpand_Y) set isosurf(2Dexpand_Z) $isosurf($i,2Dexpand_Z) set isoControl(anim_step) $isoControl($i,anim_step) set isoControl(time_delay) $isoControl($i,time_delay) #set isoControl(current_slide) $isoControl($i,current_slide) set isoControl(current_text_slide) "Current slide: $isoControl($i,current_slide) / $isoControl($i,nslide)" set isoControl(2Dlowvalue) $isoControl($i,2Dlowvalue) set isoControl(2Dhighvalue) $isoControl($i,2Dhighvalue) set isoControl(2Dnisoline) $isoControl($i,2Dnisoline) set isoControl(isoline_color) $isoControl($i,isoline_color) set isoControl(isoline_width) $isoControl($i,isoline_width) set isoControl(isoline_monocolor) $isoControl($i,isoline_monocolor) set isoControl(isoline_stipple) $isoControl($i,isoline_stipple) } xcDebug "#2 Animation: def = $isoControl(current_slide)" xcDebug "#2 Animation: 1 = $isoControl(1,current_slide)" xcDebug "#2 Animation: 2 = $isoControl(2,current_slide)" xcDebug "#2 Animation: 3 = $isoControl(3,current_slide)" xcDebug "#2 isoControl(plane) = $isoControl(plane)" } proc IsoControl_UpdateColorplane {} { global isoControl isosurf # COLOR_BASIS & SCALE_FUNCTION set item $isoControl(plane) if $isoControl(cbfn_apply_to_all) { set item {1 2 3} } foreach it $item { set isoControl($it,cpl_basis) $isoControl(cpl_basis) set isoControl($it,cpl_function) $isoControl(cpl_function) } # DISPLAY/RANGE/EXPAND/ISOLINE set item $isoControl(plane) if $isoControl(disp_apply_to_all) { set item {1 2 3} } foreach it $item { # check the following three vaiables if { ![check_var { {isoControl(2Dlowvalue) real} {isoControl(2Dhighvalue) real} {isoControl(2Dnisoline) posint} {isoControl(isoline_width) posint} } [list \ $isoControl(2Dlowvalue_entry) \ $isoControl(2Dhighvalue_entry) \ $isoControl(2Dnisoline_entry) \ $isoControl(2Disolinewidth_entry)]] } { return } set isoControl($it,colorplane) $isoControl(colorplane) set isoControl($it,isoline) $isoControl(isoline) set isoControl($it,colorplane_lighting) $isoControl(colorplane_lighting) set isoControl($it,cpl_transparency) $isoControl(cpl_transparency) set isoControl($it,cpl_thermometer) $isoControl(cpl_thermometer) set isoControl($it,cpl_thermoTplw) $isoControl(cpl_thermoTplw) set isoControl($it,cpl_thermoFmt) $isoControl(cpl_thermoFmt) set isoControl($it,cpl_thermoLabel) $isoControl(cpl_thermoLabel) set isoControl($it,cpl_thermoNTics) $isoControl(cpl_thermoNTics) set isoControl($it,cpl_thermoFont) $isoControl(cpl_thermoFont) if { $isoControl(2Dnisoline) > $isoControl(max_allowed_2Dnisoline) } { tk_dialog [WidgetName] WARNING "WARNING: more then $isoControl(max_allowed_2Dnisoline) isolines was requested; Maximum number is $isoControl(max_allowed_2Dnisoline) !!! Setting number of isolines to $isoControl(max_allowed_2Dnisoline)" \ warning 0 OK set isoControl(2Dnisoline) 50 } set isoControl($it,2Dlowvalue) $isoControl(2Dlowvalue) set isoControl($it,2Dhighvalue) $isoControl(2Dhighvalue) set isoControl($it,2Dnisoline) $isoControl(2Dnisoline) set isoControl($it,isoline_color) $isoControl(isoline_color) set isoControl($it,isoline_width) $isoControl(isoline_width) set isoControl($it,isoline_monocolor) $isoControl(isoline_monocolor) set isoControl($it,isoline_stipple) $isoControl(isoline_stipple) set isosurf($it,2Dexpand) $isosurf(2Dexpand) set isosurf($it,2Dexpand_X) $isosurf(2Dexpand_X) set isosurf($it,2Dexpand_Y) $isosurf(2Dexpand_Y) set isosurf($it,2Dexpand_Z) $isosurf(2Dexpand_Z) } UpdateIsosurf } proc IsoControl_Show {type fiso fplane biso bplane1 bplane2 bplane3} { global isoControl if { $isoControl(plane) != {} } { IsoControl_SetColorPlaneVar 1st $isoControl(plane) } if { $type == "isosurf" } { set isoControl(plane) {} $biso config -bd 3 $bplane1 config -bd 1 $bplane2 config -bd 1 $bplane3 config -bd 1 pack forget $fplane pack $fiso -side top -fill both -expand 1 } else { if { $type == "colorplane1" } { set isoControl(plane) 1 $biso config -bd 1 $bplane1 config -bd 3 $bplane2 config -bd 1 $bplane3 config -bd 1 pack forget $fiso pack $fplane -side top -fill both -expand 1 } elseif { $type == "colorplane2" } { set isoControl(plane) 2 $biso config -bd 1 $bplane1 config -bd 1 $bplane2 config -bd 3 $bplane3 config -bd 1 pack forget $fiso pack $fplane -side top -fill both -expand 1 } elseif { $type == "colorplane3" } { set isoControl(plane) 3 $biso config -bd 1 $bplane1 config -bd 1 $bplane2 config -bd 1 $bplane3 config -bd 3 pack forget $fiso pack $fplane -side top -fill both -expand 1 } IsoControl_SetColorPlaneVar 2nd $isoControl(plane) } } proc IsoControl_IsoLineShow {type d r e i df rf ef ifr} { global isoControl set dr 1 set rr 1 set er 1 set ir 1 if { $type == "display" } { set dr 3 pack $df -padx 3 -pady 3 -ipady 3 -side top -fill x -expand 1 pack forget $rf $ef $ifr } elseif { $type == "ranges" } { set rr 3 pack $rf -padx 3 -pady 3 -ipady 3 -side top -fill x -expand 1 pack forget $df $ef $ifr } elseif { $type == "expand" } { set er 3 pack $ef -padx 3 -pady 3 -ipady 3 -side top -fill x -expand 1 pack forget $df $rf $ifr } elseif { $type == "isoline" } { set ir 3 pack $ifr -side top -fill x -expand 1 pack forget $df $rf $ef } $d config -bd $dr $r config -bd $rr $e config -bd $er $i config -bd $ir } proc IsoControl_Hide {{t .iso}} { global unmapWin wm withdraw $t xcUnmapWindow unmap $t $t $unmapWin(frame,main) isosurf_control } # isoControl(color_button) # isoControl(blend_button) proc IsoControl {} { global isosurf nxdir nydir nzdir periodic xcFonts XCTrace prop \ isoControl unmapWin if {[winfo exists .iso] } { return } # # initializations # set isoControl(plane) {} set isoControl(datagridDim) 3 IsoControl_InitVar reloadButtonDisable set t [xcToplevel .iso "Isosurface/Property-plane Controls" "IsoControls" . -0 0 1] pack propagate .iso xcRegisterUnmapWindow $t $unmapWin(frame,main) \ isosurf_control -image unmap-isosurf bind $t [list xcUnmapWindow unmap %W $t \ $unmapWin(frame,main) isosurf_control] bind $t [list xcUnmapWindow map %W $t \ $unmapWin(frame,main) isosurf_control] set ft [frame $t.ft] set fb1 [frame $t.fb1] set fb2 [frame $t.fb2] if { $prop(type_of_run) == "UHF" } { set fm [frame $t.fm] pack $ft $fm -fill x } else { pack $ft -fill x } pack $fb1 -fill both -expand 1 set b1 [button $ft.b1 \ -text "Isosurface" \ -bd 3 \ -highlightthickness 0 \ -command [list IsoControl_Show isosurf $fb1 $fb2 \ $ft.b1 $ft.b2 $ft.b3 $ft.b4]] set b2 [button $ft.b2 \ -text "Plane #1" \ -bd 1 \ -highlightthickness 0 \ -command [list IsoControl_Show colorplane1 $fb1 $fb2 \ $ft.b1 $ft.b2 $ft.b3 $ft.b4]] set b3 [button $ft.b3 \ -text "Plane #2" \ -bd 1 \ -highlightthickness 0 \ -command [list IsoControl_Show colorplane2 $fb1 $fb2 \ $ft.b1 $ft.b2 $ft.b3 $ft.b4]] set b4 [button $ft.b4 \ -text "Plane #3" \ -bd 1 \ -highlightthickness 0 \ -command [list IsoControl_Show colorplane3 $fb1 $fb2 \ $ft.b1 $ft.b2 $ft.b3 $ft.b4]] pack $b1 $b2 $b3 $b4 -side left -fill both -expand 1 ######################################## # if UHF if { $prop(type_of_run) == "UHF" } { set f0 [frame $fm.f0 -relief raised -bd 2] frame $f0.1 -relief groove -bd 2 xcMenuEntry $f0.1 "What SPIN to take:" 30 \ isosurf(spin) {ALPHA BETA ALPHA+BETA ALPHA-BETA} \ -labelwidth 17 \ -labelfont $xcFonts(small) \ -entryfont $xcFonts(small_entry) pack $f0 -side top -fill both pack $f0.1 -padx 2 -pady 5 -ipady 3 -fill x } ######################## ### IsoSURFACE frame ### ######################## set f [frame $fb1.f] set left [frame $f.left -relief raised -bd 2] set right [frame $f.right -relief raised -bd 2] set bot [frame $fb1.bot -relief raised -bd 2] pack $f -side top -expand 1 -fill both pack $left $right -side left -fill both -expand 1 pack $bot -side bottom -fill both -expand 1 ######################################## # LEFT FRAME if { ![info exists isoControl(isosurf)] } { set isoControl(isosurf) 1 } set ckb [checkbutton $left.cb \ -text "Display Isosurface" \ -command "UpdateIsosurf" \ -relief raised -bd 2 \ -anchor w \ -variable isoControl(isosurf)] pack $ckb -side top -padx 5 -pady 5 -fill x scale $left.sc -from 1 -to 4 -length 100 \ -variable isosurf(3Dinterpl_degree) -orient horizontal \ -label "Degree of triCubic Spline:" \ -tickinterval 1 -resolution 1 \ -width 7 -sliderlength 20 \ -showvalue true -relief groove -bd 2 \ -font $xcFonts(small) pack $left.sc -side top -padx 2 -pady 5 -fill both -expand 1 set f1 [frame $left.f1 -relief groove -bd 2] set f2 [frame $left.f2 -relief groove -bd 2] set f3 [frame $left.f3 -relief groove -bd 2] set f4 [frame $left.f4 -relief groove -bd 2] pack $f3 $f4 $f1 $f2 -side top -padx 2 -pady 5 -fill both -expand 1 set frame_color [lindex \ [GetWidgetConfig frame -background] end] FillEntries $f1 {"Minimum grid value:"} \ isosurf(minvalue) \ 18 9 top left \ -e_relief flat -e_state disabled -e_bg $frame_color \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry) FillEntries $f1 {"Maximum grid value:"} \ isosurf(maxvalue) \ 18 9 top left \ -e_relief flat -e_state disabled -e_bg $frame_color \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry) set isosurf(isovalue_entry) [FillEntries $f1 {"Isovalue:"} \ prop(isolevel) \ 18 9 top left \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry)] focus $isosurf(isovalue_entry) # # make checkbutton for specifying +/- option # set ck [checkbutton $f1.ckb \ -text "Render +/- isovalue" \ -variable prop(pm_isolevel) \ -command IsoControlCommand \ -anchor w] pack $ck -side bottom -expand 1 -fill both -padx 5 -pady 2 # # isosurface triangulation algorithm # set wlist_ [RadioButCmd $f3 "Isosurface tessellation type:" \ isosurf(tessellation_type) UpdateIsosurf \ top left 0 1 2 "cubes" "tetrahedrons"] foreach w $wlist_ { $w configure -font $xcFonts(small) } # # isosurface normals computation algorithm # set wlist_ [RadioButCmd $f4 "Isosurface normals type:" \ isosurf(normals_type) UpdateIsosurf \ top left 0 1 2 "gradient" "triangles"] foreach w $wlist_ { $w configure -font $xcFonts(small) } ############### # EXPAND option; just for periodic systems set disabled_color [lindex \ [GetWidgetConfig button -disabledforeground] end] set enabled_color [lindex \ [GetWidgetConfig scale -foreground] end] set enable "\ $f2.b.scX configure -foreground $enabled_color; \ $f2.b.scY configure -foreground $enabled_color; \ $f2.b.scZ configure -foreground $enabled_color" set disable " \ $f2.b.scX configure -foreground $disabled_color; \ $f2.b.scY configure -foreground $disabled_color; \ $f2.b.scZ configure -foreground $disabled_color" if { $periodic(dim) > 0 } { label $f2.l -text "Expand Isosurface:" -relief flat set lfont [ModifyFont [$f2.l cget -font] $f2.l -underline 1] $f2.l configure -font $lfont set r1 [radiobutton $f2.r1 \ -text "do not expand" \ -variable isosurf(expand) \ -value "none" \ -anchor w \ -font $xcFonts(small) \ -command "xcDisableAll $f2.b; catch {eval $disable}"] set r2 [radiobutton $f2.r2 \ -text "to whole structure" \ -variable isosurf(expand) \ -value "whole" \ -anchor w \ -font $xcFonts(small) \ -command "xcDisableAll $f2.b; catch {eval $disable}"] set r3 [radiobutton $f2.r3 \ -text "separately in each direction" \ -variable isosurf(expand) \ -value "specify" \ -anchor w \ -font $xcFonts(small) \ -command "xcEnableAll $f2.b; catch {eval $enable}"] pack $f2.l -side top -expand 1 pack $r1 $r2 $r3 -side top -fill x set f2a [frame $f2.a -relief flat -width 40] set f2b [frame $f2.b -relief flat] pack $f2a -side left pack $f2b -side left -expand 1 -fill x set XCTrace(scX) [scale $f2b.scX -from 1 -to $nxdir -length 100 \ -variable isosurf(expand_X) -orient horizontal \ -label "repeat in X-dir:" -tickinterval 1 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20] # TRACE -- nxdir trace variable nxdir w xcTrace pack $XCTrace(scX) -side top if { $periodic(dim) > 1} { set XCTrace(scY) [scale $f2b.scY -from 1 -to $nydir -length 100 \ -variable isosurf(expand_Y) -orient horizontal \ -label "repeat in Y-dir:" -tickinterval 1 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20] # TRACE -- nydir trace variable nydir w xcTrace pack $XCTrace(scY) -side top } if { $periodic(dim) > 2 } { set XCTrace(scZ) [scale $f2b.scZ -from 1 -to $nzdir -length 100 \ -variable isosurf(expand_Z) -orient horizontal \ -label "repeat in Z-dir:" -tickinterval 1 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20] # TRACE -- nzdir trace variable nzdir w xcTrace pack $XCTrace(scZ) -side top } } ######################################## # RIGHT FRAME set f1 [frame $right.f1 -relief groove -bd 2] set f2 [frame $right.f2 -relief groove -bd 2] set f3 [frame $right.f3 -relief groove -bd 2] set f4 [frame $right.f4 -relief groove -bd 2] set f5 [frame $right.f5] pack $f1 $f2 $f3 $f4 -side top -padx 2 -pady 5 -fill x pack $f5 -side top -padx 2 -pady 5 -fill both -expand 1 set wlist1 [RadioButCmd $f1 "Render isosurface as:" \ isosurf(type_of_isosurf) UpdateIsosurf \ top left 0 1 2 "solid" "wire" "dot"] set wlist2 [RadioButCmd $f2 "Isosurface's ShadeModel:" \ isosurf(shade_model) UpdateIsosurf \ top left 0 1 2 "smooth" "flat"] set wlist3 [RadioButCmd $f3 "Two-sided lighting:" \ isosurf(twoside_lighting) ConvertTwoSideVar \ top left 0 1 2 "off" "on"] set wlist4 [RadioButCmd $f4 "Transparency of isosurface:" \ isosurf(transparency) UpdateIsosurf \ top left 0 1 2 "off" "on"] foreach w [concat $wlist1 $wlist2 $wlist3 $wlist4] { $w configure -font $xcFonts(small) } # REVERT FRONT&BACK SIDE button $f5.b10 \ -font $xcFonts(small) \ -text "Revert (+) sides" \ -command [list RevertIsoSides pos] set isoControl(revert_button2) [button $f5.b10a \ -font $xcFonts(small) \ -text "Revert (-) sides" \ -command [list RevertIsoSides neg]] # REVERT NORMALS button $f5.b11 \ -font $xcFonts(small) \ -text "Revert (+) normals" \ -command [list RevertIsoNormals pos] set isoControl(revert_button1) [button $f5.b12 \ -font $xcFonts(small) \ -text "Revert (-) normals" \ -command [list RevertIsoNormals neg]] set isoControl(smooth_button) [button $f5.b2a \ -text "Surface smoothing" \ -font $xcFonts(small) \ -command SurfaceSmoothing] $isoControl(smooth_button) config -state disabled set isoControl(color_button) [button $f5.b2 \ -text "Set COLOR parameters" \ -font $xcFonts(small)] set isoControl(blend_button) [button $f5.b3 \ -text "Set TRANSPARENCY\nparameters" \ -font $xcFonts(small)] pack $f5.b10 $f5.b10a $f5.b11 $f5.b12 $f5.b2a $f5.b2 $f5.b3 \ -fill x -side top -padx 2 -pady 5 set hid [button $bot.hid -text "Hide" \ -command [list IsoControl_Hide $t]] set can [button $bot.can -text "Close" \ -command [list IsoControlCan $t]] set sav [button $bot.sav -text "Save Grid" \ -command IsoControlSave] set sub [button $bot.sub -text "Submit" \ -command UpdateIsosurf] pack $hid $can $sav $sub -side left -pady 5 -expand 1 # # get the state according to prop(pm_isolevel) variable # (look the "Render +/- isovalue" checkbutton) # IsoControlCommand ######################## ### ColorPLANE frame ### ######################## set f0 [frame $fb2.f0 -relief raised -bd 2] frame $f0.1 -relief groove -bd 2 set ckb [checkbutton $f0.1.cb \ -text "Apply to Planes #1/#2/#3" \ -relief raised -bd 2 \ -anchor w \ -variable isoControl(cbfn_apply_to_all)] pack $ckb -side top -padx 5 -pady 5 -fill x set f1 [frame $f0.f1] set f2 [frame $f0.f2] xcMenuEntry $f1 "Select color basis:" 30 \ isoControl(cpl_basis) {MONOCHROME RAINBOW RGB GEOGRAPHIC BLUE-WHITE-RED BLACK-BROWN-WHITE} \ -labelwidth 17 \ -labelfont $xcFonts(small) \ -entryfont $xcFonts(small_entry) \ -labelanchor w xcMenuEntry $f2 "Select scale function:" 30 \ isoControl(cpl_function) {LINEAR LOG10 SQRT 3th-ROOT EXP(x) EXP(x^2)} \ -labelwidth 17 \ -labelfont $xcFonts(small) \ -entryfont $xcFonts(small_entry) \ -labelanchor w pack $f0 -side top -fill both -expand 1 pack $f0.1 -padx 2 -pady 5 -ipady 3 -fill x pack $f1 $f2 -side top -in $f0.1 -fill x # # DISPLAY/RANGES/EXPAND/ISOLINE # set f1 [frame $fb2.f1 -relief raised -bd 2] set ckb [checkbutton $f1.cb \ -text "Apply to Planes #1/#2/#3" \ -relief raised -bd 2 \ -anchor w \ -variable isoControl(disp_apply_to_all)] pack $ckb -side top -padx 5 -pady 5 -fill x set f11 [frame $f1.1] pack $f1 -side top -fill both -expand 1 pack $f11 -side top -fill both -expand 1 -padx 4 -pady 8 set mfb [frame $f11.mfb] set mf [frame $f11.mf -relief raised -bd 2] pack $mfb $mf -side top -padx 2 -fill both -expand 1 set df [frame $mf.d -relief groove -bd 2] set rf [frame $mf.r -relief groove -bd 2] set ef [frame $mf.e -relief groove -bd 2] set ifr [frame $mf.i] set d [button $mfb.d -text "Display" \ -highlightthickness 0 -bd 1 \ -command [list IsoControl_IsoLineShow display \ $mfb.d $mfb.r $mfb.e $mfb.i \ $df $rf $ef $ifr]] set r [button $mfb.r -text "Ranges" \ -highlightthickness 0 -bd 1 \ -command [list IsoControl_IsoLineShow ranges \ $mfb.d $mfb.r $mfb.e $mfb.i \ $df $rf $ef $ifr]] set e [button $mfb.e -text "Expand" \ -highlightthickness 0 -bd 1 \ -command [list IsoControl_IsoLineShow expand \ $mfb.d $mfb.r $mfb.e $mfb.i\ $df $rf $ef $ifr]] set i [button $mfb.i -text "Isoline" \ -highlightthickness 0 -bd 1 \ -command [list IsoControl_IsoLineShow isoline \ $mfb.d $mfb.r $mfb.e $mfb.i\ $df $rf $ef $ifr]] if { $periodic(dim) == 0 } { $e config -state disabled } pack $d $r $e $i -side left -padx 0 -pady 0 -fill both -expand 1 IsoControl_IsoLineShow display $mfb.d $mfb.r $mfb.e $mfb.i \ $df $rf $ef $ifr # # DISPLAY # set l [label $df.l -text "Property-plane display option:"] set lfont [ModifyFont [$df.l cget -font] $df.l -underline 1] $l configure -font $lfont set ck1 [checkbutton $df.c1 \ -text "display color-plane" \ -variable isoControl(colorplane) \ -width 21 \ -anchor w] set ck2 [checkbutton $df.c2 \ -text "display isolines" \ -variable isoControl(isoline) \ -width 21 \ -anchor w] set ck3 [checkbutton $df.c3 \ -text "lighting of color-plane" \ -variable isoControl(colorplane_lighting) \ -width 21 \ -onvalue 1 \ -offvalue 0 \ -anchor w] set ck4 [checkbutton $df.c4 \ -text "transparent color-plane" \ -variable isoControl(cpl_transparency) \ -width 21 \ -onvalue 1 -offvalue 0 \ -anchor w] set ck5 [checkbutton $df.c5 \ -text "display thermometer" \ -variable isoControl(cpl_thermometer) \ -width 21 \ -onvalue 1 -offvalue 0 \ -anchor w] set ck6 [checkbutton $df.c6 \ -text "thermometer in toplevel" \ -variable isoControl(cpl_thermoTplw) \ -width 21 \ -onvalue 1 -offvalue 0 \ -anchor w] set thermo [frame $df.f] grid configure $l -column 0 -row 0 -columnspan 2 grid configure $ck1 -column 0 -row 1 grid configure $ck4 -column 0 -row 2 grid configure $ck2 -column 1 -row 1 grid configure $ck3 -column 1 -row 2 grid configure $ck5 -column 0 -row 3 grid configure $ck6 -column 1 -row 3 grid configure $thermo -column 0 -row 4 -columnspan 2 # thermometer-widgets set tf1 [frame $thermo.1 -relief groove -bd 2] set tf11 [frame $tf1.1] set tf12 [frame $tf1.2] label $tf11.__l -text "Thermometer settings:" -anchor w pack $tf11.__l -side top -fill x FillEntries $tf11 { "Format string:" "Label:" "No. of tics:" } { isoControl(cpl_thermoFmt) isoControl(cpl_thermoLabel) isoControl(cpl_thermoNTics) } 14 20 button $tf12.font -text "Set Font" -command isoControl_thermoFont pack $tf1 -side top -fill both -expand 1 -padx 5 -pady 5 pack $tf11 $tf12 -side left -fill x -expand 1 -padx 5 -pady 5 pack $tf12.font -side top -fill x -expand 1 # # RANGES # set frame_color [lindex \ [GetWidgetConfig frame -background] end] FillEntries $rf {"Minimum 3D grid value:"} \ isosurf(minvalue) \ 25 9 top left \ -e_relief flat -e_state disabled -e_bg $frame_color \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry) FillEntries $rf {"Maximum 3D grid value:"} \ isosurf(maxvalue) \ 25 9 top left \ -e_relief flat -e_state disabled -e_bg $frame_color \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry) set isoControl(2Dlowvalue_entry) [FillEntries $rf \ {"Lowest rendered value:"} isoControl(2Dlowvalue) \ 25 9 top left \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry)] set isoControl(2Dhighvalue_entry) [FillEntries $rf \ {"Highest rendered value:"} isoControl(2Dhighvalue) \ 25 9 top left \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry)] set isoControl(2Dnisoline_entry) [FillEntries $rf \ {"Number of isolines:"} \ isoControl(2Dnisoline) \ 25 9 top left \ -l_font $xcFonts(small) -e_font $xcFonts(small_entry)] # # EXPAND # set f21 [frame $ef.top] set f22 [frame $ef.bot] pack $f21 $f22 -side top -fill both -expand 1 set enable "\ $f22.scX configure -foreground $enabled_color; \ $f22.scY configure -foreground $enabled_color; \ $f22.scZ configure -foreground $enabled_color" set disable " \ $f22.scX configure -foreground $disabled_color; \ $f22.scY configure -foreground $disabled_color; \ $f22.scZ configure -foreground $disabled_color" if { $periodic(dim) > 0 } { label $f21.l -text "Expand Property-plane:" -relief flat $f21.l configure -font $lfont set r1 [radiobutton $f21.r1 \ -text "do not expand" \ -variable isosurf(2Dexpand) \ -value "none" \ -anchor w \ -font $xcFonts(small) \ -command "xcDisableAll $f22; catch {eval $disable}"] set r2 [radiobutton $f21.r2 \ -text "to whole structure" \ -variable isosurf(2Dexpand) \ -value "whole" \ -anchor w \ -font $xcFonts(small) \ -command "xcDisableAll $f22; catch {eval $disable}"] set r3 [radiobutton $f21.r3 \ -text "separately in each direction" \ -variable isosurf(2Dexpand) \ -value "specify" \ -anchor w \ -font $xcFonts(small) \ -command "xcEnableAll $f22; catch {eval $enable}"] pack $f21.l -side top -expand 1 pack $r1 $r2 $r3 -side top -fill x set XCTrace(2DscX) [scale $f22.scX -from 1 -to $nxdir -length 100 \ -variable isosurf(2Dexpand_X) -orient horizontal \ -label "repeat in X-dir:" -tickinterval 1 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20] # TRACE -- nxdir trace variable nxdir w xcTrace pack $XCTrace(2DscX) -side left -pady 5 -expand 1 -fill x if { $periodic(dim) > 1} { set XCTrace(2DscY) [scale $f22.scY -from 1 -to $nydir \ -length 100 \ -variable isosurf(2Dexpand_Y) -orient horizontal \ -label "repeat in Y-dir:" -tickinterval 1 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20] # TRACE -- nydir trace variable nydir w xcTrace pack $XCTrace(2DscY) -side left -pady 5 -expand 1 -fill x } if { $periodic(dim) > 2 } { set XCTrace(2DscZ) [scale $f22.scZ -from 1 -to $nzdir \ -length 100 \ -variable isosurf(2Dexpand_Z) -orient horizontal \ -label "repeat in Z-dir:" -tickinterval 1 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20] # TRACE -- nzdir trace variable nzdir w xcTrace pack $XCTrace(2DscZ) -side left -pady 5 -expand 1 -fill x } } # # Isoline # set mf1 [frame $ifr.1 -relief groove -bd 2] set mf2 [frame $ifr.2 -relief groove -bd 2] set mf3 [frame $ifr.3 -relief groove -bd 2] pack $mf1 $mf2 $mf3 -side top -expand 1 -fill both -padx 3 -pady 3 set isoControl(bmc) [button $mf1.b -text "set color" \ -command IsoControl_SetIsolineColor] RadioButVarCmd $mf1 "Isoline Color:" isoControl(isoline_color) \ IsoControl_IsolineColor left top 0 0 \ {monocolor} {property color} pack $isoControl(bmc) -side left -padx 2 RadioBut $mf2 "Isoline Stipple:" isoControl(isoline_stipple) left top 0 1 \ {no stipple} {stipple negative} {full stipple} # this is temporal, since "Isoline Stipple" is not yet working xcDisableAll $mf2 # here goes isoline_width entry set isoControl(2Disolinewidth_entry) [FillEntries \ $mf3 {"Isoline width:"} \ isoControl(isoline_width) \ 14 10 left left] ################### # ANIMATION FRAME # ################### set f4 [frame $fb2.f4 -relief raised -bd 2] frame $f4.1 -relief groove -bd 2 pack $f4 -side top -fill x -expand 1 pack $f4.1 -padx 2 -pady 5 -ipady 3 -side top -fill x -expand 1 set ckb [checkbutton $f4.1.cb \ -text "Apply to Planes #1/#2/#3" \ -relief raised -bd 2 \ -anchor w \ -variable isoControl(anim_apply_to_all)] pack $ckb -side top -padx 5 -pady 5 -fill x # slide label set f41 [frame $f4.1.1] pack $f41 -side top -expand 1 -padx 2 label $f41.l1 -textvariable isoControl(current_text_slide) -anchor c set lfont [ModifyFont [$f41.l1 cget -font] $f41.l1 -size 16 -underline 1] $f41.l1 configure -font $lfont pack $f41.l1 -side left -padx 5 -fill x -expand 1 # scales set f41a [frame $f4.1.1a] pack $f41a -side top -expand 1 -fill x -padx 2 scale $f41a.s1 -from 1 -to 10 -length 170 \ -variable isoControl(anim_step) -orient horizontal \ -label "Animation Step:" -tickinterval 3 -resolution 1 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20 scale $f41a.s2 -from 0 -to 1000 -length 170 \ -variable isoControl(time_delay) -orient horizontal \ -label "Delay between slides (in msec):" -tickinterval 200 -resolution 10 \ -showvalue true \ -font $xcFonts(small) \ -width 7 -sliderlength 20 pack $f41a.s1 $f41a.s2 -side left -padx 5 -expand 1 set f42 [frame $f4.1.2] pack $f42 -side bottom -expand 1 -padx 2 -pady 5 set first [button $f42.1st -image first -anchor center \ -command [list IsoControl_Animate first]] set backw [button $f42.bck -image backward -anchor center \ -command [list IsoControl_Animate backward]] set previ [button $f42.prv -image previous -anchor center \ -command [list IsoControl_Animate previous]] set stop [button $f42.sto -image stop -anchor center \ -command [list IsoControl_Animate stop]] set next [button $f42.nxt -image next -anchor center \ -command [list IsoControl_Animate next]] set forw [button $f42.frw -image forward -anchor center \ -command [list IsoControl_Animate forward]] set last [button $f42.lst -image last -anchor center \ -command [list IsoControl_Animate last]] pack $first $backw $previ $stop $next $forw $last -side left foreach {wid text} [list \ $first "First slide" \ $backw "Play backward" \ $previ "Previous slide" \ $stop "Stop playing" \ $next "Next slide" \ $forw "Play forward" \ $last "Last slide"] { DynamicHelp::register $wid balloon $text } ######################################## # BOTTOM FRAME set f5 [frame $fb2.f5 -relief raised -bd 2] pack $f5 -side top -fill both -expand 1 set hid [button $f5.hid -text "Hide" \ -command [list IsoControl_Hide $t]] set can [button $f5.can -text "Close" \ -command [list IsoControlCan $t]] set sav [button $f5.sav -text "Save Grid" \ -command IsoControlSave] set sub [button $f5.sub -text "Submit" \ -command IsoControl_UpdateColorplane] pack $hid $can $sav $sub -side left -pady 5 -expand 1 } proc IsoControl_SetIsolineColorOK {type t} { global isoControl mody_col if { $type == "OK" } { set cID [xcModifyColorGetID] set isoControl(isoline_monocolor) "#$mody_col($cID,hxred)$mody_col($cID,hxgreen)$mody_col($cID,hxblue)" if [winfo exists .iso] { IsoControl_UpdateColorplane } else { UpdatePropertyPlane } } destroy $t } proc IsoControl_SetIsolineColor {} { global isoControl set t [xcToplevel [WidgetName] \ "Set Isoline Color" "Isoline Color" . -0 0 1] xcModifyColor $t "Set Isoline Color:" $isoControl(isoline_monocolor) \ groove left left 100 100 70 5 20 set ok [DefaultButton [WidgetName $t] -text "OK" \ -command [list IsoControl_SetIsolineColorOK OK $t]] set can [button [WidgetName $t] -text "Cancel" \ -command [list IsoControl_SetIsolineColorOK Cancel $t]] pack $ok $can -padx 10 -pady 10 -expand 1 } proc IsoControl_IsolineColor item { global isoControl if { $isoControl(isoline_color) == "monocolor" } { $isoControl(bmc) config -state normal } else { $isoControl(bmc) config -state disabled } } proc IsoControl_Animate what { global isoControl prop if { ![info exists isoControl(stop_playing)] } { set isoControl(stop_playing) 0 } # # when I will do PLANE123 simultaneously animation, the isoControl(plane) # plane must be called as last with IsoControl_SetCurrentSlide routine, # because isoControl(current_text_slide) variable is set in this routine # set do 1 set item $isoControl(plane) xcDebug "IsoControl_Animate: $item $isoControl(anim_step) $isoControl($item,current_slide) / $isoControl($item,nslide)" if $isoControl(anim_apply_to_all) { if { $item == 1 } { set item {2 3 1} } elseif { $item == 2 } { set item {3 1 2} } else { set item {1 2 3} } } switch -exact -- $what { stop { set isoControl(stop_playing) [expr {$isoControl(stop_playing) ? 0 : 1}] } first { foreach i $item { if { $isoControl($i,current_slide) == 1 && \ [llength $item] == 1 } { return } set isoControl($i,current_slide) 1 } } backward { SetWatchCursor while $do { set finished 0 set nitems [llength $item] foreach i $item { set do 0 if { $isoControl($i,current_slide) == 1 } { incr finished } if { $isoControl($i,current_slide) > 1 } { IsoControl_SetCurrentSlide $i -$isoControl(anim_step) set do 1 } } if { $finished == $nitems || $isoControl(stop_playing)} { set do 0 set isoControl(stop_playing) 0 ResetCursor xcSwapBuffers return } IsoControl_UpdateColorplane after $isoControl(time_delay) } ResetCursor xcSwapBuffers return } previous { foreach i $item { if { $isoControl($i,current_slide) == 1 && \ [llength $item] == 1 } { return } IsoControl_SetCurrentSlide $i -$isoControl(anim_step) } } next { foreach i $item { if { $isoControl($i,current_slide) == \ $isoControl($i,nslide) && [llength $item] == 1 } { return } IsoControl_SetCurrentSlide $i $isoControl(anim_step) } } forward { SetWatchCursor while $do { set finished 0 set nitems [llength $item] foreach i $item { set do 0 if { $isoControl($i,current_slide) == $isoControl($i,nslide) } { incr finished } if { $isoControl($i,current_slide) < $isoControl($i,nslide) } { IsoControl_SetCurrentSlide $i $isoControl(anim_step) set do 1 } } if { $finished == $nitems || $isoControl(stop_playing) } { set do 0 set isoControl(stop_playing) 0 ResetCursor xcSwapBuffers return } IsoControl_UpdateColorplane after $isoControl(time_delay) } ResetCursor xcSwapBuffers return } last { foreach i $item { if { $isoControl($i,current_slide) == \ $isoControl($i,nslide) && [llength $item] == 1 } { return } set isoControl($i,current_slide) $isoControl($i,nslide) } } } set i $isoControl(plane) set isoControl(current_text_slide) "Current slide: $isoControl($i,current_slide) / $isoControl($i,nslide)" IsoControl_UpdateColorplane } proc IsoControl_SetCurrentSlide {i incr} { global isoControl xcDebug "IsoControl_SetCurrentSlide: $i, $incr" incr isoControl($i,current_slide) $incr if { $isoControl($i,current_slide) < 1 } { set isoControl($i,current_slide) 1 } elseif { $isoControl($i,current_slide) > $isoControl($i,nslide) } { set isoControl($i,current_slide) $isoControl($i,nslide) } # # update isoControl(current_text_slide) only if isoControl(plane) plane # is requested # if { $i == $isoControl(plane) } { set isoControl(current_text_slide) "Current slide: $isoControl($i,current_slide) / $isoControl($i,nslide)" update } xcDebug "IsoControl_SetCurrentSlide: $i $incr $isoControl($i,current_slide) / $isoControl($i,nslide)" } proc IsoControlCan {t {dim 3}} { global isoControl isosurf #set button [tk_dialog [WidgetName] WARNING "Are You sure to Close PropertyPlane/IsoSurface. All data will be lost.\n\n Really Close???" warning 0 No Yes] #if { $button == 0 } { # return #} #unset isosurf(3Dinterpl_degree_old) #unset isoControl(1,nslide) #unset isoControl(2,nslide) #unset isoControl(3,nslide) #xcTraceDelete nxdir #xcTraceDelete nydir #xcTraceDelete nzdir #xcTraceDelete isosurf(3Dinterpl_degree) #xc_iso finish #.mesa render # display-off the isosurface and colorplanes if { $dim == 3 } { set isoControl(close,isosurf) $isoControl(isosurf) } set isoControl(close,colorplane) $isoControl(colorplane) set isoControl(close,isoline) $isoControl(isoline) set isoControl(isosurf) 0 set isoControl(colorplane) 0 set isoControl(isoline) 0 if { $dim == 3 } { foreach i {1 2 3} { set isoControl(close,$i,colorplane) $isoControl($i,colorplane) set isoControl(close,$i,isoline) $isoControl($i,isoline) set isoControl($i,colorplane) 0 set isoControl($i,isoline) 0 } UpdateIsosurf } elseif { $dim == 2 } { UpdatePropertyPlane } CancelProc $t } proc IsoControlSave {} { global xcMisc system set filehead [file tail [filehead $xcMisc(titlefile)]] set filetypes { {{XCrySDen Structure File} {.xsf} } {{All Files} * } } cd $system(PWD) set sfile [tk_getSaveFile -initialdir [pwd] \ -title "Save Calculated Grid of Points" \ -defaultextension .xsf \ -initialfile $filehead.xsf \ -filetypes $filetypes] cd $system(SCRDIR) if { $sfile == {} } { return 0 } set ident1 UNKNOWN set ident2 {} # Let the user specify some identifier for the datagrid OneEntryToplevel [WidgetName] "DataGrid Identifier" Identifier \ "Please specify identifier for DataGrid:" 80 ident2 text 30 30 if { $ident2 == "" } { set ident2 DataGrid_generated_by_XCrySDen1.0 } regsub -all { } $ident2 _ ident2 if [winfo exists .iso] { # 3D set dg DATAGRID3D } elseif [winfo exists .iso2D] { #2D set dg DATAGRID2D } _IsoControlSave $sfile $ident1 $ident2 $dg } proc _IsoControlSave {sfile ident1 ident2 dg} { global system xc_iso save $sfile $ident1 # take care about the newlines newline set content [ReadFile -nonewline $system(SCRDIR)/xc_struc.$system(PID)] set datablock 0 set out {} foreach line [split $content \n] { if [string match BEGIN_BLOCK_* $line] { set datablock 1 } if !$datablock { append out "$line\n" } if [string match END_BLOCK_* $line] { set datablock 0 } } append out "BEGIN_BLOCK_$dg\n" append out "$ident2\n" append out [ReadFile -nonewline $sfile] append out "\nEND_BLOCK_$dg" WriteFile $sfile $out w } proc ConvertTwoSideVar {{var {}}} { global isosurf if { ! [info exists isosurf(old_twoside_lighting)] } { set isosurf(old_twoside_lighting) off } if { $var == {}} { switch -exact -- $isosurf(twoside_lighting) { 0 { set isosurf(twoside_lighting) off } 1 { set isosurf(twoside_lighting) on } } } else { switch -exact -- $var { on - 1 - true { xc_setGLparam lightmodel -two_side_iso 1 # (GL_CCW,GL_CW): this is a dirty trick, namely, the # two-side lighting is taking for negative-isosurface # the back-side as front side and vice versa if { $isosurf(old_twoside_lighting) == "off" } { xc_setGLparam isonormal -what isosurf_neg } } off - 0 - false { xc_setGLparam lightmodel -two_side_iso 0 # (GL_CCW,GL_CW): this is a dirty trick, namely, the # two-side lighting is taking for negative-isosurface # the back-side as front side and vice versa if { $isosurf(old_twoside_lighting) == "on" } { xc_setGLparam isonormal -what isosurf_neg } } } # now render the changes .mesa render set isosurf(old_twoside_lighting) $var } } proc RevertIsoSides what { global openGL # just in case if openGL(isoside_$what) does not exist if ![info exists openGL(isoside_$what)] { set openGL(isoside_$what) [xc_getGLparam frontface -what isosurf_$what] xcDebug "openGL(isoside_$what):: $openGL(isoside_$what)" } if { $openGL(isoside_$what) == "CCW" } { set openGL(isoside_$what) "CW" } else { set openGL(isoside_$what) "CCW" } xc_setGLparam frontface -what isosurf_$what \ -frontface $openGL(isoside_$what) # now render the changes .mesa render } proc RevertIsoNormals what { global openGL xc_setGLparam isonormal -what isosurf_$what # now render the changes .mesa render } proc SurfaceSmoothing {} { global isoControl fillEntries set isoControl(smooth_nstep) [xc_iso get smoothsteps] set isoControl(smooth_weight) [xc_iso get smoothwieght] set t [xcToplevel [WidgetName] "Surface Smoothing" "SurfSmooth" \ .iso 20 20 1] message $t.m -aspect 800 \ -relief groove -bd 2 \ -text "Reasonable values for weight are between 0.1 and 1. Lighter weight will require more steps for smoothing, but will perturb the surface less !!!" pack $t.m -side top -padx 3m -pady 3m -ipadx 1m -ipady 1m set f [frame $t.f] FillEntries $t { "Smoothing steps:" "Smoothing weight:" } {isoControl(smooth_nstep) isoControl(smooth_weight)} 17 7 set foclist $fillEntries set varlist { {isoControl(smooth_nstep) int} {isoControl(smooth_weight) real} } button $t.b1 -text "Close" -command [list CancelProc $t] button $t.b2 -text "Update" \ -command [list SurfaceSmoothingOK $t $foclist $varlist] pack $f -side bottom -expand 1 -fill both -padx 3m -pady 3m pack $t.b1 $t.b2 -side left -expand 1 -padx 2m -pady 2m } proc SurfaceSmoothingOK {t foclist varlist} { global isoControl if ![check_var $varlist $foclist] { return } xc_iso smoothsteps $isoControl(smooth_nstep) xc_iso smoothweight $isoControl(smooth_weight) xc_iso smoothing UpdateIsosurf return } proc IsoControlCommand {} { global isoControl prop if $prop(pm_isolevel) { # # render +isolevel and -isolevel isosurfaces # $isoControl(color_button) configure -command \ [list MultiWidget {} -b_height 2 -testbutton 1 \ -create_tplw 1 \ -tplw_args {xcToplevel [WidgetName] "Set OpenGL parameters" \ "OpenGLPar"} \ -command { \ {"Front Side Color\nfor positive values" \ {SetOpenGLPar _POS_FRONT_COLOR_ ISOSURF}} \ {"Back Side Color\nfor positive values" \ {SetOpenGLPar _POS_BACK_COLOR_ ISOSURF}} \ {"Front Side Color\nfor negative values" \ {SetOpenGLPar _NEG_FRONT_COLOR_ ISOSURF}} \ {"Back Side Color\nfor negative values" \ {SetOpenGLPar _NEG_BACK_COLOR_ ISOSURF}} } \ -bottom_button { \ {Close CancelProc} {Update UpdateOpenGLPar} } ] $isoControl(blend_button) configure -command \ [list MultiWidget [WidgetName] -b_height 2 -testbutton 2 \ -create_tplw 1 \ -tplw_args {xcToplevel [WidgetName] "Set OpenGL parameters" \ "OpenGLPar"} \ -command { \ {"Transparency" \ {SetOpenGLPar _BLEND_ ISOSURF}} \ {"Front Side Color\nfor positive values" \ {SetOpenGLPar _POS_FRONT_COLOR_ ISOSURF}} \ {"Back Side Color\nfor positive values" \ {SetOpenGLPar _POS_BACK_COLOR_ ISOSURF}} \ {"Front Side Color\nfor negative values" \ {SetOpenGLPar _NEG_FRONT_COLOR_ ISOSURF}} \ {"Back Side Color\nfor negative values" \ {SetOpenGLPar _NEG_BACK_COLOR_ ISOSURF}} } \ -bottom_button { \ {Close CancelProc} {Update UpdateOpenGLPar} } ] $isoControl(revert_button1) configure -state normal $isoControl(revert_button2) configure -state normal } else { # # render just isolevel isosurface # $isoControl(color_button) configure -command \ [list MultiWidget {} -b_height 2 -testbutton 1 \ -create_tplw 1 \ -tplw_args {xcToplevel [WidgetName] "Set OpenGL parameters" \ "OpenGLPar"} \ -command { \ {"Front Side Color" \ {SetOpenGLPar _ONE_FRONT_COLOR_ ISOSURF}} \ {"Back Side Color" \ {SetOpenGLPar _ONE_BACK_COLOR_ ISOSURF}} } \ -bottom_button { \ {Close CancelProc} {Update UpdateOpenGLPar} } ] $isoControl(blend_button) configure -command \ [list MultiWidget [WidgetName] -b_height 2 -testbutton 2 \ -create_tplw 1 \ -tplw_args {xcToplevel [WidgetName] "Set OpenGL parameters" \ "OpenGLPar"} \ -command { \ {"Transparency" \ {SetOpenGLPar _BLEND_ ISOSURF}} \ {"Front Side Color" \ {SetOpenGLPar _ONE_FRONT_COLOR_ ISOSURF}} \ {"Back Side Color" \ {SetOpenGLPar _ONE_BACK_COLOR_ ISOSURF}} } \ -bottom_button { \ {Close CancelProc} {Update UpdateOpenGLPar} } ] $isoControl(revert_button1) configure -state disabled $isoControl(revert_button2) configure -state disabled } } # procs for updateing the font for thermometer proc isoControl_thermoFont {} { global isoControl puts stderr "*** 1. isoControl_thermoFont: $isoControl(cpl_thermoFont)" set font [fontToplevelWidget [WidgetName] \ "Sample Font Text" $isoControl(cpl_thermoFont)] puts stderr "*** 2. isoControl_thermoFont: $font" global isoControl if { $font != {} } { set isoControl(cpl_thermoFont) $font } } xcrysden-1.6.2/AUTHORS0000644000175000017500000000046611712736221013133 0ustar tonetoneAuthors of XCrySDen. Anton Kokalj Special thanks goes to: Mauro Causa : for the initialtion of the XCrySDen project, numerous discussons and suggestions at the initial stages of the project, and more ... Also see files ChangeLog and THANKS. AUTHORS ends herexcrysden-1.6.2/C/0000755000175000017500000000000013556022211012232 5ustar tonetonexcrysden-1.6.2/C/fft3d.c0000644000175000017500000000522713521257267013427 0ustar tonetone#include #include #include #include /*#include "shankland.h"*/ #include "fft3d.h" #include "memory.h" #include "tensor.h" /* BEWARE: ***src is a tensor3f of general grid (despite it contain periodic function), hence we need to the following pipeline: 1. transform general-grid (tensor3f) --> periodic-grid (double*) 2. interpolate 3. transform periodic-grid (double*) to general-grid (tensor3f) */ float*** general_grid_fft_interpolator_tensor3f(int n[3], int degree[3], float ***src) { int i, j, k, in, ijn; int n1 = n[0]-1; int n2 = n[1]-1; int n3 = n[2]-1; int n1new = n1*degree[0]; int n2new = n2*degree[1]; int n3new = n3*degree[2]; float ***result; double *out, *func; MALLOC_TENSOR3(float, result, n1new+1, n2new+1, n3new+1); func = (double*)malloc(sizeof(double) * n1*n2*n3 ); for(i=0; i #include #include #include #include #include #include #include "struct.h" #include "displayfunc.h" #include "vector.h" #include "xcfunc.h" #include "memory.h" #define ADDLINE_PAT 0xAAAA /* addline stipple pattern */ #define ADDLINE_WIDTH 2.0 /* width of "addline" */ /*GLuint BasicVectorsList, AtomAddList;*/ GLdouble points[8][3]; GLdouble addatompos[3]; extern GLuint tempDisable3Dlist; extern GLuint tempEnable3Dlist; static RenderVectors renvec[3]; static double mxx, myy, mzz; /* --- FUNCTIONS PROTOTYPES --- */ int XC_AtomAddCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); static void SetBasicVectors( double vec[][4], int n ); static void xcAddAtomUpdate(double af, double bf, double cf, char *addatomdata); void xcDisplayAddAtomBox(void); static void RenderBasicVectors(void) ; /*static void xcMakeAtomAddList(void);*/ /* --- xcDisplayFunc.c --- */ extern void xcSolidCylinder (GLdouble radius, GLdouble height); extern void xcSolidCone (GLdouble baseradius, GLdouble topradius, GLdouble height); /* extern void (*xcDisplay)(void); */ /* --- xcSelect.c --- */ extern void GetSelCylinderPar(double x21, double y21, double z21, double *xrvb, double *yrvb, double *zrvb, double *fibond, double *bondl); /* XC_AtomAddCmd --> inplementation of 'xc_atomadd' custom Tcl command, which is used for Cell-Adding type of ATOMINSE crystal command * ---------------------------------------------------------------------------- * Usage: xc_atomadd begin|update|clean ?AF? ?BF? ?CF? * * xc_atomadd begin -- before we begin atomadd procedure * we must prepare and do some initialisations * * xc_atomadd update-- updating * * xc_atomadd clean -- clean-up */ int XC_AtomAddCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; char *csqn = (char*) Tcl_Alloc( sizeof(char) * 256 ); GLdouble af,bf,cf; /* factors for vectors AF BF CF */ if (argc < 3) { Tcl_SetResult(interp, "Usage: xc_atomadd begin|update|clean ?AF? ?BF? ?CF?", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if structure is not opened, just return silently */ if ( !VPf.stropened ) return TCL_OK; /* so far just XC_3D is implemented; if not XC_3D return silently */ if ( dimType != XC_3D ) return TCL_OK; /***************************************************************************/ /* first "XC_ATOMADD BEGIN" */ if ( strcmp(argv[2],"begin") == 0 ) { int n; /* SO FAR ONLY 3D XC_ATOMADD IMPLEMENTATION */ /* flag to know when we are in "atomadd mode" */ VPf.atomadd = GL_TRUE; /* 3D ONLY: make basic vectors appear on the screen */ /* if xcr.lprimvec == GL_TRUE --> deal with primitiv vectors */ /* if xcr.lconvvec == GL_TRUE --> deal with primitiv vectors */ /* if xcr.dim == 3 --> crystal * == 2 --> SLAB; put C vector to (0.0,0.0,1.0) * == 1 --> polymer; put B,C vectors to * (0.0,(1.0|0.0),(0.0|1.0)) */ n = xcr.dim; if ( xcr.celltype == XCR_PRIMCELL ) SetBasicVectors( vec.prim, n ); if ( xcr.celltype == XCR_CONVCELL ) SetBasicVectors( vec.conv, n ); /* default values for A B C fractions will be 0.3 0.3 0.3, that is what we will return */ af = 0.3; bf = 0.3; cf = 0.3; /* now update and return current position */ xcAddAtomUpdate(af, cf, bf, csqn); Tcl_SetResult(interp,csqn,TCL_DYNAMIC); /* now update display */ xcDisplayAddAtomBox(); glFlush(); Togl_SwapBuffers(togl); } /***************************************************************************/ /* now implement a "XC_ATOMADD UPDATE %AF %BF %CF"; %AF,%BF,%CF are fractions of AF BF CF crystal vectors */ /* at the end we will calculate current position */ else if ( strcmp(argv[2],"update") == 0 ) { if ( !VPf.atomadd ) { Tcl_SetResult(interp, "calling \"xc_atomadd update\" command, before initialising atom-add process with \"xc_atomadd begin\"", TCL_STATIC); return TCL_ERROR; } /* argc must be 5 */ if ( argc != 6 ) { Tcl_SetResult(interp, "wrong usage of \"xc_atomadd update\" command, must be \"xc_addatom update \"", TCL_STATIC); return TCL_ERROR; } /* argv[3],argv[4],argv[5] must be integers */ if ( Tcl_GetDouble(interp,argv[3],&af) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s %s %s\n",argv[0],argv[1],argv[2],argv[3],argv[4],argv[5]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetDouble(interp,argv[4],&bf) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s %s %s\n",argv[0],argv[1],argv[2],argv[3],argv[4],argv[5]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetDouble(interp,argv[5],&cf) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s %s %s\n",argv[0],argv[1],argv[2],argv[3],argv[4],argv[5]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* now update and return current position */ xcAddAtomUpdate(af, bf, cf, csqn); Tcl_SetResult(interp,csqn,TCL_DYNAMIC); /* update the display */ Togl_PostRedisplay(togl); } /***************************************************************************/ /* XC_ATOMADD CLEAN */ else if ( strcmp(argv[2],"clean") == 0 ) { if ( !VPf.atomadd ) { Tcl_SetResult(interp, "calling \"xc_atomadd clean\" command, before initialising atom-add process with \"xc_atomadd begin\"", TCL_STATIC); return TCL_ERROR; } VPf.atomadd = GL_FALSE; /* now update display */ Togl_PostRedisplay(togl); } /***************************************************************************/ /* unknown option */ else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\" for \"xc_atomadd\" command, must be one of begin, update, clean",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } /*****************************************************************************/ static void SetBasicVectors( double vec[][4], int n ) { int i,j; /* for polymer & SLAB modify (B) and C vector to (0.0,(1.0|0.0),(0.0|1.0)) */ for (i = 0; i<=2; i++) { if ( i >= n ) { vec[i][i] = 1.0; /* modified is just part that should be 1.0 */ } /* arrow will be 0.25 of vector length */ for (j = 0; j<=2; j++) { renvec[i].coor[j][0] = 0.0; renvec[i].coor[j][1] = (1.0 - VECTOR_ARROWSIZE) * vec[i][j]; renvec[i].coor[j][2] = vec[i][j]; } renvec[i].vecthick = VECTOR_THICKF * rrod; renvec[i].arrthick = VECTOR_ARRTHICKF * renvec[i].vecthick; fprintf(stderr,"vec-thick: %f %f\n", renvec[i].vecthick, renvec[i].arrthick); /* convert cartesian coordinates to gluCylinder coor. */ GetSelCylinderPar(renvec[i].coor[0][1] - renvec[i].coor[0][0], renvec[i].coor[1][1] - renvec[i].coor[1][0], renvec[i].coor[2][1] - renvec[i].coor[2][0], &renvec[i].vecx, &renvec[i].vecy, &renvec[i].vecz, &renvec[i].vecfi, &renvec[i].vecl); GetSelCylinderPar(renvec[i].coor[0][2] - renvec[i].coor[0][1], renvec[i].coor[1][2] - renvec[i].coor[1][1], renvec[i].coor[2][2] - renvec[i].coor[2][1], &renvec[i].arrx, &renvec[i].arry, &renvec[i].arrz, &renvec[i].arrfi, &renvec[i].arrl); } mxx = mx; myy = my; mzz = mz; /**************************************************************************/ /* maybe for MOLECULE it's better to draw vectors from MASS-CENTER, */ /* because of the presence of point-groups */ /**************************************************************************/ if ( xcr.dim == 0 ) { mxx = 0.0; myy = 0.0; mzz = 0.0; } } static void RenderBasicVectors(void) { int i; glPushMatrix(); glTranslated( -mxx, -myy, -mzz ); LoadCageOrVecMaterial( GLPAR_PRIMVEC ); for (i=0; i<3; i++) { xcSolidVector( renvec[i] ); } LoadStructMaterial(); glPopMatrix(); } /*****************************************************************************/ /* CALCULATE NEW CURRENT ADDATOM POSITION & RETURN IT */ static void xcAddAtomUpdate(double af, double bf, double cf, char *addatomdata) { int i; /* points for cube-box edges */ for(i=0; i<3; i++) { points[0][i] = 0.0; points[1][i] = af*renvec[0].coor[i][2]; points[2][i] = af*renvec[0].coor[i][2] + bf*renvec[1].coor[i][2]; points[3][i] = bf*renvec[1].coor[i][2]; points[4][i] = cf*renvec[2].coor[i][2]; points[5][i] = af*renvec[0].coor[i][2] + cf*renvec[2].coor[i][2]; points[6][i] = points[5][i] + bf*renvec[1].coor[i][2]; points[7][i] = bf*renvec[1].coor[i][2] + cf*renvec[2].coor[i][2]; addatompos[i] = af*renvec[0].coor[i][2] + bf*renvec[1].coor[i][2] + cf*renvec[2].coor[i][2]; } sprintf(addatomdata,"%.10f %.10f %.10f", addatompos[0], addatompos[1], addatompos[2]); } void xcDisplayAddAtomBox(void) { double mxx, myy, mzz; mxx = mx; myy = my; mzz = mz; /**************************************************************************/ /* maybe for MOLECULE it's better to draw vectors from MASS-CENTER, */ /* because of the presence of point-groups */ /**************************************************************************/ if ( xcr.dim == 0 ) { mxx = 0.0; myy = 0.0; mzz = 0.0; } glLineStipple(2, ADDLINE_PAT); glEnable(GL_LINE_STIPPLE); glCallList(tempDisable3Dlist); glLineWidth( ADDLINE_WIDTH ); /* make a addatombox */ /* box is made from this poits: * 01,12,23,30 * 04,15,26,37 * 45,56,67,74 */ glTranslated( -mxx, -myy, -mzz ); /* (mx,my,mz) is origin shift vector */ glBegin(GL_LINE_STRIP); glVertex3dv( points[0]); glVertex3dv( points[1]); glVertex3dv( points[2]); glVertex3dv( points[3]); glVertex3dv( points[0]); glEnd(); glBegin(GL_LINES); glVertex3dv( points[0]); glVertex3dv( points[4]); glVertex3dv( points[1]); glVertex3dv( points[5]); glVertex3dv( points[2]); glVertex3dv( points[6]); glVertex3dv( points[3]); glVertex3dv( points[7]); glEnd(); glBegin(GL_LINE_STRIP); glVertex3dv( points[4]); glVertex3dv( points[5]); glVertex3dv( points[6]); glVertex3dv( points[7]); glVertex3dv( points[4]); glEnd(); /* make a point on atomadd-position */ glPointSize(6); glBegin(GL_POINTS); glVertex3dv( addatompos ); glEnd(); glTranslated( mxx, myy, mzz ); glCallList(tempEnable3Dlist); glDisable(GL_LINE_STIPPLE); RenderBasicVectors(); } /* static void xcMakeAtomAddList(void) { float color[3] = {1.0, 1.0, 1.0}; GLUquadricObj *quadObj; quadObj = gluNewQuadric (); glNewList(AtomAddList, GL_COMPILE); glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_FLAT); gluSphere (quadObj, 0.1, 4, 4); glEndList(); } */ xcrysden-1.6.2/C/xcSuperCell.c0000644000175000017500000002074513525506046014650 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcSuperCell.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include #include "struct.h" #include "bz.h" #include "vector.h" #include "xcGLparam.h" #include "xcfunc.h" #define SC_NULL 0 #define SC_INIT 1 void (*xcSuperCell)(void) = 0x0; void xcSuperCellFunc( void (*Func)(void) ); int XC_SuperCellCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); void SuperCell_RenderPVec(void); void SuperCell_RenderPVec_and_SCVec(void); void SetUnitCellCage( double vec[4][4], CellCage *cage ); static void SetVectorsCoor( double vec[4][4], RenderVectors rvec[3] ); static void SuperCell_RenderVectors( RenderVectors vec[3] ); static void SuperCell_VectorProduct(GLfloat vp[3], double v1[], double v2[]); /*****************************************************************************/ void xcSuperCellFunc( void (*Func)(void) ) { xcSuperCell = Func; } /*****************************************************************************/ /***************************************************************************** * xc_supercell init * * testit * * clear * *****************************************************************************/ int XC_SuperCellCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; static int sc_state = SC_NULL; if ( argc != 3 ) { Tcl_SetResult(interp, "Usage: xc_supercell (init|update|clear)", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* xc_supercell available just for periodic systems */ if ( xcr.dim < 1 ) { Tcl_SetResult(interp, "\"xc_supercell\" available just for periodic systems", TCL_STATIC); return TCL_ERROR; } if ( strcmp( argv[2], "init" ) == 0 ) { sc_state = SC_INIT; VPf.supercell = GL_TRUE; SetVectorsCoor( vec.prim, rnd_pvec ); /* if periodicity of system is greater then 1 then display cellcage */ if (xcr.dim > 1) SetUnitCellCage( vec.prim, &prim_cage ); xcSuperCellFunc( SuperCell_RenderPVec ); } else if ( strcmp( argv[2], "testit" ) == 0 ) { if ( sc_state == SC_NULL ) { Tcl_SetResult(interp, "\"xc_supercell init\" should be called before \"xc_supercell testit\"", TCL_STATIC); return TCL_ERROR; } /* by that time, the primitive vectors should already be new supercell vectors */ SetVectorsCoor( vec.prim, rnd_scvec ); /* if periodicity of system is greater then one then display cage */ if (xcr.dim > 1) SetUnitCellCage( vec.prim, &sc_cage ); xcSuperCellFunc( SuperCell_RenderPVec_and_SCVec ); } else if ( strcmp( argv[2], "clear" ) == 0 ) { sc_state = SC_NULL; VPf.supercell = GL_FALSE; } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", must be one of init, testit or clear", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* --- RENDER --- */ Togl_PostRedisplay(togl); return TCL_OK; } void SuperCell_RenderPVec(void) { GLint shade_model; GLboolean two_side, cull_face; glPushMatrix(); glTranslated( -mx, -my, -mz ); LoadCageOrVecMaterial( GLPAR_PRIMVEC ); SuperCell_RenderVectors( rnd_pvec ); /* if periodicity of system is greater then one then display cage */ if (xcr.dim > 1) { LoadCageOrVecMaterial( GLPAR_PRIMCAGE ); SetCageOGLState( xcr.dim, blend_cellcage, &shade_model, &two_side, &cull_face ); xcSolidCage( prim_cage ); DisableCageOGLState( xcr.dim, shade_model, two_side, cull_face ); } /* LOAD THE STRUCT MATERUALS BACK; * this has to be changed in future; * each render function will have to take care of it-self */ LoadStructMaterial(); glPopMatrix(); } void SuperCell_RenderPVec_and_SCVec(void) { GLint shade_model; GLboolean two_side, cull_face; glPushMatrix(); glTranslated( -mx, -my, -mz ); LoadCageOrVecMaterial( GLPAR_PRIMVEC ); SuperCell_RenderVectors( rnd_pvec ); LoadCageOrVecMaterial( GLPAR_SCVEC ); SuperCell_RenderVectors( rnd_scvec ); /* if periodicity of system is greater then one then display cage */ if (xcr.dim > 1) { LoadCageOrVecMaterial( GLPAR_PRIMCAGE ); SetCageOGLState( xcr.dim, blend_cellcage, &shade_model, &two_side, &cull_face ); xcSolidCage( prim_cage ); LoadCageOrVecMaterial( GLPAR_SCCAGE ); xcSolidCage( sc_cage ); DisableCageOGLState( xcr.dim, shade_model, two_side, cull_face ); } /* LOAD THE STRUCT MATERUALS BACK; * this has to be changed in future; * each render function will have to take care of it-self */ LoadStructMaterial(); glPopMatrix(); } void SetUnitCellCage( double vec[4][4], CellCage *cage ) { register int i, j, k, npoly; int vindex[6][4][3] = { { /* bottom face */ {0, 0, 0}, {0, 1, 0}, {1, 1, 0}, {1, 0, 0} }, { /* front face */ {1, 0, 0}, {1, 1, 0}, {1, 1, 1}, {1, 0, 1} }, { /* top face */ {1, 0, 1}, {1, 1, 1}, {0, 1, 1}, {0, 0, 1} }, { /* back face */ {0, 0, 0}, {0, 0, 1}, {0, 1, 1}, {0, 1, 0} }, { /* left face */ {0, 0, 0}, {1, 0, 0}, {1, 0, 1}, {0, 0, 1} }, { /* right face */ {1, 1, 1}, {1, 1, 0}, {0, 1, 0}, {0, 1, 1} } }; int nindex[6][2] = { /* bottom face */ {1, 0}, /* front face */ {1, 2}, /* top face */ {0, 1}, /* back face */ {2, 1}, /* left face */ {0, 2}, /* right face */ {2, 0} }; npoly = 6; if ( xcr.dim == 2) npoly = 1; if ( VPf.isospacesel3D ) npoly = 6; for (i=0; ivertex[i][j][k] = (GLfloat) vindex[i][j][0] * (GLfloat) vec[0][k] + (GLfloat) vindex[i][j][1] * (GLfloat) vec[1][k] + (GLfloat) vindex[i][j][2] * (GLfloat) vec[2][k]; SuperCell_VectorProduct( &cage->normal[i][j][0], vec[nindex[i][0]], vec[nindex[i][1]] ); normalizepvfv( &cage->normal[i][j][0] ); } } static void SetVectorsCoor( double vec[4][4], RenderVectors rvec[3] ) { register int i, j; for (i=0; i "AtomBond coor"; * actually we are not going from coor3D -> coor, but just * update coor on the basis of MajorMat !!!!! */ void From3Dto2D(void) { int i, atbn = natoms + nbonds; double x,y,z; for(i=1; i<=atbn; i++) { UpdateCoor( &(coor + i)->x1, &(coor + i)->y1, &(coor + i)->z1 ); if ( (coor + i)->flag == BOND ) { UpdateCoor( &(coor + i)->x2, &(coor + i)->y2, &(coor + i)->z2 ); /* if ATOM and BOND are on the same plane, ATOM must be drawn first so we will add very little to z-BOND */ *(zorient + i) = 0.5 * ((coor + i)->z1 + (coor + i)->z2) + 0.0001; } } } void From2Dto3D(void) { int i; int atbn; printf("From2Dto3D!!!!\n",NULL); fflush(stdout); /* delete previous made 3D lists, if I do not do this than the rest of this * function is without any sense, because later I use 3D Lists for * rendering, and if I do not use updated 3DLists ... */ xcMaybeDelete3DLists(); atbn = natoms + nbonds; for(i=1; i <= atbn; i++) { (coor3D + i)->flag = (coor + i)->flag; (coor3D + i)->nat = (coor + i)->nat; /* (coor3D + i)->list is not copied !!!! */ (coor3D + i)->x1 = (coor + i)->x1; (coor3D + i)->y1 = (coor + i)->y1; (coor3D + i)->z1 = (coor + i)->z1; if ( (coor3D + i)->flag == BOND ) GetCylinderPar(i, (coor + i)->x2 - (coor + i)->x1, (coor + i)->y2 - (coor + i)->y1, (coor + i)->z2 - (coor + i)->z1 ); } /* now assign NewMat */ LoadIdentity( MajorMat ); MajorMatToVec(); } void xcClearScreen(void) { /* make a black polygon on whole window -> so structure will disapear */ glClear(GL_COLOR_BUFFER_BIT); glColor3f( 0.0, 0.0, 0.0); glBegin(GL_POLYGON); glVertex2d(-MVf.structsize, MVf.structsize); glVertex2d(MVf.structsize, MVf.structsize); glVertex2d(MVf.structsize, -MVf.structsize); glVertex2d(-MVf.structsize, -MVf.structsize); glEnd(); glFlush(); Togl_SwapBuffers(togl); } xcrysden-1.6.2/C/getline.h0000644000175000017500000000030511712736221014035 0ustar tonetone#ifndef H_GETLINE #define H_GETLINE extern int getline_reserve (char **lineptr, size_t *n, FILE *stream); extern int getdelim_reserve (char **lineptr, size_t *n, int delimiter, FILE *fp); #endif xcrysden-1.6.2/C/xcHBonds.c0000644000175000017500000002211213525506046014115 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcHBonds.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include "struct.h" #include "vector.h" #include "xcfunc.h" #include "memory.h" extern H_Bond hbonds; static int _Hbond_MakeList(Tcl_Interp *interp, const char *argvI1, int **list); static void _Hbond_PrintList(Tcl_Interp *interp, int *list); static void Usage(Tcl_Interp *interp) { Tcl_SetResult(interp, "Usage: xc_hbonds OPTIONS\nwhere options are:\n on|off\nor\n H_like_list {H_like_list atomic numbers}\n O_like_list {O_like_list atomic numbers}\n length_min \nor\nlength_max ", TCL_STATIC); } /***************************************************************************** * xc_hbonds on * or off * or get what * or set what ?what = 2)) { /* ON */ VPf.Hbond = GL_FALSE; } else if ((c == 'o') && (strncmp(argv[2], "on", len) == 0) && (len >= 2)) { /* OFF */ VPf.Hbond = GL_TRUE; } else if ((c == 'g') && (strncmp(argv[2], "get", len) == 0) && (len >= 1)) { /* GET */ char string[20]; if ( strncmp(argv[3], "-H_", 3) == 0 ) { /* -H_like_list */ _Hbond_PrintList(interp, hbonds.H_like_list); } else if ( strncmp(argv[3], "-O_", 3) == 0 ) { /* -O_like_list */ _Hbond_PrintList(interp, hbonds.O_like_list); } else if ( strcmp(argv[3], "-length_min") == 0 ) { sprintf(string,"%15.10f ", hbonds.length_min); Tcl_AppendResult(interp, string, (char*)NULL); } else if ( strcmp(argv[3], "-length_max") == 0 ) { sprintf(string,"%15.10f ", hbonds.length_max); Tcl_AppendResult(interp, string, (char*)NULL); } else if ( strcmp(argv[3], "-angle_min") == 0 ) { sprintf(string,"%15.10f ", hbonds.angle_min); Tcl_AppendResult(interp, string, (char*)NULL); } else if ( strcmp(argv[3], "-line_width") == 0 ) { sprintf(string,"%15.10f ", hbonds.line_width); Tcl_AppendResult(interp, string, (char*)NULL); } else if ( strcmp(argv[3], "-line_pattern") == 0 ) { sprintf(string,"0x%04x", hbonds.line_pattern); Tcl_AppendResult(interp, string, (char*)NULL); } else if ( strcmp(argv[3], "-line_patternsize") == 0 ) { sprintf(string,"%d", hbonds.line_patternsize); Tcl_AppendResult(interp, string, (char*)NULL); } else if ( strcmp(argv[3], "-color") == 0 ) { sprintf(string,"%5.3f %5.3f %5.3f", hbonds.color[0], hbonds.color[1], hbonds.color[2]); Tcl_AppendResult(interp, string, (char*)NULL); } else { Usage(interp); return TCL_ERROR; } } else if ((c == 's') && (strncmp(argv[2], "set", len) == 0) && (len >= 1)) { /* SET */ for (i=3; i 0) { listPtr++; size++; } /* split the list of argvI1 */ Tcl_SplitList(interp, argvI1, &argcList, &argvList); /* if size < argcList+1 ==> reallocate the list */ if ( size < argcList+1 ) *list = xcRealloc(*list, (size_t) (argcList+1)*sizeof(int)); /* make the list */ listPtr = *list; for (j=0; j 0) { sprintf(string,"%3d ",*list); Tcl_AppendResult(interp, string, (char*)NULL); list++; } } xcrysden-1.6.2/C/shank_Hinv.c0000644000175000017500000001726413521260127014502 0ustar tonetone#ifdef XC_WITH_SHANKLAND #include #include #include #include "shankland.h" #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif const double two_pi = 2.0*M_PI; /* construct the H^-1 Shankland matrix */ MAT* shank_HinvObj(size_t Npoints, size_t Nwaves, double sigma, double (*roughnessFunc)(double m2, double sigma)) { MAT *Hinv = m_get(Npoints,Npoints); shank_Hinv(Npoints, Nwaves, sigma, roughnessFunc, Hinv); return Hinv; } void shank_Hinv(size_t Npoints, size_t Nwaves, double sigma, double (*roughnessFunc)(double m2, double sigma), MAT *Hinv) { size_t i, j; int m, m_min, m_max; double inv_Npoints, inv_Nwaves, tpi_bn, tpi_ibn, scale; double *Hi_j = (double*) malloc(sizeof(double)*Npoints); MAT *H = m_get(Npoints,Npoints); /* new experimentation */ /* if (Nwaves < 100 && sigma != 0.0) { */ /* Nwaves = Npoints * (100/Npoints + 1); */ /* } */ /* END */ inv_Npoints = 1.0 / (double) Npoints; inv_Nwaves = 1.0 / (double) Nwaves; tpi_bn = two_pi * inv_Npoints; scale = (double)Npoints/(double)Nwaves; m_min = FT_MIN(Nwaves); m_max = FT_MAX(Nwaves); #ifdef DEBUG printf("m=%d, m_min=%d, m_max=%d\n", Nwaves, m_min, m_max); printf("rougness factor from: %e to %e\n", 1.0/roughnessFunc(1.0,sigma), 1.0/roughnessFunc(m_max*m_max,sigma)); #endif for (i=0; ime[i][i] = Hi_j[0]; for (j=i+1; jme[i][j] = H->me[j][i] = Hi_j[j-i]; } #ifdef DEBUG print_MAT_matrix(stdout,"H", H); #endif m_inverse(H, Hinv); #ifdef DEBUG print_MAT_matrix(stdout,"Hinv", Hinv); #endif m_free(H); free((void*)Hi_j); } double* shank1d_lambdaObj(int n1, int n1new, double sigma, double* func, double (*roughnessFunc)(double m2, double sigma), double *f_aver) { double* lambda = (double*) malloc(sizeof(double) * n1); *f_aver = shank1d_lambda(n1, n1new, sigma, func, lambda, roughnessFunc); return lambda; } double shank1d_lambda(int n1, int n1new, double sigma, double* func, double* lam, double (*roughnessFunc)(double m2, double sigma)) { int i1, j1; MAT *Hinv1; double f_aver = 0.0; #ifdef DEBUG double up = 0.0; double down = 0.0; double sum_lam = 0.0; #endif Hinv1 = shank_HinvObj(n1, n1new, sigma, roughnessFunc); /* calculate f_aver */ for (i1=0; i1me[i1][j1] * (func[j1] - f_aver); #ifdef DEBUG up += Hinv1->me[i1][j1] * func[j1]; down += Hinv1->me[i1][j1]; #endif } } #ifdef DEBUG printf("f_aver - f_mean = %e - %e = %e\n", f_aver, up/down, f_aver - up/down); print_double_vector(stdout,"lambda",n1, lam); for (i1=0; i1me[i1][j1] * Hinv2->me[i2][j2] * (func[j1n+j2] - f_aver); #ifdef DEBUG up += Hinv1->me[i1][j1] * Hinv2->me[i2][j2] * func[j1n+j2]; down += Hinv1->me[i1][j1] * Hinv2->me[i2][j2]; #endif } } } #ifdef DEBUG printf("f_aver - f_mean = %e - %e = %e\n", f_aver, up/down, f_aver - up/down); print_double_matrix(stdout,"lambda",n1, n2, lam); for (i1=0; i1me[i1][j1] * Hinv2->me[i2][j2]; for (j3=0; j3me[i3][j3] * (func[j12n+j3] - f_aver); #ifdef DEBUG up += H12 * Hinv3->me[i3][j3] * func[j12n+j3]; down += H12 * Hinv3->me[i3][j3]; #endif } } } } } } #ifdef DEBUG printf("f_aver - f_mean = %e - %e = %e\n", f_aver, up/down, f_aver - up/down); print_double_vector(stdout,"lambda",n1*n2*n3, lam); for (i1=0; i1= 705 Tcl_TimerToken timerHandler; /* Token for togl's timer handler */ #else Tk_TimerToken timerHandler; /* Token for togl's timer handler */ #endif Bool RgbaFlag; /* configuration flags (ala GLX parameters) */ int RgbaRed; int RgbaGreen; int RgbaBlue; Bool DoubleFlag; Bool DepthFlag; int DepthSize; Bool AccumFlag; int AccumRed; int AccumGreen; int AccumBlue; int AccumAlpha; Bool AlphaFlag; int AlphaSize; Bool StencilFlag; int StencilSize; Bool PrivateCmapFlag; Bool OverlayFlag; Bool StereoFlag; #ifdef __sgi Bool OldStereoFlag; #endif int AuxNumber; Bool Indirect; int PixelFormat; const char *ShareList; /* name (ident) of Togl to share dlists with */ const char *ShareContext; /* name (ident) to share OpenGL context with */ const char *Ident; /* User's identification string */ ClientData Client_Data; /* Pointer to user data */ Bool UpdatePending; /* Should normal planes be redrawn? */ Togl_Callback *CreateProc; /* Callback when widget is created */ Togl_Callback *DisplayProc; /* Callback when widget is rendered */ Togl_Callback *ReshapeProc; /* Callback when window size changes */ Togl_Callback *DestroyProc; /* Callback when widget is destroyed */ Togl_Callback *TimerProc; /* Callback when widget is idle */ /* Overlay stuff */ #if defined(TOGL_X11) GLXContext OverlayCtx; /* Overlay planes OpenGL context */ #elif defined(TOGL_WGL) HGLRC tglGLOverlayHglrc; #endif /* TOGL_X11 */ Window OverlayWindow; /* The overlay window, or 0 */ Togl_Callback *OverlayDisplayProc; /* Overlay redraw proc */ Bool OverlayUpdatePending; /* Should overlay be redrawn? */ Colormap OverlayCmap; /* colormap for overlay is created */ int OverlayTransparentPixel; /* transparent pixel */ Bool OverlayIsMapped; /* for DumpToEpsFile: Added by Miguel A. de Riera Pasenau 10.01.1997 */ XVisualInfo *VisInfo; /* Visual info of the current */ /* context needed for DumpToEpsFile */ GLfloat *EpsRedMap; /* Index2RGB Maps for Color index modes */ GLfloat *EpsGreenMap; GLfloat *EpsBlueMap; GLint EpsMapSize; /* = Number of indices in our Togl */ }; xcrysden-1.6.2/C/cryDispFunc.c0000644000175000017500000003605313525506046014647 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/cryDispFunc.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include "xcGLparam.h" #include "struct.h" #include "isosurf.h" #include "memory.h" #include "molsurf.h" #include "vector.h" #include "bz.h" #include "wigner.h" #include "lighting.h" #include "xcfunc.h" extern XCantialias antialias; extern NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl); void cryDisplayFS(struct Togl *togl); static GLfloat _getSize (NEW_WIN_CONTEXT *wc); static void _cryDisplayFS(struct Togl *togl, NEW_WIN_CONTEXT *wc); void cryRenderSurface( NEW_WIN_CONTEXT *wc , int fs_mode); void cryRenderRecCell( NEW_WIN_CONTEXT *wc , int fs_mode); static void RenderBZ(GLenum what); void crySet_Trans_Shade_Lightmodel( int transp, GLenum shade, GLint two_side, GLboolean cull ); /*GLfloat line_color[4] = { 1.0, 1.0, 1.0, 1.0 };*/ /* assign cry_dispfunc fermisurf|incomming ... */ int CRY_DispFuncCmd(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[]) { struct Togl *togl; NEW_WIN_CONTEXT *wc; if ( argc != 3 && argc != 5 ) { Tcl_SetResult(interp, "Usage: cry_dispfunc fermisurf ?-antialias 0|1?", TCL_STATIC); return TCL_ERROR; } if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } wc = FindWinContextByTogl( togl ); LoadIdentity( wc->vec.crdmajor ); vecMatToVec( wc->vec.crdmajor, wc->vec.crdvec ); /* FERMISURFACE */ if ( strncmp(argv[2], "fermis", 6) == 0 ) { wc->xcDisplay = cryDisplayFS; /* next lines are just for now */ glEnable( GL_DITHER ); glEnable( GL_DEPTH_TEST ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); glDepthFunc(GL_LEQUAL); /*glClearDepth( 1.0 );*/ glClearColor( wc->bg[0], wc->bg[1], wc->bg[2], wc->bg[3] ); /* T.K. */ LoadBlendfunc_And_Frontface(); LoadIsoMaterial( MAT_ONELEVEL | MAT_ISOSURF ); /*LoadLights();*/ } if (argc == 5) { int anti_alias; if ( strncmp(argv[3], "-antialias", 6) == 0 ) { if ( Tcl_GetInt(interp, argv[4], &anti_alias) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\"", argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } wc->VPf.antialias = anti_alias; } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown option %s, must be -antialias", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } return TCL_OK; } static GLfloat _getSize (NEW_WIN_CONTEXT *wc) { wc->MVf.structsize = sqrt( wc->ss.maxX*wc->ss.maxX + wc->ss.maxY*wc->ss.maxY + wc->ss.maxZ*wc->ss.maxZ ); return wc->MVf.structsize / wc->tr.zoom; } /* * when we enter this procedure we just Made a Display, that means that * everything must be made before that */ void cryDisplayFS(struct Togl *togl) { NEW_WIN_CONTEXT *wc; wc = FindWinContextByTogl( togl ); /* debugging */ if (wc == (NEW_WIN_CONTEXT *)NULL) return; /* line_color[0] = 1.0 - wc->bg[0]; line_color[1] = 1.0 - wc->bg[1]; line_color[2] = 1.0 - wc->bg[2]; */ if ( ! wc->VPf.antialias ) { /* NO ANTIALIASING */ _cryDisplayFS (togl, wc); } else { /* ANTIALIASING */ GLint viewport[4]; GLfloat sx, sy, size, sizeX, sizeY, aspect; GLfloat scale, dx, dy; int min, max, count, i, j; int width = Togl_Width (togl); int height = Togl_Height(togl); enum { XORG, YORG, WID, HT }; size = _getSize (wc); aspect = (GLfloat) width / (GLfloat) height; if ( aspect>1 ) { sizeX = aspect * size; sizeY = size; } else { sizeX = size; sizeY = size / aspect; } glGetIntegerv(GL_VIEWPORT, viewport); sx = 2.0 * sizeX / viewport[WID]; sy = 2.0 * sizeX / viewport[WID]; min = -antialias.degree; max = -min + 1; count = -min + max; count *= count; /* uniform scaling, less than one pixel wide */ scale = -antialias.offset / min; glClear(GL_ACCUM_BUFFER_BIT); for (j = min; j < max; j++) { for (i = min; i < max; i++) { dx = sx * scale * i; dy = sy * scale * j; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-sizeX + dx, sizeX + dx, -sizeY + dy, sizeY + dy, -wc->MVf.structsize, 2*wc->MVf.structsize); /* see the crySetProj.c file !!! */ glMatrixMode(GL_MODELVIEW); _cryDisplayFS (togl, wc); glAccum(GL_ACCUM, 1.0 / (GLfloat)count); } } glAccum(GL_RETURN, 1.0); } Togl_SwapBuffers(togl); } static void _cryDisplayFS(struct Togl *togl, NEW_WIN_CONTEXT *wc) { /*GLdouble size = (GLdouble) _getSize (wc);*/ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* INSERT HERE ROTATION MATRIX */ glLoadIdentity(); glTranslated(0.0, 0.0, -0.5*wc->MVf.structsize); /* see crySetProj.c */ glMultMatrixd( wc->vec.crdvec ); /* fog */ xcFog (togl, wc->VPf.fog, GL_FALSE); glDisable(GL_BLEND); glDepthMask(GL_TRUE); if ( wc->VPf.nsurface ) cryRenderSurface( wc , FS_SINGLE ); if ( wc->VPf.dispLattice ) cryRenderRecCell( wc , FS_SINGLE ); /*--------------------*/ glFlush(); } void cryRenderRecCell( NEW_WIN_CONTEXT *wc , int fs_mode ) { MOL_SURF *m = (MOL_SURF *) wc->VPf.surfacePtr[0]; /* so far *******************************************************/ LoadVoronoiMaterial(VORONOI_BZ); /*glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_voronoi[0].ambient );*/ glLineWidth( 5.0 ); /****************************************************************/ glPushMatrix(); if ( fs_mode == FS_SINGLE ) glTranslated( wc->MVf.o_shift[0], wc->MVf.o_shift[1], wc->MVf.o_shift[2] ); if ( m->fs.celltype == XCR_PARAPIPEDAL ) { /****************************/ /* PARAPIPEDAL LATTICE CAGE */ /****************************/ CellCage *cage = (CellCage*) wc->recprim_cage; /* BUG */ if ( cage == (CellCage *)NULL ) return; if ( wc->VPf.dispLatType == CELL_WIRE ) { crySet_Trans_Shade_Lightmodel( 0, GL_FLAT, 1, GL_FALSE ); glColor4fv (m->fs.wirecellcolor); xcWireCage( *cage ); } else if ( wc->VPf.dispLatType == CELL_SOLID ) { crySet_Trans_Shade_Lightmodel( 1, GL_FLAT, 0, GL_TRUE ); glBlendFunc( blend_cellcage.sfunc, blend_cellcage.dfunc ); if ( m->fs.solidcellcolor[0] > -1e-8 ) { glMaterialfv ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, m->fs.solidcellcolor ); } xcSolidCage( *cage ); glDisable(GL_BLEND); glDepthMask(GL_TRUE); } else if ( wc->VPf.dispLatType == CELL_SOLID_AND_WIRE ) { crySet_Trans_Shade_Lightmodel( 0, GL_FLAT, 1, GL_FALSE ); glColor4fv (m->fs.wirecellcolor); xcWireCage( *cage ); crySet_Trans_Shade_Lightmodel( 1, GL_FLAT, 0, GL_TRUE ); glBlendFunc( blend_cellcage.sfunc, blend_cellcage.dfunc ); if ( m->fs.solidcellcolor[0] > -1e-8 ) { glMaterialfv ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, m->fs.solidcellcolor ); } glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.0, 1.0); xcSolidCage( *cage ); glPolygonOffset(0.0, 0.0); glDisable(GL_POLYGON_OFFSET_FILL); glDisable(GL_BLEND); glDepthMask(GL_TRUE); } } else if ( m->fs.celltype == XCR_BZ ) { GLenum what; /************************/ /* first BRILLOUIN ZONE */ /************************/ if ( wc->VPf.dispLatType == CELL_WIRE ) { what = GL_LINE_LOOP; crySet_Trans_Shade_Lightmodel( 0, GL_FLAT, 1, GL_FALSE ); glDisable(GL_LIGHTING); glColor4fv (m->fs.wirecellcolor); RenderBZ( what ); glEnable(GL_LIGHTING); } else if ( wc->VPf.dispLatType == CELL_SOLID ) { what = GL_POLYGON; crySet_Trans_Shade_Lightmodel( 1, GL_FLAT, 0, GL_TRUE ); glBlendFunc( blend_cellcage.sfunc, blend_cellcage.dfunc ); if ( m->fs.solidcellcolor[0] > -1e-8 ) { glMaterialfv ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, m->fs.solidcellcolor ); } RenderBZ( what ); glDisable(GL_BLEND); glDepthMask(GL_TRUE); } else if ( wc->VPf.dispLatType == CELL_SOLID_AND_WIRE ) { what = GL_LINE_LOOP; crySet_Trans_Shade_Lightmodel( 0, GL_FLAT, 1, GL_FALSE ); glDisable(GL_LIGHTING); glColor4fv (m->fs.wirecellcolor); RenderBZ( what ); glEnable(GL_LIGHTING); what = GL_POLYGON; crySet_Trans_Shade_Lightmodel( 1, GL_FLAT, 0, GL_TRUE ); glBlendFunc( blend_cellcage.sfunc, blend_cellcage.dfunc ); if ( m->fs.solidcellcolor[0] > -1e-8 ) { glMaterialfv ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, m->fs.solidcellcolor ); } glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.0, 1.0); RenderBZ( what ); glPolygonOffset(0.0, 0.0); glDisable(GL_POLYGON_OFFSET_FILL); glDisable(GL_BLEND); glDepthMask(GL_TRUE); } } glPopMatrix(); /* DEBUGGING */ /* glPushMatrix(); glTranslated( m->lowcoor[0], m->lowcoor[1], m->lowcoor[2] ); if (1) { int i, j; double vec[4][4]; CellCage cage; for(i=0; i<3; i++) for(j=0; j<3; j++) vec[i][j] = m->vec[i][j]; SetUnitCellCage ( vec, &cage ); xcWireCage( cage ); xcSolidCage( cage ); } glPopMatrix(); */ } static void RenderBZ(GLenum what) { register int ip, iv; for (ip=0; ip < bz[BZ_PRIMCELL].npoly; ip++) { glBegin( what ); for (iv=0; iv < bz[BZ_PRIMCELL].nvert[ip]; iv++) { glNormal3fv( bz[BZ_PRIMCELL].norm[ip][iv] ); glVertex3fv( bz[BZ_PRIMCELL].poly[ip][iv] ); } glEnd(); } } /*===========================================================================*/ void cryRenderSurface( NEW_WIN_CONTEXT *wc , int fs_mode ) { register int index, is, i, ix, iy, iz, j3; int revertnormals = 0; GLint two_side; GLfloat tr_vec[3]; MOL_SURF *m; ISOSURFACE *iso; GLenum front = GL_FRONT, back = GL_BACK; LoadIsoMaterial( MAT_ONELEVEL | MAT_ISOSURF ); glLineWidth( 2.0 ); for (is=0; isVPf.nsurface; is++) { if (!wc->VPf.surface[is]) continue; m = (MOL_SURF *) wc->VPf.surfacePtr[is]; iso = FindIsoSurf( m->isosurf_index ); if (!iso) fprintf(stderr, "Isosurface # %d not found !!!\n", m->isosurf_index); two_side = 1.0; crySet_Trans_Shade_Lightmodel( m->dispt.transparent, m->dispt.shademodel, two_side, GL_FALSE ); if ( m->dispt.transparent ) glBlendFunc( blend_isosurf.sfunc, blend_isosurf.dfunc ); /* RENDER */ /* if ( m->colorscheme == MOLS_MONOCHROME ) {} */ /* FRONTFACE */ if ( m->frontface == GL_CCW ) { front = GL_BACK; back = GL_FRONT; } glMaterialfv(front, GL_AMBIENT_AND_DIFFUSE, m->monocolor); glMaterialfv(back, GL_AMBIENT_AND_DIFFUSE, m->back_monocolor); /* REVERTNORMALS */ if ( m->revertnormals && !iso->revertnormals ) { revertnormals = 1; iso->revertnormals = 1; } else if (!m->revertnormals && iso->revertnormals) { revertnormals = 1; iso->revertnormals = 0; } if ( revertnormals ) { for (i=0; intriangl; i++) { for (j3=0; j3<3; j3++) { index = iso->tri2verIN[i].ver_ind[j3]; iso->normal[index].x *= -1.0; iso->normal[index].y *= -1.0; iso->normal[index].z *= -1.0; } } } glPushMatrix(); if ( fs_mode == FS_SINGLE ) glTranslated( wc->MVf.o_shift[0], wc->MVf.o_shift[1], wc->MVf.o_shift[2] ); for(ix=0; ixisoexpand.irepvec[0]; ix++) for(iy=0; iyisoexpand.irepvec[1]; iy++) for(iz=0; izisoexpand.irepvec[2]; iz++) { tr_vec[0] = (float) ix * (float) m->isoexpand.rep_vec[0][0] + (float) iy * (float) m->isoexpand.rep_vec[1][0] + (float) iz * (float) m->isoexpand.rep_vec[2][0]; tr_vec[1] = (float) ix * (float) m->isoexpand.rep_vec[0][1] + (float) iy * (float) m->isoexpand.rep_vec[1][1] + (float) iz * (float) m->isoexpand.rep_vec[2][1]; tr_vec[2] = (float) ix * (float) m->isoexpand.rep_vec[0][2] + (float) iy * (float) m->isoexpand.rep_vec[1][2] + (float) iz * (float) m->isoexpand.rep_vec[2][2]; glPushMatrix(); glTranslated( tr_vec[0], tr_vec[1], tr_vec[2] ); if ( m->dispt.drawstyle == ISOSURF_SOLID ) { glBegin( GL_TRIANGLES ); for (i=0; intriangl; i++) { if ( !iso->triangl_status[i] ) continue; for (j3=0; j3<3; j3++) { index = iso->tri2verIN[i].ver_ind[j3]; /* if ( m->colorscheme != MOLS_MONOCHROME ) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, iso->color[index]); */ glNormal3fv( &(iso->normal[index].x) ); glVertex3fv( &(iso->vertex[index].x) ); } } glEnd(); } else { GLenum what; /* ISOSURF_WIRE && ISOSURF_DOT */ if ( m->dispt.drawstyle == ISOSURF_WIRE ) what=GL_LINE_LOOP; else { glPointSize(3.0); what = GL_POINTS; } for (i=0; intriangl; i++) { if ( !iso->triangl_status[i] ) continue; glBegin( what ); for (j3=0; j3<3; j3++) { index = iso->tri2verIN[i].ver_ind[j3]; /* if ( m->colorscheme != MOLS_MONOCHROME ) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, iso->color[index]); */ glNormal3fv( &(iso->normal[index].x) ); glVertex3fv( &(iso->vertex[index].x) ); } glEnd(); } } glPopMatrix(); } glPopMatrix(); } } void crySet_Trans_Shade_Lightmodel( int transp, GLenum shade, GLint two_side, GLboolean cull ) { GLint shade_model, two_side_model; GLboolean cull_face; /* TRANSPARENCY */ if ( transp ) { glEnable( GL_BLEND ); glDepthMask( GL_FALSE ); } else { glDisable(GL_BLEND); glDepthMask(GL_TRUE); } /* SHADEMODEL */ glGetIntegerv( GL_SHADE_MODEL, &shade_model ); if ( shade_model != shade ) glShadeModel( shade ); /* LIGHTMODEL */ glGetIntegerv( GL_LIGHT_MODEL_TWO_SIDE, &two_side_model ); if ( two_side_model != two_side ) glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, two_side ); /* CULL FACE */ glGetBooleanv( GL_CULL_FACE, &cull_face ); if ( cull_face && !cull ) glDisable( GL_CULL_FACE ); else if ( !cull_face && cull ) { glEnable(GL_CULL_FACE ); glCullFace( GL_BACK ); } } xcrysden-1.6.2/C/xcWigner.c0000644000175000017500000002163513525506046014204 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcWigner.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include #include "struct.h" #include "xcGLparam.h" #include "wigner.h" #include "memory.h" #include "xcfunc.h" extern Options3D is; int wigner_nodes_malloc[2] = {0, 0}; static int ReadWSNodes( int mode ); static float DetWignerSize(void); /***************************************************************************** xc_wigner prim|conv -nodesfile -transparency 0|1 -color {r g b} -render after|now (DEFAULT:: after) clear *****************************************************************************/ int XC_WignerCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; register int i; static int first_time = 1; int mode, trans; int nodemode = WIGNER_NODEMODE_EVERY; int render = 0; GetGlParam color = { 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; if (first_time) { LoadVoronoiMaterial( VORONOI_WIGNERSEITZ ); first_time = 1; } if ( argc < 3 ) { Tcl_SetResult(interp, "Usage: xc_wigner prim|conv -nodesfile -transparency 0|1 -color {r g b} -render now|after\nor\nxc_wigner clear", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( strcmp(argv[2], "prim") == 0 ) { mode = WIGNER_PRIM; } else if ( strcmp(argv[2], "conv") == 0 ) { mode = WIGNER_CONV; } else if ( strcmp(argv[2], "clear") == 0 ) { VPf.wignerseitz = GL_FALSE; mode = WIGNER_CLEAR; ws_attrib.is_initialized[0] = 0; ws_attrib.is_initialized[1] = 0; Togl_PostRedisplay(togl); return TCL_OK; } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown option \"%s\", must be one of prim, conv, clear", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( mode == WIGNER_PRIM || mode == WIGNER_CONV ) { if ( !xcr.lprimvec ) { Tcl_SetResult(interp, "can not render Wigner-Seitz cell, since primitive cell vectors were not specified", TCL_STATIC); return TCL_ERROR; } for (i=3; i 1 ) { char rss[1024]; snprintf(rss, sizeof(rss), "invalid value %d for -transparency value, should be 0 or 1", trans); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } ws_attrib.transparency = trans; } else if ( strcmp(argv[i], "-color") == 0 ) { if ( !xcSplitList(XC_GET_XYZ, interp, &argv[i+1], &color) ) { char rss[1024]; snprintf(rss, sizeof(rss), "parse error; when parsing -color {%s}, should be -color {r g b}", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } ws_attrib.color[0] = color.vec[0]; ws_attrib.color[1] = color.vec[1]; ws_attrib.color[2] = color.vec[2]; /* so far we can submit just RGB and not RGBA, so I will use default ALFA */ ws_attrib.color[3] = mat_voronoi[0].ambient[3]; } else if ( strcmp(argv[i], "-render") == 0 ) { if ( strcmp(argv[i+1], "now" ) == 0 ) render = 1; else if ( strcmp(argv[i+1], "after") == 0 ) render = 0; else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown value \"%s\" for -render option, must be now or after", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown option \"%s\", must be one of -nodesfile, -transparency, -color or -render", argv[i]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } ws_attrib.is_initialized[mode] = 1; ws_attrib.nodemode[mode] = nodemode; VPf.wignerseitz = GL_TRUE; /* determine the size of wigner cells */ if ( render ) { MVf.wignerseitzsize = DetWignerSize(); /* because Wigner_Seitz cell may be greater than structure, take care of projection */ if (is.stickmode && !is.ballmode) xcMakeProjection3D("sticks"); if (is.ballmode) xcMakeProjection3D("balls"); if (is.spacefillmode) xcMakeProjection3D("space"); } } if (render) Togl_PostRedisplay(togl); return TCL_OK; } static float DetWignerSize(void) { int mode = WIGNER_PRIM; register int i, j; struct Node { float min_cellind[3]; float max_cellind[3]; } nd; double (*vector)[4]; /* because vec.XXXX are (double [4][4]) */ float vm[3][3], vM[3][3], orig[3]; if ( xcr.celltype == XCR_CONVCELL ) { mode = WIGNER_CONV; } if ( ws_attrib.nodemode[mode] == WIGNER_NODEMODE_EVERY ) { /* min = cell(0,0,0); max = cell(xcr.nunit[0], xcr.nunit[1], xcr.nunit[2] */ nd.min_cellind[0] = nd.min_cellind[1] = nd.min_cellind[2] = 0.0; nd.max_cellind[0] = (float) xcr.nunit[0]; nd.max_cellind[1] = (float) xcr.nunit[1]; nd.max_cellind[2] = (float) xcr.nunit[2]; } else if ( ws_attrib.nodemode[mode] == WIGNER_NODEMODE_SELECT ) { nd.min_cellind[0] = (float) xcr.nunit[0]; nd.min_cellind[1] = (float) xcr.nunit[1]; nd.min_cellind[2] = (float) xcr.nunit[2]; nd.max_cellind[0] = nd.max_cellind[1] = nd.max_cellind[2] = 0.0; for (i=0; i nd.max_cellind[j] ) nd.max_cellind[j] = ws_attrib.nodes[mode][i][j]; } } } /* determine size of single WS cell !!! Size of WS cell can not be greater then size of primcell, so use the size of primcell for the determination of WS cell for (i=0; i<3; i++) orig[i] = ( vec.prim[0][i] + vec.prim[1][i] + vec.prim[2][i] ) / 3.0; ws_size = DetermineParapipedSize( vec.prim[0], vec.prim[1], vec.prim[2], orig ); */ vector = vec.prim; if ( xcr.celltype == XCR_CONVCELL && ws_attrib.nodemode[mode] == WIGNER_NODEMODE_EVERY ) { vector = vec.conv; } for (i=0; i<3; i++) { orig[i] = 0.0; for (j=0; j<3; j++) { vm[i][j] = (nd.min_cellind[i] - 0.5) * vector[i][j]; vM[i][j] = (nd.max_cellind[i] + 0.5) * vector[i][j]; orig[i] -= vm[i][j]; } } orig[0] += mx; orig[1] += my; orig[2] += mz; return DetermineParapipedSize(vM[0], vM[1], vM[2], orig); } static int ReadWSNodes( int mode ) { int nnodes; register int i; if ( fscanf(ws_attrib.fp,"%d", &nnodes) != 1 ) return XC_ERROR; if ( wigner_nodes_malloc[mode] ) { xcFree_Matrixf( (float **) ws_attrib.nodes[mode] ); wigner_nodes_malloc[mode] = 0; } if ( !wigner_nodes_malloc[mode] ) { ws_attrib.nodes[mode] = xcMallocMatrixf( nnodes, 3 ); wigner_nodes_malloc[mode] = 1; } for (i=0; i #include "struct.h" #include "xcGLparam.h" #include "isosurf.h" void CalcLightPosition (int il, GLdouble size); void LoadLights(void); void LoadLightModelTwoSide(int type); void LoadBlendfunc_And_Frontface(void); void LoadStructMaterial(void); void LoadIsoMaterial(int type); void LoadVoronoiMaterial(int voronoi_type); void LoadCageOrVecMaterial(int type); extern ISO_ATTRIB isoDisp; extern OrthoProj ort; extern int togl_exists; /* ================================================ */ /* EMITTED light == barva, ki izvira iz predmeta; neodvisna od barvnega izvora */ /* AMBIENT light == se nakjucno odbija po prostoru */ /* DIFFUSE light == ce neka svetloba pade na nek predmet in se razprsi v vse smeri potem je ta razprsena svetloba DIFFUSE light */ /* SPECULAR light == pride iz dolocene smeri in se odbije, npr. bela pikica na kroglici */ GLenum _LIGHT[8] = { GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, GL_LIGHT3, GL_LIGHT4, GL_LIGHT5, GL_LIGHT6, GL_LIGHT7 }; /*****************************************************************************/ /* this is for structure's material */ GLfloat def_mat_shininess[] = {128.0}; GLfloat def_mat_specular[] = {0.97, 0.97, 0.97, 1.0}; GLfloat def_mat_ambient[] = {0.3, 0.3, 0.3, 1.0}; GLfloat def_mat_diffuse[] = {0.8, 0.8, 0.8, 1.0}; /*GLfloat def_mat_emission[] = {0.05, 0.05, 0.08, 1.0};*/ GLfloat def_mat_emission[] = {0.0, 0.0, 0.1, 1.0}; /*****************************************************************************/ /* this is for colorplanes's material */ GLfloat def_cpl_shininess[] = {0.0}; GLfloat def_cpl_specular[] = {0.0, 0.0, 0.0, 1.0}; GLfloat def_cpl_ambient[] = {0.2, 0.2, 0.2, 1.0}; GLfloat def_cpl_diffuse[] = {0.8, 0.8, 0.8, 1.0}; GLfloat def_blend_cpl_shininess[] = {0.0}; GLfloat def_blend_cpl_specular[] = {0.0, 0.0, 0.0, 1.0}; GLfloat def_blend_cpl_ambient[] = {0.2, 0.2, 0.2, .6}; GLfloat def_blend_cpl_diffuse[] = {0.8, 0.8, 0.8, .6}; /*************************************************************************** * for ISOSURF_TRANSP_ON */ float def_blend_front_mat_shininess[] = {30.0}; float def_blend_front_mat_specular[] = {1.0, 1.0, 1.0, 1.0}; /* s tem kontroliram prednjo barvo, manjse vrednoti -> */ float def_blend_front_mat_diffuse[] = {0.7, 0.8, 0.7, 0.6}; float def_blend_front_mat_ambient[] = {0.5, 0.6, 0.5, 1.0}; float def_blend_front_mat_emission[] = {0.0, 0.0, 0.0, 1.0}; float def_blend_pos_front_mat_diffuse[] = {1.0, 0.3, 0.3, 0.6}; float def_blend_pos_front_mat_ambient[] = {0.7, 0.5, 0.5, 1.0}; float def_blend_pos_front_mat_emission[]= {0.0, 0.0, 0.0, 1.0}; float def_blend_neg_front_mat_diffuse[] = {0.3, 0.3, 1.0, 0.6}; float def_blend_neg_front_mat_ambient[] = {0.5, 0.5, 0.6, 1.0}; float def_blend_neg_front_mat_emission[]= {0.0, 0.0, 0.0, 1.0}; /* s tem kotroliram koliko se vidi steklo, ce za njim ni nobenega */ float def_blend_back_mat_shininess[] = {128.0}; float def_blend_back_mat_specular[] = {1.0, 1.0, 1.0, 1.0}; /* s tem kontroliram, koliko se vidi zadnjo stran stekla */ float def_blend_back_mat_diffuse[] = {0.7, .7, .7, .5}; float def_blend_back_mat_ambient[] = { .7, .7, .7, 1.0}; float def_blend_back_mat_emission[] = {0.0, 0.0, 0.0, 1.0}; float def_blend_pos_back_mat_diffuse[] = {0.40, .15, .15, 0.5}; float def_blend_pos_back_mat_ambient[] = { .25, .20, .20, 1.0}; float def_blend_pos_back_mat_emission[]= { .00, .00, .00, 1.0}; float def_blend_neg_back_mat_diffuse[] = {0.15, .15, .40, 0.5}; float def_blend_neg_back_mat_ambient[] = {0.20, .20, .25, 1.0}; float def_blend_neg_back_mat_emission[]= { .00, .00, .00, 1.0}; /*************************************************************************** * for ISOSURF_TRANSP_OFF */ float def_front_mat_shininess[] = {104.0}; float def_front_mat_specular[] = {0.8, 0.8, 0.8, 1.0}; /*float def_front_mat_diffuse[] = {1.0, 1.0, 1.0, 1.0};*/ float def_front_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0}; float def_front_mat_ambient[] = {1.0, 1.0, 1.0, 1.0}; float def_front_mat_emission[]= {0.0, 0.0, 0.0, 1.0}; float def_pos_front_mat_diffuse[] = {1.0, 0.3, 0.3, 1.0}; float def_pos_front_mat_ambient[] = {0.7, 0.5, 0.5, 1.0}; float def_pos_front_mat_emission[]= {0.0, 0.0, 0.0, 1.0}; float def_neg_front_mat_diffuse[] = {0.3, 0.3, 1.0, 1.0}; float def_neg_front_mat_ambient[] = {0.5, 0.5, 0.6, 1.0}; float def_neg_front_mat_emission[]= {0.0, 0.0, 0.0, 1.0}; /* s tem kotroliram koliko se vidi steklo, ce za njim ni nobenega */ float def_back_mat_shininess[] = {32.0}; float def_back_mat_specular[] = {0.2, 0.2, 0.2, 1.0}; /*float def_back_mat_diffuse[] = {0.347, .347, .347, 1.0};*/ float def_back_mat_diffuse[] = {1.0, 0.8, 0.1, 1.0}; float def_back_mat_ambient[] = { .8, .8, .8, 1.0}; float def_back_mat_emission[] = {0.0, 0.0, 0.0, 1.0}; float def_pos_back_mat_diffuse[] = {0.40, .15, .15, 0.5}; float def_pos_back_mat_ambient[] = { .25, .20, .20, 1.0}; float def_pos_back_mat_emission[]= { .00, .00, .00, 1.0}; float def_neg_back_mat_diffuse[] = {0.15, .15, .40, 0.5}; float def_neg_back_mat_ambient[] = {0.20, .20, .25, 1.0}; float def_neg_back_mat_emission[]= { .00, .00, .00, 1.0}; /*****************************************************************************/ /* this is for voronoi's material */ GLfloat def_voronoi_shininess[] = {94.0}; GLfloat def_voronoi_specular[] = {0.40, 0.40, 0.40, 1.0}; GLfloat def_voronoi_ambient[] = {0.00, 0.95, 0.95, 0.8}; GLfloat def_voronoi_diffuse[] = {0.00, 0.95, 0.95, 0.8}; GLfloat def_wigner_shininess[] = {94.0}; GLfloat def_wigner_specular[] = {0.40, 0.40, 0.40, 1.0}; GLfloat def_wigner_ambient[] = {0.00, 0.95, 0.95, 0.8}; GLfloat def_wigner_diffuse[] = {0.00, 0.95, 0.95, 0.8}; GLfloat def_bz_shininess[] = {94.0}; GLfloat def_bz_specular[] = {0.40, 0.40, 0.40, 1.0}; GLfloat def_bz_ambient[] = {0.00, 0.95, 0.95, 0.4}; GLfloat def_bz_diffuse[] = {0.00, 0.95, 0.95, 0.4}; /*****************************************************************************/ /* this is for various vectors & cages */ GLfloat def_primcage_shininess[] = {1.0}; GLfloat def_primcage_specular[] = {0.00, 0.00, 0.00, 1.0}; GLfloat def_primcage_ambient[] = {1.00, 1.00, 1.00, 1.0}; GLfloat def_primcage_diffuse[] = {0.00, 1.00, 0.37, 0.43}; GLfloat def_convcage_shininess[] = {1.0}; GLfloat def_convcage_specular[] = {0.00, 0.00, 0.00, 1.0}; GLfloat def_convcage_ambient[] = {1.00, 1.00, 1.00, 1.0}; GLfloat def_convcage_diffuse[] = {1.00, 0.00, 0.37, 0.43}; GLfloat def_sccage_shininess[] = {1.0}; GLfloat def_sccage_specular[] = {0.00, 0.00, 0.00, 1.0}; GLfloat def_sccage_ambient[] = {1.00, 1.00, 1.00, 1.0}; GLfloat def_sccage_diffuse[] = {0.00, 0.37, 1.00, 0.43}; GLfloat def_primvec_shininess[] = {1.0}; GLfloat def_primvec_specular[] = {0.00, 0.00, 0.00, 1.0}; GLfloat def_primvec_ambient[] = {1.00, 1.00, 1.00, 1.0}; GLfloat def_primvec_diffuse[] = {0.00, 1.00, 0.37, 1.0}; GLfloat def_convvec_shininess[] = {1.0}; GLfloat def_convvec_specular[] = {0.00, 0.00, 0.00, 1.0}; GLfloat def_convvec_ambient[] = {1.00, 1.00, 1.00, 1.0}; GLfloat def_convvec_diffuse[] = {1.00, 0.00, 0.37, 1.0}; GLfloat def_scvec_shininess[] = {1.0}; GLfloat def_scvec_specular[] = {0.00, 0.00, 0.00, 1.0}; GLfloat def_scvec_ambient[] = {1.00, 1.00, 1.00, 1.0}; GLfloat def_scvec_diffuse[] = {0.00, 0.37, 1.00, 1.0}; /* for parallelogram IsoSpaceSel */ GLfloat def_isoparalle_shininess[] = {1.0}; GLfloat def_isoparalle_specular[] = {0.00, 0.00, 0.00, 0.8}; GLfloat def_isoparalle_ambient[] = {0.80, 0.80, 0.90, 0.8}; GLfloat def_isoparalle_diffuse[] = {0.80, 0.80, 1.00, 0.6}; /*****************************************************************************/ /* LIGHTS */ #define MNOL MAX_NUMBER_OF_LIGHTS /* MAX_NUMBER_OF_LIGHTS IS 6 */ boolean def_light_isenabled[MNOL] = { 1, 1, 0, 0, 0, 0 }; /* XCRYSDEN: 0.7.2 settings ------------------------ GLfloat def_light_diffuse[MNOL][4] = { {0.5, 0.5, 0.6, 1.0}, {0.1, 0.1, 0.1, 0.5}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0} }; GLfloat def_light_specular[MNOL][4] = { {0.8, 0.8, 0.8, 1.0}, {0.2, 0.2, 0.2, 0.5}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0} }; GLfloat def_light_fract_position[MNOL][4]={{ 5.0, 5.0, 3.0, 0.01}, { -5.0, -5.0, -1.0, 0.01}, { 0.0, 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0, 0.0} }; XCRYSDEN_END */ /* XCRYSDEN pre 0.8.0 settings: ---------------------------- GLfloat def_light_ambient[MNOL][4] = { {0.2, 0.2, 0.2, 1.0}, {0.01, 0.01, 0.01, 0.5}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0} }; GLfloat def_light_diffuse[MNOL][4] = { {0.45, 0.45, 0.56, 1.0}, {0.1, 0.1, 0.1, 0.5}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0} }; GLfloat def_light_specular[MNOL][4] = { {0.8, 0.8, 0.8, 1.0}, {0.3, 0.3, 0.3, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0} }; GLfloat def_light_fract_position[MNOL][4]={{ 5.0, 5.0, 6.0, 0.01}, { -5.0, -5.0, -1.0, 0.01}, { 0.0, 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0, 0.0} }; GLfloat def_light_spotdir[MNOL][3] = { { -5.0, -5.0, -3.0}, { 5.0, 5.0, 0.5}, { 0.0, 0.0, -1.0}, { 0.0, 0.0, -1.0}, { 0.0, 0.0, -1.0}, { 0.0, 0.0, -1.0} }; */ GLfloat def_light_ambient[MNOL][4] = { {0.01, 0.01, 0.01, 1.0}, {0.01, 0.01, 0.01, 0.5}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0} }; GLfloat def_light_diffuse[MNOL][4] = { {0.76, 0.76, 0.76, 1.0}, {0.76, 0.76, 0.76, 0.5}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0} }; GLfloat def_light_specular[MNOL][4] = { {0.6, 0.6, 0.6, 1.0}, {0.3, 0.3, 0.3, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0} }; /* before light1 was: 5.0, 5.0, 3.0 */ GLfloat def_light_fract_position[MNOL][4]={{ 5.0, 8.0, 6.0, 0.00}, { -5.0, -1.0, -1.6, 0.00}, { 0.0, 0.0, 1.0, 1.0}, { 0.0, 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0, 0.0} }; GLfloat def_light_spotdir[MNOL][3] = { { -5.0, -8.0, -6.0}, { 5.0, 1.0, 1.6}, { 0.0, 0.0, -1.0}, { 0.0, 0.0, -1.0}, { 0.0, 0.0, -1.0}, { 0.0, 0.0, -1.0} }; GLfloat def_light_spot_exp[MNOL][1] = { {128.0}, {115.0}, {10.0}, {0.0}, {0.0}, {0.0} }; GLfloat def_light_spot_cutoff[MNOL][1] = { {180.0}, {180.0}, {180.0}, {180.0}, {180.0},{180.0} }; GLfloat def_light_const_atten[MNOL][1] = { {1.0}, {1.0}, {1.0}, {1.0}, {1.0}, {1.0} }; GLfloat def_light_lin_atten[MNOL][1] = { {0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0} }; GLfloat def_light_quad_atten[MNOL][1] = { {0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0} }; /*****************************************************************************/ /* LIGHTMODEL --- LIGHTMODEL --- LIGHTMODEL --- LIGHTMODEL --- LIGHTMODEL */ /* this are OpenGL defaults */ GLfloat def_lightmodel_two_side[1] = {0.0}; GLfloat def_lightmodel_two_side_iso[1] = {0.0}; GLfloat def_lightmodel_ambient[4] = {0.2, 0.2, 0.2, 1.0}; GLfloat def_lightmodel_local_viewer[1] = {0.0}; /*****************************************************************************/ /* FRONTFACE & BLENDFUNC --- FRONTFACE & BLENDFUNC */ FRONTFACE def_frontface_isosurf = GL_CCW; BLENDFUNC def_blend_isosurf = { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA }; BLENDFUNC def_blend_colorplane = { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA }; BLENDFUNC def_blend_voronoi = { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA }; BLENDFUNC def_blend_cellcage = { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA }; /*****************************************************************************/ void CalcLightPosition (int il, GLdouble size) { GLfloat _spot_dir[3]; if ( ! togl_exists ) return; light[il].position[0] = size * light[il].fract_position[0]; light[il].position[1] = size * light[il].fract_position[1]; light[il].position[2] = size * light[il].fract_position[2]; light[il].position[3] = light[il].fract_position[3]; glLightfv(_LIGHT[il], GL_POSITION, light[il].position); _spot_dir[0] = size * light[il].spot_dir[0]; _spot_dir[1] = size * light[il].spot_dir[1]; _spot_dir[2] = size * light[il].spot_dir[2]; glLightfv(_LIGHT[il], GL_SPOT_DIRECTION, _spot_dir); /* fprintf(stderr,"DEBUG> Light No.%d: position = (%8.3f,%8.3f,%8.3f,%8.3f)\n", il, light[il].position[0], light[il].position[1], light[il].position[2], light[il].position[3]); fprintf(stderr,"DEBUG> Light No.%d: spot_dir = (%8.3f,%8.3f,%8.3f)\n", il, _spot_dir[0], _spot_dir[1], _spot_dir[2]); */ } void LoadLights(void) { register int i, il; static int first_time = 1; GLdouble size; if ( ! togl_exists ) return; /* if I will add more default light parameters, I need to change a little the following loop */ if ( first_time ) { /* disable all but the first light */ for (il=0; il size ) */ /* size = ort.maxy; */ size = ort.size; /* take care of lights */ for ( il=0; il---------------glLight*** BEGIN; struct.size = %f\n", size);*/ glLightfv(_LIGHT[il], GL_AMBIENT, light[il].ambient); glLightfv(_LIGHT[il], GL_DIFFUSE, light[il].diffuse); glLightfv(_LIGHT[il], GL_SPECULAR, light[il].specular); if ( VPf.stropened ) { /*GLfloat _spot_dir[3];*/ /* */ /*light[il].position[0] = ort.maxx * light[il].fract_position[0]; */ /*light[il].position[1] = ort.maxy * light[il].fract_position[1]; */ /*light[il].position[2] = size * light[il].fract_position[2]; */ /*light[il].position[3] = light[il].fract_position[3]; */ /*glLightfv(_LIGHT[il], GL_POSITION, light[il].position); */ /*_spot_dir[0] = ort.maxx * light[il].spot_dir[0]; */ /*_spot_dir[1] = ort.maxy * light[il].spot_dir[1]; */ /*_spot_dir[2] = size * light[il].spot_dir[2]; */ CalcLightPosition (il, size); } glLightfv(_LIGHT[il], GL_SPOT_EXPONENT, light[il].spot_exp); glLightfv(_LIGHT[il], GL_SPOT_CUTOFF, light[il].spot_cutoff); glLightfv(_LIGHT[il], GL_CONSTANT_ATTENUATION, light[il].const_atten ); glLightfv(_LIGHT[il], GL_LINEAR_ATTENUATION, light[il].lin_atten ); glLightfv(_LIGHT[il], GL_QUADRATIC_ATTENUATION, light[il].quad_atten ); /*if ( light[il].spot_exp[0] != 0.0 ) { */ /*glLightfv(_LIGHT[il], GL_SPOT_EXPONENT, light[il].spot_exp); */ /*} */ /*if ( light[il].const_atten[0] != 1.0 )*/ /*if ( light[il].lin_atten[0] != 0.0 ) */ /*if ( light[il].quad_atten[0] != 0.0 ) */ /* fprintf(stderr,"DEBUG> Light No.%d: spot_exp = (%8.3f)\n", il, light[il].spot_exp[0]); fprintf(stderr,"DEBUG> Light No.%d: spot_cutoff = (%8.3f)\n", il, light[il].spot_cutoff[0]); fprintf(stderr,"DEBUG> Light No.%d: const_atten = (%8.3f)\n", il, light[il].const_atten[0]); fprintf(stderr,"DEBUG> Light No.%d: lin_atten = (%8.3f)\n", il, light[il].lin_atten[0]); fprintf(stderr,"DEBUG> Light No.%d: quad_atten = (%8.3f)\n", il, light[il].quad_atten[0]); fprintf(stderr,"DEBUG>---------------glLight*** END\n\n"); */ /* now enable light */ if (!glIsEnabled(_LIGHT[il])) glEnable( _LIGHT[il] ); } else { /* disable light */ glDisable( _LIGHT[il] ); } } /* take care for whole ModelLight but GL_LIGHT_MODEL_TWO_SIDE */ glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lightmodel.ambient ); glLightModelfv( GL_LIGHT_MODEL_LOCAL_VIEWER, lightmodel.local_viewer ); } void LoadLightModelTwoSide(int type) { if ( ! togl_exists ) return; if ( type == LIGHTMODEL_STRUCTURE ) glLightModelfv( GL_LIGHT_MODEL_TWO_SIDE, lightmodel.two_side ); if ( type == LIGHTMODEL_ISOSURF ) glLightModelfv( GL_LIGHT_MODEL_TWO_SIDE, lightmodel.two_side_iso ); } void LoadBlendfunc_And_Frontface(void) { static int first_time = 1; if ( first_time ) { /* BLEND_FUNCTION */ blend_isosurf.sfunc = def_blend_isosurf.sfunc; blend_isosurf.dfunc = def_blend_isosurf.dfunc; blend_colorplane.sfunc = def_blend_colorplane.sfunc; blend_colorplane.dfunc = def_blend_colorplane.dfunc; blend_voronoi.sfunc = def_blend_voronoi.sfunc; blend_voronoi.dfunc = def_blend_voronoi.dfunc; blend_cellcage.sfunc = def_blend_voronoi.sfunc; blend_cellcage.dfunc = def_blend_voronoi.dfunc; /* FRONT_FACE */ frontface_isosurf[0] = def_frontface_isosurf; frontface_isosurf[1] = def_frontface_isosurf; first_time = 0; } /* insert code here in the future (MAYBE) */ } /*****************************************************************************/ /* This func. load a material properties for structure; */ void LoadStructMaterial(void) { static int first_time = 1; int i; /* EMITTED light == barva, ki izvira iz predmeta */ /* AMBIENT light == se nakjucno odbija po prostoru */ /* DIFFUSE light == ce neka svetloba pade na nek predmet in se razprsi v vse smeri potem je ta razprsena svetloba DIFFUSE light */ /* SPECULAR light == pride iz dolocene smeri in se odbije, npr. bela pikica na kroglici */ /* ALL ATOMS HAVE THE SAME specular & shininess MATTERIAL PROPERTIES */ if ( ! togl_exists ) return; if ( first_time ) { mat_struct.shininess[0] = def_mat_shininess[0]; for (i=0; i<4; i++) { mat_struct.specular[i] = def_mat_specular[i]; mat_struct.ambient[i] = def_mat_ambient[i]; mat_struct.diffuse[i] = def_mat_diffuse[i]; mat_struct.emission[i] = def_mat_emission[i]; } first_time = 0; } glMaterialfv( GL_FRONT, GL_SHININESS, mat_struct.shininess ); glMaterialfv( GL_FRONT, GL_SPECULAR, mat_struct.specular ); glMaterialfv( GL_FRONT, GL_AMBIENT, mat_struct.ambient ); glMaterialfv( GL_FRONT, GL_DIFFUSE, mat_struct.diffuse ); glMaterialfv( GL_FRONT, GL_EMISSION, mat_struct.emission ); } /*===========================================================================*/ void LoadIsoMaterial(int type) { int i; static int first_time = 1; if ( ! togl_exists ) return; if ( first_time ) { /* ISOSURF_TRANSP_OFF = 0 */ front_mat_isosurf[0].shininess[0] = def_front_mat_shininess[0]; back_mat_isosurf[0].shininess[0] = def_back_mat_shininess[0]; front_mat_pos_isosurf[0].shininess[0] = def_front_mat_shininess[0]; back_mat_pos_isosurf[0].shininess[0] = def_back_mat_shininess[0]; front_mat_neg_isosurf[0].shininess[0] = def_front_mat_shininess[0]; back_mat_neg_isosurf[0].shininess[0] = def_back_mat_shininess[0]; /* ISOSURF_TRANSP_ON = 1 */ front_mat_isosurf[1].shininess[0] = def_blend_front_mat_shininess[0]; back_mat_isosurf[1].shininess[0] = def_blend_back_mat_shininess[0]; front_mat_pos_isosurf[1].shininess[0] = def_blend_front_mat_shininess[0]; back_mat_pos_isosurf[1].shininess[0] = def_blend_back_mat_shininess[0]; front_mat_neg_isosurf[1].shininess[0] = def_blend_front_mat_shininess[0]; back_mat_neg_isosurf[1].shininess[0] = def_blend_back_mat_shininess[0]; /* COLORPLANE - TRANSP_OFF */ mat_colorplane[0].shininess[0] = def_cpl_shininess[0]; /* - TRANSP_ON */ mat_colorplane[1].shininess[0] = def_blend_cpl_shininess[0]; for (i=0; i<4; i++) { /* ISOSURF_TRANSP_OFF = 0 */ front_mat_isosurf[0].specular[i] = def_front_mat_specular[i]; front_mat_isosurf[0].diffuse[i] = def_front_mat_diffuse[i]; front_mat_isosurf[0].ambient[i] = def_front_mat_ambient[i]; front_mat_isosurf[0].emission[i] = def_front_mat_emission[i]; back_mat_isosurf[0].specular[i] = def_back_mat_specular[i]; back_mat_isosurf[0].diffuse[i] = def_back_mat_diffuse[i]; back_mat_isosurf[0].ambient[i] = def_back_mat_ambient[i]; back_mat_isosurf[0].emission[i] = def_back_mat_emission[i]; front_mat_pos_isosurf[0].specular[i] = def_front_mat_specular[i]; front_mat_pos_isosurf[0].diffuse[i] = def_pos_front_mat_diffuse[i]; front_mat_pos_isosurf[0].ambient[i] = def_pos_front_mat_ambient[i]; front_mat_pos_isosurf[0].emission[i] = def_pos_front_mat_emission[i]; back_mat_pos_isosurf[0].specular[i] = def_back_mat_specular[i]; back_mat_pos_isosurf[0].diffuse[i] = def_pos_back_mat_diffuse[i]; back_mat_pos_isosurf[0].ambient[i] = def_pos_back_mat_ambient[i]; back_mat_pos_isosurf[0].emission[i] = def_pos_back_mat_emission[i]; front_mat_neg_isosurf[0].specular[i] = def_front_mat_specular[i]; front_mat_neg_isosurf[0].diffuse[i] = def_neg_front_mat_diffuse[i]; front_mat_neg_isosurf[0].ambient[i] = def_neg_front_mat_ambient[i]; front_mat_neg_isosurf[0].emission[i] = def_neg_front_mat_emission[i]; back_mat_neg_isosurf[0].specular[i] = def_back_mat_specular[i]; back_mat_neg_isosurf[0].diffuse[i] = def_neg_back_mat_diffuse[i]; back_mat_neg_isosurf[0].ambient[i] = def_neg_back_mat_ambient[i]; back_mat_neg_isosurf[0].emission[i] = def_neg_back_mat_emission[i]; /* ISOSURF_TRANSP_ON = 1 */ front_mat_isosurf[1].specular[i] = def_blend_front_mat_specular[i]; front_mat_isosurf[1].diffuse[i] = def_blend_front_mat_diffuse[i]; front_mat_isosurf[1].ambient[i] = def_blend_front_mat_ambient[i]; front_mat_isosurf[1].emission[i] = def_blend_front_mat_emission[i]; back_mat_isosurf[1].specular[i] = def_blend_back_mat_specular[i]; back_mat_isosurf[1].diffuse[i] = def_blend_back_mat_diffuse[i]; back_mat_isosurf[1].ambient[i] = def_blend_back_mat_ambient[i]; back_mat_isosurf[1].emission[i] = def_blend_back_mat_emission[i]; front_mat_pos_isosurf[1].specular[i]= def_blend_front_mat_specular[i]; front_mat_pos_isosurf[1].diffuse[i] = def_blend_pos_front_mat_diffuse[i]; front_mat_pos_isosurf[1].ambient[i] = def_blend_pos_front_mat_ambient[i]; front_mat_pos_isosurf[1].emission[i] = def_blend_pos_front_mat_emission[i]; back_mat_pos_isosurf[1].specular[i] = def_blend_back_mat_specular[i]; back_mat_pos_isosurf[1].diffuse[i] = def_blend_pos_back_mat_diffuse[i]; back_mat_pos_isosurf[1].ambient[i] = def_blend_pos_back_mat_ambient[i]; back_mat_pos_isosurf[1].emission[i] = def_blend_pos_back_mat_emission[i]; front_mat_neg_isosurf[1].specular[i]= def_blend_front_mat_specular[i]; front_mat_neg_isosurf[1].diffuse[i] = def_blend_neg_front_mat_diffuse[i]; front_mat_neg_isosurf[1].ambient[i] = def_blend_neg_front_mat_ambient[i]; front_mat_neg_isosurf[1].emission[i] = def_blend_neg_front_mat_emission[i]; back_mat_neg_isosurf[1].specular[i] = def_blend_back_mat_specular[i]; back_mat_neg_isosurf[1].diffuse[i] = def_blend_neg_back_mat_diffuse[i]; back_mat_neg_isosurf[1].ambient[i] = def_blend_neg_back_mat_ambient[i]; back_mat_neg_isosurf[1].emission[i] = def_blend_neg_back_mat_emission[i]; /* COLORPLANE - TRANSP OFF */ mat_colorplane[0].specular[i] = def_cpl_specular[i]; mat_colorplane[0].ambient[i] = def_cpl_ambient[i]; mat_colorplane[0].diffuse[i] = def_cpl_diffuse[i]; /* - TRANSP ON */ mat_colorplane[1].specular[i] = def_blend_cpl_specular[i]; mat_colorplane[1].ambient[i] = def_blend_cpl_ambient[i]; mat_colorplane[1].diffuse[i] = def_blend_cpl_diffuse[i]; } first_time = 0; } if ( type == (MAT_ONELEVEL | MAT_ISOSURF) ) { GLenum front = GL_FRONT, back = GL_BACK; if ( frontface_isosurf[GLPAR_FACE_WHAT_ISOSURF_POS] == GL_CW ) { back = GL_FRONT; front = GL_BACK; } glMaterialfv(front, GL_SHININESS, front_mat_isosurf[isoDisp.transparent].shininess); glMaterialfv(front, GL_SPECULAR, front_mat_isosurf[isoDisp.transparent].specular); glMaterialfv(front, GL_DIFFUSE, front_mat_isosurf[isoDisp.transparent].diffuse); glMaterialfv(front, GL_AMBIENT, front_mat_isosurf[isoDisp.transparent].ambient); glMaterialfv(front, GL_EMISSION, front_mat_isosurf[isoDisp.transparent].emission); glMaterialfv(back, GL_SHININESS, back_mat_isosurf[isoDisp.transparent].shininess); glMaterialfv(back, GL_SPECULAR, back_mat_isosurf[isoDisp.transparent].specular); glMaterialfv(back, GL_DIFFUSE, back_mat_isosurf[isoDisp.transparent].diffuse); glMaterialfv(back, GL_AMBIENT, back_mat_isosurf[isoDisp.transparent].ambient); glMaterialfv(back, GL_EMISSION, back_mat_isosurf[isoDisp.transparent].emission); } if ( type == (MAT_POSLEVEL | MAT_ISOSURF) ) { GLenum front = GL_FRONT, back = GL_BACK; if ( frontface_isosurf[GLPAR_FACE_WHAT_ISOSURF_POS] == GL_CW ) { back = GL_FRONT; front = GL_BACK; } glMaterialfv(front, GL_SHININESS, front_mat_pos_isosurf[isoDisp.transparent].shininess); glMaterialfv(front, GL_SPECULAR, front_mat_pos_isosurf[isoDisp.transparent].specular); glMaterialfv(front, GL_DIFFUSE, front_mat_pos_isosurf[isoDisp.transparent].diffuse); glMaterialfv(front, GL_AMBIENT, front_mat_pos_isosurf[isoDisp.transparent].ambient); glMaterialfv(front, GL_EMISSION, front_mat_pos_isosurf[isoDisp.transparent].emission); glMaterialfv(back, GL_SHININESS, back_mat_pos_isosurf[isoDisp.transparent].shininess); glMaterialfv(back, GL_SPECULAR, back_mat_pos_isosurf[isoDisp.transparent].specular); glMaterialfv(back, GL_DIFFUSE, back_mat_pos_isosurf[isoDisp.transparent].diffuse); glMaterialfv(back, GL_AMBIENT, back_mat_pos_isosurf[isoDisp.transparent].ambient); glMaterialfv(back, GL_EMISSION, back_mat_pos_isosurf[isoDisp.transparent].emission); } if ( type == (MAT_NEGLEVEL | MAT_ISOSURF) || type == (MAT_NEGLEVEL | MAT_ISOSURF | MAT_SOLID) ) { GLenum front = GL_FRONT, back = GL_BACK; GLint twoside_lighting; glGetIntegerv (GL_LIGHT_MODEL_TWO_SIDE, &twoside_lighting); if ( twoside_lighting ) { if ( type & MAT_SOLID ) { if ( frontface_isosurf[GLPAR_FACE_WHAT_ISOSURF_NEG] == GL_CCW ) { back = GL_FRONT; front = GL_BACK; } } } else { if ( frontface_isosurf[GLPAR_FACE_WHAT_ISOSURF_NEG] == GL_CW ) { back = GL_FRONT; front = GL_BACK; } } glMaterialfv(front, GL_SHININESS, front_mat_neg_isosurf[isoDisp.transparent].shininess); glMaterialfv(front, GL_SPECULAR, front_mat_neg_isosurf[isoDisp.transparent].specular); glMaterialfv(front, GL_DIFFUSE, front_mat_neg_isosurf[isoDisp.transparent].diffuse); glMaterialfv(front, GL_AMBIENT, front_mat_neg_isosurf[isoDisp.transparent].ambient); glMaterialfv(front, GL_EMISSION, front_mat_neg_isosurf[isoDisp.transparent].emission); glMaterialfv(back, GL_SHININESS, back_mat_neg_isosurf[isoDisp.transparent].shininess); glMaterialfv(back, GL_SPECULAR, back_mat_neg_isosurf[isoDisp.transparent].specular); glMaterialfv(back, GL_DIFFUSE, back_mat_neg_isosurf[isoDisp.transparent].diffuse); glMaterialfv(back, GL_AMBIENT, back_mat_neg_isosurf[isoDisp.transparent].ambient); glMaterialfv(back, GL_EMISSION, back_mat_neg_isosurf[isoDisp.transparent].emission); } if ( type == MAT_COLORPLANE ) { glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_colorplane[isoDisp.transparent].shininess); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_colorplane[isoDisp.transparent].specular); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_colorplane[isoDisp.transparent].diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_colorplane[isoDisp.transparent].ambient); } } /*===========================================================================*/ /* WARNING: this routine was written very fast and should be rewriten */ void LoadVoronoiMaterial(int voronoi_type) { int i; if ( ! togl_exists ) return; /* for voronoi polyhedra we don't need GL_BACK -> use just GL_FRONT and * perform polygon cooling */ if (voronoi_type == VORONOI_WIGNERSEITZ) { mat_voronoi[0].shininess[0] = def_wigner_shininess[0]; for (i=0; i<4; i++) { mat_voronoi[0].specular[i] = def_wigner_specular[i]; mat_voronoi[0].ambient[i] = def_wigner_ambient[i]; mat_voronoi[0].diffuse[i] = def_wigner_diffuse[i]; } } else if (voronoi_type == VORONOI_BZ) { mat_voronoi[0].shininess[0] = def_bz_shininess[0]; for (i=0; i<4; i++) { mat_voronoi[0].specular[i] = def_bz_specular[i]; mat_voronoi[0].ambient[i] = def_bz_ambient[i]; mat_voronoi[0].diffuse[i] = def_bz_diffuse[i]; } } else { mat_voronoi[0].shininess[0] = def_voronoi_shininess[0]; for (i=0; i<4; i++) { mat_voronoi[0].specular[i] = def_voronoi_specular[i]; mat_voronoi[0].ambient[i] = def_voronoi_ambient[i]; mat_voronoi[0].diffuse[i] = def_voronoi_diffuse[i]; } } glMaterialfv(GL_FRONT, GL_SHININESS, mat_voronoi[0].shininess); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_voronoi[0].specular); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_voronoi[0].diffuse); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_voronoi[0].ambient); } /*===========================================================================*/ /* WARNING: this routine was written very fast and should be rewriten */ void LoadCageOrVecMaterial(int type) { int i; static int first_time = 1; if ( ! togl_exists ) return; /* for voronoi polyhedra we don't need GL_BACK -> use just GL_FRONT and * perform polygon cooling */ if (first_time) { mat_vec_and_cage[GLPAR_PRIMCAGE].shininess[0] = def_primcage_shininess[0]; mat_vec_and_cage[GLPAR_CONVCAGE].shininess[0] = def_convcage_shininess[0]; mat_vec_and_cage[GLPAR_SCCAGE].shininess[0] = def_sccage_shininess[0]; mat_vec_and_cage[GLPAR_PRIMVEC].shininess[0] = def_primvec_shininess[0]; mat_vec_and_cage[GLPAR_CONVVEC].shininess[0] = def_convvec_shininess[0]; mat_vec_and_cage[GLPAR_SCVEC].shininess[0] = def_scvec_shininess[0]; mat_vec_and_cage[GLPAR_ISOPARALLE].shininess[0] = def_isoparalle_shininess[0]; for (i=0; i<4; i++) { mat_vec_and_cage[GLPAR_PRIMCAGE].specular[i] = def_primcage_specular[i]; mat_vec_and_cage[GLPAR_PRIMCAGE].ambient[i] = def_primcage_ambient[i]; mat_vec_and_cage[GLPAR_PRIMCAGE].diffuse[i] = def_primcage_diffuse[i]; mat_vec_and_cage[GLPAR_CONVCAGE].specular[i] = def_convcage_specular[i]; mat_vec_and_cage[GLPAR_CONVCAGE].ambient[i] = def_convcage_ambient[i]; mat_vec_and_cage[GLPAR_CONVCAGE].diffuse[i] = def_convcage_diffuse[i]; mat_vec_and_cage[GLPAR_SCCAGE].specular[i] = def_sccage_specular[i]; mat_vec_and_cage[GLPAR_SCCAGE].ambient[i] = def_sccage_ambient[i]; mat_vec_and_cage[GLPAR_SCCAGE].diffuse[i] = def_sccage_diffuse[i]; mat_vec_and_cage[GLPAR_PRIMVEC].specular[i] = def_primvec_specular[i]; mat_vec_and_cage[GLPAR_PRIMVEC].ambient[i] = def_primvec_ambient[i]; mat_vec_and_cage[GLPAR_PRIMVEC].diffuse[i] = def_primvec_diffuse[i]; mat_vec_and_cage[GLPAR_CONVVEC].specular[i] = def_convvec_specular[i]; mat_vec_and_cage[GLPAR_CONVVEC].ambient[i] = def_convvec_ambient[i]; mat_vec_and_cage[GLPAR_CONVVEC].diffuse[i] = def_convvec_diffuse[i]; mat_vec_and_cage[GLPAR_SCVEC].specular[i] = def_scvec_specular[i]; mat_vec_and_cage[GLPAR_SCVEC].ambient[i] = def_scvec_ambient[i]; mat_vec_and_cage[GLPAR_SCVEC].diffuse[i] = def_scvec_diffuse[i]; mat_vec_and_cage[GLPAR_ISOPARALLE].specular[i] = def_isoparalle_specular[i]; mat_vec_and_cage[GLPAR_ISOPARALLE].ambient[i] = def_isoparalle_ambient[i]; mat_vec_and_cage[GLPAR_ISOPARALLE].diffuse[i] = def_isoparalle_diffuse[i]; } first_time = 0; } if ( type != GLPAR_ISOPARALLE && xcr.dim == 3 ) { glMaterialfv(GL_FRONT, GL_SHININESS, mat_vec_and_cage[type].shininess); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_vec_and_cage[type].specular); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_vec_and_cage[type].diffuse); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_vec_and_cage[type].ambient); } else { glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_vec_and_cage[type].shininess); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_vec_and_cage[type].specular); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_vec_and_cage[type].diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_vec_and_cage[type].ambient); } } xcrysden-1.6.2/C/shank3d.c0000644000175000017500000001236113521257576013754 0ustar tonetone#ifdef XC_WITH_SHANKLAND #include #include #include #include #include "shankland.h" #include "memory.h" #include "tensor.h" float*** general_grid_shankland_interpolator_tensor3f(int n[3], int degree[3], float ***src); double *shankland3d_interpolator(int n1, int n2, int n3, int n1new, int n2new, int n3new, double *func, double (*roughnessFunc)(double m2, double sigma), double log10_damp); void shankland3d_interpolate(int n1, int n2, int n3, int n1new, int n2new, int n3new, double *func, double (*roughnessFunc)(double m2, double sigma), double log10_damp, double *result); /* BEWARE: ***src is a tensor3f of general grid (despite it contain periodic function), hence we need to the following pipeline: 1. transform general-grid (tensor3f) --> periodic-grid (double*) 2. interpolate 3. transform periodic-grid (double*) to general-grid (tensor3f) */ float*** general_grid_shankland_interpolator_tensor3f(int n[3], int degree[3], float ***src) { int i, j, k, in, ijn; int n1 = n[0]-1; int n2 = n[1]-1; int n3 = n[2]-1; int n1new = n1*degree[0]; int n2new = n2*degree[1]; int n3new = n3*degree[2]; float ***result; double *out, *func; fprintf(stderr, "\n *** executing general_grid_shankland_interpolator_tensor3f ***\n"); MALLOC_TENSOR3(float, result, n1new+1, n2new+1, n3new+1); func = (double*)malloc(sizeof(double) * n1*n2*n3 ); for(i=0; i result: ---------------- fill the zeroes into result so as to match the [n1new][n2new][n3new] dimensions */ for(i=0; i #include #include #define XC_CPP_ISOSURF #define MAX_VERTEX_COORDINATION 20 #define MAX_ISOSURFLEVELS 2 /* positive & negative isolevel */ #define ISOLINE_MAXLEVEL 500 #define ISODATA_MAXSTACK 4 #define ISODATA_MAXFRAME 1000 #define ISODATA_MAXFILES 5 /* maximum number of files, that can be * merged together; this is alo maximum * number of frames in stack #3 */ #define ISODATA_MAXBLOCK 1000 /* block is something like frame in stack * order 0 */ #define ISOSURF_SHADE_FLAT GL_FLAT /* flat-shading of isosurface */ #define ISOSURF_SHADE_SMOOTH GL_SMOOTH /* smooth-shading of isosurface */ #define ISOSURF_WIRE 0 /* render isosurface as a wireframe */ #define ISOSURF_SOLID 1 /* render isosurface in solid fashion */ #define ISOSURF_DOT 2 /* render isosurface as doted */ #define ISOSURF_CONTOUR 3 /* render isosurface in contour fashion */ #define ISOSURF_TRANSP_OFF 0 /* isosurface transparency is turnd off */ #define ISOSURF_TRANSP_ON 1 /* isosurface transparency is turnd on */ #define ISOSURF_MARCHING_CUBES 0 /* use marching cubes algorithm */ #define ISOSURF_TETRAHEDRAL 1 /* use tetrahedral decomposition */ #define ISOSURF_NORMALS_GRADIENT 0 /* calculate normals by interpolating grid's gradient vectors */ #define ISOSURF_NORMALS_TRIANGLE 1 /* calaculate normals by averaging touching triangles normals */ #define COLORBASE_FIRST 0 /* to know what is the number of first item */ #define COLORBASE_MONO 0 #define COLORBASE_RAINBOW 1 #define COLORBASE_RGB 2 #define COLORBASE_GEOGRAPHIC 3 #define COLORBASE_BLUE_WHITE_RED 4 #define COLORBASE_BLACK_BROWN_WHITE 5 #define COLORBASE_LAST 5 /* to know what is the number of last item */ #define SCALE_FUNC_FIRST 0 #define SCALE_FUNC_LIN 0 #define SCALE_FUNC_LOG 1 #define SCALE_FUNC_LOG10 2 #define SCALE_FUNC_SQRT 3 #define SCALE_FUNC_ROOT3 4 #define SCALE_FUNC_GAUSS 5 #define SCALE_FUNC_SLATER 6 #define SCALE_FUNC_LAST 6 /*****************************************************************************/ /* constants for ReadBlock0 function */ #define RB0_INIT 0 /* initialization */ #define RB0_FIND 1 /* find out the number of frames in stack #0 */ #define RB0_DUMMY 2 /* dummy reading */ #define RB0_READ 3 /* read data */ /****************************************************************************/ #define ISO_NULL 0 #define ISO_INIT 1 #define ISO_STACK 2 #define ISO_SIGN 4 #define ISO_FILES 8 #define ISO_POINTS 16 #define ISO_DATA 32 #define ISO_ISOLEVEL 64 #define ISO_POLYGONISE 128 #define ISO_COLORPLANE 256 #define ISO_COLORPLANE1 512 #define ISO_COLORPLANE2 1024 #define ISO_COLORPLANE3 2048 #define ISO_ISOLINE 4096 #define ISO_ISOLINE1 8192 #define ISO_ISOLINE2 16348 #define ISO_ISOLINE3 32768 #define ISO_EXPAND 65536 /*****************************************************************************/ /* this is for isosurf's Material properties */ #define MAT_DEFAULT 1 #define MAT_CUSTOM 2 #define MAT_ONELEVEL 4 #define MAT_POSLEVEL 8 #define MAT_NEGLEVEL 16 #define MAT_ISOSURF 32 #define MAT_COLORPLANE 64 #define MAT_SOLID 128 /*****************************************************************************/ /* here is isosurface extraction specific stuff */ #define XC_CPP_XYZ typedef struct { float x; float y; float z; } XYZ; #define XYZ_det3x3( v0, v1, v2 ) \ ( ( v0.x*v1.y*v2.z + v0.y*v1.z*v2.x + v0.z*v1.x*v2.y - \ v2.x*v1.y*v0.z - v2.y*v1.z*v0.x - v2.z*v1.x*v0.y ) ) typedef struct { XYZ pos; XYZ nml; } VERTEX; typedef struct { XYZ p; XYZ n; float val; } GRIDVERTEX; typedef struct { XYZ p[3]; /* Triangles Data */ } TRIANGLE; typedef struct { int numT[MAX_ISOSURFLEVELS]; /* Number of Triangles */ int numV[MAX_ISOSURFLEVELS]; /* Number of Vertices */ } SURFACE; typedef struct { XYZ p[8]; float val[8]; } GRIDCELL; typedef struct { float p[8][3]; float val[8]; } GRIDCELL3; typedef struct { int hexa; int deci; } CASE; typedef struct { int ix; int iy; int iz; int nx; int ny; int nz; } GRID; /* date Fri Apr 7 14:27:00 CEST 2000 ---------------------------------- MAJOR reprograming of polygonalization !!!! these are new tydefs: */ typedef struct { int nt; /* number of triangles in grid-cube */ int t0; /* index of 0-th triangle in grid-cube */ } GRID_INFO; typedef struct { int i,j,k; /* cube indices */ int ver_ind[3]; /* normal index */ int ver_status[3]; /* status of individual vertices in triangle */ } TRIG_INFO; typedef struct { int t; /* which triangle among all the triangles */ int v; /* 1st/2nd/3rd vertex in a "t" triangle */ } VERT2TRIG_INFO; typedef struct { unsigned int i,j,k; } IJK; struct ISOSURFACEstruct { struct ISOSURFACEstruct *ptr; int index; /*-------------------------*/ int revertnormals; int nvertex, ntriangl; int smooth_nstep; float smooth_weight; int *triangl_status; XYZ *vertex; XYZ *vertex_orig; XYZ *normal; float (*color)[4]; TRIG_INFO *tri2verIN; int *nver2triIN; VERT2TRIG_INFO (*ver2triIN)[MAX_VERTEX_COORDINATION]; }; typedef struct ISOSURFACEstruct ISOSURFACE; /*VERTEX *vertex[MAX_ISOSURFLEVELS];*/ XYZ *vertex[MAX_ISOSURFLEVELS]; XYZ *normal[MAX_ISOSURFLEVELS]; TRIG_INFO *tri2verIN[MAX_ISOSURFLEVELS]; TRIANGLE *triangles[MAX_ISOSURFLEVELS]; SURFACE surf; CASE cs; GRID grd, newgrd; /* grd is original as read from file, whereas newgrd is used for interpolation --> thatwhy newgrd is used in isorender.c && colorplane.c && polygonise.c */ GRIDVERTEX ***gridvertex; /*****************************************************************************/ /*****************************************************************************/ /* here is stuff related to "colorplane" */ typedef struct { int ncol; /* up to 15 different basic colors */ float basecol[15][4]; float baseintv[15]; } BASECOLOR; typedef struct { float p[3]; float val; float col[4]; } PLANEVERTEX; /***************************************************************************** * here is stuff related to isosurface && Tcl?tk implementation of xc_iso * group of custom Tcl command */ #ifdef XC_CPP_STRUCT typedef struct { int nstack; /* n of stack used; * maximum nstack could be ISODATA_MAXSTACK */ int nframe[ISODATA_MAXFILES][ISODATA_MAXSTACK]; /* number of frames in * each stack */ int framesign[ISODATA_MAXSTACK][ISODATA_MAXFRAME]; /* sign of stack */ int dim[MAX_ISOOBJECTS]; /* dimension of objects */ float min; /* minimum vertex value */ float max; /* maximim vertex value */ float mintol; /* minimum tolerances used is VertexInterp */ float min_allowed[MAX_ISOOBJECTS]; /* minimum vertex value to be drawn*/ float max_allowed[MAX_ISOOBJECTS]; /* maximum vertex value to be drawn*/ char *isofiles[ISODATA_MAXFILES]; /* filenames */ char error[512]; /* error message */ FILE *fp; /* filepointer */ FILE *bin_fp; /* filepointer for binary file */ FILE *bin_vertex_fp; /* filepointer for binary file where current vertex / planevertex data are stored */ int nlevel; /* number of levels for isosurface's isolevel; max # of levels: MAX_ISOSURFLEVELS */ float isolevel[MAX_ISOSURFLEVELS]; double points[MAX_ISOOBJECTS][4][3]; XYZ vec[MAX_ISOOBJECTS][3]; /* vectors that specify space of isosurface/isoplate */ XYZ colnml[MAX_ISOOBJECTS]; /* normal for colorplane */ int smoothsteps; /* # of surface smoothing steps */ float smoothweight; /* surface smoothing weight */ int cell_orientation; /* orientation of the unit-cell spanned by vecs */ } ISOSURF_DATA; ISOSURF_DATA isodata; typedef int logical; /* synonym for logical type */ typedef struct { logical gridvertex_malloc; logical plvertex_malloc[MAX_ISOOBJECTS]; logical isoline2D_malloc[MAX_ISOOBJECTS]; logical vertex_malloc[MAX_ISOSURFLEVELS]; logical triangl_malloc[MAX_ISOSURFLEVELS]; logical tri2verIN_malloc[MAX_ISOSURFLEVELS]; int max_n_vertex[MAX_ISOSURFLEVELS]; int max_n_triangl[MAX_ISOSURFLEVELS]; int max_n_isoline2D[MAX_ISOOBJECTS][ISOLINE_MAXLEVEL]; logical bin_file_open; logical bin_vertex_file_open; unsigned int stateflag; } ISOSTATE; /* float (*datavalue)[MAXSIZE][MAXSIZE]; */ /****************************************************************************/ /* ---> this are poniters for storing ADDRESSES */ /* void *gridvertex_address; */ /* memory address for gridvertex & plvertex */ /* void *vertex_address; */ /* memory address for vertex */ /* void *triangl_address; */ /* memory address for triangles */ /*****************************************************************************/ /* this is used for xc_isoexpand */ typedef struct { double rep_vec[4][4]; /* here it's double, because it should be the same as in Vector structure */ int shape; int expand; int transl[3][3]; /* 3 translational vectors in fractional coordinates; used for isodata.dim = 2 */ int irepvec[3]; /* how many times to repeat "iso*" in each direction */ } IsoExpand; IsoExpand isoexpand[MAX_ISOOBJECTS]; #endif /*****************************************************************************/ /* ISOLINES --- ISOLINES --- ISOLINES --- ISOLINES --- ISOLINES --- ISOLINES */ /*****************************************************************************/ #define ISOLINE_MONOCOLOR 0 #define ISOLINE_POLYCOLOR 1 #define ISOLINE_NODASH 2 #define ISOLINE_NEGDASH 3 #define ISOLINE_FULLDASH 4 typedef struct { XYZ p1; XYZ p2; } LINE; #ifdef XC_CPP_STRUCT typedef struct { int linecolor; /* code for linecolor type */ float monocolor[4]; /* monocolor */ unsigned short linedash; /* code for linedash type */ int nlevel; /* number of levels */ int iseg[ISOLINE_MAXLEVEL]; /* current # of segment for ilevel */ float level[ISOLINE_MAXLEVEL]; /* values of levels */ unsigned short dash[ISOLINE_MAXLEVEL]; /* types of line for each level */ int dashfactor[ISOLINE_MAXLEVEL]; /* factor for linedash */ float color[ISOLINE_MAXLEVEL][4]; /* color of ilevel contour */ float linewidth; /* width of the isoline */ LINE *segment[ISOLINE_MAXLEVEL]; /* segments data */ } ISOLINE2D; ISOLINE2D isoline2D[MAX_ISOOBJECTS]; #endif #endif xcrysden-1.6.2/C/datagrid.c0000644000175000017500000002413313514361361014166 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/datagrid.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #include "isosurf.h" #include "system.h" extern PLANEVERTEX ***plvertex; struct DATAGRID *grid, *gridPtr = NULL; static int datagrid_index = 0; static int datagrid_subindex = 0; static char *comment_line; static int comment_line_malloced = 0; struct DATAGRID_FILE { int opened; FILE *fp; char *name; int name_malloced; } dgf = {0, NULL, NULL, 0}; /* --- function prototypes --- */ static void AddToGridList(struct DATAGRID *g); void CloseGridList(void); struct DATAGRID *FindDataGrid(int index); int GetNumberOfGridBlocks(void); void NewGridList( int gridtype, FILE *gridFP ); FILE *MaybeOpenDataGridFile(char *mode); void CloseDataGridFile(void); void SetDataGridCommentLine(char *line); int ReadDataGrid(FILE *fp, FILE *gridFP, int gridtype, char *ident); int ReadBandGrid(FILE *fp, FILE *gridFP, int gridtype, char *ident); int WriteDataGrid(FILE *fp, int gridtype, const char *ident, int obj); static void AddToGridList(struct DATAGRID *g) { g->ptr = gridPtr; gridPtr = g; } void CloseGridList(void) { struct DATAGRID *g = gridPtr, *f; while(g) { f = g->ptr; free((FREE_ARG) g); g = f; } datagrid_index = 0; datagrid_subindex = 0; comment_line_malloced = 0; CloseDataGridFile(); dgf.opened = 0; dgf.fp = NULL; dgf.name = NULL; dgf.name_malloced = 0; gridPtr = NULL; } struct DATAGRID *FindDataGrid(int index) { struct DATAGRID *g = gridPtr; while (g) { if (index == g->index) return g; g = g->ptr; } return NULL; } int GetNumberOfGridBlocks(void) { return datagrid_index; } void NewGridList( int gridtype, FILE *gridFP ) { grid = (struct DATAGRID *) malloc ( sizeof(struct DATAGRID) ); grid->fp = gridFP; grid->type = gridtype; grid->index = datagrid_index++; grid->ident = (char *) malloc( sizeof(char) * 512 ); sprintf(grid->ident, "%s", comment_line); datagrid_subindex = 0; AddToGridList( grid ); } FILE *MaybeOpenDataGridFile(char *mode) { if (!dgf.name_malloced) { dgf.name = (char *) malloc ( sizeof(char) * 256 ); sprintf(dgf.name, "%s%s%d", xc_system.scratch_dir, "xc_datagrid.", xc_system.pid); dgf.name_malloced = 1; } if (!dgf.opened) { dgf.fp = fopen(dgf.name, mode); dgf.opened = 1; } return dgf.fp; } void CloseDataGridFile(void) { if (dgf.opened) { fclose(dgf.fp); dgf.opened = 0; } } void SetDataGridCommentLine(char *line) { if (!comment_line_malloced) { comment_line = (char *) malloc( sizeof(char) * 512 ); comment_line_malloced = 1; } sprintf(comment_line, "%s", line); } int ReadDataGrid(FILE *fp, FILE *gridFP, int gridtype, char *ident) { register int i, j, k; int len; float value; int n[3] = {0, 0, 0}; float o[3] = { 0.0, 0.0, 0.0 }; float v[3][3] = { {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}}; grid->fpos[datagrid_subindex] = ftell( gridFP ); len = strlen(ident) + 10; grid->subident[datagrid_subindex] = (char *) calloc( len, sizeof(char) ); sprintf(grid->subident[datagrid_subindex],"%s", ident); if ( gridtype == DATAGRID_2D ) { if ( fscanf(fp,"%d %d", n, n+1) != gridtype ) return XC_ERROR; } else if ( gridtype == DATAGRID_3D ) { if ( fscanf(fp,"%d %d %d", n, n+1, n+2) != gridtype ) return XC_ERROR; } if ( fscanf(fp,"%f %f %f", o, o+1, o+2) != 3 ) return XC_ERROR; for (i=0; in[i] = n[i]; grid->orig[i] = o[i]; for(j=0; j<3; j++) grid->vec[i][j] = v[i][j]; } } else { for(i=0; i<3; i++) { if ( n[i] != grid->n[i] || o[i] != grid->orig[i] ) return XC_ERROR; for(j=0; j<3; j++) if ( v[i][j] != grid->vec[i][j] ) return XC_ERROR; } } if ( gridtype == DATAGRID_2D) { for (i=0; in[1]; i++) for (j=0; jn[0]; j++) { if ( fscanf(fp,"%f", &value) != 1 ) return XC_ERROR; fwrite(&value, sizeof(float), 1, gridFP); } } else if ( gridtype == DATAGRID_3D ) { len=0; for (i=0; in[2]; i++) for (j=0; jn[1]; j++) for (k=0; kn[0]; k++) { if ( fscanf(fp,"%f", &value) != 1 ) { fprintf(stderr,"(error in reading datagrid values; only %d values read)\n", len); return XC_ERROR; } fwrite(&value, sizeof(float), 1, gridFP); len++; } } grid->n_of_subgrids = ++datagrid_subindex; return XC_OK; } int ReadBandGrid(FILE *fp, FILE *gridFP, int gridtype, char *ident) { register int i, j, k, ib; int len, nband; float value; int n[3] = {0, 0, 0}; float o[3] = { 0.0, 0.0, 0.0 }; char band[5]; float v[3][3] = { {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}}; grid->fpos[datagrid_subindex] = ftell( gridFP ); len = strlen(ident) + 10; grid->subident[datagrid_subindex] = (char *) calloc( len, sizeof(char) ); sprintf(grid->subident[datagrid_subindex],"%s", ident); fscanf(fp,"%d", &nband); grid->nband = nband; grid->band_index[datagrid_subindex] = (int *) malloc( (grid->nband+1) * sizeof(int) ); grid->band_fpos[datagrid_subindex] = (long *) malloc( (grid->nband+1) * sizeof(long) ); grid->lband = 1; if ( gridtype == DATAGRID_2D ) { if ( fscanf(fp,"%d %d", n, n+1) != gridtype ) return XC_ERROR; } else if ( gridtype == DATAGRID_3D ) { if ( fscanf(fp,"%d %d %d", n, n+1, n+2) != gridtype ) return XC_ERROR; } /* read ORIGIN and VECTORS */ if ( fscanf(fp,"%f %f %f", o, o+1, o+2) != 3 ) return XC_ERROR; for (i=0; in[i] = n[i]; grid->orig[i] = o[i]; for(j=0; j<3; j++) grid->vec[i][j] = v[i][j]; } } else { for(i=0; i<3; i++) { if ( n[i] != grid->n[i] || o[i] != grid->orig[i] ) return XC_ERROR; for(j=0; j<3; j++) if ( v[i][j] != grid->vec[i][j] ) return XC_ERROR; } } for(ib=0; ibnband; ib++) { /* read BAND: */ if ( fscanf(fp, "%5s %i", band, &grid->band_index[datagrid_subindex][ib]) != 2 ) { fprintf(stderr, "ERROR: Error reading %d-th BAND !!!\n", ib); return XC_ERROR; } grid->band_fpos[datagrid_subindex][ib] = ftell( gridFP ); grid->minvalue[ib] = +1.0e+10; grid->maxvalue[ib] = -1.0e+10; if ( gridtype == DATAGRID_2D) { for (i=0; in[0]; i++) for (j=0; jn[1]; j++) { if ( fscanf(fp,"%f", &value) != 1 ) return XC_ERROR; fwrite(&value, sizeof(float), 1, gridFP); if ( value < grid->minvalue[ib] ) grid->minvalue[ib] = value; if ( value > grid->maxvalue[ib] ) grid->maxvalue[ib] = value; } } else if ( gridtype == DATAGRID_3D ) { for (i=0; in[0]; i++) for (j=0; jn[1]; j++) for (k=0; kn[2]; k++) { if ( fscanf(fp,"%f", &value) != 1 ) return XC_ERROR; fwrite(&value, sizeof(float), 1, gridFP); if ( value < grid->minvalue[ib] ) grid->minvalue[ib] = value; if ( value > grid->maxvalue[ib] ) grid->maxvalue[ib] = value; } } } grid->n_of_subgrids = ++datagrid_subindex; return XC_OK; } int WriteDataGrid(FILE *fp, int gridtype, const char *ident, int obj) { char *keyword = (char *) malloc( sizeof(char) * 256 ); char *key; register int i, j, k, ind; key = "DATAGRID_2D_"; if (gridtype == DATAGRID_3D) key = "DATAGRID_3D_"; sprintf(keyword, "%s%s", key, ident); fprintf(fp, "%s\n", keyword); if (gridtype == DATAGRID_2D) { int n, m; n = newgrd.nx; m = newgrd.ny; if ( obj == ISOOBJ_PLANE2 ) { n = newgrd.nz; m = newgrd.nx; } if ( obj == ISOOBJ_PLANE3 ) { n = newgrd.ny; m = newgrd.nz; } fprintf(fp, "%d %d\n", n, m); fprintf(fp, "%e %e %e\n", isodata.points[obj][0][0], isodata.points[obj][0][1], isodata.points[obj][0][2]); for (i=0; i<2; i++) fprintf(fp, "%e %e %e\n", isodata.vec[obj][i].x, isodata.vec[obj][i].y, isodata.vec[obj][i].z); ind = 0; for (j=0; j #include #include "struct.h" #include "xcfunc.h" /* --- function prototypes --- */ void makeRasterFont(void); void makeAtomLabels(void); void makeXYZLabels(void); static void arrow(void); void makeCrdList(void); void makeTemp3D2DList(void); extern GLubyte rasters[][13]; extern char *element[]; /* extern GLuint xcGenLists( GLsizei i ); */ GLuint fontOffset; RasterFontSize rf = {8, 13, 0.0, 0.0, 0.0, 0.0}; void makeRasterFont(void) { GLuint i; glPixelStorei(GL_UNPACK_ALIGNMENT, 1); /* 1 for byte-alignment */ fontOffset = xcGenLists (128); for (i = 32; i < 127; i++) { glNewList(i+fontOffset, GL_COMPILE); glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, rasters[i-32]); glEndList(); } } /*****************************************************************************/ /* make lists for atom labels (all elements) */ void makeAtomLabels(void) { int i; atomlabelOffset = xcGenLists(MAXNAT + 1); for(i=0; i < MAXNAT + 1; i++) { glNewList(atomlabelOffset + i, GL_COMPILE); glPushAttrib (GL_LIST_BIT); glListBase(fontOffset); glCallLists(strlen(element[i]), GL_UNSIGNED_BYTE, (GLubyte *) element[i]); glPopAttrib (); glEndList(); } } /* also make lists for x,y,z label that go with coordinate sistem, that will be * displayed */ void makeXYZLabels(void) { int i; char *xyz[3] = { "x", "y", "z" }; xyzlabelOffset = xcGenLists(3); for(i=0; i < 3; i++) { glNewList(xyzlabelOffset + i, GL_COMPILE); glPushAttrib (GL_LIST_BIT); glListBase(fontOffset); glCallLists(1, GL_UNSIGNED_BYTE, (GLubyte *) xyz[i]); glPopAttrib (); glEndList(); } } #define T 0.8 #define S 0.0625 GLuint arrowList = -1; GLuint crdList = -1; GLuint xyplaneList = -1; static void arrow(void) { int i; double arrow[18][3] = { /* arrow for X axis */ { T, S, 0}, { T,-S, 0}, {1.0, 0.0, 0.0}, { T, 0,-S}, { T, 0, S}, {1.0, 0.0, 0.0}, /* arrow for Y axis */ {-S, T, 0}, { S, T, 0}, {0.0, 1.0, 0.0}, { 0, T, S}, { 0, T, -S}, {0.0, 1.0, 0.0}, /* arrow for Z axis */ { S, 0, T}, {-S, 0, T}, {0.0, 0.0, 1.0}, { 0,-S, T}, { 0, S, T}, {0.0, 0.0, 1.0}}; arrowList = xcGenLists(1); glNewList( arrowList, GL_COMPILE ); /* X axis */ glBegin(GL_LINES); glVertex3d( 0.0, 0.0, 0.0); glVertex3d( 1.0, 0.0, 0.0); glEnd(); glBegin(GL_TRIANGLES); for(i=0; i<6; ) { glVertex3dv( arrow[i++] ); glVertex3dv( arrow[i++] ); glVertex3dv( arrow[i++] ); } glEnd(); /* Y axis */ glBegin(GL_LINES); glVertex3d( 0.0, 0.0, 0.0); glVertex3d( 0.0, 1.0, 0.0); glEnd(); glBegin(GL_TRIANGLES); for(; i<12; ) { glVertex3dv( arrow[i++] ); glVertex3dv( arrow[i++] ); glVertex3dv( arrow[i++] ); } glEnd(); /* Z axis */ glBegin(GL_LINES); glVertex3d( 0.0, 0.0, 0.0); glVertex3d( 0.0, 0.0, 1.0); glEnd(); glBegin(GL_TRIANGLES); for(; i<18; ) { glVertex3dv( arrow[i++] ); glVertex3dv( arrow[i++] ); glVertex3dv( arrow[i++] ); } glEnd(); glEndList(); } void makeCrdList(void) { /* load arrowList */ arrow(); crdList = xcGenLists(1); printf("makeCrdList> crdList=%d\n", crdList); fflush(stdout); /* first make XYZ axes */ glNewList( crdList, GL_COMPILE ); glCallList(arrowList); /* now X label */ glRasterPos3f( 1.1,-0.1, 0.0); glCallList(xyzlabelOffset); /* now Y label */ glRasterPos3f(-0.1, 1.1, 0.0); glCallList(xyzlabelOffset + 1); /* now Z label */ glRasterPos3f(-0.1,-0.1, 1.1); glCallList(xyzlabelOffset + 2); glEndList(); xyplaneList = xcGenLists(1); glNewList( xyplaneList, GL_COMPILE ); glBegin(GL_POLYGON); glVertex3f(-.2, .2, 0.2); glVertex3f( .2, .2, 0.2); glVertex3f( .2,-.2, 0.2); glVertex3f(-.2,-.2, 0.2); glEnd(); glEndList(); } GLuint tempDisable3Dlist, tempEnable3Dlist; /* when we are displaying coor-sist, we are switching between modes; it's * more efficient to "pack" this switching in displayLists */ void makeTemp3D2DList(void) { /* when we are displaying coord-sist in 3D mode, * we must Disable some things */ tempDisable3Dlist = xcGenLists(1); glNewList( tempDisable3Dlist, GL_COMPILE ); glDisable( GL_LIGHTING ); glDisable( GL_LIGHT0 ); glDisable( GL_DITHER ); glEndList(); /* than we must go back */ tempEnable3Dlist = xcGenLists(1); glNewList( tempEnable3Dlist, GL_COMPILE ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); glEnable( GL_DITHER ); glEndList(); } xcrysden-1.6.2/C/hbonds.c0000644000175000017500000001460113112023400013642 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/hbonds.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #include "xcfunc.h" #include "memory.h" /* variable */ H_Bond hbonds = { 0, /* number of H-bonds */ 10, /* max_n */ (int*)NULL, /* H_like_list: H-only */ (int*)NULL, /* O_like_list: N, O, F, Cl */ {1.0, 1.0, 1.0, 1.0}, /* color of the H-bonds */ 1.3, /* minimum H-distance */ 2.5, /* maximum H-distance */ 120.0, /* minimum angle */ 0xAAAA, /* line pattern */ 2, /* pattern size (i.e. how long pattern appears) */ 4.0, /* line width */ (VEC3d*) NULL, /* start_coor */ (VEC3d*) NULL /* end_coor */ }; extern GLuint tempDisable3Dlist, tempEnable3Dlist; /* function prototypes */ static short int _atomFromList(int nat, int *list); /* global functions */ void make_H_Bonds(void) { register int ih, _ih, jo; int n; double dis, len, angle, chemBondVec[3], HbondVec[3]; if (hbonds.start_coor == (VEC3d*) NULL) { hbonds.start_coor = (VEC3d*) xcCalloc(hbonds.max_n, sizeof(VEC3d)); hbonds.end_coor = (VEC3d*) xcCalloc(hbonds.max_n, sizeof(VEC3d)); } /* NOTE: 1st loop(ih) is over H-like atoms, 2nd loop(jo) is over O-like atoms */ n = 0; for (ih = 1; ih <= natoms; ih++) { /* check if ith-atom is Hydrogen like */ if ( _atomFromList(nat[ih], hbonds.H_like_list ) == XC_FALSE) continue; /* NOTE: ----- H-bond is formed only when X-H....X angle is close to 180 degrees. For this reason we have to find the chemical bonds of the ih-atom and see if a potential H-bond forms the angle close to 180 degree-->only then we assign it as an H-bond */ for (_ih = 1; _ih <= natoms; _ih++) { if (ih == _ih) continue; dis = dist6(xat[ih], xat[_ih], yat[ih], yat[_ih], zat[ih], zat[_ih]); len = rcov[nat[ih]] + rcov[nat[_ih]]; if ( dis < len ) { /* chemical bond */ chemBondVec[0] = xat[_ih] - xat[ih]; chemBondVec[1] = yat[_ih] - yat[ih]; chemBondVec[2] = zat[_ih] - zat[ih]; /* hydrogen forms only one chemicla bond */ break; } } for (jo = 1; jo <= natoms; jo++) { if (ih == jo) continue; /* check if jth-atom is O-like */ if ( _atomFromList(nat[jo], hbonds.O_like_list ) == XC_FALSE) continue; /* check if H-bond distance criteria is meet */ dis = dist6(xat[ih],xat[jo], yat[ih],yat[jo], zat[ih],zat[jo]); if ( dis < hbonds.length_max && dis > hbonds.length_min ) { /* The distance criteria for hydrogen bond is met !!! Check the angle criteria */ HbondVec[0] = xat[jo] - xat[ih]; HbondVec[1] = yat[jo] - yat[ih]; HbondVec[2] = zat[jo] - zat[ih]; angle = RAD2DEG * acos(DOT_V3(HbondVec, chemBondVec) / (NORM_V3(HbondVec) * NORM_V3(chemBondVec))); if (ABS(angle) > hbonds.angle_min) { /* we have a hydrogen bond */ hbonds.start_coor[n][0] = xat[ih]; hbonds.start_coor[n][1] = yat[ih]; hbonds.start_coor[n][2] = zat[ih]; hbonds.end_coor[n][0] = xat[jo]; hbonds.end_coor[n][1] = yat[jo]; hbonds.end_coor[n][2] = zat[jo]; n++; } if (n >= hbonds.max_n) { /* reallocate */ hbonds.max_n *= 2; hbonds.start_coor = (VEC3d*) xcRealloc(hbonds.start_coor, hbonds.max_n * sizeof(VEC3d)); hbonds.end_coor = (VEC3d*) xcRealloc(hbonds.end_coor, hbonds.max_n * sizeof(VEC3d)); /* hbonds.chemBond = (double (*)[3]) xcRealloc(hbonds.chemBond, (size_t) hbonds.max_n * sizeof(double [3])); */ /* hbonds.start_coor = xcReallocVEC3d(hbonds.start_coor, hbonds.max_n, hbonds.max_n*2); hbonds.end_coor = xcReallocVEC3d(hbonds.end_coor, hbonds.max_n, hbonds.max_n*2); */ } } } } hbonds.n = n; } void xcRenderHbonds3D(void) { register int ib; glCallList ( tempDisable3Dlist ); glEnable ( GL_LINE_STIPPLE ); glLineStipple ( hbonds.line_patternsize, hbonds.line_pattern ); glColor3fv ( hbonds.color ); glLineWidth ( hbonds.line_width ); glBegin(GL_LINES); for (ib=0; ib < hbonds.n; ib++) { glVertex3dv( hbonds.start_coor[ib] ); glVertex3dv( hbonds.end_coor[ib] ); } glEnd(); glDisable ( GL_LINE_STIPPLE ); glCallList ( tempEnable3Dlist ); } /* static functions */ static short int _atomFromList(int nat, int *list) { while (*list > 0) { if (nat == *list) { return XC_TRUE; } list++; } return XC_FALSE; } /* VEC3d *xcReallocVEC3d(VEC3d *v, int old_nmemb, int new_nmemb) { register int i; VEC3d *ptr = (VEC3d*) xcCalloc(new_nmemb, sizeof(VEC3d)); fprintf(stderr,"xcReallocVEC3d vec = %d\n", v); for (i=0; i #include #include #include #include #include "xcGLparam.h" #include "struct.h" #include "isosurf.h" #include "memory.h" #include "molsurf.h" #include "vector.h" #include "xcfunc.h" #define NUM_OF_POINTS(old_n,degree) ( (old_n - 1)*(degree) + 1 ) extern void SetUnitCellCage( double vec[4][4], CellCage *cage ); extern NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl); extern MOL_SURF *FindMolSurf(int index); extern int cryReadSurfARGS(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[], NEW_WIN_CONTEXT *wc, MOL_SURF *mols, struct READSURF_OPT *opt); extern void MarchCubeNew(ISOSURFACE *iso, float ***gridvalue, float vec[][3], float origin[], int ix, int iy, int iz, float isolevel, int algorithm, int shade_model, int normals_model); extern void xcSurfSmoothing( ISOSURFACE *iso, float isolevel ); extern float ***cryGeneralGridRegPeriodInterpolator_f_LCASI3D(int n[3], int degree[3], float ***src); static void Set_Orig_and_Size( NEW_WIN_CONTEXT *wc, MOL_SURF *m, struct Togl *togl ); /* -TYPE -FS -RADIU -LEVEL -CUTOFF -COLORSHEME -DRAWSTYLE -TRANSPARENT -SHADEMODEL -MONOCOLOR -FRONTMONOCOLOR -BACKMONOCOLOR -SURFACETYPE -RESOLUTION -SMOOTHSTEPS -SMOOTHWEIGHT -FRONTFACE -REVERTNORMALS Sample READSURF_OPT struct: struct READSURF_OPT *ReadSurf_Options = { {"-type", XC_ALLOWED}, {"-fs", XC_ALLOWED}, {"-render", XC_ALLOWED}, {"-radiu", XC_ALLOWED}, {"-level", XC_ALLOWED}, {"-cutoff" XC_ALLOWED}, {"-colorsheme", XC_ALLOWED}, {"-drawstyle", XC_ALLOWED}, {"-transparent", XC_ALLOWED}, {"-shademodel", XC_ALLOWED}, {"-monocolor", XC_ALLOWED}, {"-frontmonocolor", XC_ALLOWED}, {"-backmonocolor", XC_ALLOWED}, {"-surfacetype", XC_ALLOWED}, {"-resolution", XC_ALLOWED}, {"-smoothsteps", XC_ALLOWED}, {"-smoothweight", XC_ALLOWED}, {"-frontface", XC_ALLOWED}, {"-revertnormals", XC_ALLOWED}, {NULL, NULL} } *** option: -fs { -gridindex \ -gridsubindex \ -bandindex \ -celltype para|bz \ -cropbz 0|1 \ -displaycell 0|1 \ ? -celldisplaytype wire|rod|solid ? -interpolationdegree {n1 n2 n3} -wirecellcolor {r g b a} -solidcellcolor {r g b a} } */ /***************************************************************************** cry_surf -ident -type gauss|exp|unigauss|uniexp|fermisurface \ -fs {options} -radius cov|VdW \ -level \ -cutoff \ -colorscheme atomic|monochrome \ -drawstyle solid|wire|dot \ -transparent 0|1 \ -shademodel smooth|flat \ -monocolor { } \ -frontmonocolor { } \ -backmonocolor" { } \ -surfacetype molsurf|gap -resolution \ -smoothsteps \ -smoothweight -frontface CW|CCW -revertnormals 0|1 ADD: cry_surfreg cry_surfconfig -ident \ -render 0|1 \ -level -colorscheme atomic|monochrome \ -drawstyle solid|wire|dot \ -transparent 0|1 \ -shademodel smooth|flat -monocolor { } \ -frontmonocolor { } \ -backmonocolor" { } \ -surfacetype molsurf|gap \ -smoothsteps \ -smoothweight -frontface CW|CCW -revertnormals 0|1 preveri se pointerje pri iso. V zacetku jih postavi na NULL, potem pa v MarchCube, ce niso NULL jih najprej free(); *****************************************************************************/ int FindSurfaceOfWindow( NEW_WIN_CONTEXT *wc, MOL_SURF *mols ) { register int i; for(i=0; iVPf.nsurface; i++) if ( wc->VPf.surfaceInd[i] == mols->isosurf_index ) return i; return -1; } int CRY_SurfRegCmd(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[]) { int ident; char *result = (char *) Tcl_Alloc((size_t) 10 * sizeof(char)); struct Togl *togl; NEW_WIN_CONTEXT *wc; MOL_SURF *m; /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } wc = FindWinContextByTogl( togl ); ident=NewMolSurf(); m = FindMolSurf( ident ); if( m->isosurf_index < 0) m->isosurf_index = NewIsoSurf(); sprintf(result,"%d",ident); Tcl_SetResult(interp, result, TCL_DYNAMIC); wc->VPf.surface = (int *) realloc( wc->VPf.surface, (size_t) (wc->VPf.nsurface+1) * sizeof(int) ); wc->VPf.surfaceInd = (int *) realloc( wc->VPf.surfaceInd, (size_t) (wc->VPf.nsurface+1) * sizeof(int) ); wc->VPf.surfacePtr = (void **) realloc( wc->VPf.surfacePtr, (size_t) (wc->VPf.nsurface+1) * sizeof(void*) ); wc->VPf.surface[wc->VPf.nsurface] = 0; wc->VPf.surfaceInd[wc->VPf.nsurface] = m->isosurf_index; wc->VPf.surfacePtr[wc->VPf.nsurface++] = (void *) m; return TCL_OK; } int CRY_SurfConfigCmd(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[]) { register int i; short int crop_bz; int s_nstep, interp_n[3]; float s_weight, s_level; struct Togl *togl; FS_DATA fs; NEW_WIN_CONTEXT *wc; MOL_SURF *mols; ISOSURFACE *iso; struct READSURF_OPT opt[] = { {"-type", XC_FORBIDDEN}, {"-fs", XC_ALLOWED}, {"-render", XC_ALLOWED}, {"-radiu", XC_FORBIDDEN}, {"-level", XC_ALLOWED}, {"-cutoff", XC_FORBIDDEN}, {"-colorsheme", XC_FORBIDDEN}, {"-drawstyle", XC_ALLOWED}, {"-transparent", XC_ALLOWED}, {"-shademodel", XC_ALLOWED}, {"-monocolor", XC_ALLOWED}, {"-frontmonocolor", XC_ALLOWED}, {"-backmonocolor", XC_ALLOWED}, {"-surfacetype", XC_FORBIDDEN}, {"-resolution", XC_FORBIDDEN}, {"-smoothsteps", XC_ALLOWED}, {"-smoothweight", XC_ALLOWED}, {"-frontface", XC_ALLOWED}, {"-revertnormals", XC_ALLOWED}, {NULL, 0} }; /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } wc = FindWinContextByTogl( togl ); /* -IDENTIFIER */ if ( strncmp(argv[2], "-iden", 5) == 0 ) { int ident; if ( Tcl_GetInt(interp, argv[3], &ident) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[2], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols = FindMolSurf( ident ); if (!mols) { char rss[1024]; snprintf(rss, sizeof(rss),"couldn't find MolSurface %d !!!\n", ident); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (mols->isosurf_index < 0) { Tcl_SetResult(interp, "cry_surf must be called before cry_surfconfig!!!",TCL_STATIC); return TCL_ERROR; } } else { Tcl_SetResult(interp, "Usage: cry_surfconfig -ident indent options ...",TCL_STATIC); return TCL_ERROR; } fs.gridindex = mols->fs.gridindex; fs.gridsubindex = mols->fs.gridsubindex; fs.bandindex = mols->fs.bandindex; fs.celltype = mols->fs.celltype; fs.cropbz = mols->fs.cropbz; s_level = mols->isolevel; s_nstep = mols->smooth_nstep; s_weight = mols->smooth_weight; crop_bz = mols->fs.cropbz; interp_n[0] = mols->interp_n[0]; interp_n[1] = mols->interp_n[1]; interp_n[2] = mols->interp_n[2]; /* read COMM LINE ARGS ****************************************/ if (cryReadSurfARGS(clientData, interp, argc, argv, wc, mols, opt) == TCL_ERROR) { return TCL_ERROR; } /**************************************************************/ iso = FindIsoSurf( mols->isosurf_index ); iso->smooth_nstep = mols->smooth_nstep; iso->smooth_weight = mols->smooth_weight; if ( fs.gridindex != mols->fs.gridindex || fs.gridsubindex != mols->fs.gridsubindex || fs.bandindex != mols->fs.bandindex || fs.celltype != mols->fs.celltype ) { Tcl_SetResult(interp, "can't change gridindex, gridsubindex, bandindex and celltype by cry_surfconfig command", TCL_STATIC); return TCL_ERROR; } if ( interp_n[0] != mols->interp_n[0] || interp_n[1] != mols->interp_n[1] || interp_n[2] != mols->interp_n[2] ) { /* LCASI intepolation */ int _n[3]; /* _n[0] = mols->i - 1; _n[1] = mols->j - 1; _n[2] = mols->k - 1; */ _n[0] = mols->i; _n[1] = mols->j; _n[2] = mols->k; if ( mols->interp_molgrid != (float***) NULL ) { xcFree_Tensor3f (mols->interp_molgrid); mols->interp_molgrid = (float***) NULL; } /*mols->interp_molgrid = cryRegPeriodInterpolator_f_LCASI3D(_n, mols->interp_n, mols->molgrid);*/ if ( mols->interp_n[0] * mols->interp_n[1] * mols->interp_n[2] > 1 ) { /* mols->interp_molgrid = cryGeneralGridRegPeriodInterpolator_f_LCASI3D (_n, mols->interp_n, mols->molgrid); */ mols->interp_molgrid = general_grid_fft_interpolator_tensor3f(_n, mols->interp_n, mols->molgrid); /* mols->interp_molgrid = general_grid_shankland_interpolator_tensor3f(_n, mols->interp_n, mols->molgrid); */ MarchCubeNew(iso, mols->interp_molgrid, mols->vec, mols->lowcoor, NUM_OF_POINTS(mols->i, mols->interp_n[0]), NUM_OF_POINTS(mols->j, mols->interp_n[1]), NUM_OF_POINTS(mols->k, mols->interp_n[2]), mols->isolevel, ISOSURF_MARCHING_CUBES, ISOSURF_SHADE_SMOOTH, ISOSURF_NORMALS_GRADIENT); } else { MarchCubeNew(iso, mols->molgrid, mols->vec, mols->lowcoor, mols->i, mols->j, mols->k, mols->isolevel, ISOSURF_MARCHING_CUBES, ISOSURF_SHADE_SMOOTH, ISOSURF_NORMALS_GRADIENT); } /*xcSurfSmoothing( iso, mols->isolevel );*/ if ( mols->fs.cropbz && mols->fs.celltype == XCR_BZ ) CropBz_New( wc, iso ); } else if ( interp_n[0] * interp_n[1] * interp_n[2] > 1 && s_level != mols->isolevel ) { MarchCubeNew(iso, mols->interp_molgrid, mols->vec, mols->lowcoor, NUM_OF_POINTS(mols->i, mols->interp_n[0]), NUM_OF_POINTS(mols->j, mols->interp_n[1]), NUM_OF_POINTS(mols->k, mols->interp_n[2]), mols->isolevel, ISOSURF_MARCHING_CUBES, ISOSURF_SHADE_SMOOTH, ISOSURF_NORMALS_GRADIENT); /*xcSurfSmoothing( iso, mols->isolevel );*/ if ( mols->fs.cropbz && mols->fs.celltype == XCR_BZ ) CropBz_New( wc, iso ); } else if ( s_level != mols->isolevel) { MarchCubeNew(iso, mols->molgrid, mols->vec, mols->lowcoor, mols->i, mols->j, mols->k, mols->isolevel, ISOSURF_MARCHING_CUBES, ISOSURF_SHADE_SMOOTH, ISOSURF_NORMALS_GRADIENT); /*xcSurfSmoothing( iso, mols->isolevel );*/ if ( mols->fs.cropbz && mols->fs.celltype == XCR_BZ ) CropBz_New( wc, iso ); } else if ( s_nstep != iso->smooth_nstep || s_weight != iso->smooth_weight ) { /* xcSurfSmoothing( iso, mols->isolevel ); if ( mols->fs.cropbz && mols->fs.celltype == XCR_BZ ) CropBz_New( wc, iso ); */ ; } else if ( crop_bz != mols->fs.cropbz && mols->fs.celltype == XCR_BZ ) { if ( !mols->fs.cropbz && mols->fs.celltype == XCR_BZ ) { /* previous cropping has froget about croped triangles --> retriamgulate */ MarchCubeNew(iso, mols->molgrid, mols->vec, mols->lowcoor, mols->i, mols->j, mols->k, mols->isolevel, ISOSURF_MARCHING_CUBES, ISOSURF_SHADE_SMOOTH, ISOSURF_NORMALS_GRADIENT); } /*xcSurfSmoothing( iso, mols->isolevel );*/ if ( mols->fs.cropbz && mols->fs.celltype == XCR_BZ ) CropBz_New( wc, iso ); } /* HERE GOES THE CROPPING algorithm */ /* this is the safer, although time demanding */ /* if ( mols->fs.cropbz && mols->fs.celltype == XCR_BZ ) CropBz_New( wc, iso ); */ if ( !mols->fs.cropbz ) for(i=0; intriangl; i++) iso->triangl_status[i] = 1; Togl_PostRedisplay(togl); return TCL_OK; } int CRY_SurfCmd(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[]) { register int i; struct Togl *togl; NEW_WIN_CONTEXT *wc; MOL_SURF *mols; ISOSURFACE *iso; struct READSURF_OPT opt[] = { {"-type", XC_ALLOWED}, {"-fs", XC_ALLOWED}, {"-render", XC_ALLOWED}, {"-radiu", XC_FORBIDDEN}, {"-level", XC_ALLOWED}, {"-cutoff", XC_FORBIDDEN}, {"-colorsheme", XC_FORBIDDEN}, {"-drawstyle", XC_ALLOWED}, {"-transparent", XC_ALLOWED}, {"-shademodel", XC_ALLOWED}, {"-monocolor", XC_ALLOWED}, {"-frontmonocolor", XC_ALLOWED}, {"-backmonocolor", XC_ALLOWED}, {"-surfacetype", XC_FORBIDDEN}, {"-resolution", XC_FORBIDDEN}, {"-smoothsteps", XC_ALLOWED}, {"-smoothweight", XC_ALLOWED}, {"-frontface", XC_ALLOWED}, {"-revertnormals", XC_ALLOWED}, {NULL, 0}, }; /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } wc = FindWinContextByTogl( togl ); /* -IDENTIFIER */ if ( strncmp(argv[2], "-iden", 5) == 0 ) { int ident; if ( Tcl_GetInt(interp, argv[3], &ident) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols = FindMolSurf( ident ); if (!mols) { char rss[1024]; snprintf(rss, sizeof(rss),"couldn't find Surface %d !!!\n", ident); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else { char rss[1024]; snprintf(rss, sizeof(rss),"Usage: %s -ident indent ...", argv[0]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* read COMMAND LINE ARGS ***************************************/ if (cryReadSurfARGS(clientData, interp, argc, argv, wc, mols, opt) == TCL_ERROR) { return TCL_ERROR; } /*************************************************************/ if (mols->type == MOLS_FERMISURFACE) { struct DATAGRID *grid; CellCage *cage; grid = FindDataGrid( mols->fs.gridindex ); fsReadBand(grid, mols); /* generate lattice-cage */ cage = (CellCage *) realloc(wc->recprim_cage, sizeof(CellCage)); SetUnitCellCage ( vec.recprim, cage ); wc->recprim_cage = cage; } else { Tcl_SetResult(interp, "Sorry, so far just fermisurface type surfaces supported by cry_surf command", TCL_STATIC); return TCL_ERROR; } iso = FindIsoSurf( mols->isosurf_index ); i = FindSurfaceOfWindow( wc, mols ); if ( i < 0 ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find surface #%d on window %s !!!\n", mols->isosurf_index, argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } wc->VPf.surface[i] = 1; iso->smooth_nstep = mols->smooth_nstep; iso->smooth_weight = mols->smooth_weight; fprintf(stderr,"FS: interp_n[] == %d, %d, %d\n", mols->interp_n[0], mols->interp_n[1], mols->interp_n[2] ); /* t.k. */ if ( mols->interp_n[0] * mols->interp_n[1] * mols->interp_n[2] > 1 ) { int _n[3]; _n[0] = mols->i; _n[1] = mols->j; _n[2] = mols->k; if ( mols->interp_molgrid != (float***) NULL ) { xcFree_Tensor3f (mols->interp_molgrid); mols->interp_molgrid = (float***) NULL; } /*mols->interp_molgrid = cryRegPeriodInterpolator_f_LCASI3D(_n, mols->interp_n, mols->molgrid);*/ /* mols->interp_molgrid = cryGeneralGridRegPeriodInterpolator_f_LCASI3D (_n, mols->interp_n, mols->molgrid); */ mols->interp_molgrid = general_grid_fft_interpolator_tensor3f(_n, mols->interp_n, mols->molgrid); /* mols->interp_molgrid = general_grid_shankland_interpolator_tensor3f(_n, mols->interp_n, mols->molgrid); */ MarchCubeNew(iso, mols->interp_molgrid, mols->vec, mols->lowcoor, NUM_OF_POINTS(mols->i, mols->interp_n[0]), NUM_OF_POINTS(mols->j, mols->interp_n[1]), NUM_OF_POINTS(mols->k, mols->interp_n[2]), mols->isolevel, ISOSURF_MARCHING_CUBES, ISOSURF_SHADE_SMOOTH, ISOSURF_NORMALS_GRADIENT); } else { /********/ MarchCubeNew(iso, mols->molgrid, mols->vec, mols->lowcoor, mols->i, mols->j, mols->k, mols->isolevel, ISOSURF_MARCHING_CUBES, ISOSURF_SHADE_SMOOTH, ISOSURF_NORMALS_GRADIENT); } /* HERE GOES THE CROPPING algorithm */ /* this is the safer, although time demanding */ if ( mols->fs.cropbz && mols->fs.celltype == XCR_BZ ) CropBz_New( wc, iso ); if ( !mols->fs.cropbz ) for(i=0; intriangl; i++) iso->triangl_status[i] = 1; wc->VPf.stropened = 1; Set_Orig_and_Size( wc, mols, togl ); crySetProjection( wc, togl ); Togl_PostRedisplay(togl); return TCL_OK; } static void Set_Orig_and_Size( NEW_WIN_CONTEXT *wc, MOL_SURF *m, struct Togl *togl ) { int i; if ( m->fs.celltype == XCR_BZ ) { for (i=0; i<3; i++) wc->MVf.o_shift[i] = 0.0; wc->ss.minX = m->lowcoor[0]; wc->ss.maxX = -wc->ss.minX; wc->ss.minY = m->lowcoor[1]; wc->ss.maxY = -wc->ss.minY; wc->ss.minZ = m->lowcoor[2]; wc->ss.maxZ = -wc->ss.minZ; } else { /*******************/ /* XCR_PARAPIPEDAL */ /*******************/ float size, orig[3] = {0.0, 0.0, 0.0}; size = DetermineParapipedSize(m->vec[0], m->vec[1], m->vec[2], orig)/2.0; for (i=0; i<3; i++) { wc->MVf.o_shift[i] = -(m->vec[0][i] + m->vec[1][i] + m->vec[2][i])/2.0; } /* wc->ss.minX = wc->MVf.o_shift[0]; wc->ss.maxX = -wc->MVf.o_shift[0]; wc->ss.minY = wc->MVf.o_shift[1]; wc->ss.maxY = -wc->MVf.o_shift[1]; wc->ss.minZ = wc->MVf.o_shift[2]; wc->ss.maxZ = -wc->MVf.o_shift[2]; */ wc->ss.minX = -size; wc->ss.maxX = size; wc->ss.minY = -size; wc->ss.maxY = size; wc->ss.minZ = -size; wc->ss.maxZ = size; } } xcrysden-1.6.2/C/linear.c0000644000175000017500000001453511712736221013665 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/linear.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include "tensor.h" #include "memory.h" /* linear.c */ float ***cryGeneralGridRegPeriodInterpolator_f_Linear3D(int n[3], int degree[3], float ***src); float ***cryGeneralGridRegPeriodInterpolator_f_Linear3D(int n[3], /*!< number of input points of general grid */ int degree[3], /*!< degree of interp */ float ***src) /*!< INPUT general grid */ { register int i0, i1, j0, j1, k0, k1, ii, jj; int n0, n1, n2, nn[3]; float ay0, ay1, az0, az1, fr[3]; float ***dst; nn[0] = n[0]-1; nn[1] = n[1]-1; nn[2] = n[2]-1; n0 = nn[0] * degree[0]; n1 = nn[1] * degree[1]; n2 = nn[2] * degree[2]; MALLOC_TENSOR3(float, dst, n0+1, n1+1, n2+1); /* 3D case */ for (i0=0; i0 isostate.max_n_isoline2D[obj][il] ) isoline2D[obj].segment[il] = xcRealloc2xBiggerLINE( &(isoline2D[obj].segment[il][0]), &isostate.max_n_isoline2D[obj][il] ); nseg=0; v[0] = triangl.val[0] - level[il]; v[1] = triangl.val[1] - level[il]; v[2] = triangl.val[2] - level[il]; if ( v[0]*v[1] < 0.0 ) { p[nseg] = VertexInterp(level[il], triangl.p[0], triangl.p[1], triangl.val[0], triangl.val[1]); nseg++; } if ( v[1]*v[2] < 0.0 ) { p[nseg] = VertexInterp(level[il], triangl.p[1], triangl.p[2], triangl.val[1], triangl.val[2]); nseg++; } if ( v[2]*v[0] < 0.0 ) { p[nseg] = VertexInterp(level[il], triangl.p[2], triangl.p[0], triangl.val[2], triangl.val[0]); nseg++; } if (nseg == 2) { isoline2D[obj].segment[il][isoline2D[obj].iseg[il]].p1 = p[0]; isoline2D[obj].segment[il][isoline2D[obj].iseg[il]].p2 = p[1]; isoline2D[obj].iseg[il]++; } } } xcrysden-1.6.2/C/forces.c0000644000175000017500000000672211712736221013673 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/forces.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include "xcGLparam.h" #include "vector.h" #include "struct.h" #include "memory.h" #include "xcfunc.h" RenderVectors *forceVectors = NULL; extern ForceVector FV; void MallocForceVectors(void) { if (natoms>0){ forceVectors = (RenderVectors *) xcRealloc(forceVectors, sizeof(RenderVectors) * (natoms + 1)); } else { forceVectors = (RenderVectors *) xcRealloc(forceVectors, sizeof(RenderVectors)); } } void SetForceVectorsCoor( ForceVector *fvPtr, double (*fvec)[3], RenderVectors *rvec ) { register int i, j; if (fvPtr->rod_thickf < MINTOL) fvPtr->rod_thickf = 1.0; if (fvPtr->arr_thickf < MINTOL ) fvPtr->arr_thickf = 1.0; if (fvPtr->arr_lenf < MINTOL ) fvPtr->arr_lenf = 0.1; for (i=1; i<=natoms; i++) { rvec[i].vecthick = fvPtr->rod_thickf * rrod; rvec[i].arrthick = fvPtr->arr_thickf * rvec[i].vecthick; if ( distdv(fvec[i]) < MINTOL ) { for (j=0; j<3; j++) LOAD_NULL_V(3,rvec[i].coor[j]); rvec[i].vecx = 0.0; rvec[i].vecy = 0.0; rvec[i].vecz = 0.0; rvec[i].vecfi = 0.0; rvec[i].vecl = 0.0; rvec[i].arrx = 0.0; rvec[i].arry = 0.0; rvec[i].arrz = 0.0; rvec[i].arrfi = 0.0; rvec[i].arrl = 0.0; } else { for (j=0; j<3; j++) { rvec[i].coor[j][0] = 0.0; rvec[i].coor[j][1] = (1.0 - fvPtr->arr_lenf) * fvec[i][j]; rvec[i].coor[j][2] = fvec[i][j]; } GetSelCylinderPar(rvec[i].coor[0][1] - rvec[i].coor[0][0], rvec[i].coor[1][1] - rvec[i].coor[1][0], rvec[i].coor[2][1] - rvec[i].coor[2][0], &rvec[i].vecx, &rvec[i].vecy, &rvec[i].vecz, &rvec[i].vecfi, &rvec[i].vecl); GetSelCylinderPar(rvec[i].coor[0][2] - rvec[i].coor[0][1], rvec[i].coor[1][2] - rvec[i].coor[1][1], rvec[i].coor[2][2] - rvec[i].coor[2][1], &rvec[i].arrx, &rvec[i].arry, &rvec[i].arrz, &rvec[i].arrfi, &rvec[i].arrl); } } } void xcRenderVectorForces(void) { int i; glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, FV.color ); for(i=1; i<=natoms; i++) { /* here the factor 2.0 is just for round-off error security */ if ( forceVectors[i].vecl < 2.0*MINTOL ) continue; glPushMatrix(); glTranslated( xat[i], yat[i], zat[i] ); xcSolidVector( forceVectors[i] ); glPopMatrix(); } /* LOAD THE STRUCT MATERIALS BACK; * this has to be changed in future; * each render function will have to take care of it-self */ LoadStructMaterial(); } xcrysden-1.6.2/C/gl2psPrintTogl.c0000644000175000017500000001473213525506046015310 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/gl2psPrintTogl.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "gl2ps.h" #include "xcfunc.h" extern struct Togl *mesa_togl; extern void (*xcDisplay)(struct Togl *togl); /************************************************************************ Tcl-usage: cry_gl2psPrintTogl $togl $format $sort $options $pointsize $linewidth $stream $filename Usage: CRY_gl2psPrintToglCb format sort options pointsize linewidth filename ************************************************************************/ int CRY_gl2psPrintToglCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; FILE *fp; int argcList, i; const char **argvList; GLint format, sort, options = GL2PS_NONE; GLint buffersize; GLint state = GL2PS_OVERFLOW; GLfloat pointsize=2.0, linewidth=2.0; GLint viewport[4]; double num; if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (argc != 8) { Tcl_SetResult(interp, "wrong # args: should be \"cry_gl2psPrintTogl toglname format sort options pointsize linewidth filename\"", TCL_STATIC); return TCL_ERROR; } buffersize = Togl_Width (togl) * Togl_Height (togl) * 8; /* FORMAT */ if ( strcmp(argv[2], "GL2PS_PS") == 0 ) { format = GL2PS_PS; } else if ( strcmp(argv[2], "GL2PS_EPS") == 0 ) { format = GL2PS_EPS; } else if ( strcmp(argv[2], "GL2PS_TEX") == 0 ) { format = GL2PS_TEX; } else if ( strcmp(argv[2], "GL2PS_PDF") == 0 ) { format = GL2PS_PDF; } else if ( strcmp(argv[2], "GL2PS_SVG") == 0 ) { format = GL2PS_SVG; } else { char rss[1024]; snprintf(rss, sizeof(rss), "wrong format %s, must be one ofGL2PS_PS, GL2PS_EPS, or GL2PS_TEX", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* SORT */ if ( strcmp(argv[3], "GL2PS_NO_SORT") == 0 ) { sort = GL2PS_NO_SORT; } else if ( strcmp(argv[3], "GL2PS_SIMPLE_SORT") == 0 ) { sort = GL2PS_SIMPLE_SORT; } else if ( strcmp(argv[3], "GL2PS_BSP_SORT") == 0 ) { sort = GL2PS_BSP_SORT; } else { char rss[1024]; snprintf(rss, sizeof(rss), "wrong sort %s, must be one of GL2PS_NO_SORT, GL2PS_SIMPLE_SORT, or GL2PS_BSP_SORT", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* OPTIONS */ Tcl_SplitList(interp, argv[4], &argcList, &argvList); for (i=0; ixcDisplay)(togl); } /**/ state = gl2psEndPage(); fprintf(stderr,"CRY_gl2psPrintToglCb$ state = %d\n", state); buffersize *= 2; } fclose(fp); return TCL_OK; } xcrysden-1.6.2/C/voronoi.c0000644000175000017500000001131211712736221014074 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/voronoi.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include "xcGLparam.h" #include "struct.h" #include "wigner.h" #include "xcfunc.h" void xcRenderVoronoi(void) { int groupn = XCR_CELL_PC; register int ip, iv, i, j, k, l, m; float tr[3]; int mode = WIGNER_PRIM; double (*vector)[4] = vec.prim; GLint two_side_voronoi = GL_FALSE; GLint shade_model; GLboolean two_side, cull_face; /* dummy is dummy so far */ LoadVoronoiMaterial(VORONOI_DEFAULT); glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ws_attrib.color ); /* enable transparency */ if ( ws_attrib.transparency ) { glEnable( GL_BLEND ); glDepthMask( GL_FALSE ); glBlendFunc( blend_voronoi.sfunc, blend_voronoi.dfunc ); } /* SHADEMODEL */ glGetIntegerv( GL_SHADE_MODEL, &shade_model ); glShadeModel( GL_FLAT ); /* unable GL_LIGHT_MODEL_TWO_SIDE */ glGetBooleanv( GL_LIGHT_MODEL_TWO_SIDE, &two_side ); glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, two_side_voronoi ); /* enable CULL FACE */ glGetBooleanv( GL_CULL_FACE, &cull_face ); if (!cull_face) glEnable( GL_CULL_FACE ); /* RENDER - so far just one wigner-seitz*/ if ( xcr.celltype == XCR_CONVCELL ) { mode = WIGNER_CONV; vector = vec.conv; groupn = xcr.groupn; } /* WIGNER_NODEMODE_SELECT */ if ( ws_attrib.nodemode[mode] == WIGNER_NODEMODE_SELECT ) for (i=0; i 0 ) ni = 2; if (xcr.nunit[1] > 0 ) nj = 2; if (xcr.nunit[2] > 0 ) nk = 2; for (i=0; i 0 ) ii = xcr.nunit[0]; if ( j > 0 ) jj = xcr.nunit[1]; if ( k > 0 ) kk = xcr.nunit[2]; trx = ii + xcr.cellpos[groupn][l][0]; try = jj + xcr.cellpos[groupn][l][1]; trz = kk + xcr.cellpos[groupn][l][2]; if ( trx < (double) xcr.nunit[0] + MINTOL && try < (double) xcr.nunit[1] + MINTOL && trz < (double) xcr.nunit[2] + MINTOL ) { /* from fractional coords -> Cartesian */ for (m=0; m<3; m++) tr[m] = trx*vector[0][m] + try*vector[1][m] + trz*vector[2][m]; glPushMatrix(); glTranslated( tr[0]-mx, tr[1]-my, tr[2]-mz); for (ip=0; ip < wsp.npoly; ip++) { glBegin( GL_POLYGON ); for (iv=0; iv < wsp.nvert[ip]; iv++) { glNormal3fv( wsp.norm[ip][iv] ); glVertex3fv( wsp.poly[ip][iv] ); } glEnd(); } glPopMatrix(); } } } /* DISABLE TRANSPARENCY */ glDisable(GL_BLEND); glDepthMask(GL_TRUE); /* go back to old shademodel */ glShadeModel( shade_model ); /* go to old GL_LIGHT_MODEL_TWO_SIDE */ /* obstaja funkcija LoadLightModelTwoSide(int type) */ glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, two_side ); /* disable cull face */ if ( !cull_face ) glDisable( GL_CULL_FACE ); /* LOAD THE STRUCT MATERUALS BACK; * this has to be changed in future; * each render function will have to take care of it-self */ LoadStructMaterial(); } xcrysden-1.6.2/C/polygonise_auxil.c0000644000175000017500000002405113521256175016004 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/polygonise_auxil.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #include "isosurf.h" #include "xcfunc.h" /* BEWARE: MINTOL_F should not be lower that 1e-6, otherwise it won't work */ #define EQUAL_VERTICES(a,b) ( fabs(a.x-b.x) < MINTOL_F && fabs(a.y-b.y) < MINTOL_F && fabs(a.z-b.z) < MINTOL_F ) #define GET_INDEX(i,j,k,N,M,L) ( (k + L*(j + M*i)) ) XYZ TriangleWeightNormalS(XYZ p0, XYZ p1, XYZ p2, float sign); XYZ TriangleWeightNormal(XYZ p0, XYZ p1, XYZ p2); float distXYZ(XYZ v); void VertexRecognise(GRID grd, int ntriangl, TRIANGLE *triangles, int *triangl_status, TRIG_INFO *tri2verIN, XYZ *vertex, int *vertex_status, VERT2TRIG_INFO (*ver2triIN)[MAX_VERTEX_COORDINATION], int *nver2triIN, GRID_INFO *grid_info, int *nvertex) { register int nt, i3, ii, jj, kk, l, j3, ver_ind, nvt, ix1, iy1, iz1; int ijk, t0l; IJK ind; ix1=grd.nx-1; iy1=grd.ny-1; iz1=grd.nz-1; /* nt ... number of all triangles nvt ... number of triangles that belong to a given vertex */ /* VERTEX RECOGNITION */ ver_ind = 0; for(nt=0; nt=ix1) continue; for(jj=ind.j-1; jj<=ind.j+1; jj++) { if (jj<0 || jj>=iy1) continue; for(kk=ind.k-1; kk<=ind.k+1; kk++) { if (kk<0 || kk>=iz1) continue; ijk=GET_INDEX(ii,jj,kk, ix1, iy1, iz1); for(l=0; l u = 1 / (0.1 - 1/w) */ u = 1.0 / (0.1 - 1.0 / weight); weight *= 0.5; /* because we count each vertex twice */ u *= 0.5; /* SURFACE SMOOTHING */ nstep *= 2; /* shrinking + expanding steps */ for(is=0; is MINTOL) { /*fprintf(stderr, "Vertex smoothing (ntriangl = %2d) : %5.6f %5.6f %5.6f --> ", nver2triIN[i], vertex[i].x, vertex[i].y, vertex[i].y); */ /*if (E<1.0) E = (float)nver2triIN[i];*/ if ( is%2 == 0 ) { w = weight; /* shrinking step: use "weight" */ } else { w = u; /* expansion step */ } vertex[i].x += w * (1.0/E * L.x); vertex[i].y += w * (1.0/E * L.y); vertex[i].z += w * (1.0/E * L.z); /* fprintf(stderr, "%5.2f %5.2f %5.2f ; (E=%3f)\n", vertex[i].x, vertex[i].y, vertex[i].y, E); fprintf(stderr, "Vertex smoothing (E=%f, L: %f %f %f)\n", E, L.x, L.y, L.z); */ } } } free(aux); } void SurfNmlAver(int ntriangl, int nvertex, XYZ *nml, XYZ *vertex, TRIG_INFO *tri2verIN, float *sign, int is_tetrahedral) { register int i, j3; XYZ norm; /*fprintf(stderr," SurfNmlAver used, normals address=%ld\n", nml);*/ /* NORMAL AVERAGING */ for(i=0; i MINTOL) { nml.x /= dis12; nml.y /= dis12; nml.z /= dis12; } else { nml.x = .0; nml.y = .0; nml.z = .0; } return(nml); } XYZ TriangleWeightNormal(XYZ p0, XYZ p1, XYZ p2) { float dis12; /* Normals; take cross product of [i+1,i] & [i+2,i+1] */ XYZ v1, v2, nml; v1.x = p1.x - p0.x; v1.y = p1.y - p0.y; v1.z = p1.z - p0.z; v2.x = p2.x - p0.x; v2.y = p2.y - p0.y; v2.z = p2.z - p0.z; nml.x = v1.y * v2.z - v2.y * v1.z; nml.y = v1.z * v2.x - v2.z * v1.x; nml.z = v1.x * v2.y - v2.x * v1.y; dis12=distXYZ(nml); if (dis12 > MINTOL) { nml.x /= (dis12*dis12); nml.y /= (dis12*dis12); nml.z /= (dis12*dis12); } else { nml.x = 0.0; nml.y = 0.0; nml.z = 0.0; } return(nml); } XYZ VertexNormal(XYZ v1, XYZ v2) { XYZ nml; nml.x = v1.y * v2.z - v2.y * v1.z; nml.y = v1.z * v2.x - v2.z * v1.x; nml.z = v1.x * v2.y - v2.x * v1.y; normalizepvfv( (float *) &nml ); return(nml); } float distXYZ(XYZ v) { float dis; dis = sqrt(v.x*v.x + v.y*v.y + v.z*v.z); /*printf("dis=%f\n",dis);*/ return(dis); } int normalizeXYZ(XYZ *v) { float dis; dis = distXYZ(*v); if ( dis < 1.e-12 ) { (*v).x = 0.0; (*v).y = 0.0; (*v).z = 0.0; return 0; } (*v).x /= dis; (*v).y /= dis; (*v).z /= dis; return 1; } xcrysden-1.6.2/C/xcFractCoor.c0000644000175000017500000000653013514361024014621 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcFractCoor.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include "xcGLparam.h" #include "struct.h" #include "xcfunc.h" int XC_FractCoorCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* ------------------------------------------------------------ * * * * xc_fractcoor -ctype prim|conv -coor {x y z} * * * * ------------------------------------------------------------ */ int XC_FractCoorCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { register int i; double (*rvec)[4]; float frcoor[4]; char *result = Tcl_Alloc( sizeof(char) * 128); GetComOption coor = { 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; if ( argc != 5 ) { Tcl_SetResult(interp, "Usage: xc_fractcoor -ctype prim|coor -coor {x y z}", TCL_STATIC); return TCL_ERROR; } for (i=1; i #include #include #include #include "struct.h" #include "xcfunc.h" struct Togl *mesa_togl = NULL; extern void (*xcDisplay)(struct Togl *togl); extern NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl); extern OrthoProj ort; extern realTimeMove makeMovie; extern int togl_exists; /* * Togl widget create callback. This is called by Tcl/Tk when the widget has * been realized. Here's where one may do some one-time context setup or * initializations. */ int xcToglCreateFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { Togl *togl; static int first_time = 1; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "pathName"); return TCL_ERROR; } if ( Togl_GetToglFromObj(interp, objv[1], &togl) != TCL_OK ) { return TCL_ERROR; } //Togl_GetToglFromName(interp, ".mesa", &mesa); /***************************************************************/ /* made atomic labels (only when first structure is opened */ /***************************************************************/ /* first make font */ if (first_time) { makeRasterFont(); makeAtomLabels(); makeXYZLabels(); makeTemp3D2DList(); /* make coor-sist */ makeCrdList(); xcGenDispList(); first_time = 0; } if ( strcmp(Togl_Ident(togl), ".mesa") == 0 ) { xcDisplayFunc(xcDummyDisplay); mesa_togl = togl; } else { NEW_WIN_CONTEXT *wc; cryNewToglInit( togl ); wc = FindWinContextByTogl( togl ); wc->xcDisplay = xcDummyDisplay; } togl_exists = XC_TRUE; LoadLights(); LoadStructMaterial(); return TCL_OK; } /* * Togl widget reshape callback. This is called by Tcl/Tk when the widget * has been resized. Typically, we call glViewport and perhaps setup the * projection matrix. */ int xcToglReshapeFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { Togl *togl; int w, h; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "pathName"); return TCL_ERROR; } if (Togl_GetToglFromObj(interp, objv[1], &togl) != TCL_OK) { return TCL_ERROR; } w = Togl_Width (togl); h = Togl_Height(togl); if ( togl == mesa_togl ) { /* old fashion style */ VPf.width = w; VPf.height = h; VPf.canvassize = VPf.height; if ( VPf.width < VPf.height) VPf.canvassize = VPf.width; if (VPf.stropened) { xcViewPort(); } else { float aspect = (float) VPf.width / (float) VPf.height; glViewport( 0, 0, VPf.width, VPf.height ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-aspect, aspect, -1.0, 1.0, 1.0, 10.0); glMatrixMode(GL_MODELVIEW); } } else { /* new nicer fashion */ NEW_WIN_CONTEXT *wc; /*glViewport( 0, 0, VPf.width, VPf.height );*/ wc = FindWinContextByTogl( togl ); if (!wc) return TCL_ERROR; wc->VPf.height = w; wc->VPf.width = h; crySetProjection( wc, togl ); } return TCL_OK; } /* * this function is called when togle widget is destroyed */ int xcToglDestroyFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { Togl *togl; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "pathName"); return TCL_ERROR; } if (Togl_GetToglFromObj(interp, objv[1], &togl) != TCL_OK) { return TCL_ERROR; } if ( togl == mesa_togl ) { /* if this happends, then XCRYSDEN is about to exit. Do nothing. */ /* xcMaybeDestroyLists(); FreeAllVariables(); mesa_togl = NULL; */ xcTkFontFreeAll(); } else { xcDisplay = NULL; DestroyWinContext( togl ); } return TCL_OK; } /* * after user has stooped rotating/translating redisplay in nicer fashion */ int xcToglTimerFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { Togl *togl; static int toglIsInteractive = 0; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "pathName"); return TCL_ERROR; } if (Togl_GetToglFromObj(interp, objv[1], &togl) != TCL_OK) { return TCL_ERROR; } if ( togl == mesa_togl ) { /* interative rotation - zooming */ if ( !toglIsInteractive && (tr.b1motion || tr.b2motion || tr.shiftB1motion) ) { toglIsInteractive = 1; } if ( toglIsInteractive && !(tr.b1motion || tr.b2motion || tr.shiftB1motion ) ) { toglIsInteractive = 0; Togl_PostRedisplay(togl); } /* real-time movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_REALTIME_INTERVAL ) { createMoviePPMFrame(togl); } } return TCL_OK; } /* * this function takes care binding -> that's ROTATION */ int XC_B1MotionCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int xrotnew, yrotnew; /* current mouse pointer position */ int dx, dy; double fiX = 0, fiY = 0, ssize; Togl *togl; if (argc != 4) { Tcl_SetResult(interp, "Usage: xc_B1motion ", TCL_STATIC); return TCL_ERROR; } if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[2], &xrotnew) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer for , but got \"%s\" in \" xc_B1motion \" command", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[3], &yrotnew) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer for , but got \"%s\" in \" xc_B1motion \" command", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /********************************************/ /* .MESA ---------------------------------- */ /********************************************/ if ( togl == mesa_togl ) { /* if structure is not opened, do noting, just return silently */ if (!VPf.stropened) return TCL_OK; /* if B1-Motion just started, then new:=old and return silently */ if (tr.b1motion == 0) { tr.b1motion = 1; tr.xrotold = xrotnew; tr.yrotold = yrotnew; return TCL_OK; } /* how much did Xrot&Yrot differ from last time this routine was called */ dx = xrotnew - tr.xrotold; dy = yrotnew - tr.yrotold; tr.xrotold = xrotnew; tr.yrotold = yrotnew; if ( xcr.lforce ) { if ( MVf.structsize > 1e-5 ) ssize = MVf.structsize * VPf.VPfactor; else ssize = ort.size * VPf.VPfactor; } else { ssize = ort.size * VPf.VPfactor; } /* moving Mouse in X direction means rotation in Y dir !!!!! */ /* * 4.0 is just some emperical factor to maximize performance of * mouse rotation so, that it will follow mouse pointer */ if ( dx != 0 ) fiY = atan( 4.0 * (double) dx / ssize); if ( dy != 0 ) fiX = atan( 4.0 * (double) dy / ssize); /* now rotate */ xcRotateXY( fiX, fiY ); /* if dimType == XC_2D, also orientate */ if ( dimType == XC_2D ) hpsort_index1(tmp_nobjects, zorient, iwksp); } else { /*********************/ /* NEW NICER FASHION */ /*********************/ NEW_WIN_CONTEXT *wc; wc = FindWinContextByTogl( togl ); /* if structure is not opened, do noting, just return silently */ if (!wc->VPf.stropened) return TCL_OK; /* if B1-Motion just started, then new:=old and return silently */ if (wc->tr.b1motion == 0) { wc->tr.b1motion = 1; wc->tr.xrotold = xrotnew; wc->tr.yrotold = yrotnew; return TCL_OK; } /* how much did Xrot&Yrot differ from last time this routine was called */ dx = xrotnew - wc->tr.xrotold; dy = yrotnew - wc->tr.yrotold; wc->tr.xrotold = xrotnew; wc->tr.yrotold = yrotnew; ssize = wc->MVf.structsize * wc->VPf.VPfactor; /* moving Mouse in X direction means rotation in Y dir !!!!! */ /* * 4.0 is just some emperical factor to maximize performance of * mouse rotation so, that it will follow mouse pointer */ if ( dx != 0 ) fiY = atan( 4.0 * (double) dx / ssize); if ( dy != 0 ) fiX = atan( 4.0 * (double) dy / ssize); cryRotateXY( wc, fiX, fiY ); } Togl_PostRedisplay(togl); return TCL_OK; } /* * this function takes care binding -> that's ZOOMING * * It only register Shift-B1-Motion, so that the display-mode goes to * crude mode. * */ int XC_ShiftB1MotionCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; if (argc != 2) { Tcl_SetResult(interp, "Usage: xc_ShiftB1motion ", TCL_STATIC); return TCL_ERROR; } if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /********************************************/ /* .MESA ---------------------------------- */ /********************************************/ if ( togl == mesa_togl ) { /* if structure is not opened, do noting, just return silently */ if (!VPf.stropened) return TCL_OK; /* if Shift-B1-Motion just started register that */ if (tr.shiftB1motion == 0) { tr.shiftB1motion = 1; } } else { /*********************/ /* NEW NICER FASHION */ /*********************/ NEW_WIN_CONTEXT *wc; wc = FindWinContextByTogl( togl ); /* if structure is not opened, do noting, just return silently */ if (!wc->VPf.stropened) return TCL_OK; /* INSERT CODE FOR REGISTERING ShiftB1Motion HERE */ } Togl_PostRedisplay(togl); return TCL_OK; } /* * this function takes care binding -> that's TRANSLATION */ int XC_B2MotionCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int trX, trY; /* cuurent mouse pointer position */ int dx, dy; Togl *togl; if (argc != 4) { Tcl_SetResult(interp, "Usage: xc_B2motion ", TCL_STATIC); return TCL_ERROR; } if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[2], &trX) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer for , but got \"%s\" in \" xc_B2motion \" command", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[3], &trY) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer for , but got \"%s\" in \" xc_B2motion \" command", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /********************************************/ /* .MESA ---------------------------------- */ /********************************************/ if ( togl == mesa_togl ) { /* if structure is not opened, do noting, just return silently */ if (!VPf.stropened) return TCL_OK; /* if B2-Motion just started, then new -> old and return silently */ if (tr.b2motion == 0) { tr.b2motion = 1; tr.trXold = trX; tr.trYold = trY; return TCL_OK; } /* how much did trX & trY differ from last time this routine was called */ dx = trX - tr.trXold; dy = trY - tr.trYold; tr.trXold = trX; tr.trYold = trY; /*printf("dx=%d, dy=%d", dx, dy); fflush(stdout);*/ tr.xtransl += dx; /* this is used in ViewPort to determine where the * structure has been translated */ tr.ytransl -= dy; /* in X11 Y-coor is upside down */ /* ViewPort */ xcViewPort(); /* Update a Display */ } else { /*********************/ /* NEW NICER FASHION */ /*********************/ NEW_WIN_CONTEXT *wc; wc = FindWinContextByTogl( togl ); /* if structure is not opened, do noting, just return silently */ if (!wc->VPf.stropened) return TCL_OK; /* INSERT CODE FOR TRANSLATION HERE */ } Togl_PostRedisplay(togl); return TCL_OK; } /* * this function takes care of BUTTON_RELEASE events */ int XC_ButtonReleaseCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; if (argc != 3) { Tcl_SetResult(interp, "Usage: xc_Brelease ", TCL_STATIC); return TCL_ERROR; } if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /********************************************/ /* .MESA ---------------------------------- */ /********************************************/ if ( togl == mesa_togl ) { if ( strcmp(argv[2],"B1") == 0 || strcmp(argv[2],"Shift-B1") == 0 ) { tr.b1motion = 0; tr.shiftB1motion = 0; } else if ( strcmp(argv[2],"B2") == 0 ) tr.b2motion = 0; /*else if ( strcmp(argv[2],"Shift-B1") == 0 ) tr.shiftB1motion = 0;*/ else { Tcl_SetResult(interp, "Usage: xc_Brelease ", TCL_STATIC); return TCL_ERROR; } } else { /*********************/ /* NEW NICER FASHION */ /*********************/ NEW_WIN_CONTEXT *wc; wc = FindWinContextByTogl( togl ); if ( strcmp(argv[2],"B1") == 0 || strcmp(argv[2],"Shift-B1") == 0 ) { wc->tr.b1motion = 0; wc->tr.shiftB1motion = 0; } else if ( strcmp(argv[2],"B2") == 0 ) wc->tr.b2motion = 0; /* else if ( strcmp(argv[2],"Shift-B1") == 0 ) wc->tr.shiftB1motion = 0; */ else { char rss[1024]; snprintf(rss, sizeof(rss), "wrong mode %s, must be B1, B2, or Shift-B1", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); /* Tcl_SetResult(interp, "Usage: xc_Brelease ", TCL_STATIC);*/ return TCL_ERROR; } } return TCL_OK; } xcrysden-1.6.2/C/Makefile0000644000175000017500000000236513556022211013700 0ustar tonetoneTOPDIR = $(PWD)/.. include ../make.include include ../Make.sys # # don't touch below this # INCS = $(FFTW3_INCDIR) $(MESCHACH_INCDIR) $(TCL_INCDIR) $(TK_INCDIR) $(GL_INCDIR) $(X_INCDIR) $(EXTERNAL_INCDIR) include make-objects .SUFFIXES: .o .c .c.o: $(CC) $(CFLAGS) $(CPPFLAGS) $(INCS) -c $< objects = $(XC_OBJS) $(EXTERNAL_OBJS) default: xcrys xctclsh xsf2xsf install compile: $(MAKE) $(CYGWIN) TOPDIR=$(TOPDIR) #objects: $(objects) # #$(objects): %.o: %.c # $(CC) $(CFLAGS) $(CPPFLAGS) $(INCS) -c $< xcrys: $(XC_OBJS) $(EXTERNAL_OBJS) $(CC) $(CFLAGS) $(XC_OBJS) $(EXTERNAL_OBJS) \ -o xcrys $(FFTW3_LIB) $(MESCHACH_LIB) $(TK_LIB) $(TCL_LIB) $(TOGL_LIB) $(GLU_LIB) $(GL_LIB) $(X_LIB) $(MATH) $(LDLIB) $(EXT_LIB) xctclsh: xcTclsh.o $(CC) $(CFLAGS) xcTclsh.o -o xctclsh $(TCL_LIB) $(MATH) $(LDLIB) XFS_OBJS = xsf2xsf.o xsf2xsf: $(XFS_OBJS) $(CC) $(CFLAGS) $(XFS_OBJS) -o xsf2xsf $(MATH) $(LDLIB) install: -cp xcrys ../bin -cp xctclsh ../bin -cp xsf2xsf ../bin # Note: this target is executed via the cproto.sh script !!! cproto: cproto $(INCS) $(CFILE) clean: -rm -f *.o *~ xcrys xctclsh xsf2xsf header: $(TOPDIR)/sys_utils/c_header.sh depend: -if test "no`type makedepend`" != "no" ; then makedepend $(INCS) $(XC_OBJS:.o=.c); fi xcrysden-1.6.2/C/remakestr.c0000644000175000017500000001140313525506046014403 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/remakestr.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #include "3D.h" #include "memory.h" #include "xcfunc.h" extern Options3D is; /* --- function protoypes ---*/ void ReMakeStr(void); static void ReMakeBonds(void); void ReDisplay(struct Togl *togl, GLuint remake3D); /* --- extern function protoypes ---*/ /* --- xcDisplayFunc.c ---*/ /*extern void (*xcDisplay)(void);*/ /* extern void xcMakeBallLists(void); */ extern void xcMakeSticklLists(void); extern void xcMakeSpaceFillLists(void); /* extern void xcMakeFrame3DLists(void); */ /* extern void xcMakeBallLabel3DList(void); */ /* extern void xcMakeSpaceLabel3DList(void); */ /* --- xcDisplayFunc2.c ---*/ extern void UpdateProjection(void); extern void WhichDispFunc(void); /* --- xcviewport.c --- */ extern void xcViewPort(); /* ---- readstrf.c ---- */ extern void MallocCoor(void); /* ---- 3D.c ---- */ extern void MakeCylinderCoor(void); /* ---- xcballstick.c ---- */ extern void MakeArcPoints(void); /* ---- readstrf.c ---- */ extern void MakeBonds(void); /* if "L_COV_SCALE", than chemical connectivity criteria is changed * this means that we must reassing bonds; */ void ReMakeStr(void) { /* now radius has been changed so I must just remake bonds, that * is: first determine nbonds, than assign xbond, ..., assign * nobjects, MallocCoor & MakeCylinderCoor */ /* specially care must be taken for "tmp_nobjects", because "nbonds" parameter will be changed after ReMakeBonds */ printf("ReMakeStr:: tmp_nobjects_BEFORE = %d\n",tmp_nobjects); printf("ReMakeStr:: nbonds_BEFORE = %d\n",nbonds); printf("ReMakeStr:: natoms_BEFORE = %d\n",natoms); printf("ReMakeStr:: nframes_BEFORE = %d\n",nframes); printf("ReMakeStr:: nobjects_BEFORE = %d\n",nobjects); tmp_nobjects = tmp_nobjects - nbonds; ReMakeBonds(); tmp_nobjects = tmp_nobjects + nbonds; nobjects = natoms + nbonds + nframes; printf("ReMakeStr:: tmp_nobjects_AFTER = %d\n",tmp_nobjects); printf("ReMakeStr:: nbonds_AFTER = %d\n",nbonds); printf("ReMakeStr:: natoms_AFTER = %d\n",natoms); printf("ReMakeStr:: nframes_AFTER = %d\n",nframes); printf("ReMakeStr:: nobjects_AFTER = %d\n",nobjects); /* malloc "coor" & "coor3D" and stuff that goes nearby */ MallocCoor(); /* rewrite coor structure */ WhichDispFunc(); /* --- now calculate coordinates for 3Dbonds & 3Dframes --- */ MakeCylinderCoor(); } void ReDisplay(struct Togl *togl, GLuint remake3D) { /* first make new projection (glOrtho) */ UpdateProjection(); /* if (is.stickmode) xcMakeStick3DLists(); if (is.ballmode) xcMakeBall3DLists(); if (is.spacefillmode) xcMakeSpaceFill3DLists(); */ /* if (remake3D & REMAKE3D_FRAME ) xcMakeFrame3DLists(); */ /* if (remake3D & REMAKE3D_BALL_LABEL) xcMakeBallLabel3DList(); */ /* if (remake3D & REMAKE3D_SPACE_LABEL) xcMakeSpaceLabel3DList(); */ /* this is safe enough, because if some ball radius has changed, than we check which balllist has to be "new-made" */ if (dimType == XC_2D) { /* xcMakeBallLists();*/ /* remake MakeArcPoints for ballstick #2 */ MakeArcPoints(); } /* if we changed radius we had to make new glOrtho */ /* ############## TUKI ############### */ /* now update a display */ xcViewPort(); Togl_PostRedisplay(togl); } static void ReMakeBonds(void) { /* number of bonds will changed, so we must free, and than malloc (in MakeBonds) the following */ xcFree((void*) natbond); xcFree((void*) sqnbond); xcFree((void*) bondend); xcFree((void*) xbond); xcFree((void*) ybond); xcFree((void*) zbond); xcFree((void*) xbond2); xcFree((void*) ybond2); xcFree((void*) zbond2); /* also free "coor" structure */ xcFree((void*) coor); xcFree((void*) zorient); xcFree((void*) iwksp); MakeBonds(); make_H_Bonds(); } xcrysden-1.6.2/C/displayfunc.h0000644000175000017500000000342711712736221014737 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/displayfunc.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ extern void xcWireFrame2D(struct Togl *togl); extern void xcWireFrameL2D(struct Togl *togl); extern void xcWireFrameF2D(struct Togl *togl); extern void xcWireFrameFL2D(struct Togl *togl); extern void xcPointLine2D(struct Togl *togl); extern void xcPointLineL2D(struct Togl *togl); extern void xcPointLineF2D(struct Togl *togl); extern void xcPointLineFL2D(struct Togl *togl); extern void xcBallStick12D(struct Togl *togl); extern void xcBallStick1L2D(struct Togl *togl); extern void xcBallStick1F2D(struct Togl *togl); extern void xcBallStick1FL2D(struct Togl *togl); extern void xcBallStick22D(struct Togl *togl); extern void xcBallStick2L2D(struct Togl *togl); extern void xcBallStick2F2D(struct Togl *togl); extern void xcBallStick2FL2D(struct Togl *togl); extern void xcDisplay3D(struct Togl *togl); xcrysden-1.6.2/C/splineInt.c0000644000175000017500000002237311712736221014357 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/splineInt.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "memory.h" void splie2(float x1a[], float x2a[], float **ya, int m, int n, float **y2a); void spline(float x[], float y[], int n, float yp1, float ypn, float y2[]); void xcRegularSplineInt2(float gridX[], float gridY[], float **Fn, int nX, int nY, float ndegree, float **newFn); void xcRegSplineInt(float xa[], float ya[], float y2a[], int i, float x, float *y); void xcRegularSplineInt3(float gridX[], float gridY[], float gridZ[], float ***Fn, int nX, int nY, int nZ, float ndegree, float ***newFn); void spline3(float x[], int n, float ***y, int j, int k, float yp1, float ypn, float y2[]); void xcRegSpline3Int(float xa[], float ***ya, int i, int j, int k, \ float y2a[], float x, float *y); void spline(float x[], float y[], int n, float yp0, float ypnn, float y2[]) { /* MEMORIZE: nn = n-1; */ int i,k; int nn = n-1; float p,qn,sig,un,*u; u = xcMallocVectorf( nn ); if (yp0 > 0.99e30) /* The lower boundary condition is set either to be "natural" */ y2[0] = u[0] =0.0; else { /* or else to have a specified first derivative. */ y2[0] = -0.5; u[0] = (3.0/(x[1]-x[0]))*((y[1]-y[0])/(x[1]-x[0])-yp0); } for (i=1; i 0.99e30) /* The upper boundary condition is set either to be "natural" */ qn = un =0.0; else { /* or else to have a specified first derivative. */ qn = 0.5; un = (3.0 / (x[nn]-x[nn-1])) * (ypnn-(y[nn]-y[nn-1]) / (x[nn]-x[nn-1])); } y2[nn] = (un-qn*u[nn-1]) / (qn*y2[nn-1]+1.0); for (k=nn-1;k>=0;k--) /* This is the backsubstitution loop of the tridiagonal algorithm */ y2[k] = y2[k]*y2[k+1] + u[k]; xcFree_Vectorf( u ); } void splie2(float x1a[], float x2a[], float **ya, int m, int n, float **y2a) { /* MEMORIZE: nn,mm=n-1,m-1 ----------------------- */ int j; for (j=0;j Fn[x][y] nX ........ X-dimension nY ........ Y-dimension ndegree ........ degree of interpolation (how many new segments is made out of old segment; if oldsegmant = [0,1] && ndegree = 2 --> seg1 = [0,0.5], seg2 = [0.5,1] **newFn ........ new Values goes there */ int ii, jj, nd, i, j, k, l; float dx, dy, x, y; float **Der2 = xcMallocMatrixf ( nX, nY ); float *value = xcMallocVectorf ( nX ); float *der2 = xcMallocVectorf ( nX ); int nXX = nX - 1; int nYY = nY - 1; splie2( gridX, gridY, Fn, nX, nY, Der2 ); jj = 0; nd = ndegree; dy = (gridY[1] - gridY[0]) / (float) nd; dx = (gridX[1] - gridX[0]) / (float) nd; for (j=0; j Fn[x][y] nX ........ X-dimension nY ........ Y-dimension ndegree ........ degree of interpolation (how many new segments is made out of old segment; if oldsegmant = [0,1] && ndegree = 2 --> seg1 = [0,0.5], seg2 = [0.5,1] **newFn ........ new Values goes there */ int ii, jj, kk, nd1, nd2, i, j, k, l, ij, ik; int nny = ndegree * (nY-1) + 1; int nnz = ndegree * (nZ-1) + 1; int nXX = nX - 1; int nYY = nY - 1; int nZZ = nZ - 1; float dx, x; float *der2 = xcMallocVectorf ( nX ); float ***newf = xcMallocTensor3f ( nX, nny, nnz ); for(i=0; i 0.99e30) /* The lower boundary condition is set either to be "natural" */ y2[0] = u[0] = 0.0; else { /* or else to have a specified first derivative. */ y2[0] = -0.5; u[0] = (3.0 / (x[1]-x[0])) * ((y[1][j][k]-y[0][j][k]) / (x[1]-x[0])-yp0); } for (i=1; i 0.99e30) /* The upper boundary condition is set either to be "natural" */ qn = un =0.0; else { /* or else to have a specified first derivative. */ qn = 0.5; un = (3.0 / (x[nn]-x[nn-1])) * (ypnn-(y[nn][j][k]-y[nn-1][j][k]) / (x[nn]-x[nn-1])); } y2[nn] = (un-qn*u[nn-1]) / (qn*y2[nn-1]+1.0); for (l=nn-1; l>=0; l--) /* This is the backsubstitution loop of the tridiagonal algorithm */ y2[l] = y2[l]*y2[l+1] + u[l]; xcFree_Vectorf( u ); } void xcRegSpline3Int(float xa[], float ***ya, int i, int j, int k, \ float y2a[], float x, float *y) { int klo,khi; float h,b,a; klo = i; khi = i + 1; h = xa[khi]-xa[klo]; /* The xa's must be distinct. */ if (h == 0.0) xcError("Bad xa input to routine splint"); a = (xa[khi]-x) / h; b = (x-xa[klo]) / h; /* Cubic spline polynomial is now evaluated */ *y = a*ya[klo][j][k] + b*ya[khi][j][k] + ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0; } xcrysden-1.6.2/C/sInfo.c0000644000175000017500000000723711712736221013472 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/sInfo.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #define SINFO_MAXARGS 50 void Set_sInfoArray( Tcl_Interp *interp ); void Set_sInfoArray( Tcl_Interp *interp ) { char *name1 = "sInfo"; char *name2[SINFO_MAXARGS]; char *newValue[SINFO_MAXARGS]; int i, flags = TCL_GLOBAL_ONLY; for(i=0; i #include #include "struct.h" extern void vecMultMat(double major[4][4], double new[4][4], double old[4][4], double vec[16]); extern void vecOldMat(double major[4][4], double old[4][4]); extern void vecRotXYMat(double new[4][4], double cosfiX, double sinfiX, double cosfiY, double sinfiY); int cryRotateXY(NEW_WIN_CONTEXT *wc, double fiX, double fiY); int cryRotateXY(NEW_WIN_CONTEXT *wc, double fiX, double fiY) { double cosfiX, sinfiX; double cosfiY, sinfiY; cosfiX = cos(fiX); sinfiX = sin(fiX); cosfiY = cos(fiY); sinfiY = sin(fiY); vecRotXYMat( wc->vec.crdnew, cosfiX, sinfiX, cosfiY, sinfiY); vecOldMat( wc->vec.crdmajor, wc->vec.crdold ); vecMultMat( wc->vec.crdmajor, wc->vec.crdnew, wc->vec.crdold, wc->vec.crdvec ); return XC_OK; } xcrysden-1.6.2/C/sgiAux.c0000644000175000017500000001154111712736221013645 0ustar tonetone#include #include #define MINTOL 1.0e-15 #define ABS(x) ( (x)>0 ? (x) : -(x) ) extern GLuint xcGenLists( GLsizei i ); /* The three routines below (findList1, compareParams1, and makeModelPtr1) are slightly modified versions of libaux findList, compareParams, and makeModelPtr routines (from "OpenGL Programming Guide", file: shapes.c). Below is the corresponding copyright. * (c) Copyright 1993, Silicon Graphics, Inc. * ALL RIGHTS RESERVED * Permission to use, copy, modify, and distribute this software for * any purpose and without fee is hereby granted, provided that the above * copyright notice appear in all copies and that both the copyright notice * and this permission notice appear in supporting documentation, and that * the name of Silicon Graphics, Inc. not be used in advertising * or publicity pertaining to distribution of the software without specific, * written prior permission. * * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. * * US Government Users Restricted Rights * Use, duplication, or disclosure by the Government is subject to * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph * (c)(1)(ii) of the Rights in Technical Data and Computer Software * clause at DFARS 252.227-7013 and/or in similar or successor * clauses in the FAR or the DOD or NASA FAR Supplement. * Unpublished-- rights reserved under the copyright laws of the * United States. Contractor/manufacturer is Silicon Graphics, * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. * * OpenGL(TM) is a trademark of Silicon Graphics, Inc. */ GLuint findList1 (int lindex, GLdouble *paramArray, int size); static int compareParams1 (GLdouble *oneArray, GLdouble *twoArray, int size); GLuint makeModelPtr1 (int lindex, GLdouble *sizeArray, int count); /*****************************************************************************/ /* THIS IS FOR LISTS */ /* structure for each geometric object */ typedef struct model { GLuint list; /* display list to render object */ struct model *ptr; /* pointer to next object */ int numParam; /* # of parameters */ GLdouble *params; /* array with parameters */ } MODEL, *MODELPTR; /* array of linked lists--used to keep track of display lists * for each different type of geometric object. */ static MODELPTR lists[25] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; /****************NEXT THREE FUNCTIONS ARE LISTS MANAGEMENT *******************/ /* linked lists--display lists for each different * type of geometric objects. The linked list is * searched, until an object of the requested * size is found. If no geometric object of that size * has been previously made, a new one is created. */ GLuint findList1 (int lindex, GLdouble *paramArray, int size) { MODELPTR endList; endList = lists[lindex]; while (endList != NULL) { if (compareParams1 (endList->params, paramArray, size)) return (endList->list); endList = endList->ptr; } /* if not found, return 0 and calling routine should * make a new list */ return (0); } static int compareParams1 (GLdouble *oneArray, GLdouble *twoArray, int size) { int i; int matches = 1; GLdouble diff; for (i = 0; (i < size) && matches; i++) { diff = *oneArray++ - *twoArray++; if ( ABS(diff) > MINTOL ) matches = 0; } return (matches); } GLuint makeModelPtr1 (int lindex, GLdouble sizeArray[], int count) { int i; MODELPTR newModel; GLdouble *size; size = (GLdouble *) malloc( sizeof(GLdouble) * count ); for (i=0; ilist = xcGenLists (1); newModel->numParam = count; newModel->params = size; newModel->ptr = lists[lindex]; lists[lindex] = newModel; return (newModel->list); } xcrysden-1.6.2/C/fft3d.h0000644000175000017500000000230711727353217013426 0ustar tonetone#ifndef FFT3D_H_ #define FFT3D_H_ #define COMPLEX_SET(dst, re, im) \ do { \ dst[0] = re; \ dst[1] = im; \ } while(0) #define COMPLEX_CONJ(dst, src) \ do { \ dst[0] = src[0]; \ dst[1] = -src[1]; \ } while(0) #define COMPLEX_COPY(dst, src) \ do { \ dst[0] = src[0]; \ dst[1] = src[1]; \ } while(0) #define COMPLEX_SCALE(comp, scale) \ do { \ comp[0] *= scale; \ comp[1] *= scale; \ } while(0) #define FT_MAX(n) ( n/2 ) #define FT_MIN(n) ( (1 - n%2) - n/2 ) #define FT_INDEX(n,N) ( n<0 ? N+n : n ) /* fft3d.c */ extern float ***general_grid_fft_interpolator_tensor3f(int n[3], int degree[3], float ***src); extern double *fft3d_interpolator(int n1, int n2, int n3, int n1new, int n2new, int n3new, double *func); extern void fft3d_interpolate(int n1, int n2, int n3, int n1new, int n2new, int n3new, double *func, double *result); /* fft_util.c */ extern void fft2d_enlarge_complex_r2c(size_t n1, size_t n2, fftw_complex *in, size_t n1new, size_t n2new, fftw_complex *out); extern void fft3d_enlarge_complex_r2c(size_t n1, size_t n2, size_t n3, fftw_complex *in, size_t n1new, size_t n2new, size_t n3new, fftw_complex *out); #endif xcrysden-1.6.2/C/wigner.h0000644000175000017500000000264511712736221013712 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/wigner.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define WIGNER_PRIM 0 #define WIGNER_CONV 1 #define WIGNER_CLEAR 2 #define WIGNER_NODEMODE_EVERY 0 /* every node is selected (DEFAULT) */ #define WIGNER_NODEMODE_SELECT 1 /* just selected nodes */ typedef struct { FILE *fp; int transparency; float color[4]; int is_initialized[2]; int nodemode[2]; int nnodes[2]; float **nodes[2]; /* nodes[prim/conv][#][fx/fy/fz] */ } WIGNER_ATTRIB; WIGNER_ATTRIB ws_attrib; xcrysden-1.6.2/C/memory.c0000644000175000017500000001511413516064733013723 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/memory.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "memory.h" void *xcMalloc(size_t size) { void *ptr; if (size<=0) { xcError("can't locate zero memory in xcMalloc"); } ptr = (void *) malloc(size); if (!ptr) xcError("out of memory in xcMalloc"); return ptr; } void *xcCalloc(size_t nmemb, size_t size) { void *ptr; if (size<=0 || nmemb<=0) { xcError("can't locate zero memory in xcCalloc"); } ptr = (void *) calloc( nmemb, size ); if (!ptr) xcError("out of memory in xcCalloc"); return ptr; } void *xcRealloc(void *ptr, size_t size) { ptr = (void *) realloc( ptr, size ); if (!ptr && size) xcError("out of memory in xcRealloc"); return ptr; } void xcFree(FREE_ARG ptr) { if (ptr) free (ptr); /*fprintf(stderr,"xcFree();");*/ } void *xcNullFree(FREE_ARG ptr) { if (ptr) free (ptr); return (FREE_ARG)NULL; } void xcError(char error_text[]) { /* XCrySDen standard error handler */ fprintf(stderr,"XCrySDen run-time error:\n"); fprintf(stderr,"%s\n",error_text); fprintf(stderr,"Exit !!!\n"); exit(1); } void xcFree_Vectorf(float *v) { free( (FREE_ARG) v ); } void xcFree_Matrixf(float **m) { free( (FREE_ARG) m[0] ); free( (FREE_ARG) m ); } void xcFree_Tensor3f(float ***t) { free( (FREE_ARG) t[0][0] ); free( (FREE_ARG) t[0] ); free( (FREE_ARG) t ); } void xcFree_Tensor3i(int ***t) { free( (FREE_ARG) t[0][0] ); free( (FREE_ARG) t[0] ); free( (FREE_ARG) t ); } void xcFree_ReallocatedTensor3f_00to11( float ***rt ) { free( (FREE_ARG) (rt[1] + 1) ); free( (FREE_ARG) (rt + 1) ); } float *xcMallocVectorf(long n) { float *v; v=(float *) malloc( (size_t) n*sizeof(float) ); if (!v) xcError("allocation failure in xcMallocVectorf"); return v; } float **xcMallocMatrixf(long nr, long nc) { long i; float **m; /* allocate pointers to pointers to rows */ m=(float **) malloc( (size_t) nr*sizeof(float *) ); if (!m) xcError("allocation failure 1 in xcMallocMatrixf"); /* allocate pointers to rows and set pointers to them */ m[0]=(float *) malloc( (size_t) nr*nc*sizeof(float) ); if (!m[0]) xcError("allocation failure 2 in xcMallocMatrixf"); for(i=1; i /* --- auxulproc.c ---*/ extern void VecSum2f(float vec1[], float vec2[], int i, int j, float res[]); extern float distfv(float *v); double DetermineParapipedSized(double *vec1, double *vec2, double *vec3, double *orig); float DetermineParapipedSize(float *vec1, float *vec2, float *vec3, float *orig); static void GetParaVec( float *ed, float *vec0, float *vec1, float *vec2, float *res ); static void GetPara2DVec( float *ed, float *vec0, float *vec1, float *res ); double papipedMaxDiagSize(double v0[3], double v1[3], double v2[3]); double DetermineParapipedSized(double *vec1, double *vec2, double *vec3, double *orig) { int i; float vecf1[3], vecf2[3], vecf3[3], origf[3]; for (i=0; i<3; i++) { vecf1[i] = (float) vec1[i]; vecf2[i] = (float) vec2[i]; vecf3[i] = (float) vec3[i]; origf[i] = (float) orig[i]; } return (double) DetermineParapipedSize(vecf1, vecf2, vecf3, origf); } /* get the longest distance of eight parapiped's corners from a given origin orig[3] */ float DetermineParapipedSize(float *vec1, float *vec2, float *vec3, float *orig) { register int i; float max, d; float v[3], v1[3]; float ed[8][3] = { {0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 1.0, 0.0}, {1.0, 0.0, 0.0}, {1.0, 0.0, 1.0}, {1.0, 1.0, 1.0}, {0.0, 1.0, 1.0}, {0.0, 0.0, 1.0} }; max = 0.0; for( i=0; i<8; i++) { GetParaVec( ed[i], vec1, vec2, vec3, v1 ); VecSum2f( v1, orig, 1, -1, v ); d = distfv( v ); if ( max < d ) max = d; } return max; } static void GetParaVec( float *ed, float *vec0, float *vec1, float *vec2, float *res ) { res[0] = ed[0]*vec0[0] + ed[1]*vec1[0] + ed[2]*vec2[0]; res[1] = ed[0]*vec0[1] + ed[1]*vec1[1] + ed[2]*vec2[1]; res[2] = ed[0]*vec0[2] + ed[1]*vec1[2] + ed[2]*vec2[2]; } static void GetPara2DVec( float *ed, float *vec0, float *vec1, float *res ) { res[0] = ed[0]*vec0[0] + ed[1]*vec1[0]; res[1] = ed[0]*vec0[1] + ed[1]*vec1[1]; res[2] = ed[0]*vec0[2] + ed[1]*vec1[2]; } /* get the longest distance of four parallelogram's corners from a given origin orig[3] */ float DetermineParalleSize(float *vec1, float *vec2, float *orig) { register int i; float max, d; float v[3], v1[3]; float ed[4][2] = { {0.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}, {1.0, 0.0} }; max = 0.0; for( i=0; i<4; i++) { GetPara2DVec( ed[i], vec1, vec2, v1 ); VecSum2f( v1, orig, 1, -1, v ); d = distfv( v ); if ( max < d ) max = d; } return max; } double papipedMaxDiagSize(double v0[3], double v1[3], double v2[3]) { register int i; double diag_d[4][3], sq_diag[4], max; for (i=0; i<3; i++) { /* 1st diagonal: (0,0,0)-->(1,1,1) */ diag_d[0][i] = v0[i] + v1[i] + v2[i]; /* 2nd diagonal: (1,1,0)-->(0,0,1) */ diag_d[1][i] = v2[i] - v0[i] - v1[i]; /* 3rd diagonal: (1,0,0)-->(0,1,1) */ diag_d[2][i] = v1[i] + v2[i] - v0[i]; /* 4th diagonal: (0,1,0)-->(1,0,1) */ diag_d[3][i] = v0[i] + v2[i] - v1[i]; } for (i=0; i<4; i++) { sq_diag[i] = diag_d[i][0]*diag_d[i][0] + diag_d[i][1]*diag_d[i][1] + diag_d[i][2]*diag_d[i][2]; } max = sq_diag[0]; if (sq_diag[1] > max) max = sq_diag[1]; if (sq_diag[2] > max) max = sq_diag[2]; if (sq_diag[3] > max) max = sq_diag[3]; return sqrt(max); } xcrysden-1.6.2/C/sgiRasterFont.c0000644000175000017500000002322311712736221015177 0ustar tonetone /* * Below raster font (i.e. GLubyte rasters[][13]) is from the source * code example in the _OpenGL Programming Guide_, published by * Addison-Wesley; ISBN 0-201-63274-8. * * (c) Copyright 1993, Silicon Graphics, Inc. * ALL RIGHTS RESERVED * Permission to use, copy, modify, and distribute this software for * any purpose and without fee is hereby granted, provided that the above * copyright notice appear in all copies and that both the copyright notice * and this permission notice appear in supporting documentation, and that * the name of Silicon Graphics, Inc. not be used in advertising * or publicity pertaining to distribution of the software without specific, * written prior permission. * * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. * * US Government Users Restricted Rights * Use, duplication, or disclosure by the Government is subject to * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph * (c)(1)(ii) of the Rights in Technical Data and Computer Software * clause at DFARS 252.227-7013 and/or in similar or successor * clauses in the FAR or the DOD or NASA FAR Supplement. * Unpublished-- rights reserved under the copyright laws of the * United States. Contractor/manufacturer is Silicon Graphics, * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. * * OpenGL(TM) is a trademark of Silicon Graphics, Inc. */ #include GLubyte rasters[][13] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36}, {0x00, 0x00, 0x00, 0x66, 0x66, 0xff, 0x66, 0x66, 0xff, 0x66, 0x66, 0x00, 0x00}, {0x00, 0x00, 0x18, 0x7e, 0xff, 0x1b, 0x1f, 0x7e, 0xf8, 0xd8, 0xff, 0x7e, 0x18}, {0x00, 0x00, 0x0e, 0x1b, 0xdb, 0x6e, 0x30, 0x18, 0x0c, 0x76, 0xdb, 0xd8, 0x70}, {0x00, 0x00, 0x7f, 0xc6, 0xcf, 0xd8, 0x70, 0x70, 0xd8, 0xcc, 0xcc, 0x6c, 0x38}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1c, 0x0c, 0x0e}, {0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c}, {0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30}, {0x00, 0x00, 0x00, 0x00, 0x99, 0x5a, 0x3c, 0xff, 0x3c, 0x5a, 0x99, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00}, {0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0c, 0x0c, 0x06, 0x06, 0x03, 0x03}, {0x00, 0x00, 0x3c, 0x66, 0xc3, 0xe3, 0xf3, 0xdb, 0xcf, 0xc7, 0xc3, 0x66, 0x3c}, {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x38, 0x18}, {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0xe7, 0x7e}, {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0x07, 0x03, 0x03, 0xe7, 0x7e}, {0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xcc, 0x6c, 0x3c, 0x1c, 0x0c}, {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x03, 0x03, 0xff}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e}, {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x03, 0x7f, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e}, {0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06}, {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60}, {0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x18, 0x0c, 0x06, 0x03, 0xc3, 0xc3, 0x7e}, {0x00, 0x00, 0x3f, 0x60, 0xcf, 0xdb, 0xd3, 0xdd, 0xc3, 0x7e, 0x00, 0x00, 0x00}, {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18}, {0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, {0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, {0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc}, {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e}, {0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06}, {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3}, {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3}, {0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e}, {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, {0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c}, {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e}, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff}, {0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c}, {0x00, 0x03, 0x03, 0x06, 0x06, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60}, {0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18}, {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x30, 0x70}, {0x00, 0x00, 0x7f, 0xc3, 0xc3, 0x7f, 0x03, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, {0x00, 0x00, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x03, 0x03, 0x03, 0x03, 0x03}, {0x00, 0x00, 0x7f, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x33, 0x1e}, {0x7e, 0xc3, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0}, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00}, {0x38, 0x6c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x00}, {0x00, 0x00, 0xc6, 0xcc, 0xf8, 0xf0, 0xd8, 0xcc, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0}, {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78}, {0x00, 0x00, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xfe, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00}, {0xc0, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0x00, 0x00, 0x00, 0x00}, {0x03, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xfe, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0xfe, 0x03, 0x03, 0x7e, 0xc0, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x00}, {0x00, 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00}, {0xc0, 0x60, 0x60, 0x30, 0x18, 0x3c, 0x66, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0xff, 0x60, 0x30, 0x18, 0x0c, 0x06, 0xff, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x0f, 0x18, 0x18, 0x18, 0x38, 0xf0, 0x38, 0x18, 0x18, 0x18, 0x0f}, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, {0x00, 0x00, 0xf0, 0x18, 0x18, 0x18, 0x1c, 0x0f, 0x1c, 0x18, 0x18, 0x18, 0xf0}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x8f, 0xf1, 0x60, 0x00, 0x00, 0x00} }; xcrysden-1.6.2/C/xcIsoSurf.c0000644000175000017500000026436613525643247014362 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcIsoSurf.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include #include #include "xcGLparam.h" #include "struct.h" #include "isosurf.h" #include "xcfunc.h" extern Options3D is; /* --- extern function prototypes ---*/ PLANEVERTEX ***plvertex = NULL; /***************************************************************************** * display-atributes for isosurface & isoplane */ ISO_ATTRIB isoDisp = { ISOSURF_SOLID, GL_SMOOTH, ISOSURF_TRANSP_OFF, GL_TRUE }; ISO_ATTRIB isoplaneDisp[MAX_ISOOBJECTS]; /* when we perform xc_iso* commands, we must follow some order of commands, * isostate variable trace that */ ISOSTATE isostate = { 0, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, 0, 0, ISO_NULL }; void xcIsoError(void); static void InitIsoDataArr(void); static void InitIsoExpand(void); static float SetIsosurf_VPf(void); /***************************************************************************** * IN THIS FILE THE FOLLOWING COMMANDS ARE IMPLEMENTED:: * --------------------------------------------------- * * xc_iso init|finish|(end isostack|isosign)|grid|save| \ * minvalue|maxvalue|(isolevel )|polygonise ?-algorithm cubes|tetrahedrons? ?-shademodel smoth|flat? ?-normals gradient|triangles?| \ * (smoothsteps )|smoothweight )| \ * (get smoothsteps|smoothweight)|smoothing \ * (isoplane ??)| \ * interpolate |\ * (isoplaneconfig -isoplanemin \ * -isoplanemax \ * -isolinecolor {monocolor r g b}|polycolor \ * -isolinewidth width \ * -isolinedash nodash | negdash | fulldash \ * -isolinenlevels \ * -isoplanelighting 0/1) * * xc_isostack |( \ * ) * * xc_isosign * * xc_isofiles bin_vertex_filename bin_filename filename0 \ * ?filename1? ?filename2? ...." * * xc_isopoints 2D|3D points * * xc_isodata (,i=ISODATA_MAXSTACK,0,-1) * * xc_isosurf -drawstyle solid|wire|dot -shademodel smoth|flat \ * -transparency on|off -isosurf none|xxx * xc_isoplane \ * -planetype colorplane|isoline|both \ * -transparency on|off * -render now|after * * xc_isoexpand \ * -repeattype default|convcell|primcell \ * -shape default|parapipedal|hexagonal \ * -expand whole|{nx ny nz}|... * -render now|after *****************************************************************************/ /***************************************************************************** * auxilary functions */ void xcIsoError(void) { int i, j; if ( isostate.gridvertex_malloc ) { xcFree_GRIDVERTEX( gridvertex ); isostate.gridvertex_malloc = 0; } for(i=ISOOBJ_BASE; i they represent all three faces for some paralepiped; check if it is one of such plane */ int IsIsoPlane123( int type ) { if ( type == ISOOBJ_PLANE1 || type == ISOOBJ_PLANE2 || type == ISOOBJ_PLANE3 ) return 1; else return 0; } /****************************************************************************** * XC_IsoCmd --> inplementation of 'xc_iso' custom Tcl command * --------------------- * Usage: xc_iso init|finish|(end isostack|isosign)|grid|save| \ * minvalue|maxvalue|(isolevel )|polygonise ?-algorithm cubes|tetrahedrons? ?-shademodel smoth|flat? ?-normals gradient|triangles?| \ * (smoothsteps )|smoothweight )| \ * (get smoothsteps|smoothweight)|smoothing \ * (isoplane ??)| \ * interpolate |\ * (isoplaneconfig -isoplanemin \ * -isoplanemax \ * -isolinecolor {monocolor r g b}|polycolor \ * -isolinewidth width \ * -isolinedash nodash | negdash | fulldash \ * -isolinenlevels \ * -isoplanelighting 0/1) * */ int XC_IsoCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { /* printf("%d; %s %s %s %s\n",argc,argv[0],argv[1],argv[2],argv[3]); */ if ( (argc < 2 ) || (argc == 2 && ( strcmp(argv[1],"init") != 0 && strcmp(argv[1],"finish") !=0 && strcmp(argv[1],"grid") != 0 && strcmp(argv[1],"minvalue") != 0 && strcmp(argv[1],"maxvalue") !=0 && strcmp(argv[1],"smoothing") != 0 && strcmp(argv[1],"polygonise") != 0 ) ) || (argc == 3 && ( strcmp(argv[1],"end") != 0 && strcmp(argv[1],"isolevel") != 0 && strcmp(argv[1],"interpolate") != 0 && strcmp(argv[1],"get") != 0 && strcmp(argv[1],"smoothsteps") != 0 && strcmp(argv[1],"smoothweight") !=0 ) ) || (argc == 4 && ( strcmp(argv[1],"isolevel") != 0 && strcmp(argv[1],"save") != 0 && strcmp(argv[1],"get") != 0 && strcmp(argv[1],"polygonise") != 0 ) ) || (argc == 6 && ( strcmp(argv[1],"isoplane") != 0 && strcmp(argv[1],"isoplaneconfig") !=0 && strcmp(argv[1],"polygonise") != 0 ) ) || (argc == 7 && ( strcmp(argv[1],"isoplane") != 0 && strcmp(argv[1],"isoplaneconfig") != 0 ) ) || (argc > 7 && (strcmp(argv[1],"isoplaneconfig") != 0 && strcmp(argv[1],"polygonise") != 0) ) || (argc != 2 && argc != 4 && argc != 6 && argc != 8 && strcmp(argv[1],"polygonise") == 0 ) ) { fprintf(stderr,"debug> argc=%d. argv[1]=%s\n", argc, argv[1]); fprintf(stderr,"debug> expr = %d\n", (argc != 2 && argc != 4 && argc != 6 && strcmp(argv[1],"polygonise"))); Tcl_SetResult(interp, "Usage: xc_iso init|finish|(end isostack|isosign)|grid|save filename identifier|minvalue|maxvalue|(isolevel ??)|polygonise ...|(smoothsteps )|smoothweight )|(get smoothsteps|smoothweight)|(isoplane ??)|isoplaneconfig -isoplanemin \n-isoplanemax \n-isolinecolor {monocolor r g b}\n-isolinewidth width\n-isoplanelighting 0/1| polycolor\nisolinedash negdash | fulldash\n-isolinenlevels \n", TCL_STATIC); return TCL_ERROR; } /* ------------ XC_ISO INIT ---------------------------------------------- */ if ( strcmp(argv[1],"init") == 0 ) { isostate.stateflag = ISO_INIT; /* here comes initialization */ InitIsoDataArr(); InitIsoExpand(); /* malloc ***plvertex */ if (!plvertex) plvertex = (PLANEVERTEX ***) malloc( (size_t) MAX_ISOOBJECTS * sizeof(PLANEVERTEX **) ); if (!plvertex) xcError("allocation failure for plvertex"); } /* ------------ XC_ISO FINISH -------------------------------------------- */ else if ( strcmp(argv[1],"finish") == 0 ) { /* xcIsoError() will do precisely what we want */ xcIsoError(); isostate.stateflag = ISO_NULL; if ( dimType==XC_3D ) { if (is.stickmode && !is.ballmode) xcMakeProjection3D("sticks"); if (is.ballmode) xcMakeProjection3D("balls"); if (is.spacefillmode) xcMakeProjection3D("space"); } } /* ------------ XC_ISO GRID -------------------------------------------- */ else if ( strcmp(argv[1],"grid") == 0 ) { char *grid_string = (char *) Tcl_Alloc( sizeof(char) * 128); sprintf(grid_string, "%d %d %d", grd.nx, grd.ny, grd.nz); Tcl_SetResult(interp, grid_string, TCL_DYNAMIC); } /* ------------ XC_ISO SAVE ---------------------------------------------- */ else if ( strcmp(argv[1],"save") == 0 ) { FILE *fp; /* save the calculated grid of points */ if ( !(isostate.stateflag & (ISO_STACK | ISO_SIGN | ISO_FILES | ISO_POINTS | ISO_DATA)) ) { Tcl_SetResult(interp, "\"xc_isostack\", \"xc_isosign\", \"xc_isofiles\", \"xc_isopoints\" and \"xc_isodata\" should be called before \"xc_iso minvalue\" command", TCL_STATIC); return TCL_ERROR; } if ( (fp = fopen(argv[2], "w")) == NULL ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't open %s file for writing", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } if ( isodata.dim[ISOOBJ_BASE] == 2 ) WriteDataGrid(fp, DATAGRID_2D, argv[3], ISOOBJ_BASE); if ( isodata.dim[ISOOBJ_BASE] == 3 ) WriteDataGrid(fp, DATAGRID_3D, argv[3], ISOOBJ_BASE); fclose(fp); } /* ------------ XC_ISO END ----------------------------------------------- */ else if ( strcmp(argv[1],"end") == 0 ) { if ( strcmp(argv[2],"isostack") == 0 ) { /* check if all isodata.nframe[][1] are the same */ int i; for (i=1; i max_value ) { max_value = gridvertex[ix][iy][iz].val; } } else if ( isodata.dim[ISOOBJ_BASE] == 2 ) { for (ix = 0; ix < newgrd.nx; ix++) for (iy = 0; iy < newgrd.ny; iy++) if ( plvertex[ISOOBJ_BASE][ix][iy].val > max_value ) { max_value = plvertex[ISOOBJ_BASE][ix][iy].val; } } sprintf(result, "%f", max_value); Tcl_SetResult(interp, result, TCL_DYNAMIC); } /* ------------ XC_ISO GET------------------------------------------- */ else if ( strcmp(argv[1],"get") == 0 ) { char *result = Tcl_Alloc( sizeof(char) * 128); /* maximum lenght of result string is 128 characters */ if ( strncmp(argv[2], "smooths", 7) == 0 ) /* -- SMOOTHSTEPS -- */ sprintf(result,"%d", isodata.smoothsteps); else if ( strncmp(argv[2], "smoothw", 7) == 0 ) /* -- SMOOTHWEIGHT -- */ sprintf(result,"%f", isodata.smoothweight); else { Tcl_SetResult(interp, "Usage: xc_iso get smoothsteps|smoothweight", TCL_STATIC); return TCL_ERROR; } Tcl_SetResult(interp, result, TCL_DYNAMIC); } /* ------------ XC_ISO ISOLEVEL ------------------------------------------ */ else if ( strcmp(argv[1],"isolevel") == 0 ) { int i, ii; double isolevel; if ( argc < 3 && argc > 4 ) { Tcl_SetResult(interp, "Ugase: xc_iso isolevel ??", TCL_STATIC); return TCL_ERROR; } isodata.nlevel = argc - 2; for (i=2; i isodata.max ) ) { char rss[1024]; snprintf(rss, sizeof(rss),"specified isolevel %f is out of range, should be between [%f - %f]", isodata.isolevel[ii], isodata.min, isodata.max); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } else if ( argc == 4 ) { /* xc_iso isolevel +value -value at least one value has to be in range !! */ int l0 = ( isodata.isolevel[0] < isodata.min || isodata.isolevel[0] > isodata.max ); int l1 = ( isodata.isolevel[1] < isodata.min || isodata.isolevel[1] > isodata.max ); if ( l0 && l1 ) { char rss[1024]; snprintf(rss, sizeof(rss),"specified isolevels %f,%f are out of range, should be between [%f - %f]", isodata.isolevel[0], isodata.isolevel[1], isodata.min, isodata.max); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } if ( !(isostate.stateflag & ISO_ISOLEVEL) ) isostate.stateflag |= ISO_ISOLEVEL; } /* ------------ XC_ISO POLYGONISE ---------------------------------------- */ else if ( strcmp(argv[1],"polygonise") == 0 ) { int i; int algorithm = ISOSURF_TETRAHEDRAL; int shade_model = ISOSURF_SHADE_SMOOTH; int normals_model = ISOSURF_NORMALS_GRADIENT; for (i=2; i\" should be called before \"xc_iso polygonise\" command", TCL_STATIC); return TCL_ERROR; } /* for polygonisation isodata.dim[ISOOBJ_BASE] must be 3 */ if ( isodata.dim[ISOOBJ_BASE] != 3 ) { Tcl_SetResult(interp, "\"xc_isopoints 3D\" must be set, before calling \"xc_iso polygonise\"", TCL_STATIC); return TCL_ERROR; } for (i=0; i\" command", TCL_STATIC); return TCL_ERROR; } } /* ------------ XC_ISO SMOOTHWEIGHT--------------------------------------- */ else if ( strcmp(argv[1],"smoothweight") == 0 ) { double weight; /* it just remember the # of smoothing steps */ if ( Tcl_GetDouble(interp, argv[2], &weight) == TCL_ERROR ) { isodata.smoothweight=0.5; Tcl_SetResult(interp, "read character instead of double, while executing \"xc_iso smoothweight \" command", TCL_STATIC); return TCL_ERROR; } isodata.smoothweight = (float) weight; } /* ------------ XC_ISO SMOOTHING --------------------------------------- */ else if ( strcmp(argv[1],"smoothing") == 0 ) { int i; /* it is not OK as that OK as that */ /* to execute "xc_iso poligonise" everything must be prepared */ if ( !(isostate.stateflag & (ISO_STACK | ISO_SIGN | ISO_FILES | ISO_POINTS | ISO_DATA | ISO_ISOLEVEL | ISO_POLYGONISE)) ) { Tcl_SetResult(interp, "\"xc_isostack\", \"xc_isosign\", \"xc_isofiles\", \"xc_isopoints\", \"xc_isodata\" \"xc_iso isolevel \" and \"xc_iso polygonise\" should be called before \"xc_iso smoothing\" command", TCL_STATIC); return TCL_ERROR; } /* for polygonisation isodata.dim[ISOOBJ_BASE] must be 3 */ if ( isodata.dim[ISOOBJ_BASE] != 3 ) { Tcl_SetResult(interp, "\"xc_isopoints 3D\" must be set, before calling \"xc_iso smoothing\"", TCL_STATIC); return TCL_ERROR; } for (i=0; i 7) { Tcl_SetResult(interp, "Usage: xc_iso isoplane ??", TCL_STATIC); return TCL_ERROR; } /* * can be: none|colorplane|isoline|both */ /* to execute "xc_iso isoplane" everything must be prepared */ if ( !(isostate.stateflag & (ISO_STACK | ISO_SIGN | ISO_FILES | ISO_POINTS | ISO_DATA )) ) { Tcl_SetResult(interp, "\"xc_isostack\", \"xc_isosign\", \"xc_isofiles\", \"xc_isopoints\" and \"xc_isodata\" should be called before \"xc_iso isoplane\" command", TCL_STATIC); return TCL_ERROR; } /* * get the TYPE of isoplane */ if ( Tcl_GetInt(interp, argv[2], &type ) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" while executing %s %s %s %s %s", argv[2], argv[0], argv[1], argv[2], argv[3], argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( type < ISOOBJ_BASE || type >= MAX_ISOOBJECTS ) { char rss[1024]; snprintf(rss, sizeof(rss),"object type \"%d\" for xc_iso isoplane is out of range, must be within [%d,%d]", type, ISOOBJ_BASE,MAX_ISOOBJECTS-1); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if type == ISOOBJ_BASE --> we deal with isoplane as base iso-object, so: isodata.dim[ISOOBJ_BASE] must be 2 if type > ISOOBJ_PLANE1|2|3 --> we want to draw isoplane as a secondary isoobject, so: isodata.dim[ISOOBJ_BASE] must be 3 */ if ( type == ISOOBJ_BASE && isodata.dim[ISOOBJ_BASE] != 2 ) { Tcl_SetResult(interp, "\"xc_isopoints 0 2D\" must be set, before calling \"xc_iso isoplane 0\"", TCL_STATIC); return TCL_ERROR; } else if ( IsIsoPlane123( type ) && isodata.dim[ISOOBJ_BASE] != 3 ) { char rss[1024]; snprintf(rss, sizeof(rss), "\"xc_isopoints 0 3D\" must be set, before calling \"xc_iso isoplane %d\"", type); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* * get colorbase */ if ( Tcl_GetInt(interp, argv[3], &cb ) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" while executing %s %s %s %s %s", argv[3], argv[0], argv[1], argv[2], argv[3], argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( cb < COLORBASE_FIRST || cb > COLORBASE_LAST ) { char rss[1024]; snprintf(rss, sizeof(rss),"colorbase %d is out of range, must be within [%d,%d]", cb, COLORBASE_FIRST, COLORBASE_LAST); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* * get scalefunction */ if ( Tcl_GetInt(interp, argv[4], &fn ) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" while executing %s %s %s %s %s", argv[4], argv[0], argv[1], argv[2], argv[3], argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( fn < SCALE_FUNC_FIRST || fn > SCALE_FUNC_LAST ) { char rss[1024]; snprintf(rss, sizeof(rss),"scale-function %d is out of range, must be within [%d,%d]", fn, SCALE_FUNC_FIRST, SCALE_FUNC_LAST); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* * get what */ if ( strcmp(argv[5], "none") == 0 ) { int flag = ISO_NULL; if ( type == ISOOBJ_BASE ) { flag |= ISO_COLORPLANE | ISO_ISOLINE; VPf.colorplane[ISOOBJ_BASE] = GL_FALSE; VPf.isoline[ISOOBJ_BASE] = GL_FALSE; } else if ( type == ISOOBJ_PLANE1 ) { flag |= ISO_COLORPLANE1 | ISO_ISOLINE1; VPf.colorplane[ISOOBJ_PLANE1] = GL_FALSE; VPf.isoline[ISOOBJ_PLANE1] = GL_FALSE; } else if ( type == ISOOBJ_PLANE2 ) { flag |= ISO_COLORPLANE2 | ISO_ISOLINE2; VPf.colorplane[ISOOBJ_PLANE2] = GL_FALSE; VPf.isoline[ISOOBJ_PLANE2] = GL_FALSE; } else if ( type == ISOOBJ_PLANE3 ) { flag |= ISO_COLORPLANE3 | ISO_ISOLINE3; VPf.colorplane[ISOOBJ_PLANE3] = GL_FALSE; VPf.isoline[ISOOBJ_PLANE3] = GL_FALSE; } xcDeleteBitFlags( &isostate.stateflag, flag ); } else if ( strcmp(argv[5], "colorplane") == 0 || strcmp(argv[5], "isoline") == 0 || strcmp(argv[5], "both") == 0 ) { int i; int islide; int nslide = newgrd.nz; int a = newgrd.nx; int b = newgrd.ny; /* nslide, a, b will be reassigned if PLANE123 */ /* * do we have ISOOBJ_PLANE1|2|3 */ if ( IsIsoPlane123( type ) ) { /* PLANE1 == vec0 x vec1; PLANE2 == vec2 x vec0; PLANE3 == vec1 x vec2; */ if ( type == ISOOBJ_PLANE2 ) { a = newgrd.nz; b = newgrd.nx; nslide = newgrd.ny; } if ( type == ISOOBJ_PLANE3 ) { a = newgrd.ny; b = newgrd.nz; nslide = newgrd.nx; } /* first get the number of slide; islide = [1..newgrd.nx|ny|nz] */ if ( Tcl_GetInt(interp, argv[6], &islide ) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" while executing %s %s %s %s %s ...", argv[6], argv[0], argv[1], argv[2], argv[3], argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* * check if islide is within [1..nslide] */ if ( islide < 1 || islide > nslide ) { char rss[1024]; snprintf(rss, sizeof(rss),"islide #%d is out of range, should be within [%d,%d]", islide, 1, nslide); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* * malloc plvertex[type] */ if ( !isostate.plvertex_malloc[type] ) { plvertex[type] = xcMallocPLANEVERTEX( a, b ); isostate.plvertex_malloc[type] = 1; } if ( (strcmp( argv[5], "isoline") == 0 || strcmp( argv[5], "both") == 0) && !isostate.isoline2D_malloc[type] ) { for(i=0; i \"%s\" for xc_iso isoplane, must be one of colorplane, isoline or both, while executing %s %s %s %s %s %s", argv[5], argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* ------------ XC_ISO INTERPOLATE --------------------------------------- */ else if ( strcmp(argv[1],"interpolate") == 0 ) { int i, degree; if ( argc != 3 ) { Tcl_SetResult(interp, "Usage: xc_iso interpolate ", TCL_STATIC); return TCL_ERROR; } /* to execute "xc_iso interpolate" everything must be prepared */ if ( !(isostate.stateflag & (ISO_STACK | ISO_SIGN | ISO_FILES | ISO_POINTS | ISO_DATA )) ) { Tcl_SetResult(interp, "\"xc_isostack\", \"xc_isosign\", \"xc_isofiles\", \"xc_isopoints\" and \"xc_isodata\" should be called before \"xc_iso interpolate\" command", TCL_STATIC); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[2], °ree ) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" while executing %s %s %s", argv[3], argv[0], argv[1], argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* * so far we can interpolate just ISOOBJ_BASE, and this is needed */ for (i=ISOOBJ_PLANE1; i<=ISOOBJ_PLANE3; i++) { if ( isostate.plvertex_malloc[i] ) { xcFree_PLANEVERTEX( plvertex[i] ); isostate.plvertex_malloc[i] = 0; } /* we do not need to do this, seens we use xcReallocate2xBigger routines: if ( isostate.isoline2D_malloc[i] ) { xcFree_LINE( isoline2D[i].segment ); isostate.isoline2D_malloc[i] = 0; } */ } /* now we should delete all flags about PLANE123 */ xcDeleteBitFlags( &isostate.stateflag, (ISO_COLORPLANE1 | ISO_COLORPLANE2 | ISO_COLORPLANE3 | ISO_ISOLINE1 | ISO_ISOLINE2 | ISO_ISOLINE3 ) ); isoInterpolate( degree ); } /* ------------ XC_ISO ISOPLANECONFIG------------------------------------- */ else if ( strcmp(argv[1],"isoplaneconfig") == 0 ) { int i, j, obj; static int first_time[MAX_ISOOBJECTS] = {1, 1, 1, 1}; /* Usage: * xc_iso isoplaneconfig \ * -isoplanemin \ * -isoplanemax \ * -isolinecolor {monocolor r g b} | polycolor \ * -isolinewidth width \ * -isolinedash nodash | negdash | fulldash \ * -isolinenlevels \ * -isoplanelighting 0/1) * * Defaults: -isolinecolor == monocolor 1.0, 1.0, 1.0, 1.0 * -isolinedash == negdash * -isolinenlevels == 15 * -isolinewidth == 2 */ if ( argc % 2 != 1) { Tcl_SetResult(interp, "Usage: xc_iso isoplaneconfig -isoplanemin \n-isoplanemax \n-isolinecolor monocolor\n-isolinewidth width\n-isoplanelighting 0/1 | polycolor\n-isolinedash negdash | fulldash\n-isolinenlevels )", TCL_STATIC); return TCL_ERROR; } /* get object */ if ( Tcl_GetInt(interp, argv[2], &obj ) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"expected integer, but got %s", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( obj < ISOOBJ_BASE || obj >= MAX_ISOOBJECTS ) { char rss[1024]; snprintf(rss, sizeof(rss)," type \"%d\" is out of range, should be between [%d,%d]", obj, ISOOBJ_BASE, MAX_ISOOBJECTS-1); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* set DEFAULTS */ if (first_time[obj]) { isoline2D[obj].linecolor = ISOLINE_MONOCOLOR; for (j=0; j<4; j++) isoline2D[obj].monocolor[j] = 1.0; isoline2D[obj].linedash = ISOLINE_NEGDASH; isoline2D[obj].nlevel = 15; first_time[obj] = 0; } for (i=3; i 4 ) { char rss[1024]; snprintf(rss, sizeof(rss), "expected \"monocolor r, g, b, ?a?\", but got \"%s\"", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); Tcl_Free((char *) argvList); return TCL_ERROR; } for (j=1; j inplementation of 'xc_isostack' custom Tcl command * --------------------- * Usage: * FIRST specify: xc_isostack * if (nstack < 4) { * specify: xc_isostack 0 * } else { * specify: xc_isostack * * * SPECIAL CASE of this command is: * xc_isostack 0 3 .... this specify number of frames * in stack3 * } * * or * * xc_isostack clean --- clean stacks * * ---------------------------------------------------------------------------- * stack order: * order 0 ..... open-shell case: nframe(0) = 2 * close-shell case: nframe(0) = 1 * * order 1 ..... if 3D case, then this is number of * points in Z directions * * order 2 ..... used for differentiall maps, * for example: stack1 = PSCF, * stack2 = PATO * * order 3 ..... several files may be merged * together (example: comparison of * methods); nframes in order 3 is * number of files merged toghether; * Each order-3 stack can have a * different number of frames in stack * order 2 & order 0, but must have * a matching stacks of order 1 */ int XC_IsostackCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int i, stack, nframe; static int frame3; static int is_nstack = 0; if ( argc != 2 && argc != 4 ) { Tcl_SetResult(interp, "Usage: xc_iso isoplane ??", TCL_STATIC); return TCL_ERROR; } /* first consider CASE: * xc_isostack */ if ( argc == 2 && strcmp(argv[1],"clean") == 0 ) { InitIsoDataArr(); is_nstack = 0; } else if ( argc == 2 ) { if ( Tcl_GetInt(interp, argv[1], &(isodata.nstack)) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" as first argument in \"xc_isostack\" command", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( isodata.nstack > ISODATA_MAXSTACK ) { char rss[1024]; snprintf(rss, sizeof(rss),"to many stacks in \"xc_isostack\" command, maximum number of stacks is %d", ISODATA_MAXSTACK); Tcl_SetResult(interp, rss, TCL_VOLATILE); isodata.nstack = 0; return TCL_ERROR; } is_nstack = 1; /* if isodata.nstack < 4, that means we have just one frame of order 3 */ if ( isodata.nstack < 4 ) isodata.nframe[0][3] = 1; } else if ( argc == 4 ) { /* check if xc_isostack was specified */ if ( !is_nstack ) { Tcl_SetResult(interp,"before using xc_isostack , xc_isostack must be specified", TCL_STATIC); return TCL_ERROR; } /* CASE: xc_isostack */ if ( Tcl_GetInt(interp, argv[1], &frame3) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" when executing %s %s %s", argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if isodata.nstack < 4 ==> if frame3 > 0 ==> ERROR */ if ( isodata.nstack < 4 && frame3 > 0 ) { char rss[1024]; snprintf(rss, sizeof(rss),"because only %d stacks are defined, only 0 can be specified as first argument to \"xc_isostack\" command", isodata.nstack); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[2], &stack) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" as second argument to \"xc_isostack\" command", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* stack can only be in range [0-2] for isodata.nstack < 4 and * in range [0-3] for isodata.nstack = 4 */ if ( stack < 0 || ( (isodata.nstack < 4 && stack > 2) || (isodata.nstack >= 4 && stack > 3) ) ) { char rss[1024]; snprintf(rss, sizeof(rss),"stack too large - %d, number must not be greater than %d; while executing %s %s %s %s", stack, isodata.nstack-1, argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[3], &nframe) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" as the third argument to \"xc_isostack\" command", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* is stack 3 defined */ if ( isodata.nstack < 4 ) { isodata.nframe[0][stack] = nframe; } else { if ( stack == 3 ) for (i=0; i inplementation of 'xc_isosign' custom Tcl command * --------------------- * Usage: * xc_isosign * * frame .... frame's number or 'all' * * frame_sign ....-1|0|+1 => if -1 then data are multiplied by -1 * if 0 by 0 , if 1 by 1 * DEFAULT sign is 0 */ int XC_IsosignCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int stacklevel, framenum, sign; if (argc != 4) { Tcl_SetResult(interp,"Usage: xc_isostack ", TCL_STATIC); return TCL_ERROR; } if ( !(isostate.stateflag & ISO_STACK) ) { Tcl_SetResult(interp, "\"xc_isostack\" command must be called before calling \"xc_isosign\" command", TCL_STATIC); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[1], &(stacklevel)) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing \"%s %s %s\"", argv[0],argv[1],argv[2],argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* stacklevel shouldn't be greater than MAXSTACK-1 */ if ( stacklevel > ISODATA_MAXSTACK - 1 ) { char rss[1024]; snprintf(rss, sizeof(rss),"stack of order %d was specified, but maximim order of stack allowed is %d; while executing \"%s %s %s %s\"", stacklevel, ISODATA_MAXSTACK-1, argv[0],argv[1],argv[2],argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( strcmp(argv[2],"all") == 0 ) { ; } else { if ( Tcl_GetInt(interp, argv[2], &(framenum)) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing \"%s %s %s\"", argv[0],argv[1],argv[2],argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } if ( Tcl_GetInt(interp, argv[3], &(sign)) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing \"%s %s %s\"", argv[0],argv[1],argv[2],argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* sign must be -1 | 0 | 1 */ if ( sign != -1 && sign != 0 && sign != 1 ) { char rss[1024]; snprintf(rss, sizeof(rss),"sign must be one of -1, 0, 1; but got \"%d\", while executing \"%s %s %s %s\"", sign, argv[0],argv[1],argv[2],argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* UPDATING SIGN */ if ( strcmp(argv[2],"all") != 0 ) { isodata.framesign[stacklevel][framenum] = sign; } else { int i; for (i=0; i inplementation of 'xc_isofiles' custom Tcl command * --------------------- * Usage: * xc_isofiles * ?? ?? .... * -------------------------------------------------------------------------- * xc_isofiles require: * pre-calling of: xc_isostack * xc_isosign */ int XC_IsofilesCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int i; const char *version; if ( argc < 4 ) { Tcl_SetResult(interp, "Usage: xc_isofiles ?? ?? ....", TCL_STATIC); return TCL_ERROR; } if ( !(isostate.stateflag & (ISO_STACK | ISO_SIGN)) ) { Tcl_SetResult(interp, "\"xc_isostack\" & \"xc_isosign\" must be called before calling \"xc_isofiles\" command", TCL_STATIC); return TCL_ERROR; } /* open binary filenames */ if (isostate.bin_vertex_file_open) { fclose( isodata.bin_vertex_fp ); isostate.bin_vertex_file_open = 0; } if ( (isodata.bin_vertex_fp = fopen(argv[1],"w+")) == NULL ) { char rss[1024]; snprintf(rss, sizeof(rss),"can't open file \"%s\"",argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); xcIsoError(); return TCL_ERROR; } isostate.bin_vertex_file_open = 1; if ( isostate.bin_file_open ) { fclose(isodata.bin_fp); isostate.bin_file_open = 0; } if ( (isodata.bin_fp = fopen(argv[2],"w")) == NULL ) { char rss[1024]; snprintf(rss, sizeof(rss),"can't open file \"%s\"",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); xcIsoError(); return TCL_ERROR; } isostate.bin_file_open = 1; /* what is the CRYSTAL version we are using ??? Load the value from system(c95_version) variable */ fprintf(stderr, "c95_version-1\n"); fflush(stderr); version = Tcl_GetVar2(interp, "system", "c95_version", TCL_GLOBAL_ONLY); if ( strncmp("95",version,2) == 0 ) { crystal_version = 95; } else if ( strncmp("98",version,2) == 0 ) { crystal_version = 98; } else if ( strncmp("03",version,2) == 0 ) { crystal_version = 3; } else if ( strncmp("06",version,2) == 0 ) { crystal_version = 6; } else if ( strncmp("09",version,2) == 0 ) { crystal_version = 9; } else if ( strncmp("14",version,2) == 0 ) { crystal_version = 14; } else { crystal_version = 0; } fprintf(stderr, "c95_version-2\n"); fflush(stderr); /* now checks if files really exist */ for (i=3; i inplementation of 'xc_isopoints' custom Tcl command * --------------------- * Usage: xc_isopoints 2D|3D * * .... ISOOBJ_BASE * .... ISOOBJ_PLANE1 * .... ISOOBJ_PLANE2 * .... ISOOBJ_PLANE3 */ int XC_IsopointsCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int obj, nobj; int i, j, ij; double value; /*float scalar, Zvec[3] = { 1.0, 1.0, 10.0 };*/ if ( argc < 3 ) { Tcl_SetResult(interp, "Usage: xc_isopoints 2D|3D ", TCL_STATIC); return TCL_ERROR; } /* * get the object type */ if ( Tcl_GetInt(interp, argv[1], &obj) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" while executing %s %s %s ...", argv[1], argv[0], argv[1], argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( obj < 0 || obj >= MAX_ISOOBJECTS ) { char rss[1024]; snprintf(rss, sizeof(rss),"object type \"%d\" is out of range", obj); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( strcmp(argv[2],"2D") == 0 ) { isodata.dim[obj] = 2; if ( argc != 12 ) { Tcl_SetResult(interp, "invalid number of arguments in \"xc_isopoints 2D\" command", TCL_STATIC); return TCL_ERROR; } /* delete the following bit flags */ xcDeleteBitFlags( &isostate.stateflag, (ISO_DATA | ISO_POLYGONISE) ); /* initialize IsoExpand struct */ InitIsoExpand(); } else if ( strcmp(argv[2],"3D") == 0 ) { if ( obj > ISOOBJ_BASE ) { Tcl_SetResult(interp, "only BASE isoobjects can be of 3D type", TCL_STATIC); return TCL_ERROR; } isodata.dim[obj] = 3; if ( argc != 15 ) { Tcl_SetResult(interp, "invalid number of arguments in \"xc_isopoints 3D\" command", TCL_STATIC); return TCL_ERROR; } /* delete the following bit flags */ xcDeleteBitFlags( &isostate.stateflag, (ISO_DATA | ISO_COLORPLANE) ); /* initialize IsoExpand struct */ InitIsoExpand(); } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", must be one of 2D, 3D", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } for (i=0; i<=isodata.dim[obj]; i++) for (j=0; j<3; j++) { ij = 3 + i * 3 + j; if ( Tcl_GetDouble(interp, argv[ij], &value) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\" as %d-th argument while executing \"xc_isopoints\" command", argv[ij], ij); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } isodata.points[obj][i][j] = (float) value; if ( isodata.dim[obj] == 3 && obj == ISOOBJ_BASE ) { int ip; /* get also the points for PLANE1|2|3 PLANE1 == vec0 x vec1; -+ PLANE2 == vec2 x vec0; |-> origin is point0 PLANE3 == vec1 x vec2; -+ */ for(ip=ISOOBJ_PLANE1; ip<=ISOOBJ_PLANE3; ip++) { isodata.points[ip][i][j] = (float) value; isodata.dim[ip] = 2; } } } /* now made vectors; order of points submited is: * origin, Xpoint, Ypoint, Zpoint */ isodata.vec[obj][0].x = isodata.points[obj][1][0] - isodata.points[obj][0][0]; isodata.vec[obj][0].y = isodata.points[obj][1][1] - isodata.points[obj][0][1]; isodata.vec[obj][0].z = isodata.points[obj][1][2] - isodata.points[obj][0][2]; isodata.vec[obj][1].x = isodata.points[obj][2][0] - isodata.points[obj][0][0]; isodata.vec[obj][1].y = isodata.points[obj][2][1] - isodata.points[obj][0][1]; isodata.vec[obj][1].z = isodata.points[obj][2][2] - isodata.points[obj][0][2]; if ( isodata.dim[obj] == 3 ) { isodata.vec[obj][2].x = isodata.points[obj][3][0] - isodata.points[obj][0][0]; isodata.vec[obj][2].y = isodata.points[obj][3][1] - isodata.points[obj][0][1]; isodata.vec[obj][2].z = isodata.points[obj][3][2] - isodata.points[obj][0][2]; if ( obj == ISOOBJ_BASE ) { float det = XYZ_det3x3(isodata.vec[obj][0], isodata.vec[obj][1], isodata.vec[obj][2]); if (det > 0) { fprintf(stderr,"isosurface spanning vectors orientation is right\n"); isodata.cell_orientation = XC_RIGHT; } else { fprintf(stderr,"isosurface spanning vectors orientation is left\n"); isodata.cell_orientation = XC_LEFT; } } } else { isodata.vec[obj][2].x = 0.0; isodata.vec[obj][2].y = 0.0; isodata.vec[obj][2].z = 0.0; } nobj = obj; if ( isodata.dim[obj] == 3 && obj == ISOOBJ_BASE ) { /* get also the vectors for PLANE1|2|3 PLANE1 == vec0 x vec1; -+ PLANE2 == vec2 x vec0; |-> origin je point0 PLANE3 == vec1 x vec2; -+ */ isodata.vec[ISOOBJ_PLANE1][0] = isodata.vec[obj][0]; isodata.vec[ISOOBJ_PLANE1][1] = isodata.vec[obj][1]; isodata.vec[ISOOBJ_PLANE1][2] = isodata.vec[obj][2]; isodata.vec[ISOOBJ_PLANE2][0] = isodata.vec[obj][2]; isodata.vec[ISOOBJ_PLANE2][1] = isodata.vec[obj][0]; isodata.vec[ISOOBJ_PLANE2][2] = isodata.vec[obj][1]; isodata.vec[ISOOBJ_PLANE3][0] = isodata.vec[obj][1]; isodata.vec[ISOOBJ_PLANE3][1] = isodata.vec[obj][2]; isodata.vec[ISOOBJ_PLANE3][2] = isodata.vec[obj][0]; nobj = (ISOOBJ_PLANE3 > obj) ? ISOOBJ_PLANE3 : obj; } /* get the normals for isoplanes */ for (i = obj; i<= nobj; i++) { isodata.colnml[i] = VertexNormal(isodata.vec[i][0], isodata.vec[i][1]); /* normal must face toward positive Z; that means positive volume with * respect to (0,0,1), but take instead rather vector (1.0, 1.0, 10.0), to * be secure if z-comp of normal is zero */ /* scalar = Zvec[0] * isodata.colnml[i].x + \ Zvec[1] * isodata.colnml[i].y + Zvec[2] * isodata.colnml[i].z;*/ /* if ( !IsIsoPlane123( i ) ) { if ( (scalar < 0.0 && fabsf(scalar) > 1.e-6) || (isodata.colnml[i].z < 0.0 && fabsf(scalar) < 1.e-6) ) { isodata.colnml[i].x *= -1.0; isodata.colnml[i].y *= -1.0; isodata.colnml[i].z *= -1.0; } */ /* for PLANE123, it seems that i mixed up the vector products (instead on counterclockwise I made clockwise, so correct that */ /*if ( (scalar > 0.0 && fabsf(scalar) > 1.e-6) || (isodata.colnml[i].z > 0.0 && fabsf(scalar) < 1.e-6) ) { isodata.colnml[i].x *= -1.0; isodata.colnml[i].y *= -1.0; isodata.colnml[i].z *= -1.0; } */ normalizepvf( &(isodata.colnml[i].x), &(isodata.colnml[i].y), &(isodata.colnml[i].z) ); } /* everything is OK */ if ( !(isostate.stateflag & ISO_POINTS) ) isostate.stateflag |= ISO_POINTS; return TCL_OK; } /****************************************************************************** * XC_IsodataCmd --> implementation of 'xc_isodata' custom Tcl command * ----------------------- * Usage: xc_isodata (,i=ISODATA_MAXSTACK,0,-1) * ^^^^^^^^^^^^^^^^^^^^^^^ * or * * xc_isodata make * ------------------------------------------------------------ * * syntax of frame[i]_range --> x .... x-th frame * x-y .... from x-th to y-th frames * * -------------------------------------------------------------------------- * xc_isofiles require: * pre-calling of: xc_isostack * xc_isosign * xc_isofiles * * To specify all iso-data, somethimes it's required to call xc_isodata * several times, thatwhy it is needed to know when we are done by * xc_isodata. "xc_isodata make" command is implemented for specifying * the end of xc_isodata. * When we call xc_isodata the first time initializations is performed before * before anything happen. By specifying "xc_isodata make" we also set * initialization flag to "uninitialized", so next call of xc_isodata will * perform initialization at a first place. */ int XC_IsodataCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int i, j, k, first; static int which_time = 0; static int framenum[2 * ISODATA_MAXFRAME][ISODATA_MAXSTACK][2]; char fint[3], sint[3]; /* initialization for framenum[][]; just when we enter the first time */ if (which_time == 0) { if ( !(isostate.stateflag & (ISO_STACK | ISO_SIGN | ISO_FILES| ISO_POINTS)) ) { Tcl_SetResult(interp, "\"xc_isostack\", \"xc_isosign\", \"xc_isofiles\" and \"xc_isopoints\" should be called before \"xc_isodata\" command", TCL_STATIC); xcIsoError(); return TCL_ERROR; } /* * malloc gridvertex or plvertex[ISOOBJ_BASE] !!! */ if ( isodata.dim[ISOOBJ_BASE] == 3 && isostate.gridvertex_malloc == 0 ) { gridvertex = xcMallocGRIDVERTEX( grd.nx, grd.ny, grd.nz ); isostate.gridvertex_malloc = 1; } else if ( isodata.dim[ISOOBJ_BASE] == 2 && isostate.plvertex_malloc[ISOOBJ_BASE] == 0 ) { plvertex[ISOOBJ_BASE] = xcMallocPLANEVERTEX( grd.nx, grd.ny ); isostate.plvertex_malloc[ISOOBJ_BASE] = 1; for (i=0; i,i=%d,0,-1)\" was not used properly, because stack-0 frames must be entered in sorted fashion",ISODATA_MAXSTACK); Tcl_SetResult(interp, rss, TCL_VOLATILE); xcIsoError(); return TCL_ERROR; } /* fwrite origin & vectors to "bin_vertex_fp" */ /* fwrite(isodata.points[ISOOBJ_BASE][0], sizeof(double), 3, isodata.bin_vertex_fp); fwrite(isodata.vec[ISOOBJ_BASE][0], sizeof(XYZ), 3, isodata.bin_vertex_fp); */ if ( !ReadIsoData(framenum, which_time) ) { char rss[1024]; snprintf(rss, sizeof(rss),"%s", isodata.error); Tcl_SetResult(interp, rss, TCL_VOLATILE); xcIsoError(); return TCL_ERROR; } /* now assign the isodata.min */ isodata.mintol = fabs(isodata.max * 1.0e-6); if ( fabs(isodata.min) > fabs(isodata.max) ) isodata.mintol = fabs(isodata.min * 1.0e-6); for (k=0; k < ISODATA_MAXFILES; k++) for (i=0; i < ISODATA_MAXSTACK; i++) for (j=0; j < 2; j++) framenum[k][i][j] = -1; which_time = 0; /* reset the which_time, because, next time we enter * in this routine, we will start from begining */ return TCL_OK; } else if ( argc == 2 && strcmp(argv[1],"make") != 0 ) { /* wrong usage of xc_isodata command */ char rss[1024]; snprintf(rss, sizeof(rss),"wrong usage of \"xc_isodata\" command, should be: \nxc_isodata (,i=%d,0,-1)\n or\nxc_isodata make",ISODATA_MAXSTACK); Tcl_SetResult(interp, rss, TCL_VOLATILE); xcIsoError(); return TCL_ERROR; } else if ( argc != ISODATA_MAXSTACK + 1 ) { char rss[1024]; snprintf(rss, sizeof(rss),"wrong # of arguments, while executing \"xc_isodata\" command, should be \"xc_isodata (,i=%d,0,-1)\"",ISODATA_MAXSTACK); Tcl_SetResult(interp, rss, TCL_VOLATILE); xcIsoError(); return TCL_ERROR; } /* we come here only if NOT "xc_isodata make" */ for (i=1; i < argc; i++) { int f3, f31; if ( strstr(argv[i],"-") == NULL ) { /* number, not range, was specified */ if ( Tcl_GetInt(interp, argv[i], &(framenum[which_time][i-1][0])) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing \"xc_isodata (,i=%d,0,-1)\" command", argv[i], ISODATA_MAXSTACK); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* maybe number is not in range, check that */ if ( i == 1 ) { f3 = framenum[which_time][0][0]; f31 = f3; } for (j=f3; j<=f31; j++) if ( framenum[which_time][i-1][0] > isodata.nframe[j][ISODATA_MAXSTACK - i] ) { char rss[1024]; snprintf(rss, sizeof(rss),"specified frame - %d of stack %d is out of range, frame should be lower than %d", framenum[which_time][i-1][0], i-1, isodata.nframe[j][ISODATA_MAXSTACK - i] + 1); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } framenum[which_time][i-1][1] = -1; } else { /* range was specified */ first = strcspn(argv[i],"-"); strncpy(fint,argv[i],first); /*fint[first] = (char) NULL;*/ fint[first] = ' '; strcpy(sint,&argv[i][first+1]); if ( Tcl_GetInt(interp, fint, &(framenum[which_time][i-1][0])) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing \"xc_isodata (,i=%d,0,-1)\" command", argv[i], ISODATA_MAXSTACK); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, sint, &(framenum[which_time][i-1][1])) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing \"xc_isodata (,i=%d,0,-1)\" command", argv[i], ISODATA_MAXSTACK); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* framenum[][][1] must be > framenum[][][0]; check that */ if ( framenum[which_time][i-1][0] >= framenum[which_time][i-1][1] ) { char rss[1024]; snprintf(rss, sizeof(rss),"range in \"xc_isodata\" command not specified properly, should be a-b, but got %s",argv[i]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* maybe frames specified are out of range, check that */ if ( i == 1 ) { f3 = framenum[which_time][0][0]; f31 = framenum[which_time][0][1]; } for (j=f3; j<=f31; j++) if ( framenum[which_time][i-1][1] > isodata.nframe[j][ISODATA_MAXSTACK - i] ) { char rss[1024]; snprintf(rss, sizeof(rss),"specified range of frames - [%d-%d] of stack %d is out of range, frame should be lower than %d", framenum[which_time][i-1][0], framenum[which_time][i-1][1], i-1, isodata.nframe[j][ISODATA_MAXSTACK - i]+1); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } } which_time++; /* which time trace the number of times we get in this func */ if ( !(isostate.stateflag & ISO_DATA) ) isostate.stateflag |= ISO_DATA; return TCL_OK; } /****************************************************************************** * XC_IsosurfCmd --> implementation of 'xc_isosurf' custom Tcl command * ----------------------- * Usage: xc_isosurf \ * -drawstyle wire|solid \ * -shademodel smooth|flat \ * -transparency on|off \ * -render now|after \ * -isosurf none| xxx * * * Note: default flag for options: * -drawstyle = "wire" * -shademodel = "smooth" * -trensparency = "off" * -render = after * -isosurf = xxx * * if -isosurf == none; then VPf.isosurf is set to GL_FALSE && the isosurface * is not rendered */ int XC_IsosurfCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; int i; int render_isosurf = 1; logical render = 0; if ( (argc % 2) != 0 ) { Tcl_SetResult(interp, "Usage: xc_isosurf -drawstyle wire|solid -shademodel smooth|flat -transparency on|off -render now|after -isosurf none|xxx", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* it is not allowed to be in XC_2D mode when rendering isosurface; if in XC_2D mode return silently */ if (dimType == XC_2D) return TCL_OK; /* isodata.dim must be 3; if not -> ERROR */ if ( isodata.dim[ISOOBJ_BASE] != 3 ) { Tcl_SetResult(interp, "\"xc_isopoints 3D ...\" command must be used before evoking \"xc_isoplane\" command", TCL_STATIC); return TCL_ERROR; } if ( !(isostate.stateflag & (ISO_STACK | ISO_SIGN | ISO_FILES | ISO_POINTS | ISO_DATA | ISO_POLYGONISE)) ) { Tcl_SetResult(interp, "\"xc_isostack\", \"xc_isosign\", \"xc_isofiles\", \"xc_isopoints\", \"xc_isodata\" and \"xc_iso poligonise\" should be called before \"xc_isosurf\" command", TCL_STATIC); return TCL_ERROR; } /****************/ /* read options */ for (i=2; i implementation of 'xc_isoplane' custom Tcl command * ----------------------- * Usage: xc_isoplane \ * -planetype colorplane|isoline|both \ * -transparency on|off * -render now|after * * Note: default flag for options: * -planetype = "colorplane" * -transparency = "off" * -render = "after" * Note #2: isoline is not implemented yet */ int XC_IsoplaneCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; int i, obj, planeflag, lineflag; logical render = 0; if ( (argc % 2) != 1 ) { Tcl_SetResult(interp, "Usage: xc_isoplane -planetype colorplane|isoline -transparency on|off -render now|after", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* it is not allowed to be in XC_2D mode when rendering isoplane; if in XC_2D mode return silently */ if (dimType == XC_2D) return TCL_OK; /* * get object type */ if ( Tcl_GetInt(interp, argv[2], &obj ) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" while executing %s %s %s ...", argv[2], argv[0], argv[1], argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( obj < 0 || obj >= MAX_ISOOBJECTS ) { char rss[1024]; snprintf(rss, sizeof(rss),"object type \"%d\" is out of range", obj); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* isodata.dim[ISOOBJ_BASE] must be 2; if not -> ERROR */ if ( obj == ISOOBJ_BASE && isodata.dim[ISOOBJ_BASE] != 2 ) { Tcl_SetResult(interp, "\"xc_isopoints 0 2D ...\" command must be used before evoking \"xc_isoplane\" command", TCL_STATIC); return TCL_ERROR; } if ( !(isostate.stateflag & (ISO_STACK | ISO_SIGN | ISO_FILES | ISO_POINTS | ISO_DATA)) ) { Tcl_SetResult(interp, "\"xc_isostack\", \"xc_isosign\", \"xc_isofiles\", \"xc_isopoints\", and \"xc_isodata\" should be called before \"xc_isosurf\" command", TCL_STATIC); return TCL_ERROR; } /* * set default options */ isoplaneDisp[obj].transparent = ISOSURF_TRANSP_OFF; VPf.colorplane[obj] = GL_TRUE; VPf.isoline[obj] = GL_FALSE; planeflag = ISO_COLORPLANE; lineflag = ISO_ISOLINE; if ( obj == ISOOBJ_PLANE1 ) { planeflag = ISO_COLORPLANE1; lineflag = ISO_ISOLINE1; } else if ( obj == ISOOBJ_PLANE2 ) { planeflag = ISO_COLORPLANE2; lineflag = ISO_ISOLINE2; } else if ( obj == ISOOBJ_PLANE3 ) { planeflag = ISO_COLORPLANE3; lineflag = ISO_ISOLINE3; } /****************/ /* read options */ for (i=3; i implementation of 'xc_isoexpand' custom Tcl command * ----------------------- * Usage: * xc_isoexpand \ * -repeattype default|convcell|primcell \ * -shape default|parapipedal|hexagonal \ * -expand whole|{nx ny nz}|... * -render now|after * default option values: * -repeattype default * -shape default * -expand whole * -render after * XC_IsoexpandCmd first check if ISO_POLYGONISE or ISO_COLORPLANE or * ISO_ISOLINE is turned on. So there is no need in specifing this option * separatly. If someday it will be possible to render simultaneously then * this option will be needed. */ int XC_IsoexpandCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; int obj, colorflag, lineflag; int i, j; int render = 0; unsigned int flag = ISO_NULL, flag1 = ISO_NULL; int repeat = COM_ISOEXPAND_REPEAT_DEFAULT; GetComOption expand = { COM_ISOEXPAND_EXPAND_WHOLE }; if ( (argc % 2) != 1 ) { Tcl_SetResult(interp, "Usage: xc_isoexpand -repeattype default|convcell|primcell -shape default|parapipedal| hexagonal -expand whole|{nx ny nz}", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[2], &obj) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" while executing %s %s %s ...", argv[2], argv[0], argv[1], argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( obj < 0 || obj >= MAX_ISOOBJECTS ) { char rss[1024]; snprintf(rss, sizeof(rss),"object type \"%d\" is out of range", obj); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } colorflag = ISO_COLORPLANE; lineflag = ISO_ISOLINE; switch( obj ) { case ISOOBJ_PLANE1: colorflag = ISO_COLORPLANE1; lineflag = ISO_ISOLINE1; break; case ISOOBJ_PLANE2: colorflag = ISO_COLORPLANE2; lineflag = ISO_ISOLINE2; break; case ISOOBJ_PLANE3: colorflag = ISO_COLORPLANE3; lineflag = ISO_ISOLINE3; break; } /* maybe xc_isoexpand was called two early */ if ( isodata.dim[obj] == 2 ) { flag = ISO_STACK | ISO_SIGN | ISO_FILES | ISO_POINTS | ISO_DATA | colorflag; flag1 = ISO_STACK | ISO_SIGN | ISO_FILES | ISO_POINTS | ISO_DATA | lineflag; } if ( isodata.dim[obj] == 3 ) flag = ISO_STACK | ISO_SIGN | ISO_FILES | ISO_POINTS | ISO_DATA | ISO_POLYGONISE; if ( !(isostate.stateflag & flag) && !(isostate.stateflag & flag1) ) { Tcl_SetResult(interp, "\"xc_isostack\", \"xc_isosign\", \"xc_isofiles\", \"xc_isopoints\", \"xc_isodata\" and \"xc_iso colorplane\" or \"xc_iso polygonise\" should be called before \"xc_isoexpand\" command", TCL_STATIC); return TCL_ERROR; } /* if we are in XC_2D mode return silently */ if ( dimType == XC_2D ) return TCL_OK; /* load default value for shape */ isoexpand[obj].shape = COM_ISOEXPAND_SHAPE_DEFAULT; for (j=0; j<3; j++) isoexpand[obj].irepvec[j] = xcr.nunit[j]; /****************/ /* read options */ for (i=3; i {nx1, ny1, nz1, nx2, ny2, nz2, nx3, ny3, nz3, na, nb, nc} * if isodata.dim[obj] == 3 --> {nx, ny, nz} */ if ( isodata.dim[obj] == 2 ) type = XC_GET_INT12; if ( isodata.dim[obj] == 3 ) type = XC_GET_INT3; if ( !xcSplitList( type, interp, argv + i + 1, &expand) ) return TCL_ERROR; if ( isodata.dim[obj] == 2 ) { /* usage: -expand { n1 n2 n3} == (nx, ny, nz) */ for (j=0; j<3; j++) { isoexpand[obj].transl[0][j] = iroundf(expand.vec[j]); isoexpand[obj].transl[1][j] = iroundf(expand.vec[j+3]); isoexpand[obj].transl[2][j] = iroundf(expand.vec[j+6]); } isoexpand[obj].irepvec[0] = iroundf(expand.vec[9]); isoexpand[obj].irepvec[1] = iroundf(expand.vec[10]); isoexpand[obj].irepvec[2] = iroundf(expand.vec[11]); } else if ( isodata.dim[obj] == 3 ) { for (j=0; j<3; j++) isoexpand[obj].irepvec[j] = iroundf(expand.vec[j]); } isoexpand[obj].expand = COM_ISOEXPAND_EXPAND_LIST; } } else if ( strcmp(argv[i], "-render") == 0 ) { if ( strcmp(argv[i+1], "now") == 0 ) { render = 1; } else if ( strcmp(argv[i+1], "after") == 0 ) { render = 0; } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown -render value \"%s\", should be now or after", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", must be one of \"-repeat\",\"-shape\", \"-expand\", \"-render\", while executing %s %s ...", argv[i], argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } if ( (repeat == COM_ISOEXPAND_REPEAT_DEFAULT && xcr.celltype == XCR_PRIMCELL) || repeat == COM_ISOEXPAND_REPEAT_PRIMCELL ) { if ( isodata.dim[obj] == 3 ) xcMat44Copyd( isoexpand[obj].rep_vec, vec.prim, 3, 3 ); else if ( isodata.dim[obj] == 2 ) { if ( isoexpand[obj].expand == COM_ISOEXPAND_EXPAND_LIST ) for (i=0; i<3; i++) { isoexpand[obj].rep_vec[0][i] = vec.prim[0][i] * (double) isoexpand[obj].transl[0][0] + vec.prim[1][i] * (double) isoexpand[obj].transl[0][1] + vec.prim[2][i] * (double) isoexpand[obj].transl[0][2]; isoexpand[obj].rep_vec[1][i] = vec.prim[0][i] * (double) isoexpand[obj].transl[1][0] + vec.prim[1][i] * (double) isoexpand[obj].transl[1][1] + vec.prim[2][i] * (double) isoexpand[obj].transl[1][2]; isoexpand[obj].rep_vec[2][i] = 0.0; } else { for (i=0; i<3; i++) for (j=0; j<3; j++) isoexpand[obj].rep_vec[i][j] = vec.prim[i][j]; } } } if ( (repeat == COM_ISOEXPAND_REPEAT_DEFAULT && xcr.celltype == XCR_CONVCELL ) || repeat == COM_ISOEXPAND_REPEAT_CONVCELL ) { if ( isodata.dim[obj] == 3 ) xcMat44Copyd( isoexpand[obj].rep_vec, vec.conv, 3, 3 ); else if ( isodata.dim[obj] == 2 ) { if ( isoexpand[obj].expand == COM_ISOEXPAND_EXPAND_LIST ) for(i=0; i<3; i++) { isoexpand[obj].rep_vec[0][i] = vec.conv[0][i] * (double) isoexpand[obj].transl[0][0] + vec.conv[1][i] * (double) isoexpand[obj].transl[0][1] + vec.conv[2][i] * (double) isoexpand[obj].transl[0][2]; isoexpand[obj].rep_vec[1][i] = vec.conv[0][i] * (double) isoexpand[obj].transl[1][0] + vec.conv[1][i] * (double) isoexpand[obj].transl[1][1] + vec.conv[2][i] * (double) isoexpand[obj].transl[1][2]; isoexpand[obj].rep_vec[2][i] = vec.conv[0][i] * (double) isoexpand[obj].transl[2][0] + vec.conv[1][i] * (double) isoexpand[obj].transl[2][1] + vec.conv[2][i] * (double) isoexpand[obj].transl[2][2]; } else { for (i=0; i<3; i++) for (j=0; j<3; j++) isoexpand[obj].rep_vec[i][j] = vec.conv[i][j]; } } } /* now according to GENGEOM for slabs, polymer & molecule I get * (nx,ny,0), (nx,0,0) & (0,0,0) respectively, but the lowest * possible vector here is (1,1,1) -> correct that */ for (j=0; j<3; j++) if ( isoexpand[obj].irepvec[j] == 0 ) isoexpand[obj].irepvec[j] = 1; /* isosurface's space can be greater that structure's space, so we must * update MVf.structsize to allow all isosurface to be rendered */ MVf.isosize = SetIsosurf_VPf(); if (is.stickmode && !is.ballmode) xcMakeProjection3D("sticks"); if (is.ballmode) xcMakeProjection3D("balls"); if (is.spacefillmode) xcMakeProjection3D("space"); if ( !(isostate.stateflag & ISO_EXPAND) ) isostate.stateflag |= ISO_EXPAND; if (render) Togl_PostRedisplay(togl); return TCL_OK; } static float SetIsosurf_VPf(void) { register int i; float isosize, max_isosize = 0.0; float orig[3], vec0[3], vec1[3], vec2[3]; for (i=ISOOBJ_BASE; i max_isosize ) max_isosize = isosize; } return max_isosize; } xcrysden-1.6.2/C/mxmymz.c0000644000175000017500000000770711712736221013757 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/mxmymz.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include "struct.h" #include "xcfunc.h" void Set_mx_my_mz(double sumx, double sumy, double sumz); void Set_mx_my_mz(double sumx, double sumy, double sumz) { int i, j; double _vec[3][3]; /* ------------------------------------------------------------------------ if we have a molecule -- the center is the mass center if we have a crystal -- the center is the cell center ------------------------------------------------------------------------ */ for (i=0; i<3; i++) { for (j=0; j<3; j++) { _vec[i][j] = 0.0; if ( xcr.celltype == XCR_CONVCELL ) { _vec[i][j] = vec.conv[i][j]; } else { _vec[i][j] = vec.prim[i][j]; } } } if (xcr.dim == 0) { mx_my_mz.mx = sumx / ((double) natoms); mx_my_mz.my = sumy / ((double) natoms); mx_my_mz.mz = sumz / ((double) natoms); } else if (xcr.dim == 1) { mx_my_mz.mx = 0.5 * (double)xcr.nunit[0] * _vec[0][0]; mx_my_mz.my = sumy / ((double) natoms); mx_my_mz.mz = sumz / ((double) natoms); } else if (xcr.dim == 2) { /* here we suppose that non-periodic dimension goes along Z axis !!! (if this is not fulfilled we are in trouble !!!) */ /* fprintf(stderr,"---------------:\n"); fprintf(stderr,"Lattice vectors:\n"); fprintf(stderr,"---------------:\n"); fprintf(stderr," %12.8f %12.8f %12.8f\n", _vec[0][0], _vec[0][1], _vec[0][2]); fprintf(stderr," %12.8f %12.8f %12.8f\n", _vec[1][0], _vec[1][1], _vec[1][2]); fprintf(stderr," %12.8f %12.8f %12.8f\n", _vec[2][0], _vec[2][1], _vec[2][1]); fprintf(stderr," %3d %3d %3d\n", xcr.nunit[0], xcr.nunit[1], xcr.nunit[2]); */ mx_my_mz.mx = 0.5 * ( ((double) xcr.nunit[0]) * _vec[0][0] + ((double) xcr.nunit[1]) * _vec[1][0] ); mx_my_mz.my = 0.5 * ( ((double) xcr.nunit[0]) * _vec[0][1] + ((double) xcr.nunit[1]) * _vec[1][1] ); mx_my_mz.mz = sumz / ((double) natoms); /* fprintf(stderr,"(++,my,mz) = (%f,%f,%f)\n", mx_my_mz.mx, mx_my_mz.my, mx_my_mz.mz); */ } else { mx_my_mz.mx = 0.5 * ((double)xcr.nunit[0] * _vec[0][0] + (double)xcr.nunit[1] * _vec[1][0] + (double)xcr.nunit[2] * _vec[2][0]); mx_my_mz.my = 0.5 * ((double)xcr.nunit[0] * _vec[0][1] + (double)xcr.nunit[1] * _vec[1][1] + (double)xcr.nunit[2] * _vec[2][1]); mx_my_mz.mz = 0.5 * ((double)xcr.nunit[0] * _vec[0][2] + (double)xcr.nunit[1] * _vec[1][2] + (double)xcr.nunit[2] * _vec[2][2]); } /* fprintf(stderr,"(mx,my,mz) = (%f,%f,%f)\n", mx_my_mz.mx, mx_my_mz.my, mx_my_mz.mz); fprintf(stderr,"NUNITs = (%d,%d,%d)\n", xcr.nunit[0], xcr.nunit[1], xcr.nunit[2]); */ /* work-around for BUG connected with gcc -O3 compilation */ if ( isnan(mx_my_mz.mx) ) mx_my_mz.mx = sumx / ((double) natoms); if ( isnan(mx_my_mz.my) ) mx_my_mz.my = sumy / ((double) natoms); if ( isnan(mx_my_mz.mz) ) mx_my_mz.mz = sumz / ((double) natoms); } xcrysden-1.6.2/C/cryDispFuncMultiFS.c0000644000175000017500000001743613525506046016117 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/cryDispFuncMultiFS.c * ------ * * Copyright (c) 1996-2004 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include "xcGLparam.h" #include "struct.h" #include "isosurf.h" #include "memory.h" #include "molsurf.h" #include "vector.h" #include "bz.h" #include "wigner.h" #include "lighting.h" #include "xcfunc.h" extern XCantialias antialias; extern NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl); extern void cryRenderSurface( NEW_WIN_CONTEXT *wc , int fs_mode); extern void cryRenderRecCell( NEW_WIN_CONTEXT *wc , int fs_mode); void cryDisplayMultiFS(struct Togl *togl); static GLfloat _getSize (NEW_WIN_CONTEXT *wc); static void _cryDisplayMultiFS(struct Togl *togl, NEW_WIN_CONTEXT *wc); /* assign cry_dispfuncmultiFS ... */ int CRY_DispFuncMultiFSCmd(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[]) { Togl *togl; NEW_WIN_CONTEXT *wc; if ( argc < 2 || argc%2 ) { Tcl_SetResult(interp, "Usage: cry_dispfuncmultiFS ?-togllist? ?-antialias 0|1?", TCL_STATIC); return TCL_ERROR; } if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } wc = FindWinContextByTogl( togl ); LoadIdentity( wc->vec.crdmajor ); vecMatToVec( wc->vec.crdmajor, wc->vec.crdvec ); wc->xcDisplay = cryDisplayMultiFS; wc->ss.minX = 0.0; wc->ss.maxX = 0.0; wc->ss.minY = 0.0; wc->ss.maxY = 0.0; wc->ss.minZ = 0.0; wc->ss.maxZ = 0.0; /* next lines are just for now */ glEnable( GL_DITHER ); glEnable( GL_DEPTH_TEST ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); glDepthFunc(GL_LEQUAL); /*glClearDepth( 1.0 );*/ glClearColor( wc->bg[0], wc->bg[1], wc->bg[2], wc->bg[3] ); /* T.K. */ LoadBlendfunc_And_Frontface(); LoadIsoMaterial( MAT_ONELEVEL | MAT_ISOSURF ); /*LoadLights();*/ if (wc->fermiContext.toglVector) { free(wc->fermiContext.toglVector); wc->fermiContext.toglVector = NULL; } if (argc > 2) { int i, it, anti_alias; for (i=2; iVPf.stropened) { wc->VPf.stropened = 1; wc->ss.minX = MIN(wc->ss.minX, ith_wc->ss.minX); wc->ss.maxX = MAX(wc->ss.maxX, ith_wc->ss.maxX); wc->ss.minY = MIN(wc->ss.minY, ith_wc->ss.minY); wc->ss.maxY = MAX(wc->ss.maxY, ith_wc->ss.maxY); wc->ss.minZ = MIN(wc->ss.minZ, ith_wc->ss.minZ); wc->ss.maxZ = MAX(wc->ss.maxZ, ith_wc->ss.maxZ); } } wc->fermiContext.ntogl = argcList; wc->fermiContext.toglVector = toglVector; } /* -ANTIALIAS */ else if ( strncmp(argv[i], "-antialias", 6) == 0 ) { if ( Tcl_GetInt(interp, argv[i+1], &anti_alias) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\"", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } wc->VPf.antialias = anti_alias; } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown option %s, must be -antialias or -togllist", argv[i]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } } return TCL_OK; } static GLfloat _getSize (NEW_WIN_CONTEXT *wc) { wc->MVf.structsize = sqrt( wc->ss.maxX*wc->ss.maxX + wc->ss.maxY*wc->ss.maxY + wc->ss.maxZ*wc->ss.maxZ ); return wc->MVf.structsize / wc->tr.zoom; } /* * when we enter this procedure we just Made a Display, that means that * everything must be made before that */ void cryDisplayMultiFS(struct Togl *togl) { NEW_WIN_CONTEXT *wc; wc = FindWinContextByTogl( togl ); if (!wc->fermiContext.toglVector) return; /* no togls associated with this wc */ /* debugging */ if (wc == (NEW_WIN_CONTEXT *)NULL) return; /* line_color[0] = 1.0 - wc->bg[0]; line_color[1] = 1.0 - wc->bg[1]; line_color[2] = 1.0 - wc->bg[2]; */ if ( ! wc->VPf.antialias ) { /* NO ANTIALIASING */ _cryDisplayMultiFS (togl, wc); } else { /* ANTIALIASING */ GLint viewport[4]; GLfloat sx, sy, size, sizeX, sizeY, aspect; GLfloat scale, dx, dy; int min, max, count, i, j; int width = Togl_Width (togl); int height = Togl_Height(togl); enum { XORG, YORG, WID, HT }; size = _getSize (wc); aspect = (GLfloat) width / (GLfloat) height; if ( aspect>1 ) { sizeX = aspect * size; sizeY = size; } else { sizeX = size; sizeY = size / aspect; } glGetIntegerv(GL_VIEWPORT, viewport); sx = 2.0 * sizeX / viewport[WID]; sy = 2.0 * sizeX / viewport[WID]; min = -antialias.degree; max = -min + 1; count = -min + max; count *= count; /* uniform scaling, less than one pixel wide */ scale = -antialias.offset / min; glClear(GL_ACCUM_BUFFER_BIT); for (j = min; j < max; j++) { for (i = min; i < max; i++) { dx = sx * scale * i; dy = sy * scale * j; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-sizeX + dx, sizeX + dx, -sizeY + dy, sizeY + dy, -wc->MVf.structsize, 2*wc->MVf.structsize); /* see the crySetProj.c file !!! */ glMatrixMode(GL_MODELVIEW); _cryDisplayMultiFS (togl, wc); glAccum(GL_ACCUM, 1.0 / (GLfloat)count); } } glAccum(GL_RETURN, 1.0); } Togl_SwapBuffers(togl); } static void _cryDisplayMultiFS(struct Togl *togl, NEW_WIN_CONTEXT *wc) { /*GLdouble size = (GLdouble) _getSize (wc);*/ int it; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* INSERT HERE ROTATION MATRIX */ glLoadIdentity(); glTranslated(0.0, 0.0, -0.5*wc->MVf.structsize); /* see crySetProj.c */ glMultMatrixd( wc->vec.crdvec ); /* fog */ xcFog (togl, wc->VPf.fog, GL_FALSE); glDisable(GL_BLEND); glDepthMask(GL_TRUE); for (it=0; itfermiContext.ntogl; it++) { NEW_WIN_CONTEXT *ith_wc = FindWinContextByTogl( wc->fermiContext.toglVector[it] ); if ( ith_wc->VPf.nsurface ) cryRenderSurface( ith_wc , FS_MULTI ); if ( ith_wc->VPf.dispLattice ) cryRenderRecCell( ith_wc , FS_MULTI ); } /*--------------------*/ glFlush(); } xcrysden-1.6.2/C/loadValues.c0000644000175000017500000007233113551370031014504 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/loadValues.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #include "atoms.h" #include "vector.h" #include "xcfunc.h" #include "memory.h" extern struct Togl *mesa_togl; extern Options3D is; extern OrthoProj ort; extern StructSize ss; extern ForceVector FV; extern RenderVectors *forceVectors; extern H_Bond hbonds; XYZ_Attrib xyz; GLfloat def_xyz_axis_color[4] = { 1, 1, 1, 1 }; GLfloat def_xyz_xyplane_color[4] = { 0, 0, 1, 1 }; GLfloat def_fog_colormode = XC_FOG_CUSTOMCOLOR; GLfloat def_fog_color[4] = {0.0, 0.0, 0.0, 1.0}; GLint def_fog_mode = XC_FOG_LINEAR; GLfloat def_fog_density = 0.1; GLfloat def_fog_ort_start_f = 0.8; GLfloat def_fog_ort_end_f = 1.8; GLfloat def_fog_persp_f1 = 0.9; GLfloat def_fog_persp_f2 = 1.0; XCfog fog; int def_antialias_degree = 1; float def_antialias_offset = 0.39; XCantialias antialias; extern GLfloat DefAtCol_Ambient_by_Diffuse; GLfloat AtCol_Ambient_by_Diffuse; /* FUNCTION PROTOTYPES */ void LoadDefaultValues(void); static void DefValues(void); void ResetVar(struct Togl *togl, int var); void ReloadVars(void); void LoadNewValue(struct Togl *togl, int var, double value1, double value2, double value3, double value4); double GetDefault(int var); double GetValue(int var); void LoadOldAtomicColors(void); /* --- xcDisplayFunc.c --- */ /* extern void (*xcDisplay)(void); */ void xcMakePointList(void); /* extern void xcMakeFrame3DLists(void); */ /* extern void xcMakeBallLabel3DList(void); */ /* extern void xcMakeSpaceLabel3DList(void); */ extern void xcTurnXYZOff(struct Togl *togl); extern void xcClearScreen(struct Togl *togl); extern void xcChangeBackground(struct Togl *togl, GLclampf bckg[4]); /* --- xcDisplayFunc2.c --- */ extern void xcTurnLabelsOn(void); extern void xcTurnFramesOn(void); extern void xcTurnFramesOff(void); /* --- remakestr.c --- */ extern void ReDisplay(struct Togl *togl, GLuint remake3D); /* --- xcColorScheme.c --- */ extern void LoadAtmCol(const int flag); /* --- cryWinContext.c --- */ extern NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl); extern float xcLinf(float value); void LoadDefaultValues(void) { ReloadVars(); DefValues(); } static void DefValues(void) { int i, j; /* this must be changed first */ for(i=1; i <= MAXNAT; i++) rcov[i] = DEF_RCOVF * rcovdef[i]; /* VPf.scrf = DEF_SCRF; */ VPf.ballf = DEF_BALLF; VPf.rodf = DEF_RODF; VPf.rcovf = DEF_RCOVF; VPf.WFlinewidth = DEF_LineWidthWF; VPf.WF3Dlinewidth = DEF_LineWidthWF3D; VPf.OUTlinewidth = DEF_LineWidthOUT; VPf.PLlinewidth = DEF_LineWidthPL; VPf.PLradius = DEF_RadiusPL; rrod = DEF_ATRADF * DEF_BALLF * DEF_RODF * rcovdef[1]; VPf.atradf = DEF_ATRADF; VPf.tessFactor = DEF_TESSELLATION; VPf.xyzOn = 0; VPf.labelsOn = 0; VPf.framesOn = 0; VPf.framewidth = DEF_FRAMEWIDTH; VPf.framef = DEF_FRAMERODF; VPf.selection = GL_FALSE; VPf.atomadd = GL_FALSE; VPf.projmade = GL_FALSE; VPf.wignerseitz = GL_FALSE; VPf.supercell = GL_FALSE; for(i=ISOOBJ_BASE; iVPf.fog = DEF_FOG; } break; case R_AMBIENT_BY_DIFFUSE: AtCol_Ambient_by_Diffuse = DefAtCol_Ambient_by_Diffuse; break; case R_ANTIALIAS: if ( togl == mesa_togl ) { VPf.antialias = DEF_ANTIALIAS; } else { NEW_WIN_CONTEXT *wc; wc = FindWinContextByTogl( togl ); wc->VPf.antialias = DEF_ANTIALIAS; } break; case R_RBALL: for(i=0; i <= MAXNAT; i++) rball[i] = DEF_BALLF * DEF_ATRADF * rcovdef[i]; VPf.ballf = DEF_BALLF; rrod = VPf.ballf * VPf.rodf * DEF_ATRADF * rcovdef[1]; remake3D = REMAKE3D_BALL | REMAKE3D_BOND | REMAKE3D_BALL_LABEL; break; case R_RROD: rrod = DEF_BALLF * DEF_ATRADF * DEF_RODF * rcovdef[1]; VPf.rodf = DEF_RODF; remake3D = REMAKE3D_BOND; break; case R_ATCOL: for(i = 0; i <= MAXNAT; i++) for(j = 0; j < 3; j++) atcol[i][j] = DefAtCol[i][j]; LoadAtmCol(0); remake3D = REMAKE3D_BALL | REMAKE3D_SPACE | REMAKE3D_BOND; break; case R_WFLINEWIDTH: VPf.WFlinewidth = DEF_LineWidthWF; break; case R_WF3DLINEWIDTH: VPf.WF3Dlinewidth = DEF_LineWidthWF3D; break; case R_OUTLINEWIDTH: VPf.OUTlinewidth = DEF_LineWidthOUT; break; case R_PLLINEWIDTH: VPf.PLlinewidth = DEF_LineWidthPL; break; case R_PLRADIUS: VPf.PLradius = DEF_RadiusPL; break; case R_SCRF: /* this is no more used */ /* VPf.scrf = DEF_SCRF; if (VPf.stropened) { xcViewPort(); Togl_PostRedisplay(togl); } */ return; case R_ALL: DefValues(); remake3D = REMAKE3D_ALL; break; case R_FRAMECOL: for(j = 0; j < 3; j++) framecol[j] = DefFrameCol[j]; break; case R_UNIBONDCOLOR: for(j = 0; j < 3; j++) unibondCol[j] = DefUnibondCol[j]; remake3D = REMAKE3D_BOND; break; case R_FRAMELINEWIDTH: VPf.framewidth = DEF_FRAMEWIDTH; break; case R_FRAMERODF: rframe = DEF_FRAMERODF * rcovdef[1]; remake3D = REMAKE3D_FRAME; break; case R_CURRENTFILEFORMAT: current_file_format = FORMAT_NONE; break; case R_FORCE_RODTHICKF: FV.rod_thickf = VECTOR_THICKF; BuildForceVectors(&FV); UpdateProjection(); break; case R_FORCE_ARRTHICKF: FV.arr_thickf = VECTOR_ARRTHICKF; BuildForceVectors(&FV); UpdateProjection(); break; case R_FORCE_ARRLENF: FV.arr_lenf = VECTOR_ARROWSIZE; BuildForceVectors(&FV); UpdateProjection(); break; case R_FORCE_COLOR: COPY_V(3, FV.color, DefAtCol[0]); FV.color[3] = 1.0; break; case R_XYZ_AXIS_COLOR: COPY_V(4, xyz.axis_color, def_xyz_axis_color); break; case R_XYZ_XYPLANE_COLOR: COPY_V(4, xyz.xyplane_color, def_xyz_xyplane_color); break; } if (VPf.stropened) { /* I must update a Display */ ReDisplay(togl, remake3D); } } void ReloadVars(void) { /* T.K */ VPf.xyzOn = 0; VPf.labelsOn = 0; VPf.framesOn = 0; VPf.selection = 0; natoms = 0; nbonds = 0; nframes = 0; nobjects = 0; tmp_nobjects = 0; tr.xtransl = 0.0; tr.ytransl = 0.0; tr.zoom = DEF_ZOOM; tr.b1motion = 0; tr.b2motion = 0; tr.shiftB1motion = 0; } /***************************************************************************** * this is defined in "struct.h" * ---------------------------- * define L_SPACE_COV 0 atrad = rcov (effect to all elements - SPACEFILL) * define L_SPACE_VDW 1 atrad = rvdw (effect to all elements - SPACEFILL) * define L_BALL_COV 2 atrad = rcov (effect to all elements - BALLS) * define L_BALL_VDW 3 atrad = rvdw (effect to all elements - BALLS) * define L_ATRAD_ONE 4 change just one atmoic radius * define L_ATRAD_SCALE 5 change all atomic radius for some scale factor * define L_BALLF 6 change ball factor * define L_RODF 7 change rod factor * define L_ATCOL_ONE 8 change color of one atom * define L_WFLINEWIDTH 9 * define L_PLLINEWIDTH 10 * define L_PLRADIUS 11 * define L_SCRF 12 * define L_COV_SCALE 13 * define L_XYZ_ON 14 for coordinate sistem * define L_LABELS_ON 15 for atomic labels * define L_FRAME_ON 16 * define L_FRAMECOL 17 width of line-frame * define L_FRAMELINEWIDTH 18 * define L_FRAMERODF 19 width of rod-frame * define L_LINEFRAME 20 display frames as rods or as lines when in 3D * mode * define L_TR_XTRANSL 21 * define L_TR_YTRANSL 22 * define L_BACKGROUND 23 *------------------------------ */ void LoadNewValue(struct Togl *togl, int var, double value1, double value2, double value3, double value4) { int i; GLuint remake3D = REMAKE3D_NONE; switch(var) { case L_SPACE_COV: for(i=1; i <= MAXNAT; i++) atrad[i] = VPf.atradf * rcovdef[i]; FindMaxRad(); remake3D = REMAKE3D_SPACE | REMAKE3D_SPACE_LABEL; break; case L_BALL_COV: printf("L_BALL_COV\n"); fflush(stdout); for(i=0; i <= MAXNAT; i++) rball[i] = VPf.ballf * VPf.atradf * rcovdef[i]; rrod = VPf.rodf * rball[1]; remake3D = REMAKE3D_BALL | REMAKE3D_BOND | REMAKE3D_BALL_LABEL; break; case L_SPACE_VDW: printf("L_SPACE_VDW\n"); fflush(stdout); for(i=1; i <= MAXNAT; i++) atrad[i] = VPf.atradf * rvdw[i]; FindMaxRad(); remake3D = REMAKE3D_SPACE | REMAKE3D_SPACE_LABEL; break; case L_BALL_VDW: printf("L_BALL_VDW\n"); fflush(stdout); for(i=0; i <= MAXNAT; i++) rball[i] = VPf.ballf * VPf.atradf * rvdw[i]; rrod = VPf.rodf * rball[1]; remake3D = REMAKE3D_BALL | REMAKE3D_BOND | REMAKE3D_BALL_LABEL; break; /* t.k.; note: should make a rcov_custom variable ... */ case L_RCOV_ONE: rcov[(int) value1] = value2; remake3D = REMAKE3D_BOND; if (VPf.stropened) /* it's illegal to ReMakeStr if structure is not opened */ ReMakeStr(); break; /* /t.k. */ case L_ATRAD_ONE: atrad[(int) value1] = value2; FindMaxRad(); rball[(int) value1] = atrad[(int) value1] * VPf.ballf; remake3D = REMAKE3D_SPACE | REMAKE3D_BALL | REMAKE3D_BALL_LABEL | REMAKE3D_SPACE_LABEL; if (VPf.stropened) /* it's illegal to ReMakeStr if structure is not opened */ ReMakeStr(); break; case L_ATRAD_SCALE: printf("L_ATRAD_SCALE:: value1 = %f\n",value1); for(i=0; i <= MAXNAT; i++) { atrad[i] /= VPf.atradf; rball[i] /= VPf.atradf; atrad[i] *= value1; rball[i] *= value1; } FindMaxRad(); rrod /= VPf.atradf; rrod *= value1; VPf.atradf = value1; remake3D = REMAKE3D_SPACE | REMAKE3D_BALL | REMAKE3D_BOND | REMAKE3D_BALL_LABEL | REMAKE3D_SPACE_LABEL; break; case L_TESSELLATION: VPf.tessFactor = MAX( value1, 2.0 ); remake3D = REMAKE3D_SPACE | REMAKE3D_BALL | REMAKE3D_BOND; break; case L_UNIBOND: VPf.unibond = (GLboolean) value1; remake3D = REMAKE3D_BOND; break; case L_UNIBONDCOLOR: unibondCol[0] = value1; unibondCol[1] = value2; unibondCol[2] = value3; remake3D = REMAKE3D_BOND; break; case L_FOG: if ( togl == mesa_togl ) { VPf.fog = (GLboolean) value1; } else { NEW_WIN_CONTEXT *wc; wc = FindWinContextByTogl( togl ); wc->VPf.fog = (GLboolean) value1; } break; case L_AMBIENT_BY_DIFFUSE: AtCol_Ambient_by_Diffuse = (GLfloat) value1; break; case L_ANTIALIAS: if ( togl == mesa_togl ) { VPf.antialias = (GLboolean) value1; } else { NEW_WIN_CONTEXT *wc; wc = FindWinContextByTogl( togl ); wc->VPf.antialias = (GLboolean) value1; } break; case L_PERSPECTIVE: VPf.perspective = (GLboolean) value1; break; case L_PERSPECTIVEBACK: VPf.perspective_far = value1; break; case L_PERSPECTIVEFOVY: VPf.perspective_fovy = value1; break; case L_PERSPECTIVEFRONT: VPf.perspective_size = value1; break; case L_BALLF: VPf.ballf = value1; for(i=0; i <= MAXNAT; i++) rball[i] = VPf.ballf * atrad[i]; rrod = VPf.rodf * rball[1]; remake3D = REMAKE3D_BALL | REMAKE3D_BOND | REMAKE3D_BALL_LABEL; break; case L_RODF: VPf.rodf = value1; rrod = VPf.atradf * VPf.ballf * VPf.rodf * atrad[1]; remake3D = REMAKE3D_BOND; break; case L_ATCOL_ONE: atcol[(int) value1][0] = (float) value2; atcol[(int) value1][1] = (float) value3; atcol[(int) value1][2] = (float) value4; LoadAtmCol(0); remake3D = REMAKE3D_SPACE | REMAKE3D_BALL | REMAKE3D_BOND; printf("L_ATCOL_ONE\n"); printf("color = %f %f %f\n",atcol[(int) value1][0], atcol[(int) value1][1], atcol[(int) value1][2]); fflush(stdout); break; case L_WFLINEWIDTH: VPf.WFlinewidth = (int) value1; break; case L_WF3DLINEWIDTH: VPf.WF3Dlinewidth = (int) value1; break; case L_OUTLINEWIDTH: VPf.OUTlinewidth = (int) value1; break; case L_PLLINEWIDTH: VPf.PLlinewidth = (int) value1; break; case L_PLRADIUS: VPf.PLradius = (int) value1; xcMakePointList(); break; case L_SCRF: /* this is no more used */ /* VPf.scrf = value1; */ break; case L_COV_SCALE: VPf.rcovf = value1; printf("L_COV_SCALE:: VPf.rcovf = %f\n",VPf.rcovf); /* this one is complicated !!!! * if this is changed, than chemical connectivity criteria is changed * this means that we must reassing bonds; * * Side Effects: * ------------ * Bond criteria is changed -> that reflect in new connectivity, but * atrad, ballr, etc. are not changed; L_COV_SCALE is just "change * chemical connecivity criteia" !!!! */ for(i=1; i <= MAXNAT; i++) rcov[i] = VPf.rcovf * rcovdef[i]; remake3D = REMAKE3D_BOND; if (VPf.stropened) /* it's illegal to ReMakeStr if structure is not opened */ ReMakeStr(); break; case L_XYZ_ON: printf("L_XYZ_ON> value1=%f\n",value1); fflush(stdout); if ( value1 > 0.0 ) { VPf.xyzOn = 1; if ( VPf.stropened ) Togl_PostRedisplay(togl); } else xcTurnXYZOff(togl); return; case L_LABELS_ON: if ( value1 > 0.0 ) { VPf.labelsOn = 1; if ( VPf.stropened ) { /* maybe LabelList is not yet made */ /* xcMakeBallLabel3DList(); if LabelList is not yet made, than this * fn. will make it, else will do nothing */ /* xcMakeSpaceLabel3DList(); */ xcTurnLabelsOn(); } } else xcTurnLabelsOff(); break; case L_FRAME_ON: if ( value1 > 0.0 ) { VPf.framesOn = 1; if ( VPf.stropened ) { /* maybe FrameList is not yet made */ /* xcMakeFrame3DLists(); if FrameList is not made yet, than this fn. will make it, else will do nothing */ xcTurnFramesOn(); } } else xcTurnFramesOff(); break; case L_FRAMECOL: framecol[0] = value1; framecol[1] = value2; framecol[2] = value3; break; case L_FRAMELINEWIDTH: VPf.framewidth = (int) value1; break; case L_FRAMERODF: VPf.framef = value1; rframe = VPf.framef * rcovdef[1]; remake3D = REMAKE3D_FRAME; break; case L_LINEFRAME: /* if value1 is 1 than is.lineframe is set to 1 */ if (value1 > 0.0 ) is.lineframe = 1; else is.lineframe = 0; /* now create xcMakeFrame3DLists, if it's not created yet */ /*xcMakeFrame3DLists();*/ /* this is also done in L_FRAMEON !!! * Here is just in case */ break; case L_TR_XTRANSL: tr.xtransl = value1; xcViewPort(); Togl_PostRedisplay(togl); return; case L_TR_YTRANSL: tr.ytransl = value1; xcViewPort(); Togl_PostRedisplay(togl); return; case L_BACKGROUND: if ( togl == mesa_togl ) { bg[0] = value1; bg[1] = value2; bg[2] = value3; bg[3] = value4; xcChangeBackground( togl, bg ); } else { NEW_WIN_CONTEXT *wc; /* not .mesa */ wc = FindWinContextByTogl( togl ); wc->bg[0] = value1; wc->bg[1] = value2; wc->bg[2] = value3; wc->bg[3] = value4; xcChangeBackground( togl, wc->bg ); } return; case L_CURRENTFILEFORMAT: current_file_format = (int) value1; break; case SET_FOG_COLORMODE: fog.colormode = (int) value1; break; case SET_FOG_COLOR: fog.color[0] = (GLfloat) value1; fog.color[1] = (GLfloat) value2; fog.color[2] = (GLfloat) value3; fog.color[3] = (GLfloat) value4; case SET_FOG_MODE: fog.mode = value1; break; case SET_FOG_DENSITY: fog.density = (GLfloat) value1; break; case SET_FOG_ORT_START_F: fog.ort_start_f = (GLfloat) value1; break; case SET_FOG_ORT_END_F: fog.ort_end_f = (GLfloat) value1; break; case SET_FOG_PERSP_F1: fog.persp_f1 = (GLfloat) value1; break; case SET_FOG_PERSP_F2: fog.persp_f2 = (GLfloat) value1; break; case SET_ANTIALIAS_DEGREE: antialias.degree = (int) value1; break; case SET_ANTIALIAS_OFFSET: antialias.offset = (float) value1; break; case L_FORCE_RODTHICKF: FV.rod_thickf = (float) value1; BuildForceVectors(&FV); UpdateProjection(); break; case L_FORCE_ARRTHICKF: FV.arr_thickf = (float) value1; BuildForceVectors(&FV); UpdateProjection(); break; case L_FORCE_ARRLENF: FV.arr_lenf = (float) value1; BuildForceVectors(&FV); UpdateProjection(); break; case L_FORCE_COLOR: FV.color[0] = (float) value1; FV.color[1] = (float) value2; FV.color[2] = (float) value3; FV.color[3] = (float) value4; break; case R_XYZ_AXIS_COLOR: xyz.axis_color[0] = (float) value1; xyz.axis_color[1] = (float) value2; xyz.axis_color[2] = (float) value3; xyz.axis_color[3] = (float) value4; break; case R_XYZ_XYPLANE_COLOR: xyz.xyplane_color[0] = (float) value1; xyz.xyplane_color[1] = (float) value2; xyz.xyplane_color[2] = (float) value3; xyz.xyplane_color[3] = (float) value4; break; } if (VPf.stropened) /* now reDisplay */ ReDisplay(togl, remake3D); } /***************************************************************************** * D_ for "get default values" * ---------------------------- * define D_SCRF 0 * define D_BALLF 1 * define D_RODF 2 * define D_COVF 3 * define D_ALL 4 * define D_WFLINEWIDTH 5 * define D_PLLINEWIDTH 6 * define D_PLRADIUS 7 * define D_ATCOL_ONE 8 [this is done in XC_GetDefaultCmd] * define D_ATRAD_SCALE 9 * define D_ATRAD_ONE 10 * define D_FRAMECOL 11 [this is done in XC_GetDefaultCmd] * define D_FRAMELINEWIDTH 12 * define D_FRAMERODF 13 *------------------------------ */ double GetDefault(int var) { switch(var) { case D_BALLF: return DEF_BALLF; case D_RODF: return DEF_RODF; case D_COVF: return DEF_RCOVF; case D_WFLINEWIDTH: return DEF_LineWidthWF; case D_WF3DLINEWIDTH: return DEF_LineWidthWF3D; case D_OUTLINEWIDTH: return DEF_LineWidthOUT; case D_PLLINEWIDTH: return DEF_LineWidthPL; case D_PLRADIUS: return DEF_RadiusPL; case D_SCRF: /* this is no more used */ /* return DEF_SCRF; */ return 1.0; case D_ATRAD_SCALE: return DEF_ATRADF; case D_TESSELLATION: return DEF_TESSELLATION; case D_UNIBOND: return DEF_UNIBOND; case D_FOG: return DEF_FOG; case D_AMBIENT_BY_DIFFUSE: return DefAtCol_Ambient_by_Diffuse; case D_ANTIALIAS: return DEF_ANTIALIAS; case D_PERSPECTIVE: return DEF_PERSPECTIVE; case D_PERSPECTIVEBACK: return DEF_PERSPECTIVEBACK; case D_PERSPECTIVEFOVY: return DEF_PERSPECTIVEFOVY; case D_PERSPECTIVEFRONT: return DEF_PERSPECTIVEFRONT; case D_FRAMELINEWIDTH: return DEF_FRAMEWIDTH; case D_FRAMERODF: return DEF_FRAMERODF; case D_CURRENTFILEFORMAT: current_file_format = FORMAT_NONE; break; case GET_FOG_COLORMODE: return def_fog_colormode; case GET_FOG_MODE: return def_fog_mode; case GET_FOG_DENSITY: return def_fog_density; case GET_FOG_ORT_START_F: return def_fog_ort_start_f; case GET_FOG_ORT_END_F: return def_fog_ort_end_f; case GET_FOG_PERSP_F1: return def_fog_persp_f1; case GET_FOG_PERSP_F2: return def_fog_persp_f2; case GET_ANTIALIAS_DEGREE: return def_antialias_degree; case GET_ANTIALIAS_OFFSET: return def_antialias_offset; case D_FORCE_RODTHICKF: return VECTOR_THICKF; case D_FORCE_ARRTHICKF: return VECTOR_ARRTHICKF; case D_FORCE_ARRLENF: return VECTOR_ARROWSIZE; } return 0.0; } /*****************************************************************************/ /* GetValue use the same constants as GetDefault !!!!!!!!!! */ double GetValue(int var) { switch(var) { case D_BALLF: return VPf.ballf; case D_RODF: return VPf.rodf; case D_COVF: return VPf.rcovf; case D_WFLINEWIDTH: return VPf.WFlinewidth; case D_WF3DLINEWIDTH: return VPf.WF3Dlinewidth; case D_OUTLINEWIDTH: return VPf.OUTlinewidth; case D_PLLINEWIDTH: return VPf.PLlinewidth; case D_PLRADIUS: return VPf.PLradius; case D_SCRF: /* this is no more used */ /* return VPf.scrf; */ return 1.0; case D_ATRAD_SCALE: return VPf.atradf; case D_TESSELLATION: return VPf.tessFactor; case D_UNIBOND: return VPf.unibond; case D_FOG: return VPf.fog; case D_AMBIENT_BY_DIFFUSE: return AtCol_Ambient_by_Diffuse; case D_ANTIALIAS: return VPf.antialias; case D_PERSPECTIVE: return VPf.perspective; case D_PERSPECTIVEBACK: return VPf.perspective_far; case D_PERSPECTIVEFOVY: return VPf.perspective_fovy; case D_PERSPECTIVEFRONT: return VPf.perspective_size; case D_FRAMELINEWIDTH: return VPf.framewidth; case D_FRAMERODF: return VPf.framef; case D_CURRENTFILEFORMAT: return current_file_format; case GET_SS_MINX: return ss.minX; case GET_SS_MINY: return ss.minY; case GET_SS_MINZ: return ss.minZ; case GET_SS_MAXX: return ss.maxX; case GET_SS_MAXY: return ss.maxY; case GET_SS_MAXZ: return ss.maxZ; case GET_AT_MINX: return min.x; case GET_AT_MINY: return min.y; case GET_AT_MINZ: return min.z; case GET_AT_MAXX: return max.x; case GET_AT_MAXY: return max.y; case GET_AT_MAXZ: return max.z; case GET_FOG_COLORMODE: return fog.colormode; case GET_FOG_MODE: return fog.mode; case GET_FOG_DENSITY: return fog.density; case GET_FOG_ORT_START_F: return fog.ort_start_f; case GET_FOG_ORT_END_F: return fog.ort_end_f; case GET_FOG_PERSP_F1: return fog.persp_f1; case GET_FOG_PERSP_F2: return fog.persp_f2; case GET_ANTIALIAS_DEGREE: return antialias.degree; case GET_ANTIALIAS_OFFSET: return antialias.offset; case GET_ALAT: if (xcr.lconvvec) { return NORM_V3 (vec.conv[0]); } else if (xcr.lprimvec) { return NORM_V3 (vec.prim[0]); } return 1.0; case D_FORCE_RODTHICKF: return FV.rod_thickf; case D_FORCE_ARRTHICKF: return FV.arr_thickf; case D_FORCE_ARRLENF: return FV.arr_lenf; } return 0.0; } void LoadOldAtomicColors(void) { int i,j; for(i=0; i <= MAXNAT; i++) for(j=0; j < 3; j++) atcol[i][j] = DefAtColOld[i][j]; LoadAtmCol(0); } xcrysden-1.6.2/C/lighting.h0000644000175000017500000001310311712736221014213 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/lighting.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ /*****************************************************************************/ /* this is for structure's material */ extern GLfloat def_mat_shininess[]; extern GLfloat def_mat_specular[]; extern GLfloat def_mat_ambient[]; extern GLfloat def_mat_diffuse[]; extern GLfloat def_mat_emission[]; /*****************************************************************************/ /* this is for colorplanes's material */ extern GLfloat def_cpl_shininess[]; extern GLfloat def_cpl_specular[]; extern GLfloat def_cpl_ambient[]; extern GLfloat def_cpl_diffuse[]; extern GLfloat def_blend_cpl_shininess[]; extern GLfloat def_blend_cpl_specular[]; extern GLfloat def_blend_cpl_ambient[]; extern GLfloat def_blend_cpl_diffuse[]; /***************************************************************************/ /* for ISOSURF_TRANSP_ON */ extern float def_blend_front_mat_shininess[]; extern float def_blend_front_mat_specular[]; /* s tem kontroliram prednjo barvo, manjse vrednoti -> */ extern float def_blend_front_mat_diffuse[]; extern float def_blend_front_mat_ambient[]; extern float def_blend_front_mat_emission[]; extern float def_blend_pos_front_mat_diffuse[]; extern float def_blend_pos_front_mat_ambient[]; extern float def_blend_pos_front_mat_emission[]; extern float def_blend_neg_front_mat_diffuse[]; extern float def_blend_neg_front_mat_ambient[]; extern float def_blend_neg_front_mat_emission[]; /* s tem kotroliram koliko se vidi steklo, ce za njim ni nobenega */ extern float def_blend_back_mat_shininess[]; extern float def_blend_back_mat_specular[]; /* s tem kontroliram, koliko se vidi zadnjo stran stekla */ extern float def_blend_back_mat_diffuse[]; extern float def_blend_back_mat_ambient[]; extern float def_blend_back_mat_emission[]; extern float def_blend_pos_back_mat_diffuse[]; extern float def_blend_pos_back_mat_ambient[]; extern float def_blend_pos_back_mat_emission[]; extern float def_blend_neg_back_mat_diffuse[]; extern float def_blend_neg_back_mat_ambient[]; extern float def_blend_neg_back_mat_emission[]; /***************************************************************************/ /* for ISOSURF_TRANSP_OFF */ extern float def_front_mat_shininess[]; extern float def_front_mat_specular[]; /* s tem kontroliram prednjo barvo, manjse vrednoti -> */ extern float def_front_mat_diffuse[]; extern float def_front_mat_ambient[]; extern float def_front_mat_emission[]; extern float def_pos_front_mat_diffuse[]; extern float def_pos_front_mat_ambient[]; extern float def_pos_front_mat_emission[]; extern float def_neg_front_mat_diffuse[]; extern float def_neg_front_mat_ambient[]; extern float def_neg_front_mat_emission[]; /* s tem kotroliram koliko se vidi steklo, ce za njim ni nobenega */ extern float def_back_mat_shininess[]; extern float def_back_mat_specular[]; /* s tem kontroliram, koliko se vidi zadnjo stran stekla */ extern float def_back_mat_diffuse[]; extern float def_back_mat_ambient[]; extern float def_back_mat_emission[]; extern float def_pos_back_mat_diffuse[]; extern float def_pos_back_mat_ambient[]; extern float def_pos_back_mat_emission[]; extern float def_neg_back_mat_diffuse[]; extern float def_neg_back_mat_ambient[]; extern float def_neg_back_mat_emission[]; /*****************************************************************************/ /* LIGHTS */ #define MNOL MAX_NUMBER_OF_LIGHTS extern boolean def_light_isenabled[MNOL]; extern GLfloat def_light_ambient[MNOL][4]; extern GLfloat def_light_diffuse[MNOL][4]; extern GLfloat def_light_specular[MNOL][4]; extern GLfloat def_light_fract_position[MNOL][4]; extern GLfloat def_light_spotdir[MNOL][3]; extern GLfloat def_light_spot_exp[MNOL][1]; extern GLfloat def_light_spot_cutoff[MNOL][1]; extern GLfloat def_light_const_atten[MNOL][1]; extern GLfloat def_light_lin_atten[MNOL][1]; extern GLfloat def_light_quad_atten[MNOL][1]; /*****************************************************************************/ /* LIGHTMODEL --- LIGHTMODEL --- LIGHTMODEL --- LIGHTMODEL --- LIGHTMODEL */ extern GLfloat def_lightmodel_two_side[1]; extern GLfloat def_lightmodel_two_side_iso[1]; extern GLfloat def_lightmodel_ambient[4]; extern GLfloat def_lightmodel_local_viewer[1]; /*****************************************************************************/ /* FRONTFACE & BLENDFUNC --- FRONTFACE & BLENDFUNC */ extern FRONTFACE def_frontface_isosurf; extern BLENDFUNC def_blend_isosurf; extern BLENDFUNC def_blend_voronoi; xcrysden-1.6.2/C/fft_util.c0000644000175000017500000000463711727354230014233 0ustar tonetone#include #include #include #include /*#include "shankland.h"*/ #include "fft3d.h" void fft2d_enlarge_complex_r2c(size_t n1, size_t n2, fftw_complex *in, size_t n1new, size_t n2new, fftw_complex *out) { int n1min, n1max, n2max, dim2, dim2new, i, j, i_ind, ii_ind; if (in == out) { fprintf(stderr, "from fft2d_enlarge_complex_r2c: inplace enlargement is not supported, aborting ..."); abort(); } dim2 = n2/2+1; dim2new = n2new/2+1; n1min = FT_MIN(n1); n1max = FT_MAX(n1); n2max = FT_MAX(n2); /* clear the *out */ for(i=0; i #include #include #include #include "getline.h" #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif #ifndef SSIZE_MAX # define SSIZE_MAX ((int) (SIZE_MAX / 2)) #endif #if !HAVE_FLOCKFILE # undef flockfile # define flockfile(x) ((void) 0) #endif #if !HAVE_FUNLOCKFILE # undef funlockfile # define funlockfile(x) ((void) 0) #endif int getline_reserve (char **lineptr, size_t *n, FILE *stream) { return getdelim_reserve (lineptr, n, '\n', stream); } /* Read up to (and including) a DELIMITER from FP into *LINEPTR (and NUL-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *N characters of space. It is realloc'ed as necessary. Returns the number of characters read (not including the null terminator), or -1 on error or EOF. */ int getdelim_reserve (char **lineptr, size_t *n, int delimiter, FILE *fp) { int result; size_t cur_len = 0; if (lineptr == NULL || n == NULL || fp == NULL) { errno = EINVAL; return -1; } flockfile (fp); if (*lineptr == NULL || *n == 0) { *n = 120; *lineptr = (char *) malloc (*n); if (*lineptr == NULL) { result = -1; goto unlock_return; } } for (;;) { int i; i = getc (fp); if (i == EOF) { result = -1; break; } /* Make enough space for len+1 (for final NUL) bytes. */ if (cur_len + 1 >= *n) { size_t needed_max = SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; size_t needed = 2 * *n + 1; /* Be generous. */ char *new_lineptr; if (needed_max < needed) needed = needed_max; if (cur_len + 1 >= needed) { result = -1; goto unlock_return; } new_lineptr = (char *) realloc (*lineptr, needed); if (new_lineptr == NULL) { result = -1; goto unlock_return; } *lineptr = new_lineptr; *n = needed; } (*lineptr)[cur_len] = i; cur_len++; if (i == delimiter) break; } (*lineptr)[cur_len] = '\0'; result = cur_len ? cur_len : result; unlock_return: funlockfile (fp); return result; } xcrysden-1.6.2/C/perspective.c0000644000175000017500000000200211712736221014726 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/perspective.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include "struct.h" xcrysden-1.6.2/C/gridNormals.c0000644000175000017500000002755613521263076014706 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/gridNormals.c * ------ * * Copyright (c) 2009 by Anton Kokalj * ***************************************************************************** */ #include #include #include "struct.h" #include "isosurf.h" #include "xcfunc.h" /* note that M = N-1, where N is the number of points in the grid direction */ #define sign(x) ( (x) >= 0 ? +1 : -1 ) #define PBC_INDEX( i, M ) ( ((i)>=(M) || (i) < 0) ? (i)-sign(i)*(M) : (i) ) #define XYZ_ApTBmA(dst,a,t,b) \ do { \ dst.x = a.x + t*(b.x-a.x); \ dst.y = a.y + t*(b.y-a.y); \ dst.z = a.z + t*(b.z-a.z); \ } while(0) #define DOT_V3(a,b) ( (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] ) /* static void */ /* metricTensor33f(const float VEC_in[3][3], float T_out[3][3]) */ /* { */ /* T_out[0][0] = DOT_V3 (VEC_in[0], VEC_in[0]); */ /* T_out[1][1] = DOT_V3 (VEC_in[1], VEC_in[1]); */ /* T_out[2][2] = DOT_V3 (VEC_in[2], VEC_in[2]); */ /* T_out[0][1] = T_out[1][0] = DOT_V3 (VEC_in[0], VEC_in[1]); */ /* T_out[0][2] = T_out[2][0] = DOT_V3 (VEC_in[0], VEC_in[2]); */ /* T_out[1][2] = T_out[2][1] = DOT_V3 (VEC_in[1], VEC_in[2]); */ /* } */ void gridNormals(GRIDVERTEX ***g, GRID grd) { /* we implicitly assume that grid describes a periodic object, but we take care of reducible points at the right-cell boundaries */ register int ix, iy, iz, ixp, ixm, iyp, iym, izp, izm; int ixN = grd.nx - 1; int iyN = grd.ny - 1; int izN = grd.nz - 1; for (ix = 0; ix < ixN; ix++) { for (iy = 0; iy < iyN; iy++) { for (iz = 0; iz < izN; iz++) { ixp = ix+1; ixm = ix-1; iyp = iy+1; iym = iy-1; izp = iz+1; izm = iz-1; /* gradient (normal) in crystal coordinates: grad_{a,b,c} g = (dg/da, dg/db, dg/dc) */ g[ix][iy][iz].n.x = 0.5 * (g[ PBC_INDEX(ixp,ixN) ][iy][iz].val - g[ PBC_INDEX(ixm,ixN) ][iy][iz].val); g[ix][iy][iz].n.y = 0.5 * (g[ix][ PBC_INDEX(iyp,iyN) ][iz].val - g[ix][ PBC_INDEX(iym,iyN) ][iz].val); g[ix][iy][iz].n.z = 0.5 * (g[ix][iy][ PBC_INDEX(izp,izN) ].val - g[ix][iy][ PBC_INDEX(izm,izN) ].val); } } } } void gradient_SurfNml(GRIDVERTEX ***g, GRID grd, XYZ spanning_vec[3], int ntriangl, TRIG_INFO *tri2verIN, int nvertex, XYZ *vertex, XYZ *normal) { int it, iv, ig, i, j, k, i1, j1, k1; float dx, dy, dz, dis; XYZ gp[8], gn[8], gn_xyz[8]; /* vertices and normals of a given grid cube */ XYZ h; int iN = grd.nx - 1; int jN = grd.ny - 1; int kN = grd.nz - 1; float lat[3][3], invM[3][3]; for (i=0; i<3; i++) { lat[i][0] = spanning_vec[i].x / (float) iN; lat[i][1] = spanning_vec[i].y / (float) jN; lat[i][2] = spanning_vec[i].z / (float) kN; } INVERT_M33(float, invM, lat); for(iv=0; iv 1.0 ) iver[ic] = 1.0; } /* TRI-LINEAR INTERPOLATION */ /* z-dir */ XYZ_ApTBmA(u0, gc[0], iver[2], gc[4]); /* u0 = gc[0] + iver[2]*(gc[4]-gc[0]); */ XYZ_ApTBmA(u1, gc[1], iver[2], gc[5]); /* u1 = gc[1] + iver[2]*(gc[5]-gc[1]); */ XYZ_ApTBmA(u2, gc[2], iver[2], gc[6]); /* u2 = gc[2] + iver[2]*(gc[6]-gc[2]); */ XYZ_ApTBmA(u3, gc[3], iver[2], gc[7]); /* u3 = gc[3] + iver[2]*(gc[7]-gc[3]); */ /* y-dir */ XYZ_ApTBmA(v0, u0, iver[1], u1); /* v0 = u0 + iver[1]*(u1-u0); */ XYZ_ApTBmA(v1, u3, iver[1], u2); /* v1 = u3 + iver[1]*(u2-u3); */ /* x-dir */ XYZ_ApTBmA(hc, v0, iver[0], v1); /* h = v0 + iver[0]*(v1-v0); */ /* WEIGHTED NEAREST-NEIGHBOR INTERPOLATION */ /* hc.x = hc.y = hc.z = 0.0; */ /* for (ic=0; ic<8; ic++) */ /* { */ /* da = iver[0] - (float)cube[ic][0]; */ /* db = iver[1] - (float)cube[ic][1]; */ /* dc = iver[2] - (float)cube[ic][2]; */ /* /\* */ /* transform distance-vector to Cartesian coordinate system: */ /* (dx,dy,dz) = (da,db,dc) * incr_vec */ /* *\/ */ /* dx = da * incr_vec[0][0] + db * incr_vec[1][0] + dc * incr_vec[2][0]; */ /* dy = da * incr_vec[0][1] + db * incr_vec[1][1] + dc * incr_vec[2][1]; */ /* dz = da * incr_vec[0][2] + db * incr_vec[1][2] + dc * incr_vec[2][2]; */ /* dis = sqrt(dx*dx + dy*dy + dz*dz); */ /* if ( dis < MINTOL_F ) { */ /* hc = gc[ic]; */ /* break; */ /* } */ /* /\* don't need the normalization, only direction matters *\/ */ /* /\* w += 1.0 / dis; *\/ */ /* hc.x += gc[ic].x / dis; */ /* hc.y += gc[ic].y / dis; */ /* hc.z += gc[ic].z / dis; */ /* } */ /* fprintf(stderr, "nml[%d]=(%f,%f,%f); ver=(%f, %f, %f)\n", tri2verIN[it].ver_ind[iv], hc.x, hc.y, hc.z, */ /* vertex[ tri2verIN[it].ver_ind[iv] ].x, vertex[ tri2verIN[it].ver_ind[iv] ].y, vertex[ tri2verIN[it].ver_ind[iv] ].z); */ normalizeXYZ ( &hc ); nml[ tri2verIN[it].ver_ind[iv] ].x += hc.x; nml[ tri2verIN[it].ver_ind[iv] ].y += hc.y; nml[ tri2verIN[it].ver_ind[iv] ].z += hc.z; } } for(iv=0; iv */ /* #include */ /* int main(int ac, char** av) */ /* { */ /* int N=10; */ /* printf("N=%d\n", N); */ /* printf("PBC_INDEX(-3,%d) = %d\n", N, PBC_INDEX(-3,N)); */ /* printf("PBC_INDEX(-2,%d) = %d\n", N, PBC_INDEX(-2,N)); */ /* printf("PBC_INDEX(-1,%d) = %d\n", N, PBC_INDEX(-1,N)); */ /* printf("PBC_INDEX(0 ,%d) = %d\n", N, PBC_INDEX( 0,N)); */ /* printf("PBC_INDEX(1 ,%d) = %d\n", N, PBC_INDEX( 1,N)); */ /* printf("PBC_INDEX(9 ,%d) = %d\n", N, PBC_INDEX( 9,N)); */ /* printf("PBC_INDEX(10,%d) = %d\n", N, PBC_INDEX(10,N)); */ /* printf("PBC_INDEX(11,%d) = %d\n", N, PBC_INDEX(11,N)); */ /* printf("PBC_INDEX(12,%d) = %d\n", N, PBC_INDEX(12,N)); */ /* } */ xcrysden-1.6.2/C/primitives.h0000644000175000017500000000212511712736221014603 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/primitives.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define XCPRIM_WIRE 0 #define XCPRIM_SOLID 1 #define XCPRIM_SOLID_AND_BORDER 2 xcrysden-1.6.2/C/memory.h0000644000175000017500000000466211720511740013724 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/memory.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #ifndef FREE_ARG # define FREE_ARG char* #endif /* memory.c */ extern void *xcMalloc(size_t size); extern void *xcCalloc(size_t nmemb, size_t size); extern void *xcRealloc(void *ptr, size_t size); extern void xcFree(FREE_ARG ptr); extern void *xcNullFree(FREE_ARG ptr); extern void xcError(char error_text[]); extern void xcFree_Vectorf(float *v); extern void xcFree_Matrixf(float **m); extern void xcFree_Tensor3f(float ***t); extern void xcFree_Tensor3i(int ***t); extern void xcFree_ReallocatedTensor3f_00to11(float ***rt); extern float *xcMallocVectorf(long n); extern float **xcMallocMatrixf(long nr, long nc); extern float ***xcMallocTensor3f(long nr, long nc, long nd); extern int ***xcMallocTensor3i(long nr, long nc, long nd); extern short int ***xcMallocTensor3si(long nr, long nc, long nd); extern float ***xcReallocTensor3f_00to11(float ***t, long nr, long nc, long nd); extern void *cryMem_Malloc_W(size_t size, char *where); #ifdef XC_CPP_ISOSURF extern void xcFree_PLANEVERTEX(PLANEVERTEX **m); extern void xcFree_GRIDVERTEX(GRIDVERTEX ***t); extern void xcFree_LINE(LINE *t); extern PLANEVERTEX **xcMallocPLANEVERTEX(long nr, long nc); extern GRIDVERTEX ***xcMallocGRIDVERTEX(long nr, long nc, long nd); extern LINE *xcMallocLINE(long nr); extern VERTEX *xcRealloc2xBiggerVertex(VERTEX *vec, int *size); extern TRIANGLE *xcRealloc2xBiggerTriangl(TRIANGLE *vec, int *size); extern LINE *xcRealloc2xBiggerLINE(LINE *vec, int *size); #endif xcrysden-1.6.2/C/writeXSF.c0000644000175000017500000001621613514361234014124 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/writeXSF.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include "struct.h" #include "molsurf.h" #include "xcfunc.h" /* writeXSF.c */ static void _writeMolecule(FILE *fp); static void _writePeriodic(FILE *fp); static void _printAtom(FILE *fp, int nat, double x, double y, double z, double *f, boolean printForce); /* * usage: xc_writeXSF filename */ int XC_WriteXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { FILE *fp; if ( argc != 2 ) { char rss[1024]; snprintf(rss, sizeof(rss), "wrong # of arguments: should be \"xc_writeXSF filename\""); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } fp = fopen(argv[1], "w"); if (!fp) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't write file %s", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( xcr.dim == 0 ) { /* MOLECULE */ _writeMolecule(fp); } else { /* PERIODIC STRUCTURE */ _writePeriodic(fp); } fclose(fp); return TCL_OK; } /* ------------------------------------------------------------------------- * * xc_writebandXSF grid-identifier fermi-energy band-index BXSF-file * * write BANDGRID3d as BXSF file * ------------------------------------------------------------------------- */ int XC_WriteBandXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { register int i, j, k, ind; int ident, band_ind; double e_f; float value; FILE *fp; MOL_SURF *mols; struct DATAGRID *grid; if ( argc != 5 ) { char rss[1024]; snprintf(rss, sizeof(rss), "Usage: xc_writebandXSF grid-identifier fermi-energy band-index BXSF-file\n"); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* grid-index */ if ( Tcl_GetInt(interp, argv[1], &ident) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\"", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols = FindMolSurf( ident ); if (!mols) { char rss[1024]; snprintf(rss, sizeof(rss),"couldn't find MolSurface %d", ident); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (mols->isosurf_index < 0) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find surface index"); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* fermi energy */ if ( Tcl_GetDouble(interp, argv[2], &e_f) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\"", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* band-index */ if ( Tcl_GetInt(interp, argv[3], &band_ind) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\"", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* open file for writing */ fp = fopen(argv[4],"w"); if (fp == NULL) { char rss[1024]; snprintf(rss, sizeof(rss), "Can't write file \"%s\"", argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* "allocate" the grid */ grid = FindDataGrid( mols->fs.gridindex ); fseek(grid->fp, grid->band_fpos[mols->fs.gridsubindex][mols->fs.bandindex], SEEK_SET); /* let's write a BXSF file */ fprintf(fp, " BEGIN_INFO\n"); fprintf(fp, " Fermi Energy: %12.6f\n", e_f); fprintf(fp, " END_INFO\n"); fprintf(fp, " BEGIN_BLOCK_BANDGRID_3D\n"); fprintf(fp, " band_energies\n"); fprintf(fp, " BANDGRID_3D_BANDS\n"); /* number of bands */ fprintf(fp, " 1\n"); /* grid size */ fprintf(fp, " %d %d %d\n", grid->n[0], grid->n[1], grid->n[2]); /* grid origin */ fprintf(fp, " %15.8f %15.8f %15.8f\n", grid->orig[0], grid->orig[1], grid->orig[2]); /* grid spanning vectors */ for (i=0; i<3; i++) fprintf(fp, " %15.8f %15.8f %15.8f\n", grid->vec[i][0], grid->vec[i][1], grid->vec[i][2]); fprintf(fp, " BAND: %4d\n", band_ind); /* grid values */ ind = 0; for (i=0; in[0]; i++) for (j=0; jn[1]; j++) for (k=0; kn[2]; k++) { fread(&value, sizeof(float), 1, grid->fp); fprintf(fp, " %e", value); ind++; if (ind == 6) { fprintf(fp,"\n"); ind = 0; } } if (ind) fprintf(fp, "\n"); /* BXSF tail */ fprintf(fp, " END_BANDGRID_3D\n"); fprintf(fp, " END_BLOCK_BANDGRID_3D\n"); /* close the file */ fclose(fp); return TCL_OK; } /************************************************************************ static functions below ************************************************************************/ static void _writeMolecule(FILE *fp) { register int ia; fprintf(fp, "ATOMS\n"); for (ia=1; ia<=natoms; ia++) _printAtom(fp, nat[ia], xat[ia]+mx, yat[ia]+my, zat[ia]+mz, fv[ia], xcr.lforce); } static void _writePeriodic(FILE *fp) { register int ia; /* write periodic structure type */ if ( xcr.dim == 3 ) fprintf(fp, "CRYSTAL\n"); else if ( xcr.dim == 2 ) fprintf(fp, "SLAB\n"); else fprintf(fp, "POLYMER\n"); /* write PRIMVEC */ fprintf(fp, "PRIMVEC\n"); for (ia=0; ia<3; ia++) fprintf(fp, "%15.10f %15.10f %15.10f\n", vec.prim[ia][0], vec.prim[ia][1], vec.prim[ia][2]); /* write CONVVEC */ if ( xcr.lconvvec ) { fprintf(fp, "CONVVEC\n"); for (ia=0; ia<3; ia++) fprintf(fp, "%15.10f %15.10f %15.10f\n", vec.conv[ia][0], vec.conv[ia][1], vec.conv[ia][2]); } /* write PRIMCOORD */ fprintf(fp, "PRIMCOORD\n"); fprintf(fp, "%d 1\n", xcr.natr); for (ia = 0; ia < xcr.natr; ia++) { _printAtom(fp, xcr.prim_nat[ia], xcr.prim_coor[ia][0], xcr.prim_coor[ia][1], xcr.prim_coor[ia][2], xcr.prim_forc[ia], xcr.prim_lforc); } } static void _printAtom(FILE *fp, int nat, double x, double y, double z, double *f, boolean printForce) { if ( ! printForce ) { fprintf(fp, "%3d %15.10f %15.10f %15.10f\n", nat, x, y, z); } else { fprintf(fp, "%3d %15.10f %15.10f %15.10f %15.10f %15.10f %15.10f\n", nat, x, y, z, f[0], f[1], f[2]); } } xcrysden-1.6.2/C/make-objects0000644000175000017500000000243713514352270014534 0ustar tonetone# togl.o EXTERNAL_OBJS = \ gl2ps.o \ sgiRasterFont.o \ sgiAux.o XC_OBJS = \ detnsplit.o \ xcAppInit.o \ xcballstick.o \ xcviewport.o \ xcLabels.o \ vectors.o \ xcDisplayFunc2.o \ xcAtomAdd.o \ loadValues.o \ hpsort.o \ auxilproc.o \ xcdebug.o \ 3D.o \ xcDisplayFunc.o \ readstrf.o \ mxmymz.o \ remakestr.o \ xcSelect.o \ readisodata.o \ lighting.o \ xcGLparam.o \ colorplane.o \ isorender.o \ polygonise.o \ polygonise_auxil.o \ xcIsoSurf.o \ voronoi.o \ xcBz.o \ xcSuperCell.o \ xcPrimitives.o \ setOpenGLState.o \ memory.o \ isoMalloc.o \ isoInterpolate.o \ readPlvertex.o \ splineInt.o \ paraSize.o \ isoline.o \ xcIsoSpaceSel.o \ cells.o \ xcWigner.o \ xcTogl.o \ datagrid.o \ sInfo.o \ xcIsoDataGrid.o \ xcColorScheme.o \ xcReadXSF.o \ xcF3toI4.o \ xcFractCoor.o \ signal.o \ MarchCubes.o \ isosurf.o \ xcMolSurf.o \ cryNewContext.o \ fs.o \ cryDispFunc.o \ cryDispFuncMultiFS.o \ crySetProj.o \ crySurfArgs.o \ crySurf.o \ cryTransform.o \ cryClip.o \ cryTogl.o \ forces.o \ xcForces.o \ gl2psPrintTogl.o \ ppmPrintTogl.o \ lcasi.o lcasif.o \ xcFont.o \ fog.o \ writeXSF.o \ hbonds.o \ xcHBonds.o \ linear.o \ realTimeMovie.o \ getline.o \ gridNormals.o \ fft3d.o \ fft_util.o \ shank3d.o \ shank_Hinv.o \ shank_util.o xcrysden-1.6.2/C/3D.c0000644000175000017500000002206311712736221012654 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/3D.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include "struct.h" #include "3D.h" #include "xcfunc.h" /* --- function prototypes --- */ void LoadNull(GLdouble matrix[][4]); void LoadNull44One(GLdouble matrix[][4]); /* not needed yet */ void LoadIdentity(GLdouble matrix[][4]); void GetMajorMat(void); void MajorMatToVec(void); void GetOldMat(void); void GetRotXYMat( GLdouble fiX, GLdouble fiY ); static void MatMultXY( GLdouble rotx[][4], GLdouble roty[][4] ); void GetRotX( GLdouble fiX ); void GetRotY( GLdouble fiY ); void GetRotZ( GLdouble fiZ ); /* void From2Dto3D(void); ---moved to --> trash.c */ void MakeCylinderCoor(void); static void GetCylinderPar(int numb, double x21, double y21, double z21); /* void From3Dto2D(void); ---moved to --> trash.c */ /*static void UpdateCoor( double *x, double *y, double *z);*/ /* --- auxilproc.c --- */ extern double dist3(double x, double y, double z); /*****************************************************************************/ /* razlaga funkcij, ki se uporabljajo pri prehodu 2D -> 3D. Prepisati je potrebno "AtomBond coor" -> "struct 3D". Pri 3D koordinat ne speminjam ampak zasledujem matriko, s katero vsakic pomnozim coordinate */ /* From2Dto3D() ... koordinate iz 2D oblike v 3D obliko * From3Dto2D() ... obratno kot zgoraj * GetNewMatrix()... dobis novo rotacijsko matriko, ki ustreza * zeljeni rotaciji * GetMajorMat() ... Major Matrix je matrika s katero pomozim koordinate, * da dobim zeljeno sliko (izracuna Major matriko) * GetOldMat() ... Major Matriko prepise v Old Matriko; MajorMat pa * v nulto matriko; * LoadNull(GLdouble matrix[][]) ... load null matrix * LoadNull44One ... to all elements assign null, * except to last elemnt assign 1.0 * LoadIdentity(GLdouble matrix[][]) ... load identity matrix */ void LoadNull(GLdouble matrix[][4]) { int i,j; for(i=0; i<4; i++) for(j=0; j<4; j++) matrix[i][j] = 0.0; } /* assign null to all elements, except to [3][3] assign 1.0 */ void LoadNull44One(GLdouble matrix[][4]) { int i,j; for(i=0; i<4; i++) for(j=0; j<4; j++) matrix[i][j] = 0.0; matrix[3][3] = 1.0; } void LoadIdentity(GLdouble matrix[][4]) { int i,j; for(i=0; i<4; i++) for(j=0; j<4; j++) if ( i != j) matrix[i][j] = 0.0; else matrix[i][j] = 1.0; } /* ============================================== */ /* multiplication of matrix in COLOUMN MAJOR mode */ /* MajorMat[Kcol,Irow] = SUM(j){ NewMat[Jcol,Irow] * OldMat[Kcol,Jrow] * * also assign a vector xcGLvec[] from MajorMat[4][4] in COLOUMN MAJOR mode */ void GetMajorMat(void) { int ivec = 0; int i,j,k; for(k=0; k<4; k++) for(i=0; i<4; i++) { for(j=0; j<4;j++) MajorMat[k][i] = MajorMat[k][i] + NewMat[j][i] * OldMat[k][j]; xcGLvec[ivec++] = MajorMat[k][i]; } } void MajorMatToVec(void) { int ivec = 0; int i,j; for(i=0; i<4; i++) for(j=0; j<4; j++) xcGLvec[ivec++] = MajorMat[i][j]; } void GetOldMat(void) { int i,j; for(i=0; i<4; i++) for(j=0; j<4;j++) { OldMat[i][j] = MajorMat[i][j]; MajorMat[i][j] = 0.0; } } /* In C 2D arrays are in row-major mode, but I'm dealing with coloumn major * mode; so whan initializing a matrix I must take care of above * transposition */ void GetRotXYMat( GLdouble fiX, GLdouble fiY ) { /* 2.2 is just to mark where a cos() or sin() will go */ GLdouble rotx[4][4] = { { 1.0, 0.0, 0.0, 0.0 }, { 0.0, 2.2, 2.2, 0.0 }, { 0.0, 2.2, 2.2, 0.0 }, { 0.0, 0.0, 0.0, 1.0 } }; GLdouble roty[4][4] = { { 2.2, 0.0, 2.2, 0.0 }, { 0.0, 1.0, 0.0, 0.0 }, { 2.2, 0.0, 2.2, 0.0 }, { 0.0, 0.0, 0.0, 1.0 } }; rotx[1][1] = cos(fiX); rotx[2][1] = -sin(fiX); rotx[1][2] = sin(fiX); rotx[2][2] = cos(fiX); roty[0][0] = cos(fiY); roty[2][0] = sin(fiY); roty[0][2] = -sin(fiY); roty[2][2] = cos(fiY); MatMultXY( rotx, roty ); } /* assign NewMat = rotx * roty */ static void MatMultXY( GLdouble rotx[][4], GLdouble roty[][4] ) { int i,j,k; LoadNull( NewMat ); for(k=0; k<4; k++) for(i=0; i<4; i++) for(j=0; j<4;j++) NewMat[k][i] = NewMat[k][i] + rotx[j][i] * roty[k][j]; } void GetRotX( GLdouble fiX ) { NewMat[0][0] = 1.0; NewMat[1][0] = 0.0; NewMat[2][0] = 0.0; NewMat[3][0] = 0.0; NewMat[0][1] = 0.0; NewMat[1][1] = cos(fiX); NewMat[2][1] = -sin(fiX); NewMat[3][1] = 0.0; NewMat[0][2] = 0.0; NewMat[1][2] = sin(fiX); NewMat[2][2] = cos(fiX); NewMat[3][2] = 0.0; NewMat[0][3] = 0.0; NewMat[1][3] = 0.0; NewMat[2][3] = 0.0; NewMat[3][3] = 1.0; } void GetRotY( GLdouble fiY ) { NewMat[0][0] = cos(fiY); NewMat[1][0] = 0.0; NewMat[2][0] = sin(fiY); NewMat[3][0] = 0.0; NewMat[0][1] = 0.0; NewMat[1][1] = 1.0; NewMat[2][1] = 0.0; NewMat[3][1] = 0.0; NewMat[0][2] = -sin(fiY); NewMat[1][2] = 0.0; NewMat[2][2] = cos(fiY); NewMat[3][2] = 0.0; NewMat[0][3] = 0.0; NewMat[1][3] = 0.0; NewMat[2][3] = 0.0; NewMat[3][3] = 1.0; } void GetRotZ( GLdouble fiZ ) { NewMat[0][0] = cos(fiZ); NewMat[1][0] = -sin(fiZ); NewMat[2][0] = 0.0; NewMat[3][0] = 0.0; NewMat[0][1] = sin(fiZ); NewMat[1][1] = cos(fiZ); NewMat[2][1] = 0.0; NewMat[3][1] = 0.0; NewMat[0][2] = 0.0; NewMat[1][2] = 0.0; NewMat[2][2] = 1.0; NewMat[3][2] = 0.0; NewMat[0][3] = 0.0; NewMat[1][3] = 0.0; NewMat[2][3] = 0.0; NewMat[3][3] = 1.0; } void MakeCylinderCoor(void) { int i, ii; /* first cylinder's coordinates for BONDS */ for(i=1; i <= nbonds; i++) { (coor3D + i)->flag = BOND; (coor3D + i)->bondFlag = *(bondend + i); (coor3D + i)->nat = *(natbond + i); (coor3D + i)->sqn = *(sqnbond + i); /* (coor3D + i)->list is not copied !!!! */ (coor3D + i)->x1 = *(xbond + i); (coor3D + i)->y1 = *(ybond + i); (coor3D + i)->z1 = *(zbond + i); GetCylinderPar(i, *(xbond2 + i) - *(xbond + i), *(ybond2 + i) - *(ybond + i), *(zbond2 + i) - *(zbond + i) ); } /* now, cylinder's coordinates for FRAMES, if there is any frame */ for(i=nbonds + 1; i<= nbonds + nframes; i++) { ii = i - nbonds; (coor3D + i)->flag = FRAME; (coor3D + i)->nat = *(frametype + ii); (coor3D + i)->sqn = ii; /* (coor3D + i)->list is not copied !!!! */ (coor3D + i)->x1 = *(xframe + ii); (coor3D + i)->y1 = *(yframe + ii); (coor3D + i)->z1 = *(zframe + ii); GetCylinderPar(i, *(xframe2 + ii) - *(xframe + ii), *(yframe2 + ii) - *(yframe + ii), *(zframe2 + ii) - *(zframe + ii) ); } } /* calculate fibond, xrvb, yrvb, zrvb, bondl */ static void GetCylinderPar(int numb, double x21, double y21, double z21) { double mintol = -1.0 + 1.0e-8; /* rotated vector is cross product between (0,0,1) & vector submited to GetCylinderPar */ (coor3D + numb)->bondl = dist3(x21, y21, z21); /* normalize vectror (x21,y21,z21) */ normalizepv(&x21, &y21, &z21); /* maybe (x21, y21, z21) vector is (0.0, 0.0, 1.0) or (0.0, 0.0,-1.0) */ if (z21 > mintol) { (coor3D + numb)->xrvb = -y21; (coor3D + numb)->yrvb = x21; (coor3D + numb)->zrvb = 0.0; } else { (coor3D + numb)->xrvb = 1.0; (coor3D + numb)->yrvb = 0.0; (coor3D + numb)->zrvb = 0.0; } (coor3D+ numb)->fibond = RAD2DEG * acos(z21); if (ABS(z21) > 1.0000000001) { fprintf(stderr,"Z-component of normalized vector greater than 1.0\n"); fprintf(stderr,"Vector: %f %f %f\n", x21, y21, z21); return; } /* Testing ... */ /* if ( ABS((coor3D + numb)->xrvb) < 1e-8 && ABS((coor3D + numb)->yrvb) < 1e-8 ) { (coor3D + numb)->xrvb = 1.0; (coor3D + numb)->yrvb = 0.0; (coor3D + numb)->zrvb = 0.0; (coor3D+ numb)->fibond = 0.0; } */ } /* static void UpdateCoor( double *x, double *y, double *z) { double x1, y1, z1; x1 = MajorMat[0][0] * *x + MajorMat[1][0] * *y + MajorMat[2][0] * *z; y1 = MajorMat[0][1] * *x + MajorMat[1][1] * *y + MajorMat[2][1] * *z; z1 = MajorMat[0][2] * *x + MajorMat[1][2] * *y + MajorMat[2][2] * *z; *x = x1; *y = y1; *z = z1; } */ xcrysden-1.6.2/C/xcfunc.h0000644000175000017500000007242613522234117013707 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcfunc.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ /*****************************************************************************/ /* XC_CPP_* are pre-processor flags */ #ifndef XC_CPP_STRUCT # include "struct.h" #endif #ifndef XC_CPP_GLPARAM # include "xcGLparam.h" #endif /* ===================================================================== * * FUNCTION PROTOTYPES FOR XCRYSDEN * * ===================================================================== */ /* 3D.c */ extern void LoadNull(GLdouble matrix[][4]); extern void LoadNull44One(GLdouble matrix[][4]); extern void LoadIdentity(GLdouble matrix[][4]); extern void GetMajorMat(void); extern void MajorMatToVec(void); extern void GetOldMat(void); extern void GetRotXYMat(GLdouble fiX, GLdouble fiY); extern void GetRotX(GLdouble fiX); extern void GetRotY(GLdouble fiY); extern void GetRotZ(GLdouble fiZ); extern void MakeCylinderCoor(void); /* --- auxilproc.c: --- */ /* auxilproc.c */ extern double dist6(double x1, double x2, double y1, double y2, double z1, double z2); extern double dist3(double x, double y, double z); extern double distdv(double *vec); extern int normalizepv(double *x, double *y, double *z); extern int iround(double x); extern void Rotate(double *x, double *y, double *z, double cosfi, double sinfi); extern void xcMat44Copyd(double mat1[][4], double mat2[][4], int n, int m); extern int normalizepvf(float *x, float *y, float *z); extern int normalizepvfv(float *vec); extern void RevertVectorfv(float *vec); extern float dist3f(float x, float y, float z); extern float distfv(float *v); extern int iroundf(float x); extern void xcDeleteBitFlags(unsigned int *var, unsigned int flags); extern void MatVecMult33f(float mat[3][3], float vec[3], float new[3]); extern void MatMult33f(float a[3][3], float b[3][3], float new[3][3]); extern void MatCopy33f(float a[3][3], float b[3][3]); extern void MatToZero33f(float a[3][3]); extern int IsSamePointvf(float *a, float *b, float limit); extern int IsEqualf(float a, float b, float limit); extern int WriteArgv(char *argv[], int *argc, char *fmt, ...); extern void VecSum2f(float vec1[], float vec2[], int i, int j, float res[]); extern void VecSum3f(float vec1[], float vec2[], float vec3[], int i, int j, int k, float res[]); extern void VecProduct3f(float v0[], float v1[], float res[]); extern float CramerRule2x2Detf(float d[2][3], int i); extern void xcRotate3fv(float fi, float *v, float *m, float *p); extern double det3x3d(const double *v0, const double *v1, const double *v2); extern float det3x3f(const float *v0, const float *v1, const float *v2); /* --- colorplane.c: --- */ extern void ColorPlane(int obj, int cb, int fn, int nx, int ny); extern void GetIsoLine2D_Attributes(int obj, int cb, int fn); extern float xcLinf(float value); extern float xcLogf(float value); extern float xcLog10f(float value); extern float xcSqrtf(float value); extern float xcRoot3f(float value); extern float xcGaussf(float value); extern float xcSlaterf(float value); extern float xcExpf(float value); extern float xcExp2f(float value); /* --- detnsplit.c: --- */ extern int DetNBonds(int *nsplit); /* hpsort.c */ extern int hpsort_index(size_t count, const double *data, int *p); extern int hpsort_index1(size_t count, const double *data, int *p); extern int hpsort_index_f(size_t count, const float *data, int *p); extern int hpsort_index1_f(size_t count, const float *data, int *p); /* --- isorender.c: --- */ extern void xcRenderColorplane(int obj); extern void xcRenderIsosurf(int obj); extern void xcRenderIsoLine2D(int obj); /* --- lighting.c: --- */ extern void CalcLightPosition (int il, GLdouble size); extern void LoadBlendfunc_And_Frontface(void); extern void LoadIsoMaterial(int type); extern void LoadLights(void); extern void LoadLightModel(int type); extern void LoadStructMaterial(void); extern void LoadVoronoiMaterial(int voronoi_type); extern void LoadCageOrVecMaterial(int type); /* --- loadValues.c: --- */ extern double GetDefault(int var); extern double GetValue(int var); extern void LoadDefaultValues(void); #ifdef TOGL_H extern void LoadNewValue(struct Togl *togl, int var, double value1, double value2, double value3, double value4); extern void ResetVar(struct Togl *togl, int var); #endif /* --- polygonise.c: --- */ extern void WrapperSurfSmoothing(int ilevel); extern void MarchingCubes(float isolevel, int ilevel, int smooth_nstep, float smooth_weight, int algorithm, int shade_model, int normals_model); #ifdef ISOSURF_H extern int Polygonise(GRIDCELL grid, float isolevel, GRID ijk, TRIANGLE *triangles, TRIG_INFO *trig_info); extern XYZ VertexInterp(float isolevel, XYZ p1, XYZ p2, float valp1, float valp2); extern int PolygoniseTetrahedral(GRIDCELL grid, float iso, GRID ijk, TRIANGLE *triangl, TRIG_INFO *trig_info); #endif /* polygonise_auxil.c */ #ifdef ISOSURF_H extern void VertexRecognise(GRID grd, int ntriangl, TRIANGLE *triangles, int *triangl_status, TRIG_INFO *tri2verIN, XYZ *vertex, int *vertex_status, VERT2TRIG_INFO (*ver2triIN)[20 ], int *nver2triIN, GRID_INFO *grid_info, int *nvertex); extern void SurfSmoothing(int nstep, float weight, XYZ *vertex, int *vertex_status, VERT2TRIG_INFO (*ver2triIN)[20 ], TRIG_INFO *tri2verIN, int *nver2triIN, int nvertex); extern void SurfNmlAver(int ntriangl, int nvertex, XYZ *nml, XYZ *vertex, TRIG_INFO *tri2verIN, float *sign, int is_tetrahedral); #endif #ifdef XC_CPP_XYZ extern XYZ TriangleWeightNormalS(XYZ p0, XYZ p1, XYZ p2, float sign); extern XYZ TriangleWeightNormal(XYZ p0, XYZ p1, XYZ p2); extern XYZ VertexNormal(XYZ v1, XYZ v2); extern float distXYZ(XYZ v); extern int normalizeXYZ(XYZ *v); #endif /* gridNormals.c */ #ifdef ISOSURF_H extern void gridNormals(GRIDVERTEX ***g, GRID grd); extern void gradient_SurfNml(GRIDVERTEX ***g, GRID grd, XYZ spanning_vec[3], int ntriangl, TRIG_INFO *tri2verIN, int nvertex, XYZ *vertex, XYZ *normal); extern void gradient_SurfNmlNew(float origin[], float incr_vec[3][3], float ***g, GRID gr, int ntriangl, TRIG_INFO *tri2verIN, int nvertex, XYZ vertex[], XYZ normal[]); #endif /* readisodata.c */ extern void WriteBinVertexFP(void); #ifdef XC_CPP_XYZ extern int ReadIsoData(int framenum[ISODATA_MAXFILES][ISODATA_MAXSTACK][2], int ntimes); extern int ReadBlock0(int type, int s0, int s1, int s2, int s3); #endif /* --- readstrf.c: --- */ /* readstrf.c */ extern int ReadStructFile(FILE *fp, const char *file, int format, int mode); extern void MakeBonds(void); extern void MallocCoor(void); extern int ReadXSF(FILE *fp); extern int ReadVec(FILE *fp, double vec[][4]); extern void FindMaxRad(void); extern void ParseAtomName(char *atomName); /* --- remakestr.c: --- */ #ifdef TOGL_H extern void ReDisplay(struct Togl *togl, GLuint remake3D); #endif extern void ReMakeStr(void); /* --- vectors.c: --- */ extern void VecRotateX(double cosfi, double sinfi); extern void VecRotateXY(double cosfiX, double sinfiX, double cosfiY, double sinfiY); extern void VecRotateXY(double cosfiX, double sinfiX, double cosfiY, double sinfiY); extern void VecRotateY(double cosfi, double sinfi); extern void VecRotateZ(double cosfi, double sinfi); extern void vecMatToVec(double major[4][4], double vec[16]); extern void vecVecToMat(double vec[16], double major[4][4]); extern void VecRotTo_XY(void); extern void VecRotTo_XZ(void); extern void VecRotTo_YZ(void); extern void xcRotatefv(float fi, float u[]); extern void VecRotTo_AB(void); extern void VecRotTo_AC(void); extern void VecRotTo_BC(void); /* --- xcAppInit.c: --- */ #ifdef _TCL extern int Tcl_AppInit(Tcl_Interp *interp); extern int XC_DisplayMode2DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_DisplayMode3DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_DrawStyle3DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_GetDefaultCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_GetValueCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_MesaContextCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_NewValueCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_OpenStrCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_PointSizeCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ResetVarCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ShadeModel3DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif /* _TCL */ #ifdef TOGL_H extern int XC_RotateCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_TranslateCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_Dump2EpsCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif #ifdef _TCL extern int XC_UpdateStrCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_DisplayCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif extern int xcRotateXY(double fiX, double fiY); /* --- xcAtomAdd.c: --- */ #ifdef _TCL extern int XC_AtomAddCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif /* --- xcDisplayFunc.c: --- */ extern GLuint xcGenLists(GLsizei i); extern GLuint findList1(int lindex, GLdouble *paramArray, int size); extern GLuint makeModelPtr1(int lindex, GLdouble sizeArray[], int count); #ifdef TOGL_H extern void xcDisplayFunc(void (*Func)(struct Togl *togl)); extern int xcToglDisplayFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern void xcDummyDisplay(struct Togl *togl); #endif extern void xcGenDispList(void); extern void xcMakePointList(void); #ifdef TOGL_H extern void xcWireFrame2D(struct Togl *togl); extern void xcPointLine2D(struct Togl *togl); #endif extern void xcBall2D(int iatom); extern void xcSmallBall2D(int iatom); extern void xcBigBall2D(int iatom); #ifdef TOGL_H extern void xcBallStick12D(struct Togl *togl); extern void xcPipeBall2D(struct Togl *togl); extern void xcBallStick22D(struct Togl *togl); extern void xcSpaceFill2D(struct Togl *togl); #endif extern void EnableOr2D_Or3D(void); extern void xcWireSphere(GLdouble radius); extern void xcSolidSphere(GLdouble radius); extern void xcWireCylinder(GLdouble radius, GLdouble height); extern void xcSolidCylinder(GLdouble radius, GLdouble height); extern void xcSolidBond(GLdouble radius, GLdouble height, int bondFlag); extern void xcSolidCone(GLdouble baseradius, GLdouble topradius, GLdouble height); extern void xcRenderSolidBalls3D(void); extern void xcRenderWireBalls3D(void); extern void xcRenderBonds(GLenum type); extern void xcRenderSolidSpaceFills3D(void); extern void xcRenderWireSpaceFills3D(void); extern void xcRenderSolidFrame3D(void); extern void xcRenderWireFrame3D(void); extern void xcRenderLineFrame3D(void); extern void xcMakeBallLabel3D(void); extern void xcMakeSpaceLabel3D(void); extern void xcMaybeDestroyLists(void); extern void xcMakeProjection2D(const char *mode); extern void xcMakeProjection3D(const char *mode); extern void xcDisplayXYZ(void); #ifdef TOGL_H extern void xcDisplay3D(struct Togl *togl); extern void xcClearScreen(struct Togl *togl); extern void xcChangeBackground(struct Togl *togl, GLclampf bckg[4]); extern void xcTurnXYZOff(struct Togl *togl); #endif /* --- xcDisplayFunc2.c: --- */ extern void UpdateDispFunc(void); extern void UpdateProjection(void); extern void RewriteCoor(GLenum type); extern void xcTurnLabelsOff(void); extern void xcTurnLabelsOn(void); extern void xcTurnFramesOff(void); extern void xcTurnFramesOn(void); extern void makeAtomLabel2D(int ith, GLdouble Xoffset, GLdouble Yoffset); #ifdef TOGL_H extern void xcBallStick1F2D(struct Togl *togl); extern void xcBallStick1FL2D(struct Togl *togl); extern void xcBallStick1L2D(struct Togl *togl); extern void xcBallStick2F2D(struct Togl *togl); extern void xcBallStick2FL2D(struct Togl *togl); extern void xcBallStick2L2D(struct Togl *togl); extern void xcPointLineF2D(struct Togl *togl); extern void xcPointLineFL2D(struct Togl *togl); extern void xcPointLineL2D(struct Togl *togl); extern void xcWireFrameF2D(struct Togl *togl); extern void xcWireFrameFL2D(struct Togl *togl); extern void xcWireFrameL2D(struct Togl *togl); #endif #ifdef _TCL /* --- xcExit.c: --- */ extern int XC_ExitCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); /* --- xcGLparam.c: --- */ extern int XC_GetGLparamCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_SetGLparamCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int xcSplitList( int code, Tcl_Interp *interp, const char *argv[], GetGlParam *var); extern void xcTclListError( int code, Tcl_Interp *interp, const char **argv ); /* --- xcIsoSurf.c: --- */ extern int XC_IsoCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsodataCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsofilesCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsoplaneCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsopointsCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsosignCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsostackCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsosurfCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsoplaneCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif /* _TCL */ extern void xcIsoError(void); extern int IsIsoPlane123( int type ); /* --- xcLabels.c: --- */ extern void makeAtomLabels(void); extern void makeCrdList(void); extern void makeRasterFont(void); extern void makeTemp3D2DList(void); extern void makeXYZLabels(void); /* --- xcMesaContext.c: --- */ /* --- xcMesaEvent.c: --- */ /* extern void XC_MesaEvent(ClientData clientData, XEvent *eventPtr); extern void xcSwapBuffers(void);*/ /* --- xcMesaWin.c: --- */ /* extern int XC_MesaWinCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]);*/ /* --- xcSelect.c: --- */ /* xcSelect.c */ #ifdef _TCL extern int XC_SelectCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_DeselectCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif extern int xcSelectSqn(int x, int y); extern void GetSelCylinderPar(double x21, double y21, double z21, double *xrvb, double *yrvb, double *zrvb, double *fibond, double *bondl); #ifdef TOGL_H extern void xcPointLineSel(struct Togl *togl); extern void xcBallStick1Sel(struct Togl *togl); extern void xcBallStick2Sel(struct Togl *togl); #endif extern void xcRenderSelAtoms3D(void); extern void xcRenderSelBonds3D(void); /* --- xcballstick.c: --- */ extern void MakeArcPoints(void); extern int MakeSticks1(int i, GLdouble *x1, GLdouble *y1, GLdouble *z1, GLdouble *x2, GLdouble *y2, GLdouble *z2, GLdouble *x3, GLdouble *y3, GLdouble *z3, GLdouble *x4, GLdouble *y4, GLdouble *z4); extern int MakeSticks2(int i, int col, int flag); /* xcdebug.c */ extern void xcdebug(const char *text); extern void xcErrDebug(const char *text); extern void breakpoint(const char *text); /* --- xcviewport.c: --- */ extern void xcViewPort(void); extern void MaybeClipAndMakeProjection(void); extern void Screen2Model_Coords(int xs, int ys, float *xm, float *ym); /* --- voronoi.c: --- */ extern void xcRenderVoronoi(void); #ifdef _TCL /* --- xcBz.c --- */ extern int XC_BzCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); /* --- xcSuperCell --- */ extern int XC_SuperCellCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); #endif /* _TCL */ extern void (*xcSuperCell)(void); extern void xcSuperCellFunc( void (*Func)(void) ); #ifdef XC_CPP_VECTOR extern void SetUnitCellCage( double vec[4][4], CellCage *cage ); #endif /* --- xcPrimitives.c --- */ #ifdef XC_CPP_VECTOR extern void xcSolidCage( CellCage cage ); extern void xcWireCage( CellCage cage ); extern void xcSolidVector( RenderVectors vec ); #endif extern void xcParallelogram( int type, float p[4][3], float nml[3] ); /* --- setOpenGLState.c --- */ #ifdef XC_CPP_GLPARAM extern void SetCageOGLState( int dim, BLENDFUNC blend, GLint *shade_model, GLboolean *two_side, GLboolean *cull_face ); extern void DisableCageOGLState( int dim, GLint shade_model, GLboolean two_side, GLboolean cull_face ); #endif /* memory.c */ extern void *xcMalloc(size_t size); extern void *xcCalloc(size_t nmemb, size_t size); extern void *xcRealloc(void *ptr, size_t size); extern void xcFree(FREE_ARG ptr); extern void xcError(char error_text[]); extern void xcFree_Vectorf(float *v); extern void xcFree_Matrixf(float **m); extern void xcFree_Tensor3f(float ***t); extern void xcFree_Tensor3i(int ***t); extern void xcFree_ReallocatedTensor3f_00to11(float ***rt); extern float *xcMallocVectorf(long n); extern float **xcMallocMatrixf(long nr, long nc); extern float ***xcMallocTensor3f(long nr, long nc, long nd); extern int ***xcMallocTensor3i(long nr, long nc, long nd); extern short int ***xcMallocTensor3si(long nr, long nc, long nd); extern float ***xcReallocTensor3f_00to11(float ***t, long nr, long nc, long nd); extern void *cryMem_Malloc_W(size_t size, char *where); /* --- splineInt.c --- */ extern void splie2(float x1a[], float x2a[], float **ya, int m, int n, float **y2a); extern void spline(float x[], float y[], int n, float yp1, float ypn, float y2[]); extern void xcRegularSplineInt2(float gridX[], float gridY[], float **Fn, int nX, int nY, float ndegree, float **newFn); extern void xcRegSplineInt(float xa[], float ya[], float y2a[], int i, float x, float *y); extern void xcRegularSplineInt3(float gridX[], float gridY[], float gridZ[], float ***Fn, int nX, int nY, int nZ, float ndegree, float ***newFn); extern void spline3(float x[], int n, float ***y, int j, int k, float yp1, float ypn, float y2[]); extern void xcRegSpline3Int(float xa[], float ***ya, int i, int j, int k, \ float y2a[], float x, float *y); /* --- isoMalloc.c --- */ #ifdef XC_CPP_ISOSURF extern void xcFree_PLANEVERTEX(PLANEVERTEX **m); extern void xcFree_GRIDVERTEX(GRIDVERTEX ***t); extern void xcFree_LINE(LINE *t); extern PLANEVERTEX **xcMallocPLANEVERTEX(long nr, long nc); extern GRIDVERTEX ***xcMallocGRIDVERTEX(long nr, long nc, long nd); extern LINE *xcMallocLINE(long nr); extern VERTEX *xcRealloc2xBiggerVertex(VERTEX *vec, int *size); extern TRIANGLE *xcRealloc2xBiggerTriangl(TRIANGLE *vec, int *size); extern LINE *xcRealloc2xBiggerLINE(LINE *vec, int *size); #endif /* --- readPlvertex.c --- */ extern void ReadPlvertex123( int type, int islide ); /* --- isoline.c ---*/ int IsoLine2D(int obj, int cb, int fn, int nx, int ny); /* --- paraSize.c --- */ extern double DetermineParapipedSized(double *vec1, double *vec2, double *vec3, double *orig); extern float DetermineParapipedSize(float *vec1, float *vec2, float *vec3, float *orig); extern float DetermineParalleSize(float *vec1, float *vec2, float *orig); extern double papipedMaxDiagSize(double v0[3], double v1[3], double v2[3]); /* --- xcIsoSpaceSel.c --- */ extern void IsoSpaceSel_Parallelogram(void); extern void IsoSpaceSel_3D(void); #ifdef _TCL extern int XC_IsoSpaceSelCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* --- xcWigner.c --- */ extern int XC_WignerCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); #endif /* _TCL */ /* --- cells.c --- */ extern void CellTypes(void); /* --- xcTogl.c --- */ #ifdef TOGL_H /* xcTogl.c */ extern int xcToglCreateFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern int xcToglReshapeFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern int xcToglDestroyFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern int xcToglTimerFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern int XC_B1MotionCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ShiftB1MotionCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_B2MotionCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ButtonReleaseCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif /* datagrid.c */ extern void CloseGridList(void); #ifdef XC_CPP_STRUCT extern struct DATAGRID *FindDataGrid(int index); #endif extern int GetNumberOfGridBlocks(void); extern void NewGridList(int gridtype, FILE *gridFP); extern FILE *MaybeOpenDataGridFile(char *mode); extern void CloseDataGridFile(void); extern void SetDataGridCommentLine(char *line); extern int ReadDataGrid(FILE *fp, FILE *gridFP, int gridtype, char *ident); extern int ReadBandGrid(FILE *fp, FILE *gridFP, int gridtype, char *ident); extern int WriteDataGrid(FILE *fp, int gridtype, const char *ident, int obj); /* --- xcColorScheme.c --- */ extern void LoadAtmCol(const int flag); #ifdef _TCL extern int XC_ColorschemeCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); /* --- sInfo.c --- */ extern void Set_sInfoArray( Tcl_Interp *interp ); /* --- xcIsoDataGrid.c --- */ extern int XC_IsoDataGridCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* --- xcReadXSF.c --- */ extern int XC_ReadXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* --- xcF3toI4.c --- */ extern int XC_F3toI4Cmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* --- xcFractCoor.c --- */ extern int XC_FractCoorCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif /* _TCL */ void GetFractionalCoor(double ivec[][4], float coor[4], float frcoor[]); /* --- isosurface.c ---*/ #ifdef XC_CPP_ISOSURF extern ISOSURFACE *FindIsoSurf(int index); extern void AddToIsoSurfList(ISOSURFACE *g); extern int NewIsoSurf(void); #endif /* --- clip.c --- */ #ifdef XC_CPP_XYZ extern int ClipFacet(XYZ *p, XYZ n, XYZ p0); extern int ClipSimple(XYZ *p, XYZ n, XYZ p0); #endif /* --- forces.c --- */ extern void MallocForceVectors(void); #ifdef XC_CPP_VECTOR extern void SetForceVectorsCoor( ForceVector *fvPtr, double (*fvec)[3], RenderVectors *rvec ); #endif extern void xcRenderVectorForces(void); /* --- xcForces.c --- */ #ifdef _TCL extern int XC_ForcesCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); #endif extern void BuildForceVectors(ForceVector *fvPtr); /* gl2psPrintTogl.c */ #ifdef TOGL_H /* gl2psPrintTogl.c */ extern int CRY_gl2psPrintToglCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* ppmPrintTogl.c */ extern int CRY_Dump2PpmCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int Togl_DumpToPpmFile(Togl *togl, const char *filename); extern int Togl_DumpToEpsFile(Togl *togl, const char *filename, int inColor, void (*user_redraw)(const Togl *)); /* togl_ppm.c */ extern int Togl_DumpToPpmFile(struct Togl *togl, const char *filename); #endif /* lcasi.c */ extern void cryError(int status, char *function, char *message); extern unsigned char **cryRegPeriodInterpolator_uc_LCASI2D(int n[2], int degree[2], unsigned char **src); extern void cryRegPeriodInterpolate_uc_LCASI1D(int N, int DEGREE, unsigned char *src, unsigned char *dst); extern void cryRegPeriodInterpolate_uc_LCASI2D(int N1, int N2, int DEGREE1, int DEGREE2, unsigned char **src, unsigned char **dst); /* lcasif.c */ extern float **cryRegPeriodInterpolator_f_LCASI2D(int n[2], int degree[2], float **src); extern void cryRegPeriodInterpolate_f_LCASI1D(int N, int DEGREE, float *src, float *dst); extern void cryRegPeriodInterpolate_f_LCASI2D(int N1, int N2, int DEGREE1, int DEGREE2, float **src, float **dst); /* xcFont.c */ #ifdef TOGL_H extern int XC_SetFontCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_SetAtomLabelCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ClearAtomLabelCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_QueryFontCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif extern void xcFont_PrintString(const char *s); extern void xcTkFontFreeAll(void); /* cryNewContext.c */ #ifdef TOGL_H extern NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl); extern NEW_WIN_CONTEXT *FindWinContext(int index); extern void DestroyWinContext(struct Togl *togl); extern void AddToWinContext(NEW_WIN_CONTEXT *g); extern int NewWinContext(void); extern void cryNewToglInit(struct Togl *togl); #endif /* isoInterpolate.c */ extern void isoInterpolate(int degree); /* crySetProj.c */ #ifdef TOGL_H extern void crySetProjection(NEW_WIN_CONTEXT *wc, struct Togl *togl); #endif /* cryTransform.c */ #ifdef TOGL_H extern int cryRotateXY(NEW_WIN_CONTEXT *wc, double fiX, double fiY); #endif /* xcMolSurf.c */ #ifdef MOLSURF_H extern MOL_SURF *FindMolSurf(int index); extern int MolSurfGrid(MOL_SURF *mols, float ***molgrid); #endif extern int NewMolSurf(void); #ifdef ISOSURF_H extern void MolSurfGridAtomicColor(ISOSURFACE *iso, float mols_d); #endif /* crySurf.c */ #if defined (MOLSURF_H) && defined (TOGL_H) extern int FindSurfaceOfWindow(NEW_WIN_CONTEXT *wc, MOL_SURF *mols); #endif /* fs.c */ #if defined (XC_CPP_STRUCT) && defined (MOLSURF_H) extern int fsReadBand(struct DATAGRID *grid, MOL_SURF *mols); #endif #if defined (TOGL_H) && defined (ISOSURF_H) extern void CropBz(NEW_WIN_CONTEXT *wc, ISOSURFACE *iso); extern void CropBz_New(NEW_WIN_CONTEXT *wc, ISOSURFACE *iso); #endif /* crySurfArgs.c */ #ifdef MOLSURF_H extern int VerifyReadSurfOpt(const char *option, size_t n, struct READSURF_OPT *opts, char *argv[]); #endif #if defined(_TCL) && defined(MOLSURF_H) && defined(TOGL_H) extern int cryReadSurfARGS(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[], NEW_WIN_CONTEXT *wc, MOL_SURF *mols, struct READSURF_OPT *opt); extern int ReadFS_ARGS(Tcl_Interp *interp, int argc, const char *argv[], NEW_WIN_CONTEXT *wc, MOL_SURF *mols); #endif /* fog.c */ #ifdef __gl_h_ /* fog.c */ #ifdef TOGL_H extern void xcFog(struct Togl *togl, GLboolean make_fog, GLboolean perspective); #endif extern void xcAntiAlias(GLboolean make_antialias); #endif /* writeXSF.c */ #ifdef _TCL extern int XC_WriteXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_WriteBandXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif /* hbonds.c */ extern void make_H_Bonds(void); extern void xcRenderHbonds3D(void); /*extern VEC3d *xcReallocVEC3d(VEC3d *vec, int old_nmemb, int new_nmemb);*/ /* xcHBonds.c */ #ifdef _TCL int XC_HBondsCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); #endif /* linear.c */ extern float ***cryGeneralGridRegPeriodInterpolator_f_Linear3D(int n[3], int degree[3], float ***src); /* realTimeMovie.c */ #ifdef TOGL_H extern int CRY_RealTimeMovieCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern void createMoviePPMFrame(struct Togl *togl); #endif /* fft3d.c */ extern float ***general_grid_fft_interpolator_tensor3f(int n[3], int degree[3], float ***src); extern double *fft3d_interpolator(int n1, int n2, int n3, int n1new, int n2new, int n3new, double *func); extern void fft3d_interpolate(int n1, int n2, int n3, int n1new, int n2new, int n3new, double *func, double *result); /* shank3d.c */ extern float ***general_grid_shankland_interpolator_tensor3f(int n[3], int degree[3], float ***src); extern double *shankland3d_interpolator(int n1, int n2, int n3, int n1new, int n2new, int n3new, double *func, double (*roughnessFunc)(double m2, double sigma), double log10_damp); extern void shankland3d_interpolate(int n1, int n2, int n3, int n1new, int n2new, int n3new, double *func, double (*roughnessFunc)(double m2, double sigma), double log10_damp, double *result); xcrysden-1.6.2/C/vector.h0000644000175000017500000000365711712736221013725 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/vector.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define XC_CPP_VECTOR #define VECTOR_ARROWSIZE 0.2 #define VECTOR_THICKF 1.3 /* basic vector thickness factor */ #define VECTOR_ARRTHICKF 1.5 #define VECTOR_PRIMITIVE 1 #define VECTOR_CONVENTIONAL 2 #define VECTOR_SUPERCELL 4 typedef struct { GLdouble coor[3][3]; /* vec[#].coor[x/y/z][begin/arrow/end] */ GLdouble vecthick; GLdouble vecx; GLdouble vecy; GLdouble vecz; GLdouble vecfi; GLdouble vecl; GLdouble arrthick; GLdouble arrx; GLdouble arry; GLdouble arrz; GLdouble arrfi; GLdouble arrl; } RenderVectors; RenderVectors rnd_pvec[3]; /* primitive vectors */ RenderVectors rnd_cvec[3]; /* conventional vectors */ RenderVectors rnd_scvec[3]; /* supercell vectors */ typedef struct { GLfloat vertex[6][4][3]; GLfloat normal[6][4][3]; } CellCage; CellCage prim_cage; /* primitive cell-cage */ CellCage conv_cage; /* conventional cell-cage */ CellCage sc_cage; /* supercell cell-cage */ xcrysden-1.6.2/C/xcBz.c0000644000175000017500000013564513516065502013330 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcBz.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include "struct.h" #include "xcfunc.h" #include "bz.h" typedef struct { int points; /* 0/1 whether to render special points */ int vectors; /* 0/1 whether to render reciprocal vectors */ int last_points; /* what was last state for points (used by BzRenderBZ - to recover when points should be rendered, if the points have been previously deleted); just for special-points */ int last_vectors; /* the same for vectors */ } BZ_STATE; BZ_STATE bz_state[2]; static char canvasname[2][256]; static Tk_Window canvaswin[2]; static float canvassize[2]; static float canvas_offset[2] = { BZ_OFFSET, BZ_OFFSET }; int XC_BzCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); static int BzInitBZ( int typ ); static void BzViewPortBZ(Tcl_Interp *interp, int typ); static int BzRenderBZ(Tcl_Interp *interp, int typ); static void BzCreateSelLine( Tcl_Interp *interp, Tcl_CmdInfo info, char *argv[], int typ, int i ); static void BzUpdateSelLine( Tcl_Interp *interp, Tcl_CmdInfo info, char *argv[], int typ, int i, char *tag ); static void BzRotateBZ( int typ, float x, float y, float z ); static void BzDegRotateBZ( int typ, float fiX, float fiY, float fiZ ); static void BzGetCoor( int typ, int pID, float coor[] ); static int BzGetISS( int typ ); static int BzGetMinMult( int a, int b ); /***************************************************************************** * xc_bz exists (prim|conv) * init (prim|conv) ?options_in_one_piece? * render * viewport * rotate dx dy dz * zoom factor * degrotate (n_edgepoint | n_linepoint | n_polypoint | * npoly | npoint | last_selected | nselected) * select pointnumber * deselect * deselectall * state points (0|1) * vectors (0|1) * iss *****************************************************************************/ int XC_BzCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Tk_Window tkwin = (Tk_Window) clientData; int i, typ; char *result = Tcl_Alloc( sizeof(char) * 64); /* at least three arguments must be present */ /* debuging */ /* printf("COMMAND:: ",NULL); */ /* for(i=0; i minor BZ */ printf("zoom step == %f\n", f); canvas_offset[typ] *= (float) (1.0 - f); BzViewPortBZ(interp, typ); BzRenderBZ(interp, typ); } /******* * GET * *******/ else if ( strcmp( argv[1], "get") == 0 ) { if ( strncmp( argv[3], "n_edg", 5) == 0 ) { sprintf(result, "%d", bz[typ].n_edgepoint); } else if ( strncmp( argv[3], "n_lin", 5) == 0 ) { sprintf(result, "%d", bz[typ].n_linepoint); } else if ( strncmp( argv[3], "n_pol", 5) == 0 ) { sprintf(result, "%d", bz[typ].n_polypoint); } else if ( strncmp( argv[3], "npoly", 5) == 0 ) { sprintf(result, "%d", bz[typ].npoly); } else if ( strncmp( argv[3], "npoin", 5) == 0 ) { sprintf(result, "%d", bz[typ].npoint); } else if ( strncmp( argv[3], "nsele", 5) == 0 ) { sprintf(result, "%d", bz[typ].nselected); } else if ( strncmp( argv[3], "last_", 5) == 0 ) { if ( bz[typ].nselected > 0 ) sprintf(result, "%d", bz[typ].selectedID[ bz[typ].nselected - 1]); else sprintf(result, "-1"); } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown option \"%s\", must be one of n_edgepoint, n_linepoint, n_polypoint, npoly, npoint, nselected, last_selected; while executing %s %s %s %s", argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } Tcl_SetResult(interp, result, TCL_DYNAMIC); } /********** * SELECT * **********/ else if ( strcmp( argv[1], "select" ) == 0 ) { int pID; float *coor; if ( Tcl_GetInt(interp, argv[3], &pID) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "expected int, but got \"%s\"; while executing %s %s %s %s", argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( pID < 0 || pID >= bz[typ].npoint) { char rss[1024]; snprintf(rss, sizeof(rss), "selected point #\"%s\" is out of range, must be within [0,%d); while executing %s %s %s %s", argv[3], bz[typ].npoint, argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } bz[typ].selectedID[ bz[typ].nselected ] = pID; /* get the coordinates of selected points */ BzGetCoor( typ, pID, bz[typ].reccoor[bz[typ].nselected] ); bz[typ].nselected++; if ( bz[typ].nselected > 1 ) { int i, j; int isl = bz[typ].n_sline; /* get line coordinates */ for (j=0; j<2; j++) { for (i=0; i<3; i++) { bz[typ].sline[isl][j*3+i] = bz[typ].point[ bz[typ].selectedID[bz[typ].nselected-2+j] ][i]; bz[typ].rot_sline[isl][j*3+i] = bz[typ].point[ bz[typ].selectedID[bz[typ].nselected-2+j] ][i]; } bz[typ].slinetype[isl] |= bz[typ].pointtype[ bz[typ].selectedID[bz[typ].nselected-2+j] ]; if ( bz[typ].pointtype[ bz[typ].selectedID[bz[typ].nselected-2+j] ] == BZ_LINEPOINT ) { bz[typ].sline_index[isl][0] = bz[typ].linepoint_index[ bz[typ].selectedID[bz[typ].nselected-2+j] ][0]; bz[typ].sline_index[isl][1] = bz[typ].linepoint_index[ bz[typ].selectedID[bz[typ].nselected-2+j] ][1]; } } bz[typ].nZpoint++; for (i=0; i<3; i++) bz[typ].slcenter[isl][i] = (bz[typ].sline[isl][i] + bz[typ].sline[isl][i+3]) / 2.0; bz[typ].n_sline++; } BzDegRotateBZ(typ, 0.0, 0.0, 0.0); BzViewPortBZ(interp, typ); BzRenderBZ(interp, typ); /* update the Bz($can,nselected) tcl variable, and the coor of selected points; thatwhy we will return their values */ coor = bz[typ].reccoor[bz[typ].nselected-1]; sprintf(result, "%d %f %f %f", bz[typ].nselected, coor[0], coor[1], coor[2]); Tcl_SetResult(interp, result, TCL_DYNAMIC); } /************ * DESELECT * ************/ else if ( strcmp( argv[1], "deselect" ) == 0 ) { char tag[10]; if ( bz[typ].nselected > 1 ) { bz[typ].n_sline--; bz[typ].nZpoint--; bz[typ].sline_is_rendered[ bz[typ].n_sline ] = 0; sprintf(tag, "sln%d", bz[typ].n_sline); /* delete selline */ if ( Tcl_VarEval( interp, canvasname[typ], " delete ", tag, (char *)NULL ) == TCL_ERROR ) return TCL_ERROR; } if ( bz[typ].nselected > 0 ) { bz[typ].nselected--; bz[typ].selected_is_rendered[ bz[typ].nselected ] = 0; sprintf(tag, "spt%d", bz[typ].nselected); if ( Tcl_VarEval( interp, canvasname[typ], " delete ", tag, (char *)NULL ) == TCL_ERROR ) return TCL_ERROR; BzRenderBZ(interp, typ); /* update the Bz($can,nselected) tcl variable, thatwhy we will return its value */ } sprintf(result, "%d", bz[typ].nselected); Tcl_SetResult(interp, result, TCL_DYNAMIC); } /*************** * DESELECTALL * ***************/ else if ( strcmp( argv[1], "deselectall" ) == 0 ) { /* first handle sellines */ for (i=0; i= 0.49 ) { ps = BZ_BOLD_POINT_SIZE; } ipoly++; WriteArgv( argv, &argc, "sssfss", "-fill", "#000000", "-width", ps, "-tags", tag); Tcl_ResetResult( interp ); (*info.proc)(info.clientData, interp, argc, (const char**) argv); //printf("LINE:: polyID:: %s p%d\n",interp->result,ip); if ( xcr.dim == 3) { /* now render POLYPOINT */ argc = 1; WriteArgv( argv, &argc, "ssffffffff", "create", "polygon", bz[typ].vp_points[ii][0] - ps, bz[typ].vp_points[ii][1], bz[typ].vp_points[ii][0], bz[typ].vp_points[ii][1] - ps, bz[typ].vp_points[ii][0] + ps, bz[typ].vp_points[ii][1], bz[typ].vp_points[ii][0], bz[typ].vp_points[ii][1] + ps); printf("OBJECT DETAILS: polypoint, argc=%d\n", argc); sprintf(tag, "point pt%d", ii); WriteArgv( argv, &argc, "ssssss", "-fill", "#000000", "-width", "1", "-tags", tag); xcdebug("before info.proc"); (*info.proc)(info.clientData, interp, argc, (const char **) argv); xcdebug("after info.proc"); } } else { /* * RENDER non POLYPOINT */ if ( !( xcr.dim == 1 && bz[typ].pointtype[ii] == BZ_LINEPOINT ) ) { /* for xcr.dim == 1 the only BZ_LINEPOINT is BZ_CENTERPOINT */ argc = 1; WriteArgv( argv, &argc, "ss", "create", "oval"); ps = BZ_THIN_POINT_SIZE; color = "#000000"; if ( (float) i / bz[typ].npoint >= 0.49 ) ps = BZ_BOLD_POINT_SIZE; if ( xcr.dim < 3 && bz[typ].rot_points[ii][2] > -1.0e-6 ) ps = BZ_BOLD_POINT_SIZE; if ( bz[typ].pointtype[ii] == BZ_CENTERPOINT ) { ps = BZ_CENTERPOINT_SIZE; color = "#ff0000"; } WriteArgv( argv, &argc, "ffff", bz[typ].vp_points[ii][0] - ps, bz[typ].vp_points[ii][1] - ps, bz[typ].vp_points[ii][0] + ps, bz[typ].vp_points[ii][1] + ps); printf("OBJECT DETAILS: point\n, argc=%d\n", argc); sprintf(tag, "point pt%d", ii ); WriteArgv( argv, &argc, "ssssssss", "-fill", color, "-outline", color, "-width", "1", "-tags", tag); xcdebug("before info.proc"); (*info.proc)(info.clientData, interp, argc, (const char**) argv); xcdebug("after info.proc"); } } } } } else { float vp_points[2]; /********************** * UPDATE COORDINATES * **********************/ for(i=0; i i=%d, ii=%d, typ ==%d\n", */ /* i, ii, bz[typ].pointtype[ii]); */ /* fflush(stdout); */ if ( bz[typ].pointtype[ii] == BZ_POLYPOINT ) { /* first update POLYGON coordinates, then update points */ ip = bz[typ].polyindex[ii]; argc = 1; sprintf(tag, "p%d", ip); WriteArgv( argv, &argc, "ss", "coords", tag); /* printf("ii=%d; polygon number: %d\n",ii, ip); */ /* fflush(stdout); */ for(j=0; j 0.5 ) { ps = BZ_BOLD_POINT_SIZE; ps1 = BZ_BOLD_POLYGON_WIDTH; } ipoly++; /* update the width & outline of polygons */ argc = 1; WriteArgv( argv, &argc, "sssf", "itemconfigure", tag, "-width", ps1); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* change the stack order */ argc = 1; WriteArgv( argv, &argc, "sss", "raise", tag, "all"); (*info.proc)(info.clientData, interp, argc, (const char**) argv); if ( xcr.dim == 3 ) { /* update POLYPOINT */ argc = 1; sprintf(tag,"pt%d",ii); WriteArgv( argv, &argc, "ssffffffff", "coords", tag, vp_points[0] - ps, vp_points[1], vp_points[0], vp_points[1] - ps, vp_points[0] + ps, vp_points[1], vp_points[0], vp_points[1] + ps); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* change the stack order */ argc = 1; WriteArgv( argv, &argc, "sss", "raise", tag, "all"); (*info.proc)(info.clientData, interp, argc, (const char**) argv); } } else { /* * non POLYPOINT */ if ( !( xcr.dim == 1 && bz[typ].pointtype[ii] == BZ_LINEPOINT ) ) { /* for xcr.dim == 1 the only BZ_LINEPOINT is BZ_CENTERPOINT */ ps = BZ_THIN_POINT_SIZE; ps1 = BZ_THIN_POLYGON_WIDTH; color = "#000000"; if ( (float) i / bz[typ].npoint > 0.5 ) { ps = BZ_BOLD_POINT_SIZE; ps1 = BZ_BOLD_POLYGON_WIDTH; } if ( xcr.dim < 3 && bz[typ].rot_points[ii][2] > -1.0e-6 ) ps = BZ_BOLD_POINT_SIZE; if ( bz[typ].pointtype[ii] == BZ_CENTERPOINT ) { color = "#ff0000"; ps = BZ_CENTERPOINT_SIZE; } argc = 1; sprintf(tag, "pt%d", ii); WriteArgv( argv, &argc, "ssffff", "coords", tag, vp_points[0] - ps, vp_points[1] - ps, vp_points[0] + ps, vp_points[1] + ps); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* change the stack order */ argc = 1; sprintf(tag, "pt%d", ii); WriteArgv( argv, &argc, "sss", "raise", tag, "all"); (*info.proc)(info.clientData, interp, argc, (const char**) argv); } } } else if ( iorder[i+1] > bz[typ].npoint && iorder[i+1] <= bz[typ].nZpoint ) { /* * it is a non EDGE-LINE seline */ ii = iorder[i + 1] - bz[typ].npoint - 1; if ( !((bz[typ].slinetype[ii] & BZ_LINEPOINT) && (bz[typ].slinetype[ii] & BZ_EDGEPOINT)) ) { argc = 1; printf("ii = %d\n",ii); fflush(stdout); if (!bz[typ].sline_is_rendered[ii]) { BzCreateSelLine( interp, info, argv, typ, ii ); } else { sprintf(tag, "all"); BzUpdateSelLine( interp, info, argv, typ, ii, tag ); } } } else if ( iorder[i+1] > bz[typ].nZpoint ) { /********************* * render RECVECTORS * *********************/ if ( bz_state[typ].vectors ) { if ( !bz[typ].recvec_is_rendered ) { char *arrow, *text; if ( iorder[i+1] <= bz[typ].nZpoint+xcr.dim) { j = iorder[i+1] - (bz[typ].nZpoint + 1); argc = 1; /********************************* * create 1st part of RECVECTORS * *********************************/ WriteArgv( argv, &argc, "ssffff", "create", "line", bz[typ].vp_recvec[j][0], bz[typ].vp_recvec[j][1], bz[typ].vp_recvec[j+3][0], bz[typ].vp_recvec[j+3][1]); ps = 2.0; if ( bz[typ].rot_recvec[j][2] < 0.0 ) ps = 1.0; sprintf(tag, "vector v1_%d", j); WriteArgv( argv, &argc, "sssfss", "-fill", "#0000ff", "-width", ps, "-tags", tag); (*info.proc)(info.clientData, interp, argc, (const char**) argv); } else { j = iorder[i+1] - (bz[typ].nZpoint + xcr.dim + 1); /* 2nd part of vector */ ps = 2.0; arrow = "14 15 4"; if ( bz[typ].rot_recvec[j][2] < 0.0 ) { ps = 1.0; arrow = "10 11 3"; } argc = 1; WriteArgv( argv, &argc, "ssffff", "create", "line", bz[typ].vp_recvec[j+3][0], bz[typ].vp_recvec[j+3][1], bz[typ].vp_recvec[j+6][0], bz[typ].vp_recvec[j+6][1]); sprintf(tag, "vector v2_%d", j); WriteArgv( argv, &argc, "sssssssfss", "-fill", "#0000ff", "-arrow", "last", "-arrowshape", arrow, "-width", ps, "-tags", tag); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* * create label of recvectors */ argc = 1; WriteArgv( argv, &argc, "ssff", "create", "text", bz[typ].vp_recvec[j+6][0] - 5, bz[typ].vp_recvec[j+6][1]); sprintf(tag, "vector t%d", j); if (j == 0) text = "a*"; else if (j == 1) text = "b*"; else text = "c*"; /* if (j == 2) */ WriteArgv( argv, &argc, "ssssssss", "-fill", "#0000ff", "-anchor", "ne", "-text", text, "-tags", tag); (*info.proc)(info.clientData, interp, argc, (const char**) argv); } } else { /********************* * update RECVECTORS * *********************/ char *arrow; if ( iorder[i+1] <= bz[typ].nZpoint+xcr.dim) { j = iorder[i+1] - (bz[typ].nZpoint + 1); /* update 1st part of RECVECTORS */ argc = 1; sprintf(tag, "v1_%d", j); WriteArgv( argv, &argc, "ssffff", "coords", tag, bz[typ].vp_recvec[j][0], bz[typ].vp_recvec[j][1], bz[typ].vp_recvec[j+3][0], bz[typ].vp_recvec[j+3][1]); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* reconfigure recvectors */ argc = 1; sprintf(tag, "v1_%d", j); ps = 2.0; if ( bz[typ].rot_recvec[j][2] < 0.0 ) ps = 1.0; WriteArgv( argv, &argc, "sssf", "itemconfigure", tag, "-width", ps); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* * get the right stack order for 1st part */ argc = 1; sprintf(tag, "v1_%d", j); WriteArgv( argv, &argc, "sss", "raise", tag, "all" ); (*info.proc)(info.clientData, interp, argc, (const char**) argv); } else { j = iorder[i+1] - (bz[typ].nZpoint + xcr.dim + 1); /* update 2nd part of RECVECTORS */ argc = 1; sprintf(tag, "v2_%d", j); WriteArgv( argv, &argc, "ssffff", "coords", tag, bz[typ].vp_recvec[j+3][0], bz[typ].vp_recvec[j+3][1], bz[typ].vp_recvec[j+6][0], bz[typ].vp_recvec[j+6][1]); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* reconfigure recvectors */ argc = 1; ps = 2.0; arrow = "14 15 4"; if ( bz[typ].rot_recvec[j][2] < 0.0 ) { ps = 1.0; arrow = "10 11 3"; } argc = 1; sprintf(tag, "v2_%d", j); WriteArgv( argv, &argc, "sssssf", "itemconfigure", tag, "-arrowshape", arrow, "-width", ps); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* * get the right stack order for 2nd part */ argc = 1; WriteArgv( argv, &argc, "sss", "raise", tag, "all" ); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* * update label of recvector */ argc = 1; sprintf(tag, "t%d", j); WriteArgv( argv, &argc, "ssff", "coords", tag, bz[typ].vp_recvec[j+6][0] - 5, bz[typ].vp_recvec[j+6][1]); (*info.proc)(info.clientData, interp, argc, (const char**) argv); /* printf("RECVEC:: iorder i=%d, ii=%d, v(z)=%f, p(z)=%f\n", i,ii, bz[typ].rot_recvec[i][2], bz[typ].rot_points[ii][2]); */ /* printf("RECVEC:: iorder i=%d, ii=%d, v(z)=%f, p(z)=%f\n", i, ii, bz[typ].rot_recvec[i][2], bz[typ].rot_points[ii][2]); fflush(stdout); */ argc = 1; sprintf(tag, "t%d", j); WriteArgv( argv, &argc, "sss", "raise", tag, "all" ); (*info.proc)(info.clientData, interp, argc, (const char**) argv); } } } } } } if ( bz_state[typ].vectors ) bz[typ].recvec_is_rendered = 1; if ( !bz_state[typ].vectors && bz[typ].recvec_is_rendered ) { /* * delete recvectors */ /* recvectors should be deleted */ Tcl_VarEval(interp, argv[0], " delete", " vector", NULL); bz[typ].recvec_is_rendered = 0; } /* render selected points */ for (i=0; i EDGE-LINE slines * *************************/ for (i=0; i sum0 ) pID = pID1; printf("LINE:: pID=%d, pID1=%d, pID2=%d; %f %f\n", pID, pID0, pID1, sum0, sum1); fflush(stdout); } sprintf(tag, "p%d", pID); BzUpdateSelLine( interp, info, argv, typ, i, tag ); } } bz[typ].isrendered = 1; bz_state[typ].last_points = bz_state[typ].points; bz_state[typ].last_vectors = bz_state[typ].vectors; xcdebug ("end of BzRenderBZ #1"); free((FREE_ARG) tag ); for(i=0; i (1.0 - tol) ) { imen[n + l] = 1; } else { for (i=1; i<=BZ_ISS; i++) { f = point * (double) i; f = fabs(f - roundf(f)); if ( f < min ) { min = f; imin = i; } if ( f < tol ) { imen[n + l] = i; break; } } /* if imen[] was not found; assign imen[] := imin */ if ( imen[n + l] == 0 ) imen[n + l] = imin; } } } /* /\* t.k. begin: old corrected algorithm *\/ */ /* for (k=0; k (1.0 - tol) ) { */ /* imen[n + l] = 1; */ /* /\*break;*\/ */ /* } else { */ /* for (i=1; i<=BZ_ISS; i++) */ /* for (j=1; jb */ if ( b > a ) { c = a; a = b; b = c; } if ( b == 0 ) { return a; } c=1; /* now: a is greater than b */ for (i=1; i<=b; i++) if ( (a * i % b) == 0 ) { c = i; break; } return a * c; } xcrysden-1.6.2/C/polygonise.c0000644000175000017500000012447013525475161014612 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/polygonise.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ /***********************************************/ /* date Fri Apr 7 14:27:00 CEST 2000 */ /* MAJOR reprograming of polygonalization !!!! */ /***********************************************/ /* pri elektronski gostoti pozitivne normale kazejo v notranjost; zato sem dal * nml -= mnl_tmp; */ #include #include #include #include "struct.h" #include "isosurf.h" #include "memory.h" #include "xcfunc.h" #define MINTOL_P 1e-12 #define FLOAT_MINTOL 3.0e-8 #define ASSIGN_GRID2IJK(a,b) a.i = b.ix; a.j = b.iy; a.k = b.iz #define EQUAL_VERTICES(a,b) ( (fabs(a.x-b.x) < FLOAT_MINTOL && fabs(a.y-b.y) < FLOAT_MINTOL && fabs(a.z-b.z) < FLOAT_MINTOL) ) #define GET_INDEX(i,j,k,N,M,L) ( (k + L*(j + M*i)) ) #define XYZ_A_SUB_B(dst,a,b) \ do { \ dst.x = a.x - b.x; \ dst.y = a.y - b.y; \ dst.z = a.z - b.z; \ } while(0) extern ISOSTATE isostate; /*---------------------------------------------------------------------------*/ extern void VertexRecognise(GRID grd, int ntriangl, TRIANGLE *triangles, int *triangl_status, TRIG_INFO *tri2verIN, XYZ *vertex, int *vertex_status, VERT2TRIG_INFO (*ver2triIN)[MAX_VERTEX_COORDINATION], int *nver2triIN, GRID_INFO *grid_info, int *nvertex); extern void SurfSmoothing(int nstep, float weight, XYZ *vertex, int *vertex_status, VERT2TRIG_INFO (*ver2triIN)[MAX_VERTEX_COORDINATION], TRIG_INFO *tri2verIN, int *nver2triIN, int nvertex); extern void SurfNmlAver(int ntriangl, int nvertex, XYZ *nml, XYZ *vertex, TRIG_INFO *tri2verIN, float *sign, int is_tetrahedral); /*---------------------------------------------------------------------------*/ void MarchingCubes(float isolevel, int ilevel, int smooth_nstep, float smooth_weight, int algorithm, int shade_model, int normals_model); int Polygonise(GRIDCELL grid, float isolevel, GRID ijk, TRIANGLE *triangles, TRIG_INFO *trig_info); XYZ VertexInterp(float isolevel, XYZ p1, XYZ p2, float valp1, float valp2); TRIG_INFO *xcRealloc2xBiggerTrigInfo(TRIG_INFO *vec, int *size); static VERT2TRIG_INFO (*ver2triIN_P)[MAX_VERTEX_COORDINATION]; static int *nver2triIN_P; static int *vertex_status_P, *triangl_status_P; static float *sign_P; void WrapperSurfSmoothing(int ilevel) { /* perform smoothing */ SurfSmoothing(isodata.smoothsteps, isodata.smoothweight, vertex[ilevel], vertex_status_P, ver2triIN_P, tri2verIN[ilevel], nver2triIN_P, surf.numV[ilevel]); SurfNmlAver(surf.numT[ilevel], surf.numV[ilevel], normal[ilevel], vertex[ilevel], tri2verIN[ilevel], sign_P, 0); } void MarchingCubes(float isolevel, int ilevel, int smooth_nstep, float smooth_weight, int algorithm, int shade_model, int normals_model) { register int i, ix1, iy1, iz1; int mem_size, ntriangl, index, new_maxelem, ivrt; GRIDCELL grid; GRID_INFO *grid_info; TRIANGLE *triangles; VERT2TRIG_INFO (*ver2triIN)[MAX_VERTEX_COORDINATION]; int *nver2triIN, nvertex; int *vertex_status, *triangl_status; float *sign=NULL; XYZ spanning_vec[3]; mem_size = MAX(newgrd.nx, newgrd.ny) * MAX(newgrd.ny, newgrd.nz); /* ----------------------------------------------------------------------- * INITIALIZATIONS * ----------------------------------------------------------------------- */ surf.numT[ilevel] = 0; surf.numV[ilevel] = 0; isostate.max_n_triangl[ilevel] = mem_size; triangles = (TRIANGLE *) malloc( (size_t) sizeof(TRIANGLE) * isostate.max_n_triangl[ilevel] ); if ( !triangles ) xcError("allocation error for triangles"); isostate.triangl_malloc[ilevel] = 1; /* not used any more !!! */ if ( isostate.tri2verIN_malloc[ilevel] ) free((FREE_ARG) tri2verIN[ilevel] ); tri2verIN[ilevel] = (TRIG_INFO *) malloc((size_t)mem_size * sizeof(TRIG_INFO)); isostate.tri2verIN_malloc[ilevel] = 1; grid_info = (GRID_INFO *) malloc((size_t) (newgrd.nx*newgrd.ny*newgrd.nz) * sizeof(GRID_INFO)); if ( !tri2verIN[ilevel] || !grid_info) xcError("allocation error in Marching Cubes"); ntriangl=0; ix1 = newgrd.nx - 1; iy1 = newgrd.ny - 1; iz1 = newgrd.nz - 1; /* calculate normals at the grid points */ if ( normals_model == ISOSURF_NORMALS_GRADIENT ) gridNormals (gridvertex, newgrd); XYZ_A_SUB_B(spanning_vec[0], gridvertex[ix1][0][0].p, gridvertex[0][0][0].p); XYZ_A_SUB_B(spanning_vec[1], gridvertex[0][iy1][0].p, gridvertex[0][0][0].p); XYZ_A_SUB_B(spanning_vec[2], gridvertex[0][0][iz1].p, gridvertex[0][0][0].p); /* do the marching ... */ for (grd.ix = 0; grd.ix < ix1; grd.ix++) { for (grd.iy = 0; grd.iy < iy1; grd.iy++) { for (grd.iz = 0; grd.iz < iz1; grd.iz++) { new_maxelem = ( algorithm == ISOSURF_MARCHING_CUBES ? 5 : 12 ); /* take care of reallocation if necessary !!! */ if ( ntriangl + new_maxelem >= isostate.max_n_triangl[ilevel] ) { triangles = xcRealloc2xBiggerTriangl( triangles, &isostate.max_n_triangl[ilevel] ); tri2verIN[ilevel] = xcRealloc2xBiggerTrigInfo( tri2verIN[ilevel], &mem_size ); } grid.p[0] = gridvertex[grd.ix ][grd.iy ][grd.iz ].p; grid.val[0] = gridvertex[grd.ix ][grd.iy ][grd.iz ].val; grid.p[1] = gridvertex[grd.ix ][grd.iy+1][grd.iz ].p; grid.val[1] = gridvertex[grd.ix ][grd.iy+1][grd.iz ].val; grid.p[2] = gridvertex[grd.ix+1][grd.iy+1][grd.iz ].p; grid.val[2] = gridvertex[grd.ix+1][grd.iy+1][grd.iz ].val; grid.p[3] = gridvertex[grd.ix+1][grd.iy ][grd.iz ].p; grid.val[3] = gridvertex[grd.ix+1][grd.iy ][grd.iz ].val; grid.p[4] = gridvertex[grd.ix ][grd.iy ][grd.iz+1].p; grid.val[4] = gridvertex[grd.ix ][grd.iy ][grd.iz+1].val; grid.p[5] = gridvertex[grd.ix ][grd.iy+1][grd.iz+1].p; grid.val[5] = gridvertex[grd.ix ][grd.iy+1][grd.iz+1].val; grid.p[6] = gridvertex[grd.ix+1][grd.iy+1][grd.iz+1].p; grid.val[6] = gridvertex[grd.ix+1][grd.iy+1][grd.iz+1].val; grid.p[7] = gridvertex[grd.ix+1][grd.iy ][grd.iz+1].p; grid.val[7] = gridvertex[grd.ix+1][grd.iy ][grd.iz+1].val; index=GET_INDEX(grd.ix,grd.iy,grd.iz, ix1, iy1, iz1); grid_info[index].t0=ntriangl; if ( algorithm == ISOSURF_MARCHING_CUBES ) { /* ===> POLYGONISE: MarchingCubes <=== */ ntriangl += Polygonise(grid, isolevel, grd, &triangles[ntriangl], (TRIG_INFO *) &tri2verIN[ilevel][ntriangl]); } else { /* ===> POLYGONISE: TetrahedralDecomposition <=== */ ntriangl += PolygoniseTetrahedral(grid, isolevel, grd, &triangles[ntriangl], (TRIG_INFO *) &tri2verIN[ilevel][ntriangl]); } /* TESTING ... */ grid_info[index].nt = ntriangl - grid_info[index].t0; /* grid_info[index].nt = ntriangl - grid_info[index].t0 + 1; */ } /* iz */ } } surf.numT[ilevel] = ntriangl; printf("NUMBER OF TRIANGLES: %d\n",surf.numT[ilevel]); /* malloc space for *vertex & *triangles */ if ( isostate.vertex_malloc[ilevel] && isostate.max_n_vertex[ilevel] < ntriangl*3 ) { free( (FREE_ARG) vertex[ilevel] ); free( (FREE_ARG) normal[ilevel] ); } isostate.max_n_vertex[ilevel] = ntriangl * 3; vertex[ilevel] = (XYZ *) malloc( (size_t) sizeof(VERTEX) * isostate.max_n_vertex[ilevel] ); normal[ilevel] = (XYZ *) malloc( (size_t) sizeof(VERTEX) * isostate.max_n_vertex[ilevel] ); triangl_status = (int *) malloc(ntriangl * sizeof(int)); vertex_status = (int *) malloc(ntriangl*3 * sizeof(int)); nver2triIN = (int *) malloc(ntriangl*3 * sizeof(int)); /*sign = (float *) malloc(triangl * sizeof(float));*/ ver2triIN = (VERT2TRIG_INFO (*)[MAX_VERTEX_COORDINATION]) malloc((size_t )ntriangl*3 * sizeof(VERT2TRIG_INFO [MAX_VERTEX_COORDINATION]) ); if ( !vertex[ilevel] || !normal[ilevel] || !triangl_status || !vertex_status || !nver2triIN ) { xcError("allocation error in routine Marching Cubes !!!"); } isostate.vertex_malloc[ilevel] = 1; if ( shade_model == ISOSURF_SHADE_SMOOTH ) { VertexRecognise(newgrd, ntriangl, triangles, triangl_status, tri2verIN[ilevel], vertex[ilevel], vertex_status, ver2triIN, nver2triIN, grid_info, &nvertex); } else { ivrt = 0; nvertex = 3*ntriangl; for(i=0; i take normal from the triangle center */ /* HERE */ gradient_SurfNml(gridvertex, newgrd, spanning_vec, ntriangl, tri2verIN[ilevel], nvertex, vertex[ilevel], normal[ilevel]); } surf.numV[ilevel] = nvertex; /* assing *_P variables the right memmory locations */ triangl_status_P = triangl_status; vertex_status_P = vertex_status; nver2triIN_P = nver2triIN; sign_P = sign; ver2triIN_P = ver2triIN; /* t.k: there is a mass concerning the orientation of normals; try to remedy it */ if ( normals_model == ISOSURF_NORMALS_TRIANGLE && isodata.cell_orientation == XC_LEFT ) { if ( isolevel < 0.0 ) { /* t.k: it seems that we must revert normals if isolevel is negative */ for (i=0; i 0.0 ) { /* t.k: it seems that we must revert normals if isolevel is positive */ for (i=0; i 0.9) mu = 1.0;*/ /* end */ p.x = p1.x + mu * (p2.x - p1.x); p.y = p1.y + mu * (p2.y - p1.y); p.z = p1.z + mu * (p2.z - p1.z); return(p); } /* ************************************************************************ NOTE: Below are modified routines of the original ones due to Paul Bourke (used with permission). It is enhanced for the present purpose. For the original routine ee "Modelling" on: http://astronomy.swin.edu.au/~pbourke/modelling/ ************************************************************************ Polygonise a tetrahedron given its vertices within a cube This is an alternative algorithm to polygonisegrid. It results in a smoother surface but more triangular facets. + 0 /|\ / | \ / | \ 3 +-------+ 1 \ | / \ | / \ | / \|/ + 2 It's main purpose is still to polygonise a gridded dataset and would normally be called 6 times, one for each tetrahedron making up the grid cell. */ int PolygoniseTetrahedral(GRIDCELL grid, float iso, GRID ijk, TRIANGLE *triangl, TRIG_INFO *trig_info); static int PolygoniseTri(GRIDCELL g, float iso, GRID ijk, TRIANGLE *triangl, TRIG_INFO *trig_info, int v0, int v1, int v2, int v3); int PolygoniseTetrahedral(GRIDCELL grid, float iso, GRID ijk, TRIANGLE *triangl, TRIG_INFO *trig_info) { int ntriangl = 0; /* 6-tetrah. decomposition */ ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],0,2,3,7); ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],0,7,6,2); /*0,7,6,2*/ ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],0,7,4,6); /*0,7,4,6*/ ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],0,6,1,2); ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],0,4,1,6); /* 0,4,1,6*/ ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],5,6,1,4); /* reserve: 4.5.6.1*/ /* 5-tetra decomposition: this doesn't work */ /* ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],0,5,1,2); */ /* ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],0,7,4,5); */ /* ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],7,6,5,2); */ /* ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],0,2,3,7); */ /* ntriangl += PolygoniseTri(grid,iso,ijk,&triangl[ntriangl],&trig_info[ntriangl],0,5,2,7); */ return ntriangl; } static int PolygoniseTri(GRIDCELL g, float iso, GRID ijk, TRIANGLE *triangl, TRIG_INFO *trig_info, int v0,int v1,int v2,int v3) { int ntriangl, aux_ntriangl = 0; int i, in, triindex; TRIANGLE aux_triangl[2]; /* Determine which of the 16 cases we have given which vertices are above or below the isosurface */ triindex = 0; if (g.val[v0] > iso) triindex |= 1; if (g.val[v1] > iso) triindex |= 2; if (g.val[v2] > iso) triindex |= 4; if (g.val[v3] > iso) triindex |= 8; /* Form the vertices of the triangles for each case */ switch (triindex) { case 0x00: case 0x0F: break; case 0x0E: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v0],g.p[v1],g.val[v0],g.val[v1]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v0],g.p[v3],g.val[v0],g.val[v3]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v0],g.p[v2],g.val[v0],g.val[v2]); aux_ntriangl++; break; case 0x01: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v0],g.p[v1],g.val[v0],g.val[v1]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v0],g.p[v2],g.val[v0],g.val[v2]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v0],g.p[v3],g.val[v0],g.val[v3]); aux_ntriangl++; break; case 0x0D: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v1],g.p[v0],g.val[v1],g.val[v0]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v1],g.p[v2],g.val[v1],g.val[v2]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v1],g.p[v3],g.val[v1],g.val[v3]); aux_ntriangl++; break; case 0x02: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v1],g.p[v0],g.val[v1],g.val[v0]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v1],g.p[v3],g.val[v1],g.val[v3]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v1],g.p[v2],g.val[v1],g.val[v2]); aux_ntriangl++; break; case 0x0C: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v0],g.p[v3],g.val[v0],g.val[v3]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v0],g.p[v2],g.val[v0],g.val[v2]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v1],g.p[v3],g.val[v1],g.val[v3]); aux_ntriangl++; aux_triangl[1].p[0] = aux_triangl[0].p[2]; aux_triangl[1].p[1] = aux_triangl[0].p[1]; aux_triangl[1].p[2] = VertexInterp(iso,g.p[v1],g.p[v2],g.val[v1],g.val[v2]); aux_ntriangl++; break; case 0x03: /* correcting */ aux_triangl[0].p[0] = VertexInterp(iso,g.p[v0],g.p[v3],g.val[v0],g.val[v3]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v1],g.p[v3],g.val[v1],g.val[v3]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v0],g.p[v2],g.val[v0],g.val[v2]); aux_ntriangl++; aux_triangl[1].p[0] = aux_triangl[0].p[2]; aux_triangl[1].p[1] = aux_triangl[0].p[1]; aux_triangl[1].p[2] = VertexInterp(iso,g.p[v1],g.p[v2],g.val[v1],g.val[v2]); aux_ntriangl++; break; case 0x0B: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v2],g.p[v0],g.val[v2],g.val[v0]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v2],g.p[v3],g.val[v2],g.val[v3]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v2],g.p[v1],g.val[v2],g.val[v1]); aux_ntriangl++; break; case 0x04: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v2],g.p[v0],g.val[v2],g.val[v0]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v2],g.p[v1],g.val[v2],g.val[v1]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v2],g.p[v3],g.val[v2],g.val[v3]); aux_ntriangl++; break; case 0x0A: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v0],g.p[v1],g.val[v0],g.val[v1]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v0],g.p[v3],g.val[v0],g.val[v3]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v2],g.p[v3],g.val[v2],g.val[v3]); aux_ntriangl++; aux_triangl[1].p[0] = aux_triangl[0].p[0]; aux_triangl[1].p[1] = aux_triangl[0].p[2]; aux_triangl[1].p[2] = VertexInterp(iso,g.p[v1],g.p[v2],g.val[v1],g.val[v2]); aux_ntriangl++; break; case 0x05: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v0],g.p[v1],g.val[v0],g.val[v1]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v2],g.p[v3],g.val[v2],g.val[v3]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v0],g.p[v3],g.val[v0],g.val[v3]); aux_ntriangl++; aux_triangl[1].p[0] = aux_triangl[0].p[0]; aux_triangl[1].p[1] = VertexInterp(iso,g.p[v1],g.p[v2],g.val[v1],g.val[v2]); aux_triangl[1].p[2] = aux_triangl[0].p[1]; aux_ntriangl++; break; case 0x09: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v0],g.p[v1],g.val[v0],g.val[v1]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v2],g.p[v3],g.val[v2],g.val[v3]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v1],g.p[v3],g.val[v1],g.val[v3]); aux_ntriangl++; aux_triangl[1].p[0] = aux_triangl[0].p[0]; aux_triangl[1].p[1] = VertexInterp(iso,g.p[v0],g.p[v2],g.val[v0],g.val[v2]); aux_triangl[1].p[2] = aux_triangl[0].p[1]; aux_ntriangl++; break; case 0x06: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v0],g.p[v1],g.val[v0],g.val[v1]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v1],g.p[v3],g.val[v1],g.val[v3]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v2],g.p[v3],g.val[v2],g.val[v3]); aux_ntriangl++; aux_triangl[1].p[0] = aux_triangl[0].p[0]; aux_triangl[1].p[1] = aux_triangl[0].p[2]; aux_triangl[1].p[2] = VertexInterp(iso,g.p[v0],g.p[v2],g.val[v0],g.val[v2]); aux_ntriangl++; break; case 0x07: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v3],g.p[v0],g.val[v3],g.val[v0]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v3],g.p[v1],g.val[v3],g.val[v1]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v3],g.p[v2],g.val[v3],g.val[v2]); aux_ntriangl++; break; case 0x08: aux_triangl[0].p[0] = VertexInterp(iso,g.p[v3],g.p[v0],g.val[v3],g.val[v0]); aux_triangl[0].p[1] = VertexInterp(iso,g.p[v3],g.p[v2],g.val[v3],g.val[v2]); aux_triangl[0].p[2] = VertexInterp(iso,g.p[v3],g.p[v1],g.val[v3],g.val[v1]); aux_ntriangl++; break; } /* eliminate bad triangles, i.e. those that contain identical points */ ntriangl = 0; for (i=0; i #include "struct.h" /* --- function prototypes --- */ void vecMultMat(double major[4][4], double new[4][4], double old[4][4], double vec[16]); void vecMatToVec(double major[4][4], double vec[16]); void vecVecToMat(double vec[16], double major[4][4]); void vecOldMat(double major[4][4], double old[4][4]); void vecRotXYMat(double new[4][4], double cosfiX, double sinfiX, double cosfiY, double sinfiY); static void vecMatMultXY( GLdouble new[][4], GLdouble rotx[][4], GLdouble roty[][4] ); void vecRotX( GLdouble new[][4], GLdouble cosfiX, GLdouble sinfiX ); void vecRotY( GLdouble new[][4], GLdouble cosfiY, GLdouble sinfiY ); void vecRotZ( GLdouble new[][4], GLdouble cosfiZ, GLdouble sinfiZ ); void VecRotateX(double cosfi, double sinfi); void VecRotateY(double cosfi, double sinfi); void VecRotateZ(double cosfi, double sinfi); void VecRotateXY(double cosfiX, double sinfiX, double cosfiY, double sinfiY); void VecRotTo_XY(void); void VecRotTo_XZ(void); void VecRotTo_YZ(void); static void VecProduct3df(double v0[], double v1[], float res[]); void xcRotatefv(float fi, float u[]); void VecRotTo_AB(void); void VecRotTo_AC(void); void VecRotTo_BC(void); /* --- auxilproc.c --- */ extern int normalizepvfv(float *vec); extern float distfv(float *v); extern void VecProduct3f(float v0[], float v1[], float res[]); /* --- 3D.c --- */ extern void LoadNull(GLdouble matrix[][4]); /* ============================================== */ /* multiplication of matrix in COLOUMN MAJOR mode */ /* major[Kcol,Irow] = SUM(j){ new[Jcol,Irow] * old[Kcol,Jrow] * * also assign a vector xvec[] from major[4][4] in COLOUMN MAJOR mode */ void vecMultMat(double major[4][4], double new[4][4], double old[4][4], double vec[16]) { int ivec = 0; int i,j,k; for(k=0; k<4; k++) for(i=0; i<4; i++) { for(j=0; j<4;j++) major[k][i] = major[k][i] + new[j][i] * old[k][j]; vec[ivec++] = major[k][i]; } } void vecMatToVec(double major[4][4], double vec[16]) { int ivec = 0; int i,j; for(i=0; i<4; i++) for(j=0; j<4; j++) vec[ivec++] = major[i][j]; } void vecVecToMat(double vec[16], double major[4][4] ) { int ivec = 0; int i,j; for(i=0; i<4; i++) for(j=0; j<4; j++) major[i][j] = vec[ivec++]; } void vecOldMat(double major[4][4], double old[4][4]) { int i,j; for(i=0; i<4; i++) for(j=0; j<4;j++) { old[i][j] = major[i][j]; major[i][j] = 0.0; } } /* In C 2D arrays are in row-major mode, but I'm dealing with coloumn major * mode; so whan initializing a matrix I must take care of above * transposition */ void vecRotXYMat( double new[4][4], double cosfiX, double sinfiX, double cosfiY, double sinfiY) { /* 2.2 is just to mark where a cos() or sin() will go */ GLdouble rotx[4][4] = { { 1.0, 0.0, 0.0, 0.0 }, { 0.0, 2.2, 2.2, 0.0 }, { 0.0, 2.2, 2.2, 0.0 }, { 0.0, 0.0, 0.0, 1.0 } }; GLdouble roty[4][4] = { { 2.2, 0.0, 2.2, 0.0 }, { 0.0, 1.0, 0.0, 0.0 }, { 2.2, 0.0, 2.2, 0.0 }, { 0.0, 0.0, 0.0, 1.0 } }; rotx[1][1] = cosfiX; rotx[2][1] = -sinfiX; rotx[1][2] = sinfiX; rotx[2][2] = cosfiX; roty[0][0] = cosfiY; roty[2][0] = sinfiY; roty[0][2] = -sinfiY; roty[2][2] = cosfiY; /* first rotate around X, than around Y -> that means NEW=Y*X */ vecMatMultXY( new, roty, rotx ); } /* assign NewMat = rotx * roty */ static void vecMatMultXY( GLdouble new[][4], GLdouble rotx[][4], GLdouble roty[][4] ) { int i,j,k; LoadNull( new ); for(k=0; k<4; k++) for(i=0; i<4; i++) for(j=0; j<4;j++) new[k][i] = new[k][i] + rotx[j][i] * roty[k][j]; } void vecRotX( GLdouble new[][4], GLdouble cosfiX, GLdouble sinfiX ) { new[0][0] = 1.0; new[1][0] = 0.0; new[2][0] = 0.0; new[3][0] = 0.0; new[0][1] = 0.0; new[1][1] = cosfiX; new[2][1] = -sinfiX; new[3][1] = 0.0; new[0][2] = 0.0; new[1][2] = sinfiX; new[2][2] = cosfiX; new[3][2] = 0.0; new[0][3] = 0.0; new[1][3] = 0.0; new[2][3] = 0.0; new[3][3] = 1.0; } void vecRotY( GLdouble new[][4], GLdouble cosfiY, GLdouble sinfiY ) { new[0][0] = cosfiY; new[1][0] = 0.0; new[2][0] = sinfiY; new[3][0] = 0.0; new[0][1] = 0.0; new[1][1] = 1.0; new[2][1] = 0.0; new[3][1] = 0.0; new[0][2] = -sinfiY; new[1][2] = 0.0; new[2][2] = cosfiY; new[3][2] = 0.0; new[0][3] = 0.0; new[1][3] = 0.0; new[2][3] = 0.0; new[3][3] = 1.0; } void vecRotZ( GLdouble new[][4], GLdouble cosfiZ, GLdouble sinfiZ ) { new[0][0] = cosfiZ; new[1][0] = -sinfiZ; new[2][0] = 0.0; new[3][0] = 0.0; new[0][1] = sinfiZ; new[1][1] = cosfiZ; new[2][1] = 0.0; new[3][1] = 0.0; new[0][2] = 0.0; new[1][2] = 0.0; new[2][2] = 1.0; new[3][2] = 0.0; new[0][3] = 0.0; new[1][3] = 0.0; new[2][3] = 0.0; new[3][3] = 1.0; } void VecRotateX(double cosfi, double sinfi) { vecRotX( vec.crdnew, cosfi, sinfi); vecOldMat( vec.crdmajor, vec.crdold ); vecMultMat( vec.crdmajor, vec.crdnew, vec.crdold, vec.crdvec ); } void VecRotateY(double cosfi, double sinfi) { vecRotY( vec.crdnew, cosfi, sinfi); vecOldMat( vec.crdmajor, vec.crdold ); vecMultMat( vec.crdmajor, vec.crdnew, vec.crdold, vec.crdvec ); } void VecRotateZ(double cosfi, double sinfi) { vecRotZ( vec.crdnew, cosfi, sinfi); vecOldMat( vec.crdmajor, vec.crdold ); vecMultMat( vec.crdmajor, vec.crdnew, vec.crdold, vec.crdvec ); } void VecRotateXY(double cosfiX, double sinfiX, double cosfiY, double sinfiY) { vecRotXYMat( vec.crdnew, cosfiX, sinfiX, cosfiY, sinfiY); vecOldMat( vec.crdmajor, vec.crdold ); vecMultMat( vec.crdmajor, vec.crdnew, vec.crdold, vec.crdvec ); } /* orientate to XY plane */ void VecRotTo_XY(void) { register int i, k, ivec; GLdouble v[4][4] = { {1.0, 0.0, 0.0, 0.0}, {0.0, 1.0, 0.0, 0.0}, {0.0, 0.0, 1.0, 0.0}, {0.0, 0.0, 0.0, 1.0} }; ivec = 0; for(k=0; k<4; k++) for(i=0; i<4; i++) { vec.crdmajor[k][i] = v[k][i]; vec.crdvec[ivec++] = vec.crdmajor[k][i]; } } /* orientate to XZ plane (90 degree rotation around X axis) */ void VecRotTo_XZ(void) { register int i, k, ivec; GLdouble v[4][4] = { {1.0, 0.0, 0.0, 0.0}, {0.0, 0.0,-1.0, 0.0}, {0.0, 1.0, 0.0, 0.0}, {0.0, 0.0, 0.0, 1.0} }; ivec = 0; for(k=0; k<4; k++) for(i=0; i<4; i++) { vec.crdmajor[k][i] = v[k][i]; vec.crdvec[ivec++] = vec.crdmajor[k][i]; } } /* orientate to YZ plane (-90 degree rotation around Y axis) */ void VecRotTo_YZ(void) { register int i, k, ivec; GLdouble v[4][4] = { { 0.0, 0.0, 1.0, 0.0}, { 0.0, 1.0, 0.0, 0.0}, {-1.0, 0.0, 0.0, 0.0}, { 0.0, 0.0, 0.0, 1.0} }; ivec = 0; for(k=0; k<4; k++) for(i=0; i<4; i++) { vec.crdmajor[k][i] = v[k][i]; vec.crdvec[ivec++] = vec.crdmajor[k][i]; } } static void VecProduct3df(double v0[], double v1[], float res[]) { res[0] = (float) (v0[1] * v1[2] - v1[1] * v0[2]); res[1] = (float) (v0[2] * v1[0] - v1[2] * v0[0]); res[2] = (float) (v0[0] * v1[1] - v1[0] * v0[1]); } void xcRotatefv(float fi, float u[]) { register int i, j, ivec; float cosfi, sinfi; float S[3][3], uut[3][3], uutId[3][3], M[4][4]; if (distfv(u) > MINTOL) { cosfi = cos(fi); sinfi = sin(fi); for (i=0; i<3; i++) for (j=0; j<3; j++) { uut[i][j] = u[i] * u[j]; uutId[i][j] = -uut[i][j]; if (i==j) uutId[i][j] += 1.0; } S[0][0] = 0.0; S[0][1] = -u[2]; S[0][2] = u[1]; S[1][0] = u[2]; S[1][1] = 0.0; S[1][2] = -u[0]; S[2][0] = -u[1]; S[2][1] = u[0]; S[2][2] = 0.0; /* in OpenGL, matrix are written in column major mode, not in row-major mode as is usually in C; take care about that */ for(i=0; i<3; i++) for(j=0; j<3; j++) M[j][i] = uut[i][j] + cosfi * uutId[i][j] + sinfi * S[i][j]; M[3][0] = M[3][1] = M[3][2] = M[0][3] = M[1][3] = M[2][3] = 0.0; M[3][3] = 1.0; } else { for (i=0; i<4; i++) for (j=0; j<4; j++) { M[i][j] = 0.0; M[i][i] = 1.0; } } ivec = 0; for(i=0; i<4; i++) for(j=0; j<4; j++) { vec.crdmajor[i][j] = (GLdouble) M[i][j]; vec.crdvec[ivec++] = (GLdouble) vec.crdmajor[i][j]; } } void VecRotTo_AB(void) { /* normal must be oriented to Z direction, AxB=C */ float fi, n[3], u[3], z[3] = {0.0, 0.0, 1.0}; /* XxY = Z */ if (xcr.celltype == XCR_NOCELL || xcr.celltype == XCR_PRIMCELL) VecProduct3df(vec.prim[0], vec.prim[1], n); else VecProduct3df(vec.conv[0], vec.conv[1], n); VecProduct3f(n, z, u); normalizepvfv( u ); fi = acos( n[2] / distfv(n) ); xcRotatefv( fi, u ); } void VecRotTo_AC(void) { /* normal must be oriented to Z direction, AxC=-B; CxA=B */ float fi, n[3], u[3], z[3] = {0.0, 0.0, 1.0}; /* ZxX = Y */ if (xcr.celltype == XCR_NOCELL || xcr.celltype == XCR_PRIMCELL) VecProduct3df(vec.prim[2], vec.prim[0], n); else VecProduct3df(vec.conv[2], vec.conv[0], n); VecProduct3f(n, z, u); normalizepvfv( u ); fi = acos( n[2] / distfv(n) ); xcRotatefv( fi, u ); } void VecRotTo_BC(void) { /* normal must be oriented to Z direction, BxC=-A */ float fi, n[3], u[3], z[3] = {0.0, 0.0, 1.0}; /* YxZ = X */ if (xcr.celltype == XCR_NOCELL || xcr.celltype == XCR_PRIMCELL) VecProduct3df(vec.prim[1], vec.prim[2], n); else VecProduct3df(vec.conv[1], vec.conv[2], n); VecProduct3f(n, z, u); normalizepvfv( u ); fi = acos( n[2] / distfv(n) ); xcRotatefv( fi, u ); } xcrysden-1.6.2/C/detnsplit.c0000644000175000017500000001307411712736221014416 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/detnsplit.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #include "memory.h" extern double rcov[MAXNAT + 1]; /* functions prototypes */ extern double dist6(double x1, double x2, double y1, double y2, double z1, double z2); extern double dist3(double x, double y, double z); extern int normalizepv(double *x, double *y, double *z); int DetNBonds(int *nsplit) { int ibn, i, j, ii, jj; /* nn is increased before usage */ int numb = 0; /* numb is ++numb before usage */ double (*xb)[MAX_BONDS], (*yb)[MAX_BONDS], (*zb)[MAX_BONDS]; double (*xb2)[MAX_BONDS], (*yb2)[MAX_BONDS], (*zb2)[MAX_BONDS]; double angl, minangl = PI; /* parameters to detemine min angle */ double dis, len, fdis, minbdis = 10.0, maxfdis = 0.0; /* bond lenght parameters */ double dx1, dx2, dy1, dy2, dz1, dz2; xb = (double (*)[MAX_BONDS]) malloc( sizeof(double [MAX_BONDS]) * (natoms + 1) ); yb = (double (*)[MAX_BONDS]) malloc( sizeof(double [MAX_BONDS]) * (natoms + 1) ); zb = (double (*)[MAX_BONDS]) malloc( sizeof(double [MAX_BONDS]) * (natoms + 1) ); xb2 = (double (*)[MAX_BONDS]) malloc( sizeof(double [MAX_BONDS]) * (natoms + 1) ); yb2 = (double (*)[MAX_BONDS]) malloc( sizeof(double [MAX_BONDS]) * (natoms + 1) ); zb2 = (double (*)[MAX_BONDS]) malloc( sizeof(double [MAX_BONDS]) * (natoms + 1) ); /* make bonds & also determine if additional spliting is needed */ for(i = 1; i <= natoms; i++) { /* don't make a bond for dummy X-atom */ if (nat[i] == 0) continue; ibn = 0; /* if ibn > 0 -> measure bond angle */ for(j = 1; j <= natoms; j++) { /* don't make a bond for dummy X-atom */ if (nat[j] == 0) continue; if ( j == i ) continue; /* do not compare atom with it's self */ /* calculate distance between two atoms */ dis = dist6(*(xat + i), *(xat + j), *(yat + i), *(yat + j), *(zat + i), *(zat + j)); if ( dis < MINDIS ) continue; /* len == sum of covalent radius from atom i & j */ len = rcov[*(nat + i)] + rcov[*(nat + j)]; if ( dis < len ) { ++ibn; /* criteria if bond angle is measured */ if ( ibn == (int) MAX_BONDS/2.0 ) { fprintf(stderr, "WARNING: atom \"%d\" has huge number of bonds !!!\n", i); /* continue; */ } /* each bond belong to both atoms, so we'll split/devide a bond to both atoms, criteria for spliting is fdis parameter */ /* only BONDs to ATOM i */ ++numb; /* FIRST END OF A BOND */ fdis = dis * rcov[*(nat + i)] / len; if ( dis < minbdis ) minbdis = dis; /* needed for additional */ if ( fdis > maxfdis ) maxfdis = fdis; /* bond spliting criteria */ xb[i][ibn] = *(xat + i); yb[i][ibn] = *(yat + i); zb[i][ibn] = *(zat + i); /* SECOND END OF A BOND */ xb2[i][ibn] = *(xat + i) + fdis * (*(xat + j) - *(xat + i)) / dis; yb2[i][ibn] = *(yat + i) + fdis * (*(yat + j) - *(yat + i)) / dis; zb2[i][ibn] = *(zat + i) + fdis * (*(zat + j) - *(zat + i)) / dis; } /* if (dis < len) */ if ( ibn >= MAX_BONDS - 1 ) { fprintf(stderr, "WARNING: atom \"%d\" has more than %d bonds. Further bonds will be neglected !!!\n", i, MAX_BONDS); /* atom i has too many bonds, stop at this point */ break; } } /* for(j=... */ /* now measure bond angles between bonds of atom i */ for(ii = 1; ii <= ibn - 1; ii++) for(jj = ii + 1; jj <= ibn; jj++) { dx1 = xb2[i][ii] - xb[i][ii]; dy1 = yb2[i][ii] - yb[i][ii]; dz1 = zb2[i][ii] - zb[i][ii]; dx2 = xb2[i][jj] - xb[i][jj]; dy2 = yb2[i][jj] - yb[i][jj]; dz2 = zb2[i][jj] - zb[i][jj]; if (!normalizepv(&dx1, &dy1, &dz1)) continue; if (!normalizepv(&dx2, &dy2, &dz2)) continue; angl = acos ( dx1 * dx2 + dy1 * dy2 + dz1 * dz2 ); if ( angl < minangl ) { minangl = angl; if ( angl < 0.087) /* this is appr. 5 degrees */ { minangl = 0.53; /* this is appr. 30 degrees */ /* fprintf(stderr,"WARNING: Bond angle (%f degrees) between atom %d and atom %d is very small !!!\n", angl, i, j); */ } } } } /* for(i=... */ /* DETERMINE IF ADDITIONAL SPLITING OF BONDS is NECESSARY */ if ( minangl < 0.53 ) { /* set minangl to cca. 30 degrees */ minangl = 0.53; } *nsplit = (int) (maxfdis * cos(minangl)) / (2.0 * minbdis) + 1; if ( *nsplit <= 0 ) *nsplit = 1; /* now I now how many bonds is there */ nbonds = numb * *nsplit; fprintf(stderr,"Estimated number of bonds = %d\n", nbonds); fflush(stderr); xcFree((void*)zb2); xcFree((void*)yb2); xcFree((void*)xb2); xcFree((void*)zb); xcFree((void*)yb); xcFree((void*)xb); return XC_OK; } xcrysden-1.6.2/C/tensor.h0000644000175000017500000000453011712736221013724 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/tensor.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define MALLOC_TENSOR2(type, p, n1, n2) \ do { \ register long _i, _n1 = (n1), _n2 = (n2); \ p = (type**) malloc((size_t) _n1 * sizeof(type*)); \ if (!p) xcError("memory exhausted"); \ p[0] = (type*) malloc((size_t) _n1*_n2 * sizeof(type)); \ if (!p[0]) xcError("memory exhausted"); \ for (_i=1; _i<_n1; _i++) { \ p[_i] = p[_i-1] + n2; \ } \ } while(0) #define FREE_TENSOR2(tensor) \ do { \ if (tensor[0]) free( (FREE_ARG) tensor[0] ); \ if (tensor) free( (FREE_ARG) tensor ); \ } while(0) #define MALLOC_TENSOR3(type, p, n1, n2, n3) \ do { \ register int _i, _j, _n1 = (n1), _n2 = (n2), _n3 = (n3); \ p = (type***) cryMem_Malloc_W((size_t) _n1 * sizeof(type**), \ "MALLOC_TENSOR3: allocation failure 1"); \ p[0] = (type**) cryMem_Malloc_W((size_t) _n1*_n2 * sizeof(type*), \ "MALLOC_TENSOR3: allocation failure 2"); \ p[0][0] = (type*) cryMem_Malloc_W((size_t) _n1*_n2*_n3 * sizeof(type), \ "MALLOC_TENSOR3: allocation failure 3"); \ /*printf("MALLOC_TENSOR3: allocation completed !!!\n");*/ \ for (_i=0; _i<_n1; _i++) { \ p[_i] = p[0] + _i*_n2; \ /* printf("MALLOC_TENSOR3: array assignment -> major index = %d/%d\n", _i,_n1);*/ \ for (_j=0; _j<_n2; _j++) { \ /*printf("MALLOC_TENSOR3: array assignment -> major - minor index = [%d/%d][%d/%d]\n", _i,_n1,_j,_n2);*/ \ p[_i][_j] = p[0][0] + _n3*(_i*_n2 + _j); \ } \ } \ } while(0) xcrysden-1.6.2/C/cryClip.c0000644000175000017500000004167211712736221014022 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/cryClip.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "isosurf.h" #include "memory.h" #include "xcfunc.h" /* cryClip.c */ int ClipSimple(XYZ *p, XYZ n, XYZ p0); int ClipSimple3(XYZ *p, float n[3], float p0[3]); ISOSURFACE *cryIsosurfClip(ISOSURFACE *in, XYZ n, XYZ p0); /* Simple Cliping; either IN or OUT triangle is IN if at least one vertex is "inside the plane" The normal to the plane is n A point on the plane is p0 */ int ClipSimple(XYZ *p, XYZ n, XYZ p0) { float A,B,C,D; float l; float side[3]; /* Determine the equation of the plane as Ax + By + Cz + D = 0 */ l = sqrt(n.x*n.x + n.y*n.y + n.z*n.z); A = n.x / l; B = n.y / l; C = n.z / l; D = -(n.x*p0.x + n.y*p0.y + n.z*p0.z); /* Evaluate the equation of the plane for each vertex If side < 0 then it is on the side to be retained else it is to be clipped */ side[0] = A*p[0].x + B*p[0].y + C*p[0].z + D; side[1] = A*p[1].x + B*p[1].y + C*p[1].z + D; side[2] = A*p[2].x + B*p[2].y + C*p[2].z + D; /* Are all the vertices on the clipped side */ if (side[0] >= 0 && side[1] >= 0 && side[2] >= 0) return(0); /* Are all the vertices on the non-clipped side */ if (side[0] <= 0 || side[1] <= 0 || side[2] <= 0) return(1); return(0); } int ClipSimple3(XYZ *p, float n[3], float p0[3]) { float A,B,C,D; float l; float side[3]; /* Determine the equation of the plane as Ax + By + Cz + D = 0 */ l = sqrt(n[0]*n[0] + n[1]*n[1] + n[2]*n[2]); A = n[0] / l; B = n[1] / l; C = n[2] / l; D = -(n[0]*p0[0] + n[1]*p0[1] + n[2]*p0[2]); /* Evaluate the equation of the plane for each vertex If side < 0 then it is on the side to be retained else it is to be clipped */ side[0] = A*p[0].x + B*p[0].y + C*p[0].z + D; side[1] = A*p[1].x + B*p[1].y + C*p[1].z + D; side[2] = A*p[2].x + B*p[2].y + C*p[2].z + D; /* Are all the vertices on the clipped side */ if (side[0] >= 0 && side[1] >= 0 && side[2] >= 0) return(0); /* Are all the vertices on the non-clipped side */ if (side[0] <= 0 || side[1] <= 0 || side[2] <= 0) return(1); return(0); } /* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */ #define COPY_XYZ(dst, src) \ do { \ dst.x = src.x; \ dst.y = src.y; \ dst.z = src.z; \ } while(0) #define COPY_V3(dst, src) \ do { \ (dst)[0] = (src)[0]; \ (dst)[1] = (src)[1]; \ (dst)[2] = (src)[2]; \ } while(0) #define COPY_M33(dst, src) \ do { \ (dst)[0][0] = (src)[0][0]; (dst)[0][1] = (src)[0][1]; (dst)[0][2] = (src)[0][2]; \ (dst)[1][0] = (src)[1][0]; (dst)[1][1] = (src)[1][1]; (dst)[1][2] = (src)[1][2]; \ (dst)[2][0] = (src)[2][0]; (dst)[2][1] = (src)[2][1]; (dst)[2][2] = (src)[2][2]; \ } while(0) /* WARNING - WARNING - WARNING -> extremely dengerous MACRO !!! ------------------------------------------------------------ 1.) It is meant only for cryIsosurfClip function !!! 2.) Any change of variables names or structure REQUIRES an update of this Macro !!! */ #define NEW_TRIANGLE(i0, i1, i2) \ tc++; \ /*cryAux_DEBUG("NEW_TRIANGLE");*/ \ \ out->triangl_status[nt] = 1; \ \ out->tri2verIN[nt].ver_status[0] = 1; \ out->tri2verIN[nt].ver_status[1] = 1; \ out->tri2verIN[nt].ver_status[2] = 1; \ \ out->tri2verIN[nt].ver_ind[0] = nv; \ out->tri2verIN[nt].ver_ind[1] = nv+1; \ out->tri2verIN[nt].ver_ind[2] = nv+2; \ nt++; \ \ COPY_XYZ(out->vertex[nv], p[i0]); \ COPY_XYZ(out->vertex_orig[nv], p[i0]); \ COPY_XYZ(out->normal[nv], nml[i0]); \ nv++;\ COPY_XYZ(out->vertex[nv], p[i1]); \ COPY_XYZ(out->vertex_orig[nv], p[i1]); \ COPY_XYZ(out->normal[nv], nml[i1]); \ nv++;\ COPY_XYZ(out->vertex[nv], p[i2]); \ COPY_XYZ(out->vertex_orig[nv], p[i2]); \ COPY_XYZ(out->normal[nv], nml[i2]); \ nv++ /* ************************************************************************ NOTE about cryIsosurfClip: This is a modified routine (adapted for present pupose) of the original one which is due to P. Bourke; see Modelling on http://www.swin.edu.au/astronomy/pbourke/modelling/ ************************************************************************ */ /*! *----------------------------------------------------------------------------- * * cryIsosurfClip -- \brief clip an isosurface by desired plane * * \description * This function clips an isosurface by desired plane. The memory * of input isosurface is kept intact, hence take care of possible * memory deallocation in the calling routine. * * \warning * This routine is very memory allocation demanding, since for * every new clipping plane new isosurface is allocated. In the * future this can be done as: create a driver routine for all * clipping planes, then make a vertex and triangle variables and * associated "exist/non-exist" flag. Then clip all the planes, * and remove all the non-existent entities. The mapping between * new and old vertex ID's can be made by kind of lookup table. * * Otherwise, this can be beautifully done with linked list, if * triangle is out, simply skip it !!! * * \return * Newly created clipped isosurface. * * \sideeffect * None. * *----------------------------------------------------------------------------- */ ISOSURFACE *cryIsosurfClip(ISOSURFACE *in, /*!< isosurface to clip */ XYZ n, /*!< normal of clipping plane */ XYZ p0) /*!< point on clipping plane */ { register int it, nt=0, nv=0, tc=0; int nv_max = (int) (1.1 * (float) in->nvertex); int nt_max = (int) (1.1 * (float) in->ntriangl); ISOSURFACE *out; XYZ p[4], nml[4], q, qn; float A,B,C,D; float side[3]; /* allocate out ISOSURFACE and initialize it !!! */ out = (ISOSURFACE *) calloc (1, sizeof(ISOSURFACE)); if (!out) xcError("allocation error for ISOSURFACE"); /* fprintf(stderr,"Number of IN triangles: %d\n", in->ntriangl); fprintf(stderr,"Number of IN vertices: %d\n", in->nvertex); */ out->index = in->index; out->smooth_nstep = in->smooth_nstep; out->smooth_weight = in->smooth_weight; out->triangl_status = (int *) xcRealloc((void*) out->triangl_status, (size_t) nt_max * sizeof(int) ); out->vertex = (XYZ *) xcRealloc((void*) out->vertex, (size_t) nv_max * sizeof(VERTEX) ); out->vertex_orig = (XYZ *) xcRealloc((void*) out->vertex_orig, (size_t) nv_max * sizeof(VERTEX) ); out->color = (float (*)[4]) xcRealloc((void*) out->color, (size_t) nv_max * sizeof(float [4]) ); out->normal = (XYZ *) xcRealloc((void*) out->normal, (size_t) nv_max * sizeof(VERTEX) ); out->tri2verIN = (TRIG_INFO *) xcRealloc((void*) out->tri2verIN, (size_t) nt_max * sizeof(TRIG_INFO) ); out->nver2triIN = (int *) xcRealloc((void*) out->nver2triIN, (size_t) nt_max*3 * sizeof(int) ); out->ver2triIN = (VERT2TRIG_INFO (*)[MAX_VERTEX_COORDINATION]) xcRealloc((void*) out->ver2triIN, (size_t ) nt_max*3 * sizeof(VERT2TRIG_INFO [MAX_VERTEX_COORDINATION]) ); /* Determine the equation of the plane as: Ax + By + Cz + D = 0 l = sqrt(n.x*n.x + n.y*n.y + n.z*n.z); A = n.x / l; B = n.y / l; C = n.z / l; */ A = n.x; B = n.y; C = n.z; D = -(n.x*p0.x + n.y*p0.y + n.z*p0.z); /* MAPPING: cryIso->triangl[it][ipol] = ISO->tri2verIN[it].ver_ind[ipol] */ for (it=0; itntriangl; it++) { /* check for reallocation */ if ( (nt+2) >= nt_max ) { nt_max = (int) (1.5 * (float) nt_max); out->tri2verIN = (TRIG_INFO *) xcRealloc((void*) out->tri2verIN, (size_t) nt_max * sizeof(TRIG_INFO) ); } if ( (nv+6) >= nv_max ) { nv_max = (int) (1.5 * (float) nv_max); out->vertex = (XYZ *) xcRealloc((void*) out->vertex, (size_t) nv_max * sizeof(VERTEX) ); out->vertex_orig = (XYZ *) xcRealloc((void*) out->vertex_orig, (size_t) nv_max * sizeof(VERTEX) ); out->color = (float (*)[4]) xcRealloc((void*) out->color, (size_t) nv_max * sizeof(float [4]) ); out->normal = (XYZ *) xcRealloc((void*) out->normal, (size_t) nv_max * sizeof(VERTEX) ); } /* Clip a 3 vertex facet in place. The 3 point facet is defined by vertices p[0],p[1],p[2]. There must be a fourth point ("p[3]") as a 4 point facet may result. The normal to the plane is "n". A point on the plane is "p0". The side of the plane containing the normal is clipped away. Return the number of vertices in the clipped polygon */ COPY_XYZ (p[0], in->vertex[ in->tri2verIN[it].ver_ind[0] ]); COPY_XYZ (p[1], in->vertex[ in->tri2verIN[it].ver_ind[1] ]); COPY_XYZ (p[2], in->vertex[ in->tri2verIN[it].ver_ind[2] ]); COPY_XYZ (nml[0], in->normal[ in->tri2verIN[it].ver_ind[0] ]); COPY_XYZ (nml[1], in->normal[ in->tri2verIN[it].ver_ind[1] ]); COPY_XYZ (nml[2], in->normal[ in->tri2verIN[it].ver_ind[2] ]); /* Evaluate the equation of the plane for each vertex. If side < 0 then it is on the side to be retained else it is to be clipped */ side[0] = A*p[0].x + B*p[0].y + C*p[0].z + D; side[1] = A*p[1].x + B*p[1].y + C*p[1].z + D; side[2] = A*p[2].x + B*p[2].y + C*p[2].z + D; /*cryAux_DEBUG("Clipping plane: (%f, %f, %f)\n", side[0], side[1], side[2]);*/ /* now find-out the CLIPPING situation !!! */ if (side[0] >= 0 && side[1] >= 0 && side[2] >= 0) { /* All the vertices are on the clipped side */ continue; } else if (side[0] <= 0 && side[1] <= 0 && side[2] <= 0) { /* All the vertices are on the not-clipped side */ /* new triangle is 0,1,2 */ NEW_TRIANGLE(0,1,2); } else if (side[0] > 0 && side[1] < 0 && side[2] < 0) { /* p0 is the only point on the clipped side */ /* new triangles are 0,1,2 & 0,2,3 */ float s020 = side[0] / (side[2] - side[0]); float s010 = side[0] / (side[1] - side[0]); q.x = p[0].x - s020 * (p[2].x - p[0].x); q.y = p[0].y - s020 * (p[2].y - p[0].y); q.z = p[0].z - s020 * (p[2].z - p[0].z); qn.x = nml[0].x - s020 * (nml[2].x - nml[0].x); qn.y = nml[0].y - s020 * (nml[2].y - nml[0].y); qn.z = nml[0].z - s020 * (nml[2].z - nml[0].z); p[3] = q; nml[3] = qn; q.x = p[0].x - s010 * (p[1].x - p[0].x); q.y = p[0].y - s010 * (p[1].y - p[0].y); q.z = p[0].z - s010 * (p[1].z - p[0].z); qn.x = nml[0].x - s010 * (nml[1].x - nml[0].x); qn.y = nml[0].y - s010 * (nml[1].y - nml[0].y); qn.z = nml[0].z - s010 * (nml[1].z - nml[0].z); p[0] = q; nml[0] = qn; NEW_TRIANGLE(0,1,2); NEW_TRIANGLE(0,2,3); } else if (side[1] > 0 && side[0] < 0 && side[2] < 0) { /* p1 is the only point on the clipped side */ /* new triangles are 0,1,2 & 0,2,3 */ float s121 = side[1] / (side[2] - side[1]); float s101 = side[1] / (side[0] - side[1]); p[3] = p[2]; nml[3] = nml[2]; q.x = p[1].x - s121 * (p[2].x - p[1].x); q.y = p[1].y - s121 * (p[2].y - p[1].y); q.z = p[1].z - s121 * (p[2].z - p[1].z); qn.x = nml[1].x - s121 * (nml[2].x - nml[1].x); qn.y = nml[1].y - s121 * (nml[2].y - nml[1].y); qn.z = nml[1].z - s121 * (nml[2].z - nml[1].z); p[2] = q; nml[2] = qn; q.x = p[1].x - s101 * (p[0].x - p[1].x); q.y = p[1].y - s101 * (p[0].y - p[1].y); q.z = p[1].z - s101 * (p[0].z - p[1].z); qn.x = nml[1].x - s101 * (nml[0].x - nml[1].x); qn.y = nml[1].y - s101 * (nml[0].y - nml[1].y); qn.z = nml[1].z - s101 * (nml[0].z - nml[1].z); p[1] = q; nml[1] = qn; NEW_TRIANGLE(0,1,2); NEW_TRIANGLE(0,2,3); } else if (side[2] > 0 && side[0] < 0 && side[1] < 0) { /* p2 is the only point on the clipped side */ /* new triangles are 0,1,2 & 0,2,3 */ float s202 = side[2] / (side[0] - side[2]); float s212 = side[2] / (side[1] - side[2]); q.x = p[2].x - s202 * (p[0].x - p[2].x); q.y = p[2].y - s202 * (p[0].y - p[2].y); q.z = p[2].z - s202 * (p[0].z - p[2].z); qn.x = nml[2].x - s202 * (nml[0].x - nml[2].x); qn.y = nml[2].y - s202 * (nml[0].y - nml[2].y); qn.z = nml[2].z - s202 * (nml[0].z - nml[2].z); p[3] = q; nml[3] = qn; q.x = p[2].x - s212 * (p[1].x - p[2].x); q.y = p[2].y - s212 * (p[1].y - p[2].y); q.z = p[2].z - s212 * (p[1].z - p[2].z); qn.x = nml[2].x - s212 * (nml[1].x - nml[2].x); qn.y = nml[2].y - s212 * (nml[1].y - nml[2].y); qn.z = nml[2].z - s212 * (nml[1].z - nml[2].z); p[2] = q; nml[2] = qn; NEW_TRIANGLE(0,1,2); NEW_TRIANGLE(0,2,3); } else if (side[0] < 0 && side[1] > 0 && side[2] > 0) { /* p0 is the only point on the not-clipped side */ /* new triangle is 0,1,2 */ float s010 = side[0] / (side[1] - side[0]); float s020 = side[0] / (side[2] - side[0]); q.x = p[0].x - s010 * (p[1].x - p[0].x); q.y = p[0].y - s010 * (p[1].y - p[0].y); q.z = p[0].z - s010 * (p[1].z - p[0].z); qn.x = nml[0].x - s010 * (nml[1].x - nml[0].x); qn.y = nml[0].y - s010 * (nml[1].y - nml[0].y); qn.z = nml[0].z - s010 * (nml[1].z - nml[0].z); p[1] = q; nml[1] = qn; q.x = p[0].x - s020 * (p[2].x - p[0].x); q.y = p[0].y - s020 * (p[2].y - p[0].y); q.z = p[0].z - s020 * (p[2].z - p[0].z); qn.x = nml[0].x - s020 * (nml[2].x - nml[0].x); qn.y = nml[0].y - s020 * (nml[2].y - nml[0].y); qn.z = nml[0].z - s020 * (nml[2].z - nml[0].z); p[2] = q; nml[2] = qn; NEW_TRIANGLE(0,1,2); } else if (side[1] < 0 && side[0] > 0 && side[2] > 0) { /* p1 is the only point on the not-clipped side */ /* new triangle is 0,1,2 */ float s101 = side[1] / (side[0] - side[1]); float s121 = side[1] / (side[2] - side[1]); q.x = p[1].x - s101 * (p[0].x - p[1].x); q.y = p[1].y - s101 * (p[0].y - p[1].y); q.z = p[1].z - s101 * (p[0].z - p[1].z); qn.x = nml[1].x - s101 * (nml[0].x - nml[1].x); qn.y = nml[1].y - s101 * (nml[0].y - nml[1].y); qn.z = nml[1].z - s101 * (nml[0].z - nml[1].z); p[0] = q; nml[0] = qn; q.x = p[1].x - s121 * (p[2].x - p[1].x); q.y = p[1].y - s121 * (p[2].y - p[1].y); q.z = p[1].z - s121 * (p[2].z - p[1].z); qn.x = nml[1].x - s121 * (nml[2].x - nml[1].x); qn.y = nml[1].y - s121 * (nml[2].y - nml[1].y); qn.z = nml[1].z - s121 * (nml[2].z - nml[1].z); p[2] = q; nml[2] = qn; NEW_TRIANGLE(0,1,2); } else if (side[2] < 0 && side[0] > 0 && side[1] > 0) { /* p2 is the only point on the not-clipped side */ /* new triangle is 0,1,2 */ float s212 = side[2] / (side[1] - side[2]); float s202 = side[2] / (side[0] - side[2]); q.x = p[2].x - s212 * (p[1].x - p[2].x); q.y = p[2].y - s212 * (p[1].y - p[2].y); q.z = p[2].z - s212 * (p[1].z - p[2].z); qn.x = nml[2].x - s212 * (nml[1].x - nml[2].x); qn.y = nml[2].y - s212 * (nml[1].y - nml[2].y); qn.z = nml[2].z - s212 * (nml[1].z - nml[2].z); p[1] = q; nml[1] = qn; q.x = p[2].x - s202 * (p[0].x - p[2].x); q.y = p[2].y - s202 * (p[0].y - p[2].y); q.z = p[2].z - s202 * (p[0].z - p[2].z); qn.x = nml[2].x - s202 * (nml[0].x - nml[2].x); qn.y = nml[2].y - s202 * (nml[0].y - nml[2].y); qn.z = nml[2].z - s202 * (nml[0].z - nml[2].z); p[0] = q; nml[0] = qn; NEW_TRIANGLE(0,1,2); } } out->ntriangl = nt; out->nvertex = nv; /* fprintf(stderr,"Number of OUT triangles: %d\n", out->ntriangl); fprintf(stderr,"Number of OUT vertices: %d\n\n", out->nvertex); fflush(stderr); */ /* out->tri2verIN = (TRIG_INFO *) xcRealloc((void*) out->tri2verIN, (size_t) nt * sizeof(TRIG_INFO) ); out->vertex = (XYZ *) xcRealloc((void*) out->vertex, (size_t) nv * sizeof(VERTEX) ); */ return out; } xcrysden-1.6.2/C/realTimeMovie.c0000644000175000017500000001227413525506046015157 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/ppmPrintTogl.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include "struct.h" #include "xcfunc.h" #include "memory.h" extern void (*xcDisplay)(struct Togl *togl); extern struct Togl *mesa_togl; realTimeMove makeMovie = { MOVIE_MODE_EVERY_SNAPSHOT, 0, 0, 0, (char*)NULL }; static char *filelist = (char*)NULL; static int filelist_size = 20000; /* * this function takes care of real-time screen PPM capture for movie creation * * Usage: * * xc_realtimemovie toglName begin mode dir * xc_realtimemovie toglName end * xc_realtimemovie toglName filelist * xc_realtimemovie toglName clear */ int CRY_RealTimeMovieCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; if ( argc < 3 && argc > 5) { Tcl_SetResult(interp, "Usage: \"realtimemovie toglName begin mode dir\" or \"realtimemovie toglName end\"", TCL_STATIC); return TCL_ERROR; } if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( togl != mesa_togl ) { Tcl_SetResult(interp, "so far toglName realtimemovie callback works only for .mesa togl", TCL_STATIC); return TCL_ERROR; } if (strncmp(argv[2],"beg",3) == 0) { if ( argc != 5) { Tcl_SetResult(interp, "Usage: toglName realtimemovie begin mode dir", TCL_STATIC); return TCL_ERROR; } /* BEGIN */ if ( makeMovie.doit == 1 ) { Tcl_SetResult(interp, "can't call \"toglName realtimemovie begin\" twice ...", TCL_STATIC); return TCL_ERROR; } if ( filelist != NULL) { filelist[0] = '\0'; } makeMovie.doit = 1; makeMovie.nframe = 0; /* mode */ makeMovie.mode = MOVIE_MODE_EVERY_SNAPSHOT; if (strncmp(argv[3],"real",4) == 0) { makeMovie.mode = MOVIE_MODE_REALTIME_INTERVAL; } /* directory where to write files */ if ( makeMovie.dir != NULL ) { Tcl_SetResult(interp, "\"toglName realtimemovie begin\" re-called without clearing ...", TCL_STATIC); return TCL_ERROR; } makeMovie.dir = (char*) xcCalloc( strlen(argv[4]) + 1, sizeof(char) ); strcpy(makeMovie.dir, argv[4]); } else if (strncmp(argv[2],"end",3) == 0) { /* END */ if ( makeMovie.doit != 1 ) { Tcl_SetResult(interp, "can't call \"toglName realtimemovie end\" prior to \"toglName realtimemovie begin\"", TCL_STATIC); return TCL_ERROR; } xcFree(makeMovie.dir); makeMovie.dir = NULL; makeMovie.doit = 0; } else if (strncmp(argv[2],"filelist",4) == 0) { if ( filelist != NULL) { /*char *result = Tcl_Alloc( sizeof(char) * strlen(filelist+1) );*/ fprintf(stderr, "size: %ld\nfilelist: %s\n", strlen(filelist), filelist); Tcl_SetResult(interp,filelist,TCL_VOLATILE); } else { Tcl_SetResult(interp,"",TCL_STATIC); } } else if (strncmp(argv[2],"clear",4) == 0) { xcFree(makeMovie.dir); makeMovie.dir = NULL; makeMovie.doit = 0; makeMovie.nframe = 0; if ( filelist != NULL) { filelist[0] = '\0'; } } return TCL_OK; } void createMoviePPMFrame(struct Togl *togl) { char *filename; if (makeMovie.dir != NULL) { filename = (char*) xcCalloc(strlen(makeMovie.dir) + 50, sizeof(char)); } else { return; } fprintf(stderr,"makeMovie.printing=%d\n",makeMovie.printing); if (makeMovie.printing) return; makeMovie.printing = 1; if ( togl == mesa_togl ) { /* so far it works only for ".mesa" */ /* take care of filelist */ if ( filelist == NULL ) { filelist = xcCalloc(filelist_size, sizeof(char)); } sprintf(filename,"%s/frame-%05d.ppm", makeMovie.dir, makeMovie.nframe++); if (strlen(filelist) + strlen(filename) + 1 >= filelist_size) { filelist_size *= 2; filelist = xcRealloc(filelist, sizeof(char)*filelist_size); } strcat(filelist,filename); strcat(filelist," "); /* dump to PPM file */ fprintf(stderr,"createMoviePPMFrame: making %s ... ", filename); Togl_DumpToPpmFile( togl, filename ); fprintf(stderr,"ok\n"); } makeMovie.printing = 0; xcFree((FREE_ARG)filename); } xcrysden-1.6.2/C/xcColorScheme.c0000644000175000017500000002730713525506046015156 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcColorScheme.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include "struct.h" #include "xcGLparam.h" #include "isosurf.h" #include "xcfunc.h" #define COLSH_DEFAULT 0 #define COLSH_NN 1 #define COLSH_SLAB 2 #define COLSH_MONOCHROME 0 #define COLSH_RGB 1 #define COLSH_RAINBOW 2 #define COLSH_GEOGRAPHIC 3 #define COLSH_N_COLOR_BASE 4 #define COLSH_OVERRIDE 0 #define COLSH_COMBINED 1 #define COLSH_XP 0 #define COLSH_XM 1 #define COLSH_YP 2 #define COLSH_YM 3 #define COLSH_ZP 4 #define COLSH_ZM 5 struct COLOR_SCHEME { int whatscheme; int colorscheme; int colortype; GetGlParam nn_coor; int slab_dir; GetGlParam slabrange; float alpha; /* alpha factor for combined color */ float dist_r; /* distance radius */ } colSh; static BASECOLOR bcol[COLSH_N_COLOR_BASE]; extern float monocol[2][4]; extern float rainbow[6][4]; extern float rgbcol[3][4]; extern float geographic[11][4]; /* --- static function prototypes --- */ static void Colorise(void); static void AssignColorInit(void); static void AssignColor(GLfloat col[3], float x, int colorscheme, int colortype, float oldcol[3], float alpha); /***************************************************************************** xc_colorscheme structure toglName (-nn {x y z}|-slab +x|-x|+y|-y|+z|-z -slabrange {min max} -r radius -default) -colorscheme monochrome|rgb| rainbow|geographic -colortype override|combined -alpha *****************************************************************************/ int XC_ColorschemeCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]) { static int first_time = 1; register int i; struct Togl *togl; /* initialization */ if (first_time) { AssignColorInit(); first_time = 0; colSh.slabrange.vec[0] = 0.0; colSh.slabrange.vec[1] = 1.0; } /* this is default */ colSh.whatscheme = COLSH_DEFAULT; /* so far just "xc_colorscheme structure" is supported */ if ( strncmp(argv[1], "struct", 6) != 0 ) { char rss[1024]; snprintf(rss, sizeof(rss), "Usage: xc_colorscheme structure toglName (-nn {x y z}|-slab +x|-x|+y|-y|+z|-z | -slabrange {min max} | -default) -colorscheme monochrome|rgb|rainbow|geographic -colortype override|combined -alpha "); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[2], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } for(i=3; i colSh.slabrange.vec[1] ) { f = 1.0; } else { f = (x - colSh.slabrange.vec[0]) / (colSh.slabrange.vec[1]-colSh.slabrange.vec[0]); } } else if ( colSh.whatscheme == COLSH_NN ) { if ( x < colSh.dist_r ) { f = x / colSh.dist_r; } else { f = 1.0; } } /*fprintf(stderr,"COLOR__SCHEME: x=%10.5f, factor=%10.5f\n", x, f);*/ if (colorscheme > COLSH_GEOGRAPHIC) colorscheme = COLSH_GEOGRAPHIC; else if (colorscheme < COLSH_MONOCHROME) colorscheme = COLSH_MONOCHROME; for(i=0; i= bcol[colorscheme].baseintv[i+1] ) { fac = (bcol[colorscheme].baseintv[i] - f) / (bcol[colorscheme].baseintv[i] - bcol[colorscheme].baseintv[i+1]); for(j=0; j<3; j++) col[j] = (1.0 - fac) * bcol[colorscheme].basecol[i][j] + fac * bcol[colorscheme].basecol[i+1][j]; break; } /* if colortype is COLSH_COMBINED above obtained color should be mixed with current atcol */ if (colortype == COLSH_COMBINED) { /* correct combined equation if needed */ col[0] = alpha * col[0] + (1.0 - alpha)*oldcol[0]; col[1] = alpha * col[1] + (1.0 - alpha)*oldcol[1]; col[2] = alpha * col[2] + (1.0 - alpha)*oldcol[2]; } } static void AssignColorInit(void) { register int i, j; /* MONOCHROME */ bcol[COLSH_MONOCHROME].ncol = 2; bcol[COLSH_MONOCHROME].baseintv[0] = 1.0; bcol[COLSH_MONOCHROME].baseintv[1] = 0.0; for(i=0; i<2; i++) for(j=0; j<4; j++) bcol[COLSH_MONOCHROME].basecol[i][j] = monocol[i][j]; /* RAINBOW */ bcol[COLSH_RAINBOW].ncol = 6; for (i=0;i<6;i++) bcol[COLSH_RAINBOW].baseintv[i] = 1.0 - (float) i / 5.0; for(i=0; i<6; i++) for(j=0; j<4; j++) bcol[COLSH_RAINBOW].basecol[i][j] = rainbow[i][j]; /* RGB */ bcol[COLSH_RGB].ncol = 3; for (i=0;i<3;i++) bcol[COLSH_RGB].baseintv[i] = 1.0 - (float) i / 2.0; for(i=0; i<3; i++) for(j=0; j<4; j++) bcol[COLSH_RGB].basecol[i][j] = rgbcol[i][j]; /* GEOGRAPHIC */ bcol[COLSH_GEOGRAPHIC].ncol = 11; for (i=0;i<11;i++) bcol[COLSH_GEOGRAPHIC].baseintv[i] = 1.0 - (float) i / 10.0; for(i=0; i<11; i++) for(j=0; j<4; j++) bcol[COLSH_GEOGRAPHIC].basecol[i][j] = geographic[i][j]; } xcrysden-1.6.2/C/xcMolSurf.c0000644000175000017500000010434013525506046014333 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcMolSurf.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include "xcGLparam.h" #include "struct.h" #include "isosurf.h" #include "memory.h" #include "molsurf.h" #include "xcfunc.h" #define DIST3(x,y,z) ( sqrt((x)*(x) + (y)*(y) + (z)*(z)) ) extern StructSize ss; MOL_SURF *mols=NULL, *molsPtr = NULL; static void MolSurfGauss_Init(MOL_SURF *mols); static void MolSurfExp_Init(MOL_SURF *mols); static float MolSurfGauss(MOL_SURF *mols, int nat, float dis); static float MolSurfExp(MOL_SURF *mols, int nat, float dis); static float MolSurfGaussPlain(MOL_SURF *mols, int nat, float dis); static float MolSurfExpPlain(MOL_SURF *mols, int nat, float dis); extern void MarchCubeNew(ISOSURFACE *iso, float ***gridvalue, float vec[][3], float origin[], int ix, int iy, int iz, float isolevel, int algorithm, int shade_model, int normals_model); extern void xcSurfSmoothing( ISOSURFACE *iso, float isolevel ); extern void MolSurfGridAtomicColor(ISOSURFACE *iso, float mols_d); MOL_SURF *FindMolSurf(int index) { MOL_SURF *g = molsPtr; while (g) { if (index == g->index) return g; g = g->ptr; } return NULL; } static void AddToMolSurfList(MOL_SURF *g) { g->ptr = molsPtr; molsPtr = g; } int NewMolSurf(void) { static int index = -1; mols = (MOL_SURF *) calloc (1, sizeof(MOL_SURF) ); mols->index=++index; mols->isosurf_index = -1; /* set to DEFAULTS */ mols->type = MOLS_GAUSSIAN; mols->rad = rcov; /* alternative is rvdw */ mols->colorscheme = MOLS_ATOMIC; mols->dispt.drawstyle = ISOSURF_SOLID; mols->dispt.shademodel = GL_SMOOTH; mols->dispt.transparent= ISOSURF_TRANSP_OFF; mols->d = 0.4; /* allocate somewhat bigger vector to acount for primcell -> convcell conversion */ mols->atmindex = (int *) malloc((size_t)(2*natoms) * sizeof(int)); mols->smooth_nstep = 0; mols->smooth_weight = 0.5; mols->isoexpand.irepvec[0] = 1; mols->isoexpand.irepvec[1] = 1; mols->isoexpand.irepvec[2] = 1; mols->interp_molgrid = (float ***)NULL; mols->interp_n[0] = 1; mols->interp_n[1] = 1; mols->interp_n[2] = 1; mols->frontface = GL_CW; mols->revertnormals = 0; mols->tessellation_algorithm = ISOSURF_MARCHING_CUBES; mols->normals_algorithm = ISOSURF_NORMALS_GRADIENT; AddToMolSurfList( mols ); return index; } static float ln_of_2 = 0.69314718055994530941; static void MolSurfGauss_Init(MOL_SURF *mols) { int i; mols->c[0] = 0.0; for(i=1; i<=MAXNAT; i++) mols->c[i] = ln_of_2 / (mols->rad[i]*mols->rad[i]); } static void MolSurfExp_Init(MOL_SURF *mols) { int i; mols->c[0] = 0.0; for(i=1; i<=MAXNAT; i++) mols->c[i] = ln_of_2 / mols->rad[i]; } static float MolSurfGauss(MOL_SURF *mols, int nat, float dis) { return 2.0 * exp(-mols->c[nat] * dis*dis); } static float MolSurfExp(MOL_SURF *mols, int nat, float dis) { return 2.0 * exp(-mols->c[nat] * dis); } static float MolSurfGaussPlain(MOL_SURF *mols, int nat, float dis) { return 2.0 * exp(-ln_of_2 * dis*dis); } static float MolSurfExpPlain(MOL_SURF *mols, int nat, float dis) { return 2.0 * exp(-ln_of_2 * dis); } int XC_MolSurfRegCmd(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[]) { int ident; char *result = (char *) Tcl_Alloc((size_t) 10 * sizeof(char)); /* so far ignored */ ident=NewMolSurf(); sprintf(result,"%d",ident); Tcl_SetResult(interp, result, TCL_DYNAMIC); VPf.surface = (int *) realloc( VPf.surface, (size_t) (VPf.nsurface+1) * sizeof(int) ); VPf.surfacePtr = (void **) realloc( VPf.surfacePtr, (size_t) (VPf.nsurface+1) * sizeof(void*) ); VPf.surface[VPf.nsurface] = 0; VPf.surfacePtr[VPf.nsurface++] = (void *) FindMolSurf( ident ); return TCL_OK; } /***************************************************************************** xc_molsurf -ident -type gauss|exp|unigauss|uniexp \ -radius cov|VdW \ -level \ -cutoff \ -colorscheme atomic|monochrome \ -drawstyle solid|wire|dot \ -transparent 0|1 \ -shademodel smooth|flat \ -monocolor { } \ -surfacetype molsurf|gap -resolution \ -smoothsteps \ -smoothweight \ -tessellation cube|tetrahedron \ -normals gradient|triangle ADD: xc_molsurfreg xc_molsurfconfig -ident \ -render 0|1 \ -level -colorscheme atomic|monochrome \ -drawstyle solid|wire|dot \ -transparent 0|1 \ -shademodel smooth|flat -monocolor { } \ -surfacetype molsurf|gap \ -smoothsteps \ -smoothweight \ -tessellation cube|tetrahedron \ -normals gradient|triangle write the display-function complete the colorschemes the distance colorcheme, can be made separate, which is better that grasping from atomic-colorscheme !!! ce imamo crystal, potem so drugi mols->lowcoor and mols->size; change that !!! preveri se pointerje pri iso. Vzacetku jih postavi na NULL, potem pa v MarchCube, ce niso NULL jih najprej free(); *****************************************************************************/ int XC_MolSurfConfigCmd(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[]) { register int i, j; int s_nstep, s_algorithm, s_normals; float s_weight, s_level; struct Togl *togl; ISOSURFACE *iso; /* so far ignored !!! */ /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* -IDENTIFIER */ if ( strncmp(argv[2], "-iden", 5) == 0 ) { int ident; if ( Tcl_GetInt(interp, argv[3], &ident) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols = FindMolSurf( ident ); if (!mols) { char rss[1024]; snprintf(rss, sizeof(rss),"couldn't find MolSurface %d !!!\n", ident); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (mols->isosurf_index < 0) { Tcl_SetResult(interp, "xc_molsurf must be called before xc_molsurfconfig!!!", TCL_STATIC); return TCL_ERROR; } } else { Tcl_SetResult(interp, "Usage: xc_molsurfconfig -ident indent options ...", TCL_STATIC); return TCL_ERROR; } s_level = mols->isolevel; s_nstep = mols->smooth_nstep; s_weight = mols->smooth_weight; s_algorithm = mols->tessellation_algorithm; s_normals = mols->normals_algorithm; for (i=4; iisosurf_index] = 0; else VPf.surface[mols->isosurf_index] = 1; } /* -LEVEL */ else if ( strncmp(argv[i], "-leve", 5) == 0 ) { double level; if ( Tcl_GetDouble(interp, argv[i+1], &level) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->isolevel = (float) level; } /* -COLORSHEME */ else if ( strncmp(argv[i], "-colo", 5) == 0 ) { if ( strncmp(argv[i+1], "atom", 4) == 0 ) mols->colorscheme = MOLS_ATOMIC; else if ( strncmp(argv[i+1], "mono", 4) == 0 ) mols->colorscheme = MOLS_MONOCHROME; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -colorscheme option\" command; option should be atomic or monocolor\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -DRAWSTYLE */ else if ( strncmp(argv[i], "-draw", 5) == 0 ) { if ( strcmp(argv[i+1], "solid") == 0 ) mols->dispt.drawstyle = ISOSURF_SOLID; else if ( strcmp(argv[i+1], "wire") == 0 ) mols->dispt.drawstyle = ISOSURF_WIRE; else if ( strcmp(argv[i+1], "dot") == 0 ) mols->dispt.drawstyle = ISOSURF_DOT; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -drawstyle option\" command; option should be solid, wire or dot\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -TRANSPARENT */ else if ( strncmp(argv[i], "-tran", 5) == 0 ) { int transp; if ( Tcl_GetInt(interp, argv[i+1], &transp) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->dispt.transparent = transp; } /* -SHADEMODEL */ else if ( strncmp(argv[i], "-shade", 6) == 0 ) { if ( strncmp(argv[i+1], "smooth", 6) == 0 ) mols->dispt.shademodel = GL_SMOOTH; else if ( strncmp(argv[i+1], "flat", 4) == 0 ) mols->dispt.shademodel = GL_FLAT; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -shademodel option\" command; option should be smooth or flat\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -TESSELLATION */ else if ( strncmp(argv[i], "-tessel", 6) == 0 ) { if ( strncmp(argv[i+1], "cube", 4) == 0 ) mols->tessellation_algorithm = ISOSURF_MARCHING_CUBES; else if ( strncmp(argv[i+1], "tetra", 5) == 0 ) mols->tessellation_algorithm = ISOSURF_TETRAHEDRAL; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -tessellation option\" command; option should be cube or tetrahedron\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -NORMALS */ else if ( strncmp(argv[i], "-norm", 5) == 0 ) { if ( strncmp(argv[i+1], "grad", 4) == 0 ) mols->normals_algorithm = ISOSURF_NORMALS_GRADIENT; else if ( strncmp(argv[i+1], "trian", 5) == 0 ) mols->normals_algorithm = ISOSURF_NORMALS_TRIANGLE; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -tessellation option\" command; option should be cube or tetrahedron\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -MONOCOLOR */ else if ( strncmp(argv[i], "-mono", 5) == 0 ) { double rgb; int argcList; const char **argvList; Tcl_SplitList(interp, argv[i+1], &argcList, &argvList); for (j=0; jmonocolor[j] = (float) rgb; mols->back_monocolor[j] = (float) rgb-0.3; if ( mols->back_monocolor[j] < 0.0 ) mols->back_monocolor[j] = 0.0; } mols->monocolor[3]=0.5; mols->back_monocolor[3]=0.5; } /* -SMOOTHSTEPS */ else if ( strncmp(argv[i], "-smooths", 8) == 0 ) { int nstep; if ( Tcl_GetInt(interp, argv[i+1], &nstep) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->smooth_nstep = nstep; } /* -SMOOTHWEIGHT */ else if ( strncmp(argv[i], "-smoothw", 8) == 0 ) { double weight; if ( Tcl_GetDouble(interp, argv[i+1], &weight) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->smooth_weight = (float) weight; } else { Tcl_SetResult(interp, "Usage: xc_molsurf -ident indent ...", TCL_STATIC); return TCL_ERROR; } } /***************************************************************************/ iso = FindIsoSurf( mols->isosurf_index ); iso->smooth_nstep = mols->smooth_nstep; iso->smooth_weight = mols->smooth_weight; if ( s_level != mols->isolevel || s_algorithm != mols->tessellation_algorithm || s_normals != mols->normals_algorithm ) { /*fprintf(stderr,"iso=%ld\n", iso);*/ MarchCubeNew(iso, mols->molgrid, mols->vec, mols->lowcoor, mols->i, mols->j, mols->k, mols->isolevel, mols->tessellation_algorithm, mols->dispt.shademodel, mols->normals_algorithm); } if ( s_nstep != iso->smooth_nstep || s_weight != iso->smooth_weight || s_level != mols->isolevel || s_algorithm != mols->tessellation_algorithm || s_normals != mols->normals_algorithm ) { xcSurfSmoothing( iso, mols->isolevel ); /* now add color */ if ( mols->colorscheme == MOLS_ATOMIC ) { MolSurfGridAtomicColor( iso, mols->d ); } else if ( mols->colorscheme == MOLS_DISTANCE ) { ; } else if ( mols->colorscheme == MOLS_MONOCHROME ) { ; } } s_nstep = iso->smooth_nstep; s_weight = iso->smooth_weight; s_level = mols->isolevel; s_algorithm = mols->tessellation_algorithm; s_normals = mols->normals_algorithm; UpdateProjection(); Togl_PostRedisplay(togl); return TCL_OK; } int XC_MolSurfCmd(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[]) { register int i, j; struct Togl *togl; /*float ***molgrid;*/ /*float Vec[3][3];*/ ISOSURFACE *iso; /* so far ignored !!! */ /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* -IDENTIFIER */ if ( strncmp(argv[2], "-iden", 5) == 0 ) { int ident; if ( Tcl_GetInt(interp, argv[3], &ident) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /***************************/ mols = FindMolSurf( ident ); /***************************/ if (!mols) { char rss[1024]; snprintf(rss, sizeof(rss),"couldn't find MolSurface %d !!!\n", ident); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else { Tcl_SetResult(interp, "Usage: xc_molsurf -ident indent ...", TCL_STATIC); return TCL_ERROR; } for (i=4; itype = MOLS_GAUSSIAN; else if ( strcmp(argv[i+1], "exp") == 0 ) mols->type = MOLS_EXP; else if ( strncmp(argv[i+1], "unig", 4) == 0 ) mols->type = MOLS_UNIGAUSS; else if ( strncmp(argv[i+1], "unie", 4) == 0 ) mols->type = MOLS_UNIEXP; else if ( strncmp(argv[i+1], "distf", 5) == 0 ) mols->type = MOLS_DISTFUNC; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -type option\" command; option should be gauss, exp, unigauss, uniexp or distfunc\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -RADIUS */ else if ( strncmp(argv[i], "-radi", 5) == 0 ) { if ( strcmp(argv[i+1], "cov") == 0 ) mols->rad = rcov; else if ( strcmp(argv[i+1], "VdW") == 0 ) mols->rad = rvdw; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -radius option\" command; option should be cov or VdW\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -LEVEL */ else if ( strncmp(argv[i], "-leve", 5) == 0 ) { double level; if ( Tcl_GetDouble(interp, argv[i+1], &level) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->isolevel = (float) level; } /* -CUTOFF */ else if ( strncmp(argv[i], "-cuto", 5) == 0 ) { double cutoff; if ( Tcl_GetDouble(interp, argv[i+1], &cutoff) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->cutoff = (float) cutoff; } /* -COLORSHEME */ else if ( strncmp(argv[i], "-colo", 5) == 0 ) { if ( strncmp(argv[i+1], "atom", 4) == 0 ) mols->colorscheme = MOLS_ATOMIC; else if ( strncmp(argv[i+1], "mono", 4) == 0 ) mols->colorscheme = MOLS_MONOCHROME; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -colorscheme option\" command; option should be atomic or monocolor\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -DRAWSTYLE */ else if ( strncmp(argv[i], "-draw", 5) == 0 ) { if ( strcmp(argv[i+1], "solid") == 0 ) mols->dispt.drawstyle = ISOSURF_SOLID; else if ( strcmp(argv[i+1], "wire") == 0 ) mols->dispt.drawstyle = ISOSURF_WIRE; else if ( strcmp(argv[i+1], "dot") == 0 ) mols->dispt.drawstyle = ISOSURF_DOT; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -drawstyle option\" command; option should be solid, wire or dot\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -TRANSPARENT */ else if ( strncmp(argv[i], "-tran", 5) == 0 ) { int transp; if ( Tcl_GetInt(interp, argv[i+1], &transp) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->dispt.transparent = transp; } /* -SHADEMODEL */ else if ( strncmp(argv[i], "-shade", 6) == 0 ) { if ( strncmp(argv[i+1], "smooth", 6) == 0 ) mols->dispt.shademodel = GL_SMOOTH; else if ( strncmp(argv[i+1], "flat", 4) == 0 ) mols->dispt.shademodel = GL_FLAT; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -shademodel option\" command; option should be smooth or flat\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -TESSELLATION */ else if ( strncmp(argv[i], "-tessel", 6) == 0 ) { if ( strncmp(argv[i+1], "cube", 4) == 0 ) mols->tessellation_algorithm = ISOSURF_MARCHING_CUBES; else if ( strncmp(argv[i+1], "tetra", 5) == 0 ) mols->tessellation_algorithm = ISOSURF_TETRAHEDRAL; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -tessellation option\" command; option should be cube or tetrahedron\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -NORMALS */ else if ( strncmp(argv[i], "-norm", 5) == 0 ) { if ( strncmp(argv[i+1], "grad", 4) == 0 ) mols->normals_algorithm = ISOSURF_NORMALS_GRADIENT; else if ( strncmp(argv[i+1], "trian", 5) == 0 ) mols->normals_algorithm = ISOSURF_NORMALS_TRIANGLE; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -tessellation option\" command; option should be cube or tetrahedron\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -MONOCOLOR */ else if ( strncmp(argv[i], "-mono", 5) == 0 ) { double rgb; int argcList; const char **argvList; Tcl_SplitList(interp, argv[i+1], &argcList, &argvList); for (j=0; jmonocolor[j]=(float)rgb; } mols->monocolor[3]=0.5; } /* -SURFACETYPE */ else if ( strncmp(argv[i], "-surf", 5) == 0 ) { if ( strncmp(argv[i+1], "mols", 4) == 0 ) mols->surftype = MOLS_MOLSURF; else if ( strncmp(argv[i+1], "gap", 3) == 0 ) mols->surftype = MOLS_GAP; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"xc_molsurf %s -surftype option\" command; option should be molsurf or gap\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -RESOLUTION */ else if ( strncmp(argv[i], "-res", 4) == 0 ) { double res; if ( Tcl_GetDouble(interp, argv[i+1], &res) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->d = (float) res; } /* -SMOOTHSTEPS */ else if ( strncmp(argv[i], "-smooths", 8) == 0 ) { int nstep; if ( Tcl_GetInt(interp, argv[i+1], &nstep) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->smooth_nstep = nstep; } /* -SMOOTHWEIGHT */ else if ( strncmp(argv[i], "-smoothw", 8) == 0 ) { double weight; if ( Tcl_GetDouble(interp, argv[i+1], &weight) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->smooth_weight = (float) weight; } else { Tcl_SetResult(interp, "Usage: xc_molsurf -ident indent options ...", TCL_STATIC); return TCL_ERROR; } } /***************************************************************************/ if (mols->type == MOLS_GAUSSIAN) { MolSurfGauss_Init( mols ); mols->MolSurfFunc = MolSurfGauss; } else if (mols->type == MOLS_EXP) { MolSurfExp_Init( mols ); mols->MolSurfFunc = MolSurfExp; } else if (mols->type == MOLS_UNIGAUSS) mols->MolSurfFunc = MolSurfGaussPlain; else if (mols->type == MOLS_UNIEXP) mols->MolSurfFunc = MolSurfExpPlain; /********************/ /* xcr.dim == 0,1,2 */ /********************/ /* define size[], cutoff, lowcoor */ if ( xcr.dim < 3 || mols->surftype == MOLS_MOLSURF ) { mols->lightm.two_side_iso[0] = 0.0; mols->lowcoor[0] = ss.minX - (max.r + 1.05 * mols->cutoff); mols->lowcoor[1] = ss.minY - (max.r + 1.05 * mols->cutoff); mols->lowcoor[2] = ss.minZ - (max.r + 1.05 * mols->cutoff); mols->size[0] = (ss.maxX - ss.minX) + 2.0*(max.r + 1.05*mols->cutoff); mols->size[1] = (ss.maxY - ss.minY) + 2.0*(max.r + 1.05*mols->cutoff); mols->size[2] = (ss.maxZ - ss.minZ) + 2.0*(max.r + 1.05*mols->cutoff); /* mols->size[0] = (max.x+mx) + max.r + 1.05*mols->cutoff - mols->lowcoor[0]; mols->size[1] = (max.y+my) + max.r + 1.05*mols->cutoff - mols->lowcoor[1]; mols->size[2] = (max.z+mz) + max.r + 1.05*mols->cutoff - mols->lowcoor[2]; */ for(i=0; i<3; i++) { for(j=0; j<3; j++) { mols->vec[i][j] = 0.0; mols->isoexpand.rep_vec[i][j] = 0.0; } mols->vec[i][i] = mols->size[i]; } if ( xcr.dim == 1 && mols->surftype == MOLS_GAP ) { /* insert code */ ; } else if ( xcr.dim == 2 && mols->surftype == MOLS_GAP ) { /* insert code */ ; } } else if ( xcr.dim == 3 ) { double (*vecP)[4]; mols->lightm.two_side_iso[0] = 0.0; /* insert code */ mols->lowcoor[0] = 0.0; mols->lowcoor[1] = 0.0; mols->lowcoor[2] = 0.0; if ( xcr.celltype == XCR_PRIMCELL ) vecP = vec.prim; else vecP = vec.conv; mols->size[0] = distdv( vecP[0] ); mols->size[1] = distdv( vecP[1] ); mols->size[2] = distdv( vecP[2] ); for(i=0; i<3; i++) { for(j=0; j<3; j++) { mols->vec[i][j] = vecP[i][j]; mols->isoexpand.rep_vec[i][j] = vecP[i][j]; } mols->isoexpand.irepvec[i] = xcr.nunit[i]; } } mols->i = iroundf(mols->size[0] / mols->d) + 1; mols->j = iroundf(mols->size[1] / mols->d) + 1; mols->k = iroundf(mols->size[2] / mols->d) + 1; mols->molgrid = xcMallocTensor3f(mols->i, mols->j, mols->k); MolSurfGrid(mols, mols->molgrid); if(mols->isosurf_index < 0) mols->isosurf_index = NewIsoSurf(); iso = FindIsoSurf( mols->isosurf_index ); VPf.surface[mols->isosurf_index] = 1; iso->smooth_nstep = mols->smooth_nstep; iso->smooth_weight = mols->smooth_weight; MarchCubeNew(iso, mols->molgrid, mols->vec, mols->lowcoor, mols->i, mols->j, mols->k, mols->isolevel, mols->tessellation_algorithm, mols->dispt.shademodel, mols->normals_algorithm); /* now add color */ if ( mols->colorscheme == MOLS_ATOMIC ) { MolSurfGridAtomicColor( iso, mols->d ); } else if ( mols->colorscheme == MOLS_DISTANCE ) { ; } else if ( mols->colorscheme == MOLS_MONOCHROME ) { ; } UpdateProjection(); Togl_PostRedisplay(togl); /*free( (FREE_ARG) mols->molgrid );*/ return TCL_OK; } void MolSurfGridAtomicColor(ISOSURFACE *iso, float mols_d) { register int i, j; float dis, mindis, mindis1, mindis2; int ind, ind1, ind2; float f0, f1, f2, d, d_2, div_1; iso->color = (float (*)[4]) realloc(iso->color, (size_t)iso->nvertex * sizeof(float [4])); d = 0.3; d_2 = 0.5 / d ; for (i=0; invertex; i++) { mindis = mindis1 = mindis2 = +9.9e99; ind = 1; ind1 = 1; ind2 = 1; /*------------------------------------------------------------------------ this was an idea, #0/#1/#2, will it give good results ??? -----------------------------------------------------------------------*/ /* find index #0 */ for (j=1; j<=natoms; j++) { dis = dist6( iso->vertex[i].x, xat[j]+mx, iso->vertex[i].y, yat[j]+my, iso->vertex[i].z, zat[j]+mz ); if ( mindis > dis ) { ind = j; mindis = dis; } } /* find index #1 */ for (j=1; j<=natoms; j++) { if (j == ind ) continue; dis = dist6( iso->vertex[i].x, xat[j]+mx, iso->vertex[i].y, yat[j]+my, iso->vertex[i].z, zat[j]+mz ); if ( mindis1 > dis ) { ind1 = j; mindis1 = dis; } } /* find index #2 */ for (j=1; j<=natoms; j++) { if (j == ind || j == ind1 ) continue; dis = dist6( iso->vertex[i].x, xat[j]+mx, iso->vertex[i].y, yat[j]+my, iso->vertex[i].z, zat[j]+mz ); if ( mindis2 > dis ) { ind2 = j; mindis2 = dis; } } /* if mindisX are with some range -> mix the colors let this parameter be d !!! */ f0 = 1.0; f1 = 0.0; f2 = 0.0; if ( mindis1 - mindis < d ) { f0 = 0.5 + d_2 * (mindis1 - mindis); f1 = 1 - f0; } if ( mindis2 - mindis < d ) { f2 = 0.5 - d_2 * (mindis2 - mindis); div_1 = 1 / (f0 + f1 + f2); f0 *= div_1; f1 *= div_1; f2 *= div_1; } for (j=0; j<3; j++) { iso->color[i][j] = f0*atm.col[ind][j] + f1*atm.col[ind1][j]+f2*atm.col[ind2][j]; /*iso->color[i][j] = atcol[nat[ind]][j];*/ /* so far !!! */ iso->color[i][3] = 0.4; /* fprintf(stderr,"col: %f %f %f %f\n", iso->color[i][0], iso->color[i][1], iso->color[i][2], iso->color[i][3]); */ /*fprintf(stderr,"f0: %10.5f; f1: %10.5f; f2: %10.5f\n", f0, f1, f2);*/ } /* for(i=0; invertex; i++) fprintf(stderr,"col: %f %f %f %f\n", iso->color[i][0], iso->color[i][1], iso->color[i][2], iso->color[i][3]); */ } } /* *** molgrid must not be pre-allocated */ int MolSurfGrid(MOL_SURF *mols, float ***molgrid) { register int ix, iy, iz, i; register float dens, dx, dy, dz, dis, mindis; float tmpXYZ[3]; /*float rad;*/ if (mols->surftype == MOLS_MOLSURF) { /* take care of mols.res.$ !!!!!!!!!!!!!!!!!!! */ dx = mols->size[0] / (float) (mols->i - 1); dy = mols->size[1] / (float) (mols->j - 1); dz = mols->size[2] / (float) (mols->k - 1); /* rad is cutoff criteria */ /*rad = max.r + 1.05 * mols->cutoff;*/ /* now made a loop over whole grid; take a XY plane and travel along Z * direction */ fprintf(stderr,"Molecular Surface: Grid generation\n"); fprintf(stderr," Grid resolution: %d x %d x %d\n", mols->i, mols->j, mols->k); fprintf(stderr," Grid bounds: lowcoor=[%6.3f,%6.3f,%6.3f], size=[%6.3f,%6.3f,%6.3f]\n", mols->lowcoor[0], mols->lowcoor[1], mols->lowcoor[2], mols->size[0], mols->size[1], mols->size[2]); xcErrDebug("Beginning Grid calculation"); for (ix=0; ixi; ix++) { tmpXYZ[0] = mols->lowcoor[0] + (float) ix * dx; for (iy=0; iyj; iy++) { tmpXYZ[1] = mols->lowcoor[1] + (float) iy * dy; for (iz=0; izk; iz++) { tmpXYZ[2] = mols->lowcoor[2] + (float) iz * dz; dens = 0.0; mindis = 999.9; for (i=1; i<=natoms; i++) { dis = DIST3( tmpXYZ[0] - (xat[i]+mx), tmpXYZ[1] - (yat[i]+my), tmpXYZ[2] - (zat[i]+mz) ); if ( mols->type != MOLS_DISTFUNC ) { dens += mols->MolSurfFunc(mols, nat[i], dis); } else { if ( dis < mindis ) { mindis = dis; dens = dis; } } } molgrid[ix][iy][iz] = dens; } } xcErrDebug("step YZ calculation performed"); } /* ix */ xcErrDebug("Grid calculation is Done"); /* mols->natm = 0; for (i=1; i<=natoms; i++) { xl = tmpXYZ[0] - (xat[i]+mx); yl = tmpXYZ[1] - (yat[i]+my); dis = sqrt( xl * xl + yl * yl ); if ( dis < rad ) { mols->atmindex[mols->natm] = i; mols->natm++; } } for (iz=0; izk; iz++) { tmpXYZ[2] = mols->lowcoor[2] + (float) iz * dz; dens = 0.0; mindis = 2.0 * ss.maxX; for (i=0; inatm; i++) { dis = dist3f( tmpXYZ[0] - (xat[ mols->atmindex[i] ]+mx), tmpXYZ[1] - (yat[ mols->atmindex[i] ]+my), tmpXYZ[2] - (zat[ mols->atmindex[i] ]+mz) ); if ( mols->type != MOLS_DISTFUNC ) { dens += mols->MolSurfFunc(mols, nat[ mols->atmindex[i] ], dis); } else { if ( dis < mindis ) { mindis = dis; dens = dis; } } } molgrid[ix][iy][iz] = dens; } */ } else { /******************************/ /* mols->surftype == MOLS_GAP */ /******************************/ register int ii, jj, kk, idn, iup, jdn, jup, kdn, kup; float x[3], a, b, c; int size, *atn; double (*fcoor)[3], (*vP)[4], dii, djj, dkk; size = xcr.natr; if ( xcr.celltype == XCR_PRIMCELL) { fcoor = xcr.prim_fcoor; atn = xcr.prim_nat; vP = vec.prim; } else if ( xcr.celltype == XCR_CONVCELL ) { size *= xcr.ncell; fcoor = xcr.conv_fcoor; atn = xcr.conv_nat; vP = vec.conv; } /* now made a loop over whole grid */ for (ix=0; ixi; ix++) { dx = (float)ix / (float)(mols->i-1); for (iy=0; iyj; iy++) { dy = (float)iy / (float)(mols->j-1); for (iz=0; izk; iz++) { dz = (float)iz / (float)(mols->k-1); dens = 0.0; mindis = 9.9e+99; for (i=0; i 0.7 ) { idn=0; iup=1; } if ( fcoor[i][1] < 0.3 ) { jdn=-1; jup=0; } else if ( fcoor[i][1] > 0.7 ) { jdn=0; jup=1; } if ( fcoor[i][2] < 0.3 ) { kdn=-1; kup=0; } else if ( fcoor[i][2] > 0.7 ) { kdn=0; kup=1; } */ /* in cell 000 */ for (ii=idn; ii<=iup; ii++) { dii = (double) ii; for (jj=jdn; jj<=jup; jj++) { djj = (double) jj; for (kk=kdn; kk<=kup; kk++) { dkk = (double) kk; a = dx - (dii + fcoor[i][0]); b = dy - (djj + fcoor[i][1]); c = dz - (dkk + fcoor[i][2]); /* convert tmpXYZ to Cartesian coordinates !!! */ x[0] = a*vP[0][0] + b*vP[1][0] + c*vP[2][0]; x[1] = a*vP[0][1] + b*vP[1][1] + c*vP[2][1]; x[2] = a*vP[0][2] + b*vP[1][2] + c*vP[2][2]; dis = distfv( x ); if ( mols->type != MOLS_DISTFUNC ) { dens += mols->MolSurfFunc(mols, atn[i], dis); } else { if ( dis < mindis ) { mindis = dis; dens = dis; } } } } } } molgrid[ix][iy][iz] = dens; } /* iz */ } } } return XC_OK; } xcrysden-1.6.2/C/crySurfArgs.c0000644000175000017500000004623313525506046014671 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/crySurfArgs.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include "xcGLparam.h" #include "struct.h" #include "isosurf.h" #include "memory.h" #include "molsurf.h" #include "xcfunc.h" int VerifyReadSurfOpt(const char *option, size_t n, struct READSURF_OPT *opts, char *argv[]) { char *opt; int i; i=0; opt = opts[i].option; while( opt ) { if ( strncmp( option, opt, n ) == 0 ) { if ( opts[i].flag == XC_FORBIDDEN ) { fprintf(stderr, "option %s not allowed !!!\nError while executing %s %s", option, argv[0], argv[1]); return XC_ERROR; } else { return XC_OK; } } opt = opts[++i].option; } fprintf(stderr, "option %s not known !!!\nError while executing %s %s", option, argv[0], argv[1]); return XC_ERROR; } int cryReadSurfARGS(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[], NEW_WIN_CONTEXT *wc, MOL_SURF *mols, struct READSURF_OPT *opt) { register int i, j; for (i=4; itype = MOLS_GAUSSIAN; else if ( strcmp(argv[i+1], "exp") == 0 ) mols->type = MOLS_EXP; else if ( strncmp(argv[i+1], "unig", 4) == 0 ) mols->type = MOLS_UNIGAUSS; else if ( strncmp(argv[i+1], "unie", 4) == 0 ) mols->type = MOLS_UNIEXP; else if ( strncmp(argv[i+1], "distf", 5) == 0 ) mols->type = MOLS_DISTFUNC; else if ( strncmp(argv[i+1], "fs", 2) == 0 || strncmp(argv[i+1], "fermis", 6) == 0 ) mols->type = MOLS_FERMISURFACE; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"%s %s -type option\" command; option should be gauss, exp, unigauss, uniexp, distfuncor fermisurface\n", argv[i+1], argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -RENDER */ else if ( strncmp(argv[i], "-rend", 5) == 0 ) { int index, rend; if ( !VerifyReadSurfOpt("-rend", 3, opt, argv) ) return TCL_ERROR; if ( Tcl_GetInt(interp, argv[i+1], &rend) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } index = FindSurfaceOfWindow( wc, mols ); if ( index < 0 ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find surface #%d on window %s !!!\n", mols->isosurf_index, argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } wc->VPf.surface[index] = 1; } /* -FS */ else if ( strncmp(argv[i], "-fs", 3) == 0 ) { int argcList; const char **argvList; if ( !VerifyReadSurfOpt("-fs", 3, opt, argv) ) return TCL_ERROR; Tcl_SplitList(interp, argv[i+1], &argcList, &argvList); if ( !ReadFS_ARGS(interp, argcList, argvList, wc, mols) ) return TCL_ERROR; } /* -RADIUS */ else if ( strncmp(argv[i], "-radi", 5) == 0 ) { if ( !VerifyReadSurfOpt("-radi", 5, opt, argv) ) return TCL_ERROR; if ( strcmp(argv[i+1], "cov") == 0 ) mols->rad = rcov; else if ( strcmp(argv[i+1], "VdW") == 0 ) mols->rad = rvdw; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"%s %s -radius option\" command; option should be cov or VdW\n", argv[i+1], argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -LEVEL */ else if ( strncmp(argv[i], "-leve", 5) == 0 ) { double level; if ( !VerifyReadSurfOpt("-leve", 5, opt, argv) ) return TCL_ERROR; if ( Tcl_GetDouble(interp, argv[i+1], &level) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->isolevel = (float) level; } /* -CUTOFF */ else if ( strncmp(argv[i], "-cuto", 5) == 0 ) { double cutoff; if ( !VerifyReadSurfOpt("-cuto", 5, opt, argv) ) return TCL_ERROR; if ( Tcl_GetDouble(interp, argv[i+1], &cutoff) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->cutoff = (float) cutoff; } /* -COLORSHEME */ else if ( strncmp(argv[i], "-colo", 5) == 0 ) { if ( !VerifyReadSurfOpt("-colo", 5, opt, argv) ) return TCL_ERROR; if ( strncmp(argv[i+1], "atom", 4) == 0 ) mols->colorscheme = MOLS_ATOMIC; else if ( strncmp(argv[i+1], "mono", 4) == 0 ) mols->colorscheme = MOLS_MONOCHROME; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"cry_molsurf %s -colorscheme option\" command; option should be atomic or monocolor\n", argv[i+1], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -DRAWSTYLE */ else if ( strncmp(argv[i], "-draw", 5) == 0 ) { if ( !VerifyReadSurfOpt("-draw", 5, opt, argv) ) return TCL_ERROR; if ( strcmp(argv[i+1], "solid") == 0 ) mols->dispt.drawstyle = ISOSURF_SOLID; else if ( strcmp(argv[i+1], "wire") == 0 ) mols->dispt.drawstyle = ISOSURF_WIRE; else if ( strcmp(argv[i+1], "dot") == 0 ) mols->dispt.drawstyle = ISOSURF_DOT; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"%s %s -drawstyle option\" command; option should be solid, wire or dot\n", argv[i+1], argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -TRANSPARENT */ else if ( strncmp(argv[i], "-tran", 5) == 0 ) { int transp; if ( !VerifyReadSurfOpt("-tran", 5, opt, argv) ) return TCL_ERROR; if ( Tcl_GetInt(interp, argv[i+1], &transp) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->dispt.transparent = transp; } /* -SHADEMODEL */ else if ( strncmp(argv[i], "-shade", 6) == 0 ) { if ( !VerifyReadSurfOpt("-shade", 6, opt, argv) ) return TCL_ERROR; if ( strncmp(argv[i+1], "smooth", 6) == 0 ) mols->dispt.shademodel = GL_SMOOTH; else if ( strncmp(argv[i+1], "flat", 4) == 0 ) mols->dispt.shademodel = GL_FLAT; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"%s %s -shademodel option\" command; option should be smooth or flat\n", argv[i+1], argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -MONOCOLOR */ else if ( strncmp(argv[i], "-mono", 5) == 0 ) { double rgba; int argcList; const char **argvList; if ( !VerifyReadSurfOpt("-mono", 5, opt, argv) ) return TCL_ERROR; Tcl_SplitList(interp, argv[i+1], &argcList, &argvList); for (j=0; jmonocolor[j] = (float) rgba; mols->back_monocolor[j] = 1.0 - (float) rgba; } if ( j < 4) { mols->monocolor[3] = 0.5; mols->back_monocolor[3] = 0.5; } } /* -FRONTMONOCOLOR */ else if ( strncmp(argv[i], "-frontmonocolor", 10) == 0 ) { double rgba; int argcList; const char **argvList; if ( !VerifyReadSurfOpt("-frontmonocolor", 10, opt, argv) ) return TCL_ERROR; Tcl_SplitList(interp, argv[i+1], &argcList, &argvList); for (j=0; jmonocolor[j] = (float) rgba; } if ( j < 4 ) mols->monocolor[3] = 0.5; } /* -BACKMONOCOLOR */ else if ( strncmp(argv[i], "-backmonocolor", 9) == 0 ) { double rgba; int argcList; const char **argvList; if ( !VerifyReadSurfOpt("-backmonocolor", 9, opt, argv) ) return TCL_ERROR; Tcl_SplitList(interp, argv[i+1], &argcList, &argvList); for (j=0; jback_monocolor[j] = (float) rgba; } if ( j < 4 ) mols->back_monocolor[3] = 0.5; } /* -SURFACETYPE */ else if ( strncmp(argv[i], "-surf", 5) == 0 ) { if ( !VerifyReadSurfOpt("-surf", 5, opt, argv) ) return TCL_ERROR; if ( strncmp(argv[i+1], "mols", 4) == 0 ) mols->surftype = MOLS_MOLSURF; else if ( strncmp(argv[i+1], "gap", 3) == 0 ) mols->surftype = MOLS_GAP; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", while executing \"%s %s -surftype option\" command; option should be molsurf or gap\n", argv[i+1], argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* -RESOLUTION */ else if ( strncmp(argv[i], "-res", 4) == 0 ) { double res; if ( !VerifyReadSurfOpt("-res", 5, opt, argv) ) return TCL_ERROR; if ( Tcl_GetDouble(interp, argv[i+1], &res) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->d = (float) res; } /* -SMOOTHSTEPS */ else if ( strncmp(argv[i], "-smooths", 8) == 0 ) { int nstep; if ( !VerifyReadSurfOpt("-smooths", 8, opt, argv) ) return TCL_ERROR; if ( Tcl_GetInt(interp, argv[i+1], &nstep) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->smooth_nstep = nstep; } /* -SMOOTHWEIGHT */ else if ( strncmp(argv[i], "-smoothw", 8) == 0 ) { double weight; if ( !VerifyReadSurfOpt("-smoothw", 8, opt, argv) ) return TCL_ERROR; if ( Tcl_GetDouble(interp, argv[i+1], &weight) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got \"%s\", while executing %s %s %s %s ...", argv[i+1], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->smooth_weight = (float) weight; } /* -FRONTFACE */ else if ( strncmp(argv[i], "-frontface", 7) == 0 ) { if ( strcmp(argv[i+1], "CW") == 0 ) mols->frontface = GL_CW; else if ( strcmp(argv[i+1], "CCW") == 0 ) mols->frontface = GL_CCW; } /* -REVERTNORMALS */ else if ( strncmp(argv[i], "-revertnormals", 8) == 0 ) { int revertnormals; if ( Tcl_GetInt(interp, argv[i+1], &revertnormals) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted int, but got \"%s\"", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } mols->revertnormals = revertnormals; } else { char rss[1024]; snprintf(rss, sizeof(rss), "Usage: %s -ident indent options ...", argv[0]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } return TCL_OK; } int ReadFS_ARGS(Tcl_Interp *interp, int argc, const char *argv[], NEW_WIN_CONTEXT *wc, MOL_SURF *mols) { register int i; int gridindex = -1, gridsubindex = -1, bandindex = -1; struct DATAGRID *grid; /* -fs { -gridindex \ -gridsubindex \ -bandindex \ -celltype para|bz \ -cropbz 0|1 \ -displaycell 0|1 \ ? -celldisplaytype wire|rod|solid ? } */ for (i=0; ifs.celltype = XCR_PARAPIPEDAL; else if ( strncmp(argv[i+1], "bz", 2) == 0 ) mols->fs.celltype = XCR_BZ; else { char rss[1024]; snprintf(rss, sizeof(rss),"invalid cell type %s, must be para or bz !!!\n", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } } /* -CROPBZ */ else if ( strncmp(argv[i], "-cropb", 6) == 0 ) { int cropbz; if ( Tcl_GetInt(interp, argv[i+1], &cropbz) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted 0 or 1 for -cropbz but got %s, while parsing -fs option !!!\n", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } mols->fs.cropbz = (short int) cropbz; } /* -DISPLAYCELL */ else if ( strncmp(argv[i], "-displayc", 9) == 0 ) { if ( Tcl_GetInt(interp, argv[i+1], &wc->VPf.dispLattice) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted 0 or 1 for -displaycell but got %s, while parsing -fs option !!!\n", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } } /* -CELLDISPLAYTYPE */ else if ( strncmp(argv[i], "-celld", 6) == 0 ) { if ( strncmp(argv[i+1], "w", 1) == 0 ) wc->VPf.dispLatType = CELL_WIRE; else if ( strncmp(argv[i+1], "r", 1) == 0 ) wc->VPf.dispLatType = CELL_ROD; else if ( strncmp(argv[i+1], "solidw", 6 ) == 0 ) wc->VPf.dispLatType = CELL_SOLID_AND_WIRE; else if ( strncmp(argv[i+1], "solidr", 6 ) == 0 ) wc->VPf.dispLatType = CELL_SOLID_AND_ROD; else if ( strncmp(argv[i+1], "s", 1) == 0 ) wc->VPf.dispLatType = CELL_SOLID; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown celldisplaytype %s, must be one of wire, rod, solid, solidwire or solidrod !!!\n", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } } /* -INTERPOLATIONDEGREE */ else if ( strncmp(argv[i], "-interpolationdegree", 15) == 0 ) { const char **argvList; int argcList; int ia, n[3]; Tcl_SplitList(interp, argv[i+1], &argcList, &argvList); if ( argcList != 3 ) { char rss[1024]; snprintf(rss, sizeof(rss), "wanted three elements but got %d elements", argcList); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } for (ia=0; ia<3; ia++) { if ( Tcl_GetInt(interp, argvList[ia], &(n[ia])) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "wanted integer but got %s", argvList[ia]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } mols->interp_n[0] = n[0]; mols->interp_n[1] = n[1]; mols->interp_n[2] = n[2]; } /* -WIRECELLCOLOR */ else if ( strncmp(argv[i], "-wirecellcolor", 10) == 0 ) { GetGlParam color; if ( !xcSplitList( XC_GET_RGBA, interp, argv + i + 1, &color ) ) return TCL_ERROR; COPY_V (4, mols->fs.wirecellcolor, color.vec); } /* -SOLIDCELLCOLOR */ else if ( strncmp(argv[i], "-solidcellcolor", 11) == 0 ) { GetGlParam color; if ( !xcSplitList( XC_GET_RGBA, interp, argv + i + 1, &color ) ) return TCL_ERROR; COPY_V (4, mols->fs.solidcellcolor, color.vec); } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown option %s, must be one of -gridindex, -bandindex, -celltype, -cropbz, -displaycell, -celldisplaytype, -wirecellcolor or -solidcellcolor", argv[i]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } } /**************************************************/ /* mandatory options are -gridindex and -bandindex */ /**************************************************/ if ( bandindex < 0 || gridindex < 0 || gridsubindex < 0 ) { Tcl_SetResult(interp, "-gridindex, -gridsubindex and -bandindex options must be specified within -fs { options } !!!\n", TCL_STATIC); return XC_ERROR; } if ( (grid = FindDataGrid( gridindex )) == NULL ) { char rss[1024]; snprintf(rss, sizeof(rss), "can't find grid %d !!!\n", gridindex); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } else mols->fs.gridindex = gridindex; if ( gridsubindex < grid->n_of_subgrids) mols->fs.gridsubindex = gridsubindex; else { char rss[1024]; snprintf(rss, sizeof(rss), "to large gridsubindex %d, must be lower than %d !!!\n", gridsubindex, grid->n_of_subgrids); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } if ( bandindex < grid->nband ) mols->fs.bandindex = bandindex; else { char rss[1024]; snprintf(rss, sizeof(rss), "to large bandindex %d, must be lower than %d !!!\n", gridsubindex, grid->nband); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } return XC_OK; } xcrysden-1.6.2/C/Makefile.cygwin0000644000175000017500000000212713556022211015173 0ustar tonetoneTOPDIR = $(PWD)/.. include ../Make.sys INCS = $(TCL_INCDIR) $(TK_INCDIR) $(GL_INCDIR) $(X_INCDIR) $(EXTERNAL_INCDIR) CPP_FLAGS = -DUSE_FONTS include make-objects objects = $(XC_OBJS) $(EXTERNAL_OBJS) default: objects xcrys-dll xctclsh xsf2xsf install objects: $(objects) $(objects): %.o: %.c $(CC) $(CFLAGS) $(CPPFLAGS) $(CPP_FLAGS) $(INCS) -c $< xcrys-dll: $(XC_OBJS) $(EXTERNAL_OBJS) $(CC) $(SHARED) $(CFLAGS) $(XC_OBJS) $(EXTERNAL_OBJS) \ $(TK_LIB) $(TCL_LIB) $(GLU_LIB) $(GL_LIB) $(X_LIB) $(MATH) $(LDLIB) \ -o xcrys.dll xcTclsh.o xsf2xsf.o: %.o: %.c $(CC) $(CFLAGS) $(CPPFLAGS) $(CPP_FLAGS) $(INCS) -c $< xctclsh: xcTclsh.o $(CC) $(CFLAGS) xcTclsh.o -o xctclsh $(TCL_LIB) $(MATH) $(LDLIB) xsf2xsf: xsf2xsf.o $(CC) $(CFLAGS) xsf2xsf.o -o xsf2xsf install: -cp xcrys.dll ../bin #-mv xctclsh.exe ../bin -cp xsf2xsf.exe ../bin -cp xcrys.cygwin ../bin/xcrys; chmod +x ../bin/xcrys -cp xctclsh.cygwin ../bin/xctclsh; chmod +x ../bin/xctclsh clean: -rm -f *.o *~ xcrys xctclsh xsf2xsf header: $(TOPDIR)/sys_utils/c_header.sh depend: makedepend $(INCS) $(XC_OBJS:.o=.c) xcrysden-1.6.2/C/anaglyph.h0000644000175000017500000000536411712736221014223 0ustar tonetone/* This code was taken with permission from: http://astronomy.swin.edu.au/~pbourke/opengl/redblue/. This web page is due to: P a u l B o u r k e Astrophysics and Supercomputing e pbourke@swin.edu.au w astronomy.swin.edu.au/~pbourke p +61 -3 9214 8624 f +61 -3 9214 8797 l Mail number 31 PO Box 218 Hawthorn Swinburne University of Technology Victoria 3122, Australia The code was modifies by: ***************************************************************************** Modified by Daniel van Vugt (daniel@computing.edu.au) I have removed all accumulation buffer code, and without needing blending. This works because when you're writing to different colour planes, it's effectively the same as having two separate framebuffers. In fact, blending would just slow it all down and add some ugly bugs. My changes are marked with a "DVV". ----- Anaglyphs implemented in OpenGL without stereo buffer support Adds the two images in the accumulation buffer Note 1. All objects must be drawn as greyscale! 2. This is written for illustrative purposes...not efficiency! * ------------------------------------------------------------------------- * * For the purpose of XCRYSDEN modified by: * * Eric Verfaillie ericverfaillie@yahoo.fr EV * * May 2004 * ***************************************************************************** */ #include #include #include #include #define FALSE 0 #define TRUE (!FALSE) typedef struct { unsigned char r,g,b,a; } PIXELA; typedef struct { double r,g,b; } COLOUR; #define SIGN(x) (x < 0 ? (-1) : 1) #define MODULUS(p) (sqrt(p.x*p.x + p.y*p.y + p.z*p.z)) #define CROSSPROD(p1,p2,p3) \ p3.x = p1.y*p2.z - p1.z*p2.y; \ p3.y = p1.z*p2.x - p1.x*p2.z; \ p3.z = p1.x*p2.y - p1.y*p2.x typedef struct { XYZ vp; /* View position */ XYZ vd; /* View direction vector */ XYZ vu; /* View up direction */ XYZ pr; /* Point to rotate about */ double focallength; /* Focal Length along vd */ double aperture; /* Camera aperture */ double eyesep; /* Eye separation */ int screenheight,screenwidth; } CAMERA; /*void HandleDisplay(struct Togl *togl); void CameraHome(); void Normalise(XYZ *); XYZ CalcNormal(XYZ,XYZ,XYZ); */ #define DTOR 0.0174532925 #define RTOD 57.2957795 #define TWOPI 6.283185307179586476925287 #define PID2 1.570796326794896619231322 #define ESC 27 xcrysden-1.6.2/C/xcForces.c0000644000175000017500000001446513525506046014175 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcForces.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include #include "struct.h" #include "vector.h" #include "xcfunc.h" ForceVector FV = { NULL, XC_FORCE_TRESHHOLD, XC_FORCE_LENGTHFACTOR, 0.0}; extern RenderVectors *forceVectors; typedef struct { char *name; float (*ScaleFunc)(float value); } parseSFunc; static parseSFunc scaleFuncTable[] = { {"linear", xcLinf}, {"log", xcLogf}, {"log10", xcLog10f}, {"sqrt", xcSqrtf}, {"root3", xcRoot3f}, {"exp", xcExpf}, {"exp2", xcExp2f}, {NULL, NULL} }; /* --- function prototypes --- */ static void Usage(Tcl_Interp *interp); int XC_ForcesCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); void BuildForceVectors(ForceVector *fvPtr); static void Usage(Tcl_Interp *interp) { Tcl_SetResult(interp, "Usage: xc_forces OPTIONS\nwhere options are:\n on|off\nor\n scalefunction \n threshold \n lengthfactor \n", TCL_STATIC); } /***************************************************************************** * xc_forces on|off * scalefunction (see scaleFuncTable * threshold * lengthfactor *****************************************************************************/ int XC_ForcesCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; char c; int i, len; double num; if ( argc < 3 ) { Usage(interp); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } c=argv[2][0]; len=strlen(argv[2]); if ((c == 'o') && (strncmp(argv[2], "on", len) == 0) && (len >= 2)) { VPf.force = GL_TRUE; BuildForceVectors(&FV); UpdateProjection(); return TCL_OK; } else if ((c == 'o') && (strncmp(argv[2], "off", len) == 0) && (len >= 2)) { VPf.force = GL_FALSE; return TCL_OK; } else if ((c == 's') && (strncmp(argv[2], "scalefunction", len) == 0)) { i=-1; FV.ScaleFunc = NULL; while ( scaleFuncTable[++i].name != NULL ) { if ( strcmp( scaleFuncTable[i].name, argv[3] ) == 0 ) { fprintf(stderr,"Force scale func: %s\n", scaleFuncTable[i].name); FV.ScaleFunc = scaleFuncTable[i].ScaleFunc; } } if (FV.ScaleFunc == NULL) { char rss[1024]; snprintf(rss, sizeof(rss),"unknown scale function %s, must be one of ...\n", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else if ((c == 't') && (strncmp(argv[2], "threshold", len) == 0)) { if ( Tcl_GetDouble(interp, argv[3], &num) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got %s\n", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } FV.threshold = (float) num; } else if ((c == 'l') && (strncmp(argv[2], "lengthfactor", len) == 0)) { if ( Tcl_GetDouble(interp, argv[3], &num) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted double, but got %s\n", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } FV.lengthfactor = (float) num; } else { Usage(interp); return TCL_ERROR; } BuildForceVectors(&FV); UpdateProjection(); return TCL_OK; } static double (*force)[3] = NULL; void BuildForceVectors(ForceVector *fvPtr) { float size, sizeOrig, sizeMin = 99999.9; int i, j; float xyz[3], max[3] ={0.0, 0.0, 0.0}; if (natoms>0) { force = (double (*)[3]) realloc(force, sizeof(double [3]) * (natoms+1) ); } else { return; } /* for (i=1; i<=natoms; i++) { size=(float)distdv(fv[i]); if( size > threshold && size > 1.0e-10 ) { size = ScaleFunc(size); if (size < sizeMin) sizeMin=size; } } */ /* if force is lower then the given threshold set it to ZERO */ for (i=1; i<=natoms; i++) { /* first clean the force */ for (j=0; j<3; j++) force[i][j] = 0.0; sizeOrig = size = (float)distdv(fv[i]); /* fprintf(stderr,"Original force: %7.4f %7.4f %7.4f; size = %7.4f\n", fv[i][0],fv[i][1],fv[i][2], size); */ if( size > fvPtr->threshold ) { size = fvPtr->ScaleFunc(size) * fvPtr->lengthfactor; /* if the ScaleFunc is logaritmic the size will be negative, then put the size equal to size-sizeMin and augment that somehow */ if (size < 0.0) { sizeMin=fvPtr->ScaleFunc(fvPtr->threshold); size=(size-sizeMin); } for (j=0; j<3; j++) force[i][j] = (fv[i][j]/sizeOrig)*(double)size; /* fprintf(stderr," scaled force: %7.4f %7.4f %7.4f; size = %7.4f\n", force[i][0],force[i][1],force[i][2], distdv(force[i]) ); */ xyz[0] = ABS(xat[i] + force[i][0]); xyz[1] = ABS(yat[i] + force[i][1]); xyz[2] = ABS(zat[i] + force[i][2]); max[0] = xyz[0] > max[0] ? xyz[0] : max[0]; max[1] = xyz[1] > max[1] ? xyz[1] : max[1]; max[2] = xyz[2] > max[2] ? xyz[2] : max[2]; } } fvPtr->max_size = distfv(max); SetForceVectorsCoor(fvPtr, force, forceVectors); } xcrysden-1.6.2/C/xcviewport.c0000644000175000017500000001635413521266430014626 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcviewport.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" extern OrthoProj ort; extern RasterFontSize rf; PERSPECTIVE persp; /* --- functions prototypes --- */ void xcViewPort(void); void MaybeClipAndMakeProjection(void); void Screen2Model_Coords(int xs, int ys, float *xm, float *ym); /* void xcPerspective(PERSPECTIVE *per, GLdouble fovy, GLdouble near_factor, GLdouble size); */ /* this proc make ViewPort Transformation */ void xcViewPort(void) { double size, scrF, xorig, yorig, x, y; /* * srcF determine how big looks structure in the screen; TR.ZOOM * taken into account */ /* scrF = tr.zoom / VPf.scrf; Vpf.scrf is no more used */ scrF = tr.zoom; xorig = (double) VPf.width / 2.0 + tr.xtransl; yorig = (double) VPf.height / 2.0 + tr.ytransl; if ( VPf.width > VPf.height) { size = (double) VPf.height * scrF; } else { size = (double) VPf.width * scrF; } VPf.x = xorig - size / 2.0; VPf.y = yorig - size / 2.0; VPf.size = size; /* some reshapes of window requires new cliping of projection */ MaybeClipAndMakeProjection(); x = VPf.x; y = VPf.y; VPf.sizex = VPf.sizey = VPf.size; if (VPf.x < 0) { VPf.x = 0; VPf.sizex += x; } if (VPf.y < 0) { VPf.y = 0; VPf.sizey += y; } if (VPf.x + VPf.sizex > VPf.width) VPf.sizex += VPf.width - (VPf.sizex + VPf.x); if (VPf.y + VPf.sizey > VPf.height) VPf.sizey += VPf.height - (VPf.sizey + VPf.y); /* fprintf(stderr,"VIEWPORT::"); fprintf(stderr,"Vpf: x=%f, y=%f; xorig=%f, yorig=%f, xtransl=%f, ytransl=%f\n", VPf.x, VPf.y, xorig, yorig, tr.xtransl, tr.ytransl); fprintf(stderr,"viewPort= %d x %d + %d x %d\n", (int) VPf.x, (int) VPf.y, (int) VPf.sizex, (int) VPf.sizey); fprintf(stderr,"ortho= %f x %f + %f x %f\n\n", ort.minx, ort.miny, ort.maxx, ort.maxy); */ glViewport( (GLint) VPf.x, (GLint) VPf.y, (GLsizei) VPf.sizex, (GLsizei) VPf.sizey); /* * VPf.VPfactor is ration between structuresize in screen units and * structuresize in A; TR.ZOOM is taken into account !!! */ VPf.VPfactor = VPf.size / (2.0 * ort.size); /* how large is font in Angstrom units (we want negative values):: */ rf.w2 = (float) -rf.wid / (2.0 * VPf.VPfactor); rf.h2 = (float) -rf.height / (2.0 * VPf.VPfactor); /* * SCREEN UNITS - ANGSTROMS FACTOR !!!! * * for each direction (X and Y) one factor -- just in case, if X & Y * glOrtho differ */ if ( VPf.projmade ) { VPf.scrAnX = VPf.sizex / (ort.maxx - ort.minx); /* ort.minx is negativ */ VPf.scrAnY = VPf.sizey / (ort.maxy - ort.miny); } /* printf("viewPort= %d x %d +%d + %d\n", VPf.x, VPf.y, VPf.size, VPf.size); */ } void MaybeClipAndMakeProjection(void) { double cr = 0.0; double size = (double) VPf.size; /* GLdouble fovy, aspect, near, far; */ /************************************** Y-up +------------+ | ort.size| X-left | +-----| X-right | | +------------+ Y-down ****************************************/ ort.minx = ort.miny = -ort.size; ort.maxx = ort.maxy = ort.size; ort.minz = -1.5 * ort.size; ort.maxz = 1.5 * ort.size; /* clip X-left */ if (VPf.x < 0.0 && size > MINTOL) { cr = ABS(VPf.x) / size; ort.minx = -(1.0 - 2.0*cr) * ort.size; } /* clip X-right */ if (VPf.size + VPf.x > VPf.width && size > MINTOL) { cr = ABS(VPf.size+VPf.x - VPf.width) / size; ort.maxx = (1.0 - 2.0*cr) * ort.size; } /* clip Y-up */ if (VPf.size + VPf.y > VPf.height && size > MINTOL) { cr = ABS(VPf.size+VPf.y - VPf.height) / size; ort.maxy = (1.0 - 2.0*cr) * ort.size; } /* clip Y-down */ if (VPf.y < 0.0 && size > MINTOL) { cr = ABS(VPf.y) / size; ort.miny = -(1.0 - 2.0*cr) * ort.size; } /*fprintf(stderr, "DEBUG> ort: minZ=%f, maxZ=%f\n", ort.minz, ort.maxz);*/ /* calculate perspective from ort.XXXX */ /* fovy = 10.0; */ /* aspect = (ort.maxx - ort.minx) / (ort.maxy - ort.miny); */ /* near = (ort.maxx - ort.minx) / tan( fovy ); */ /* far = near + ort.maxz - ort.minz; */ /* gluPerspective( fovy, aspect, near, far); */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); if ( ! VPf.perspective ) { glOrtho(ort.minx, ort.maxx, ort.miny, ort.maxy, ort.minz+ort.size, ort.maxz+ort.size); } else { /* xcPerspective (&persp, VPf.perspective_fovy, VPf.perspective_fovy, ort.size); gluPerspective (persp.fovy, 1.0 / persp.aspect, persp.near, persp.far); */ /* persp.near = VPf.perspective_fovy * ort.size; persp.far = persp.near + ort.size; */ double _size = VPf.perspective_size * ort.size; persp.near = VPf.perspective_fovy * _size; persp.far = persp.near + VPf.perspective_far * _size; /* persp.shiftZ is translated in xcDisplay3D */ persp.shiftZ = -(persp.near + _size); glFrustum (ort.minx, ort.maxx, ort.miny, ort.maxy, persp.near, persp.far); } glMatrixMode(GL_MODELVIEW); glClearColor( bg[0], bg[1], bg[2], bg[3] ); /* T.K. */ glLoadIdentity(); } void Screen2Model_Coords(int xs, int ys, float *xm, float *ym) { float xorig, yorig; xorig = (float) VPf.width / 2.0 + tr.xtransl; yorig = (float) VPf.height / 2.0 - tr.ytransl; /* *xm = ((float) xs - xorig) / VPf.VPfactor; *ym = (yorig - (float) ys) / VPf.VPfactor; */ *xm = ((float) xs - xorig) / VPf.scrAnX; *ym = (yorig - (float) ys) / VPf.scrAnY; } /* GLdouble *zm; GLdouble modelMatrix[16]; GLdouble projMatrix[16]; GLdouble viewport[4]; glGetDoublev( GL_MODELVIEW_MATRIX, modelMatrix ); glGetDoublev( GL_PROJECTION_MATRIX, projMatrix ); glGetIntegerv( GL_VIEWPORT, viewport); gluUnProject( (GLdouble) xs, (GLdouble) ys, 0.0, modelMatrix, projMatrix, viewport, xm, ym, zm ); */ /* void xcPerspective(PERSPECTIVE *per, GLdouble fovy, GLdouble near_factor, GLdouble size) { GLdouble near, fi = 0.5 * fovy / RAD2DEG; per->fovy = fovy; per->aspect = (GLdouble) (VPf.sizex - VPf.x)/(GLdouble)(VPf.sizey - VPf.y); near = 0.75*size * cos(fi) / sin(fi) / tr.zoom; per->near = near_factor*near; per->far = near + 1.5*size; per->shiftZ = -(near + 0.75*size) / tr.zoom; } */ xcrysden-1.6.2/C/xcAppInit.c0000644000175000017500000024720313551370022014306 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcAppInit.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * * ------ * * Modified by Eric Verfaillie ericverfaillie@yahoo.fr EV * * may 2004 * * modifcations are near EV comments * ***************************************************************************** */ #include #include #include #include #include #include #include #include "struct.h" #include "system.h" #include "memory.h" #include "xcfunc.h" #if defined(TOGL_X11) # include "GL/glx.h" #endif #define XSF_OPEN 0 #define XSF_UPDATE 1 /* on some systems this is needed; I don't know why ????? */ /* #define Tk_MainEx Tk_Main */ extern AtomicLabel *atomLabel, globalAtomLabel; extern short *do_not_display_atomlabel; extern XCfog fog; extern GLfloat def_fog_color[4]; extern GLfloat def_xyz_axis_color[4]; extern GLfloat def_xyz_xyplane_color[4]; extern XYZ_Attrib xyz; extern ForceVector FV; extern struct Togl *mesa_togl; int togl_exists; /* name of photo image to be used for printing */ const char *printImage = "dump2ppm.82617"; /*===========================================================================*/ /* THIS IS FOR 3D object (Spheres, Cylinders) */ /*===========================================================================*/ Options3D is = { GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE }; /* ====================================================== */ /* ---------------function prototypes-------------------- */ /* ====================================================== */ /* implemented Tcl/Tk commands; this file */ int Tcl_AppInit(Tcl_Interp *interp); int Xcrys_Init( Tcl_Interp *interp ); int XC_OpenStrCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); int XC_CloseStrCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); int XC_DisplayMode2DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_RotateCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_TranslateCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_DisplayMode3DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_DrawStyle3DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_ShadeModel3DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_PointSizeCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_ResetVarCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_NewValueCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_OldAtmColCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_GetDefaultCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_GetValueCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* int XC_MesaContextCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); */ int XC_UpdateStrCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_DisplayCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_SwapBufferCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_RotationMatrixCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_TranslParamCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* extern int XC_MesaWinCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]);*/ extern int XC_SelectCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_DeselectCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_AtomAddCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* implemented xc_iso* Tcl/Tk commands; xcIsoSurf.c */ extern int XC_IsoCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsostackCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsosignCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsofilesCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsopointsCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsodataCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsosurfCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsoplaneCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsoexpandCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_SetGLparamCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_GetGLparamCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_BzCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_SuperCellCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsoSpaceSelCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_WignerCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_IsoDataGridCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ColorschemeCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ReadXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ReadBandXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_GridValueCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_F3toI4Cmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_FractCoorCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_MolSurfCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_MolSurfRegCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_MolSurfConfigCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int CRY_DispFuncCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int CRY_DispFuncMultiFSCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int CRY_SurfRegCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int CRY_SurfConfigCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int CRY_SurfCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ForcesCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_HBondsCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_StereoCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]); /* END:: implemented xc_iso* Tcl/Tk commands; xcIsoSurf.c */ /* ppmPrintTogl.c */ extern int CRY_Dump2PpmCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* togl_ppm.c */ extern int Togl_DumpToPpmFile(struct Togl *togl, const char *filename); /* realTimeMovie.c */ extern int CRY_RealTimeMovieCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* gl2psPrintTogl.c */ extern int CRY_gl2psPrintToglCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* cryTogl */ extern int CRY_ToglZoomCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* still this file */ int xcRotateX(double fi); int xcRotateY(double fi); int xcRotateZ(double fi); int xcRotateXY(double fiX, double fiY); void FreeAllVariables(void); /* custom event handler */ /* extern void XC_MesaEvent(ClientData clientData, XEvent *eventPtr);*/ /* --- auxilary functions; auxilproc.c --- */ extern void Rotate(double *x, double *y, double *z, double cosfi, double sinfi); /* --- xcballstick.c --- */ extern void MakeArcPoints(void); /* --- readstrf.c --- */ extern int ReadStructFile(FILE *fp, const char *file, int format, int mode ); /* --- viewport.c --- */ extern void xcViewPort(void); /* --- loadValues --- */ extern void LoadDefaultValues(void); extern void ResetVar(struct Togl *togl, int var); extern void ReloadVars(void); extern void LoadNewValue(struct Togl *togl, int var, double value1, double value2, double value3, double value4); extern double GetDefault(int var); extern double GetValue(int var); extern void LoadOldAtomicColors(void); /* --- xcMesaContext.c --- */ /* GLenum xcCreateMesaContext(Display *xcDisplay, Window xcMesaWin, int xcscreen);*/ /* void xcDestroyMesaContext(void); */ /* --- 3D.c --- */ extern void From2Dto3D(void); extern void GetOldMat(void); extern void GetMajorMat(void); extern void GetRotX(GLdouble fiX); extern void GetRotY(GLdouble fiY); extern void GetRotZ(GLdouble fiZ); extern void LoadIdentity(GLdouble matrix[][4]); /* --- vectors.c --- */ extern void vecMatToVec(double major[4][4], double vec[16]); extern void VecRotateX(double cosfi, double sinfi); extern void VecRotateY(double cosfi, double sinfi); extern void VecRotateZ(double cosfi, double sinfi); extern void VecRotateXY(double cosfiX, double sinfiX, double cosfiY, double sinfiY); extern void VecRotTo_XY(void); extern void VecRotTo_XZ(void); extern void VecRotTo_YZ(void); extern void VecRotTo_AB(void); extern void VecRotTo_AC(void); extern void VecRotTo_BC(void); /* --- xcLabels.c --- */ extern void makeAtomLabels(void); extern void makeXYZLabels(void); extern void makeRasterFont(void); extern void makeTemp3D2DList(void); extern void makeCrdList(void); /*****************************************************************************/ /* MESA -- MESA -- MESA */ /*****************************************************************************/ /* --- xcDisplayFunc.c --- */ extern void (*xcDisplay)(struct Togl *togl); extern void xcGenDispList(void); extern void xcDisplayFunc( void (*Func)(struct Togl *togl) ); extern int xcToglDisplayFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern void xcDummyDisplay( struct Togl *togl ); extern void xcWireFrame2D(struct Togl *togl); extern void xcPointLine2D(struct Togl *togl); extern void xcBallStick12D(struct Togl *togl); extern void xcBallStick22D(struct Togl *togl); extern void xcDisplay3D(struct Togl *togl); extern void EnableOr2D_Or3D(void); extern void xcMakeProjection2D(const char *mode); extern void xcMakeProjection3D(const char *mode); extern void xcClearScreen(struct Togl *togl); /* extern void xcMakeBallLists(void); */ extern void xcMakePointList(); /*extern void xcMaybeDestroyLists(void);*/ /* --- xcDisplayFunc2.c --- */ extern void xcAssignDisplayFunc(const char *dispMode); extern void UpdateDispFunc(void); extern void RewriteCoor(GLenum type); /* --- lighting.c --- */ extern void LoadStructMaterial(void); extern void LoadLights(void); extern void LoadBlendfunc_And_Frontface(void); /* --- cells.c --- */ extern void CellTypes(void); /* --- xcTogl.c --- */ extern int xcToglCreateFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern int xcToglReshapeFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern int xcToglDestroyFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern int xcToglTimerFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); extern int XC_B1MotionCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ShiftB1MotionCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_B2MotionCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ButtonReleaseCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* --- xcFont.c --- */ extern int XC_SetFontCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_SetAtomLabelCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_ClearAtomLabelCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); extern int XC_QueryFontCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* --- sInfo.c --- */ extern void Set_sInfoArray( Tcl_Interp *interp ); /* --- datagrid.c --- */ extern void CloseGridList(void); /* xcdebug.c */ extern void xcdebug(const char *text); extern void xcErrDebug(const char *text); extern void breakpoint(const char *text); /* --- pia.c ---*/ /*extern void Pia(void);*/ #if defined _LINUXALPHA || defined _DEC_CUSTOM_FPE_HANDLER /* --- signal.c --- */ extern void xcFPEHandler(void); #endif /* cryNewContext.c */ extern NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl); #ifndef WIN32 static int XErrorFunction(Display *display,XErrorEvent *event) { char buffer[512]; buffer[0]='\0'; XGetErrorText(display,event->error_code,buffer,sizeof(buffer)-1); buffer[511]='\0'; fprintf(stderr,"X Error of failed request: %s\n",buffer); fprintf(stderr," Major opcode of failed request: %d\n",event->request_code); switch(event->error_code) { case BadValue: fprintf(stderr," Value in failed request: 0x%lx\n",event->resourceid); break; case BadAtom: fprintf(stderr," AtomID in failed request: 0x%lx\n",event->resourceid); break; default: if (event->error_code != BadRequest) fprintf(stderr," ResourceID in failed request: 0x%lx\n",event->resourceid); break; } fprintf(stderr," Serial number of failed request: %ld\n",event->serial); return 0; } /*****************************************************************************/ int main(int argc, char *argv[]) { /* create signal handler for FPE for LinuxAlpha */ #ifdef _LINUXALPHA fprintf(stderr,"Note: *** custom SIG_FPE signal handler is used for Linux-Alpha platform\n", NULL); xcFPEHandler(); #endif #ifdef _DEC_CUSTOM_FPE_HANDLER fprintf(stderr,"Note: *** custom SIG_FPE signal handler will be used !!!\n", NULL); xcFPEHandler(); #endif XSetErrorHandler(XErrorFunction); Tk_Main(argc, argv, Tcl_AppInit); exit(0); } /* * Tcl_AppInit is called from Tcl_Main * after the Tcl interpreter has been created, * and before the script file * or interactive command loop is entered. */ int Tcl_AppInit(Tcl_Interp *interp) { /* * Initialize packages * Tcl_Init sets up the Tcl library facility. */ if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } if (Tk_Init(interp) == TCL_ERROR) { return TCL_ERROR; } if (Xcrys_Init(interp) == TCL_ERROR) { return TCL_ERROR; } /* HERE: * Define startup filename if any. This file is read in * case the program is run interactively. */ return TCL_OK; } #endif /* not WIN32 */ #ifdef WIN32 __declspec(dllexport) #endif int Xcrys_Init( Tcl_Interp *interp ) { char *dir = NULL; /* * Define XCRYSDEN application-specific commands here. * */ int i; struct CUSTOM_COM { Tcl_CmdProc *proc; char *name; } custom_command[] = { { (Tcl_CmdProc *)XC_ForcesCmd, "xc_forces"}, { (Tcl_CmdProc *)XC_GridValueCmd, "xc_gridvalue"}, { (Tcl_CmdProc *)CRY_DispFuncCmd, "cry_dispfunc"}, { (Tcl_CmdProc *)CRY_DispFuncMultiFSCmd, "cry_dispfuncmultiFS"}, { (Tcl_CmdProc *)CRY_SurfRegCmd, "cry_surfreg"}, { (Tcl_CmdProc *)CRY_SurfConfigCmd, "cry_surfconfig"}, { (Tcl_CmdProc *)CRY_SurfCmd, "cry_surf"}, { (Tcl_CmdProc *)XC_RotationMatrixCmd, "xc_rotationmatrix"}, { (Tcl_CmdProc *)XC_TranslParamCmd, "xc_translparam"}, { (Tcl_CmdProc *)XC_WriteXSFCmd, "xc_writeXSF" }, { (Tcl_CmdProc *)XC_HBondsCmd, "xc_hbonds"}, { (Tcl_CmdProc *)XC_WriteBandXSFCmd, "xc_writebandXSF"}, { (Tcl_CmdProc *)XC_StereoCmd, "xc_stereo"}, { NULL, "" } }; struct TOGL_CMD { Tcl_CmdProc *proc; char *name; } togl_cmd[] = { { (Tcl_CmdProc *)XC_RotateCb, "xc_rotate" }, { (Tcl_CmdProc *)XC_TranslateCb, "xc_translate" }, { (Tcl_CmdProc *)XC_B1MotionCb, "xc_B1motion" }, { (Tcl_CmdProc *)XC_ShiftB1MotionCb, "xc_ShiftB1motion" }, { (Tcl_CmdProc *)XC_B2MotionCb, "xc_B2motion" }, { (Tcl_CmdProc *)XC_ButtonReleaseCb, "xc_Brelease" }, { (Tcl_CmdProc *)CRY_gl2psPrintToglCb, "cry_gl2psPrintTogl" }, { (Tcl_CmdProc *)CRY_Dump2PpmCb, "cry_dump2ppm" }, { (Tcl_CmdProc *)CRY_ToglZoomCb, "cry_toglzoom" }, { (Tcl_CmdProc *)CRY_RealTimeMovieCb, "xc_realtimemovie" }, { (Tcl_CmdProc *)XC_SetFontCb, "xc_setfont" }, { (Tcl_CmdProc *)XC_SetAtomLabelCb, "xc_setatomlabel" }, { (Tcl_CmdProc *)XC_ClearAtomLabelCb, "xc_clearatomlabel" }, { (Tcl_CmdProc *)XC_QueryFontCb, "xc_queryfont" }, { NULL, "" } }; /* some XC_initializations */ LoadDefaultValues(); CellTypes(); xcr.prim_nat = 0; xcr.prim_coor = 0; xcr.prim_fcoor = 0; xcr.prim_forc = 0; xcr.conv_nat = 0; xcr.conv_fcoor = 0; xc_system.pid = getpid(); xc_system.scratch_dir = (char *) malloc ( sizeof(char) * 2048 ); atm.sqn = atm.sqnat = NULL; atm.col = NULL; /* $system(SCRDIR) = $XCRYSDEN_SCRATCH/xc_$$ */ /* get some minimum of environmental data */ if ( (dir = getenv("XCRYSDEN_SCRATCH")) != NULL ) sprintf(xc_system.scratch_dir,"%s/xc_%d/", dir, xc_system.pid); MakeArcPoints(); /* * TOGL stuff ... */ if (Togl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } /* Togl Setup & Initialization functions */ Tcl_CreateObjCommand(interp, "togl_create", xcToglCreateFunc, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); Tcl_CreateObjCommand(interp, "togl_display", xcToglDisplayFunc, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); Tcl_CreateObjCommand(interp, "togl_reshape", xcToglReshapeFunc, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); Tcl_CreateObjCommand(interp, "togl_destroy", xcToglDestroyFunc, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); Tcl_CreateObjCommand(interp, "togl_timer", xcToglTimerFunc, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); /* * XCRYSDEN application-specific Tcl/Tk commands */ Tcl_CreateCommand(interp, "xc_openstr", (Tcl_CmdProc *)XC_OpenStrCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_closestr", (Tcl_CmdProc *)XC_CloseStrCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_displayMode2D", (Tcl_CmdProc *)XC_DisplayMode2DCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_displayMode3D", (Tcl_CmdProc *)XC_DisplayMode3DCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_drawStyle3D", (Tcl_CmdProc *)XC_DrawStyle3DCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_shadeModel3D", (Tcl_CmdProc *)XC_ShadeModel3DCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_pointSize", (Tcl_CmdProc *)XC_PointSizeCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); /* Tcl_CreateCommand(interp, "xc_mesawin", (Tcl_CmdProc *)XC_MesaWinCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_mesacontext", (Tcl_CmdProc *)XC_MesaContextCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); */ Tcl_CreateCommand(interp, "xc_resetvar", (Tcl_CmdProc *)XC_ResetVarCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_newvalue", (Tcl_CmdProc *)XC_NewValueCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_oldatmcol", (Tcl_CmdProc *)XC_OldAtmColCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_getdefault", (Tcl_CmdProc *)XC_GetDefaultCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_getvalue", (Tcl_CmdProc *)XC_GetValueCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_updatestr", (Tcl_CmdProc *)XC_UpdateStrCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_swapbuffer", (Tcl_CmdProc *)XC_SwapBufferCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_display", (Tcl_CmdProc *)XC_DisplayCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_select", (Tcl_CmdProc *)XC_SelectCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_deselect", (Tcl_CmdProc *)XC_DeselectCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_atomadd", (Tcl_CmdProc *)XC_AtomAddCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_iso", (Tcl_CmdProc *)XC_IsoCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isostack", (Tcl_CmdProc *)XC_IsostackCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isosign", (Tcl_CmdProc *)XC_IsosignCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isofiles", (Tcl_CmdProc *)XC_IsofilesCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isopoints", (Tcl_CmdProc *)XC_IsopointsCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isodata", (Tcl_CmdProc *)XC_IsodataCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isosurf", (Tcl_CmdProc *)XC_IsosurfCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isoplane", (Tcl_CmdProc *)XC_IsoplaneCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isoexpand", (Tcl_CmdProc *)XC_IsoexpandCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_setGLparam", (Tcl_CmdProc *)XC_SetGLparamCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_getGLparam", (Tcl_CmdProc *)XC_GetGLparamCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_bz", (Tcl_CmdProc *)XC_BzCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_supercell", (Tcl_CmdProc *)XC_SuperCellCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isospacesel", (Tcl_CmdProc *)XC_IsoSpaceSelCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_wigner", (Tcl_CmdProc *)XC_WignerCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_isodatagrid", (Tcl_CmdProc *)XC_IsoDataGridCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_colorscheme", (Tcl_CmdProc *)XC_ColorschemeCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_readXSF", (Tcl_CmdProc *)XC_ReadXSFCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_readbandXSF", (Tcl_CmdProc *)XC_ReadBandXSFCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_f3toi4", (Tcl_CmdProc *)XC_F3toI4Cmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_fractcoor", (Tcl_CmdProc *)XC_FractCoorCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_molsurf", (Tcl_CmdProc *)XC_MolSurfCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_molsurfreg", (Tcl_CmdProc *)XC_MolSurfRegCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "xc_molsurfconfig", (Tcl_CmdProc *)XC_MolSurfConfigCmd, (ClientData)Tk_MainWindow(interp), (Tcl_CmdDeleteProc *)NULL); i=-1; while( custom_command[++i].proc ) Tcl_CreateCommand(interp, custom_command[i].name, custom_command[i].proc, (ClientData) Tk_MainWindow(interp), (Tcl_CmdDeleteProc *) NULL); /* * application-specific Togl sub-commands */ i=-1; while( togl_cmd[++i].proc ) { Tcl_CreateCommand(interp, togl_cmd[i].name, togl_cmd[i].proc, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); } /* define xcrys(platform) variable */ #if defined(MAC_OSX) Tcl_SetVar2(interp, "xcrys", "platform", "macosx", TCL_GLOBAL_ONLY); #elif defined(CYGWIN) Tcl_SetVar2(interp, "xcrys", "platform", "cygwin", TCL_GLOBAL_ONLY); #elif defined(WIN32) Tcl_SetVar2(interp, "xcrys", "platform", "windows", TCL_GLOBAL_ONLY); #else Tcl_SetVar2(interp, "xcrys", "platform", "unix", TCL_GLOBAL_ONLY); #endif /* store the photo image to be used for printing into xcrys(print.image) */ Tcl_SetVar2(interp, "xcrys", "print.image", printImage, TCL_GLOBAL_ONLY); togl_exists = XC_FALSE; return TCL_OK; } /* XC_OpenStr --> inplementation of 'xc_openstr' custom Tcl command * --------------------- * Usage: xc_openstr ?DisplayMode? * * fileformat --- format of file (xcr, xyz, pdb) * * toglName --- name of togl where structure will be * displayed * * DisplayMode --- one of WF, PL, BS1 and BS2 * * NOTE: so far we can open structure and display only in 2D modes; * and only than we can switch to 3D modes */ int XC_OpenStrCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; FILE *fp; int format; /* vars. for MESA */ if (argc < 4 || argc > 5) { Tcl_SetResult(interp, "Usage: xc_openstr ?DisplayMode?", TCL_STATIC); return TCL_ERROR; } /* T.K.__correcture */ if (argc == 4) argv[4] = "WF"; /* determine format of file */ if ( (strcmp(argv[1],"xcr") == 0) || (strcmp(argv[1],"xsf") == 0) ) format = FORMAT_XSF; else if ( strcmp(argv[1],"xyz") == 0 ) format = FORMAT_XYZ; else if ( strcmp(argv[1],"pdb") == 0 ) format = FORMAT_PDB; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown format \"%s\", must be one of \"xcr\", \"xyz\", \"pdb\"", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* Check if 'file' is OK */ fp = fopen(argv[2],"r"); if (fp == NULL) { char rss[1024]; snprintf(rss, sizeof(rss), "Can't open file \"%s\"",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[3], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* Check if DisplayMode is OK */ if ( argc == 5 && strcmp(argv[4],"WF") != 0 && strcmp(argv[4],"PL") != 0 && strcmp(argv[4],"BS1") != 0 && strcmp(argv[4],"BS2") != 0 ) { char rss[1024]; snprintf(rss, sizeof(rss), "Unknown DisplayMode \"%s\". Must be one of WF, PL, BS1, BS2",argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* is structure already opened ??? */ if (VPf.stropened) { const char *arg[] = { "xc_closestr" }; XC_CloseStrCmd(clientData, interp, 1, arg); } /* reset all variables needed */ ReloadVars(); /* command is OK * LET'S READ A FILE */ if (!ReadStructFile(fp, argv[2], format, XSF_OPEN)) { char rss[1024]; snprintf(rss, sizeof(rss),"Error reading file \"%s\"",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); fclose(fp); return TCL_ERROR; } /* structure is now opened, so we must assign ... */ VPf.stropened = 1; /* now we can close the file */ fclose(fp); /******************************************************/ /* now initialize various vectors */ /******************************************************/ LoadIdentity( vec.crdmajor ); /* coor-sist base vectors */ vecMatToVec( vec.crdmajor, vec.crdvec ); /******************************************************/ /* now display the structure according to DisplayMode */ /******************************************************/ /* because displayMode is one of 2D */ dimType = XC_2D; /* enable things for 2D */ EnableOr2D_Or3D(); /* now make xcViewPort with VPf.projmade = GL_FALSE */ VPf.projmade = GL_FALSE; xcViewPort(); printf("after xcViewPort, argv=%s %s %s %s\n",argv[1],argv[2], argv[3],argv[4]); xcdebug("before xcMakeProjection2D"); /* if displaymode is not specified, make WF */ if ( strcmp(argv[4],"WF") == 0 || argc == 4) { xcdebug("before xcMakeProjection2D"); xcMakeProjection2D("WF"); xcAssignDisplayFunc("WF"); } if ( strcmp(argv[4],"PL") == 0) { printf("Goint to xcPointLineCreate"); xcMakeProjection2D("PL"); xcAssignDisplayFunc("PL"); xcMakePointList(); } if ( strcmp(argv[4],"BS1") == 0 ) { xcMakeProjection2D("BS1"); xcAssignDisplayFunc("BS1"); /* xcMakeBallLists(); */ } if ( strcmp(argv[4],"BS2") == 0 ) { xcMakeProjection2D("BS2"); xcAssignDisplayFunc("BS2"); /* xcMakeBallLists(); */ } /* now make xcViewPort with VPf.projmade = GL_TRUE */ VPf.projmade = GL_TRUE; xcViewPort(); /* Display a Structure */ Togl_PostRedisplay(togl); /******************************************************/ /* now create event handler */ /******************************************************/ /* event_mask = Button1MotionMask | Button2MotionMask | ExposureMask | StructureNotifyMask | ButtonReleaseMask | SubstructureNotifyMask | FocusChangeMask; Tk_CreateEventHandler(tk_mesawin, event_mask, (Tk_EventProc *)XC_MesaEvent, (ClientData) tk_mesawin); */ printf("=>end of XC_OpenStrCmd\n"); fflush(stdout); /* assing the sInfo global array */ Set_sInfoArray( interp ); /* if we come so far we are succesfully */ return TCL_OK; } /* XC_DisplayMode2DCmd --> inplementation of 'xc_displayMode2D' custom * Tcl command * --------------------- * Usage: xc_displayMode2D */ int XC_DisplayMode2DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) /* ================================================================= * procedure assign wanted display function to xcDisplayFunc * indirectly via "xcAssignDisplayFunc" * ================================================================= */ { struct Togl *togl; /* was xc_wireframe invoke correctly ??*/ if (argc != 3) { Tcl_SetResult(interp, "Usage: xc_displayMode2D ", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* is displayMode OK ??? */ if ( strcmp(argv[2],"WF") != 0 && strcmp(argv[2],"PL") != 0 && strcmp(argv[2],"PB") != 0 && strcmp(argv[2],"BS1") != 0 && strcmp(argv[2],"BS2") != 0 && strcmp(argv[2],"SF") != 0 ) { char rss[1024]; snprintf(rss, sizeof(rss),"Unknown \"%s\", must be one of WF, PL, PB, BS1, BS2, SF", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if structure is not opened, return silently */ if (!VPf.stropened) return TCL_OK; /* if we are in selection mode, mode-changing is not allowed, return silenlty */ if (VPf.selection) return TCL_OK; /* glEnable things for 2D */ dimType = XC_2D; EnableOr2D_Or3D(); if ( strcmp(argv[2],"WF") == 0 ) { sprintf(displayMode2D, "WF"); xcMakeProjection2D("WF"); xcAssignDisplayFunc("WF"); } else if ( strcmp(argv[2],"PL") == 0 ) { sprintf(displayMode2D, "PL"); xcMakeProjection2D("PL"); xcAssignDisplayFunc("PL"); xcMakePointList(); } else if ( strcmp(argv[2],"PB") == 0 ) { sprintf(displayMode2D, "PB"); MakeArcPoints(); xcMakeProjection2D("PB"); xcAssignDisplayFunc("PB"); xcMakePointList(); } else if ( strcmp(argv[2],"BS1") == 0 ) { /* for each atom of a kind make a displaylist for ball */ sprintf(displayMode2D, "BS1"); xcMakeProjection2D("BS1"); xcAssignDisplayFunc("BS1"); /* xcMakeBallLists(); */ } else if ( strcmp(argv[2],"BS2") == 0 ) { sprintf(displayMode2D, "BS2"); MakeArcPoints(); /* for each atom of a kind make a displaylist for ball */ xcMakeProjection2D("BS2"); xcAssignDisplayFunc("BS2"); /* xcMakeBallLists(); */ } else if ( strcmp(argv[2],"SF") == 0 ) { sprintf(displayMode2D, "SF"); /* for each atom of a kind make a displaylist for ball */ xcMakeProjection2D("SF"); xcAssignDisplayFunc("SF"); /* xcMakeBallLists(); */ } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown display mode \"%s\", must be one of WF, PL,PB, BS1, BS2, SF\n",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* now perform Z-orientation */ hpsort_index1(tmp_nobjects,zorient, iwksp); /* update a display */ Togl_PostRedisplay(togl); return TCL_OK; } /* XC_RotateCb --> implementation of 'xc_rotate' custom Togl sub-command * --------------------------------------------------------------------- * * Usage: xc_rotate dir rotstep * * dir -- +x | -x | +y | -y | +z | -z | ++xy | ++xz | ++yz | xy | xz | yz | ab | ac | bc * * rotstep -- rotation step (in degrees) * * NOTE: this command is invoked by ButtonWidget-press; * mouse driven rotation is now implemented by XC_B1MotionCmd */ int XC_RotateCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; double rotstep, rotstep1; /* this proc is meant only for .mesa widget */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( togl != mesa_togl) { Tcl_SetResult(interp,"xc_rotate is meant only for .mesa",TCL_STATIC); return TCL_ERROR; } /* if structure is not opened, do noting, just return silently */ if (!VPf.stropened) return TCL_OK; if (argc < 4 || argc > 5) { Tcl_SetResult(interp, "Usage: xc_rotate ??", TCL_STATIC); return TCL_ERROR; } /*printf("Begin of XC_RotateCmd\n",NULL);*/ /* is rotstep valid enough */ if (Tcl_GetDouble(interp, argv[3], &rotstep) == TCL_ERROR) { Tcl_AppendResult(interp,"invalid rotstep \"%s\" in %s xc_rotate command", argv[0], argv[3],(char *)NULL); return TCL_ERROR; } /* from degrees to rad */ rotstep /= RAD2DEG; if (strncmp(argv[2],"++",2) == 0 ) { if (Tcl_GetDouble(interp, argv[4], &rotstep1) == TCL_ERROR) { Tcl_AppendResult(interp, "invalid rotstep \"%s\" in %s xc_rotate command", argv[0], argv[3],(char *)NULL); return TCL_ERROR; } rotstep1 /= RAD2DEG; } if ( dimType == XC_2D ) { /* this is now rotation only for 2D display structures */ /* when Z-rotating we don't need to "hpsort_index1" */ if (argv[2][1] == 'z') { if (argv[2][0] == '-') xcRotateZ(-rotstep); else if (argv[2][0] == '+') xcRotateZ( rotstep); else if (argv[2][0] == 'x') { VecRotTo_XZ(); xcAssignDisplayFunc(displayMode2D); } else if (argv[2][0] == 'y') { VecRotTo_YZ(); xcAssignDisplayFunc(displayMode2D); } else { Tcl_SetResult(interp, "invalid rotation direction in xc_rotate command, must be one of +x, -x, +y, -y, +z, -z, xy, xz, yz", TCL_STATIC); return TCL_ERROR; } } else { /* X & Y rotation */ /* if X || Y rotation, we must "hpsort_index1" */ /* because Y-coord is in Xlib upside down and in GL it is OK, I'm must change +X/-X rotation to made things OK */ if ( strcmp(argv[2],"+x") == 0 ) xcRotateX(-rotstep); else if (strcmp(argv[2],"-x") == 0 ) xcRotateX( rotstep); else if (strcmp(argv[2],"+y") == 0 ) xcRotateY( rotstep); else if (strcmp(argv[2],"-y") == 0 ) xcRotateY(-rotstep); else if (strcmp(argv[2],"++xy") == 0 ) { xcRotateX(rotstep); xcRotateY(rotstep1); } else if (strcmp(argv[2],"++xz") == 0 ) { xcRotateX(rotstep); xcRotateZ(rotstep1); } else if (strcmp(argv[2],"++yz") == 0 ) { xcRotateY(rotstep); xcRotateZ(rotstep1); } else if (strcmp(argv[2],"xy") == 0 ) { VecRotTo_XY(); xcAssignDisplayFunc(displayMode2D); } else if (strcmp(argv[2], "ab" ) == 0 ) { VecRotTo_AB(); xcAssignDisplayFunc(displayMode2D); } else if (strcmp(argv[2], "ac" ) == 0 ) { VecRotTo_AC(); xcAssignDisplayFunc(displayMode2D); } else if (strcmp(argv[2], "bc" ) == 0 ) { VecRotTo_BC(); xcAssignDisplayFunc(displayMode2D); } else { Tcl_SetResult(interp, "invalid rotation direction in xc_rotate command, must be one of +x, -x, +y, -y, +z, -z, ++xy, ++xz, ++yz, xy, xz, yz, ab, ac, bc", TCL_STATIC); return TCL_ERROR; } /* T.K. */ hpsort_index1(tmp_nobjects, zorient, iwksp); } } else if ( dimType == XC_3D ) { double cosfi, sinfi; /* because Y-coord is in Xlib upside down and in GL it is OK, I'm must change +X/-X rotation to made things OK */ if ( strcmp(argv[2],"+x") == 0 ) { cosfi = cos(-rotstep); sinfi = sin(-rotstep); GetRotX(-rotstep); VecRotateX( cosfi, sinfi); } else if (strcmp(argv[2],"-x") == 0 ) { cosfi = cos( rotstep); sinfi = sin( rotstep); GetRotX( rotstep); VecRotateX( cosfi, sinfi); } else if (strcmp(argv[2],"+y") == 0 ) { cosfi = cos( rotstep); sinfi = sin( rotstep); GetRotY( rotstep); VecRotateY( cosfi, sinfi); } else if (strcmp(argv[2],"-y") == 0 ) { cosfi = cos(-rotstep); sinfi = sin(-rotstep); GetRotY(-rotstep); VecRotateY( cosfi, sinfi); } else if (strcmp(argv[2],"+z") == 0 ) { cosfi = cos( rotstep); sinfi = sin( rotstep); GetRotZ( rotstep); VecRotateZ( cosfi, sinfi); } else if (strcmp(argv[2],"-z") == 0 ) { cosfi = cos(-rotstep); sinfi = sin(-rotstep); GetRotZ(-rotstep); VecRotateZ( cosfi, sinfi); } else if (strcmp(argv[2],"++xy") == 0 ) { cosfi = cos( rotstep); sinfi = sin( rotstep); GetRotX( rotstep); VecRotateX( cosfi, sinfi); /*GetOldMat(); GetMajorMat();*/ cosfi = cos(rotstep1); sinfi = sin(rotstep1); GetRotY( rotstep1 ); VecRotateY( cosfi, sinfi); } else if (strcmp(argv[2],"++xz") == 0 ) { cosfi = cos (rotstep); sinfi = sin (rotstep); GetRotX (rotstep); VecRotateX (cosfi, sinfi); cosfi = cos( rotstep1); sinfi = sin( rotstep1); GetRotZ( rotstep1 ); VecRotateZ( cosfi, sinfi); } else if (strcmp(argv[2],"++yz") == 0 ) { cosfi = cos( rotstep); sinfi = sin( rotstep); GetRotY( rotstep); VecRotateY( cosfi, sinfi); cosfi = cos( rotstep1); sinfi = sin( rotstep1); GetRotZ( rotstep1 ); VecRotateZ( cosfi, sinfi); } else if (strcmp(argv[2], "xy") == 0) VecRotTo_XY(); else if (strcmp(argv[2], "xz") == 0) VecRotTo_XZ(); else if (strcmp(argv[2], "yz") == 0) VecRotTo_YZ(); else if (strcmp(argv[2], "ab") == 0 ) VecRotTo_AB(); else if (strcmp(argv[2], "ac") == 0 ) VecRotTo_AC(); else if (strcmp(argv[2], "bc") == 0 ) VecRotTo_BC(); else { Tcl_SetResult(interp, "invalid rotation direction in xc_rotate command, must be one of +x, -x, +y, -y, +z, -z, ++xy, ++xz, ++yz, xy, xz, yz, ab, ac, bc", TCL_STATIC); return TCL_ERROR; } /* assign previous MajorMat to OldMat and than get new MajorMat */ GetOldMat(); /* this func. assign temp. MajorMat to OldMat and assign nullMat to MajorMat */ GetMajorMat(); } /* now Update display */ Togl_PostRedisplay(togl); return TCL_OK; } int xcRotateX(double fi) { int i; double cosfi, sinfi; cosfi = cos(fi); sinfi = sin(fi); /* for X rotation order is (Y,Z,X) */ for(i = 1; i <= tmp_nobjects; i++) { Rotate(&((coor + i)->y1), &((coor + i)->z1), &((coor + i)->x1), cosfi, sinfi); if ( (coor + i)->flag >= BOND ) { Rotate(&((coor + i)->y2), &((coor + i)->z2), &((coor + i)->x2), cosfi, sinfi); *(zorient + i) = 0.5 * ((coor + i)->z1 + (coor + i)->z2) + Z_OFFSET((coor + i)->flag); } else /* ATOM, SELATOM */ *(zorient + i) = (coor + i)->z1 + Z_OFFSET((coor + i)->flag); } /* rotate coor-sistem base vectors */ VecRotateX(cosfi, sinfi); return XC_OK; } int xcRotateY(double fi) { int i; double cosfi, sinfi; cosfi = cos(fi); sinfi = sin(fi); /* for Y rotation order is (Z,X,Y) */ for(i = 1; i <= tmp_nobjects; i++) { Rotate(&((coor + i)->z1), &((coor + i)->x1), &((coor + i)->y1), cosfi, sinfi); if ( (coor + i)->flag >= BOND ) { Rotate(&((coor + i)->z2), &((coor + i)->x2), &((coor + i)->y2), cosfi, sinfi); *(zorient + i) = 0.5 * ((coor + i)->z1 + (coor + i)->z2) + Z_OFFSET((coor + i)->flag); } else /* ATOM */ *(zorient + i) = (coor + i)->z1 + Z_OFFSET((coor + i)->flag); } /* rotate coor-sistem base vectors */ VecRotateY(cosfi, sinfi); return XC_OK; } int xcRotateZ(double fi) { int i; double cosfi, sinfi; cosfi = cos(fi); sinfi = sin(fi); for(i = 1; i <= tmp_nobjects; i++) { Rotate(&((coor + i)->x1), &((coor + i)->y1), &((coor + i)->z1), cosfi, sinfi); if ( (coor + i)->flag >= BOND ) { Rotate(&((coor + i)->x2), &((coor + i)->y2), &((coor + i)->z2), cosfi, sinfi); *(zorient + i) = 0.5 * ((coor + i)->z1 + (coor + i)->z2) + Z_OFFSET((coor + i)->flag); } else /* ATOM */ *(zorient + i) = (coor + i)->z1 + Z_OFFSET((coor + i)->flag); } /* rotate coor-sistem base vectors */ VecRotateZ(cosfi, sinfi); return XC_OK; } int xcRotateXY(double fiX, double fiY) { int i; double cosfiX, sinfiX; double cosfiY, sinfiY; cosfiX = cos(fiX); sinfiX = sin(fiX); cosfiY = cos(fiY); sinfiY = sin(fiY); printf("nobject=%d, tmp_nobject=%d\n",nobjects, tmp_nobjects); /* for X rotation order is (Y,Z,X) */ for(i = 1; i <= tmp_nobjects; i++) { /* rotate X */ Rotate(&((coor + i)->y1), &((coor + i)->z1), &((coor + i)->x1), cosfiX, sinfiX); /* rotate Y */ Rotate(&((coor + i)->z1), &((coor + i)->x1), &((coor + i)->y1), cosfiY, sinfiY); if ( (coor + i)->flag >= BOND ) { Rotate(&((coor + i)->y2), &((coor + i)->z2), &((coor + i)->x2), cosfiX, sinfiX); Rotate(&((coor + i)->z2), &((coor + i)->x2), &((coor + i)->y2), cosfiY, sinfiY); *(zorient + i) = 0.5 * ((coor + i)->z1 + (coor + i)->z2) + Z_OFFSET((coor + i)->flag); } else /* ATOM */ *(zorient + i) = (coor + i)->z1 + Z_OFFSET((coor + i)->flag); } /* rotate coor-sistem base vectors */ VecRotateXY(cosfiX, sinfiX, cosfiY, sinfiY); return XC_OK; } /* XC_TranslateCb --> implementation of 'xc_translate' custom Togl subcommand * --------------------------------------------------------------------------- * * Usage: xc_translate * * dir -- +x | -x | +y | -y | +z | -z * * translstep -- translation step (in % of canvas dim.) * * NOTE: this command is invoked by ButtonWidget-press; * mouse drivven translation is now implemented by XC_MesaEvent * */ int XC_TranslateCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; double translstep; double translstep1; /* this proc is meant only for .mesa widget */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( togl != mesa_togl) { Tcl_SetResult(interp, "xc_translate is meant only for .mesa", TCL_STATIC); return TCL_ERROR; } /* if structure is not opened, do noting, just return silently */ if (!VPf.stropened) return TCL_OK; if (argc != 4) { Tcl_SetResult(interp, "Usage: xc_translate ", TCL_STATIC); return TCL_ERROR; } /* is translstep valid enough */ if ( Tcl_GetDouble(interp, argv[3], &translstep) == TCL_ERROR ) { Tcl_AppendResult(interp, "invalid translstep \"%s\" in %s xc_translate command", argv[0], argv[2], (char *)NULL); return TCL_ERROR; } if ( togl == mesa_togl ) { /* from % to screen units */ translstep1 = translstep * (double) VPf.canvassize; if (strcmp(argv[2],"+x") == 0) tr.xtransl += translstep1; else if (strcmp(argv[2],"-x") == 0) tr.xtransl -= translstep1; else if (strcmp(argv[2],"+y") == 0) tr.ytransl += translstep1; else if (strcmp(argv[2],"-y") == 0) tr.ytransl -= translstep1; else if ( strcmp(argv[2],"+z") == 0) tr.zoom *= 1.0 + translstep; else if ( strcmp(argv[2],"-z") == 0) tr.zoom /= (1.0 + translstep); else { char rss[1024]; snprintf(rss, sizeof(rss),"invalid translation direction \"%s\" in xc_translate command, must be one of +x, -x, +y, -y, +z, -z",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* now make a ViewPort transformation */ xcViewPort(); /* now reset lights */ LoadLights(); /* now update the display */ Togl_PostRedisplay(togl); } else { /* do nothing for the time being */ /* NEW_WIN_CONTEXT *wc = FindWinContextByTogl (togl); wc->tr.zoom *= (1.0 + zoom); crySetProjection (wc, togl); */ } return TCL_OK; } /* XC_CloseStrCmd --> inplementation of 'xc_closestr' custom Tcl command * --------------------- * Usage: xc_closestr * * Effect: all pointers that belong to displayed structure are freed */ int XC_CloseStrCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; if (argc != 2) { Tcl_SetResult(interp, "Usage: xc_closestr ", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* structure can be closed only ones */ if (VPf.stropened == 0) { Tcl_SetResult(interp, "structure has already been closed or not opened yet!!!", TCL_STATIC); return TCL_ERROR; } VPf.stropened = 0; /* make a black polygon -> so structure will disapear */ xcClearScreen(togl); /* Togl_PostRedisplay(togl); */ /* delete a MesaEventHandler */ /* Tk_DeleteEventHandler(tk_mesawin, event_mask, (Tk_EventProc *)XC_MesaEvent, (ClientData) tk_mesawin);*/ /* maybe there are some 3D lists; destroy them */ /*xcMaybeDestroyLists();*/ /* T.K.__CORECTURE: XCDISPLAY = (VOID *) 0 */ /* xcDisplayFunc( (void *)NULL ); */ /* xcDisplay = (void *) NULL; */ xcDisplayFunc(xcDummyDisplay); /* destroy the glXContext; free the colormap associated with it */ /* xcDestroyMesaContext(); */ /* clean all stuff like DATAGRID, SUPERCELL, BZ, WIGNER-SEITZ, ISOSURFACE, etc. */ CloseGridList(); /* now FREE all variables */ FreeAllVariables(); ReloadVars(); /* reset all variables that need to be reseted */ return TCL_OK; } extern AtomBond *coor3D; void FreeAllVariables(void) { xcFree((void*) sqn); xcFree((void*) iwksp); xcFree((void*) nat); xcFree((void*) xat); xcFree((void*) yat); xcFree((void*) zat); xcFree((void*) fv); xcFree((void*) bondend); xcFree((void*) xbond); xcFree((void*) ybond); xcFree((void*) zbond); xcFree((void*) xbond2); xcFree((void*) ybond2); xcFree((void*) zbond2); xcFree((void*) zbmid); xcFree((void*) natbond); xcFree((void*) sqnbond); xcFree((void*) coor); xcFree((void*) zorient); xcFree((void*) coor3D); /* following variables has been malloced only if nframes > 0 */ if ( nframes > 0 ) { xcFree((void*) xframe); xcFree((void*) yframe); xcFree((void*) zframe); xcFree((void*) xframe2); xcFree((void*) yframe2); xcFree((void*) zframe2); xcFree((void*) frametype); } /*for(i=0; i inplementation of 'xc_displayMode3D' custom * Tcl command * --------------------- * Usage: xc_displayMode3D over| boolean */ int XC_DisplayMode3DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) /* ================================================================= * procedure assign wanted display function to xcDisplayFunc * ================================================================= */ { struct Togl *togl; if (argc != 4) { Tcl_SetResult(interp, "Usage: xc_displayMode3D over|boolean ", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if structure is not opened, return silently */ if (!VPf.stropened) return TCL_OK; /* if we are in selection mode, mode-changing is not allowed, return silenlty */ if (VPf.selection) return TCL_OK; /* argv[1] must be either 'over', either 'boolean' */ if ( strcmp(argv[2],"over") != 0 && strcmp(argv[2],"boolean") != 0 ) { Tcl_SetResult(interp, "Usage: xc_displayMode3D over|boolean ", TCL_STATIC); return TCL_ERROR; } /* --- Is OK ??? --- */ /* S -- sticks * B -- balls * BS -- balls&sticks * SF -- spacefill * PB -- pipe&balls */ if ( strcmp(argv[3],"S") != 0 && strcmp(argv[3],"B") != 0 && strcmp(argv[3],"SF") != 0 && strcmp(argv[3],"PB") != 0 && strcmp(argv[3],"BS") != 0 ) { char rss[1024]; snprintf(rss, sizeof(rss),"Unknown \"%s\", must be one of S, B, SF, BS", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* First destroy BallLists, if they exist */ /*xcMaybeDestroyBallLists();*/ /* if previous displayMode was one of 2D, than we must prepare * for 3D "AtomBond3D coor3D" */ printf("XC_DisplayMode3DCmd:: --before From2Dto3D()\ndimType=%d",dimType); fflush(stdout); /* glEnable things for 3D */ dimType = XC_3D; EnableOr2D_Or3D(); if ( strcmp(argv[2],"boolean") == 0 ) { if ( strcmp(argv[3],"S") == 0 ) { is.stickmode = !is.stickmode; is.spacefillmode = GL_FALSE; xcMakeProjection3D("sticks"); /* xcMakeStick3DLists(); */ } else if ( strcmp(argv[3],"B") == 0 ) { is.ballmode = !is.ballmode; is.spacefillmode = GL_FALSE; xcMakeProjection3D("balls"); /* xcMakeBall3DLists(); */ } else if ( strcmp(argv[3],"BS") == 0 ) { /* actually this is more over mode */ is.stickmode = GL_TRUE; is.ballmode = GL_TRUE; is.spacefillmode = GL_FALSE; xcMakeProjection3D("balls"); /* xcMakeStick3DLists(); xcMakeBall3DLists(); */ } else if ( strcmp(argv[3],"SF") == 0 ) { is.spacefillmode = !is.spacefillmode; is.stickmode = GL_FALSE; is.ballmode = GL_FALSE; xcMakeProjection3D("space"); /* xcMakeSpaceFill3DLists(); */ } } else if ( strcmp(argv[2],"over") == 0 ) { if ( strcmp(argv[3],"S") == 0 ) { is.stickmode = GL_TRUE; is.ballmode = GL_FALSE; is.spacefillmode = GL_FALSE; xcMakeProjection3D("sticks"); /* xcMakeStick3DLists(); */ } else if ( strcmp(argv[3],"B") == 0 ) { is.ballmode = GL_TRUE; is.stickmode = GL_FALSE; is.spacefillmode = GL_FALSE; xcMakeProjection3D("balls"); /* xcMakeBall3DLists(); */ } else if ( strcmp(argv[3],"PB") == 0 ) { is.pipemode = GL_TRUE; is.stickmode = GL_TRUE; is.ballmode = GL_TRUE; is.spacefillmode = GL_FALSE; xcMakeProjection3D("balls"); /* xcMakeStick3DLists(); */ /* xcMakeBall3DLists(); */ } if ( strcmp(argv[3],"BS") == 0 ) { is.pipemode = GL_FALSE; is.stickmode = GL_TRUE; is.ballmode = GL_TRUE; is.spacefillmode = GL_FALSE; xcMakeProjection3D("balls"); /* xcMakeStick3DLists(); */ /* xcMakeBall3DLists(); */ } if ( strcmp(argv[3],"SF") == 0 ) { is.spacefillmode = GL_TRUE; is.stickmode = GL_FALSE; is.ballmode = GL_FALSE; xcMakeProjection3D("space"); /* xcMakeSpaceFill3DLists(); */ } } /* LOAD LIGHTS & MATERIAL PROPERTYES & FRONTFACE & BLENDFUNC */ LoadLights(); LoadStructMaterial(); LoadBlendfunc_And_Frontface(); xcDisplayFunc(xcDisplay3D); Togl_PostRedisplay(togl); return TCL_OK; } /* XC_DrawStyle3DCmd --> inplementation of 'xc_drawStyle3D' custom * Tcl command * --------------------- * Usage: xc_drawStyle3D */ int XC_DrawStyle3DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; /* ================================================================= * procedure assign wanted drawStyle and redraw in that style * ================================================================= */ if (argc != 3) { Tcl_SetResult(interp, "Usage: xc_drawStyle3D ", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if structure is not opened, return silently */ if (!VPf.stropened) return TCL_OK; /* check if we are in 3D mode, if not return silently */ if (dimType != XC_3D) return TCL_OK; /*EV*/ if ( strcmp(argv[2],"solid") == 0 ) { is.solid = GL_TRUE; } else if ( strcmp(argv[2],"wire") == 0 ) { is.solid = GL_FALSE; } else if ( strcmp(argv[2],"anaglyph") == 0 ) { if (is.anaglyph == GL_TRUE) { is.anaglyph = GL_FALSE; } else { is.anaglyph = GL_TRUE; } } else if ( strcmp(argv[2],"stereo") == 0 ) { /* toogle the stereo flag */ if (is.stereo == GL_TRUE) { /*fprintf(stderr,"Stereo = off\n");*/ is.stereo = GL_FALSE; glDrawBuffer(GL_BACK); } else { /*fprintf(stderr,"Stereo = whats to be on\n");*/ GLboolean can_do_stereo; glGetBooleanv(GL_STEREO, &can_do_stereo); if (can_do_stereo == GL_TRUE) is.stereo = GL_TRUE; else { is.stereo = GL_FALSE; /*fprintf(stderr,"Stereo = off\n");*/ } } } else { char rss[1024]; snprintf(rss, sizeof(rss), "Unknown \"%s\", must be one of \"solid\", \"wire\", \"anaglyph\", or \"stereo-\"", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } Togl_PostRedisplay(togl); return TCL_OK; } /* XC_ShadeModel3DCmd --> implementation of 'xc_shadeModel3D' custom * Tcl command * --------------------- * Usage: xc_shadeModel3D */ int XC_ShadeModel3DCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; /* ================================================================= * procedure assign wanted drawStyle and redraw in that style * ================================================================= */ if (argc != 3) { Tcl_SetResult(interp, "Usage: xc_shadeModel3D ", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if structure is not opened, return silently */ if (!VPf.stropened) return TCL_OK; /* check if we are in 3D mode, if not return silently */ if (dimType != XC_3D) return TCL_OK; if ( strcmp(argv[2],"smooth") == 0 ) { is.smooth = GL_TRUE; glShadeModel(GL_SMOOTH); } else if ( strcmp(argv[2],"flat") == 0 ) { is.smooth = GL_FALSE; glShadeModel(GL_FLAT); } else { char rss[1024]; snprintf(rss, sizeof(rss), "Unknown \"%s\", must be one \"smooth\", \"flat\"", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } Togl_PostRedisplay(togl); return TCL_OK; } /* XC_PointSizeCmd --> implementation of 'xc_pointSize' custom * Tcl command * --------------------- * Usage: xc_pointSize */ int XC_PointSizeCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; int pointsize; if (argc != 3) { Tcl_SetResult(interp, "Usage: xc_pointSize ", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[1], &pointsize) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" in xc_poinsize command", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } printf("PointSize:: %d\n",pointsize); glPointSize( (GLfloat) pointsize ); /* if structure is not opened, return silently */ if (!VPf.stropened) return TCL_OK; Togl_PostRedisplay(togl); return TCL_OK; } /* XC_ResetVarCmd --> implementation of xc_resetvar custom Tcl command * * Usage: xc_resetvar * * -- number to identificate a variable; * look in the struct.h -- defines with * R_ prefix; * Side Effects: wanted variable is reseted to default value, and * ReDisplay is made if and only if structure is opened */ int XC_ResetVarCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; int var; if (argc != 3) { Tcl_SetResult(interp, "Usage: xc_resetvar ", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[2], &var) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" in xc_resetvar command", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } ResetVar(togl, var); return TCL_OK; } /* XC_OldAtmColCmd --> load old atomic colors * * Usage: xc_oldatmcol */ int XC_OldAtmColCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { LoadOldAtomicColors(); return TCL_OK; } /* XC_NewValueCmd --> implementation of xc_newvalue custom Tcl command * * Usage: xc_newvalue ?value1? ?value2? ?value3? ?value4? * * -- number to identificate a variable; * look in the struct.h -- defines with * L_ prefix; * Side Effects: wanted variable is set to new value, and * ReDisplay is made if and only if structure is opened */ int XC_NewValueCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; int var, i; double value[4] = { 0.0, 0.0, 0.0, 0.0 }; if (argc < 3 || argc > 7) { Tcl_SetResult(interp, "Usage: xc_newvalue ?value1? ?value2? ?value3? ?value4?", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[2], &var) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer for , but got \"%s\" in xc_newvalue command", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } for (i=3; i natoms) { char rss[1024]; snprintf(rss, sizeof(rss), "atomID out of range, should be between [0,%d]", natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (toggle) atomLabel[atomID].do_display = XC_YES; else atomLabel[atomID].do_display = XC_NO; Togl_PostRedisplay(togl); } else if ( var == SET_GLOBALATOMLABEL_DO_DISPLAY ) { /* usage: xc_newvalue togl SET_GLOBALATOMLABEL_DO_DISPLAY 0|1 */ int toggle = (int) value[0]; if ( argc != 4 ) { char rss[1024]; snprintf(rss, sizeof(rss), "wrong number of arguments %d, must be xc_newvalue togl SET_GLOBALATOMLABEL_DO_DISPLAY 0|1", argc); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (toggle) globalAtomLabel.do_display = XC_YES; else globalAtomLabel.do_display = XC_NO; Togl_PostRedisplay(togl); } else if ( var == SET_DO_NOT_DISPLAY_ATOMLABEL ) { /* usage: xc_newvalue togl SET_DO_NOT_DISPLAYATOM_LABEL atomID 0|1 */ int atomID = (int) value[0]; int toggle = (int) value[1]; if ( argc != 5 ) { char rss[1024]; snprintf(rss, sizeof(rss), "wrong number of arguments %d, must be xc_newvalue togl SET_DO_NOT_DISPLAY_LABEL atomID 0|1", argc); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (atomID < 1 || atomID > natoms) { char rss[1024]; snprintf(rss, sizeof(rss), "atomID out of range, should be between [0,%d]", natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (toggle) do_not_display_atomlabel[atomID] = XC_YES; else do_not_display_atomlabel[atomID] = XC_NO; Togl_PostRedisplay(togl); } else { LoadNewValue(togl, var, value[0], value[1], value[2], value[3]); } return TCL_OK; } /* XC_GetDefault --> implementation of xc_getdefault custom Tcl command * * Usage: xc_getdefault ?value? * * -- number to identificate a variable; * look in the struct.h -- defines with * D_ prefix; * Side Effects: default value of " variable" is returned */ int XC_GetDefaultCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int var, value = 0; char *result = (char *) Tcl_Alloc( sizeof(char) * 64); /* maximum lenght of result string is 64 characters */ if (argc < 2) { Tcl_SetResult(interp, "Usage: xc_getdefault ?value?", TCL_STATIC); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[1], &var) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" in xc_getdefault command", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( argc == 3 ) if ( Tcl_GetInt(interp, argv[2], &value) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" in xc_getdefault command", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* ============================================================ */ if ( var == D_ATCOL_ONE ) /* case D_ATCOL */ sprintf(result,"%f %f %f",DefAtCol[value][0],DefAtCol[value][1], DefAtCol[value][2]); else if ( var == D_ATRAD_ONE ) /* case D_ATRAD_ONE */ sprintf(result,"%f", DEF_ATRADF * rcov[value]); else if ( var == D_RCOV_ONE) /* case D_RCOV_ONE */ sprintf(result,"%f", rcov[value]); else if ( var == D_FRAMECOL ) /* case D_FRAMECOL */ sprintf(result,"%f %f %f", DefFrameCol[0], DefFrameCol[1], DefFrameCol[2]); else if ( var == D_UNIBONDCOLOR ) /* case D_UNIBONDCOLOR */ sprintf(result,"%f %f %f", DefUnibondCol[0], DefUnibondCol[1], DefUnibondCol[2]); else if ( var == GET_FOG_COLOR ) { sprintf(result, "%f %f %f %f", def_fog_color[0], def_fog_color[1], def_fog_color[2], def_fog_color[3]); } else if ( var == D_FORCE_COLOR ) { sprintf(result, "%f %f %f %f", DefAtCol[0][0], DefAtCol[0][1], DefAtCol[0][2], 1.0); } else if ( var == D_XYZ_AXIS_COLOR ) { sprintf(result, "%f %f %f %f", def_xyz_axis_color[0], def_xyz_axis_color[1], def_xyz_axis_color[2], def_xyz_axis_color[3]); } else if ( var == D_XYZ_XYPLANE_COLOR ) { sprintf(result, "%f %f %f %f", def_xyz_xyplane_color[0], def_xyz_xyplane_color[1], def_xyz_xyplane_color[2], def_xyz_xyplane_color[3]); } else sprintf(result, "%f", GetDefault(var)); Tcl_SetResult(interp, result, TCL_DYNAMIC); return TCL_OK; } /* XC_GetValue --> implementation of xc_getvalue custom Tcl command * * Usage: xc_getvalue ?value? * * -- number to identificate a variable; * look in the struct.h -- defines with * D_ prefix; * Side Effects: temporary value of " variable" is returned */ int XC_GetValueCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int var, value = 0; char *result = (char *) Tcl_Alloc( sizeof(char) * 256); /* maximum lenght of result string is 256 characters */ if (argc < 2) { Tcl_SetResult(interp, "Usage: xc_getvalue ?value?", TCL_STATIC); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[1], &var) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" in xc_getvalue command", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( argc == 3 ) if ( Tcl_GetInt(interp, argv[2], &value) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" in xc_getvalue command", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* ======================== */ if ( var == D_ATCOL_ONE ) { /* case D_ATCOL */ sprintf(result,"%f %f %f",atcol[value][0],atcol[value][1], atcol[value][2]); printf("GETVALUE> color = %s\n",result); fflush(stdout); } /* case D_ATRAD_ONE */ else if ( var == D_ATRAD_ONE ) { sprintf(result, "%f", atrad[value]); } /* case D_RCOV_ONE */ else if ( var == D_RCOV_ONE ) { sprintf(result, "%f", rcov[value]); } /* case D_FRAMECOL */ else if ( var == D_FRAMECOL ) { sprintf(result,"%f %f %f", framecol[0], framecol[1], framecol[2]); } /* case D_MAXSTRUCTSIZE */ else if ( var == D_MAXSTRUCTSIZE ) { sprintf(result,"%f %f %f", max.x, max.y, max.z); } else if ( var == D_UNIBONDCOLOR ) { /* case D_UNIBONDCOLOR */ sprintf(result,"%f %f %f", unibondCol[0], unibondCol[1], unibondCol[2]); } else if ( var == D_BACKGROUND ) { /* case D_UNIBONDCOLOR */ sprintf(result,"%f %f %f %f", bg[0], bg[1], bg[2], bg[3]); } else if ( var == GET_NATOMS ) { if ( ! VPf.stropened) { sprintf(result, "-1"); } else { sprintf(result, "%d", natoms); } } else if ( var == GET_NAT ) { if ( ! VPf.stropened) { sprintf(result, "-1"); } else { if ( value < 1 || value > natoms ) { char rss[1024]; snprintf(rss, sizeof(rss), "atom index %d too large, must be between [1,%d]", value, natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } sprintf(result, "%d", *(nat + value)); } else if ( var == GET_ATOMLABEL_LABEL ) { if ( value < 1 || value > natoms ) { char rss[1024]; snprintf(rss, sizeof(rss), "atom index %d too large, must be between [1,%d]", value, natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( atomLabel[value].label ) { sprintf(result, "%s", atomLabel[value].label); } else { result[0] = '\0'; } } else if ( var == GET_ATOMLABEL_BRIGHTCOLOR ) { if ( value < 1 || value > natoms ) { char rss[1024]; snprintf(rss, sizeof(rss), "atom index %d too large, must be between [1,%d]", value, natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( atomLabel[value].base ) { sprintf(result, "%f %f %f", atomLabel[value].bright_color[0], atomLabel[value].bright_color[1], atomLabel[value].bright_color[2]); } else { sprintf(result, "1.0 1.0 1.0"); } } else if ( var == GET_ATOMLABEL_DARKCOLOR ) { if ( value < 1 || value > natoms ) { char rss[1024]; snprintf(rss, sizeof(rss), "atom index %d too large, must be between [1,%d]", value, natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( atomLabel[value].base ) { sprintf(result, "%f %f %f", atomLabel[value].dark_color[0], atomLabel[value].dark_color[1], atomLabel[value].dark_color[2]); } else { sprintf(result, "0.0 0.0 0.0"); } } else if ( var == GET_ATOMLABEL_DO_DISPLAY ) { if (value < 1 || value > natoms) { char rss[1024]; snprintf(rss, sizeof(rss), "atom index %d out of range, should be between [0,%d]", value, natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } sprintf(result, "%d", atomLabel[value].do_display); } else if ( var == GET_ATOMLABEL_ALL_ID ) { /* return all the ID's of all atoms than have cutom-labels */ int i; for (i=1; i<=natoms; i++) { if (atomLabel[i].base) { sprintf(result, "%d ", i); Tcl_AppendElement(interp, result); } } Tcl_Free(result); return TCL_OK; } else if ( var == GET_GLOBALATOMLABEL_DO_DISPLAY ) { sprintf(result, "%d", globalAtomLabel.do_display); } else if ( var == GET_FOG_COLOR ) { sprintf(result, "%f %f %f %f", fog.color[0], fog.color[1], fog.color[2], fog.color[3]); } else if ( var == D_FORCE_COLOR ) { sprintf(result, "%f %f %f %f", FV.color[0], FV.color[1], FV.color[2], 1.0); } else if ( var == D_XYZ_AXIS_COLOR ) { sprintf(result, "%f %f %f %f", xyz.axis_color[0], xyz.axis_color[1], xyz.axis_color[2], xyz.axis_color[3]); } else if ( var == D_XYZ_XYPLANE_COLOR ) { sprintf(result, "%f %f %f %f", xyz.xyplane_color[0], xyz.xyplane_color[1], xyz.xyplane_color[2], xyz.xyplane_color[3]); } else { /* ELSE get the result from GetValue(var) function */ sprintf(result, "%.15f", GetValue(var)); } Tcl_SetResult(interp, result, TCL_DYNAMIC); return TCL_OK; } /* XC_UpdateStrCmd --> inplementation of 'xc_updatestr' custom Tcl command * --------------------- * Usage: xc_updatestr ?format? * * toglName --- name of togl where structure will be * displayed * format --- format of the file ( xsf | pdb ); default = xsf * * Side effects: when changing "number of cells drawn" for periodic structure * we want situation to be as before, just number of cells is * supposed to change, so we must preserve a lot of stuff */ int XC_UpdateStrCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; FILE *fp; int format = FORMAT_XSF; fprintf(stderr, "*** XC_UpdateStrCmd; argc == %d\n", argc); fflush(stderr); if (argc < 3 || argc > 4) { Tcl_SetResult(interp, "Usage: xc_updatestr ?format?", TCL_STATIC); return TCL_ERROR; } /* --- if structure is not opened just return silently --- */ if (!VPf.stropened) return TCL_OK; /* Check if 'file' is OK */ fp = fopen(argv[1],"r"); if (fp == NULL) { char rss[1024]; snprintf(rss, sizeof(rss), "Can't open file \"%s\"",argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[2], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( argc == 4 ) { /* determine file format */ if ( (strcmp(argv[3],"xcr") == 0) || (strcmp(argv[3],"xsf") == 0) ) format = FORMAT_XSF; else if ( strcmp(argv[3],"xyz") == 0 ) format = FORMAT_XYZ; else if ( strcmp(argv[3],"pdb") == 0 ) format = FORMAT_PDB; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown format \"%s\", must be one of \"xsf\", \"xyz\", \"pdb\"", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* free neccesarry variables */ FreeAllVariables(); /* reset all variables needed */ natoms = 0; nbonds = 0; nframes = 0; tmp_nobjects = 0; nobjects = 0; /* command is OK * LET'S READ A FILE */ if (!ReadStructFile(fp, argv[1], format, XSF_UPDATE)) { char rss[1024]; snprintf(rss, sizeof(rss),"Error reading file \"%s\"",argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); fclose(fp); VPf.stropened = 0; xcClearScreen(togl); /*xcMaybeDestroyLists();*/ xcDisplayFunc(xcDummyDisplay); ReloadVars(); Togl_PostRedisplay(togl); return TCL_ERROR; } /* now we can close the file */ fclose(fp); /* Update DisplayFunc */ UpdateDispFunc(); /* update a projection */ UpdateProjection(); xcViewPort(); /* assing the sInfo global array */ Set_sInfoArray( interp ); /* Display a Structure */ Togl_PostRedisplay(togl); /* if we come so far we were succesfully */ return TCL_OK; } /* Revision: Thu Nov 12 08:58:59 CET 1998 this routine was used in the times of mesaWin. At present we use Togl and the routine is maintained just for backward compatibility; it was adapted for togl */ /***************************************************************************** * sometimes due to some strange reconfiguration of the displayed * * structure vanishes; this command is provided to recover from that kind * * of event * *****************************************************************************/ int XC_SwapBufferCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; if (argc != 2) { Tcl_SetResult(interp, "Usage: xc_swapbuffer ", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( VPf.stropened ) Togl_SwapBuffers( togl ); return TCL_OK; } /* Revision: Thu Nov 12 08:59:56 CET 1998 this routine was used in the times of mesaWin. At present we use Togl and the routine is maintained just for backward compatibility; it was adapted for togl */ /***************************************************************************** * sometimes we just want to run the Display Function * *****************************************************************************/ int XC_DisplayCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; if (argc != 2) { Tcl_SetResult(interp, "Usage: xc_display ", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( VPf.stropened ) Togl_PostRedisplay(togl); return TCL_OK; } /* * * Usage: xc_rotationmatrix get * or xc_rotationmatrix set v1 v2 v3 v4 v5 v6 .... * * the appropriate vector is double vec.crdvec[16] !!! */ int XC_RotationMatrixCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int i; if ( strcmp(argv[1], "get") == 0 ) { char *string = calloc(30, sizeof(char)); for (i=0; i<16; i++) { sprintf(string, "%22.15e ",vec.crdvec[i]); Tcl_AppendResult(interp, string, (char*)NULL); } free( (FREE_ARG) string); } else if ( strcmp(argv[1], "set") == 0 ) { double number; if ( argc != 18 ) { char rss[1024]; snprintf(rss, sizeof(rss), "wrong # args: should be \"xc_rotationmatrix set v1 ... v16\""); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } for (i=0; i<16; i++) { if ( Tcl_GetDouble(interp, argv[i+2], &number) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "wanted double but got %s", argv[i+2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } vec.crdvec[i] = number; } vecVecToMat ( vec.crdvec, vec.crdmajor ); if ( dimType == XC_2D ) { /* recalculate the 2D-coor accoring to new rotation matrix */ /* this call will do the job */ xcAssignDisplayFunc(displayMode2D); } } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown mode %s, must be get or set", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } /* * * Usage: xc_translparam get * or xc_translparam set xtransl ytransl zoom */ int XC_TranslParamCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int i; if ( strcmp(argv[1], "get") == 0 ) { char *string = calloc(30, sizeof(char)); sprintf(string, "%22.15e ", tr.xtransl); Tcl_AppendResult(interp, string, (char*)NULL); sprintf(string, "%22.15e ", tr.ytransl); Tcl_AppendResult(interp, string, (char*)NULL); sprintf(string, "%22.15e ", tr.zoom); Tcl_AppendResult(interp, string, (char*)NULL); free( (FREE_ARG) string); } else if ( strcmp(argv[1], "set") == 0 ) { double number[3]; if ( argc != 5 ) { char rss[1024]; snprintf(rss, sizeof(rss), "wrong # args: should be \"translparam set xtransl ytransl zoom\""); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } for (i=0; i<3; i++) { if ( Tcl_GetDouble(interp, argv[i+2], number + i) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "wanted double but got %s", argv[i+2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } tr.xtransl = number[0]; tr.ytransl = number[1]; tr.zoom = number[2]; UpdateProjection(); xcViewPort(); } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown mode %s, must be get or set", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } /* Checks if the stereo is supported by a hardware Note: probably this should be called after the togl creation Usage: xc_stereo */ int XC_StereoCmd(ClientData clientData,Tcl_Interp *interp, int argc, const char *argv[]) { char *result = (char *) Tcl_Alloc( sizeof(char) * 128); GLboolean stereo; #if defined(TOGL_X11) Display *display; int screen; XVisualInfo *info; int list1[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_STEREO, (int) None, }; display = XOpenDisplay(NULL); screen = DefaultScreen(display); info = glXChooseVisual(display, screen, list1); if (info) { stereo = GL_TRUE; XFree(info); } XCloseDisplay(display); #else glGetBooleanv(GL_STEREO, &stereo); #endif if (stereo == GL_TRUE) { fprintf(stderr, "\n*** the hardware supports the stereo ***\n\n"); sprintf(result, "%d", 1); } else { fprintf(stderr, "\n*** the hardware does not support the stereo ***\n\n"); sprintf(result, "%d", 0); } Tcl_SetResult(interp, result, TCL_DYNAMIC); return TCL_OK; } xcrysden-1.6.2/C/xcF3toI4.c0000644000175000017500000000567713514361015013762 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcF3toI4.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #include "xcfunc.h" int XC_F3toI4Cmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* ------------------------------------------------------------ * * * * xc_f3toi4 f1 f2 f3 * * * * ------------------------------------------------------------ */ int XC_F3toI4Cmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { double a1, a[3]; double ddv, tol = 1.0e-5; int i, j, idv; int ifc[3] = {1, 1, 1}; char *result = Tcl_Alloc( sizeof(char) * 256); if ( argc != 4 ) { Tcl_SetResult(interp, "Usage: xc_f3toi4 f1 f2 f3", TCL_STATIC); return TCL_ERROR; } for (i=0; i<3; i++) if ( Tcl_GetDouble( interp, argv[i+1], a + i) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "wanted double, but got %s", argv[i+1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /**************************************/ /* find an integer multiplier for a[] */ for (j=0; j<3; j++) { i = 0; while( 1 ) { a1 = ABS( (double) ++i * a[j] ); if ( ABS(a1 - iround(a1)) < tol ) { ifc[j] = i; break; } else if (i > iround(1.0/tol)) { /* some combination of triplet-numbers can produce realy huge numbers, so this loop can never end, lets say that the greater allowed I is iround(1.0/tol) */ tol *= 10.0; i = 0; } } } /* now numbers should be multiplied by ifc[0]*ifc[1]*ifc[2] */ idv = ifc[0]*ifc[1]*ifc[2]; ddv = (double) idv; /* breakpoint("breakpoint"); */ /* we must return back the integer coordinates */ sprintf(result, "%d %d %d %d", iround(a[0] * ddv), iround(a[1] * ddv), iround(a[2] * ddv), idv); Tcl_SetResult(interp, result, TCL_DYNAMIC); return TCL_OK; } xcrysden-1.6.2/C/3D.h0000644000175000017500000000362311712736221012662 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/3D.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ /* definition that are used for 3D structures/displayModes */ GLdouble NewMat[4][4]; GLdouble OldMat[4][4]; GLdouble MajorMat[4][4]; GLdouble xcGLvec[16]; /*****************************************************************************/ typedef struct { int flag; /* flag for BOND or FRAME */ int bondFlag; int nat; /* corresponding atomic number * from NAT all other atribbutes are assigned */ int sqn; /* sequential number of atom; from sqn other attribbutes are assigned */ GLuint list; /* identifier for BallList to use when making/rendering balls */ double x1; double y1; /* for ATOMS only X1 Y1 Z1 are needed */ double z1; double xrvb; /* XRotationVectorBond; */ double yrvb; /* (xrvb, yrvb, zrvb) is vector around which I rotatte */ double zrvb; /* auxCylinder for fibond; lenght of bond is bondl */ double fibond; double bondl; } BondFrame3D; BondFrame3D *coor3D; xcrysden-1.6.2/C/isoline_old.c0000644000175000017500000001123711712736221014707 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/isoline.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define XC_CPP_NO_STDIO #include "struct.h" #include "isosurf.h" #include "memory.h" extern void GetIsoLine2D_Attributes(int obj, int cb, int fn); extern XYZ VertexInterp(float isolevel, XYZ p1, XYZ p2, float valp1, float valp2); extern PLANEVERTEX ***plvertex; typedef struct { XYZ p[3]; float val[3]; } TRIANGL_GRID; int IsoLine2D(int obj, int cb, int fn, int nx, int ny); static void Segmentise( int obj, TRIANGL_GRID triangl, int nlevel, float level[ISOLINE_MAXLEVEL] ); extern ISOSTATE isostate; int IsoLine2D(int obj, int cb, int fn, int nx, int ny) { register int i, j; TRIANGL_GRID triangl1; TRIANGL_GRID triangl2; int nnx, nny; GetIsoLine2D_Attributes(obj, cb, fn); /* reset the seqment counter */ for (i=0; i isostate.max_n_isoline2D[obj][il] ) isoline2D[obj].segment[il] = xcRealloc2xBiggerLINE( &(isoline2D[obj].segment[il][0]), &isostate.max_n_isoline2D[obj][il] ); nseg=0; v[0] = triangl.val[0] - level[il]; v[1] = triangl.val[1] - level[il]; v[2] = triangl.val[2] - level[il]; if ( v[0]*v[1] < 0.0 ) { p[nseg] = VertexInterp(level[il], triangl.p[0], triangl.p[1], triangl.val[0], triangl.val[1]); nseg++; } if ( v[1]*v[2] < 0.0 ) { p[nseg] = VertexInterp(level[il], triangl.p[1], triangl.p[2], triangl.val[1], triangl.val[2]); nseg++; } if ( v[2]*v[0] < 0.0 ) { p[nseg] = VertexInterp(level[il], triangl.p[2], triangl.p[0], triangl.val[2], triangl.val[0]); nseg++; } if (nseg == 2) { isoline2D[obj].segment[il][isoline2D[obj].iseg[il]].p1 = p[0]; isoline2D[obj].segment[il][isoline2D[obj].iseg[il]].p2 = p[1]; isoline2D[obj].iseg[il]++; } } } xcrysden-1.6.2/C/xcGLparam.h0000644000175000017500000001025211712736221014266 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcGLparam.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ /* this is preprocessor option tomark that we have include this file */ #define XC_CPP_GLPARAM #ifndef XC_CPP_GLH # include # define XC_CPP_GLH #endif /***********************************************/ #define GLPAR_MATERIAL 0 #define GLPAR_LIGHT 1 #define GLPAR_LIGHTMODEL 3 #define GLPAR_FRONTFACE 4 #define GLPAR_BLENDFUNC 5 #define GLPAR_FOG 6 #define GLPAR_MAT_WHAT_STRUCTURE 0 #define GLPAR_MAT_WHAT_ISOSURF 1 #define GLPAR_MAT_WHAT_ISOPOS 0 #define GLPAR_MAT_WHAT_ISONEG 1 #define GLPAR_MAT_WHAT_ISOONE 3 #define GLPAR_MAT_WHAT_ISOBACKSIDE 0 #define GLPAR_MAT_WHAT_ISOFRONTSIDE 1 /* please, do not change these two values */ #define GLPAR_FACE_WHAT_ISOSURF_POS 0 #define GLPAR_FACE_WHAT_ISOSURF_NEG 1 #define GLPAR_BLEND_WHAT_ISOSURF 0 #define GLPAR_BLEND_WHAT_COLORPLANE 1 #define GLPAR_MAXLIGHT 5 /***********************************************/ /* this is for displaying vorious vectors and cages */ #define GLPAR_N_OF_VEC_AND_CAGE 8 #define GLPAR_PRIMCAGE 0 #define GLPAR_CONVCAGE 1 #define GLPAR_SCCAGE 2 #define GLPAR_PRIMVEC 3 #define GLPAR_CONVVEC 4 #define GLPAR_SCVEC 5 #define GLPAR_ISOPARALLE 6 #define GLPAR_ISOPARAPIP 7 #define XC_GET_RGBA 0 #define XC_GET_XYZ 1 #define XC_GET_XYZW 2 #define XC_GET_FLOAT 3 #define XC_GET_FLOAT4 4 #define XC_GET_FLOAT6 5 #define XC_GET_FLOAT12 6 #define XC_GET_INT 7 #define XC_GET_INT3 8 #define XC_GET_INT12 9 #define XC_GET_FLOAT2 10 #define XC_GET_RGB 11 typedef struct { float ambient[4]; float diffuse[4]; float specular[4]; float shininess[1]; float emission[4]; } xcMATERIAL; #ifndef XC_CPP_BOOLEAN typedef int boolean; # define XC_CPP_BOOLEAN #endif typedef struct { boolean isenabled; float ambient[4]; float diffuse[4]; float specular[4]; float fract_position[4]; /* position in fractional coordinates */ float position[4]; float spot_dir[3]; float spot_exp[1]; float spot_cutoff[1]; float const_atten[1]; float lin_atten[1]; float quad_atten[1]; } LIGHT; #define LIGHTMODEL_STRUCTURE 0 /* this is used by GL_LIGHT_MODEL_TWO_SIDE */ #define LIGHTMODEL_ISOSURF 1 typedef struct { float two_side[1]; /* two_side for structure */ float two_side_iso[1]; /* two_side for isosufrace & related */ float ambient[4]; float local_viewer[1]; } LIGHTMODEL; typedef struct { GLenum sfunc; GLenum dfunc; } BLENDFUNC; typedef GLenum FRONTFACE; xcMATERIAL mat_struct, mat_colorplane[2]; xcMATERIAL back_mat_isosurf[2], front_mat_isosurf[2]; xcMATERIAL back_mat_pos_isosurf[2], front_mat_pos_isosurf[2]; xcMATERIAL back_mat_neg_isosurf[2], front_mat_neg_isosurf[2]; xcMATERIAL mat_voronoi[2]; xcMATERIAL mat_vec_and_cage[GLPAR_N_OF_VEC_AND_CAGE]; #define MAX_NUMBER_OF_LIGHTS GLPAR_MAXLIGHT+1 LIGHT light[MAX_NUMBER_OF_LIGHTS]; LIGHTMODEL lightmodel; BLENDFUNC blend_isosurf, blend_colorplane, blend_voronoi, blend_cellcage; FRONTFACE frontface_isosurf[2]; typedef struct { boolean is; float vec[20]; } GetGlParam; xcrysden-1.6.2/C/isorender.c0000644000175000017500000004664713521263351014415 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/isorender.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define XC_CPP_NO_STDIO #include #include "xcGLparam.h" #include "struct.h" #include "isosurf.h" #include "molsurf.h" #include "xcfunc.h" extern ISO_ATTRIB isoDisp, isoplaneDisp[MAX_ISOOBJECTS]; extern PLANEVERTEX ***plvertex; void xcRenderIsosurf(int obj); void xcRenderColorplane(int obj); void xcRenderIsoLine2D(int obj); static void DrawColorPlane(int obj); static void DrawIsoLine2D(int obj); /* --- lighting.c --- */ extern void LoadStructMaterial(void); extern void LoadIsoMaterial(int type); extern void LoadLightModel(int type); /* isosurface.c */ extern ISOSURFACE *FindIsoSurf(int index); extern void AddToIsoSurfList(ISOSURFACE *g); extern int NewIsoSurf(void); void xcRenderIsosurf(int obj) { register int j, ix, iy, iz, j3; int is_solid, index, ind[3] = {0, 1, 2}; GLuint i; GLint shade_model; GLboolean switch_shademodel = GL_FALSE; GLboolean switch_lightmodel = GL_FALSE; GLfloat tr_vec[3]; /* TRANSPARENCY */ if ( isoDisp.transparent == ISOSURF_TRANSP_ON ) { glEnable( GL_BLEND ); glDepthMask( GL_FALSE ); glBlendFunc( blend_isosurf.sfunc, blend_isosurf.dfunc ); } /* SHADEMODEL */ glGetIntegerv( GL_SHADE_MODEL, &shade_model ); if ( shade_model != isoDisp.shademodel ) { switch_shademodel = GL_TRUE; glShadeModel( isoDisp.shademodel ); } /* LIGHTMODEL */ if ( lightmodel.two_side[0] != lightmodel.two_side_iso[0] ) { switch_lightmodel = GL_TRUE; glLightModelfv( GL_LIGHT_MODEL_TWO_SIDE, lightmodel.two_side_iso ); } /* isosurface render-style */ if ( isoDisp.drawstyle == ISOSURF_SOLID ) { is_solid = MAT_SOLID; } else { is_solid = 0; } /****************************************************/ /* load isosurf's material properties */ for (j=0; j < isodata.nlevel; j++) { /* FRONTFACE */ /* glGetIntegerv ( GL_FRONT_FACE, &front_face ); if ( frontface_isosurf[j] != front_face ) { switch_frontface = GL_TRUE; glFrontFace( frontface_isosurf ); } */ if ( isodata.nlevel == 1 ) { LoadIsoMaterial( MAT_ONELEVEL | MAT_ISOSURF ); } else if ( isodata.nlevel == 2 && j == 0 ) { LoadIsoMaterial( MAT_POSLEVEL | MAT_ISOSURF ); } else if ( isodata.nlevel == 2 && j == 1 ) { LoadIsoMaterial( MAT_NEGLEVEL | MAT_ISOSURF | is_solid ); } /* t.k. */ if ( isodata.cell_orientation == XC_RIGHT ) { ind[0] = 2; ind[1] = 1; ind[2] = 0; } /* RENDER */ glPushMatrix(); glTranslated( -mx + isodata.points[obj][0][0], -my + isodata.points[obj][0][1], -mz + isodata.points[obj][0][2] ); for(ix=0; ix (j,k) -> (j,k+1) -> (j+1,k+1) -> (j+1,k) -> (j,k) */ glColor4fv( midC ); glVertex3fv( midP ); glColor4fv ( plvertex[obj][j ][k ].col ); glVertex3fv( plvertex[obj][j ][k ].p ); glColor4fv ( plvertex[obj][j ][k+1].col ); glVertex3fv( plvertex[obj][j ][k+1].p ); glColor4fv ( plvertex[obj][j+1][k+1].col ); glVertex3fv( plvertex[obj][j+1][k+1].p ); glColor4fv ( plvertex[obj][j+1][k ].col ); glVertex3fv( plvertex[obj][j+1][k ].p ); glColor4fv ( plvertex[obj][j ][k ].col ); glVertex3fv( plvertex[obj][j ][k ].p ); glEnd(); } } void xcRenderIsoLine2D(int obj) { int ix, iy, iz; GLenum depthf; GLfloat tr_vec[3]; GLboolean switch_depthf = GL_FALSE; float specular[4] = { 0.0, 0.0, 0.0, 1.0 }; LoadIsoMaterial( MAT_COLORPLANE ); /* DISABLE LIGHTING */ glDisable( GL_LIGHTING ); /* DEPTH FUNC */ glGetIntegerv(GL_DEPTH_FUNC, (GLint *) &depthf); if ( depthf != GL_LEQUAL ) { switch_depthf = GL_TRUE; glDepthFunc(GL_LEQUAL); } /* SHADEMODEL */ /* glGetIntegerv( GL_SHADE_MODEL, &shade_model ); if ( shade_model != GL_FLAT ) { switch_shademodel = GL_TRUE; glShadeModel( GL_FLAT ); } */ glPushMatrix(); glTranslated( -mx + isodata.points[obj][0][0], -my + isodata.points[obj][0][1], -mz + isodata.points[obj][0][2] ); glEnable( GL_COLOR_MATERIAL ); /* --- this is temporate --- */ glMaterialfv( GL_FRONT, GL_SPECULAR, specular ); /* --- end temporate --- */ glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ); for (ix=0; ixisosurf_index ); if (!iso) { fprintf(stderr, "Isosurface # %d not found !!!\n", m->isosurf_index); continue; } /* TRANSPARENCY */ if ( m->dispt.transparent == ISOSURF_TRANSP_ON ) { glEnable( GL_BLEND ); glDepthMask( GL_FALSE ); glBlendFunc( blend_isosurf.sfunc, blend_isosurf.dfunc ); } /* SHADEMODEL */ glGetIntegerv( GL_SHADE_MODEL, &shade_model ); if ( shade_model != m->dispt.shademodel ) { switch_shademodel = GL_TRUE; glShadeModel( m->dispt.shademodel ); } /* LIGHTMODEL */ /* for testing(temporarily): */ m->lightm.two_side_iso[0] = 1.0; if ( lightmodel.two_side[0] != m->lightm.two_side_iso[0] ) { switch_lightmodel = GL_TRUE; glLightModelfv( GL_LIGHT_MODEL_TWO_SIDE, m->lightm.two_side_iso ); } LoadIsoMaterial( MAT_ONELEVEL | MAT_ISOSURF ); /* RENDER */ glPushMatrix(); /* PUSH-1 */ glTranslated( -mx, -my, -mz ); /* for(ix=0; ixisoexpand.irepvec[0]; ix++) for(iy=0; iyisoexpand.irepvec[1]; iy++) for(iz=0; izisoexpand.irepvec[2]; iz++) { */ /* for now: */ /*----------*/ if ( m->colorscheme == MOLS_MONOCHROME ) { glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, m->monocolor); glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, m->monocolor); } nx = xcr.nunit[0]; ny = xcr.nunit[1]; nz = xcr.nunit[2]; if ( xcr.dim < 3 ) nz = 1; if ( xcr.dim < 2 ) ny = 1; if ( xcr.dim < 1 ) nx = 1; for(ix=0; ixisoexpand.rep_vec[0][0] + (float) iy * (float) m->isoexpand.rep_vec[1][0] + (float) iz * (float) m->isoexpand.rep_vec[2][0]; tr_vec[1] = (float) ix * (float) m->isoexpand.rep_vec[0][1] + (float) iy * (float) m->isoexpand.rep_vec[1][1] + (float) iz * (float) m->isoexpand.rep_vec[2][1]; tr_vec[2] = (float) ix * (float) m->isoexpand.rep_vec[0][2] + (float) iy * (float) m->isoexpand.rep_vec[1][2] + (float) iz * (float) m->isoexpand.rep_vec[2][2]; glPushMatrix(); /* PUSH-2 */ glTranslated( tr_vec[0], tr_vec[1], tr_vec[2] ); if ( m->dispt.drawstyle == ISOSURF_SOLID ) { glBegin( GL_TRIANGLES ); for (i=0; intriangl; i++) { for (j3=0; j3<3; j3++) { index = iso->tri2verIN[i].ver_ind[j3]; if ( m->colorscheme != MOLS_MONOCHROME ) { glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, iso->color[index]); } glNormal3fv( &(iso->normal[index].x) ); glVertex3fv( &(iso->vertex[index].x) ); } } glEnd(); } else { GLenum what; /* ISOSURF_WIRE && ISOSURF_DOT */ if ( m->dispt.drawstyle == ISOSURF_WIRE ) { glLineWidth (VPf.WF3Dlinewidth); what=GL_LINE_LOOP; } else { glPointSize (VPf.PLradius); what = GL_POINTS; } for (i=0; intriangl; i++) { glBegin( what ); for (j3=0; j3<3; j3++) { index = iso->tri2verIN[i].ver_ind[j3]; if ( m->colorscheme != MOLS_MONOCHROME ) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, iso->color[index]); glNormal3fv( &(iso->normal[index].x) ); glVertex3fv( &(iso->vertex[index].x) ); } glEnd(); } } glPopMatrix(); /* POP-2 */ } glPopMatrix(); /* POP-1 */ /* GO to PREVIOUS FRONTFACE */ /* if ( switch_frontface ) glFrontFace( front_face ); */ /* DISABLE TRANSPARENCY */ if ( m->dispt.transparent == ISOSURF_TRANSP_ON ) { glDisable(GL_BLEND); glDepthMask(GL_TRUE); } /* GO BACK TO PREVIOUS SHADE_MODEL */ if ( switch_shademodel ) glShadeModel( shade_model ); /* GO BACK TO PREVIOUS LIGHT_MODEL */ if ( switch_lightmodel ) glLightModelfv( GL_LIGHT_MODEL_TWO_SIDE, lightmodel.two_side ); } /* LOAD THE STRUCT MATERIALS BACK; * this has to be changed in future; * each render function will have to take care of it-self */ LoadStructMaterial(); } xcrysden-1.6.2/C/isoMalloc.c0000644000175000017500000001232411712736221014327 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/isoMalloc.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "isosurf.h" #include "memory.h" void xcFree_PLANEVERTEX(PLANEVERTEX **m) { free( (FREE_ARG) m[0] ); free( (FREE_ARG) m ); } void xcFree_GRIDVERTEX(GRIDVERTEX ***t) { free( (FREE_ARG) t[0][0] ); free( (FREE_ARG) t[0] ); free( (FREE_ARG) t ); } void xcFree_LINE(LINE *t) { free( (FREE_ARG) t ); } PLANEVERTEX **xcMallocPLANEVERTEX(long nr, long nc) { long i; PLANEVERTEX **m; /* allocate pointers to pointers to rows */ m=(PLANEVERTEX **) malloc( (size_t) nr*sizeof(PLANEVERTEX *) ); if (!m) xcError("allocation failure 1 in xcMallocPLANEVERTEX"); /* allocate pointers to rows and set pointers to them */ m[0]=(PLANEVERTEX *) malloc( (size_t) nr*nc*sizeof(PLANEVERTEX) ); if (!m[0]) xcError("allocation failure 2 in xcMallocPLANEVERTEX"); for(i=1; i #include "struct.h" #include "xcfunc.h" extern struct Togl *mesa_togl; extern void crySetProjection( NEW_WIN_CONTEXT *wc, struct Togl *togl ); extern NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl); /* ------------------------------------------------------------------------ * * cry_toglzoom $togl zoom-factor * * ------------------------------------------------------------------------ */ int CRY_ToglZoomCb(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { Togl *togl; double zoom; if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( argc != 3 ) { Tcl_SetResult(interp, "Usage: cry_toglzoom toglName zoom-factor", TCL_STATIC); return TCL_ERROR; } if ( Tcl_GetDouble(interp, argv[2], &zoom) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\"", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (zoom < -(1-1e-8) ) { char rss[1024]; snprintf(rss, sizeof(rss),"zoom factor %f out of range", zoom); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( togl != mesa_togl ) { NEW_WIN_CONTEXT *wc = FindWinContextByTogl (togl); wc->tr.zoom *= (1.0 + zoom); crySetProjection (wc, togl); } else { tr.zoom *= (1.0 + zoom); xcViewPort(); LoadLights(); } /* now update the display */ Togl_PostRedisplay(togl); return TCL_OK; } xcrysden-1.6.2/C/colorplane.c0000644000175000017500000004536411712736221014555 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/colorplane.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include "struct.h" #include "isosurf.h" #include "xcfunc.h" extern PLANEVERTEX ***plvertex; typedef struct { float plvec[2][3]; float plnml[3]; } PLANEVEC; PLANEVEC pln; static BASECOLOR bcol; float monocol[2][4] = { { 0.1, 0.1, 0.1, 0.95 }, { 1.0, 1.0, 1.0, 0.95 }}; float rainbow[6][4] = { { 1.0, 0.0, 0.0, 0.95 }, { 1.0, 1.0, 0.0, 0.95 }, { 0.0, 1.0, 0.0, 0.95 }, { 0.0, 1.0, 1.0, 0.95 }, { 0.0, 0.0, 1.0, 0.95 }, { 1.0, 0.0, 1.0, 0.95 }}; float rgbcol[3][4] = { { 1.0, 0.0, 0.0, 0.95 }, { 0.0, 1.0, 0.0, 0.95 }, { 0.0, 0.0, 1.0, 0.95 }}; float geographic[11][4]= { { 0./255., 0./255., 204./255., 0.95 }, { 150./255., 153./255., 255./255., 0.95 }, { 192./255., 216./255., 255./255., 0.95 }, { 0./255., 192./255., 3./255., 0.95 }, { 103./255., 255./255., 51./255., 0.95 }, { 206./255., 255./255., 51./255., 0.95 }, { 255./255., 255./255., 124./255., 0.95 }, { 223./255., 191./255., 143./255., 0.95 }, { 157./255., 48./255., 152./255., 0.95 }, { 255./255., 0./255., 255./255., 0.95 }, { 255./255., 255./255., 255./255., 0.95 }}; float blue_white_red[5][4] = { {0.0, 0.0, 1.0, 0.95}, {0.6, 0.6, 1.0, 0.95}, {1.0, 1.0, 1.0, 0.95}, {1.0, 0.6, 0.6, 0.95}, {1.0, 0.0, 0.0, 0.95} }; float black_brown_white[4][4] = { {0.00, 0.00, 0.00, 0.95}, {0.48, 0.14, 0.02, 0.95}, {0.78, 0.63, 0.07, 0.95}, {1.00, 1.00, 1.00, 0.95} }; /* * if grid value is out of prescribed range, make it in outcolor */ float outcolor[4] = { 0.0, 0.0, 0.0, 0.95 }; static unsigned short line_stipple[10] = { LINESTIPPLE0, LINESTIPPLE1, LINESTIPPLE2, LINESTIPPLE3, LINESTIPPLE4, LINESTIPPLE5, LINESTIPPLE6, LINESTIPPLE7, LINESTIPPLE8, LINESTIPPLE9}; static int line_stipple_factor[4] = { LINESTIPPLE_FACTOR0, LINESTIPPLE_FACTOR1, LINESTIPPLE_FACTOR2, LINESTIPPLE_FACTOR3}; /* --- function prototypes --- */ static void ScaleFunctionType( float (*Func)(float value)); static float (*ScaleFunc)(float value) = 0; float xcLinf(float value); float xcLogf(float value); float xcLog10f(float value); float xcSqrtf(float value); float xcRoot3f(float value); float xcGaussf(float value); float xcSlaterf(float value); float xcExpf(float value); float xcExp2f(float value); /* extern float logf(float value); extern float log10f(float value); extern float sqrtf(float value); extern float expf(float value); */ void ColorPlane(int obj, int cb, int fn, int nx, int ny) { int i,j,k; float min, max, fac; float shift = 0.0; min = isodata.min_allowed[obj]; max = isodata.max_allowed[obj]; if ( fn == SCALE_FUNC_LIN ) ScaleFunctionType(xcLinf); if ( fn == SCALE_FUNC_LOG ) ScaleFunctionType(xcLogf); if ( fn == SCALE_FUNC_LOG10 ) ScaleFunctionType(xcLog10f); if ( fn == SCALE_FUNC_SQRT ) ScaleFunctionType(xcSqrtf); if ( fn == SCALE_FUNC_ROOT3 ) ScaleFunctionType(xcRoot3f); if ( fn == SCALE_FUNC_GAUSS ) ScaleFunctionType(xcGaussf); if ( fn == SCALE_FUNC_SLATER ) ScaleFunctionType(xcSlaterf); if ( (ScaleFunc == xcLogf || ScaleFunc == xcLog10f || ScaleFunc == xcSqrtf || ScaleFunc == xcRoot3f || ScaleFunc == xcGaussf ) && min < 1.e-7 ) { /* shift = -(min + 1e-7); OLD */ shift = -min + 1e-7; min = 1.e-7; max = max + shift; } printf("shift, min, max:: %f %f %f\n",shift,min,max); if ( cb == COLORBASE_MONO ) { /* monocolor */ bcol.ncol = 2; bcol.baseintv[0] = (*ScaleFunc)(min); bcol.baseintv[1] = (*ScaleFunc)(max); for(i=0; i<2; i++) for(j=0; j<4; j++) bcol.basecol[i][j] = monocol[i][j]; } else if ( cb == COLORBASE_RAINBOW ) { float intv; /* rainbow */ bcol.ncol = 6; intv = ((*ScaleFunc)(max) - (*ScaleFunc)(min)) / 5.0; printf("intv = %f\n",intv); for (i=0;i<6;i++) { bcol.baseintv[i] = (*ScaleFunc)(min) + ((float) i * intv); printf("bcol.baseintv[i] = %f\n",bcol.baseintv[i]); } for(i=0; i<6; i++) for(j=0; j<4; j++) bcol.basecol[i][j] = rainbow[i][j]; } else if ( cb == COLORBASE_RGB ) { float intv; /* rgb */ bcol.ncol = 3; intv = ((*ScaleFunc)(max) - (*ScaleFunc)(min)) / 2.0; printf("intv = %f\n",intv); for (i=0;i<3;i++) { bcol.baseintv[i] = (*ScaleFunc)(min) + ((float) i * intv); printf("bcol.baseintv[i] = %f\n",bcol.baseintv[i]); } for(i=0; i<3; i++) for(j=0; j<4; j++) bcol.basecol[i][j] = rgbcol[i][j]; } else if ( cb == COLORBASE_GEOGRAPHIC ) { float intv; /* rainbow */ bcol.ncol = 11; intv = ((*ScaleFunc)(max) - (*ScaleFunc)(min)) / 10.0; printf("intv = %f\n",intv); for (i=0;i<11;i++) { bcol.baseintv[i] = (*ScaleFunc)(min) + ((float) i * intv); printf("bcol.baseintv[i] = %f\n",bcol.baseintv[i]); } for(i=0; i<11; i++) for(j=0; j<4; j++) bcol.basecol[i][j] = geographic[i][j]; } else if ( cb == COLORBASE_BLUE_WHITE_RED ) { float intv; /* blue-white-red */ bcol.ncol = 5; intv = ((*ScaleFunc)(max) - (*ScaleFunc)(min)) / (bcol.ncol - 1); printf("intv = %f\n",intv); for (i=0;i isodata.min_allowed[obj] && plvertex[obj][j][k].val < isodata.max_allowed[obj] ) { for (i=0; i= bcol.baseintv[i+1] ) { fac = (bcol.baseintv[i] - (*ScaleFunc)(plvertex[obj][j][k].val + shift)) / (bcol.baseintv[i] - bcol.baseintv[i+1]); plvertex[obj][j][k].col[0] = (1. - fac) * bcol.basecol[i][0] + fac * bcol.basecol[i+1][0]; plvertex[obj][j][k].col[1] = (1. - fac) * bcol.basecol[i][1] + fac * bcol.basecol[i+1][1]; plvertex[obj][j][k].col[2] = (1. - fac) * bcol.basecol[i][2] + fac * bcol.basecol[i+1][2]; plvertex[obj][j][k].col[3] = (1. - fac) * bcol.basecol[i][3] + fac * bcol.basecol[i+1][3]; break; } } else if ( plvertex[obj][j][k].val < isodata.min_allowed[obj] ) { plvertex[obj][j][k].col[0] = bcol.basecol[0][0]; plvertex[obj][j][k].col[1] = bcol.basecol[0][1]; plvertex[obj][j][k].col[2] = bcol.basecol[0][2]; plvertex[obj][j][k].col[3] = bcol.basecol[0][3]; } else { plvertex[obj][j][k].col[0] = bcol.basecol[bcol.ncol-1][0]; plvertex[obj][j][k].col[1] = bcol.basecol[bcol.ncol-1][1]; plvertex[obj][j][k].col[2] = bcol.basecol[bcol.ncol-1][2]; plvertex[obj][j][k].col[3] = bcol.basecol[bcol.ncol-1][3]; } } } else { for (j=0; j isodata.min_allowed[obj] && plvertex[obj][j][k].val < isodata.max_allowed[obj] ) { for (i=0; i= bcol.baseintv[i ] && (*ScaleFunc)(plvertex[obj][j][k].val + shift) <= bcol.baseintv[i+1] ) { fac = ((*ScaleFunc)(plvertex[obj][j][k].val + shift) - bcol.baseintv[i]) / (bcol.baseintv[i+1] - bcol.baseintv[i]); plvertex[obj][j][k].col[0] = (1. - fac) * bcol.basecol[i][0] + fac * bcol.basecol[i+1][0]; plvertex[obj][j][k].col[1] = (1. - fac) * bcol.basecol[i][1] + fac * bcol.basecol[i+1][1]; plvertex[obj][j][k].col[2] = (1. - fac) * bcol.basecol[i][2] + fac * bcol.basecol[i+1][2]; plvertex[obj][j][k].col[3] = (1. - fac) * bcol.basecol[i][3] + fac * bcol.basecol[i+1][3]; break; /* printf("val:: %f; fac:: %f\n",plvertex[obj][j][k].val,fac); printf("i, i+1, basecol:: %d %d; %f %f %f\n %f %f %f\n",i,i+1, bcol.basecol[i][1],bcol.basecol[i][2],bcol.basecol[i][3], bcol.basecol[i+1][0],bcol.basecol[i+1][1],bcol.basecol[i+1][2]); printf(">> color: %f %f %f %f\n", plvertex[obj][j][k].col[0], plvertex[obj][j][k].col[1], plvertex[obj][j][k].col[2], plvertex[obj][j][k].col[3]); */ } } else if ( plvertex[obj][j][k].val < isodata.min_allowed[obj] ) { plvertex[obj][j][k].col[0] = bcol.basecol[0][0]; plvertex[obj][j][k].col[1] = bcol.basecol[0][1]; plvertex[obj][j][k].col[2] = bcol.basecol[0][2]; plvertex[obj][j][k].col[3] = bcol.basecol[0][3]; } else { plvertex[obj][j][k].col[0] = bcol.basecol[bcol.ncol-1][0]; plvertex[obj][j][k].col[1] = bcol.basecol[bcol.ncol-1][1]; plvertex[obj][j][k].col[2] = bcol.basecol[bcol.ncol-1][2]; plvertex[obj][j][k].col[3] = bcol.basecol[bcol.ncol-1][3]; } } } } /*****************************************************************************/ /* this is for IsoLine2D --- IsoLine2D --- IsoLine2D --- IsoLine2D */ /*****************************************************************************/ void GetIsoLine2D_Attributes(int obj, int cb, int fn) { register int i, j, k, l; register int nlevel1; float min, max, d, f, fac; float x, shift = 0.0; nlevel1= isoline2D[obj].nlevel - 1; min = isodata.min_allowed[obj]; max = isodata.max_allowed[obj]; if ( fn == SCALE_FUNC_LIN ) ScaleFunctionType(xcLinf); if ( fn == SCALE_FUNC_LOG ) ScaleFunctionType(xcLogf); if ( fn == SCALE_FUNC_LOG10 ) ScaleFunctionType(xcLog10f); if ( fn == SCALE_FUNC_SQRT ) ScaleFunctionType(xcSqrtf); if ( fn == SCALE_FUNC_ROOT3 ) ScaleFunctionType(xcRoot3f); if ( fn == SCALE_FUNC_GAUSS ) ScaleFunctionType(xcGaussf); if ( fn == SCALE_FUNC_SLATER ) ScaleFunctionType(xcSlaterf); /*******************/ /* assign LEVELS */ /*******************/ /* this is just in case */ if (max < min) { d = max; max = min; min = d; } if ( (ScaleFunc == xcLogf || ScaleFunc == xcLog10f || ScaleFunc == xcSqrtf || ScaleFunc == xcRoot3f || ScaleFunc == xcGaussf) && min < 1.e-7) { shift = -(min - 1.e-7); min = 1.e-7; max = max + shift; } d = ScaleFunc(max) - ScaleFunc(min); /* get the levels, i.e. isoline2D.level[] */ for (i=0; i<=nlevel1; i++) { x = (*ScaleFunc)(min) + (float) i / nlevel1 * d; if ( fn == SCALE_FUNC_LIN) isoline2D[obj].level[i] = x - shift; if ( fn == SCALE_FUNC_LOG ) isoline2D[obj].level[i] = exp(x) - shift; if ( fn == SCALE_FUNC_LOG10 ) isoline2D[obj].level[i] = pow(10.0, x) - shift; if ( fn == SCALE_FUNC_SQRT ) isoline2D[obj].level[i] = pow( x, 2.0) - shift; if ( fn == SCALE_FUNC_ROOT3 ) isoline2D[obj].level[i] = pow( x, 3.0) - shift; if ( fn == SCALE_FUNC_GAUSS ) { /* d is negative && x is always positive */ if ( x < 1.e-8 ) x = 1.e-8; f = log(x); if ( f < 0 ) f *= -1.0; isoline2D[obj].level[i] = sqrt( f ) - shift; } if ( fn == SCALE_FUNC_SLATER ) { /* d is negative -> x is or positive or negative */ if ( x < 1.e-8 && x > -1.e-8 ) x = 1.e-8; if ( x < 0.0 ) x *= -1.0; f = log(x); isoline2D[obj].level[i] = f - shift; } } /***************************/ /* assign DASH & MONOCOLOR */ /***************************/ j = 0; /* this is for FULLDASH */ k = 0; /* this is for FULLDASH */ for (i=0; i= bcol.baseintv[i+1]) { fac = ( bcol.baseintv[i] - (*ScaleFunc)(isoline2D[obj].level[j] + shift) ) / (bcol.baseintv[i] - bcol.baseintv[i+1]); isoline2D[obj].color[j][0] = (1. - fac) * bcol.basecol[i][0] + fac * bcol.basecol[i+1][0]; isoline2D[obj].color[j][1] = (1. - fac) * bcol.basecol[i][1] + fac * bcol.basecol[i+1][1]; isoline2D[obj].color[j][2] = (1. - fac) * bcol.basecol[i][2] + fac * bcol.basecol[i+1][2]; isoline2D[obj].color[j][3] = (1. - fac) * bcol.basecol[i][3] + fac * bcol.basecol[i+1][3]; break; } } else { for (j=0; j= bcol.baseintv[i] && (*ScaleFunc)(isoline2D[obj].level[j]+shift) <= bcol.baseintv[i+1] ) { fac = ((*ScaleFunc)(isoline2D[obj].level[j] + shift) - bcol.baseintv[i])/ (bcol.baseintv[i+1] - bcol.baseintv[i]); isoline2D[obj].color[j][0] = (1. - fac) * bcol.basecol[i][0] + fac * bcol.basecol[i+1][0]; isoline2D[obj].color[j][1] = (1. - fac) * bcol.basecol[i][1] + fac * bcol.basecol[i+1][1]; isoline2D[obj].color[j][2] = (1. - fac) * bcol.basecol[i][2] + fac * bcol.basecol[i+1][2]; isoline2D[obj].color[j][3] = (1. - fac) * bcol.basecol[i][3] + fac * bcol.basecol[i+1][3]; break; } } } } /*****************************************************************************/ static void ScaleFunctionType( float (*Func)(float value)) { ScaleFunc = Func; } /* --- all this function accept only positive values --- */ float xcLinf(float value) { return value; } float xcLogf(float value) { return log(value); } float xcLog10f(float value) { return log10(value); } float xcSqrtf(float value) { return sqrt(value); } float xcRoot3f(float value) { return exp((1./3.) * log(value)); } float xcGaussf(float value) { if (value > 10.0) return 0.0; else return exp(-(value * value)); } float xcSlaterf(float value) { if (value > 100.0) return 0.0; else return exp(-value); } float xcExpf(float value) { return exp(value); } float xcExp2f(float value) { return exp(value*value); } xcrysden-1.6.2/C/xcDisplayFunc.c0000644000175000017500000021764613525506046015203 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcDisplayFunc.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ------ * * Modified by Eric Verfaillie ericverfaillie@yahoo.fr EV * * may 2004 * * modifcations are near EV comments * ***************************************************************************** */ #include #include #include #include #include #include #include "struct.h" #include "3D.h" #include "xcGLparam.h" #include "isosurf.h" #include "molsurf.h" #include "xcfunc.h" #define APPR_SCREENSIZE 1024 #define SELCOL 0 #define SELLINE_WIDTH 2.0 /* width of "selline" */ #define SELLINE_PAT 0xAAAA /* selline stipple pattern */ #define SPHERE_TESS_PREFACTOR 2 #define BOND_TESS_PREFACTOR 1 /*********************************************/ /* EV */ /*********************************************/ #include "anaglyph.h" GLdouble radiu; CAMERA camera; XYZ origin = {0.0,0.0,0.0}; /*********************************************/ /* EV */ /*********************************************/ extern struct Togl *mesa_togl; extern Options3D is; extern RasterFontSize rf; extern PERSPECTIVE persp; extern AtomicLabel *atomLabel, globalAtomLabel; extern short *do_not_display_atomlabel; extern char *element[]; extern GLuint fontOffset; extern GLfloat AtCol_Ambient_by_Diffuse; extern XCantialias antialias; extern ForceVector FV; extern XYZ_Attrib xyz; OrthoProj ort; extern realTimeMove makeMovie; /***************************************************************************** * HERE LIST VARIABLES ARE DIFINED */ GLuint PointList = -1; /* static GLuint SolidSpaceFillList = -1; static GLuint WireSpaceFillList = -1; static GLuint SolidBallList = -1; static GLuint WireBallList = -1; static GLuint SolidStickList = -1; static GLuint WireStickList = -1; */ /* static GLuint SolidFrameList = -1; static GLuint WireFrameList = -1; static GLuint LineFrameList = -1; */ /* static GLuint LabelBallList = -1; */ /* static GLuint LabelSpaceList = -1; */ extern GLuint crdList; /* crdList is list for coor-sist. */ extern GLuint xyplaneList; /* list for XY plane that goes with coor-sist */ extern GLuint tempDisable3Dlist; extern GLuint tempEnable3Dlist; /* --- this is for selection-lists --- */ /*extern GLuint SphereSelList[MAXSEL];*/ /*extern GLuint LineSelList[MAXSEL-1];*/ /* --- this is for cell-adding-type-procedure of ATOMINSE Crystal command */ /*extern GLuint BasicVectorsList, AtomAddList; */ /****************************************************************************/ /*****************************************************************************/ /* function prototypes */ GLuint xcGenLists( GLsizei i ); void (*xcDisplay)(struct Togl *togl) = 0x0; void xcDisplayFunc( void (*Func)(struct Togl *togl) ); int xcToglDisplayFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); void xcDummyDisplay( struct Togl *togl ); void xcGenDispList(void); void xcWireFrame2D(struct Togl *togl); void xcMakePointList(void); void xcPointLine2D(struct Togl *togl); void xcBall2D(int iatom); /*void xcMakeBallLists(void); void xcMakeNewBallList( GLdouble *sizeArray , int natom ); */ void xcBallStick12D(struct Togl *togl); void xcPipeBall2D(struct Togl *togl); void xcBallStick22D(struct Togl *togl); void xcSpaceFill2D(struct Togl *togl); void EnableOr2D_Or3D(void); static void _ambient_by_diffuse(GLfloat dst[4], GLfloat scale, GLfloat src[4]); void xcRenderSolidBalls3D(void); void xcRenderWireBalls3D(void); void xcRenderBonds(GLenum type); void xcRenderSolidSpaceFills3D(void); void xcRenderWireSpaceFills3D(void); void xcRenderSolidFrame3D(void); void xcRenderWireFrame3D(void); void xcRenderLineFrame3D(void); static void xcLineStippleFrame(int ii); static void MatInv33_44(double m[4][4], double minv[4][4], double *det); static void MultMat44_33Vec3(double mat[4][4], double vec[3], double res[3]); static void _makeAtomLabels3D(double *rad); void xcMakeBallLabel3D(void); void xcMakeSpaceLabel3D(void); void xcDisplay3D(struct Togl *togl); static void _xcDisplay3D(struct Togl *togl); static void __xcDisplay3D(struct Togl *togl); void xcMaybeDestroyLists(void); void xcMakeProjection2D(const char *mode); void xcMakeProjection3D(const char *mode); static void _xcMakeProjection(GLdouble size); void xcClearScreen(struct Togl *togl); void xcChangeBackground(struct Togl *togl, GLclampf bckg[4]); void xcDisplayXYZ(void); static void goToPrevProj(void); void xcTurnXYZOff(struct Togl *togl); void xcWireSphere (GLdouble radius); void xcSolidSphere (GLdouble radius); void xcWireCylinder (GLdouble radius, GLdouble height); void xcSolidCylinder (GLdouble radius, GLdouble height); void xcSolidBond (GLdouble radius, GLdouble height, int bondFlag); void xcSolidCone (GLdouble baseradius, GLdouble topradius, GLdouble height); static int CalcTessFactor(void); static void HandleDisplay(struct Togl *togl); static void draw_scene(void); static void CameraHome(void); static void Normalise(XYZ *p); /*static XYZ CalcNormal(XYZ p, XYZ p1, XYZ p2);*/ /* --- extern function prototypes --- */ extern int MakeSticks1(int i, GLdouble *x1, GLdouble *y1, GLdouble *z1, GLdouble *x2, GLdouble *y2, GLdouble *z2, GLdouble *x3, GLdouble *y3, GLdouble *z3, GLdouble *x4, GLdouble *y4, GLdouble *z4); extern int MakeSticks2(int i, int col, int flag); /* --- readstrf.c ---*/ extern void FindMaxRad(void); /* --- xcSelect.c --- */ extern void xcRenderSelAtoms3D(void); extern void xcRenderSelBonds3D(void); /* --- xcAtomAdd.c --- */ extern void xcDisplayAddAtomBox(void); /* --- isorender.c --- */ extern void xcRenderIsosurf(int obj); extern void xcRenderColorplane(int obj); extern void xcRenderSurface(void); /* --- xcSuperCell.c --- */ extern void (*xcSuperCell)(void); /* --- xcIsoSpaceSel.c --- */ extern void IsoSpaceSel_Parallelogram(void); extern void IsoSpaceSel_3D(void); /* --- xcviewport.c --- */ extern void MaybeClipAndMakeProjection(void); /* --- cryNewContext.c --- */ extern NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl); /* xcdebug */ extern void xcdebug(const char *text); /* xcFont.c */ extern void xcFont_PrintString (const char *s); /* sgiAux.c */ extern GLuint findList1 (int lindex, GLdouble *paramArray, int size); extern GLuint makeModelPtr1 (int lindex, GLdouble *sizeArray, int count); GLuint xcGenLists( GLsizei i ) { return glGenLists (i); /* static GLuint nlist = 1; GLuint n; n = nlist; nlist += i; return n; */ } /*****************************************************************************/ void xcDisplayFunc( void (*Func)(struct Togl *togl) ) { xcDisplay = Func; } /*****************************************************************************/ /*****************************************************************************/ /*void cryDisplayFunc( void (*DispFunc)(struct Togl *togl), struct Togl *togl );*/ int xcToglDisplayFunc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { Togl *togl; /*static int toglIsInteractive = 0;*/ if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "pathName"); return TCL_ERROR; } if (Togl_GetToglFromObj(interp, objv[1], &togl) != TCL_OK) { return TCL_ERROR; } if ( togl == mesa_togl ) { if (xcDisplay) (*xcDisplay)(togl); } else { NEW_WIN_CONTEXT *wc = FindWinContextByTogl( togl ); /*cryDisplayFunc( wc->xcDisplay, togl );*/ if (wc->xcDisplay) wc->xcDisplay( togl ); } return TCL_OK; } /* void cryDisplayFunc( void (*DispFunc)(struct Togl *togl), struct Togl *togl ) { (*DispFunc)(togl); } */ /*****************************************************************************/ /*****************************************************************************/ void xcDummyDisplay( struct Togl *togl ) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glClearColor( bg[0], bg[1], bg[2], bg[3] ); Togl_SwapBuffers(togl); xcdebug("dummy display function"); } /* this routine generate display Lists */ void xcGenDispList(void) { /*int i; */ /* generate all Display Lists; actually we need just to reserve numbers * for lists */ PointList = xcGenLists(1); /* SolidSpaceFillList = xcGenLists(1); WireSpaceFillList = xcGenLists(1); SolidBallList = xcGenLists(1); WireBallList = xcGenLists(1); SolidStickList = xcGenLists(1); WireStickList = xcGenLists(1); */ /* SolidFrameList = xcGenLists(1); WireFrameList = xcGenLists(1); LineFrameList = xcGenLists(1); */ /* LabelBallList = xcGenLists(1); */ /* LabelSpaceList = xcGenLists(1); */ /*for(i=0; isqn] ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2); glEnd(); } /* check if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } /* make list for point */ void xcMakePointList(void) { GLint i, nstep; GLdouble sine, cosine, dstep, r; /* double cos(), sin(); */ if ( glIsList(PointList) ) glDeleteLists( PointList, 1 ); r = VPf.PLradius / VPf.VPfactor; nstep = 12; dstep = (GLdouble) nstep; /* PointList list was generarted in xcGenDispList */ glNewList( PointList, GL_COMPILE ); glBegin(GL_POLYGON); for(i=0; i < nstep; i++) { cosine = r * cos((GLdouble) i * 2.0 * PI / dstep); sine = r * sin((GLdouble) i * 2.0 * PI / dstep); glVertex2d( cosine, sine ); } glEnd(); glEndList(); } /* xcPointLine2D is xcDisplayFunc for PointLines * -------------------------------------------------------------- * xcPointLine2D display a PointLines * Here I'm dealing with 'coor' structure */ void xcPointLine2D(struct Togl *togl) { int i; /*printf("In xcPointLine2D\n",NULL); fflush(stdout);*/ glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( (GLfloat) VPf.PLlinewidth ); /*glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);*/ for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glBegin(GL_LINES); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); } if ( (coor + *(iwksp + i))->flag == ATOM ) { /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glCallList( PointList ); glPopMatrix(); } } /* check if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcBall2D( int iatom ) { GLint nstep, i, atmn; GLdouble sine, cosine; GLdouble sizeArray[3]; GLuint displayList[2]; atmn = (coor + iatom)->nat; nstep = 3 * CalcTessFactor(); if ( nstep < 8 ) nstep = 8; sizeArray[0] = rball[atmn]; sizeArray[1] = (GLdouble) nstep; sizeArray[2] = (GLdouble) VPf.OUTlinewidth; displayList[0] = findList1 (BALL, sizeArray, 3); displayList[1] = findList1 (OUTLINEBALL, sizeArray, 3); if ( displayList[0] == 0 ) { glNewList( makeModelPtr1 (BALL, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); glBegin(GL_POLYGON); for(i=0; i < nstep; i++) { cosine = rball[atmn] * cos((GLdouble) i * 2.0 * PI / (GLdouble) nstep); sine = rball[atmn] * sin((GLdouble) i * 2.0 * PI / (GLdouble) nstep); glVertex2d( cosine, sine ); } glEnd(); glEndList(); glNewList( makeModelPtr1 (OUTLINEBALL, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); glColor3f (0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); for(i=0; i < nstep; i++) { cosine = rball[atmn] * cos((GLdouble) i * 2.0 * PI / (GLdouble) nstep); sine = rball[atmn] * sin((GLdouble) i * 2.0 * PI / (GLdouble) nstep); glVertex2d( cosine, sine ); } glEnd(); glEndList(); } else { /*glColor3fv (atm.col[(coor + iatom)->sqn]);*/ glCallList (displayList[0]); glCallList (displayList[1]); } } void xcSmallBall2D( int iatom ) { GLint nstep, i; GLdouble sine, cosine; GLdouble sizeArray[3]; GLuint displayList[2]; nstep = 3 * CalcTessFactor(); if ( nstep < 8 ) nstep = 8; sizeArray[0] = rball[1]; /* size of hydrogen atom */ sizeArray[1] = (GLdouble) nstep; sizeArray[2] = (GLdouble) VPf.OUTlinewidth; displayList[0] = findList1 (BALL, sizeArray, 3); displayList[1] = findList1 (OUTLINEBALL, sizeArray, 3); if ( displayList[0] == 0 ) { /*glColor3fv (atm.col[(coor + iatom)->sqn]);*/ glNewList( makeModelPtr1 (BALL, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); glBegin(GL_POLYGON); for(i=0; i < nstep; i++) { cosine = rball[1] * cos((GLdouble) i * 2.0 * PI / (GLdouble) nstep); sine = rball[1] * sin((GLdouble) i * 2.0 * PI / (GLdouble) nstep); glVertex2d( cosine, sine ); } glEnd(); glEndList(); glNewList( makeModelPtr1 (OUTLINEBALL, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); glColor3f (0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); for(i=0; i < nstep; i++) { cosine = rball[1] * cos((GLdouble) i * 2.0 * PI / (GLdouble) nstep); sine = rball[1] * sin((GLdouble) i * 2.0 * PI / (GLdouble) nstep); glVertex2d( cosine, sine ); } glEnd(); glEndList(); } else { /*glColor3fv (atm.col[(coor + iatom)->sqn]);*/ glCallList (displayList[0]); glCallList (displayList[1]); } } void xcBigBall2D( int iatom ) { GLint nstep, i, atmn; GLdouble sine, cosine; GLdouble sizeArray[3]; GLuint displayList[2]; atmn = (coor + iatom)->nat; nstep = 6 * CalcTessFactor(); if ( nstep < 8 ) nstep = 8; sizeArray[0] = atrad[atmn]; /* size of hydrogen atom */ sizeArray[1] = (GLdouble) nstep; sizeArray[2] = (GLdouble) VPf.OUTlinewidth; displayList[0] = findList1 (BALL, sizeArray, 3); displayList[1] = findList1 (OUTLINEBALL, sizeArray, 3); if ( displayList[0] == 0 ) { /*glColor3fv (atm.col[(coor + iatom)->sqn]);*/ glNewList( makeModelPtr1 (BALL, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); glBegin(GL_POLYGON); for(i=0; i < nstep; i++) { cosine = atrad[atmn] * cos((GLdouble) i * 2.0 * PI / (GLdouble) nstep); sine = atrad[atmn] * sin((GLdouble) i * 2.0 * PI / (GLdouble) nstep); glVertex2d( cosine, sine ); } glEnd(); glEndList(); glNewList( makeModelPtr1 (OUTLINEBALL, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); glColor3f (0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); for(i=0; i < nstep; i++) { cosine = atrad[atmn] * cos((GLdouble) i * 2.0 * PI / (GLdouble) nstep); sine = atrad[atmn] * sin((GLdouble) i * 2.0 * PI / (GLdouble) nstep); glVertex2d( cosine, sine ); } glEnd(); glEndList(); } else { /*glColor3fv (atm.col[(coor + iatom)->sqn]);*/ glCallList (displayList[0]); glCallList (displayList[1]); } } /* xcBallStick12D is xcDisplayFunc for Ballstick1, * ----------------------------------------------- * xcBallStick12D display a BallSticks1 * Here I'm dealing with 'coor' structure */ void xcBallStick12D(struct Togl *togl) { register int i; GLdouble x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == ATOM ) { glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); } else if ( (coor + *(iwksp + i))->flag == BOND ) { MakeSticks1(*(iwksp + i), &x1, &y1, &z1, &x2, &y2, &z2, &x3, &y3, &z3, &x4, &y4, &z4); glBegin(GL_POLYGON); if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); glBegin(GL_LINE_LOOP); glColor3f( 0.0, 0.0, 0.0 ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); } } glDisable( GL_CULL_FACE ); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcPipeBall2D(struct Togl *togl) { register int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == ATOM ) { glLineWidth( VPf.OUTlinewidth ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcSmallBall2D (*(iwksp + i)); glPopMatrix(); if ( VPf.labelsOn == 1 ) { makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL ); } } else if ( (coor + *(iwksp + i))->flag == SELATOM ) { glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv( atcol[SELCOL] ); xcSmallBall2D (*(iwksp + i)); /*glCallList( (coor + *(iwksp + i))->list2 );*/ glPopMatrix(); if ( VPf.labelsOn == 1 ) { makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL ); } } else if ( (coor + *(iwksp + i))->flag == BOND ) { glLineWidth( VPf.OUTlinewidth ); /* MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->nat); */ MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->sqn, PIPEBALL); } else if ( (coor + *(iwksp + i))->flag == SELBOND ) { glLineWidth( VPf.OUTlinewidth ); MakeSticks2(*(iwksp + i), 0, PIPEBALL); } else if ( (coor + *(iwksp + i))->flag == SELLINE ) { glLineStipple( 2, SELLINE_PAT ); glEnable(GL_LINE_STIPPLE); glLineWidth( SELLINE_WIDTH ); glColor3fv( atcol[SELCOL] ); glBegin(GL_LINES); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } else if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } glDisable( GL_CULL_FACE ); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } /* xcBallStick22D is xcDisplayFunc for Ballstick2, * ----------------------------------------------- * xcBallStick12D display a BallSticks2 * Here I'm dealing with 'coor' structure */ void xcBallStick22D(struct Togl *togl) { register int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == ATOM ) { glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); } else if ( (coor + *(iwksp + i))->flag == BOND ) { /* MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->nat); */ MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->sqn, BALL); } } glDisable( GL_CULL_FACE ); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcSpaceFill2D(struct Togl *togl) { register int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == ATOM ) { glLineWidth( VPf.OUTlinewidth ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBigBall2D (*(iwksp + i)); glPopMatrix(); if ( VPf.labelsOn == 1 ) { makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL ); } } else if ( (coor + *(iwksp + i))->flag == SELATOM ) { glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv( atcol[SELCOL] ); xcBigBall2D (*(iwksp + i)); glPopMatrix(); if ( VPf.labelsOn == 1 ) { makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL ); } } else if ( (coor + *(iwksp + i))->flag == SELLINE ) { glLineStipple( 2, SELLINE_PAT ); glEnable(GL_LINE_STIPPLE); glLineWidth( SELLINE_WIDTH*2 ); glColor3fv( atcol[SELCOL] ); glBegin(GL_LINES); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } else if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } glDisable( GL_CULL_FACE ); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } /*****************************************************************************/ /* Do we have 2D or 3D ?????? */ void EnableOr2D_Or3D(void) { register int i; GLenum LIGHT[8] = { GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, GL_LIGHT3, GL_LIGHT4, GL_LIGHT5, GL_LIGHT6, GL_LIGHT7 }; if ( dimType == XC_2D ) { glDisable( GL_DEPTH_TEST ); glDisable( GL_LIGHTING ); glDisable( GL_DITHER ); glShadeModel( GL_FLAT ); for (i=0; i 16 ) nstep = 16; */ sizeArray[0] = radius; sizeArray[1] = (double) nstep; sizeArray[2] = (double) VPf.WF3Dlinewidth; displayList = findList1 (SPHEREWIRE, sizeArray, 3); if ( displayList == 0 ) { glNewList( makeModelPtr1 (SPHEREWIRE, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); glLineWidth (VPf.WF3Dlinewidth); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_LINE); gluQuadricNormals (quadObj, GLU_SMOOTH); gluSphere (quadObj, radius, 2*nstep, nstep); glEndList(); } else { glCallList(displayList); } } void xcSolidSphere (GLdouble radius) { GLint nstep; GLUquadricObj *quadObj; GLdouble sizeArray[2]; GLuint displayList; nstep = SPHERE_TESS_PREFACTOR * CalcTessFactor(); if ( tr.b1motion || tr.b2motion || tr.shiftB1motion ) nstep /= 4.0; /*if ( tr.b1motion || tr.b2motion || tr.shiftB1motion ) tessFactor *= 4.0;*/ /* nstep = 4 * (GLint) ( radius * VPf.VPfactor / tessFactor ); */ /*nstep = (GLint) (2 * APPR_SCREENSIZE / (tessFactor * ort.size));*/ /* nstep shouldn't be lower than 8 and gretaer than XX */ if ( nstep < 6 ) nstep = 6; /*if ( nstep > 16 ) nstep = 16;*/ sizeArray[0] = radius; sizeArray[1] = (double) nstep; displayList = findList1 (SPHERESOLID, sizeArray, 2); if ( displayList == 0 ) { glNewList( makeModelPtr1 (SPHERESOLID, sizeArray, 2), GL_COMPILE_AND_EXECUTE ); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluSphere (quadObj, radius, 2*nstep, nstep); glEndList(); } else { glCallList(displayList); } } void xcWireCylinder (GLdouble radius, GLdouble height) { GLint nstep; GLUquadricObj *quadObj; GLdouble sizeArray[4]; GLuint displayList; nstep = (int) (BOND_TESS_PREFACTOR * (float)CalcTessFactor()); if ( tr.b1motion || tr.b2motion || tr.shiftB1motion ) nstep /= 4.0; /*if ( tr.b1motion || tr.b2motion || tr.shiftB1motion ) tessFactor *= 4.0;*/ /* nstep = 4 * (GLint) ( radius * VPf.VPfactor / tessFactor ); */ /*nstep = (GLint) (1.3 * APPR_SCREENSIZE / (tessFactor * ort.size));*/ /* nstep shouldn't be lower than 6 and gretaer than XX */ if ( nstep < 6 ) nstep = 6; /*if ( nstep > 10 ) nstep = 10;*/ sizeArray[0] = radius; sizeArray[1] = height; sizeArray[2] = (double) nstep; sizeArray[3] = (double) VPf.WF3Dlinewidth; displayList = findList1 (CYLINDERWIRE, sizeArray, 4); if ( displayList == 0 ) { glNewList( makeModelPtr1 (CYLINDERWIRE, sizeArray, 4), GL_COMPILE_AND_EXECUTE ); glLineWidth (VPf.WF3Dlinewidth); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_LINE); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder (quadObj, radius, radius, height, nstep, 1); glEndList(); } else { glCallList(displayList); } } void xcSolidCylinder (GLdouble radius, GLdouble height) { GLint nstep; GLUquadricObj *quadObj; GLdouble sizeArray[3]; GLuint displayList; nstep = (int) (BOND_TESS_PREFACTOR * (float)CalcTessFactor()); if ( tr.b1motion || tr.b2motion || tr.shiftB1motion ) nstep /= 4.0; /* nstep = 4 * (GLint) ( radius * VPf.VPfactor / tessFactor ); */ /*nstep = (GLint) (1.3 * APPR_SCREENSIZE / (tessFactor * ort.size));*/ /* nstep shouldn't be lower than 6 and gretaer than XX */ if ( nstep < 6 ) nstep = 6; /* if ( nstep > 10 ) nstep = 10; */ sizeArray[0] = radius; sizeArray[1] = height; sizeArray[2] = (double) nstep; displayList = findList1 (CYLINDERSOLID, sizeArray, 3); if ( displayList == 0 ) { glNewList( makeModelPtr1 (CYLINDERSOLID, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder (quadObj, radius, radius, height, nstep, 1); /* lower-end disk */ quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_FLAT); gluQuadricOrientation( quadObj, GLU_INSIDE ); gluDisk( quadObj, 0.0, radius, nstep, 1 ); /* upper end disk */ quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_FLAT); gluQuadricOrientation( quadObj, GLU_OUTSIDE ); glPushMatrix(); glTranslated(0.0, 0.0, height); gluDisk( quadObj, 0.0, radius, nstep, 1 ); glPopMatrix(); glEndList(); } else { glCallList(displayList); } } void xcSolidBond (GLdouble radius, GLdouble height, int bondFlag) { GLint nstep; GLUquadricObj *quadObj; GLdouble sizeArray[4]; GLuint displayList; nstep = (int) (BOND_TESS_PREFACTOR * (float) CalcTessFactor()); if ( tr.b1motion || tr.b2motion || tr.shiftB1motion ) nstep /= 4.0; /* nstep = 4 * (GLint) ( radius * VPf.VPfactor / tessFactor ); */ /*nstep = (GLint) (1.3 * APPR_SCREENSIZE / (tessFactor * ort.size));*/ /* nstep shouldn't be lower than 6 and gretaer than XX */ if ( nstep < 6 ) nstep = 6; sizeArray[0] = radius; sizeArray[1] = height; sizeArray[2] = (double) nstep; sizeArray[3] = (double) bondFlag; displayList = findList1 (BONDSOLID, sizeArray, 4); if ( displayList == 0 ) { glNewList( makeModelPtr1 (BONDSOLID, sizeArray, 4), GL_COMPILE_AND_EXECUTE ); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder (quadObj, radius, radius, height, nstep, 1); if ( (bondFlag == BOND_ATOM_TO_MIDBOND) || (bondFlag == BOND_ATOM_TO_ATOM) ) { /* lower-end sphere */ quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluQuadricOrientation( quadObj, GLU_OUTSIDE ); gluSphere (quadObj, radius, nstep, nstep); } if ( (bondFlag == BOND_ATOM_TO_ATOM ) || (bondFlag == BOND_MIDBOND_TO_ATOM) ) { /* upper-end sphere */ quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluQuadricOrientation( quadObj, GLU_OUTSIDE ); glPushMatrix(); glTranslated(0.0, 0.0, height); gluSphere (quadObj, radius, nstep, nstep); glPopMatrix(); } glEndList(); } else { glCallList(displayList); } } /* Render solid Cone. */ void xcSolidCone (GLdouble baseradius, GLdouble topradius, GLdouble height) { GLint nstep; GLUquadricObj *quadObj; GLdouble sizeArray[4]; GLuint displayList; /*double tessFactor = VPf.tessFactor;*/ nstep = (int) (BOND_TESS_PREFACTOR * (float) CalcTessFactor()); if ( tr.b1motion || tr.b2motion || tr.shiftB1motion ) nstep /= 4.0; /*if ( tr.b1motion || tr.b2motion || tr.shiftB1motion ) tessFactor *= 4.0;*/ /* nstep = 4 * (GLint) ( baseradius * VPf.VPfactor / tessFactor ); */ /*nstep = (GLint) (1.3 * APPR_SCREENSIZE / (tessFactor * ort.size));*/ /* nstep shouldn't be lower than 6 and gretaer than XX */ if ( nstep < 6 ) nstep = 6; sizeArray[0] = baseradius; sizeArray[1] = topradius; sizeArray[2] = height; sizeArray[3] = (double) nstep; displayList = findList1 (CONESOLID, sizeArray, 4); if ( displayList == 0 ) { glNewList( makeModelPtr1 (CONESOLID, sizeArray, 4), GL_COMPILE_AND_EXECUTE ); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder (quadObj, baseradius, topradius, height, nstep, 1); /* lower end disk */ quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_FLAT); gluQuadricOrientation( quadObj, GLU_INSIDE ); gluDisk( quadObj, 0.0, baseradius, nstep, 1 ); glEndList(); } else { glCallList(displayList); } } static void _ambient_by_diffuse(GLfloat dst[4], GLfloat scale, GLfloat src[4]) { COPY_AND_SCALE_V(4, dst, scale, src); CLAMP_V(4, 1.0, dst); } #define WIRE GL_FALSE #define SOLID GL_TRUE void xcRenderSolidBalls3D(void) { register int i; GLfloat ambient[4]; for(i = 1; i <= natoms; i++) { glPushMatrix(); glTranslated( *(xat + i), *(yat + i), *(zat + i) ); if ( AtCol_Ambient_by_Diffuse == 1.0) glMaterialfv ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, atm.col[i] ); else { _ambient_by_diffuse(ambient, AtCol_Ambient_by_Diffuse, atm.col[i]); glMaterialfv (GL_FRONT, GL_AMBIENT, ambient); glMaterialfv (GL_FRONT, GL_DIFFUSE, atm.col[i]); } /* new */ /*glMaterialfv( GL_FRONT, GL_SPECULAR, atm.col[i]);*/ if (is.pipemode) { xcSolidSphere( rball[1] ); } else { xcSolidSphere( rball[ *(nat + i) ] ); } glPopMatrix(); } } void xcRenderWireBalls3D(void) { register int i; GLfloat ambient[4]; for(i = 1; i <= natoms; i++) { glPushMatrix(); glTranslated( *(xat + i), *(yat + i), *(zat + i) ); if ( AtCol_Ambient_by_Diffuse == 1.0) glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, atm.col[i] ); else { _ambient_by_diffuse(ambient, AtCol_Ambient_by_Diffuse, atm.col[i]); glMaterialfv (GL_FRONT, GL_AMBIENT, ambient); glMaterialfv (GL_FRONT, GL_DIFFUSE, atm.col[i]); } if (is.pipemode) { xcWireSphere( rball[1] ); } else { xcWireSphere( rball[ *(nat + i) ] ); } glPopMatrix(); } } void xcRenderBonds(GLenum type) { register int i; GLfloat ambient[4]; if ( VPf.unibond) { if ( AtCol_Ambient_by_Diffuse == 1.0) glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, unibondCol); else { _ambient_by_diffuse(ambient, AtCol_Ambient_by_Diffuse, unibondCol); glMaterialfv (GL_FRONT, GL_AMBIENT, ambient); glMaterialfv (GL_FRONT, GL_DIFFUSE, unibondCol); } } if ( type == GL_FILL ) { /* hack for white bonds !!! */ /*fprintf(stderr,"Bonds GL-coor:\n----------\n");*/ for(i = 1; i <= nbonds; i++) { glPushMatrix(); /* fprintf(stderr,"----- %f %f %f %f %f %f %f\n", (coor3D + i)->x1, (coor3D + i)->y1, (coor3D + i)->z1, (coor3D + i)->fibond, (coor3D + i)->xrvb, (coor3D + i)->yrvb, (coor3D + i)->zrvb ); */ glTranslated( (coor3D + i)->x1, (coor3D + i)->y1, (coor3D + i)->z1 ); glRotated( (coor3D + i)->fibond, (coor3D + i)->xrvb, (coor3D + i)->yrvb, (coor3D + i)->zrvb ); if (!VPf.unibond) { if ( AtCol_Ambient_by_Diffuse == 1.0) glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, atm.col[(coor3D + i)->sqn] ); else { _ambient_by_diffuse(ambient, AtCol_Ambient_by_Diffuse, atm.col[(coor3D + i)->sqn]); glMaterialfv (GL_FRONT, GL_AMBIENT, ambient); glMaterialfv (GL_FRONT, GL_DIFFUSE, atm.col[(coor3D + i)->sqn]); } } xcSolidBond( rrod, (coor3D + i)->bondl, (coor3D + i)->bondFlag ); /*xcSolidCylinder( rrod, (coor3D + i)->bondl );*/ glPopMatrix(); } } else { /* GL_LINE */ for(i = 1; i <= nbonds; i++) { glPushMatrix(); glTranslated( (coor3D + i)->x1, (coor3D + i)->y1, (coor3D + i)->z1 ); glRotated( (coor3D + i)->fibond, (coor3D + i)->xrvb, (coor3D + i)->yrvb, (coor3D + i)->zrvb ); if (!VPf.unibond) { if ( AtCol_Ambient_by_Diffuse == 1.0) glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, atm.col[(coor3D + i)->sqn] ); else { _ambient_by_diffuse(ambient, AtCol_Ambient_by_Diffuse, atm.col[(coor3D + i)->sqn]); glMaterialfv (GL_FRONT, GL_AMBIENT, ambient); glMaterialfv (GL_FRONT, GL_DIFFUSE, atm.col[(coor3D + i)->sqn]); } } xcWireCylinder( rrod, (coor3D + i)->bondl ); glPopMatrix(); } } } void xcRenderSolidSpaceFills3D(void) { register int i; GLfloat ambient[4]; for(i = 1; i <= natoms; i++) { glPushMatrix(); glTranslated( *(xat + i), *(yat + i), *(zat + i) ); if ( AtCol_Ambient_by_Diffuse == 1.0) glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, atm.col[i] ); else { _ambient_by_diffuse(ambient, AtCol_Ambient_by_Diffuse, atm.col[i]); glMaterialfv (GL_FRONT, GL_AMBIENT, ambient); glMaterialfv (GL_FRONT, GL_DIFFUSE, atm.col[i]); } /* new */ /*glMaterialfv( GL_FRONT, GL_SPECULAR, atm.col[i]);*/ xcSolidSphere( atrad[ *(nat + i) ] ); glPopMatrix(); } } void xcRenderWireSpaceFills3D(void) { register int i; GLfloat ambient[4]; for(i = 1; i <= natoms; i++) { glPushMatrix(); glTranslated( *(xat + i), *(yat + i), *(zat + i) ); if ( AtCol_Ambient_by_Diffuse == 1.0) glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, atm.col[i] ); else { _ambient_by_diffuse(ambient, AtCol_Ambient_by_Diffuse, atm.col[i]); glMaterialfv (GL_FRONT, GL_AMBIENT, ambient); glMaterialfv (GL_FRONT, GL_DIFFUSE, atm.col[i]); } xcWireSphere( atrad[ *(nat + i) ] ); glPopMatrix(); } } void xcRenderSolidFrame3D(void) { register int i; GLfloat ambient[4]; if ( AtCol_Ambient_by_Diffuse == 1.0) glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, framecol ); else { _ambient_by_diffuse(ambient, AtCol_Ambient_by_Diffuse, framecol ); glMaterialfv (GL_FRONT, GL_AMBIENT, ambient); glMaterialfv (GL_FRONT, GL_DIFFUSE, framecol); } for(i = nbonds + 1; i <= nframes + nbonds; i++) { /* if frametype == 1 -> draw a xcSolidBond frame else, * draw a line_stipple frame */ if ( (coor3D + i)->nat == 1 ) { glPushMatrix(); glTranslated( (coor3D + i)->x1, (coor3D + i)->y1, (coor3D + i)->z1 ); glRotated( (coor3D + i)->fibond, (coor3D + i)->xrvb, (coor3D + i)->yrvb, (coor3D + i)->zrvb ); xcSolidBond ( rframe, (coor3D + i)->bondl, BOND_ATOM_TO_ATOM ); glPopMatrix(); } else xcLineStippleFrame(i - nbonds); } } void xcRenderWireFrame3D(void) { register int i; GLfloat ambient[4]; if ( AtCol_Ambient_by_Diffuse == 1.0) glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, framecol ); else { _ambient_by_diffuse(ambient, AtCol_Ambient_by_Diffuse, framecol ); glMaterialfv (GL_FRONT, GL_AMBIENT, ambient); glMaterialfv (GL_FRONT, GL_DIFFUSE, framecol); } for(i = nbonds + 1; i <= nframes + nbonds; i++) { if ( (coor3D + i)->nat == 1 ) { glPushMatrix(); glTranslated( (coor3D + i)->x1, (coor3D + i)->y1, (coor3D + i)->z1 ); glRotated( (coor3D + i)->fibond, (coor3D + i)->xrvb, (coor3D + i)->yrvb, (coor3D + i)->zrvb ); xcWireCylinder ( rframe, (coor3D + i)->bondl ); glPopMatrix(); } else xcLineStippleFrame(i - nbonds); } } void xcRenderLineFrame3D(void) { register int i; glColor3fv( framecol ); /* temporary disable lighting, dihtering */ glCallList( tempDisable3Dlist ); for(i = 1; i <= nframes; i++) { if ( *(frametype + i) != 1 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glCallList(tempDisable3Dlist); glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glVertex3d( *(xframe + i), *(yframe + i), *(zframe + i) ); glVertex3d( *(xframe2 + i), *(yframe2 + i), *(zframe2 + i) ); glEnd(); glDisable(GL_LINE_STIPPLE); glCallList(tempEnable3Dlist); } /* now again enable lighting, dihtering */ glCallList( tempEnable3Dlist ); glEndList(); } static void xcLineStippleFrame(int ii) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); glCallList( tempDisable3Dlist ); glColor3fv( framecol ); glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glVertex3d( *(xframe + ii), *(yframe + ii), *(zframe + ii) ); glVertex3d( *(xframe2 + ii), *(yframe2 + ii), *(zframe2 + ii) ); glEnd(); glCallList( tempEnable3Dlist ); glDisable(GL_LINE_STIPPLE); } static void MatInv33_44(double m[4][4], double minv[4][4], double *det) { double f0, f1, f2, idet; register int i, j; for(i=0; i<4; i++) for(j=0; j<4; j++) minv[i][j] = m[i][j]; f0 = m[1][1]*m[2][2] - m[1][2]*m[2][1]; f1 = m[1][2]*m[2][0] - m[1][0]*m[2][2]; f2 = m[1][0]*m[2][1] - m[1][1]*m[2][0]; *det = m[0][0]*f0 + m[0][1]*f1 + m[0][2]*f2; if (*det < 1.0e-10) { /* determinant is very small; return the minv=m */ return; } idet = 1.0 / *det; minv[0][0] = f0 * idet; minv[1][0] = f1 * idet; minv[2][0] = f2 * idet; f0 = m[0][0] * idet; f1 = m[0][1] * idet; f2 = m[0][2] * idet; minv[0][1] = f2*m[2][1] - f1*m[2][2]; minv[1][1] = f0*m[2][2] - f2*m[2][0]; minv[2][1] = f1*m[2][0] - f0*m[2][1]; minv[0][2] = f1*m[1][2] - f2*m[1][1]; minv[1][2] = f2*m[1][0] - f0*m[1][2]; minv[2][2] = f0*m[1][1] - f1*m[1][0]; } static void MultMat44_33Vec3(double mat[4][4], double vec[3], double res[3]) { int i; /* mat is !!!COLUMN!!!, not row major mode (due to OGL) */ for(i=0; i<3; i++) res[i] = mat[0][i] * vec[0] + mat[1][i] * vec[1] + mat[2][i] * vec[2]; } static void _makeAtomLabels3D(double *rad) { register int i; double dummy, minv[4][4], v[3], z[3], sizeF; sizeF = 2.0 * VPf.VPfactor; /* disable lighting & dihtering ... */ glCallList( tempDisable3Dlist ); for(i = 1; i <= natoms; i++) { z[2] = 1.01 * rad[*(nat + i)]; if ( !globalAtomLabel.base && ! atomLabel[i].base ) { char *label; GLfloat *color; /* render default raster font */ if (atomLabel[i].base) { label = atomLabel[i].label; color = atomLabel[i].bright_color; if (atomLabel[i].tkfont) { z[0] = (double) ( -Tk_TextWidth(atomLabel[i].tkfont, label, strlen(label)) ) / sizeF; } else { z[0] = (double) (-atomLabel[i].width * (int)strlen(label)) / sizeF; } z[1] = (double) (-atomLabel[i].height) / sizeF; } else { label = element[*(nat + i)]; color = globalAtomLabel.bright_color; z[0] = rf.w2 * (double)strlen(label); z[1] = rf.h2; } MatInv33_44((double (*)[4]) vec.crdvec, minv, &dummy); MultMat44_33Vec3(minv, z, v); glColor3fv (color); glRasterPos3d ( *(xat + i) + v[0], *(yat + i) + v[1], *(zat + i) + v[2] ); if (atomLabel[i].base && atomLabel[i].do_display \ && ! do_not_display_atomlabel[i]) { /* custom label */ glListBase(atomLabel[i].base); xcFont_PrintString (label); } else { /* default label */ if (globalAtomLabel.do_display && !do_not_display_atomlabel[i]) glCallList( atomlabelOffset + *(nat + i) ); } } else { /* render one of new Togl fonts */ if (atomLabel[i].base) { /* new */ glListBase (atomLabel[i].base); /* t.k. */ if (atomLabel[i].tkfont) { z[0] = (double) ( -Tk_TextWidth(atomLabel[i].tkfont, atomLabel[i].label, strlen(atomLabel[i].label)) ) / sizeF; } else { z[0] = (double) (-atomLabel[i].width * (int)strlen(atomLabel[i].label)) / sizeF; } z[1] = (double) (-atomLabel[i].height) / sizeF; MatInv33_44((double (*)[4]) vec.crdvec, minv, &dummy); MultMat44_33Vec3(minv, z, v); glColor3fv (atomLabel[i].bright_color); glRasterPos3d( *(xat + i) + v[0], *(yat + i) + v[1], *(zat + i) + v[2]); if (atomLabel[i].do_display && !do_not_display_atomlabel[i]) xcFont_PrintString( atomLabel[i].label ); } else { /* old */ glListBase (globalAtomLabel.base); /* t.k. */ if (globalAtomLabel.tkfont) { z[0] = (double) ( -Tk_TextWidth(globalAtomLabel.tkfont, element[*(nat + i)], strlen(element[*(nat + i)])) ) / sizeF; } else { z[0] = ((double) -globalAtomLabel.width * strlen(element[*(nat + i)])) / sizeF; } z[1] = ((double) -globalAtomLabel.height) / sizeF; z[2] = 1.01 * rad[*(nat + i)]; MatInv33_44((double (*)[4]) vec.crdvec, minv, &dummy); MultMat44_33Vec3(minv, z, v); glColor3fv (globalAtomLabel.bright_color); glRasterPos3d( *(xat + i) + v[0], *(yat + i) + v[1], *(zat + i) + v[2]); if (globalAtomLabel.do_display && !do_not_display_atomlabel[i]) xcFont_PrintString( element[*(nat + i)] ); } } } /* now again enable lighting, dihtering */ glCallList( tempEnable3Dlist ); } void xcMakeBallLabel3D(void) { _makeAtomLabels3D(rball); } void xcMakeSpaceLabel3D(void) { _makeAtomLabels3D(atrad); } /*****************************************************************************/ /* when I enter this procedure I just Made a Display, that means that * everything must be made before that */ void xcDisplay3D(struct Togl *togl) { if ( ! VPf.antialias ) { /* NO ANTIALIASING */ _xcDisplay3D(togl); } else { /* ANTIALIASING */ GLint viewport[4]; GLfloat sx, sy; GLfloat scale, dx, dy; int min, max, count, i, j; enum { XORG, YORG, WID, HT }; glGetIntegerv(GL_VIEWPORT, viewport); sx = 2 * ort.maxx / viewport[WID]; sy = 2 * ort.maxy / viewport[WID]; min = -antialias.degree; max = -min + 1; count = -min + max; count *= count; /* uniform scaling, less than one pixel wide */ scale = -antialias.offset / min; glClear(GL_ACCUM_BUFFER_BIT); for (j = min; j < max; j++) { for (i = min; i < max; i++) { dx = sx * scale * i; dy = sy * scale * j; glMatrixMode(GL_PROJECTION); glLoadIdentity(); if ( ! VPf.perspective ) { glOrtho(ort.minx + dx, ort.maxx + dx, ort.miny + dy, ort.maxy + dy, ort.minz+ort.size, ort.maxz+ort.size); } else { glFrustum (ort.minx + dx, ort.maxx + dx, ort.miny + dy, ort.maxy + dy, persp.near, persp.far); } glMatrixMode(GL_MODELVIEW); _xcDisplay3D(togl); glAccum(GL_ACCUM, 1.0 / (GLfloat)count); } } glAccum(GL_RETURN, 1.0); } Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } static void _xcDisplay3D(struct Togl *togl) { /* /\* testing ... *\/ */ /* GLboolean can_do_stereo; */ /* glGetBooleanv(GL_STEREO, &can_do_stereo); */ /* is.stereo = GL_TRUE; */ /* testing-end */ if (is.stereo) { /***************/ /* STEREO MODE */ /***************/ /* draw left eye image */ glDrawBuffer(GL_BACK_LEFT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* INSERT HERE ROTATION MATRIX */ glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); glRotated(1.0, 0.0, 1.0, 0.0); glMultMatrixd (vec.crdvec); __xcDisplay3D(togl); /* draw right eye image */ glDrawBuffer(GL_BACK_RIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* INSERT HERE ROTATION MATRIX */ glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); glRotated(-1.0, 0.0, 1.0, 0.0); glMultMatrixd (vec.crdvec); __xcDisplay3D(togl); } else { /*******************/ /* non STEREO MODE */ /*******************/ /* draw single image */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* INSERT HERE ROTATION MATRIX */ glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); glMultMatrixd (vec.crdvec); __xcDisplay3D(togl); } } static void __xcDisplay3D(struct Togl *togl) { int i; /* fog */ xcFog (togl, VPf.fog, VPf.perspective); if (is.anaglyph) { /**************************/ /* DISPLAY with ANAGLYPHs */ /**************************/ /* EV display anaglyph */ /* anaglyph is defined as wire is.solid=GL_FALSE */ glEnable(GL_COLOR_MATERIAL); CameraHome(); HandleDisplay(togl); glDisable(GL_COLOR_MATERIAL); } else { /*****************************/ /* DISPLAY without ANAGLYPHs */ /*****************************/ /* display FORCES */ if (VPf.force && xcr.lforce) { xcRenderVectorForces(); } /* display H-bonds */ if (VPf.Hbond) xcRenderHbonds3D(); /* if (is.anaglyph) xcTurnXYZOff(togl); */ tmp_nobjects = 0; if (is.solid) { /* display SOLID Lists */ if (is.spacefillmode) { xcRenderSolidSpaceFills3D(); tmp_nobjects += natoms; } if (is.ballmode) { xcRenderSolidBalls3D(); tmp_nobjects += natoms; } if (is.stickmode) { xcRenderBonds(GL_FILL); tmp_nobjects += nbonds; } if (!is.lineframe && VPf.framesOn) { xcRenderSolidFrame3D(); tmp_nobjects += nframes; } } else { if (is.spacefillmode) { xcRenderWireSpaceFills3D(); tmp_nobjects += natoms; } if (is.ballmode) { xcRenderWireBalls3D(); tmp_nobjects += natoms; } if (is.stickmode) { xcRenderBonds(GL_LINE); /* glCallList(WireStickList);*/ tmp_nobjects += nbonds; } if (!is.lineframe && VPf.framesOn) { xcRenderWireFrame3D(); tmp_nobjects += nframes; } } if (is.lineframe && VPf.framesOn) { /* set color & width for frames */ glLineWidth( VPf.framewidth ); xcRenderLineFrame3D(); tmp_nobjects += nframes; } for (i=0; i 0 ) xcRenderSurface(); /* are we in selection mode ??? */ if ( VPf.selection ) { xcRenderSelAtoms3D(); xcRenderSelBonds3D(); /*for(i=0; i simplify ! */ /* if ( strcmp(mode,"WF") == 0 || strcmp(mode,"PL") == 0 ) */ /* /\* 1.1 is just some additional offset *\/ */ /* size = (MVf.structsize + VPf.PLradius / VPf.VPfactor) * 1.1; */ /* else if ( mode[0] == 'B' || strcmp(mode,"PB") == 0 ) { */ /* size = (MVf.structsize + max.r * VPf.ballf) * 1.1; */ /* } */ /* else if ( strcmp(mode,"SF") == 0 ) { */ /* size = (MVf.structsize + max.r * VPf.atradf) * 1.1; */ /* } */ /* this is much simpler */ /*size = MVf.structsize * (size + max.r) * 1.1;*/ /*size = MVf.structsize * (1.0 + max.r) * 1.1;*/ size = (MVf.structsize + 2.0*max.r) * 1.05; _xcMakeProjection(size); } void xcMakeProjection3D(const char *mode) { GLdouble size; /* GLenum LIGHT[8] = { GL_LIGHT0, */ /* GL_LIGHT1, */ /* GL_LIGHT2, */ /* GL_LIGHT3, */ /* GL_LIGHT4, */ /* GL_LIGHT5, */ /* GL_LIGHT6, */ /* GL_LIGHT7 }; */ FindMaxRad(); /* this is too much complicated and the drawback is that the size of displayed structure changes when chaning mode --> simplify ! */ /* size = MVf.structsize; */ /* if ( strcmp(mode,"sticks") == 0 || strcmp(mode,"balls") == 0 ) */ /* size = (size + max.r * VPf.ballf) * 1.1; */ /* else if ( strcmp(mode,"space") == 0 ) */ /* size = (size + max.r) * 1.1; */ /* this is much simpler */ /*size = MVf.structsize * (size + max.r) * 1.1;*/ /*size = MVf.structsize * (1.0 + max.r) * 1.1;*/ size = (MVf.structsize + 2.0*max.r) * 1.05; _xcMakeProjection(size); } static void _xcMakeProjection(GLdouble size) { register int i; int isoobject = 0; MOL_SURF *m; ISOSURFACE *iso; float _size; double structsize, fulls_vs_structs, ratio; static double old_fulls_vs_structs = 1.0; structsize = size; /* if isoXXXXX is rendered, than it may be greater than the structure, * take this into account */ for (i=ISOOBJ_BASE; i size ) size = MVf.isosize; /* are we in Iso_Space_Selection mode ??? */ if ( (VPf.isospacesel2D || VPf.isospacesel3D) && MVf.isospaceselsize > size ) size = MVf.isospaceselsize; /* do we specify to render Wigner-Seitz cells ??? */ if ( VPf.wignerseitz && MVf.wignerseitzsize > size ) size = MVf.wignerseitzsize; /* this is temporal if ( xcr.lprimwigner ) size = MVf.structsize + wsp.max; */ /* size of forces */ size = FV.max_size > size ? FV.max_size : size; /* size of molecular surfaces */ for (i=0; iisosurf_index ); if (!iso) { continue; } _size = distfv (m->size); size = _size > size ? _size : size; } if ( VPf.stropened && structsize > 0.0 ) { fulls_vs_structs = size / structsize; ratio = fulls_vs_structs / old_fulls_vs_structs; old_fulls_vs_structs = fulls_vs_structs; tr.zoom *= ratio; } /* assign glOrtho dimensions to OrhoProj ort */ ort.size = (size > 1.0 ? size : 1.0); /* MaybeClipAndMakeProjection(); */ xcViewPort(); /* * take care about some minimium light-settings */ /* size = ort.maxx; */ /* if ( ort.maxy > size ) */ /* size = ort.maxy; */ /* for (i=0; i< MAX_NUMBER_OF_LIGHTS; i++) { */ /* if ( light[i].isenabled ) { */ /* light[i].position[0] = size * light[i].fract_position[0]; */ /* light[i].position[1] = size * light[i].fract_position[1]; */ /* light[i].position[2] = size * light[i].fract_position[2]; */ /* light[i].position[3] = light[i].fract_position[3]; */ /* glLightfv(LIGHT[i], GL_POSITION, light[i].position); */ /* glEnable( LIGHT[i] ); */ /* } */ /* } */ /* incoming: */ LoadLights(); } void xcClearScreen(struct Togl *togl) { /* make a black polygon on whole window -> so structure will disapear */ glClear(GL_COLOR_BUFFER_BIT); glClearColor( bg[0], bg[1], bg[2], bg[3] ); glFlush(); Togl_SwapBuffers( togl ); } void xcChangeBackground(struct Togl *togl, GLclampf bckg[4]) { glClear(GL_COLOR_BUFFER_BIT); glClearColor( bckg[0], bckg[1], bckg[2], bckg[3] ); glFlush(); Togl_PostRedisplay( togl ); } void xcDisplayXYZ(void) { GLint shadetype, fog; /* we will query shade model */ GLdouble shift, f; /* disable Depth-cuing */ glGetIntegerv( GL_FOG, &fog); if (fog) glDisable (GL_FOG); /*glLoadMatrixd( vec.crdvec );*/ glViewport( 0, 0, CRDS_SIZE, CRDS_SIZE); /* prepare for matrices for coordinate sistem */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (VPf.perspective) { /* PERSPECTIVE projection */ f = 1.5 + 2.4 / persp.shiftZ; shift = -2.0*persp.shiftZ; } else { /* ORTHOGRAPHIC projection */ f = 1.5 + 2.4 / ort.size; shift = f*ort.size; } glOrtho( -1.2, 1.2, -1.2, 1.2, -shift-1.2, 1.2 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated (0.0, 0.0, shift); glMultMatrixd (vec.crdvec ); /* ========================================== */ /* now display coor sistem */ /* if we are in XC_2D mode clear DETPTH_BUFFER */ if ( dimType == XC_2D ) { glEnable(GL_DEPTH_TEST); glClear( GL_DEPTH_BUFFER_BIT ); } /* if we are in 3D turn off */ if ( dimType == XC_3D ) { /* when displaying coord-sist in 3D mode, * we must Disable some things */ glCallList( tempDisable3Dlist ); glGetIntegerv( GL_SHADE_MODEL, &shadetype); /* go to FLAT shades, but before remember what was the shade model */ if ( shadetype == GL_SMOOTH ) glShadeModel( GL_FLAT); } /* display XYZ axis */ glColor4fv( xyz.axis_color ); glCallList (crdList); glColor4fv( xyz.xyplane_color ); glCallList (xyplaneList); /*glLoadIdentity();*/ if ( dimType == XC_2D ) glDisable(GL_DEPTH_TEST); if ( dimType == XC_3D ) { /* it's better idea to make a glList for this, but so far ... */ glCallList( tempEnable3Dlist ); if ( shadetype == GL_SMOOTH ) glShadeModel( GL_SMOOTH ); } if (fog) glEnable (GL_FOG); goToPrevProj(); } static void goToPrevProj(void) { xcViewPort(); /* now go back to previous GL_PROJECTION & GL_MODELVIEW */ /* glMatrixMode(GL_PROJECTION); */ /* glLoadIdentity(); */ /* if ( dimType == XC_2D ) { */ /* gluOrtho2D(ort.minx, ort.maxx, ort.miny, ort.maxy); */ /* } else */ /* glOrtho(ort.minx, ort.maxx, ort.miny, ort.maxy, ort.minz, ort.maxz); */ /* glMatrixMode(GL_MODELVIEW); */ /* glViewport( (GLint) VPf.x, (GLint) VPf.y, */ /* (GLsizei) VPf.sizex, (GLsizei) VPf.sizey); */ /* if ( dimType == XC_2D ) glLoadIdentity(); */ } void xcTurnXYZOff(struct Togl *togl) { /* turn VPf.xyzOn off */ VPf.xyzOn = 0; Togl_PostRedisplay (togl); /* if ( VPf.stropened ) { */ /* GLfloat size = 1.1 * CRDS_SIZE; */ /* /\* on place where the coor-sist is desplayed, display black rectangle *\/ */ /* /\* prepere for matrices for coordinate sistem *\/ */ /* glMatrixMode(GL_PROJECTION); */ /* glOrtho( -1.2, 1.2, -1.2, 1.2, -1.2, 1.2 ); */ /* glMatrixMode(GL_MODELVIEW); */ /* glViewport( 0.0, 0.0, size, size); */ /* glLoadIdentity(); */ /* glColor3fv( bg ); */ /* /\* if we are in 3D mode we must go to "pseudo" 2D mode *\/ */ /* if (dimType == XC_3D) { */ /* glCallList(tempDisable3Dlist); */ /* glDisable(GL_DEPTH_TEST); */ /* } */ /* glBegin(GL_POLYGON); */ /* glVertex2f(-size, size); */ /* glVertex2f( size, size); */ /* glVertex2f( size,-size); */ /* glVertex2f(-size,-size); */ /* glEnd(); */ /* /\* if 3D -> going back *\/ */ /* if (dimType == XC_3D) { */ /* glCallList(tempEnable3Dlist); */ /* glEnable(GL_DEPTH_TEST); */ /* } */ /* goToPrevProj(); */ /* glFlush(); */ /* Togl_SwapBuffers(togl); */ /* } */ } static int CalcTessFactor(void) { if ( natoms < 10 ) { return (int) VPf.tessFactor; } else if ( natoms < 30 ) { return (int) (VPf.tessFactor / 1.5); } else if ( natoms < 100 ) { return (int ) (VPf.tessFactor / 2); } else { return (int) (VPf.tessFactor / 3); } } /******************************************************************** ******************************************************************** EV ANAGLYPH PART ******************************************************************** ********************************************************************/ /* This is the basic display callback routine It creates the geometry, lighting, and viewing position */ static void HandleDisplay(struct Togl *togl) { XYZ right,focus; /* Determine the focal point */ Normalise(&camera.vd); focus.x = camera.vp.x + camera.focallength * camera.vd.x; focus.y = camera.vp.y + camera.focallength * camera.vd.y; focus.z = camera.vp.z + camera.focallength * camera.vd.z; /* Derive the the "right" vector */ CROSSPROD(camera.vd,camera.vu,right); Normalise(&right); right.x *= camera.eyesep / 2.0; right.y *= camera.eyesep / 2.0; right.z *= camera.eyesep / 2.0; /* Set the buffer for writing and reading */ glDrawBuffer(GL_BACK); glReadBuffer(GL_BACK); /* Clear things */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Set projection */ xcViewPort(); /* Left eye filter red */ glColorMask(GL_TRUE,GL_FALSE,GL_FALSE,GL_TRUE); /* Create the model */ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); glMultMatrixd (vec.crdvec); gluLookAt(camera.vp.x - right.x, camera.vp.y - right.y, camera.vp.z - right.z, focus.x,focus.y,focus.z, camera.vu.x,camera.vu.y,camera.vu.z); draw_scene(); glFlush(); glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); glDrawBuffer(GL_BACK); glClear(GL_DEPTH_BUFFER_BIT); xcViewPort(); /* Right eye filter */ glColorMask(GL_FALSE,GL_FALSE,GL_TRUE,GL_TRUE); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); glMultMatrixd (vec.crdvec); gluLookAt(camera.vp.x + right.x, camera.vp.y + right.y, camera.vp.z + right.z, focus.x,focus.y,focus.z, camera.vu.x,camera.vu.y,camera.vu.z); draw_scene(); glFlush(); glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); /* Let's look at it */ /*Togl_SwapBuffers(togl);*/ } static void draw_scene() { int i; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); /* Here are the options set in _xcDisplay3D for wire or solid */ /* display FORCES */ if (VPf.force && xcr.lforce) { xcRenderVectorForces(); } /* display H-bonds */ if (VPf.Hbond) xcRenderHbonds3D(); tmp_nobjects = 0; if (is.solid) { /* display SOLID Lists */ if (is.spacefillmode) { xcRenderSolidSpaceFills3D(); tmp_nobjects += natoms; } if (is.ballmode) { xcRenderSolidBalls3D(); tmp_nobjects += natoms; } if (is.stickmode) { xcRenderBonds(GL_FILL); tmp_nobjects += nbonds; } if (!is.lineframe && VPf.framesOn) { xcRenderSolidFrame3D(); tmp_nobjects += nframes; } } else { if (is.spacefillmode) { xcRenderWireSpaceFills3D(); tmp_nobjects += natoms; } if (is.ballmode) { xcRenderWireBalls3D(); tmp_nobjects += natoms; } if (is.stickmode) { xcRenderBonds(GL_LINE); /* glCallList(WireStickList);*/ tmp_nobjects += nbonds; } if (!is.lineframe && VPf.framesOn) { xcRenderWireFrame3D(); tmp_nobjects += nframes; } } if (is.lineframe && VPf.framesOn) { /* set color & width for frames */ glLineWidth( VPf.framewidth ); xcRenderLineFrame3D(); tmp_nobjects += nframes; } for (i=0; i 0 ) xcRenderSurface(); /* are we in selection mode ??? */ if ( VPf.selection ) { xcRenderSelAtoms3D(); xcRenderSelBonds3D(); /*for(i=0; i the scene semm to be on the screen */ /* 15 -> the scene semm to be out of the screen */ /* 10 -> the scene semm to be in the screen */ camera.focallength = 5; /* Non stressful stereo setting */ camera.eyesep = camera.focallength / 30.0; } /* Normalise a vector */ static void Normalise(XYZ *p) { double length; length = sqrt(p->x * p->x + p->y * p->y + p->z * p->z); if (length != 0) { p->x /= length; p->y /= length; p->z /= length; } else { p->x = 0; p->y = 0; p->z = 0; } } /* Calculate the unit normal at p given two other points p1,p2 on the surface. The normal points in the direction of p1 crossproduct p2 */ /* static XYZ */ /* CalcNormal(XYZ p,XYZ p1,XYZ p2) */ /* { */ /* XYZ n,pa,pb; */ /* pa.x = p1.x - p.x; */ /* pa.y = p1.y - p.y; */ /* pa.z = p1.z - p.z; */ /* pb.x = p2.x - p.x; */ /* pb.y = p2.y - p.y; */ /* pb.z = p2.z - p.z; */ /* Normalise(&pa); */ /* Normalise(&pb); */ /* n.x = pa.y * pb.z - pa.z * pb.y; */ /* n.y = pa.z * pb.x - pa.x * pb.z; */ /* n.z = pa.x * pb.y - pa.y * pb.x; */ /* Normalise(&n); */ /* return(n); */ /* } */ /******************************************************************** ******************************************************************** EV ******************************************************************** ********************************************************************/ xcrysden-1.6.2/C/readstrf.c0000644000175000017500000015677113522234320014230 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/readstrf.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #define _GNU_SOURCE #include #include #include #include #include "struct.h" #include "3D.h" #include "bz.h" #include "vector.h" #include "memory.h" #include "xcfunc.h" #include "getline.h" #define XSF_OPEN 0 #define XSF_UPDATE 1 #define LINE_FMT "%[^\n\r]" StructSize ss; extern AtomicLabel *atomLabel, globalAtomLabel; extern short *do_not_display_atomlabel; extern double rcov[MAXNAT + 1]; extern char *element[]; extern ForceVector FV; /* FUNCTION PROTOTYPES */ int ReadStructFile(FILE *fp, const char *file, int format, int mode); void MakeBonds(void); void MallocCoor(void); void FreeCoor(void); int ReadXSF(FILE *fp); int ReadVec(FILE *fp, double vec[][4]); static int ReadCoor( FILE *fp, int natr, int ncell, const int celltype ); static int ReadAtoms( FILE *fp , long int atompos ); static int ReadFrames( FILE *fp , long int framepos ); static int ReadVoronoi(FILE *fp, float poly[][WIGNERSEITZ_MAXVERTEX][3], float norm[][WIGNERSEITZ_MAXVERTEX][3], int nvert[], float *Max, boolean *xcrl, int *npoly); void FindMaxRad(void); static void CorrectVectors( double vec[][4], int dim ); static void CheckAtoms(int *flag1, int *nat1, double *xat1, double *yat1, double *zat1, double (*fv1)[3]); static int ReadXYZ(FILE *fp); static int ReadPDB(FILE *fp); /*static void StringTrailLeftWhiteSpaces(char *str, size_t size);*/ void ParseAtomName(char *atomName); static void parsePDBAtomRecord(char *line, int *nat1, double *x, double *y, double *z); static void parsePDBHetatmRecord(char *line, int *n, double *x, double *y, double *z); static void xcReallocAtomLabels(void); static void ToEndLine(FILE *fp); /* extern functions prototypes */ /* --- auxilproc.c ---*/ extern double dist6(double x1, double x2, double y1, double y2, double z1, double z2); extern double dist3(double x, double y, double z); /* --- detnsplit.c --- */ extern int DetNBonds(int *nsplit); /* --- 3D.c ---*/ extern void MakeCylinderCoor(void); /* --- datagrid.c --- */ extern void NewGridList( int gridtype, FILE *gridFP ); extern FILE *MaybeOpenDataGridFile(char *mode); extern int ReadDataGrid(FILE *fp, FILE *gridFP, int gridtype, char *line); extern void CloseDataGridFile(void); extern void SetDataGridCommentLine(char *line); /* --- xcColorScheme.c --- */ extern void LoadAtmCol(const int flag); /* -- forces.c -- */ extern void MallocForceVectors(void); /* -- xcForce.c -- */ extern void BuildForceVectors(ForceVector *fvPtr); extern void Set_mx_my_mz(double sumx, double sumy, double sumz); /* xcdebug.c */ extern void xcdebug(const char *text); extern void xcErrDebug(const char *text); extern void breakpoint(const char *text); /* ------------------------------------------------------------------------ */ int ReadStructFile(FILE *fp, const char *file, int format, int mode) { register int i, j; double sumx = 0.0, sumy = 0.0, sumz = 0.0, vsize1 = 0.0, vsize2 = 0.0; double v1[3], v2[3], v3[3]; GLboolean latom; vec.prim[0][0] = vec.prim[1][1] = vec.prim[2][2] = vec.prim[3][3] = vec.conv[0][0] = vec.conv[1][1] = vec.conv[2][2] = vec.conv[3][3] = 1.0; vec.prim[0][1] = vec.prim[0][2] = vec.prim[0][3] = vec.prim[1][0] = vec.prim[1][2] = vec.prim[1][3] = vec.prim[2][0] = vec.prim[2][1] = vec.prim[2][3] = vec.prim[3][0] = vec.prim[3][1] = vec.prim[3][2] = vec.conv[0][1] = vec.conv[0][2] = vec.conv[0][3] = vec.conv[1][0] = vec.conv[1][2] = vec.conv[1][3] = vec.conv[2][0] = vec.conv[2][1] = vec.conv[2][3] = vec.conv[3][0] = vec.conv[3][1] = vec.conv[3][2] = 0.0; xcr.celltype = XCR_NOCELL; /* reset all xcrys-file related parameters */ xcr.ldimgroup = 0; xcr.lconvvec = 0; xcr.lprimvec = 0; xcr.lrecconvvec = 0; xcr.lrecprimvec = 0; xcr.lprimwigner = 0; xcr.lconvwigner = 0; xcr.lprimbz = 0; xcr.lconvbz = 0; xcr.lconvcoor = 0; xcr.lprimcoor = 0; xcr.lforce = 0; xcr.prim_lforc = 0; /*xcr.lHbond = 0;*/ if ( mode == XSF_OPEN ) { xcr.ldatagrid2D = 0; xcr.ldatagrid3D = 0; xcr.lbandgrid2D = 0; xcr.lbandgrid3D = 0; } xcr.dim = 0; xcr.nunit[0] = 0; xcr.nunit[1] = 0; xcr.nunit[2] = 0; MVf.structsize = 0.0; if ( format == FORMAT_XSF ) if ( !ReadXSF(fp) ) { /* just append file name to error massage from ReadXSF(fp) */ fprintf(stderr,"\"%s\"\n",file); return XC_ERROR; } if ( format == FORMAT_XYZ ) if ( !ReadXYZ(fp) ) { /* just append file name to error massage from ReadXSF(fp) */ fprintf(stderr,"\"%s\"\n",file); return XC_ERROR; } if ( format == FORMAT_PDB ) if ( !ReadPDB(fp) ) { /* just append file name to error massage from ReadXSF(fp) */ fprintf(stderr,"\"%s\"\n",file); return XC_ERROR; } /* MOVING TO GEOMETRICAL-MASS-CENTER */ for(i = 1; i <= natoms; i++) { sumx += xat[i]; sumy += yat[i]; sumz += zat[i]; } /*--> THIS ..*/ Set_mx_my_mz (sumx, sumy, sumz); mx = mx_my_mz.mx; my = mx_my_mz.my; mz = mx_my_mz.mz; /* this ... */ /* initialize max.* */ max.x = 0.0; max.y = 0.0; max.z = 0.0; max.r = 0.0; ss.minX = ss.maxX = mx; ss.minY = ss.maxY = my; ss.minZ = ss.maxZ = mz; atm.natomkind = 0; for(i = 1; i <= natoms; i++) { if ( xat[i] < ss.minX ) ss.minX = xat[i]; if ( yat[i] < ss.minY ) ss.minY = yat[i]; if ( zat[i] < ss.minZ ) ss.minZ = zat[i]; if ( xat[i] > ss.maxX ) ss.maxX = xat[i]; if ( yat[i] > ss.maxY ) ss.maxY = yat[i]; if ( zat[i] > ss.maxZ ) ss.maxZ = zat[i]; latom = 0; /* if it's 0 than new element (atm.atomkind[]) */ xat[i] = xat[i] - mx; yat[i] = yat[i] - my; zat[i] = zat[i] - mz; if (ABS (xat[i]) > max.x) max.x = ABS (xat[i]); if (ABS (yat[i]) > max.y) max.y = ABS (yat[i]); if (ABS (zat[i]) > max.z) max.z = ABS (zat[i]); /* determine which atomic elements are in structure */ for(j=0; j max.x) max.x = ABS (*(xframe + i)); if (ABS (*(yframe + i)) > max.y) max.y = ABS (*(yframe + i)); if (ABS (*(zframe + i)) > max.z) max.z = ABS (*(zframe + i)); if (ABS (*(xframe2 + i)) > max.x) max.x = ABS (*(xframe2 + i)); if (ABS (*(yframe2 + i)) > max.y) max.y = ABS (*(yframe2 + i)); if (ABS (*(zframe2 + i)) > max.z) max.z = ABS (*(zframe2 + i)); } /* structsize is longest distance from origin */ /* structure is sqrt( max.x^2 + max.y^2 + max.z^2 ) */ MVf.structsize = sqrt( max.x * max.x + max.y * max.y + max.z * max.z ); /* ---- MAKE BONDS ---- */ MakeBonds(); /* ---- MAKE Hydrogen Bonds ---- */ make_H_Bonds(); /* VERY IMPORTANT !!!!! */ /* ---- NOW ASSIGN "nobjects" variable ---- */ nobjects = natoms + nbonds + nframes; /* malloc "coor" & "coor3D" and stuff that goes nearby */ MallocCoor(); atm.col = (GLfloat (*)[3]) realloc(atm.col, sizeof(float [3]) * (natoms + 1 + N_SELECT_OBJ)); LoadAtmCol(1); /* --- now calculate coordinates for 3Dbonds & 3Dframes --- */ MakeCylinderCoor(); /* --- if we come so far everything is OK --- */ /***********************************************************/ /* correct the structusize also according to "crystal cages"; take the largest of PRIMVEC and CONVEC, so that when shifting between the two CELL displays the structure will not "size-breath" */ vsize1 = 0.0; vsize2 = 0.0; if ( xcr.lprimvec ) { CorrectVectors( vec.prim, xcr.dim ); for (i=0; i<3; i++) { v1[i] = (xcr.nunit[0] <= 1 ? 1.0 : (double)xcr.nunit[0]) * vec.prim[0][i]; v2[i] = (xcr.nunit[1] <= 1 ? 1.0 : (double)xcr.nunit[1]) * vec.prim[1][i]; v3[i] = (xcr.nunit[2] <= 1 ? 1.0 : (double)xcr.nunit[2]) * vec.prim[2][i]; } vsize1 = papipedMaxDiagSize ( v1, v2, v3 ); } if ( xcr.lconvvec ) { CorrectVectors( vec.conv, xcr.dim ); for (i=0; i<3; i++) { v1[i] = (xcr.nunit[0] <= 1 ? 1.0 : (double)xcr.nunit[0]) * vec.conv[0][i]; v2[i] = (xcr.nunit[1] <= 1 ? 1.0 : (double)xcr.nunit[1]) * vec.conv[1][i]; v3[i] = (xcr.nunit[2] <= 1 ? 1.0 : (double)xcr.nunit[2]) * vec.conv[2][i]; } vsize2 = papipedMaxDiagSize ( v1, v2, v3 ); } vsize1 = ( vsize1 > vsize2 ? vsize1 : vsize2 ); MVf.structsize = ( vsize1 > MVf.structsize ? vsize1 : MVf.structsize ); return XC_OK; } void MakeBonds(void) { int i, j, k, max_ibn, *ibn; int numb = 0; /* numb == seq. number of bond; 0 because we increase ++numb, before usage */ /* double fabs(); */ double dis, len, fdis; int nsplit; /* criteria for additional bond spliting */ /*C Find Bonds C numb.......counter of bonds C nbonds.....number of bonds C dis.....distance between i & j atoms C len.....lenght of sum of covalent radii of i & j atom C fdis....lenght of bond of i atom in i-j bond */ ibn = (int*) malloc (sizeof(int) * (natoms+1)); /* determine "nbonds" */ DetNBonds(&nsplit); /* this routine returns also an overestimated "nbonds" */ max_ibn = nsplit * MAX_BONDS; { int nb1 = nbonds+1; natbond = (int *) calloc(nb1, sizeof(int)); sqnbond = (int *) calloc(nb1, sizeof(int)); bondend = (int *) calloc(nb1, sizeof(int)); /* first end of a bond */ xbond = (double *) calloc(nb1, sizeof(double)); ybond = (double *) calloc(nb1, sizeof(double)); zbond = (double *) calloc(nb1, sizeof(double)); /* second end of a bond */ xbond2 = (double *) calloc(nb1, sizeof(double)); ybond2 = (double *) calloc(nb1, sizeof(double)); zbond2 = (double *) calloc(nb1, sizeof(double)); } for(i = 1; i <= natoms; i++) ibn[i]=0; /* make bonds & also determine if additional spliting is needed */ for(i = 1; i <= natoms - 1 ; i++) { /* don't make a bond for dummy X-atom */ if (nat[i] == 0) continue; for(j = i + 1; j <= natoms; j++) { /* don't make a bond for dummy X-atom */ if (nat[j] == 0) continue; /* calculate distance between two atoms */ dis = dist6(xat[i], xat[j], yat[i], yat[j], zat[i], zat[j]); /*printf("ReadStructFile> dis = %f !!! \n", dis); fflush(stdout); */ if ( dis < MINDIS ) { if ( dis < MINTOL ) fprintf(stderr,"WARNING: Atom %d and atom %d overlap !!!\n",i,j); else fprintf(stderr, "WARNING: Atom %d and atom %d are very close !!!\n",i,j); continue; } len = rcov[nat[i]] + rcov[*(nat + j)]; /*printf("ReadStructFile> len = %f !!! \n", len); fflush(stdout);*/ if ( dis < len ) { for(k = 0; k < nsplit; k++) { /* only BONDs to ATOM i */ ++ibn[i]; if ( ibn[i] < max_ibn ) { ++numb; /* FIRST END OF A BOND */ *(bondend + numb) = BOND_ATOM_TO_MIDBOND; fdis = rcov[nat[i]] / (len * (double) nsplit); xbond[numb] = xat[i] + (double) k * fdis * (xat[j] - xat[i]); ybond[numb] = yat[i] + (double) k * fdis * (yat[j] - yat[i]); zbond[numb] = zat[i] + (double) k * fdis * (zat[j] - zat[i]); /* this is needed for -O3 compilation option (don't ask me why !!!) */ if ( isnan(xbond[numb]) ) { xbond[numb]=xat[i] + (double) k * fdis * (xat[j] - xat[i]); } if ( isnan(ybond[numb]) ) { ybond[numb]=yat[i] + (double) k * fdis * (yat[j] - yat[i]); } if ( isnan(zbond[numb]) ) { zbond[numb]=zat[i] + (double) k * fdis * (zat[j] - zat[i]); } /* SECOND END OF A BOND */ xbond2[numb] = xat[i] + (double) (k + 1) * fdis * (xat[j] - xat[i]); ybond2[numb] = yat[i] + (double) (k + 1) * fdis * (yat[j] - yat[i]); zbond2[numb] = zat[i] + (double) (k + 1) * fdis * (zat[j] - zat[i]); /* this is needed for -O3 compilation option (don't ask me why !!!) */ if ( isnan(xbond2[numb]) ) { xbond2[numb]=xat[i] + (double) (k+1) * fdis * (xat[j] - xat[i]); } if ( isnan(ybond2[numb]) ) { ybond2[numb]=yat[i] + (double) (k+1) * fdis * (yat[j] - yat[i]); } if ( isnan(zbond2[numb]) ) { zbond2[numb]=zat[i] + (double) (k+1) * fdis * (zat[j] - zat[i]); } /* instead of color a 'bnat' will be assigned !!! */ *(natbond + numb) = nat[i]; *(sqnbond + numb) = i; /* zbmid == middle Z - comp of bond */ /**(zbmid + numb) = 0.5 * (zbond[numb] + zbond2[numb]);*/ } /* only BONDs to ATOM j */ ++ibn[j]; if ( ibn[j] < max_ibn ) { ++numb; /* FIRST END OF A BOND */ *(bondend + numb) = BOND_MIDBOND_TO_ATOM; fdis = rcov[*(nat + j)] / (len * nsplit); xbond2[numb] = xat[j] + (double) k * fdis * (xat[i] - xat[j]); ybond2[numb] = yat[j] + (double) k * fdis * (yat[i] - yat[j]); zbond2[numb] = zat[j] + (double) k * fdis * (zat[i] - zat[j]); /* this is needed for -O3 compilation option (don't ask me why !!!) */ if ( isnan(xbond2[numb]) ) { xbond2[numb]=xat[j] + (double) k * fdis * (xat[i] - xat[j]); } if ( isnan(ybond2[numb]) ) { ybond2[numb]=yat[j] + (double) k * fdis * (yat[i] - yat[j]); } if ( isnan(zbond2[numb]) ) { zbond2[numb]=zat[j] + (double) k * fdis * (zat[i] - zat[j]); } /* SECOND END OF A BOND */ xbond[numb] = xat[j] + (double) (k + 1) * fdis * (xat[i] - xat[j]); ybond[numb] = yat[j] + (double) (k + 1) * fdis * (yat[i] - yat[j]); zbond[numb] = zat[j] + (double) (k + 1) * fdis * (zat[i] - zat[j]); /* this is needed for -O3 compilation option (don't ask me why !!!) */ if ( isnan(xbond[numb]) ) { xbond[numb]=xat[j] + (double) (k + 1) * fdis * (xat[i] - xat[j]); } if ( isnan(ybond[numb]) ) { ybond[numb]=yat[j] + (double) (k + 1) * fdis * (yat[i] - yat[j]); } if ( isnan(zbond[numb]) ) { zbond[numb]=zat[j] + (double) (k + 1) * fdis * (zat[i] - zat[j]); } /* instead of color a 'bnat' will be assigned !!!!!!!!!*/ *(natbond + numb) = *(nat + j); *(sqnbond + numb) = j; /* zbmid == middle Z - comp of bond */ /**(zbmid + numb) = 0.5 * (zbond[numb] + zbond2[numb]);*/ } } /* for(k=...) */ } /* if (dis < len) */ } /* for(j=...) */ } /* ---- ASSIGN NBONDS ---- */ nbonds = numb; free(ibn); } /* ---- malloc coor & things that go nearby ---- */ void MallocCoor(void) { int maxobj; maxobj = nobjects + N_SELECT_OBJ + 1; /* allocate memory for *coor */ coor = (AtomBond *) malloc( sizeof(AtomBond) * maxobj); zorient = (double *) malloc( sizeof(double) * maxobj); iwksp = (int *) malloc( sizeof(int) * maxobj); /* allocate also memory for BondFrame3D coor3D */ coor3D = (BondFrame3D *) malloc( sizeof(BondFrame3D) * (nbonds + nframes + 1) ); } /* ========================================================================= */ /* READ XCRYSDEN STRUCTURE FILE */ /* ========================================================================= */ int ReadXSF(FILE *fp) { FILE *gridFP; int c; int latom = 0, lframe = 0, lend = 0; int n, idummy; long int atompos = 0; /* position where atom coor starts in the file */ long int framepos = 0; /* position where frame coor starts in the file */ size_t linesize=256; static char *line = 0; if (line==0) { line = malloc( sizeof(char) * linesize ); } while((c = fscanf(fp,"%s\n",line)) != EOF) { lend = 0; /* if # (comment character -- ignore line) */ if ( strncmp(line,"#",1) == 0) { /* read the rest of the line */ fscanf(fp,"%[^\n]",line); continue; } /* if INFO */ if ( strncmp(line,"INFO",4) == 0 || strncmp(line,"BEGIN_INFO", 8) == 0) { char word[80]; latom = 0; lframe = 0; lend = 1; do { fscanf(fp,"%s\n",line); if ( strncmp(line,"title",5) == 0 ) { /* this is dummy, but allowed in order to allow user specified some title/comment for him-self */ ; } else if ( strncmp(line,"nunit",5) == 0 ) { n = fscanf(fp,"%d %d %d", &xcr.nunit[0], &xcr.nunit[1], &xcr.nunit[2]); if ( n != 3 ) { fprintf(stderr, "error parsing INFO.nunit "); return XC_ERROR; } } else if ( strncmp(line,"shape",5) == 0 ) { if ( (n = fscanf(fp,"%s", word)) != 1 ) { fprintf(stderr, "error parsing INFO.shape "); return XC_ERROR; } if ( strncmp(word,"para",4) == 0 ) xcr.shape = XCR_PARAPIPEDAL; else if ( strncmp(word,"hexa",4) == 0 ) xcr.shape = XCR_HEXAGONAL; else { fprintf(stderr, "error parsing INFO.shape value "); return XC_ERROR; } } else if ( strncmp(line,"unit",4) == 0 ) { if ( (n = fscanf(fp,"%s", word)) != 1 ) { fprintf(stderr, "error parsing INFO.unit "); return XC_ERROR; } if ( strncmp(word,"cell",4) == 0 ) xcr.shape = XCR_CELL; else if ( strncmp(word,"tr_a",4) == 0 ) xcr.shape = XCR_TR_ASYM; else { fprintf(stderr, "error parsing INFO.unit section "); return XC_ERROR; } } else if ( strncmp(line,"celltype",8) == 0 ) { if ( (n = fscanf(fp,"%s", word)) != 1 ) { fprintf(stderr, "error parsing INFO.celltype "); return XC_ERROR; } if ( strncmp(word,"prim",4) == 0 ) /* primitiv cell; "primcell" */ xcr.celltype = XCR_PRIMCELL; else if ( strncmp(word,"conv",4) == 0 ) /* "convcell" */ xcr.celltype = XCR_CONVCELL; else { fprintf(stderr, "error parsing INFO.celltype section "); return XC_ERROR; } } else if ( strncmp(line,"#",1) == 0 ) { /* comment inside INFO record; read the rest of the line */ fscanf(fp,"%[^\n]",line); } else if ( strncmp(line, "Fermi", 5) == 0 ) { /* this is used in BXSF for reading the fermi energy; read the rest of the line */ fscanf(fp,"%[^\n]",line); } else if ( strncmp(line,"END_INFO",8) == 0 || strncmp(line,"INFO_END",8) == 0) { ; } else { fprintf(stderr, "error parsing INFO section "); return XC_ERROR; } } while( strncmp(line,"END_INFO",8) != 0 && strncmp(line,"INFO_END",8) != 0 ); } /* if DIM-GROUP */ else if ( strncmp(line,"DIM",3) == 0 ) { latom = 0; lframe = 0; /* read dimensionality and group of structure */ n = fscanf(fp,"%d %d", &xcr.dim, &xcr.groupn); if ( n != 2 ) { fprintf(stderr, "ERROR: Error reading DIM-GROUP section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } if ( xcr.dim < 0 || xcr.dim > 3 ) { fprintf(stderr, "ERROR: DIM is out of range, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } xcr.ldimgroup = 1; } /* MOLECULE */ else if ( strncmp(line,"MOLECULE",8) == 0 ) { /* do nothing */ latom = 0; lframe = 0; } /* POLYMER */ else if ( strncmp(line,"POLYMER",7) == 0 ) { latom = 0; lframe = 0; xcr.dim = 1; xcr.groupn = 1; xcr.ldimgroup = 1; } /* SLAB */ else if ( strncmp(line,"SLAB",4) == 0 ) { latom = 0; lframe = 0; xcr.dim = 2; xcr.groupn = 1; xcr.ldimgroup = 1; } /* CRYSTAL */ else if ( strncmp(line,"CRYSTAL",7) == 0 ) { latom = 0; lframe = 0; xcr.dim = 3; xcr.groupn = 1; xcr.ldimgroup = 1; } /* if PRIMVEC */ else if ( strncmp(line,"PRIMV",5) == 0 ) { latom = 0; lframe = 0; if ( !ReadVec( fp, vec.prim ) ) { fprintf(stderr, "ERROR: Error reading PRIMVEC section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } /* we have read the primitive vectors, so xcr.lprimvec must be set to 1 */ xcr.lprimvec = 1; } /* if CONVVEC */ else if ( strncmp(line,"CONVV",5) == 0 ) { latom = 0; lframe = 0; if ( !ReadVec( fp, vec.conv ) ) { fprintf(stderr, "ERROR: Error reading CONVVEC section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } xcr.lconvvec = 1; } /* if RECIP-PRIMVEC */ else if ( strncmp(line,"RECIP-PRIMV",11) == 0 ) { latom = 0; lframe = 0; if ( !ReadVec( fp, vec.recprim ) ) { fprintf(stderr, "ERROR: Error reading RECIP-PRIMVEC section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } /* we have read the primitive vectors, so xcr.lprimvec must be set to 1 */ xcr.lrecprimvec = 1; } /* if RECIP-CONVVEC */ else if ( strncmp(line,"RECIP-CONVV",11) == 0 ) { latom = 0; lframe = 0; if ( !ReadVec( fp, vec.recconv ) ) { fprintf(stderr, "ERROR: Error reading RECIP-CONVVEC section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } xcr.lrecconvvec = 1; } /* if WIGNER-SEITZ-PRIMCELL */ else if ( strncmp(line,"WIGNER-SEITZ-PRIMCELL",21) == 0 ) { latom = 0; lframe = 0; if ( ReadVoronoi(fp, wsp.poly, wsp.norm, wsp.nvert, &(wsp.max), &(xcr.lprimwigner), &wsp.npoly) == XC_ERROR ) { fprintf(stderr, "error parsing WIGNER-SEITZ-PRIMCELL "); return XC_ERROR; } } /* if WIGNER-SEITZ-CONVCELL */ else if ( strncmp(line,"WIGNER-SEITZ-CONVCELL",21) == 0 ) { latom = 0; lframe = 0; if ( ReadVoronoi(fp, wsc.poly, wsc.norm, wsc.nvert, &(wsc.max), &(xcr.lconvwigner), &wsc.npoly) == XC_ERROR ) { fprintf(stderr, "error parsing WIGNER-SEITZ-CONVCELL "); return XC_ERROR; } } /* if BRILLOUIN-ZONE-PRIMCELL */ else if ( strncmp(line,"BRILLOUIN-ZONE-PRIMCELL",23) == 0 ) { latom = 0; lframe = 0; if ( ReadVoronoi(fp, bz[BZ_PRIMCELL].poly, bz[BZ_PRIMCELL].norm, bz[BZ_PRIMCELL].nvert, &(bz[BZ_PRIMCELL].max), &(xcr.lprimbz), &(bz[BZ_PRIMCELL].npoly)) == XC_ERROR ) { fprintf(stderr, "error parsing BRILLOUIN-ZONE-PRIMCELL "); return XC_ERROR; } } /* if BRILLOUIN-ZONE-CONVCELL */ else if ( strncmp(line,"BRILLOUIN-ZONE-CONVCELL",23) == 0 ) { latom = 0; lframe = 0; if ( ReadVoronoi(fp, bz[BZ_CONVCELL].poly, bz[BZ_CONVCELL].norm, bz[BZ_CONVCELL].nvert, &(bz[BZ_CONVCELL].max), &(xcr.lconvbz), &(bz[BZ_CONVCELL].npoly)) == XC_ERROR ) { fprintf(stderr, "error parsing BRILLOUIN-ZONE-CONVCELL "); return XC_ERROR; } } /* if PRIMCOORD */ else if ( strncmp(line,"PRIMC",5) == 0 ) { latom = 0; lframe = 0; n = fscanf(fp,"%d %d", &xcr.natr, &idummy); if ( n != 2 ) { fprintf(stderr, "ERROR: Error reading PRIMCOORD section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } ToEndLine(fp); fprintf(stderr,"reading PRIMCOORD\n"); if ( ReadCoor( fp, xcr.natr, 1, XCR_PRIMCELL ) == XC_ERROR ) { /*xcFree((void*)line);*/ fprintf(stderr, "error parsing PRIMCOORD "); return XC_ERROR; } lend = 1; xcr.lprimcoor = 1; } /* if CONVCOORD */ else if ( strncmp(line,"CONVC",5) == 0 ) { latom = 0; lframe = 0; n = fscanf(fp,"%d %d", &xcr.natr, &xcr.ncell); if ( n != 2 ) { fprintf(stderr, "ERROR: Error reading CONVCOORD section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } ToEndLine(fp); fprintf(stderr,"reading CONVCOORD\n"); if ( ReadCoor( fp, xcr.natr, xcr.ncell, XCR_CONVCELL ) == XC_ERROR ) { /*xcFree((void*)line);*/ fprintf(stderr, "error parsing CONVCOORD "); return XC_ERROR; } lend = 1; xcr.lconvcoor = 1; } /* if ATOM */ else if ( strncmp(line,"ATOM",4) == 0 ) { /* remember position */ atompos = ftell(fp); latom = 1; lframe = 0; } /* if FRAME */ else if ( strncmp(line,"FRAM",4) == 0 ) { /* remember position */ framepos = ftell(fp); latom = 0; lframe = 1; } /* VECTORS3D */ /* else if ( strncmp(line,"VECTORS3D", 14) == 0 ) { */ /* latom = 0; */ /* lframe = 0; */ /* if ( (n = fscanf(fp, "%d", &nvectors)) != 1 ) { */ /* fprintf(stderr, */ /* "ERROR: Error reading VECTORS3D section, while reading "); */ /* xcFree((void*)line); */ /* return XC_ERROR; */ /* } */ /* ReadVectors3D (fp, nvectors); */ /* } */ /* read 2D DATAGRID */ else if ( strncmp(line, "BEGIN_BLOCK_DATAGRID2D", 22) == 0 || strncmp(line, "BEGIN_BLOCK_DATAGRID_2D", 23) == 0 ) { latom = 0; /* prevent counting of atoms and frames */ lframe = 0; lend = 1; /* read comment line */ if ( (c = fscanf(fp, LINE_FMT, line)) == EOF) { fprintf(stderr, "error parsing BLOCK_DATAGRID2D section (#1) "); return XC_ERROR; } SetDataGridCommentLine( line ); gridFP = MaybeOpenDataGridFile("w"); NewGridList( DATAGRID_2D, gridFP ); /* read DATAGRID_2D_XXX line */ if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "error parsing BLOCK_DATAGRID_2D section (#2) "); return XC_ERROR; } while (strncmp(line, "END_BLOCK_DATAGRID2D", 20) != 0 && strncmp(line, "END_BLOCK_DATAGRID_2D", 21) != 0 ) { if ( strncmp(line, "DATAGRID_2D_", 12) == 0 || strncmp(line, "DATAGRID2D_", 11) == 0 || strncmp(line, "BEGIN_DATAGRID_2D", 17) == 0 ) { if ( ReadDataGrid( fp, gridFP, DATAGRID_2D, line) == XC_ERROR ) { fprintf(stderr, "ERROR: Error reading DATAGRID_2D_ section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } /* read END_DATAGRID_2D line */ breakpoint("breakpoint"); if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "error parsing BLOCK_DATAGRID_2D section (#3) "); return XC_ERROR; } if ( strncmp(line, "END_DATAGRID_2D", 15) != 0 && strncmp(line, "END_DATAGRID2D", 14) != 0 ) { fprintf(stderr, "expecting END_DATAGRID_2D keyword, but it wasn't found "); return XC_ERROR; } } else { fprintf(stderr, "error parsing BLOCK_DATAGRID_2D section (#4) "); return XC_ERROR; } /* read next line */ if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "premature end of file in BLOCK_DATAGRID_2D section "); return XC_ERROR; } } xcr.ldatagrid2D = 1; } /* read 3D DATAGRID */ else if ( strncmp(line, "BEGIN_BLOCK_DATAGRID3D", 22) == 0 || strncmp(line, "BEGIN_BLOCK_DATAGRID_3D", 23) == 0) { latom = 0; /* prevent counting of atoms and frames */ lframe = 0; lend = 1; /* read comment line */ if ( (c = fscanf(fp, LINE_FMT, line)) == EOF) { fprintf(stderr, "premature end of file in BLOCK_DATAGRID_3D section "); return XC_ERROR; } SetDataGridCommentLine( line ); gridFP = MaybeOpenDataGridFile("w"); NewGridList( DATAGRID_3D, gridFP ); /* read DATAGRID_3D_XXX line */ if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "premature end of file in BLOCK_DATAGRID_3D section "); return XC_ERROR; } while (strncmp(line, "END_BLOCK_DATAGRID3D", 20) != 0 && strncmp(line, "END_BLOCK_DATAGRID_3D", 21) != 0) { if ( strncmp(line, "DATAGRID_3D_", 12) == 0 || strncmp(line, "DATAGRID3D_", 11) == 0 || strncmp(line, "BEGIN_DATAGRID_3D", 17) == 0 ) { if ( ReadDataGrid( fp, gridFP, DATAGRID_3D, line) == XC_ERROR ) { fprintf(stderr, "ERROR: Error reading DATAGRID_3D_ section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } /* read END_DATAGRID_3D line */ breakpoint("breakpoint"); if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "premature end of file in BLOCK_DATAGRID_3D section "); return XC_ERROR; } if ( strncmp(line, "END_DATAGRID_3D", 15) != 0 && strncmp(line, "END_DATAGRID3D", 14) != 0 ) { fprintf(stderr, "expecting END_DATAGRID_3D keyword, but it wasn't found "); return XC_ERROR; } } else { fprintf(stderr, "error parsing BLOCK_DATAGRID_3D section "); return XC_ERROR; } /* read next line */ if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "premature end of file in BLOCK_DATAGRID_3D section "); return XC_ERROR; } } xcr.ldatagrid3D = 1; } /*************************************************************************/ /* read 3D BANDGRID */ /*************************************************************************/ else if ( strncmp(line, "BEGIN_BLOCK_BANDGRID3D", 22) == 0 || strncmp(line, "BEGIN_BLOCK_BANDGRID_3D", 22) == 0) { latom = 0; /* prevent counting of atoms and frames */ lframe = 0; lend = 1; /* read comment line */ if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "premature end of file in BLOCK_BANDGRID_3D"); return XC_ERROR; } SetDataGridCommentLine( line ); gridFP = MaybeOpenDataGridFile("w"); NewGridList( DATAGRID_3D, gridFP ); /* read DATAGRID_3D_XXX line */ if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "premature end of file in BLOCK_BANDGRID_3D"); return XC_ERROR; } while (strncmp(line, "END_BLOCK_BANDGRID3D", 15) != 0 && strncmp(line, "END_BLOCK_BANDGRID_3D", 16) != 0) { if ( strncmp(line, "BANDGRID_3D", 11) == 0 || strncmp(line, "BEGIN_BANDGRID_3D", 17) == 0 || strncmp(line, "BANDGRID3D", 10) == 0 ) { if ( ReadBandGrid( fp, gridFP, DATAGRID_3D, line) == XC_ERROR ) { fprintf(stderr, "ERROR: Error reading BANDGRID_3D_ section, while reading "); /*xcFree((void*)line);*/ return XC_ERROR; } /* read END_DATAGRID_3D line */ /*breakpoint("breakpoint");*/ if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "premature end of file in BLOCK_BANDGRID_3D"); return XC_ERROR; } if (strncmp(line, "END_BANDGRID_3D", 15) != 0 && strncmp(line, "END_BANDGRID3D", 14) != 0) { fprintf(stderr, "expecting END_BANDGRID_3D keyword, but it wasn't found "); return XC_ERROR; } } else { fprintf(stderr, "error parsing END_BANDGRID_3D section "); return XC_ERROR; } /* read next line */ if ( (c = fscanf(fp,"%s\n",line)) == EOF) { fprintf(stderr, "premature end of file in BLOCK_BANDGRID_3D"); return XC_ERROR; } } xcr.lbandgrid3D = 1; } /*************************************************************************/ if ( latom ) ++natoms; if ( lframe ) ++nframes; if ( !lend ) while((c = getc(fp)) != '\n' && c != EOF) ; } /* if datagrid file was opended, close it */ CloseDataGridFile(); /* generate prim_fcoor and conv_fcoor (i.e. fractional coordinates) */ if ( xcr.lrecprimvec && xcr.lprimcoor ) { double a, b, c; register int i; xcr.prim_fcoor = (double (*)[3]) realloc(xcr.prim_fcoor,(size_t)xcr.natr * sizeof(double [3])); for (i=0; i 0 ) if (!ReadAtoms( fp, atompos )) { fprintf(stderr, "error reading Atoms "); return XC_ERROR; } /* if nframes > 0 also read frames */ if ( nframes > 0 ) if (!ReadFrames( fp, framepos )) { fprintf(stderr, "error reading Frames "); return XC_ERROR; } /*xcFree((void*)line);*/ current_file_format = FORMAT_XSF; return XC_OK; } int ReadVec(FILE *fp, double vec[][4]) { int n0, n1, n2; /* LoadIdentity( vec ); */ /* lets read vectors in ROW-MAJOR mode */ n0 = fscanf(fp,"%lf %lf %lf",&vec[0][0], &vec[0][1], &vec[0][2]); n1 = fscanf(fp,"%lf %lf %lf",&vec[1][0], &vec[1][1], &vec[1][2]); n2 = fscanf(fp,"%lf %lf %lf",&vec[2][0], &vec[2][1], &vec[2][2]); if ( n0 == 3 && n1 == 3 && n2 == 3 ) return XC_OK; else { fprintf(stderr, "error reading lattice vectors "); return XC_ERROR; } } /* read PRIMCOORD/CONVCOORD */ static int ReadCoor( FILE *fp, int natr, int ncell, const int celltype ) { int i, n, size; size_t linesize=256; double (*coor)[3], (*forc)[3]; int *atn; static char *line = 0; if (line==0) { line = malloc(sizeof(char)*linesize); } /* natr -- number of atoms in prim. cell */ /* ncell -- number of particle per cell (FC=4, RC=3) */ size = natr * ncell; if ( celltype == XCR_PRIMCELL ) { coor = (double (*)[3]) realloc(xcr.prim_coor,(size_t)size * sizeof(double [3])); forc = (double (*)[3]) realloc(xcr.prim_forc,(size_t)size * sizeof(double [3])); atn = (int *) realloc(xcr.prim_nat,(size_t)size * sizeof(int)); } else if ( celltype == XCR_CONVCELL ) { /* BEWARE: for the time being we never use the conv_coor, hence we will read conv_coor into conv_fcoor and transform them later to fractional coordinates !!! */ coor = (double (*)[3]) realloc(xcr.conv_fcoor,(size_t)size * sizeof(double [3])); atn = (int *) realloc(xcr.conv_nat,(size_t)size * sizeof(int)); } for(i=0; i MAXNAT ) { *fprintf(stderr,"WARNING: Atomic number greater then %d !!! File: ", *MAXNAT); *return XC_ERROR; *} */ } /* if two atoms overlap, than we will have troubles when making bonds; * if two atoms are to close just disregard one of them */ ndel=0; for(i = 1; i<= natoms - 1; i++) { if ( nat1[i] == 0 ) continue; /* dummy atom */ if (*(flag1 + i)) { for(j = i + 1; j <= natoms; j++) { if ( flag1[j] == 0 ) continue; /* atom already deleted */ if ( nat1[j] == 0 ) continue; /* dummy atom */ dis = dist6(xat1[i], *(xat1 + j), yat1[i], *(yat1 + j), zat1[i], *(zat1 + j)); if ( dis < MINDIS ) { if ( dis < MINTOL ) fprintf(stderr,"WARNING: Atom %d and atom %d overlap !!!",i,j); else fprintf(stderr, "WARNING: Atom %d and atom %d are very close !!!",i,j); fprintf(stderr," Atom %d deleted !!!\n",j); ++ndel; *(flag1 + j) = 0; } } } } fprintf(stderr,"natoms: %d , ndel: %d\n", natoms, ndel); fprintf(stderr,"Filtered number of atoms: %d\n", natoms-ndel); /* allocate memory for NAT,X,Y,Z */ sizeIA = sizeof(int) * (natoms - ndel + 1); sizeDA = sizeof(double) * (natoms - ndel + 1); nat = (int *) malloc(sizeIA); xat = (double *) malloc(sizeDA); yat = (double *) malloc(sizeDA); zat = (double *) malloc(sizeDA); /*fv = (double (*)[3]) malloc((size_t) (sizeDA * 3));*/ fv = (double (*)[3]) xcCalloc((size_t) (natoms - ndel + 1), sizeof(double [3]) ); /* TODO: this should be reallocated, but then we need to feed in the zeroes, make a routine that will do that */ xcReallocAtomLabels(); /* for(i=0; i max.r) max.r = atrad[atm.atomkind[i]]; */ /* /\* this is too simple *\/ */ /* max.r = 1.5; */ /* } */ max.r = 0.0; for(i=0; i max.r) max.r = rvdw[atm.atomkind[i]]; if (rcov[atm.atomkind[i]] > max.r) max.r = rcov[atm.atomkind[i]]; } } /* maybe we do not have crystal & some vectors that were just * read are meaningless, coorect it by the size of the strucure */ static void CorrectVectors( double vec[][4], int dim ) { if ( dim <= 2 ) { vec[2][0] = 0.0; vec[2][1] = 0.0; vec[2][2] = max.z; if (abs(max.z) < MINTOL) vec[2][2] = 1.0; } if ( dim <= 1 ) { vec[1][0] = 0.0; vec[1][1] = max.y; vec[1][2] = 0.0; if (abs(max.y) < MINTOL) vec[1][1] = 1.0; } if ( dim == 0 ) { vec[0][0] = max.x; vec[0][1] = 0.0; vec[0][2] = 0.0; if (abs(max.x) < MINTOL) vec[0][0] = 1.0; } } static int ReadPDB(FILE *fp) { int i, sizeIA, sizeDA; int *nat1, *flag1; double *xat1, *yat1, *zat1, (*fv1)[3]; char line[256]; natoms = 0; /* the file will have to be readed twice, first time just count # of atoms */ while ( fgets(line, sizeof(line), fp) != NULL ) { if ( strncmp(line, "ATOM", 4) == 0 || strncmp(line, "HETATM", 6) == 0) { /* ATOM section */ natoms++; } } rewind(fp); /* malloc here */ sizeIA = sizeof(int) * (natoms + 1); sizeDA = sizeof(double) * (natoms + 1); nat1 = (int *) malloc(sizeIA); flag1 = (int *) malloc(sizeIA); xat1 = (double *) malloc(sizeDA); yat1 = (double *) malloc(sizeDA); zat1 = (double *) malloc(sizeDA); /* fv1 dummy so far !!! */ fv1 = (double (*)[3]) malloc( sizeof(double [3]) ); i=0; while ( fgets(line, sizeof(line), fp) != NULL ) { if ( strncmp(line, "ATOM", 4) == 0 ) { i++; *(flag1 + i) = 1; parsePDBAtomRecord(line, nat1 + i, xat1 + i, yat1 + i, zat1 + i); } else if ( strncmp(line, "HETATM", 6) == 0 ) { i++; *(flag1 + i) = 1; parsePDBHetatmRecord(line, nat1 + i, xat1 + i, yat1 + i, zat1 + i); } } CheckAtoms(flag1, nat1, xat1, yat1, zat1, fv1 ); current_file_format = FORMAT_PDB; return XC_OK; } static int ReadXYZ(FILE *fp) { int n, na, i, j, sizeIA, sizeDA; int *nat1, *flag1; double *xat1, *yat1, *zat1, qc, (*fv1)[3]; char atmn[80]; char line[256]; /* read first line; number of atoms */ if ( fgets(line, sizeof(line), fp) == NULL ) { fprintf(stderr, "ERROR unexpected end of file; while reading file "); return XC_ERROR; } sscanf(line, "%d", &na); if ( na < 1 ) { fprintf(stderr, "number of atoms lower then one !!!; ERROR reding file "); return XC_ERROR; } else { natoms = na; } /* read comment */ if ( fgets(line, sizeof(line), fp) == NULL ) { fprintf(stderr, "ERROR while reading file; unexpected end of file "); return XC_ERROR; } /* malloc here */ sizeIA = sizeof(int) * (natoms + 1); sizeDA = sizeof(double) * (natoms + 1); nat1 = (int *) malloc(sizeIA); flag1 = (int *) malloc(sizeIA); xat1 = (double *) malloc(sizeDA); yat1 = (double *) malloc(sizeDA); zat1 = (double *) malloc(sizeDA); fv1 = (double (*)[3]) malloc( sizeof(double [3]) * (natoms + 1) ); for(i=1; i<=natoms; i++) { *(flag1 + i) = 1; if ( fgets(line, sizeof(line), fp) == NULL ) { fprintf(stderr, "ERROR while reading file; unexpected end of file "); return XC_ERROR; } if ( (n = sscanf(line,"%s %lf %lf %lf %lf %lf %lf %lf\n", atmn, &xat1[i], &yat1[i], &zat1[i], &qc, &fv1[i][0], &fv1[i][1], &fv1[i][2])) < 4 ) { fprintf(stderr, "ERROR while XYZ reading file !!!"); xcFree((void*) nat1); xcFree((void*) xat1); xcFree((void*) yat1); xcFree((void*) zat1); xcFree((void*) flag1); return XC_ERROR; } if (n==7) xcr.lforce=1; /* parse atomic name */ ParseAtomName(atmn); /* find atomic number */ nat1[i]=100; /* if atomic number will not be found, 100 will be used */ for(j=0; j<=100; j++) { if ( strcmp(element[j], atmn) == 0 ) nat1[i] = j; } } CheckAtoms(flag1, nat1, xat1, yat1, zat1, fv1 ); current_file_format = FORMAT_XYZ; return XC_OK; } /* static void StringTrailLeftWhiteSpaces(char *str, size_t size) { register int i, ii, left=1; char *name = (char *) malloc( sizeof(char) * size ); strncpy(name, str, size); for (i=0, ii=0; i ATOM = %s\n", atmn);*/ /*StringTrailLeftWhiteSpaces(atmn,2);*/ /*ParseAtomName(atmn);*/ /* find atomic number */ *n=100; /* if atomic number will not be found, 100 will be used */ for(j=0; j<=100; j++) { if ( strcmp(element[j], atmn) == 0 ) { *n = j; break; } } /* X coor */ strncpy(coor, line + 30, 8); sscanf(coor, "%lf", x); /* X coor */ strncpy(coor, line + 38, 8); sscanf(coor, "%lf", y); /* X coor */ strncpy(coor, line + 46, 8); sscanf(coor, "%lf", z); /*fprintf(stderr,"PDB> Coords = %f %f %f\n", *x, *y, *z);*/ } /* ------------------------------------------------------------------------ */ static void parsePDBHetatmRecord(char *line, int *n, double *x, double *y, double *z) { register int j; char coor[10]; char atmn[3], resn[4]; char _atmn[3], *__atmn; __atmn = _atmn; sscanf(line, "%*6s%*5i%*1c%1c%1c%*3s%3s", &__atmn[0], &__atmn[1], resn); __atmn[2] = '\0'; if ( strncmp(resn, " ", 3) == 0 ) strncpy(resn, "UNK\0", 4); /* This is the BABEL recipe: * 1. if there is no residue name then we assume the atom label is * the name of the element. * 2. if the residue name and the atom label are the same then we * will assume that the atom label is the name of the element. * 3. generally, if there is a letter in the first column then the * atom label represents an element with a 2 letter element name. * The exceptions so far to this is when the residue name is * ADR, COA, FAD, GPG, NAD, NAL or NDP. In these cases there is a * letter in the first column and the second letter is the element * name. */ if ( !strncmp ( resn, "ADR", 3 ) || !strncmp ( resn, "COA", 3 ) || !strncmp ( resn, "FAD", 3 ) || !strncmp ( resn, "GPG", 3 ) || !strncmp ( resn, "NAD", 3 ) || !strncmp ( resn, "NAL", 3 ) || !strncmp ( resn, "NDP", 3 ) ) { __atmn++; __atmn[1] = '\0'; } else if (isdigit(__atmn[0])) { __atmn++; __atmn[1] = '\0'; } else if (__atmn[0] != ' ') { __atmn[2] = '\0'; if (isalpha(__atmn[1]) && isupper(__atmn[1])) __atmn[1] = tolower(__atmn[1]); } else { if ( __atmn[0] == ' ' ) __atmn[0] = __atmn[1]; __atmn[1] = '\0'; } /*fprintf(stderr,"PDB> HETATM = %s\n", __atmn);*/ strcpy(atmn,__atmn); /* find atomic number */ *n=100; /* if atomic number will not be found, 100 will be used */ for(j=0; j<=100; j++) { if ( strcmp(element[j], atmn) == 0 ) { *n = j; break; } } /* X coor */ strncpy(coor, line + 30, 8); sscanf(coor, "%lf", x); /* X coor */ strncpy(coor, line + 38, 8); sscanf(coor, "%lf", y); /* X coor */ strncpy(coor, line + 46, 8); sscanf(coor, "%lf", z); /*fprintf(stderr,"PDB> Coords = %f %f %f\n", *x, *y, *z);*/ } static void xcReallocAtomLabels(void) { static int natoms_old = 0; if (natoms_old == 0) { natoms_old = natoms; } if ( !atomLabel) { atomLabel = (AtomicLabel*) xcCalloc((natoms + 1), sizeof(AtomicLabel)); do_not_display_atomlabel = (short*) xcCalloc((natoms + 1), sizeof(short)); } else if (natoms_old == 0) { /* something wrong */ xcError(" Something wrong in xcReallocAtomLabels:\n atomLabel already aloccatedm but natoms_old == 0"); } else if ( natoms > natoms_old ){ /* NOTE: if natoms <= natoms_old --> do nothing, there is enought of space, therefore here we only consider natoms > natoms_old !!! */ AtomicLabel *_labels = (AtomicLabel*) xcCalloc((natoms + 1), sizeof(AtomicLabel)); short *_do_not = (short*) xcCalloc((natoms + 1), sizeof(short)); int i; for (i=1; i<=natoms_old; i++) { _labels[i].base = atomLabel[i].base; _labels[i].width = atomLabel[i].width; _labels[i].height = atomLabel[i].height; _labels[i].do_display = atomLabel[i].do_display; _labels[i].label = atomLabel[i].label; _labels[i].tkfont = atomLabel[i].tkfont; COPY_V(3,_labels[i].bright_color, atomLabel[i].bright_color); COPY_V(3,_labels[i].dark_color, atomLabel[i].dark_color); _do_not[i] = do_not_display_atomlabel[i]; } xcFree((void*)atomLabel); xcFree((void*)do_not_display_atomlabel); atomLabel = _labels; do_not_display_atomlabel = _do_not; /***************/ natoms_old = natoms; /***************/ } } static void ToEndLine(FILE *fp) { int c; while ((c = getc(fp)) != '\n' && c != EOF) { ; } } xcrysden-1.6.2/C/isosurf.c0000644000175000017500000000335211712736221014100 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/isosurf.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include "isosurf.h" ISOSURFACE *iso=NULL, *isoPtr=NULL; ISOSURFACE *FindIsoSurf(int index) { ISOSURFACE *g = isoPtr; while (g) { if (index == g->index) return g; g = g->ptr; } return NULL; } void AddToIsoSurfList(ISOSURFACE *g) { g->ptr = isoPtr; isoPtr = g; } int NewIsoSurf(void) { static int index = -1; iso = (ISOSURFACE *) malloc ( sizeof(ISOSURFACE) ); iso->index=++index; /*---------------*/ iso->triangl_status = NULL; iso->vertex = NULL; iso->vertex_orig = NULL; iso->normal = NULL; iso->color = NULL; iso->tri2verIN = NULL; iso->nver2triIN = NULL; iso->ver2triIN = NULL; AddToIsoSurfList( iso ); return index; } xcrysden-1.6.2/C/molsurf.h0000644000175000017500000000631011717504375014107 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/molsurf.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #ifndef MOLSURF_H #define MOLSURF_H #define MOLS_GAUSSIAN 0 #define MOLS_EXP 1 #define MOLS_UNIGAUSS 2 #define MOLS_UNIEXP 3 #define MOLS_DISTFUNC 4 #define MOLS_FERMISURFACE 10 #define MOLS_COV 0 #define MOLS_VdW 1 #define MOLS_ATOMIC 0 #define MOLS_MONOCHROME 1 #define MOLS_DISTANCE 2 #define MOLS_MOLSURF 0 #define MOLS_GAP 1 typedef struct { short int gridindex, gridsubindex, bandindex, celltype, cropbz; float wirecellcolor[4], solidcellcolor[4]; } FS_DATA; #ifndef XC_CPP_GLPARAM # include "xcGLparam.h" #endif #ifndef ISOSURF_H # include "isosurf.h" #endif struct MOL_SURF_struct { struct MOL_SURF_struct *ptr; int index; /* ----------------------- */ int isosurf_index; /* index for isusurface */ /* ----------------------- */ short int type, colorscheme, surftype; ISO_ATTRIB dispt; /* display types */ LIGHTMODEL lightm; /* lightmodels */ IsoExpand isoexpand; /* periodic attribute for molsurf */ int smooth_nstep; /* # of smothing steps */ float smooth_weight; /* smoothing weight */ int frontface; int revertnormals; double *rad; float isolevel; float d; /* resolution criteria */ int i,j,k; /* grid size */ float lowcoor[3]; /* point with lowest coordinates */ float size[3]; /* size of gridcube */ float cutoff; /* cutoff radius (to determine how big the grid for triangulation must be) */ float r; /* current cnl's radius */ int *atmindex; /* here goes indices of atoms withing cutoff region */ int natm; /* number of atoms that are within cutoff region */ float c[MAXNAT+1]; /* exponent for MolSurfFunc */ float monocolor[4], back_monocolor[4]; float vec[3][3]; float ***molgrid; float (*MolSurfFunc)(struct MOL_SURF_struct *mols, int nat, float dis); /* pointer to MolSurfFunction */ /*---- Fermi-surface ----*/ FS_DATA fs; /*---- interpolation ----*/ float ***interp_molgrid; int interp_n[3]; int tessellation_algorithm; int normals_algorithm; }; typedef struct MOL_SURF_struct MOL_SURF; struct READSURF_OPT { char *option; short int flag; }; #endif xcrysden-1.6.2/C/lcasi.c0000644000175000017500000002014513525475161013507 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/lcasi.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ /* ------------------------------------------------------------------------ * * unsigned-char version of LCASI interpolation * * ------------------------------------------------------------------------ */ #include #include #include "tensor.h" #include "memory.h" static double invL[3][3] = { { 0.5,-1.0, 0.5}, {-0.5, 0.0, 0.5}, { 0.0, 1.0, 0.0} }; static double invR[3][3] = { { 0.5,-1.0, 0.5}, {-1.5, 2.0,-0.5}, { 1.0, 0.0, 0.0} }; /* lcasi.c */ extern void cryError(int status, char *function, char *message); extern unsigned char **cryRegPeriodInterpolator_uc_LCASI2D(int n[2], int degree[2], unsigned char **src); extern void cryRegPeriodInterpolate_uc_LCASI1D(int N, int DEGREE, unsigned char *src, unsigned char *dst); extern void cryRegPeriodInterpolate_uc_LCASI2D(int N1, int N2, int DEGREE1, int DEGREE2, unsigned char **src, unsigned char **dst); /* V = MATRIX .mult. VECTOR */ #define M33_MULT_V3(dst, m, v ) \ do { \ (dst)[0] = (m)[0][0] * (v)[0] + (m)[0][1] * (v)[1] + (m)[0][2] * (v)[2];\ (dst)[1] = (m)[1][0] * (v)[0] + (m)[1][1] * (v)[1] + (m)[1][2] * (v)[2];\ (dst)[2] = (m)[2][0] * (v)[0] + (m)[2][1] * (v)[1] + (m)[2][2] * (v)[2];\ } while(0) void cryError(int status, char *function, char *message) { fprintf(stderr,"\n ==============================================================================\n"); fprintf(stderr, " ERROR: an error has occurred in function %s\n", function); fprintf(stderr, " %s\n", message); fprintf(stderr," ==============================================================================\n\n"); exit(status); } /*! *----------------------------------------------------------------------------- * * cryRegPeriodInterpolator_uc_LCASI2D -- \brief 2D LCASI interpolator * * \description * This function is an object driver for 2D LCASI interpolation on * regular periodic grid. The output grid can only be of * integer-multiple size compared to input grid. The integer degree * interpolation is specified via "degree" input parameter. * * \return * Interpolated 2D regular periodic datagrid. * * \sideeffect * None. * *----------------------------------------------------------------------------- */ unsigned char **cryRegPeriodInterpolator_uc_LCASI2D(int n[2], /*!< number of input points*/ int degree[2], /*!< degree of interp */ unsigned char **src) /*!< INPUT func. values*/ { int n_out[2]; unsigned char **dst; n_out[0] = n[0] * degree[0]; n_out[1] = n[1] * degree[1]; MALLOC_TENSOR2(unsigned char, dst, n_out[0], n_out[1]); cryRegPeriodInterpolate_uc_LCASI2D(n[0], n[1], degree[0], degree[1], src, dst); return dst; } /*! *----------------------------------------------------------------------------- * * cryRegPeriodInterpolate_uc_LCASI1D -- \brief 1D LCASI interpolation routine * * \description * This function performs 2D LCASI interpolation on regular * periodic grid. The output grid can only be of integer-multiple * size compared to input grid. The integer degree interpolation is * specified via "degree" input parameter. * * \return * Nothing. * * \sideeffect * On exit "dst" contains interpolated 1D regular periodic datagrid. * *----------------------------------------------------------------------------- */ void cryRegPeriodInterpolate_uc_LCASI1D(int N, /* number of input points*/ int DEGREE, /*degree of interp */ unsigned char *src,/*INPUT func. values */ unsigned char *dst)/*OUTPUT func. values*/ { /* *dst must be preallocated !!! */ int i, j, ii, point; float x, yL[3], yR[3], abcL[3], abcR[3], wL, wR; if ( dst == NULL ) cryError(1, "cryRegPeriodInterpolate_uc_LCASI1D", "dst pointer is NULL"); /* calculate 1st Left (a,b,c) coefficients */ yL[0] = (float) src[N-1]; yL[1] = (float) src[0]; yL[2] = (float) src[1]; M33_MULT_V3 (abcL, invL, yL); for (i=0; i 255) dst[ii+j] = 255; else if (point < 0 ) dst[ii+j] = 0; else dst[ii+j] = (unsigned char) point; } /* calculate Left (a,b,c) coefficients */ for (j=0; j<3; j++) { if (i+j < N) yL[j] = (float) src[i+j]; else yL[j] = (float) src[i+j - N]; } M33_MULT_V3(abcL, invL, yL); } } /*! *----------------------------------------------------------------------------- * * cryRegPeriodInterpolate_uc_LCASI2D -- \brief 2D LCASI interpolation routine * * \description * This function performs 2D LCASI interpolation on regular * periodic grid. The output grid can only be of integer-multiple * size compared to input grid. The integer degree interpolation is * specified via "degree" input parameter. * * \return * Nothing. * * \sideeffect * On exit "dst" contains interpolated 2D regular periodic datagrid. * *----------------------------------------------------------------------------- */ void cryRegPeriodInterpolate_uc_LCASI2D(int N1, int N2, int DEGREE1, int DEGREE2, unsigned char **src, unsigned char **dst) { int ID1 = DEGREE1; int ID2 = DEGREE2; int IN1 = N1*ID1; int IN2 = N2*ID2; int i1, ii1, ii2, j, point; float x, yL[3], yR[3], abcL[3], abcR[3], wL, wR; /* **dst must be preallocated !!! */ if ( dst == NULL ) cryError(1, "cryRegPeriodInterpolate_uc_LCASI2D", "dst pointer is NULL"); /* * doing the 1st dimension (means: intepolating the 2nd) */ for (i1=0; i1 255) dst[ii1+j][ii2] = 255; else if (point < 0 ) dst[ii1+j][ii2] = 0; else dst[ii1+j][ii2] = (unsigned char) point; } /* calculate Left (a,b,c) coefficients */ for (j=0; j<3; j++) { if (i1+j < N1) yL[j] = (float) dst[ii1+j*ID1][ii2]; else yL[j] = (float) dst[ii1+j*ID1 - IN1][ii2]; } M33_MULT_V3(abcL, invL, yL); } } } xcrysden-1.6.2/C/auxilproc.c0000644000175000017500000002361313522233705014416 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/auxilproc.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include /* FUNCTION PROTOTYPES */ double dist6(double x1, double x2, double y1, double y2, double z1, double z2); double dist3(double x, double y, double z); double distdv(double *vec); int normalizepv(double *x, double *y, double *z); int iround(double x); void Rotate(double *x, double *y, double *z, double cosfi, double sinfi); void xcMat44Copyd( double mat1[][4], double mat2[][4], int n, int m ); /* float version of functions */ int normalizepvf(float *x, float *y, float *z); int normalizepvfv(float *vec); void RevertVectorfv(float *vec); float dist3f(float x, float y, float z); float distfv(float *v); int iroundf(float x); void xcDeleteBitFlags(unsigned int *var, unsigned int flags); void MatVecMult33f(float mat[3][3], float vec[3], float new[3]); void MatMult33f(float a[3][3], float b[3][3], float new[3][3]); void MatCopy33f(float a[3][3], float b[3][3]); void MatToZero33f(float a[3][3]); int IsSamePointvf(float *a, float *b, float limit); int IsEqualf(float a, float b, float limit); int WriteArgv(char *argv[], int *argc, char *fmt, ... ); void VecSum2f(float vec1[], float vec2[], int i, int j, float res[]); void VecSum3f(float vec1[], float vec2[], float vec3[], int i, int j, int k, float res[]); void VecProduct3f(float v0[], float v1[], float res[]); float CramerRule2x2Detf(float d[2][3], int i); void xcRotate3fv( float fi, float *v, float *m, float *p ); double det3x3d(const double *v0, const double *v1, const double *v2); float det3x3f(const float *v0, const float *v1, const float *v2); /* DISTANCE calculate distance between two points in space */ double dist6(double x1, double x2, double y1, double y2, double z1, double z2) { double xij2, yij2, zij2, dis; /*printf("In DIST6%s\n","=DIST6");*/ xij2 = (x2 - x1) * (x2 - x1); yij2 = (y2 - y1) * (y2 - y1); zij2 = (z2 - z1) * (z2 - z1); dis = sqrt(xij2 + yij2 + zij2); return(dis); } /* dist3 = lenght of vector (x,y,z) */ double dist3(double x, double y, double z) { double dis; dis = sqrt(x * x + y * y + z * z); /*printf("dis=%f\n",dis);*/ return(dis); } /* distdv = lenght of 3D vector vec */ double distdv(double *vec) { return( sqrt(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]) ); } /* normalize a vector; pointers must be submited when function is called */ int normalizepv(double *x, double *y, double *z) { double dis; dis = dist3(*x, *y, *z); if ( dis < 1.e-12 ) { fprintf(stderr,"WARNING: zero length vector\n"); return 0; } *x /= dis; *y /= dis; *z /= dis; return 1; } /* custom ROUND FUNCTION */ int iround(double x) { int n, m, mm; n = (int) x; m = 10 * n; mm = (int) ( 10 * x ); if ( mm - m < 5 ) return n; else return n + 1; } /* ROTATION PROC; this is rotation around Z axe */ void Rotate(double *x, double *y, double *z, double cosfi, double sinfi) { double x1, y1; x1 = *x * cosfi + -*y * sinfi; y1 = *x * sinfi + *y * cosfi; *x = x1; *y = y1; } /*****************************************************************************/ /* function copy mat2[][4] to mat1[][4] */ void xcMat44Copyd( double mat1[][4], double mat2[][4], int n, int m ) { int i, j; for ( i=0; i /* hpsort.c */ int hpsort_index(size_t count, const double *data, int *p); int hpsort_index1(size_t count, const double *data, int *p); int hpsort_index_f(size_t count, const float *data, int *p); int hpsort_index1_f(size_t count, const float *data, int *p); #define DOWNHEAP(p, data, N, k) \ do { \ const size_t _pki = p[k]; \ \ while (k <= N / 2) \ { \ size_t _j = 2 * k; \ \ if ( _j < N && data[ p[_j] ] < data[ p[_j + 1] ] ) _j++; \ if (data[ _pki ] >= data[ p[_j] ]) break; \ \ p[k] = p[_j]; \ k = _j; \ } \ \ p[k] = _pki; \ } while(0) /* DOUBLE VERSION of ROUTINES */ int hpsort_index (size_t count, const double *data, int *p) { /* Sort the array in ascending order. This is a true inplace algorithm with N log N operations. Worst case (an already sorted array) is something like 20% slower */ size_t i, k, N, zero; if (count == 0) return 0; /* No data to sort */ for (i = 0; i < count; i++) p[i] = i; /* set permutation to identity */ /* We have n_data elements, last element is at 'n_data-1', first at '0' Set N to the last element number. */ N = count - 1; k = N / 2; k++; /* Compensate the first use of 'k--' */ do { k--; DOWNHEAP (p, data, N, k); } while (k > 0); while (N > 0) { /* first swap the elements */ size_t tmp = p[0]; p[0] = p[N]; p[N] = tmp; /* then process the heap */ N--; zero = 0; DOWNHEAP (p, data, N, zero); } return 0; } int hpsort_index1 (size_t count, const double *data, int *p) { /* Same as hpsort_index, but the array p and data are in range p[1--count], and data[1--count]. BEWARE: this requires the the size of p and data to be at least: p[count+1] && data[count+1] */ size_t i, k, N, one; if (count < 2) { p[1] = 1; return 0; /* No data to sort */ } for (i = 0; i <= count; i++) p[i] = i; /* set permutation to identity */ /* We have n_data elements, last element is at 'n_data-1', first at '0' Set N to the last element number. */ N = count; k = N / 2 + 1; k++; /* Compensate the first use of 'k--' */ do { k--; DOWNHEAP (p, data, N, k); } while (k > 1); while (N > 1) { /* first swap the elements */ size_t tmp = p[1]; p[1] = p[N]; p[N] = tmp; /* then process the heap */ N--; one = 1; DOWNHEAP (p, data, N, one); } return 0; } /* FLOAT VERSION of ROUTINES */ int hpsort_index_f (size_t count, const float *data, int *p) { /* Sort the array in ascending order. This is a true inplace algorithm with N log N operations. Worst case (an already sorted array) is something like 20% slower */ size_t i, k, N, zero; if (count == 0) return 0; /* No data to sort */ for (i = 0; i < count; i++) p[i] = i; /* set permutation to identity */ /* We have n_data elements, last element is at 'n_data-1', first at '0' Set N to the last element number. */ N = count - 1; k = N / 2; k++; /* Compensate the first use of 'k--' */ do { k--; DOWNHEAP (p, data, N, k); } while (k > 0); while (N > 0) { /* first swap the elements */ size_t tmp = p[0]; p[0] = p[N]; p[N] = tmp; /* then process the heap */ N--; zero = 0; DOWNHEAP (p, data, N, zero); } return 0; } int hpsort_index1_f (size_t count, const float *data, int *p) { /* Same as hpsort_index_f, but the array p and data are in range p[1--count], and data[1--count]. BEWARE: this requires the the size of p and data to be at least: p[count+1] && data[count+1] */ size_t i, k, N, one; if (count < 2) { p[1] = 1; return 0; /* No data to sort */ } for (i = 0; i <= count; i++) p[i] = i; /* set permutation to identity */ /* We have n_data elements, last element is at 'n_data-1', first at '0' Set N to the last element number. */ N = count; k = N / 2 + 1; k++; /* Compensate the first use of 'k--' */ do { k--; one = 0; DOWNHEAP (p, data, N, k); } while (k > 1); while (N > 1) { /* first swap the elements */ size_t tmp = p[1]; p[1] = p[N]; p[N] = tmp; /* then process the heap */ N--; one = 1; DOWNHEAP (p, data, N, one); } return 0; } /* int main() { double a[100] = { 3000, 101, 2, 4, 5, 1, 305, 11, 58, 73, 45, 55, 77, 89, 100000, 10 }; int i, N = 12; int index[100]; hpsort_index1 (N, a, index); for (i=1; i #include #include #include "struct.h" #include "bz.h" #include "xcGLparam.h" #include "isosurf.h" #include "molsurf.h" #include "memory.h" extern int iroundf(float x); /* cryClip.c */ extern int ClipSimple(XYZ *p, XYZ n, XYZ p0); extern int ClipSimple3(XYZ *p, float n[3], float p0[3]); extern ISOSURFACE *cryIsosurfClip(ISOSURFACE *in, XYZ n, XYZ p0); /* fs.c */ int fsReadBand(struct DATAGRID *grid, MOL_SURF *mols); void CropBz(NEW_WIN_CONTEXT *wc, ISOSURFACE *iso); void CropBz_New(NEW_WIN_CONTEXT *wc, ISOSURFACE *iso); int fsReadBand(struct DATAGRID *grid, MOL_SURF *mols) { register int i, j, k, ii, jj, kk, i1, j1, k1; float ***bagrid; float frmin[3] = {1.0, 1.0, 1.0}, frmax[3] = {-1.0, -1.0, -1.0}, a; int N[3], Imin[3], Imax[3]; float frImin[3], frImax[3]; bagrid = xcMallocTensor3f(grid->n[0], grid->n[1], grid->n[2]); fseek(grid->fp, grid->band_fpos[ mols->fs.gridsubindex ][ mols->fs.bandindex ], SEEK_SET); for (i=0; in[0]; i++) for (j=0; jn[1]; j++) for (k=0; kn[2]; k++) fread(&(bagrid[i][j][k]), sizeof(float), 1, grid->fp); for (k=0; k<3; k++) N[k]=grid->n[k]-1; fprintf(stderr,"FS:----------------\n"); fprintf(stderr,"FS: N == %d, %d, %d\n", N[0], N[1], N[2]); if ( mols->fs.celltype == XCR_BZ ) { /**********/ /* XCR_BZ */ /**********/ /* query for BZ size then make a box just big enough to hold the whole BZ and then reorder the grid so that it will match the BZ; use E(k) = E(K+k) relation; NO: use vectors from bandgrid not from RECIP-!!! YES: use vectors from RECIP-!!! */ for (i=0; i frmax[k] ) frmax[k] = a; } fprintf(stderr,"FS: frmin == %6.3f, %6.3f, %6.3f\n", frmin[0], frmin[1], frmin[2]); fprintf(stderr,"FS: frmax == %6.3f, %6.3f, %6.3f\n", frmax[0], frmax[1], frmax[2]); for (k=0; k<3; k++) { Imin[k] = (int) (frmin[k] * (float) N[k]) - 1; Imax[k] = (int) (frmax[k] * (float) N[k]) + 1; fprintf(stderr,"FS: min[%d] = %6.3f ; max[%d] = %6.3f\n", k, frmin[k] * (float) N[k], k, frmax[k] * (float) N[k]); /* prevent crash due to roundoff error */ if (Imin[k] < -N[k]) Imin[k] = -N[k]; if (Imax[k] > N[k]) Imax[k] = N[k]; /* WARNING: the Imin/Imax must be -+N[k] as long as we don't have a non-periodic LCASI interpolation. Setting Imin/Imax to -+N[k] assures the grid is periodic, otherwise with the really minimal Imin/Imax it is not !!! */ Imin[k] = -N[k]; Imax[k] = +N[k]; frImin[k] = (float) Imin[k] / N[k]; frImax[k] = (float) Imax[k] / N[k]; } fprintf(stderr,"FS: Imin == %d, %d, %d\n", Imin[0], Imin[1], Imin[2]); fprintf(stderr,"FS: Imax == %d, %d, %d\n", Imax[0], Imax[1], Imax[2]); fprintf(stderr,"FS: frImin == %f, %f, %f\n", frImin[0], frImin[1], frImin[2]); fprintf(stderr,"FS: frImax == %f, %f, %f\n", frImax[0], frImax[1], frImax[2]); mols->i = Imax[0]-Imin[0]+1; mols->j = Imax[1]-Imin[1]+1; mols->k = Imax[2]-Imin[2]+1; fprintf(stderr,"FS: mols(i,j,k) == %d %d %d\n", mols->i, mols->j, mols->k); /* malloc mols->molgrid space */ if ( mols->molgrid ) xcFree_Tensor3f( mols->molgrid ); mols->molgrid = xcMallocTensor3f( mols->i, mols->j, mols->k ); for (k=0; k<3; k++) { /* this is wrong (too much content of the grid will be forced to be squeezed inside the BZ) */ /* mols->lowcoor[k] = frmin[0]*vec.recprim[0][k] + frmin[1]*vec.recprim[1][k] + frmin[2]*vec.recprim[2][k]; */ /* this is correct */ mols->lowcoor[k] = frImin[0]*vec.recprim[0][k] + frImin[1]*vec.recprim[1][k] + frImin[2]*vec.recprim[2][k]; for (j=0; j<3; j++) { /* this is wrong (too much content of the grid will be forced to be squeezed inside the BZ) */ /* mols->vec[k][j] = (frmax[k]-frmin[k]) * vec.recprim[k][j]; */ /* this is correct */ mols->vec[k][j] = (frImax[k]-frImin[k]) * vec.recprim[k][j]; mols->isoexpand.rep_vec[k][j] = vec.recprim[k][j]; } } fprintf(stderr,"FS: mols->lowcoor == %f %f %f\n", mols->lowcoor[0], mols->lowcoor[1], mols->lowcoor[2]); /*fprintf(stderr,"FS: orig == %f %f %f\n", orig[0], orig[1], orig[2]);*/ for (i=Imin[0], i1=0; i<=Imax[0]; i++, i1++) { ii=i; if (i<0) ii=N[0]+i; for (j=Imin[1], j1=0; j<=Imax[1]; j++, j1++) { jj=j; if (j<0) jj=N[1]+j; for (k=Imin[2], k1=0; k<=Imax[2]; k++, k1++) { kk=k; if (k<0) kk=N[2]+k; mols->molgrid[i1][j1][k1] = bagrid[ii][jj][kk]; /*fprintf(stderr,"FS: BZgrid(%d,%d,%d) <-- CELLgrid(%d,%d,%d)\n", i1, j1, k1, ii, jj, kk);*/ } } } xcFree_Tensor3f( bagrid ); } else { /*******************/ /* XCR_PARAPIPEDAL */ /*******************/ mols->i = grid->n[0]; mols->j = grid->n[1]; mols->k = grid->n[2]; fprintf(stderr,"FS: mols(i,j,k) == %d %d %d\n", mols->i, mols->j, mols->k); if ( mols->molgrid ) xcFree_Tensor3f( mols->molgrid ); mols->molgrid = bagrid; for (k=0; k<3; k++) { mols->lowcoor[k] = 0.0; for (j=0; j<3; j++) { mols->vec[k][j] = (float) vec.recprim[k][j]; mols->isoexpand.rep_vec[k][j] = vec.recprim[k][j]; } } } return XC_OK; } void CropBz( NEW_WIN_CONTEXT *wc, ISOSURFACE *iso ) { register int i, ip, j3, index; XYZ tri[3]; for (i=0; intriangl; i++) { for (j3=0; j3<3; j3++) { index = iso->tri2verIN[i].ver_ind[j3]; tri[j3] = iso->vertex[index]; } for (ip=0; ip < bz[BZ_PRIMCELL].npoly; ip++) { iso->triangl_status[i] = ClipSimple3( tri, bz[BZ_PRIMCELL].norm[ip][0], bz[BZ_PRIMCELL].poly[ip][0]); if (!iso->triangl_status[i]) break; } } } void CropBz_New( NEW_WIN_CONTEXT *wc, ISOSURFACE *iso ) { register int ip; XYZ pos, nml; ISOSURFACE *auxil1, *auxil2; /* allocate out ISOSURFACE and initialize it !!! */ auxil1 = (ISOSURFACE *) calloc (1, sizeof(ISOSURFACE)); auxil1->index = iso->index; auxil1->revertnormals = iso->revertnormals; auxil1->nvertex = iso->nvertex; auxil1->ntriangl = iso->ntriangl; auxil1->smooth_nstep = iso->smooth_nstep; auxil1->smooth_weight = iso->smooth_weight; auxil1->triangl_status = iso->triangl_status; auxil1->vertex = iso->vertex; auxil1->vertex_orig = iso->vertex_orig; auxil1->normal = iso->normal; auxil1->color = iso->color; auxil1->tri2verIN = iso->tri2verIN; auxil1->nver2triIN = iso->nver2triIN; auxil1->ver2triIN = iso->ver2triIN; fprintf(stderr,"Number of IN triangles: %d\n", iso->ntriangl); fprintf(stderr,"Number of IN vertices: %d\n", iso->nvertex); for (ip=0; ip < bz[BZ_PRIMCELL].npoly; ip++) { pos.x = bz[BZ_PRIMCELL].poly[ip][0][0]; pos.y = bz[BZ_PRIMCELL].poly[ip][0][1]; pos.z = bz[BZ_PRIMCELL].poly[ip][0][2]; nml.x = bz[BZ_PRIMCELL].norm[ip][0][0]; nml.y = bz[BZ_PRIMCELL].norm[ip][0][1]; nml.z = bz[BZ_PRIMCELL].norm[ip][0][2]; auxil2 = cryIsosurfClip(auxil1, nml, pos); xcFree ((void*) auxil1->triangl_status); xcFree ((void*) auxil1->vertex); xcFree ((void*) auxil1->vertex_orig); xcFree ((void*) auxil1->normal); xcFree ((void*) auxil1->color); xcFree ((void*) auxil1->tri2verIN); xcFree ((void*) auxil1->nver2triIN); xcFree ((void*) auxil1->ver2triIN); xcFree ((void*) auxil1); auxil1 = auxil2; } /* copy isosurface and free unnecessary space */ /* free .... */ /* xcFree ((void*) iso->triangl_status); xcFree ((void*) iso->vertex); xcFree ((void*) iso->vertex_orig); xcFree ((void*) iso->normal); xcFree ((void*) iso->color); xcFree ((void*) iso->tri2verIN); xcFree ((void*) iso->nver2triIN); xcFree ((void*) iso->ver2triIN); */ /* copy */ iso->index = auxil1->index; iso->revertnormals = auxil1->revertnormals; iso->nvertex = auxil1->nvertex; iso->ntriangl = auxil1->ntriangl; iso->smooth_nstep = auxil1->smooth_nstep; iso->smooth_weight = auxil1->smooth_weight; iso->triangl_status = auxil1->triangl_status; iso->vertex = auxil1->vertex; iso->vertex_orig = auxil1->vertex_orig; iso->normal = auxil1->normal; iso->color = auxil1->color; iso->tri2verIN = auxil1->tri2verIN; iso->nver2triIN = auxil1->nver2triIN; iso->ver2triIN = auxil1->ver2triIN; fprintf(stderr,"Number of OUT triangles: %d\n", iso->ntriangl); fprintf(stderr,"Number of OUT vertices: %d\n\n", iso->nvertex); fflush(stderr); } xcrysden-1.6.2/C/xcTclsh.c0000644000175000017500000003140411712736221014015 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcTclsh.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #ifndef WIN32 /* X11 */ #include #include int main(int argc, char *argv[]) { Tcl_Main(argc, argv, Tcl_AppInit); exit(0); } /* * Tcl_AppInit is called from Tcl_Main * after the Tcl interpreter has been created, * and before the script file * or interactive command loop is entered. */ int Tcl_AppInit(Tcl_Interp *interp) { /* * Initialize packages * Tcl_Init sets up the Tcl library facility. */ if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } /* HERE: * Define startup filename if any. This file is read in * case the program is run interactively. */ return TCL_OK; } #else /* WIN32 */ /* * tclAppInit.c -- * * Provides a default version of the main program and Tcl_AppInit * procedure for Tcl applications (without Tk). Note that this * program must be built in Win32 console mode to work properly. * * Copyright (c) 1996-1997 by Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: xcTclsh.c,v 1.1.1.1 2012/02/03 10:53:05 tone Exp $ */ #include "tcl.h" #include #include #ifdef TCL_TEST extern int Procbodytest_Init _ANSI_ARGS_((Tcl_Interp *interp)); extern int Procbodytest_SafeInit _ANSI_ARGS_((Tcl_Interp *interp)); extern int Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp)); extern int TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp)); #ifdef TCL_THREADS extern int TclThread_Init _ANSI_ARGS_((Tcl_Interp *interp)); #endif #endif /* TCL_TEST */ static void setargv _ANSI_ARGS_((int *argcPtr, char ***argvPtr)); static BOOL __stdcall sigHandler (DWORD fdwCtrlType); static Tcl_AsyncProc asyncExit; static void AppInitExitHandler(ClientData clientData); static char ** argvSave = NULL; static Tcl_AsyncHandler exitToken = NULL; static DWORD exitErrorCode = 0; /* *---------------------------------------------------------------------- * * main -- * * This is the main program for the application. * * Results: * None: Tcl_Main never returns here, so this procedure never * returns either. * * Side effects: * Whatever the application does. * *---------------------------------------------------------------------- */ int main(argc, argv) int argc; /* Number of command-line arguments. */ char **argv; /* Values of command-line arguments. */ { /* * The following #if block allows you to change the AppInit * function by using a #define of TCL_LOCAL_APPINIT instead * of rewriting this entire file. The #if checks for that * #define and uses Tcl_AppInit if it doesn't exist. */ #ifndef TCL_LOCAL_APPINIT #define TCL_LOCAL_APPINIT Tcl_AppInit #endif extern int TCL_LOCAL_APPINIT _ANSI_ARGS_((Tcl_Interp *interp)); /* * The following #if block allows you to change how Tcl finds the startup * script, prime the library or encoding paths, fiddle with the argv, * etc., without needing to rewrite Tcl_Main() */ #ifdef TCL_LOCAL_MAIN_HOOK extern int TCL_LOCAL_MAIN_HOOK _ANSI_ARGS_((int *argc, char ***argv)); #endif char buffer[MAX_PATH +1]; char *p; /* * Set up the default locale to be standard "C" locale so parsing * is performed correctly. */ setlocale(LC_ALL, "C"); setargv(&argc, &argv); /* * Save this for later, so we can free it. */ argvSave = argv; /* * Replace argv[0] with full pathname of executable, and forward * slashes substituted for backslashes. */ GetModuleFileName(NULL, buffer, sizeof(buffer)); argv[0] = buffer; for (p = buffer; *p != '\0'; p++) { if (*p == '\\') { *p = '/'; } } #ifdef TCL_LOCAL_MAIN_HOOK TCL_LOCAL_MAIN_HOOK(&argc, &argv); #endif Tcl_Main(argc, argv, TCL_LOCAL_APPINIT); return 0; /* Needed only to prevent compiler warning. */ } /* *---------------------------------------------------------------------- * * Tcl_AppInit -- * * This procedure performs application-specific initialization. * Most applications, especially those that incorporate additional * packages, will have their own version of this procedure. * * Results: * Returns a standard Tcl completion code, and leaves an error * message in the interp's result if an error occurs. * * Side effects: * Depends on the startup script. * *---------------------------------------------------------------------- */ int Tcl_AppInit(interp) Tcl_Interp *interp; /* Interpreter for application. */ { if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } /* * Install a signal handler to the win32 console tclsh is running in. */ SetConsoleCtrlHandler(sigHandler, TRUE); exitToken = Tcl_AsyncCreate(asyncExit, NULL); /* * This exit handler will be used to free the * resources allocated in this file. */ Tcl_CreateExitHandler(AppInitExitHandler, NULL); #ifdef TCL_TEST if (Tcltest_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "Tcltest", Tcltest_Init, (Tcl_PackageInitProc *) NULL); if (TclObjTest_Init(interp) == TCL_ERROR) { return TCL_ERROR; } #ifdef TCL_THREADS if (TclThread_Init(interp) == TCL_ERROR) { return TCL_ERROR; } #endif if (Procbodytest_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "procbodytest", Procbodytest_Init, Procbodytest_SafeInit); #endif /* TCL_TEST */ #if defined(STATIC_BUILD) && defined(TCL_USE_STATIC_PACKAGES) { extern Tcl_PackageInitProc Registry_Init; extern Tcl_PackageInitProc Dde_Init; if (Registry_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "registry", Registry_Init, NULL); if (Dde_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "dde", Dde_Init, NULL); } #endif /* * Call the init procedures for included packages. Each call should * look like this: * * if (Mod_Init(interp) == TCL_ERROR) { * return TCL_ERROR; * } * * where "Mod" is the name of the module. */ /* * Call Tcl_CreateCommand for application-specific commands, if * they weren't already created by the init procedures called above. */ /* * Specify a user-specific startup file to invoke if the application * is run interactively. Typically the startup file is "~/.apprc" * where "app" is the name of the application. If this line is deleted * then no user-specific startup file will be run under any conditions. */ Tcl_SetVar(interp, "tcl_rcFileName", "~/tclshrc.tcl", TCL_GLOBAL_ONLY); return TCL_OK; } /* *---------------------------------------------------------------------- * * AppInitExitHandler -- * * This function is called to cleanup the app init resources before * Tcl is unloaded. * * Results: * None. * * Side effects: * Frees the saved argv and deletes the async exit handler. * *---------------------------------------------------------------------- */ static void AppInitExitHandler( ClientData clientData) { if (argvSave != NULL) { ckfree((char *)argvSave); argvSave = NULL; } if (exitToken != NULL) { /* * This should be safe to do even if we * are in an async exit right now. */ Tcl_AsyncDelete(exitToken); exitToken = NULL; } } /* *------------------------------------------------------------------------- * * setargv -- * * Parse the Windows command line string into argc/argv. Done here * because we don't trust the builtin argument parser in crt0. * Windows applications are responsible for breaking their command * line into arguments. * * 2N backslashes + quote -> N backslashes + begin quoted string * 2N + 1 backslashes + quote -> literal * N backslashes + non-quote -> literal * quote + quote in a quoted string -> single quote * quote + quote not in quoted string -> empty string * quote -> begin quoted string * * Results: * Fills argcPtr with the number of arguments and argvPtr with the * array of arguments. * * Side effects: * Memory allocated. * *-------------------------------------------------------------------------- */ static void setargv(argcPtr, argvPtr) int *argcPtr; /* Filled with number of argument strings. */ char ***argvPtr; /* Filled with argument strings (malloc'd). */ { char *cmdLine, *p, *arg, *argSpace; char **argv; int argc, size, inquote, copy, slashes; cmdLine = GetCommandLine(); /* INTL: BUG */ /* * Precompute an overly pessimistic guess at the number of arguments * in the command line by counting non-space spans. */ size = 2; for (p = cmdLine; *p != '\0'; p++) { if ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ size++; while ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ p++; } if (*p == '\0') { break; } } } argSpace = (char *) Tcl_Alloc( (unsigned) (size * sizeof(char *) + strlen(cmdLine) + 1)); argv = (char **) argSpace; argSpace += size * sizeof(char *); size--; p = cmdLine; for (argc = 0; argc < size; argc++) { argv[argc] = arg = argSpace; while ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ p++; } if (*p == '\0') { break; } inquote = 0; slashes = 0; while (1) { copy = 1; while (*p == '\\') { slashes++; p++; } if (*p == '"') { if ((slashes & 1) == 0) { copy = 0; if ((inquote) && (p[1] == '"')) { p++; copy = 1; } else { inquote = !inquote; } } slashes >>= 1; } while (slashes) { *arg = '\\'; arg++; slashes--; } if ((*p == '\0') || (!inquote && ((*p == ' ') || (*p == '\t')))) { /* INTL: ISO space. */ break; } if (copy != 0) { *arg = *p; arg++; } p++; } *arg = '\0'; argSpace = arg + 1; } argv[argc] = NULL; *argcPtr = argc; *argvPtr = argv; } /* *---------------------------------------------------------------------- * * asyncExit -- * * The AsyncProc for the exitToken. * * Results: * doesn't actually return. * * Side effects: * tclsh cleanly exits. * *---------------------------------------------------------------------- */ int asyncExit (ClientData clientData, Tcl_Interp *interp, int code) { Tcl_Exit((int)exitErrorCode); /* NOTREACHED */ return code; } /* *---------------------------------------------------------------------- * * sigHandler -- * * Signal handler for the Win32 OS. Catches Ctrl+C, Ctrl+Break and * other exits. This is needed so tclsh can do it's real clean-up * and not an unclean crash terminate. * * Results: * TRUE. * * Side effects: * Effects the way the app exits from a signal. This is an * operating system supplied thread and unsafe to call ANY * Tcl commands except for Tcl_AsyncMark. * *---------------------------------------------------------------------- */ BOOL __stdcall sigHandler(DWORD fdwCtrlType) { HANDLE hStdIn; if (!exitToken) { /* Async token must have been destroyed, punt gracefully. */ return FALSE; } /* * If Tcl is currently executing some bytecode or in the eventloop, * this will cause Tcl to enter asyncExit at the next command * boundry. */ exitErrorCode = fdwCtrlType; Tcl_AsyncMark(exitToken); /* * This will cause Tcl_Gets in Tcl_Main() to drop-out with an * should it be blocked on input and our Tcl_AsyncMark didn't grab * the attention of the interpreter. */ hStdIn = GetStdHandle(STD_INPUT_HANDLE); if (hStdIn) { CloseHandle(hStdIn); } /* indicate to the OS not to call the default terminator */ return TRUE; } #endif xcrysden-1.6.2/C/struct.h0000644000175000017500000012023413525475046013747 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/struct.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * * ------ * * Modified by Eric Verfaillie ericverfaillie@yahoo.fr EV * * may 2004 * * modifcations are near EV comments * ***************************************************************************** */ /* handle this near & far bug (needed for CYGWIN) */ #ifndef STRUCT_H_ #define STRUCT_H_ #ifdef NEAR_BUG #ifdef near #undef near #endif #ifdef far #undef far #endif #endif /* NEAR_BUG */ /*****************************************************************************/ /* XC_CPP_* are pre-processor flags */ #define XC_CPP_STRUCT #ifndef FREE_ARG # define FREE_ARG char* #endif #define XC_CPP_GLH #include #ifndef MAX #define MAX(a,b) ( (a)>(b)?(a):(b) ) #endif #ifndef MIN #define MIN(x,y) ( (x)<(y) ? (x) : (y) ) #endif #ifndef ABS #define ABS(x) ( (x)>0?(x):-(x) ) #endif #define DOT_V3(a,b) ( (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] ) #define NORM_V3(v) ( sqrt( (v)[0]*(v)[0] + (v)[1]*(v)[1] + (v)[2]*(v)[2] ) ) #define LOAD_NULL_V(n, vec) \ do { \ register int __iv; \ for (__iv=0; __iv value ? value : v[__iv]; \ } while(0); /* I think this is not needed ... #define COPY_V_(n, dst, src) \ do { \ int __iv; \ for (__iv=0; __iv maximum smoothness */ #define FRAME_PAT 0xAAAA /* this is stipple pattern for frames */ #define MAXSEL 25 /* maximum number of selected atoms */ #define N_SELECT_OBJ 2*MAXSEL /* maximum number of selected objects (atoms+bonds) */ /*============================================================================ * define flags for vorius objects * this is used for glLists */ #define N_LIST_PRIMITIVES 11 #define POINT 0 #define BALL 1 #define OUTLINEBALL 2 #define SPHEREWIRE 3 #define CYLINDERWIRE 4 #define CONEWIRE 5 #define BONDWIRE 6 #define SPHERESOLID 7 #define CYLINDERSOLID 8 #define CONESOLID 9 #define BONDSOLID 10 #define PIPEBALL 11 /***************************************************************************** * WARNING:: * * here below are few "global" variables and this are the only * * variables that are not structures; all the others are structures * *****************************************************************************/ /*===============================================================*/ /* --- ATOMS & BONDS --- ATOMS & BONDS --- BEGIN --- BEGIN --- */ /*===============================================================*/ #define MAX_BONDS 30 int nbonds, natoms, nframes; /* number of bonds, number of atoms, number of "crystal frame-pieces" */ int tmp_nobjects; /* number of objects to display: nobjects = if(nbonds) + if(natoms) + if(nframes) */ int nobjects; /* total number of objects: nobjects = nbonds + natoms + nframes */ double *xat, *yat, *zat; /* XYZ coordinates of atoms */ double (*fv)[3]; /* force vector */ double *xbond, *ybond, *zbond; /* XYZ of first end of a bond * First End of a bond is always at atom */ double *xbond2, *ybond2, *zbond2; /* second end of a bond */ #define BOND_ATOM_TO_MIDBOND 1 #define BOND_MIDBOND_TO_ATOM 2 #define BOND_ATOM_TO_ATOM 4 #define VORONOI_DEFAULT 0 #define VORONOI_WIGNERSEITZ 1 #define VORONOI_BZ 2 #define CENTERED_LABEL -999.999 int *bondend; /* how the bond is oriented, ie. from atom to midbond or from midbond to atom !!! */ int *frametype; /* flag for frame type (I/O connectivity) */ double *xframe, *yframe, *zframe; /* XYZ of first end of a frame * First End of a frame is always at atom */ double *xframe2, *yframe2, *zframe2; /* second end of a frame */ double *zbmid; /* center of a bond in Z-direction */ int *nat; /* atomic number of an atom */ int *sqn; /* sequential number of an atom */ int *natbond; /* to determine to what kind of an atom the bond bellong; * all the rest of the attrib. will be derived from * this parameter */ int *sqnbond; /* will replace natbond; * to determine to what kind of an atom the bond bellong; * all the rest of the attrib. will be derived from * this parameter */ int *iwksp; /* this is for Z-orientation (F77_INDEXX1) */ double mx, my, mz; /* geometrical centre of structure is always moved to * (0,0,0); (mx,my,mz) is translation vector for that */ typedef struct { double mx, my, mz; } MX_MY_MZ; MX_MY_MZ mx_my_mz; char displayMode2D[4]; /*GLuint *primitive_Lists[N_LIST_PRIMITIVES]; */ /* holds the glLists ID for various primitives */ /*=========================================================================*/ /* above were 1st part of global variables that are not structures */ /*=========================================================================*/ /* definitions for iso_objects:: */ #define ISOOBJ_BASE 0 /* base isosurface or colorplane/isolines */ #define ISOOBJ_PLANE1 1 #define ISOOBJ_PLANE2 2 #define ISOOBJ_PLANE3 3 #define MAX_ISOOBJECTS 4 /* for example: isosurface & three colorplanes */ /* -------PARAMETERS NEEDED FOR STRUCTURE DISPLAY -----------------*/ typedef struct { double x; /* xcViewPort's x */ double y; /* xcViewPort's y */ double sizex; /* xcViewPort's size when X-croped */ double sizey; /* xcViewPort's size when Y-croped */ double size; /* xcViewPort's size when not croped */ int stropened; /* when structure is opened this parameter is set to 1 */ int canvassize; /* size of a canvas in screen units if height < width ==> canvassize = height if Ycnv > Xcnv ==> canvassize = width */ int width; /* canvas width */ int height; /* canvas height */ double VPfactor; /* VPf.VPfactor = VPf.size / VPf.structsize; */ float scrAnX; /* "screen units to angstroms" factor for X-dir. */ float scrAnY; /* "screen units to angstroms" factor for Y-dir. */ int WFlinewidth; /* linewidth for WireFrame */ int WF3Dlinewidth; /* linewidth for WireFrame */ int PLlinewidth; /* linewidth for PointLine */ int OUTlinewidth; int PLradius; /* Point radius for PointLine */ int framewidth; /* linewidth for crystal-frames */ double rcovf; /* rcov[] = rcovf * rcovdef[]; this is scale factor for chemical connectivity criteria */ /* double scrf; */ /* scrf == how biger is canvas than structure */ /* THIS IS FOR BALLSTICK MODE */ double ballf; /* scale for balls; rball = ballf * rcov */ double rodf; /* rod/bond scale factor; rrod = ballf * rcov[H] * rodf */ double atradf; /* scaled factor for balls and spacefills; it's howmany times are spacefills/balls greater than rcov or vdw */ double tessFactor; /* tessellation factor for xcPrimitives */ double framef; /* analogous to ballf, rodf, just for frames */ GLboolean xyzOn; /* true when coordinate sistem is displayed */ GLboolean labelsOn; /* true when atomic labels are displayed */ GLboolean framesOn; /* TRUE when "crystal" frames are displayed */ GLboolean selection; /* true when we are in "selection" */ GLboolean atomadd; /* true when we use "cell-adding selection" for cell-adding type of ATOMINSE crystal command */ GLboolean projmade; GLboolean isosurf[MAX_ISOOBJECTS]; /* when isosurface is displayed, this is true */ GLboolean colorplane[MAX_ISOOBJECTS]; /* when "colorplane is displayed, this is true */ GLboolean isoline[MAX_ISOOBJECTS]; /* when "isoline-plane" is displayed this is true */ GLboolean wignerseitz; /* render wigner-seitz cell */ GLboolean supercell; /* in supercell mode -> render vectors and cell-cage */ GLboolean isospacesel2D; /* we are in IsoSpaceSel mode -> for isoplane case a parallelogram is drawn; for isosurface case a parallelepiped is drawn */ GLboolean isospacesel3D; GLboolean force; /* render the forces */ GLboolean Hbond; /* render H-bonds */ GLboolean unibond; GLboolean fog; GLboolean antialias; GLboolean perspective; double perspective_fovy; double perspective_far; double perspective_size; /* NEW; version 0.4.x on */ int *surface; /* new implementation of isosurfaces allow an arbitrary isosurfaces to be displayed; hence we need a logical pointer */ int *surfaceInd; /* mapping from mols->isosurf_index */ void **surfacePtr; /* pointer to MOL_SURF structure */ int nsurface; int dispLattice; /* do we want to display lattice (generated separately, not read from FRAMES XSF section */ int dispLatType; /* display type for dispLattice */ } StructPar; StructPar VPf; /* all parameters for structure(molecule, crystal..) display * + state parameters are here */ /*******************************/ /* this is for VPf.dispLatType */ #define CELL_WIRE 0 #define CELL_ROD 1 #define CELL_SOLID 2 #define CELL_SOLID_AND_WIRE 3 #define CELL_SOLID_AND_ROD 4 /*******************************/ typedef struct { double structsize; /* each atomic structure has it's own size; * STRUCTSIZE is a parameter for this */ double isosize; /* size of isoXXX; xc_isoexpand is taken into account */ double wignerseitzsize; /* size of wigner-seitz cells */ double isospaceselsize; /* size for iso_space_selelection parallelogram/parallelopiped */ /* used for cryXXX stuff */ float o_shift[3]; /* origin shift; geometrical center of picture should be in the middle of MODELVIEW */ } ModelPar; ModelPar MVf; /* * this definitions here are used for ResetVar(int var) */ #define R_ATRAD 0 #define R_RCOV 10000 #define R_RBALL 1 #define R_RROD 2 #define R_ATCOL 3 #define R_WFLINEWIDTH 4 #define R_WF3DLINEWIDTH 10004 #define R_OUTLINEWIDTH 10005 #define R_PLLINEWIDTH 5 #define R_PLRADIUS 6 #define R_SCRF 7 #define R_ALL 8 #define R_FRAMECOL 9 #define R_FRAMELINEWIDTH 10 #define R_FRAMERODF 11 #define R_BACKGROUND 23 #define R_TESSELLATION 24 #define R_UNIBOND 25 #define R_UNIBONDCOLOR 26 #define R_PERSPECTIVE 27 #define R_PERSPECTIVEBACK 28 #define R_PERSPECTIVEFOVY 29 #define R_PERSPECTIVEFRONT 10029 #define R_FOG 30 #define R_ANTIALIAS 31 #define R_AMBIENT_BY_DIFFUSE 32 #define R_CURRENTFILEFORMAT 33 #define R_HBOND 34 #define R_FORCE_RODTHICKF 35 #define R_FORCE_ARRTHICKF 36 #define R_FORCE_ARRLENF 37 #define R_FORCE_COLOR 38 #define R_XYZ_AXIS_COLOR 39 #define R_XYZ_XYPLANE_COLOR 40 /* * this definitions here are used for LoadNewValue(int var, double ....) */ #define L_SPACE_COV 0 #define L_SPACE_VDW 1 #define L_BALL_COV 2 #define L_BALL_VDW 3 #define L_RCOV_ONE 10004 #define L_ATRAD_ONE 4 #define L_ATRAD_SCALE 5 #define L_BALLF 6 #define L_RODF 7 #define L_ATCOL_ONE 8 #define L_WFLINEWIDTH 9 #define L_WF3DLINEWIDTH 10009 #define L_OUTLINEWIDTH 10010 #define L_PLLINEWIDTH 10 #define L_PLRADIUS 11 #define L_SCRF 12 #define L_COV_SCALE 13 #define L_XYZ_ON 14 /* for coordinate sistem */ #define L_LABELS_ON 15 /* for atomic labels */ #define L_FRAME_ON 16 #define L_FRAMECOL 17 #define L_FRAMELINEWIDTH 18 #define L_FRAMERODF 19 #define L_LINEFRAME 20 #define L_TR_XTRANSL 21 #define L_TR_YTRANSL 22 #define L_BACKGROUND 23 #define L_TESSELLATION 24 #define L_UNIBOND 25 #define L_UNIBONDCOLOR 26 #define L_PERSPECTIVE 27 #define L_PERSPECTIVEBACK 28 #define L_PERSPECTIVEFOVY 29 #define L_PERSPECTIVEFRONT 10029 #define L_FOG 30 #define L_ANTIALIAS 31 #define L_AMBIENT_BY_DIFFUSE 32 #define L_CURRENTFILEFORMAT 33 #define L_HBOND 34 #define L_FORCE_RODTHICKF 35 #define L_FORCE_ARRTHICKF 36 #define L_FORCE_ARRLENF 37 #define L_FORCE_COLOR 38 #define L_XYZ_AXIS_COLOR 39 #define L_XYZ_XYPLANE_COLOR 40 /* * this definitions here are used for GetDefault(int var) */ #define D_SCRF 0 #define D_BALLF 1 #define D_RODF 2 #define D_COVF 3 #define D_ALL 4 #define D_WFLINEWIDTH 5 #define D_WF3DLINEWIDTH 10005 #define D_OUTLINEWIDTH 10006 #define D_PLLINEWIDTH 6 #define D_PLRADIUS 7 #define D_ATCOL_ONE 8 #define D_ATRAD_SCALE 9 #define D_RCOV_ONE 10004 #define D_ATRAD_ONE 10 #define D_FRAMECOL 11 #define D_FRAMELINEWIDTH 12 #define D_FRAMERODF 13 #define D_MAXSTRUCTSIZE 14 #define D_BACKGROUND 23 #define D_TESSELLATION 24 #define D_UNIBOND 25 #define D_UNIBONDCOLOR 26 #define D_PERSPECTIVE 27 #define D_PERSPECTIVEBACK 28 #define D_PERSPECTIVEFOVY 29 #define D_PERSPECTIVEFRONT 10029 #define D_FOG 30 #define D_ANTIALIAS 31 #define D_AMBIENT_BY_DIFFUSE 32 #define D_CURRENTFILEFORMAT 33 #define D_HBOND 34 #define D_FORCE_RODTHICKF 35 #define D_FORCE_ARRTHICKF 36 #define D_FORCE_ARRLENF 37 #define D_FORCE_COLOR 38 #define D_XYZ_AXIS_COLOR 39 #define D_XYZ_XYPLANE_COLOR 40 /* this is used just by GetValue */ #define GET_NATOMS 100 #define GET_NAT 101 #define GET_SS_MINX 115 #define GET_SS_MINY 116 #define GET_SS_MINZ 117 #define GET_SS_MAXX 118 #define GET_SS_MAXY 119 #define GET_SS_MAXZ 120 #define GET_AT_MINX 10115 #define GET_AT_MINY 10116 #define GET_AT_MINZ 10117 #define GET_AT_MAXX 10118 #define GET_AT_MAXY 10119 #define GET_AT_MAXZ 10120 #define GET_ATOMLABEL_LABEL 121 #define GET_ATOMLABEL_BRIGHTCOLOR 122 #define GET_ATOMLABEL_DARKCOLOR 123 #define GET_ATOMLABEL_DO_DISPLAY 124 #define GET_ATOMLABEL_ALL_ID 125 /* flag for the ID's of all atoms than have cutom-labels */ #define GET_GLOBALATOMLABEL_BRIGHTCOLOR 126 #define GET_GLOBALATOMLABEL_DARKCOLOR 127 #define GET_GLOBALATOMLABEL_DO_DISPLAY 128 #define GET_FOG_COLORMODE 130 #define GET_FOG_COLOR 131 #define GET_FOG_MODE 132 #define GET_FOG_DENSITY 133 #define GET_FOG_ORT_START_F 134 #define GET_FOG_ORT_END_F 135 #define GET_FOG_PERSP_F1 136 #define GET_FOG_PERSP_F2 137 #define GET_ANTIALIAS_DEGREE 140 #define GET_ANTIALIAS_OFFSET 141 #define GET_ALAT 150 #define SET_ATOMLABEL_DO_DISPLAY 200 #define SET_GLOBALATOMLABEL_DO_DISPLAY 201 #define SET_DO_NOT_DISPLAY_ATOMLABEL 202 /* apply to all atomic lables global and custom */ #define SET_FOG_COLORMODE 210 #define SET_FOG_COLOR 211 #define SET_FOG_MODE 212 #define SET_FOG_DENSITY 213 #define SET_FOG_ORT_START_F 214 #define SET_FOG_ORT_END_F 215 #define SET_FOG_PERSP_F1 216 #define SET_FOG_PERSP_F2 217 #define SET_ANTIALIAS_DEGREE 220 #define SET_ANTIALIAS_OFFSET 221 /* ========================================================================= */ /* "defines" for xcMaybeDelete3DLists & ReDisplay--------------------------- */ #define DELETE3D_NONE 0 #define DELETE3D_BALL 1 #define DELETE3D_SPACE 2 #define DELETE3D_BOND 4 #define DELETE3D_FRAME 8 #define DELETE3D_LINEFRAME 16 #define DELETE3D_BALL_LABEL 32 #define DELETE3D_SPACE_LABEL 64 #define DELETE3D_ALL 127 #define REMAKE3D_NONE 0 #define REMAKE3D_BALL 1 #define REMAKE3D_SPACE 2 #define REMAKE3D_BOND 4 #define REMAKE3D_FRAME 8 #define REMAKE3D_LINEFRAME 16 #define REMAKE3D_BALL_LABEL 32 #define REMAKE3D_SPACE_LABEL 64 #define REMAKE3D_ALL 127 /* --------------------------- */ /* --- some default values --- */ #define DEF_ZOOM 1.7 #define DEF_SCRF 1.5 #define DEF_BALLF 0.4 #define DEF_RODF 0.6 #define DEF_LineWidthWF 1 #define DEF_LineWidthWF3D 1 #define DEF_LineWidthOUT 1 #define DEF_LineWidthPL 1 #define DEF_RadiusPL 6 #define DEF_RCOVF 1.05 /* rcovdef is scaled by this factor and this is criteria for chemmical connectivity */ #define DEF_ATRADF 1.40 #define DEF_FRAMEWIDTH 1 #define DEF_FRAMERODF 0.1 #define DEF_TESSELLATION 30.0 #define DEF_UNIBOND 0 #define DEF_PERSPECTIVE 0 #define DEF_PERSPECTIVEFOVY 2.5 #define DEF_PERSPECTIVEBACK 3.0 #define DEF_PERSPECTIVEFRONT 1.0 #define DEF_FOG 0 #define DEF_ANTIALIAS 0 #define DEF_HBOND 0 /* ---------- TRANSLATION & ZOOM TRANSFORMATION ------- */ typedef struct { double xtransl; double ytransl; double zoom; float rotx; float roty; float rotz; int xrotold; /* this is for xc_rot2; B1-Motion rotation */ int yrotold; int trXold; /* this is for xc_transl2; B2-Motion translation */ int trYold; int b1motion; /* do we have B1-Motion; boolean */ int b2motion; /* do we have B2-Motion; boolean */ int shiftB1motion; } Transform; Transform tr; typedef struct { int *sqn; /* sequential number of an atom (ex. atom n. 14) */ int *sqnat; /* sequential number of an atom of a kind (ex. atom n. O3) */ GLfloat (*col)[3]; /* color for each atom; each displayed atom can have its own color */ int natomkind; int atomkind[MAXNAT+1]; /* array of elements that are in structure */ } AtomAtrib; AtomAtrib atm; /* this is for flags - to recognise objects */ #define ATOM 0 #define SELATOM 1 #define BOND 2 #define SELLINE 3 #define SELBOND 4 #define FRAME 5 /* when we orientate objects some objects must be above the others in case, * that they are in the same plane */ #define Z_OFFSET(x) ( (0.0001 * x) ) #define XC_NONE 0 #define XC_BOND 1 #define XC_ATOM 2 #define XC_LABEL 2 /* XC_ATOM and XC_LABEL are synonyms */ #define XC_FRAME 4 #define XC_HBOND 5 /* ======================================================================== * --- AtomBond -- when we open structure, all data about structure goes in * AtomBond */ typedef struct { int flag; /* flag for ATOM or BOND or FRAME*/ int nat; /* corresponding atomic number * from NAT all other atribbutes are assigned */ int sqn; /* sequential number of atom; from sqn other attribbutes are assigned */ int bondend; GLuint list1; /* identifier for OUTLINEBALL list to use when rendering balls */ GLuint list2; /* identifier for BALL list to use when rendering balls */ double x1; double y1; /* for ATOMS only X1 Y1 Z1 are needed */ double z1; double x2; /* for BONDS also X2 Y2 Z2 are neede */ double y2; double z2; } AtomBond; AtomBond *coor; /* coordinates in original units * on this coordinates I perform rotations, * but never do Z-sorting; * first goes nbonds, than natoms */ /* for Z-orientation */ double *zorient; /* for ATOMs z == z1 * for BONDs z == 0.5 * (z1 + z2) + little * z is center of object for Z coord. */ /*****************************************************************************/ /* someday make the structure from that */ double rcov[MAXNAT + 1]; /* covalent radii */ extern double rvdw[MAXNAT + 1]; /* Van der Waals radii */ double atrad[MAXNAT + 1]; /* radii used to render atoms, balls; it's possible to use rcov[], rvdw[], or some custom radii */ double rball[MAXNAT + 1]; /* balls radii: rball[]= VPf.ballf * atrad[]; */ double rrod; /* rod's radius rrod= VPf.ballf * VPf.rodf * rcov[H] */ double rframe; /* crystal frame's radius */ extern GLfloat DefAtCol[MAXNAT + 1][3]; /* default atomic color */ float atcol[MAXNAT + 1][3]; /* atomic color used for rendering; it's possible to define a custom colors or use default one */ extern GLfloat DefFrameCol[3]; float framecol[3]; extern GLclampf DefBg[4], DefUnibondCol[4]; GLclampf bg[4], unibondCol[4]; /*****************************************************************************/ /* THIS IS to manege 2D/3D */ #define XC_2D 0 #define XC_3D 1 GLboolean dimType; /* ========================================================================= */ /* Options; various boolean flags, for managing display options ------------ */ typedef struct { GLboolean pipemode; GLboolean stickmode; /* TK_r */ GLboolean ballmode; /* TK_b */ GLboolean spacefillmode; /* TK_f */ GLboolean smooth; /* if (smooth) -> GL_SMOOTH else GL_FLAT*/ GLboolean solid; /* if (solidmode) -> SOLID else WIRE */ GLboolean lineframe; /* if true LineFrameList is displyed, else either SolidFrameList, either WireFrameList */ GLboolean anaglyph; /* EV if (anglyphmode) -> ANAGLYPH else NULL */ GLboolean stereo; /* GB do we use the SGI stereo mode */ } Options3D; /*****************************************************************************/ /* this is for max size in each directions -> so that we can efficiently * determine glOrtho */ typedef struct { double x; /* maximum x */ double y; double z; double r; /* maximum radius */ } MaxSize; MaxSize max, min; /* ========================================================================= */ /* this is base for atom-label lists */ GLuint atomlabelOffset; GLuint xyzlabelOffset; /* ========================================================================= * definition of voriuos vectors; coordinate sistem base-vectors, direct * vectors, reciprocal vectors, ... ========================================================================= */ #define CRDS_SIZE 130 typedef struct { double crdmajor[4][4]; /* coor-sist major vec */ double crdnew[4][4]; /* coor-sist new vec */ double crdold[4][4]; /* coor-sist old vec */ double crdvec[16]; double prim[4][4]; /* primitiv-vectors; if we don't have crystal, then * expample: for slabs, the third vector is * (0,0,max.z) */ double conv[4][4]; /* conventional-vectors; if not crystal do same as * with prim[][] */ double recprim[4][4]; /* reciprocal primitive-vectors */ double recconv[4][4]; /* reciprocal conventional-vectors */ } Vector; Vector vec; /* ========================================================================= */ /* structure for tracking the dimension of orthographic projection */ typedef struct { double size; double minx; double maxx; double miny; double maxy; double minz; double maxz; double fi, near, far; /* for PERSPECTIVE */ } OrthoProj; /*****************************************************************************/ /* this is for file format !!!!! */ #define FORMAT_NONE 0 #define FORMAT_XSF 1 #define FORMAT_XYZ 2 #define FORMAT_PDB 3 int current_file_format; /*****************************************************************************/ /* XC_CPP_* are pre-processor flags */ #ifndef XC_CPP_BOOLEAN typedef int boolean; #define XC_CPP_BOOLEAN #endif /*****************************************************************************/ /* this is structures that hold XCRYSDEN file format information */ /* XCRYSDEN file-format is defined and made by GENGEOM program */ #define XCR_CELL 0 /* cell is the unit of repetition; look below */ #define XCR_TR_ASYM 1 /* translational symetric part is unit of repetition */ #define XCR_NOCELL 0 #define XCR_PRIMCELL 1 /* primitiv cell */ #define XCR_CONVCELL 2 /* conventional cell */ #define XCR_PARAPIPEDAL 0 /* parapipedal shape of cell */ #define XCR_HEXAGONAL 1 /* hexagonal shape of cell */ #define XCR_BZ 2 /* this must be the same as in gengeom.f */ #define XCR_CELL_PC 1 #define XCR_CELL_AC 2 #define XCR_CELL_BC 3 #define XCR_CELL_CC 4 #define XCR_CELL_FC 5 #define XCR_CELL_IC 6 #define XCR_CELL_RC 7 #define XCR_CELL_HC 8 #define XCR_CELL_TNRC 9 #define XCR_NCELL_TYPES 10 #define XCR_CELL_IPC 1 #define XCR_CELL_IAC 2 #define XCR_CELL_IBC 2 #define XCR_CELL_ICC 2 #define XCR_CELL_IFC 4 #define XCR_CELL_IIC 2 #define XCR_CELL_IRC 3 #define XCR_CELL_IHC 3 #define XCR_CELL_ITNRC 3 typedef struct { int dim; /* dimensionality of sistem */ int groupn; /* number of group; it's from c95's ftn34; actually it's family not group */ float cellpos[XCR_NCELL_TYPES][4][3]; /* fractional positions within the cell */ int npos[XCR_NCELL_TYPES]; /* number of atoms(positions) within desired cell type */ boolean ldimgroup; /* true if group-number is present in xcr-file */ boolean lconvvec; /* true if conv vectors are specified in xcr-file */ boolean lprimvec; /* true if prim vectors are specified in xcr-file */ boolean lrecprimvec; /* true if prim reciprocal vectors are specified */ boolean lrecconvvec; /* true if conv reciprocal vectors are specified */ boolean lprimcoor; /* true if primcoord are specified in xcr-file */ boolean lconvcoor; /* true if convcoord are specified in xcr-file */ boolean lprimwigner; /* true if primitive Wigner-Seitz cell is specified */ boolean lconvwigner; /* true if conventional Wigner-Seitz cell is specified*/ boolean lprimbz; /* true if primitive Brillouin zone is specified */ boolean lconvbz; /* true if conventional Brillouin zone is specified */ boolean ldatagrid2D; /* true if DATAGRID2D is specified */ boolean ldatagrid3D; /* true if DATAGRID3D is specefied */ boolean lbandgrid2D; /* true if BANDGRID2D is specified */ boolean lbandgrid3D; /* true if BANDGRID3D is specefied */ boolean lforce; /* true if forces were specified */ /*boolean lHbond;*/ /* true if hydrogen bonds are present */ int natr; /* number of atoms in primitiv cell */ int ncell; /* "atoms per cell", FC ->4, RC -> 3, etc. */ int nunit[3]; /* number of units in each directions */ int unit; /* what is the unit "cell" or translational asym. part */ int celltype; /* primitiv or convetional */ int shape; /* parapipedal or hexagonal */ int *prim_nat; /* atomic numbers of atoms in primcell */ int *conv_nat; /* atomic numbers of atoms in primcell */ double (*prim_coor)[3]; /* Cartesian coordinates of atoms in primcell (in ANGSTROMS) */ double (*prim_fcoor)[3]; /* fractional coordinates of atoms in primcell */ double (*prim_forc)[3]; /* Cartesian components of atomic forces in primcell */ boolean prim_lforc; /* are forces in PRIMCOORD present */ double (*conv_fcoor)[3]; /* fractional coordinates of atoms in convcell */ double (*conv_coor)[3]; /* Cartesian coordinates of atoms in convcell (in ANGSTROMS) */ } XcrInfo; XcrInfo xcr; /*****************************************************************************/ /* here are display-attributes for isosurface and colorplane */ typedef struct { int drawstyle; /* drawstyle for isosurface rendering * ISOSURF_WIRE or ISOSURF_SOLID */ GLenum shademodel; int transparent; GLboolean lighting; /* lighting NO/OFF */ } ISO_ATTRIB; /*****************************************************************************/ /* this is structure used for evauating custom Tcl/tk command's options */ #ifdef XC_CPP_GLPARAM /* xcGLparam.h header file was included */ # define COM_ISOEXPAND_REPEAT_DEFAULT 0 # define COM_ISOEXPAND_REPEAT_CONVCELL 1 # define COM_ISOEXPAND_REPEAT_PRIMCELL 2 # define COM_ISOEXPAND_SHAPE_DEFAULT 0 # define COM_ISOEXPAND_SHAPE_PARAPIPEDAL 1 # define COM_ISOEXPAND_SHAPE_HEXAGONAL 2 # define COM_ISOEXPAND_EXPAND_WHOLE 0 # define COM_ISOEXPAND_EXPAND_LIST 1 typedef GetGlParam GetComOption; #endif /*****************************************************************************/ #define WIGNERSEITZ_MAXPOLY 26 /* hope this is enough */ #define WIGNERSEITZ_MAXVERTEX 15 typedef struct { int npoly; /* number of polygons */ int nvert[WIGNERSEITZ_MAXPOLY]; float max; /* maximum value of coordinates (either X,Y,Z) */ float poly[WIGNERSEITZ_MAXPOLY][WIGNERSEITZ_MAXVERTEX][3]; float norm[WIGNERSEITZ_MAXPOLY][WIGNERSEITZ_MAXVERTEX][3]; } WIGNERSEITZ; WIGNERSEITZ wsp, wsc; /*****************************************************************************/ /* LINESTIPPLE --- LINESTIPPLE --- LINESTIPPLE --- LINESTIPPLE */ /*****************************************************************************/ #define LINESTIPPLE0 0x5555 #define LINESTIPPLE1 0x6b2d #define LINESTIPPLE2 0x6735 #define LINESTIPPLE3 0xcf5e #define LINESTIPPLE4 0xaf57 #define LINESTIPPLE5 0x3f49 #define LINESTIPPLE6 0xef4c #define LINESTIPPLE7 0xe73a #define LINESTIPPLE8 0x4f12 #define LINESTIPPLE9 0x8f32 #define LINESTIPPLE_SOLID 0xffff #define LINESTIPPLE_FACTOR0 1 #define LINESTIPPLE_FACTOR1 2 #define LINESTIPPLE_FACTOR2 3 #define LINESTIPPLE_FACTOR3 4 /*************************/ /* DATAGRID --- DATAGRID */ /*************************/ #define DATAGRID_2D 2 #define DATAGRID_3D 3 #define RECIP_DATAGRID_3D 4 #define DATAGRID_MAXSUBINDEX 5000 /* do we need more that 5000 bands for Fermi surface ??? */ #ifndef XC_CPP_NO_STDIO /* load DATAGRID only if stdio.h was included */ struct DATAGRID { FILE *fp; int type; /* type of DATAGRID, i.e. 2D or 3D */ int index; /* identifier for *grid */ char *ident; /* identifier for the user */ int n_of_subgrids; /* number of subgrids (up to DATAGRID_MAXSUBINDEX) */ int n[3]; /* number of points in two/three direction */ float orig[3]; /* xyz of origin */ float vec[3][3]; /* format of vec: [vec#][xyz] */ struct DATAGRID *ptr; /* pointer to previous struct */ int selected[DATAGRID_MAXSUBINDEX]; long fpos[DATAGRID_MAXSUBINDEX]; /* position if the file */ float signfactor[DATAGRID_MAXSUBINDEX]; /* factor for subindex's datagrid */ char *subident[DATAGRID_MAXSUBINDEX]; int lband, nband, *band_index[DATAGRID_MAXSUBINDEX]; long *band_fpos[DATAGRID_MAXSUBINDEX]; float minvalue[DATAGRID_MAXSUBINDEX]; /* minimum value in the grid */ float maxvalue[DATAGRID_MAXSUBINDEX]; /* maximum value in the grid */ }; #endif /* here are some data about raster font stored in xcLabels.c */ typedef struct { GLsizei wid; GLsizei height; GLfloat w2; GLfloat h2; GLfloat wp2; GLfloat hp2; } RasterFontSize; #ifdef _TK typedef struct { GLuint base; GLsizei width; GLsizei height; GLfloat bright_color[3]; GLfloat dark_color[3]; short do_display; char *label; Tk_Font tkfont; } AtomicLabel; #endif /* minimum and maximum coorinates of structure atoms */ typedef struct { double minX; double minY; double minZ; double maxX; double maxY; double maxZ; } StructSize; /* Now, just ".mesa" togl is over. We can create an arbitrary nember of togls and display the structures into them. Everyting is dynmicaly allocated, and NEW_WIN_CONTEXT is a structure that holds everything !!! */ #ifdef TOGL_H #define FS_SINGLE 0 #define FS_MULTI 1 struct FS_CONTEXT { int ntogl; struct Togl **toglVector; }; struct NEW_WIN_CONTEXTstr { struct NEW_WIN_CONTEXTstr *ptr; struct Togl *togl; struct FS_CONTEXT fermiContext; int index; StructPar VPf; ModelPar MVf; Transform tr; StructSize ss; Vector vec; void *recprim_cage; /* pointer to CellCage recprim_cage; */ GLclampf bg[4]; void (*xcDisplay)(struct Togl *togl); }; typedef struct NEW_WIN_CONTEXTstr NEW_WIN_CONTEXT; #endif #define XC_FORCE_TRESHHOLD 0.0005 #define XC_FORCE_LENGTHFACTOR 200 /* this is for rendering Force Vectors */ typedef struct { float (*ScaleFunc)(float value); float threshold; float lengthfactor; float rod_thickf; /* vector's thickness factor */ float arr_thickf; /* thickness factor for the arrow */ float arr_lenf; /* length of the arrow */ float color[4]; /* this is maximum size for atom+force (for making correct projection/viewport) */ float max_size; } ForceVector; /* structure for gluPerspective */ typedef struct { GLdouble fovy; GLdouble aspect; GLdouble near; GLdouble far; GLdouble shiftZ; } PERSPECTIVE; /* fog (i.e. depth cuing) */ #define XC_FOG_BGCOLOR 0 #define XC_FOG_CUSTOMCOLOR 1 #define XC_FOG_LINEAR 2 #define XC_FOG_EXP 3 #define XC_FOG_EXP2 4 typedef struct { int colormode; /* can be CUSTOMCOLOR or BGCOLOR */ GLfloat color[4]; GLint mode; GLfloat density; GLfloat ort_start_f; GLfloat ort_end_f; GLfloat persp_f1; GLfloat persp_f2; } XCfog; typedef struct { int degree; float offset; } XCantialias; /* 3D vector: double precision */ typedef double VEC3d[3]; /* H-bonds */ typedef struct { int n; /* number of H-bonds */ int max_n; /* allocated number of H-bonds */ int *H_like_list; /* lists of H-like atoms */ int *O_like_list; /* lists of O-like atoms */ float color[4]; /* color of the H-bonds */ double length_min; /* minimum H-bond length */ double length_max; /* maximum H-bond length */ double angle_min; /* minimum-angle; Namely the angle between H-chemical bond and H-bond must be close to 180 degrees (i.e. greater than angle_min) */ unsigned short line_pattern; /* line stipple pattern */ int line_patternsize; float line_width; VEC3d *start_coor; /* start coordinates of the H-bond */ VEC3d *end_coor; /* end coordinates of the H-bond */ } H_Bond; int crystal_version; /* what is the version of CRYSTAL program we are using */ /* color for the Coordinate system display */ typedef struct { float axis_color[4]; float xyplane_color[4]; } XYZ_Attrib; /* movie making */ #define MOVIE_MODE_EVERY_SNAPSHOT 0 #define MOVIE_MODE_REALTIME_INTERVAL 1 typedef struct { int mode; int nframe; int doit; int printing; char *dir; } realTimeMove; extern const char *printImage; #endif xcrysden-1.6.2/C/lcasif.c0000644000175000017500000003302513516065671013657 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/lcasif.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ /* ------------------------------------------------------------------------ * * float version of LCASI interpolation * * ------------------------------------------------------------------------ */ #include #include #include "tensor.h" #include "memory.h" static double invL[3][3] = { { 0.5,-1.0, 0.5}, {-0.5, 0.0, 0.5}, { 0.0, 1.0, 0.0} }; static double invR[3][3] = { { 0.5,-1.0, 0.5}, {-1.5, 2.0,-0.5}, { 1.0, 0.0, 0.0} }; #define M33_MULT_V3(dst, m, v ) \ do { \ (dst)[0] = (m)[0][0] * (v)[0] + (m)[0][1] * (v)[1] + (m)[0][2] * (v)[2];\ (dst)[1] = (m)[1][0] * (v)[0] + (m)[1][1] * (v)[1] + (m)[1][2] * (v)[2];\ (dst)[2] = (m)[2][0] * (v)[0] + (m)[2][1] * (v)[1] + (m)[2][2] * (v)[2];\ } while(0) /* lcasi.c */ extern void cryError(int status, char *function, char *message); /* lcasif.c */ extern float *cryRegPeriodInterpolator_f_LCASI1D(int N, int DEGREE, float *src); extern float **cryRegPeriodInterpolator_f_LCASI2D(int n[2], int degree[2], float **src); extern float ***cryRegPeriodInterpolator_f_LCASI3D(int n[3], int degree[3], float ***src); extern void cryRegPeriodInterpolate_f_LCASI1D(int N, int DEGREE, float *src, float *dst); extern void cryRegPeriodInterpolate_f_LCASI2D(int N1, int N2, int DEGREE1, int DEGREE2, float **src, float **dst); extern void cryRegPeriodInterpolate_f_LCASI3D(int N1, int N2, int N3, int DEGREE1, int DEGREE2, int DEGREE3, float ***src, float ***dst); /*! *----------------------------------------------------------------------------- * * cryRegPeriodInterpolator_f_LCASI1D -- \brief 1D LCASI interpolator * * \description * This function is an object driver for 2D LCASI interpolation on * regular periodic grid. The output grid can only be of * integer-multiple size compared to input grid. The integer degree * interpolation is specified via "DEGREE" input parameter. * * \return * Interpolated 1D regular periodic datagrid. * * \sideeffect * None. * *----------------------------------------------------------------------------- */ float *cryRegPeriodInterpolator_f_LCASI1D(int N, /* number of input points*/ int DEGREE, /*degree of interp */ float *src)/*INPUT func. values */ { int n_out = N * DEGREE; float *dst; dst = (float*) malloc(sizeof(float) * n_out); if (!dst) { fprintf( stderr, "\n***\nMemory Error: can't allocate %ld bytes\n", sizeof(float) * n_out ); abort(); } cryRegPeriodInterpolate_f_LCASI1D(N, DEGREE, src, dst); return dst; } /*! *----------------------------------------------------------------------------- * * cryRegPeriodInterpolator_f_LCASI2D -- \brief 2D LCASI interpolator * * \description * This function is an object driver for 2D LCASI interpolation on * regular periodic grid. The output grid can only be of * integer-multiple size compared to input grid. The integer degree * interpolation is specified via "degree" input parameter. * * \return * Interpolated 2D regular periodic datagrid. * * \sideeffect * None. * *----------------------------------------------------------------------------- */ float **cryRegPeriodInterpolator_f_LCASI2D(int n[2], /*!< number of input points*/ int degree[2], /*!< degree of interp */ float **src) /*!< INPUT func. values*/ { int n_out[2]; float **dst; n_out[0] = n[0] * degree[0]; n_out[1] = n[1] * degree[1]; MALLOC_TENSOR2(float, dst, n_out[0], n_out[1]); cryRegPeriodInterpolate_f_LCASI2D(n[0], n[1], degree[0], degree[1], src, dst); return dst; } /*! *----------------------------------------------------------------------------- * * cryRegPeriodInterpolator_f_LCASI3D -- \brief 3D LCASI interpolator * * \description * This function is an object driver for 3D LCASI interpolation on * regular periodic grid. The output grid can only be of * integer-multiple size compared to input grid. The integer degree * interpolation is specified via "degree" input parameter. * * \return * Interpolated 3D regular periodic datagrid. * * \sideeffect * None. * *----------------------------------------------------------------------------- */ float ***cryRegPeriodInterpolator_f_LCASI3D(int n[3],/*! */ #include #include #include #include /* #include */ /* #include */ /* #include "xcGLparam.h" */ /* #include "primitives.h" */ #include "struct.h" #include "isosurf.h" #include "xcfunc.h" #include "system.h" extern PLANEVERTEX ***plvertex; extern ISOSTATE isostate; /***************************************************************************** * * * xc_isodatagrid [subindex2 factor2 ...] * * * *****************************************************************************/ int XC_IsoDataGridCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { FILE *gridFP; struct DATAGRID *grid; int i, j, k, l, io, index, subindex, n_grid_blocks; double signfactor; float value; char **argvList = (char **) malloc (2 * sizeof(char *)); char *filename = (char *) malloc (sizeof(char) * 256); if (argc % 2 != 0) { Tcl_SetResult(interp, "Usage: xc_isodatagrid [subindex2 factor2 ...]\nor\nxc_isodatagrid info", TCL_STATIC); return XC_ERROR; } if ( strcmp(argv[1], "info" ) == 0 ) { /* return the list containing the info about grid structure */ /* structure of list: No_of_grids {#D ident1 No_of_subgrids {subident1 ... subidentNo} ..................... {#D identNo No_of_subgrids {subident1 ... subidentNo} */ struct DATAGRID *grid; char *string = (char *) malloc(sizeof(char) * 512); Tcl_DString *dsPtr = (Tcl_DString *) Tcl_Alloc(sizeof(Tcl_DString)); Tcl_DStringInit(dsPtr); /* check if dsPtr should be previously allocated */ fflush(stdout); n_grid_blocks = GetNumberOfGridBlocks(); sprintf(string,"%d", n_grid_blocks); Tcl_DStringAppendElement(dsPtr, string); for(i=0; itype == DATAGRID_3D ) sprintf(string,"3D"); Tcl_DStringAppendElement(dsPtr, string); Tcl_DStringAppendElement(dsPtr, grid->ident); sprintf(string,"%d", grid->n_of_subgrids); Tcl_DStringAppendElement(dsPtr, string); Tcl_DStringStartSublist(dsPtr); for(j=0; jn_of_subgrids; j++) Tcl_DStringAppendElement(dsPtr, grid->subident[j]); Tcl_DStringEndSublist(dsPtr); Tcl_DStringEndSublist(dsPtr); } Tcl_DStringResult(interp, dsPtr); free((FREE_ARG) string); return TCL_OK; } if ( Tcl_GetInt(interp, argv[1], &index) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, but got \"%s\" in xc_isodatagrid command", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* find grid according to the index */ if ( (grid = FindDataGrid( index )) == NULL ) { char rss[1024]; snprintf(rss, sizeof(rss), "grid # %d not found", index); Tcl_SetResult(interp, rss, TCL_VOLATILE); return XC_ERROR; } /* initialize grid's signfactor & selected */ for(i=0; isignfactor[i] = 0.0; grid->selected[i] = 0; } for(i=2; iselected[subindex] = 1; grid->signfactor[subindex] = signfactor; } /* everything seems to be OK, proceed */ argvList[0] = "xc_iso"; argvList[1] = "init"; /*nargc = 2;*/ if (XC_IsoCmd(clientData, interp, 2, (const char **)argvList) == TCL_ERROR) { Tcl_SetResult(interp, "an error occurred during initialization of xc_isodatagrid process", TCL_STATIC); free((FREE_ARG) argvList); return TCL_ERROR; } free((FREE_ARG) argvList); for (i=0; i<3; i++) isodata.points[ISOOBJ_BASE][0][i] = grid->orig[i]; for (i=0; itype; i++) { isodata.vec[ISOOBJ_BASE][i].x = grid->vec[i][0]; isodata.vec[ISOOBJ_BASE][i].y = grid->vec[i][1]; isodata.vec[ISOOBJ_BASE][i].z = grid->vec[i][2]; } if (grid->type == DATAGRID_3D ) { float det = XYZ_det3x3(isodata.vec[ISOOBJ_BASE][0], isodata.vec[ISOOBJ_BASE][1], isodata.vec[ISOOBJ_BASE][2]); if (det > 0) { fprintf(stderr,"coordinate system orientation is right\n"); isodata.cell_orientation = XC_RIGHT; } else { fprintf(stderr,"coordinate system orientation is left\n"); isodata.cell_orientation = XC_LEFT; } } isostate.stateflag = ISO_INIT | ISO_STACK | ISO_SIGN | ISO_POINTS; /* must assing iso_data & iso_files yet */ grd.nx = newgrd.nx = grid->n[0]; grd.ny = newgrd.ny = grid->n[1]; grd.nz = newgrd.nz = grid->n[2]; /* now read the data and write to bin_vertex_fp */ gridFP = MaybeOpenDataGridFile("r"); if (grid->type == DATAGRID_2D) { isodata.dim[ISOOBJ_BASE] = 2; plvertex[ISOOBJ_BASE] = xcMallocPLANEVERTEX( grd.nx, grd.ny ); isostate.plvertex_malloc[ISOOBJ_BASE] = 1; for (i=0; in[1]; j++) for(k=0; kn[0]; k++) plvertex[ISOOBJ_BASE][k][j].val = 0.0; } if (grid->type == DATAGRID_3D) { isodata.dim[ISOOBJ_BASE] = 3; gridvertex = xcMallocGRIDVERTEX( grd.nx, grd.ny, grd.nz ); isostate.gridvertex_malloc = 1; for(j=0; jselected[i]) { fseek(gridFP, grid->fpos[i], SEEK_SET); if (grid->type == DATAGRID_2D) for(j=0; jsignfactor[i] * value; plvertex[ISOOBJ_BASE][k][j].p[0] = ((float) k / (grd.nx - 1)) * isodata.vec[ISOOBJ_BASE][0].x + ((float) j / (grd.ny - 1)) * isodata.vec[ISOOBJ_BASE][1].x; plvertex[ISOOBJ_BASE][k][j].p[1] = ((float) k / (grd.nx - 1)) * isodata.vec[ISOOBJ_BASE][0].y + ((float) j / (grd.ny - 1)) * isodata.vec[ISOOBJ_BASE][1].y; plvertex[ISOOBJ_BASE][k][j].p[2] = ((float) k / (grd.nx - 1)) * isodata.vec[ISOOBJ_BASE][0].z + ((float) j / (grd.ny - 1)) * isodata.vec[ISOOBJ_BASE][1].z; if (j == 0 && k == 0) { isodata.min = plvertex[ISOOBJ_BASE][k][j].val; isodata.max = plvertex[ISOOBJ_BASE][k][j].val; } else if ( plvertex[ISOOBJ_BASE][k][j].val < isodata.min ) isodata.min = plvertex[ISOOBJ_BASE][k][j].val; else if ( plvertex[ISOOBJ_BASE][k][j].val > isodata.max ) isodata.max = plvertex[ISOOBJ_BASE][k][j].val; } if (grid->type == DATAGRID_3D) for (j=0; jsignfactor[i] * value; gridvertex[l][k][j].p.x = ((float) l / (grd.nx - 1)) * isodata.vec[ISOOBJ_BASE][0].x + ((float) k / (grd.ny - 1)) * isodata.vec[ISOOBJ_BASE][1].x + ((float) j / (grd.nz - 1)) * isodata.vec[ISOOBJ_BASE][2].x; gridvertex[l][k][j].p.y = ((float) l / (grd.nx - 1)) * isodata.vec[ISOOBJ_BASE][0].y + ((float) k / (grd.ny - 1)) * isodata.vec[ISOOBJ_BASE][1].y + ((float) j / (grd.nz - 1)) * isodata.vec[ISOOBJ_BASE][2].y; gridvertex[l][k][j].p.z = ((float) l / (grd.nx - 1)) * isodata.vec[ISOOBJ_BASE][0].z + ((float) k / (grd.ny - 1)) * isodata.vec[ISOOBJ_BASE][1].z + ((float) j / (grd.nz - 1)) * isodata.vec[ISOOBJ_BASE][2].z; if ( l == 0 && k == 0 && j == 0 ) { isodata.min = gridvertex[l][k][j].val; isodata.max = gridvertex[l][k][j].val; } if ( gridvertex[l][k][j].val < isodata.min ) isodata.min = gridvertex[l][k][j].val; else if ( gridvertex[l][k][j].val > isodata.max ) isodata.max = gridvertex[l][k][j].val; } } CloseDataGridFile(); /* if dim=3D assign also points, vectors & normals for PLANE1, PLANE2, PLANE3 */ if ( isodata.dim[ISOOBJ_BASE] == 3 ) { for(io=ISOOBJ_PLANE1; io<=ISOOBJ_PLANE3; io++) for(i=0; i<3; i++) for(j=0; j<3; j++) isodata.points[io][i][j] = isodata.points[ISOOBJ_BASE][i][j]; isodata.vec[ISOOBJ_PLANE1][0] = isodata.vec[ISOOBJ_BASE][0]; isodata.vec[ISOOBJ_PLANE1][1] = isodata.vec[ISOOBJ_BASE][1]; isodata.vec[ISOOBJ_PLANE1][2] = isodata.vec[ISOOBJ_BASE][2]; isodata.vec[ISOOBJ_PLANE2][0] = isodata.vec[ISOOBJ_BASE][2]; isodata.vec[ISOOBJ_PLANE2][1] = isodata.vec[ISOOBJ_BASE][0]; isodata.vec[ISOOBJ_PLANE2][2] = isodata.vec[ISOOBJ_BASE][1]; isodata.vec[ISOOBJ_PLANE3][0] = isodata.vec[ISOOBJ_BASE][1]; isodata.vec[ISOOBJ_PLANE3][1] = isodata.vec[ISOOBJ_BASE][2]; isodata.vec[ISOOBJ_PLANE3][2] = isodata.vec[ISOOBJ_BASE][0]; for(i=ISOOBJ_PLANE1; i<=ISOOBJ_PLANE3; i++) { isodata.dim[i] = 2; isodata.colnml[i] = VertexNormal(isodata.vec[i][0], isodata.vec[i][1]); } } else { isodata.colnml[ISOOBJ_BASE] = VertexNormal(isodata.vec[ISOOBJ_BASE][0], isodata.vec[ISOOBJ_BASE][1]); } /* now write data to bin_vertex_fp */ if (isostate.bin_vertex_file_open) { fclose( isodata.bin_vertex_fp ); isostate.bin_vertex_file_open = 0; } sprintf(filename, "%s%s%d", xc_system.scratch_dir, "xc_binVrt.", xc_system.pid); if ( (isodata.bin_vertex_fp = fopen(filename,"w+")) == NULL ) { char rss[1024]; snprintf(rss, sizeof(rss),"can't open file \"%s\" while trying to write bin_vertex_fp", filename); Tcl_SetResult(interp, rss, TCL_VOLATILE); xcIsoError(); return TCL_ERROR; } WriteBinVertexFP(); /* this is a hack to allow just visualization of datagrids --> without atom */ if ( natoms == 0 && nframes == 0 ) { /* set (mx, my, mz) */ mx = 2.0 * grid->orig[0] + grid->vec[0][0] + grid->vec[1][0]; my = 2.0 * grid->orig[1] + grid->vec[0][1] + grid->vec[1][1]; mz = 2.0 * grid->orig[2] + grid->vec[0][2] + grid->vec[1][2]; if ( grid->type == DATAGRID_3D ) { MVf.structsize = (double) DetermineParapipedSize(grid->vec[0], grid->vec[1], grid->vec[2], grid->orig); mx += grid->vec[2][0]; my += grid->vec[2][1]; mz += grid->vec[2][2]; } else { MVf.structsize = (double) DetermineParalleSize(grid->vec[0], grid->vec[1], grid->orig); } mx *= 0.5; my *= 0.5; mz *= 0.5; } isostate.stateflag |= ISO_DATA | ISO_FILES; return TCL_OK; } xcrysden-1.6.2/C/tmp.c0000644000175000017500000000151411712736221013204 0ustar tonetone#define XYZ_ApTBmA(dst,a,t,b) \ do { \ dst.x = a.x + t*(b.x-a.x); \ dst.y = a.y + t*(b.y-a.y); \ dst.z = a.z + t*(b.z-a.z); \ } while(0) void trilinear() { /* tri-linear interpolation */ /* z-dir */ XYZ_ApTBmA(u0, grad[0], iver[2], grad[4]); /* u0 = grad[0] + iver[2]*(grad[4]-grad[0]); */ XYZ_ApTBmA(u1, grad[1], iver[2], grad[5]); /* u1 = grad[1] + iver[2]*(grad[5]-grad[1]); */ XYZ_ApTBmA(u2, grad[2], iver[2], grad[6]); /* u2 = grad[2] + iver[2]*(grad[6]-grad[2]); */ XYZ_ApTBmA(u3, grad[3], iver[2], grad[7]); /* u3 = grad[3] + iver[2]*(grad[7]-grad[3]); */ /* y-dir */ XYZ_ApTBmA(v0, u0, iver[1], u1); /* v0 = u0 + iver[1]*(u1-u0); */ XYZ_ApTBmA(v1, u3, iver[1], u2); /* v1 = u3 + iver[1]*(u2-u3); */ /* x-dir */ XYZ_ApTBmA(h, v0, iver[0], v1); /* h = v0 + iver[0]*(v1-v0); */ } xcrysden-1.6.2/C/bz.h0000644000175000017500000000774411712736221013037 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/bz.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define BZ_MAXPOINTS 100 #define BZ_MAXALLPOINTS 500 #define BZ_PRIMCELL 0 #define BZ_CONVCELL 1 #define BZ_OFFSET 0.5 /* offset for BZ in canvas */ #define BZ_CENTERPOINT 1 #define BZ_EDGEPOINT 2 #define BZ_LINEPOINT 4 #define BZ_POLYPOINT 8 #define BZ_LINECENTER 16 #define BZ_THIN_POLYGON_WIDTH 1 #define BZ_BOLD_POLYGON_WIDTH 3 #define BZ_THIN_POINT_SIZE 3.0 #define BZ_BOLD_POINT_SIZE 4.0 #define BZ_CENTERPOINT_SIZE 5.0 #define BZ_ISS 100 /* for xc_bz iss */ typedef struct { float recvec[3][3]; /* reciprocal vectors */ float rot_recvec[3][3]; float vp_recvec[9][2]; float reccoor[BZ_MAXALLPOINTS][3]; int recvec_is_rendered; /* are recvectors rendered */ int npoly; /* number of polygons */ int nvert[WIGNERSEITZ_MAXPOLY]; /*number of vertices for each polygon*/ float max; /* maximum value of coordinates (either X,Y,Z) */ float poly[WIGNERSEITZ_MAXPOLY][WIGNERSEITZ_MAXVERTEX][3]; /*coord of poly */ float norm[WIGNERSEITZ_MAXPOLY][WIGNERSEITZ_MAXVERTEX][3]; int polyindex[BZ_MAXALLPOINTS]; /* index of poly for Z-orientation */ int n_edgepoint; /* number of edgepoint */ int n_linepoint; int n_polypoint; int npoint; /* number of special points */ int nZpoint; /* number of special points + selected-lines; used for Z orientation */ float point[BZ_MAXALLPOINTS][3]; /* original coords of points */ int linepoint_index[BZ_MAXALLPOINTS][2]; /* which polygons share the linepoint */ float rotmat[3][3]; /* rotation matrix */ float rot_poly[WIGNERSEITZ_MAXPOLY][WIGNERSEITZ_MAXVERTEX][3]; /* rotation coordinates of polygons */ float rot_norm[WIGNERSEITZ_MAXPOLY][WIGNERSEITZ_MAXVERTEX][3]; float rot_points[BZ_MAXALLPOINTS][3]; /* rotation coords of points */ float vp_poly[WIGNERSEITZ_MAXPOLY][WIGNERSEITZ_MAXVERTEX][2]; /* viewport coordinates of polygons */ float vp_points[BZ_MAXALLPOINTS][2]; /* viewport coordinates of points */ int pointtype[BZ_MAXALLPOINTS]; /* type of point */ int isrendered; /* is BZ already rendered */ int nselected; /* number of selected points */ int selected_is_rendered[BZ_MAXALLPOINTS]; /* is selected point rendered */ int selectedID[BZ_MAXALLPOINTS]; /* which is selected points -> ID od ordinary point */ int n_sline; /* number of selected lines (sline) */ float sline[BZ_MAXALLPOINTS][6]; /* coorinates of sline */ int slinetype[BZ_MAXALLPOINTS]; /* type of sline */ int sline_index[BZ_MAXALLPOINTS][2]; /* which polygons share the sline; used just for BZ_EDGEPOINT<->BZ_LINEPOINT lines */ int sline_is_rendered[BZ_MAXALLPOINTS]; /* is sline rendered */ float rot_sline[BZ_MAXALLPOINTS][6]; /* rotation coordinates of sline */ float vp_sline[BZ_MAXALLPOINTS][4]; /* viewport coordinates of sline */ float slcenter[BZ_MAXALLPOINTS][3]; /* coordinates of sline center */ float rot_slcenter[BZ_MAXALLPOINTS][3]; /* rot coords of sline center */ } BRILLOUINZONE; BRILLOUINZONE bz[2]; xcrysden-1.6.2/C/xcReadXSF.c0000644000175000017500000002366213514361003014175 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcReadXSF.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include "struct.h" #include "memory.h" #include "xcfunc.h" #define XSF_OPEN 0 #define XSF_UPDATE 1 extern struct DATAGRID *FindDataGrid(int index); extern FILE *MaybeOpenDataGridFile(char *mode); extern int GetNumberOfGridBlocks(void); extern void NewGridList( int gridtype, FILE *gridFP ); extern int ReadBandGrid(FILE *fp, FILE *gridFP, int gridtype, char *ident); int XC_ReadXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_ReadBandXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); /* ------------------------------------------------------------ * * * * xc_readXSF * * * * ------------------------------------------------------------ */ int XC_ReadXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { FILE *fp; printf("argc=%d\n", argc); fflush(stdout); if ( argc != 2 ) { Tcl_SetResult(interp, "Usage: xc_readXSF ", TCL_STATIC); return TCL_ERROR; } /* Check if 'file' is OK */ fp = fopen(argv[1],"r"); if (fp == NULL) { char rss[1024]; snprintf(rss, sizeof(rss), "Can't open file \"%s\"",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* command is OK * LET'S READ A FILE */ if (!ReadStructFile(fp, argv[1], FORMAT_XSF, XSF_OPEN)) { char rss[1024]; snprintf(rss, sizeof(rss),"Error reading file \"%s\"",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); fclose(fp); return TCL_ERROR; } /* assing the sInfo global array */ Set_sInfoArray( interp ); return TCL_OK; } /* ------------------------------------------------------------ * * * * xc_readbandXSF * * * * read BANDGRID3d from (band)XSF file * * ------------------------------------------------------------ */ int XC_ReadBandXSFCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { FILE *fp, *gridFP; char *line; int i, j, c; int first_grid_ind, last_grid_ind; struct DATAGRID *grid; char *string; Tcl_DString *dsPtr = (Tcl_DString *) Tcl_Alloc(sizeof(Tcl_DString)); if ( argc != 2 ) { Tcl_SetResult(interp, "Usage: xc_readbandXSF <(band)XSF-file>", TCL_STATIC); return TCL_ERROR; } /* Check if 'file' is OK */ fp = fopen(argv[1],"r"); if (fp == NULL) { char rss[1024]; snprintf(rss, sizeof(rss), "Can't open file \"%s\"",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /********************* * command is OK * * LET'S READ A FILE * *********************/ /* maximum line width is 256 character */ line = (char *) xcMalloc( sizeof(char) * 256 ); string = (char *) xcMalloc( sizeof(char) * 10000 ); first_grid_ind = GetNumberOfGridBlocks(); while((c = fscanf(fp,"%s\n",line)) != EOF) { /* maybe it is a comment line */ if ( strncmp(line,"#",1) == 0) { /* read the rest of the line */ fscanf(fp,"%[^\n]",line); continue; } /*************************************************************************/ /* read 3D BANDGRID */ /*************************************************************************/ if ( strncmp(line, "BEGIN_BLOCK_BANDGRID3D", 22) == 0 || strncmp(line, "BEGIN_BLOCK_BANDGRID_3D", 23) == 0) { /* read comment line */ fprintf(stderr,"BEGIN_BLOCK_BANDGRID_3D was read\n"); if ( (c = fscanf(fp,"%s\n",line)) == EOF) return XC_ERROR; SetDataGridCommentLine( line ); gridFP = MaybeOpenDataGridFile("w+"); NewGridList( DATAGRID_3D, gridFP ); /* read DATAGRID_3D_XXX line */ if ( (c = fscanf(fp,"%s\n",line)) == EOF) return XC_ERROR; while (strncmp(line, "END_BLOCK_BANDGRID3D", 15) != 0 && strncmp(line, "END_BLOCK_BANDGRID_3D", 15) != 0 ) { if ( strncmp(line, "BANDGRID_3D", 11) == 0 || strncmp(line, "BEGIN_BANDGRID_3D", 17) == 0 || strncmp(line, "BANDGRID3D", 10) == 0 ) { /*fprintf(stderr,"BANDGRID3D\n");*/ if ( ReadBandGrid( fp, gridFP, DATAGRID_3D, line) == XC_ERROR ) { fprintf(stderr, "ERROR: Error reading BANDGRID_3D_ section, while reading "); free(line); return XC_ERROR; } /* read END_DATAGRID_3D line */ /*breakpoint("breakpoint");*/ if ( (c = fscanf(fp,"%s\n",line)) == EOF) return XC_ERROR; if (strncmp(line, "END_BANDGRID_3D", 15) != 0 && strncmp(line, "END_BANDGRID3D", 14) != 0) return XC_ERROR; } else return XC_ERROR; /* read next line */ if ( (c = fscanf(fp,"%s\n",line)) == EOF) return XC_ERROR; } xcr.lbandgrid3D = 1; } else if ( strncmp(line, "INFO_BEGIN", 6) == 0 || strncmp(line, "BEGIN_INFO", 8) == 0) { do { c = fscanf(fp,"%s",line); if (c == EOF) { fprintf(stderr, "ERROR: unexpected end of file, while reading"); free(line); return XC_ERROR; } } while ( strncmp(line, "INFO_END", 8) != 0 && strncmp(line, "END_INFO", 8) != 0); } /*************************************************************************/ else { char rss[1024]; snprintf(rss, sizeof(rss), "expect to read BEGIN_BLOCK_BANDGRID_3D, but got %s, while executing %s %s\n", line, argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } last_grid_ind = GetNumberOfGridBlocks(); /*fprintf(stderr, "first_grid_ind = %d , last_grid_ind = %d\n", first_grid_ind, last_grid_ind);*/ /* return INFO about grid structure; info structure looks like: ----------------------------------------------------------- ngrid { grid_index 2D|3D grid_ident grid_nband grid_n_of_subgrids {subgrid1_ident subgrid2_ident ...} } */ Tcl_DStringInit(dsPtr); sprintf(string,"%d ", last_grid_ind - first_grid_ind); Tcl_DStringAppendElement(dsPtr, string); for (i=first_grid_ind; iindex); Tcl_DStringAppendElement(dsPtr, string); if ( grid->type == DATAGRID_3D ) { sprintf(string,"3D"); } else { sprintf(string,"2D"); } Tcl_DStringAppendElement(dsPtr, string); Tcl_DStringAppendElement(dsPtr, grid->ident); sprintf(string,"%d ", grid->nband); Tcl_DStringAppendElement(dsPtr, string); sprintf(string,"%d", grid->n_of_subgrids); Tcl_DStringAppendElement(dsPtr, string); /* sublist-level #.2 */ Tcl_DStringStartSublist(dsPtr); for(j=0; jn_of_subgrids; j++) { /*fprintf(stderr, "grid #: %d , ident = %s\n", j, grid->subident[j]);*/ Tcl_DStringAppendElement(dsPtr, grid->subident[j]); } Tcl_DStringEndSublist(dsPtr); /* END: sublist-level #.2 */ Tcl_DStringEndSublist(dsPtr); /* END: sublist-level #.1 */ } Tcl_DStringResult(interp, dsPtr); free((FREE_ARG) string); return TCL_OK; } /* ------------------------------------------------------------ * * * * xc_gridvalue min|max grid_index grid_subindex * * * * returns the minimum|maximum value in the grid * * ------------------------------------------------------------ */ int XC_GridValueCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int index, subindex; struct DATAGRID *grid; char *result = (char*) Tcl_Alloc( sizeof(char) * 48); if ( argc != 4 ) { Tcl_SetResult(interp, "Usage: xc_gridminvalue min|max grid_index griod_subindex", TCL_STATIC); return TCL_ERROR; } if ( strcmp(argv[1], "min") != 0 && strcmp(argv[1], "max") != 0 ) { char rss[1024]; snprintf(rss, sizeof(rss), "wrong value-type \"%s\", must be min or max", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[2], &index) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"expected integer, but got %s", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argv[3], &subindex) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"expected integer, but got %s", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } grid = FindDataGrid ( index ); if ( strcmp(argv[1], "min") == 0 ) { sprintf(result, "%f", grid->minvalue[subindex]); } else { sprintf(result, "%f", grid->maxvalue[subindex]); } Tcl_SetResult(interp, result, TCL_DYNAMIC); return TCL_OK; } xcrysden-1.6.2/C/crySetProj.c0000644000175000017500000000620313525506046014514 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/crySetProj.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include "struct.h" #include "xcfunc.h" /* crySetProj.c */ void crySetProjection(NEW_WIN_CONTEXT *wc, struct Togl *togl); void crySetProjection( NEW_WIN_CONTEXT *wc, struct Togl *togl ) { double aspect, size, size_a; OrthoProj o; int width = Togl_Width (togl); int height = Togl_Height(togl); wc->VPf.size = (double) width; aspect = (double) width / (double) height; if (wc->VPf.stropened) { o.minx = wc->ss.minX / wc->tr.zoom; o.maxx = wc->ss.maxX / wc->tr.zoom; o.miny = wc->ss.minY / wc->tr.zoom; o.maxy = wc->ss.maxY / wc->tr.zoom; o.minz = 2.0 * wc->ss.minZ / wc->tr.zoom; o.maxz = 2.0 * wc->ss.maxZ / wc->tr.zoom; if ( aspect > 1 ) { o.minx *= aspect; o.maxx *= aspect; } else { wc->VPf.size = wc->VPf.height; o.miny /= aspect; o.maxy /= aspect; } } else { o.minx = o.miny = o.minz = -1.0; o.maxx = o.maxy = o.maxz = -1.0; } o.size = o.maxx; if ( o.maxy > o.size ) o.size = o.maxy; if ( o.maxz > o.size ) o.size = o.maxz; if (o.size < 1e-20) o.size = 1.0; wc->VPf.VPfactor = wc->VPf.size / (2.0 * o.size); wc->MVf.structsize = sqrt( wc->ss.maxX*wc->ss.maxX + wc->ss.maxY*wc->ss.maxY + wc->ss.maxZ*wc->ss.maxZ ); size = wc->MVf.structsize / wc->tr.zoom; Togl_MakeCurrent( togl ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if ( aspect>1 ) { size_a = aspect * size; /*glOrtho(-size_a, size_a, -size, size, -size, 2*size);*/ glOrtho(-size_a, size_a, -size, size, -wc->MVf.structsize, 2*wc->MVf.structsize); } else { size_a = size / aspect; /*glOrtho(-size, size, -size_a, size_a, -size, 2*size);*/ glOrtho(-size, size, -size_a, size_a, -wc->MVf.structsize, 2*wc->MVf.structsize); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor( wc->bg[0], wc->bg[1], wc->bg[2], wc->bg[3] ); /* T.K. */ glViewport(0, 0, width, height); /*glLoadIdentity();*/ LoadLights(); { int il; for ( il=0; il #include #include #include "struct.h" /* FUNCTION PROTOTYPES */ int MakeSticks1(int i, GLdouble *x1, GLdouble *y1, GLdouble *z1, GLdouble *x2, GLdouble *y2, GLdouble *z2, GLdouble *x3, GLdouble *y3, GLdouble *z3, GLdouble *x4, GLdouble *y4, GLdouble *z4); void MakeArcPoints(void); int MakeSticks2(int i, int col, int flag); /* extern function prototypes */ extern double dist3(double x, double y, double z); extern void Rotate(double *x, double *y, double *z, double cosfi, double sinfi); #define NROD 10 #define AB 0 #define BA 1 GLdouble rodx[NROD + 3]; GLdouble rody[NROD + 3]; GLdouble arcy[NROD + 1]; GLdouble arcz[NROD + 1]; /* Make a STICKS from (coor + *(iwksp + i))->x1 , .... * routine is called from xcBallStick12D * * routine return 1 on success * & return 0 on failure */ int MakeSticks1(int i, GLdouble *x1, GLdouble *y1, GLdouble *z1, GLdouble *x2, GLdouble *y2, GLdouble *z2, GLdouble *x3, GLdouble *y3, GLdouble *z3, GLdouble *x4, GLdouble *y4, GLdouble *z4) { GLdouble corr, xcorr, ycorr, dis; GLdouble rb, fi, cosfi, sinfi; GLdouble xa, ya, za, xb1, yb1, zb1, xb2, yb2, zb2; short type; if ( (coor + i)->bondend == BOND_ATOM_TO_MIDBOND ) { xb1 = (coor + i)->x1; yb1 = (coor + i)->y1; zb1 = (coor + i)->z1; xb2 = (coor + i)->x2; yb2 = (coor + i)->y2; zb2 = (coor + i)->z2; } else { /*if ( (coor + i)->bondend == BOND_MIDBOND_TO_ATOM ) */ xb1 = (coor + i)->x2; yb1 = (coor + i)->y2; zb1 = (coor + i)->z2; xb2 = (coor + i)->x1; yb2 = (coor + i)->y1; zb2 = (coor + i)->z1; } dis = dist3(xb2 - xb1, yb2 - yb1, zb2 - zb1); if ( dis < MINTOL ) { fprintf(stderr,"WARNING: zero bond distance\n"); return 0; } rb = rball[(coor + i)->nat]; /* !!!!!!!!!!!!!!!!!! */ /* first find an intersection of rod and a ball */ xa = xb1 + rb * ( xb2 - xb1 ) / dis; ya = yb1 + rb * ( yb2 - yb1 ) / dis; za = zb1 + rb * ( zb2 - zb1 ) / dis; /* --------------------- * BALL-STICK CORRECTION * --------------------- * sphere on the right of the rod */ if (rb > rrod) corr = rb - sqrt(rb * rb - rrod * rrod); else corr = rb; if ( fabs(xb2 - xb1) > MINTOL ) { /* if ball is on the left of the rod */ if ( xb1 < xa ) corr = -corr; fi = atan( (yb2 - yb1) / (xb2 - xb1) ); } else { /* if bond is nearly vertical than we must take care of this */ if ( yb2 > yb1 ) fi = -PI12; else fi = PI12; } cosfi = cos(fi); sinfi = sin(fi); xa += corr * cosfi; ya += corr * sinfi; xcorr = -rrod * sinfi; ycorr = rrod * cosfi; /* order of polygon drawing is 1, 2, 3, 4 * * 1----------------4 * (ATOM) | | * 2----------------3 * */ if ( (ABS(xb1-xa) > MINTOL) && xb1 < xa ) { type = AB; } else { type = BA; } if ( type == AB ) { /* atom on the left */ *x1 = xa + xcorr; *y1 = ya + ycorr; *z1 = za; *x2 = xa - xcorr; *y2 = ya - ycorr; *z2 = za; *x3 = xb2 - xcorr; *y3 = yb2 - ycorr; *z3 = zb2; *x4 = xb2 + xcorr; *y4 = yb2 + ycorr; *z4 = zb2; } else { *x4 = xa + xcorr; *y4 = ya + ycorr; *z4 = za; *x3 = xa - xcorr; *y3 = ya - ycorr; *z3 = za; *x2 = xb2 - xcorr; *y2 = yb2 - ycorr; *z2 = zb2; *x1 = xb2 + xcorr; *y1 = yb2 + ycorr; *z1 = zb2; } return XC_OK; } void MakeArcPoints(void) { int i; /* on one side of a bond there will be arc, calculate points for this arc */ for(i = 0; i < NROD; i++) { arcy[i] = rrod * cos(i * PI / NROD); arcz[i] = rrod * sin(i * PI / NROD); } arcy[NROD] = -rrod; arcz[NROD] = 0.0; } /* Make a STICKS2 from (coor + *(iwksp + i))->x1 , .... * routine is called from xcBallStick12D * * routine return 1 on success * & return 0 on failure */ int MakeSticks2(int i, int col, int flag) { /* i .... index of atom * col .. index for color; */ int jj; double fac = 1.0; GLdouble corr, xcorr, ycorr, dis; GLdouble rb, fi, psi, xy, cosfi, sinfi, sinpsi; GLdouble xa, ya, za, xb1, yb1, zb1, xb2, yb2, zb2; double rodz = 0.0; short type; if ( (coor + i)->bondend == BOND_ATOM_TO_MIDBOND ) { xb1 = (coor + i)->x1; yb1 = (coor + i)->y1; zb1 = (coor + i)->z1; xb2 = (coor + i)->x2; yb2 = (coor + i)->y2; zb2 = (coor + i)->z2; } else { /*if ( (coor + i)->bondend == BOND_MIDBOND_TO_ATOM ) */ xb1 = (coor + i)->x2; yb1 = (coor + i)->y2; zb1 = (coor + i)->z2; xb2 = (coor + i)->x1; yb2 = (coor + i)->y1; zb2 = (coor + i)->z1; } dis = dist3(xb2 - xb1, yb2 - yb1, zb2 - zb1); if ( dis < MINTOL ) { fprintf(stderr,"zero bond distance"); return 0; } if ( flag != PIPEBALL ) { rb = rball[(coor + i)->nat]; /*!!!!!!!!!!!!!!!!!!*/ } else { rb = rball[1]; } /* first find an intersection of rod and a ball */ xa = xb1 + rb * ( xb2 - xb1 ) / dis; ya = yb1 + rb * ( yb2 - yb1 ) / dis; za = zb1 + rb * ( zb2 - zb1 ) / dis; /* --------------------- * BALL-STICK CORRECTION * --------------------- * sphere on the right of the rod */ if (rb > rrod) corr = rb - sqrt(rb * rb - rrod * rrod); else corr = rb; if ( fabs(xb2 - xb1) > MINTOL ) { /* if ball is on the left of the rod */ if ( xb1 < xa ) corr = -corr; fi = atan( (yb2 - yb1) / (xb2 - xb1) ); } else { /* if bond is nearly vertical than we must take care of this */ if ( yb2 > yb1 ) fi = -PI12; else fi = PI12; } cosfi = cos(fi); sinfi = sin(fi); /* origin of the one side of a bond */ xa += corr * cosfi; ya += corr * sinfi; xcorr = -rrod * sinfi; ycorr = rrod * cosfi; /* calculate angle between line [(xb2,yb2,zb2) - (xb1,yb1,zb1)] and it's * XY projection [ y = - (xcorr/ycorr) * x ] */ xy = dist3(xb2 - xb1, yb2 - yb1, 0.0); if ( xy > MINTOL ) psi = atan( (zb2 - zb1) / xy ); /* if psi > 0 --> (zb2 > zb1) arc on zb1 side */ else psi = 0.0; /* this means we have a bond in pure Z-direction */ /* if we have bond in pure XY direction psi = 0.0 also */ sinpsi = sin(psi); /*==========================================================*/ /* ATTENTION: ARC IS ALWAYS ON THE LOWEST Z-SIDE OF A BOND */ /*==========================================================*/ if ( (ABS(xb1-xa) > MINTOL) && xb1 < xa ) { type = AB; } else { type = BA; } /* if psi > 0 -> bond in front of the ball, not needed to calculate an arc */ if ( psi > 0.0 ) { GLdouble rodz = 0.0; /* this is just to satisfy Rotate() function */ /* if ball is on the left of the rod we must subtract an arc, * else we must add an arc */ if ( xb1 < xb2 ) fac = -1.0; if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[col] ); glBegin(GL_POLYGON); if ( type == AB ) { for(jj = 0; jj <= NROD; jj++) { rodx[jj] = arcz[jj] * sinpsi * fac; rody[jj] = arcy[jj]; Rotate((rodx + jj), (rody + jj), &rodz, cosfi, sinfi); rodx[jj] += xa; rody[jj] += ya; /* now draw a bond */ glVertex3d( rodx[jj], rody[jj], za ); } glVertex3d( xb2 - xcorr, yb2 - ycorr, zb2 ); glVertex3d( xb2 + xcorr, yb2 + ycorr, zb2 ); } else { glVertex3d( xb2 + xcorr, yb2 + ycorr, zb2 ); glVertex3d( xb2 - xcorr, yb2 - ycorr, zb2 ); for(jj = NROD; jj >= 0; jj--) { rodx[jj] = arcz[jj] * sinpsi * fac; rody[jj] = arcy[jj]; Rotate((rodx + jj), (rody + jj), &rodz, cosfi, sinfi); rodx[jj] += xa; rody[jj] += ya; /* now draw a bond */ glVertex3d( rodx[jj], rody[jj], za ); } } glEnd(); glColor3f( 0.0, 0.0, 0.0 ); glBegin(GL_LINE_LOOP); for(jj = 0; jj <= NROD; jj++) { rodx[jj] = arcz[jj] * sinpsi * fac; rody[jj] = arcy[jj]; Rotate((rodx + jj), (rody + jj), &rodz, cosfi, sinfi); rodx[jj] += xa; rody[jj] += ya; /* now draw a bond */ glVertex3d( rodx[jj], rody[jj], za ); } glVertex3d( xb2 - xcorr, yb2 - ycorr, zb2 ); glVertex3d( xb2 + xcorr, yb2 + ycorr, zb2 ); glEnd(); } else if ( psi < 0.0 ) { /* BOND BESIDE THE BALL */ /* if ball is on the right of the rod, we must subtract an arc on the second end of a bond */ if ( xb2 > xb1 ) fac = -1.0; if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[col] ); glBegin(GL_POLYGON); if ( type == BA ) { for(jj = 0; jj <= NROD; jj++) { rodx[jj] = arcz[jj] * sinpsi * fac; rody[jj] = arcy[jj]; Rotate((rodx + jj), (rody + jj), &rodz, cosfi, sinfi); rodx[jj] += xb2; rody[jj] += yb2; /* now draw a bond */ glVertex3d( rodx[jj], rody[jj], zb2 ); } glVertex3d( xa - xcorr, ya - ycorr, za ); glVertex3d( xa + xcorr, ya + ycorr, za ); } else { glVertex3d( xa + xcorr, ya + ycorr, za ); glVertex3d( xa - xcorr, ya - ycorr, za ); for(jj = NROD; jj >= 0; jj--) { rodx[jj] = arcz[jj] * sinpsi * fac; rody[jj] = arcy[jj]; Rotate((rodx + jj), (rody + jj), &rodz, cosfi, sinfi); rodx[jj] += xb2; rody[jj] += yb2; /* now draw a bond */ glVertex3d( rodx[jj], rody[jj], zb2 ); } } glEnd(); glColor3f( 0.0, 0.0, 0.0 ); glBegin(GL_LINE_LOOP); for(jj = 0; jj <= NROD; jj++) { rodx[jj] = arcz[jj] * sinpsi * fac; rody[jj] = arcy[jj]; Rotate((rodx + jj), (rody + jj), &rodz, cosfi, sinfi); rodx[jj] += xb2; rody[jj] += yb2; /* now draw a bond */ glVertex3d( rodx[jj], rody[jj], zb2 ); } glVertex3d( xa - xcorr, ya - ycorr, za ); glVertex3d( xa + xcorr, ya + ycorr, za ); glEnd(); } else { /* if ( psi == 0.0 ) */ /* order of polygon drawing is 1, 2, 3, 4 * * 1----------------4 4---------------1 * | | or | | * 2----------------3 3---------------2 */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[col] ); glBegin(GL_POLYGON); if ( type == AB ) { glVertex3d( xa + xcorr, ya + ycorr, za); glVertex3d( xa - xcorr, ya - ycorr, za); glVertex3d( xb2 - xcorr, yb2 - ycorr, zb2 ); glVertex3d( xb2 + xcorr, yb2 + ycorr, zb2 ); } else { glVertex3d( xb2 + xcorr, yb2 + ycorr, zb2 ); glVertex3d( xb2 - xcorr, yb2 - ycorr, zb2 ); glVertex3d( xa - xcorr, ya - ycorr, za); glVertex3d( xa + xcorr, ya + ycorr, za); } glEnd(); glColor3f( 0.0, 0.0, 0.0 ); glBegin(GL_LINE_LOOP); glVertex3d( xa + xcorr, ya + ycorr, za); glVertex3d( xa - xcorr, ya - ycorr, za); glVertex3d( xb2 - xcorr, yb2 - ycorr, zb2 ); glVertex3d( xb2 + xcorr, yb2 + ycorr, zb2 ); glEnd(); } return XC_OK; } xcrysden-1.6.2/C/gl2ps.c0000644000175000017500000057654113522562060013453 0ustar tonetone/* * GL2PS, an OpenGL to PostScript Printing Library * Copyright (C) 1999-2017 C. Geuzaine * * This program is free software; you can redistribute it and/or * modify it under the terms of either: * * a) the GNU Library General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your * option) any later version; or * * b) the GL2PS License as published by Christophe Geuzaine, 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 either * the GNU Library General Public License or the GL2PS License for * more details. * * You should have received a copy of the GNU Library General Public * License along with this library in the file named "COPYING.LGPL"; * if not, write to the Free Software Foundation, Inc., 51 Franklin * Street, Fifth Floor, Boston, MA 02110-1301, USA. * * You should have received a copy of the GL2PS License with this * library in the file named "COPYING.GL2PS"; if not, I will be glad * to provide one. * * For the latest info about gl2ps and a full list of contributors, * see http://www.geuz.org/gl2ps/. * * Please report all bugs and problems to . */ #include "gl2ps.h" #include #include #include #include #include #include #if defined(GL2PS_HAVE_ZLIB) #include #endif #if defined(GL2PS_HAVE_LIBPNG) #include #endif /********************************************************************* * * Private definitions, data structures and prototypes * *********************************************************************/ /* Magic numbers (assuming that the order of magnitude of window coordinates is 10^3) */ #define GL2PS_EPSILON 5.0e-3F #define GL2PS_ZSCALE 1000.0F #define GL2PS_ZOFFSET 5.0e-2F #define GL2PS_ZOFFSET_LARGE 20.0F #define GL2PS_ZERO(arg) (fabs(arg) < 1.e-20) /* BSP tree primitive comparison */ #define GL2PS_COINCIDENT 1 #define GL2PS_IN_FRONT_OF 2 #define GL2PS_IN_BACK_OF 3 #define GL2PS_SPANNING 4 /* 2D BSP tree primitive comparison */ #define GL2PS_POINT_COINCIDENT 0 #define GL2PS_POINT_INFRONT 1 #define GL2PS_POINT_BACK 2 /* Internal feedback buffer pass-through tokens */ #define GL2PS_BEGIN_OFFSET_TOKEN 1 #define GL2PS_END_OFFSET_TOKEN 2 #define GL2PS_BEGIN_BOUNDARY_TOKEN 3 #define GL2PS_END_BOUNDARY_TOKEN 4 #define GL2PS_BEGIN_STIPPLE_TOKEN 5 #define GL2PS_END_STIPPLE_TOKEN 6 #define GL2PS_POINT_SIZE_TOKEN 7 #define GL2PS_LINE_CAP_TOKEN 8 #define GL2PS_LINE_JOIN_TOKEN 9 #define GL2PS_LINE_WIDTH_TOKEN 10 #define GL2PS_BEGIN_BLEND_TOKEN 11 #define GL2PS_END_BLEND_TOKEN 12 #define GL2PS_SRC_BLEND_TOKEN 13 #define GL2PS_DST_BLEND_TOKEN 14 #define GL2PS_IMAGEMAP_TOKEN 15 #define GL2PS_DRAW_PIXELS_TOKEN 16 #define GL2PS_TEXT_TOKEN 17 typedef enum { T_UNDEFINED = -1, T_CONST_COLOR = 1, T_VAR_COLOR = 1<<1, T_ALPHA_1 = 1<<2, T_ALPHA_LESS_1 = 1<<3, T_VAR_ALPHA = 1<<4 } GL2PS_TRIANGLE_PROPERTY; typedef GLfloat GL2PSplane[4]; typedef struct _GL2PSbsptree2d GL2PSbsptree2d; struct _GL2PSbsptree2d { GL2PSplane plane; GL2PSbsptree2d *front, *back; }; typedef struct { GLint nmax, size, incr, n; char *array; } GL2PSlist; typedef struct _GL2PSbsptree GL2PSbsptree; struct _GL2PSbsptree { GL2PSplane plane; GL2PSlist *primitives; GL2PSbsptree *front, *back; }; typedef struct { GL2PSvertex vertex[3]; int prop; } GL2PStriangle; typedef struct { GLshort fontsize; char *str, *fontname; /* Note: for a 'special' string, 'alignment' holds the format (PostScript, PDF, etc.) of the special string */ GLint alignment; GLfloat angle; } GL2PSstring; typedef struct { GLsizei width, height; /* Note: for an imagemap, 'type' indicates if it has already been written to the file or not, and 'format' indicates if it is visible or not */ GLenum format, type; GLfloat zoom_x, zoom_y; GLfloat *pixels; } GL2PSimage; typedef struct _GL2PSimagemap GL2PSimagemap; struct _GL2PSimagemap { GL2PSimage *image; GL2PSimagemap *next; }; typedef struct { GLshort type, numverts; GLushort pattern; char boundary, offset, culled; GLint factor, linecap, linejoin; GLfloat width, ofactor, ounits; GL2PSvertex *verts; union { GL2PSstring *text; GL2PSimage *image; } data; } GL2PSprimitive; typedef struct { #if defined(GL2PS_HAVE_ZLIB) Bytef *dest, *src, *start; uLongf destLen, srcLen; #else int dummy; #endif } GL2PScompress; typedef struct{ GL2PSlist* ptrlist; int gsno, fontno, imno, shno, maskshno, trgroupno; int gsobjno, fontobjno, imobjno, shobjno, maskshobjno, trgroupobjno; } GL2PSpdfgroup; typedef struct { /* General */ GLint format, sort, options, colorsize, colormode, buffersize; GLint lastlinecap, lastlinejoin; char *title, *producer, *filename; GLboolean boundary, blending; GLfloat *feedback, lastlinewidth; GLint viewport[4], blendfunc[2], lastfactor; GL2PSrgba *colormap, lastrgba, threshold, bgcolor; GLushort lastpattern; GL2PSvertex lastvertex; GL2PSlist *primitives, *auxprimitives; FILE *stream; GL2PScompress *compress; GLboolean header; GL2PSvertex rasterpos; GLboolean forcerasterpos; /* BSP-specific */ GLint maxbestroot; /* Occlusion culling-specific */ GLboolean zerosurfacearea; GL2PSbsptree2d *imagetree; GL2PSprimitive *primitivetoadd; /* PDF-specific */ int streamlength; GL2PSlist *pdfprimlist, *pdfgrouplist; int *xreflist; int objects_stack; /* available objects */ int extgs_stack; /* graphics state object number */ int font_stack; /* font object number */ int im_stack; /* image object number */ int trgroupobjects_stack; /* xobject numbers */ int shader_stack; /* shader object numbers */ int mshader_stack; /* mask shader object numbers */ /* for image map list */ GL2PSimagemap *imagemap_head; GL2PSimagemap *imagemap_tail; } GL2PScontext; typedef struct { void (*printHeader)(void); void (*printFooter)(void); void (*beginViewport)(GLint viewport[4]); GLint (*endViewport)(void); void (*printPrimitive)(void *data); void (*printFinalPrimitive)(void); const char *file_extension; const char *description; } GL2PSbackend; /* The gl2ps context. gl2ps is not thread safe (we should create a local GL2PScontext during gl2psBeginPage) */ static GL2PScontext *gl2ps = NULL; /* Need to forward-declare this one */ static GLint gl2psPrintPrimitives(void); /********************************************************************* * * Utility routines * *********************************************************************/ static void gl2psMsg(GLint level, const char *fmt, ...) { va_list args; if(!(gl2ps->options & GL2PS_SILENT)){ switch(level){ case GL2PS_INFO : fprintf(stderr, "GL2PS info: "); break; case GL2PS_WARNING : fprintf(stderr, "GL2PS warning: "); break; case GL2PS_ERROR : fprintf(stderr, "GL2PS error: "); break; } va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); } /* if(level == GL2PS_ERROR) exit(1); */ } static void *gl2psMalloc(size_t size) { void *ptr; if(!size) return NULL; ptr = malloc(size); if(!ptr){ gl2psMsg(GL2PS_ERROR, "Couldn't allocate requested memory"); return NULL; } return ptr; } static void *gl2psRealloc(void *ptr, size_t size) { void *orig = ptr; if(!size) return NULL; ptr = realloc(orig, size); if(!ptr){ gl2psMsg(GL2PS_ERROR, "Couldn't reallocate requested memory"); free(orig); return NULL; } return ptr; } static void gl2psFree(void *ptr) { if(!ptr) return; free(ptr); } static int gl2psWriteBigEndian(unsigned long data, int bytes) { int i; int size = sizeof(unsigned long); for(i = 1; i <= bytes; ++i){ fputc(0xff & (data >> (size - i) * 8), gl2ps->stream); } return bytes; } /* zlib compression helper routines */ #if defined(GL2PS_HAVE_ZLIB) static void gl2psSetupCompress(void) { gl2ps->compress = (GL2PScompress*)gl2psMalloc(sizeof(GL2PScompress)); gl2ps->compress->src = NULL; gl2ps->compress->start = NULL; gl2ps->compress->dest = NULL; gl2ps->compress->srcLen = 0; gl2ps->compress->destLen = 0; } static void gl2psFreeCompress(void) { if(!gl2ps->compress) return; gl2psFree(gl2ps->compress->start); gl2psFree(gl2ps->compress->dest); gl2ps->compress->src = NULL; gl2ps->compress->start = NULL; gl2ps->compress->dest = NULL; gl2ps->compress->srcLen = 0; gl2ps->compress->destLen = 0; } static int gl2psAllocCompress(unsigned int srcsize) { gl2psFreeCompress(); if(!gl2ps->compress || !srcsize) return GL2PS_ERROR; gl2ps->compress->srcLen = srcsize; gl2ps->compress->destLen = (int)ceil(1.001 * gl2ps->compress->srcLen + 12); gl2ps->compress->src = (Bytef*)gl2psMalloc(gl2ps->compress->srcLen); gl2ps->compress->start = gl2ps->compress->src; gl2ps->compress->dest = (Bytef*)gl2psMalloc(gl2ps->compress->destLen); return GL2PS_SUCCESS; } static void *gl2psReallocCompress(unsigned int srcsize) { if(!gl2ps->compress || !srcsize) return NULL; if(srcsize < gl2ps->compress->srcLen) return gl2ps->compress->start; gl2ps->compress->srcLen = srcsize; gl2ps->compress->destLen = (int)ceil(1.001 * gl2ps->compress->srcLen + 12); gl2ps->compress->src = (Bytef*)gl2psRealloc(gl2ps->compress->src, gl2ps->compress->srcLen); gl2ps->compress->start = gl2ps->compress->src; gl2ps->compress->dest = (Bytef*)gl2psRealloc(gl2ps->compress->dest, gl2ps->compress->destLen); return gl2ps->compress->start; } static int gl2psWriteBigEndianCompress(unsigned long data, int bytes) { int i; int size = sizeof(unsigned long); for(i = 1; i <= bytes; ++i){ *gl2ps->compress->src = (Bytef)(0xff & (data >> (size-i) * 8)); ++gl2ps->compress->src; } return bytes; } static int gl2psDeflate(void) { /* For compatibility with older zlib versions, we use compress(...) instead of compress2(..., Z_BEST_COMPRESSION) */ return compress(gl2ps->compress->dest, &gl2ps->compress->destLen, gl2ps->compress->start, gl2ps->compress->srcLen); } #endif static int gl2psPrintf(const char* fmt, ...) { int ret; va_list args; #if defined(GL2PS_HAVE_ZLIB) static char buf[1024]; char *bufptr = buf; GLboolean freebuf = GL_FALSE; unsigned int oldsize = 0; #if !defined(GL2PS_HAVE_NO_VSNPRINTF) /* Try writing the string to a 1024 byte buffer. If it is too small to fit, keep trying larger sizes until it does. */ int bufsize = sizeof(buf); #endif if(gl2ps->options & GL2PS_COMPRESS){ va_start(args, fmt); #if defined(GL2PS_HAVE_NO_VSNPRINTF) ret = vsprintf(buf, fmt, args); #else ret = vsnprintf(bufptr, bufsize, fmt, args); #endif va_end(args); #if !defined(GL2PS_HAVE_NO_VSNPRINTF) while(ret >= (bufsize - 1) || ret < 0){ /* Too big. Allocate a new buffer. */ bufsize *= 2; if(freebuf == GL_TRUE) gl2psFree(bufptr); bufptr = (char *)gl2psMalloc(bufsize); freebuf = GL_TRUE; va_start(args, fmt); ret = vsnprintf(bufptr, bufsize, fmt, args); va_end(args); } #endif oldsize = gl2ps->compress->srcLen; gl2ps->compress->start = (Bytef*)gl2psReallocCompress(oldsize + ret); memcpy(gl2ps->compress->start + oldsize, bufptr, ret); if(freebuf == GL_TRUE) gl2psFree(bufptr); ret = 0; } else{ #endif va_start(args, fmt); ret = vfprintf(gl2ps->stream, fmt, args); va_end(args); #if defined(GL2PS_HAVE_ZLIB) } #endif return ret; } static void gl2psPrintGzipHeader(void) { #if defined(GL2PS_HAVE_ZLIB) char tmp[10] = {'\x1f', '\x8b', /* magic numbers: 0x1f, 0x8b */ 8, /* compression method: Z_DEFLATED */ 0, /* flags */ 0, 0, 0, 0, /* time */ 2, /* extra flags: max compression */ '\x03'}; /* OS code: 0x03 (Unix) */ if(gl2ps->options & GL2PS_COMPRESS){ gl2psSetupCompress(); /* add the gzip file header */ fwrite(tmp, 10, 1, gl2ps->stream); } #endif } static void gl2psPrintGzipFooter(void) { #if defined(GL2PS_HAVE_ZLIB) int n; uLong crc, len; char tmp[8]; if(gl2ps->options & GL2PS_COMPRESS){ if(Z_OK != gl2psDeflate()){ gl2psMsg(GL2PS_ERROR, "Zlib deflate error"); } else{ /* determine the length of the header in the zlib stream */ n = 2; /* CMF+FLG */ if(gl2ps->compress->dest[1] & (1<<5)){ n += 4; /* DICTID */ } /* write the data, without the zlib header and footer */ fwrite(gl2ps->compress->dest+n, gl2ps->compress->destLen-(n+4), 1, gl2ps->stream); /* add the gzip file footer */ crc = crc32(0L, gl2ps->compress->start, gl2ps->compress->srcLen); for(n = 0; n < 4; ++n){ tmp[n] = (char)(crc & 0xff); crc >>= 8; } len = gl2ps->compress->srcLen; for(n = 4; n < 8; ++n){ tmp[n] = (char)(len & 0xff); len >>= 8; } fwrite(tmp, 8, 1, gl2ps->stream); } gl2psFreeCompress(); gl2psFree(gl2ps->compress); gl2ps->compress = NULL; } #endif } /* The list handling routines */ static void gl2psListRealloc(GL2PSlist *list, GLint n) { if(!list){ gl2psMsg(GL2PS_ERROR, "Cannot reallocate NULL list"); return; } if(n <= 0) return; if(!list->array){ list->nmax = n; list->array = (char*)gl2psMalloc(list->nmax * list->size); } else{ if(n > list->nmax){ list->nmax = ((n - 1) / list->incr + 1) * list->incr; list->array = (char*)gl2psRealloc(list->array, list->nmax * list->size); } } } static GL2PSlist *gl2psListCreate(GLint n, GLint incr, GLint size) { GL2PSlist *list; if(n < 0) n = 0; if(incr <= 0) incr = 1; list = (GL2PSlist*)gl2psMalloc(sizeof(GL2PSlist)); list->nmax = 0; list->incr = incr; list->size = size; list->n = 0; list->array = NULL; gl2psListRealloc(list, n); return list; } static void gl2psListReset(GL2PSlist *list) { if(!list) return; list->n = 0; } static void gl2psListDelete(GL2PSlist *list) { if(!list) return; gl2psFree(list->array); gl2psFree(list); } static void gl2psListAdd(GL2PSlist *list, void *data) { if(!list){ gl2psMsg(GL2PS_ERROR, "Cannot add into unallocated list"); return; } list->n++; gl2psListRealloc(list, list->n); memcpy(&list->array[(list->n - 1) * list->size], data, list->size); } static int gl2psListNbr(GL2PSlist *list) { if(!list) return 0; return list->n; } static void *gl2psListPointer(GL2PSlist *list, GLint idx) { if(!list){ gl2psMsg(GL2PS_ERROR, "Cannot point into unallocated list"); return NULL; } if((idx < 0) || (idx >= list->n)){ gl2psMsg(GL2PS_ERROR, "Wrong list index in gl2psListPointer"); return NULL; } return &list->array[idx * list->size]; } static void gl2psListSort(GL2PSlist *list, int (*fcmp)(const void *a, const void *b)) { if(!list) return; qsort(list->array, list->n, list->size, fcmp); } static void gl2psListAction(GL2PSlist *list, void (*action)(void *data)) { GLint i; for(i = 0; i < gl2psListNbr(list); i++){ (*action)(gl2psListPointer(list, i)); } } static void gl2psListActionInverse(GL2PSlist *list, void (*action)(void *data)) { GLint i; for(i = gl2psListNbr(list); i > 0; i--){ (*action)(gl2psListPointer(list, i-1)); } } #if defined(GL2PS_HAVE_LIBPNG) static void gl2psListRead(GL2PSlist *list, int index, void *data) { if((index < 0) || (index >= list->n)) gl2psMsg(GL2PS_ERROR, "Wrong list index in gl2psListRead"); memcpy(data, &list->array[index * list->size], list->size); } static void gl2psEncodeBase64Block(unsigned char in[3], unsigned char out[4], int len) { static const char cb64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; out[0] = cb64[ in[0] >> 2 ]; out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ]; out[2] = (len > 1) ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '='; out[3] = (len > 2) ? cb64[ in[2] & 0x3f ] : '='; } static void gl2psListEncodeBase64(GL2PSlist *list) { unsigned char *buffer, in[3], out[4]; int i, n, index, len; n = list->n * list->size; buffer = (unsigned char*)gl2psMalloc(n * sizeof(unsigned char)); memcpy(buffer, list->array, n * sizeof(unsigned char)); gl2psListReset(list); index = 0; while(index < n) { len = 0; for(i = 0; i < 3; i++) { if(index < n){ in[i] = buffer[index]; len++; } else{ in[i] = 0; } index++; } if(len) { gl2psEncodeBase64Block(in, out, len); for(i = 0; i < 4; i++) gl2psListAdd(list, &out[i]); } } gl2psFree(buffer); } #endif /* Helpers for rgba colors */ static GLboolean gl2psSameColor(GL2PSrgba rgba1, GL2PSrgba rgba2) { if(!GL2PS_ZERO(rgba1[0] - rgba2[0]) || !GL2PS_ZERO(rgba1[1] - rgba2[1]) || !GL2PS_ZERO(rgba1[2] - rgba2[2])) return GL_FALSE; return GL_TRUE; } static GLboolean gl2psVertsSameColor(const GL2PSprimitive *prim) { int i; for(i = 1; i < prim->numverts; i++){ if(!gl2psSameColor(prim->verts[0].rgba, prim->verts[i].rgba)){ return GL_FALSE; } } return GL_TRUE; } static GLboolean gl2psSameColorThreshold(int n, GL2PSrgba rgba[], GL2PSrgba threshold) { int i; if(n < 2) return GL_TRUE; for(i = 1; i < n; i++){ if(fabs(rgba[0][0] - rgba[i][0]) > threshold[0] || fabs(rgba[0][1] - rgba[i][1]) > threshold[1] || fabs(rgba[0][2] - rgba[i][2]) > threshold[2]) return GL_FALSE; } return GL_TRUE; } static void gl2psSetLastColor(GL2PSrgba rgba) { int i; for(i = 0; i < 3; ++i){ gl2ps->lastrgba[i] = rgba[i]; } } static GLfloat gl2psGetRGB(GL2PSimage *im, GLuint x, GLuint y, GLfloat *red, GLfloat *green, GLfloat *blue) { GLsizei width = im->width; GLsizei height = im->height; GLfloat *pixels = im->pixels; GLfloat *pimag; /* OpenGL image is from down to up, PS image is up to down */ switch(im->format){ case GL_RGBA: pimag = pixels + 4 * (width * (height - 1 - y) + x); break; case GL_RGB: default: pimag = pixels + 3 * (width * (height - 1 - y) + x); break; } *red = *pimag; pimag++; *green = *pimag; pimag++; *blue = *pimag; pimag++; return (im->format == GL_RGBA) ? *pimag : 1.0F; } /* Helper routines for pixmaps */ static GL2PSimage *gl2psCopyPixmap(GL2PSimage *im) { int size; GL2PSimage *image = (GL2PSimage*)gl2psMalloc(sizeof(GL2PSimage)); image->width = im->width; image->height = im->height; image->format = im->format; image->type = im->type; image->zoom_x = im->zoom_x; image->zoom_y = im->zoom_y; switch(image->format){ case GL_RGBA: size = image->height * image->width * 4 * sizeof(GLfloat); break; case GL_RGB: default: size = image->height * image->width * 3 * sizeof(GLfloat); break; } image->pixels = (GLfloat*)gl2psMalloc(size); memcpy(image->pixels, im->pixels, size); return image; } static void gl2psFreePixmap(GL2PSimage *im) { if(!im) return; gl2psFree(im->pixels); gl2psFree(im); } #if defined(GL2PS_HAVE_LIBPNG) #if !defined(png_jmpbuf) # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) #endif static void gl2psUserWritePNG(png_structp png_ptr, png_bytep data, png_size_t length) { unsigned int i; GL2PSlist *png = (GL2PSlist*)png_get_io_ptr(png_ptr); for(i = 0; i < length; i++) gl2psListAdd(png, &data[i]); } static void gl2psUserFlushPNG(png_structp png_ptr) { (void) png_ptr; /* not used */ } static void gl2psConvertPixmapToPNG(GL2PSimage *pixmap, GL2PSlist *png) { png_structp png_ptr; png_infop info_ptr; unsigned char *row_data; GLfloat dr, dg, db; int row, col; if(!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) return; if(!(info_ptr = png_create_info_struct(png_ptr))){ png_destroy_write_struct(&png_ptr, NULL); return; } if(setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); return; } png_set_write_fn(png_ptr, (void *)png, gl2psUserWritePNG, gl2psUserFlushPNG); png_set_compression_level(png_ptr, Z_DEFAULT_COMPRESSION); png_set_IHDR(png_ptr, info_ptr, pixmap->width, pixmap->height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png_ptr, info_ptr); row_data = (unsigned char*)gl2psMalloc(3 * pixmap->width * sizeof(unsigned char)); for(row = 0; row < pixmap->height; row++){ for(col = 0; col < pixmap->width; col++){ gl2psGetRGB(pixmap, col, row, &dr, &dg, &db); row_data[3*col] = (unsigned char)(255. * dr); row_data[3*col+1] = (unsigned char)(255. * dg); row_data[3*col+2] = (unsigned char)(255. * db); } png_write_row(png_ptr, (png_bytep)row_data); } gl2psFree(row_data); png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); } #endif /* Helper routines for text strings */ static GLint gl2psAddText(GLint type, const char *str, const char *fontname, GLshort fontsize, GLint alignment, GLfloat angle, GL2PSrgba color) { GLfloat pos[4]; GL2PSprimitive *prim; GLboolean valid; if(!gl2ps || !str || !fontname) return GL2PS_UNINITIALIZED; if(gl2ps->options & GL2PS_NO_TEXT) return GL2PS_SUCCESS; if (gl2ps->forcerasterpos) { pos[0] = gl2ps->rasterpos.xyz[0]; pos[1] = gl2ps->rasterpos.xyz[1]; pos[2] = gl2ps->rasterpos.xyz[2]; pos[3] = 1.f; } else { glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid); if(GL_FALSE == valid) return GL2PS_SUCCESS; /* the primitive is culled */ glGetFloatv(GL_CURRENT_RASTER_POSITION, pos); } prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = (GLshort)type; prim->boundary = 0; prim->numverts = 1; prim->verts = (GL2PSvertex*)gl2psMalloc(sizeof(GL2PSvertex)); prim->verts[0].xyz[0] = pos[0]; prim->verts[0].xyz[1] = pos[1]; prim->verts[0].xyz[2] = pos[2]; prim->culled = 0; prim->offset = 0; prim->ofactor = 0.0; prim->ounits = 0.0; prim->pattern = 0; prim->factor = 0; prim->width = 1; prim->linecap = 0; prim->linejoin = 0; if (color) { memcpy(prim->verts[0].rgba, color, 4 * sizeof(float)); } else { if (gl2ps->forcerasterpos) { prim->verts[0].rgba[0] = gl2ps->rasterpos.rgba[0]; prim->verts[0].rgba[1] = gl2ps->rasterpos.rgba[1]; prim->verts[0].rgba[2] = gl2ps->rasterpos.rgba[2]; prim->verts[0].rgba[3] = gl2ps->rasterpos.rgba[3]; } else { glGetFloatv(GL_CURRENT_RASTER_COLOR, prim->verts[0].rgba); } } prim->data.text = (GL2PSstring*)gl2psMalloc(sizeof(GL2PSstring)); prim->data.text->str = (char*)gl2psMalloc((strlen(str)+1)*sizeof(char)); strcpy(prim->data.text->str, str); prim->data.text->fontname = (char*)gl2psMalloc((strlen(fontname)+1)*sizeof(char)); strcpy(prim->data.text->fontname, fontname); prim->data.text->fontsize = fontsize; prim->data.text->alignment = alignment; prim->data.text->angle = angle; gl2ps->forcerasterpos = GL_FALSE; /* If no OpenGL context, just add directly to primitives */ if (gl2ps->options & GL2PS_NO_OPENGL_CONTEXT) { gl2psListAdd(gl2ps->primitives, &prim); } else { gl2psListAdd(gl2ps->auxprimitives, &prim); glPassThrough(GL2PS_TEXT_TOKEN); } return GL2PS_SUCCESS; } static GL2PSstring *gl2psCopyText(GL2PSstring *t) { GL2PSstring *text = (GL2PSstring*)gl2psMalloc(sizeof(GL2PSstring)); text->str = (char*)gl2psMalloc((strlen(t->str)+1)*sizeof(char)); strcpy(text->str, t->str); text->fontname = (char*)gl2psMalloc((strlen(t->fontname)+1)*sizeof(char)); strcpy(text->fontname, t->fontname); text->fontsize = t->fontsize; text->alignment = t->alignment; text->angle = t->angle; return text; } static void gl2psFreeText(GL2PSstring *text) { if(!text) return; gl2psFree(text->str); gl2psFree(text->fontname); gl2psFree(text); } /* Helpers for blending modes */ static GLboolean gl2psSupportedBlendMode(GLenum sfactor, GLenum dfactor) { /* returns TRUE if gl2ps supports the argument combination: only two blending modes have been implemented so far */ if( (sfactor == GL_SRC_ALPHA && dfactor == GL_ONE_MINUS_SRC_ALPHA) || (sfactor == GL_ONE && dfactor == GL_ZERO) ) return GL_TRUE; return GL_FALSE; } static void gl2psAdaptVertexForBlending(GL2PSvertex *v) { /* Transforms vertex depending on the actual blending function - currently the vertex v is considered as source vertex and his alpha value is changed to 1.0 if source blending GL_ONE is active. This might be extended in the future */ if(!v || !gl2ps) return; if(gl2ps->options & GL2PS_NO_BLENDING || !gl2ps->blending){ v->rgba[3] = 1.0F; return; } switch(gl2ps->blendfunc[0]){ case GL_ONE: v->rgba[3] = 1.0F; break; default: break; } } static void gl2psAssignTriangleProperties(GL2PStriangle *t) { /* int i; */ t->prop = T_VAR_COLOR; /* Uncommenting the following lines activates an even more fine grained distinction between triangle types - please don't delete, a remarkable amount of PDF handling code inside this file depends on it if activated */ /* t->prop = T_CONST_COLOR; for(i = 0; i < 3; ++i){ if(!GL2PS_ZERO(t->vertex[0].rgba[i] - t->vertex[1].rgba[i]) || !GL2PS_ZERO(t->vertex[1].rgba[i] - t->vertex[2].rgba[i])){ t->prop = T_VAR_COLOR; break; } } */ if(!GL2PS_ZERO(t->vertex[0].rgba[3] - t->vertex[1].rgba[3]) || !GL2PS_ZERO(t->vertex[1].rgba[3] - t->vertex[2].rgba[3])){ t->prop |= T_VAR_ALPHA; } else{ if(t->vertex[0].rgba[3] < 1) t->prop |= T_ALPHA_LESS_1; else t->prop |= T_ALPHA_1; } } static void gl2psFillTriangleFromPrimitive(GL2PStriangle *t, GL2PSprimitive *p, GLboolean assignprops) { t->vertex[0] = p->verts[0]; t->vertex[1] = p->verts[1]; t->vertex[2] = p->verts[2]; if(GL_TRUE == assignprops) gl2psAssignTriangleProperties(t); } static void gl2psInitTriangle(GL2PStriangle *t) { int i; GL2PSvertex vertex = { {-1.0F, -1.0F, -1.0F}, {-1.0F, -1.0F, -1.0F, -1.0F} }; for(i = 0; i < 3; i++) t->vertex[i] = vertex; t->prop = T_UNDEFINED; } /* Miscellaneous helper routines */ static void gl2psResetLineProperties(void) { gl2ps->lastlinewidth = 0.; gl2ps->lastlinecap = gl2ps->lastlinejoin = 0; } static GL2PSprimitive *gl2psCopyPrimitive(GL2PSprimitive *p) { GL2PSprimitive *prim; if(!p){ gl2psMsg(GL2PS_ERROR, "Trying to copy an empty primitive"); return NULL; } prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = p->type; prim->numverts = p->numverts; prim->boundary = p->boundary; prim->offset = p->offset; prim->ofactor = p->ofactor; prim->ounits = p->ounits; prim->pattern = p->pattern; prim->factor = p->factor; prim->culled = p->culled; prim->width = p->width; prim->linecap = p->linecap; prim->linejoin = p->linejoin; prim->verts = (GL2PSvertex*)gl2psMalloc(p->numverts*sizeof(GL2PSvertex)); memcpy(prim->verts, p->verts, p->numverts * sizeof(GL2PSvertex)); switch(prim->type){ case GL2PS_PIXMAP : prim->data.image = gl2psCopyPixmap(p->data.image); break; case GL2PS_TEXT : case GL2PS_SPECIAL : prim->data.text = gl2psCopyText(p->data.text); break; default: break; } return prim; } static GLboolean gl2psSamePosition(GL2PSxyz p1, GL2PSxyz p2) { if(!GL2PS_ZERO(p1[0] - p2[0]) || !GL2PS_ZERO(p1[1] - p2[1]) || !GL2PS_ZERO(p1[2] - p2[2])) return GL_FALSE; return GL_TRUE; } /********************************************************************* * * 3D sorting routines * *********************************************************************/ static GLfloat gl2psComparePointPlane(GL2PSxyz point, GL2PSplane plane) { return (plane[0] * point[0] + plane[1] * point[1] + plane[2] * point[2] + plane[3]); } static GLfloat gl2psPsca(GLfloat *a, GLfloat *b) { return (a[0]*b[0] + a[1]*b[1] + a[2]*b[2]); } static void gl2psPvec(GLfloat *a, GLfloat *b, GLfloat *c) { c[0] = a[1]*b[2] - a[2]*b[1]; c[1] = a[2]*b[0] - a[0]*b[2]; c[2] = a[0]*b[1] - a[1]*b[0]; } static GLfloat gl2psNorm(GLfloat *a) { return (GLfloat)sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]); } static void gl2psGetNormal(GLfloat *a, GLfloat *b, GLfloat *c) { GLfloat norm; gl2psPvec(a, b, c); if(!GL2PS_ZERO(norm = gl2psNorm(c))){ c[0] = c[0] / norm; c[1] = c[1] / norm; c[2] = c[2] / norm; } else{ /* The plane is still wrong despite our tests in gl2psGetPlane. Let's return a dummy value for now (this is a hack: we should do more intelligent tests in GetPlane) */ c[0] = c[1] = 0.0F; c[2] = 1.0F; } } static void gl2psGetPlane(GL2PSprimitive *prim, GL2PSplane plane) { GL2PSxyz v = {0.0F, 0.0F, 0.0F}, w = {0.0F, 0.0F, 0.0F}; switch(prim->type){ case GL2PS_TRIANGLE : case GL2PS_QUADRANGLE : v[0] = prim->verts[1].xyz[0] - prim->verts[0].xyz[0]; v[1] = prim->verts[1].xyz[1] - prim->verts[0].xyz[1]; v[2] = prim->verts[1].xyz[2] - prim->verts[0].xyz[2]; w[0] = prim->verts[2].xyz[0] - prim->verts[0].xyz[0]; w[1] = prim->verts[2].xyz[1] - prim->verts[0].xyz[1]; w[2] = prim->verts[2].xyz[2] - prim->verts[0].xyz[2]; if((GL2PS_ZERO(v[0]) && GL2PS_ZERO(v[1]) && GL2PS_ZERO(v[2])) || (GL2PS_ZERO(w[0]) && GL2PS_ZERO(w[1]) && GL2PS_ZERO(w[2]))){ plane[0] = plane[1] = 0.0F; plane[2] = 1.0F; plane[3] = -prim->verts[0].xyz[2]; } else{ gl2psGetNormal(v, w, plane); plane[3] = - plane[0] * prim->verts[0].xyz[0] - plane[1] * prim->verts[0].xyz[1] - plane[2] * prim->verts[0].xyz[2]; } break; case GL2PS_LINE : v[0] = prim->verts[1].xyz[0] - prim->verts[0].xyz[0]; v[1] = prim->verts[1].xyz[1] - prim->verts[0].xyz[1]; v[2] = prim->verts[1].xyz[2] - prim->verts[0].xyz[2]; if(GL2PS_ZERO(v[0]) && GL2PS_ZERO(v[1]) && GL2PS_ZERO(v[2])){ plane[0] = plane[1] = 0.0F; plane[2] = 1.0F; plane[3] = -prim->verts[0].xyz[2]; } else{ if(GL2PS_ZERO(v[0])) w[0] = 1.0F; else if(GL2PS_ZERO(v[1])) w[1] = 1.0F; else w[2] = 1.0F; gl2psGetNormal(v, w, plane); plane[3] = - plane[0] * prim->verts[0].xyz[0] - plane[1] * prim->verts[0].xyz[1] - plane[2] * prim->verts[0].xyz[2]; } break; case GL2PS_POINT : case GL2PS_PIXMAP : case GL2PS_TEXT : case GL2PS_SPECIAL : case GL2PS_IMAGEMAP: plane[0] = plane[1] = 0.0F; plane[2] = 1.0F; plane[3] = -prim->verts[0].xyz[2]; break; default : gl2psMsg(GL2PS_ERROR, "Unknown primitive type in BSP tree"); plane[0] = plane[1] = plane[3] = 0.0F; plane[2] = 1.0F; break; } } static void gl2psCutEdge(GL2PSvertex *a, GL2PSvertex *b, GL2PSplane plane, GL2PSvertex *c) { GL2PSxyz v; GLfloat sect, psca; v[0] = b->xyz[0] - a->xyz[0]; v[1] = b->xyz[1] - a->xyz[1]; v[2] = b->xyz[2] - a->xyz[2]; if(!GL2PS_ZERO(psca = gl2psPsca(plane, v))) sect = -gl2psComparePointPlane(a->xyz, plane) / psca; else sect = 0.0F; c->xyz[0] = a->xyz[0] + v[0] * sect; c->xyz[1] = a->xyz[1] + v[1] * sect; c->xyz[2] = a->xyz[2] + v[2] * sect; c->rgba[0] = (1 - sect) * a->rgba[0] + sect * b->rgba[0]; c->rgba[1] = (1 - sect) * a->rgba[1] + sect * b->rgba[1]; c->rgba[2] = (1 - sect) * a->rgba[2] + sect * b->rgba[2]; c->rgba[3] = (1 - sect) * a->rgba[3] + sect * b->rgba[3]; } static void gl2psCreateSplitPrimitive(GL2PSprimitive *parent, GL2PSplane plane, GL2PSprimitive *child, GLshort numverts, GLshort *index0, GLshort *index1) { GLshort i; if(parent->type == GL2PS_IMAGEMAP){ child->type = GL2PS_IMAGEMAP; child->data.image = parent->data.image; } else{ if(numverts > 4){ gl2psMsg(GL2PS_WARNING, "%d vertices in polygon", numverts); numverts = 4; } switch(numverts){ case 1 : child->type = GL2PS_POINT; break; case 2 : child->type = GL2PS_LINE; break; case 3 : child->type = GL2PS_TRIANGLE; break; case 4 : child->type = GL2PS_QUADRANGLE; break; default: child->type = GL2PS_NO_TYPE; break; } } child->boundary = 0; /* FIXME: not done! */ child->culled = parent->culled; child->offset = parent->offset; child->ofactor = parent->ofactor; child->ounits = parent->ounits; child->pattern = parent->pattern; child->factor = parent->factor; child->width = parent->width; child->linecap = parent->linecap; child->linejoin = parent->linejoin; child->numverts = numverts; child->verts = (GL2PSvertex*)gl2psMalloc(numverts * sizeof(GL2PSvertex)); for(i = 0; i < numverts; i++){ if(index1[i] < 0){ child->verts[i] = parent->verts[index0[i]]; } else{ gl2psCutEdge(&parent->verts[index0[i]], &parent->verts[index1[i]], plane, &child->verts[i]); } } } static void gl2psAddIndex(GLshort *index0, GLshort *index1, GLshort *nb, GLshort i, GLshort j) { GLint k; for(k = 0; k < *nb; k++){ if((index0[k] == i && index1[k] == j) || (index1[k] == i && index0[k] == j)) return; } index0[*nb] = i; index1[*nb] = j; (*nb)++; } static GLshort gl2psGetIndex(GLshort i, GLshort num) { return (i < num - 1) ? i + 1 : 0; } static GLint gl2psTestSplitPrimitive(GL2PSprimitive *prim, GL2PSplane plane) { GLint type = GL2PS_COINCIDENT; GLshort i, j; GLfloat d[5]; for(i = 0; i < prim->numverts; i++){ d[i] = gl2psComparePointPlane(prim->verts[i].xyz, plane); } if(prim->numverts < 2){ return 0; } else{ for(i = 0; i < prim->numverts; i++){ j = gl2psGetIndex(i, prim->numverts); if(d[j] > GL2PS_EPSILON){ if(type == GL2PS_COINCIDENT) type = GL2PS_IN_BACK_OF; else if(type != GL2PS_IN_BACK_OF) return 1; if(d[i] < -GL2PS_EPSILON) return 1; } else if(d[j] < -GL2PS_EPSILON){ if(type == GL2PS_COINCIDENT) type = GL2PS_IN_FRONT_OF; else if(type != GL2PS_IN_FRONT_OF) return 1; if(d[i] > GL2PS_EPSILON) return 1; } } } return 0; } static GLint gl2psSplitPrimitive(GL2PSprimitive *prim, GL2PSplane plane, GL2PSprimitive **front, GL2PSprimitive **back) { GLshort i, j, in = 0, out = 0, in0[5], in1[5], out0[5], out1[5]; GLint type; GLfloat d[5]; type = GL2PS_COINCIDENT; for(i = 0; i < prim->numverts; i++){ d[i] = gl2psComparePointPlane(prim->verts[i].xyz, plane); } switch(prim->type){ case GL2PS_POINT : if(d[0] > GL2PS_EPSILON) type = GL2PS_IN_BACK_OF; else if(d[0] < -GL2PS_EPSILON) type = GL2PS_IN_FRONT_OF; else type = GL2PS_COINCIDENT; break; default : for(i = 0; i < prim->numverts; i++){ j = gl2psGetIndex(i, prim->numverts); if(d[j] > GL2PS_EPSILON){ if(type == GL2PS_COINCIDENT) type = GL2PS_IN_BACK_OF; else if(type != GL2PS_IN_BACK_OF) type = GL2PS_SPANNING; if(d[i] < -GL2PS_EPSILON){ gl2psAddIndex(in0, in1, &in, i, j); gl2psAddIndex(out0, out1, &out, i, j); type = GL2PS_SPANNING; } gl2psAddIndex(out0, out1, &out, j, -1); } else if(d[j] < -GL2PS_EPSILON){ if(type == GL2PS_COINCIDENT) type = GL2PS_IN_FRONT_OF; else if(type != GL2PS_IN_FRONT_OF) type = GL2PS_SPANNING; if(d[i] > GL2PS_EPSILON){ gl2psAddIndex(in0, in1, &in, i, j); gl2psAddIndex(out0, out1, &out, i, j); type = GL2PS_SPANNING; } gl2psAddIndex(in0, in1, &in, j, -1); } else{ gl2psAddIndex(in0, in1, &in, j, -1); gl2psAddIndex(out0, out1, &out, j, -1); } } break; } if(type == GL2PS_SPANNING){ *back = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); *front = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); gl2psCreateSplitPrimitive(prim, plane, *back, out, out0, out1); gl2psCreateSplitPrimitive(prim, plane, *front, in, in0, in1); } return type; } static void gl2psDivideQuad(GL2PSprimitive *quad, GL2PSprimitive **t1, GL2PSprimitive **t2) { *t1 = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); *t2 = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); (*t1)->type = (*t2)->type = GL2PS_TRIANGLE; (*t1)->numverts = (*t2)->numverts = 3; (*t1)->culled = (*t2)->culled = quad->culled; (*t1)->offset = (*t2)->offset = quad->offset; (*t1)->ofactor = (*t2)->ofactor = quad->ofactor; (*t1)->ounits = (*t2)->ounits = quad->ounits; (*t1)->pattern = (*t2)->pattern = quad->pattern; (*t1)->factor = (*t2)->factor = quad->factor; (*t1)->width = (*t2)->width = quad->width; (*t1)->linecap = (*t2)->linecap = quad->linecap; (*t1)->linejoin = (*t2)->linejoin = quad->linejoin; (*t1)->verts = (GL2PSvertex*)gl2psMalloc(3 * sizeof(GL2PSvertex)); (*t2)->verts = (GL2PSvertex*)gl2psMalloc(3 * sizeof(GL2PSvertex)); (*t1)->verts[0] = quad->verts[0]; (*t1)->verts[1] = quad->verts[1]; (*t1)->verts[2] = quad->verts[2]; (*t1)->boundary = ((quad->boundary & 1) ? 1 : 0) | ((quad->boundary & 2) ? 2 : 0); (*t2)->verts[0] = quad->verts[0]; (*t2)->verts[1] = quad->verts[2]; (*t2)->verts[2] = quad->verts[3]; (*t2)->boundary = ((quad->boundary & 4) ? 2 : 0) | ((quad->boundary & 8) ? 4 : 0); } static int gl2psCompareDepth(const void *a, const void *b) { const GL2PSprimitive *q, *w; GLfloat dq = 0.0F, dw = 0.0F, diff; int i; q = *(const GL2PSprimitive* const*)a; w = *(const GL2PSprimitive* const*)b; for(i = 0; i < q->numverts; i++){ dq += q->verts[i].xyz[2]; } dq /= (GLfloat)q->numverts; for(i = 0; i < w->numverts; i++){ dw += w->verts[i].xyz[2]; } dw /= (GLfloat)w->numverts; diff = dq - dw; if(diff > 0.){ return -1; } else if(diff < 0.){ return 1; } else{ return 0; } } static int gl2psTrianglesFirst(const void *a, const void *b) { const GL2PSprimitive *q, *w; q = *(const GL2PSprimitive* const*)a; w = *(const GL2PSprimitive* const*)b; return (q->type < w->type ? 1 : -1); } static GLint gl2psFindRoot(GL2PSlist *primitives, GL2PSprimitive **root) { GLint i, j, count, best = 1000000, idx = 0; GL2PSprimitive *prim1, *prim2; GL2PSplane plane; GLint maxp; if(!gl2psListNbr(primitives)){ gl2psMsg(GL2PS_ERROR, "Cannot fint root in empty primitive list"); return 0; } *root = *(GL2PSprimitive**)gl2psListPointer(primitives, 0); if(gl2ps->options & GL2PS_BEST_ROOT){ maxp = gl2psListNbr(primitives); if(maxp > gl2ps->maxbestroot){ maxp = gl2ps->maxbestroot; } for(i = 0; i < maxp; i++){ prim1 = *(GL2PSprimitive**)gl2psListPointer(primitives, i); gl2psGetPlane(prim1, plane); count = 0; for(j = 0; j < gl2psListNbr(primitives); j++){ if(j != i){ prim2 = *(GL2PSprimitive**)gl2psListPointer(primitives, j); count += gl2psTestSplitPrimitive(prim2, plane); } if(count > best) break; } if(count < best){ best = count; idx = i; *root = prim1; if(!count) return idx; } } /* if(index) gl2psMsg(GL2PS_INFO, "GL2PS_BEST_ROOT was worth it: %d", index); */ return idx; } else{ return 0; } } static void gl2psFreeImagemap(GL2PSimagemap *list) { GL2PSimagemap *next; while(list != NULL){ next = list->next; gl2psFree(list->image->pixels); gl2psFree(list->image); gl2psFree(list); list = next; } } static void gl2psFreePrimitive(void *data) { GL2PSprimitive *q; q = *(GL2PSprimitive**)data; gl2psFree(q->verts); if(q->type == GL2PS_TEXT || q->type == GL2PS_SPECIAL){ gl2psFreeText(q->data.text); } else if(q->type == GL2PS_PIXMAP){ gl2psFreePixmap(q->data.image); } gl2psFree(q); } static void gl2psAddPrimitiveInList(GL2PSprimitive *prim, GL2PSlist *list) { GL2PSprimitive *t1, *t2; if(prim->type != GL2PS_QUADRANGLE){ gl2psListAdd(list, &prim); } else{ gl2psDivideQuad(prim, &t1, &t2); gl2psListAdd(list, &t1); gl2psListAdd(list, &t2); gl2psFreePrimitive(&prim); } } static void gl2psFreeBspTree(GL2PSbsptree **tree) { if(*tree){ if((*tree)->back) gl2psFreeBspTree(&(*tree)->back); if((*tree)->primitives){ gl2psListAction((*tree)->primitives, gl2psFreePrimitive); gl2psListDelete((*tree)->primitives); } if((*tree)->front) gl2psFreeBspTree(&(*tree)->front); gl2psFree(*tree); *tree = NULL; } } static GLboolean gl2psGreater(GLfloat f1, GLfloat f2) { if(f1 > f2) return GL_TRUE; else return GL_FALSE; } static GLboolean gl2psLess(GLfloat f1, GLfloat f2) { if(f1 < f2) return GL_TRUE; else return GL_FALSE; } static void gl2psBuildBspTree(GL2PSbsptree *tree, GL2PSlist *primitives) { GL2PSprimitive *prim, *frontprim = NULL, *backprim = NULL; GL2PSlist *frontlist, *backlist; GLint i, idx; tree->front = NULL; tree->back = NULL; tree->primitives = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); idx = gl2psFindRoot(primitives, &prim); gl2psGetPlane(prim, tree->plane); gl2psAddPrimitiveInList(prim, tree->primitives); frontlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); backlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); for(i = 0; i < gl2psListNbr(primitives); i++){ if(i != idx){ prim = *(GL2PSprimitive**)gl2psListPointer(primitives,i); switch(gl2psSplitPrimitive(prim, tree->plane, &frontprim, &backprim)){ case GL2PS_COINCIDENT: gl2psAddPrimitiveInList(prim, tree->primitives); break; case GL2PS_IN_BACK_OF: gl2psAddPrimitiveInList(prim, backlist); break; case GL2PS_IN_FRONT_OF: gl2psAddPrimitiveInList(prim, frontlist); break; case GL2PS_SPANNING: gl2psAddPrimitiveInList(backprim, backlist); gl2psAddPrimitiveInList(frontprim, frontlist); gl2psFreePrimitive(&prim); break; } } } if(gl2psListNbr(tree->primitives)){ gl2psListSort(tree->primitives, gl2psTrianglesFirst); } if(gl2psListNbr(frontlist)){ gl2psListSort(frontlist, gl2psTrianglesFirst); tree->front = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); gl2psBuildBspTree(tree->front, frontlist); } else{ gl2psListDelete(frontlist); } if(gl2psListNbr(backlist)){ gl2psListSort(backlist, gl2psTrianglesFirst); tree->back = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); gl2psBuildBspTree(tree->back, backlist); } else{ gl2psListDelete(backlist); } gl2psListDelete(primitives); } static void gl2psTraverseBspTree(GL2PSbsptree *tree, GL2PSxyz eye, GLfloat epsilon, GLboolean (*compare)(GLfloat f1, GLfloat f2), void (*action)(void *data), int inverse) { GLfloat result; if(!tree) return; result = gl2psComparePointPlane(eye, tree->plane); if(GL_TRUE == compare(result, epsilon)){ gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action, inverse); if(inverse){ gl2psListActionInverse(tree->primitives, action); } else{ gl2psListAction(tree->primitives, action); } gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action, inverse); } else if(GL_TRUE == compare(-epsilon, result)){ gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action, inverse); if(inverse){ gl2psListActionInverse(tree->primitives, action); } else{ gl2psListAction(tree->primitives, action); } gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action, inverse); } else{ gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action, inverse); gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action, inverse); } } static void gl2psRescaleAndOffset(void) { GL2PSprimitive *prim; GLfloat minZ, maxZ, rangeZ, scaleZ; GLfloat factor, units, area, dZ, dZdX, dZdY, maxdZ; int i, j; if(!gl2psListNbr(gl2ps->primitives)) return; /* get z-buffer range */ prim = *(GL2PSprimitive**)gl2psListPointer(gl2ps->primitives, 0); minZ = maxZ = prim->verts[0].xyz[2]; for(i = 1; i < prim->numverts; i++){ if(prim->verts[i].xyz[2] < minZ) minZ = prim->verts[i].xyz[2]; if(prim->verts[i].xyz[2] > maxZ) maxZ = prim->verts[i].xyz[2]; } for(i = 1; i < gl2psListNbr(gl2ps->primitives); i++){ prim = *(GL2PSprimitive**)gl2psListPointer(gl2ps->primitives, i); for(j = 0; j < prim->numverts; j++){ if(prim->verts[j].xyz[2] < minZ) minZ = prim->verts[j].xyz[2]; if(prim->verts[j].xyz[2] > maxZ) maxZ = prim->verts[j].xyz[2]; } } rangeZ = (maxZ - minZ); /* rescale z-buffer coordinate in [0,GL2PS_ZSCALE], to make it of the same order of magnitude as the x and y coordinates */ scaleZ = GL2PS_ZERO(rangeZ) ? GL2PS_ZSCALE : (GL2PS_ZSCALE / rangeZ); /* avoid precision loss (we use floats!) */ if(scaleZ > 100000.F) scaleZ = 100000.F; /* apply offsets */ for(i = 0; i < gl2psListNbr(gl2ps->primitives); i++){ prim = *(GL2PSprimitive**)gl2psListPointer(gl2ps->primitives, i); for(j = 0; j < prim->numverts; j++){ prim->verts[j].xyz[2] = (prim->verts[j].xyz[2] - minZ) * scaleZ; } if((gl2ps->options & GL2PS_SIMPLE_LINE_OFFSET) && (prim->type == GL2PS_LINE)){ if(gl2ps->sort == GL2PS_SIMPLE_SORT){ prim->verts[0].xyz[2] -= GL2PS_ZOFFSET_LARGE; prim->verts[1].xyz[2] -= GL2PS_ZOFFSET_LARGE; } else{ prim->verts[0].xyz[2] -= GL2PS_ZOFFSET; prim->verts[1].xyz[2] -= GL2PS_ZOFFSET; } } else if(prim->offset && (prim->type == GL2PS_TRIANGLE)){ factor = prim->ofactor; units = prim->ounits; area = (prim->verts[1].xyz[0] - prim->verts[0].xyz[0]) * (prim->verts[2].xyz[1] - prim->verts[1].xyz[1]) - (prim->verts[2].xyz[0] - prim->verts[1].xyz[0]) * (prim->verts[1].xyz[1] - prim->verts[0].xyz[1]); if(!GL2PS_ZERO(area)){ dZdX = ((prim->verts[2].xyz[1] - prim->verts[1].xyz[1]) * (prim->verts[1].xyz[2] - prim->verts[0].xyz[2]) - (prim->verts[1].xyz[1] - prim->verts[0].xyz[1]) * (prim->verts[2].xyz[2] - prim->verts[1].xyz[2])) / area; dZdY = ((prim->verts[1].xyz[0] - prim->verts[0].xyz[0]) * (prim->verts[2].xyz[2] - prim->verts[1].xyz[2]) - (prim->verts[2].xyz[0] - prim->verts[1].xyz[0]) * (prim->verts[1].xyz[2] - prim->verts[0].xyz[2])) / area; maxdZ = (GLfloat)sqrt(dZdX * dZdX + dZdY * dZdY); } else{ maxdZ = 0.0F; } dZ = factor * maxdZ + units; prim->verts[0].xyz[2] += dZ; prim->verts[1].xyz[2] += dZ; prim->verts[2].xyz[2] += dZ; } } } /********************************************************************* * * 2D sorting routines (for occlusion culling) * *********************************************************************/ static GLint gl2psGetPlaneFromPoints(GL2PSxyz a, GL2PSxyz b, GL2PSplane plane) { GLfloat n; plane[0] = b[1] - a[1]; plane[1] = a[0] - b[0]; n = (GLfloat)sqrt(plane[0]*plane[0] + plane[1]*plane[1]); plane[2] = 0.0F; if(!GL2PS_ZERO(n)){ plane[0] /= n; plane[1] /= n; plane[3] = -plane[0]*a[0]-plane[1]*a[1]; return 1; } else{ plane[0] = -1.0F; plane[1] = 0.0F; plane[3] = a[0]; return 0; } } static void gl2psFreeBspImageTree(GL2PSbsptree2d **tree) { if(*tree){ if((*tree)->back) gl2psFreeBspImageTree(&(*tree)->back); if((*tree)->front) gl2psFreeBspImageTree(&(*tree)->front); gl2psFree(*tree); *tree = NULL; } } static GLint gl2psCheckPoint(GL2PSxyz point, GL2PSplane plane) { GLfloat pt_dis; pt_dis = gl2psComparePointPlane(point, plane); if(pt_dis > GL2PS_EPSILON) return GL2PS_POINT_INFRONT; else if(pt_dis < -GL2PS_EPSILON) return GL2PS_POINT_BACK; else return GL2PS_POINT_COINCIDENT; } static void gl2psAddPlanesInBspTreeImage(GL2PSprimitive *prim, GL2PSbsptree2d **tree) { GLint ret = 0; GLint i; GLint offset = 0; GL2PSbsptree2d *head = NULL, *cur = NULL; if((*tree == NULL) && (prim->numverts > 2)){ /* don't cull if transparent for(i = 0; i < prim->numverts - 1; i++) if(prim->verts[i].rgba[3] < 1.0F) return; */ head = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); for(i = 0; i < prim->numverts-1; i++){ if(!gl2psGetPlaneFromPoints(prim->verts[i].xyz, prim->verts[i+1].xyz, head->plane)){ if(prim->numverts-i > 3){ offset++; } else{ gl2psFree(head); return; } } else{ break; } } head->back = NULL; head->front = NULL; for(i = 2+offset; i < prim->numverts; i++){ ret = gl2psCheckPoint(prim->verts[i].xyz, head->plane); if(ret != GL2PS_POINT_COINCIDENT) break; } switch(ret){ case GL2PS_POINT_INFRONT : cur = head; for(i = 1+offset; i < prim->numverts-1; i++){ if(cur->front == NULL){ cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); } if(gl2psGetPlaneFromPoints(prim->verts[i].xyz, prim->verts[i+1].xyz, cur->front->plane)){ cur = cur->front; cur->front = NULL; cur->back = NULL; } } if(cur->front == NULL){ cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); } if(gl2psGetPlaneFromPoints(prim->verts[i].xyz, prim->verts[offset].xyz, cur->front->plane)){ cur->front->front = NULL; cur->front->back = NULL; } else{ gl2psFree(cur->front); cur->front = NULL; } break; case GL2PS_POINT_BACK : for(i = 0; i < 4; i++){ head->plane[i] = -head->plane[i]; } cur = head; for(i = 1+offset; i < prim->numverts-1; i++){ if(cur->front == NULL){ cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); } if(gl2psGetPlaneFromPoints(prim->verts[i+1].xyz, prim->verts[i].xyz, cur->front->plane)){ cur = cur->front; cur->front = NULL; cur->back = NULL; } } if(cur->front == NULL){ cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); } if(gl2psGetPlaneFromPoints(prim->verts[offset].xyz, prim->verts[i].xyz, cur->front->plane)){ cur->front->front = NULL; cur->front->back = NULL; } else{ gl2psFree(cur->front); cur->front = NULL; } break; default: gl2psFree(head); return; } (*tree) = head; } } static GLint gl2psCheckPrimitive(GL2PSprimitive *prim, GL2PSplane plane) { GLint i; GLint pos; pos = gl2psCheckPoint(prim->verts[0].xyz, plane); for(i = 1; i < prim->numverts; i++){ pos |= gl2psCheckPoint(prim->verts[i].xyz, plane); if(pos == (GL2PS_POINT_INFRONT | GL2PS_POINT_BACK)) return GL2PS_SPANNING; } if(pos & GL2PS_POINT_INFRONT) return GL2PS_IN_FRONT_OF; else if(pos & GL2PS_POINT_BACK) return GL2PS_IN_BACK_OF; else return GL2PS_COINCIDENT; } static GL2PSprimitive *gl2psCreateSplitPrimitive2D(GL2PSprimitive *parent, GLshort numverts, GL2PSvertex *vertx) { GLint i; GL2PSprimitive *child = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); if(parent->type == GL2PS_IMAGEMAP){ child->type = GL2PS_IMAGEMAP; child->data.image = parent->data.image; } else { switch(numverts){ case 1 : child->type = GL2PS_POINT; break; case 2 : child->type = GL2PS_LINE; break; case 3 : child->type = GL2PS_TRIANGLE; break; case 4 : child->type = GL2PS_QUADRANGLE; break; default: child->type = GL2PS_NO_TYPE; break; /* FIXME */ } } child->boundary = 0; /* FIXME: not done! */ child->culled = parent->culled; child->offset = parent->offset; child->ofactor = parent->ofactor; child->ounits = parent->ounits; child->pattern = parent->pattern; child->factor = parent->factor; child->width = parent->width; child->linecap = parent->linecap; child->linejoin = parent->linejoin; child->numverts = numverts; child->verts = (GL2PSvertex*)gl2psMalloc(numverts * sizeof(GL2PSvertex)); for(i = 0; i < numverts; i++){ child->verts[i] = vertx[i]; } return child; } static void gl2psSplitPrimitive2D(GL2PSprimitive *prim, GL2PSplane plane, GL2PSprimitive **front, GL2PSprimitive **back) { /* cur will hold the position of the current vertex prev will hold the position of the previous vertex prev0 will hold the position of the vertex number 0 v1 and v2 represent the current and previous vertices, respectively flag is set if the current vertex should be checked against the plane */ GLint cur = -1, prev = -1, i, v1 = 0, v2 = 0, flag = 1, prev0 = -1; /* list of vertices that will go in front and back primitive */ GL2PSvertex *front_list = NULL, *back_list = NULL; /* number of vertices in front and back list */ GLshort front_count = 0, back_count = 0; for(i = 0; i <= prim->numverts; i++){ v1 = i; if(v1 == prim->numverts){ if(prim->numverts < 3) break; v1 = 0; v2 = prim->numverts - 1; cur = prev0; } else if(flag){ cur = gl2psCheckPoint(prim->verts[v1].xyz, plane); if(i == 0){ prev0 = cur; } } if(((prev == -1) || (prev == cur) || (prev == 0) || (cur == 0)) && (i < prim->numverts)){ if(cur == GL2PS_POINT_INFRONT){ front_count++; front_list = (GL2PSvertex*)gl2psRealloc(front_list, sizeof(GL2PSvertex)*front_count); front_list[front_count-1] = prim->verts[v1]; } else if(cur == GL2PS_POINT_BACK){ back_count++; back_list = (GL2PSvertex*)gl2psRealloc(back_list, sizeof(GL2PSvertex)*back_count); back_list[back_count-1] = prim->verts[v1]; } else{ front_count++; front_list = (GL2PSvertex*)gl2psRealloc(front_list, sizeof(GL2PSvertex)*front_count); front_list[front_count-1] = prim->verts[v1]; back_count++; back_list = (GL2PSvertex*)gl2psRealloc(back_list, sizeof(GL2PSvertex)*back_count); back_list[back_count-1] = prim->verts[v1]; } flag = 1; } else if((prev != cur) && (cur != 0) && (prev != 0)){ if(v1 != 0){ v2 = v1-1; i--; } front_count++; front_list = (GL2PSvertex*)gl2psRealloc(front_list, sizeof(GL2PSvertex)*front_count); gl2psCutEdge(&prim->verts[v2], &prim->verts[v1], plane, &front_list[front_count-1]); back_count++; back_list = (GL2PSvertex*)gl2psRealloc(back_list, sizeof(GL2PSvertex)*back_count); back_list[back_count-1] = front_list[front_count-1]; flag = 0; } prev = cur; } *front = gl2psCreateSplitPrimitive2D(prim, front_count, front_list); *back = gl2psCreateSplitPrimitive2D(prim, back_count, back_list); gl2psFree(front_list); gl2psFree(back_list); } static GLint gl2psAddInBspImageTree(GL2PSprimitive *prim, GL2PSbsptree2d **tree) { GLint ret = 0; GL2PSprimitive *frontprim = NULL, *backprim = NULL; /* FIXME: until we consider the actual extent of text strings and pixmaps, never cull them. Otherwise the whole string/pixmap gets culled as soon as the reference point is hidden */ if(prim->type == GL2PS_PIXMAP || prim->type == GL2PS_TEXT || prim->type == GL2PS_SPECIAL){ return 1; } if(*tree == NULL){ if((prim->type != GL2PS_IMAGEMAP) && (GL_FALSE == gl2ps->zerosurfacearea)){ gl2psAddPlanesInBspTreeImage(gl2ps->primitivetoadd, tree); } return 1; } else{ switch(gl2psCheckPrimitive(prim, (*tree)->plane)){ case GL2PS_IN_BACK_OF: return gl2psAddInBspImageTree(prim, &(*tree)->back); case GL2PS_IN_FRONT_OF: if((*tree)->front != NULL) return gl2psAddInBspImageTree(prim, &(*tree)->front); else return 0; case GL2PS_SPANNING: gl2psSplitPrimitive2D(prim, (*tree)->plane, &frontprim, &backprim); ret = gl2psAddInBspImageTree(backprim, &(*tree)->back); if((*tree)->front != NULL){ if(gl2psAddInBspImageTree(frontprim, &(*tree)->front)){ ret = 1; } } gl2psFree(frontprim->verts); gl2psFree(frontprim); gl2psFree(backprim->verts); gl2psFree(backprim); return ret; case GL2PS_COINCIDENT: if((*tree)->back != NULL){ gl2ps->zerosurfacearea = GL_TRUE; ret = gl2psAddInBspImageTree(prim, &(*tree)->back); gl2ps->zerosurfacearea = GL_FALSE; if(ret) return ret; } if((*tree)->front != NULL){ gl2ps->zerosurfacearea = GL_TRUE; ret = gl2psAddInBspImageTree(prim, &(*tree)->front); gl2ps->zerosurfacearea = GL_FALSE; if(ret) return ret; } if(prim->type == GL2PS_LINE) return 1; else return 0; } } return 0; } static void gl2psAddInImageTree(void *data) { GL2PSprimitive *prim = *(GL2PSprimitive **)data; gl2ps->primitivetoadd = prim; if(prim->type == GL2PS_IMAGEMAP && prim->data.image->format == GL2PS_IMAGEMAP_VISIBLE){ prim->culled = 1; } else if(!gl2psAddInBspImageTree(prim, &gl2ps->imagetree)){ prim->culled = 1; } else if(prim->type == GL2PS_IMAGEMAP){ prim->data.image->format = GL2PS_IMAGEMAP_VISIBLE; } } /* Boundary construction */ static void gl2psAddBoundaryInList(GL2PSprimitive *prim, GL2PSlist *list) { GL2PSprimitive *b; GLshort i; GL2PSxyz c; c[0] = c[1] = c[2] = 0.0F; for(i = 0; i < prim->numverts; i++){ c[0] += prim->verts[i].xyz[0]; c[1] += prim->verts[i].xyz[1]; } c[0] /= prim->numverts; c[1] /= prim->numverts; for(i = 0; i < prim->numverts; i++){ if(prim->boundary & (GLint)pow(2., i)){ b = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); b->type = GL2PS_LINE; b->offset = prim->offset; b->ofactor = prim->ofactor; b->ounits = prim->ounits; b->pattern = prim->pattern; b->factor = prim->factor; b->culled = prim->culled; b->width = prim->width; b->linecap = prim->linecap; b->linejoin = prim->linejoin; b->boundary = 0; b->numverts = 2; b->verts = (GL2PSvertex*)gl2psMalloc(2 * sizeof(GL2PSvertex)); #if 0 /* FIXME: need to work on boundary offset... */ v[0] = c[0] - prim->verts[i].xyz[0]; v[1] = c[1] - prim->verts[i].xyz[1]; v[2] = 0.0F; norm = gl2psNorm(v); v[0] /= norm; v[1] /= norm; b->verts[0].xyz[0] = prim->verts[i].xyz[0] +0.1*v[0]; b->verts[0].xyz[1] = prim->verts[i].xyz[1] +0.1*v[1]; b->verts[0].xyz[2] = prim->verts[i].xyz[2]; v[0] = c[0] - prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0]; v[1] = c[1] - prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1]; norm = gl2psNorm(v); v[0] /= norm; v[1] /= norm; b->verts[1].xyz[0] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0] +0.1*v[0]; b->verts[1].xyz[1] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1] +0.1*v[1]; b->verts[1].xyz[2] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[2]; #else b->verts[0].xyz[0] = prim->verts[i].xyz[0]; b->verts[0].xyz[1] = prim->verts[i].xyz[1]; b->verts[0].xyz[2] = prim->verts[i].xyz[2]; b->verts[1].xyz[0] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0]; b->verts[1].xyz[1] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1]; b->verts[1].xyz[2] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[2]; #endif b->verts[0].rgba[0] = 0.0F; b->verts[0].rgba[1] = 0.0F; b->verts[0].rgba[2] = 0.0F; b->verts[0].rgba[3] = 0.0F; b->verts[1].rgba[0] = 0.0F; b->verts[1].rgba[1] = 0.0F; b->verts[1].rgba[2] = 0.0F; b->verts[1].rgba[3] = 0.0F; gl2psListAdd(list, &b); } } } static void gl2psBuildPolygonBoundary(GL2PSbsptree *tree) { GLint i; GL2PSprimitive *prim; if(!tree) return; gl2psBuildPolygonBoundary(tree->back); for(i = 0; i < gl2psListNbr(tree->primitives); i++){ prim = *(GL2PSprimitive**)gl2psListPointer(tree->primitives, i); if(prim->boundary) gl2psAddBoundaryInList(prim, tree->primitives); } gl2psBuildPolygonBoundary(tree->front); } /********************************************************************* * * Feedback buffer parser * *********************************************************************/ GL2PSDLL_API void gl2psAddPolyPrimitive(GLshort type, GLshort numverts, GL2PSvertex *verts, GLint offset, GLfloat ofactor, GLfloat ounits, GLushort pattern, GLint factor, GLfloat width, GLint linecap, GLint linejoin,char boundary) { GL2PSprimitive *prim; prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = type; prim->numverts = numverts; prim->verts = (GL2PSvertex*)gl2psMalloc(numverts * sizeof(GL2PSvertex)); memcpy(prim->verts, verts, numverts * sizeof(GL2PSvertex)); prim->boundary = boundary; prim->offset = (char)offset; prim->ofactor = ofactor; prim->ounits = ounits; prim->pattern = pattern; prim->factor = factor; prim->width = width; prim->linecap = linecap; prim->linejoin = linejoin; prim->culled = 0; /* FIXME: here we should have an option to split stretched tris/quads to enhance SIMPLE_SORT */ gl2psListAdd(gl2ps->primitives, &prim); } static GLint gl2psGetVertex(GL2PSvertex *v, GLfloat *p) { GLint i; v->xyz[0] = p[0]; v->xyz[1] = p[1]; v->xyz[2] = p[2]; if(gl2ps->colormode == GL_COLOR_INDEX && gl2ps->colorsize > 0){ i = (GLint)(p[3] + 0.5); v->rgba[0] = gl2ps->colormap[i][0]; v->rgba[1] = gl2ps->colormap[i][1]; v->rgba[2] = gl2ps->colormap[i][2]; v->rgba[3] = gl2ps->colormap[i][3]; return 4; } else{ v->rgba[0] = p[3]; v->rgba[1] = p[4]; v->rgba[2] = p[5]; v->rgba[3] = p[6]; return 7; } } static void gl2psParseFeedbackBuffer(GLint used) { char flag; GLushort pattern = 0; GLboolean boundary; GLint i, sizeoffloat, count, v, vtot, offset = 0, factor = 0, auxindex = 0; GLint lcap = 0, ljoin = 0; GLfloat lwidth = 1.0F, psize = 1.0F, ofactor, ounits; GLfloat *current; GL2PSvertex vertices[3]; GL2PSprimitive *prim; GL2PSimagemap *node; current = gl2ps->feedback; boundary = gl2ps->boundary = GL_FALSE; while(used > 0){ if(GL_TRUE == boundary) gl2ps->boundary = GL_TRUE; switch((GLint)*current){ case GL_POINT_TOKEN : current ++; used --; i = gl2psGetVertex(&vertices[0], current); current += i; used -= i; gl2psAddPolyPrimitive(GL2PS_POINT, 1, vertices, 0, 0.0, 0.0, pattern, factor, psize, lcap, ljoin, 0); break; case GL_LINE_TOKEN : case GL_LINE_RESET_TOKEN : current ++; used --; i = gl2psGetVertex(&vertices[0], current); current += i; used -= i; i = gl2psGetVertex(&vertices[1], current); current += i; used -= i; gl2psAddPolyPrimitive(GL2PS_LINE, 2, vertices, 0, 0.0, 0.0, pattern, factor, lwidth, lcap, ljoin, 0); break; case GL_POLYGON_TOKEN : count = (GLint)current[1]; current += 2; used -= 2; v = vtot = 0; while(count > 0 && used > 0){ i = gl2psGetVertex(&vertices[v], current); gl2psAdaptVertexForBlending(&vertices[v]); current += i; used -= i; count --; vtot++; if(v == 2){ if(GL_TRUE == boundary){ if(!count && vtot == 2) flag = 1|2|4; else if(!count) flag = 2|4; else if(vtot == 2) flag = 1|2; else flag = 2; } else flag = 0; gl2psAddPolyPrimitive(GL2PS_TRIANGLE, 3, vertices, offset, ofactor, ounits, pattern, factor, 1, lcap, ljoin, flag); vertices[1] = vertices[2]; } else v ++; } break; case GL_BITMAP_TOKEN : case GL_DRAW_PIXEL_TOKEN : case GL_COPY_PIXEL_TOKEN : current ++; used --; i = gl2psGetVertex(&vertices[0], current); current += i; used -= i; break; case GL_PASS_THROUGH_TOKEN : switch((GLint)current[1]){ case GL2PS_BEGIN_OFFSET_TOKEN : offset = 1; current += 2; used -= 2; ofactor = current[1]; current += 2; used -= 2; ounits = current[1]; break; case GL2PS_END_OFFSET_TOKEN : offset = 0; ofactor = 0.0; ounits = 0.0; break; case GL2PS_BEGIN_BOUNDARY_TOKEN : boundary = GL_TRUE; break; case GL2PS_END_BOUNDARY_TOKEN : boundary = GL_FALSE; break; case GL2PS_END_STIPPLE_TOKEN : pattern = 0; factor = 0; break; case GL2PS_BEGIN_BLEND_TOKEN : gl2ps->blending = GL_TRUE; break; case GL2PS_END_BLEND_TOKEN : gl2ps->blending = GL_FALSE; break; case GL2PS_BEGIN_STIPPLE_TOKEN : current += 2; used -= 2; pattern = (GLushort)current[1]; current += 2; used -= 2; factor = (GLint)current[1]; break; case GL2PS_SRC_BLEND_TOKEN : current += 2; used -= 2; gl2ps->blendfunc[0] = (GLint)current[1]; break; case GL2PS_DST_BLEND_TOKEN : current += 2; used -= 2; gl2ps->blendfunc[1] = (GLint)current[1]; break; case GL2PS_POINT_SIZE_TOKEN : current += 2; used -= 2; psize = current[1]; break; case GL2PS_LINE_CAP_TOKEN : current += 2; used -= 2; lcap = current[1]; break; case GL2PS_LINE_JOIN_TOKEN : current += 2; used -= 2; ljoin = current[1]; break; case GL2PS_LINE_WIDTH_TOKEN : current += 2; used -= 2; lwidth = current[1]; break; case GL2PS_IMAGEMAP_TOKEN : prim = (GL2PSprimitive *)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = GL2PS_IMAGEMAP; prim->boundary = 0; prim->numverts = 4; prim->verts = (GL2PSvertex *)gl2psMalloc(4 * sizeof(GL2PSvertex)); prim->culled = 0; prim->offset = 0; prim->ofactor = 0.0; prim->ounits = 0.0; prim->pattern = 0; prim->factor = 0; prim->width = 1; node = (GL2PSimagemap*)gl2psMalloc(sizeof(GL2PSimagemap)); node->image = (GL2PSimage*)gl2psMalloc(sizeof(GL2PSimage)); node->image->type = 0; node->image->format = 0; node->image->zoom_x = 1.0F; node->image->zoom_y = 1.0F; node->next = NULL; if(gl2ps->imagemap_head == NULL) gl2ps->imagemap_head = node; else gl2ps->imagemap_tail->next = node; gl2ps->imagemap_tail = node; prim->data.image = node->image; current += 2; used -= 2; i = gl2psGetVertex(&prim->verts[0], ¤t[1]); current += i; used -= i; node->image->width = (GLint)current[2]; current += 2; used -= 2; node->image->height = (GLint)current[2]; prim->verts[0].xyz[0] = prim->verts[0].xyz[0] - (int)(node->image->width / 2) + 0.5F; prim->verts[0].xyz[1] = prim->verts[0].xyz[1] - (int)(node->image->height / 2) + 0.5F; for(i = 1; i < 4; i++){ for(v = 0; v < 3; v++){ prim->verts[i].xyz[v] = prim->verts[0].xyz[v]; prim->verts[i].rgba[v] = prim->verts[0].rgba[v]; } prim->verts[i].rgba[v] = prim->verts[0].rgba[v]; } prim->verts[1].xyz[0] = prim->verts[1].xyz[0] + node->image->width; prim->verts[2].xyz[0] = prim->verts[1].xyz[0]; prim->verts[2].xyz[1] = prim->verts[2].xyz[1] + node->image->height; prim->verts[3].xyz[1] = prim->verts[2].xyz[1]; sizeoffloat = sizeof(GLfloat); v = 2 * sizeoffloat; vtot = node->image->height + node->image->height * ((node->image->width - 1) / 8); node->image->pixels = (GLfloat*)gl2psMalloc(v + vtot); node->image->pixels[0] = prim->verts[0].xyz[0]; node->image->pixels[1] = prim->verts[0].xyz[1]; for(i = 0; i < vtot; i += sizeoffloat){ current += 2; used -= 2; if((vtot - i) >= 4) memcpy(&(((char*)(node->image->pixels))[i + v]), &(current[2]), sizeoffloat); else memcpy(&(((char*)(node->image->pixels))[i + v]), &(current[2]), vtot - i); } current++; used--; gl2psListAdd(gl2ps->primitives, &prim); break; case GL2PS_DRAW_PIXELS_TOKEN : case GL2PS_TEXT_TOKEN : if(auxindex < gl2psListNbr(gl2ps->auxprimitives)) gl2psListAdd(gl2ps->primitives, gl2psListPointer(gl2ps->auxprimitives, auxindex++)); else gl2psMsg(GL2PS_ERROR, "Wrong number of auxiliary tokens in buffer"); break; } current += 2; used -= 2; break; default : gl2psMsg(GL2PS_WARNING, "Unknown token in buffer"); current ++; used --; break; } } gl2psListReset(gl2ps->auxprimitives); } /********************************************************************* * * PostScript routines * *********************************************************************/ static void gl2psWriteByte(unsigned char byte) { unsigned char h = byte / 16; unsigned char l = byte % 16; gl2psPrintf("%x%x", h, l); } static void gl2psPrintPostScriptPixmap(GLfloat x, GLfloat y, GL2PSimage *im) { GLuint nbhex, nbyte, nrgb, nbits; GLuint row, col, ibyte, icase; GLfloat dr = 0., dg = 0., db = 0., fgrey; unsigned char red = 0, green = 0, blue = 0, b, grey; GLuint width = (GLuint)im->width; GLuint height = (GLuint)im->height; /* FIXME: should we define an option for these? Or just keep the 8-bit per component case? */ int greyscale = 0; /* set to 1 to output greyscale image */ int nbit = 8; /* number of bits per color compoment (2, 4 or 8) */ if((width <= 0) || (height <= 0)) return; gl2psPrintf("gsave\n"); gl2psPrintf("%.2f %.2f translate\n", x, y); gl2psPrintf("%.2f %.2f scale\n", width * im->zoom_x, height * im->zoom_y); if(greyscale){ /* greyscale */ gl2psPrintf("/picstr %d string def\n", width); gl2psPrintf("%d %d %d\n", width, height, 8); gl2psPrintf("[ %d 0 0 -%d 0 %d ]\n", width, height, height); gl2psPrintf("{ currentfile picstr readhexstring pop }\n"); gl2psPrintf("image\n"); for(row = 0; row < height; row++){ for(col = 0; col < width; col++){ gl2psGetRGB(im, col, row, &dr, &dg, &db); fgrey = (0.30F * dr + 0.59F * dg + 0.11F * db); grey = (unsigned char)(255. * fgrey); gl2psWriteByte(grey); } gl2psPrintf("\n"); } nbhex = width * height * 2; gl2psPrintf("%%%% nbhex digit :%d\n", nbhex); } else if(nbit == 2){ /* color, 2 bits for r and g and b; rgbs following each other */ nrgb = width * 3; nbits = nrgb * nbit; nbyte = nbits / 8; if((nbyte * 8) != nbits) nbyte++; gl2psPrintf("/rgbstr %d string def\n", nbyte); gl2psPrintf("%d %d %d\n", width, height, nbit); gl2psPrintf("[ %d 0 0 -%d 0 %d ]\n", width, height, height); gl2psPrintf("{ currentfile rgbstr readhexstring pop }\n"); gl2psPrintf("false 3\n"); gl2psPrintf("colorimage\n"); for(row = 0; row < height; row++){ icase = 1; col = 0; b = 0; for(ibyte = 0; ibyte < nbyte; ibyte++){ if(icase == 1) { if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(3. * dr); green = (unsigned char)(3. * dg); blue = (unsigned char)(3. * db); b = red; b = (b<<2) + green; b = (b<<2) + blue; if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(3. * dr); green = (unsigned char)(3. * dg); blue = (unsigned char)(3. * db); b = (b<<2) + red; gl2psWriteByte(b); b = 0; icase++; } else if(icase == 2) { b = green; b = (b<<2) + blue; if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(3. * dr); green = (unsigned char)(3. * dg); blue = (unsigned char)(3. * db); b = (b<<2) + red; b = (b<<2) + green; gl2psWriteByte(b); b = 0; icase++; } else if(icase == 3) { b = blue; if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(3. * dr); green = (unsigned char)(3. * dg); blue = (unsigned char)(3. * db); b = (b<<2) + red; b = (b<<2) + green; b = (b<<2) + blue; gl2psWriteByte(b); b = 0; icase = 1; } } gl2psPrintf("\n"); } } else if(nbit == 4){ /* color, 4 bits for r and g and b; rgbs following each other */ nrgb = width * 3; nbits = nrgb * nbit; nbyte = nbits / 8; if((nbyte * 8) != nbits) nbyte++; gl2psPrintf("/rgbstr %d string def\n", nbyte); gl2psPrintf("%d %d %d\n", width, height, nbit); gl2psPrintf("[ %d 0 0 -%d 0 %d ]\n", width, height, height); gl2psPrintf("{ currentfile rgbstr readhexstring pop }\n"); gl2psPrintf("false 3\n"); gl2psPrintf("colorimage\n"); for(row = 0; row < height; row++){ col = 0; icase = 1; for(ibyte = 0; ibyte < nbyte; ibyte++){ if(icase == 1) { if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(15. * dr); green = (unsigned char)(15. * dg); gl2psPrintf("%x%x", red, green); icase++; } else if(icase == 2) { blue = (unsigned char)(15. * db); if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(15. * dr); gl2psPrintf("%x%x", blue, red); icase++; } else if(icase == 3) { green = (unsigned char)(15. * dg); blue = (unsigned char)(15. * db); gl2psPrintf("%x%x", green, blue); icase = 1; } } gl2psPrintf("\n"); } } else{ /* 8 bit for r and g and b */ nbyte = width * 3; gl2psPrintf("/rgbstr %d string def\n", nbyte); gl2psPrintf("%d %d %d\n", width, height, 8); gl2psPrintf("[ %d 0 0 -%d 0 %d ]\n", width, height, height); gl2psPrintf("{ currentfile rgbstr readhexstring pop }\n"); gl2psPrintf("false 3\n"); gl2psPrintf("colorimage\n"); for(row = 0; row < height; row++){ for(col = 0; col < width; col++){ gl2psGetRGB(im, col, row, &dr, &dg, &db); red = (unsigned char)(255. * dr); gl2psWriteByte(red); green = (unsigned char)(255. * dg); gl2psWriteByte(green); blue = (unsigned char)(255. * db); gl2psWriteByte(blue); } gl2psPrintf("\n"); } } gl2psPrintf("grestore\n"); } static void gl2psPrintPostScriptImagemap(GLfloat x, GLfloat y, GLsizei width, GLsizei height, const unsigned char *imagemap){ int i, size; if((width <= 0) || (height <= 0)) return; size = height + height * (width - 1) / 8; gl2psPrintf("gsave\n"); gl2psPrintf("%.2f %.2f translate\n", x, y); gl2psPrintf("%d %d scale\n%d %d\ntrue\n", width, height,width, height); gl2psPrintf("[ %d 0 0 -%d 0 %d ] {<", width, height); for(i = 0; i < size; i++){ gl2psWriteByte(*imagemap); imagemap++; } gl2psPrintf(">} imagemask\ngrestore\n"); } static void gl2psPrintPostScriptHeader(void) { time_t now; /* Since compression is not part of the PostScript standard, compressed PostScript files are just gzipped PostScript files ("ps.gz" or "eps.gz") */ gl2psPrintGzipHeader(); time(&now); if(gl2ps->format == GL2PS_PS){ gl2psPrintf("%%!PS-Adobe-3.0\n"); } else{ gl2psPrintf("%%!PS-Adobe-3.0 EPSF-3.0\n"); } gl2psPrintf("%%%%Title: %s\n" "%%%%Creator: GL2PS %d.%d.%d%s, %s\n" "%%%%For: %s\n" "%%%%CreationDate: %s" "%%%%LanguageLevel: 3\n" "%%%%DocumentData: Clean7Bit\n" "%%%%Pages: 1\n", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); if(gl2ps->format == GL2PS_PS){ gl2psPrintf("%%%%Orientation: %s\n" "%%%%DocumentMedia: Default %d %d 0 () ()\n", (gl2ps->options & GL2PS_LANDSCAPE) ? "Landscape" : "Portrait", (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[3] : (int)gl2ps->viewport[2], (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[2] : (int)gl2ps->viewport[3]); } gl2psPrintf("%%%%BoundingBox: %d %d %d %d\n" "%%%%EndComments\n", (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[1] : (int)gl2ps->viewport[0], (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[0] : (int)gl2ps->viewport[1], (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[3] : (int)gl2ps->viewport[2], (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[2] : (int)gl2ps->viewport[3]); /* RGB color: r g b C (replace C by G in output to change from rgb to gray) Grayscale: r g b G Font choose: size fontname FC Text string: (string) x y size fontname S?? Rotated text string: (string) angle x y size fontname S??R Point primitive: x y size P Line width: width W Line start: x y LS Line joining last point: x y L Line end: x y LE Flat-shaded triangle: x3 y3 x2 y2 x1 y1 T Smooth-shaded triangle: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST */ gl2psPrintf("%%%%BeginProlog\n" "/gl2psdict 64 dict def gl2psdict begin\n" "/tryPS3shading %s def %% set to false to force subdivision\n" "/rThreshold %g def %% red component subdivision threshold\n" "/gThreshold %g def %% green component subdivision threshold\n" "/bThreshold %g def %% blue component subdivision threshold\n", (gl2ps->options & GL2PS_NO_PS3_SHADING) ? "false" : "true", gl2ps->threshold[0], gl2ps->threshold[1], gl2ps->threshold[2]); gl2psPrintf("/BD { bind def } bind def\n" "/C { setrgbcolor } BD\n" "/G { 0.082 mul exch 0.6094 mul add exch 0.3086 mul add neg 1.0 add setgray } BD\n" "/W { setlinewidth } BD\n" "/LC { setlinecap } BD\n" "/LJ { setlinejoin } BD\n"); gl2psPrintf("/FC { findfont exch /SH exch def SH scalefont setfont } BD\n" "/SW { dup stringwidth pop } BD\n" "/S { FC moveto show } BD\n" "/SBC{ FC moveto SW -2 div 0 rmoveto show } BD\n" "/SBR{ FC moveto SW neg 0 rmoveto show } BD\n" "/SCL{ FC moveto 0 SH -2 div rmoveto show } BD\n" "/SCC{ FC moveto SW -2 div SH -2 div rmoveto show } BD\n" "/SCR{ FC moveto SW neg SH -2 div rmoveto show } BD\n" "/STL{ FC moveto 0 SH neg rmoveto show } BD\n" "/STC{ FC moveto SW -2 div SH neg rmoveto show } BD\n" "/STR{ FC moveto SW neg SH neg rmoveto show } BD\n"); /* rotated text routines: same nameanem with R appended */ gl2psPrintf("/FCT { FC translate 0 0 } BD\n" "/SR { gsave FCT moveto rotate show grestore } BD\n" "/SBCR{ gsave FCT moveto rotate SW -2 div 0 rmoveto show grestore } BD\n" "/SBRR{ gsave FCT moveto rotate SW neg 0 rmoveto show grestore } BD\n" "/SCLR{ gsave FCT moveto rotate 0 SH -2 div rmoveto show grestore} BD\n"); gl2psPrintf("/SCCR{ gsave FCT moveto rotate SW -2 div SH -2 div rmoveto show grestore} BD\n" "/SCRR{ gsave FCT moveto rotate SW neg SH -2 div rmoveto show grestore} BD\n" "/STLR{ gsave FCT moveto rotate 0 SH neg rmoveto show grestore } BD\n" "/STCR{ gsave FCT moveto rotate SW -2 div SH neg rmoveto show grestore } BD\n" "/STRR{ gsave FCT moveto rotate SW neg SH neg rmoveto show grestore } BD\n"); gl2psPrintf("/P { newpath 0.0 360.0 arc closepath fill } BD\n" "/LS { newpath moveto } BD\n" "/L { lineto } BD\n" "/LE { lineto stroke } BD\n" "/T { newpath moveto lineto lineto closepath fill } BD\n"); /* Smooth-shaded triangle with PostScript level 3 shfill operator: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 STshfill */ gl2psPrintf("/STshfill {\n" " /b1 exch def /g1 exch def /r1 exch def /y1 exch def /x1 exch def\n" " /b2 exch def /g2 exch def /r2 exch def /y2 exch def /x2 exch def\n" " /b3 exch def /g3 exch def /r3 exch def /y3 exch def /x3 exch def\n" " gsave << /ShadingType 4 /ColorSpace [/DeviceRGB]\n" " /DataSource [ 0 x1 y1 r1 g1 b1 0 x2 y2 r2 g2 b2 0 x3 y3 r3 g3 b3 ] >>\n" " shfill grestore } BD\n"); /* Flat-shaded triangle with middle color: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 Tm */ gl2psPrintf(/* stack : x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 */ "/Tm { 3 -1 roll 8 -1 roll 13 -1 roll add add 3 div\n" /* r = (r1+r2+r3)/3 */ /* stack : x3 y3 g3 b3 x2 y2 g2 b2 x1 y1 g1 b1 r */ " 3 -1 roll 7 -1 roll 11 -1 roll add add 3 div\n" /* g = (g1+g2+g3)/3 */ /* stack : x3 y3 b3 x2 y2 b2 x1 y1 b1 r g b */ " 3 -1 roll 6 -1 roll 9 -1 roll add add 3 div" /* b = (b1+b2+b3)/3 */ /* stack : x3 y3 x2 y2 x1 y1 r g b */ " C T } BD\n"); /* Split triangle in four sub-triangles (at sides middle points) and call the STnoshfill procedure on each, interpolating the colors in RGB space: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 STsplit (in procedure comments key: (Vi) = xi yi ri gi bi) */ gl2psPrintf("/STsplit {\n" " 4 index 15 index add 0.5 mul\n" /* x13 = (x1+x3)/2 */ " 4 index 15 index add 0.5 mul\n" /* y13 = (y1+y3)/2 */ " 4 index 15 index add 0.5 mul\n" /* r13 = (r1+r3)/2 */ " 4 index 15 index add 0.5 mul\n" /* g13 = (g1+g3)/2 */ " 4 index 15 index add 0.5 mul\n" /* b13 = (b1+b3)/2 */ " 5 copy 5 copy 25 15 roll\n"); /* at his point, stack = (V3) (V13) (V13) (V13) (V2) (V1) */ gl2psPrintf(" 9 index 30 index add 0.5 mul\n" /* x23 = (x2+x3)/2 */ " 9 index 30 index add 0.5 mul\n" /* y23 = (y2+y3)/2 */ " 9 index 30 index add 0.5 mul\n" /* r23 = (r2+r3)/2 */ " 9 index 30 index add 0.5 mul\n" /* g23 = (g2+g3)/2 */ " 9 index 30 index add 0.5 mul\n" /* b23 = (b2+b3)/2 */ " 5 copy 5 copy 35 5 roll 25 5 roll 15 5 roll\n"); /* stack = (V3) (V13) (V23) (V13) (V23) (V13) (V23) (V2) (V1) */ gl2psPrintf(" 4 index 10 index add 0.5 mul\n" /* x12 = (x1+x2)/2 */ " 4 index 10 index add 0.5 mul\n" /* y12 = (y1+y2)/2 */ " 4 index 10 index add 0.5 mul\n" /* r12 = (r1+r2)/2 */ " 4 index 10 index add 0.5 mul\n" /* g12 = (g1+g2)/2 */ " 4 index 10 index add 0.5 mul\n" /* b12 = (b1+b2)/2 */ " 5 copy 5 copy 40 5 roll 25 5 roll 15 5 roll 25 5 roll\n"); /* stack = (V3) (V13) (V23) (V13) (V12) (V23) (V13) (V1) (V12) (V23) (V12) (V2) */ gl2psPrintf(" STnoshfill STnoshfill STnoshfill STnoshfill } BD\n"); /* Gouraud shaded triangle using recursive subdivision until the difference between corner colors does not exceed the thresholds: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 STnoshfill */ gl2psPrintf("/STnoshfill {\n" " 2 index 8 index sub abs rThreshold gt\n" /* |r1-r2|>rth */ " { STsplit }\n" " { 1 index 7 index sub abs gThreshold gt\n" /* |g1-g2|>gth */ " { STsplit }\n" " { dup 6 index sub abs bThreshold gt\n" /* |b1-b2|>bth */ " { STsplit }\n" " { 2 index 13 index sub abs rThreshold gt\n" /* |r1-r3|>rht */ " { STsplit }\n" " { 1 index 12 index sub abs gThreshold gt\n" /* |g1-g3|>gth */ " { STsplit }\n" " { dup 11 index sub abs bThreshold gt\n" /* |b1-b3|>bth */ " { STsplit }\n" " { 7 index 13 index sub abs rThreshold gt\n"); /* |r2-r3|>rht */ gl2psPrintf(" { STsplit }\n" " { 6 index 12 index sub abs gThreshold gt\n" /* |g2-g3|>gth */ " { STsplit }\n" " { 5 index 11 index sub abs bThreshold gt\n" /* |b2-b3|>bth */ " { STsplit }\n" " { Tm }\n" /* all colors sufficiently similar */ " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse } BD\n"); gl2psPrintf("tryPS3shading\n" "{ /shfill where\n" " { /ST { STshfill } BD }\n" " { /ST { STnoshfill } BD }\n" " ifelse }\n" "{ /ST { STnoshfill } BD }\n" "ifelse\n"); gl2psPrintf("end\n" "%%%%EndProlog\n" "%%%%BeginSetup\n" "/DeviceRGB setcolorspace\n" "gl2psdict begin\n" "%%%%EndSetup\n" "%%%%Page: 1 1\n" "%%%%BeginPageSetup\n"); if(gl2ps->options & GL2PS_LANDSCAPE){ gl2psPrintf("%d 0 translate 90 rotate\n", (int)gl2ps->viewport[3]); } gl2psPrintf("%%%%EndPageSetup\n" "mark\n" "gsave\n" "1.0 1.0 scale\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ gl2psPrintf("%g %g %g C\n" "newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n" "closepath fill\n", gl2ps->bgcolor[0], gl2ps->bgcolor[1], gl2ps->bgcolor[2], (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3], (int)gl2ps->viewport[0], (int)gl2ps->viewport[3]); } } static void gl2psPrintPostScriptColor(GL2PSrgba rgba) { if(!gl2psSameColor(gl2ps->lastrgba, rgba)){ gl2psSetLastColor(rgba); gl2psPrintf("%g %g %g C\n", rgba[0], rgba[1], rgba[2]); } } static void gl2psResetPostScriptColor(void) { gl2ps->lastrgba[0] = gl2ps->lastrgba[1] = gl2ps->lastrgba[2] = -1.; } static void gl2psEndPostScriptLine(void) { int i; if(gl2ps->lastvertex.rgba[0] >= 0.){ gl2psPrintf("%g %g LE\n", gl2ps->lastvertex.xyz[0], gl2ps->lastvertex.xyz[1]); for(i = 0; i < 3; i++) gl2ps->lastvertex.xyz[i] = -1.; for(i = 0; i < 4; i++) gl2ps->lastvertex.rgba[i] = -1.; } } static void gl2psParseStipplePattern(GLushort pattern, GLint factor, int *nb, int array[10]) { int i, n; int on[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int off[8] = {0, 0, 0, 0, 0, 0, 0, 0}; char tmp[16]; /* extract the 16 bits from the OpenGL stipple pattern */ for(n = 15; n >= 0; n--){ tmp[n] = (char)(pattern & 0x01); pattern >>= 1; } /* compute the on/off pixel sequence */ n = 0; for(i = 0; i < 8; i++){ while(n < 16 && !tmp[n]){ off[i]++; n++; } while(n < 16 && tmp[n]){ on[i]++; n++; } if(n >= 15){ i++; break; } } /* store the on/off array from right to left, starting with off pixels. The PostScript specification allows for at most 11 elements in the on/off array, so we limit ourselves to 5 on/off couples (our longest possible array is thus [on4 off4 on3 off3 on2 off2 on1 off1 on0 off0]) */ *nb = 0; for(n = i - 1; n >= 0; n--){ array[(*nb)++] = factor * on[n]; array[(*nb)++] = factor * off[n]; if(*nb == 10) break; } } static int gl2psPrintPostScriptDash(GLushort pattern, GLint factor, const char *str) { int len = 0, i, n, array[10]; if(pattern == gl2ps->lastpattern && factor == gl2ps->lastfactor) return 0; gl2ps->lastpattern = pattern; gl2ps->lastfactor = factor; if(!pattern || !factor){ /* solid line */ len += gl2psPrintf("[] 0 %s\n", str); } else{ gl2psParseStipplePattern(pattern, factor, &n, array); len += gl2psPrintf("["); for(i = 0; i < n; i++){ if(i) len += gl2psPrintf(" "); len += gl2psPrintf("%d", array[i]); } len += gl2psPrintf("] 0 %s\n", str); } return len; } static void gl2psPrintPostScriptPrimitive(void *data) { int newline; GL2PSprimitive *prim; prim = *(GL2PSprimitive**)data; if((gl2ps->options & GL2PS_OCCLUSION_CULL) && prim->culled) return; /* Every effort is made to draw lines as connected segments (i.e., using a single PostScript path): this is the only way to get nice line joins and to not restart the stippling for every line segment. So if the primitive to print is not a line we must first finish the current line (if any): */ if(prim->type != GL2PS_LINE) gl2psEndPostScriptLine(); switch(prim->type){ case GL2PS_POINT : gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintf("%g %g %g P\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1], 0.5 * prim->width); break; case GL2PS_LINE : if(!gl2psSamePosition(gl2ps->lastvertex.xyz, prim->verts[0].xyz) || !gl2psSameColor(gl2ps->lastrgba, prim->verts[0].rgba) || gl2ps->lastlinewidth != prim->width || gl2ps->lastlinecap != prim->linecap || gl2ps->lastlinejoin != prim->linejoin || gl2ps->lastpattern != prim->pattern || gl2ps->lastfactor != prim->factor){ /* End the current line if the new segment does not start where the last one ended, or if the color, the width or the stippling have changed (multi-stroking lines with changing colors is necessary until we use /shfill for lines; unfortunately this means that at the moment we can screw up line stippling for smooth-shaded lines) */ gl2psEndPostScriptLine(); newline = 1; } else{ newline = 0; } if(gl2ps->lastlinewidth != prim->width){ gl2ps->lastlinewidth = prim->width; gl2psPrintf("%g W\n", gl2ps->lastlinewidth); } if(gl2ps->lastlinecap != prim->linecap){ gl2ps->lastlinecap = prim->linecap; gl2psPrintf("%d LC\n", gl2ps->lastlinecap); } if(gl2ps->lastlinejoin != prim->linejoin){ gl2ps->lastlinejoin = prim->linejoin; gl2psPrintf("%d LJ\n", gl2ps->lastlinejoin); } gl2psPrintPostScriptDash(prim->pattern, prim->factor, "setdash"); gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintf("%g %g %s\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1], newline ? "LS" : "L"); gl2ps->lastvertex = prim->verts[1]; break; case GL2PS_TRIANGLE : if(!gl2psVertsSameColor(prim)){ gl2psResetPostScriptColor(); gl2psPrintf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %g ST\n", prim->verts[2].xyz[0], prim->verts[2].xyz[1], prim->verts[2].rgba[0], prim->verts[2].rgba[1], prim->verts[2].rgba[2], prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[1].rgba[0], prim->verts[1].rgba[1], prim->verts[1].rgba[2], prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->verts[0].rgba[0], prim->verts[0].rgba[1], prim->verts[0].rgba[2]); } else{ gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintf("%g %g %g %g %g %g T\n", prim->verts[2].xyz[0], prim->verts[2].xyz[1], prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } break; case GL2PS_QUADRANGLE : gl2psMsg(GL2PS_WARNING, "There should not be any quad left to print"); break; case GL2PS_PIXMAP : gl2psPrintPostScriptPixmap(prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->data.image); break; case GL2PS_IMAGEMAP : if(prim->data.image->type != GL2PS_IMAGEMAP_WRITTEN){ gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintPostScriptImagemap(prim->data.image->pixels[0], prim->data.image->pixels[1], prim->data.image->width, prim->data.image->height, (const unsigned char*)(&(prim->data.image->pixels[2]))); prim->data.image->type = GL2PS_IMAGEMAP_WRITTEN; } break; case GL2PS_TEXT : gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintf("(%s) ", prim->data.text->str); if(prim->data.text->angle) gl2psPrintf("%g ", prim->data.text->angle); gl2psPrintf("%g %g %d /%s ", prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->data.text->fontsize, prim->data.text->fontname); switch(prim->data.text->alignment){ case GL2PS_TEXT_C: gl2psPrintf(prim->data.text->angle ? "SCCR\n" : "SCC\n"); break; case GL2PS_TEXT_CL: gl2psPrintf(prim->data.text->angle ? "SCLR\n" : "SCL\n"); break; case GL2PS_TEXT_CR: gl2psPrintf(prim->data.text->angle ? "SCRR\n" : "SCR\n"); break; case GL2PS_TEXT_B: gl2psPrintf(prim->data.text->angle ? "SBCR\n" : "SBC\n"); break; case GL2PS_TEXT_BR: gl2psPrintf(prim->data.text->angle ? "SBRR\n" : "SBR\n"); break; case GL2PS_TEXT_T: gl2psPrintf(prim->data.text->angle ? "STCR\n" : "STC\n"); break; case GL2PS_TEXT_TL: gl2psPrintf(prim->data.text->angle ? "STLR\n" : "STL\n"); break; case GL2PS_TEXT_TR: gl2psPrintf(prim->data.text->angle ? "STRR\n" : "STR\n"); break; case GL2PS_TEXT_BL: default: gl2psPrintf(prim->data.text->angle ? "SR\n" : "S\n"); break; } break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if(prim->data.text->alignment == GL2PS_PS || prim->data.text->alignment == GL2PS_EPS) gl2psPrintf("%s\n", prim->data.text->str); break; default : break; } } static void gl2psPrintPostScriptFooter(void) { gl2psPrintf("grestore\n" "showpage\n" "cleartomark\n" "%%%%PageTrailer\n" "%%%%Trailer\n" "end\n" "%%%%EOF\n"); gl2psPrintGzipFooter(); } static void gl2psPrintPostScriptBeginViewport(GLint viewport[4]) { GLint idx; GLfloat rgba[4]; int x = viewport[0], y = viewport[1], w = viewport[2], h = viewport[3]; glRenderMode(GL_FEEDBACK); if(gl2ps->header){ gl2psPrintPostScriptHeader(); gl2ps->header = GL_FALSE; } gl2psResetPostScriptColor(); gl2psResetLineProperties(); gl2psPrintf("gsave\n" "1.0 1.0 scale\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ if(gl2ps->colormode == GL_RGBA || gl2ps->colorsize == 0){ glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); } else{ glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); rgba[0] = gl2ps->colormap[idx][0]; rgba[1] = gl2ps->colormap[idx][1]; rgba[2] = gl2ps->colormap[idx][2]; rgba[3] = 1.0F; } gl2psPrintf("%g %g %g C\n" "newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n" "closepath fill\n", rgba[0], rgba[1], rgba[2], x, y, x+w, y, x+w, y+h, x, y+h); } gl2psPrintf("newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n" "closepath clip\n", x, y, x+w, y, x+w, y+h, x, y+h); } static GLint gl2psPrintPostScriptEndViewport(void) { GLint res; res = gl2psPrintPrimitives(); gl2psPrintf("grestore\n"); return res; } static void gl2psPrintPostScriptFinalPrimitive(void) { /* End any remaining line, if any */ gl2psEndPostScriptLine(); } /* definition of the PostScript and Encapsulated PostScript backends */ static GL2PSbackend gl2psPS = { gl2psPrintPostScriptHeader, gl2psPrintPostScriptFooter, gl2psPrintPostScriptBeginViewport, gl2psPrintPostScriptEndViewport, gl2psPrintPostScriptPrimitive, gl2psPrintPostScriptFinalPrimitive, "ps", "Postscript" }; static GL2PSbackend gl2psEPS = { gl2psPrintPostScriptHeader, gl2psPrintPostScriptFooter, gl2psPrintPostScriptBeginViewport, gl2psPrintPostScriptEndViewport, gl2psPrintPostScriptPrimitive, gl2psPrintPostScriptFinalPrimitive, "eps", "Encapsulated Postscript" }; /********************************************************************* * * LaTeX routines * *********************************************************************/ static void gl2psPrintTeXHeader(void) { char name[256]; time_t now; int i; if(gl2ps->filename && strlen(gl2ps->filename) < 256){ for(i = (int)strlen(gl2ps->filename) - 1; i >= 0; i--){ if(gl2ps->filename[i] == '.'){ strncpy(name, gl2ps->filename, i); name[i] = '\0'; break; } } if(i <= 0) strcpy(name, gl2ps->filename); } else{ strcpy(name, "untitled"); } time(&now); fprintf(gl2ps->stream, "%% Title: %s\n" "%% Creator: GL2PS %d.%d.%d%s, %s\n" "%% For: %s\n" "%% CreationDate: %s", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); fprintf(gl2ps->stream, "\\setlength{\\unitlength}{1pt}\n" "\\begin{picture}(0,0)\n" "\\includegraphics{%s}\n" "\\end{picture}%%\n" "%s\\begin{picture}(%d,%d)(0,0)\n", name, (gl2ps->options & GL2PS_LANDSCAPE) ? "\\rotatebox{90}{" : "", (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); } static void gl2psPrintTeXPrimitive(void *data) { GL2PSprimitive *prim; prim = *(GL2PSprimitive**)data; switch(prim->type){ case GL2PS_TEXT : fprintf(gl2ps->stream, "\\fontsize{%d}{0}\n\\selectfont", prim->data.text->fontsize); fprintf(gl2ps->stream, "\\put(%g,%g)", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); if(prim->data.text->angle) fprintf(gl2ps->stream, "{\\rotatebox{%g}", prim->data.text->angle); fprintf(gl2ps->stream, "{\\makebox(0,0)"); switch(prim->data.text->alignment){ case GL2PS_TEXT_C: fprintf(gl2ps->stream, "{"); break; case GL2PS_TEXT_CL: fprintf(gl2ps->stream, "[l]{"); break; case GL2PS_TEXT_CR: fprintf(gl2ps->stream, "[r]{"); break; case GL2PS_TEXT_B: fprintf(gl2ps->stream, "[b]{"); break; case GL2PS_TEXT_BR: fprintf(gl2ps->stream, "[br]{"); break; case GL2PS_TEXT_T: fprintf(gl2ps->stream, "[t]{"); break; case GL2PS_TEXT_TL: fprintf(gl2ps->stream, "[tl]{"); break; case GL2PS_TEXT_TR: fprintf(gl2ps->stream, "[tr]{"); break; case GL2PS_TEXT_BL: default: fprintf(gl2ps->stream, "[bl]{"); break; } fprintf(gl2ps->stream, "\\textcolor[rgb]{%g,%g,%g}{{%s}}", prim->verts[0].rgba[0], prim->verts[0].rgba[1], prim->verts[0].rgba[2], prim->data.text->str); if(prim->data.text->angle) fprintf(gl2ps->stream, "}"); fprintf(gl2ps->stream, "}}\n"); break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if (prim->data.text->alignment == GL2PS_TEX) fprintf(gl2ps->stream, "%s\n", prim->data.text->str); break; default : break; } } static void gl2psPrintTeXFooter(void) { fprintf(gl2ps->stream, "\\end{picture}%s\n", (gl2ps->options & GL2PS_LANDSCAPE) ? "}" : ""); } static void gl2psPrintTeXBeginViewport(GLint viewport[4]) { (void) viewport; /* not used */ glRenderMode(GL_FEEDBACK); gl2psResetLineProperties(); if(gl2ps->header){ gl2psPrintTeXHeader(); gl2ps->header = GL_FALSE; } } static GLint gl2psPrintTeXEndViewport(void) { return gl2psPrintPrimitives(); } static void gl2psPrintTeXFinalPrimitive(void) { } /* definition of the LaTeX backend */ static GL2PSbackend gl2psTEX = { gl2psPrintTeXHeader, gl2psPrintTeXFooter, gl2psPrintTeXBeginViewport, gl2psPrintTeXEndViewport, gl2psPrintTeXPrimitive, gl2psPrintTeXFinalPrimitive, "tex", "LaTeX text" }; /********************************************************************* * * PDF routines * *********************************************************************/ static int gl2psPrintPDFCompressorType(void) { #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ return fprintf(gl2ps->stream, "/Filter [/FlateDecode]\n"); } #endif return 0; } static int gl2psPrintPDFStrokeColor(GL2PSrgba rgba) { int i, offs = 0; gl2psSetLastColor(rgba); for(i = 0; i < 3; ++i){ if(GL2PS_ZERO(rgba[i])) offs += gl2psPrintf("%.0f ", 0.); else if(rgba[i] < 1e-4 || rgba[i] > 1e6) /* avoid %e formatting */ offs += gl2psPrintf("%f ", rgba[i]); else offs += gl2psPrintf("%g ", rgba[i]); } offs += gl2psPrintf("RG\n"); return offs; } static int gl2psPrintPDFFillColor(GL2PSrgba rgba) { int i, offs = 0; for(i = 0; i < 3; ++i){ if(GL2PS_ZERO(rgba[i])) offs += gl2psPrintf("%.0f ", 0.); else if(rgba[i] < 1e-4 || rgba[i] > 1e6) /* avoid %e formatting */ offs += gl2psPrintf("%f ", rgba[i]); else offs += gl2psPrintf("%g ", rgba[i]); } offs += gl2psPrintf("rg\n"); return offs; } static int gl2psPrintPDFLineWidth(GLfloat lw) { if(GL2PS_ZERO(lw)) return gl2psPrintf("%.0f w\n", 0.); else if(lw < 1e-4 || lw > 1e6) /* avoid %e formatting */ return gl2psPrintf("%f w\n", lw); else return gl2psPrintf("%g w\n", lw); } static int gl2psPrintPDFLineCap(GLint lc) { if(gl2ps->lastlinecap == lc) return 0; else return gl2psPrintf("%d J\n", lc); } static int gl2psPrintPDFLineJoin(GLint lj) { if(gl2ps->lastlinejoin == lj) return 0; else return gl2psPrintf("%d j\n", lj); } static void gl2psPutPDFText(GL2PSstring *text, int cnt, GLfloat x, GLfloat y) { GLfloat rad, crad, srad; if(text->angle == 0.0F){ gl2ps->streamlength += gl2psPrintf ("BT\n" "/F%d %d Tf\n" "%f %f Td\n" "(%s) Tj\n" "ET\n", cnt, text->fontsize, x, y, text->str); } else{ rad = (GLfloat)(3.141593F * text->angle / 180.0F); srad = (GLfloat)sin(rad); crad = (GLfloat)cos(rad); gl2ps->streamlength += gl2psPrintf ("BT\n" "/F%d %d Tf\n" "%f %f %f %f %f %f Tm\n" "(%s) Tj\n" "ET\n", cnt, text->fontsize, crad, srad, -srad, crad, x, y, text->str); } } static void gl2psPutPDFSpecial(int prim, int sec, GL2PSstring *text) { gl2ps->streamlength += gl2psPrintf("/GS%d%d gs\n", prim, sec); gl2ps->streamlength += gl2psPrintf("%s\n", text->str); } static void gl2psPutPDFImage(GL2PSimage *image, int cnt, GLfloat x, GLfloat y) { gl2ps->streamlength += gl2psPrintf ("q\n" "%d 0 0 %d %f %f cm\n" "/Im%d Do\n" "Q\n", (int)(image->zoom_x * image->width), (int)(image->zoom_y * image->height), x, y, cnt); } static void gl2psPDFstacksInit(void) { gl2ps->objects_stack = 7 /* FIXED_XREF_ENTRIES */ + 1; gl2ps->extgs_stack = 0; gl2ps->font_stack = 0; gl2ps->im_stack = 0; gl2ps->trgroupobjects_stack = 0; gl2ps->shader_stack = 0; gl2ps->mshader_stack = 0; } static void gl2psPDFgroupObjectInit(GL2PSpdfgroup *gro) { if(!gro) return; gro->ptrlist = NULL; gro->fontno = gro->gsno = gro->imno = gro->maskshno = gro->shno = gro->trgroupno = gro->fontobjno = gro->imobjno = gro->shobjno = gro->maskshobjno = gro->gsobjno = gro->trgroupobjno = -1; } /* Build up group objects and assign name and object numbers */ static void gl2psPDFgroupListInit(void) { int i; GL2PSprimitive *p = NULL; GL2PSpdfgroup gro; int lasttype = GL2PS_NO_TYPE; GL2PSrgba lastrgba = {-1.0F, -1.0F, -1.0F, -1.0F}; GLushort lastpattern = 0; GLint lastfactor = 0; GLfloat lastwidth = 1; GLint lastlinecap = 0; GLint lastlinejoin = 0; GL2PStriangle lastt, tmpt; int lastTriangleWasNotSimpleWithSameColor = 0; if(!gl2ps->pdfprimlist) return; gl2ps->pdfgrouplist = gl2psListCreate(500, 500, sizeof(GL2PSpdfgroup)); gl2psInitTriangle(&lastt); for(i = 0; i < gl2psListNbr(gl2ps->pdfprimlist); ++i){ p = *(GL2PSprimitive**)gl2psListPointer(gl2ps->pdfprimlist, i); switch(p->type){ case GL2PS_PIXMAP: gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gro.imno = gl2ps->im_stack++; gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); break; case GL2PS_TEXT: gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gro.fontno = gl2ps->font_stack++; gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); break; case GL2PS_LINE: if(lasttype != p->type || lastwidth != p->width || lastlinecap != p->linecap || lastlinejoin != p->linejoin || lastpattern != p->pattern || lastfactor != p->factor || !gl2psSameColor(p->verts[0].rgba, lastrgba)){ gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); } else{ gl2psListAdd(gro.ptrlist, &p); } lastpattern = p->pattern; lastfactor = p->factor; lastwidth = p->width; lastlinecap = p->linecap; lastlinejoin = p->linejoin; lastrgba[0] = p->verts[0].rgba[0]; lastrgba[1] = p->verts[0].rgba[1]; lastrgba[2] = p->verts[0].rgba[2]; break; case GL2PS_POINT: if(lasttype != p->type || lastwidth != p->width || !gl2psSameColor(p->verts[0].rgba, lastrgba)){ gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1,2,sizeof(GL2PSprimitive*)); gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); } else{ gl2psListAdd(gro.ptrlist, &p); } lastwidth = p->width; lastrgba[0] = p->verts[0].rgba[0]; lastrgba[1] = p->verts[0].rgba[1]; lastrgba[2] = p->verts[0].rgba[2]; break; case GL2PS_TRIANGLE: gl2psFillTriangleFromPrimitive(&tmpt, p, GL_TRUE); lastTriangleWasNotSimpleWithSameColor = !(tmpt.prop & T_CONST_COLOR && tmpt.prop & T_ALPHA_1) || !gl2psSameColor(tmpt.vertex[0].rgba, lastt.vertex[0].rgba); if(lasttype == p->type && tmpt.prop == lastt.prop && lastTriangleWasNotSimpleWithSameColor){ /* TODO Check here for last alpha */ gl2psListAdd(gro.ptrlist, &p); } else{ gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); } lastt = tmpt; break; case GL2PS_SPECIAL: gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); break; default: break; } lasttype = p->type; } } static void gl2psSortOutTrianglePDFgroup(GL2PSpdfgroup *gro) { GL2PStriangle t; GL2PSprimitive *prim = NULL; if(!gro) return; if(!gl2psListNbr(gro->ptrlist)) return; prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, 0); if(prim->type != GL2PS_TRIANGLE) return; gl2psFillTriangleFromPrimitive(&t, prim, GL_TRUE); if(t.prop & T_CONST_COLOR && t.prop & T_ALPHA_LESS_1){ gro->gsno = gl2ps->extgs_stack++; gro->gsobjno = gl2ps->objects_stack ++; } else if(t.prop & T_CONST_COLOR && t.prop & T_VAR_ALPHA){ gro->gsno = gl2ps->extgs_stack++; gro->gsobjno = gl2ps->objects_stack++; gro->trgroupno = gl2ps->trgroupobjects_stack++; gro->trgroupobjno = gl2ps->objects_stack++; gro->maskshno = gl2ps->mshader_stack++; gro->maskshobjno = gl2ps->objects_stack++; } else if(t.prop & T_VAR_COLOR && t.prop & T_ALPHA_1){ gro->shno = gl2ps->shader_stack++; gro->shobjno = gl2ps->objects_stack++; } else if(t.prop & T_VAR_COLOR && t.prop & T_ALPHA_LESS_1){ gro->gsno = gl2ps->extgs_stack++; gro->gsobjno = gl2ps->objects_stack++; gro->shno = gl2ps->shader_stack++; gro->shobjno = gl2ps->objects_stack++; } else if(t.prop & T_VAR_COLOR && t.prop & T_VAR_ALPHA){ gro->gsno = gl2ps->extgs_stack++; gro->gsobjno = gl2ps->objects_stack++; gro->shno = gl2ps->shader_stack++; gro->shobjno = gl2ps->objects_stack++; gro->trgroupno = gl2ps->trgroupobjects_stack++; gro->trgroupobjno = gl2ps->objects_stack++; gro->maskshno = gl2ps->mshader_stack++; gro->maskshobjno = gl2ps->objects_stack++; } } /* Main stream data */ static void gl2psPDFgroupListWriteMainStream(void) { int i, j, lastel, count; GL2PSprimitive *prim = NULL, *prev = NULL; GL2PSpdfgroup *gro; GL2PStriangle t; if(!gl2ps->pdfgrouplist) return; count = gl2psListNbr(gl2ps->pdfgrouplist); for(i = 0; i < count; ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); lastel = gl2psListNbr(gro->ptrlist) - 1; if(lastel < 0) continue; prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, 0); switch(prim->type){ case GL2PS_POINT: gl2ps->streamlength += gl2psPrintf("1 J\n"); gl2ps->streamlength += gl2psPrintPDFLineWidth(prim->width); gl2ps->streamlength += gl2psPrintPDFStrokeColor(prim->verts[0].rgba); for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2ps->streamlength += gl2psPrintf("%f %f m %f %f l\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } gl2ps->streamlength += gl2psPrintf("S\n"); gl2ps->streamlength += gl2psPrintf("0 J\n"); break; case GL2PS_LINE: /* We try to use as few paths as possible to draw lines, in order to get nice stippling even when the individual segments are smaller than the stipple */ gl2ps->streamlength += gl2psPrintPDFLineWidth(prim->width); gl2ps->streamlength += gl2psPrintPDFLineCap(prim->linecap); gl2ps->streamlength += gl2psPrintPDFLineJoin(prim->linejoin); gl2ps->streamlength += gl2psPrintPDFStrokeColor(prim->verts[0].rgba); gl2ps->streamlength += gl2psPrintPostScriptDash(prim->pattern, prim->factor, "d"); /* start new path */ gl2ps->streamlength += gl2psPrintf("%f %f m\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); for(j = 1; j <= lastel; ++j){ prev = prim; prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); if(!gl2psSamePosition(prim->verts[0].xyz, prev->verts[1].xyz)){ /* the starting point of the new segment does not match the end point of the previous line, so we end the current path and start a new one */ gl2ps->streamlength += gl2psPrintf("%f %f l\n", prev->verts[1].xyz[0], prev->verts[1].xyz[1]); gl2ps->streamlength += gl2psPrintf("%f %f m\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } else{ /* the two segements are connected, so we just append to the current path */ gl2ps->streamlength += gl2psPrintf("%f %f l\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } } /* end last path */ gl2ps->streamlength += gl2psPrintf("%f %f l\n", prim->verts[1].xyz[0], prim->verts[1].xyz[1]); gl2ps->streamlength += gl2psPrintf("S\n"); break; case GL2PS_TRIANGLE: gl2psFillTriangleFromPrimitive(&t, prim, GL_TRUE); gl2psSortOutTrianglePDFgroup(gro); /* No alpha and const color: Simple PDF draw orders */ if(t.prop & T_CONST_COLOR && t.prop & T_ALPHA_1){ gl2ps->streamlength += gl2psPrintPDFFillColor(t.vertex[0].rgba); for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psFillTriangleFromPrimitive(&t, prim, GL_FALSE); gl2ps->streamlength += gl2psPrintf("%f %f m\n" "%f %f l\n" "%f %f l\n" "h f\n", t.vertex[0].xyz[0], t.vertex[0].xyz[1], t.vertex[1].xyz[0], t.vertex[1].xyz[1], t.vertex[2].xyz[0], t.vertex[2].xyz[1]); } } /* Const alpha < 1 and const color: Simple PDF draw orders and an extra extended Graphics State for the alpha const */ else if(t.prop & T_CONST_COLOR && t.prop & T_ALPHA_LESS_1){ gl2ps->streamlength += gl2psPrintf("q\n" "/GS%d gs\n", gro->gsno); gl2ps->streamlength += gl2psPrintPDFFillColor(prim->verts[0].rgba); for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psFillTriangleFromPrimitive(&t, prim, GL_FALSE); gl2ps->streamlength += gl2psPrintf("%f %f m\n" "%f %f l\n" "%f %f l\n" "h f\n", t.vertex[0].xyz[0], t.vertex[0].xyz[1], t.vertex[1].xyz[0], t.vertex[1].xyz[1], t.vertex[2].xyz[0], t.vertex[2].xyz[1]); } gl2ps->streamlength += gl2psPrintf("Q\n"); } /* Variable alpha and const color: Simple PDF draw orders and an extra extended Graphics State + Xobject + Shader object for the alpha mask */ else if(t.prop & T_CONST_COLOR && t.prop & T_VAR_ALPHA){ gl2ps->streamlength += gl2psPrintf("q\n" "/GS%d gs\n" "/TrG%d Do\n", gro->gsno, gro->trgroupno); gl2ps->streamlength += gl2psPrintPDFFillColor(prim->verts[0].rgba); for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psFillTriangleFromPrimitive(&t, prim, GL_FALSE); gl2ps->streamlength += gl2psPrintf("%f %f m\n" "%f %f l\n" "%f %f l\n" "h f\n", t.vertex[0].xyz[0], t.vertex[0].xyz[1], t.vertex[1].xyz[0], t.vertex[1].xyz[1], t.vertex[2].xyz[0], t.vertex[2].xyz[1]); } gl2ps->streamlength += gl2psPrintf("Q\n"); } /* Variable color and no alpha: Shader Object for the colored triangle(s) */ else if(t.prop & T_VAR_COLOR && t.prop & T_ALPHA_1){ gl2ps->streamlength += gl2psPrintf("/Sh%d sh\n", gro->shno); } /* Variable color and const alpha < 1: Shader Object for the colored triangle(s) and an extra extended Graphics State for the alpha const */ else if(t.prop & T_VAR_COLOR && t.prop & T_ALPHA_LESS_1){ gl2ps->streamlength += gl2psPrintf("q\n" "/GS%d gs\n" "/Sh%d sh\n" "Q\n", gro->gsno, gro->shno); } /* Variable alpha and color: Shader Object for the colored triangle(s) and an extra extended Graphics State + Xobject + Shader object for the alpha mask */ else if(t.prop & T_VAR_COLOR && t.prop & T_VAR_ALPHA){ gl2ps->streamlength += gl2psPrintf("q\n" "/GS%d gs\n" "/TrG%d Do\n" "/Sh%d sh\n" "Q\n", gro->gsno, gro->trgroupno, gro->shno); } break; case GL2PS_PIXMAP: for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psPutPDFImage(prim->data.image, gro->imno, prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } break; case GL2PS_TEXT: for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2ps->streamlength += gl2psPrintPDFFillColor(prim->verts[0].rgba); gl2psPutPDFText(prim->data.text, gro->fontno, prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } break; case GL2PS_SPECIAL: lastel = gl2psListNbr(gro->ptrlist) - 1; if(lastel < 0) continue; for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psPutPDFSpecial(i, j, prim->data.text); } default: break; } } } /* Graphics State names */ static int gl2psPDFgroupListWriteGStateResources(void) { GL2PSpdfgroup *gro; int offs = 0; int i; offs += fprintf(gl2ps->stream, "/ExtGState\n" "<<\n" "/GSa 7 0 R\n"); for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(gro->gsno >= 0) offs += fprintf(gl2ps->stream, "/GS%d %d 0 R\n", gro->gsno, gro->gsobjno); } offs += fprintf(gl2ps->stream, ">>\n"); return offs; } /* Main Shader names */ static int gl2psPDFgroupListWriteShaderResources(void) { GL2PSpdfgroup *gro; int offs = 0; int i; offs += fprintf(gl2ps->stream, "/Shading\n" "<<\n"); for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(gro->shno >= 0) offs += fprintf(gl2ps->stream, "/Sh%d %d 0 R\n", gro->shno, gro->shobjno); if(gro->maskshno >= 0) offs += fprintf(gl2ps->stream, "/TrSh%d %d 0 R\n", gro->maskshno, gro->maskshobjno); } offs += fprintf(gl2ps->stream,">>\n"); return offs; } /* Images & Mask Shader XObject names */ static int gl2psPDFgroupListWriteXObjectResources(void) { int i; GL2PSprimitive *p = NULL; GL2PSpdfgroup *gro; int offs = 0; offs += fprintf(gl2ps->stream, "/XObject\n" "<<\n"); for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(!gl2psListNbr(gro->ptrlist)) continue; p = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, 0); switch(p->type){ case GL2PS_PIXMAP: gro->imobjno = gl2ps->objects_stack++; if(GL_RGBA == p->data.image->format) /* reserve one object for image mask */ gl2ps->objects_stack++; offs += fprintf(gl2ps->stream, "/Im%d %d 0 R\n", gro->imno, gro->imobjno); case GL2PS_TRIANGLE: if(gro->trgroupno >=0) offs += fprintf(gl2ps->stream, "/TrG%d %d 0 R\n", gro->trgroupno, gro->trgroupobjno); break; default: break; } } offs += fprintf(gl2ps->stream,">>\n"); return offs; } /* Font names */ static int gl2psPDFgroupListWriteFontResources(void) { int i; GL2PSpdfgroup *gro; int offs = 0; offs += fprintf(gl2ps->stream, "/Font\n<<\n"); for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(gro->fontno < 0) continue; gro->fontobjno = gl2ps->objects_stack++; offs += fprintf(gl2ps->stream, "/F%d %d 0 R\n", gro->fontno, gro->fontobjno); } offs += fprintf(gl2ps->stream, ">>\n"); return offs; } static void gl2psPDFgroupListDelete(void) { int i; GL2PSpdfgroup *gro = NULL; if(!gl2ps->pdfgrouplist) return; for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist,i); gl2psListDelete(gro->ptrlist); } gl2psListDelete(gl2ps->pdfgrouplist); gl2ps->pdfgrouplist = NULL; } /* Print 1st PDF object - file info */ static int gl2psPrintPDFInfo(void) { int offs; time_t now; struct tm *newtime; time(&now); newtime = gmtime(&now); offs = fprintf(gl2ps->stream, "1 0 obj\n" "<<\n" "/Title (%s)\n" "/Creator (GL2PS %d.%d.%d%s, %s)\n" "/Producer (%s)\n", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer); if(!newtime){ offs += fprintf(gl2ps->stream, ">>\n" "endobj\n"); return offs; } offs += fprintf(gl2ps->stream, "/CreationDate (D:%d%02d%02d%02d%02d%02d)\n" ">>\n" "endobj\n", newtime->tm_year+1900, newtime->tm_mon+1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec); return offs; } /* Create catalog and page structure - 2nd and 3th PDF object */ static int gl2psPrintPDFCatalog(void) { return fprintf(gl2ps->stream, "2 0 obj\n" "<<\n" "/Type /Catalog\n" "/Pages 3 0 R\n" ">>\n" "endobj\n"); } static int gl2psPrintPDFPages(void) { return fprintf(gl2ps->stream, "3 0 obj\n" "<<\n" "/Type /Pages\n" "/Kids [6 0 R]\n" "/Count 1\n" ">>\n" "endobj\n"); } /* Open stream for data - graphical objects, fonts etc. PDF object 4 */ static int gl2psOpenPDFDataStream(void) { int offs = 0; offs += fprintf(gl2ps->stream, "4 0 obj\n" "<<\n" "/Length 5 0 R\n" ); offs += gl2psPrintPDFCompressorType(); offs += fprintf(gl2ps->stream, ">>\n" "stream\n"); return offs; } /* Stream setup - Graphics state, fill background if allowed */ static int gl2psOpenPDFDataStreamWritePreface(void) { int offs; offs = gl2psPrintf("/GSa gs\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ offs += gl2psPrintPDFFillColor(gl2ps->bgcolor); offs += gl2psPrintf("%d %d %d %d re\n", (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); offs += gl2psPrintf("f\n"); } return offs; } /* Use the functions above to create the first part of the PDF*/ static void gl2psPrintPDFHeader(void) { int offs = 0; gl2ps->pdfprimlist = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*)); gl2psPDFstacksInit(); gl2ps->xreflist = (int*)gl2psMalloc(sizeof(int) * gl2ps->objects_stack); #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ gl2psSetupCompress(); } #endif gl2ps->xreflist[0] = 0; offs += fprintf(gl2ps->stream, "%%PDF-1.4\n"); gl2ps->xreflist[1] = offs; offs += gl2psPrintPDFInfo(); gl2ps->xreflist[2] = offs; offs += gl2psPrintPDFCatalog(); gl2ps->xreflist[3] = offs; offs += gl2psPrintPDFPages(); gl2ps->xreflist[4] = offs; offs += gl2psOpenPDFDataStream(); gl2ps->xreflist[5] = offs; /* finished in gl2psPrintPDFFooter */ gl2ps->streamlength = gl2psOpenPDFDataStreamWritePreface(); } /* The central primitive drawing */ static void gl2psPrintPDFPrimitive(void *data) { GL2PSprimitive *prim = *(GL2PSprimitive**)data; if((gl2ps->options & GL2PS_OCCLUSION_CULL) && prim->culled) return; prim = gl2psCopyPrimitive(prim); /* deep copy */ gl2psListAdd(gl2ps->pdfprimlist, &prim); } /* close stream and ... */ static int gl2psClosePDFDataStream(void) { int offs = 0; #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ if(Z_OK != gl2psDeflate()) gl2psMsg(GL2PS_ERROR, "Zlib deflate error"); else fwrite(gl2ps->compress->dest, gl2ps->compress->destLen, 1, gl2ps->stream); gl2ps->streamlength += gl2ps->compress->destLen; offs += gl2ps->streamlength; gl2psFreeCompress(); } #endif offs += fprintf(gl2ps->stream, "endstream\n" "endobj\n"); return offs; } /* ... write the now known length object */ static int gl2psPrintPDFDataStreamLength(int val) { return fprintf(gl2ps->stream, "5 0 obj\n" "%d\n" "endobj\n", val); } /* Put the info created before in PDF objects */ static int gl2psPrintPDFOpenPage(void) { int offs; /* Write fixed part */ offs = fprintf(gl2ps->stream, "6 0 obj\n" "<<\n" "/Type /Page\n" "/Parent 3 0 R\n" "/MediaBox [%d %d %d %d]\n", (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); if(gl2ps->options & GL2PS_LANDSCAPE) offs += fprintf(gl2ps->stream, "/Rotate -90\n"); offs += fprintf(gl2ps->stream, "/Contents 4 0 R\n" "/Resources\n" "<<\n" "/ProcSet [/PDF /Text /ImageB /ImageC] %%/ImageI\n"); return offs; /* End fixed part, proceeds in gl2psPDFgroupListWriteVariableResources() */ } static int gl2psPDFgroupListWriteVariableResources(void) { int offs = 0; /* a) Graphics States for shader alpha masks*/ offs += gl2psPDFgroupListWriteGStateResources(); /* b) Shader and shader masks */ offs += gl2psPDFgroupListWriteShaderResources(); /* c) XObjects (Images & Shader Masks) */ offs += gl2psPDFgroupListWriteXObjectResources(); /* d) Fonts */ offs += gl2psPDFgroupListWriteFontResources(); /* End resources and page */ offs += fprintf(gl2ps->stream, ">>\n" ">>\n" "endobj\n"); return offs; } /* Standard Graphics State */ static int gl2psPrintPDFGSObject(void) { return fprintf(gl2ps->stream, "7 0 obj\n" "<<\n" "/Type /ExtGState\n" "/SA false\n" "/SM 0.02\n" "/OP false\n" "/op false\n" "/OPM 0\n" "/BG2 /Default\n" "/UCR2 /Default\n" "/TR2 /Default\n" ">>\n" "endobj\n"); } /* Put vertex' edge flag (8bit) and coordinates (32bit) in shader stream */ static int gl2psPrintPDFShaderStreamDataCoord(GL2PSvertex *vertex, int (*action)(unsigned long data, int size), GLfloat dx, GLfloat dy, GLfloat xmin, GLfloat ymin) { int offs = 0; unsigned long imap; GLfloat diff; double dmax = ~1UL; char edgeflag = 0; /* FIXME: temp bux fix for 64 bit archs: */ if(sizeof(unsigned long) == 8) dmax = dmax - 2048.; offs += (*action)(edgeflag, 1); /* The Shader stream in PDF requires to be in a 'big-endian' order */ if(GL2PS_ZERO(dx * dy)){ offs += (*action)(0, 4); offs += (*action)(0, 4); } else{ diff = (vertex->xyz[0] - xmin) / dx; if(diff > 1) diff = 1.0F; else if(diff < 0) diff = 0.0F; imap = (unsigned long)(diff * dmax); offs += (*action)(imap, 4); diff = (vertex->xyz[1] - ymin) / dy; if(diff > 1) diff = 1.0F; else if(diff < 0) diff = 0.0F; imap = (unsigned long)(diff * dmax); offs += (*action)(imap, 4); } return offs; } /* Put vertex' rgb value (8bit for every component) in shader stream */ static int gl2psPrintPDFShaderStreamDataRGB(GL2PSvertex *vertex, int (*action)(unsigned long data, int size)) { int offs = 0; unsigned long imap; double dmax = ~1UL; /* FIXME: temp bux fix for 64 bit archs: */ if(sizeof(unsigned long) == 8) dmax = dmax - 2048.; imap = (unsigned long)((vertex->rgba[0]) * dmax); offs += (*action)(imap, 1); imap = (unsigned long)((vertex->rgba[1]) * dmax); offs += (*action)(imap, 1); imap = (unsigned long)((vertex->rgba[2]) * dmax); offs += (*action)(imap, 1); return offs; } /* Put vertex' alpha (8/16bit) in shader stream */ static int gl2psPrintPDFShaderStreamDataAlpha(GL2PSvertex *vertex, int (*action)(unsigned long data, int size), int sigbyte) { int offs = 0; unsigned long imap; double dmax = ~1UL; /* FIXME: temp bux fix for 64 bit archs: */ if(sizeof(unsigned long) == 8) dmax = dmax - 2048.; if(sigbyte != 8 && sigbyte != 16) sigbyte = 8; sigbyte /= 8; imap = (unsigned long)((vertex->rgba[3]) * dmax); offs += (*action)(imap, sigbyte); return offs; } /* Put a triangles raw data in shader stream */ static int gl2psPrintPDFShaderStreamData(GL2PStriangle *triangle, GLfloat dx, GLfloat dy, GLfloat xmin, GLfloat ymin, int (*action)(unsigned long data, int size), int gray) { int i, offs = 0; GL2PSvertex v; if(gray && gray != 8 && gray != 16) gray = 8; for(i = 0; i < 3; ++i){ offs += gl2psPrintPDFShaderStreamDataCoord(&triangle->vertex[i], action, dx, dy, xmin, ymin); if(gray){ v = triangle->vertex[i]; offs += gl2psPrintPDFShaderStreamDataAlpha(&v, action, gray); } else{ offs += gl2psPrintPDFShaderStreamDataRGB(&triangle->vertex[i], action); } } return offs; } static void gl2psPDFRectHull(GLfloat *xmin, GLfloat *xmax, GLfloat *ymin, GLfloat *ymax, GL2PStriangle *triangles, int cnt) { int i, j; *xmin = triangles[0].vertex[0].xyz[0]; *xmax = triangles[0].vertex[0].xyz[0]; *ymin = triangles[0].vertex[0].xyz[1]; *ymax = triangles[0].vertex[0].xyz[1]; for(i = 0; i < cnt; ++i){ for(j = 0; j < 3; ++j){ if(*xmin > triangles[i].vertex[j].xyz[0]) *xmin = triangles[i].vertex[j].xyz[0]; if(*xmax < triangles[i].vertex[j].xyz[0]) *xmax = triangles[i].vertex[j].xyz[0]; if(*ymin > triangles[i].vertex[j].xyz[1]) *ymin = triangles[i].vertex[j].xyz[1]; if(*ymax < triangles[i].vertex[j].xyz[1]) *ymax = triangles[i].vertex[j].xyz[1]; } } } /* Writes shaded triangle gray == 0 means write RGB triangles gray == 8 8bit-grayscale (for alpha masks) gray == 16 16bit-grayscale (for alpha masks) */ static int gl2psPrintPDFShader(int obj, GL2PStriangle *triangles, int size, int gray) { int i, offs = 0, vertexbytes, done = 0; GLfloat xmin, xmax, ymin, ymax; switch(gray){ case 0: vertexbytes = 1+4+4+1+1+1; break; case 8: vertexbytes = 1+4+4+1; break; case 16: vertexbytes = 1+4+4+2; break; default: gray = 8; vertexbytes = 1+4+4+1; break; } gl2psPDFRectHull(&xmin, &xmax, &ymin, &ymax, triangles, size); offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<< " "/ShadingType 4 " "/ColorSpace %s " "/BitsPerCoordinate 32 " "/BitsPerComponent %d " "/BitsPerFlag 8 " "/Decode [%f %f %f %f 0 1 %s] ", obj, (gray) ? "/DeviceGray" : "/DeviceRGB", (gray) ? gray : 8, xmin, xmax, ymin, ymax, (gray) ? "" : "0 1 0 1"); #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ gl2psAllocCompress(vertexbytes * size * 3); for(i = 0; i < size; ++i) gl2psPrintPDFShaderStreamData(&triangles[i], xmax-xmin, ymax-ymin, xmin, ymin, gl2psWriteBigEndianCompress, gray); if(Z_OK == gl2psDeflate() && 23 + gl2ps->compress->destLen < gl2ps->compress->srcLen){ offs += gl2psPrintPDFCompressorType(); offs += fprintf(gl2ps->stream, "/Length %d " ">>\n" "stream\n", (int)gl2ps->compress->destLen); offs += gl2ps->compress->destLen * fwrite(gl2ps->compress->dest, gl2ps->compress->destLen, 1, gl2ps->stream); done = 1; } gl2psFreeCompress(); } #endif if(!done){ /* no compression, or too long after compression, or compress error -> write non-compressed entry */ offs += fprintf(gl2ps->stream, "/Length %d " ">>\n" "stream\n", vertexbytes * 3 * size); for(i = 0; i < size; ++i) offs += gl2psPrintPDFShaderStreamData(&triangles[i], xmax-xmin, ymax-ymin, xmin, ymin, gl2psWriteBigEndian, gray); } offs += fprintf(gl2ps->stream, "\nendstream\n" "endobj\n"); return offs; } /* Writes a XObject for a shaded triangle mask */ static int gl2psPrintPDFShaderMask(int obj, int childobj) { int offs = 0, len; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n" "/Type /XObject\n" "/Subtype /Form\n" "/BBox [ %d %d %d %d ]\n" "/Group \n<<\n/S /Transparency /CS /DeviceRGB\n" ">>\n", obj, (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); len = (childobj>0) ? (int)strlen("/TrSh sh\n") + (int)log10((double)childobj)+1 : (int)strlen("/TrSh0 sh\n"); offs += fprintf(gl2ps->stream, "/Length %d\n" ">>\n" "stream\n", len); offs += fprintf(gl2ps->stream, "/TrSh%d sh\n", childobj); offs += fprintf(gl2ps->stream, "endstream\n" "endobj\n"); return offs; } /* Writes a Extended graphics state for a shaded triangle mask if simplealpha ist true the childobj argument is ignored and a /ca statement will be written instead */ static int gl2psPrintPDFShaderExtGS(int obj, int childobj) { int offs = 0; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n", obj); offs += fprintf(gl2ps->stream, "/SMask << /S /Alpha /G %d 0 R >> ", childobj); offs += fprintf(gl2ps->stream, ">>\n" "endobj\n"); return offs; } /* a simple graphics state */ static int gl2psPrintPDFShaderSimpleExtGS(int obj, GLfloat alpha) { int offs = 0; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n" "/ca %g" ">>\n" "endobj\n", obj, alpha); return offs; } /* Similar groups of functions for pixmaps and text */ static int gl2psPrintPDFPixmapStreamData(GL2PSimage *im, int (*action)(unsigned long data, int size), int gray) { int x, y, shift; GLfloat r, g, b, a; if(im->format != GL_RGBA && gray) return 0; if(gray && gray != 8 && gray != 16) gray = 8; gray /= 8; shift = (sizeof(unsigned long) - 1) * 8; for(y = 0; y < im->height; ++y){ for(x = 0; x < im->width; ++x){ a = gl2psGetRGB(im, x, y, &r, &g, &b); if(im->format == GL_RGBA && gray){ (*action)((unsigned long)(a * 255) << shift, gray); } else{ (*action)((unsigned long)(r * 255) << shift, 1); (*action)((unsigned long)(g * 255) << shift, 1); (*action)((unsigned long)(b * 255) << shift, 1); } } } switch(gray){ case 0: return 3 * im->width * im->height; case 1: return im->width * im->height; case 2: return 2 * im->width * im->height; default: return 3 * im->width * im->height; } } static int gl2psPrintPDFPixmap(int obj, int childobj, GL2PSimage *im, int gray) { int offs = 0, done = 0, sigbytes = 3; if(gray && gray !=8 && gray != 16) gray = 8; if(gray) sigbytes = gray / 8; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n" "/Type /XObject\n" "/Subtype /Image\n" "/Width %d\n" "/Height %d\n" "/ColorSpace %s \n" "/BitsPerComponent 8\n", obj, (int)im->width, (int)im->height, (gray) ? "/DeviceGray" : "/DeviceRGB" ); if(GL_RGBA == im->format && gray == 0){ offs += fprintf(gl2ps->stream, "/SMask %d 0 R\n", childobj); } #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ gl2psAllocCompress((int)(im->width * im->height * sigbytes)); gl2psPrintPDFPixmapStreamData(im, gl2psWriteBigEndianCompress, gray); if(Z_OK == gl2psDeflate() && 23 + gl2ps->compress->destLen < gl2ps->compress->srcLen){ offs += gl2psPrintPDFCompressorType(); offs += fprintf(gl2ps->stream, "/Length %d " ">>\n" "stream\n", (int)gl2ps->compress->destLen); offs += gl2ps->compress->destLen * fwrite(gl2ps->compress->dest, gl2ps->compress->destLen, 1, gl2ps->stream); done = 1; } gl2psFreeCompress(); } #endif if(!done){ /* no compression, or too long after compression, or compress error -> write non-compressed entry */ offs += fprintf(gl2ps->stream, "/Length %d " ">>\n" "stream\n", (int)(im->width * im->height * sigbytes)); offs += gl2psPrintPDFPixmapStreamData(im, gl2psWriteBigEndian, gray); } offs += fprintf(gl2ps->stream, "\nendstream\n" "endobj\n"); return offs; } static int gl2psPrintPDFText(int obj, GL2PSstring *s, int fontnumber) { int offs = 0; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n" "/Type /Font\n" "/Subtype /Type1\n" "/Name /F%d\n" "/BaseFont /%s\n" "/Encoding /MacRomanEncoding\n" ">>\n" "endobj\n", obj, fontnumber, s->fontname); return offs; } /* Write the physical objects */ static int gl2psPDFgroupListWriteObjects(int entryoffs) { int i,j; GL2PSprimitive *p = NULL; GL2PSpdfgroup *gro; int offs = entryoffs; GL2PStriangle *triangles; int size = 0; if(!gl2ps->pdfgrouplist) return offs; for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(!gl2psListNbr(gro->ptrlist)) continue; p = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, 0); switch(p->type){ case GL2PS_POINT: break; case GL2PS_LINE: break; case GL2PS_TRIANGLE: size = gl2psListNbr(gro->ptrlist); triangles = (GL2PStriangle*)gl2psMalloc(sizeof(GL2PStriangle) * size); for(j = 0; j < size; ++j){ p = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psFillTriangleFromPrimitive(&triangles[j], p, GL_TRUE); } if(triangles[0].prop & T_VAR_COLOR){ gl2ps->xreflist[gro->shobjno] = offs; offs += gl2psPrintPDFShader(gro->shobjno, triangles, size, 0); } if(triangles[0].prop & T_ALPHA_LESS_1){ gl2ps->xreflist[gro->gsobjno] = offs; offs += gl2psPrintPDFShaderSimpleExtGS(gro->gsobjno, triangles[0].vertex[0].rgba[3]); } if(triangles[0].prop & T_VAR_ALPHA){ gl2ps->xreflist[gro->gsobjno] = offs; offs += gl2psPrintPDFShaderExtGS(gro->gsobjno, gro->trgroupobjno); gl2ps->xreflist[gro->trgroupobjno] = offs; offs += gl2psPrintPDFShaderMask(gro->trgroupobjno, gro->maskshno); gl2ps->xreflist[gro->maskshobjno] = offs; offs += gl2psPrintPDFShader(gro->maskshobjno, triangles, size, 8); } gl2psFree(triangles); break; case GL2PS_PIXMAP: gl2ps->xreflist[gro->imobjno] = offs; offs += gl2psPrintPDFPixmap(gro->imobjno, gro->imobjno+1, p->data.image, 0); if(p->data.image->format == GL_RGBA){ gl2ps->xreflist[gro->imobjno+1] = offs; offs += gl2psPrintPDFPixmap(gro->imobjno+1, -1, p->data.image, 8); } break; case GL2PS_TEXT: gl2ps->xreflist[gro->fontobjno] = offs; offs += gl2psPrintPDFText(gro->fontobjno,p->data.text,gro->fontno); break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if(p->data.text->alignment == GL2PS_PDF) offs += fprintf(gl2ps->stream, "%s\n", p->data.text->str); break; default: break; } } return offs; } /* All variable data has been written at this point and all required functioninality has been gathered, so we can write now file footer with cross reference table and trailer */ static void gl2psPrintPDFFooter(void) { int i, offs; gl2psPDFgroupListInit(); gl2psPDFgroupListWriteMainStream(); offs = gl2ps->xreflist[5] + gl2ps->streamlength; offs += gl2psClosePDFDataStream(); gl2ps->xreflist[5] = offs; offs += gl2psPrintPDFDataStreamLength(gl2ps->streamlength); gl2ps->xreflist[6] = offs; gl2ps->streamlength = 0; offs += gl2psPrintPDFOpenPage(); offs += gl2psPDFgroupListWriteVariableResources(); gl2ps->xreflist = (int*)gl2psRealloc(gl2ps->xreflist, sizeof(int) * (gl2ps->objects_stack + 1)); gl2ps->xreflist[7] = offs; offs += gl2psPrintPDFGSObject(); gl2ps->xreflist[8] = offs; gl2ps->xreflist[gl2ps->objects_stack] = gl2psPDFgroupListWriteObjects(gl2ps->xreflist[8]); /* Start cross reference table. The file has to been opened in binary mode to preserve the 20 digit string length! */ fprintf(gl2ps->stream, "xref\n" "0 %d\n" "%010d 65535 f \n", gl2ps->objects_stack, 0); for(i = 1; i < gl2ps->objects_stack; ++i) fprintf(gl2ps->stream, "%010d 00000 n \n", gl2ps->xreflist[i]); fprintf(gl2ps->stream, "trailer\n" "<<\n" "/Size %d\n" "/Info 1 0 R\n" "/Root 2 0 R\n" ">>\n" "startxref\n%d\n" "%%%%EOF\n", gl2ps->objects_stack, gl2ps->xreflist[gl2ps->objects_stack]); /* Free auxiliary lists and arrays */ gl2psFree(gl2ps->xreflist); gl2psListAction(gl2ps->pdfprimlist, gl2psFreePrimitive); gl2psListDelete(gl2ps->pdfprimlist); gl2psPDFgroupListDelete(); #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ gl2psFreeCompress(); gl2psFree(gl2ps->compress); gl2ps->compress = NULL; } #endif } /* PDF begin viewport */ static void gl2psPrintPDFBeginViewport(GLint viewport[4]) { int offs = 0; GLint idx; GLfloat rgba[4]; int x = viewport[0], y = viewport[1], w = viewport[2], h = viewport[3]; glRenderMode(GL_FEEDBACK); gl2psResetLineProperties(); if(gl2ps->header){ gl2psPrintPDFHeader(); gl2ps->header = GL_FALSE; } offs += gl2psPrintf("q\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ if(gl2ps->colormode == GL_RGBA || gl2ps->colorsize == 0){ glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); } else{ glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); rgba[0] = gl2ps->colormap[idx][0]; rgba[1] = gl2ps->colormap[idx][1]; rgba[2] = gl2ps->colormap[idx][2]; rgba[3] = 1.0F; } offs += gl2psPrintPDFFillColor(rgba); offs += gl2psPrintf("%d %d %d %d re\n" "W\n" "f\n", x, y, w, h); } else{ offs += gl2psPrintf("%d %d %d %d re\n" "W\n" "n\n", x, y, w, h); } gl2ps->streamlength += offs; } static GLint gl2psPrintPDFEndViewport(void) { GLint res; res = gl2psPrintPrimitives(); gl2ps->streamlength += gl2psPrintf("Q\n"); return res; } static void gl2psPrintPDFFinalPrimitive(void) { } /* definition of the PDF backend */ static GL2PSbackend gl2psPDF = { gl2psPrintPDFHeader, gl2psPrintPDFFooter, gl2psPrintPDFBeginViewport, gl2psPrintPDFEndViewport, gl2psPrintPDFPrimitive, gl2psPrintPDFFinalPrimitive, "pdf", "Portable Document Format" }; /********************************************************************* * * SVG routines * *********************************************************************/ static void gl2psSVGGetCoordsAndColors(int n, GL2PSvertex *verts, GL2PSxyz *xyz, GL2PSrgba *rgba) { int i, j; for(i = 0; i < n; i++){ xyz[i][0] = verts[i].xyz[0]; xyz[i][1] = gl2ps->viewport[3] - verts[i].xyz[1]; xyz[i][2] = 0.0F; for(j = 0; j < 4; j++) rgba[i][j] = verts[i].rgba[j]; } } static void gl2psSVGGetColorString(GL2PSrgba rgba, char str[32]) { int r = (int)(255. * rgba[0]); int g = (int)(255. * rgba[1]); int b = (int)(255. * rgba[2]); int rc = (r < 0) ? 0 : (r > 255) ? 255 : r; int gc = (g < 0) ? 0 : (g > 255) ? 255 : g; int bc = (b < 0) ? 0 : (b > 255) ? 255 : b; sprintf(str, "#%2.2x%2.2x%2.2x", rc, gc, bc); } static void gl2psPrintSVGHeader(void) { int x, y, width, height; char col[32]; time_t now; time(&now); if (gl2ps->options & GL2PS_LANDSCAPE){ x = (int)gl2ps->viewport[1]; y = (int)gl2ps->viewport[0]; width = (int)gl2ps->viewport[3]; height = (int)gl2ps->viewport[2]; } else{ x = (int)gl2ps->viewport[0]; y = (int)gl2ps->viewport[1]; width = (int)gl2ps->viewport[2]; height = (int)gl2ps->viewport[3]; } /* Compressed SVG files (.svgz) are simply gzipped SVG files */ gl2psPrintGzipHeader(); gl2psPrintf("\n"); gl2psPrintf("\n", width, height, x, y, width, height); gl2psPrintf("%s\n", gl2ps->title); gl2psPrintf("\n"); gl2psPrintf("Creator: GL2PS %d.%d.%d%s, %s\n" "For: %s\n" "CreationDate: %s", GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); gl2psPrintf("\n"); gl2psPrintf("\n"); gl2psPrintf("\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ gl2psSVGGetColorString(gl2ps->bgcolor, col); gl2psPrintf("\n", col, (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3], (int)gl2ps->viewport[0], (int)gl2ps->viewport[3]); } /* group all the primitives and disable antialiasing */ gl2psPrintf("\n"); } static void gl2psPrintSVGSmoothTriangle(GL2PSxyz xyz[3], GL2PSrgba rgba[3]) { int i; GL2PSxyz xyz2[3]; GL2PSrgba rgba2[3]; char col[32]; /* Apparently there is no easy way to do Gouraud shading in SVG without explicitly pre-defining gradients, so for now we just do recursive subdivision */ if(gl2psSameColorThreshold(3, rgba, gl2ps->threshold)){ gl2psSVGGetColorString(rgba[0], col); gl2psPrintf("\n", xyz[0][0], xyz[0][1], xyz[1][0], xyz[1][1], xyz[2][0], xyz[2][1]); } else{ /* subdivide into 4 subtriangles */ for(i = 0; i < 3; i++){ xyz2[0][i] = xyz[0][i]; xyz2[1][i] = 0.5F * (xyz[0][i] + xyz[1][i]); xyz2[2][i] = 0.5F * (xyz[0][i] + xyz[2][i]); } for(i = 0; i < 4; i++){ rgba2[0][i] = rgba[0][i]; rgba2[1][i] = 0.5F * (rgba[0][i] + rgba[1][i]); rgba2[2][i] = 0.5F * (rgba[0][i] + rgba[2][i]); } gl2psPrintSVGSmoothTriangle(xyz2, rgba2); for(i = 0; i < 3; i++){ xyz2[0][i] = 0.5F * (xyz[0][i] + xyz[1][i]); xyz2[1][i] = xyz[1][i]; xyz2[2][i] = 0.5F * (xyz[1][i] + xyz[2][i]); } for(i = 0; i < 4; i++){ rgba2[0][i] = 0.5F * (rgba[0][i] + rgba[1][i]); rgba2[1][i] = rgba[1][i]; rgba2[2][i] = 0.5F * (rgba[1][i] + rgba[2][i]); } gl2psPrintSVGSmoothTriangle(xyz2, rgba2); for(i = 0; i < 3; i++){ xyz2[0][i] = 0.5F * (xyz[0][i] + xyz[2][i]); xyz2[1][i] = xyz[2][i]; xyz2[2][i] = 0.5F * (xyz[1][i] + xyz[2][i]); } for(i = 0; i < 4; i++){ rgba2[0][i] = 0.5F * (rgba[0][i] + rgba[2][i]); rgba2[1][i] = rgba[2][i]; rgba2[2][i] = 0.5F * (rgba[1][i] + rgba[2][i]); } gl2psPrintSVGSmoothTriangle(xyz2, rgba2); for(i = 0; i < 3; i++){ xyz2[0][i] = 0.5F * (xyz[0][i] + xyz[1][i]); xyz2[1][i] = 0.5F * (xyz[1][i] + xyz[2][i]); xyz2[2][i] = 0.5F * (xyz[0][i] + xyz[2][i]); } for(i = 0; i < 4; i++){ rgba2[0][i] = 0.5F * (rgba[0][i] + rgba[1][i]); rgba2[1][i] = 0.5F * (rgba[1][i] + rgba[2][i]); rgba2[2][i] = 0.5F * (rgba[0][i] + rgba[2][i]); } gl2psPrintSVGSmoothTriangle(xyz2, rgba2); } } static void gl2psPrintSVGDash(GLushort pattern, GLint factor) { int i, n, array[10]; if(!pattern || !factor) return; /* solid line */ gl2psParseStipplePattern(pattern, factor, &n, array); gl2psPrintf("stroke-dasharray=\""); for(i = 0; i < n; i++){ if(i) gl2psPrintf(","); gl2psPrintf("%d", array[i]); } gl2psPrintf("\" "); } static void gl2psEndSVGLine(void) { int i; if(gl2ps->lastvertex.rgba[0] >= 0.){ gl2psPrintf("%g,%g\"/>\n", gl2ps->lastvertex.xyz[0], gl2ps->viewport[3] - gl2ps->lastvertex.xyz[1]); for(i = 0; i < 3; i++) gl2ps->lastvertex.xyz[i] = -1.; for(i = 0; i < 4; i++) gl2ps->lastvertex.rgba[i] = -1.; } } static void gl2psPrintSVGPixmap(GLfloat x, GLfloat y, GL2PSimage *pixmap) { #if defined(GL2PS_HAVE_LIBPNG) GL2PSlist *png; unsigned char c; int i; /* The only image types supported by the SVG standard are JPEG, PNG and SVG. Here we choose PNG, and since we want to embed the image directly in the SVG stream (and not link to an external image file), we need to encode the pixmap into PNG in memory, then encode it into base64. */ png = gl2psListCreate(pixmap->width * pixmap->height * 3, 1000, sizeof(unsigned char)); gl2psConvertPixmapToPNG(pixmap, png); gl2psListEncodeBase64(png); /* Use "transform" attribute to scale and translate the image from the coordinates origin (0,0) */ y -= pixmap->zoom_y * (GLfloat)pixmap->height; gl2psPrintf("width, pixmap->height); gl2psPrintf("transform=\"matrix(%g,0,0,%g,%g,%g)\"\n", pixmap->zoom_x, pixmap->zoom_y, x, y); gl2psPrintf("xlink:href=\"data:image/png;base64,"); for(i = 0; i < gl2psListNbr(png); i++){ gl2psListRead(png, i, &c); gl2psPrintf("%c", c); } gl2psPrintf("\"/>\n"); gl2psListDelete(png); #else (void) x; (void) y; (void) pixmap; /* not used */ gl2psMsg(GL2PS_WARNING, "GL2PS must be compiled with PNG support in " "order to embed images in SVG streams"); #endif } static void gl2psPrintSVGPrimitive(void *data) { GL2PSprimitive *prim; GL2PSxyz xyz[4]; GL2PSrgba rgba[4]; char col[32]; char lcap[7], ljoin[7]; int newline; prim = *(GL2PSprimitive**)data; if((gl2ps->options & GL2PS_OCCLUSION_CULL) && prim->culled) return; /* We try to draw connected lines as a single path to get nice line joins and correct stippling. So if the primitive to print is not a line we must first finish the current line (if any): */ if(prim->type != GL2PS_LINE) gl2psEndSVGLine(); gl2psSVGGetCoordsAndColors(prim->numverts, prim->verts, xyz, rgba); switch(prim->type){ case GL2PS_POINT : gl2psSVGGetColorString(rgba[0], col); gl2psPrintf("\n", xyz[0][0], xyz[0][1], 0.5 * prim->width); break; case GL2PS_LINE : if(!gl2psSamePosition(gl2ps->lastvertex.xyz, prim->verts[0].xyz) || !gl2psSameColor(gl2ps->lastrgba, prim->verts[0].rgba) || gl2ps->lastlinewidth != prim->width || gl2ps->lastlinecap != prim->linecap || gl2ps->lastlinejoin != prim->linejoin || gl2ps->lastpattern != prim->pattern || gl2ps->lastfactor != prim->factor){ /* End the current line if the new segment does not start where the last one ended, or if the color, the width or the stippling have changed (we will need to use multi-point gradients for smooth-shaded lines) */ gl2psEndSVGLine(); newline = 1; } else{ newline = 0; } gl2ps->lastvertex = prim->verts[1]; gl2psSetLastColor(prim->verts[0].rgba); gl2ps->lastlinewidth = prim->width; gl2ps->lastlinecap = prim->linecap; gl2ps->lastlinejoin = prim->linejoin; gl2ps->lastpattern = prim->pattern; gl2ps->lastfactor = prim->factor; if(newline){ gl2psSVGGetColorString(rgba[0], col); gl2psPrintf("width); switch (prim->linecap){ case GL2PS_LINE_CAP_BUTT: sprintf (lcap, "%s", "butt"); break; case GL2PS_LINE_CAP_ROUND: sprintf (lcap, "%s", "round"); break; case GL2PS_LINE_CAP_SQUARE: sprintf (lcap, "%s", "square"); break; } switch (prim->linejoin){ case GL2PS_LINE_JOIN_MITER: sprintf (ljoin, "%s", "miter"); break; case GL2PS_LINE_JOIN_ROUND: sprintf (ljoin, "%s", "round"); break; case GL2PS_LINE_JOIN_BEVEL: sprintf (ljoin, "%s", "bevel"); break; } gl2psPrintf("stroke-linecap=\"%s\" stroke-linejoin=\"%s\" ", lcap, ljoin); if(rgba[0][3] < 1.0F) gl2psPrintf("stroke-opacity=\"%g\" ", rgba[0][3]); gl2psPrintSVGDash(prim->pattern, prim->factor); gl2psPrintf("points=\"%g,%g ", xyz[0][0], xyz[0][1]); } else{ gl2psPrintf("%g,%g ", xyz[0][0], xyz[0][1]); } break; case GL2PS_TRIANGLE : gl2psPrintSVGSmoothTriangle(xyz, rgba); break; case GL2PS_QUADRANGLE : gl2psMsg(GL2PS_WARNING, "There should not be any quad left to print"); break; case GL2PS_PIXMAP : gl2psPrintSVGPixmap(xyz[0][0], xyz[0][1], prim->data.image); break; case GL2PS_TEXT : gl2psSVGGetColorString(prim->verts[0].rgba, col); gl2psPrintf("data.text->fontsize); if(prim->data.text->angle) gl2psPrintf("transform=\"rotate(%g, %g, %g)\" ", -prim->data.text->angle, xyz[0][0], xyz[0][1]); switch(prim->data.text->alignment){ case GL2PS_TEXT_C: gl2psPrintf("text-anchor=\"middle\" dy=\"%d\" ", prim->data.text->fontsize / 2); break; case GL2PS_TEXT_CL: gl2psPrintf("text-anchor=\"start\" dy=\"%d\" ", prim->data.text->fontsize / 2); break; case GL2PS_TEXT_CR: gl2psPrintf("text-anchor=\"end\" dy=\"%d\" ", prim->data.text->fontsize / 2); break; case GL2PS_TEXT_B: gl2psPrintf("text-anchor=\"middle\" dy=\"0\" "); break; case GL2PS_TEXT_BR: gl2psPrintf("text-anchor=\"end\" dy=\"0\" "); break; case GL2PS_TEXT_T: gl2psPrintf("text-anchor=\"middle\" dy=\"%d\" ", prim->data.text->fontsize); break; case GL2PS_TEXT_TL: gl2psPrintf("text-anchor=\"start\" dy=\"%d\" ", prim->data.text->fontsize); break; case GL2PS_TEXT_TR: gl2psPrintf("text-anchor=\"end\" dy=\"%d\" ", prim->data.text->fontsize); break; case GL2PS_TEXT_BL: default: /* same as GL2PS_TEXT_BL */ gl2psPrintf("text-anchor=\"start\" dy=\"0\" "); break; } if(!strcmp(prim->data.text->fontname, "Times-Roman")) gl2psPrintf("font-family=\"Times\">"); else if(!strcmp(prim->data.text->fontname, "Times-Bold")) gl2psPrintf("font-family=\"Times\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Times-Italic")) gl2psPrintf("font-family=\"Times\" font-style=\"italic\">"); else if(!strcmp(prim->data.text->fontname, "Times-BoldItalic")) gl2psPrintf("font-family=\"Times\" font-style=\"italic\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Helvetica-Bold")) gl2psPrintf("font-family=\"Helvetica\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Helvetica-Oblique")) gl2psPrintf("font-family=\"Helvetica\" font-style=\"oblique\">"); else if(!strcmp(prim->data.text->fontname, "Helvetica-BoldOblique")) gl2psPrintf("font-family=\"Helvetica\" font-style=\"oblique\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Courier-Bold")) gl2psPrintf("font-family=\"Courier\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Courier-Oblique")) gl2psPrintf("font-family=\"Courier\" font-style=\"oblique\">"); else if(!strcmp(prim->data.text->fontname, "Courier-BoldOblique")) gl2psPrintf("font-family=\"Courier\" font-style=\"oblique\" font-weight=\"bold\">"); else gl2psPrintf("font-family=\"%s\">", prim->data.text->fontname); gl2psPrintf("%s\n", prim->data.text->str); break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if(prim->data.text->alignment == GL2PS_SVG) gl2psPrintf("%s\n", prim->data.text->str); break; default : break; } } static void gl2psPrintSVGFooter(void) { gl2psPrintf("\n"); gl2psPrintf("\n"); gl2psPrintGzipFooter(); } static void gl2psPrintSVGBeginViewport(GLint viewport[4]) { GLint idx; char col[32]; GLfloat rgba[4]; int x = viewport[0], y = viewport[1], w = viewport[2], h = viewport[3]; glRenderMode(GL_FEEDBACK); gl2psResetLineProperties(); if(gl2ps->header){ gl2psPrintSVGHeader(); gl2ps->header = GL_FALSE; } if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ if(gl2ps->colormode == GL_RGBA || gl2ps->colorsize == 0){ glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); } else{ glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); rgba[0] = gl2ps->colormap[idx][0]; rgba[1] = gl2ps->colormap[idx][1]; rgba[2] = gl2ps->colormap[idx][2]; rgba[3] = 1.0F; } gl2psSVGGetColorString(rgba, col); gl2psPrintf("viewport[3] - y, x + w, gl2ps->viewport[3] - y, x + w, gl2ps->viewport[3] - (y + h), x, gl2ps->viewport[3] - (y + h)); gl2psPrintf("shape-rendering=\"crispEdges\"/>\n"); } gl2psPrintf("\n", x, y, w, h); gl2psPrintf(" \n", x, gl2ps->viewport[3] - y, x + w, gl2ps->viewport[3] - y, x + w, gl2ps->viewport[3] - (y + h), x, gl2ps->viewport[3] - (y + h)); gl2psPrintf("\n"); gl2psPrintf("\n", x, y, w, h); } static GLint gl2psPrintSVGEndViewport(void) { GLint res; res = gl2psPrintPrimitives(); gl2psPrintf("\n"); return res; } static void gl2psPrintSVGFinalPrimitive(void) { /* End any remaining line, if any */ gl2psEndSVGLine(); } /* definition of the SVG backend */ static GL2PSbackend gl2psSVG = { gl2psPrintSVGHeader, gl2psPrintSVGFooter, gl2psPrintSVGBeginViewport, gl2psPrintSVGEndViewport, gl2psPrintSVGPrimitive, gl2psPrintSVGFinalPrimitive, "svg", "Scalable Vector Graphics" }; /********************************************************************* * * PGF routines * *********************************************************************/ static void gl2psPrintPGFColor(GL2PSrgba rgba) { if(!gl2psSameColor(gl2ps->lastrgba, rgba)){ gl2psSetLastColor(rgba); fprintf(gl2ps->stream, "\\color[rgb]{%f,%f,%f}\n", rgba[0], rgba[1], rgba[2]); } } static void gl2psPrintPGFHeader(void) { time_t now; time(&now); fprintf(gl2ps->stream, "%% Title: %s\n" "%% Creator: GL2PS %d.%d.%d%s, %s\n" "%% For: %s\n" "%% CreationDate: %s", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); fprintf(gl2ps->stream, "\\begin{pgfpicture}\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ gl2psPrintPGFColor(gl2ps->bgcolor); fprintf(gl2ps->stream, "\\pgfpathrectanglecorners{" "\\pgfpoint{%dpt}{%dpt}}{\\pgfpoint{%dpt}{%dpt}}\n" "\\pgfusepath{fill}\n", (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); } } static void gl2psPrintPGFDash(GLushort pattern, GLint factor) { int i, n, array[10]; if(pattern == gl2ps->lastpattern && factor == gl2ps->lastfactor) return; gl2ps->lastpattern = pattern; gl2ps->lastfactor = factor; if(!pattern || !factor){ /* solid line */ fprintf(gl2ps->stream, "\\pgfsetdash{}{0pt}\n"); } else{ gl2psParseStipplePattern(pattern, factor, &n, array); fprintf(gl2ps->stream, "\\pgfsetdash{"); for(i = 0; i < n; i++) fprintf(gl2ps->stream, "{%dpt}", array[i]); fprintf(gl2ps->stream, "}{0pt}\n"); } } static const char *gl2psPGFTextAlignment(int align) { switch(align){ case GL2PS_TEXT_C : return "center"; case GL2PS_TEXT_CL : return "west"; case GL2PS_TEXT_CR : return "east"; case GL2PS_TEXT_B : return "south"; case GL2PS_TEXT_BR : return "south east"; case GL2PS_TEXT_T : return "north"; case GL2PS_TEXT_TL : return "north west"; case GL2PS_TEXT_TR : return "north east"; case GL2PS_TEXT_BL : default : return "south west"; } } static void gl2psPrintPGFPrimitive(void *data) { GL2PSprimitive *prim; prim = *(GL2PSprimitive**)data; switch(prim->type){ case GL2PS_POINT : /* Points in openGL are rectangular */ gl2psPrintPGFColor(prim->verts[0].rgba); fprintf(gl2ps->stream, "\\pgfpathrectangle{\\pgfpoint{%fpt}{%fpt}}" "{\\pgfpoint{%fpt}{%fpt}}\n\\pgfusepath{fill}\n", prim->verts[0].xyz[0]-0.5*prim->width, prim->verts[0].xyz[1]-0.5*prim->width, prim->width,prim->width); break; case GL2PS_LINE : gl2psPrintPGFColor(prim->verts[0].rgba); if(gl2ps->lastlinewidth != prim->width){ gl2ps->lastlinewidth = prim->width; fprintf(gl2ps->stream, "\\pgfsetlinewidth{%fpt}\n", gl2ps->lastlinewidth); } if(gl2ps->lastlinecap != prim->linecap){ gl2ps->lastlinecap = prim->linecap; switch (prim->linecap){ case GL2PS_LINE_CAP_BUTT: fprintf(gl2ps->stream, "\\pgfset%s\n", "buttcap"); break; case GL2PS_LINE_CAP_ROUND: fprintf(gl2ps->stream, "\\pgfset%s\n", "roundcap"); break; case GL2PS_LINE_CAP_SQUARE: fprintf(gl2ps->stream, "\\pgfset%s\n", "rectcap"); break; } } if(gl2ps->lastlinejoin != prim->linejoin){ gl2ps->lastlinejoin = prim->linejoin; switch (prim->linejoin){ case GL2PS_LINE_JOIN_MITER: fprintf(gl2ps->stream, "\\pgfset%s\n", "miterjoin"); break; case GL2PS_LINE_JOIN_ROUND: fprintf(gl2ps->stream, "\\pgfset%s\n", "roundjoin"); break; case GL2PS_LINE_JOIN_BEVEL: fprintf(gl2ps->stream, "\\pgfset%s\n", "beveljoin"); break; } } gl2psPrintPGFDash(prim->pattern, prim->factor); fprintf(gl2ps->stream, "\\pgfpathmoveto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgflineto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgfusepath{stroke}\n", prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); break; case GL2PS_TRIANGLE : if(gl2ps->lastlinewidth != 0){ gl2ps->lastlinewidth = 0; fprintf(gl2ps->stream, "\\pgfsetlinewidth{0.01pt}\n"); } if(gl2ps->lastlinecap != prim->linecap){ gl2ps->lastlinecap = prim->linecap; switch (prim->linecap){ case GL2PS_LINE_CAP_BUTT: fprintf(gl2ps->stream, "\\pgfset%s\n", "buttcap"); break; case GL2PS_LINE_CAP_ROUND: fprintf(gl2ps->stream, "\\pgfset%s\n", "roundcap"); break; case GL2PS_LINE_CAP_SQUARE: fprintf(gl2ps->stream, "\\pgfset%s\n", "rectcap"); break; } } if(gl2ps->lastlinejoin != prim->linejoin){ gl2ps->lastlinejoin = prim->linejoin; switch (prim->linejoin){ case GL2PS_LINE_JOIN_MITER: fprintf(gl2ps->stream, "\\pgfset%s\n", "miterjoin"); break; case GL2PS_LINE_JOIN_ROUND: fprintf(gl2ps->stream, "\\pgfset%s\n", "roundjoin"); break; case GL2PS_LINE_JOIN_BEVEL: fprintf(gl2ps->stream, "\\pgfset%s\n", "beveljoin"); break; } } gl2psPrintPGFColor(prim->verts[0].rgba); fprintf(gl2ps->stream, "\\pgfpathmoveto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgflineto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgflineto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgfpathclose\n" "\\pgfusepath{fill,stroke}\n", prim->verts[2].xyz[0], prim->verts[2].xyz[1], prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); break; case GL2PS_TEXT : fprintf(gl2ps->stream, "{\n\\pgftransformshift{\\pgfpoint{%fpt}{%fpt}}\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); if(prim->data.text->angle) fprintf(gl2ps->stream, "\\pgftransformrotate{%f}{", prim->data.text->angle); fprintf(gl2ps->stream, "\\pgfnode{rectangle}{%s}{\\fontsize{%d}{0}\\selectfont", gl2psPGFTextAlignment(prim->data.text->alignment), prim->data.text->fontsize); fprintf(gl2ps->stream, "\\textcolor[rgb]{%g,%g,%g}{{%s}}", prim->verts[0].rgba[0], prim->verts[0].rgba[1], prim->verts[0].rgba[2], prim->data.text->str); fprintf(gl2ps->stream, "}{}{\\pgfusepath{discard}}}"); if(prim->data.text->angle) fprintf(gl2ps->stream, "}"); fprintf(gl2ps->stream, "\n"); break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if (prim->data.text->alignment == GL2PS_PGF) fprintf(gl2ps->stream, "%s\n", prim->data.text->str); break; default : break; } } static void gl2psPrintPGFFooter(void) { fprintf(gl2ps->stream, "\\end{pgfpicture}\n"); } static void gl2psPrintPGFBeginViewport(GLint viewport[4]) { GLint idx; GLfloat rgba[4]; int x = viewport[0], y = viewport[1], w = viewport[2], h = viewport[3]; glRenderMode(GL_FEEDBACK); gl2psResetLineProperties(); if(gl2ps->header){ gl2psPrintPGFHeader(); gl2ps->header = GL_FALSE; } fprintf(gl2ps->stream, "\\begin{pgfscope}\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ if(gl2ps->colormode == GL_RGBA || gl2ps->colorsize == 0){ glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); } else{ glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); rgba[0] = gl2ps->colormap[idx][0]; rgba[1] = gl2ps->colormap[idx][1]; rgba[2] = gl2ps->colormap[idx][2]; rgba[3] = 1.0F; } gl2psPrintPGFColor(rgba); fprintf(gl2ps->stream, "\\pgfpathrectangle{\\pgfpoint{%dpt}{%dpt}}" "{\\pgfpoint{%dpt}{%dpt}}\n" "\\pgfusepath{fill}\n", x, y, w, h); } fprintf(gl2ps->stream, "\\pgfpathrectangle{\\pgfpoint{%dpt}{%dpt}}" "{\\pgfpoint{%dpt}{%dpt}}\n" "\\pgfusepath{clip}\n", x, y, w, h); } static GLint gl2psPrintPGFEndViewport(void) { GLint res; res = gl2psPrintPrimitives(); fprintf(gl2ps->stream, "\\end{pgfscope}\n"); return res; } static void gl2psPrintPGFFinalPrimitive(void) { } /* definition of the PGF backend */ static GL2PSbackend gl2psPGF = { gl2psPrintPGFHeader, gl2psPrintPGFFooter, gl2psPrintPGFBeginViewport, gl2psPrintPGFEndViewport, gl2psPrintPGFPrimitive, gl2psPrintPGFFinalPrimitive, "tex", "PGF Latex Graphics" }; /********************************************************************* * * General primitive printing routine * *********************************************************************/ /* Warning: the ordering of the backends must match the format #defines in gl2ps.h */ static GL2PSbackend *gl2psbackends[] = { &gl2psPS, /* 0 */ &gl2psEPS, /* 1 */ &gl2psTEX, /* 2 */ &gl2psPDF, /* 3 */ &gl2psSVG, /* 4 */ &gl2psPGF /* 5 */ }; static void gl2psComputeTightBoundingBox(void *data) { GL2PSprimitive *prim; int i; prim = *(GL2PSprimitive**)data; for(i = 0; i < prim->numverts; i++){ if(prim->verts[i].xyz[0] < gl2ps->viewport[0]) gl2ps->viewport[0] = (GLint)prim->verts[i].xyz[0]; if(prim->verts[i].xyz[0] > gl2ps->viewport[2]) gl2ps->viewport[2] = (GLint)(prim->verts[i].xyz[0] + 0.5F); if(prim->verts[i].xyz[1] < gl2ps->viewport[1]) gl2ps->viewport[1] = (GLint)prim->verts[i].xyz[1]; if(prim->verts[i].xyz[1] > gl2ps->viewport[3]) gl2ps->viewport[3] = (GLint)(prim->verts[i].xyz[1] + 0.5F); } } static GLint gl2psPrintPrimitives(void) { GL2PSbsptree *root; GL2PSxyz eye = {0.0F, 0.0F, 100.0F * GL2PS_ZSCALE}; GLint used = 0; if ((gl2ps->options & GL2PS_NO_OPENGL_CONTEXT) == GL2PS_NONE) { used = glRenderMode(GL_RENDER); } if(used < 0){ gl2psMsg(GL2PS_INFO, "OpenGL feedback buffer overflow"); return GL2PS_OVERFLOW; } if(used > 0) gl2psParseFeedbackBuffer(used); gl2psRescaleAndOffset(); if(gl2ps->header){ if(gl2psListNbr(gl2ps->primitives) && (gl2ps->options & GL2PS_TIGHT_BOUNDING_BOX)){ gl2ps->viewport[0] = gl2ps->viewport[1] = 100000; gl2ps->viewport[2] = gl2ps->viewport[3] = -100000; gl2psListAction(gl2ps->primitives, gl2psComputeTightBoundingBox); } (gl2psbackends[gl2ps->format]->printHeader)(); gl2ps->header = GL_FALSE; } if(!gl2psListNbr(gl2ps->primitives)){ /* empty feedback buffer and/or nothing else to print */ return GL2PS_NO_FEEDBACK; } switch(gl2ps->sort){ case GL2PS_NO_SORT : gl2psListAction(gl2ps->primitives, gl2psbackends[gl2ps->format]->printPrimitive); gl2psListAction(gl2ps->primitives, gl2psFreePrimitive); /* reset the primitive list, waiting for the next viewport */ gl2psListReset(gl2ps->primitives); break; case GL2PS_SIMPLE_SORT : gl2psListSort(gl2ps->primitives, gl2psCompareDepth); if(gl2ps->options & GL2PS_OCCLUSION_CULL){ gl2psListActionInverse(gl2ps->primitives, gl2psAddInImageTree); gl2psFreeBspImageTree(&gl2ps->imagetree); } gl2psListAction(gl2ps->primitives, gl2psbackends[gl2ps->format]->printPrimitive); gl2psListAction(gl2ps->primitives, gl2psFreePrimitive); /* reset the primitive list, waiting for the next viewport */ gl2psListReset(gl2ps->primitives); break; case GL2PS_BSP_SORT : root = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); gl2psBuildBspTree(root, gl2ps->primitives); if(GL_TRUE == gl2ps->boundary) gl2psBuildPolygonBoundary(root); if(gl2ps->options & GL2PS_OCCLUSION_CULL){ gl2psTraverseBspTree(root, eye, -GL2PS_EPSILON, gl2psLess, gl2psAddInImageTree, 1); gl2psFreeBspImageTree(&gl2ps->imagetree); } gl2psTraverseBspTree(root, eye, GL2PS_EPSILON, gl2psGreater, gl2psbackends[gl2ps->format]->printPrimitive, 0); gl2psFreeBspTree(&root); /* reallocate the primitive list (it's been deleted by gl2psBuildBspTree) in case there is another viewport */ gl2ps->primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*)); break; } gl2psbackends[gl2ps->format]->printFinalPrimitive(); return GL2PS_SUCCESS; } static GLboolean gl2psCheckOptions(GLint options, GLint colormode) { if (options & GL2PS_NO_OPENGL_CONTEXT) { if (options & GL2PS_DRAW_BACKGROUND) { gl2psMsg(GL2PS_ERROR, "Options GL2PS_NO_OPENGL_CONTEXT and " "GL2PS_DRAW_BACKGROUND are incompatible."); return GL_FALSE; } if (options & GL2PS_USE_CURRENT_VIEWPORT) { gl2psMsg(GL2PS_ERROR, "Options GL2PS_NO_OPENGL_CONTEXT and " "GL2PS_USE_CURRENT_VIEWPORT are incompatible."); return GL_FALSE; } if ((options & GL2PS_NO_BLENDING) == GL2PS_NONE) { gl2psMsg(GL2PS_ERROR, "Option GL2PS_NO_OPENGL_CONTEXT requires " "option GL2PS_NO_BLENDING."); return GL_FALSE; } if (colormode != GL_RGBA) { gl2psMsg(GL2PS_ERROR, "Option GL2PS_NO_OPENGL_CONTEXT requires colormode " "to be GL_RGBA."); return GL_FALSE; } } return GL_TRUE; } /********************************************************************* * * Public routines * *********************************************************************/ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer, GLint viewport[4], GLint format, GLint sort, GLint options, GLint colormode, GLint colorsize, GL2PSrgba *colormap, GLint nr, GLint ng, GLint nb, GLint buffersize, FILE *stream, const char *filename) { GLint idx; int i; if(gl2ps){ gl2psMsg(GL2PS_ERROR, "gl2psBeginPage called in wrong program state"); return GL2PS_ERROR; } gl2ps = (GL2PScontext*)gl2psMalloc(sizeof(GL2PScontext)); /* Validate options */ if (gl2psCheckOptions(options, colormode) == GL_FALSE) { gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } if(format >= 0 && format < (GLint)(sizeof(gl2psbackends) / sizeof(gl2psbackends[0]))){ gl2ps->format = format; } else { gl2psMsg(GL2PS_ERROR, "Unknown output format: %d", format); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } switch(sort){ case GL2PS_NO_SORT : case GL2PS_SIMPLE_SORT : case GL2PS_BSP_SORT : gl2ps->sort = sort; break; default : gl2psMsg(GL2PS_ERROR, "Unknown sorting algorithm: %d", sort); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } if(stream){ gl2ps->stream = stream; } else{ gl2psMsg(GL2PS_ERROR, "Bad file pointer"); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } gl2ps->header = GL_TRUE; gl2ps->forcerasterpos = GL_FALSE; gl2ps->maxbestroot = 10; gl2ps->options = options; gl2ps->compress = NULL; gl2ps->imagemap_head = NULL; gl2ps->imagemap_tail = NULL; if(gl2ps->options & GL2PS_USE_CURRENT_VIEWPORT){ glGetIntegerv(GL_VIEWPORT, gl2ps->viewport); } else{ for(i = 0; i < 4; i++){ gl2ps->viewport[i] = viewport[i]; } } if(!gl2ps->viewport[2] || !gl2ps->viewport[3]){ gl2psMsg(GL2PS_ERROR, "Incorrect viewport (x=%d, y=%d, width=%d, height=%d)", gl2ps->viewport[0], gl2ps->viewport[1], gl2ps->viewport[2], gl2ps->viewport[3]); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } gl2ps->threshold[0] = nr ? 1.0F / (GLfloat)nr : 0.064F; gl2ps->threshold[1] = ng ? 1.0F / (GLfloat)ng : 0.034F; gl2ps->threshold[2] = nb ? 1.0F / (GLfloat)nb : 0.100F; gl2ps->colormode = colormode; gl2ps->buffersize = buffersize > 0 ? buffersize : 2048 * 2048; for(i = 0; i < 3; i++){ gl2ps->lastvertex.xyz[i] = -1.0F; } for(i = 0; i < 4; i++){ gl2ps->lastvertex.rgba[i] = -1.0F; gl2ps->lastrgba[i] = -1.0F; } gl2ps->lastlinewidth = -1.0F; gl2ps->lastlinecap = 0; gl2ps->lastlinejoin = 0; gl2ps->lastpattern = 0; gl2ps->lastfactor = 0; gl2ps->imagetree = NULL; gl2ps->primitivetoadd = NULL; gl2ps->zerosurfacearea = GL_FALSE; gl2ps->pdfprimlist = NULL; gl2ps->pdfgrouplist = NULL; gl2ps->xreflist = NULL; /* get default blending mode from current OpenGL state (enabled by default for SVG) */ if ((gl2ps->options & GL2PS_NO_BLENDING) == GL2PS_NONE) { gl2ps->blending = (gl2ps->format == GL2PS_SVG) ? GL_TRUE : glIsEnabled(GL_BLEND); glGetIntegerv(GL_BLEND_SRC, &gl2ps->blendfunc[0]); glGetIntegerv(GL_BLEND_DST, &gl2ps->blendfunc[1]); } else { gl2ps->blending = GL_FALSE; } if(gl2ps->colormode == GL_RGBA){ gl2ps->colorsize = 0; gl2ps->colormap = NULL; if ((gl2ps->options & GL2PS_NO_OPENGL_CONTEXT) == GL2PS_NONE) { glGetFloatv(GL_COLOR_CLEAR_VALUE, gl2ps->bgcolor); } } else if(gl2ps->colormode == GL_COLOR_INDEX){ if(!colorsize || !colormap){ gl2psMsg(GL2PS_ERROR, "Missing colormap for GL_COLOR_INDEX rendering"); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } gl2ps->colorsize = colorsize; gl2ps->colormap = (GL2PSrgba*)gl2psMalloc(gl2ps->colorsize * sizeof(GL2PSrgba)); memcpy(gl2ps->colormap, colormap, gl2ps->colorsize * sizeof(GL2PSrgba)); glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); gl2ps->bgcolor[0] = gl2ps->colormap[idx][0]; gl2ps->bgcolor[1] = gl2ps->colormap[idx][1]; gl2ps->bgcolor[2] = gl2ps->colormap[idx][2]; gl2ps->bgcolor[3] = 1.0F; } else{ gl2psMsg(GL2PS_ERROR, "Unknown color mode in gl2psBeginPage"); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } if(!title){ gl2ps->title = (char*)gl2psMalloc(sizeof(char)); gl2ps->title[0] = '\0'; } else{ gl2ps->title = (char*)gl2psMalloc((strlen(title)+1)*sizeof(char)); strcpy(gl2ps->title, title); } if(!producer){ gl2ps->producer = (char*)gl2psMalloc(sizeof(char)); gl2ps->producer[0] = '\0'; } else{ gl2ps->producer = (char*)gl2psMalloc((strlen(producer)+1)*sizeof(char)); strcpy(gl2ps->producer, producer); } if(!filename){ gl2ps->filename = (char*)gl2psMalloc(sizeof(char)); gl2ps->filename[0] = '\0'; } else{ gl2ps->filename = (char*)gl2psMalloc((strlen(filename)+1)*sizeof(char)); strcpy(gl2ps->filename, filename); } gl2ps->primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*)); gl2ps->auxprimitives = gl2psListCreate(100, 100, sizeof(GL2PSprimitive*)); if ((gl2ps->options & GL2PS_NO_OPENGL_CONTEXT) == GL2PS_NONE) { gl2ps->feedback = (GLfloat*)gl2psMalloc(gl2ps->buffersize * sizeof(GLfloat)); glFeedbackBuffer(gl2ps->buffersize, GL_3D_COLOR, gl2ps->feedback); glRenderMode(GL_FEEDBACK); } else { gl2ps->feedback = NULL; gl2ps->buffersize = 0; } return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psEndPage(void) { GLint res; if(!gl2ps) return GL2PS_UNINITIALIZED; res = gl2psPrintPrimitives(); if(res != GL2PS_OVERFLOW) (gl2psbackends[gl2ps->format]->printFooter)(); fflush(gl2ps->stream); gl2psListDelete(gl2ps->primitives); gl2psListDelete(gl2ps->auxprimitives); gl2psFreeImagemap(gl2ps->imagemap_head); gl2psFree(gl2ps->colormap); gl2psFree(gl2ps->title); gl2psFree(gl2ps->producer); gl2psFree(gl2ps->filename); gl2psFree(gl2ps->feedback); gl2psFree(gl2ps); gl2ps = NULL; return res; } GL2PSDLL_API GLint gl2psBeginViewport(GLint viewport[4]) { if(!gl2ps) return GL2PS_UNINITIALIZED; (gl2psbackends[gl2ps->format]->beginViewport)(viewport); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psEndViewport(void) { GLint res; if(!gl2ps) return GL2PS_UNINITIALIZED; res = (gl2psbackends[gl2ps->format]->endViewport)(); /* reset last used colors, line widths */ gl2psResetLineProperties(); return res; } GL2PSDLL_API GLint gl2psTextOptColor(const char *str, const char *fontname, GLshort fontsize, GLint alignment, GLfloat angle, GL2PSrgba color) { return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, color); } GL2PSDLL_API GLint gl2psTextOpt(const char *str, const char *fontname, GLshort fontsize, GLint alignment, GLfloat angle) { return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, NULL); } GL2PSDLL_API GLint gl2psText(const char *str, const char *fontname, GLshort fontsize) { return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, GL2PS_TEXT_BL, 0.0F, NULL); } GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str) { return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, NULL); } GL2PSDLL_API GLint gl2psSpecialColor(GLint format, const char *str, GL2PSrgba rgba) { return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, rgba); } GL2PSDLL_API GLint gl2psDrawPixels(GLsizei width, GLsizei height, GLint xorig, GLint yorig, GLenum format, GLenum type, const void *pixels) { int size, i; const GLfloat *piv; GLfloat pos[4], zoom_x, zoom_y; GL2PSprimitive *prim; GLboolean valid; if(!gl2ps || !pixels) return GL2PS_UNINITIALIZED; if((width <= 0) || (height <= 0)) return GL2PS_ERROR; if(gl2ps->options & GL2PS_NO_PIXMAP) return GL2PS_SUCCESS; if((format != GL_RGB && format != GL_RGBA) || type != GL_FLOAT){ gl2psMsg(GL2PS_ERROR, "gl2psDrawPixels only implemented for " "GL_RGB/GL_RGBA, GL_FLOAT pixels"); return GL2PS_ERROR; } if (gl2ps->forcerasterpos) { pos[0] = gl2ps->rasterpos.xyz[0]; pos[1] = gl2ps->rasterpos.xyz[1]; pos[2] = gl2ps->rasterpos.xyz[2]; pos[3] = 1.f; /* Hardcode zoom factors (for now?) */ zoom_x = 1.f; zoom_y = 1.f; } else { glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid); if(GL_FALSE == valid) return GL2PS_SUCCESS; /* the primitive is culled */ glGetFloatv(GL_CURRENT_RASTER_POSITION, pos); glGetFloatv(GL_ZOOM_X, &zoom_x); glGetFloatv(GL_ZOOM_Y, &zoom_y); } prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = GL2PS_PIXMAP; prim->boundary = 0; prim->numverts = 1; prim->verts = (GL2PSvertex*)gl2psMalloc(sizeof(GL2PSvertex)); prim->verts[0].xyz[0] = pos[0] + xorig; prim->verts[0].xyz[1] = pos[1] + yorig; prim->verts[0].xyz[2] = pos[2]; prim->culled = 0; prim->offset = 0; prim->ofactor = 0.0; prim->ounits = 0.0; prim->pattern = 0; prim->factor = 0; prim->width = 1; if (gl2ps->forcerasterpos) { prim->verts[0].rgba[0] = gl2ps->rasterpos.rgba[0]; prim->verts[0].rgba[1] = gl2ps->rasterpos.rgba[1]; prim->verts[0].rgba[2] = gl2ps->rasterpos.rgba[2]; prim->verts[0].rgba[3] = gl2ps->rasterpos.rgba[3]; } else { glGetFloatv(GL_CURRENT_RASTER_COLOR, prim->verts[0].rgba); } prim->data.image = (GL2PSimage*)gl2psMalloc(sizeof(GL2PSimage)); prim->data.image->width = width; prim->data.image->height = height; prim->data.image->zoom_x = zoom_x; prim->data.image->zoom_y = zoom_y; prim->data.image->format = format; prim->data.image->type = type; gl2ps->forcerasterpos = GL_FALSE; switch(format){ case GL_RGBA: if(gl2ps->options & GL2PS_NO_BLENDING || !gl2ps->blending){ /* special case: blending turned off */ prim->data.image->format = GL_RGB; size = height * width * 3; prim->data.image->pixels = (GLfloat*)gl2psMalloc(size * sizeof(GLfloat)); piv = (const GLfloat*)pixels; for(i = 0; i < size; ++i, ++piv){ prim->data.image->pixels[i] = *piv; if(!((i + 1) % 3)) ++piv; } } else{ size = height * width * 4; prim->data.image->pixels = (GLfloat*)gl2psMalloc(size * sizeof(GLfloat)); memcpy(prim->data.image->pixels, pixels, size * sizeof(GLfloat)); } break; case GL_RGB: default: size = height * width * 3; prim->data.image->pixels = (GLfloat*)gl2psMalloc(size * sizeof(GLfloat)); memcpy(prim->data.image->pixels, pixels, size * sizeof(GLfloat)); break; } /* If no OpenGL context, just add directly to primitives */ if ((gl2ps->options & GL2PS_NO_OPENGL_CONTEXT) == GL2PS_NONE) { gl2psListAdd(gl2ps->auxprimitives, &prim); glPassThrough(GL2PS_DRAW_PIXELS_TOKEN); } else { gl2psListAdd(gl2ps->primitives, &prim); } return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psDrawImageMap(GLsizei width, GLsizei height, const GLfloat position[3], const unsigned char *imagemap){ int size, i; int sizeoffloat = sizeof(GLfloat); if(!gl2ps || !imagemap) return GL2PS_UNINITIALIZED; if((width <= 0) || (height <= 0)) return GL2PS_ERROR; size = height + height * ((width - 1) / 8); glPassThrough(GL2PS_IMAGEMAP_TOKEN); glBegin(GL_POINTS); glVertex3f(position[0], position[1],position[2]); glEnd(); glPassThrough((GLfloat)width); glPassThrough((GLfloat)height); for(i = 0; i < size; i += sizeoffloat){ const float *value = (const float*)imagemap; glPassThrough(*value); imagemap += sizeoffloat; } return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psEnable(GLint mode) { GLint tmp; GLfloat tmp2; if(!gl2ps) return GL2PS_UNINITIALIZED; switch(mode){ case GL2PS_POLYGON_OFFSET_FILL : glPassThrough(GL2PS_BEGIN_OFFSET_TOKEN); glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &tmp2); glPassThrough(tmp2); glGetFloatv(GL_POLYGON_OFFSET_UNITS, &tmp2); glPassThrough(tmp2); break; case GL2PS_POLYGON_BOUNDARY : glPassThrough(GL2PS_BEGIN_BOUNDARY_TOKEN); break; case GL2PS_LINE_STIPPLE : glPassThrough(GL2PS_BEGIN_STIPPLE_TOKEN); glGetIntegerv(GL_LINE_STIPPLE_PATTERN, &tmp); glPassThrough((GLfloat)tmp); glGetIntegerv(GL_LINE_STIPPLE_REPEAT, &tmp); glPassThrough((GLfloat)tmp); break; case GL2PS_BLEND : glPassThrough(GL2PS_BEGIN_BLEND_TOKEN); break; default : gl2psMsg(GL2PS_WARNING, "Unknown mode in gl2psEnable: %d", mode); return GL2PS_WARNING; } return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psDisable(GLint mode) { if(!gl2ps) return GL2PS_UNINITIALIZED; switch(mode){ case GL2PS_POLYGON_OFFSET_FILL : glPassThrough(GL2PS_END_OFFSET_TOKEN); break; case GL2PS_POLYGON_BOUNDARY : glPassThrough(GL2PS_END_BOUNDARY_TOKEN); break; case GL2PS_LINE_STIPPLE : glPassThrough(GL2PS_END_STIPPLE_TOKEN); break; case GL2PS_BLEND : glPassThrough(GL2PS_END_BLEND_TOKEN); break; default : gl2psMsg(GL2PS_WARNING, "Unknown mode in gl2psDisable: %d", mode); return GL2PS_WARNING; } return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psPointSize(GLfloat value) { if(!gl2ps) return GL2PS_UNINITIALIZED; glPassThrough(GL2PS_POINT_SIZE_TOKEN); glPassThrough(value); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psLineCap(GLint value) { if(!gl2ps) return GL2PS_UNINITIALIZED; glPassThrough(GL2PS_LINE_CAP_TOKEN); glPassThrough(value); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psLineJoin(GLint value) { if(!gl2ps) return GL2PS_UNINITIALIZED; glPassThrough(GL2PS_LINE_JOIN_TOKEN); glPassThrough(value); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psLineWidth(GLfloat value) { if(!gl2ps) return GL2PS_UNINITIALIZED; glPassThrough(GL2PS_LINE_WIDTH_TOKEN); glPassThrough(value); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psBlendFunc(GLenum sfactor, GLenum dfactor) { if(!gl2ps) return GL2PS_UNINITIALIZED; if(GL_FALSE == gl2psSupportedBlendMode(sfactor, dfactor)) return GL2PS_WARNING; glPassThrough(GL2PS_SRC_BLEND_TOKEN); glPassThrough((GLfloat)sfactor); glPassThrough(GL2PS_DST_BLEND_TOKEN); glPassThrough((GLfloat)dfactor); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psSetOptions(GLint options) { if(!gl2ps) return GL2PS_UNINITIALIZED; if(gl2psCheckOptions(options, gl2ps->colormode) == GL_FALSE) { return GL2PS_ERROR; } gl2ps->options = options; return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psGetOptions(GLint *options) { if(!gl2ps) { *options = 0; return GL2PS_UNINITIALIZED; } *options = gl2ps->options; return GL2PS_SUCCESS; } GL2PSDLL_API const char *gl2psGetFileExtension(GLint format) { if(format >= 0 && format < (GLint)(sizeof(gl2psbackends) / sizeof(gl2psbackends[0]))) return gl2psbackends[format]->file_extension; else return "Unknown format"; } GL2PSDLL_API const char *gl2psGetFormatDescription(GLint format) { if(format >= 0 && format < (GLint)(sizeof(gl2psbackends) / sizeof(gl2psbackends[0]))) return gl2psbackends[format]->description; else return "Unknown format"; } GL2PSDLL_API GLint gl2psGetFileFormat() { return gl2ps->format; } GL2PSDLL_API GLint gl2psForceRasterPos(GL2PSvertex *vert) { if(!gl2ps) { return GL2PS_UNINITIALIZED; } gl2ps->forcerasterpos = GL_TRUE; gl2ps->rasterpos.xyz[0] = vert->xyz[0]; gl2ps->rasterpos.xyz[1] = vert->xyz[1]; gl2ps->rasterpos.xyz[2] = vert->xyz[2]; gl2ps->rasterpos.rgba[0] = vert->rgba[0]; gl2ps->rasterpos.rgba[1] = vert->rgba[1]; gl2ps->rasterpos.rgba[2] = vert->rgba[2]; gl2ps->rasterpos.rgba[3] = vert->rgba[3]; return GL2PS_SUCCESS; } xcrysden-1.6.2/C/xcdebug.c0000644000175000017500000000253411712736221014030 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcdebug.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include /* xcdebug.c */ void xcdebug(const char *text); void xcErrDebug(const char *text); void breakpoint(const char *text); void xcdebug(const char *text) { printf("%s\n",text); fflush(stdout); } void xcErrDebug(const char *text) { fprintf(stderr,"%s\n",text); fflush(stderr); } void breakpoint(const char *text) { xcdebug( text ); fflush(stdout); } xcrysden-1.6.2/C/atoms.h0000644000175000017500000002450513551366653013554 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/atoms.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include char *element[] = { "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm"}; double rcovdef[MAXNAT + 1] = { 0.38000, 0.38000,0.38000,1.23000,0.89000,0.91000, 0.77000,0.75000,0.73000,0.71000,0.71000, 1.60000,1.40000,1.25000,1.11000,1.00000, 1.04000,0.99000,0.98000,2.13000,1.74000, 1.60000,1.40000,1.35000,1.40000,1.40000, 1.40000,1.35000,1.35000,1.35000,1.35000, 1.30000,1.25000,1.15000,1.15000,1.14000, 1.12000,2.20000,2.00000,1.85000,1.55000, 1.45000,1.45000,1.35000,1.30000,1.35000, 1.40000,1.60000,1.55000,1.55000,1.41000, 1.45000,1.40000,1.40000,1.31000,2.60000, 2.00000,1.75000,1.55000,1.55000,1.55000, 1.55000,1.55000,1.55000,1.55000,1.55000, 1.55000,1.55000,1.55000,1.55000,1.55000, 1.55000,1.55000,1.45000,1.35000,1.35000, 1.30000,1.35000,1.35000,1.35000,1.50000, 1.90000,1.80000,1.60000,1.55000,1.55000, 1.55000,2.80000,1.44000,1.95000,1.55000, 1.55000,1.55000,1.55000,1.55000,1.55000, 1.55000,1.55000,1.55000,1.55000,1.55000}; double rvdw[MAXNAT + 1] = { 0.38000, 1.17000,1.40000,1.80000,2.10000,2.10000, 1.70000,1.58000,1.52000,1.47000,1.60000, 2.30000,1.70000,2.10000,1.70000,1.80000, 1.80000,1.78000,1.90000,2.80000,2.10000, 2.10000,2.10000,2.10000,2.10000,2.10000, 2.10000,2.10000,1.60000,1.40000,1.40000, 1.90000,2.10000,1.85000,1.90000,1.85000, 2.00000,2.10000,2.10000,2.10000,2.10000, 2.10000,2.10000,2.10000,2.10000,2.10000, 1.60000,1.70000,1.60000,1.90000,1.00000, 2.10000,2.06000,1.96000,2.16000,2.10000, 2.10000,2.10000,2.10000,2.10000,2.10000, 2.10000,2.10000,2.10000,2.10000,2.10000, 2.10000,2.10000,2.10000,2.10000,2.10000, 2.10000,2.10000,2.10000,2.10000,2.10000, 2.10000,2.10000,1.75000,1.70000,1.50000, 2.00000,2.10000,2.10000,2.10000,2.10000, 2.10000,3.50000,3.50000,3.50000,2.10000, 2.10000,2.10000,2.10000,2.10000,2.10000, 2.10000,2.10000,2.10000,2.10000,2.10000}; GLfloat DefAtCol[MAXNAT + 1][3] = { {0.7700, 1.0000, 0.4200}, /* 0 */ {1.0000, 1.0000, 1.0000}, /* 1 */ {0.0000, 1.0000, 1.0000}, /* 2 */ {0.9500, 0.9500, 0.9500}, /* 3 */ {0.7079, 0.7079, 0.7079}, /* 4 */ {0.8779, 0.7079, 0.5579}, /* 5 */ {0.3000, 0.3000, 0.3000}, /* 6 */ {0.4500, 0.7200, 1.0000}, /* 7 */ {0.7000, 0.0000, 0.0000}, /* 8 */ {0.6100, 0.9000, 0.0000}, /* 9 */ {0.0000, 0.9500, 0.9500}, /* 10 */ {0.0000, 0.9500, 0.9500}, /* 11 */ {0.7800, 0.8900, 0.7800}, /* 12 */ {0.8500, 0.8500, 0.8500}, /* 13 */ {1.0000, 0.8300, 0.6600}, /* 14 */ {0.9500, 0.6500, 0.0000}, /* 15 */ {0.9500, 0.9500, 0.4500}, /* 16 */ {0.7100, 1.0000, 0.0000}, /* 17 */ {0.0000, 1.0000, 1.0000}, /* 18 */ {0.0000, 0.9500, 0.9500}, /* 19 */ {0.0000, 0.9500, 0.9500}, /* 20 */ {0.0000, 0.9500, 0.9500}, /* 21 */ {0.6000, 0.6000, 0.6000}, /* 22 */ {0.6445, 0.8047, 0.8569}, /* 23 */ {0.6445, 0.8047, 0.8569}, /* 24 */ {0.6445, 0.8047, 0.8569}, /* 25 */ {0.7500, 0.1500, 0.0000}, /* 26 */ {0.6445, 0.8047, 0.8569}, /* 27 */ {0.6445, 0.8047, 0.8569}, /* 28 */ {0.8200, 0.4500, 0.1400}, /* 29 */ {0.7200, 0.7500, 0.7500}, /* 30 */ {0.9500, 0.0000, 0.9500}, /* 31 */ {0.9500, 0.0000, 0.9500}, /* 32 */ {0.9500, 0.9500, 0.0000}, /* 33 */ {0.9500, 0.9500, 0.0000}, /* 34 */ {0.6500, 0.3000, 0.0000}, /* 35 */ {0.0000, 1.0000, 1.0000}, /* 36 */ {0.0000, 0.9500, 0.9500}, /* 37 */ {0.0000, 0.9500, 0.9500}, /* 38 */ {0.7500, 0.7500, 0.7500}, /* 39 */ {0.7500, 0.7500, 0.7500}, /* 40 */ {0.7500, 0.7500, 0.7500}, /* 41 */ {0.7500, 0.7500, 0.7500}, /* 42 */ {0.7500, 0.7500, 0.7500}, /* 43 */ {0.7500, 0.7500, 0.7500}, /* 44 */ {0.7500, 0.7500, 0.7500}, /* 45 */ {1.0000, 1.0000, 1.0000}, /* 46 */ {1.0000, 1.0000, 1.0000}, /* 47 */ {0.7500, 0.7500, 0.7500}, /* 48 */ {0.7500, 0.7500, 0.7500}, /* 49 */ {0.7500, 0.7500, 0.7500}, /* 50 */ {0.7500, 0.7500, 0.7500}, /* 51 */ {0.7500, 0.7500, 0.7500}, /* 52 */ {0.5000, 0.0000, 0.5000}, /* 53 */ {0.0000, 1.0000, 1.0000}, /* 54 */ {0.0000, 0.9500, 0.9500}, /* 55 */ {0.0000, 0.9500, 0.9500}, /* 56 */ {0.7500, 0.7500, 0.7500}, /* 57 */ {0.7500, 0.7500, 0.7500}, /* 58 */ {0.7500, 0.7500, 0.7500}, /* 59 */ {0.7500, 0.7500, 0.7500}, /* 60 */ {0.7500, 0.7500, 0.7500}, /* 61 */ {0.7500, 0.7500, 0.7500}, /* 62 */ {0.7500, 0.7500, 0.7500}, /* 63 */ {0.7500, 0.7500, 0.7500}, /* 64 */ {0.7500, 0.7500, 0.7500}, /* 65 */ {0.7500, 0.7500, 0.7500}, /* 66 */ {0.7500, 0.7500, 0.7500}, /* 67 */ {0.7500, 0.7500, 0.7500}, /* 68 */ {0.7500, 0.7500, 0.7500}, /* 69 */ {0.7500, 0.7500, 0.7500}, /* 70 */ {0.7500, 0.7500, 0.7500}, /* 71 */ {0.7500, 0.7500, 0.7500}, /* 72 */ {0.7500, 0.7500, 0.7500}, /* 73 */ {0.7500, 0.7500, 0.7500}, /* 74 */ {0.7500, 0.7500, 0.7500}, /* 75 */ {0.7500, 0.7500, 0.7500}, /* 76 */ {0.7500, 0.7500, 0.7500}, /* 77 */ {0.7500, 0.7500, 0.7500}, /* 78 */ {1.0000, 0.8500, 0.0000}, /* 79 */ {0.7500, 0.7500, 0.7500}, /* 80 */ {0.7500, 0.7500, 0.7500}, /* 81 */ {0.7500, 0.7500, 0.7500}, /* 82 */ {0.7500, 0.7500, 0.7500}, /* 83 */ {0.7500, 0.7500, 0.7500}, /* 84 */ {0.7500, 0.7500, 0.7500}, /* 85 */ {0.0000, 1.0000, 1.0000}, /* 86 */ {0.7500, 0.7500, 0.7500}, /* 87 */ {0.7500, 0.7500, 0.7500}, /* 88 */ {0.7500, 0.7500, 0.7500}, /* 89 */ {0.7500, 0.7500, 0.7500}, /* 90 */ {0.7500, 0.7500, 0.7500}, /* 91 */ {0.7500, 0.7500, 0.7500}, /* 92 */ {0.7500, 0.7500, 0.7500}, /* 93 */ {0.7500, 0.7500, 0.7500}, /* 94 */ {0.7500, 0.7500, 0.7500}, /* 95 */ {0.7500, 0.7500, 0.7500}, /* 96 */ {0.7500, 0.7500, 0.7500}, /* 97 */ {0.7500, 0.7500, 0.7500}, /* 98 */ {0.9314, 0.8755, 0.8010}, /* 99 */ {0.9314, 0.8755, 0.8010} /* 100 */ }; GLfloat DefAtColOld[MAXNAT + 1][3] = { {0.7700, 1.0000, 0.4200}, /* this is color of selected atom */ {0.0000, 0.9500, 0.9500}, {0.9500, 0.9500, 0.9500}, {0.9500, 0.9500, 0.9500}, {0.7079, 0.7079, 0.7079}, {0.7079, 0.7079, 0.7079}, {0.9500, 0.9500, 0.0000}, {0.6445, 0.8047, 0.8569}, {0.7000, 0.0000, 0.0000}, /* changed */ {0.8345, 0.9500, 0.9500}, {0.9500, 0.9500, 0.9500}, {0.0000, 0.9500, 0.9500}, {0.0000, 0.9500, 0.9500}, {0.9500, 0.0000, 0.9500}, {0.0000, 0.9500, 0.9500}, {0.9500, 0.9500, 0.0000}, {0.9500, 0.9500, 0.4500}, {0.7100, 1.0000, 0.0000}, {0.9500, 0.9500, 0.9500}, {0.0000, 0.9500, 0.9500}, {0.0000, 0.9500, 0.9500}, {0.0000, 0.9500, 0.9500}, {0.6000, 0.6000, 0.6000}, {0.6445, 0.8047, 0.8569}, {0.6445, 0.8047, 0.8569}, {0.6445, 0.8047, 0.8569}, {0.9500, 0.0000, 0.0000}, {0.6445, 0.8047, 0.8569}, {0.6445, 0.8047, 0.8569}, {0.8200, 0.4500, 0.1400}, {0.9500, 0.0000, 0.9500}, {0.9500, 0.0000, 0.9500}, {0.9500, 0.0000, 0.9500}, {0.9500, 0.9500, 0.0000}, {0.9500, 0.9500, 0.0000}, {0.9500, 0.0000, 0.0000}, {0.7500, 0.7500, 0.7500}, {0.0000, 0.9500, 0.9500}, {0.0000, 0.9500, 0.9500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {1.0000, 1.0000, 1.0000}, /* changed */ /* {0.7500, 0.7500, 0.7500}, silver */ {1.0000, 1.0000, 1.0000}, /* silver-white */ {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.0000, 0.9500, 0.9500}, {0.0000, 0.9500, 0.9500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {1.0000, 0.8500, 0.0000}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.7500, 0.7500, 0.7500}, {0.9314, 0.8755, 0.8010}, {0.9314, 0.8755, 0.8010} }; GLclampf DefFrameCol[3] = { 0.88, 1.00, 0.67 }; GLclampf DefBg[4] = { 0.00, 0.00, 0.00, 1.00 }; GLclampf DefUnibondCol[4] = { 1.00, 1.00, 1.00, 1.00 }; GLfloat DefAtCol_Ambient_by_Diffuse = 1.0; xcrysden-1.6.2/C/system.h0000644000175000017500000000211511712736221013733 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/system.h * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include struct XC_SYSTEM { char *scratch_dir; int pid; }; struct XC_SYSTEM xc_system; xcrysden-1.6.2/C/shankland.h0000644000175000017500000000476511727356704014401 0ustar tonetone#ifndef SHANKLAND_H_ #define SHANKLAND_H_ #include #include #include "fft3d.h" extern const double two_pi; #ifndef ABS # define ABS(x) ( (x)>0 ? (x) : -(x) ) #endif #ifndef MAX # define MAX(x,y) ( (x)>(y) ? (x) : (y) ) #endif #ifndef MIN # define MIN(x,y) ( (x)<(y) ? (x) : (y) ) #endif /* shank_util.c */ extern double one_func(double m2, double sigma); extern double first_order(double m2, double sigma); extern double first_sqrt_order(double m2, double sigma); extern double second_order(double m2, double sigma); extern double pickett(double m2, double sigma); extern double gauss(double m2, double sigma); extern double exp_abs(double m2, double sigma); extern double estimate_sigma(double power, int m, double (*roughnessFunc)(double m2, double sigma)); extern void print_double_vector(FILE *stream, const char *name, size_t m, double *mat); extern void print_double_matrix(FILE *stream, const char *name, size_t m, size_t n, double *mat); extern void print_MAT_matrix(FILE *stream, const char *name, MAT *mat); #ifdef DEBUG extern void print_complex_matrix(FILE *stream, const char *name, size_t m, size_t n, fftw_complex *mat); extern void print_complex_vector(FILE *stream, const char *name, size_t m, fftw_complex *mat); #endif /* shank_Hinv.c */ extern MAT *shank_HinvObj(size_t Npoints, size_t Nwaves, double sigma, double (*roughnessFunc)(double m2, double sigma)); extern void shank_Hinv(size_t Npoints, size_t Nwaves, double sigma, double (*roughnessFunc)(double m2, double sigma), MAT *Hinv); extern double *shank1d_lambdaObj(int n1, int n1new, double sigma, double *func, double (*roughnessFunc)(double m2, double sigma), double *f_aver); extern double shank1d_lambda(int n1, int n1new, double sigma, double *func, double *lam, double (*roughnessFunc)(double m2, double sigma)); extern double *shank2d_lambdaObj(int n1, int n2, int n1new, int n2new, double sigma, double *func, double (*roughnessFunc)(double m2, double sigma), double *f_aver); extern double shank2d_lambda(int n1, int n2, int n1new, int n2new, double sigma, double *func, double *lam, double (*roughnessFunc)(double m2, double sigma)); extern double *shank3d_lambdaObj(int n1, int n2, int n3, int n1new, int n2new, int n3new, double sigma, double *func, double (*roughnessFunc)(double m2, double sigma), double *f_aver); extern double shank3d_lambda(int n1, int n2, int n3, int n1new, int n2new, int n3new, double sigma, double *func, double *lam, double (*roughnessFunc)(double m2, double sigma)); #endif xcrysden-1.6.2/C/header.c0000644000175000017500000000174511712736221013642 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/__file__ * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ xcrysden-1.6.2/C/fog.c0000644000175000017500000000576713525506046013201 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/fog.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define XC_CPP_NO_STDIO #include #include "struct.h" #include "xcfunc.h" extern OrthoProj ort; extern PERSPECTIVE persp; extern XCfog fog; extern XCantialias antialias; extern struct Togl *mesa_togl; /* fog.c */ void xcFog(struct Togl *togl, GLboolean make_fog, GLboolean perspective); void xcAntiAlias(GLboolean make_antialias); void xcFog(struct Togl *togl, GLboolean make_fog, GLboolean perspective) { NEW_WIN_CONTEXT *wc; GLclampf *background; if ( togl == mesa_togl ) { background = bg; } else { wc = FindWinContextByTogl( togl ); background = wc->bg; } if (make_fog) { GLint fog_mode = GL_LINEAR; switch (fog.mode) { case XC_FOG_EXP: fog_mode = GL_EXP; break; case XC_FOG_EXP2: fog_mode = GL_EXP2; break; } glEnable (GL_FOG); glFogi (GL_FOG_MODE, fog_mode); glFogf (GL_FOG_DENSITY, fog.density); if (fog.colormode == XC_FOG_BGCOLOR) glFogfv (GL_FOG_COLOR, background); else glFogfv (GL_FOG_COLOR, fog.color); if (!perspective) { glFogf (GL_FOG_START, fog.ort_start_f * ort.size); glFogf (GL_FOG_END, fog.ort_end_f * ort.size); } else { glFogf (GL_FOG_START, -fog.persp_f1 * persp.shiftZ); glFogf (GL_FOG_END, -fog.persp_f1 * persp.shiftZ + fog.persp_f2 * ort.size); } } else { glDisable (GL_FOG); } } void xcAntiAlias(GLboolean make_antialias) { /* this function is used for Lighting-Off anti-aliasing */ if (make_antialias) { glEnable (GL_LINE_SMOOTH); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); glEnable (GL_POINT_SMOOTH); /* glEnable (GL_POLYGON_SMOOTH); glHint (GL_POLYGON_SMOOTH_HINT, GL_FASTEST); */ } else { glDisable (GL_BLEND); glDisable (GL_LINE_SMOOTH); glDisable (GL_POINT_SMOOTH); /* glDisable (GL_POLYGON_SMOOTH); */ } } xcrysden-1.6.2/C/setOpenGLState.c0000644000175000017500000000663311712736221015254 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/setOpenGLState.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include "xcGLparam.h" void SetCageOGLState( int dim, BLENDFUNC blend, GLint *shade_model, GLboolean *two_side, GLboolean *cull_face ); void DisableCageOGLState( int dim, GLint shade_model, GLboolean two_side, GLboolean cull_face ); /* SetDefaultOGLState will have these: ---------------------------------- GL_BLEND GL_SHADE_MODEL GL_LIGHT_MODEL_TWO_SIDE GL_CULL_FACE */ void SetCageOGLState( int dim, BLENDFUNC blend, GLint *shade_model, GLboolean *two_side, GLboolean *cull_face ) { /* now get the right state for rendering the cellcage */ /* enable transparency */ glEnable( GL_BLEND ); glDepthMask( GL_FALSE ); glBlendFunc( blend.sfunc, blend.dfunc ); /* SHADEMODEL */ glGetIntegerv( GL_SHADE_MODEL, shade_model ); glShadeModel( GL_FLAT ); glGetBooleanv( GL_LIGHT_MODEL_TWO_SIDE, two_side ); glGetBooleanv( GL_CULL_FACE, cull_face ); if ( dim == 3 ) { if ( *two_side == GL_TRUE ) /* disable GL_LIGHT_MODEL_TWO_SIDE */ glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE ); /* disable CULL FACE */ if ( (*cull_face) ) glDisable( GL_CULL_FACE ); } else if ( dim == 2 ) { if ( *two_side == GL_FALSE ) /* enable GL_LIGHT_MODEL_TWO_SIDE */ glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); /* disable CULL FACE */ if ( (*cull_face) ) glDisable( GL_CULL_FACE ); } } /* in future this function will no longer exists -> when structure will have its own OGL State function, i.e. when DEFAULT OGL State function will exists */ void DisableCageOGLState( int dim, GLint shade_model, GLboolean two_side, GLboolean cull_face ) { GLint get_shade_model; GLboolean get_two_side, get_cull_face; /* DISABLE TRANSPARENCY */ glDisable(GL_BLEND); glDepthMask(GL_TRUE); /* go back to old shademodel */ glGetIntegerv( GL_SHADE_MODEL, &get_shade_model ); if ( shade_model != get_shade_model ) glShadeModel( shade_model ); /* go to old GL_LIGHT_MODEL_TWO_SIDE */ /* obstaja funkcija LoadLightModelTwoSide(int type) */ glGetBooleanv( GL_LIGHT_MODEL_TWO_SIDE, &get_two_side ); if ( two_side != get_two_side ) glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, two_side ); glGetBooleanv( GL_CULL_FACE, &get_cull_face ); if ( cull_face != get_cull_face ) { if ( cull_face == GL_TRUE ) glEnable( GL_CULL_FACE ); else if ( cull_face == GL_FALSE ) glDisable( GL_CULL_FACE ); } } xcrysden-1.6.2/C/shank_util.c0000644000175000017500000000626413521260073014551 0ustar tonetone#ifdef XC_WITH_SHANKLAND #include #include #include #include #include "shankland.h" extern const double two_pi; /* NOTICE: m2 stands for m*m */ double one_func(double m2, double sigma) { return 1.0; } double first_order(double m2, double sigma) { return (1.0 + sigma*m2); } double first_sqrt_order(double m2, double sigma) { m2=sigma*m2; return (1.0 + m2*(1.0 + 0.01*sqrt(m2))); } double second_order(double m2, double sigma) { m2=sigma*m2; return (1.0 + m2*(1.0 + 0.001*m2)); } double pickett(double m2, double sigma) { double xm; m2 = sigma*m2; xm = (1.0 - m2); return (xm*xm + m2*m2*m2); } double gauss(double m2, double sigma) { return (exp(sigma*m2)); } double exp_abs(double m2, double sigma) { return (exp(sigma*sqrt(m2))); } double estimate_sigma(double power, int m, double (*roughnessFunc)(double m2, double sigma)) { const int max=20; int i, ind; double sigma, d, diff, max_num = pow(10.0, power), min=10e16; m = FT_MAX(m); sigma = 1.0; if ( roughnessFunc(m*m, sigma) > max_num) { d = 0.9; for(i=0; i<2000; i++) { if ( roughnessFunc(m*m, sigma) < max_num ) { return ( sigma*1.05263 ); } sigma *= d; } } else /* roughnessFunc(m*m, sigma) < max_num */ { d = 1.1; for(i=0; i<2000; i++) { if ( roughnessFunc(m*m,sigma) > max_num ) { return ( sigma*.95238 ); } sigma *= d; } } /* if we arrived here, sigma was not found */ ind = -max; for (i=-max; i<=max; i++) { sigma = pow(10.0,i); diff = ABS( 1.0/max_num - 1.0/roughnessFunc(m*m, sigma) ); if ( diff < min ) { ind = i; min = diff; } } return ( pow(10.0,ind) ); } void print_double_vector(FILE *stream, const char* name, size_t m, double *mat) { int i; fprintf(stream,"%s == \n", name); for (i=0; im; i++) { fprintf(stream,"| "); for (j=0; jn; j++) fprintf(stream,"%21.13e ", mat->me[i][j]); fprintf(stream,"|\n"); } } void print_double_matrix(FILE *stream, const char* name, size_t m, size_t n, double *mat) { int i, j; fprintf(stream,"%s == \n", name); for (i=0; i #include #include #include "struct.h" NEW_WIN_CONTEXT *wc=NULL, *wcPtr=NULL; NEW_WIN_CONTEXT *FindWinContextByTogl(struct Togl *togl) { NEW_WIN_CONTEXT *g = wcPtr; while (g) { if ( togl == g->togl ) return g; g = g->ptr; } return NULL; } NEW_WIN_CONTEXT *FindWinContext(int index) { NEW_WIN_CONTEXT *g = wcPtr; while (g) { if (index == g->index) return g; g = g->ptr; } return NULL; } void DestroyWinContext(struct Togl *togl) { NEW_WIN_CONTEXT *prev = NULL; NEW_WIN_CONTEXT *pos = wcPtr; NEW_WIN_CONTEXT *g = FindWinContextByTogl( togl ); while (pos) { if (pos == g ) { if (prev) { prev->ptr = pos->ptr; } else { wcPtr = pos->ptr; } return; } prev = pos; pos = pos->ptr; } free( (FREE_ARG) g ); } void AddToWinContext(NEW_WIN_CONTEXT *g) { g->ptr = wcPtr; wcPtr = g; } int NewWinContext(void) { static int index = -1, i; wc = (NEW_WIN_CONTEXT *) malloc ( sizeof(NEW_WIN_CONTEXT) ); wc->index=++index; /*---------------*/ wc->VPf.stropened = 0; wc->VPf.nsurface = 0; wc->VPf.surface = NULL; wc->VPf.surfacePtr = NULL; wc->VPf.surfaceInd = NULL; wc->VPf.antialias = GL_FALSE; wc->VPf.fog = GL_FALSE; wc->tr.xtransl = 0.0; wc->tr.ytransl = 0.0; wc->tr.rotx = 0.0; wc->tr.roty = 0.0; wc->tr.zoom = DEF_ZOOM; /* wc->tr.zoom = 1.0; */ wc->tr.b1motion = 0; wc->tr.b2motion = 0; wc->recprim_cage = (void*)NULL; wc->fermiContext.toglVector = NULL; for(i=0; i<4; i++) wc->bg[i] = DefBg[i]; AddToWinContext( wc ); return index; } void cryNewToglInit(struct Togl *togl) { wc = FindWinContext( NewWinContext() ); wc->togl = togl; } xcrysden-1.6.2/C/xcSelect.c0000644000175000017500000013553413525506046014174 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcSelect.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ extern void xcdebug(const char *text); #include #include #include #include #include #include #include "struct.h" #include "displayfunc.h" #include "xcfunc.h" #define APPR_SCREENSIZE 1024 #define PIXTOL 5 /* tolerance in screen pixels for selection */ #define SELTOL -1.0 /* tolerance for selection; this is just a flag, * because tolerance is either radius (rball, atrad) * or rodr */ #define SELCOL 0 /* index of selected color */ #define SELLINE_WIDTH 2.0 /* width of "selline" */ #define SELLINE_PAT 0xAAAA /* selline stipple pattern */ extern OrthoProj ort; extern Options3D is; extern char *element[]; extern GLfloat DefAtCol[MAXNAT + 1][3]; extern GLuint PointList; extern GLuint tempDisable3Dlist, tempEnable3Dlist; /* this is for switching on/off lighting */ extern RasterFontSize rf; extern PERSPECTIVE persp; extern realTimeMove makeMovie; /* this is where data of selected atoms go */ typedef struct { int id; /* ID of selected atom */ int sqn; /* SQN of selected atom */ } SelAtom; SelAtom asel[MAXSEL + 1]; /* asel is counted from 1..MAXSEL */ typedef struct { int nat; float xat; float yat; } AtomsCoor; AtomsCoor *acrd; /* here we don't have zat, because of 'hpsort_index1' * function, which * don't allow usage of struct-variables and also * for selections only xat & yat are important */ double *acrd_z; /* in above struct, we don't have "Z-orientation" variable, this is one */ int old_nobjects; /* it tells how many objects were there before selection process begins */ int *zindex; /* here will go an Z-orientation order of atoms */ float tol; /* X and Y tolerance for selections */ int nsel = 0; /* number of selected atoms */ int nline = 0; /* id of selected line */ GLboolean isWF; /* WF and PL uses the same Sel. Disp Function, this is a flag for distinguishing between this two modes */ /* --- this is for selection-lists --- */ /*GLuint SphereSelList[MAXSEL];*/ /*GLuint LineSelList[MAXSEL - 1];*/ /* --- temporary variables needed for debugging */ typedef struct { float xx; float yy; } SELECT_DEBUG; SELECT_DEBUG sel_debug; /*****************************************************************************/ /* --- function prototypes --- */ int XC_SelectCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); static float dist2(float x, float y); static void xcUpdateCoorf( double mat[][4], float *x, float *y, double *z); void (*old_xcDisplay)(struct Togl *togl) = 0x0; static void old_xcDisplayFunc( void (*Func)(struct Togl *togl) ); static void MapToSelDispFunc(void); int xcSelectSqn(int x, int y); static void xcSelectAtom(int sqn, char *atomdata); /* static void xcMakeSelBallList(int sqn); static void xcMakeNewSelBallList( GLdouble *sizeArray , int natom ); */ static void xcSelectLine(int sqn1, int sqn2); void GetSelCylinderPar(double x21, double y21, double z21, double *xrvb, double *yrvb, double *zrvb, double *fibond, double *bondl); void xcPointLineSel(struct Togl *togl); void xcBallStick1Sel(struct Togl *togl); void xcBallStick2Sel(struct Togl *togl); void xcRenderSelAtoms3D(void); void xcRenderSelBonds3D(void); int XC_DeselectCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); static void PushOneCoor(int i, int ii); /*static void xcUpdateSelLists(int id);*/ /*static void SelectDebug(struct Togl *togl);*/ /* ================================== */ /* --- extern function prototypes --- */ /* --- xcDisplayFunc2.c --- */ void xcUpdateCoor( double mat[][4], double *x, double *y, double *z); /* --- xcDisplayFunc.c --- */ extern void xcPipeBall2D(struct Togl *togl); extern void xcSpaceFill2D(struct Togl *togl); extern void (*xcDisplay)(struct Togl *togl); extern void xcMakePointList(void); extern void xcDisplayFunc( void (*Func)(struct Togl *togl) ); extern void xcSolidSphere(GLdouble radius); extern void xcSolidBond(GLdouble radius, GLdouble height, int bondFlag); extern GLuint findList1(int lindex, GLdouble *paramArray, int size); GLuint makeModelPtr1(int lindex, GLdouble *sizeArray, int count); /* extern void xcMakeNewBallList( GLdouble *sizeArray , int natom ); */ extern void xcDisplayXYZ(void); /* --- auxilproc.c ---*/ extern double dist6(double x1, double x2, double y1, double y2, double z1, double z2); extern double dist3(double x, double y, double z); extern int MakeSticks2(int i, int col, int flag); /* --- xcviewport.c --- */ extern void Screen2Model_Coords(int xs, int ys, float *xm, float *ym); /* XC_SelectCmd --> inplementation of 'xc_select' custom Tcl command * --------------------- * Usage: xc_select begin|sqn|atom|line|clean|flush \ * ?value1? ?value2? ..... * * xc_select begin -- before we begin selection we must prepare * and do some initialisations * * xc_select sqn %x %y -- a sequential number of selected atom * is returned (this number is an ID) * * xc_select atom - atom is painted to selection color * * xc_select line - a line between atom and * atom is made * * xc_select clean -- when we are done with selection -> * to clean up * * xc_select flush -- flush(display) the selection changes * * xc_select finish -- finish(display) the selection changes * for 2D is the same as xc_select flush, * but for 3D it does (*xcDisplay)(), whereas * xc_select flush just swap the buffers */ int XC_SelectCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; int x,y; /* mesaWin coord of Button-1 */ if (argc < 3) { Tcl_SetResult(interp, "Usage: xc_select sqn|atom|line|clean|flush|finish ?value1? ?value2?", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if structure is not opened, just return silently */ if ( !VPf.stropened ) return TCL_OK; /* * xc_select BEGIN */ if ( strcmp(argv[2],"begin") == 0 ) { /* now do some initializations !!!! */ old_nobjects = tmp_nobjects; /* remember number of tmp_nobjects */ old_xcDisplayFunc(xcDisplay); /* remember display function that was on * before selection proces begin */ /* flag to know when we are in "selection mode" */ VPf.selection = GL_TRUE; /* now map from xcDisplay to function that has properties of xcDisplay + stuff for selection */ MapToSelDispFunc(); /* now malloc acrd structure and zindex */ acrd = (AtomsCoor *) malloc(sizeof(AtomsCoor) * (natoms + 1)); acrd_z = (double *) malloc(sizeof(double) * (natoms + 1)); zindex = (int *) malloc(sizeof(int) * (natoms + 1)); /* set nsel to 0 */ nsel = 0; /******************************************************************/ /* there is a strange efect due to reconfiguring of Mesa window. Because we want to change cursor of Mesa window for selection mode, this cause display of Mesa window to vanish. To fix that just call tkSwapBuffers(); */ /* tkSwapBuffers(); */ } /* * xc_select SQN %x %y * * %x %y are toglName Button-1 coord. */ else if ( strcmp(argv[2],"sqn") == 0 ) { int sqn; char *csqn = Tcl_Alloc( sizeof(char) * 10 ); /* argc must be 5 */ if ( argc != 5 ) { Tcl_SetResult(interp, "wrong usage of \"xc_select sqn\" command, must be \"xc_select sqn \"", TCL_STATIC); return TCL_ERROR; } /* agrv[3],argv[4] must be integers */ if ( Tcl_GetInt(interp,argv[3],&x) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s %s\n",argv[0],argv[1],argv[2],argv[3],argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp,argv[4],&y) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s %s\n",argv[0],argv[1],argv[2],argv[3],argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if there were no "xc_selct begin" than ERROR */ if ( !VPf.selection ) { Tcl_SetResult(interp, "calling \"xc_select sqn\" command, before initialising selection process with \"xc_select begin\"", TCL_STATIC); return TCL_ERROR; } /* now find sequential number of atom, if no atom find, retun 0 */ sqn = xcSelectSqn(x,y); /* BEGIN -- debug only */ /* SelectDebug( togl ); */ /* END -- debug only */ sprintf(csqn,"%d",sqn); Tcl_SetResult(interp,csqn,TCL_DYNAMIC); } /* * xc_select ATOM */ else if ( strcmp(argv[2],"atom") == 0 ) { int sqn; char *atomdata = Tcl_Alloc(sizeof(char) * 80 ); if ( argc != 4 ) { Tcl_SetResult(interp, "wrong usage of \"xc_select atom\" command, must be \"xc_select atom \"", TCL_STATIC); return TCL_ERROR; } /* agrv[3] must be integer */ if ( Tcl_GetInt(interp,argv[3],&sqn) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s\n",argv[0],argv[1],argv[2],argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* sqn must be in [1,natoms], else nothing good */ if ( sqn < 1 || sqn > natoms ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s; must be from 1 to %d",argv[0],argv[1],argv[2],argv[3],natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if there were no "xc_selct begin" than ERROR */ if ( !VPf.selection ) { Tcl_SetResult(interp, "calling \"xc_select atom\" command, before initialising selection process with \"xc_select begin\"", TCL_STATIC); return TCL_ERROR; } xcSelectAtom(sqn, atomdata); Tcl_SetResult(interp,atomdata,TCL_DYNAMIC); } /***************************************************************************/ /* implementation of "XC_SELECT LINE */ else if ( strcmp(argv[2],"line") == 0 ) { int sqn1, sqn2; if ( argc != 5 ) { Tcl_SetResult(interp, "wrong usage of \"xc_select line\" command, must be \"xc_select line \"", TCL_STATIC); return TCL_ERROR; } /* agrv[3],argv[4] must be integers */ if ( Tcl_GetInt(interp,argv[3],&sqn1) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s %s\n",argv[0],argv[1],argv[2],argv[3],argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp,argv[4],&sqn2) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s %s\n",argv[0],argv[1],argv[2],argv[3],argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* sqn1,sqn2 must be in [1,natoms], else nothing good */ if ( (sqn1 < 1 && sqn1 > natoms) || (sqn2 < 1 && sqn2 > natoms) ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for or , while executing %s %s %s %s %s; must be from 1 to %d",argv[0],argv[1],argv[2],argv[3],argv[4],natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( sqn1 == sqn2 ) { char rss[1024]; snprintf(rss, sizeof(rss)," and are the same; while executing %s %s %s %s %s",argv[0],argv[1],argv[2],argv[3],argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* when calling XC_SELECT LINE, at least two atoms must be selected !!!! */ if ( nsel < 2 ) { Tcl_SetResult(interp, "at least two atoms must be selected, before calling \"xc_select line \"", TCL_STATIC); return TCL_ERROR; } /* if there were no "xc_selct begin" than ERROR */ if ( !VPf.selection ) { Tcl_SetResult(interp, "calling \"xc_select line\" command, before initialising selection process with \"xc_select begin\"", TCL_STATIC); return TCL_ERROR; } xcSelectLine(sqn1, sqn2); } /***************************************************************************/ /* implementaion of "XC_SELECT CLEAN"; to clean */ else if ( strcmp(argv[2],"clean") == 0 ) { /* if there were no "xc_select begin" than ERROR */ if ( !VPf.selection ) { Tcl_SetResult(interp, "calling \"xc_select clean\" command, before initialising selection process with \"xc_select begin\"", TCL_STATIC); return TCL_ERROR; } /* cleaning up */ tmp_nobjects = old_nobjects; xcDisplayFunc(old_xcDisplay); /* going to DisplayFunc that was used before selections */ /* delete all lists */ /*glDeleteLists( SphereSelList[0], MAXSEL );*/ /*glDeleteLists( LineSelList[0], MAXSEL - 1);*/ VPf.selection = GL_FALSE; /* now free acrd structure, zindex & acrd_z */ free(acrd); free(acrd_z); free(zindex); /* now Z-reorientate */ if ( dimType == XC_2D) hpsort_index1(tmp_nobjects, zorient, iwksp); /* now update display */ Togl_PostRedisplay(togl); } /***************************************************************************/ /* XC_SELECT FLUSH */ else if ( strcmp(argv[2],"flush") == 0 ) { if ( dimType == XC_2D ) Togl_PostRedisplay(togl); if ( dimType == XC_3D ) { glFlush(); Togl_SwapBuffers(togl); } } /***************************************************************************/ /* XC_SELECT FINISH */ else if ( strcmp(argv[2],"finish") == 0 ) Togl_PostRedisplay(togl); /***************************************************************************/ /* unknown option */ else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\" for \"xc_select\" command, must be one of begin, sqn, atom, line, clean, flush, finish",argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } /*****************************************************************************/ static float dist2(float x, float y) { /*return( sqrtf(x * x + y * y) );*/ return( sqrt(x * x + y * y) ); } static void xcUpdateCoorf( double mat[][4], float *x, float *y, double *z) { float x1, y1; double z1; x1 = mat[0][0] * *x + mat[1][0] * *y + mat[2][0] * *z; y1 = mat[0][1] * *x + mat[1][1] * *y + mat[2][1] * *z; z1 = mat[0][2] * *x + mat[1][2] * *y + mat[2][2] * *z; *x = x1; *y = y1; *z = z1; } /*****************************************************************************/ static void old_xcDisplayFunc( void (*Func)(struct Togl *togl) ) { old_xcDisplay = Func; } /*****************************************************************************/ static void MapToSelDispFunc(void) { /* now find out what is the current display function, and according to that * assign new display function, that will have all necessary stuff for * selections * * now we must also add some tolerance to xx,yy; that means if we are close * enough to atom, atom will be selected; * if 2D --> if WF or PL tolerance will be PIXTOL pixels * * if 3D --> "sticks" tolerance is rod radius * * else tolerance is either rball or atrad */ if (dimType == XC_2D) { /* WF and PL display functions will have common selection function, because * selection atom & line are visual the same for this two modes */ if ( xcDisplay == xcWireFrame2D || xcDisplay == xcWireFrameL2D || xcDisplay == xcWireFrameF2D || xcDisplay == xcWireFrameFL2D ) { /* make PointList */ xcMakePointList(); isWF = 1; xcDisplayFunc(xcPointLineSel); tol = (float) PIXTOL / VPf.scrAnX; } else if ( xcDisplay == xcPointLine2D || xcDisplay == xcPointLineL2D || xcDisplay == xcPointLineF2D || xcDisplay == xcPointLineFL2D ) { isWF = 0; xcDisplayFunc(xcPointLineSel); tol = (float) PIXTOL / VPf.scrAnX; } else if ( xcDisplay == xcBallStick12D || xcDisplay == xcBallStick1L2D || xcDisplay == xcBallStick1F2D || xcDisplay == xcBallStick1FL2D ) { xcDisplayFunc(xcBallStick1Sel); tol = SELTOL; } else if ( xcDisplay == xcBallStick22D || xcDisplay == xcBallStick2L2D || xcDisplay == xcBallStick2F2D || xcDisplay == xcBallStick2FL2D ) { xcDisplayFunc(xcBallStick2Sel); tol = SELTOL; } else if ( xcDisplay == xcPipeBall2D ) { xcDisplayFunc(xcPipeBall2D); tol = SELTOL; } else if ( xcDisplay == xcSpaceFill2D ) { xcDisplayFunc(xcSpaceFill2D); tol = SELTOL; } } else if ( dimType == XC_3D ) { if (is.stickmode && !is.ballmode) tol = 1.0 * rrod; else tol = SELTOL; } } /*****************************************************************************/ /* this function find an atom on (x,y) position, if there is one; * always find the topmost one; * x,y are mesaWin Button-1 coord. */ int xcSelectSqn(int x, int y) { float xx,yy; /* coordinates of Button-1 in Angstroms */ float dis, tol_; int i; /* transform screen coordinates to model coordinates */ Screen2Model_Coords( x, y, &xx, &yy); /* TEST--TEST */ sel_debug.xx = xx; sel_debug.yy = yy; printf("xcSelectSqn> x=%d, y=%d; xx=%f, yy=%f\n",x, y, xx,yy); fflush(stdout); /* TEST--END */ /* now write acrd struct and rotate according to vec.crdmajor */ for(i=1; i<=natoms; i++) { (acrd + i)->nat = *(nat + i); (acrd + i)->xat = (float) *(xat + i); (acrd + i)->yat = (float) *(yat + i); *(acrd_z + i) = *(zat + i); xcUpdateCoorf( vec.crdmajor, &(acrd + i)->xat, &(acrd + i)->yat, (acrd_z + i) ); } /* now orientate according to Z */ hpsort_index1(natoms, acrd_z, zindex); /* now try to find an atom, if there is no atom, just return 0 */ for(i=natoms; i>=1; i--) { tol_ = tol; /* now take care of tolerance */ if ( tol == SELTOL ) { /* first take care of XC_2D modes */ if ( dimType == XC_2D ) { /* check if balls are >= PIXTOL */ if ( (rball[ nat[zindex[i]] ] * VPf.scrAnX) >= PIXTOL ) tol_ = rball[ nat[zindex[i]] ]; else tol_ = (float) PIXTOL / VPf.scrAnX; } else if ( dimType == XC_3D ) { /* are we in SF mode */ if (is.spacefillmode) tol_ = atrad[ nat[zindex[i]] ]; else if (is.ballmode) { if ( (rball[ nat[zindex[i]] ] * VPf.scrAnX) >= PIXTOL ) tol_ = rball[ nat[zindex[i]] ]; else tol_ = (float) PIXTOL / VPf.scrAnX; } } } dis = dist2( xx - (acrd + zindex[i])->xat, yy - (acrd + zindex[i])->yat ); if ( dis <= tol_ ) { fprintf(stderr, "DEBUG> tol_ = %f, dis = %f; VPf.scrAnX = %f\n", tol_, dis, VPf.scrAnX); /* WE FIND AN ATOM */ return zindex[i]; } } /* if we come here we didn't find an atom */ return 0; } /*****************************************************************************/ /* this function select an atom and return it's data */ static void xcSelectAtom(int sqn, char *atomdata) { int i; /*char *atomdata = (char *) malloc(sizeof(char) * 80);*/ nsel++; /* number of selected atoms is increased */ /* put information of selected atom to 'asel' structure */ if ( dimType == XC_2D ) (asel + nsel)->id = tmp_nobjects + 1; (asel + nsel)->sqn = sqn; /* if we are in 2D make "selatom" and redraw, if in 3D just draw "selatom" */ if ( dimType == XC_2D ) { i = ++tmp_nobjects; /* increase TMP_NOBJECTS for one */ /* add "selatom" to coor structure */ (coor + i)->flag = SELATOM; (coor + i)->sqn = sqn; (coor + i)->nat = *(nat + sqn); (coor + i)->x1 = *(xat + sqn); (coor + i)->y1 = *(yat + sqn); (coor + i)->z1 = *(zat + sqn); xcUpdateCoor( vec.crdmajor, &(coor + i)->x1, &(coor + i)->y1, &(coor + i)->z1 ); /* add a little to Z-coor, because SELATOM must go over the ATOM */ *(zorient + i) = (coor + i)->z1 + Z_OFFSET((coor + i)->flag); hpsort_index1(tmp_nobjects, zorient, iwksp); /* if BS1 or BS2 mode */ /*if ( xcDisplay != xcPointLineSel ) { xcMakeSelBallList(i); }*/ /* now update a display */ /* Togl_PostRedisplay(togl); I THINK THIS IS NOT NEEDED */ } else if ( dimType == XC_3D ) { ; } /* now return atomic data */ sprintf(atomdata," %-3d %-3s %-3d %+14.9f %+14.9f %+14.9f", sqn, element[*(nat + sqn)], *(nat + sqn), *(xat + sqn) + mx, *(yat + sqn) + my, *(zat + sqn) + mz); } /* static void xcMakeSelBallList(int sqn) { GLint nstep, i, nat; GLdouble sine, cosine; GLdouble sizeArray[3]; GLuint displayList[2]; nat = (coor + sqn)->nat; nstep = 3 * CalcTessFactor(); if ( nstep < 8 ) nstep = 8; sizeArray[0] = rball[nat]; sizeArray[1] = (GLdouble) nstep; sizeArray[2] = (GLdouble) VPf.OUTlinewidth; displayList[0] = findList1 (BALL, sizeArray, 3); displayList[1] = findList1 (OUTLINEBALL, sizeArray, 3); if ( displayList[0] == 0 ) { glNewList( makeModelPtr1 (BALL, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); glBegin(GL_POLYGON); for(i=0; i < nstep; i++) { cosine = rball[nat] * cos((GLdouble) i * 2.0 * PI / (GLdouble) nstep); sine = rball[nat] * sin((GLdouble) i * 2.0 * PI / (GLdouble) nstep); glVertex2d( cosine, sine ); } glEnd(); glEndList(); glNewList( makeModelPtr1 (OUTLINEBALL, sizeArray, 3), GL_COMPILE_AND_EXECUTE ); glColor3f (0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); for(i=0; i < nstep; i++) { cosine = rball[nat] * cos((GLdouble) i * 2.0 * PI / (GLdouble) nstep); sine = rball[nat] * sin((GLdouble) i * 2.0 * PI / (GLdouble) nstep); glVertex2d( cosine, sine ); } glEnd(); glEndList(); } else { glCallList (displayList[0]); glCallList (displayList[1]); } } */ /* / */ /* static void */ /* xcMakeSelBallList(int sqn) */ /* { */ /* GLuint displayList; */ /* GLdouble *sizeArray, *tmp; */ /* sizeArray = (GLdouble *) malloc (sizeof (GLdouble) * 4); */ /* tmp = sizeArray; */ /* *tmp++ = rball[(coor + sqn)->nat]; */ /* displayList = findList1 (BALL, sizeArray, 1); */ /* if (displayList == 0) xcMakeNewSelBallList( sizeArray, sqn ); */ /* else { */ /* (coor + sqn)->list2 = displayList; */ /* free (sizeArray); */ /* } */ /* } */ /**/ /* static void */ /* xcMakeNewSelBallList( GLdouble *sizeArray , int natom ) */ /* { */ /* GLint nstep, i; */ /* int nab = (coor + natom)->nat; */ /* GLdouble sine, cosine, dstep; */ /* nstep = (GLint) (3 * APPR_SCREENSIZE / (VPf.tessFactor * ort.size)); */ /* if ( nstep < 8 ) nstep = 8; */ /* dstep = (GLdouble) nstep; */ /* (coor + natom)->list1 = makeModelPtr1 (BALL, sizeArray, 4); */ /* glNewList( (coor + natom)->list2, GL_COMPILE ); */ /* glBegin(GL_POLYGON); */ /* for(i=0; i < nstep; i++) */ /* { */ /* cosine = rball[nab] * cos((GLdouble) i * 2.0 * PI / dstep); */ /* sine = rball[nab] * sin((GLdouble) i * 2.0 * PI / dstep); */ /* glVertex2d( cosine, sine ); */ /* } */ /* glEnd(); */ /* glEndList(); */ /* } */ /**/ static void xcSelectLine(int sqn1, int sqn2) { double dis, len, fdis; int i; printf("\n\nsqn1=%d, sqn2=%d\n",sqn1,sqn2); /* now, if between sqn1 & sqn2 is chemmical bond, display line as a bond, else display as a dotted line */ dis = dist6(*(xat + sqn1), *(xat + sqn2), *(yat + sqn1), *(yat + sqn2), *(zat + sqn1), *(zat + sqn2)); len = rcov[*(nat + sqn1)] + rcov[*(nat + sqn2)]; if ( dimType == XC_2D ) { /* tmp_nobjects must be increased for one, because we have new object */ i = ++tmp_nobjects; printf("lineID=%d\n",i); if ( dis < len ) { fdis = rcov[*(nat + sqn1)] / len; /* bond to ATOM sqn1 */ (coor + i)->flag = SELBOND; (coor + i)->nat = nat[sqn1]; (coor + i)->bondend = BOND_ATOM_TO_MIDBOND; (coor + i)->x1 = xat[sqn1]; (coor + i)->y1 = yat[sqn1]; (coor + i)->z1 = zat[sqn1]; (coor + i)->x2 = xat[sqn1] + fdis * (xat[sqn2] - xat[sqn1]); (coor + i)->y2 = yat[sqn1] + fdis * (yat[sqn2] - yat[sqn1]); (coor + i)->z2 = zat[sqn1] + fdis * (zat[sqn2] - zat[sqn1]); xcUpdateCoor( vec.crdmajor, &(coor + i)->x1, &(coor + i)->y1, &(coor + i)->z1 ); xcUpdateCoor( vec.crdmajor, &(coor + i)->x2, &(coor + i)->y2, &(coor + i)->z2 ); *(zorient + i) = 0.5 * ((coor + i)->z1 + (coor + i)->z2) + Z_OFFSET((coor + i)->flag); /* bond to ATOM sqn2 */ i = ++tmp_nobjects; printf("lineID=%d\n",i); (coor + i)->flag = SELBOND; (coor + i)->nat = nat[sqn2]; (coor + i)->bondend = BOND_MIDBOND_TO_ATOM; (coor + i)->x2 = xat[sqn2]; (coor + i)->y2 = yat[sqn2]; (coor + i)->z2 = zat[sqn2]; (coor + i)->x1 = xat[sqn2] + (1 - fdis) * (xat[sqn1] - xat[sqn2]); (coor + i)->y1 = yat[sqn2] + (1 - fdis) * (yat[sqn1] - yat[sqn2]); (coor + i)->z1 = zat[sqn2] + (1 - fdis) * (zat[sqn1] - zat[sqn2]); } else { (coor + i)->flag = SELLINE; (coor + i)->nat = 0; /* 0 is for SELCOL */ (coor + i)->x1 = xat[sqn1]; (coor + i)->y1 = yat[sqn1]; (coor + i)->z1 = zat[sqn1]; (coor + i)->x2 = xat[sqn2]; (coor + i)->y2 = yat[sqn2]; (coor + i)->z2 = zat[sqn2]; } xcUpdateCoor( vec.crdmajor, &(coor + i)->x1, &(coor + i)->y1, &(coor + i)->z1 ); xcUpdateCoor( vec.crdmajor, &(coor + i)->x2, &(coor + i)->y2, &(coor + i)->z2 ); /* if ATOM and BOND and FRAME and SEL BOND are on the same plane, * ATOM must be drawn first, than BOND, than FRAME, and than SELBOND, * so we will add very little to z-coord, but more than for FRAME */ *(zorient + i) = 0.5 * ((coor + i)->z1 + (coor + i)->z2) + Z_OFFSET((coor + i)->flag); hpsort_index1( tmp_nobjects, zorient, iwksp); /* now update a display */ /* (*xcDisplay)(); */ } else if ( dimType == XC_3D ) { ; } } void GetSelCylinderPar(double x21, double y21, double z21, double *xrvb, double *yrvb, double *zrvb, double *fibond, double *bondl) { double mintol = -1.0 + 1.0e-8; /* rotated vector is cross product between (0,0,1) & vector submited to GetCylinderPar */ *bondl = dist3(x21, y21, z21); /* normalize vectror (x21,y21,z21) */ normalizepv(&x21, &y21, &z21); if (z21 > mintol) { *xrvb = -y21; *yrvb = x21; *zrvb = 0.0; } else { *xrvb = 1.0; *yrvb = 0.0; *zrvb = 0.0; } if (ABS(z21) > 1.0000000001) { fprintf(stderr,"++ Z-component of normalized vector greater than 1.0\n"); fprintf(stderr,"++ Vector: %f %f %f\n", x21, y21, z21); return; } *fibond = RAD2DEG * acos(z21); } /*****************************************************************************/ /* Selection Display Functions */ /*****************************************************************************/ /* display function for WF & PL 2D's modes for selections */ void xcPointLineSel(struct Togl *togl) { int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glLineWidth( (GLfloat) VPf.PLlinewidth ); glBegin(GL_LINES); if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); } if ( (coor + *(iwksp + i))->flag == ATOM ) { /* display point only if old_xcDisplay is one of PL disp. functions */ if ( isWF == 0 ) { /* first display point */ glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glCallList( PointList ); glPopMatrix(); } /* display labels only if VPf.lablesOn */ if ( VPf.labelsOn ) { makeAtomLabel2D ( *(iwksp + i), rf.wp2, rf.hp2 ); } } /* display frames only if VPf.framessOn */ if ( VPf.framesOn ) { if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } if ( (coor + *(iwksp + i))->flag == SELATOM ) { glColor3fv( atcol[SELCOL] ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glCallList( PointList ); glPopMatrix(); } if ( (coor + *(iwksp + i))->flag == SELLINE ) { glLineStipple( 2, SELLINE_PAT ); glEnable(GL_LINE_STIPPLE); glLineWidth( SELLINE_WIDTH ); glColor3fv( atcol[SELCOL] ); glBegin(GL_LINES); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } if ( (coor + *(iwksp + i))->flag == SELBOND ) { { glLineWidth( SELLINE_WIDTH ); glColor3fv( atcol[SELCOL] ); glBegin(GL_LINES); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); } } } /* check if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcBallStick1Sel(struct Togl *togl) { int i; GLdouble x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { MakeSticks1(*(iwksp + i), &x1, &y1, &z1, &x2, &y2, &z2, &x3, &y3, &z3, &x4, &y4, &z4); glColor3f( 0.0, 0.0, 0.0 ); if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glBegin(GL_POLYGON); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); glBegin(GL_LINE_LOOP); glColor3f( 0.0, 0.0, 0.0 ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); } else if ( (coor + *(iwksp + i))->flag == ATOM ) { /* display ball */ glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); if (VPf.labelsOn) { makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL); } } else if ( (coor + *(iwksp + i))->flag == SELATOM ) { /* display selected ball */ glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv( atcol[SELCOL] ); xcBall2D (*(iwksp + i)); /*glCallList( (coor + *(iwksp + i))->list2 );*/ glPopMatrix(); if (VPf.labelsOn) { makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL); } } /* display frames only if VPf.framesOn */ if ( VPf.framesOn ) { if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } if ( (coor + *(iwksp + i))->flag == SELBOND ) { MakeSticks1(*(iwksp + i), &x1, &y1, &z1, &x2, &y2, &z2, &x3, &y3, &z3, &x4, &y4, &z4); glColor3fv( atcol[SELCOL] ); glBegin(GL_POLYGON); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); glBegin(GL_LINE_LOOP); glColor3f( 0.0, 0.0, 0.0 ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); } if ( (coor + *(iwksp + i))->flag == SELLINE ) { glLineStipple( 2, SELLINE_PAT ); glEnable(GL_LINE_STIPPLE); glLineWidth( SELLINE_WIDTH ); glColor3fv( atcol[SELCOL] ); glBegin(GL_LINES); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } glDisable( GL_CULL_FACE ); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcBallStick2Sel(struct Togl *togl) { int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glLineWidth( VPf.OUTlinewidth ); /* MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->nat); */ MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->sqn, BALL); } else if ( (coor + *(iwksp + i))->flag == ATOM ) { /* display ball */ glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); if (VPf.labelsOn) { makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL); } } else if ( (coor + *(iwksp + i))->flag == SELATOM ) { glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv( atcol[SELCOL] ); xcBall2D (*(iwksp + i)); /*glCallList( (coor + *(iwksp + i))->list2 );*/ glPopMatrix(); if (VPf.labelsOn) { makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL); } } /* display frames only if VPf.framesOn */ if ( VPf.framesOn ) { if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } if ( (coor + *(iwksp + i))->flag == SELBOND ) { glLineWidth( VPf.OUTlinewidth ); MakeSticks2(*(iwksp + i), 0, BALL); } if ( (coor + *(iwksp + i))->flag == SELLINE ) { glLineStipple( 2, SELLINE_PAT ); glEnable(GL_LINE_STIPPLE); glLineWidth( SELLINE_WIDTH ); glColor3fv( atcol[SELCOL] ); glBegin(GL_LINES); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } glDisable( GL_CULL_FACE ); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcRenderSelAtoms3D(void) { register int i, ind; register double r; glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, atcol[SELCOL] ); for (i=1; i<=nsel; i++) { ind = asel[i].sqn; if(is.spacefillmode) r = atrad[*(nat + ind)]; else if(is.ballmode) r = rball[*(nat + ind)]; else r = 1.5 * rrod; glPushMatrix(); glTranslated( xat[ind], yat[ind], zat[ind] ); xcSolidSphere( 1.009 * r ); glPopMatrix(); } } void xcRenderSelBonds3D(void) { register int i, i1, i2; register double dis, len; double xrvb, yrvb, zrvb, fibond, bondl; glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, atcol[SELCOL] ); for (i=1; i inplementation of 'xc_deselect' custom Tcl command * --------------------- * Usage: xc_deselect atom|line ?sqn? * * xc_deselect atom -- deselect atom * * xc_deselect line -- deselect all lines */ int XC_DeselectCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; int sqn; /* mesaWin coord of Button-1 */ int i, id, ii, j, jj; if (argc < 3) { Tcl_SetResult(interp, "Usage: xc_deselect atom|line ?sqn?", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* if structure is not opened, just return silently */ if ( !VPf.stropened ) return TCL_OK; /***************************************************************************/ /* first "XC_DESELECT ATOM " * this command deselect th atom !!! */ if ( strcmp(argv[2],"atom") == 0 ) { if (argc != 4) { Tcl_SetResult(interp, "Usage: xc_deselect atom ", TCL_STATIC); return TCL_ERROR; } /* agrv[3] must be integer */ if ( Tcl_GetInt(interp,argv[3],&sqn) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"got invalid value for , while executing %s %s %s %s\n",argv[0],argv[1],argv[2],argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* first find an atom for deselection */ id = -1; for(i=1; i<=nsel; i++) { printf("id=%d, sqn=%d\n",(asel + i)->id,(asel + i)->sqn); if ( (asel + i)->sqn == sqn ) { printf("DESELECTED:: ID=%d, SQN=%d\n",(asel + i)->id,(asel + i)->sqn); if ( dimType == XC_2D ) id = (asel + i)->id; if ( dimType == XC_3D ) { id = i; printf("3D id=%d\n",id); fflush(stdout); } /* atom (asel + i), will be deleted, that's (asel + i + 1) will became (asel + i) under condition that (asel + i) is not the last one */ for(j=i; jid = (asel + j + 1)->id - 1; (asel + j)->sqn = (asel + j + 1)->sqn; } break; } } /* if id is still -1, than we try to deselect an atom, * that was never selected */ if ( id == -1 ) { Tcl_SetResult(interp, "attempt to deselect an atom, that was never selected", TCL_STATIC); return TCL_ERROR; } /* now I must delete sqn ATOM from "coor" and than rewrite the rest * of the "coor" */ if ( dimType == XC_2D ) { printf("tmp_nobjects=%d\n",tmp_nobjects); for(i=id; i LINE" * this command deselect all lines */ else if ( strcmp(argv[2],"line") == 0 ) { if (argc != 3) { Tcl_SetResult(interp, "Usage: xc_deselect line", TCL_STATIC); return TCL_ERROR; } if ( dimType == XC_2D ) { for(i=old_nobjects; i<=tmp_nobjects; i++) printf("i=%d, flag=%d\n",i,(coor + i)->flag); for(i=old_nobjects; i<=tmp_nobjects; i++) { printf("i=%d, flag=%d\n",i,(coor + i)->flag); if ( (coor + i)->flag == SELLINE || (coor + i)->flag == SELBOND ) { for(j=i; jid's elements that have greater id than j must be decreased for one */ if ( (coor + j + 1)->flag == SELATOM ) for(jj=1; jj<=nsel; jj++) if ((asel + jj)->id > j) (asel + jj)->id -= 1; /* now also Push coor for one down */ PushOneCoor(j,j + 1); } --i; --tmp_nobjects; } } hpsort_index1(tmp_nobjects, zorient, iwksp); } else if ( dimType == XC_3D ) { xcdebug("delete LINES 3D\n"); /* for(i=0; iflag = (coor + ii)->flag; (coor + i)->list1 = (coor + ii)->list1; (coor + i)->list2 = (coor + ii)->list2; (coor + i)->nat = (coor + ii)->nat; (coor + i)->x1 = (coor + ii)->x1; (coor + i)->y1 = (coor + ii)->y1; (coor + i)->z1 = (coor + ii)->z1; (coor + i)->x2 = (coor + ii)->x2; (coor + i)->y2 = (coor + ii)->y2; (coor + i)->z2 = (coor + ii)->z2; *(zorient + i) = *(zorient + ii); } /* when we delete an atom we must update a SphereSelList's lists * from deleted atom on */ /* static void */ /* xcUpdateSelLists(int id) */ /* { */ /* int sqn, i; */ /* double r; */ /* for(i=id-1; isqn; */ /* if (is.spacefillmode) r = atrad[*(nat + sqn)]; */ /* else if (is.ballmode) r = rball[*(nat + sqn)]; */ /* else r = 1.5 * rrod; */ /* glNewList(SphereSelList[i], GL_COMPILE); */ /* printf("UPD> SphereSelList[i]=%d",SphereSelList[i]); */ /* fflush(stdout); */ /* glTranslated( *(xat + sqn), *(yat + sqn), *(zat + sqn) ); */ /* glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, */ /* atcol[SELCOL] ); */ /* xcSolidSphere( 1.1 * r ); */ /* glTranslated( -*(xat + sqn), -*(yat + sqn), -*(zat + sqn) ); */ /* glEndList(); */ /* } */ /* /\* (*xcDisplay)(); *\/ */ /* } */ /* static void SelectDebug(struct Togl *togl) { glColor3f(1.0, 1.0, 0.0); if ( dimType == XC_3D ) glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, atcol[0] ); glPointSize(20.0); glBegin(GL_POINTS); glVertex2f(0.0, 0.0); glVertex2f(sel_debug.xx, sel_debug.yy); glEnd(); Togl_SwapBuffers(togl); } */ xcrysden-1.6.2/C/ppmPrintTogl.c0000644000175000017500000001353113521263765015055 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/ppmPrintTogl.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include "struct.h" #include "xcfunc.h" extern struct Togl *mesa_togl; extern const char *printImage; static int FileWritePPM(Tcl_Interp *interp, const char *fileName, Tk_PhotoImageBlock *blockPtr); /* --- xcDisplayFunc.c --- */ extern void (*xcDisplay)(struct Togl *togl); /* * this function takes care of PPM * * Usage: xc_dump2ppm toglName filename */ int CRY_Dump2PpmCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( argc != 3 ) { Tcl_SetResult(interp, "Usage: xc_dump2ppm toglName filename", TCL_STATIC); return TCL_ERROR; } /* /\* check if togl is .mesa or something else ... *\/ */ /* if ( togl == mesa_togl ) { */ /* Togl_DumpToPpmFile( togl, argv[2] ); */ /* } else { */ /* /\*NEW_WIN_CONTEXT *wc; */ /* wc = FindWinContextByTogl( togl );*\/ */ /* Togl_DumpToPpmFile( togl, argv[2] ); */ /* } */ Togl_DumpToPpmFile( togl, argv[2] ); return TCL_OK; } int Togl_DumpToPpmFile(Togl *togl, const char *filename) { Tcl_Interp *interp = Togl_Interp(togl); /*ClientData clientData = Togl_GetClientData(togl);*/ Tk_PhotoHandle photo; Tk_PhotoImageBlock blockPtr; photo = Tk_FindPhoto(interp, printImage); if (photo == NULL) { Tcl_AppendResult(interp, "image \"", printImage, "\" doesn't exist or is not a photo image", NULL); return TCL_ERROR; } Togl_TakePhoto(togl, photo); Tk_PhotoGetImage(photo, &blockPtr); FileWritePPM(interp, filename, &blockPtr); return TCL_OK; } /************************************************************************* The below "FileWritePPM" routine is taken from tk8.6 sources, in particular from file "tk8.6.9/generic/tkImgPPM.c" *************************************************************************/ /* *---------------------------------------------------------------------- * * FileWritePPM -- * * This function is invoked to write image data to a file in PPM format * (although we can read PGM files, we never write them). * * Results: * A standard TCL completion code. If TCL_ERROR is returned then an error * message is left in the interp's result. * * Side effects: * Data is written to the file given by "fileName". * * Copyright (c) 1994 The Australian National University. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "$XCRYSDEN_TOPDIR/otherLICENSES/TclTk:LICENSE" for * information on usage and redistribution of this file, and for a * DISCLAIMER OF ALL WARRANTIES. * * Author: Paul Mackerras (paulus@cs.anu.edu.au), * Department of Computer Science, * Australian National University. */ static int FileWritePPM(Tcl_Interp *interp, const char *fileName, Tk_PhotoImageBlock *blockPtr) { Tcl_Channel chan; int w, h, greenOffset, blueOffset, nBytes; unsigned char *pixelPtr, *pixLinePtr; char header[16 + TCL_INTEGER_SPACE * 2]; chan = Tcl_OpenFileChannel(interp, fileName, "w", 0666); if (chan == NULL) { return TCL_ERROR; } if (Tcl_SetChannelOption(interp, chan, "-translation", "binary") != TCL_OK) { Tcl_Close(NULL, chan); return TCL_ERROR; } if (Tcl_SetChannelOption(interp, chan, "-encoding", "binary") != TCL_OK) { Tcl_Close(NULL, chan); return TCL_ERROR; } sprintf(header, "P6\n%d %d\n255\n", blockPtr->width, blockPtr->height); Tcl_Write(chan, header, -1); pixLinePtr = blockPtr->pixelPtr + blockPtr->offset[0]; greenOffset = blockPtr->offset[1] - blockPtr->offset[0]; blueOffset = blockPtr->offset[2] - blockPtr->offset[0]; if ((greenOffset == 1) && (blueOffset == 2) && (blockPtr->pixelSize == 3) && (blockPtr->pitch == (blockPtr->width * 3))) { nBytes = blockPtr->height * blockPtr->pitch; if (Tcl_Write(chan, (char *) pixLinePtr, nBytes) != nBytes) { goto writeerror; } } else { for (h = blockPtr->height; h > 0; h--) { pixelPtr = pixLinePtr; for (w = blockPtr->width; w > 0; w--) { if ( Tcl_Write(chan,(char *)&pixelPtr[0], 1) == -1 || Tcl_Write(chan,(char *)&pixelPtr[greenOffset],1)==-1 || Tcl_Write(chan,(char *)&pixelPtr[blueOffset],1) ==-1) { goto writeerror; } pixelPtr += blockPtr->pixelSize; } pixLinePtr += blockPtr->pitch; } } if (Tcl_Close(NULL, chan) == 0) { return TCL_OK; } chan = NULL; writeerror: Tcl_SetObjResult(interp, Tcl_ObjPrintf("error writing \"%s\": %s", fileName, Tcl_PosixError(interp))); if (chan != NULL) { Tcl_Close(NULL, chan); } return TCL_ERROR; } xcrysden-1.6.2/C/gl2ps.h0000644000175000017500000002043413522562052013442 0ustar tonetone/* * GL2PS, an OpenGL to PostScript Printing Library * Copyright (C) 1999-2017 C. Geuzaine * * This program is free software; you can redistribute it and/or * modify it under the terms of either: * * a) the GNU Library General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your * option) any later version; or * * b) the GL2PS License as published by Christophe Geuzaine, 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 either * the GNU Library General Public License or the GL2PS License for * more details. * * You should have received a copy of the GNU Library General Public * License along with this library in the file named "COPYING.LGPL"; * if not, write to the Free Software Foundation, Inc., 51 Franklin * Street, Fifth Floor, Boston, MA 02110-1301, USA. * * You should have received a copy of the GL2PS License with this * library in the file named "COPYING.GL2PS"; if not, I will be glad * to provide one. * * For the latest info about gl2ps and a full list of contributors, * see http://www.geuz.org/gl2ps/. * * Please report all bugs and problems to . */ #ifndef __GL2PS_H__ #define __GL2PS_H__ #include #include /* Define GL2PSDLL at compile time to build a Windows DLL */ #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) # if defined(_MSC_VER) # pragma warning(disable:4115) # pragma warning(disable:4127) # pragma warning(disable:4996) # endif # define NOMINMAX # include # undef NOMINMAX # if defined(GL2PSDLL) # if defined(GL2PSDLL_EXPORTS) # define GL2PSDLL_API __declspec(dllexport) # else # define GL2PSDLL_API __declspec(dllimport) # endif # else # define GL2PSDLL_API # endif #else # define GL2PSDLL_API #endif #if defined(__APPLE__) || defined(HAVE_OPENGL_GL_H) # include #else # include #endif /* Support for compressed PostScript/PDF/SVG and for embedded PNG images in SVG */ #if defined(HAVE_ZLIB) || defined(HAVE_LIBZ) # define GL2PS_HAVE_ZLIB # if defined(HAVE_LIBPNG) || defined(HAVE_PNG) # define GL2PS_HAVE_LIBPNG # endif #endif #if defined(HAVE_NO_VSNPRINTF) # define GL2PS_HAVE_NO_VSNPRINTF #endif /* Version number */ #define GL2PS_MAJOR_VERSION 1 #define GL2PS_MINOR_VERSION 4 #define GL2PS_PATCH_VERSION 0 #define GL2PS_EXTRA_VERSION "" #define GL2PS_VERSION (GL2PS_MAJOR_VERSION + \ 0.01 * GL2PS_MINOR_VERSION + \ 0.0001 * GL2PS_PATCH_VERSION) #define GL2PS_COPYRIGHT "(C) 1999-2017 C. Geuzaine" /* Output file formats (the values and the ordering are important!) */ #define GL2PS_PS 0 #define GL2PS_EPS 1 #define GL2PS_TEX 2 #define GL2PS_PDF 3 #define GL2PS_SVG 4 #define GL2PS_PGF 5 /* Sorting algorithms */ #define GL2PS_NO_SORT 1 #define GL2PS_SIMPLE_SORT 2 #define GL2PS_BSP_SORT 3 /* Message levels and error codes */ #define GL2PS_SUCCESS 0 #define GL2PS_INFO 1 #define GL2PS_WARNING 2 #define GL2PS_ERROR 3 #define GL2PS_NO_FEEDBACK 4 #define GL2PS_OVERFLOW 5 #define GL2PS_UNINITIALIZED 6 /* Options for gl2psBeginPage */ #define GL2PS_NONE 0 #define GL2PS_DRAW_BACKGROUND (1<<0) #define GL2PS_SIMPLE_LINE_OFFSET (1<<1) #define GL2PS_SILENT (1<<2) #define GL2PS_BEST_ROOT (1<<3) #define GL2PS_OCCLUSION_CULL (1<<4) #define GL2PS_NO_TEXT (1<<5) #define GL2PS_LANDSCAPE (1<<6) #define GL2PS_NO_PS3_SHADING (1<<7) #define GL2PS_NO_PIXMAP (1<<8) #define GL2PS_USE_CURRENT_VIEWPORT (1<<9) #define GL2PS_COMPRESS (1<<10) #define GL2PS_NO_BLENDING (1<<11) #define GL2PS_TIGHT_BOUNDING_BOX (1<<12) #define GL2PS_NO_OPENGL_CONTEXT (1<<13) /* Arguments for gl2psEnable/gl2psDisable */ #define GL2PS_POLYGON_OFFSET_FILL 1 #define GL2PS_POLYGON_BOUNDARY 2 #define GL2PS_LINE_STIPPLE 3 #define GL2PS_BLEND 4 /* Arguments for gl2psLineCap/Join */ #define GL2PS_LINE_CAP_BUTT 0 #define GL2PS_LINE_CAP_ROUND 1 #define GL2PS_LINE_CAP_SQUARE 2 #define GL2PS_LINE_JOIN_MITER 0 #define GL2PS_LINE_JOIN_ROUND 1 #define GL2PS_LINE_JOIN_BEVEL 2 /* Text alignment (o=raster position; default mode is BL): +---+ +---+ +---+ +---+ +---+ +---+ +-o-+ o---+ +---o | o | o | | o | | | | | | | | | | | | +---+ +---+ +---+ +-o-+ o---+ +---o +---+ +---+ +---+ C CL CR B BL BR T TL TR */ #define GL2PS_TEXT_C 1 #define GL2PS_TEXT_CL 2 #define GL2PS_TEXT_CR 3 #define GL2PS_TEXT_B 4 #define GL2PS_TEXT_BL 5 #define GL2PS_TEXT_BR 6 #define GL2PS_TEXT_T 7 #define GL2PS_TEXT_TL 8 #define GL2PS_TEXT_TR 9 typedef GLfloat GL2PSrgba[4]; typedef GLfloat GL2PSxyz[3]; typedef struct { GL2PSxyz xyz; GL2PSrgba rgba; } GL2PSvertex; /* Primitive types */ #define GL2PS_NO_TYPE -1 #define GL2PS_TEXT 1 #define GL2PS_POINT 2 #define GL2PS_LINE 3 #define GL2PS_QUADRANGLE 4 #define GL2PS_TRIANGLE 5 #define GL2PS_PIXMAP 6 #define GL2PS_IMAGEMAP 7 #define GL2PS_IMAGEMAP_WRITTEN 8 #define GL2PS_IMAGEMAP_VISIBLE 9 #define GL2PS_SPECIAL 10 #if defined(__cplusplus) extern "C" { #endif GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer, GLint viewport[4], GLint format, GLint sort, GLint options, GLint colormode, GLint colorsize, GL2PSrgba *colormap, GLint nr, GLint ng, GLint nb, GLint buffersize, FILE *stream, const char *filename); GL2PSDLL_API GLint gl2psEndPage(void); GL2PSDLL_API GLint gl2psSetOptions(GLint options); GL2PSDLL_API GLint gl2psGetOptions(GLint *options); GL2PSDLL_API GLint gl2psBeginViewport(GLint viewport[4]); GL2PSDLL_API GLint gl2psEndViewport(void); GL2PSDLL_API GLint gl2psText(const char *str, const char *fontname, GLshort fontsize); GL2PSDLL_API GLint gl2psTextOpt(const char *str, const char *fontname, GLshort fontsize, GLint align, GLfloat angle); GL2PSDLL_API GLint gl2psTextOptColor(const char *str, const char *fontname, GLshort fontsize, GLint align, GLfloat angle, GL2PSrgba color); GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str); GL2PSDLL_API GLint gl2psSpecialColor(GLint format, const char *str, GL2PSrgba rgba); GL2PSDLL_API GLint gl2psDrawPixels(GLsizei width, GLsizei height, GLint xorig, GLint yorig, GLenum format, GLenum type, const void *pixels); GL2PSDLL_API GLint gl2psEnable(GLint mode); GL2PSDLL_API GLint gl2psDisable(GLint mode); GL2PSDLL_API GLint gl2psPointSize(GLfloat value); GL2PSDLL_API GLint gl2psLineCap(GLint value); GL2PSDLL_API GLint gl2psLineJoin(GLint value); GL2PSDLL_API GLint gl2psLineWidth(GLfloat value); GL2PSDLL_API GLint gl2psBlendFunc(GLenum sfactor, GLenum dfactor); /* referenced in the documentation, but not fully documented */ GL2PSDLL_API GLint gl2psForceRasterPos(GL2PSvertex *vert); GL2PSDLL_API void gl2psAddPolyPrimitive(GLshort type, GLshort numverts, GL2PSvertex *verts, GLint offset, GLfloat ofactor, GLfloat ounits, GLushort pattern, GLint factor, GLfloat width, GLint linecap, GLint linejoin, char boundary); /* undocumented */ GL2PSDLL_API GLint gl2psDrawImageMap(GLsizei width, GLsizei height, const GLfloat position[3], const unsigned char *imagemap); GL2PSDLL_API const char *gl2psGetFileExtension(GLint format); GL2PSDLL_API const char *gl2psGetFormatDescription(GLint format); GL2PSDLL_API GLint gl2psGetFileFormat(); #if defined(__cplusplus) } #endif #endif /* __GL2PS_H__ */ xcrysden-1.6.2/C/isoInterpolate.c0000644000175000017500000001613511712736221015412 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/isoInterpolate.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include "struct.h" #include "isosurf.h" #include "memory.h" extern void xcRegularSplineInt2(float gridX[], float gridY[], float **Fn, int nX, int nY, float ndegree, float **newFn); extern void xcRegularSplineInt3(float gridX[], float gridY[], float gridZ[], float ***Fn, int nX, int nY, int nZ, float ndegree, float ***newFn); extern ISOSTATE isostate; extern PLANEVERTEX ***plvertex; void isoInterpolate( int degree ) { register int i, j, k; if ( degree == 0 ) { /* I can not imagine what degree 0 would stand for */ degree = 1; } if ( degree < 0 ) { /* so far lowering of resolution is not supported */ degree = 1; } if (isodata.dim[ISOOBJ_BASE] == 3 ) { /* * if grd == newgrd && degree == 1 --> we already have what we want */ if ( grd.nx == newgrd.nx && grd.ny == newgrd.ny && grd.nz == newgrd.nz && degree == 1) { return; } else { float ***newGv; float ***gv = xcMallocTensor3f( grd.nx, grd.ny, grd.nz ); /* * forget about gridvertex and get new one */ if ( isostate.gridvertex_malloc ) { xcFree_GRIDVERTEX( gridvertex ); isostate.gridvertex_malloc = 0; } /* * rewind bin_vertex_fp && read the data */ fflush( isodata.bin_vertex_fp ); rewind( isodata.bin_vertex_fp ); for(i=0; i newGv */ newgrd.nx = grd.nx; newgrd.ny = grd.ny; newgrd.nz = grd.nz; newGv = gv; } else { /* * perform the interpolation */ int max; float *x; /* assing x[] */ max = (grd.nx > grd.ny) ? grd.nx : grd.ny; max = (max > grd.nz) ? max : grd.nz; x = xcMallocVectorf( max ); for(i=0; i we already have what we want */ if ( grd.nx == newgrd.nx && grd.ny == newgrd.ny && degree == 1) { return; } else { float **newGv; float **gv = xcMallocMatrixf( grd.nx, grd.ny ); /* * forget about plvertex[ISOOBJ_BASE] and get new one */ if ( isostate.plvertex_malloc[ISOOBJ_BASE] ) { xcFree_PLANEVERTEX( plvertex[ISOOBJ_BASE] ); isostate.plvertex_malloc[ISOOBJ_BASE] = 0; } /* * rewind bin_vertex_fp && read the data */ fflush( isodata.bin_vertex_fp ); rewind( isodata.bin_vertex_fp ); for(j=0; j newGv */ newgrd.nx = grd.nx; newgrd.ny = grd.ny; newGv = gv; } else { /* * perform the interpolation */ int max; float *x; /* assing x[] */ max = (grd.nx > grd.ny) ? grd.nx : grd.ny; x = xcMallocVectorf( max ); for(i=0; i #include #include #include "struct.h" #include "xcGLparam.h" #include "isosurf.h" #include "lighting.h" #include "xcfunc.h" extern ISO_ATTRIB isoDisp; extern XCfog fog; extern GLfloat def_fog_color[4]; /* t.k.: this is for debuging (for xcMakeprojection3D) */ extern Options3D is; extern int togl_exists; static void CopyGLParVec(int code, float *mat, GetGlParam par); /*****************************************************************************/ /* XC_SetGLparamCmd --> inplementation of 'xc_setGLparam' custom Tcl command * --------------------- * Usage: xc_setGLparam material \ * -what structure|(isosurf pos|neg|one front|back) \ * -shininess {v} \ * -specular {r g b a} \ * -ambient {r g b a} \ * -diffuse {r g b a} \ * -emission {r g b a} * or * * xc_setGLparam light \ * -light {v} \ * -ambient {r g b a} \ * -diffuse {r g b a} \ * -fract_position {x y z w} \ * -specular {r g b a} \ * -spot_dir {x,y,z} \ * -spot_exp {v} \ * -spot_cutoff {v} \ * -const_atten {v} \ * -lin_atten {v} \ * -quad_atten {v}\n\ * * or * * xc_setGLparam lightmodel \ * -two_side 0|1 \ * -two_side_iso 0|1 \ * -ambient {r g b a} \ * -local_viewer 0|1 \ * -enable_light {v}|-disable_light {v}" * * or * * xc_setGLparam frontface \ * -what (isosurf_one | isosurf_pos | \ * isosurf_neg | colorplane) * -frontface CW|CCW * * or * * xc_setGLparam isonormal \ * -what (isosurf_one | isosurf_pos | \ * isosurf_neg) * * or * * xc_setGLparam blendfunc \ * -what isosurf * -sfunc * -dfunc * * or * * xc_setGLparam fog -color {r g b a} * */ int XC_SetGLparamCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int i; struct GLParam { int what; int mat_what; int mat_what_isosurf; int mat_what_isoside; int face_what; int isonormal_what; GLenum face_frontface; int blend_what; GLenum blend_sfunc; GLenum blend_dfunc; } glparam; GetGlParam specular = { 0 }; GetGlParam shininess = { 0 }; GetGlParam ambient = { 0 }; GetGlParam diffuse = { 0 }; GetGlParam emission = { 0 }; GetGlParam lightN = { 0 }; GetGlParam fract_position= { 0 }; GetGlParam spot_dir = { 0 }; GetGlParam spot_exp = { 0 }; GetGlParam spot_cutoff = { 0 }; GetGlParam const_atten = { 0 }; GetGlParam lin_atten = { 0 }; GetGlParam quad_atten = { 0 }; GetGlParam two_side = { 0 }; GetGlParam two_side_iso = { 0 }; GetGlParam local_viewer = { 0 }; GetGlParam enable_light = { 0 }; GetGlParam disable_light = { 0 }; GetGlParam fogcolor = { 0 }; boolean is_blend_sfunc = 0; boolean is_blend_dfunc = 0; if ( (argc % 2) != 0 ) { Tcl_SetResult(interp, "Usage: xc_setGLparam material \ -what structure|(isosurf pos|neg|one front|back) \ -shininess {v} -specular {r g b a} -ambient {r g b a} -diffuse {r g b a} -emission {r g b a}\n\ or\n\ xc_setGLparam light -light {v} \ -ambient {r g b a} -diffuse {r g b a} -fract_position {x y z w} \ -specular {r g b a} -spot_dir {x,y,z} -spot_exp {v} -spot_cutoff {v} \ -const_atten {v} -lin_atten {v} -quad_atten {v}\n\ or\n\ xc_setGLparam lightmodel -two_side 0|1 -two_side_iso 0|1 -ambient {r g b a} -local_viewer 0|1\ -enable_light {v}|-disable_light {v}\n\ or\n\ xc_setGLparam frontface -what (isosurf_one | isosurf_pos | isosurf_neg | colorplane) -frontface CW|CCW\n\ or\n\ xc_setGLparam isonormal -what (isosurf_one | isosurf_pos | isosurf_neg)\n\ or\n\ xc_setGLparam blendfunc -what isosurf -sfunc -dfunc \n\ or\n\ xc_setGLparam fog -get fogcolor", TCL_STATIC); return TCL_ERROR; } /***************************************************/ /* MATERIAL */ if ( strcmp(argv[1],"material") == 0 ) { glparam.what = GLPAR_MATERIAL; for (i=2; i GLPAR_MAXLIGHT ) { char rss[1024]; snprintf(rss, sizeof(rss), "light number %d is out of range, should be between 0 and %d", il, GLPAR_MAXLIGHT); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } if ( ambient.is ) CopyGLParVec( XC_GET_RGBA, (float *) &(light[il].ambient), ambient ); if ( diffuse.is ) CopyGLParVec( XC_GET_RGBA, (float *) &(light[il].diffuse), diffuse ); if ( specular.is ) CopyGLParVec( XC_GET_RGBA, (float *) &(light[il].specular), specular ); if ( fract_position.is ) CopyGLParVec( XC_GET_XYZW, (float *) &(light[il].fract_position), fract_position ); if ( spot_dir.is ) CopyGLParVec( XC_GET_XYZ, (float *) &(light[il].spot_dir), spot_dir ); if ( spot_exp.is ) CopyGLParVec( XC_GET_FLOAT, (float *) &(light[il].spot_exp), spot_exp ); if ( spot_cutoff.is ) CopyGLParVec( XC_GET_FLOAT, (float *) &(light[il].spot_cutoff), spot_cutoff ); if ( const_atten.is ) CopyGLParVec( XC_GET_FLOAT, (float *) &(light[il].const_atten), const_atten ); if ( lin_atten.is ) CopyGLParVec( XC_GET_FLOAT, (float *) &(light[il].lin_atten), lin_atten ); if ( quad_atten.is ) CopyGLParVec( XC_GET_FLOAT, (float *) &(light[il].quad_atten), quad_atten ); } else if ( glparam.what == GLPAR_LIGHTMODEL ) { int il; if ( two_side.is ) CopyGLParVec( XC_GET_FLOAT, (float *) &(lightmodel.two_side), two_side ); if ( two_side_iso.is ) CopyGLParVec( XC_GET_FLOAT, (float *) &(lightmodel.two_side_iso), two_side_iso ); if ( ambient.is ) CopyGLParVec( XC_GET_RGBA, (float *) &(lightmodel.ambient), ambient ); if ( local_viewer.is ) CopyGLParVec( XC_GET_FLOAT, (float *) &(lightmodel.local_viewer), local_viewer ); if ( enable_light.is || disable_light.is ) { /*CopyGLParVec( XC_GET_INT, (float *) &fl, enable_light );*/ if ( enable_light.is ) il = (int)enable_light.vec[0]; else il = (int)disable_light.vec[0]; if ( il < 0 || il > GLPAR_MAXLIGHT ) { char rss[1024]; snprintf(rss, sizeof(rss),"light number %d is out of range, should be between 0 and %d", il, GLPAR_MAXLIGHT); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( enable_light.is ) light[il].isenabled = 1; if ( disable_light.is ) light[il].isenabled = 0; } } else if ( glparam.what == GLPAR_FRONTFACE ) { if ( glparam.face_what == GLPAR_FACE_WHAT_ISOSURF_POS || glparam.face_what == GLPAR_FACE_WHAT_ISOSURF_NEG ) frontface_isosurf[glparam.face_what] = glparam.face_frontface; } else if ( glparam.what == GLPAR_BLENDFUNC ) { if ( glparam.blend_what == GLPAR_BLEND_WHAT_ISOSURF ) { if ( is_blend_sfunc ) blend_isosurf.sfunc = glparam.blend_sfunc; if ( is_blend_dfunc ) blend_isosurf.dfunc = glparam.blend_dfunc; } else if ( glparam.what == GLPAR_BLEND_WHAT_COLORPLANE ) { if ( is_blend_sfunc ) blend_colorplane.sfunc = glparam.blend_sfunc; if ( is_blend_dfunc ) blend_colorplane.dfunc = glparam.blend_dfunc; } } else if (glparam.what == GLPAR_FOG ) { CopyGLParVec( XC_GET_RGBA, (float *) fog.color, fogcolor ); } /* if we want the changes to take place we must run * the following functions */ /* THIS IS NOT ENOUGH, BECAUSE in LOADLIGHTS, * GL_POSITION & GL_SPOT DIRECTION are not set, * but are rather set in xcMakeProjection3D * (see below !!!) */ if (togl_exists) { LoadLights(); /* call this explicitly (needed by Fermi-Surfaces) */ LoadStructMaterial(); } /* t.k.: sometimes when some openGL parameters are changed, the lights go crazy; maybe xcMakeProjection3D should be called ???? */ if ( dimType == XC_3D && VPf.stropened ) { if (is.stickmode && !is.ballmode) xcMakeProjection3D("sticks"); if (is.ballmode) xcMakeProjection3D("balls"); if (is.spacefillmode) xcMakeProjection3D("space"); } /* now update display */ /* (*xcDisplay)(); this is now executed in Tcl script by .mesa render */ return TCL_OK; } /*****************************************************************************/ /* XC_GetGLparamCmd --> inplementation of 'xc_getGLparam' custom Tcl command * --------------------- * Usage: xc_getGLparam material \ * -what structure|(isosurf pos|neg|one front|back) \ * -get shininess|specular|ambient|diffuse|emission| \ * def_shininess|def_specular|def_ambient| \ * def_diffuse|def_emission * * or * * xc_getGLparam light \ * -light {v} \ * -get ambient|diffuse|fract_position|specular| \ * spot_dir|spot_exp|spot_cutoff|const_atten \ * lin_atten|quad_atten| * def_* --> '*' means the same as without def_ * possix * * or * * xc_getGLparam lightmodel \ * -get two_side|two_side_iso|ambient|local_viewer| \ * {is_light_enabled }| \ * def_* --> '*' means the same as without def_ * possix * * or * * xc_getGLparam frontface \ * -what isosurf * * or * * xc_getGLparam blendfunc \ * -what isosurf * * or * * xc_getGLparam fog -get fogcolor|def_fogcolor * * WARNING: xc_getGLparam material, xc_getGLparam light, * xc_getGLparam lightmodel return the requested parameters * WHEREAS * xc_getGLparam frontface & xcGLparam blendfunc return: * * xc_getGLparam frontface --> {current_fronface, default_frontface} * xc_getGLparam blendfunc --> {current_sfunc, current_dfunc, * default_sfunc, default_dfunc} */ int XC_GetGLparamCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { int i; char *result = Tcl_Alloc( sizeof(char) * 120 ); struct GLParam { int what; int mat_what; int mat_what_isosurf; int mat_what_isoside; } glparam; boolean specular = 0; boolean shininess = 0; boolean ambient = 0; boolean diffuse = 0; boolean emission = 0; GetGlParam lightN = { 0 }; boolean fract_position= 0; boolean spot_dir = 0; boolean spot_exp = 0; boolean spot_cutoff = 0; boolean const_atten = 0; boolean lin_atten = 0; boolean quad_atten = 0; boolean fogcolor = 0; boolean def_specular = 0; boolean def_shininess = 0; boolean def_ambient = 0; boolean def_diffuse = 0; boolean def_emission = 0; boolean def_fract_position= 0; boolean def_spot_dir = 0; boolean def_spot_exp = 0; boolean def_spot_cutoff = 0; boolean def_const_atten = 0; boolean def_lin_atten = 0; boolean def_quad_atten = 0; boolean def_fogcolor = 0; if ( (argc % 2) != 0 ) { Tcl_SetResult(interp,"Usage: xc_getGLparam material \n\ -what structure|(isosurf pos|neg|one front|back) \n\ -get shininess|specular|ambient|diffuse|emission\n\n\ or\n\n\ xc_getGLparam light -light {v} \n\ -get ambient|diffuse|fract_position|specular|spot_dir|spot_exp|spot_cutoff|const_atten|lin_atten|quad_atten\n\n\ or\n\n\ xc_getGLparam lightmodel -get two_side|two_side_iso|ambient|local_viewer|{is_light_enabled }", TCL_STATIC); return TCL_ERROR; } if ( strcmp(argv[1],"material") == 0 ) { glparam.what = GLPAR_MATERIAL; for (i=2; i\", but got \"%s\", while executing %s %s %s %s ...", argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argvList[1], &light_number) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"expected integer, but got \"%s\", while executing %s %s %s %s ...", argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } else if ( light_number < 0 || light_number > GLPAR_MAXLIGHT ) { char rss[1024]; snprintf(rss, sizeof(rss),"only up to %d lights can be defined, but you try to query light number %d, while executing %s %s %s %s ...", MAX_NUMBER_OF_LIGHTS, light_number, argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } else { sprintf(cln,"%d",light[light_number].isenabled); Tcl_SetResult(interp, cln, TCL_DYNAMIC); return TCL_OK; } } /**********************/ /* GET DEFAULT VALUES */ /**********************/ else if ( strcmp(argv[3],"def_two_side") == 0 ) sprintf(result,"%d", iroundf(def_lightmodel_two_side[0])); else if ( strcmp(argv[3],"def_two_side_iso") == 0 ) sprintf(result,"%d", iroundf(def_lightmodel_two_side_iso[0])); else if ( strcmp(argv[3],"def_ambient") == 0 ) sprintf(result,"%f %f %f %f", def_lightmodel_ambient[0], def_lightmodel_ambient[1], def_lightmodel_ambient[2], def_lightmodel_ambient[3]); else if ( strcmp(argv[3],"def_local_viewer") == 0 ) sprintf(result,"%d", iroundf(def_lightmodel_local_viewer[0])); /* now here comes list ????? */ else if ( strncmp(argv[3],"def_is_light_enabled",4) == 0 ) { int argcList; const char **argvList; int light_number; char *cln = Tcl_Alloc( sizeof(char) * 10 ); Tcl_SplitList(interp, argv[3], &argcList, &argvList); if ( argcList != 2 ) { char rss[1024]; snprintf(rss, sizeof(rss),"expected \"is_light_enabled \", but got \"%s\", while executing %s %s %s %s ...", argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( Tcl_GetInt(interp, argvList[1], &light_number) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss),"expected integer, but got \"%s\", while executing %s %s %s %s ...", argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } else if ( light_number < 0 || light_number > GLPAR_MAXLIGHT ) { char rss[1024]; snprintf(rss, sizeof(rss),"only up to %d lights can be defined, but you try to query light number %d, while executing %s %s %s %s ...", MAX_NUMBER_OF_LIGHTS, light_number, argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } else { if ( light_number == 0 ) sprintf(cln,"%d", 1); else sprintf(cln,"%d", 0); Tcl_SetResult(interp, cln, TCL_DYNAMIC); return TCL_OK; } } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown value \"%s\" for -get option, must be one of \"two_side. two_side_iso, ambient, local_viewer, {is_light_enabled }\", while executing %s %s %s %s ....",argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", must be one of -get, while executing %s %s %s %s ...",argv[3], argv[0], argv[1], argv[2], argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else if ( strcmp(argv[1],"frontface") == 0 ) { char res1[10]; char res2[10]; /* default res1, res2 values */ sprintf(res1,"NULL"); sprintf(res2,"NULL"); if ( strcmp(argv[2],"-what") == 0 ) { if ( strncmp(argv[3],"isosurf_",8) == 0 ) { if ( strcmp(argv[3],"isosurf_one") == 0 || strcmp(argv[3],"isosurf_pos") == 0 ) i = 0; else if ( strcmp(argv[3],"isosurf_neg") == 0 ) i = 1; else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown value \"%s\", must be one of: isosurf_one, isosurf_pos, isosurf_neg; while executing %s %s %s %s", argv[3], argv[0], argv[2], argv[3], argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( frontface_isosurf[i] == GL_CCW ) sprintf(res1,"CCW"); if ( frontface_isosurf[i] == GL_CW ) sprintf(res1,"CW"); if ( def_frontface_isosurf == GL_CCW ) sprintf(res2,"CCW"); if ( def_frontface_isosurf == GL_CW ) sprintf(res2,"CW"); sprintf(result,"%s %s", res1, res2); } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown value \"%s\", must be one of: isosurf_one, isosurf_pos, isosurf_neg; while executing %s %s %s %s", argv[3], argv[0], argv[2], argv[3], argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", must be -what, while executing %s %s %s %s", argv[2], argv[0], argv[2], argv[3], argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else if ( strcmp(argv[1],"blendfunc") == 0 ) { char *res1 = (char *) malloc( sizeof(char) * 30 ); char *res2 = (char *) malloc( sizeof(char) * 30 ); char *res3 = (char *) malloc( sizeof(char) * 30 ); char *res4 = (char *) malloc( sizeof(char) * 30 ); /* default resX values */ sprintf(res1,"NULL"); sprintf(res2,"NULL"); sprintf(res3,"NULL"); sprintf(res4,"NULL"); if ( strcmp(argv[2],"-what") == 0 ) { if ( strcmp(argv[3],"isosurf") == 0 ) { /* CURRENT SOURCE FUNCTION */ if ( blend_isosurf.sfunc == GL_ZERO ) sprintf(res1,"GL_ZERO"); else if ( blend_isosurf.sfunc == GL_ONE ) sprintf(res1,"GL_ONE"); else if ( blend_isosurf.sfunc == GL_DST_COLOR ) sprintf(res1,"GL_DST_COLOR"); else if ( blend_isosurf.sfunc == GL_ONE_MINUS_DST_COLOR ) sprintf(res1,"GL_ONE_MINUS_DST_COLOR"); else if ( blend_isosurf.sfunc == GL_SRC_ALPHA ) sprintf(res1,"GL_SRC_ALPHA"); else if ( blend_isosurf.sfunc == GL_ONE_MINUS_SRC_ALPHA ) sprintf(res1,"GL_ONE_MINUS_SRC_ALPHA"); else if ( blend_isosurf.sfunc == GL_DST_ALPHA ) sprintf(res1,"GL_DST_ALPHA"); else if ( blend_isosurf.sfunc == GL_ONE_MINUS_DST_ALPHA ) sprintf(res1,"GL_ONE_MINUS_DST_ALPHA"); else if ( blend_isosurf.sfunc == GL_SRC_ALPHA_SATURATE ) sprintf(res1,"GL_SRC_ALPHA_SATURATE"); /* CURRENT DESTINATION FUNCTION */ if ( blend_isosurf.dfunc == GL_ZERO ) sprintf(res2,"GL_ZERO"); else if ( blend_isosurf.dfunc == GL_ONE ) sprintf(res2,"GL_ONE"); else if ( blend_isosurf.dfunc == GL_SRC_COLOR ) sprintf(res2,"GL_SRC_COLOR"); else if ( blend_isosurf.dfunc == GL_ONE_MINUS_SRC_COLOR ) sprintf(res2,"GL_ONE_MINUS_SRC_COLOR"); else if ( blend_isosurf.dfunc == GL_SRC_ALPHA ) sprintf(res2,"GL_SRC_ALPHA"); else if ( blend_isosurf.dfunc == GL_ONE_MINUS_SRC_ALPHA ) sprintf(res2,"GL_ONE_MINUS_SRC_ALPHA"); else if ( blend_isosurf.dfunc == GL_DST_ALPHA ) sprintf(res2,"GL_DST_ALPHA"); else if ( blend_isosurf.dfunc == GL_ONE_MINUS_DST_ALPHA ) sprintf(res2,"GL_ONE_MINUS_DST_ALPHA"); /* DEFAULT SOURCE FUNCTION */ if ( def_blend_isosurf.sfunc == GL_ZERO ) sprintf(res3,"GL_ZERO"); else if ( def_blend_isosurf.sfunc == GL_ONE ) sprintf(res3,"GL_ONE"); else if ( def_blend_isosurf.sfunc == GL_DST_COLOR ) sprintf(res3,"GL_DST_COLOR"); else if ( def_blend_isosurf.sfunc == GL_ONE_MINUS_DST_COLOR ) sprintf(res3,"GL_ONE_MINUS_DST_COLOR"); else if ( def_blend_isosurf.sfunc == GL_SRC_ALPHA ) sprintf(res3,"GL_SRC_ALPHA"); else if ( def_blend_isosurf.sfunc == GL_ONE_MINUS_SRC_ALPHA ) sprintf(res3,"GL_ONE_MINUS_SRC_ALPHA"); else if ( def_blend_isosurf.sfunc == GL_DST_ALPHA ) sprintf(res3,"GL_DST_ALPHA"); else if ( def_blend_isosurf.sfunc == GL_ONE_MINUS_DST_ALPHA ) sprintf(res3,"GL_ONE_MINUS_DST_ALPHA"); else if ( def_blend_isosurf.sfunc == GL_SRC_ALPHA_SATURATE ) sprintf(res3,"GL_SRC_ALPHA_SATURATE"); /* DEFAULT DESTINATION FUNCTION */ if ( blend_isosurf.dfunc == GL_ZERO ) sprintf(res4,"GL_ZERO"); else if ( def_blend_isosurf.dfunc == GL_ONE ) sprintf(res4,"GL_ONE"); else if ( def_blend_isosurf.dfunc == GL_SRC_COLOR ) sprintf(res4,"GL_SRC_COLOR"); else if ( def_blend_isosurf.dfunc == GL_ONE_MINUS_SRC_COLOR ) sprintf(res4,"GL_ONE_MINUS_SRC_COLOR"); else if ( def_blend_isosurf.dfunc == GL_SRC_ALPHA ) sprintf(res4,"GL_SRC_ALPHA"); else if ( def_blend_isosurf.dfunc == GL_ONE_MINUS_SRC_ALPHA ) sprintf(res4,"GL_ONE_MINUS_SRC_ALPHA"); else if ( def_blend_isosurf.dfunc == GL_DST_ALPHA ) sprintf(res4,"GL_DST_ALPHA"); else if ( def_blend_isosurf.dfunc == GL_ONE_MINUS_DST_ALPHA ) sprintf(res4,"GL_ONE_MINUS_DST_ALPHA"); /* NOW PRINT ALL RESx to "result" */ sprintf(result,"%s %s %s %s", res1, res2, res3, res4); } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown value \"%s\", must be isosurf, while executing %s %s %s %s", argv[3], argv[0], argv[2], argv[3], argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } free( (void *) res1); free( (void *) res2); free( (void *) res3); free( (void *) res4); } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown option \"%s\", must be -what, while executing %s %s %s %s", argv[3], argv[0], argv[2], argv[3], argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* FOG */ else if ( strcmp(argv[1],"fog") == 0 ) { glparam.what = GLPAR_FOG; if ( strcmp(argv[2],"-get") == 0 ) { if ( strcmp(argv[3],"fogcolor") == 0 ) { fogcolor = 1; } else if ( strcmp(argv[3],"def_fogcolor") == 0 ) { def_fogcolor = 1; } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown value \"%s\", must be fogcolor or def_fogcolor", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown option %s, must be -get", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } else { char rss[1024]; snprintf(rss, sizeof(rss),"unknown argument \"%s\", must be one of material, light, lightmodel, blendfunc or fog, while executing %s %s ...", argv[1], argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /*************************/ /* now updata parameters */ /*************************/ if ( glparam.what == GLPAR_MATERIAL ) { if ( glparam.mat_what == GLPAR_MAT_WHAT_STRUCTURE ) { if ( specular ) sprintf(result,"%f %f %f %f", mat_struct.specular[0], mat_struct.specular[1], mat_struct.specular[2], mat_struct.specular[3]); else if ( shininess ) sprintf(result,"%f",mat_struct.shininess[0]); else if ( ambient ) sprintf(result,"%f %f %f %f", mat_struct.ambient[0], mat_struct.ambient[1], mat_struct.ambient[2], mat_struct.ambient[3]); else if ( diffuse ) sprintf(result,"%f %f %f %f", mat_struct.diffuse[0], mat_struct.diffuse[1], mat_struct.diffuse[2], mat_struct.diffuse[3]); else if ( emission ) sprintf(result,"%f %f %f %f", mat_struct.emission[0], mat_struct.emission[1], mat_struct.emission[2], mat_struct.emission[3]); /* GET DEFAULTS */ else if ( def_specular ) sprintf(result,"%f %f %f %f", def_mat_specular[0], def_mat_specular[1], def_mat_specular[2], def_mat_specular[3]); else if ( def_shininess ) sprintf(result,"%f",def_mat_shininess[0]); else if ( def_ambient ) sprintf(result,"%f %f %f %f", def_mat_ambient[0], def_mat_ambient[1], def_mat_ambient[2], def_mat_ambient[3]); else if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_mat_diffuse[0], def_mat_diffuse[1], def_mat_diffuse[2], def_mat_diffuse[3]); else if ( def_emission ) sprintf(result,"%f %f %f %f", def_mat_emission[0], def_mat_emission[1], def_mat_emission[2], def_mat_emission[3]); /* END -- GET DEFAULTS */ } else if ( glparam.mat_what == GLPAR_MAT_WHAT_ISOSURF ) { int tr; tr = isoDisp.transparent; if ( glparam.mat_what_isosurf == GLPAR_MAT_WHAT_ISOONE ) { if ( glparam.mat_what_isoside == GLPAR_MAT_WHAT_ISOFRONTSIDE ) { if ( specular ) sprintf(result,"%f %f %f %f", front_mat_isosurf[tr].specular[0], front_mat_isosurf[tr].specular[1], front_mat_isosurf[tr].specular[2], front_mat_isosurf[tr].specular[3]); if ( shininess ) sprintf(result,"%f", front_mat_isosurf[tr].shininess[0]); if ( ambient ) sprintf(result,"%f %f %f %f", front_mat_isosurf[tr].ambient[0], front_mat_isosurf[tr].ambient[1], front_mat_isosurf[tr].ambient[2], front_mat_isosurf[tr].ambient[3]); if ( diffuse ) sprintf(result,"%f %f %f %f", front_mat_isosurf[tr].diffuse[0], front_mat_isosurf[tr].diffuse[1], front_mat_isosurf[tr].diffuse[2], front_mat_isosurf[tr].diffuse[3]); if ( emission ) sprintf(result,"%f %f %f %f", front_mat_isosurf[tr].emission[0], front_mat_isosurf[tr].emission[1], front_mat_isosurf[tr].emission[2], front_mat_isosurf[tr].emission[3]); /* GET DEFAULTS */ if ( tr == 0 ) { /* TRANSPARENCY IS TURNED OFF */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_front_mat_specular[0], def_front_mat_specular[1], def_front_mat_specular[2], def_front_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_front_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_front_mat_ambient[0], def_front_mat_ambient[1], def_front_mat_ambient[2], def_front_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_front_mat_diffuse[0], def_front_mat_diffuse[1], def_front_mat_diffuse[2], def_front_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_front_mat_emission[0], def_front_mat_emission[1], def_front_mat_emission[2], def_front_mat_emission[3]); } else { /* TRANSPARENCY IS TURNED OFF */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_blend_front_mat_specular[0], def_blend_front_mat_specular[1], def_blend_front_mat_specular[2], def_blend_front_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_blend_front_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_blend_front_mat_ambient[0], def_blend_front_mat_ambient[1], def_blend_front_mat_ambient[2], def_blend_front_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_blend_front_mat_diffuse[0], def_blend_front_mat_diffuse[1], def_blend_front_mat_diffuse[2], def_blend_front_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_blend_front_mat_emission[0], def_blend_front_mat_emission[1], def_blend_front_mat_emission[2], def_blend_front_mat_emission[3]); } /* END -- GET DEFAULTS */ } else if ( glparam.mat_what_isoside == GLPAR_MAT_WHAT_ISOBACKSIDE ) { if ( specular ) sprintf(result,"%f %f %f %f", back_mat_isosurf[tr].specular[0], back_mat_isosurf[tr].specular[1], back_mat_isosurf[tr].specular[2], back_mat_isosurf[tr].specular[3]); if ( shininess ) sprintf(result,"%f", back_mat_isosurf[tr].shininess[0]); if ( ambient ) sprintf(result,"%f %f %f %f", back_mat_isosurf[tr].ambient[0], back_mat_isosurf[tr].ambient[1], back_mat_isosurf[tr].ambient[2], back_mat_isosurf[tr].ambient[3]); if ( diffuse ) sprintf(result,"%f %f %f %f", back_mat_isosurf[tr].diffuse[0], back_mat_isosurf[tr].diffuse[1], back_mat_isosurf[tr].diffuse[2], back_mat_isosurf[tr].diffuse[3]); if ( emission ) sprintf(result,"%f %f %f %f", back_mat_isosurf[tr].emission[0], back_mat_isosurf[tr].emission[1], back_mat_isosurf[tr].emission[2], back_mat_isosurf[tr].emission[3]); /* GET DEFAULTS */ if ( tr == 0 ) { /* TRANSPARENCY IS TURNED OFF */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_back_mat_specular[0], def_back_mat_specular[1], def_back_mat_specular[2], def_back_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_back_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_back_mat_ambient[0], def_back_mat_ambient[1], def_back_mat_ambient[2], def_back_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_back_mat_diffuse[0], def_back_mat_diffuse[1], def_back_mat_diffuse[2], def_back_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_back_mat_emission[0], def_back_mat_emission[1], def_back_mat_emission[2], def_back_mat_emission[3]); } else { /* TRANSPARENCY IS TURNED ON */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_blend_back_mat_specular[0], def_blend_back_mat_specular[1], def_blend_back_mat_specular[2], def_blend_back_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_blend_back_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_blend_back_mat_ambient[0], def_blend_back_mat_ambient[1], def_blend_back_mat_ambient[2], def_blend_back_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_blend_back_mat_diffuse[0], def_blend_back_mat_diffuse[1], def_blend_back_mat_diffuse[2], def_blend_back_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_blend_back_mat_emission[0], def_blend_back_mat_emission[1], def_blend_back_mat_emission[2], def_blend_back_mat_emission[3]); } /* END -- GET DEFAULTS */ } } else if ( glparam.mat_what_isosurf == GLPAR_MAT_WHAT_ISOPOS ) { if ( glparam.mat_what_isoside == GLPAR_MAT_WHAT_ISOFRONTSIDE ) { if ( specular ) sprintf(result,"%f %f %f %f", front_mat_pos_isosurf[tr].specular[0], front_mat_pos_isosurf[tr].specular[1], front_mat_pos_isosurf[tr].specular[2], front_mat_pos_isosurf[tr].specular[3]); if ( shininess ) sprintf(result,"%f", front_mat_pos_isosurf[tr].shininess[0]); if ( ambient ) sprintf(result,"%f %f %f %f", front_mat_pos_isosurf[tr].ambient[0], front_mat_pos_isosurf[tr].ambient[1], front_mat_pos_isosurf[tr].ambient[2], front_mat_pos_isosurf[tr].ambient[3]); if ( diffuse ) sprintf(result,"%f %f %f %f", front_mat_pos_isosurf[tr].diffuse[0], front_mat_pos_isosurf[tr].diffuse[1], front_mat_pos_isosurf[tr].diffuse[2], front_mat_pos_isosurf[tr].diffuse[3]); if ( emission ) sprintf(result,"%f %f %f %f", front_mat_pos_isosurf[tr].emission[0], front_mat_pos_isosurf[tr].emission[1], front_mat_pos_isosurf[tr].emission[2], front_mat_pos_isosurf[tr].emission[3]); /* GET DEFAULTS */ if ( tr == 0 ) { /* TRANSPARENCY IS TURNED OFF */ /* for SPECULAR & SHININESS componenets there are no * special-designed parameters, use def_front_mat_* */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_front_mat_specular[0], def_front_mat_specular[1], def_front_mat_specular[2], def_front_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_front_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_pos_front_mat_ambient[0], def_pos_front_mat_ambient[1], def_pos_front_mat_ambient[2], def_pos_front_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_pos_front_mat_diffuse[0], def_pos_front_mat_diffuse[1], def_pos_front_mat_diffuse[2], def_pos_front_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_pos_front_mat_emission[0], def_pos_front_mat_emission[1], def_pos_front_mat_emission[2], def_pos_front_mat_emission[3]); } else { /* TRANSPARENCY IS TURNED ON */ /* for SPECULAR & SHININESS componenets there are no * special-designed parameters, use def_front_mat_* */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_blend_front_mat_specular[0], def_blend_front_mat_specular[1], def_blend_front_mat_specular[2], def_blend_front_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_blend_front_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_blend_pos_front_mat_ambient[0], def_blend_pos_front_mat_ambient[1], def_blend_pos_front_mat_ambient[2], def_blend_pos_front_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_blend_pos_front_mat_diffuse[0], def_blend_pos_front_mat_diffuse[1], def_blend_pos_front_mat_diffuse[2], def_blend_pos_front_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_blend_pos_front_mat_emission[0], def_blend_pos_front_mat_emission[1], def_blend_pos_front_mat_emission[2], def_blend_pos_front_mat_emission[3]); } /* END -- GET DEFAULTS */ } else if ( glparam.mat_what_isoside == GLPAR_MAT_WHAT_ISOBACKSIDE ) { if ( specular ) sprintf(result,"%f %f %f %f", back_mat_pos_isosurf[tr].specular[0], back_mat_pos_isosurf[tr].specular[1], back_mat_pos_isosurf[tr].specular[2], back_mat_pos_isosurf[tr].specular[3]); if ( shininess ) sprintf(result,"%f", front_mat_pos_isosurf[tr].shininess[0]); if ( ambient ) sprintf(result,"%f %f %f %f", back_mat_pos_isosurf[tr].ambient[0], back_mat_pos_isosurf[tr].ambient[1], back_mat_pos_isosurf[tr].ambient[2], back_mat_pos_isosurf[tr].ambient[3]); if ( diffuse ) sprintf(result,"%f %f %f %f", back_mat_pos_isosurf[tr].diffuse[0], back_mat_pos_isosurf[tr].diffuse[1], back_mat_pos_isosurf[tr].diffuse[2], back_mat_pos_isosurf[tr].diffuse[3]); if ( emission ) sprintf(result,"%f %f %f %f", back_mat_pos_isosurf[tr].emission[0], back_mat_pos_isosurf[tr].emission[1], back_mat_pos_isosurf[tr].emission[2], back_mat_pos_isosurf[tr].emission[3]); /* GET DEFAULTS */ if ( tr == 0 ) { /* TRANSPARENCY IS TURNED OFF */ /* for SPECULAR & SHININESS componenets there are no * special-designed parameters, use def_back_mat_* */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_back_mat_specular[0], def_back_mat_specular[1], def_back_mat_specular[2], def_back_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_back_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_pos_back_mat_ambient[0], def_pos_back_mat_ambient[1], def_pos_back_mat_ambient[2], def_pos_back_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_pos_back_mat_diffuse[0], def_pos_back_mat_diffuse[1], def_pos_back_mat_diffuse[2], def_pos_back_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_pos_back_mat_emission[0], def_pos_back_mat_emission[1], def_pos_back_mat_emission[2], def_pos_back_mat_emission[3]); } else { /* TRANSPARENCY IS TURNED ON */ /* for SPECULAR & SHININESS componenets there are no * special-designed parameters, use def_back_mat_* */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_blend_back_mat_specular[0], def_blend_back_mat_specular[1], def_blend_back_mat_specular[2], def_blend_back_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_blend_back_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_blend_pos_back_mat_ambient[0], def_blend_pos_back_mat_ambient[1], def_blend_pos_back_mat_ambient[2], def_blend_pos_back_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_blend_pos_back_mat_diffuse[0], def_blend_pos_back_mat_diffuse[1], def_blend_pos_back_mat_diffuse[2], def_blend_pos_back_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_blend_pos_back_mat_emission[0], def_blend_pos_back_mat_emission[1], def_blend_pos_back_mat_emission[2], def_blend_pos_back_mat_emission[3]); } /* END -- GET DEFAULTS */ } } else if ( glparam.mat_what_isosurf == GLPAR_MAT_WHAT_ISONEG ) { if ( glparam.mat_what_isoside == GLPAR_MAT_WHAT_ISOFRONTSIDE ) { if ( specular ) sprintf(result,"%f %f %f %f", front_mat_neg_isosurf[tr].specular[0], front_mat_neg_isosurf[tr].specular[1], front_mat_neg_isosurf[tr].specular[2], front_mat_neg_isosurf[tr].specular[3]); if ( shininess ) sprintf(result,"%f", front_mat_neg_isosurf[tr].shininess[0]); if ( ambient ) sprintf(result,"%f %f %f %f", front_mat_neg_isosurf[tr].ambient[0], front_mat_neg_isosurf[tr].ambient[1], front_mat_neg_isosurf[tr].ambient[2], front_mat_neg_isosurf[tr].ambient[3]); if ( diffuse ) sprintf(result,"%f %f %f %f", front_mat_neg_isosurf[tr].diffuse[0], front_mat_neg_isosurf[tr].diffuse[1], front_mat_neg_isosurf[tr].diffuse[2], front_mat_neg_isosurf[tr].diffuse[3]); if ( emission ) sprintf(result,"%f %f %f %f", front_mat_neg_isosurf[tr].emission[0], front_mat_neg_isosurf[tr].emission[1], front_mat_neg_isosurf[tr].emission[2], front_mat_neg_isosurf[tr].emission[3]); /* GET DEFAULTS */ if ( tr == 0 ) { /* TRANSPARENCY IS TURNED OFF */ /* for SPECULAR & SHININESS componenets there are no * special-designed parameters, use def_front_mat_* */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_front_mat_specular[0], def_front_mat_specular[1], def_front_mat_specular[2], def_front_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_front_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_neg_front_mat_ambient[0], def_neg_front_mat_ambient[1], def_neg_front_mat_ambient[2], def_neg_front_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_neg_front_mat_diffuse[0], def_neg_front_mat_diffuse[1], def_neg_front_mat_diffuse[2], def_neg_front_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_neg_front_mat_emission[0], def_neg_front_mat_emission[1], def_neg_front_mat_emission[2], def_neg_front_mat_emission[3]); } else { /* TRANSPARENCY IS TURNED ON */ /* for SPECULAR & SHININESS componenets there are no * special-designed parameters, use def_front_mat_* */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_blend_front_mat_specular[0], def_blend_front_mat_specular[1], def_blend_front_mat_specular[2], def_blend_front_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_blend_front_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_blend_neg_front_mat_ambient[0], def_blend_neg_front_mat_ambient[1], def_blend_neg_front_mat_ambient[2], def_blend_neg_front_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_blend_neg_front_mat_diffuse[0], def_blend_neg_front_mat_diffuse[1], def_blend_neg_front_mat_diffuse[2], def_blend_neg_front_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_blend_neg_front_mat_emission[0], def_blend_neg_front_mat_emission[1], def_blend_neg_front_mat_emission[2], def_blend_neg_front_mat_emission[3]); } /* END -- GET DEFAULTS */ } else if ( glparam.mat_what_isoside == GLPAR_MAT_WHAT_ISOBACKSIDE ) { if ( specular ) sprintf(result,"%f %f %f %f", back_mat_neg_isosurf[tr].specular[0], back_mat_neg_isosurf[tr].specular[1], back_mat_neg_isosurf[tr].specular[2], back_mat_neg_isosurf[tr].specular[3]); if ( shininess ) sprintf(result,"%f", back_mat_neg_isosurf[tr].shininess[0]); if ( ambient ) sprintf(result,"%f %f %f %f", back_mat_neg_isosurf[tr].ambient[0], back_mat_neg_isosurf[tr].ambient[1], back_mat_neg_isosurf[tr].ambient[2], back_mat_neg_isosurf[tr].ambient[3]); if ( diffuse ) sprintf(result,"%f %f %f %f", back_mat_neg_isosurf[tr].diffuse[0], back_mat_neg_isosurf[tr].diffuse[1], back_mat_neg_isosurf[tr].diffuse[2], back_mat_neg_isosurf[tr].diffuse[3]); if ( emission ) sprintf(result,"%f %f %f %f", back_mat_neg_isosurf[tr].emission[0], back_mat_neg_isosurf[tr].emission[1], back_mat_neg_isosurf[tr].emission[2], back_mat_neg_isosurf[tr].emission[3]); /* GET DEFAULTS */ if ( tr == 0 ) { /* TRANSPARENCY IS TURNED OFF */ /* for SPECULAR & SHININESS componenets there are no * special-designed parameters, use def_back_mat_* */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_back_mat_specular[0], def_back_mat_specular[1], def_back_mat_specular[2], def_back_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_back_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_neg_back_mat_ambient[0], def_neg_back_mat_ambient[1], def_neg_back_mat_ambient[2], def_neg_back_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_neg_back_mat_diffuse[0], def_neg_back_mat_diffuse[1], def_neg_back_mat_diffuse[2], def_neg_back_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_neg_back_mat_emission[0], def_neg_back_mat_emission[1], def_neg_back_mat_emission[2], def_neg_back_mat_emission[3]); } else { /* TRANSPARENCY IS TURNED ON */ /* for SPECULAR & SHININESS componenets there are no * special-designed parameters, use def_back_mat_* */ if ( def_specular ) sprintf(result,"%f %f %f %f", def_blend_back_mat_specular[0], def_blend_back_mat_specular[1], def_blend_back_mat_specular[2], def_blend_back_mat_specular[3]); if ( def_shininess ) sprintf(result,"%f", def_blend_back_mat_shininess[0]); if ( def_ambient ) sprintf(result,"%f %f %f %f", def_blend_neg_back_mat_ambient[0], def_blend_neg_back_mat_ambient[1], def_blend_neg_back_mat_ambient[2], def_blend_neg_back_mat_ambient[3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_blend_neg_back_mat_diffuse[0], def_blend_neg_back_mat_diffuse[1], def_blend_neg_back_mat_diffuse[2], def_blend_neg_back_mat_diffuse[3]); if ( def_emission ) sprintf(result,"%f %f %f %f", def_blend_neg_back_mat_emission[0], def_blend_neg_back_mat_emission[1], def_blend_neg_back_mat_emission[2], def_blend_neg_back_mat_emission[3]); } /* END -- GET DEFAULTS */ } } } } else if ( glparam.what == GLPAR_LIGHT ) { /* if -light option wasn't present all data regard to GL_LIGHT0 */ int il = 0; if ( lightN.is ) { il = (int) lightN.vec[0]; if ( il < 0 || il > GLPAR_MAXLIGHT ) { char rss[1024]; snprintf(rss, sizeof(rss),"light number %d is out of range, should be between 0 and %d",il, GLPAR_MAXLIGHT); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } if ( ambient ) sprintf(result,"%f %f %f %f", light[il].ambient[0], light[il].ambient[1], light[il].ambient[2], light[il].ambient[3]); if ( diffuse ) sprintf(result,"%f %f %f %f", light[il].diffuse[0], light[il].diffuse[1], light[il].diffuse[2], light[il].diffuse[3]); if ( specular ) sprintf(result,"%f %f %f %f", light[il].specular[0], light[il].specular[1], light[il].specular[2], light[il].specular[3]); if ( fract_position ) sprintf(result,"%f %f %f %f", light[il].fract_position[0], light[il].fract_position[1], light[il].fract_position[2], light[il].fract_position[3]); if ( spot_dir ) sprintf(result,"%f %f %f", light[il].spot_dir[0], light[il].spot_dir[1], light[il].spot_dir[2]); if ( spot_exp ) sprintf(result,"%f", light[il].spot_exp[0]); if ( spot_cutoff ) sprintf(result,"%f", light[il].spot_cutoff[0]); if ( const_atten ) sprintf(result,"%f", light[il].const_atten[0]); if ( lin_atten ) sprintf(result,"%f", light[il].lin_atten[0]); if ( quad_atten ) sprintf(result,"%f", light[il].quad_atten[0]); /* GET DEFAULTS */ if ( def_ambient ) sprintf(result,"%f %f %f %f", def_light_ambient[il][0], def_light_ambient[il][1], def_light_ambient[il][2], def_light_ambient[il][3]); if ( def_diffuse ) sprintf(result,"%f %f %f %f", def_light_diffuse[il][0], def_light_diffuse[il][1], def_light_diffuse[il][2], def_light_diffuse[il][3]); if ( def_specular ) sprintf(result,"%f %f %f %f", def_light_specular[il][0], def_light_specular[il][1], def_light_specular[il][2], def_light_specular[il][3]); if ( def_fract_position ) sprintf(result,"%f %f %f %f", def_light_fract_position[il][0], def_light_fract_position[il][1], def_light_fract_position[il][2], def_light_fract_position[il][3]); if ( def_spot_dir ) sprintf(result,"%f %f %f", def_light_spotdir[il][0], def_light_spotdir[il][1], def_light_spotdir[il][2]); if ( def_spot_exp ) sprintf(result,"%f", def_light_spot_exp[il][0]); if ( def_spot_cutoff ) sprintf(result,"%f", def_light_spot_cutoff[il][0]); if ( def_const_atten ) sprintf(result,"%f", def_light_const_atten[il][0]); if ( def_lin_atten ) sprintf(result,"%f", def_light_lin_atten[il][0]); if ( def_quad_atten ) sprintf(result,"%f", def_light_quad_atten[il][0]); } else if ( glparam.what == GLPAR_FOG ) { if ( fogcolor ) { sprintf(result,"%f %f %f %f", fog.color[0], fog.color[1], fog.color[2], fog.color[3]); } else if ( def_fogcolor ) { sprintf(result,"%f %f %f %f", def_fog_color[0], def_fog_color[1], def_fog_color[2], def_fog_color[3]); } } /* now set the result */ Tcl_SetResult(interp, result, TCL_DYNAMIC); return TCL_OK; } int xcSplitList( int code, Tcl_Interp *interp, const char *argv[], GetGlParam *var) { int i, inte, imax = 1; int argcList; const char **argvList; double val[20]; if ( code == XC_GET_RGBA ) imax = 4; if ( code == XC_GET_XYZW ) imax = 4; if ( code == XC_GET_XYZ ) imax = 3; if ( code == XC_GET_RGB ) imax = 3; if ( code == XC_GET_FLOAT ) imax = 1; if ( code == XC_GET_FLOAT2 ) imax = 2; if ( code == XC_GET_FLOAT4 ) imax = 4; if ( code == XC_GET_FLOAT6 ) imax = 6; if ( code == XC_GET_FLOAT12 ) imax = 12; if ( code == XC_GET_INT ) imax = 1; if ( code == XC_GET_INT3 ) imax = 3; if ( code == XC_GET_INT12 ) imax = 12; Tcl_SplitList(interp, argv[0], &argcList, &argvList); if ( argcList != imax ) { xcTclListError( code, interp, argv ); return XC_ERROR; } if ( code != XC_GET_INT && code != XC_GET_INT3 && code != XC_GET_INT12 ) { for (i=0; ivec[i] = (float) val[i]; } } else { for (i=0; ivec[i] = (float) inte; } } /* var->vec has been assigned, so put vec->is to 1 */ var->is = 1; return XC_OK; } void xcTclListError( int code, Tcl_Interp *interp, const char **argv ) { if ( code == XC_GET_RGBA ) { char rss[1024]; snprintf(rss, sizeof(rss),"invalid format of RGBA list, should be {r g b a}; while evaluating option %s %s", argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); } if ( code == XC_GET_XYZ ) { char rss[1024]; snprintf(rss, sizeof(rss),"invalid format of XYZ list, should be {x y z}; while evaluating option %s %s", argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); } if ( code == XC_GET_XYZW ) { char rss[1024]; snprintf(rss, sizeof(rss),"invalid format of XYZW list, should be {x y z w}; while evaluating option %s %s", argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); } if ( code == XC_GET_FLOAT ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted float, but got %s, while evaluating %s %s", argv[1], argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); } if ( code == XC_GET_INT ) { char rss[1024]; snprintf(rss, sizeof(rss),"wanted integer, \ but got %s, while evaluating %s %s", argv[1], argv[0], argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); } } static void CopyGLParVec(int code, float *mat, GetGlParam par) { int i, imax = 1; if ( code == XC_GET_RGBA ) imax = 4; if ( code == XC_GET_XYZ ) imax = 3; if ( code == XC_GET_XYZW) imax = 4; if ( code == XC_GET_FLOAT ) imax = 1; if ( code == XC_GET_INT ) imax = 1; if ( code == XC_GET_INT3 ) imax = 3; if ( code == XC_GET_INT12 ) imax = 12; for (i=0; i #include typedef void (*sighandler_t)(int); static sighandler_t FPEHandler(int signum); void xcFPEHandler(void) { sighandler_t FPEHandler(int signum); signal(SIGFPE, (sighandler_t) FPEHandler); } static sighandler_t FPEHandler(int signum) { static int first_time = 1; if (first_time) { fprintf(stderr, "Warning: Floating Point Exception occurred - Ignoring !!!\n", NULL); first_time = 0; } return SIG_IGN; } #else void xcFPEHandler(void) { ; } #endif xcrysden-1.6.2/C/cells.c0000644000175000017500000000602012357441301013501 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/cells.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define XC_CPP_NO_STDIO #include "struct.h" #define CON13 0.333333333333333 #define CON23 0.666666666666667 float pc[4][3] = { {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0} }; float ac[4][3] = { {0.0, 0.0, 0.0}, {0.0, 0.5, 0.5}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0} }; float bc[4][3] = { {0.0, 0.0, 0.0}, {0.5, 0.0, 0.5}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0} }; float cc[4][3] = { {0.0, 0.0, 0.0}, {0.5, 0.5, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0} }; float fc[4][3] = { {0.0, 0.0, 0.0}, {0.5, 0.5, 0.0}, {0.0, 0.5, 0.5}, {0.5, 0.0, 0.5} }; float ic[4][3] = { {0.0, 0.0, 0.0}, {0.5, 0.5, 0.5}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0} }; float rc[4][3] = { {0.0, 0.0, 0.0}, {CON23, CON13, CON13}, {CON13, CON23, CON23}, {0.0, 0.0, 0.0} }; float hc[4][3] = { {0.0, 0.0, 0.0}, {CON23, CON13, 0.0}, {CON13, CON23, 0.0}, {0.0, 0.0, 0.0} }; float tnrc[4][3] = { {0.0, 0.0, 0.0}, {CON23, CON13, 0.0}, {CON13, CON23, 0.0}, {0.0, 0.0, 0.0} }; /* load the positions within all cell types; for more detailed descriptions look at gengeom.f */ void CellTypes(void) { int i, j; for (i=0; i<4; i++) for (j=0; j<3; j++) { xcr.cellpos[XCR_CELL_PC][i][j] = pc[i][j]; xcr.cellpos[XCR_CELL_AC][i][j] = ac[i][j]; xcr.cellpos[XCR_CELL_BC][i][j] = bc[i][j]; xcr.cellpos[XCR_CELL_CC][i][j] = cc[i][j]; xcr.cellpos[XCR_CELL_FC][i][j] = fc[i][j]; xcr.cellpos[XCR_CELL_IC][i][j] = ic[i][j]; xcr.cellpos[XCR_CELL_RC][i][j] = rc[i][j]; xcr.cellpos[XCR_CELL_HC][i][j] = hc[i][j]; xcr.cellpos[XCR_CELL_TNRC][i][j] = tnrc[i][j]; } xcr.npos[XCR_CELL_PC] = XCR_CELL_IPC; xcr.npos[XCR_CELL_AC] = XCR_CELL_IAC; xcr.npos[XCR_CELL_BC] = XCR_CELL_IBC; xcr.npos[XCR_CELL_CC] = XCR_CELL_ICC; xcr.npos[XCR_CELL_FC] = XCR_CELL_IFC; xcr.npos[XCR_CELL_IC] = XCR_CELL_IIC; xcr.npos[XCR_CELL_RC] = XCR_CELL_IRC; xcr.npos[XCR_CELL_HC] = XCR_CELL_IHC; xcr.npos[XCR_CELL_TNRC] = XCR_CELL_ITNRC; } xcrysden-1.6.2/C/xcFont.c0000644000175000017500000006572113516060236013657 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcFont.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** TODO: 4. make a routine for mapping TkFont -> XLFD and finding correct normal/bold/medium/oblique/italic/roman */ #ifndef WIN32 # define TOGL_X11 # define X11 #else # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN # include #endif #include #include #include #include #include #include #include #ifdef WIN32 # include #endif #ifndef WIN32 # include #endif #include "struct.h" #include "xcGLparam.h" #include "memory.h" #include "xcfunc.h" #define XC_FONT_TKYES_XNO 999 extern GLuint fontOffset; extern RasterFontSize rf; AtomicLabel globalAtomLabel = { 0, 0, 0, {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, XC_YES, (char*)NULL, (Tk_Font)NULL }; AtomicLabel *atomLabel = (AtomicLabel*)NULL; short *do_not_display_atomlabel = (short*)NULL; /* apply to all kind of labels default and custom */ struct xcToglFont { char *font; Tk_Font tkfont; GLuint base; int height; int width; struct xcToglFont *prev; }; static struct xcToglFont *xcFont, *xcFontPtr = (struct xcToglFont*) NULL; typedef struct { char *font; char *string; Tk_Font tkfont; int height; int width; } FontType; /* xcFont.c */ int XC_SetFontCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_SetAtomLabelCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_ClearAtomLabelCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); int XC_QueryFontCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); void xcFont_PrintString(const char *s); void xcTkFontFreeAll(void); GLuint Togl_LoadBitmapFontOld(const Togl *togl, const char *fontname); void Togl_UnloadBitmapFontOld(const Togl *togl, GLuint fontbase); static void _clearAtomLabel(int atomID); static int _setFontColor(Tcl_Interp *interp, int argc, int bright_ind, const char *bright_argv, int dark_ind, const char *dark_argv, AtomicLabel *alabel); static void xcFont_addNew(struct xcToglFont *f, struct Togl *togl, FontType this); static struct xcToglFont *xcFont_find(char *font); static int _assignFont(int font_found, struct Togl *togl, const char *fontString, FontType thisFont); /* ------------------------------------------------------------------------ * * xc_setfont $togl XLFD_fontname|tkfontname ?bright-fontcolor? ?dark-fontcolor? * * Format of bright-fontcolor & dark-fontcolor is RGB, where the * components are within [0-1]. * ------------------------------------------------------------------------ */ int XC_SetFontCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; FontType thisFont; int result, font_found = 0; if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (argc < 3 || argc > 5) { char rss[1024]; snprintf(rss, sizeof(rss), "wrong number of arguments, should be xc_setfont togl togl_font ?bright-fontcolor? ?dark-fontcolor?"); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* assign the font color first */ if ( _setFontColor(interp, argc, 3, argv[3], 4, argv[4], &globalAtomLabel) == TCL_ERROR ) { return TCL_ERROR; } /* now parse the font-name */ if (strlen(argv[2]) > 0) { /* int i; for (i=0; i < NFONTS; i++) { if ( strcmp (argv[2], fontType[i].string) == 0 ) { thisFont.font = fontType[i].font; thisFont.height = fontType[i].height; thisFont.width = fontType[i].width; font_found = 1; break; } } */ result = _assignFont(font_found, togl, argv[2], thisFont); /*fprintf(stderr,"_assignFont = %d\n", result);*/ if ( result == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't load font %s", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } else if ( result == XC_FONT_TKYES_XNO ) { return TCL_OK; } else { /* xcFont should exists by now */ if ( !xcFont->base ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't load font %s", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } /* the font setting was successful, update the globalAtomLabel */ globalAtomLabel.base = xcFont->base; globalAtomLabel.tkfont = xcFont->tkfont; globalAtomLabel.height = xcFont->height; globalAtomLabel.width = xcFont->width; globalAtomLabel.do_display = XC_YES; /* fprintf(stderr, "FONT-INFO:: (xcFontPtr=%d)\n", xcFontPtr); fprintf(stderr, " base=%d\n tkfont=%d\n h=%d, w=%d\n", xcFont->base, &xcFont->tkfont, xcFont->height, xcFont->width); */ } Togl_PostRedisplay (togl); return TCL_OK; } /* ------------------------------------------------------------------------ xc_setatomlabel togl atomID labelString ?XLFD_fontname? ?bright-fontcolor? ?dark-fontcolor? dark-fontcolor == color for ballstick+spacefill for lighting-Off display modes bright-fontcolor == color for the rest of display modes ------------------------------------------------------------------------ */ int XC_SetAtomLabelCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; FontType thisFont; int atomID; if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (argc < 4 || argc > 7) { char rss[1024]; snprintf(rss, sizeof(rss), "wrong number of arguments, must be xc_setatomlabel togl atomID labelString ?font? ?fontColor1? ?fontColor2?"); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (Tcl_GetInt(interp, argv[2], &atomID) == TCL_ERROR) { char rss[1024]; snprintf(rss, sizeof(rss), "wanted integer but got %s", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( atomID < 1 || atomID > natoms ) { char rss[1024]; snprintf(rss, sizeof(rss), "atomID %d out of range, should be within [1,%d]", atomID, natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* copy the atom label */ atomLabel[atomID].label = (char*) xcRealloc ( atomLabel[atomID].label, sizeof(char)*((size_t) strlen(argv[3])+1) ); strcpy(atomLabel[atomID].label, argv[3]); if ( argc >= 5 && strlen(argv[4]) > 0 ) { int result; result = _assignFont(0, togl, argv[4], thisFont); /*fprintf(stderr,"_assignFont = %d\n", result);*/ if ( result == TCL_ERROR || !xcFont->base) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't load font %s", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } else if ( result == XC_FONT_TKYES_XNO ) { return TCL_OK; } /* now assign the font */ /* fprintf(stderr,"1-base:: %d\n", xcFont->base); */ atomLabel[atomID].base = xcFont->base; atomLabel[atomID].tkfont = xcFont->tkfont; atomLabel[atomID].height = xcFont->height; atomLabel[atomID].width = xcFont->width; } else if (!xcFontPtr) { /* default font */ /* fprintf(stderr,"2-base:: %d\n", fontOffset); */ atomLabel[atomID].base = fontOffset; atomLabel[atomID].tkfont = (Tk_Font)NULL; atomLabel[atomID].height = rf.height; atomLabel[atomID].width = rf.wid; } else { /* assign the last font loaded global font */ /* fprintf(stderr,"3-base:: %d\n", xcFontPtr->base); */ atomLabel[atomID].base = xcFontPtr->base; atomLabel[atomID].tkfont = xcFontPtr->tkfont; atomLabel[atomID].height = xcFontPtr->height; atomLabel[atomID].width = xcFontPtr->width; } atomLabel[atomID].do_display = XC_YES; /* assign the font color */ if ( _setFontColor(interp, argc, 5, argv[5], 6, argv[6], atomLabel + atomID) == TCL_ERROR ) { return TCL_ERROR; } Togl_PostRedisplay (togl); return TCL_OK; } /* ------------------------------------------------------------------------ xc_clearatomlabel togl atomID ?atomID? ... or xc_clearatomlabel togl all ------------------------------------------------------------------------ */ int XC_ClearAtomLabelCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; int i; if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (argc < 3 ) { char rss[1024]; snprintf(rss, sizeof(rss), "Usage:\n xc_clearatomlabels togl atomID ?atomID? ...\n or \n togl xc_cleanatomlabels all"); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( strcmp(argv[2], "all") == 0 ) { /* the "xc_cleanatomlabels all form" */ for (i=1; i<=natoms; i++) _clearAtomLabel(i); } else { int atomID; for (i=2; i natoms ) { char rss[1024]; snprintf(rss, sizeof(rss), "atom index %d out of range, should be between [0,%d]", atomID, natoms); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } _clearAtomLabel(atomID); } } Togl_PostRedisplay (togl); return TCL_OK; } static void _clearAtomLabel(int atomID) { atomLabel[atomID].base = 0; atomLabel[atomID].do_display = XC_NO; xcFree(atomLabel[atomID].label); atomLabel[atomID].label = (char*)NULL; } /* ------------------------------------------------------------------------ * * $togl xc_queryfont togl XLFD_fontname * * Format of bright-fontcolor & dark-fontcolor is RGB, where the * components are within [0-1]. * ------------------------------------------------------------------------ */ int XC_QueryFontCb(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { Togl *togl; FontType thisFont; int result, font_found = 0; if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[3]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (argc != 3) { char rss[1024]; snprintf(rss, sizeof(rss), "wrong number of arguments, should be xc_queryfont togl XLFD_fontname"); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } result = _assignFont(font_found, togl, argv[2], thisFont); /* fprintf(stderr,"_assignFont = %d\n", result); */ if ( result == XC_FONT_TKYES_XNO ) { return TCL_OK; } else if ( result == TCL_ERROR ) { char *result = Tcl_Alloc (sizeof(char) * 3); sprintf(result, "-1"); Tcl_SetResult(interp, result, TCL_DYNAMIC); } else { /* xcFont should exists by now */ if ( xcFont->base ) { char *result = Tcl_Alloc (sizeof(char) * 3); sprintf(result, "+1"); Tcl_SetResult(interp, result, TCL_DYNAMIC); } else { char *result = Tcl_Alloc (sizeof(char) * 3); sprintf(result, "-1"); Tcl_SetResult(interp, result, TCL_DYNAMIC); } } return TCL_OK; } void xcFont_PrintString (const char *s) { glCallLists( strlen(s), GL_UNSIGNED_BYTE, s ); } void xcTkFontFreeAll(void) { struct xcToglFont *f = xcFontPtr; while (f) { if (f->tkfont) Tk_FreeFont (f->tkfont); f = f->prev; } } static int _setFontColor(Tcl_Interp *interp, int argc, int bright_ind, const char *bright_argv, int dark_ind, const char *dark_argv, AtomicLabel *alabel) { GetGlParam bright, dark; if ( argc > bright_ind && strlen(bright_argv) > 0 ) { if ( ! xcSplitList( XC_GET_RGB, interp, &bright_argv, &bright ) ) { char rss[1024]; snprintf(rss, sizeof(rss), "error parsing bright font color, should be {red green blue}, but got %s", bright_argv); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } COPY_V(3, alabel->bright_color, bright.vec); } if ( argc > dark_ind && strlen(dark_argv) > 0 ) { if ( ! xcSplitList( XC_GET_RGB, interp, &dark_argv, &dark ) ) { char rss[1024]; snprintf(rss, sizeof(rss), "error parsing dark font color, should be {red green blue}, but got %s", dark_argv); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } COPY_V(3, alabel->dark_color, dark.vec); } return TCL_OK; } static void xcFont_addNew(struct xcToglFont *f, struct Togl *togl, FontType this) { f->font = this.font; f->base = Togl_LoadBitmapFontOld (togl, this.font); /*fprintf(stderr, "f->base==%d\n", f->base);*/ f->tkfont = this.tkfont; f->height = this.height; f->width = this.width; f->prev = xcFontPtr; xcFontPtr = f; } static struct xcToglFont *xcFont_find(char *font) { struct xcToglFont *f = xcFontPtr; while (f) { /*fprintf(stderr, "f: %s %s\n", font, f->font);*/ if (strcmp(font,f->font) == 0) return f; f = f->prev; } return (struct xcToglFont*) NULL; } #ifdef WIN32 /* * The following structure represents Windows' implementation of a font. */ typedef struct { Tk_Font font; /* Stuff used by generic font package. Must * be first in structure. */ HFONT hFont; /* Windows information about font. */ HWND hwnd; /* Toplevel window of application that owns * this font, used for getting HDC. */ int widths[256]; /* Widths of first 256 chars in this font. */ } WinFont; #include "togl_struct.h" #endif /* WIN32 */ static int _assignFont(int font_found, struct Togl *togl, const char *fontString, FontType thisFont) { struct xcToglFont *_font; #ifndef WIN32 /* X11 */ XFontStruct *fontinfo; #else /* WIN32 */ WinFont *winfont; TEXTMETRIC tm; #endif if (!font_found) { Tcl_Interp *interp = Togl_Interp(togl); /* use the Tk-wrapper to prevent segmentation-fault of XLoadQueryFont when font-name is invalid */ Tk_Font tkfont; tkfont = Tk_GetFont(interp, Togl_TkWin(togl), fontString); /*fprintf(stderr,"*** _assignFont: tkfont == %d\n", tkfont);*/ if (!tkfont) { return TCL_ERROR; } /*_font = Tk_NameOfFont (tkfont);*/ #ifndef WIN32 /* X11 */ fontinfo = (XFontStruct *) XLoadQueryFont( Tk_Display(Togl_TkWin(togl)), fontString ); if (!fontinfo) { char *result = Tcl_Alloc (sizeof(char) * 3); sprintf(result, "-1"); Tk_FreeFont (tkfont); Tcl_SetResult(interp, result, TCL_DYNAMIC); return XC_FONT_TKYES_XNO; } thisFont.height = fontinfo->max_bounds.ascent - fontinfo->max_bounds.descent; thisFont.width = fontinfo->max_bounds.rbearing - fontinfo->max_bounds.lbearing; #else /* WIN32 */ /*HFONT oldFont;*/ /*oldFont = SelectObject(togl->tglGLHdc, winfont->hFont);*/ winfont = (WinFont*) tkfont; if (!winfont) { return 0; } SelectObject(togl->tglGLHdc, winfont->hFont); GetTextMetrics(togl->tglGLHdc, &tm); /*fontString = Tk_NameOfFont(tkfont); fprintf(stderr,"FONT-STRING: %s\n", fontString);*/ thisFont.height = tm.tmHeight - tm.tmInternalLeading; thisFont.width = tm.tmAveCharWidth; #endif thisFont.font = (char*) xcMalloc(sizeof(char) * (strlen(fontString)+1)); strcpy(thisFont.font, fontString); thisFont.tkfont = tkfont; } /* now find if the font was already loaded */ _font = xcFont_find(thisFont.font); /*fprintf(stderr,"Font12: %d , %s\n", _font, thisFont.font); fflush(stderr);*/ if ( !_font ) { /* the font was not yet loaded */ xcFont = (struct xcToglFont *) xcMalloc ( sizeof (struct xcToglFont) ); xcFont_addNew (xcFont, togl, thisFont); } else { /* the font was already loaded */ xcFont = _font; } return TCL_OK; } /* ------------------------------------------------------------------------ */ /* The Togl_LoadBitmapFont() of Togl2.0 is bad as it seg-faults. Hence we will use the routine from Togl-1.7 which works and rename it to Togl_LoadBitmapFontOld. But to this end we need the definition of the struct Togl. */ #include "GL/glx.h" struct Togl_PackageGlobals { Tk_OptionTable optionTable; /* Used to parse options */ Togl *toglHead; /* Head of linked list of all Togl widgets */ int nextContextTag; /* Used to assign similar context tags */ }; typedef struct Togl_PackageGlobals Togl_PackageGlobals; struct Togl { Togl *Next; /* next in linked list */ #if defined(TOGL_WGL) HDC tglGLHdc; /* Device context of device that OpenGL calls * will be drawn on */ HGLRC tglGLHglrc; /* OpenGL rendering context to be made current */ int CiColormapSize; /* (Maximum) size of colormap in color index * mode */ # ifdef STEREO_I_H StereoI *pStereoI; # endif #elif defined(TOGL_X11) GLXContext GlCtx; /* Normal planes GLX context */ #elif defined(TOGL_AGL) AGLContext aglCtx; #endif int contextTag; /* all contexts with same tag share display * lists */ XVisualInfo *VisInfo; /* Visual info of the current */ Display *display; /* X's token for the window's display. */ Tk_Window TkWin; /* Tk window structure */ Tcl_Interp *Interp; /* Tcl interpreter */ Tcl_Command widgetCmd; /* Token for togl's widget command */ Togl_PackageGlobals *tpg; /* Used to access globals */ #ifndef NO_TK_CURSOR Tk_Cursor Cursor; /* The widget's cursor */ #endif int Width, Height; /* Dimensions of window */ int SetGrid; /* positive is grid size for window manager */ int TimerInterval; /* Time interval for timer in milliseconds */ Tcl_TimerToken timerHandler; /* Token for togl's timer handler */ Bool RgbaFlag; /* configuration flags (ala GLX parameters) */ int RgbaRed; int RgbaGreen; int RgbaBlue; Bool DoubleFlag; Bool DepthFlag; int DepthSize; Bool AccumFlag; int AccumRed; int AccumGreen; int AccumBlue; int AccumAlpha; Bool AlphaFlag; int AlphaSize; Bool StencilFlag; int StencilSize; Bool PrivateCmapFlag; Bool OverlayFlag; int Stereo; double EyeSeparation; double Convergence; int AuxNumber; Bool Indirect; int PixelFormat; int SwapInterval; const char *ShareList; /* name (ident) of Togl to share dlists with */ const char *ShareContext; /* name (ident) to share OpenGL context with */ const char *Ident; /* User's identification string */ ClientData Client_Data; /* Pointer to user data */ Bool UpdatePending; /* Should normal planes be redrawn? */ Tcl_Obj *CreateProc; /* Callback when widget is realized */ Tcl_Obj *DisplayProc; /* Callback when widget is redrawn */ Tcl_Obj *ReshapeProc; /* Callback when window size changes */ Tcl_Obj *DestroyProc; /* Callback when widget is destroyed */ Tcl_Obj *TimerProc; /* Callback when widget is idle */ /* Overlay stuff */ #if defined(TOGL_X11) GLXContext OverlayCtx; /* Overlay planes OpenGL context */ #elif defined(TOGL_WGL) HGLRC tglGLOverlayHglrc; #endif Window OverlayWindow; /* The overlay window, or 0 */ Tcl_Obj *OverlayDisplayProc; /* Overlay redraw proc */ Bool OverlayUpdatePending; /* Should overlay be redrawn? */ Colormap OverlayCmap; /* colormap for overlay is created */ int OverlayTransparentPixel; /* transparent pixel */ Bool OverlayIsMapped; GLfloat *EpsRedMap; /* Index2RGB Maps for Color index modes */ GLfloat *EpsGreenMap; GLfloat *EpsBlueMap; GLint EpsMapSize; /* = Number of indices in our Togl */ int currentStereoBuffer; #ifdef HAVE_AUTOSTEREO int as_initialized; /* for autostereo package */ ASHandle ash; /* for autostereo package */ #endif int badWindow; /* true when Togl_CreateWindow fails */ }; # if defined(TOGL_WGL) # include "tkWinInt.h" # include "tkFont.h" /* * The following structure represents Windows' implementation of a font. */ typedef struct WinFont { TkFont font; /* Stuff used by generic font package. Must be * first in structure. */ HFONT hFont; /* Windows information about font. */ HWND hwnd; /* Toplevel window of application that owns * this font, used for getting HDC. */ int widths[256]; /* Widths of first 256 chars in this font. */ } WinFont; # endif /* TOGL_WGL */ # define MAX_FONTS 1000 static GLuint ListBase[MAX_FONTS]; static GLuint ListCount[MAX_FONTS]; /* * "Standard" fonts which can be specified to Togl_LoadBitmapFontOld() */ #undef TOGL_BITMAP_8_BY_13 #undef TOGL_BITMAP_9_BY_15 #undef TOGL_BITMAP_TIMES_ROMAN_10 #undef TOGL_BITMAP_TIMES_ROMAN_24 #undef TOGL_BITMAP_HELVETICA_10 #undef TOGL_BITMAP_HELVETICA_12 #undef TOGL_BITMAP_HELVETICA_18 #define TOGL_BITMAP_8_BY_13 ((char *) 1) #define TOGL_BITMAP_9_BY_15 ((char *) 2) #define TOGL_BITMAP_TIMES_ROMAN_10 ((char *) 3) #define TOGL_BITMAP_TIMES_ROMAN_24 ((char *) 4) #define TOGL_BITMAP_HELVETICA_10 ((char *) 5) #define TOGL_BITMAP_HELVETICA_12 ((char *) 6) #define TOGL_BITMAP_HELVETICA_18 ((char *) 7) #define DEFAULT_FONTNAME "fixed" /* * Load the named bitmap font as a sequence of bitmaps in a display list. * fontname may be one of the predefined fonts like TOGL_BITMAP_8_BY_13 * or an X font name, or a Windows font name, etc. */ GLuint Togl_LoadBitmapFontOld(const Togl *togl, const char *fontname) { static Bool FirstTime = True; # if defined(TOGL_X11) XFontStruct *fontinfo; # elif defined(TOGL_WGL) WinFont *winfont; HFONT oldFont; TEXTMETRIC tm; # endif /* TOGL_X11 */ int first, last, count; GLuint fontbase; const char *name; /* Initialize the ListBase and ListCount arrays */ if (FirstTime) { int i; for (i = 0; i < MAX_FONTS; i++) { ListBase[i] = ListCount[i] = 0; } FirstTime = False; } /* * This method of selecting X fonts according to a TOGL_ font name * is a kludge. To be fixed when I find time... */ if (fontname == TOGL_BITMAP_8_BY_13) { name = "8x13"; } else if (fontname == TOGL_BITMAP_9_BY_15) { name = "9x15"; } else if (fontname == TOGL_BITMAP_TIMES_ROMAN_10) { name = "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1"; } else if (fontname == TOGL_BITMAP_TIMES_ROMAN_24) { name = "-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1"; } else if (fontname == TOGL_BITMAP_HELVETICA_10) { name = "-adobe-helvetica-medium-r-normal--10-100-75-75-p-57-iso8859-1"; } else if (fontname == TOGL_BITMAP_HELVETICA_12) { name = "-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1"; } else if (fontname == TOGL_BITMAP_HELVETICA_18) { name = "-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1"; } else if (!fontname) { name = DEFAULT_FONTNAME; } else { name = (const char *) fontname; } assert(name); # if defined(TOGL_X11) fontinfo = (XFontStruct *) XLoadQueryFont(Tk_Display(togl->TkWin), name); if (!fontinfo) { return 0; } first = fontinfo->min_char_or_byte2; last = fontinfo->max_char_or_byte2; # elif defined(TOGL_WGL) winfont = (WinFont *) Tk_GetFont(togl->Interp, togl->TkWin, name); if (!winfont) { return 0; } oldFont = SelectObject(togl->tglGLHdc, winfont->hFont); GetTextMetrics(togl->tglGLHdc, &tm); first = tm.tmFirstChar; last = tm.tmLastChar; # elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) first = 10; /* don't know how to determine font range on * Mac... */ last = 127; # endif /* TOGL_X11 */ count = last - first + 1; fontbase = glGenLists((GLuint) (last + 1)); if (fontbase == 0) { # ifdef TOGL_WGL SelectObject(togl->tglGLHdc, oldFont); Tk_FreeFont((Tk_Font) winfont); # endif /* TOGL_WGL */ return 0; } # if defined(TOGL_WGL) wglUseFontBitmaps(togl->tglGLHdc, first, count, (int) fontbase + first); SelectObject(togl->tglGLHdc, oldFont); Tk_FreeFont((Tk_Font) winfont); # elif defined(TOGL_X11) glXUseXFont(fontinfo->fid, first, count, (int) fontbase + first); # elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) aglUseFont(togl->aglCtx, 1, 0, 14, /* for now, only app font, regular * 14-point */ 10, 118, fontbase + first); # endif /* Record the list base and number of display lists for * Togl_UnloadBitmapFont(). */ { int i; for (i = 0; i < MAX_FONTS; i++) { if (ListBase[i] == 0) { ListBase[i] = fontbase; ListCount[i] = last + 1; break; } } } return fontbase; } /* * Release the display lists which were generated by Togl_LoadBitmapFontOld(). */ void Togl_UnloadBitmapFontOld(const Togl *togl, GLuint fontbase) { int i; (void) togl; for (i = 0; i < MAX_FONTS; i++) { if (ListBase[i] == fontbase) { glDeleteLists(ListBase[i], ListCount[i]); ListBase[i] = ListCount[i] = 0; return; } } } xcrysden-1.6.2/C/xcDisplayFunc2.c0000644000175000017500000012332713525506046015255 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcDisplayFunc2.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #include "xcfunc.h" extern GLuint PointList; extern Options3D is; extern RasterFontSize rf; extern OrthoProj ort; extern PERSPECTIVE persp; extern AtomicLabel *atomLabel, globalAtomLabel; extern short *do_not_display_atomlabel; extern char *element[]; extern GLuint fontOffset; extern realTimeMove makeMovie; /* --- function prototypes --- */ void xcAssignDisplayFunc(const char *dispMode); void RewriteCoor(GLenum type); void xcUpdateCoor( double mat[][4], double *x, double *y, double *z); void xcWireFrameL2D(struct Togl *togl); void xcWireFrameF2D(struct Togl *togl); void xcWireFrameFL2D(struct Togl *togl); void xcPointLineL2D(struct Togl *togl); void xcPointLineF2D(struct Togl *togl); void xcPointLineFL2D(struct Togl *togl); void xcBallStick1L2D(struct Togl *togl); void xcBallStick1F2D(struct Togl *togl); void xcBallStick1FL2D(struct Togl *togl); void xcBallStick2L2D(struct Togl *togl); void xcBallStick2F2D(struct Togl *togl); void xcBallStick2FL2D(struct Togl *togl); void xcTurnLabelsOn(void); void xcTurnLabelsOff(void); void xcTurnFramesOn(void); void xcTurnFramesOff(void); void WhichDispFunc(void); void UpdateDispFunc(void); void UpdateProjection(void); /* ---- extern function prototypes ---- */ extern void xcBall2D(int atom); extern void xcDisplayFunc( void (*Func)(struct Togl *togl) ); extern void xcWireFrame2D(struct Togl *togl); extern void xcPointLine2D(struct Togl *togl); extern void xcPipeBall2D(struct Togl *togl); extern void xcBallStick12D(struct Togl *togl); extern void xcBallStick22D(struct Togl *togl); extern void xcSpaceFill2D(struct Togl *togl); extern void (*xcDisplay)(struct Togl *togl); extern void xcDisplayXYZ(void); /*extern void xcMakeBall3DLists(void);*/ /*extern void xcMakeSpaceFill3DLists(void);*/ /*extern void xcMakeStick3DLists(void);*/ /* extern void xcMakeFrame3DLists(void); */ /* extern void xcMakeBallLabel3DList(void); */ /* extern void xcMakeSpaceLabel3DList(void); */ /* extern void xcMakeBallLists(void); */ extern int MakeSticks1(int i, GLdouble *x1, GLdouble *y1, GLdouble *z1, GLdouble *x2, GLdouble *y2, GLdouble *z2, GLdouble *x3, GLdouble *y3, GLdouble *z3, GLdouble *x4, GLdouble *y4, GLdouble *z4); extern int MakeSticks2(int i, int col, int flag); extern void xcMakeProjection2D(const char *mode); void xcAssignDisplayFunc(const char *dispMode) { /* 2D or 3D */ if ( dimType == XC_2D ) { if ( strcmp(dispMode,"WF") == 0 ) { /* WireFrame */ /* only bonds are taken into account */ if ( VPf.labelsOn == 0 && VPf.framesOn == 0 ) { RewriteCoor(XC_BOND); xcDisplayFunc(xcWireFrame2D); /* BECAUSE "tmp_nobjects" may differ from last time we must Z-orientate, to push tmp_nobjects which will be display to front */ hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms (labels) are taken into account */ if ( VPf.labelsOn == 1 && VPf.framesOn == 0 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_LABEL); xcDisplayFunc(xcWireFrameL2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + frames are taken into account */ if ( VPf.labelsOn == 0 && VPf.framesOn == 1 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_FRAME); xcDisplayFunc(xcWireFrameF2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms (labels) + frames are taken into account */ if ( VPf.labelsOn == 1 && VPf.framesOn == 1 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_LABEL | XC_FRAME); xcDisplayFunc(xcWireFrameFL2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } } else if ( strcmp(dispMode,"PL") == 0 ) { /* PointLine */ /* only atoms and bonds are taken into account */ if ( VPf.labelsOn == 0 && VPf.framesOn == 0 ) { RewriteCoor(XC_BOND | XC_ATOM); xcDisplayFunc(xcPointLine2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms + labels are taken into account */ if ( VPf.labelsOn == 1 && VPf.framesOn == 0 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_ATOM); /* XC_LABEL and XC_ATOM are synomyms */ xcDisplayFunc(xcPointLineL2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms + frames are taken into account */ if ( VPf.labelsOn == 0 && VPf.framesOn == 1 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_ATOM | XC_FRAME); xcDisplayFunc(xcPointLineF2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms + labels + frames are taken into account */ if ( VPf.labelsOn == 1 && VPf.framesOn == 1 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_ATOM | XC_FRAME); xcDisplayFunc(xcPointLineFL2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } } else if ( strcmp(dispMode,"PB") == 0 ) { /* PointLine */ GLuint flag = XC_BOND | XC_ATOM; if ( VPf.framesOn == 1 ) flag |= XC_FRAME; RewriteCoor (flag); xcDisplayFunc(xcPipeBall2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } else if ( strcmp(dispMode,"BS1") == 0 ) { /* PointLine */ /* only atoms and bonds are taken into account */ if ( VPf.labelsOn == 0 && VPf.framesOn == 0 ) { RewriteCoor(XC_BOND | XC_ATOM); xcDisplayFunc(xcBallStick12D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms + labels are taken into account */ if ( VPf.labelsOn == 1 && VPf.framesOn == 0 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_ATOM); xcDisplayFunc(xcBallStick1L2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms + frames are taken into account */ if ( VPf.labelsOn == 0 && VPf.framesOn == 1 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_ATOM | XC_FRAME); xcDisplayFunc(xcBallStick1F2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms + labels + frames are taken into account */ if ( VPf.labelsOn == 1 && VPf.framesOn == 1 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_ATOM | XC_FRAME); xcDisplayFunc(xcBallStick1FL2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } } else if ( strcmp(dispMode,"BS2") == 0 ) { /* PointLine */ /* only atoms and bonds are taken into account */ if ( VPf.labelsOn == 0 && VPf.framesOn == 0 ) { RewriteCoor(XC_BOND | XC_ATOM); xcDisplayFunc(xcBallStick22D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms + labels are taken into account */ if ( VPf.labelsOn == 1 && VPf.framesOn == 0 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_ATOM); xcDisplayFunc(xcBallStick2L2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms + frames are taken into account */ if ( VPf.labelsOn == 0 && VPf.framesOn == 1 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_ATOM | XC_FRAME); xcDisplayFunc(xcBallStick2F2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } /* bonds + atoms + labels + frames are taken into account */ if ( VPf.labelsOn == 1 && VPf.framesOn == 1 ) { /* Rewritecoor xat -> coor */ RewriteCoor(XC_BOND | XC_ATOM | XC_FRAME); xcDisplayFunc(xcBallStick2FL2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } } else if ( strcmp(dispMode,"SF") == 0 ) { /* SpaceFills */ if ( VPf.framesOn == 0 ) { RewriteCoor(XC_ATOM); } else { RewriteCoor(XC_ATOM | XC_FRAME); } xcDisplayFunc(xcSpaceFill2D); hpsort_index1(tmp_nobjects, zorient, iwksp); } } } void RewriteCoor(GLenum type) { int i; int nobj = 0; /* must be bonds taken into account */ if ( type & XC_BOND ) { /* rewrite BONDS --- BONDS */ for(i=1; i<=nbonds; i++) { (coor + i)->flag = BOND; (coor + i)->nat= *(natbond + i); (coor + i)->sqn= *(sqnbond + i); (coor + i)->bondend= *(bondend + i); (coor + i)->x1 = *(xbond + i); (coor + i)->y1 = *(ybond + i); (coor + i)->z1 = *(zbond + i); (coor + i)->x2 = *(xbond2 + i); (coor + i)->y2 = *(ybond2 + i); (coor + i)->z2 = *(zbond2 + i); xcUpdateCoor( vec.crdmajor, &(coor + i)->x1, &(coor + i)->y1, \ &(coor + i)->z1 ); xcUpdateCoor( vec.crdmajor, &(coor + i)->x2, &(coor + i)->y2, \ &(coor + i)->z2 ); /* if ATOM and BOND are on the same plane, ATOM must be drawn first so we will add very little to z-BOND */ *(zorient + i) = 0.5 * ((coor + i)->z1 + (coor + i)->z2) + Z_OFFSET((coor + i)->flag); } nobj += nbonds; } if ( type & XC_ATOM ) { /* ATOMS --- ATOMS */ int mmm = nobj + natoms; for(i = nobj + 1; i <= mmm; i++) { (coor + i)->flag = ATOM; (coor + i)->nat = *(nat + i - nobj); (coor + i)->sqn = i - nobj; (coor + i)->x1 = *(xat + i - nobj); (coor + i)->y1 = *(yat + i - nobj); (coor + i)->z1 = *(zat + i - nobj); xcUpdateCoor( vec.crdmajor, &(coor + i)->x1, &(coor + i)->y1, \ &(coor + i)->z1 ); *(zorient + i) = (coor + i)->z1; } nobj += natoms; } if ( type & XC_FRAME ) { int mmm = nobj + nframes; /* FRAMES --- FRAMES */ for(i = nobj + 1; i <= mmm; i++) { (coor + i)->flag = FRAME; (coor + i)->nat = *(frametype + i - nobj); (coor + i)->sqn = i - nobj; (coor + i)->x1 = *(xframe + i - nobj); (coor + i)->y1 = *(yframe + i - nobj); (coor + i)->z1 = *(zframe + i - nobj); (coor + i)->x2 = *(xframe2 + i - nobj); (coor + i)->y2 = *(yframe2 + i - nobj); (coor + i)->z2 = *(zframe2 + i -nobj); xcUpdateCoor( vec.crdmajor, &(coor + i)->x1, &(coor + i)->y1, \ &(coor + i)->z1 ); xcUpdateCoor( vec.crdmajor, &(coor + i)->x2, &(coor + i)->y2, \ &(coor + i)->z2 ); /* if ATOM and BOND and FRAME are on the same plane, ATOM must be drawn first, than BOND, so we will add very little to z-FRAME; but a little more than for BOND*/ *(zorient + i) = 0.5 * ((coor + i)->z1 + (coor + i)->z2) + Z_OFFSET((coor + i)->flag); } nobj += nframes; } tmp_nobjects = nobj; printf("END RewriteCoor; tmp_nobjects=%d",tmp_nobjects); fflush(stdout); } void xcUpdateCoor( double mat[][4], double *x, double *y, double *z) { double x1, y1, z1; x1 = mat[0][0] * *x + mat[1][0] * *y + mat[2][0] * *z; y1 = mat[0][1] * *x + mat[1][1] * *y + mat[2][1] * *z; z1 = mat[0][2] * *x + mat[1][2] * *y + mat[2][2] * *z; *x = x1; *y = y1; *z = z1; } void makeAtomLabel2D(int ith, GLdouble Xoffset, GLdouble Yoffset) { char *label; GLdouble width, height, sizeF; int ia; ia = (coor + ith)->sqn; if (ia > natoms) { /* this should not happen, but sometimes it does with selection-mode (it is a bug) */ return; } sizeF = (2.0 * VPf.VPfactor); if (atomLabel[ia].base) { label = atomLabel[ia].label; if (atomLabel[ia].tkfont) { width = (GLdouble) ( Tk_TextWidth(atomLabel[ia].tkfont, label, strlen(label)) ); } else { width = (GLdouble) (atomLabel[ia].width * strlen(label)); } height = (GLdouble) atomLabel[ia].height; } else { if (atomLabel[ia].label) label = atomLabel[ia].label; else label = element[*(nat + ia)]; if (globalAtomLabel.base) { if (globalAtomLabel.tkfont) { width = (GLdouble) ( Tk_TextWidth(globalAtomLabel.tkfont, label, strlen(label)) ); } else { width = (GLdouble) globalAtomLabel.width; } height = (GLdouble) globalAtomLabel.height; } else { width = (GLdouble) (rf.wid * strlen(label)); height = (GLdouble) rf.height; } } if ( Xoffset != CENTERED_LABEL ) { if (atomLabel[ia].base) glColor3fv (atomLabel[ia].bright_color); else glColor3fv (globalAtomLabel.bright_color); } else { if (atomLabel[ia].base) glColor3fv (atomLabel[ia].dark_color); else glColor3fv (globalAtomLabel.dark_color); Xoffset = -width / sizeF; Yoffset = -height / sizeF; } glRasterPos3d( (coor + ith)->x1 + Xoffset, (coor + ith)->y1 + Yoffset, (coor + ith)->z1 ); if ( !globalAtomLabel.base && !atomLabel[ia].base ) { /* render default raster font */ if (atomLabel[ia].base) { /* custom label */ glListBase(atomLabel[ia].base); if (atomLabel[ia].do_display && !do_not_display_atomlabel[ia]) xcFont_PrintString (label); } else { /* default label */ if (globalAtomLabel.do_display && !do_not_display_atomlabel[ia]) glCallList( atomlabelOffset + *(nat + ia) ); } } else { /* render one of loaded Togl fonts */ if (atomLabel[ia].base) { glListBase (atomLabel[ia].base); if (atomLabel[ia].do_display && !do_not_display_atomlabel[ia]) xcFont_PrintString( label ); } else { glListBase (globalAtomLabel.base); if (globalAtomLabel.do_display && !do_not_display_atomlabel[ia]) xcFont_PrintString( label ); } } } void xcWireFrameL2D(struct Togl *togl) { int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( (GLfloat) VPf.WFlinewidth ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { /*printf("xcWireFrameL2D> loop BOND, i=%d",*(iwksp + i)); fflush(stdout);*/ glBegin(GL_LINES); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); } if ( (coor + *(iwksp + i))->flag == ATOM ) { /* printf("xcWireFrameL2D> loop ATOM, i=%d",*(iwksp + i)); fflush(stdout); */ makeAtomLabel2D ( *(iwksp + i), rf.wp2, rf.hp2 ); } } /* check if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcWireFrameF2D(struct Togl *togl) { int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glLineWidth( (GLfloat) VPf.WFlinewidth ); glBegin(GL_LINES); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); } if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } /* check if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcWireFrameFL2D(struct Togl *togl) { int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glLineWidth( (GLfloat) VPf.WFlinewidth ); glBegin(GL_LINES); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); } if ( (coor + *(iwksp + i))->flag == ATOM ) { makeAtomLabel2D ( *(iwksp + i), rf.wp2, rf.hp2 ); } if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } /* check if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers( togl ); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcPointLineL2D(struct Togl *togl) { int i; GLdouble loffset = VPf.PLradius / VPf.VPfactor; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated(0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( (GLfloat) VPf.PLlinewidth ); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glBegin(GL_LINES); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); } if ( (coor + *(iwksp + i))->flag == ATOM ) { /* first display point */ /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glCallList( PointList ); glPopMatrix(); /* than atom label */ makeAtomLabel2D ( *(iwksp + i), loffset + rf.w2, loffset + rf.h2 ); } } /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcPointLineF2D(struct Togl *togl) { int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated (0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glLineWidth( (GLfloat) VPf.PLlinewidth ); glBegin(GL_LINES); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); } if ( (coor + *(iwksp + i))->flag == ATOM ) { /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glCallList( PointList ); glPopMatrix(); } if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcPointLineFL2D(struct Togl *togl) { int i; GLdouble loffset = VPf.PLradius / VPf.VPfactor; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated (0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glLineWidth( (GLfloat) VPf.PLlinewidth ); glBegin(GL_LINES); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); } if ( (coor + *(iwksp + i))->flag == ATOM ) { /* first display point */ /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glCallList( PointList ); glPopMatrix(); /* than atom label */ makeAtomLabel2D ( *(iwksp + i), loffset + rf.w2, loffset + rf.h2 ); } if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcBallStick1L2D(struct Togl *togl) { int i; GLdouble x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated (0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { MakeSticks1(*(iwksp + i), &x1, &y1, &z1, &x2, &y2, &z2, &x3, &y3, &z3, &x4, &y4, &z4); glBegin(GL_POLYGON); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); glBegin(GL_LINE_LOOP); glColor3f( 0.0, 0.0, 0.0 ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); } else if ( (coor + *(iwksp + i))->flag == ATOM ) { /* first display ball */ glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); /* than atom label */ makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL ); } } glDisable( GL_CULL_FACE ); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcBallStick1F2D(struct Togl *togl) { int i; GLdouble x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated (0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glLineWidth( VPf.OUTlinewidth ); MakeSticks1(*(iwksp + i), &x1, &y1, &z1, &x2, &y2, &z2, &x3, &y3, &z3, &x4, &y4, &z4); glBegin(GL_POLYGON); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); glBegin(GL_LINE_LOOP); glColor3f( 0.0, 0.0, 0.0 ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); } if ( (coor + *(iwksp + i))->flag == ATOM ) { glLineWidth( VPf.OUTlinewidth ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); } if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } glDisable (GL_CULL_FACE); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcBallStick1FL2D(struct Togl *togl) { int i; GLdouble x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated (0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { glLineWidth( VPf.OUTlinewidth ); MakeSticks1(*(iwksp + i), &x1, &y1, &z1, &x2, &y2, &z2, &x3, &y3, &z3, &x4, &y4, &z4); glBegin(GL_POLYGON); /* glColor3fv( atcol[(coor + *(iwksp + i))->nat] ); */ if ( VPf.unibond) glColor3fv(unibondCol); else glColor3fv( atm.col[(coor + *(iwksp + i))->sqn] ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); glBegin(GL_LINE_LOOP); glColor3f( 0.0, 0.0, 0.0 ); glVertex3d( x1, y1, z1); glVertex3d( x2, y2, z2); glVertex3d( x3, y3, z3); glVertex3d( x4, y4, z4); glEnd(); } if ( (coor + *(iwksp + i))->flag == ATOM ) { /* first display ball */ glLineWidth( VPf.OUTlinewidth ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); /* than atom label */ makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL ); } if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } glDisable (GL_CULL_FACE); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcBallStick2L2D(struct Togl *togl) { int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated (0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { /* MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->nat); */ MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->sqn, BALL); } if ( (coor + *(iwksp + i))->flag == ATOM ) { /* first display ball */ glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); /* than atom label */ makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL ); } } glDisable( GL_CULL_FACE ); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcBallStick2F2D(struct Togl *togl) { int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated (0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { /* MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->nat); */ glLineWidth( VPf.OUTlinewidth ); MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->sqn, BALL); } if ( (coor + *(iwksp + i))->flag == ATOM ) { glLineWidth( VPf.OUTlinewidth ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); } if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } glDisable (GL_CULL_FACE); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } void xcBallStick2FL2D(struct Togl *togl) { int i; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); if (VPf.perspective) glTranslated (0.0, 0.0, persp.shiftZ); else glTranslated (0.0, 0.0, -ort.size); /* fog & antialias */ xcFog (togl, VPf.fog, VPf.perspective); xcAntiAlias (VPf.antialias); glLineWidth( VPf.OUTlinewidth ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); for(i = 1; i <= tmp_nobjects; i++) { if ( (coor + *(iwksp + i))->flag == BOND ) { /* MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->nat); */ glLineWidth( VPf.OUTlinewidth ); MakeSticks2(*(iwksp + i), (coor + *(iwksp + i))->sqn, BALL); } if ( (coor + *(iwksp + i))->flag == ATOM ) { /* first display ball */ glLineWidth( VPf.OUTlinewidth ); glPushMatrix(); glTranslated( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glColor3fv (atm.col[(coor + *(iwksp + i))->sqn]); xcBall2D (*(iwksp + i)); glPopMatrix(); /* than atom label */ makeAtomLabel2D ( *(iwksp + i), CENTERED_LABEL, CENTERED_LABEL ); } if ( (coor + *(iwksp + i))->flag == FRAME ) { if ( (coor + *(iwksp + i))->nat == 2 ) { glLineStipple(2, FRAME_PAT); glEnable(GL_LINE_STIPPLE); } glLineWidth( (GLfloat) VPf.framewidth ); glBegin(GL_LINES); glColor3fv( framecol ); glVertex3d( (coor + *(iwksp + i))->x1, (coor + *(iwksp + i))->y1, (coor + *(iwksp + i))->z1 ); glVertex3d( (coor + *(iwksp + i))->x2, (coor + *(iwksp + i))->y2, (coor + *(iwksp + i))->z2 ); glEnd(); glDisable(GL_LINE_STIPPLE); } } glDisable (GL_CULL_FACE); /* chack if coordinate sistem should be displayed */ if ( VPf.xyzOn ) xcDisplayXYZ(); glFlush(); Togl_SwapBuffers(togl); /* every snapshot movie making */ if ( makeMovie.doit && makeMovie.mode == MOVIE_MODE_EVERY_SNAPSHOT && !makeMovie.printing ) { fprintf(stderr,"making snapshot\n"); createMoviePPMFrame(togl); } } /* this procedure turn labels On */ void xcTurnLabelsOn(void) { /* if dimType is XC_3D all that's needed to do is to set VPf.labelsOn to 1, * but if dimType is XC_2D, than it's a little harder */ VPf.labelsOn = 1; /* XC_2D */ if ( dimType == XC_2D ) WhichDispFunc(); } /* this procedure turn labels Off */ void xcTurnLabelsOff(void) { /* if dimType is XC_3D all that's needed to do is to set VPf.labelsOn to 0, * but if dimType is XC_2D, than it's a little harder */ VPf.labelsOn = 0; /* XC_2D */ if ( dimType == XC_2D ) WhichDispFunc(); } /* this procedure turn frames On */ void xcTurnFramesOn(void) { /* if dimType is XC_3D all that's needed to do is to set VPf.framesOn to 1, * but if dimType is XC_2D, than it's a little harder */ VPf.framesOn = 1; /* XC_2D */ if ( dimType == XC_2D ) WhichDispFunc(); } /* this procedure turn labels Off */ void xcTurnFramesOff(void) { /* if dimType is XC_3D all that's needed to do is to set VPf.framesOn to 0, * but if dimType is XC_2D, than it's a little harder */ VPf.framesOn = 0; /* XC_2D */ if ( dimType == XC_2D ) WhichDispFunc(); } /* ========================================================================= */ /* this proc is used by xcTurnLabelsOn & xcTurnLabelsOff to determine which */ /* displayFunc to use======================================================= */ void WhichDispFunc(void) { printf("In WhichDispFunc, dimType=%d",dimType); fflush(stdout); /* are we in WF mode */ if ( xcDisplay == xcWireFrame2D || xcDisplay == xcWireFrameL2D || xcDisplay == xcWireFrameF2D || xcDisplay == xcWireFrameFL2D ) { xcAssignDisplayFunc("WF"); } else if ( xcDisplay == xcPointLine2D || xcDisplay == xcPointLineL2D || xcDisplay == xcPointLineF2D || xcDisplay == xcPointLineFL2D ) xcAssignDisplayFunc("PL"); else if ( xcDisplay == xcPipeBall2D ) xcAssignDisplayFunc("PB"); else if ( xcDisplay == xcBallStick12D || xcDisplay == xcBallStick1L2D || xcDisplay == xcBallStick1F2D || xcDisplay == xcBallStick1FL2D ) xcAssignDisplayFunc("BS1"); else if ( xcDisplay == xcBallStick22D || xcDisplay == xcBallStick2L2D || xcDisplay == xcBallStick2F2D || xcDisplay == xcBallStick2FL2D ) xcAssignDisplayFunc("BS2"); else if ( xcDisplay == xcSpaceFill2D ) xcAssignDisplayFunc("SF"); } /* ========================================================================= */ /* this is used by "XC_UpdateStrCmd", to update DisplayFunc */ /* ========================================================================= */ void UpdateDispFunc(void) { printf("In UpdateDispFunc, dimType=%d",dimType); fflush(stdout); if ( dimType == XC_2D ) { WhichDispFunc(); /* xcMakeBallLists(); */ } else if ( dimType == XC_3D ) { /* if (is.spacefillmode) xcMakeSpaceFill3DLists(); if (is.ballmode) xcMakeBall3DLists(); if (is.stickmode) xcMakeStick3DLists(); */ /* if (VPf.framesOn) xcMakeFrame3DLists();*/ /* if (VPf.labelsOn) { */ /* xcMakeBallLabel3DList(); */ /* xcMakeSpaceLabel3DList(); */ /* } */ } } /* ========================================================================= */ /* this is used by "XC_UpdateStrCmd", to update Projection (glOrtho) */ /* ========================================================================= */ void UpdateProjection(void) { if ( dimType == XC_2D ) { if ( xcDisplay == xcWireFrame2D || xcDisplay == xcWireFrameL2D || xcDisplay == xcWireFrameF2D || xcDisplay == xcWireFrameFL2D || xcDisplay == xcPointLine2D || xcDisplay == xcPointLineL2D || xcDisplay == xcPointLineF2D || xcDisplay == xcPointLineFL2D ) xcMakeProjection2D("WF"); /* WF and PL have the same "projections" */ else if ( xcDisplay == xcPipeBall2D || xcDisplay == xcBallStick12D || xcDisplay == xcBallStick1L2D || xcDisplay == xcBallStick1F2D || xcDisplay == xcBallStick1FL2D || xcDisplay == xcBallStick22D || xcDisplay == xcBallStick2L2D || xcDisplay == xcBallStick2F2D || xcDisplay == xcBallStick2FL2D ) xcMakeProjection2D("BS1"); /* BS1 and BS2 have the same "projections" */ else if ( xcDisplay == xcSpaceFill2D ) xcMakeProjection2D("SF"); } else if ( dimType == XC_3D ) { if (is.spacefillmode) xcMakeProjection3D("space"); if (is.ballmode || is.stickmode) xcMakeProjection3D("balls"); } } xcrysden-1.6.2/C/xcIsoSpaceSel.c0000644000175000017500000005276213525506046015130 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcIsoSpaceSel.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #include #include "xcGLparam.h" #include "struct.h" #include "isosurf.h" #include "primitives.h" #include "vector.h" #include "xcfunc.h" extern Options3D is; static float poi[4][3], poi_nml[3]; static CellCage cage; static double cage_orig[3]; extern int normalizepvfv(float *vec); static int Paralle2D( GetComOption points, GetComOption mar, boolean rectangular ); static int Center2D( GetComOption center, GetComOption nml, float size, float rot ); static void GetFractCoor(double ivec[][4], double frcoor[4][3]); /***************************************************************************** * IN THIS FILE THE FOLLOWING COMMANDS ARE IMPLEMENTED:: * --------------------------------------------------- * * xc_isospacesel *****************************************************************************/ /****************************************************************************** * XC_IsoSpaceSelCmd --> inplementation of 'xc_isospacesel' custom Tcl command * --------------------- * Usage: xc_isospacesel init * or * paralle2D -points {p1 p2 p3} \; px={x y z} * -margins {ab cd ad bc} \ * -rectangular 0|1 * or * center2D -center {x y z} \ * -normal {x y z} \ * -size size \ * -rotate rot * or * cell3D -ctype prim|conv \ * -margins {a b c a* b* c*} * or * paralle3D -points {p1 p2 p3} \; px={x y z} * -margins {ab cd ad bc down up} \ * -rectangular 0|1 * * or center3D -center {x y z} \ * -normal {x y z} \ * -margins {down up} \ * -size size \ * -rotate rot * * fractcoor -vtype prim|conv * or * clear */ int XC_IsoSpaceSelCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { struct Togl *togl; register int i, j; double size = 1.0, rot = 0.0, (*cvec)[4]; static float rotate = 0.0; char *result = Tcl_Alloc( sizeof(char) * 512); /* maximum lenght of result string is 512 characters */ boolean rectangular = 0; boolean paralle2D_is = 0; boolean center2D_is = 0; boolean cell3D_is = 0; GetComOption points = { 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; GetComOption margins = { 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; GetComOption center = { 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; GetComOption normal = { 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; /* t.k */ sprintf(result," "); /* HERE */ if ( argc < 3) { Tcl_SetResult(interp, "Usage: xc_isospacesel init\n or\n paralle2D -points {x1 y1 z1 x2 y2 z2 x3 y3 z3} -margins {ab cd ad bc} -rectangular 0|1\n or\n center2D -center {x y z} -normal {x y z} -size size -rotate rot\n or\n clear", TCL_STATIC); return TCL_ERROR; } /* find togl associated with toglName */ if ( Togl_GetToglFromName(interp, argv[1], &togl) == TCL_ERROR ) { char rss[1024]; snprintf(rss, sizeof(rss), "couldn't find %s togl widget", argv[1]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( strcmp(argv[2], "init") == 0 ) { rotate = 0.0; return TCL_OK; } else if ( strcmp(argv[2], "paralle2D") == 0 ) { paralle2D_is = 1; for (i=3; i paralle2D, should be one of -points, -margins or -rectangular", argv[i]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } } else if ( strcmp(argv[2], "center2D") == 0 ) { center2D_is = 1; for (i=3; i center2D, should be one of -center, -normal, -size or -rotate", argv[i]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } } } else if ( strcmp(argv[2], "cell3D") == 0 ) { cell3D_is = 1; for (i=3; i fractcoor -vtype prim|conv"); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if ( strcmp(argv[4], "prim") == 0 ) { /* according to primitive vectors */ GetFractCoor(vec.recprim, frcoor); } else if ( strcmp(argv[4], "conv") == 0 ) { /* according to conventional vectors */ GetFractCoor(vec.recconv, frcoor); } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown vector type %s, must be prim or conv", argv[4]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } /* get the results */ sprintf(result, "%f %f %f %f %f %f %f %f %f %f %f %f", frcoor[0][0], frcoor[0][1], frcoor[0][2], frcoor[1][0], frcoor[1][1], frcoor[1][2], frcoor[2][0], frcoor[2][1], frcoor[2][2], frcoor[3][0], frcoor[3][1], frcoor[3][2]); Tcl_SetResult(interp, result, TCL_DYNAMIC); return TCL_OK; } else if ( strcmp(argv[2], "clear") == 0 ) { rotate = 0.0; VPf.isospacesel2D = GL_FALSE; VPf.isospacesel3D = GL_FALSE; } else { char rss[1024]; snprintf(rss, sizeof(rss), "unknown type \"%s\" of xc_isospacesel command, should be one of init, paralle2D, center2D or clear", argv[2]); Tcl_SetResult(interp, rss, TCL_VOLATILE); return TCL_ERROR; } if (paralle2D_is) { /* paralle2D mode */ if (!Paralle2D( points, margins, rectangular )) { Tcl_SetResult(interp, "Usage: xc_iso isoplane ??", TCL_STATIC); return TCL_ERROR; } VPf.isospacesel2D = GL_TRUE; VPf.isospacesel3D = GL_FALSE; } else if (center2D_is) { /* center2D mode */ rotate += rot; if (!Center2D( center, normal, size, rotate )) { Tcl_SetResult(interp, "zero vector was submitted for normal, when executing xc_isospacesel center2D -normal {x y z}", TCL_STATIC); return TCL_ERROR; } VPf.isospacesel2D = GL_TRUE; VPf.isospacesel3D = GL_FALSE; } else if (cell3D_is) { /* cell3D mode */ double mat[4][4]; for (i=0; i<4; i++) for (j=0; j<4; j++) mat[i][j] = 0.0; VPf.isospacesel3D = GL_TRUE; VPf.isospacesel2D = GL_FALSE; for (i=0; iA' && C->C' else move B->B' && D->D' */ if ( dist3f( p[0][0] - p[2][0], p[0][1] - p[2][1], p[0][2] - p[2][2] ) < dist3f( p[1][0] - p[3][0], p[1][1] - p[3][1], p[1][2] - p[3][2] ) ) { /* move A -> A' */ aa = 1; } else { /* move B -> B' */ aa = 0; } det = 0.0; for (j=0; j<3; j++) { if (j==1) { ii[0] = 0; ii[1] = 1; } else if (j==2) { ii[0] = 0; ii[1] = 2; } else { ii[0] = 1; ii[1] = 2; } for (i=0; i<2; i++) { d[i][0] = bc[ii[i]]; d[i][1] = -bc_nml[ii[i]]; if ( aa ) { d[i][2] = p[1][ii[i]] - p[0][ii[i]]; } else { d[i][2] = p[0][ii[i]] - p[1][ii[i]]; } } det = CramerRule2x2Detf( d, 0 ); if ( fabs(det) > 1.0e-6 ) break; } if ( fabs(det) < 1.0e-6 ) { /* linear dependence */ return XC_ERROR; } k = CramerRule2x2Detf( d, 1 ) / det; for (i=0; i<3; i++) { if ( aa ) { p[0][i] += k * bc[i]; p[2][i] -= k * bc[i]; /* C point is moved just in opposite direction */ } else { p[1][i] += k * bc[i]; p[3][i] -= k * bc[i]; } } } /* take margins into account */ /* margins are specified in fractional units */ if ( rectangular ) { /* assing new, rectangular bc & ba vectors */ for (i=0; i<3; i++) { bc[i] = p[2][i] - p[1][i]; ba[i] = p[0][i] - p[1][i]; } } for (i=0; i<3; i++) { p[0][i] += -mar.vec[0] * bc[i] + mar.vec[2] * ba[i]; p[1][i] += -mar.vec[0] * bc[i] - mar.vec[3] * ba[i]; p[2][i] += mar.vec[1] * bc[i] - mar.vec[3] * ba[i]; p[3][i] += mar.vec[1] * bc[i] + mar.vec[2] * ba[i]; } /* assign parallelogram's normal */ for (i=0; i<3; i++) { poi_nml[i] = nml[i]; for (j=0; j<4; j++) poi[j][i] = p[j][i]; } return XC_OK; } static int Center2D( GetComOption center, GetComOption nml, float size, float rot ) { register int i, j; float v[3], vnml[3], p[4][3]; /* check if zero lenght normal was submited */ if ( fabs(nml.vec[0]) < 1.0e-3 && fabs(nml.vec[1]) < 1.0e-3 && fabs(nml.vec[2]) < 1.0e-3 ) return XC_ERROR; /* zero-lenght normal */ if ( (nml.vec[0] * nml.vec[1] * nml.vec[2]) < 1.0e-4 ) { v[0] = 0.0; v[1] = 0.0; v[2] = 0.0; if ( fabs(nml.vec[2]) < 1.e-3 ) v[2] = 1.0; if ( fabs(nml.vec[1]) < 1.e-3 ) v[1] = 1.0; if ( fabs(nml.vec[0]) < 1.e-3 ) v[0] = 1.0; } else { v[0] = 1.0; v[1] = 1.0; v[2] = - (nml.vec[0]*v[0] + nml.vec[1]*v[1]) / nml.vec[2]; } VecProduct3f( v, nml.vec, vnml ); normalizepvfv( v ); normalizepvfv( vnml ); if ( fabs(v[0]*vnml[0]+v[1]*vnml[1]+v[2]*vnml[2]) > 1.e-6 ) xcError("VecProduct3f is false!!!"); /* let the size be half of square edge, not square diagonal */ size *= 2.0 / sqrt(3.0); for (i=0; i<3; i++) { v[i] *= size; vnml[i] *= size; p[0][i] = center.vec[i] + vnml[i]; p[1][i] = center.vec[i] + v[i]; p[2][i] = center.vec[i] - vnml[i]; p[3][i] = center.vec[i] - v[i]; printf("point:: i=%d, %f %f %f %f\n", i, p[0][i], p[1][i], p[2][i], p[3][i]); fflush(stdout); } /* now rotate the points around normal */ rot /= RAD2DEG; if ( rot != 0 ) for (i=0; i<4; i++) xcRotate3fv( rot, nml.vec, center.vec, p[i] ); /* assign poi & poin_nml */ for (i=0; i<3; i++) { poi_nml[i] = nml.vec[i]; for (j=0; j<4; j++) poi[j][i] = p[j][i]; } return XC_OK; } void IsoSpaceSel_Parallelogram(void) { GLint shade_model; GLboolean two_side, cull_face; GLboolean switch_shademodel = GL_FALSE; GLboolean switch_lightmodel = GL_FALSE; GLboolean switch_cullface = GL_FALSE; /*glPushAttrib();*/ /* TRANSPARENCY */ LoadBlendfunc_And_Frontface(); glEnable( GL_BLEND ); glDepthMask( GL_FALSE ); glBlendFunc( blend_cellcage.sfunc, blend_cellcage.dfunc ); /* SHADEMODEL */ glGetIntegerv( GL_SHADE_MODEL, &shade_model ); if ( shade_model != GL_FLAT ) { switch_shademodel = GL_TRUE; glShadeModel( GL_FLAT ); } /* LIGHTMODEL */ glGetBooleanv( GL_LIGHT_MODEL_TWO_SIDE, &two_side ); if ( !two_side ) { switch_lightmodel = GL_TRUE; glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); } /* CULL FACE */ glGetBooleanv( GL_CULL_FACE, &cull_face ); if ( cull_face ) { switch_cullface = GL_TRUE; glDisable( GL_CULL_FACE ); } LoadCageOrVecMaterial( GLPAR_ISOPARALLE ); glPushMatrix(); glTranslated( -mx, -my, -mz ); xcParallelogram( XCPRIM_SOLID_AND_BORDER, poi, poi_nml ); glPopMatrix(); /* get back the previous GL state */ glDisable(GL_BLEND); glDepthMask(GL_TRUE); if ( switch_shademodel ) { glShadeModel( GL_SMOOTH ); } if ( switch_lightmodel ) { glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE ); } if ( switch_cullface ) { glEnable( GL_CULL_FACE ); } LoadStructMaterial(); /*glPopMatrix();*/ } void IsoSpaceSel_3D(void) { GLint shade_model; GLboolean two_side, cull_face; GLboolean switch_shademodel = GL_FALSE; GLboolean switch_lightmodel = GL_FALSE; GLboolean switch_cullface = GL_FALSE; /* TRANSPARENCY */ LoadBlendfunc_And_Frontface(); glEnable( GL_BLEND ); glDepthMask( GL_FALSE ); glBlendFunc( blend_cellcage.sfunc, blend_cellcage.dfunc ); /* SHADEMODEL */ glGetIntegerv( GL_SHADE_MODEL, &shade_model ); if ( shade_model != GL_FLAT ) { switch_shademodel = GL_TRUE; glShadeModel( GL_FLAT ); } /* LIGHTMODEL */ glGetBooleanv( GL_LIGHT_MODEL_TWO_SIDE, &two_side ); if ( !two_side ) { switch_lightmodel = GL_TRUE; glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); } /* CULL FACE */ glGetBooleanv( GL_CULL_FACE, &cull_face ); if ( cull_face ) { switch_cullface = GL_TRUE; glDisable( GL_CULL_FACE ); } LoadCageOrVecMaterial( GLPAR_ISOPARALLE ); glPushMatrix(); glTranslated( -mx + cage_orig[0], -my + cage_orig[1], -mz + cage_orig[2]); glLineWidth( 2.0 ); xcWireCage( cage ); xcSolidCage( cage ); glPopMatrix(); /* get back the previous GL state */ glDisable(GL_BLEND); glDepthMask(GL_TRUE); if ( switch_shademodel ) { glShadeModel( GL_SMOOTH ); } if ( switch_lightmodel ) { glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE ); } if ( switch_cullface ) { glEnable( GL_CULL_FACE ); } LoadStructMaterial(); } static void GetFractCoor(double ivec[][4], double frcoor[4][3]) { int i; for (i=0; i<4; i++) { frcoor[i][0] = ivec[0][0] * poi[i][0] + ivec[0][1] * poi[i][1] + ivec[0][2] * poi[i][2]; frcoor[i][1] = ivec[1][0] * poi[i][0] + ivec[1][1] * poi[i][1] + ivec[1][2] * poi[i][2]; frcoor[i][2] = ivec[2][0] * poi[i][0] + ivec[2][1] * poi[i][1] + ivec[2][2] * poi[i][2]; } } xcrysden-1.6.2/C/xcExit.c0000644000175000017500000000346613513373532013663 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xcExit.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ /* XC_ExitCmd - implementation of xc_exit custom Tcl command * * we need a custom EXIT command, because if we have a structure opened, * we must first release a Mesa context, delete lists, free variables and only * then we cam exit */ int XC_ExitCmd(ClientData clientData,Tcl_Interp *interp, int argc, char *argv[]) { if (argc != 1) { Tcl_SetResult(interp, "Usage: xc_exit", TCL_STATIC); return TCL_ERROR; } printf("XC_ExitCmd; VPf.stropened=%d\n",VPf.stropened); fflush(stdout); if (VPf.stropened) { /* maybe there are some 3D lists; destroy them */ /* xcMaybeDestroyLists(); */ xcDisplayFunc( (void *)NULL ); /* destiry mesa context */ xcDestroyMesaContext(); /* now FREE all variables */ FreeAllVariables(); } /* now we can exit normally*/ Tcl_Exit(0); return TCL_OK; } xcrysden-1.6.2/C/xsf2xsf.c0000644000175000017500000002702013131621564014007 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/xsf2xsf.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include #define MIN(x,y) ( (x)<(y) ? (x) : (y) ) #define LINE_FMT "%[^\n\r]" char *element[] = { "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm"}; /* xsf2xsf.c */ int main(int argc, char *argv[]); int xsf_readFile(char *inpfile, char *outfile, int reduceTo); void xsf_dummyReadCoor(FILE *inpFP, int natoms); void xsf_readPrintCoor(char *line, FILE *outFP); void PrintVec(FILE *outFP, double vec[][4]); int ReadVec(FILE *fp, double vec[][4]); void ParseAtomName(char *atomName); void EndLine(FILE *inpFP, FILE *outFP); void ToEndLine(FILE *inpFP); /* Usage: xsf2xsf inputFile outputFile [reduceTo] */ int main(int argc, char *argv[]) { int reduceTo = 3; if ( argc != 3 && argc != 4 ) { fprintf(stderr,"\nUsage: xsf2xsf inputFile outputFile [reduceTo]\n\n"); exit(1); } if (argc == 4) { if ( ! isdigit ((int)argv[3][0]) ) { fprintf(stderr,"\nUsage: xsf2xsf inputFile outputFile [reduceTo]\n\n"); exit(1); } reduceTo = (int) strtol(argv[3], NULL, 10); } xsf_readFile(argv[1], argv[2], reduceTo); /* xsf_readFile(stdin, stdout, reduceTo); */ exit(0); } /* ========================================================================= */ /* READ XCRYSDEN STRUCTURE FILE */ /* ========================================================================= */ int xsf_readFile(char *inpfile, char *outfile, int reduceTo) { FILE *inpFP, *outFP; char *line = (char *) malloc( sizeof(char) * 20000 ); /* max. line length */ char *_line = (char *) malloc( sizeof(char) * 20000 ); /* max. line length */ char *word = (char *) malloc( sizeof(char) * 256 ); /* max. word length */ char *unit = (char *) malloc( sizeof(char) * 256 ); /* max. word length */ int i, n, c, latom = 0; int dim = 0, groupn = 1, natr, ncell = 1, idummy; double prim[4][4], conv[4][4]; #ifdef WIN32 inpFP = fopen(inpfile, "r"); outFP = fopen(outfile, "w"); #else inpFP = fopen(inpfile, "r"); outFP = fopen(outfile, "w"); #endif if ( inpFP == NULL || outFP == NULL) { fprintf(stderr,"error opening files: %s and %s\n", inpfile, outfile); exit(1); } while((c = fscanf(inpFP, LINE_FMT, line)) != EOF) { /*fprintf(stderr,"|%s| len=%d\n", line, strlen(line));*/ word[0] = '\0'; if (strlen(line) != 0) { sscanf(line, "%s %s", word, unit); } /* check for comment-line "#" */ if ( strncmp(word, "#", 1) == 0 ) { /* ignore this line */ ToEndLine(inpFP); line[0] = '\0'; continue; } /* if INFO */ if ( strncmp(word,"ANIMS",5) == 0 || strncmp(word,"INFO",4) == 0 || strncmp(word, "BEGIN_", 6) == 0 || strncmp(word, "END_",4) == 0 || strncmp(word, "RECIP-", 6) == 0 || strncmp(word, "WIGNER-", 7) == 0 || strncmp(word, "BRILLOUIN-",10) == 0 || strncmp(word, "FRAM",4) == 0 || strncmp(word, "DATAGRID", 8) == 0 || strncmp(word, "BANDGRID", 8) == 0 ) { latom = 0; fprintf(outFP,"%s\n", line); } /* if DIM-GROUP */ else if ( strncmp(word,"DIM",3) == 0 ) { latom = 0; /* read dimensionality and group of structure */ ToEndLine(inpFP); fscanf(inpFP, LINE_FMT, _line); n = sscanf(_line,"%d %d", &dim, &groupn); if ( n < 1 ) { fprintf(stderr, "ERROR: Error reading DIM-GROUP section "); exit(1); } if ( dim < 0 || dim > 3 ) { fprintf(stderr, "ERROR: DIM is out of range "); exit(1); } dim = MIN(reduceTo, dim); if ( reduceTo > 0 ) { if ( reduceTo != 3 ) groupn = 1; fprintf(outFP, "DIM-GROUP\n%d %d\n", dim, groupn); } } /* MOLECULE */ else if ( strncmp(word,"MOLECULE",8) == 0 ) { /* do nothing */ reduceTo = 0; latom = 0; } /* POLYMER */ else if ( strncmp(word,"POLYMER",7) == 0 ) { latom = 0; if (reduceTo >= 1) fprintf(outFP, "POLYMER\n"); } /* SLAB */ else if ( strncmp(word,"SLAB",4) == 0 ) { latom = 0; if (reduceTo == 1 ) fprintf(outFP, "POLYMER\n"); else if (reduceTo >= 2) fprintf(outFP, "SLAB\n"); } /* CRYSTAL */ else if ( strncmp(word,"CRYSTAL",7) == 0 ) { latom = 0; if (reduceTo == 1 ) fprintf(outFP, "POLYMER\n"); else if (reduceTo == 2) fprintf(outFP, "SLAB\n"); else if (reduceTo != 0) fprintf(outFP, "CRYSTAL\n"); } /* if PRIMVEC */ else if ( strncmp(word,"PRIMV",5) == 0 ) { latom = 0; ToEndLine(inpFP); /* t.k. */ if ( !ReadVec( inpFP, prim ) ) { fprintf(stderr, "ERROR: Error reading PRIMVEC section "); exit(1); } if (reduceTo >= 1) { if ( strncmp(unit,"angs",4) == 0 ) /* strip "angstrom" unit (if we have xsf2) */ fprintf(outFP, "%s\n", word); else fprintf(outFP, "%s\n", line); PrintVec (outFP, prim); } } /* if CONVVEC */ else if ( strncmp(word,"CONVV",5) == 0 ) { latom = 0; ToEndLine(inpFP); /* t.k. */ if ( !ReadVec( inpFP, conv ) ) { fprintf(stderr, "ERROR: Error reading CONVVEC section "); exit(1); } if (reduceTo > 2) { /* Maybe it is safer to print the CONVVEC only for crystals */ if ( strncmp(unit,"angs",4) == 0) /* strip "angstrom" unit (if we have xsf2) */ fprintf(outFP, "%s\n", word); else fprintf(outFP, "%s\n", line); PrintVec (outFP, conv); } } /* if PRIMCOORD */ else if ( strncmp(word,"PRIMC",5) == 0 ) { latom = 0; ToEndLine(inpFP); fscanf(inpFP, LINE_FMT, _line); n = sscanf(_line,"%d %d", &natr, &idummy); if ( n < 1 ) { fprintf(stderr, "ERROR: Error reading PRIMCOORD section "); exit(1); } if (reduceTo == 0) { int ind; n = sscanf(line,"%s %d", word, &ind); if ( n==1 ) fprintf(outFP,"ATOMS\n"); else if ( n==2 ) fprintf(outFP,"ATOMS %d\n", ind); else { fprintf(stderr, "ERROR: Error reading PRIMCOORD section "); exit(1); } } else { if ( strncmp(unit,"angs",4) == 0) /* strip "angstrom" unit (if we have xsf2) */ fprintf(outFP, "%s\n%d 1\n", word, natr); else fprintf(outFP, "%s\n%d 1\n", line, natr); } for (i=0; i 0 ) { xsf_readPrintCoor (line, outFP); } } } EndLine(inpFP, outFP); line[0] = '\0'; } free(unit); free(word); free(_line); free(line); fclose(inpFP); fclose(outFP); exit(0); } void xsf_dummyReadCoor(FILE *inpFP, int natoms) { int i; char *atm = (char *) malloc( sizeof(char) * 10 ); char *line = (char *) malloc( sizeof(char) * 256 ); /* 256 is max. width */ double x, y, z, fx, fy, fz; char c; for (i=0; i*/ void EndLine(FILE *inpFP, FILE *outFP) { int c; while((c = getc(inpFP)) != '\n' && c != EOF) { if (c != '\r' ) fprintf(outFP,"%c", c); } /*fprintf(outFP, "\n");*/ } void ToEndLine(FILE *inpFP) { int c; while ((c = getc(inpFP)) != '\n' && c != EOF) { ; } } xcrysden-1.6.2/C/MarchCubes.c0000644000175000017500000002642011727355776014445 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/MarchCubes.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include "struct.h" #include "isosurf.h" #include "memory.h" #include "xcfunc.h" #define ASSIGN_GRID2IJK(a,b) a.i = b.ix; a.j = b.iy; a.k = b.iz #define EQUAL_VERTICES(a,b) ( fabs(a.x-b.x) < MINTOL_F && fabs(a.y-b.y) < MINTOL_F && fabs(a.z-b.z) < MINTOL_F ) #define GET_INDEX(i,j,k,N,M,L) ( (k + L*(j + M*i)) ) extern int Polygonise(GRIDCELL grid, float isolevel, GRID ijk, TRIANGLE *triangles, TRIG_INFO *trig_info); extern void VertexRecognise(GRID grd, int ntriangl, TRIANGLE *triangles, int *triangl_status, TRIG_INFO *tri2verIN, XYZ *vertex, int *vertex_status, VERT2TRIG_INFO (*ver2triIN)[MAX_VERTEX_COORDINATION], int *nver2triIN, GRID_INFO *grid_info, int *nvertex); extern void SurfSmoothing(int nstep, float weight, XYZ *vertex, int *vertex_status, VERT2TRIG_INFO (*ver2triIN)[MAX_VERTEX_COORDINATION], TRIG_INFO *tri2verIN, int *nver2triIN, int nvertex); extern void SurfNmlAver(int ntriangl, int nvertex, XYZ *nml, XYZ *vertex, TRIG_INFO *tri2verIN, float *sign, int is_tetrahedral); TRIANGLE *xcRealloc2xBiggerTriangl(TRIANGLE *vec, int *size); TRIG_INFO *xcRealloc2xBiggerTrigInfo(TRIG_INFO *vec, int *size); void MarchCubeNew(ISOSURFACE *iso, float ***gridvalue, float vec[][3], float origin[], int ix, int iy, int iz, float isolevel, int algorithm, int shade_model, int normals_model) { register int i, l, iix, iiy, iiz; register float di, dj, dk, di0, dj0, dk0, di1, dj1, dk1; float incr_vec[3][3]; int mem_size, ntriangl, ntr, nvrt, index, new_maxelem; GRID gr; GRIDCELL grid; GRID_INFO *grid_info; TRIANGLE *triangles; int nvertex; int *vertex_status; float *sign=NULL; /* DEBUGGING_PURPOSES_BEGIN */ /* if (ABS(ix) > 100) ix=8; */ /* if (ABS(iy) > 100) iy=12; */ /* if (ABS(iz) > 100) iz=12; */ /* END */ gr.nx=ix; gr.ny=iy; gr.nz=iz; iix = ix - 1; iiy = iy - 1; iiz = iz - 1; for (i=0; i<3; i++) { incr_vec[0][i] = vec[0][i]/(float)iix; incr_vec[1][i] = vec[1][i]/(float)iiy; incr_vec[2][i] = vec[2][i]/(float)iiz; } /* if (iso->vertex) free( (FREE_ARG) iso->vertex ); if (iso->normal) free( (FREE_ARG) iso->normal ); if (iso->nver2triIN) free( (FREE_ARG) iso->nver2triIN ); if (iso->tri2verIN) free( (FREE_ARG) iso->tri2verIN); */ mem_size = MAX(gr.nx, gr.ny) * MAX(gr.ny, gr.nz); triangles = (TRIANGLE *) malloc( (size_t) sizeof(TRIANGLE) * mem_size ); if ( !triangles ) { xcError("allocation error for triangles"); } iso->tri2verIN = (TRIG_INFO *) realloc((void *) iso->tri2verIN, (size_t)mem_size * sizeof(TRIG_INFO)); grid_info = (GRID_INFO *) malloc((size_t) (gr.nx*gr.ny*gr.nz) * sizeof(GRID_INFO)); if ( !iso->tri2verIN || !grid_info) { xcError("allocation error in Marching Cubes"); } ntriangl=0; for (gr.ix = 0; gr.ix < iix; gr.ix++) { di = (float) gr.ix; for (gr.iy = 0; gr.iy < iiy; gr.iy++) { dj = (float) gr.iy; for (gr.iz = 0; gr.iz < iiz; gr.iz++) { dk = (float) gr.iz; for (l=0; l<3; l++) { di0 = di*incr_vec[0][l]; di1 = (di+1.0)*incr_vec[0][l]; dj0 = dj*incr_vec[1][l]; dj1 = (dj+1.0)*incr_vec[1][l]; dk0 = dk*incr_vec[2][l]; dk1 = (dk+1.0)*incr_vec[2][l]; if(l==0) { grid.p[0].x = origin[l] + di0 + dj0 + dk0; grid.p[1].x = origin[l] + di0 + dj1 + dk0; grid.p[2].x = origin[l] + di1 + dj1 + dk0; grid.p[3].x = origin[l] + di1 + dj0 + dk0; grid.p[4].x = origin[l] + di0 + dj0 + dk1; grid.p[5].x = origin[l] + di0 + dj1 + dk1; grid.p[6].x = origin[l] + di1 + dj1 + dk1; grid.p[7].x = origin[l] + di1 + dj0 + dk1; } else if (l==1) { grid.p[0].y = origin[l] + di0 + dj0 + dk0; grid.p[1].y = origin[l] + di0 + dj1 + dk0; grid.p[2].y = origin[l] + di1 + dj1 + dk0; grid.p[3].y = origin[l] + di1 + dj0 + dk0; grid.p[4].y = origin[l] + di0 + dj0 + dk1; grid.p[5].y = origin[l] + di0 + dj1 + dk1; grid.p[6].y = origin[l] + di1 + dj1 + dk1; grid.p[7].y = origin[l] + di1 + dj0 + dk1; } else { grid.p[0].z = origin[l] + di0 + dj0 + dk0; grid.p[1].z = origin[l] + di0 + dj1 + dk0; grid.p[2].z = origin[l] + di1 + dj1 + dk0; grid.p[3].z = origin[l] + di1 + dj0 + dk0; grid.p[4].z = origin[l] + di0 + dj0 + dk1; grid.p[5].z = origin[l] + di0 + dj1 + dk1; grid.p[6].z = origin[l] + di1 + dj1 + dk1; grid.p[7].z = origin[l] + di1 + dj0 + dk1; } } new_maxelem = ( algorithm == ISOSURF_MARCHING_CUBES ? 5 : 12 ); /* take care of reallocation if necessary !!! */ if ( ntriangl + new_maxelem >= mem_size ) { int mem_size1 = mem_size; triangles = xcRealloc2xBiggerTriangl ( triangles, &mem_size ); iso->tri2verIN = xcRealloc2xBiggerTrigInfo( iso->tri2verIN, &mem_size1 ); } grid.val[0] = gridvalue[gr.ix ][gr.iy ][gr.iz ]; grid.val[1] = gridvalue[gr.ix ][gr.iy+1][gr.iz ]; grid.val[2] = gridvalue[gr.ix+1][gr.iy+1][gr.iz ]; grid.val[3] = gridvalue[gr.ix+1][gr.iy ][gr.iz ]; grid.val[4] = gridvalue[gr.ix ][gr.iy ][gr.iz+1]; grid.val[5] = gridvalue[gr.ix ][gr.iy+1][gr.iz+1]; grid.val[6] = gridvalue[gr.ix+1][gr.iy+1][gr.iz+1]; grid.val[7] = gridvalue[gr.ix+1][gr.iy ][gr.iz+1]; /* index=GET_INDEX(gr.ix,gr.iy,gr.iz, gr.nx, gr.ny, gr.nz); */ index=GET_INDEX(gr.ix,gr.iy,gr.iz, iix, iiy, iiz); grid_info[index].t0=ntriangl; if ( algorithm == ISOSURF_MARCHING_CUBES ) { /* ===> POLYGONISE: MarchingCubes <=== */ ntriangl += Polygonise(grid, isolevel, gr, &triangles[ntriangl], (TRIG_INFO *) &iso->tri2verIN[ntriangl]); } else { /* ===> POLYGONISE: TetrahedralDecomposition <=== */ ntriangl += PolygoniseTetrahedral(grid, isolevel, gr, &triangles[ntriangl], (TRIG_INFO *) &iso->tri2verIN[ntriangl]); } grid_info[index].nt = ntriangl - grid_info[index].t0 + 1; } /* iz */ } } nvertex = ntriangl * 3; /* just in case the ntriangl is 0, then we would have allocation error */ ntr=ntriangl; nvrt=nvertex; if (ntriangl == 0) { ntr=1; nvrt=1; } vertex_status = (int *) malloc(ntr*3 * sizeof(int)); iso->triangl_status = (int *) realloc((void*) iso->triangl_status, ntr * sizeof(int)); iso->vertex = (XYZ *) realloc((void*) iso->vertex, (size_t) nvrt * sizeof(VERTEX) ); iso->vertex_orig = (XYZ *) realloc((void*) iso->vertex_orig, (size_t) nvrt * sizeof(VERTEX) ); iso->normal = (XYZ *) realloc((void*) iso->normal, (size_t) nvrt * sizeof(VERTEX) ); iso->nver2triIN = (int *) realloc((void*) iso->nver2triIN, ntr*3 * sizeof(int)); iso->ver2triIN = (VERT2TRIG_INFO (*)[MAX_VERTEX_COORDINATION]) realloc((void*) iso->ver2triIN, (size_t ) ntr*3 * sizeof(VERT2TRIG_INFO [MAX_VERTEX_COORDINATION]) ); if ( !iso->triangl_status || !vertex_status || !iso->vertex || !iso->vertex_orig || !iso->normal || !iso->nver2triIN || !iso->ver2triIN ) { xcError("allocation error in routine Marching Cubes !!!"); } VertexRecognise(gr, ntriangl, triangles, iso->triangl_status, iso->tri2verIN, iso->vertex, vertex_status, iso->ver2triIN, iso->nver2triIN, grid_info, &nvertex); /* if ( shade_model == ISOSURF_SHADE_SMOOTH ) */ /* { */ /* VertexRecognise(gr, ntriangl, triangles, iso->triangl_status, */ /* iso->tri2verIN, iso->vertex, vertex_status, */ /* iso->ver2triIN, iso->nver2triIN, grid_info, &nvertex); */ /* } */ /* else */ /* { */ /* int ivrt = 0; */ /* nvertex = 3*ntriangl; */ /* for(i=0; ivertex[ivrt] = triangles[i].p[0]; iso->tri2verIN[i].ver_ind[0] = ivrt++; */ /* iso->vertex[ivrt] = triangles[i].p[1]; iso->tri2verIN[i].ver_ind[1] = ivrt++; */ /* iso->vertex[ivrt] = triangles[i].p[2]; iso->tri2verIN[i].ver_ind[2] = ivrt++; */ /* } */ /* } */ /* copy vertices to vertex_orig !!! */ for(i=0; ivertex_orig[i] = iso->vertex[i]; } /*for(i=0; itriangl_status[i] = 1;*/ SurfSmoothing(iso->smooth_nstep, iso->smooth_weight, iso->vertex, vertex_status, iso->ver2triIN, iso->tri2verIN, iso->nver2triIN, nvertex); if ( normals_model == ISOSURF_NORMALS_TRIANGLE ) { SurfNmlAver(ntriangl, nvertex, iso->normal, iso->vertex, iso->tri2verIN, sign, 0); } else { /* TODO: for flat shading and gradient normals --> take normal from the triangle center */ /* HERE */ gradient_SurfNmlNew(origin, incr_vec, gridvalue, gr, ntriangl, iso->tri2verIN, nvertex, iso->vertex, iso->normal); } /* t.k: it seems that we must revert normals if isolevel is positive */ /* for (i=0; i 0.0 ) RevertVectorfv( (float *) &(iso->normal[i]) ); } */ iso->nvertex = nvertex; iso->ntriangl = ntriangl; iso->revertnormals = 0; free( (FREE_ARG) triangles ); free( (FREE_ARG) grid_info ); free( (FREE_ARG) vertex_status ); } void xcSurfSmoothing( ISOSURFACE *iso, float isolevel) { register int i; int *vertex_status; float *sign = NULL; if (iso->ntriangl == 0) return; if (iso->smooth_nstep == 0) return; vertex_status = (int *) xcCalloc(3*iso->ntriangl, sizeof(int)); for(i=0; invertex; i++) iso->vertex[i] = iso->vertex_orig[i]; SurfSmoothing(iso->smooth_nstep, iso->smooth_weight, iso->vertex, vertex_status, iso->ver2triIN, iso->tri2verIN, iso->nver2triIN, iso->nvertex); if (1) { /* normals_algorithm == ISOSURF_NORMALS_TRIANGLE */ SurfNmlAver(iso->ntriangl, iso->nvertex, iso->normal, iso->vertex, iso->tri2verIN, sign, 0); } else { /* enter code here */ } xcFree((void*) vertex_status); } xcrysden-1.6.2/C/readisodata.c0000644000175000017500000003636712352526627014712 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/readisodata.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #include #include #include #include #include "struct.h" #include "isosurf.h" extern ISOSTATE isostate; extern PLANEVERTEX ***plvertex; /* readisodata.c */ int ReadIsoData(int framenum[2 * 100 ][4 ][2], int ntimes); void WriteBinVertexFP(void); int ReadBlock0(int type, int s0, int s1, int s2, int s3); /* ----------------------------------------------------------------------- * WARNING:: this routine is written up to * isodata.maxstack = 3. If more stacks will be * needed, you will have to modified this !!!!!!!!!!!! * ----------------------------------------------------------------------*/ int ReadIsoData(int framenum[2 * ISODATA_MAXFRAME][ISODATA_MAXSTACK][2], int ntimes) { register int i, j, jj, k, s3, s2, s1, s0; int nframe = 0, nframe3[ISODATA_MAXSTACK]; int n0[4], n1[4]; int is_present; int nblock = 0, nblock3, tmpblock; int last_read; int start_read = 0; /* where to start reading */ struct index { int block[ISODATA_MAXBLOCK]; int s0[ISODATA_MAXBLOCK]; int s1[ISODATA_MAXBLOCK]; int s2[ISODATA_MAXBLOCK]; int s3[ISODATA_MAXBLOCK]; } read; /* ----------------------------------------------------------------------- * framenum[][j][] * j=0 --> stack #3 * j=1 --> stack #2 * j=2 --> stack #1 * j=3 --> stack #0 * -----------------------------------------------------------------------*/ /* first calculate the number of blocks; * block is sometning like frame in stack-order 0 */ for (i=0; i * this is considered as an error ) */ sprintf(isodata.error, "some stacks were not properly initialized with \"xc_isodata\" command !!!"); return XC_ERROR; } n1[jj] = framenum[i][j][1]; if ( n1[jj] <= framenum[i][j][0] ) n1[jj] = framenum[i][j][0]; } for (s3=n0[3]; s3 <= n1[3]; s3++) for (s2=n0[2]; s2 <= n1[2]; s2++) for (s1=n0[1]; s1 <= n1[1]; s1++) for (s0=n0[0]; s0 <= n1[0]; s0++) { nblock3 = 0; for (j=0; j 0) tmpblock += s2 * isodata.nframe[s3][1] * isodata.nframe[s3][0]; if (s1 > 0) tmpblock += s1 * isodata.nframe[s3][0]; tmpblock += s0; if ( tmpblock < start_read ) { sprintf(isodata.error, "xc_isodata command was not used properly, because frames are not specified in sequential fashion"); return XC_ERROR; } read.block[nblock] = tmpblock; read.s0[nblock] = s0; read.s1[nblock] = s1; read.s2[nblock] = s2; read.s3[nblock] = s3; nblock++; } last_read = 0; for (j=start_read; j<=read.block[nblock - 1]; j++) { is_present = RB0_DUMMY; for (k=last_read; k findout the number of frames in stack 0 * ----------------------------------------------------- * first two lines are of form: * CRYSTAL95: * -%- MAPN 0 0 0 0 0 0 ********** * 9 13 0.000000 0.000000 0.472432 0.472432 0.000000 * ... * CRYSTAL98: * -%-2MAPN 10 10 0.60279E+00 0.60279E+00 0.50000E+00 * 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 3.83615E+00 3.83615E+00 * 3.83615E+00 0.00000E+00 3.83615E+00 * 7.17593E+04 3.69350E+00 7.58363E-01 1.12803E-01 3.65208E-02 3.65208E-02 * 1.12803E-01 7.58363E-01 3.69350E+00 7.17593E+04 3.69350E+00 3.69350E+00 * ... * * CRYSTAL03: * -%-2MAPN 10 10 0.60279E+00 0.60279E+00 0.50000E+00 * 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 3.83615E+00 3.83615E+00 * 3.83615E+00 0.00000E+00 3.83615E+00 n_atoms dimension * 7.17593E+04 3.69350E+00 7.58363E-01 1.12803E-01 3.65208E-02 3.65208E-02 * 1.12803E-01 7.58363E-01 3.69350E+00 7.17593E+04 3.69350E+00 3.69350E+00 * ... * foreach atom: nat symb x y z * lattice_vec1 * lattice_vec2 * lattice_vec3 * * CRYSTAL06: * -%-0MAPN 28 28 0.20611E+00 0.20611E+00 0.00000E+00 * 0.00000E+00 0.00000E+00 0.00000E+00 5.56500E+00 0.00000E+00 0.00000E+00 * 5.56500E+00 5.56500E+00 0.00000E+00 16 3 */ else if ( type == RB0_FIND ) { int c = 0, nn = 0; int natoms, dim, nat, ia; float x_, y_, z_, lat_; static int oldnx, oldny; char word1[8], word2[8]; while ( c != EOF ) { /* read first line */ /* sprintf(word1,"----",NULL); */ /* sprintf(word2,"----",NULL); */ if ( fscanf(isodata.fp,"%4c %4c",word1,word2) == EOF ) break; /* check if it is CRYSTAL98|03 ??? */ if ( isdigit(word1[3]) ) { fprintf(stderr,"crystal_version == %d\n", crystal_version); if ( (crystal_version == 95) || (crystal_version == 98) || (crystal_version == 3) ) { if ( (n = fscanf(isodata.fp,"%4d%4d %f %f %f", &grdnx,&grdny,&dx,&dy,&cosxy)) != 5 ) { /* maybe we are at the end of file */ while( !((c=fgetc(isodata.fp)) == '\n' || c == EOF) ) { ; } /* maybe it's end of file */ if ( c == EOF ) break; else { sprintf(isodata.error, "ERROR: Error reading unit 25"); return XC_ERROR; } } } else { /* CRYSTAL06 or later */ if ( (n = fscanf(isodata.fp,"%5d%5d %f %f %f", &grdnx,&grdny,&dx,&dy,&cosxy)) != 5 ) { /* maybe we are at the end of file */ while( !((c=fgetc(isodata.fp)) == '\n' || c == EOF) ) { ; } /* maybe it's end of file */ if ( c == EOF ) break; else { sprintf(isodata.error, "ERROR: Error reading unit 25"); return XC_ERROR; } } } } c = fgetc(isodata.fp); while( !(c== '\n' || c == EOF) ) { c = fgetc(isodata.fp); } /* maybe it's end of file */ if ( c == EOF ) break; /* read second line */ if ( crystal_version == 95 ) { if ( (n = fscanf(isodata.fp,"%4d%4d%f %f %f %f %f", &(grd.nx),&(grd.ny),&x0,&y0,&dx,&dy,&cosxy)) != 7 ) { sprintf(isodata.error, "ERROR: Error reading unit 25"); return XC_ERROR; } } else if ( crystal_version == 98 ) { grd.nx = grdnx; grd.ny = grdny; if ( (n = fscanf(isodata.fp,"%f %f %f %f %f %f %f %f %f", &xa, &ya, &za, &xb, &yb, &zb, &xc, &yc, &zc)) != 9 ) { sprintf(isodata.error, "ERROR: Error reading unit 25"); return XC_ERROR; } } else if ( crystal_version == 3 || crystal_version == 6 || crystal_version == 9 || crystal_version == 14) { grd.nx = grdnx; grd.ny = grdny; if ( (n = fscanf(isodata.fp,"%f %f %f %f %f %f %f %f %f %d %d", &xa, &ya, &za, &xb, &yb, &zb, &xc, &yc, &zc, &natoms, &dim)) != 11 ) { sprintf(isodata.error, "ERROR: Error reading unit 25"); return XC_ERROR; } fprintf(stderr,"MAPN: %f %f %f %f %f %f %f %f %f %d %d\n", xa, ya, za, xb, yb, zb, xc, yc, zc, natoms, dim); } newgrd.nx = grd.nx; newgrd.ny = grd.ny; /* check if our reading-file is OK */ if ( !(first_time) && (oldnx != grd.nx || oldny != grd.ny) ) { sprintf(isodata.error, "ERROR: Error reading unit 25"); return XC_ERROR; } oldnx = grd.nx; oldny = grd.ny; first_time = 0; /* read data from isodata.fp and write to binary file */ for (j=0; j isodata.max ) isodata.max = plvertex[ISOOBJ_BASE][k][j].val; } /* ISO SURFACE */ else if ( isodata.dim[ISOOBJ_BASE] == 3 ) { gridvertex[k][j][s1].val += value * isodata.framesign[3][s3] * isodata.framesign[2][s2] * isodata.framesign[1][s1] * isodata.framesign[0][s0]; gridvertex[k][j][s1].p.x = ((float) k / (grd.nx - 1)) * isodata.vec[ISOOBJ_BASE][0].x + ((float) j / (grd.ny - 1)) * isodata.vec[ISOOBJ_BASE][1].x + ((float) s1 / (grd.nz - 1)) * isodata.vec[ISOOBJ_BASE][2].x; gridvertex[k][j][s1].p.y = ((float) k / (grd.nx - 1)) * isodata.vec[ISOOBJ_BASE][0].y + ((float) j / (grd.ny - 1)) * isodata.vec[ISOOBJ_BASE][1].y + ((float) s1 / (grd.nz - 1)) * isodata.vec[ISOOBJ_BASE][2].y; gridvertex[k][j][s1].p.z = ((float) k / (grd.nx - 1)) * isodata.vec[ISOOBJ_BASE][0].z + ((float) j / (grd.ny - 1)) * isodata.vec[ISOOBJ_BASE][1].z + ((float) s1 / (grd.nz - 1)) * isodata.vec[ISOOBJ_BASE][2].z; /*fprintf(fff,"%d %d %d\n%f; %f %f %f\n",k,j,s1, gridvertex[k][j][s1].val, gridvertex[k][j][s1].p.x, gridvertex[k][j][s1].p.y, gridvertex[k][j][s1].p.z);*/ if ( first_t && k == 0 && j == 0 ) { isodata.min = gridvertex[j][k][s1].val; isodata.max = gridvertex[j][k][s1].val; } if ( gridvertex[k][j][s1].val < isodata.min ) isodata.min = gridvertex[k][j][s1].val; else if ( gridvertex[k][j][s1].val > isodata.max ) isodata.max = gridvertex[k][j][s1].val; } } /* if */ } /* for k */ } /* for j */ } /* if */ if ( type == RB0_READ ) first_t = 0; return XC_OK; } xcrysden-1.6.2/C/readPlvertex.c0000644000175000017500000000462011712736221015052 0ustar tonetone/* ***************************************************************************** * Author: * * ------ * * Anton Kokalj Email: Tone.Kokalj@ijs.si * * Department of Physical and Organic Chemistry Phone: x 386 1 477 3523 * * Jozef Stefan Institute Fax: x 386 1 477 3811 * * Jamova 39, SI-1000 Ljubljana * * SLOVENIA * * * * Source: $XCRYSDEN_TOPDIR/C/readPlvertex.c * ------ * * Copyright (c) 1996-2003 by Anton Kokalj * ***************************************************************************** */ #define XC_CPP_NO_STDIO #include "struct.h" #include "isosurf.h" void ReadPlvertex123( int type, int islide ); extern PLANEVERTEX ***plvertex; void ReadPlvertex123( int type, int islide ) { register int i, j; /* gridvertex[x][y][z]; PLANE1 == vec0 x vec1; PLANE2 == vec2 x vec0; PLANE3 == vec1 x vec2; */ /* make islide within [0..nslide-1] */ islide--; if ( type == ISOOBJ_PLANE1 ) { for(i=0; i #include "vector.h" #include "primitives.h" /* xcPrimitives.c */ void xcSolidCage(CellCage cage); void xcWireCage(CellCage cage); void xcSolidVector(RenderVectors vec); void xcParallelogram(int type, float p[4][3], float nml[3]); extern void xcSolidCylinder(GLdouble radius, GLdouble height); extern void xcSolidVector( RenderVectors vec ); extern void xcSolidCone(GLdouble baseradius, GLdouble topradius, GLdouble height); void xcSolidCage( CellCage cage ) { register int i, j; for (i=0; i<6; i++) { glBegin( GL_QUADS ); for (j=0; j<4; j++) { glNormal3fv( cage.normal[i][j] ); glVertex3fv( cage.vertex[i][j] ); } glEnd(); } } void xcWireCage( CellCage cage ) { register int i, j; glDisable( GL_LIGHTING ); for (i=0; i<6; i++) { glBegin( GL_LINE_LOOP ); for (j=0; j<4; j++) { glVertex3fv( cage.vertex[i][j] ); } glEnd(); } glEnable( GL_LIGHTING ); } void xcSolidVector( RenderVectors vec ) { glPushMatrix(); glRotated( vec.arrfi, vec.arrx, vec.arry, vec.arrz ); xcSolidCylinder( vec.vecthick, vec.vecl ); glPopMatrix(); /* now arrow of vector */ glPushMatrix(); glTranslated( vec.coor[0][1], vec.coor[1][1], vec.coor[2][1] ); glRotated( vec.arrfi, vec.arrx, vec.arry, vec.arrz ); xcSolidCone( vec.arrthick, 0.0, vec.arrl ); glPopMatrix(); } void xcParallelogram( int type, float p[4][3], float nml[3] ) { register int i; if ( type == XCPRIM_WIRE ) { glBegin( GL_LINE_LOOP ); glNormal3fv( nml ); for(i=0; i<4; i++) { glVertex3fv( p[i] ); } glEnd(); } else if ( type == XCPRIM_SOLID || type == XCPRIM_SOLID_AND_BORDER ) { glBegin( GL_QUADS ); glNormal3fv( nml ); for(i=0; i<4; i++) { glVertex3fv( p[i] ); } glEnd(); } if ( type == XCPRIM_SOLID_AND_BORDER ) { float color[4] = { 1.0, 1.0, 1.0, 1.0 }; /* disable transparency */ glDisable(GL_BLEND); glDisable( GL_LIGHTING ); glDepthMask(GL_TRUE); /* here border is defined; it is white and the width = 2.0 */ glLineWidth( 2.0 ); glColor4fv( color ); glBegin( GL_LINE_LOOP ); /* front side */ glNormal3fv( nml ); for(i=0; i<4; i++) { glVertex3fv( p[i] ); } glEnd(); glBegin( GL_LINE_LOOP ); /* back side */ glNormal3f( -nml[0], -nml[1], -nml[2] ); for(i=3; i>=0; i--) { glVertex3fv( p[i] ); } glEnd(); } glEnable( GL_LIGHTING ); } xcrysden-1.6.2/tests/0000755000175000017500000000000013556022211013212 5ustar tonetonexcrysden-1.6.2/tests/make_all_tests.sh0000755000175000017500000000074311712736221016551 0ustar tonetone#!/bin/sh if test -z $XCRYSDEN_TOPDIR; then if test -f tests.sh; then XCRYSDEN_TOPDIR=`(cd ../; pwd)` else echo "Please define the XCRYSDEN_TOPDIR variable or execute the script as ./make_all_tests.sh" exit 1 fi fi . $XCRYSDEN_TOPDIR/tests/tests.sh echo "Making all XCRYSDEN tests ... " > $message_file xterm -e tail -f $message_file & # now run the examples structures wien crystal pwscf scripting echo " Tests completed. Please press Ctrl-C. " >> $message_filexcrysden-1.6.2/tests/molecules.tcl0000644000175000017500000000256611712736221015724 0ustar tonetonescripting::multiScript { global env foreach job { {--xyz $env(XCRYSDEN_TOPDIR)/examples/XYZ/mol2.xyz} {--pdb $env(XCRYSDEN_TOPDIR)/examples/GAUSSIAN_files/benzene-6CH3-OCH3.g98} {--xsf $env(XCRYSDEN_TOPDIR)/examples/XSF_Files/1symb.xsf} {--gzmat $env(XCRYSDEN_TOPDIR)/examples/GAUSSIAN_files/benzene-6CH3-OCH3.g98} {--g98_out $env(XCRYSDEN_TOPDIR)/examples/GAUSSIAN_files/benzene.g98_out} } { eval scripting::exec $job } } { scripting::lighting On scripting::display on atomic-labels scripting::displayMode3D Stick scripting::rotate xy +5 +1 5 scripting::displayMode3D Pipe&Ball scripting::display on unicolor-bonds scripting::rotate xy +5 +1 5 scripting::displayMode3D BallStick scripting::rotate xy +5 +1 5 scripting::displayMode3D SpaceFill scripting::rotate xy +5 +1 5 scripting::lighting Off scripting::displayMode2D WireFrame scripting::rotate xy +5 +1 5 scripting::displayMode2D PointLine scripting::rotate xy +5 +1 5 scripting::displayMode2D Pipe&Ball scripting::rotate xy +5 +1 5 scripting::display off unicolor-bonds scripting::displayMode2D BallStick-1 scripting::rotate xy +5 +1 5 scripting::displayMode2D BallStick-2 scripting::rotate xy +5 +1 5 scripting::displayMode2D SpaceFill scripting::rotate xy +5 +1 5 exit }xcrysden-1.6.2/tests/supportInfo.kpath0000644000175000017500000002315611712736221016607 0ustar tonetone================================================================ * * * S U P P O R T I N G I N F O R M A T I O N * * * ================================================================ BEWARE: the conversion of selected k-point coordinates to format suitable for the WIEN2k program is buggy. !!! USE AT YOUR OWN RISK !!! !!! PLEASE CHECK BELOW DATA FOR CONSISTENCY !!! Number of selected k-points: 5 **ORIGINAL DATASET** -------------------- THE FOLLOWING k-POINT WERE SELECTED: (crystal coordinates with respect to RECIPROCAL-PRIMITIVE vectors) 0.00000 0.00000 0.00000 GAMMA 0.25000 0.50000 0.75000 W 0.37500 0.37500 0.75000 K 0.50000 0.50000 0.50000 L 0.00000 0.00000 0.00000 GAMMA **REPRODUCED(TRANSFORMED) DATASET for WIEN2k** ---------------------------------------------- IMPORTANT: Check if the data presented below are consistent with the data from ORIGINAL DATASET !!! Selected k-points in CARTESIAN coordinates: 0.00000 0.00000 0.00000 GAMMA 0.00000 0.11191 0.22383 W 0.00000 0.16787 0.16787 K 0.11191 0.11191 0.11191 L 0.00000 0.00000 0.00000 GAMMA Selected k-points in crystal coordinates: (with respect to RECIPROCAL-PRIMITIVE vectors) 0.00000 0.00000 0.00000 GAMMA 0.25000 0.50000 0.75000 W 0.37500 0.37500 0.75000 K 0.50000 0.50000 0.50000 L 0.00000 0.00000 0.00000 GAMMA Selected k-points in crystal coordinates: (with respect to RECIPROCAL-CONVENTIONAL vectors) 0.00000 0.00000 0.00000 GAMMA 0.00000 0.50000 1.00000 W 0.00000 0.75000 0.75000 K 0.50000 0.50000 0.50000 L 0.00000 0.00000 0.00000 GAMMA Transformed selected k-points for WIEN2k: ---------------------------------------- K-point GAMMA : 0 0 0 / 304 --> 0.0000 0.0000 0.0000 K-point W : 0 48 96 / 96 --> 0.0000 0.5000 1.0000 K-point K : 0 126 126 / 168 --> 0.0000 0.7500 0.7500 K-point L : 118 118 118 / 236 --> 0.5000 0.5000 0.5000 K-point GAMMA : 0 0 0 / 236 --> 0.0000 0.0000 0.0000 The content of the generated WIEN2k k-list file is the following: ---------------------------------------------------------------- GAMMA 0 0 0 304 2.0-8.00 8.00 k-list generated by XCrySDen 0 2 4 304 2.0 0 4 8 304 2.0 0 6 12 304 2.0 0 8 16 304 2.0 0 10 20 304 2.0 0 12 24 304 2.0 0 14 28 304 2.0 0 16 32 304 2.0 0 18 36 304 2.0 0 20 40 304 2.0 0 22 44 304 2.0 0 24 48 304 2.0 0 26 52 304 2.0 0 28 56 304 2.0 0 30 60 304 2.0 0 32 64 304 2.0 0 34 68 304 2.0 0 36 72 304 2.0 0 38 76 304 2.0 0 40 80 304 2.0 0 42 84 304 2.0 0 44 88 304 2.0 0 46 92 304 2.0 0 48 96 304 2.0 0 50 100 304 2.0 0 52 104 304 2.0 0 54 108 304 2.0 0 56 112 304 2.0 0 58 116 304 2.0 0 60 120 304 2.0 0 62 124 304 2.0 0 64 128 304 2.0 0 66 132 304 2.0 0 68 136 304 2.0 0 70 140 304 2.0 0 72 144 304 2.0 0 74 148 304 2.0 0 76 152 304 2.0 0 78 156 304 2.0 0 80 160 304 2.0 0 82 164 304 2.0 0 84 168 304 2.0 0 86 172 304 2.0 0 88 176 304 2.0 0 90 180 304 2.0 0 92 184 304 2.0 0 94 188 304 2.0 0 96 192 304 2.0 0 98 196 304 2.0 0 100 200 304 2.0 0 102 204 304 2.0 0 104 208 304 2.0 0 106 212 304 2.0 0 108 216 304 2.0 0 110 220 304 2.0 0 112 224 304 2.0 0 114 228 304 2.0 0 116 232 304 2.0 0 118 236 304 2.0 0 120 240 304 2.0 0 122 244 304 2.0 0 124 248 304 2.0 0 126 252 304 2.0 0 128 256 304 2.0 0 130 260 304 2.0 0 132 264 304 2.0 0 134 268 304 2.0 0 136 272 304 2.0 0 138 276 304 2.0 0 140 280 304 2.0 0 142 284 304 2.0 0 144 288 304 2.0 0 146 292 304 2.0 0 148 296 304 2.0 0 150 300 304 2.0 W 0 48 96 96 2.0 0 49 95 96 2.0 0 50 94 96 2.0 0 51 93 96 2.0 0 52 92 96 2.0 0 53 91 96 2.0 0 54 90 96 2.0 0 55 89 96 2.0 0 56 88 96 2.0 0 57 87 96 2.0 0 58 86 96 2.0 0 59 85 96 2.0 0 60 84 96 2.0 0 61 83 96 2.0 0 62 82 96 2.0 0 63 81 96 2.0 0 64 80 96 2.0 0 65 79 96 2.0 0 66 78 96 2.0 0 67 77 96 2.0 0 68 76 96 2.0 0 69 75 96 2.0 0 70 74 96 2.0 0 71 73 96 2.0 K 0 126 126 168 2.0 2 125 125 168 2.0 4 124 124 168 2.0 6 123 123 168 2.0 8 122 122 168 2.0 10 121 121 168 2.0 12 120 120 168 2.0 14 119 119 168 2.0 16 118 118 168 2.0 18 117 117 168 2.0 20 116 116 168 2.0 22 115 115 168 2.0 24 114 114 168 2.0 26 113 113 168 2.0 28 112 112 168 2.0 30 111 111 168 2.0 32 110 110 168 2.0 34 109 109 168 2.0 36 108 108 168 2.0 38 107 107 168 2.0 40 106 106 168 2.0 42 105 105 168 2.0 44 104 104 168 2.0 46 103 103 168 2.0 48 102 102 168 2.0 50 101 101 168 2.0 52 100 100 168 2.0 54 99 99 168 2.0 56 98 98 168 2.0 58 97 97 168 2.0 60 96 96 168 2.0 62 95 95 168 2.0 64 94 94 168 2.0 66 93 93 168 2.0 68 92 92 168 2.0 70 91 91 168 2.0 72 90 90 168 2.0 74 89 89 168 2.0 76 88 88 168 2.0 78 87 87 168 2.0 80 86 86 168 2.0 82 85 85 168 2.0 L 118 118 118 236 2.0 116 116 116 236 2.0 114 114 114 236 2.0 112 112 112 236 2.0 110 110 110 236 2.0 108 108 108 236 2.0 106 106 106 236 2.0 104 104 104 236 2.0 102 102 102 236 2.0 100 100 100 236 2.0 98 98 98 236 2.0 96 96 96 236 2.0 94 94 94 236 2.0 92 92 92 236 2.0 90 90 90 236 2.0 88 88 88 236 2.0 86 86 86 236 2.0 84 84 84 236 2.0 82 82 82 236 2.0 80 80 80 236 2.0 78 78 78 236 2.0 76 76 76 236 2.0 74 74 74 236 2.0 72 72 72 236 2.0 70 70 70 236 2.0 68 68 68 236 2.0 66 66 66 236 2.0 64 64 64 236 2.0 62 62 62 236 2.0 60 60 60 236 2.0 58 58 58 236 2.0 56 56 56 236 2.0 54 54 54 236 2.0 52 52 52 236 2.0 50 50 50 236 2.0 48 48 48 236 2.0 46 46 46 236 2.0 44 44 44 236 2.0 42 42 42 236 2.0 40 40 40 236 2.0 38 38 38 236 2.0 36 36 36 236 2.0 34 34 34 236 2.0 32 32 32 236 2.0 30 30 30 236 2.0 28 28 28 236 2.0 26 26 26 236 2.0 24 24 24 236 2.0 22 22 22 236 2.0 20 20 20 236 2.0 18 18 18 236 2.0 16 16 16 236 2.0 14 14 14 236 2.0 12 12 12 236 2.0 10 10 10 236 2.0 8 8 8 236 2.0 6 6 6 236 2.0 4 4 4 236 2.0 2 2 2 236 2.0 GAMMA 0 0 0 236 2.0 END xcrysden-1.6.2/tests/pwscf.tcl0000644000175000017500000000617411712736221015055 0ustar tonetone# ------------------------------------------------------------------------ #****** ScriptingExamples/pw_filters.tcl *** # # NAME # pw_filters.tcl -- check PWscf I/O filters # # USAGE # xcrysden --script pw_filters.tcl # # COPYRIGHT # Anton Kokalj (C) 2004 # # PURPOSE # This is a multiScript that tests the PWscf I/O filters. It uses a multiScript # utility (see example: multiScript.tcl for more detail). # # AUTHOR # Anton Kokalj # # CREATION DATE # Sometime in February 2004 # # SOURCE scripting::multiScript { # ------------------------------------------------------------------------ # This is the MAJOR script # # It opens files, one at a time # ------------------------------------------------------------------------ global env set scripting(verbosity) 0 chdir [file join $env(XCRYSDEN_TOPDIR) examples PWSCF_files] # PWscf input version < 1.2 putsFlush stderr "\n\n\nChecking the pwscfInput<1.2 filter\n\n\n" scripting::exec scripting::filter::pwscfInput EthAl001-2x2.inp 2 { 1 13 2 6 3 1 } # PWscf input version >= 1.2 scripting::exec scripting::filter::pwscfInput CH3Rh111.inp 2 putsFlush stderr "\n\n\nChecking the pwscfInput>=1.2 filter\n\n\n" # PWscf output version < 1.2 foreach option {-ic -oc -lc -a} { putsFlush stderr "\n\n\nChecking the pwscfOutput<1.2 filter option=$option\n\n\n" scripting::exec scripting::filter::pwscfOutput $option EthAl001-2x2.out 2 { 1 13 2 6 3 1 } } # PWscf output version == 1.2 foreach option {-ic -oc -lc -a} { putsFlush stderr "\n\n\nChecking the pwscfOutput==1.2 filter option=$option\n\n\n" scripting::exec scripting::filter::pwscfOutput $option CH3Rh111.out 2 } # PWscf output version > 1.2 chdir [file join $env(XCRYSDEN_TOPDIR) tests data] foreach option {-ic -oc -lc -a} { putsFlush stderr "\n\n\nChecking the pwscfOutput>1.2 filter option=$option\n\n\n" scripting::exec scripting::filter::pwscfOutput $option PWscf_output_v1.3.1.out 2 } } { # ------------------------------------------------------------------------ # This is the MINOR script # # It setup a given structure # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # display the structure in appropriate display-mode # ------------------------------------------------------------------------ scripting::lighting On scripting::displayMode3D spacefill # ------------------------------------------------------------------------ # zoom and rotate the structure # ------------------------------------------------------------------------ scripting::zoom 0.4 scripting::rotate x +60 scripting::rotate y +20 # ------------------------------------------------------------------------ # display 3x3x1 cell # ------------------------------------------------------------------------ scripting::buildCrystal 2 2 1 update # be alive for 5 seconds DisplayUpdateWidget dialog "Example will be alive for 0.5 seconds." after 500 {exit 0} } xcrysden-1.6.2/tests/xc_script.tcl.314020000644000175000017500000000242413525537302016376 0ustar tonetonenamespace eval ::scripting { scripting::filter::fhiInpini /home/tone/prog/XCrySDen1.x/examples/FHI98MD_files/GaAs_inp.ini 3 {Gallium 31 Arsenic 33} #if { [xcIsActive c95] } { # global crystalInput # CalStru # foreach t $crystalInput(two_toplevels) { # destroy $t # } #} scripting::zoom 0.3 scripting::lighting On scripting::buildCrystal 2 2 2 scripting::display on atomic-labels scripting::displayMode3D Stick scripting::rotate xy +5 +1 5 scripting::displayMode3D Pipe&Ball scripting::rotate xy +5 +1 5 scripting::display on unicolor-bonds scripting::displayMode3D BallStick scripting::rotate xy +5 +1 5 scripting::displayMode3D SpaceFill scripting::rotate xy +5 +1 5 scripting::lighting Off scripting::displayMode2D WireFrame scripting::rotate xy +5 +1 5 scripting::displayMode2D PointLine scripting::rotate xy +5 +1 5 scripting::displayMode2D Pipe&Ball scripting::display off unicolor-bonds scripting::rotate xy +5 +1 5 scripting::displayMode2D BallStick-1 scripting::rotate xy +5 +1 5 scripting::displayMode2D BallStick-2 scripting::rotate xy +5 +1 5 scripting::displayMode2D SpaceFill scripting::rotate xy +5 +1 5 exit } xcrysden-1.6.2/tests/fhi_species_name.list0000644000175000017500000000004313525537302017375 0ustar tonetone 2 Gallium Arsenic xcrysden-1.6.2/tests/run_test.sh0000755000175000017500000000140411712736221015420 0ustar tonetone#!/bin/sh if test -z $XCRYSDEN_TOPDIR; then if test -f tests.sh; then export XCRYSDEN_TOPDIR=`(cd ../; pwd)` PATH=$XCRYSDEN_TOPDIR:$PATH else echo "Please define the XCRYSDEN_TOPDIR variable or execute the script as ./make_all_tests.sh" exit 1 fi fi . $XCRYSDEN_TOPDIR/tests/tests.sh if test $# -ne 1 ; then echo " Usage: $0 structures | wien | crystal | pwscf | scripting " exit 1 fi echo " ======================================================================== Running test: $1 ... ======================================================================== " > $message_file xterm -e tail -f $message_file & #pid=$! # execute the test $1 echo " Tests completed. Please press Ctrl-C. " >> $message_file # kill the xterm #kill $pid xcrysden-1.6.2/tests/crystals.tcl0000644000175000017500000000425311712736221015573 0ustar tonetonescripting::multiScript { global env foreach job { {scripting::filter::pwscfInput $env(XCRYSDEN_TOPDIR)/examples/PWSCF_files/EthAl001-2x2.inp 2 {1 13 2 6 3 1}} {scripting::filter::pwscfOutput -oc $env(XCRYSDEN_TOPDIR)/examples/PWSCF_files/EthAl001-2x2.out 2 {1 13 2 6 3 1}} {scripting::filter::crystalInput $env(XCRYSDEN_TOPDIR)/examples/CRYSTALxx_input_files/argonite.r1} {scripting::filter::crystalInput $env(XCRYSDEN_TOPDIR)/examples/CRYSTALxx_input_files/Pt322.r1} {scripting::filter::crystalInput $env(XCRYSDEN_TOPDIR)/examples/CRYSTALxx_input_files/polymer.r1} {scripting::filter::fhiInpini $env(XCRYSDEN_TOPDIR)/examples/FHI98MD_files/GaAs_inp.ini 3 {Gallium 31 Arsenic 33}} {scripting::filter::fhiCoord $env(XCRYSDEN_TOPDIR)/examples/FHI98MD_files/GaAsSurface_coord.out 2 { Gallium 31 Arsenic 33 hy_1.25 1 hy_0.75 1} } {--wien_struct $env(XCRYSDEN_TOPDIR)/examples/WIEN_struct_files/ferrocen.struct} {--xsf $env(XCRYSDEN_TOPDIR)/examples/XSF_Files/fcc-410-1x1.xsf} } { eval scripting::exec $job } } { #if { [xcIsActive c95] } { # global crystalInput # CalStru # foreach t $crystalInput(two_toplevels) { # destroy $t # } #} scripting::zoom 0.3 scripting::lighting On scripting::buildCrystal 2 2 2 scripting::display on atomic-labels scripting::displayMode3D Stick scripting::rotate xy +5 +1 5 scripting::displayMode3D Pipe&Ball scripting::rotate xy +5 +1 5 scripting::display on unicolor-bonds scripting::displayMode3D BallStick scripting::rotate xy +5 +1 5 scripting::displayMode3D SpaceFill scripting::rotate xy +5 +1 5 scripting::lighting Off scripting::displayMode2D WireFrame scripting::rotate xy +5 +1 5 scripting::displayMode2D PointLine scripting::rotate xy +5 +1 5 scripting::displayMode2D Pipe&Ball scripting::display off unicolor-bonds scripting::rotate xy +5 +1 5 scripting::displayMode2D BallStick-1 scripting::rotate xy +5 +1 5 scripting::displayMode2D BallStick-2 scripting::rotate xy +5 +1 5 scripting::displayMode2D SpaceFill scripting::rotate xy +5 +1 5 exit }xcrysden-1.6.2/tests/tests.sh0000644000175000017500000000566313521054341014723 0ustar tonetone# # this file is sourced !!! # here=$XCRYSDEN_TOPDIR/tests base=$XCRYSDEN_TOPDIR/examples if test -z $XCRYSDEN_SCRATCH; then XCRYSDEN_SCRATCH=/tmp fi message_file=$XCRYSDEN_SCRATCH/xc_tests.$$ # ------------------------------------------------------------------------ # STRUCTURES: molecules & crystals examples # ------------------------------------------------------------------------ structures() { echo "1. Executing MOLECULES examples ..." >> $message_file xcrysden -s $here/molecules.tcl echo " 2. Executing CRYSTALS examples ..." >> $message_file xcrysden -s $here/crystals.tcl } # ------------------------------------------------------------------------ # WIEN examples # ------------------------------------------------------------------------ wien() { if test -d $HOME/test/WIEN97/FermiSurface/tic ; then echo " 3. Executing WIEN examples ..." >> $message_file echo " 3.1 Executing Renderdensity-WIEN examples ..." >> $message_file xcrysden --wien_renderdensity $HOME/test/WIEN97/FermiSurface/tic echo " 3.2 Executing Density-WIEN examples ..." >> $message_file xcrysden --wien_density $HOME/test/WIEN97/FermiSurface/tic echo " 3.3 Executing Kpath-WIEN examples ..." >> $message_file xcrysden --wien_kpath $HOME/test/WIEN97/FermiSurface/tic echo " 3.4 Executing Fermisurface-WIEN examples ..." >> $message_file xcrysden --wien_fermis $HOME/test/WIEN97/FermiSurface/tic fi } # ------------------------------------------------------------------------ # CRYSTAL inp|f9 examples # ------------------------------------------------------------------------ crystal() { echo " 4. Executing CRYSTALxx examples ..." >> $message_file echo " 4.1 Please test CRYSTALxx AdvGeom options ..." >> $message_file xcrysden --crystal_inp $base/CRYSTALxx_input_files/Pt_fcc.r1 if test -f $HOME/test/crystal14/urea/urea.f9 ; then echo " 4.2 Please test CRYSTALxx Properties options ..." >> $message_file xcrysden --crystal_f9 $HOME/test/crystal14/urea/urea.f9 fi if test -f $HOME/test/crystal14/urea_UHF/urea_UHF.f9 ; then echo " 4.3 Please test CRYSTALxx Properties options (SPIN-POLARISED) ..." >> $message_file xcrysden --crystal_f9 $HOME/test/crystal14/urea_UHF/urea_UHF.f9 fi } # ------------------------------------------------------------------------ # PWscf I/O examples # ------------------------------------------------------------------------ pwscf() { echo " 5. Executing PWSCF examples ..." >> $message_file xcrysden -s $here/pwscf.tcl } # ------------------------------------------------------------------------ # Scripting examples # ------------------------------------------------------------------------ scripting() { cd $base/Scripting echo " 5. Executing Scripting examples ..." >> $message_file for file in *.tcl do echo " 5.x Executing Scripting example: $file ..." >> $message_file xcrysden -s $file done } xcrysden-1.6.2/tests/data/0000755000175000017500000000000013556022211014123 5ustar tonetonexcrysden-1.6.2/tests/data/PWscf_output_v1.3.1.out0000644000175000017500000007157511712736221020250 0ustar tonetone Program PWSCF v.1.3.1 starts ... Today is 21Dec2003 at 13: 7:52 Parallel version (MPI) Number of processors in use: 6 R & G space division: nprocp = 6 Ultrasoft (Vanderbilt) Pseudopotentials Current dimensions of program pwscf are: ntypx =10 npk =40000 lmax = 3 nchix = 6 ndim = 2000 nbrx = 8 nqfm = 8 noncolin = F gamma_only = F Found additional translation: 0.0000 0.5000 0.0000 Found additional translation: -0.5000 0.0000 0.0000 Found additional translation: 0.5000 0.5000 0.0000 Planes per process (thick) : nr3 =132 npp = 22 ncplane = 3136 Planes per process (smooth): nr3s= 96 npps= 16 ncplanes= 1296 Proc/ planes cols G planes cols G columns G Pool (dense grid) (smooth grid) (wavefct grid) 1 22 264 22918 16 132 8098 40 1318 2 22 264 22914 16 133 8095 41 1319 3 22 263 22913 16 132 8092 40 1316 4 22 265 22917 16 132 8082 40 1316 5 22 264 22916 16 132 8094 40 1314 6 22 265 22917 16 132 8088 40 1316 0 132 1585 137495 96 793 48549 241 7899 Title: Rh(111)-1x1-3L(2R+1F) bravais-lattice index = 0 lattice parameter (a_0) = 10.3139 a.u. unit-cell volume = 2565.4174 (a.u.)^3 number of atoms/cell = 12 number of atomic types = 1 kinetic-energy cutoff = 27.0000 Ry charge density cutoff = 216.0000 Ry convergence threshold = 1.0E-06 beta = 0.3000 number of iterations used = 8 local-TF mixing Exchange-correlation = ? (1434) iswitch = 1 nstep = 50 celldm(1)= 10.31386 celldm(2)= 0.00000 celldm(3)= 0.00000 celldm(4)= 0.00000 celldm(5)= 0.00000 celldm(6)= 0.00000 crystal axes: (cart. coord. in units of a_0) a(1) = ( 1.0000 0.0000 0.0000 ) a(2) = ( -0.5000 0.8660 0.0000 ) a(3) = ( 0.0000 0.0000 2.7000 ) reciprocal axes: (cart. coord. in units 2 pi/a_0) b(1) = ( 1.0000 0.5774 0.0000 ) b(2) = ( 0.0000 1.1547 0.0000 ) b(3) = ( 0.0000 0.0000 0.3704 ) PSEUDO 1 is Rh (US) zval = 9.0 lmax= 2 lloc= 0 Version 0 0 0 of US pseudo code Using log mesh of 1491 points The pseudopotential has 3 beta functions with: l(1) = 1 l(2) = 2 l(3) = 2 Q(r) pseudized with 0 coefficients, rinner = 0.000 0.000 0.000 0.000 0.000 atomic species valence mass pseudopotential Rh 9.00 1.00000 Rh( 1.00) No symmetry! Cartesian axes site n. atom positions (a_0 units) 1 Rh tau( 1) = ( 0.0000000 0.0000000 0.7970369 ) 2 Rh tau( 2) = ( -0.2500000 0.4330127 0.7970369 ) 3 Rh tau( 3) = ( 0.5000000 0.0000000 0.7970369 ) 4 Rh tau( 4) = ( 0.2500000 0.4330127 0.7970369 ) 5 Rh tau( 5) = ( 0.2500000 0.1443376 0.3985196 ) 6 Rh tau( 6) = ( 0.0000000 0.5773503 0.3985196 ) 7 Rh tau( 7) = ( 0.7500000 0.1443376 0.3985196 ) 8 Rh tau( 8) = ( 0.5000000 0.5773503 0.3985196 ) 9 Rh tau( 9) = ( 0.0000000 0.2886751 0.0000000 ) 10 Rh tau( 10) = ( -0.2500000 0.7216878 0.0000000 ) 11 Rh tau( 11) = ( 0.5000000 0.2886751 0.0000000 ) 12 Rh tau( 12) = ( 0.2500000 0.7216878 0.0000000 ) number of k points= 8 gaussian broad. (ryd)= 0.0300 ngauss = 1 cart. coord. in units 2pi/a_0 k( 1) = ( 0.1250000 0.2165064 -0.1851852), wk = 0.2500000 k( 2) = ( 0.1250000 0.5051815 -0.1851852), wk = 0.2500000 k( 3) = ( 0.1250000 -0.3608439 -0.1851852), wk = 0.2500000 k( 4) = ( 0.1250000 -0.0721688 -0.1851852), wk = 0.2500000 k( 5) = ( 0.3750000 0.3608439 -0.1851852), wk = 0.2500000 k( 6) = ( 0.3750000 0.6495191 -0.1851852), wk = 0.2500000 k( 7) = ( 0.3750000 -0.2165064 -0.1851852), wk = 0.2500000 k( 8) = ( 0.3750000 0.0721688 -0.1851852), wk = 0.2500000 G cutoff = 582.0180 ( 137495 G-vectors) FFT grid: ( 56, 56,132) G cutoff = 291.0090 ( 48549 G-vectors) smooth grid: ( 36, 36, 96) nbndx = 520 nbnd = 65 natomwfc = 72 npwx = 1032 nelec = 108.00 nkb = 156 ngl = 5210 warning: negative or imaginary core charge -0.000003 0.000000 Initial potential from superposition of free atoms Starting wfc are atomic total cpu time spent up to now is 14.16 secs iteration # 1 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 1.00E-02, avg # of iterations = 3.1 total energy = -622.57669525 ryd estimated scf accuracy < 1.64134697 ryd total cpu time spent up to now is 41.40 secs iteration # 2 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 1.52E-03, avg # of iterations = 3.4 total energy = -623.08227679 ryd estimated scf accuracy < 1.19488854 ryd total cpu time spent up to now is 70.76 secs iteration # 3 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 1.11E-03, avg # of iterations = 2.9 total energy = -623.74657645 ryd estimated scf accuracy < 0.29377073 ryd total cpu time spent up to now is 94.15 secs iteration # 4 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 2.72E-04, avg # of iterations = 4.8 total energy = -623.95398925 ryd estimated scf accuracy < 0.07318297 ryd total cpu time spent up to now is 127.02 secs iteration # 5 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 6.78E-05, avg # of iterations = 2.5 total energy = -623.95243578 ryd estimated scf accuracy < 0.05731080 ryd total cpu time spent up to now is 151.23 secs iteration # 6 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 5.31E-05, avg # of iterations = 2.5 total energy = -623.94446168 ryd estimated scf accuracy < 0.04532077 ryd total cpu time spent up to now is 174.28 secs iteration # 7 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 4.20E-05, avg # of iterations = 3.2 total energy = -623.96218821 ryd estimated scf accuracy < 0.02719929 ryd total cpu time spent up to now is 209.49 secs iteration # 8 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 2.52E-05, avg # of iterations = 3.2 total energy = -623.96415073 ryd estimated scf accuracy < 0.01237564 ryd total cpu time spent up to now is 238.79 secs iteration # 9 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 1.15E-05, avg # of iterations = 2.4 total energy = -623.96336475 ryd estimated scf accuracy < 0.01170908 ryd total cpu time spent up to now is 264.09 secs iteration # 10 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 1.08E-05, avg # of iterations = 2.0 total energy = -623.96666070 ryd estimated scf accuracy < 0.00485021 ryd total cpu time spent up to now is 289.44 secs iteration # 11 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 4.49E-06, avg # of iterations = 3.0 total energy = -623.97032021 ryd estimated scf accuracy < 0.00019838 ryd total cpu time spent up to now is 315.20 secs iteration # 12 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 1.84E-07, avg # of iterations = 6.1 total energy = -623.97039397 ryd estimated scf accuracy < 0.00015625 ryd total cpu time spent up to now is 367.63 secs iteration # 13 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 1.45E-07, avg # of iterations = 2.2 total energy = -623.97047931 ryd estimated scf accuracy < 0.00001218 ryd total cpu time spent up to now is 390.01 secs iteration # 14 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 1.13E-08, avg # of iterations = 4.4 total energy = -623.97048454 ryd estimated scf accuracy < 0.00000557 ryd total cpu time spent up to now is 424.11 secs iteration # 15 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 5.16E-09, avg # of iterations = 3.4 k = 0.1250 0.2165-0.1852 ( 6096 PWs) bands (ev): -2.2098 -0.9494 -0.9494 -0.8431 -0.8390 -0.7072 -0.7072 -0.7065 -0.6480 -0.5040 -0.5040 -0.4192 0.0072 0.0072 0.1447 0.8296 0.9436 0.9436 1.2297 1.4738 1.5504 1.5504 1.5758 1.5916 1.6278 1.8343 1.8564 1.8565 2.0443 2.1548 2.1744 2.4515 2.4515 2.5001 2.5043 3.0692 3.1258 3.2496 3.2496 3.3958 3.4570 3.4570 3.4578 3.6181 3.7471 3.9420 4.0472 4.0472 4.2623 4.3692 4.3692 4.4264 4.5444 4.5444 4.6357 4.6499 4.7443 4.8322 4.8322 5.0139 5.0139 5.0603 5.3200 5.8485 5.8485 k = 0.1250 0.5052-0.1852 ( 6060 PWs) bands (ev): -1.2288 -0.8472 -0.3515 -0.3240 -0.3217 -0.2695 -0.2369 -0.0698 -0.0295 0.0156 0.0568 0.1600 0.4411 0.5070 0.5863 0.6312 0.8885 0.9222 1.0492 1.0590 1.1383 1.2601 1.5311 1.6363 1.8251 1.8276 1.9518 1.9724 2.0099 2.0449 2.0630 2.1493 2.2316 2.3549 2.4183 2.4212 2.5468 2.5482 2.6103 2.6462 2.7395 3.0972 3.1123 3.2444 3.3196 3.4033 3.4366 3.4433 3.6334 3.6630 3.8446 4.0171 4.0332 4.1123 4.2107 4.3662 4.3887 4.5936 4.6934 4.6973 4.7964 4.9153 4.9773 4.9775 6.2605 k = 0.1250-0.3608-0.1852 ( 6086 PWs) bands (ev): -1.7620 -0.8051 -0.6296 -0.5722 -0.5366 -0.5004 -0.4665 -0.3415 -0.3055 -0.3049 -0.2941 -0.1662 0.2282 0.3739 0.4708 0.8350 0.8989 0.9247 1.0475 1.1919 1.4120 1.4849 1.5154 1.5674 1.7451 1.8172 1.9353 1.9794 2.0552 2.1459 2.1908 2.1922 2.2212 2.3121 2.7563 2.8954 2.8985 2.9121 2.9400 3.0793 3.1139 3.2028 3.2221 3.2585 3.3586 3.4147 3.5073 3.7762 3.7996 3.8663 4.0714 4.2164 4.2395 4.2996 4.3752 4.5563 4.5933 4.7115 4.7517 4.7771 4.9668 4.9802 5.0464 5.5904 5.9655 k = 0.1250-0.0722-0.1852 ( 6098 PWs) bands (ev): -2.4560 -1.1062 -1.0554 -1.0554 -1.0440 -0.9437 -0.8361 -0.8147 -0.8147 -0.6097 -0.5792 -0.5792 -0.1738 -0.1128 -0.1128 0.8724 0.8724 0.9120 1.4404 1.4734 1.4810 1.4810 1.6240 1.6562 1.6853 1.8102 1.8102 1.9058 1.9492 2.1476 2.1705 2.3032 2.6292 2.6563 2.6563 3.3433 3.3433 3.4133 3.4693 3.4887 3.5125 3.5773 3.5773 3.6535 4.1088 4.2756 4.5197 4.5206 4.5206 4.5814 4.5814 4.6126 4.7039 4.7039 4.7865 4.8195 4.8536 4.9966 4.9966 5.1997 5.1997 5.2099 5.2615 5.7269 6.2232 k = 0.3750 0.3608-0.1852 ( 6060 PWs) bands (ev): -1.2288 -0.8472 -0.3515 -0.3240 -0.3217 -0.2695 -0.2369 -0.0698 -0.0295 0.0156 0.0568 0.1600 0.4411 0.5070 0.5863 0.6312 0.8885 0.9222 1.0492 1.0590 1.1383 1.2601 1.5311 1.6363 1.8251 1.8276 1.9518 1.9724 2.0099 2.0449 2.0630 2.1493 2.2316 2.3549 2.4183 2.4212 2.5468 2.5482 2.6103 2.6462 2.7395 3.0972 3.1123 3.2445 3.3196 3.4033 3.4366 3.4433 3.6334 3.6630 3.8446 4.0171 4.0332 4.1123 4.2107 4.3662 4.3887 4.5936 4.6934 4.6973 4.7964 4.9153 4.9773 4.9775 6.2605 k = 0.3750 0.6495-0.1852 ( 6076 PWs) bands (ev): -0.7841 -0.7841 -0.3957 -0.1344 -0.1295 -0.0564 -0.0564 0.0646 0.1024 0.1024 0.2109 0.2224 0.3626 0.5007 0.5153 0.5153 0.8648 0.9334 0.9334 1.2227 1.2438 1.5010 1.5010 1.5526 1.5996 1.5996 1.6002 1.7221 1.7221 1.7427 2.0184 2.0829 2.2125 2.2448 2.3369 2.3396 2.3396 2.3908 2.5696 2.5696 2.9354 2.9354 3.1799 3.3584 3.4284 3.4284 3.4415 3.5418 3.6535 3.6535 3.9065 4.1540 4.1540 4.3545 4.4249 4.4249 4.4701 4.5406 4.6315 4.6315 4.7232 4.7575 4.8919 4.8919 5.2358 k = 0.3750-0.2165-0.1852 ( 6084 PWs) bands (ev): -1.5788 -0.8852 -0.5177 -0.4826 -0.4826 -0.4416 -0.2501 -0.2391 -0.2391 -0.1523 -0.1314 -0.1314 0.2582 0.5567 0.5567 0.7770 0.9139 0.9139 1.0522 1.1095 1.2890 1.2890 1.5729 1.6342 1.8737 1.8737 1.9739 2.0628 2.0628 2.1051 2.1464 2.1820 2.2263 2.4192 2.6725 2.6725 2.7094 2.7791 2.8545 2.8545 3.0356 3.0843 3.0843 3.2477 3.2478 3.3128 3.4514 3.7787 3.7888 3.7888 3.9982 4.0680 4.0965 4.1522 4.1522 4.2093 4.3616 4.6921 4.6921 4.8557 4.8897 4.9153 5.0723 5.0723 6.1987 k = 0.3750 0.0722-0.1852 ( 6086 PWs) bands (ev): -1.7620 -0.8051 -0.6296 -0.5722 -0.5366 -0.5004 -0.4665 -0.3415 -0.3055 -0.3049 -0.2941 -0.1662 0.2282 0.3739 0.4708 0.8350 0.8989 0.9247 1.0475 1.1919 1.4120 1.4849 1.5154 1.5674 1.7451 1.8172 1.9353 1.9794 2.0552 2.1459 2.1908 2.1922 2.2212 2.3121 2.7563 2.8954 2.8985 2.9121 2.9400 3.0793 3.1139 3.2028 3.2221 3.2585 3.3586 3.4147 3.5073 3.7762 3.7996 3.8663 4.0714 4.2164 4.2395 4.2996 4.3752 4.5563 4.5933 4.7115 4.7517 4.7771 4.9668 4.9802 5.0464 5.5904 5.9655 the Fermi energy is 4.4228 ev ! total energy = -623.97048815 ryd estimated scf accuracy < 0.00000042 ryd band energy sum = 13.91738334 ryd one-electron contribution = -2234.31219562 ryd hartree contribution = 1198.73852017 ryd xc contribution = -221.15086965 ryd ewald contribution = 632.76029287 ryd correction for metals = -0.00623592 ryd convergence has been achieved Forces acting on atoms (Ry/au): atom 1 type 1 force = 0.00011645 -0.00006808 0.00012270 atom 2 type 1 force = 0.00011801 -0.00006987 0.00012036 atom 3 type 1 force = 0.00011810 -0.00007005 0.00012050 atom 4 type 1 force = 0.00011676 -0.00006802 0.00012253 atom 5 type 1 force = 0.00000102 -0.00000068 -0.00000839 atom 6 type 1 force = -0.00000090 0.00000077 -0.00000814 atom 7 type 1 force = -0.00000100 0.00000079 -0.00000813 atom 8 type 1 force = 0.00000107 -0.00000063 -0.00000833 atom 9 type 1 force = 0.00000000 0.00000000 0.00000000 atom 10 type 1 force = 0.00000000 0.00000000 0.00000000 atom 11 type 1 force = 0.00000000 0.00000000 0.00000000 atom 12 type 1 force = 0.00000000 0.00000000 0.00000000 Total force = 0.000365 Total SCF correction = 0.003214 EPSE = 0.10E-03 EPSF = 0.10E-02 UPSCALE = 10.00 ------------------------------------------------------------------------ Search of equilibrium positions: iteration # 1, scf threshold 1.00E-07 ATOMIC_POSITIONS (alat) Rh 0.000011291 -0.000006601 0.797048746 Rh -0.249988558 0.433005926 0.797048519 Rh 0.500011451 -0.000006792 0.797048533 Rh 0.250011321 0.433006105 0.797048730 Rh 0.250000099 0.144337505 0.398518766 Rh -0.000000087 0.577350345 0.398518790 Rh 0.749999903 0.144337647 0.398518792 Rh 0.500000104 0.577350209 0.398518772 Rh 0.000000000 0.288675140 0.000000000 Rh -0.250000000 0.721687840 0.000000000 Rh 0.500000000 0.288675140 0.000000000 Rh 0.250000000 0.721687840 0.000000000 NEW-OLD atomic charge density approx. for the potential warning: negative or imaginary core charge -0.000003 0.000000 total cpu time spent up to now is 464.51 secs iteration # 1 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 9.26E-09, avg # of iterations = 5.4 total energy = -623.97017300 ryd estimated scf accuracy < 0.00032619 ryd total cpu time spent up to now is 509.72 secs iteration # 2 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 3.02E-07, avg # of iterations = 2.0 total energy = -623.97035460 ryd estimated scf accuracy < 0.00014012 ryd total cpu time spent up to now is 537.05 secs iteration # 3 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 1.30E-07, avg # of iterations = 2.0 total energy = -623.97048217 ryd estimated scf accuracy < 0.00000742 ryd total cpu time spent up to now is 560.60 secs iteration # 4 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 6.87E-09, avg # of iterations = 2.2 total energy = -623.97048465 ryd estimated scf accuracy < 0.00000453 ryd total cpu time spent up to now is 582.47 secs iteration # 5 ecut= 27.00 ryd beta=0.30 Davidson diagonalization (with overlap) ethr = 4.20E-09, avg # of iterations = 2.4 k = 0.1250 0.2165-0.1852 ( 6096 PWs) bands (ev): -2.2133 -0.9527 -0.9527 -0.8464 -0.8422 -0.7105 -0.7105 -0.7099 -0.6513 -0.5072 -0.5072 -0.4225 0.0039 0.0039 0.1414 0.8264 0.9403 0.9403 1.2265 1.4706 1.5472 1.5472 1.5726 1.5883 1.6246 1.8311 1.8533 1.8533 2.0411 2.1516 2.1710 2.4482 2.4482 2.4968 2.5010 3.0660 3.1225 3.2464 3.2464 3.3925 3.4538 3.4538 3.4546 3.6149 3.7438 3.9387 4.0439 4.0439 4.2590 4.3660 4.3660 4.4232 4.5411 4.5412 4.6325 4.6466 4.7410 4.8290 4.8290 5.0107 5.0107 5.0571 5.3162 5.8452 5.8452 k = 0.1250 0.5052-0.1852 ( 6060 PWs) bands (ev): -1.2323 -0.8507 -0.3547 -0.3272 -0.3250 -0.2728 -0.2402 -0.0731 -0.0327 0.0123 0.0535 0.1567 0.4379 0.5037 0.5831 0.6279 0.8853 0.9189 1.0459 1.0557 1.1351 1.2569 1.5278 1.6330 1.8218 1.8243 1.9486 1.9692 2.0067 2.0417 2.0598 2.1460 2.2284 2.3517 2.4151 2.4180 2.5435 2.5449 2.6070 2.6430 2.7362 3.0940 3.1091 3.2412 3.3164 3.4000 3.4333 3.4401 3.6302 3.6597 3.8414 4.0139 4.0299 4.1090 4.2075 4.3630 4.3854 4.5904 4.6902 4.6940 4.7931 4.9120 4.9741 4.9743 6.2572 k = 0.1250-0.3608-0.1852 ( 6086 PWs) bands (ev): -1.7655 -0.8084 -0.6330 -0.5755 -0.5399 -0.5037 -0.4698 -0.3448 -0.3089 -0.3081 -0.2974 -0.1694 0.2249 0.3706 0.4675 0.8318 0.8957 0.9214 1.0443 1.1887 1.4088 1.4817 1.5121 1.5641 1.7418 1.8140 1.9322 1.9762 2.0519 2.1427 2.1875 2.1889 2.2180 2.3089 2.7531 2.8922 2.8953 2.9089 2.9368 3.0761 3.1107 3.1995 3.2188 3.2553 3.3554 3.4114 3.5040 3.7729 3.7963 3.8631 4.0682 4.2132 4.2363 4.2963 4.3720 4.5531 4.5901 4.7083 4.7484 4.7738 4.9636 4.9770 5.0431 5.5870 5.9615 k = 0.1250-0.0722-0.1852 ( 6098 PWs) bands (ev): -2.4595 -1.1095 -1.0588 -1.0588 -1.0473 -0.9471 -0.8394 -0.8180 -0.8180 -0.6129 -0.5824 -0.5824 -0.1771 -0.1161 -0.1161 0.8691 0.8691 0.9088 1.4372 1.4702 1.4777 1.4777 1.6208 1.6530 1.6820 1.8071 1.8071 1.9027 1.9460 2.1442 2.1672 2.3000 2.6260 2.6530 2.6530 3.3401 3.3401 3.4101 3.4661 3.4855 3.5093 3.5741 3.5741 3.6502 4.1056 4.2721 4.5165 4.5174 4.5174 4.5782 4.5782 4.6094 4.7007 4.7007 4.7829 4.8163 4.8504 4.9934 4.9934 5.1965 5.1965 5.2067 5.2583 5.7235 6.2182 k = 0.3750 0.3608-0.1852 ( 6060 PWs) bands (ev): -1.2323 -0.8507 -0.3547 -0.3272 -0.3250 -0.2728 -0.2402 -0.0731 -0.0327 0.0123 0.0535 0.1567 0.4379 0.5037 0.5831 0.6279 0.8853 0.9189 1.0459 1.0557 1.1351 1.2569 1.5278 1.6330 1.8218 1.8243 1.9486 1.9692 2.0067 2.0417 2.0598 2.1460 2.2284 2.3517 2.4151 2.4180 2.5435 2.5449 2.6070 2.6430 2.7362 3.0940 3.1091 3.2412 3.3164 3.4000 3.4333 3.4401 3.6302 3.6597 3.8414 4.0139 4.0299 4.1090 4.2075 4.3630 4.3854 4.5904 4.6902 4.6940 4.7931 4.9120 4.9741 4.9743 6.2572 k = 0.3750 0.6495-0.1852 ( 6076 PWs) bands (ev): -0.7876 -0.7876 -0.3991 -0.1377 -0.1328 -0.0598 -0.0598 0.0614 0.0991 0.0991 0.2077 0.2192 0.3593 0.4974 0.5121 0.5121 0.8615 0.9301 0.9301 1.2194 1.2405 1.4978 1.4978 1.5494 1.5963 1.5963 1.5969 1.7189 1.7189 1.7395 2.0152 2.0797 2.2093 2.2416 2.3336 2.3363 2.3363 2.3876 2.5664 2.5664 2.9322 2.9322 3.1766 3.3551 3.4252 3.4252 3.4383 3.5385 3.6503 3.6503 3.9033 4.1507 4.1507 4.3513 4.4216 4.4216 4.4669 4.5374 4.6283 4.6283 4.7200 4.7543 4.8886 4.8886 5.2325 k = 0.3750-0.2165-0.1852 ( 6084 PWs) bands (ev): -1.5823 -0.8886 -0.5210 -0.4859 -0.4859 -0.4449 -0.2534 -0.2424 -0.2424 -0.1557 -0.1347 -0.1347 0.2549 0.5534 0.5534 0.7738 0.9106 0.9106 1.0490 1.1062 1.2857 1.2857 1.5696 1.6309 1.8705 1.8705 1.9706 2.0596 2.0596 2.1020 2.1432 2.1789 2.2231 2.4160 2.6693 2.6693 2.7061 2.7759 2.8513 2.8513 3.0324 3.0810 3.0810 3.2445 3.2445 3.3096 3.4482 3.7754 3.7855 3.7855 3.9950 4.0647 4.0932 4.1489 4.1489 4.2061 4.3584 4.6889 4.6889 4.8525 4.8863 4.9121 5.0691 5.0691 6.1947 k = 0.3750 0.0722-0.1852 ( 6086 PWs) bands (ev): -1.7655 -0.8084 -0.6330 -0.5755 -0.5399 -0.5037 -0.4698 -0.3448 -0.3089 -0.3081 -0.2974 -0.1694 0.2249 0.3706 0.4675 0.8318 0.8957 0.9214 1.0443 1.1887 1.4088 1.4817 1.5121 1.5641 1.7418 1.8140 1.9322 1.9762 2.0519 2.1427 2.1875 2.1889 2.2180 2.3089 2.7531 2.8922 2.8953 2.9089 2.9368 3.0761 3.1107 3.1995 3.2188 3.2553 3.3554 3.4114 3.5040 3.7729 3.7963 3.8631 4.0682 4.2132 4.2363 4.2963 4.3720 4.5531 4.5901 4.7083 4.7484 4.7738 4.9636 4.9770 5.0431 5.5870 5.9615 the Fermi energy is 4.4196 ev ! total energy = -623.97048882 ryd estimated scf accuracy < 0.00000004 ryd band energy sum = 13.89149783 ryd one-electron contribution = -2234.27774969 ryd hartree contribution = 1198.72692110 ryd xc contribution = -221.14997070 ryd ewald contribution = 632.73654679 ryd correction for metals = -0.00623632 ryd convergence has been achieved Forces acting on atoms (Ry/au): atom 1 type 1 force = 0.00010979 -0.00006309 -0.00003058 atom 2 type 1 force = 0.00011013 -0.00006288 -0.00002744 atom 3 type 1 force = 0.00011043 -0.00006315 -0.00002752 atom 4 type 1 force = 0.00010942 -0.00006377 -0.00003012 atom 5 type 1 force = 0.00000738 -0.00000465 -0.00000659 atom 6 type 1 force = 0.00000758 -0.00000466 -0.00000602 atom 7 type 1 force = 0.00000758 -0.00000461 -0.00000603 atom 8 type 1 force = 0.00000738 -0.00000463 -0.00000666 atom 9 type 1 force = 0.00000000 0.00000000 0.00000000 atom 10 type 1 force = 0.00000000 0.00000000 0.00000000 atom 11 type 1 force = 0.00000000 0.00000000 0.00000000 atom 12 type 1 force = 0.00000000 0.00000000 0.00000000 Total force = 0.000261 Total SCF correction = 0.000605 searching for next position (pslinmin)... Eold = -623.97048815 Etot = -623.97048882 DEold = -0.00036533 DEtot = -0.00015109 linmin: 3rd order interpolation Enext = -623.97048882 Xnext= 1.015377 BFGS: convergence achieved, Efinal= -623.97048882 ------------------------------------------------------------------------ Final estimate of positions ATOMIC_POSITIONS (alat) Rh 0.000040716 -0.000023624 0.797055569 Rh -0.249958926 0.432988765 0.797055635 Rh 0.500041140 -0.000024014 0.797055648 Rh 0.250040714 0.432988977 0.797055611 Rh 0.250001417 0.144336670 0.398516864 Rh 0.000001078 0.577349650 0.398517008 Rh 0.750001059 0.144336962 0.398517008 Rh 0.500001427 0.577349382 0.398516865 Rh 0.000000000 0.288675140 0.000000000 Rh -0.250000000 0.721687840 0.000000000 Rh 0.500000000 0.288675140 0.000000000 Rh 0.250000000 0.721687840 0.000000000 Writing file Subs-3L.pun for program phonon PWSCF : 10m19.00s CPU time init_run : 13.76s CPU electrons : 588.89s CPU ( 2 calls, 294.445 s avg) forces : 13.76s CPU ( 2 calls, 6.880 s avg) electrons : 588.89s CPU ( 2 calls, 294.445 s avg) c_bands : 427.88s CPU ( 20 calls, 21.394 s avg) sum_band : 100.90s CPU ( 20 calls, 5.045 s avg) v_of_rho : 13.72s CPU ( 42 calls, 0.327 s avg) newd : 23.26s CPU ( 22 calls, 1.057 s avg) mix_rho : 16.91s CPU ( 20 calls, 0.846 s avg) c_bands : 427.88s CPU ( 20 calls, 21.394 s avg) init_us_2 : 1.54s CPU ( 344 calls, 0.004 s avg) cegterg : 425.62s CPU ( 160 calls, 2.660 s avg) sum_band : 100.90s CPU ( 20 calls, 5.045 s avg) sumbec : 0.10s CPU ( 160 calls, 0.001 s avg) addusdens : 21.21s CPU ( 20 calls, 1.060 s avg) wfcrot : 8.58s CPU ( 8 calls, 1.072 s avg) cegterg : 425.62s CPU ( 160 calls, 2.660 s avg) h_psi : 275.68s CPU ( 673 calls, 0.410 s avg) g_psi : 0.97s CPU ( 505 calls, 0.002 s avg) overlap : 42.59s CPU ( 505 calls, 0.084 s avg) cdiaghg : 52.07s CPU ( 513 calls, 0.102 s avg) update : 11.68s CPU ( 505 calls, 0.023 s avg) last : 5.54s CPU ( 160 calls, 0.035 s avg) h_psi : 275.68s CPU ( 673 calls, 0.410 s avg) init : 56.40s CPU ( 673 calls, 0.084 s avg) firstfft : 100.56s CPU ( 27673 calls, 0.004 s avg) secondfft : 105.98s CPU ( 27673 calls, 0.004 s avg) add_vuspsi : 15.34s CPU ( 673 calls, 0.023 s avg) s_psi : 14.70s CPU ( 673 calls, 0.022 s avg) General routines ccalbec : 66.87s CPU ( 849 calls, 0.079 s avg) cft3 : 30.14s CPU ( 1017 calls, 0.030 s avg) cft3s : 257.20s CPU ( 65788 calls, 0.004 s avg) interpolate : 0.88s CPU ( 42 calls, 0.021 s avg) davcio : 1.01s CPU ( 520 calls, 0.002 s avg) Parallel routines reduce : 108.12s CPU ( 4549 calls, 0.024 s avg) fft_scatter : 224.89s CPU ( 66805 calls, 0.003 s avg) xcrysden-1.6.2/ChangeLog0000644000175000017500000011715313531255506013642 0ustar tonetone************************************************************************ REMARK: this ChangeLog is manually made, hence not all the changes are recorded (some go undocumented) ************************************************************************ Jul & Aug 2019 Anton Kokalj (tone.kokalj@ijs.si) * "Reload" button added to the main window (at the bottom toolbar) that reloads the structure from file; useful for structure building * adding algorithm for reduction of lattice-vectors, i.e., (Wigner-Seitz cell and Brilluouin-zone were incorrect for non reduced lattice-vectors) * compatibility with Quantum ESPRESSO (QE) 6.x, in particular: - aware of the new ibrav lattice definitions of QE (e.g. negative ibrav and ibrav=91); - display of conventional cell-mode for centered lattice display from pw.x output - display of structures from neb.x input file - compatible with "ATOMIC_POSITIONS (crystal_sg)" specs, but it needs pw.x on $PATH * compatibility with CRYSTAL17 * xcrysden ported to Togl2.0; togl is now used as library; togl.c and togl.h removed from xcrysden; because the API of Togl2.0 changed, the syntax of *.xcrysden changed for the togl part; adding the --os and --oldscript command line options for backward-compatibility (with these options old *.xcrysden scripts can be loaded); due to new Togl2.0 "Print To File" on come computers produces blank images; if this happens add "set printSetup(dumpWindow) 1" to ~/.xcrysden/custom-definitions file * Julien Lefevre resolved the interp->result problem and thus made xcrysden compatible with Tcl8.6 (many C files affected) * improving xcrysden script (if xcrysden script was linked, the linkqs were not always resolved correctly) * xcrysden now uses gl2ps-1.4.0 * paraSize.c: adding new routine for determining the size of parallelopiped and fixing a bug in DetermineParapipedSized, where double vectors were wronly copied to float version * readstrf.c: irrespective of whether rendering primitive or convetional cell-mode the MVf.structsize is the same in both cases, so size of atoms is the same in both cases * togl options can be now specified in ~/.xcrysden/custom-definitions file as "set toglOpt(opt) value" * routines xcMakeProjection3D & xcMakeProjection2D were improved and better determine the structure-size * quoting variables in xcrysden script: while having a whitespace in pathname is a bad idea, this modification makes xcrysden at least partially usable (suggested by David Strubbe) * adding new "Save Current State" menu option and new "--print" command line option * "make install" now installs "examples in $(prefix)/share/doc/$(xcrysden)" and makes a link to $(prefix)/share/$(xcrysden)/examples Mon Aug 7 2017 Anton Kokalj (tone.kokalj@ijs.si) * Viewer.tcl: togl's "-accum" set back to "true", because it is required for antialiasing (see the below change of Sat Apr 9 2016). Tue Jan 3 2017 Anton Kokalj (tone.kokalj@ijs.si) * Recently there were a couple of problems reported on the wien2k mailing list concerning fermi surface rendering with wien2k for large k-grids. Peter Blaha fixed the problem by introducing allocatable arrays, so that these problems should be gone (files: wen_readbakgen.f, wn_readbands.f, get_ei.f) Tue Oct 18 2016 Anton Kokalj (tone.kokalj@ijs.si) * readstrf.c: (1) better printout of XSF parsing error to stderr (in some cases there was no error message and hence no hint of what went wrong); (2) improving ReadVoronoi() function: if the file contains a voronoi section, but with zero facets an error was returned; this is now allowed Tue Jul 19 2016 Anton Kokalj (tone.kokalj@ijs.si) * go2crys.tcl: making a workaround to display more than 999 atom for CRYSTAL: xcrysden uses the crystal's EXTPRT keyword, but this prints the number of atoms in I3 fortran format, hence only up to 999. (problem reported by M. K. Singh) Sat May 21 2016 Anton Kokalj (tone.kokalj@ijs.si) * selection.tcl: a guard for acos(x) if x < -1.0 was missing Sat Apr 9 2016 Anton Kokalj (tone.kokalj@ijs.si) * Viewer.tcl: togl's "-accum true" set to "false" Fri Mar 25 2016 Anton Kokalj (tone.kokalj@ijs.si) * fixing ptable utility to work with tcl/tk8.6 Mon Mar 7 2016 Anton Kokalj (tone.kokalj@ijs.si) * adding support to load the structure from Orca (https://orcaforum.cec.mpg.de/) output files. New files: scripts/orca2xsf.sh. Modified files: parseComLinArg.tcl, menu.tcl, usage, xcrysden.1. Mon Jul 27 2015 Anton Kokalj (tone.kokalj@ijs.si) * propertyPlane.tcl: the BLACK-BROWN-WHITE colorplane didn't work for 2D-only datagrids (reported by Matic Poberznik) Thu Aug 14 2014 Anton Kokalj (tone.kokalj@ijs.si) * cygwin.tcl: The if { $xcrys(platform) == "cygwin" } conditional missed the custom implementation of exec command (problem spotted by Gavin Abo) *** needs checking *** Wed Jun 25 2014 Anton Kokalj (tone.kokalj@ijs.si) * making xcrysden aware/compatible with the new CRYSTAL-14 version (files affected: bwid.tcl, runC95.tcl, read25.tcl, propInit.tcl, menu.tcl, state.tcl, check_package.tcl, groupSel.tcl, openInput.tcl, propC95.tcl, gengeom.tcl, xcIsoSurf.c, readisodata.c) * adding a fix as proposed by Martin Kroeker to prevent the XError aborts (his XErrorFunction(*) error handler added to xcAppInit.c) * window grab may cause a crash (reported by Georg Eickerling, Masood Yousaf, Martin Kroeker); the grabs are "catched" now (many Tcl files affacted) * implementing Markus Waldeck's suggestion to honour the value of TMPDIR (or TMP) for the setting of XCRYSDEN_SCRATCH * pwi2xsf.sh: atomic-symbols are printed in capitalized form * fixing the crash due to pressing the /4 shortcuts for non-periodic structures (file: menu.tcl) * visualization of pw.x output file: now it is possible to select only the type of coordinates that actually exist in the output file as to prevent the annoying misses/failures (files: pwPreset.tcl, pwo_coortype.awk) Tue Jun 10 2014 Anton Kokalj (tone.kokalj@ijs.si) * fixing some newly introduced bugs with the last update of pwi2xsf filter (file: pwi2xsf.f) Mon Jun 02 2014 Anton Kokalj (tone.kokalj@ijs.si) * making the pwi2xsf filter aware of new QE syntax for CELL_PARAMETERS units and upgrading to new QE's ibrav definitions (files affected: pwLatgen.f pwi2xsf.f pwError.f) Wed Jun 12 2013 Anton Kokalj (tone.kokalj@ijs.si) * fixing lighting-off EPS printing in scripting::printToFile (thanks to Fadjar Fathurrahman) Thu Jan 24 2013 Anton Kokalj (tone.kokalj@ijs.si) * possible bug fix in (overflow) XC_TranslParamCmd; larger string was written than allocated (in xcAppInit.c) Mon Mar 12 2012 Anton Kokalj (tone.kokalj@ijs.si) * xcrysden: using temporary file (mktemp) for the argument of gdb (suggestion of Tobias Burnus) * stripping off the dependence of xcrysden on Meschach library (this is merely used for some testing purposes) Sat Mar 10 2012 Anton Kokalj (tone.kokalj@ijs.si) * using $(CURDIR) instead of $(PWD) in top Makefile (inspired by Michael Banck) * shank_util.c: print_complex_vector & print_complex_matrix debug routines compiled only if DEBUG is defined (it was reported to cause compilation problems) Fri Mar 09 2012 Anton Kokalj (tone.kokalj@ijs.si) * writing xcrsyden's utility programs man pages (ptable -- simple periodic table, unitconv -- simple energy and length units converter, pwo2.xsf, and pwi2xsf) * updating physical constants for unitconv * several scripts needed patching due to new "make install" type system-wide installation. Also ptable and unitconv now depends on plain tclsh and wish instead of xctclsh and xcrys. * change in packaging: xcrysden-**** directory is now used instead of XCrySDen-**** * using newer gl2ps package (v.1.3.6), increasing the buffersize for gl2psBeginPage + opening the file in binary mode for PDF * further improving "make install" target Mon Feb 20 2012 Anton Kokalj (tone.kokalj@ijs.si) * for crystal structure the cell borders are display by default * fixing nasty bug for displaying isosurfaces for CRYSTALxx package. For some weird reason maximum number of grid points along 3rd direction was only 100 * further fixing of movie-maker (problems with proper writing of image files to scrtach/pwd directories) * fixing some bugs associated with colorplane's thermometer fonts * implementing cd_debug routine to trace changing directories in debug mode * writing xcrysden man page * "make install" now install xcrysden system-wide in $prefix/bin/xcrysden, $prefix/lib/xcrysden/, $prefix/share/xcrysden/). In order to do so, two new few enviromental variables were made use of: XCRYSDEN_LIB_BINDIR, XCRYSDEN_XCRYS_DIR (these is totally transparent for user, which does not need to know about them). Fri Feb 17 2012 Anton Kokalj (tone.kokalj@ijs.si) * correcting spelling correction monocrome to monochrome (may break the old *.xcrysden scripts) Tue Feb 14 2012 Anton Kokalj (tone.kokalj@ijs.si) * adding --custom command line option, which load a custom-definitions like customization from specified file * adding --gXX_out and --gaussian_out command line options (same as --g98_out) * adding --cube and --gXX_cube command line options (same as --g98_cube) * sources of external needed libraries are now download by wget upon request during compilation (no more src and src-all division) * auxil.tcl: fixing bug in positiveInteger proc and implementing argba and allowedValue procs Mon Feb 13 2012 Anton Kokalj (tone.kokalj@ijs.si) * implementing the user $HOME/.xcrysden/custom-definitions configurability for Fermi surface viewer (suggested by Jonathan Denlinger) * use of xcConfigure.sh is deprecated, hence it was moved into scripts/ directory Fri Feb 10 2012 Anton Kokalj (tone.kokalj@ijs.si) * fixing string reading problems for gfortran > 4.5 compiled programs (using Fortran95 intrisincs instead) Tue Jan 31 2012 Anton Kokalj (tone.kokalj@ijs.si) * xcrysden now checks for stale files in $XCRYSDEN_SCRATCH and prompts the user for their deletion Mon Jan 30 2012 Anton Kokalj (tone.kokalj@ijs.si) * fixing movie-maker: some modes did not work properly; files affected xsfAnim.tcl, gifAnim.tcl, movieMaker.tcl, state.tcl Wed Jan 25 2012 Anton Kokalj (tone.kokalj@ijs.si) * tried to fix a long standing bug associated with LoadLights() routine {calling glLightfv() without a rendering context} reborted by Tobias Burnus and others. * disabling stereo for mac * changing default antialias offset parameter to 0.39 * modifying a few emprirical parameters for H-bond determination * disabling crystel-cell mode display buttons for molecules ... ChangeLog discontinued/not-mainted for intermediate period ... Fri Jun 17 2011 Anton Kokalj (tone.kokalj@ijs.si) * pwo2xsf.sh, pwo2xsf_opt.awk: the pw.x optimized coordinates of the QE 4.x are now correctly extracted Thu Mar 31 2011 Anton Kokalj (tone.kokalj@ijs.si) * xcBz.c: fixing a bug reported by P.Blaha (reported to him by somebody else) related to a problem when only two special k-points are selected. Fri May 21 2010 Anton Kokalj (tone.kokalj@ijs.si) * multatom.f: for translation_assymetric_unit display the atoms are not shifted back to the unit-cell anymore (seggestion of HU Shu-jun) * isoContorl.tcl: default isoline color changed to black Fri Jul 31 2009 Anton Kokalj (tone.kokalj@ijs.si) * xcInit.tcl: preventing a welcome window on macosx (bad interaction with the system) * auxil.tcl: an attempt to fix a font support for atomic labels on macosx Thu Jul 30 2009 Anton Kokalj (tone.kokalj@ijs.si) * Viewer.tcl: adding a fine-tune translation-step entry on the toolbox (requested by Stefano Fabris) Wed Jul 29 2009 Anton Kokalj (tone.kokalj@ijs.si) * scroll.tcl, auxil.tcl, Viewer.tcl, dispModes.tcl: implementing a mouse-wheel scrolling of xcrysden's main toolbox * cube2xsf.f: allowing for a free format in the cube file (suggested by Michael Rutter) * g98.tcl: changing the order of the Viewer and the "which MO question" windows calls Tue Jul 28 2009 Anton Kokalj (tone.kokalj@ijs.si) * Viewer.tcl: the Maxi button on the toolbox has a sligtly different action: the whole window is maximized so as to be drawn without window border. Mon Jul 27 2009 Anton Kokalj (tone.kokalj@ijs.si) * scripting.tcl, menu.tcl: adding scripting::save command (suggested by Rong Yu) * menu.tcl, modAtomAttrib.tcl: adding an update button to almost all "Modify" windows Mon Jul 20 2009 Anton Kokalj (tone.kokalj@ijs.si) * cube2xsf.f: adaptation to accept the empty comment line in the cube-file Thu Feb 05 2009 Anton Kokalj (tone.kokalj@ijs.si) * crySetProj.c: fixing a weird bug: it was not able to rotate Fermi Surface under some circumstances, because the wc->VPf.VPfactor was infinite (problem spotted by Pablo de la Mora) * xcrysden: adding an "unset MALLOC_CHECK_" due to problems encountered under openSUSE (thanks to Lorenzo Paulatto) Fri Dec 11 2008 Anton Kokalj (tone.kokalj@ijs.si) * FS_Main.tcl: adding cygwin/windows mouse-wheel support for zooming the Fermi-Surface(s) * xcAppInit.c, Make.cygwin: adding the CYGWIN preprocessor flag (now WIN32 and CYGWIN are two different flags: -DCYGWIN -DWIN32 together are now used for cygwin build of xcrysden with cygwin tcl/tk (this is a unix/windows hybrid, tcl/tk=windows, but all others is unix), whereas only -DWIN32 will be used for pure windows builds (with the mingw support). * edit.tcl: fixing bug for default-editor: "Close" button didn't work. Thu Dec 11 2008 Anton Kokalj (tone.kokalj@ijs.si) * scripting.tcl: "scripting::display as cell-mode" didn't work (spotted by Juergen Spitaler). Fixed. * forces were not saved into *.xcrysden script for periodic structures (reported by Juergen Spitaler): fixed. This implyed also into some changes to ReadXSF routine, which has been chnaged (i.e. improved). * getline.c: adding kind of "reserve" variant of getline() function: if the linker can't find a usable getline() function, i.e., when you get undefined reference to `getline', then add -DHAVE_NO_GETLINE flag to CFLAGS in Make.sys * saveState.tcl: replacing "exec date" with Tcl clock command. Wed Dec 10 2008 Anton Kokalj (tone.kokalj@ijs.si) * porting to CYGWIN: - launch.sh: adding simple lanucher wrapper (used by cygwin version - cygwin.tcl: adding more hacks for cygwin: the main problem there is that Tcl/Tk is compiled as native window applciation, and handles paths as native windows, while cygwin (and many programs therein) handles paths in unix-way - xsfOpen.tcl: on cygwin the gunzip creates write-protected file (a call to chmod +w added) - Viewer.tcl: (1) disabling stereo mode for cygwin, and (2) an attempt to add binding for windows (i.e. mouse-wheel zooming) * pwi2xsf.sh, pwo2xsf.sh, pwo2xsf_old.sh, pwGenNC.sh, run_test.sh: making scripts consistent with the fact that XCRYSDEN_TOPDIR is optional (if not it is obtained from the "process") * togl.c: fixing bug (C++ comment converted into C comment; some compilers complained) * togl_ws.h: adding support for WIN32 OS * xsfAnim.tcl, isoContorl.tcl, stop.gif: adding "stop" button to animations (suggested by LIANG Yunfeng) * gifAnim.tcl, state.tcl, movieMaker.tcl: checking if xcMisc(gif_encoder) and xc(movie_encoder) (i.e. gif and mpef/avi encoders) exists; if not corresponding format is disabled. Wed Dec 03 2008 Anton Kokalj (tone.kokalj@ijs.si) * selection.tcl: distances reported in Angstrom and Bohr units (suggested by P. Blaha). The format of measured distances and angles is configurable now and controlled by select(dist_precision) and select(angl_precision) variables in custom-definitions file (these two variables specify the number of decimal digits for distances and angles, respectively). * introduction of system(c95_crystal) variable for CRYSTAL specification in custom-definitions file: it replaces obsolete system(c95_integrals) and system(c95_scf) variables. * xcConfigure_definitions.sh: the backup of custom-definitions file is now stored to unique filename to omit overwrites; adding an example of select(dist_precision) and select(angl_precision) specification; replacing system(c95_integrals) and system(c95_scf) with system(c95_crystal). * readXYZ.f: crystal fort.33 may contain several snapshots of the structure, now the last one is read (or else several AdvGeom features will not work) Mon Dec 01 2008 Anton Kokalj (tone.kokalj@ijs.si) * xcIsoSurf.c, xcIsoDataGrid.c, isosurf.h, struct.h: from the beginning of xcrysden, the illummination of isosurfaces was the "upside-down", and the bug couldn't be properly fixed, unitl now: The reason was remarkably simple and due to orientation of the isosurface spanning vectors (left/right). Now the orientation is checked, and the isosurface normals reverted if necessary. * MarchCubes.c: fixing SIGSEGV bug in xcSurfSmoothing: vertex_status hasn't been allocated. * parseComLinArg.tcl, genWidgets: don't display xcrysden structure viewer when in Fermi Surface mode * toglZoom.tcl, toolbox.tcl: adding toglZoom:discreteZoom proc so that Fermi-Surface zooming is done click-by-click Fri Nov 28 2008 Anton Kokalj (tone.kokalj@ijs.si) * movieEncoders.tcl: fixing small bug related to file conversion for mencoder. * wigner.f, convexhull.f: xcrysden crashed for the example al2o3.struct: presumambly the cause was the use of stupid "implicit real*8" statement. Explicitly defining the variables + implicit none fixed the problem. * Grapher.tcl: for tcl8.5/tk8.5 the bgraphs have just grown out of screen size: in PlaceGrapher proc a "tkwait visibility $f.can" inserted to force the display of the graph widget before the event takes place. * propertyPlane.tcl: now the colorplane and contours checkbuttons are "on" (i.e. checked) by default (suggested by P. Blaha) * wnDetComOpt.tcl: the Wien2K complex-case was not recognized properly: fixed (thanks to P. Blaha) * wnRunWIEN.tcl: first attempt to support parallel execution of lapw1 and lapw2 (suggested by P. Blaha) * wnFSInit.tcl, wnFS.tcl: updating FS generation procedure to be compatible with WIEN2k_08 according to P. Blaha guidelines (changed question of kgen program seems to be the source of problems). Adding possibility to execute lapw1/lapw2 in parallel. * isoControl.tcl: in the case of 2D data-grid, an error occured if user pressed "Close" button on Control-window: fixed Tue Nov 25 2008 Anton Kokalj (tone.kokalj@ijs.si) * movieMaker.tcl, gifAnim.tcl, menu.tcl, xsfAnim.tcl, realTimeMovie.c, xcAppInit.c, xcTogl.c, xcDisplayFunc.c, xcDisplayFunc2.c, xcSelect.x, struct.h, xcfunc.h: implementing a Movie Maker with three supported modes: + "real-time capture" mode: a display of the Togl window (.mesa) is captured every specified time interval + "every redisplay" mode: whenever Togl winodw is redisplayed a picture is captured + "manual" mode: user continuously presses a "camere-photo" button on the Togl display window for creating movie frames * isoControl.tcl: adding a scale-widget for specifying a time-delay for colorplane/contour animation * togl.c, Viewer.tcl, stereo.tcl: stereo-mode recognition is hopefully fixed * dumpWindow.tcl: adding new proc for dumping the window; the printWidget proc is now obsolete. The dumpWindow proc uses ImageMagicks import utility for window dump, and if image-magick is not present it tries with xwd. * xcConfigure.sh, xcConfigure_definitions.sh, xcConfigure_updateProfile.sh: simplified xcConfigure.sh script, since xcrysden automatically checks for packages now. Only crystal packages is queried by the install script. * system/Make.*: updating Make.sys files (the default is to use the system liubraries now) * scriptingMakeMovie.tcl: scripting::makeMovie::init's options -firstframe -lastframe didn't work: fixed * pwLatgen.f: "ibrav" lattices synchronized with QE definitions, in particular, a nd b vectors for ibrav=5,7,10 have been interchanged. Fri Nov 21 2008 Anton Kokalj (tone.kokalj@ijs.si) * selection.tcl, advGeom2.tcl, auxil.tcl, loadvalues.c, struct.h: enhancing the "measure" procedure (distances, angles, ...): coordinates of selected atoms can be displayed in various units (angs, bohr, crystal-primitive, crystal-convetional, alat). * xcAtomAdd.c, xcDisplayFunc.c: cell-adding mode for ATOMINSE advGeom option was not working - fixed * edit.tcl, auxil.tcl, check_package.tcl, xcInit.tcl: making xcEditFile procedure safer: xcrysden chacks for terminal now (xterm is not anymore present anywere). If there is no terminal found, than defaultEditor will be used for editor * atomlab.f, atoms.inc, advGeom2.tcl: crystal advGeom options ATOMREMO, ATOMSUBS, and ATOMDISP were not working properly, because atomic-label was wrongly determined: fixed Wed Nov 19 2008 Anton Kokalj (tone.kokalj@ijs.si) * movieEncoders.tcl, gifAnim.tcl, mpegParam.tcl, xsfAnim.tcl: improving the movie making: several encoders are supported now: For animated GIF: convert, gifsicle, whirlgif For AVI/MPEG movies: mencoder, ppmtompeg * xcInit.tcl, find_package.tcl: automatic search for external packages that xcrysden uses Mon Aug 25 2008 Anton Kokalj (tone.kokalj@ijs.si) * xsf2xsf.c: fixing bug: the reduction of dimension to 1 (polymer) was not working Wed May 21 2008 Anton Kokalj (tone.kokalj@ijs.si) * fixing bug: molecules (dim==0) have not been loaded from crystal unit-9 (affected proc CellMode) Mon May 19 2008 Anton Kokalj (tone.kokalj@ijs.si) * colors and transparency of isosurfaces have not been saved into *.xcrysden script. Now this feature is implemented. Tue Apr 22 2008 Anton Kokalj (tone.kokalj@ijs.si) * pwi2xsf.f: the COSAB/COSAC/COSBC where wrongly assigned to celldm(4-6) due to typo (spotted by Fan Yang). Tue Mar 25 2008 Anton Kokalj (tone.kokalj@ijs.si) * saveState.tcl: force's attributes were stored, but not requested to load upon executing the script. Tue Feb 5 2008 Anton Kokalj (tone.kokalj@ijs.si) * xcrysden: the XCRYSDEN_TOPDIR and XCRYSDEN_SCRATCH environmental variables are not required anymore, but optional. If not set, the former is obtained from the "process" and the latter is set to /tmp (suggested by P. Giannozzi). Fri Nov 30 2007 Anton Kokalj (tone.kokalj@ijs.si) * xcrysden uses Togl-1.7 now. Files adopted: togl*.* * xcrysden uses gl2ps-1.3.2 now. Files adopted: gl2ps.c, gl2ps.c Wed Nov 14 2007 Anton Kokalj (tone.kokalj@ijs.si) * pwo2xsf_anim.awk, pwo2xsf_opt.awk: adopting to changed pw.x (v4.0) output Wed Jan 24 2007 Anton Kokalj (tone.kokalj@ijs.si) * cube2xsf.f: replaced free format write with the '(3e20.12)' to avoid D fortran exponent (suggested by M.J. Rutter). Fri Dec 08 2006 Anton Kokalj (tone.kokalj@ijs.si) * xcForces.c: fixing severe bug (spotted by Yingli Niu) concerning the length of displayed forces: the length was accounted for twice, so instead of linear scaling the display of forces had quadratic scaling. * multatom.f: funny roundoff problem (found by W. YU). Some atoms were cropped out of the cell that shouldn't be. A small number (1d-10) is now added to before croping, and after this number is subtracted. Mon Nov 09 2006 Anton Kokalj (tone.kokalj@ijs.si) * Viewer.tcl, bz.tcl, FS_Main.tcl, FS_Multi.tcl: adding mouse-wheel support (I finally got a mouse with wheel). Mon Oct 02 2006 Anton Kokalj (tone.kokalj@ijs.si) * atoms.h: correcting radii of noble gases Tue Sep 26 2006 Anton Kokalj (tone.kokalj@ijs.si) * pwo2xsf.sh, pwo2xsf_opt.awk, pwo2xsf_anim.awk, pwo2xsf_neb.awk: adding "-r" flag (for reducing the dimension) to pwo2xsf.sh script. * xsf2xsf.c: fixing bug related to "MOLECULE" keyword Mon Sep 25 2006 Anton Kokalj (tone.kokalj@ijs.si) * readstrf.c, detnsplit.c: fixing a memory-hole bug, that happaned when many atoms were deleted due to their overlap (problem spotted by Dario Alfe) Mon Sep 04 2006 Anton Kokalj (tone.kokalj@ijs.si) * readisodata.c, xcIsoSurf.c: adapting to crystal06 Fri Sep 01 2006 Anton Kokalj (tone.kokalj@ijs.si) * check_package.tcl, xcInit.tcl: adding support for Crystal06 * bwid.tcl, propInit.tcl, read25.tcl: support for Crystal06 * propC95.tcl: support for Crystal06 and IS1/IS2/IS3 shrinking factors Thu Aug 31 2006 Anton Kokalj (tone.kokalj@ijs.si) * ginp.awk: adapting to Crystal06 (adding OPTGEOM support) Tue Aug 22 2006 Anton Kokalj (tone.kokalj@ijs.si) * xsf2xsf.c: bug-fix: when reducing the dimension the group number (DIM-GROUP) should be set to one (reported by Raghani Pushpa). Wed Aug 16 2006 Anton Kokalj (tone.kokalj@ijs.si) * saveState.tcl: fixing bug for display radii which were not reloaded properly. Fri Aug 11 2006 Anton Kokalj (tone.kokalj@ijs.si) * pwo2xsf_neb.awk: fixing a bug in "Forces acting on atoms" rule. Fri Jul 28 2006 Anton Kokalj (tone.kokalj@ijs.si) * pwi2xsf.sh: fixing a bug: if the fortran namelist has been terminated as " /" (i.e. with multiple spaces) that was not properly recognized (reported by Gabriele Sclauzero). Mon May 08 2006 Anton Kokalj (tone.kokalj@ijs.si) * pwo2xsf_anim.awk, pwo2xsf_opt.awk, pwo2xsf_new.awk: bug fix: these scripts were stalled if the output file ended with Forces acting on atoms (Ry/au): line. Sat Apr 08 2006 Anton Kokalj (tone.kokalj@ijs.si) * menu.tcl: proc CellMode (for species MOLECULE the display was not updated: when using the CLUSTER crysta option). Mon Mar 27 2006 Anton Kokalj (tone.kokalj@ijs.si) * openInput.tcl, go2crys.tcl, runC95.tcl, advGeom.tcl: added the possibility to load crystal inputs with "EXTERNAL" keyword (requested by mksingh@cat.ernet.in) * glLight.tcl: the glLight:load proc supplemented (adding a call to glLight:update). * parseComLinArg.tcl: fixing bug: glLights:load -> glLight:load (spotted by Oleksandr Voznyy) Wed Feb 8 2006 Anton Kokalj (tone.kokalj@ijs.si) * xcAppInit.c: "Save Structure and Save" did not work, because Xcrysden hanged in XC_RotationMatrixCmd() (for tcl-custom-command: xc_rotationmatrix get). Bug fixed. * xcSelect.c: sometimes the selection of atoms was difficult (buggy, as nearest atoms were selected instead). Bug fixed in function xcSelectSqn.c Fri Oct 7 2005 Anton Kokalj (tone.kokalj@ijs.si) * pwo2xsf.sh, pwo2xsf_old.sh, pwi2xsf.sh, g98toxsf.sh, gzmat2xsf.sh: adding a few lines of the beginning of each script file to set the locales to "C". This ensures that awk will use "." character and not te "," character as the decimal delimiter. Thu Oct 6 2005 Anton Kokalj (tone.kokalj@ijs.si) * xsf2xsf.c, readstr.c: adding the carriage return "\r" as the newline character. Problem reported by Nuno A. G. Bandeira Tue Jul 19 2005 Anton Kokalj (tone.kokalj@ijs.si) * g98.tcl: correcting small typo: $system(TOPDIR)/bin --> $system(BINDIR) (reported by M.J. Rutter). Thu Jun 9 2005 Anton Kokalj (tone.kokalj@ijs.si) * savestruct.f: fixed a bug in XSF to WIEN2k struct file conversion program. In calculating the frmt(i), the i has been replaced with nat(i). Tue Jun 7 2005 Anton Kokalj (tone.kokalj@ijs.si) (tagged: 1.4.1) * readstr.c: severe bug in XSF reader, function ReadCoor() (observed by M.J. Rutter). The bug was made when fixing some other bug from May 30 2005. The line following the end of PRIMCOORD (or CONVCOORD) section was not read. * xcConfigure.sh, xcConfigure_updateProfile.sh: there were some problems in the installation under CYGWIN (reported by: Guillaume HERLEM). The stderr redirection ">&" was changed to "> output 2>&1". Mon May 30 2005 Anton Kokalj (tone.kokalj@ijs.si) (tagged: 1.4) * readstr.c: the ReadCoor() had a bug in reading XSF's *COORD when forces when present, hence the xc_writeXSF didn't work properly in this case. * improving installation procedure (also fixing a few bugs therein) (files: xcConfigure.sh, xcConfigure_*.sh) Fri May 27 2005 Anton Kokalj (tone.kokalj@ijs.si) * one more bug spotted by Pablo de la Mora: the vectorial EPS print didn't work for the Fermi surfaces (bu fix in file: gl2psPrintTogl.c). * bz.tcl: the unrecognized k-points in k-path selection are now labeled as K.digit. * comments were added to the XSF file format. Comment lines start with the "#" character and can be located only in between the sections, but within a given section. (Files: xsf2xsf.c, readstrf.c, xcReadXSF.c) Thu May 26 2005 Anton Kokalj (tone.kokalj@ijs.si) (v1.3.4) * fixed severe bug: for some lattices the gengeom program hanged (spotted by Chee Kwan GAN). The parallelepipedDiagonal function was added in p2c.f file. Wed May 25 2005 Anton Kokalj (tone.kokalj@ijs.si) (v1.3.3) * enhancing the anaglyph mode; adding also solid-3D modes for anaglyph display (Files: xcAppInit.c, xcDisplayFunc.c, Viewer.Tcl). Mon May 23 2005 Anton Kokalj (tone.kokalj@ijs.si) (v1.3.2) * adding the "xc_stereo" command (xcAppInit.c) for querying if hardware supports the stereo. Querying this via the "catch [togl .t -stereo true]" seems unstable. * adding a call to Set_sInfoArray(interp) into the XC_ReadXSFCmd routine (used for xcrysden --wien_struct) as this option never opens the crystal structure * bz.tcl, wnKPath.tcl: the Emin/Emax patch of Peter Blaha Thu May 12 2005 Anton Kokalj (tone.kokalj@ijs.si) (v1.3.1) * adding examples/Scripting/plot_all_MO.sh to show how to plot all molecular orbitals automatically * FS_Main.tcl (Fermi surface viewer): accelerator keys didn't work (noticed by Jens Kunstmann). Depth-cuing turned-off by default. Default depth-cuing *_ORT_END_F set to 0.5. * kLabels.tcl: Automatic labeling of selected k-points (K-path selection). Thanks for Peter Blaha for the idea and for his k-point labeling lookup table. The most important points for 7 types of Bravais lattices are currently recognized. * replacing the string WIEN97 with WIEN2k * replacing the string CRYSTAL95/98 with CRYSTAL-95/98/03 * changing a bit the File menu layout (adding the PWscf ... cascade) * default diplayed cell for crystal structures set to Conventional * updating to GL2PS v1.2.4: finaly the vectorial EPS printing of Lighting-On mode is good enough. Such printing still takes long time, but the resulting quality of EPS is excellent * two bugs in visualziation of Fermi surface (observed by Pablo de la Mora) were solved: - the origin and size of the parallelepipedal grid that encapsulated the BZ was wrongly determined: the result was that usually one additional gridpoint (per direction) was included in the BZ or alternatively a small part of the FS of the second BZ was located in the first BZ. - fixing the bug of interpolation when the BZ cropping was off. Wed May 11 2005 Anton Kokalj (tone.kokalj@ijs.si) * xcSelect.c: fixing a memory allocation bug (char *atomdata) * xcSelect.c, xcDisplayFunc.c: clean-up of selection lists (no more used) * str2xcr.f, savestruct.f, nn.f: compatibility changes for WIEN2k (contributed by Peter Blaha) Tue May 10 2005 Anton Kokalj (tone.kokalj@ijs.si) * adding anaglyph display mode (contributed by Eric VERFAILLIE ) * adding stereo display mode (contributed by Gerardo Ballabio ) * Making a CVS commit of long-time changes. Many files affected. Mon Jan 17 2005 Anton Kokalj (tone.kokalj@ijs.si) * pwi2xsf.f: fixing the bug for converting the coordinates in crystal units of PWscf input file to XSF format. Mon Sep 13 2004 Anton Kokalj (tone.kokalj@ijs.si) * xcInit.tcl, Viewer.tcl: "wm iconify ." and "wm deiconify ." calls are caught now, as they can fail sometimes Mon Sep 09 2004 Anton Kokalj (tone.kokalj@ijs.si) * fs.c: cleanup (removing some debugging stderr/stdout printout) Sat Sep 04 2004 Anton Kokalj (tone.kokalj@ijs.si) * error in BXSF parser (spotted by Newton Ooi). "BEGIN_BANDGRID_3D" keyword was not recognised. Wed Jul 28 2004 Anton Kokalj (tone.kokalj@ijs.si) (tagged: Beta-1.2.0) * fixing a bug in "scripting::displayWindow resize". Both width and height can be set correctly now (bug reported by Alexander Hannemann). * adding new configuration options for forces (arrows): arrows thickness, color, ... * due to the change of the "X" dummy atom behaviour (see below) it was trivial to implement visualization of vector-field, displaying vectors as arrow. One should use the following XSF syntax: "X x y z vx vy vz", where "X" designates dummy atom, x/y/z is the position, and vx/vy/vz vector components. Files adapted: forces.c loadValues.c, xcForces.c, xcAppInit.c, menu.tcl, forces.tcl * the behaviour of dummy atom "X" (atomic-number 0) was changed: now it cannot have bonds (suggestion of Eric VERFAILLIE). Also its color and display radius can be set.Files affected: readstrf.c, auxil.tcl, modAtomAtrib.tcl * adding configuration options for Coordinate system display (custom color can be set now). Files affected: xcLabels.c, xcDisplayFunc.c, xcAppInit.c, loadValues.c, menu.tcl Tue Jul 27 2004 Anton Kokalj (tone.kokalj@ijs.si) * implementation of display of Fermi Surfaces of all selected bands in one place, i.e., a display called "Merged Bands". New files: cryDispFuncMultiFS.c, FS_Multi.tcl. * fixing a bug for Fermi surface display: for odd k-meshes Fermi surfaces have been shited for one mesh-point. Files adapted: fs.c, crySurf.c, lcasif.c. Thanks to Pablo de la Mora for his useful examples. Fri Jul 23 2004 Anton Kokalj (tone.kokalj@ijs.si) * ginp.awk: adding support for CRYSTAL03's OPTCOORD keyword (problem reported by Mauro Causa) Fri Jul 23 2004 Anton Kokalj (tone.kokalj@ijs.si) * xsfAnim.tcl: bug in the variable-cell XSF parser (reported by Himanshu) Tue Jul 13 2004 Anton Kokalj (tone.kokalj@ijs.si) * readstr.c: fixing routine parsePDBAtomRecord for atom-namess starting with letter 'A' (bug reported by Ole Wieckhorst) Tue Jun 29 2004 Anton Kokalj (tone.kokalj@ijs.si) * scripting.tcl: correcting a typo for printing the EPS or PS file (bug reported by Rudolph Magyar) Fri Jun 04 2004 Anton Kokalj (tone.kokalj@ijs.si) * FS_Main.tcl: the size of the toplevel display window for Fermi-surface was almost zero. Trying to fixing the problem. Not yet completely done. Thu May 06 2004 Anton Kokalj (tone.kokalj@ijs.si) * atoms.h: correcting the Si covalent radius to 1.11 Angstroms Sat Apr 10 2004 Anton Kokalj (tone.kokalj@ijs.si) * adding image-buttons for selecting unit of repetition on the bottom toolbar of the Viewer * writeXSF.c: fixing bug in _writeMolecule() function. Adding (mx,my,mz) vector to atomic coordinates Fri Apr 09 2004 Anton Kokalj (tone.kokalj@ijs.si) * popupMenu.tcl: fixed bug in popupMenu:popup due to wrong call to mainMenu proc (help-menubutton argument was missing) (bug reported by Verfaillie Eric) Fri Apr 02 2004 Anton Kokalj (tone.kokalj@ijs.si) * addind make.include file where the TCL_VER2 and TCL_VER3 are defined for convinience * replacing the Tcl/Tk 8.3.3 sources with Tcl/Tk 8.4.6 sources (on MACOSX Tcl/Tk 8.3.3 makes some problems) * COMPILE_LIBRARY Makefile variable split to COMPILE_TCLTK and COMPILE_MESA Thu Apr 01 2004 Anton Kokalj (tone.kokalj@ijs.si) * xcAppInit.c: defining xcrys(plaform) Tcl variable (allowed values: unix|cygwin|macosx) * xcInit.tcl: on macosx the "." window is not iconified/deiconified * gl2ps.h: chancning "#include " to "#include " Mon Mar 29 2004 Carlo Sbraccia (sbraccia@sissa.it) * pwo2xsf_opt.awk, pwo2xsf_anim.awk: parsing fix for spin-polarized calculation Mon Mar 29 2004 Anton Kokalj (tone.kokalj@ijs.si) * porting xcrysden's CRYSTAL interface for CRYSTAL03. Several files were adapted: xcInitLib.tcl, xcInit.tcl, check_package.tcl, gengeom.tcl, propInit.tcl, bwid.tcl, advGeom2.tcl, advGeom.tcl, runC95.tcl, read25.tcl, dos.tcl, propC95.tcl, isoControl.tcl, isoRender.tcl, grid.tcl, xcIsoSurf.c, readisodata.c, struct.h. * xcrysden: adding -m option for valgrind, i.e., memory checking utility * readisodata.c: fixing a memory leak in routine ReadBlock0 (initialization of plvertex) * usage: updating usage description Mon Mar 22 2004 Anton Kokalj (tone.kokalj@ijs.si) * pwi2xsf.f: improving pwi2xsf filter: (i) for case ibrav==0 && celldm(1)==0, and (ii) coorect parsing of "{bohr}"-kind of strings * adding files Make.macosx-aqua, Make.macosx-x11, Make.macosx-x11.README for compilation on MACOSX (provided by Mike Ford, University of Technology, Sydney) Wed Mar 17 2004 Anton Kokalj (tone.kokalj@ijs.si) * pwKPath.f: writing small program for generating the PWscf formatted k-list * kPath.tcl: adapting file for the PWscf k-list format * romoving xcMaybeDestroyLists function (was no more needed) Fri Mar 05 2004 Anton Kokalj (tone.kokalj@ijs.si) * deleting xcMaybeDelete3DLists function (was no more needed) * C/Makefile: fixing compile target for xsf2xsf (removing TCL_LIB) * menu.tcl: fixing small typos related to cygwin changes (shell filters for openExtStruct) Thu Mar 04 2004 Anton Kokalj (tone.kokalj@ijs.si) * xcrysden finally works reasonable under WIN32/CYGWIN. This requires a wrapper pwd.sh that substitutes a Tcl "pwd" command, among other things ... * atomLabels.tcl: disabling "Font" button for windows, as font-browser does not work there * fixing akward behavior reported by Enrique Batista upon reopening an isosurface control window Wed Mar 03 2004 Anton Kokalj (tone.kokalj@ijs.si) * bwid.tcl: fix for reading the band-widths (emply lines are skipped now) * cleaning the Tcl "exec" code, executing scripts as "exec sh script" (needed for CYGWIN) * writeXSF.c, function _writeMolecule(): fixing for-loop over atoms * Makefile: fixing small typo, target: _sys2 * addOption:parse: fixing small bug for .title window (happens when supplying an unknown option) * Tcl: renaming: xcCatchExec -> xcCatchExecReturn, and adding a few new routines Mon Mar 01 2004 Anton Kokalj (tone.kokalj@ijs.si) * new welcome window * maximum number of bands for Fermi surface increased from 50 to 5000 (struct.h: DATAGRID_MAXSUBINDEX) * ReadBandGrid(): fixing initialization of grid->maxvalue[ib] * adding Help-->about menu entry Sat Feb 27 2004 Anton Kokalj (tone.kokalj@ijs.si) * Fermi-surface: increasing the maximum number of bands from 50 to 5000 (see DATAGRID_MAXSUBINDEX in struct.h) * ReadBandGrid(): grid->maxvalue[ib] was wrongly determined * BXSF: band-selection for --bxsf option * Fermi-surface: display of band-widths in text-widget * FS_Main.tcl: added check for zero-selected bands * adding files: bandwidths.tcl and bandselect.tcl * improving README file Fri Feb 26 2004 Anton Kokalj (tone.kokalj@ijs.si) * xcSelect.c: fix of viewport in selection mode (no more cropping) * saveState.tcl: fix for saving a scalar-field Thu Feb 25 2004 Anton Kokalj (tone.kokalj@ijs.si) * pwo2xsf_old.sh: fixing small bug for -a option for PWscf-output version 1.2 * auxil.tcl: adding putsFlush routine (puts+flush) Wed Feb 25 2004 Anton Kokalj (tone.kokalj@ijs.si) * porting XCRYSDEN to WIN32 under cygwin * CYGWIN: several files were patched * CYGWIN: some new files were added: C/*.cygwin, system/Make.cygwin * CYGWIN: a xcrys.dll is build instead of xcrys, the library loaded from xcInit.tcl * CYGWIN: auxil.tcl/proc WriteFile: $fID -translation {auto lf} * CYGWIN: auxil.tcl/proc xcTkFontName2XLFD: don't query XLFD fontName * CYGWIN: Viewer.tcl&ptable.tcl: widths of some buttons adjusted * scriptingFilter.tcl: I/O filters for PWscf: no more itypNatList reuired for version > 1.2 * tests moving tests from sys_utils/tests/ to tests/ * adding tests for PWscf * auxil.tcl: adding a few evalIn* procs Fri Feb 20 2004 Anton Kokalj (tone.kokalj@ijs.si) * convexhull.f: adding normalization for normal(*) * auxil.f: adding normalize_vec routine Thu Feb 19 2004 Anton Kokalj (tone.kokalj@ijs.si) * forces.c, xcForces.c: visualization of zero-length forces fixed * xcviewport.c: fixing "zooming" bug: sometimes the structure has disappeared when zoomed too much * ChangeLog: the beginning of the ChangeLog ChangeLog ends here xcrysden-1.6.2/COPYRIGHT0000644000175000017500000000167511717431725013367 0ustar tonetone ============================================================================== * * * XCrySDen Copyright / License Information * * * ============================================================================== Copyright (C) 1996--2012 Anton Kokalj 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. 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. 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.xcrysden-1.6.2/version0000644000175000017500000000000513554573706013475 0ustar tonetone1.6.2xcrysden-1.6.2/docs/0000755000175000017500000000000013556022211013000 5ustar tonetonexcrysden-1.6.2/docs/Makefile0000644000175000017500000000210613556022211014437 0ustar tonetone# $Id: Makefile,v 1.4 2019/08/07 15:29:12 tone Exp $ # ------------------------------------------------------------------------ # variables # ------------------------------------------------------------------------ ROBODOC = robodoc --html --multidoc --index #ROBODOC = /temp/tone/building_home/tone/bin/robodoc4.0 --html --multidoc --index EXAMPLES_DIR = ../examples/Scripting XC_TCL_DIR = ../Tcl XC_TCL_FILES = \ scripting.tcl \ scriptingFilter.tcl \ scriptingMakeMovie.tcl \ scriptingScalarField2D.tcl \ scriptingScalarField3D.tcl \ scriptingAtomicLabels.tcl \ auxil.tcl XC_TCL_DIRFILES = $(addprefix $(XC_TCL_DIR)/,$(XC_TCL_FILES)) EXAMPLES_DIRFILES = $(shell ls $(EXAMPLES_DIR)/*.tcl) $(shell ls $(EXAMPLES_DIR)/*.sh) all: scripting_docs scripting_docs: if test ! -d scripting_all/examples; then mkdir -p scripting_all/examples; fi cp $(XC_TCL_DIRFILES) scripting_all/ cp $(EXAMPLES_DIRFILES) scripting_all/examples/ $(ROBODOC) --src ./scripting_all/ --doc ./html_docs rm -rf scripting_all/ clean: -rm -rf html_docs/ -rm *~ veryclean: clean distclean: clean xcrysden-1.6.2/docs/ptable.10000644000175000017500000000177513522567311014353 0ustar tonetone.TH ptable 1 "March 9, 2012" "XCrySDen" "XCrySDen" .SH NAME ptable \- a simple periodic table of elements .SH SYNOPSIS .B ptable .SH DESCRIPTION \fBptable\fR is a plain periodic table of elements. It is a utility program of \fBxcrysden\fR package (\fIhttp://www.xcrysden.org/\fR). .SH "COPYRIGHT" Copyright (C) 1996--2012 Anton Kokalj 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. 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. 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. xcrysden-1.6.2/docs/unitconv.10000644000175000017500000000376313522567407014756 0ustar tonetone.TH unitconv 1 "March 9, 2012" "XCrySDen" "XCrySDen" .SH NAME unitconv \- simple energy and length units converter .SH SYNOPSIS .B unitconv .RI [ unit ] \fIvalue\fR .br .B unitconv .RI [ unit ] \fIexpression\fR .SH DESCRIPTION \fBunitconv\fR is a simple energy and length units converter (written in Tcl). It is a utility program of \fBxcrysden\fR package (\fIhttp://www.xcrysden.org/\fR). .SH ENERGY UNITS The following \fBenergy units\fR are supported. The following list contain the "\fIunit\fR \-\- description" pairs, where the \fIunit\fR is to be specified on the command line. .TP 4 \fBau\fR -- Hartree .TP \fBry\fR -- Rydberg 'TP \fBev\fR -- eV (electron volt) .TP \fBkjm\fR -- kJ/mol .TP \fBkj\fR -- kJ 'TP \fBkcalm\fR -- kcal/mol 'TP \fBkcal\fR -- kcal .SH LENGTH UNITS The following \fBlength units\fR are supported (usage as above): .TP 4 \fBangs\fR -- Angstrom .TP \fBbohr\fR -- Bohr radius 'TP \fBm\fR -- meter .SH EXAMPLES Convert a value from eV to other energy units: \fBunitconv ev 3.25\fR Calculate an expression (values in Rydberg unit) and convert to other energy units (note that expression must be quoted): \fBunitconv ry "-103.134567 - (-240.691356 - -2*17.543471)/2"\fR In expression also mathematical functions available in \fBtclsh\fR can be used. .SH "COPYRIGHT" Copyright (C) 1996--2012 Anton Kokalj 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. 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. 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. xcrysden-1.6.2/docs/pwo2xsf.10000644000175000017500000000430513522567053014507 0ustar tonetone.TH pwo2xsf 1 "August 7, 2019" "XCrySDen" "XCrySDen" .SH NAME pwo2xsf \- convert the pw.x output file to XSF format .SH SYNOPSIS .B pwo2xsf .RI [ special-option ] \fIcoordinates-option\fR [\fIfile\fR] .SH DESCRIPTION \fBpwo2xsf\fR extracts atomic structures from \fBpw.x\fR output file and prints the XSF formated structure data to standard output. It is a utility program of \fBxcrysden\fR package (\fIhttp://www.xcrysden.org/\fR) and XSF is the native \fBxcrysden structure format\fR (\fIhttp://www.xcrysden.org/doc/XSF.html\fR). If \fIfile\fR is not specified then standard input is read. .SH SPECIAL OPTION .TP 4 \fB\-r \fIdim\fR Reduce periodic dimension to \fIdim\fR, i.e., \fIdim\fR = 2, 1, or 0. .SH COORDINATES OPTIONS These options specify which cordinates to extract. The possibilities are: .TP 4 \fB\-ic \fIfile\fR .PD 0 .TP \fB\-\-inicoor \fIfile\fR Extract the initial, that is, input ionic coordinates. .TP 4 \fB\-lc \fIfile\fR .PD 0 .TP \fB\-\-latestcoor \fIfile\fR Extract the latest printed ionic coordinates from pw.x output file. .TP 4 \fB\-oc \fIfile\fR .PD 0 .TP \fB\-\-optcoor \fIfile\fR Similar to "\-\-latestcoor" but extracts just the optimized coordinates if present or else nothing. .TP 4 \fB\-a \fIfile\fR .PD 0 .TP \fB\-\-animxsf \fIfile\fR Extract the coordinates of all ionic steps as Animated-XSF. .TP 4 \fB\-nc file\fR .PD 0 .TP \fB\-\-nebcoor PW.out\fR Extract the coordinates and forces from the \fBPW.out\fR file of NEB (path) calculation. .SH "COPYRIGHT" Copyright (C) 1996--2019 Anton Kokalj 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. 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. 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. xcrysden-1.6.2/docs/xcrysden.10000644000175000017500000001604313525475300014734 0ustar tonetone.TH xcrysden 1 "August 7, 2019" "XCrySDen" "XCrySDen" .SH NAME xcrysden \- crystalline and molecular structure visualizer .SH SYNOPSIS .B xcrysden .RI [ special-options ] .br .B xcrysden .RI [ special-options ] \fIformat-options\fR \fIfile\fR|\fIdirectory\fR .SH DESCRIPTION \fBXCrySDen\fR is a crystalline and molecular structure visualisation program, which aims at display of isosurfaces and contours, which can be superimposed on crystalline structures and interactively rotated and manipulated. .SH SPECIAL OPTIONS .TP 4 \fB\-h .PD 0 .TP \fB\-\-help Display help message. .TP \fB\-v .PD 0 .TP \fB\-\-version Display program version information. .TP \fB\-u \fIid\fR .PD 0 .TP \fB\-\-use\fR \fIid\fR Load XCrySDen embedded into container window with window-ID=\fIid\fR. .TP \fB\-r \fIdim .PD 0 .TP \fB\-\-reducedim \fIdim\fR Reduce periodic dimension of XSF file to \fIdim\fR. Must be specified before \fB\-\-xsf\fR option, e.g., \fBxcrysden \-r\fR 2 \fB\-\-xsf \fIfile\fR. .TP \fB\-c \fIfile\fR .PD 0 .TP \fB\-\-custom \fIfile\fR Load custom\-definitions from a specified file (the syntax is that of \fB~/.xcrysden/custom\-definitions\fR). .TP \fB\-a \fIfile\fR .PD 0 .TP \fB\-\-attributes \fIfile\fR Load attributes from file. The format of the attributes file is the following: \fBELEMENTCOLOR \fIatomic-number1 red1 blue1 green1 atomic-number2 red2 blue2 green2 \fR... \fBELEMENTRADIUS \fIatomic-number1 radius1 atomic-number2 radius2 \fR... .TP \fB\-l \fIfile\fR .PD 0 .TP \fB\-\-lights \fIfile\fR Load lights parameters from XCrySDen's lights formatted file. .SH FORMAT OPTIONS .TP 4 \fB\-\-xsf \fIfile\fR Load structure from XCrySDen's-Structure-File (XSF) formatted file. .TP \fB\-\-animxsf \fIfile\fR .PD 0 .TP \fB\-\-axsf \fIfile\fR Load structures from Animated-XCrySDen's-Structure-File (AXSF) formatted file. .TP .PD 1 \fB\-\-bxsf \fIfile\fR Load bands from BXSF (Band-XSF) file and visualize Fermi Surface. .TP \fB\-\-xmol \fIfile\fR .PD 0 .TP \fB\-\-xyz \fIfile\fR Load structure from XYZ formatted file. .TP \fB\-\-pdb \fIfile\fR Load structure from PDB formatted file. .TP \fB\-\-gzmat \fIfile\fR Load structure from Gaussian Z-matrix (requires Open-Babel program). .TP \fB\-\-gaussian_out \fIfile\fR .PD 0 .TP \fB\-\-gxx_out \fIfile\fR .PD 0 .TP \fB\-\-g98_out \fIfile\fR Load structure from Gaussian output file. Only single point calculation and optimization run is supported so far. For the optimization run it is possible to render all the structures that were produced during the run. .TP \fB\-\-cube \fIfile\fR .PD 0 .TP \fB\-\-gXX_cube \fIfile\fR .PD 0 .TP \fB\-\-g98_cube \fIfile\fR Load structure from Gaussian cube file. The cube file should be produced with the Cube=Cards option. Only scalar cube files are supported, that is, Cube=(Cards,Density) or Cube=(Cards,Orbitals) or Cube=(Cards,Potential). Refer to GAUSSIAN manual for the meaning of this keywords. .TP \fB\-\-orca_out \fIfile\fR Load structure(s) from Orca output file. Only Geometry optimization outputs were tested so far. .TP \fB\-\-crystal_inp \fIfile\fR Load structure from CRYSTAL (\fIhttp://http://www.crystal.unito.it/\fR) input file. .TP\fB \-\-crystal_f9 \fIfile\fR Load structure from CRYSTAL (\fIhttp://http://www.crystal.unito.it/\fR) fortran unit 9. .TP \fB\-\-wien_struct \fIfilehead\fR|\fIfile\fR|\fIdirectory\fR Load structure from WIEN2k (\fIhttp://www.wien2k.at/\fR) struct-file, where: \fIfilehead\fR = name of struct file without \fB.struct\fR extension, \fIfile\fR = filename, \fIdirectory\fR = name of case directory. .TP \fB\-\-wien_kpath \fIdirectory\fR|\fIstruct-file\fR Read \fIstruct\fR file and render first Brillouin zone with special k-points. K-path can be selected interactively by mouse-clicking the special k-points. User must specify \fIEMIN\fR and \fIEMAX\fR energies and total number of k-points along the path. This number is merely an estimation of total number of k-points, since XCrySDen tries to get very uniform sampling of k-points along the path (don't specify WIEN2k maximum allowed number of k-points, since XCrySDen maight generate few points more). .TP \fB\-\-wien_renderdensity \fIdirectory\fR Read \fIstruct\fR, \fIoutput\fR, and \fIrho\fR files and renders crystalline structure and precomputed charge density. .TP \fB\-\-wien_density \fIdirecory\fR Either 2D or 3D region for charge density calculation is interactively chosen by mouse-clicking. XCrySDen generates \fIin5\fR file(s), calculates and renders charge density either as isolines/colorplanes (2D) or isosurfaces (3D). .TP \fB\-\-wien_fermisurface \fIdirectory\fR Pop-up a task window for Fermi surface creation. After several steps the Fermi surface is (hopefully) drawn as 3D isosurface. .TP \fB\-\-fhi_inpini \fIfile\fR Load structure from FHI98MD \fBinp.ini\fP formatted file. .TP \fB\-\-fhi_coord \fIfile\fR Load structure from FHI98MD \fBcoord.out\fR formatted file. .TP \fB\-\-pwi .PD 0 .TP \fB\-\-pw_inp \fIfile\fR Load structure from \fBpw.x input\fR file. \fBpw.x\fR is a pseudopotential planewave program of the Quantum-ESPRESSO distribution (\fIhttp://www.quantum-espresso.org/\fR). .TP \fB\-\-pwo .PD 0 .TP \fB\-\-pw_out \fIfile\fR Load structure from \fBpw.x output\fR file. \fBpw.x\fR is a pseudopotential planewave program of the Quantum-ESPRESSO distribution (\fIhttp://www.quantum-espresso.org/\fR). .TP \fB\-s \fIscript\fR .PD 0 .TP \fB\-\-script \fIscript\fR Load script from file containing Tcl script. .TP \fB\-\-os \fIscript\fR .PD 0 .TP \fB\-\-oldscript \fIscript\fR Load old-formatted script (prior to xcrysden-1.6) from file. .TP \fB\-\-print \fIfilename\fR Print the displayed structure to a file and exit. This is useful within the shell scripts to achieve "automatic" printing. Example: xcrysden --xsf file.xsf --script state.xcrysden --print file.png In this example "--xsf file.xsf" loads the structure from XSF file, "--script state.xcrysden" setups a desired display (such a script is typically created via File-->Save Current State menu option) and "--print file.png" prints the displayed structure to a file and exits xcrysden. .SH "SEE ALSO" Fore more information about \fBXCrySDen\fR, see: .br \fIhttp://www.xcrysden.org/\fR. Further documentation is available at: .br \fIhttp://www.xcrysden.org/Documentation.html\fR. .SH "COPYRIGHT" Copyright (C) 1996--2019 Anton Kokalj 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. 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. 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. xcrysden-1.6.2/docs/pwi2xsf.10000644000175000017500000000306713525475235014510 0ustar tonetone.TH pwi2xsf 1 "August 7, 2019" "XCrySDen" "XCrySDen" .SH NAME pwi2xsf \- convert the pw.x input file to XSF format .SH SYNOPSIS .B pwi2xsf .RI [ \-r ] \fIfile\fR .SH DESCRIPTION \fBpwi2xsf\fR extracts the atomic structure from \fBpw.x\fR or \fBneb.x\fR input file and prints the XSF formatted structure data to standard output. It is a utility program of \fBxcrysden\fR package (\fIhttp://www.xcrysden.org/\fR) and XSF is the native \fBxcrysden structure format\fR (\fIhttp://www.xcrysden.org/doc/XSF.html\fR). If \fIfile\fR is specified as "-" then standard input is read. .SH OPTION .TP 4 \fB\-r For old \fBpw.x\fR versions < 1.2 one must spefify the \fIityp\fR-->\fInat\fR conversion and the corresponding data are written to file \fInuclei.charges\fR. The \fB\-r\fR flag deletes this file as to force new \fIityp\fR-->\fInat\fR specification. .SH "COPYRIGHT" Copyright (C) 1996--2019 Anton Kokalj 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. 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. 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. xcrysden-1.6.2/sys_utils/0000755000175000017500000000000013556022211014106 5ustar tonetonexcrysden-1.6.2/sys_utils/wrappers.sh0000755000175000017500000000116613522764131016323 0ustar tonetone for cmd in xcrysden pwo2xsf pwi2xsf ptable unitconv do cat > $cmd.wrapper << EOF #!/bin/sh -f # simple wrapper to run $cmd XCRYSDEN_TOPDIR="$prefix/share/$xcrysden" XCRYSDEN_LIB_BINDIR="$prefix/lib/$xcrysden" export XCRYSDEN_TOPDIR export XCRYSDEN_LIB_BINDIR EOF done cat >> xcrysden.wrapper <> pwo2xsf.wrapper <> pwi2xsf.wrapper <> ptable.wrapper <> unitconv.wrapper < $1 rm -f $dir/Makefile.bck } if test $# -lt 2 ; then echo " Usage: $0 topdir in-tarball [suffix] " exit 1 fi TOPDIR=$1 INTAR=$2 SUFFIX=$3 VERSION=`cat $TOPDIR/version` if test x$SUFFIX != x; then DIRNAME=xcrysden-${VERSION}-${SUFFIX} else DIRNAME=xcrysden-${VERSION} fi if test ! -d $TOPDIR ; then echo "TOPDIR directory \"$TOPDIR\" does not exists !!!" exit 1 fi if test ! -f $INTAR ; then echo "tar-ball file \"$INTAR\" does not exists !!!" exit 1 fi cd $TOPDIR mkdir $DIRNAME if test ! -d $DIRNAME ; then echo "DIRNAME directory \"$DIRNAME\" does not exists !!!" exit 1 fi mv $INTAR $DIRNAME/ cd $DIRNAME tar xvf $INTAR; rm -f $INTAR # clean CVS files find . -name CVS -exec /bin/rm -r {} \; # clean all Makefiles from makedepend-entry for make in `find . | grep Makefile`; do CleanMakedepend $make done cd .. tar cvf $DIRNAME.tar $DIRNAME/ gzip $DIRNAME.tar rm -rf $DIRNAME/ xcrysden-1.6.2/THANKS0000644000175000017500000000316713514544107013001 0ustar tonetoneThanks to: Mauro Causa: for the initiation of the XCrySDen project, numerous discussons and suggestions at the initial stages of the project, interfacing toward CRYSTAL program and more ... Florent Boucher: for bug fixes, especially those related to k-path coordinates for WIEN2k. Peter Blaha: for automatic labeling of the k-points: the idea and the lookup table Eric Verfaillie: for implementing anaglyph display mode Gerardo Ballabio: for implementing stereo display mode Julien Lefevre: for porting to Tcl8.6 (i.e., fixing the obsolete interp->result issue) Pablo de la Mora: for spotting number of bugs in the visualization of Fermi surfaces Peter Blaha, Joachim Luitz, and KarlHeinz Schwartz: for interfacing toward WIEN2k. Stefano Baroni and the rest of the PWscf team: for interfacing toward PWscf and discussions about using GPL license for XCrySDen. Mike Ford: for porting xcrysden to MACOSX Paul Bourke: for his routine for polygonising a scalar field Hanspeter Niederstrasser: for porting xcrysden into Fink distribution Michael Banck: for his help in proting xcrysden into Debian Tobias Burnus: for porting to openSUSE and bug reports Lorenzo Paulatto and Martin Kroeker: for providing fixes (workarounds) for several types of xcrysden's crashes, either associated to memory leaks or Xwindow errors Thanks to those who have written the "external" software that XCRYSDEN uses, including Tcl/Tk, Mesa, BWidget, Togl, GL2PS, FFTW, and Meschach ... And many others for their bug reports ... xcrysden-1.6.2/util/0000755000175000017500000000000013556022211013025 5ustar tonetonexcrysden-1.6.2/util/ptable0000755000175000017500000000104112675206454014234 0ustar tonetone#!/bin/sh # \ #this line restarts wish \ exec wish "$0" "$@" > /dev/null set script [info script] while { [file type $script] eq "link" } { set script [file readlink $script] } set dir [file dirname [file normalize $script]] # # INITIALIZATION # set system(PWD) [pwd] set system(TOPDIR) [file normalize [file join $dir ..]] if { [info exists env(XCRYSDEN_SCRATCH)] } { set system(SCRDIR) $env(XCRYSDEN_SCRATCH) } else { set system(SCRDIR) /tmp } source $system(TOPDIR)/Tcl/xcInitLib.tcl set ptable(ptable_script) 1 ptable . xcrysden-1.6.2/util/tcl_index0000755000175000017500000000021311712736221014725 0ustar tonetone#!/bin/sh #this line restarts tclsh \ exec tclsh "$0" "$@" if { [glob -nocomplain -- *.tcl] != {} } { auto_mkindex [pwd] *.tcl } exit xcrysden-1.6.2/util/unitconv0000755000175000017500000000467011726407652014644 0ustar tonetone#!/bin/sh # \ # this line restarts tclsh \ exec tclsh $0 "$@" # # Usage: unitconv unit value # or: unitconv unit expr # # # supported units set energy_units { au ry ev kjm kcalm kj kcal erg } set length_units { angs bohr m } set allowed_units "$energy_units $length_units" # check for correctness of specified unit on command-line set unit [string tolower [lindex $argv 0]] if { [lsearch -nocase $allowed_units $unit] < 0 } { puts stderr "input unit not known; must be one of [join $allowed_units {, }]" exit } # ------------------------------------------------------------------------ # PHYSICAL CONSTANTS # # Physical constants, SI (NIST CODATA 2006), Web Version 5.1 # http://physics.nist.gov/constants set j 1.000000000000 set au 4.35974394e-18; # J set ev 1.602176487e-19; # J set mol 6.02214129e23 # thermo-kilocalorie (International Standard ISO 31-4: Quantities and # units – Part 4: Heat. Annex B (informative): Other units given for # information, especially regarding the conversion # factor. International Organization for Standardization, 1992.) set kcal 4184; # J # from wikipedia: set erg 1e-7; # J #-------------------------------- # Energy Units (use J as default) #-------------------------------- set kj 1000.00000000000000 set ry [expr $au / 2.0] set kjm [expr $kj / $mol] set kcalm [expr $kcal / $mol] #----------------------------------------- # Distance Units (use Angstrom as default) #----------------------------------------- set angs 1.0 set bohr 0.52917720859 set m 1.e10 # ------------------------------------------------------------------------ # # evaluate & convert user specified expression/value # upvar #0 $unit un_fac # parse the command line arguments foreach item [lrange $argv 1 end] { append numbers [format "%s " $item] } set orig_value [expr 1.0 * ($numbers)]; # store result either in J or Angstroms !!! set value [expr $un_fac * $orig_value]; # # PRINTOUT # puts stdout "$orig_value $unit = " if { [lsearch -nocase $energy_units $unit] > -1 } { # do we have energy ? foreach _un $energy_units { upvar #0 $_un unval set val [expr $value / $unval] puts stdout " = $val $_un" } } elseif { [lsearch -nocase $length_units $unit] > -1 } { # ... or length ? foreach _un $length_units { upvar #0 $_un unval set val [expr $value / $unval] puts stdout " = $val $_un" } } exit 0xcrysden-1.6.2/usage0000644000175000017500000001365213525500661013114 0ustar tonetone## do not edit changes will be lost (file automatically generated) SYNOPSIS xcrysden [special-options] xcrysden [special-options] format-options file|directory DESCRIPTION XCrySDen is a crystalline and molecular structure visualisation program, which aims at display of isosurfaces and contours, which can be superimposed on crystalline structures and interactively rotated and manipulated. SPECIAL OPTIONS -h --help Display help message. -v --version Display program version information. -u id --use id Load XCrySDen embedded into container window with window-ID=id. -r dim --reducedim dim Reduce periodic dimension of XSF file to dim. Must be specified before --xsf option, e.g., xcrysden -r 2 --xsf file. -c file --custom file Load custom-definitions from a specified file (the syntax is that of ~/.xcrysden/custom-definitions). -a file --attributes file Load attributes from file. The format of the attributes file is the following: ELEMENTCOLOR atomic-number1 red1 blue1 green1 atomic-number2 red2 blue2 green2 ... ELEMENTRADIUS atomic-number1 radius1 atomic-number2 radius2 ... -l file --lights file Load lights parameters from XCrySDen's lights formatted file. FORMAT OPTIONS --xsf file Load structure from XCrySDen's-Structure-File (XSF) formatted file. --animxsf file --axsf file Load structures from Animated-XCrySDen's-Structure-File (AXSF) formatted file. --bxsf file Load bands from BXSF (Band-XSF) file and visualize Fermi Surface. --xmol file --xyz file Load structure from XYZ formatted file. --pdb file Load structure from PDB formatted file. --gzmat file Load structure from Gaussian Z-matrix (requires Open-Babel program). --gaussian_out file --gxx_out file --g98_out file Load structure from Gaussian output file. Only single point calculation and optimization run is supported so far. For the optimization run it is possible to render all the structures that were produced during the run. --cube file --gXX_cube file --g98_cube file Load structure from Gaussian cube file. The cube file should be produced with the Cube=Cards option. Only scalar cube files are supported, that is, Cube=(Cards,Density) or Cube=(Cards,Orbitals) or Cube=(Cards,Potential). Refer to GAUSSIAN manual for the meaning of this keywords. --orca_out file Load structure(s) from Orca output file. Only Geometry optimization outputs were tested so far. --crystal_inp file Load structure from CRYSTAL (http://http://www.crystal.unito.it/) input file. --crystal_f9 file Load structure from CRYSTAL (http://http://www.crystal.unito.it/) fortran unit 9. --wien_struct filehead|file|directory Load structure from WIEN2k (http://www.wien2k.at/) struct-file, where: filehead = name of struct file without .struct extension, file = filename, directory = name of case directory. --wien_kpath directory|struct-file Read struct file and render first Brillouin zone with special k-points. K-path can be selected interactively by mouse-clicking the special k- points. User must specify EMIN and EMAX energies and total number of k-points along the path. This number is merely an estimation of total number of k-points, since XCrySDen tries to get very uniform sampling of k-points along the path (don't specify WIEN2k maximum allowed number of k- points, since XCrySDen maight generate few points more). --wien_renderdensity directory Read struct, output, and rho files and renders crystalline structure and precomputed charge density. --wien_density direcory Either 2D or 3D region for charge density calculation is interactively chosen by mouse-clicking. XCrySDen generates in5 file(s), calculates and renders charge density either as isolines/colorplanes (2D) or isosurfaces (3D). --wien_fermisurface directory Pop-up a task window for Fermi surface creation. After several steps the Fermi surface is (hopefully) drawn as 3D isosurface. --fhi_inpini file Load structure from FHI98MD inp.ini formatted file. --fhi_coord file Load structure from FHI98MD coord.out formatted file. --pwi --pw_inp file Load structure from pw.x input file. pw.x is a pseudopotential planewave program of the Quantum-ESPRESSO distribution (http://www.quantum- espresso.org/). --pwo --pw_out file Load structure from pw.x output file. pw.x is a pseudopotential planewave program of the Quantum-ESPRESSO distribution (http://www.quantum- espresso.org/). -s script --script script Load script from file containing Tcl script. --os script --oldscript script Load old-formatted script (prior to xcrysden-1.6) from file. --print filename Print the displayed structure to a file and exit. This is useful within the shell scripts to achieve "automatic" printing. Example: xcrysden --xsf file.xsf --script state.xcrysden --print file.png In this example "--xsf file.xsf" loads the structure from XSF file, "--script state.xcrysden" setups a desired display (such a script is typically created via File-->Save Current State menu option) and "--print file.png" prints the displayed structure to a file and exits xcrysden. xcrysden-1.6.2/otherLICENSES/0000755000175000017500000000000013556022211014317 5ustar tonetonexcrysden-1.6.2/otherLICENSES/TclTk:LICENSE0000644000175000017500000000424211712736221016367 0ustar tonetoneThis software is copyrighted by the Regents of the University of California, Sun Microsystems, Inc., and other parties. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files. The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. GOVERNMENT USE: If you are acquiring this software on behalf of the U.S. government, the Government shall have only "Restricted Rights" in the software and related documentation as defined in the Federal Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you are acquiring the software on behalf of the Department of Defense, the software shall be classified as "Commercial Computer Software" and the Government shall have only "Restricted Rights" as defined in Clause 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the authors grant the U.S. Government and others acting in its behalf permission to use and distribute the software in accordance with the terms specified in this license. xcrysden-1.6.2/otherLICENSES/FFTW3:LICENCE0000644000175000017500000000151411727360401016155 0ustar tonetone/* * Copyright (c) 2003, 2007-11 Matteo Frigo * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ xcrysden-1.6.2/otherLICENSES/Mesa:LICENSE0000644000175000017500000001617711712736221016245 0ustar tonetone Mesa Copyright / License Information The Mesa distribution consists of several components. Different copyrights and licenses apply to different components. For example, GLUT is copyrighted by Mark Kilgard, some demo programs are copyrighted by SGI, some of the Mesa device drivers are copyrighted by their authors. See below for a list of Mesa's components and the copyright/license for each. The core Mesa library is licensed according to the terms of the XFree86 copyright (an MIT-style license). This allows integration with the XFree86/DRI project. Unless otherwise stated, the Mesa source code and documentation is licensed as follows: Copyright (C) 1999-2001 Brian Paul All Rights Reserved. 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 BRIAN PAUL 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. Contributors: When contributing to the Mesa project you must agree to relinquish your work to the holder of the copyright for the particular component you're contributing to. That is, you can't put your own copyright on the code, unless it's a modular piece that can be omitted from Mesa (like a new device driver). If for example, you contribute a bug fix to Mesa's texture mapping code, your code will become a part of the body of work which is copyrighted by Brian Paul and licensed by the above terms. Mesa Component Licenses: Component Files Primary Author License ---------------------------------------------------------------------------- core Mesa code src/*.[ch] Brian Paul Mesa include/GL/gl.h GLX driver src/X/* Brian Paul Mesa include/GL/glx.h include/GL/xmesa.h OS/Mesa driver src/OSmesa/* Brian Paul Mesa include/GL/osmesa.h 3Dfx driver src/FX/* David Bucciarelli Mesa include/GL/fxmesa.h BeOS R4 driver src/BeOS/* Brian Paul Mesa MGL driver src/MGL/* SciTech, Inc SciTech copyright include/GL/mglmesa.h Windows driver src/Windows/* Li Wei copyright by Li Wei include/GL/wmesa.h SVGA driver src/SVGA/* Brian Paul GNU-LGPL include/GL/svgamesa.h DOS driver src/DOS/* Charlie Wallace GNU-LGPL include/GL/dosmesa.h GGI driver src/GGI/* Uwe Maurer GNU-LGPL include/GL/ggimesa.h S3 driver src/S3/* S3, Inc. S3 copyright GLUT src-glut/* Mark Kilgard Mark's copyright include/GL/*glut*.h GLU library src-glu/* Brian Paul GNU-LGPL SI GLU library si-glu/* SGI SGI Free B include/GL/glu.h Ext registry include/GL/glext.h SGI SGI Free B include/GL/glxext.h demo programs demos/* various see source files X demos xdemos/* Brian Paul see source files SGI demos samples/* SGI SGI copyright RedBook demos book/* SGI SGI copyright NVIDIA vertex program license: Mesa 4.1 includes an implementation of the GL_NV_vertex_program extension designed by NVIDIA Corporation. Implementing the extension requires a license from NVIDIA. The license agreement for Mesa's implementation of GL_NV_vertex_program follows: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: o Redistribution of the source code must contain a copyright notice and this list of conditions; o Redistribution in binary and source code form must contain the following Notice in the software and any documentation and/or other materials provided with the distribution; and o The name of Nvidia may not be used to promote or endorse software derived from the software. NOTICE: Nvidia hereby grants to each recipient a non-exclusive worldwide royalty free patent license under patent claims that are licensable by Nvidia and which are necessarily required and for which no commercially viable non infringing alternative exists to make, use, sell, offer to sell, import and otherwise transfer the vertex extension for the Mesa 3D Graphics Library as distributed in source code and object code form. No hardware or hardware implementation (including a semiconductor implementation and chips) are licensed hereunder. If a recipient makes a patent claim or institutes patent litigation against Nvidia or Nvidia's customers for use or sale of Nvidia products, then this license grant as to such recipient shall immediately terminate and recipient immediately agrees to cease use and distribution of the Mesa Program and derivatives thereof. THE MESA 3D GRAPHICS LIBRARY IS PROVIDED ON AN "AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-NFRINGEMENT MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. NVIDIA SHALL NOT HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE MESA 3D GRAPHICS LIBRARY OR EVIDENCE OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDR, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. If you do not comply with this agreement, then Nvidia may cancel the license and rights granted herein. It basically says that anyone is free to redistribute Mesa with this extension, the extension must be conformant to the GL_NV_vertex_program specification, hardware implementations are not permitted, and NVIDIA Corporation can't be held responsible for any problems encountered while using this code. ---------------------------------------------------------------------- $Id: Mesa:LICENSE,v 1.1.1.1 2012/02/03 10:53:05 tone Exp $ xcrysden-1.6.2/otherLICENSES/README0000644000175000017500000000150611727375272015221 0ustar tonetoneXCrySDen uses some external software. The following is embedded into its C source code: ================================================= 1.) Togl (see Togl:LICENSE) 2.) GL2PS (see GL2PS:LICENSE) while the following may also be present in external/ directory: =============================================================== 1.) Tcl/Tk (see TclTk:LICENSE) 2.) Mesa (see Mesa:LICENSE) 3.) BWidgets (see BWidget:LICENSE) 4.) FFTW3 (see FFTW3:LICENSE) 5.) Meschach (see Meschach:LICENSE) (in rare cases, testing only) The LICENSES for above software are stored in this direcory under the names: :LICENSE In addition some C routines for polygonizing the scalar field are based-on/derived-from routines of Paul Bourke (http://paulbourke.net) and are used with his permission. Anton Kokalj, Mon Mar 12 2012 xcrysden-1.6.2/otherLICENSES/Meschach:LICENSE0000644000175000017500000000216511727361026017066 0ustar tonetone/************************************************************************** ** ** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved. ** ** Meschach Library ** ** This Meschach Library is provided "as is" without any express ** or implied warranty of any kind with respect to this software. ** In particular the authors shall not be liable for any direct, ** indirect, special, incidental or consequential damages arising ** in any way from use of the software. ** ** Everyone is granted permission to copy, modify and redistribute this ** Meschach Library, provided: ** 1. All copies contain this copyright notice. ** 2. All modified copies shall carry a notice stating who ** made the last modification and the date of such modification. ** 3. No charge is made for this software or works derived from it. ** This clause shall not be construed as constraining other software ** distributed on the same medium as this software, nor is a ** distribution fee considered a charge. ** ***************************************************************************/ xcrysden-1.6.2/otherLICENSES/Togl:LICENSE0000644000175000017500000000271411712736221016255 0ustar tonetoneThis software is copyrighted by Brian Paul (brianp@elastic.avid.com) and Benjamin Bederson (bederson@cs.umd.edu). The following terms apply to all files associated with the software unless explicitly disclaimed in individual files. The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. xcrysden-1.6.2/otherLICENSES/BWidget:LICENSE0000644000175000017500000000137311712736221016675 0ustar tonetoneCopyright: BWidget ToolKit Copyright (c) 1998-1999 UNIFIX. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. xcrysden-1.6.2/otherLICENSES/GL2PS:LICENSE0000644000175000017500000000170011726404706016176 0ustar tonetone GL2PS LICENSE Version 2, November 2003 Copyright (C) 2003, Christophe Geuzaine Permission to use, copy, and distribute this software and its documentation for any purpose with or without fee is hereby granted, provided that the copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. Permission to modify and distribute modified versions of this software is granted, provided that: 1) the modifications are licensed under the same terms as this software; 2) you make available the source code of any modifications that you distribute, either on the same media as you distribute any executable or other form of this software, or via a mechanism generally accepted in the software development community for the electronic transfer of data. This software is provided "as is" without express or implied warranty. xcrysden-1.6.2/otherLICENSES/LGPL:LICENSE0000644000175000017500000006126311712736221016112 0ustar tonetone GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, 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 library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, 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 companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Library 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! xcrysden-1.6.2/images/0000755000175000017500000000000013556022211013315 5ustar tonetonexcrysden-1.6.2/images/rotYplus.gif0000644000175000017500000000216011712736221015651 0ustar tonetoneGIF89aç   !#$%&')+,/02368:;?% + ; %%%&'&'('*+*-.-./.565;<;=>= @!!C""E##G%%K''N''O((Q,,Y..]//^//_00`00a11b22d22e33f44i55j66l66m77n77o88p88q99r99s::t;;v<>|??~??G'S.W0^4f8h9k;l<p=?@?{DJKJKLKNON]_]^`^acaghgprprsrsustvtyzyz|z@@€@@AA‚LOŸMP¡OR¥mqãv{÷GƒHŠL ‹M ŒM N!O"”Q"•R"–S"—S#˜T#™T#šU$žW$ X%¤Z&¦\&§\'«^(±a)²b)µd*ºf+»g,Àj,Ák,Âk-Åm-Æm.Êo.Ìp/Ìq/Íq/Îr/Ïr/Ðs0Ñs‚„‚„†„‘’—™— £ £¦£¥§¥«®«­°­¸»¸ÁÅÁÃÆÃÄÇÄÊÍÊÕØÕÙÜÙÚÞÚÝáÝäçäçêçéíéëîëïóïðôðòõò÷û÷úþúýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ,þÿ H° Áƒ*\Ȱ¡Ã‚1´êG~Z¾P¢Ê=Z™†û•ªKh¹-SF^!:ØÃö%†s÷ÚS§Pß—$è2 ±‚Ü;‚ö\Ù¢(ª‰-sØ€@.¡ÅTîD屯(;F¬P€oD/Q#† Q$ &NR A C„Dx0þèAˆE˜0±]dÇ(¨kœðcèNÎ F䨱I!?˜NLq`€Ö¯#P }÷<¸;qC~xF $„Qc{|7 ÇDzcm ÌF l0‚} ¥æATBj–„a†uèᇠ~;xcrysden-1.6.2/images/rotXZ1.gif0000644000175000017500000000440511712736221015163 0ustar tonetoneGIF89a÷þ   $6 < $!!%*72;;"5!?%(=C B'K"B(N/T)[=y1j6x5~8U#%D$'H%)K)-O+,L+-F+/Q-0O%8^.1R/2U)3X.?_15V35U26Y09U59]59Z9<]!=h+:h5;a9Bi?N~2E|S$X!i }g*n ?t 1V-YRˆ=‡$>ƒD'C…(D‡*F‰.J‹$C‹(WŸ1NŽ5KŒ3K€:G˜?K–5R“7\9V–9W˜;X—=\›5Tœ)^¤=]¤@N—CO™A_œ@^šSU†KY©IcH`‹BažIcQe–Vf™\hžSlŸFe¡Dd¤Ig£Ig¦Kj¥On©KlªPoªQk¢Ss­Wv°Uw¸Ux³Zz²]}´\{³]~¹oi£ld¿d½tk¼wpª|u«y¯yp¿smÄ{nÂrfÃ}tÄzuÉ_¼a‚¾a„¾c‡Êc‡Ãz…Þ…‡”™‡ª¨´¼·¢4¼%?v¾ @½~žXf CZ±C^ÎÃÓÚÞÕ3Á17Ü2&âæä êîçéôýæ$ë$ç;æ>7ÿWúvì~0ÀB^ÕHjšpš‚{°ƒuÇ„{Æ„}ˈÉݽÿ€ÿ£ïÃîÍöÆüÊÿÔüçÿÿ„€ÏŒ„ÌØŒƒÕ‰’߆͑ˆÎ”ŒÏ’‡Ù–ŽÑ’ŒÒ”ŒÚ•Õš’Óœ’Ü’•ÞŽ”ኻܘ°Ë™¸Ó¤œÞ¢šÝ —â¦ã²²Üª¢ç«¢è±©ð¸Ãé´ÊþµØÃ¶ÔÈÁÚÉÉ×ÉÆÚÔÎÛÃËå!ùÿ,‡   $6 < $!!%*72;;"5!?%(=C B'K"B(N/T)[=y1j6x5~8U#%D$'H%)K)-O+,L+-F+/Q-0O%8^.1R/2U)3X.?_15V35U26Y09U59]59Z9<]!=h+:h5;a9Bi?N~2E|S$X!i }g*n ?t 1V-YRˆ=‡$>ƒD'C…(D‡*F‰.J‹$C‹(WŸ1NŽ5KŒ3K€:G˜?K–5R“7\9V–9W˜;X—=\›5Tœ)^¤=]¤@N—CO™A_œ@^šSU†KY©IcH`‹BažIcQe–Vf™\hžSlŸFe¡Dd¤Ig£Ig¦Kj¥On©KlªPoªQk¢Ss­Wv°Uw¸Ux³Zz²]}´\{³]~¹oi£ld¿d½tk¼wpª|u«y¯yp¿smÄ{nÂrfÃ}tÄzuÉ_¼a‚¾a„¾c‡Êc‡Ãz…Þ…‡”™‡ª¨´¼·¢4¼%?v¾ @½~žXf CZ±C^ÎÃÓÚÞÕ3Á17Ü2&âæä êîçéôýæ$ë$ç;æ>7ÿWúvì~0ÀB^ÕHjšpš‚{°ƒuÇ„{Æ„}ˈÉݽÿ€ÿ£ïÃîÍöÆüÊÿÔüçÿÿ„€ÏŒ„ÌØŒƒÕ‰’߆͑ˆÎ”ŒÏ’‡Ù–ŽÑ’ŒÒ”ŒÚ•Õš’Óœ’Ü’•ÞŽ”ኻܘ°Ë™¸Ó¤œÞ¢šÝ —â¦ã²²Üª¢ç«¢è±©ð¸Ãé´ÊþµØÃ¶ÔÈÁÚÉÉ×ÉÆÚÔÎÛÃËåþÿýû÷ïß¿N(rôè¤eË–-[¶lÙ²Gþýû÷ïß¿ÿðx#®\¹rèÞ¹sçÎ;wñê5ø÷ïß¿ÿÀxÂĉ6gÊäm 7îœ9sæÎ™›Çàß¿ÿþUpò„‰’&œT¥òçl¸qçÌ™3gnƒÿ(H…É%=|0‚UË^¥gÛ¾‘;gΜ¹y þý;ʼn’uÚ·¨Q¤JÝ üû—bÆ "( €€ëW.\¸d•úä©¥I“˜qKðï_Š(JŒÈ á_¹tÙ5DH;`¬aÇÀ¿+p°(1BD„Pñ"¶.Š+S@|øðá ÿþ­Àñ npñbêV;)Y²`¹r¥J•*[<üû÷BG %DÜ8äS&Í‘Tì¶téÒE‹-Y²dÉàŒ3b˜À‘'O›3cäC†Œ1bĈéÒ4”ä€cÏŸ={òèÑ3§ À6mΜ9cÆ 2j6ü«ÁDGŽ@… òã§OŸ>}öìÉ“gΜ9mÜèù “$x.!2dÈ A‚ äÇOŸ>}öìÉÃGKê\:tèСC‡!2dÈÐ A‚ ÈBjØÙ´)S¦L™2eÊ”)S&L˜2a„éR¢D‰4¹!‡Nœ8qâĉ'Nœ8qâĉ'Nœ8qâÄ¡³# ;xcrysden-1.6.2/images/spacefills_3d.gif0000644000175000017500000000665211712736221016535 0ustar tonetoneGIF89a01÷ÿ   ")+'/*607(0))8 :75++#*8-D3INp3Lj1aH DLW U[YK(`dket|vtp!`1TP QV2_e8mQtiyxurvw!mt=CLLK\|EUuDSjZdOPf}r|En{]k…k…tvˆ~—/n‚:g…3y˜J_‡McƒRe…Uk‹Xm“[r“]v—]t]u¡b{bt—dy‰e~ ~†DtƒgzŒz„—Œ¥”®•¨š´“§£¼%‡ž,—±¬Å ®È³Ì±ÅºÓ´Ë>­Í&¯ÈÄÝ ÇÝÈßÉãÒêÚô×éÊèæûöýë÷'Õç<ßñ2Ùè7öü(ìöC™¶_­L•®}‘†j„¥nЬiƒ§m‹·qŒ¬s±u“µx—¹|š½y–·\®ÐX¸ØL®Ì~ÂyšÌ Æ`Ù탋†’œ—› %.£ª²º4¨)š+CŸR~•l¯}Ã"<ÓB\áNhêVpˆ‡‰‰‘””›šŠ8–•!Ÿ ²‚¡Ÿ*¤¤¬¬³³¼¼·¶²µ0ˆ˜p¢z«µS©ºqŠ”M¿ÈHÁ¿(ÉÈØØÐÏÎÎ%ÓÔ-îìååðîùùçè#ðð.ää5ÉÉCòòIôôPýýv†›‹”¨…“¯¯˜µ¹€ŸÃ¡Å„¥Ë‡©ÍŠ©Í‹­Ò±Ö”·Û˜¸È—½ãœÄëšÁæžÇó„Åê¥Èé£Êò°ÏèºÛó¬ÒóÁßõÓíúÍêúçûþ!ù!þCreator::XCRSYDEN-0.x ,01þ0`"ØÈA„ þ€>N©Z+–,€±PÙ8@ À¨P¡B¥jÕ*X±dÉ"rÀTÐÑÓ'΀ U¨N¥B¥Š¬X±bÅ’Eä€q:´h‘¡ *T§N:¥Š•«Y³dÅŠËÇ@.‚úð‰Ñ">p ªS§† 9…JÕ¬^½tÅ‚þKU „<¢@ eÊ‘!C*0áÔ!C„r ­]¼tÁZk€ ÀKžÖ½“'ž½P‰Z0ÀÆ©!C„"dÈ)T´h¹ZµŠ+[N\@€á»téÚ½ƒGoÞ½{ö¼0 È)!B€ùDˆS§P¡R…ª•±kÛ¼]+öl§O騽ƒGoÞ¼yøÞ‘0`ˆ+#@~üØñˆ!CN:Õʘ5kÛ¶mëæ-Ú§OžÖ¹ƒwo¾yòð±Ã0€þÈ«WFvèбã B„)’«Ú5kÖ¶mۦ͛¹LŸF­ƒÇ¯Ÿ?|ôàÍc#0€­ZFtèÀC‡Ž@~ÁÅlYµkÛ¶yÛ¶M[8M™:¥{§ï_¿{òäÁ[‡ ÀW¯€èÀqãÆ ;vìÀ¥,Ù²eÕÀ÷Í›¶lÎ0eò”^¾{ðÞ½s÷Ž `ÀSB€è¸A…7t,I† ™²eËÄ‘#'n›µmÐÎ`ÒÔiTºuìÚµ[·nLÀ€¨€ìÀA¡‚„ – C&¬2f˰‰Κ5kÍØ¤Át‰S'þO£F¥ó´ŽM€A†üÐq£‚ =‚! ,˜0dÉ”UÃv­¶kÔÞ”9£Æ’¦Kœ8}âÄiL‚Ùqƒ‚ · öëW0aÈ’)c¶lÙ²jÊÞH!SfL˜0]jc‰ ØøPÇ LšûõëÖ-_¿ˆC–L™2eʘa™!e 3kÔ¨Q³FÒž…#ÔÂóå«É“'M|& 2dÈ’A¡1cJ1cÈC©Ñ"A `À$ÙÂsóN¥råþœI ˜0a€UñB•)S¤HÓ’"E\€ ɦ•û4ª”;xòèÁCgnØ­_¿~%BÄ2dÔ¨ã‡P¡Bu `€WΑ"5ª”»wôèÕÇ/ž³'M˜Dƒ hh‘3çŽ>q–JyêÔ©»wðæÝ8o^=zp y!ć@¬È’¥‹9uZ€VÖòĉ“§uìèñó·o½zîªD‘c„ˆ ´lABE‹,Yþ ŸA @€¤X±!C†P ËB‡]¤F¥KŸ<­s÷Ž;vîÖ½0  ÀEŸBŠMZsÆÌ5—8qò4ªÔºRê<½`Pž;|AUÆÌ2gÔ`ºÄéÓ'O:qzþÀ…Ïœ9wü 4fŒ1d̬QƒéÒ%M—4µ!(gœ8rêèÙ#FÊ”)RÆ1sFš6jÖH²cç—,YºÈ±óeJŒ3¦HC†L3e$1ZD§`‚)VhÙòeŠŒ2dP™2EŠ)`ARtè@—9+6l0‘BÊ"@ˆ!#þ_ê BTèP@YRp࣌˜#¥Â±»…«'N·8ẅk^©V­þÌáè.yæÌm»«\8råÊ™3'/¬m²LÍG«S¬;ÄÉÅ.Ü6YÛ¶}£÷m–¬líÆÁTâO»zßÖ±›•m[6s°>… w ¬mãÆ…37nܶpÛ¶q²S ;[·Êuâ‹®[¸æ•jÕ*МŠná’gÎܶ[°Æm#®œ9sòÀɲ%ËÔ,qþ´:ŲC—,RëÂm“õ-Û7z¿ÍÊ&«Ý¸Y€JüiWï[;v³deûfn–¨páNÁšµmܸpæÆ•Û¶m8Y¶\‘Rô‡C'Q®ØmÛÎV8vß¾™ûöÜ7Z€J(rg/Ü8s¢´eû–ÍÕ¨lí²ÁânÛ¶mßÌ‘“Ë\8Qì¨ ‡‹§@¥8µê(‘<yæ$ŠU §VòÄÅ"–¹qáÂ…3'¯\¸mÛ“%Ë)E8tåŠÝ­mál…c÷í¹oßÖ}k¨„ züÄ™k÷I,mÜFÊ6.[6ná¶mÛ¶9Y²Ì‘ÈÎ-q¸:) DŠS«NyþÉ#agN¢X¥pqj%O\+sád™3n\8sòÊ…ã¶m8X¶L‘Rô§C'Q®ØmÛîV8€ì¾}#÷í¹o­•DÏ^8sãD}ËöM›©QÙÆe“µmܶmÛ¶m .9p²¶¹rEj‘ EŸ™ uj7náÂ3÷í›8Xø˜Ï^·qÝFu#–-Û)S³²mƒµ-ܶlÛ²q Çí”±S˜>…:uê&LŸJ‰Bu+V¬NZ­×+V+N‰Õ“nÖ·qãê…Ûθpá™'Ë–+W­ÍYÔI‘9S¦ÆÛ6îÛ¸vß¾‰›%ŠŽ Sôìm×mT7bĈ þ5Œ1bĺq#¶-Û6qÛf3%ê“©WªnqâÄ©”(T·¶©âÔ©ÕºrëbµâÄ)P=yâfm7®^¸mäÌm+.9p²l¹rEjÑœE¢™+ej@pÛÄ…ÇîÛ7q±Ù1aŠž½oã —mV¶S´²eÛk[¸m²¶ÉW.\8rÛ¶Û‹¦>2 }…)Ô±nÆŽãÆ-Û·p³ñ‘ÑÍ[·aLj# Ô(bÚ¸i ‹[8[§N uìØ0Mš4ýú¥IÓ/Mš† uŠ®[$bÍ“·n®V±JѱeÝ+zõÄÉÚ¶-\8påÊ…#·m¸o²l‰ú3Gþ‘¨RœL™#NÜ7qä¾}7«‘:ãèË6ޱc™4ýÒôëׯ_¿„ *Ô)SäÈms…êS(n >Âʘ±P¡Œv˜9váÀÝ*«“[öØÅ¢WOœ¬m¶Â…+W.\8rÛ¶û& —¨?s‰*Å  )sæÄûŽÜ·oâd5ºCg=sÙÆeËnÔ(ZÙ´}ÓÆMÖ6nÛL™25®\¸pá¶m ÷m1M4ZhúõK“&Mš4e–IØ(bÙF¢Ac0#¿~yùõKÓ¡Lĸ7nÛ6n§@ÒT£E‹0¼„ùì×//^„1òKS(T&J¬“‡k.þ\¸pu¢cÇžtÖ±«Gn®[è̹ÃÄœ„0ÑâÄÉ”)þS¦ˆa²£F&LŸþع®Ô+y²¾Gœ¬o_)²Ã‡Î:võÈ­Ãu«Óœ9wH˜ó‡Îœ?tè´«WoÜ7Q¦¾Áš•Í”«l߯ 7ËÔ¶m¥ÂÁb.ܺq®D ’!‚A„Á®Yƒãæ ;jdú”è",Z\éâFˆ…F~ýõi±l6ØÒdÊ”)SÈàØáeX&M}@Û0£†–iÔr©¡Ì8\ëıkGnÖ+Q­ZáŠu .N%bN,vßÄ­çJT tȓŮ.\ŠuŠKQ+Q‹þ,Z„a‹`°]»Æ‚ š„ ¦`†-]ÈþXxQ#Ó)Aô裱 …–5SªTi“#Ç#ÀеˆÐâ…–.SÖ°YãFŒ”NÝâ(Q"vàÄÍb;€â\‰Jd‚¹p²ØµÂuKQ¢N±b-jÕ)Q¢E‰î”°U\»m®FÙÚFKÔ¬Y³Æ‘cgîÔ«W³L±ƒEîÛ7r±ø(*QÔ,‚qÆ µ vü"Æ Ö,FfÀÐÒ%ŽF~ #6êÓ,b°°Ò%Ê”)SžX€¡iX·O§™úæá ÓÈlÉâeØ©p¯È‰cGnÜ,Y¯lá×*V,\¯Ä• $j;Xë¾}÷Š¢%JÉ“% œ­V­Zźþ+-\¸bÅÂõçÄÁ¦]»Ffš2:ElÃXºt©ƒR±PÛÖ±ûäa -QÚH‘'G,ʎꆉ ZºDaÃf<"fJœ¨D^±“EîÀoã^ýQT¢D)y°F³ÕªU«X¶bÅj… W¬V¸bu*áªÞºo¤\Å’k”(S³\eJÔ'SÛÂ…ûkÝ7W®DÝ)¡ÁÄ) XÔè²F •)Mpì 4¬[8bXØÐÒ…I”~…"f‹”¨Q6°ÀÒe *S,T¨ah˜·Q£n•zÃ^–!Ã˰S¯ÈÇŽÜ·Q§NÚV®þ®X±H•»õ‰¬m®ØeƒeJŸLŒÚFŽ;\¢:áZ‹)pâÄû&Ã^‚]›víŽ^„}õ ”†3°tÑaÆ0b¦Â±E Ã^œL‘2Ê“-^ŠãkÜ),bhY³f ›5YvÔ0ÊT8\îÄú àºo®\‰âS‚ÉQÜ™3·­”(\ëbµj%n8q¸p½*u‚O©p®fÙšõ-©O£@}25J#QÛ™c'J”¨F®DÑá N)zÞl°¡%Š)UÚäØQC±LXØÐÒEŒF~µm)P>°²e •6mrX¨A)±þpœÀÙ’%î[‡ 3j,[¶#†¡Pãn±ÛfŽ]7c™†… uŠ8s帡ÊŠL @}útê "h€òÆÍžÌÒ…J›*U¨LRFŒ…5†…2õŠÓŸ?‰Ly@0†–.TªL‰“#aÄÌ…{%k¹oâ\­ÃKÔ ¢ä Ò°…-[œL™R¥“8´X±¢Ìš5kâ°a³ÆM—.aº¸eÊ&^ðÆm,@fÔØÆÔ貆 @*TÄàØÁÃP&: 4€Ì0jFL‹[Ö¬y“£C}X´¨áL—5q¨¬YóæÌ.aºpé%Š)R¨@ÁÁ£¨PÜä±[ÇÎΟRôØÁ".¸mæÈÁÂð†—.S¦´i3EŒ… <4#¶ Ü+Q¥Z}’1@ `ÓªUƒç„¿Šq3Î)Y¶hŲ%ªþ.Nw:p’Ç.\7c¡fÄâd *O¦¸³E‹/aº¬‰³FGŒ”XØp¡eÚ´j×ÜH˜Pc1c‹<|¨fÇ ”„ •íƒ5‚Y[C¥M›*R¨@abÁŠ—™Œ;ÇÍ8sáLÑúóáC.kÖP¡òJ–_ݾ…ÃUîÖ­R|:|àÑàš)T¦¬Éc‡ ,ˆL7bP2t¬Û5´tóæBÃŽ5Æ–.k¨°¡²æM,/`ÀpaAK”)R¤L™‚c¥bÜÀ™ ÇN–mìØ±“ÇŽ¹mÛÌ…‹ÕèÃŒZÖÀÓÎ… 0¼ü2öJÖ­þV¢^ÁB¥!À‚˰¹‰ÇÚ… 6~ã¶m›,YßdÑ%N8v­îpàÄŽ8p§y˜±£Ëš5SàÀƒ†•5jh鲯M…† ÍÁF³k׬¹¹`ǯPÜ6|˜Á#L ‡„˶m, Xxi¶fM›6U¤H¡²ÆM˜0jüBFŒ[¹s¸¶Éš%çÃŒ]ÖPaCåIÃÆm w ׫R§>|˜F—)Sª°iÓ$ËŽ40°æÌš7&ÔøÕ-]693`|qÇÚ… 0~ãVèà !]ÖL¡²&<Œxùµ€…‹.Q¦T¡"G MÄŒq+ލ?ôþÖ‰[Çn\¸p·n… 7+›†6º¸§J•vÔ5j[,[âÀÉ%hƒ€0‚¹‰Ã†Jœ jü2vJ¸pßĉÛ&‹.\¸pâÐJÞ:[ÛNø°ÇK'kàX[s‹•f̀ѥ “<„5Úãa`ÓÞ¸qsáŒ_¡FyaÃË<(eã¶ –(SŸ 0hÌš8mªH©BeÊ'np¼€ñë1n§`m÷­Ã‡^ºL™RÊ“-ZŽ»eË.S¥Œiøa†—.S¦T¡Â¦ÉÊf0ᥙ›5Ô"Äà! ]· 3lx™f Ž› 1x 3æÍ„‡0º¬þ™Be5~ –iˆZâ´™2%Ç”ˆq»Åí»OÖ‰#GîÕ¶[à¶ÝÚvë± Z€qÓ¦Š*P.ì¨!,Ô¶mëä}#%êT"x4s'Κ7*Àø5¬T8sâ`Éúöí[«X­Z)šCç–-vð¨qbŒ;l"6Δ­[àÀqRôª”±nþ46Äx!¤‹8pà´©"EJ™0jü:¥*\8D>Äh2¥J)PšìøElÜ6\Mݺµ ч1ºD™2¥ œ 1jübÀ`‚7k¨´i’C‹—^›fM0`üv,\8]fØÐ2E 69vÔø•[6b6ØàeŠ1pìÐdŒ›)S·dýádo]=zâ¶Ù"w Ö¶B XÀÐÒeÊ)RªH©²Ç5 Á‚ÅîÛ+X§hÀcÚ¾}×®MËc‡¦P§nWïÛ·oŠp‰¢(ÐpßÈ­keªÏ€0À¬™"eMŽ-;Žyƒ%êÕ·Y‚8¡âCïQŸ þ,à±ìÚ¾}d&Tð"b† 1bð d,Û6p¢L½2ˆ,Xæ¸ £Ñ  -gÖ¬‘"EŠ”)9tÔ0Š·n&<Ì€ÑEŠ)Sžàà!Œ9€¦Jݺ…Ë–‡,´8‰œ.8tÔ¨q`Œ-S¦H©2eÍ42ÁšŒ/jü*Æmܶlˆ<|ˆÑeÊ)lpèàA©Û7X…,ˆf •)Np¼¨¡ T¨W¦L‘µ®9vßlÙ‚n[·>XÀÓ¥‹'N¢L‘B… 6 Ë6êÛ6\²N‰°ÁK0k×®]sƒŒ_ÆÎm“ÇNž¬o²þÄrõ§¦Oݶm³þ%ꔈ,´t™RE ”Yv ÛöŠ–,p¯8qõG)QãŒXØ´j×ÜH¨°ƒ‹^*Ĩ1ÌÛ)Q¥JÁ2űl ¶mÛFl‹6„lqREŠ)Trà¨ñ‹7yéx`£Ë)TÊäØÁ#7nÜdX°ãŒµ8kšXˆá%ª[·n…õª;qëdmÛöj[7LXÀÐ&‹0L˜l™2… ›68vPÊÄm9W¢Hq“!`þŒ.kÞÀ©fíŽ¿Ž±'Ï\8Wßhý©#H Bš†e ¬ XhéB¥Š”'M²x!6‹T«X­ý¹Ã)Q=Q¯ì™ À`B2k⼑0‡‹  tG·fqEJ6k*Ø8$Ì›9v·¶­cÇ0ºd‰Qã¦O€L`ØŒ›jÕÞ<Ù·W­l­k'î[¬VŠZ‰åÎ,v8™"EJ7kº€©ðb‡&b娱ƒÕÉZÊØ°qH“Ÿ@:áÚKÁ`Þ´YóF‚ ü™s'ãÀ]ºœ2eMŽ5„}úôþ)'S£d̨¡%Ê”*kÞXˆÁCÓ°n>Ì€Ñe •)Ppð¨!Œ˜1b²nmãÆ­›1b¡N:ÕÃ`ÜL™²GšB•*UG·`ÖL™¥‰Ž_Ĉ•3Wn›¹?‰H±#çJV¸PDÄÐL…<~eu ƒˆZœDiçMŽ0jB…ëÕ-[Ÿ0ˆˆ¡%Ê”)SØX°qˆR·næ`Í"7†6²tуG BÆNqðÀF6mÚˆÉF²qìØÉk·-Y¢îÐù“¨;B6Àè2EŠ*SÖtÁñbGL¡ÂÉ“÷I0œDÁÁƒÇ¡O¸^ÝÂeJþ.ÀÀ©'Ë¿ˆy3gnC0vYCe1xóh›)A…̨¡¥Ëš5kØhyÁCØ1nÜucK*R¦à¨Àã—0b°nÛf̘&¿4e JÄ€VºDYC%<2:uÊÇ=<¸¬aÓæ “,^Š…g.\9s|ýÇ.\¸lX¸ðÒ¥Ì<¼d 5«Û‰,„8iÎ`hvŠÜ-p¶fyÀÀBˆ–5SÖ°!£ÃÆ!aĺq;¥ˆ3b8)ƒŒ„Ì™Ûð…'Tª°q’CGcôص‡ —8q¶Ñ)ñG oñlh±%Š*þT¦¬YSaG M¡¸…†3„8)ƒcG_ÄÌÝ·íÔ† ´tY‡š5„u ·Í‚ kh³† ›-xð0D“9o¡°°áŒ›5qÖ0ÙQñlá¾ÑúðÁ†—(SªHƒãE_Æ 6L‹1ŒÔД)”,´tYCeM;ý:õJ–9{¼tYÃ&Γ&;jh uêÔ­[Ûè$*áÊÞºlX°¸²…Ì„;~ýuê,PèèҦ͔)n.بñËØ)pàH…ë†`‹+]Ö¬a³†L…<„†I bXégÂ6BÕk⃠-Q¤þHaó$ÇŽÞÌÑ{Õ Ü7ríÈÑúÓN¢¦ø!ØÀBË”(U¨°aƒ£ˆ݊.ÑŸ l\q2E‚”ˆâÆ-!6°8™ÒfMŽ 54ã¶­Ü)€uöÔ³† 68pØà¡‰F¨x5D´€Ìš5kÖ0ÙQã—°lÙ²}Ó†áà -]¦H‘Re VŒxùƒÂZ¼¼€Q#Ó({…³¦ •'1xPvJV6 öx³f ›'8vðД)T¨P§LÑ¡C⎻zDذÒÅÍ… :vÔÐäP @„D´xáÄÉ*kÖàбÈ0bÜÆm 7.6´tYþ³fÍ7Ytððb¤ bÙÒ¥ Ž0hj§­Ã‡Z¦H‘2%Ž¿ˆ›åJœ,YìÈiµh:þÐÛà–.Q¦PaóÇŽ5üú“¨®PÄØâdÊ̈±eÍ(Nšààa$þ“ =zfD€¡¥Ëš5TÖLyÓ$Ç /†ˆu7.\8bfÔðæÌš5l¦ˆq„‰!„\ÙeM ;j°ø4‡1¶L™2…MŽ<„qûfjÛ7XßÖ‰³ÕHÑYÑèà Zº¬Y³f‹‡2}ú$*V¹r|ˆˆÁeÊ”2OpàRÁ‚,L¶t‰2J&/jh%`="XÔв%Ê*T¨@)Óe‹-X´4éÒe›5`¶¼¨¡é—°lÙdÉ’…+[6 XÙEJ)R¦L™â$J']ºl±Ãˆ&F{äì¡&Ê*lrìàAiØ©lÚ>ÈqäLœþ5TذãDË#54e ENÜ·E:|˜!¤Ëš)S¦taÃȰ>N°0¢¥K—(kÖ¬™²fŠ˜.0jê6ܶmãPm8aÃÈ–.b ¬™²&J']À€Ó¥Ë&/jÔ˜aÊÝ 3bp‰2eJ0 ëf œ8Q¸è}'®Ó":í¾S¤Ї6„héÒÅ Ž<„u»eëÖ-\·8ØC‹“(QÖ”éâ¤K']œtYÓ¥ &0¼„ ðS‰2hxñÒ¥K”)k¦L™çÍ´.]œtéÒ¥ ˜.]pxá¡IØ©S°`Á’5 ¬S§0ˆ°!ÄI*RªH™2eJ”5Qþœ0ÁÃH B…:|˜Q£K—)kÄàØQCS(X³daè°ÇH˜5kÖ¬™²¦K—-;`hÒJœ¸o´}ø0†–.]œléÂÆ¡_~<̰aDK—.]ºtqÒ¥K—.[bÔ0DŒ·oáÂÁú¤g V´téÒeM—5]º¸™FL—0.jP¢A#\;XÔÈÒ¥K—,1jü"öíÓ·p¥ÂÕ#÷ÍÖ¢DwĉûÖJ‘(QÚÐÍp¡ŒŽ< ãfëV+QÊ Ò°€F -Mº8饋“(Nº8醉5h„xŽ[)=>Ø€¡eK—.]œté⤋›`]ºtéÒ¥K!0ŒhþÒ$,±SÄLšujÖ,S¦F5ÒÀ‚ -NœL‰2eM”.[„0!¤!B~að0Æ–.]ºtÁƒG¦P§`Íúb /[º¬é"¦K—+/¬Ô¨@;\´dÑ aC !B°`Á"†‘_à yð "Æ !B„0"Dˆ!B„1Š·päÌ…³e • 4DÄ0¢E‹–-NºléâEˆ!^4ýÒÔG=v6ˆ`ñBˆ+0xüf,\8X䨙£·N”¨?‹D­ûæ –+E‹LðaÁ‹6 ëÆÍ.\·^•ÛvŠ¡-\Á¢E‹“&]´lÁò‹—_™4ôƒþi¸R:lц!L„0ÂÄŠ!B´xòBˆ/¿~ 6ìÔ©S§LuÊÔ©S£F}*THÆ.˜0iâD‹&L°¼0R£!2øÈ@ `‹B˜`уGL F2•M‡6„aÂÄ‚/V¼q´Zá’E‹Ñ‰¿ýÒôKÓ0dÇŒÁâ–-T&MšŒhúõ X2`¿~ý–iØ©m䨭#Î,NœNy ¥©EŒBZù¥é×/M¿„eÅÇ7yãÆ};U,Ô¯_À2 ;Æí”9säÌÉ#G.\'Ewh­ûfJÔ6X¤@°!†6xë6œþ-\¸ZµjUªT©SÜ’%CV† !-¼ñlØ0bÄ;ÅIP¬u­D‰ú$ƒP¦aȆýúõë×/MšjhÒôëׯa¿†#FlÖ©S£F}ú4 (P¨@}b$HP!C5j´páBˆ!0„Ô0Rƒ 4Lœ0qb6`ĨQ£F C˜0}*5ꔩS£BýúeD“/5j¸hÅ’%ª F3v.œ1o§N•2õ V)SƒaBuªÛ¸nÙN Åí¬[ÛÈ‘#œ­[äq2uꔪL42y3Ö-Ô)b§ˆ*%ŠÏ{ß`mÛ&ÊØ)o݈ó6n·rþ·ê…3œ-Q‰þl3G,S(b£>Âpb 1jP"Fì”)R±bµju'‘"QÛÊ™3glX¨PȆ…:EŒ[¸n¹qÛv‹§D­ZµºÕéÎ)sÝÂ:ÅíÔ)L˜0aê”1bÄ`Á"&ëÔ©Q£@jÔ¨O¨PÄ@…Š£>€ü8¢Ñ§Æ¡‡j8ªA£†#4fœØ ÂÃŒ4lؘÁbÆŒ=} 1úôiÔ¨Q£F*“&MšD‰¢E«S¢?&Hè1g+½[¢øšeŠS'Q·8Ùâ#ï\)sá> gnœ¢m¦È…#GîÛ«[àȵ*u§Ó­[§8þ+·íU)SÛÀm;eÊQò\¹úæ*Û7s߯‘+Î\¹påL‘+gÊ®[¥}Ð0ÃH #š :±aF0;lPú…‰©W­uêt«Ó­?òÈÑjîS8oæÎ :*\8€áÂmƒu+¹V¤îtÂu+V¢[åÀÁ"Ë–©RŸ8}â$êÔ,Y²dÁÊËÔ©QŸ "„ a B…ªP9u@tø€áˆ >Ì"D† 2dÈ"Cˆ!2dÈð!ć @€˜´G1b§F‰Õ”0ØùÓ‰ÓŸ?ŠJý1QJ¹p¢LºeëV'Qb½*þʼnޭmå`•n])S¤^‘¸W¶p±kU*P¢VâpÙ… —­[­J‰²%*ÐEŸfû&NV¶mí½Ú®\9p°n•Úά[¢qðÀ¢†/0ŒÔ ±/vÔ ôi” [ÛnuÕ ×7Y´hA‚DKW»vâÚ‘2EÊ@ráÀ÷ê®u­J%JÔ ×­;¢pẫ”¨N¢D}â$J”©W°`Áš5Ë”©QŸí™"„#J„ & £Er:È!g >€"Ĥ!Bd‘!Cˆ 2„!Ä @È™°aÆ}ª£P!F2јACþ‹ úC§ÎE­b‰JTâ+yàHµÍV¬N­Záj•¨”}hèéÓÇÑ!@…ÕéÐAÐ'P… õéÓgƒ 5ý2$,S&yõê‰k%ŠÖ«X¢ìª÷ œ-[â^µjµW¬X±ZÝÂeê¸[·L‰úSª^½uäÈ­#'×-\ŠèÌ¡sç.\¸ZµÂ«U§V‹}['îÖ¸R¢L™Úö훨Dt8Ìé$ ®u±þйóçþ Xð†mß¾}ÁvÀàaˆF¨zÛÀm èCDˆI’ôè¤H‘FŠ)’®Hº"EŠÔnÝ:räÄẅK9vîÈŠ«U«V­H‰êDJ”¨R£NãÆ[·nݺ3fLÕ©S§B eì2U£B}ú$ê¨B€ 1TH#F…¨ >~ü"Tˆ ?‚úœø cO!@{ÑYtgQ#FŒ ùéCcƉ>‡ ýúõKدP±lÅjµH”,\¢HÙUœ­NàÀuâÄ)V©R¸J•"Uª”)\¶nÝ"Wb½VåpáÂ… \,R­îÐ (ѺX­pájÕªS+\þ±ZýQD®8s°L}›kÔ¢9tî(’Õnݺz±Ä­‡«)S¡ , ÁãW°`Òôk(P¡FáÂþ…‹T"E­Dá"•—<\œî,êôGQ¢Dwò$jÕ©T¢N‰8áâT‚Ä­z¸b½Â… .q¸:uR”èN+vàbµºeË®r¸Ä+•ÈÎNëpµ²õêO ŠØ‰c·n8q±p‰‹Õ ®V­p±37ޱaÃ2ÑÀtê“­R‰lÉû&Š‘9räÔ‘ƒ@I’AÒöîÝ;wîܹ{÷î®HºÚáÂ%îV'Nœ%zKÖ«W®\™2UêÔ©S§Œ#¦ê”1cÆŒu3ÖÍØ9cÜT3¦Ê˜1cÈŒ¥¨‘"FŒ-´ˆ#FŸ@1RÄh E‹-Z´H#F€-ú³gþ @Œ}j$ê“(NŸ)RHÏž>@t8dè¨P£@·.V«D‰pµÕ)(R‰è”訮uëpÅêÔ*Qvì$ê”hÎX­ÅŠ…‹Ü:r·ZÝê$ŠÓuípÉz…ë›­ræÈÙ"Õ*–(:%D±Ãʼn‰D¢À±“W9pâbµ'ªU+\¶:ÅbÇŽ]¸påˆÂ$—©R‰"è rê완 "Dˆ$AÒ¦Í;~üøñãçîÝ»w‘ µk·îV«[DqõêÕ+W®L™:uŠØ©S§N:uʘ1UÆŒq3f¬Û)cÜŒq3f̘1cÆŒ!3ö©Q'þQŸý©óg#FŸ5RhÑ"EŒ)Z¤ˆ#F¢R´è @Œ}õIÔ'QŸD}úÄPŸ>3@€èàHS&PÃB U®X¥Z­§HQ"E¢%J4W={íÚ­‹Õ .q¸äá*×*®X­òØÁ%®uòpµjÕª';õÖÙŠõJ8[àÌ…“…‹®VvîÜáÔéÎNëp[WÏ»rßĵzÕªS§X¸pµÂµN8[àÄݺUª9qŠ%â$JQ£>È‘°ŽDˆ$!‚¤ë;~üøõãÇÏÝ»wï"EÒÕ®®V­Z)ê$ª•+S¦L5êT¨S¡þN…2fÌØ)bÄT3f̘1n§TqSe̘1c§Œ;–M”¢FŠ5Z´è AŒ)b´h‘¢E‹Z´H#F)R¤hÏ¢E‹5úÔè“(QŸD‰ú¤ˆ >{ö€ñA¡L™@ 5 ®u¸pájÕJ”¨W¶È‘·NQ¢Xöpá ׺X¸^µjuK^,\¸nájÕ ×ºzëpáŠÕ©U§DtꉇKÔ·o²À‘ë•«WŠì$ê¤èO§uìÚujE®^=ràp‹õª“¨N¸Úá²…‹.YâÀÙZ‡ ®X®D‰ze‹Ü¸l>|(§ŽDˆ!Bô¨‘¶wîøñþë×?wï"EŠ©Ý:\­8%RÄ©)S¦FujT¨S¥N…:uêÔ)c§Œ3ÆÍ˜ªn¥Œm;eŒÛ)cÆŒ…2Fì”(Q¢F}RèÏ"AŒ1R´ПE‹-R¤ˆ#E¢)bĈџE)R$ꓨF¢qR´H‘ @€dìDCš@eújÔ:\òpáתT«Xàı#'ë[«?‰ÄµÂ…K‘¢N¤p‰×ê®R±ná’G®S¢VëpáŠë–¢?vþ¬·n¨[ßl… '«T'v­:Í™³NV+qòpÝje ;vàÄ# —(\­Ö­k+)YëØ­Ã%þ.q¤HµŠ.\»u€:üðáƒ9uä B$I’$H”Þ¹ãÇ?wîÞ½‹ R;\­b%J”HÑ'Q£FBõ Õ¨Q¡@:uêT(cªB:ÊØ©n§B2fì7cÜBªžF¢>‰jÄh @Œ-*ÄhQ E‹ýÄhÑEŒ>1RôéÓ¢E-Z´¨‘¨F)¥H‘"F…öÈØƒ„‡>„4eúô (ròäáÂ%—-páÖ…û¶M”(QèÄ'¯)qäÀÝ n¸W­Ö•õ®X‰òˆÂ…«';sì´ŽÝ:[ßdÉ · V)qõDuúCG\þ§uòÚ‰jKœ¸oä‘#Gî®[àpÙÂ+®VàØ­#'O.\âpÙn]¸oßêñàÁÇ:röÈA„"I’AÒõî;wîܽ‹ $\¸pqJ”(‘"NŸBjÔ¨O¡>¡êÔ©S§B…:êÔ)U܈‰2vëÔ)n§ˆq+äç B£\µHÐ@‚Ĉ#FŠ)´ˆ#EŒ>‰jê#E‹î,Z¤èÓ¨O:-RÔHѧOŒÚ³ˆ4„éÓ§O­äÉ[Wî¸Wäȱ³%Ë–¨W¢þÐg¸pàØ™ gθ[¥JáµW+\þ·p•JÄ©S'NtæüY‡ ;ràl‘2µ-¸m®lÅÂÅ).qòØáêË®W¯ÂmcÇŽ-\±Zájk8võä}kÕJÞºuân{EŽÜºma…;áÁƒ‡äÈ©ƒh"Dˆ$=zô$HºÞ½‹ ¤Eº%J(P EŠ  Ô'F£FB*Ô©P§Ba uJ•1cÝŒqóv*Ô©SĸóSH† zfš5Š£?Œ1b$£EŒ)jôéS#EŸúJÔ'F‹îÔY´¨Ñ§FŸD)Z¤HT£OŒ ’±gˆÒdÓ'F p‰[GÎÖ­W¥^þ™²N–©W¶¶• cÏžÔ©#gODˆ!’$éÑ#H A‚ $H´uR”( A‹ô (F‚>5jT¨S¡N¡ e “1n§FatêÓ§P§Œq#¦Ô‰{úÊÖ"F€øbP#F€1jĈ£OŒF-Ôè¨OŒýAtG£O¢}úþ$ªÑ§OŸ>1Ô§Ï@Ð DS¡B€D•Ã…ë'Eœ8ÛŽÜ6X²`•¢“H=qì…îœ9sånµj… ®X­ZÅŠÕ*V©Dvèp·.V,qël‰#·M^8XÛn½"g 8Q%láÂÕ©•­VâÀÛv 9p·b‰³ÕªÕ:\¸ÚáŠõ 8\¸bqRĉÀpÛ‘ãöí„<|ø GŽœ:“!B„H’¤G’=‚ôÒ#Hië¤H @êh0”)S&FŸ>} Ô§O‚PÅ *c¡B}êvêT¨Q§ˆ™KgÌ„£>3Ð0KÔ@'dbˆþ£B}b4ê£OŸ}5jÔ¨O )šHÑ'F£F1ň‘¨O¢Fb$¨OŸ= 0`èsˆP!LŒ}ºuË”(NœLÝGΜ¹pá¶ÍEÂD½zÂáºe —9yäÈ•³… W«V­bÅÂÕªU«VœqZ·®X­d‘·n»m°l™º%9\¦•ëN'QŠZÝ2gëÕ6ràbµ²µ®“"\­páÂK8[·H‰âÄ `)[䯙3nœ:xøð¡Žœ:{ä B„"I’$Izôè¤G$A¢%J‘"A€ê|øPÈP&P…}ú T(P¡@}"†‰[(þoÜŒKwîT(n§ÆêJF¡>  räÁÕ"F'êœÐ³Ô(aÙ²b4ŠØ¨OŸNú4êÔ¨OŸ>}*ôG£OŠ@‰%ê£OŸ>úĨP¡>{0€øàˆ¡L€ }úÔ‰'N¥n3.9räØ3õ§‡Rn‘{µí8xåÈ•»‹T'NpáŠÕ*.x¸:%â$¯U¬u¢D‰#g –8r°Â½².Ö:p¸náU‚‰R·n‘cÇnÛ­màb‘jÕJ\§DZáÂEW¬Wœ8qâ°,pæÂ#Gn;AŒ5UèÓ(F q#6ŠÑ)P FúÄH£OŸ>úô ¨O£F5 #?}}ø€¡ C… 1:HT©R¦Ê îÖ¶påÌ™ÛÆ‰tH´b'9vëÀ»Å)§DœJá*‡ W,\ëluêÔ W«uàDá’'î•+qä`™³î8vàÊÙºÅ)P ;¢DÝ*w‹\8pàl•ÕêU,\±ZáZ·Î–)QœP•ˆJU¹ráÆÝþºn9sÚ4xðàÁƒ‡äÈ‘SQDˆ!B$ ‘$Iˆ$!B¤”(N‚€AŽœB… úô Ô'b§B"¶·O§ˆ‹gŒ›·nÆ0RåÍ[(P‡@9*ôaC£QŒhô¡O(C í4£Q6bÄNŨÐ'P£N…õ‰‘ FŸF"jÔ¨Q£B *¨O…íÁ€ćC… ùù4 T)påÀÉ“¬[áÈã&І;ìÖµêèέuõÖÝ*Õ)P N­bá’‡+ÖºX¥:µj… §V±bá'Žœ([ÛØm{Ü­z¸náÂ%ê–¨[œL`Wþ8ræÂ™U*¸XòÖÅZwëV.\¹rÌÅk¼yóÊݺu+¹qáFÉÐàÁƒ>|¨#GNIröLB„"Dˆ!B„(V)Qœ r´ Ž a*ôéÓ¨OĈÅÍ›7bÄŒyãª&A¡¸óÖ­[!P… š!lƒ!F€`íi4ª Fz’ѧÑ)b£¸Lj˜©O B}úôéS¡QŸF"êÓ)PĈ…"Fl1P  r$ € a*êS6NåÊÝ*g®\¹mÜÆ±3÷Šóì‘»‹‰D­ä­#Å)PžX¸p­ƒ·®V­ZáµWþ,NŠDÉÂ%ËÖ:Q¸¶ÕÛVjÛ6[òp+eê.N¦n• QoÞ«måÈÙ"UÊÔ-qâp­Ã…+W®T©æÊÅ‹W¯^½z̓‡k›9sæNñáãÁƒ‡*ÔÇr*êÓ§O >ãFŒ[¶Q‚0…âvª7P˜BaBuÊ·B…„ÉØ³aC† úÄ#3dô¥Q6F§²•NÐ(b‚@q# Ô§OŸ@:Eì¨SŸN EŒØ)b§02ÔÇ  +Ôí¨BœÌ±ÛNž<{ᙣgN” þ®ú‘[·®®D$îàšWêÎDëpáµN®[­páÂ… W¬Vþˆ²Õê»m¯f±«·m[)rÛD•“'ŠS9Q¥^Ý¢Cžô)”©(? ¸qÅí”o˜Ì"f Ô)L˜B…ÂdÌX·L'ˆšÅ‡2e£h” ='éÅh¨l‚LŒÊÖmÜ'AŸ :u ¨S§ºâFl[¨QŸNuëfŒ1cĈþuˆ†# 6å­(£À+œ9yìÌ‘cÇî ì• W¯¼o¢ìpè$*îÔ[‡«®N­ZñÂÕ©.\¸ÍiEKœ8v²\m 'Þ7Sß¶… wêV9sÛL•HC§z­Öáõ'V D¥:Ýj¥*Ï%€žRÕªµkW¯^½|ùòåË—¯{óäqâ„ Èù §Žœ:rêÈÙ#GÎxøîÝBeè£ ähD((P¡ˆ uê&PÜŒ… å§P¨P¡0¡2¦*Ô9b~2eê#¢Ï 4 5j$jQ#=‹1ú4 Ô(@‚1Rþ4jT¶OÜ>‰âÆ-[¶m§FBÊX·PÆB#ê1c§@:ªØ¡ 0 –éX¦SĸábG®)yõÄ™3÷Í$øà£WÏž:`ðà§P¦a˜@…*Š›1n¡Œ*Ý)C}º…òf,þÔ±sÇŽ#Dè(a  eÛ³h‘@tj´hT¸Y£þœ¥Ð,E‚:îÔ(A£F5ŠX7nŸB2f̘7bݺuëF ”0a@0,Ó1o˜@…"eëÖ+\òØ…['ë @&8س7î;sänq*uëV"\ëȉkEb®u±:uj…+V¢D)šÓAQ£X²L‘kœ<[²ÄÁ nÛ6nÛ¸™*GŽœ¼r‰ît"Q¢¸[­Ø‰W  <—<¥J•ªÖ®]½zõòåË—/_¾îõ²„ ;åÌu#a •Ru©R.|øTÁCB¡Ž"fÌ·x§ˆ…âÊ:P¡†q ʘ1o¨âÅ놔P}ü•­Ñ"Dê|@´èÞF€ÚS§Q:Ú²e4ª±FÙeň#bÙˆã&Ì1bÙ²ëF,Û(aŠ0 ºcÉì2fŒ½u¢Z±c·Îœ¨9%0p°Çކ2Ãd¬›7cÝŒ"ÖíÓ©Oƺ…úä˜1?ñÌd섌B…@aúÄX£Fˆ5Z´hO#HŒöú¢F´²5šˆ£QŒFÕ¨ P§ˆ îÔ7n³ˆË6j¬Q„;@À@dǼÅÃtÎÛ:yàZ½Šåj›) $4ð1Ç®ž½q¤J½úœ­W¸Øáz…K”¨X¸:Í™“W»võäÉ“‡KÑ{â\ÙZÇþî–¨R¦À±ç œ9p°¶m»ÅÍ;X¯H‰jÕª vëÖ—8|øxAbž]¾îÍ›w+Wª{ór•ÚfnÜ êìÑFk”(Q¢:}Õˆ#@€ø¤BÕ=|ªæÍ[4Fõ!Š(cÄÐuëJƒ 6ÈèCŒX7nˆýùƒ(Т:Õ¡£GQ#Ds %úsGÔ(WŸD™:%èÓ(Eݶuëvj±l§ø0Ê–­Ñ§?ŠÚ3þ C/^|ýà¡@…%_÷|ùê/U)x÷æ•+% ܸê B¤”(QŠD}jô‰ @€™8!ÊAððÝ3† Ù¹xÆÒÙóæ” ĈEŒX7t º6£À úl0D¨P¡c§5ú³h E‹þü ´H-Eu 4G‘¢WŠdþ•% "A&Ì#ÆX7F…>y`4Ž‘‰E{F™Ð°‡RüЇÌ¼xÆØ™ªWo–¨@8Ø«'n½u³d}û&ëÛ8r¸ä•+Wî©\åpuê„ W+\õÖ­Ã… ®VwæØ£µŽœ"\¸^½zŽœ¨[àè‰s«\¸månm³% –(€‹4IJGŽÜ¶pðN¨P¡BE¥Jž<¥JU‹¼yñðmB±/|øîùòÅ+W®\÷àá*'œ¼p<ÈAôG-Q¢D}bôÉ @{úôé#CÆŒ2T¨Â‡*c¨0a"Dà …ˆ ª±cĈ©Fcˆ˜þaH˜°B @2±gÔ@zôìa¤gÔ¨S‹øüiÔèN#W‚¸™õé“ Q…ˆu T!=}0 ð0NX£='‰ÊVÈ%  ˜q,Ô°cª0É’n9@%8ÐÁg^=vßDÉÚ&Ë•+qòêÑ+gŽœ¹[·nµê W¬N­ÖÕ[‡ .\u V+Wëb}³e ¹R·ØÕW ¸[·Ìm»ej@WŠaP$\9pÛÎ¥H¡B…ŠJ•.YJ•*U*U¼àÝ›çé>|øîÝóÕ«W®T÷îå"UN^=zâNx¨ƒ‘6Q¢DqúĨP¡B}õáCCÆŒ0ÈHq þ¾|¹P#ª¡nÄ:vìØ1bÞ m0` Á†,Bl1ƒR±bÅŽ ÃpÃF2ôjD¬O¶nÝêó‡#@…LèåÇà „Fuë*]¡B' #æ­Q6b{²15ªQ¶BpH](M¡B ÇÎ9Y|J Pd¯^=yßf¹’î[,Wߨճ·®®r·n™âÄ ×:\±p­Ãµn®u¸lµšC—,Z¶Ø‰['‹8q±lÉ«ÇîÖ­m·T™3u  «qßD‰Â ªž¹mÛn¡J‘"… •*Uòä)UªZ»vñ‚ïÞ=|øðÝóÕ«¯T»ðÁ‹Õ »þzöÖ}ø  m­D}R„© >}ôôÑCCÆŒ!0 U÷ð]R @>4„ÊdˆÐ!C3 @$ `À†ºb†fP*6`À6Ì04#Æ2Ìp$Ì‘£=6`Ø€á@ f2D,(>¡Ò}e®[!F…ú+¤%C!0 ]2~DPÀ®^½q¢LÀ@Ξ8qìdÙ÷m¸o¯l­“gÏ\¹[·nÝÅ©®v¸bá —¸uëÖẕH®V±Z‰‡K”8pâlÝ2'¹[·¶Á2PT8rí¹R¤¼p·p™»”"EŠ*þTTªtÉ’§T©R¥ªÅ‹/xóàݛ׋W¯Tµîõ‚gë•-ròê…+á¡"DÚD‰bĈ @{ôìÙ#cž0 È€ €7U*<ÁÃoP€8 Á€(€€ ÀÀ80 $@2°À   À€È aƒ 4y# ” C}dôéSˆ˜¡F3 0€€:uñŽi*2ûq¤HqèÀÉž½X¸äû¶mݸo®\Ù"'o¸uåÊݺŠ.\¸nÅjÕ —8qëÚɇ+ÑpdÉG+–¢[·ÄþÃUNž<\¦nÝh •©rì¶ÍRÄaŽ=yæÂ™’7(EŠ*T¨¨T©Ò%OžR¥Ú•Š×.^»xñâÕ‹W¯]–|Ý›w«•+[ää‘ ÷áƒDˆÀ‰¥hÑ >`ñÁ 0 È€`À€cÆŽ­¢‘ >|Æ` @€ `AH @@À@ ÀÀ0€€8`àÀ€˜1cÆ0Á€ À€80 ÀuÇŽ¡V,Y»qÙD*¡ˆž½zìØÉN9q¶^ÉúN\9pòÊ•»uþ«Ô:\¸pÉÂ…+Öºu¸Ä­“·'N±J­kE«•¸N­p•+W®œ¹[¢J„u Ö¶[¦d¥G9{æä‘CuËOŠ)R¨P¡¢R¥J–<¥J•*Õ®T»ví⵫׮]©v݃—ëÖ+YßÀ®Ä9i%j9r>È!†0€ða€†CÈŽ%S… ȦyøàÁó†l†‚ (`€@@@€ 0P @€ @à@‚ `€@ À" Â92ê(C,0€@0`@€H €CÉŽ¡¦©˜þ°pæ¾Á¢s¢ž¼uìä±[w‹¹pÛdÙÚ¶ÍÖ+råä‘wK®X¦náÇN^½uânáb'Ož8\­:µŠ%ªS«u¸p­[‡KÞ­X&âdÊ,r°F‰õ§D {ß¶ÛVê–ª)R¤H¡B…ŠJ•*]²ä)UªT©vÕÚµk×®]µ,Ýó×-[Û¶m.܉r!Ò6êS‡: :ìÙóáˆ: uêÒþKǯºnÇÔuK—N]ºnÇŽ:¦.Þ¯xÉì%ó–7téÔ¡ã§.^ÔA„HÛ(bÃ@ÊdÈ!B„"T¨Ð¡F”†–,Ù¯dêâ!;þGã<|øŒ… •©˜¡cÊ;O_2dÉ”!S6,Y²_ʆ 1PÄ„*J¨L @2D,S&MÅ~û¥LÙ±dÃ’!;ö+S±bšŽ Kv ݰP¿@%6Œ¨bŠ+–LÝ/uêâáZ§hN öìÙ£G.œ9\±n•º®\9sæÊm3gŽÜ7X±ÀáêÄ©U«VâÄÁºUîV¹[­n‘ÃÕ*¸[ÛÈÉŠ%Ï@\´îÌQtGΜ:‰hušÓaN‡9s:ÜÁ…k~úÔ K†ŒP¡4²Ñ(” ”·nÇú€*Ô'“1L§øšAcX1d 6Ä Õ‡Ä;ìÔ“'Ï·[Ûnm#·Ž;vàÈgŽ)SÛH‰Ú&ë;y¸náþ*ÎÔ-p±Ö»Õ —¼N‰Z‰HΖ¬X±påùÓ W½u¸páŠ+-\¸p­‹Õ*V+\yæJ$ŽT©)R¤H‘"EŠ)T¨¨¤¢O»zí²Ôë^*^øîÍ#W.\¸mÛ¶eËvâCD€´õ (P†t¨A~ d”ˆPÇ P§&>ÆaâF• TóðÁƒ‡)Ô1dÃ4 ;†N2Mdž 6¬ v€Õ¨†F€F™hDJ,AŸ@ U@¿xÆ#äGÄ ä'(FÄFõ‘!ÈЉ>|üòSH˜ˆaÇ P‡T‡$4IJÇþn=sá¾ÁÚfŽ;vô̱ 7î©Q°Æ}›5+\)U·nݺUήV±ZázÕŠ§u¸:ä$ªU,\¢D)ÊÓ©U;\¸hÑÂÕŠT§V±p­Ã… ®WåÈu²3'Q£R‚N¤H±"EŠ(R¤H¡B… •Rñªµ _/O*RÝÃw¯Ü9pÛ¶É‚%ëƒ9ˆi5Š#CŸ1Ú @‚ÒçOPÈ0 .¦P >}Š&U—€äÂw2TèŽ:†lX&MÄÑȤÉO¡Qz¢5*Û(@ÙÚ5úÓh‘(E¢Nq3&b@xÇ@aú„ ¦B†¤#6Ì]þP£ˆ:!£>Ÿ>q2¡PPÆ0 .&\þÌÁeÏ^½på¸m3•­;vìØ#'k–)S߯‰ûfŠT¸R¤p•+îÖ­[œJ½²Õ)ÑœDë®ÃÕ)ÑŸDè$J”W§X±Zµj‹V«V­HáZ‡kÝ:\ðZ‹ÕJÑ9H¨J‘BŠ)R¤H‘"… )TXJ•Ê×=^ªTáñß½\¶nÉš% Ö‰rÒ6ªÑ(FŒbTbÑ@|R4GÏ¢BÄü P±OŸ}úèS(SŸ.aRáé>xðPeVlØ1MÇB ËDÓ°§-”m¤lþ{-BD‘(Q¾± U¨€éŠ*Dˆ&P~<ÊF¬Ñ¸B‚Nj„¡&*EBO¡BÄü PݰOíÖý™3§ž=y¥LmËæ V¸pì¾}s5«”(QÛÖ±#'K”©m¢n‘+‡ëV©DŠìpŠ…«U§9[Éõ®•(:$8˜3gN«V­äájE .\­µZ'®.\¸Àu ×¢9‰dáª'ÏÓ=U)R¤H‘"EŠ)R b©×=^¹LÁâv O®{øàݺejÖ¬êìA¤­Ñ(FŸ1bÄÐ"@€ý ”ˆ‡BŒB ›`À¡x‚)b¤hÔ7>¡ˆþ¡²£ O^øðÁ3fÌ!B™2i"d( P…>1e‚Ï'>‹þ,ÊögÑœ?‹Ä¹bÄHĀޡëvŠ(A§ (ÔèD7@§1Ê6ê A{ø˜¤¨„†BŒB › À!{~bÅZtGC+{ëfÝ NV¶l²ÆÙ’Ej–(S®dmcÇÎ)[¯8½ºeJT©V¥ÄµÂe«•"€‰:´ÂÕ©•"Ns:h˜S"OžN¸ZµJ4‡N'ZŠîÜÁ%.V¬V±pÝze®§9Öá¢EŽ/|©R¤H‘"EŠ)R¤@"Õ½^ðàÝ‚µ­œ*<žæá›—Ë”)X'<ÔA(Û(PŒD1úþô© @€ÚHQ FŒ²ú$"@éN}:5Š‘ Q‚ø(„Š*T*TÝÃU¨PÄe¢Aƒ¨>™ …2…ªT.Q¹J•ºõ'Ð"ZÄѪè‚JGÌ?|DhÐP¨£Qz>:uJ@€ø*¡¨Õ"Q²ú$"€èBÑRÔÉN‡ìä±.ܶlâĉ³Î¸W¶l³ÅN'Q°Dµz… ×­V±Äáj…+ÀVŠî”èÔ*ÑŸ%Hp%—¸Nyå™3‡ÎE‰ÍI«“"\¸Zá"gë§Nwæà¢Õ ^®{ðr©”"‰)H¤H¡Âþ“¯{»zÍõmÛ6\Û.UÚ…ï}úôé#AŠb¤h‘¢D1 S€ºu3Á‡)£Lâ$èÔ‰O¡r©¨>dª ivÈ &0R•*W®\¼àñê5¯U©V´Ä‰«ó§Q! 0ÔMƒ @„’ÁçÔ)bÜ>2eêT6AŒ ÊæJ‘¨D‰1 S€ºu‹%JQ":põcNÖ·oßȵ g Ü-[¢J½Še \+NZ‰÷\»u¶l‰£Õ `,Q‹æÌ™SÂŽD}'¯.\ZáÂÕ »v¸Z‘ÕªU¢þD¸Öኵ\¬V¢è(ÂEk].x÷àÁ3·›1U§N¡B¨¯{»Rñê5ïÖ7[·nÝB¥ÂÓ=|óTiѰP F•úô #EŠ b$¨Ð"E‹1u T¦ tû4J–(F²> 2ÅGÐ)N¨Pq3†J…ª{øà¡:–‰P¦L˜Pyò”ªV­]¼zõêå«—¯^ðpÅ÷A @C]6bÝF*T6A}N™tê–"AñaˆQ§NŠD-:u ¨tûÔ —¢W‰4СWo›«mÛd…3.–­Rþ$âdGÔ«R­nźõMÜ·X´ZÑj°“¢Ewþîp˜£h;vìÈ…c÷í[+Q­:µ²…KÜ:väĉ‡ ×:\­JÅÂ%O¹X±þÌ·Ž®Z÷æÁ“Çn›¬SÄLÝâT Uª{½*YªÕk®[²n™ºUêžK¼ðÝ+B!‘M›B¡õ©Ô§OŠ R¨Ñ'Eœ-ú4 (c @WÐ EŒ¶ý¤èÔ­S§}:…ê’*žàá‹§Ê&MÆP]ò”*U­Z¼vñêå«—/_¾|Í 4§Ñ¨F3f$0`†:bÄ}b4ŸBܲ¡B%êÖ'S|øðõg»N¢8-uj(c PWHÖ(YœþpÐË;Q¢¾‘þZÇ.Q"E¢nµUªÕ+p¶b‰º —,\´DµHK”¨?sJÜiÔªÝ:qßdÉ’åj¬o¯buj W,[äb# ×-\ìÖuJÔj^=qâZ%J$®UªT÷æÁcnÛ¶mÛ¶mu U*x÷xÁ“jW¯y·b½jõÊ©[žT¨ÊWä#À6…j”(Q¢}Z¤¨#EŠ%E‡Ñ©PÆà®Ð©O¢Nñ!¡çÔ)E…8tÊÏ'UÈ.UR…Ÿ1T¨Ñðä)UªZ»võêÕ«—/_¾|ÝóÕ+Ï€d8" @À {Äèã– ” >‚ÆqeÊ”)pÛÁ $þH1FîreBЩSÇனWÛ¶™*ÁaŽ-Y²ÖÑ#e*¨V·^Ùg+Ö­Xânµ*N-ZT¤(ÑsH,jW¯¸W¶lÁúö-›¬lßd½uë.[·À‘#·­.qäÖáÂÕªT V¸pẓ¨U¢\¼ðÁ;'O½lÛ¶m+ë®Zøx º•ÂRª^½r™zÕêÕ«W¦LÝRqi… D6iúôI”¨OŸ}R¤H#FŸ)5‹Ñ§S§†0 ]ŸSŸ DBƶO£NãöiÔ§s¡0!S¥bÕ=|ð.á©ä)UªZµvñÚÕËW/_¾|ùòåë^þ¯RŠQJ@ öÒÛ–M[¡Q§L}R$ê–)SŠDÝR”ˆÑ'A¢)ŠŽ‘¨S§†0 ^Yãf…û¦HÑ:¢\Õs%*§[äÀÙ²Ζ-R¤l‘ÅI®FŠ*¢µ¨N‰9sµZ'O\;q¢^Í’.Ü·oÛÆ}³åŠÜºu²nc·Î8päĵЅ«®D‰D‰jEçN'UµðõÂu«œ9z·lmÛ&«\®T÷æå*Á‡“ OµzÍ‹ÕêÖ«W¯`™*u ÕƒAˆÙ„J”(Qœ%R¤h‘ FŸqRÄi” QŸˆ; @7FÄLŒÊJÆ'>Œ¶:ŇŸOþ§ÎÃÏØ ðà¹TÉ“§T©jíÚÕ«W/_¾|ÝóuÏ—¯{½b ’±@€„Ðm“gj› qŒD™Ê&ËT)Yœ8ÙQ”ПY³>‰R¤È SŸˆ; @7CæäÍÚæŠT8Q€Í%j]©YëÄá²µíÕ+p¢DÍ*%J‘(E[uúSgΜ?¸Äµ#'NÜ«V¢\½25kܸpá²± gëÕ:vìl‘#G8v·náŠUW«uëZ%ú3‡Nž[µà݃—ëV9nædÝÚÆ¹\¼ðñ*'**•RñšÇKÕ-Y°`Å‚eêT¨"„Ù”O'NŠ:)ê¤H‘"EŠþ}R$ªÔ«S§¸ë3 À€n†ˆ êó‰ŸOÜLú$èÔ©PŸ@ 5, MªTTRQé’%O©RÕÚµ‹W¯^÷îÝ»wïÞ=_¾|Áãƒ!ƒfØ;Wîªl¢}¥HT+EŠZu%J‘¢EŠ} TÊÖ¶lĸë3 À€n…è™7îÕ(Y®\ý¡ÓaáÁ“Š´|ƶݒkÖ«S¡ŠPBdÓ&xøæ•â¤H‘"EŒ1bôéÓ§S¨…"OX€ˆ å§O¡B ˆÉ0ÖÍ·s§Na„j˜7t¡†K¡BE¥J–<¥J•ª/xððáǯ>|÷îÝóå«\!  ï”7L‚@1âóé“­N­:)¢E‹V«F¢FZ딨[§…"OØ€ˆ’Çmœ9Y®h‰ûÖè‡;öduÇnœ­oá¶É' à¶mìØ}Sô§Ž({õÀ'nÖ·o®L½’•mÖ)þYãÆnÜ7n²¶•R.¹råÀ™jU®©@œÊáÂÕª“žrñºoÞ­[§ÊÝ ‡k[¹rðxáë•Ë”)qÛB•¢ÈfРƒ•m,S¦B¡„È‘"•xÝ»§ŠS F… *ĨЧO¢B:E¬X·c$¨Ð(L~ø|Âtê”9c~aBe Ó¹PÆe •BE%•.]J•ªÖ.^ðòáëׯ_¿~ýðÝóuωE¬[·t Ö§P£<úTh&b‚L€Ât S(P¡ˆa:FC… •*U²ä)U*U¼àÍËׯ_¿~ýðá»wÏ×½^åú €F2TñB…2*Ó§SŸ‰Š•(ÑŸD³>}ú4jÔ©OŠN•þÅ­[7u Ög\¹mÛÆ“%Ë)E:tåŠÝ­mál…ÈnÛ7rß¾‘ûÖ P Aôì…37NÔ7Xß¾¢¥mÜ6XÛÆmÛ¶m¹q²d­'*‘[âpq⨧Vò$’G"Ïœ@±Z¥ºw®[äÂÁg.\9pðrÁ»/9p²d¹•HªAˆ˜iÍØ©Y§FÂT„B"_ŠøÁDã<|óP êÓ‡PB…>…:e̘·c†4pª£B|õù4Š#LŸF}Å T(LÝB:fL…Š*TTªtÉ“§T©jí‚Ï^?ýúõÇ^½àÉ@þ xñüÄëvŒØ°P܈}údJÑ(Q£¸E¬±YÙ¸q;Ç›·n†0ªÏ¶pá‘'Ë–+W­ÍQÔI‘9S¦Æ ·M\8qì¾}«‘¦èÙã6.ܨpÙ²e›5*[¶m°¶…Û&k›¬mâ¶ÍúöJT§V±bÅâÔ©S©RpÝŠÕ©-^ëxåâu/×¥zòÂÍú6.\½màr庯\8ràdÙrå*‘ KšZ!rF²S§LúD¨È!D6Ñ !cÐ ©îá;7ˆ†Œ>z1ª¨>0€X74xè3*Ô¨B…F} 5*Ô§nÝ 2„)Ôþ‰)T¨PQ©’'O©R¥J¥Š¼yøúõÇïž/_½xåB Aú4‰ðƒÎбnLjëó 7nÙˆqeT1b€@uûÊ›°>0€X·pá•#·m¸o²d‰ú3G‘¨Rœš"G.ܸoáÈ}û&NV#;tÆÑ3—m\¶lßF¢•-Û7má`mã¶Í”)W¦È­³õJ”¨WâJuÂÕ©U.\­báÂ…‹D,yõÖõjuo^.:·ì±{E¯Þ8YÛΩºw^.rä¶m·MV¢@‚P BÄL3i¡N‰úÄÈOBˆl¡:Lx‚‡ž‰<`@€Á þàÀ1a0Ì膡0bŸó#£Ï§tÃ@õé#£)R¤P§R%Kž<¥Jµk×.^¼àÁ»wïÞ½^½zíÊ @€ÂXP0`À (Ø0@à '68`@  0`À àÀ1aåÈ…î›-qßdájDGƒ+zÇm»%ŠS)pâ¾}£%+­EsèУ·mÛ¸Yã‰j4*Û¸qãÆqÛöíU)S¦d' ×+Q¢æÝŠ…«U©V¸påÂÕjÎ\òp•«ï/QvîÔ£'Kœ8qåZåâuW¹pàÂm³D€1ÚÔB3Íþ¡úÄH‘‰‚ÙÄ@ƒ 4pP¡BÕ½{œ<`À€Á€@@B}f€ê&LXŸÄ ’Q(1o†db1CÁ)T¤H¡BžJ•.YJ•*UªTµxíâÅ ¯^½xñâ¥ê€€„ý0 @ ( À € À€ 0 @€ @€C}Æ… Ž8X²d½rõ§D€äìÉ+w‹ÓŸD®Ä}‹E«Õ¢E‰ê˜¨W/Ü8v¦Â…35j­lÚÂÛöÛ¨O¥`GJ®o¤Dµ[ ®Xp­këŽ\õpåÊ• ß¼\‰îøþÓ ×:W¤JåJuo¼rà‘'K–¬W%útªH "f˜IÛôI -Z9ò« 0`ÀàA Nðð;± 6,˜Ñ§Ï¡ „2D¬¨L4fÌ8°aà 4R¤H‘B… •*UºäÉSªT»RíÚµk×.^¼xíÚU U°È°`A€ @€P @ €À 6Ø ·»q¯LÙú&ª@ØÕœ-Qwþ´ÂEKQ§E‹:%¢SÏ;væPi3—mV6ZÙÂûŽ,Q¤dm“%Îþ)W¯b­[‡«.^¸ZáÂ…«SOõæáÊ•ëÞ½y·8‰êÈN"Q­Ê‘Kï<\á¶‘c7î•)\ÙJ$ê²Bˆ˜i Ó¢F4hPBX @€±!†*åÂGÏϰ@6(0`†lØ @Á(°A„T¨ð¤H‘"E *Tà©dé’¥T©R¥ª•j×®]»víÚµ+× 8¤ÌЯC0 @ 8`@@€H@€°@6€µ 9vâ^¹úæ à¢%L±#gOž8\ŠJ”èO þD‰µZDGž=zìÆ‰r5.Û,m®²…3n\¸S¢`mƒõŠ9Y¯^}“·®\,\±pµjÕ*Öœ9óêá•‹×=^òTuÊu+¹[DÝš· _¯r·n3ÇNÜ+Wß\ýI¤¨”)c›ù¬*A™ iÄÈ—2lØ0cÆfÐPê¾s"ÔX@  (ý:Äâ 3fжa 4ü`R¥ U*O©R]J‘"EŠ)T¨ÀS©R¥Kž<¥J•*Õ®T»víÚU«–*L„f¢¤L]2JÅ(ý*vhƒ€ @iÆ‚HàÆÔX@ 7þ ý¢$ë¸qäÀÙúð•¢;|è¬c'oÝ:\·:Ñ™s‡‰9èÌùC‡»zõÈ}åêÛ¬XÙ\Êömܸp³LmÛVê[8R­Ö±Ãu«U+[¸:µjU W ëêáš/×½y¼pÁË•‹/x¹r婤êÞ¼rón 'Ž8[ßfý ”H©[ªµBÄL3dš~ý*ò@`-lИ1ÃÆ 2lÌ IE^øðyë–,Y2eÿ”éSVLX1aÅÔ©ó†]7xñâÁS…JUªT©<]ª”"EŠ)R¨P¡BE¥J•‰2µ-\8q¦p­c×)V¢V¸ZuêT W§yê­»…+—§J–R¥ªµk×®^½zùòåË×½^©8¹b‹Ü·oãþÜáó'‘(R¯`É‚e¬H"Dˆ9bFD¸¤9ÓL0#5j"tˆP&M¨Œ©¨>oǺ 3 Ùþ±bÝŒy‹§ •*T¨R¥JåéÒ¥K•€¨H‘Bª)R¤H‘"E *TTªTé’%O–%8”0Ž;v¸Duµ.V«V¸Ö‰Ã… W,Qsî´ç*–,ZßpEJ”(S¦Dqú´œ9vã\c'ª•-R±Ä•jEª®@ÄÉÃ…+žJž<¥ªµk¯^½zùòÕË—/_¾rݱõ-V»m¯\ýáó''R®lÉ‚5ë2 A„ùÂå‹.þf̤I“&ͳfÍ€ÑÐdHS&PÂ0©:‡J…ª{øæuûd‚˜ŸP›4]òä)UªT©‘ºeë©[âÌ‘³åꕬX¯Hš£h(ZâbÅ’åJ)Q¤ÄÁ2%j›9ráØ±{%N”,\²d±‹þÕŠ“¨Vs:Ô['®•*•.yJ•ªV­]½vùòåË—/_¾|ùºç ×NŠè*‘HÑ'R¯lm»%ëÔ)dE|!B„ 3f̤I“&Mš4iÒ¤yö¬Ù¯L™P}*…ª&Ÿ.Ù”¯Ù¦/GŽ9²êÒ¥J•TQ‘â$JX9sÆ š T*P H‘BDŠ)R¤H‘"… *TTR©R¥J•!Cæ ™·P~Ž…òæíعxñŒ3Š˜±PÆ0S ¢X2o§0qºuª&‚>:ÁÀA¦Nq¢£(ìØ"W¯;p¥ݺ\)SäØ wë•­m·^µu'þQ«N­Äኅ‹”(R£Hm›ejÔ¶m¯JÝZ'ë•(Yß^[×*–¨X¥Hp¨®\9x*]²”*U­]»võêÕ랯{÷îÝóåËW¯Kœqè A)W°lmÛvëÖ-dEZB„—$fÔœ1“&Mš4pÒ<ƒ“æY³f¿P}ú„ ªPª%+‚äÈ"Dˆ¤H *RŒR +VΜ9[âÌ«U)P Hq)EŠ(R H‘"EŠ)T¨PG… <*T\ *^ºxñâÅ‹‡,^¼xðÑ‹çÍ(cçâKV€€°cêÌ¡âtª*S§Fq;uà¨SœD}ºµèOþ%î°³'Kž¼mÛdºu+\¸mãØ™»UnÛ­[·`*å*ÑŸ;‰Z‰“k–(Q®H‰2µ –©mÛfzµÍ)r®pÉZ.–­V¸‘˜CNÜ­K**UºäÉSªTµvõâÕëÞ½{÷îÝ»w{¼îÌ)Q",[ßÀÛvë,c›´2D.\Ô˜1“&MlϰY{ö NšgÍ€¡Â„ 2MÀ€9r„"B„¤Åˆ#~A¢„•3gΜ9CãÌ+ (P PñÉD*x¥J‘"EŠ)R¤H‘B… *T€ò†éX¡'ŠÓŸußDqUO^=sÛL‰2µ Ü6X¶ØÕ«Ç®œ­p°n•uë®X­b)º(Q+EãêÉÛ& –¬R¦J™gn;p¯d‰#÷M­u¸bu ¤¡“¼r—TàÁSéÒ%O©RÕÚÅ Þ=|øúõë×ß½{¾|ùš‡KT pãÄ‘ nÛ­SÆ6ðá#ˆ"DˆpQcæL³gØ®a»ví6liž=;ìÈ‘#Gˆ!"DÈ-< ð G C† I¢þD 3fÌœ=‹- +V¬Æ¥P .Á»í’ˆ'R¤H‘"…ˆ4BÅ‹çX·PÆŽ ‹ç-ž·aÇŒóvÊÛ0cÄBa" & C·í–©r·Nä†jÔ)P…>•:eªÔ©Wìý¡#®Þ,sà¶Ýº®Ü6Y¦l±«'¸pàn•UªÕ-v±Jµ²‹:¯ìÙc÷í›,W¦L™*µMž9yáH‘ú&9QßH‰HC+yðR¨P¡BE%K–R¥JÅ‹¼|øúõëׯ>|÷îÝóÕ«QáÈ‘nÛ¶m·Ñ @Á‡BˆáBÄÌ™fذùÛçoßþ>lÕžYKc†"D„¤…FŠiñ G A‚ !2äˆ4ÌžE‹–+VaåŒÕ&d¡T¨Â§JUÉ0èÓ)SëØñùSŠ;Y䯅·Í¹[·`m#ÇŽ8pänájUÊV,p±páŠÕ©U+Q&±«g+YŠJ…cWœ¹ræÂ™*%K-Z¸Dµ²ÕéNNð<¥P¡BE¥J—.yJ•*/xðìùëׯ_¿~øîùòÕ«—§?þáÊ W.·mÛŒ!A¡… B†!ÂÅŒ™fͰùÛ·oß¾}×°=K“æŒ!B‚i1¢…¦M›BiºôàÁA‚ 2$I%ÌšEËç+VYÂÊ+h—0yº—OE¨xȼy³/ž*LªT…B &o݈uæÍX¨PƼa„Ì2˜d€5L L¡D Pˆ,Qo½‚uëÔ©Q‚>¡4è7SŸØÉ²óm;vìä™#· ¹p§¾m³õí¸päÈmgË–­V¸bÅ’ÕŠ”«W¢J˜ª×'E¯f½"gnÛ¶ránm“%ë›-Z¢Äu×®ÕœrþåI‘B… **Yò”*UªTªxÁƒ×¯_¿~øðݻ端\ðà̓'|ø B„‘/fš5{æÏß>ûüa³ö,>(ø0òe°M˜6aÒ¤ÉÁƒ=zô2dÈ#J˜I‹-šŠ+P°ŠæÌ™³%¬6¡â…O•ŸdÈB™Cv̪P¨0RõiX(bƆ"oX(cƆCf,1P¨üÈ8JO¡§† 0`C<€J•âîÕ§S¥ …úê·SЏ±õ‡;qëØ‘ îÖ¶råLÙ’%ËÖ¶o䨭c‡ Ü-Q­LኅKœ8Y¢•øþTÏ,:ꓵm®mÜTÍî›8q¸dµÂ… ®;rñª„"E **UªtÉSªT»víâ^>|øðá»×«W¯]¼zõêÕ«W/xÒ¤I{ÆÌŒ3fΜ1#„.\¸˜iÖì6þöaÃöìYš4>|!ÒŒ°#ЀAƒ Ƀ=zôdÈ!IŽ(1Ã,Z¾"+Š@ËÍ™³%K”äR…žˆaÉÐaŠGÏ*cÞŒ 5¨¦P¨ˆ…òv Ó)?§B¡2ÆÍX(?…@Ôí P&@›1 @ üØ•âÄéU©?|N}:uªÛ§Q£0 b'êÏ:qäȽÚvkþÛ¶[Ûn™25ËÖ·oáȱ3·îÕ­[¢n½²…k;p¢F¹*¡ˆ9qãØ±ÛV V¹rÛn• gNÜ,Yß¾}k«U)N&ò¨º§"EŠ)T¨¨TÉ’'O©R¥Jµ‹/^¼à͛׫¯^¼võêÕ«W¯^ð˜iv&Í™4iÒ¤I“†ˆ"D’áòÅL³fϰEÃöìYš4iÌœIóìY³g͘1cÆŒ«%K–,Y²DI!C† Ir„3iÒ˜åó-š3gK”°Zï^‘ÊÅ#dϘŸPæT;gìÔ)c§BûdlX¨s˜B…"æÍØ0bÃBa’ªŒ>…@a:Aà€þì…+EÊÖ·o°>ÁâvjT¨OŸ@}ú´MrìØ“µm[¸p·LÁ‚ek[8qáÄ‘[·\+[¸nµjΕ,qàdÉ’¥ˆÏ·zîØ±'K”¨W¦nqÛVιW²¾á¢%N”¨V%HÔâuOŠ)T¨PQ©R¥Kž<¥JU«Ö®]¼xñâÕ«¯]»vÕªU«V­T»X±2cÆŒ3fÔ˜1cÆ —!Bˆpᢄ‹3fΜIóìYš3g̘1sæÌ™3gΘA³dÉ3K–,Y²dÉ’!A† ’$I%¬˜1s&-š3gK–(Yµ Ÿ*~©Cw¢_(?§Bù1†êÓ)UÆþB:eÌX·n舅"æ&PÆB*äm˜a§@ÂX&„uÛfª§Oà\:U(\·n£üðùôI§?ôì±W/Ü6pán™º5n;väÄ…#GŽÝ«[¶Àã¤è)Yâ¾ÉrEjV EíØÑsë“"Qànºu V¸pßÖµûÖê[+N¢HJuï^Š)R¤P¡B…ŠJ–.YJ•*UªTµjíÚµk×®]½vÕJUÉÒ%Kž,] DH!Bˆ!"„!>†!B„ 5j̘1cÆÌ™3g̘Qc† 3GÌQräÈ‘#J”$Q¢D‰%C‚ 2dH’$I”(þQ²d‰3gh–°B²ê˜¸}â3ê¦P§N…*Ç­›1nƸÃt*”1b݈ùÁÔ TŸB2>(È1Bð³Ç ×+q¤¾±ãÆÉ˜ O§üøé“.”¬?¢êµ«'Oœ­[ãnÁºe®œ|B„.DÌpábF3fÔ˜Q£þ$H -‚´R$H‘ ?~üøäÇ ?züdÈ!I’$Q¢D‰%J”(Q²ªW>^à PwŒŸ1o|>}*4ʪQ£n…ºe®·SÜNëÊ1b…BëF Ô©>‚ ,J¦L (–ŽÞ¶[±d‰UjÔ©S¡>Š˜ R¢ÈÕ#Çœ­m·ÂÝ Ž]¸máØ±ûö »X¢J•Š œ-[¸D}û†K–+Q‚þ0jŽV¶m¦D•ºÅíV¸mòÌÑ»µMÖŸX­þ\j•ë&ÍÉ“êÞ¼\¥Ê©H‘"EŠþ*T¨PQ©R¥K–atŠÐ§> \ɲGN»pâÀ™ÚFŽžŸ¸©BF£|"„ˆ"Dˆp!B„‘#™0ñù# (EŠñ‘I•8pðàA?~ ù1dÈ!C† I‚Iª{ð6aêSÀ@€bêÒ¡HFŸ>§FêÃG'U§TºeêÓ©B§>âÖ@P…’!ƒÄ)"Nd¢A €ÇÒ™¢Ã§þÕQŒ âc‚7b¡ü`%J^½o¤dm³eJ–­ràÊ…³eJ”(WÛȱcwK”(p¢J­[w‹T©;uÂ…«Õ7NvJØ©gμME† I’D‰%K–,A³„«|ðà•å UŠ)R¤H‘"E *T¨¨T©Ò%K–.YòdÉS%xð "$HF´Ø„ °DxðàÁƒZøðáÃG!D„!B„!›4ù È O¦>Á…j²8pàÀÁƒ=zôøñ#H C† 2’^÷T]¢!bÂɒ%£WHO!=  ÄÔ§S¡nÁBÅí·þR§0}úÔ ‰P dô %È>~¢1C@†Ùó£Ð,AŒL}‚…jÔ¨P£@… õ')vä\É·Í”­Yà•ƒejÖ,S¢H“'¯“¨[¥8ÅÂÕŠSžDpµº…«U«Vœ:%â@´"A‚ !’D‰’%K–,Aƒf‰3VKX©t)U (R¤H‘"EŠ)R¨P¡O¥J•*UªT©R% ¼òå[5bă-T!;fÌØ)cFˆ˜1CDˆ!-4a’áG‘"Q¢F:5ŠQ·OÃ8pàÀôèÑãGA†2d]÷þx©BÖ-‹Ž%K×mO=zNd#6êÓ)nÜn:e®Û¨O}N"1CŒd3$h1‚Nx›AcKgB(E¢DejÔ'nŸˆ+$è¢?âØ‰ ·œ¬m¦Â•g œ,S¤^'ÜŸR±×)V+\¸p­»… W«NJqúc·-† ’$I%J–,Y² 4Kœ9ƒv) (.™H‘"EŠ)R¤H‘B… *TTRQ©)€¤ºwÕ&dðŒãv ¬S¥€‰hà ƒ|Q“æŒ -hÐ $è£o¦Lmþû3êÓ'>2VÑpÁ8pðàA?~üòãU¾ò©Šê!$–. Bzdk$èS¡OÜN™óFÏ·l§²qjT7o„`dh1†>aê3ƒR‚8Ö-Ô(EáL™ÚögÔ§O}ôø4 D%\Ù#'ë•-r¶n±÷Š8X¢LÙŠ \¢@8½ÂUŽœ¼r¸báºN)pád•脊"#‚ 2$I%J–,Y‚ 4hœ9cµ  $P•;—‚DŠ)R¤H‘"EŠ*T¨P¡B… #D¬Hq ¾{¼T© gÊ”)S£>}ÚÄþÂÁƒDxð€Â PÂÅL"jl8” Ô§SÛ²bT“¢B£0eB6¢8pàÀÁƒ=züèä ½ðåR…,Ô° DcX·QŸ@1b$L(FÙ tÊ\7nÆÂô–X!P2N€šA¨O¡>†úôFÃŒ!  n·QÛ¸m#ƨ O‚F}ÂDL1:tHÜqWï,p²H½bGŽÔ+QŸý ô'Q'\¥:™Úv.\¹[¯lÙ"÷œ9pâÂ}³õЦ‚ 2dH’$I”(Y‚Æ™3gΜ9cdÅ @rË…L)R¤H‘"EþŠ)R¤H‘BE 44Ñ4H… U÷ðÍÃuË”©R¥>}¤IS‹"û4ê” b£ˆù!–-¨P±:%²«^,Y±l‰[÷JQ"QœJ‰â$ªS,qåZuºE®\¹r²`Gî9vìÆ7*TFù1dÈ!þI”(Y‚†™³gÑ¢EcdÅŠ@àƒ† ³U?F¬H‘"EŠ)R¤H‘‚ UçJa²cJÔ%N*<ÁÃw/×-Q¥>1„‰ M-4xРƒx¥>)*$èСC6hÔˆÑ ‚ƒ }9¢Ñâ"^6ÑpDƒ†& BÌœi¶IÓ¨q â7ìׯb¿âÙSuï^} „GÕ=|¼0 *T¨ÆˆB„|¡!C A20=ÂÅL3`§²ùjƒÃ’Å‹§ê¼\ÈT!3f •1oðŽåRï¼xñ¸Ñ;g ž*yÆŒuëæÍ˜7sQ…âói¨Q€Lň#nãÆ¨ O£N1DŒ[¶Q£@€AÆFŒ<èá`‚ƒnŒˆeÔGØ,„ã§/^¿aÄÚþ­‡+-RŠ•ø#ª;páL{UJQ©V±:%jÅî–¼s·pÝGϸ?±ê±ÃK•&8pð G?‚2dH$I’$Q¢D‰%J”$A¦j›«oß¾k¥ˆS'NŠþˆjÕÊV,Næt’‡«Ý:q¸bÑj¥H‘¢O¢)È“ŠKððÍC…I¦‚9ò‹F¡C…*BˆfÒa2!C‹ŠÅ‹ Þ=xªP3†ê\&xÞ¼©Rµ xçPóö©Û§SÆŒS¥êÞ=x¡àóïœ*nç¸ *ÀsǼyS¤èþ“(X£F¢ÃG#S£\eS¤hÑ@´úC Ьo³F‘âó¢Q§f… ËÕ¶o¢>¹5JϨ> H¦/^y›F8B„ ˜0Ë‚%Sì—¦AŽ,a¥I†¡> @—OÕ¼{¼Nâæí*þcªâS¥ª×=xÆŒy“çÍœ·sæŒq3¦  ±c޼ŋ7KQ£D£\1ˆÑ(F¦`…£ÕH£?‘jèÏ¢Y³è(Z¤§„(@Dšåj”(N¢%Rk‘žBŽ€.ºaÆN:%¯^=q¢DÑr%K”Qõ¾³µMÜ«V­ÖáŠëV«X·LÝwëV)QJÕ«GŽœ9rä¼hàÀƒ=ôèÑ#H A† 2dH’!I’$‚d“*SÛ¶}µh‡:bÉÂE.Ö:wþüùCªÞ·zòêÕûÖJ”(QuZˆ!C¿¼ æ¥H^øîqDÈ—.dþÈ!fY°f| QÂŒ&P2 â/|ðTêfl\¨Q˜NS•KÕ=xªàyóÖ^(nçÎySЛ1o¨¼‹Ç­T"[­¾Í*¡á S¢²e›õ‡N£Ep5rõG#Q¢fÑ¡3jQ€É·n”(W¢n‘“õmÛ¢F d`F²x¡Œ;.–­X­‰’…‹”¨;¢êÛÖ ¸Nœ8ÅêT W©V¥J•2… ׫[äJ¬³×ª.\¸pC6Â8xð G?‚ 2dÈ!C† 2 +c¯d‘Z4gÎE¸Ú­[ç.–¸uâpµjÕÊÖ:[ßbÅþÂ%JѨQ @e õ«˜2eÁ‚  ˜"-VåÃǪ‘/]Ȉ#F 2`´P2D 3h‡h0@…*|ðŒq3f*T(P¨@¡â/Õ½{ªP ;g,¼P§B™h윷sÆBy‹gÏÛ¨E‰2h>Œ5bÔˆÏ"ZZ)ú³ˆŽ¨Y¢L‰Rh mÚáj”-Q,Wà`Ù²%ª•«FÙ õ À‚cñBã–í.Z¸:݉%N©DsD±#'ê¨VèÌIÔ)Q§V¥pµjÕéÖ-\¥îpZ7×­V­p•3¥*E8pà Çƒ=~ü$È!C† 2þdHU¨J‘úóG‘¬uëÈ[‡ ®u±Ä­£u 8qßbáj…ë¦_É‚[Œ 2`È!C† 2`¼´¸Ä _¾UGÔ#FŒ2dÈ€ñácÈfÌXÔ À*x÷àyÂtêÔ©S˜¸aòV ^®{ðàÁó[({‚¸4vê·OÞ¸yå­X(Q®l‰ÓÆˆÏ @ŒL1¥h‘žŠýÑ£¨‘¨FŠLÑÒsêÛ¨?‹xh¤ˆ\#Z¢H‰•ˆÎ"Q}p4 @êŽÃTèÔ)\¸p•J”¨•(\¤ár‡«ÓE)J”ˆNžD­:• Ô)'\œJ¸UWþ¬X¸páÂUNU(8pàÀzôèñãÇ ?† 2$HUørÝ!A‚;qìØ­G..q±ZáÂÕª.vìÈÃe W¨dÁÀ#C† 2bĈ3F̘1bĸ ¤Èª{ù¤}CFŒ1cĈÓ…B!J˜ £A høà!ó#hÔ©SŸ@ù1¦ê\*|ðP©öÉ*o¡~RÅ[(oÞ¸…D¨ Œ\ÑÊ6j @|@Íb4êÓ":€>Í*¡G” €Íb¤ÈÕ¸D€êèµè­VŸýQ$  Y¦f1Úph@šÒ#æGЩQâÖÅj•(®Vþ¢:U*uµ®®XZ%ÊCÂŽDѹӪU¢V·p•[GîÖ«sE8€àÀ8èÑ£ÇA~ùäG ›ðÝó¨.vòê±3NÜ«VâDµj… §XëÚ±'Žœ1`aÈ!C†Œ1cÄŒ#FŒ1bĈ!C̈«àáË× 1bĈ#ÆA’,9L˜0ÍšIÓ„‰Û¨B¡> útjž*x÷x¡ … Ó)c»ûÄÛ(cáNëæGÆ}fÉš5k |bd‚Ñ'FŒD1úT)F€…›ÅèÛ©QŒøÔ™µˆÏ8w°Dþ)Ò£HÔQ°²ÍÔÇP€†;†é·QŒpá«T«uâ)JÄI”¢@‰æÄªW¯];\±:áÂ%—ḅú¤*Ô¹]÷à] eì”7€§Ìqãfî¨S§Œq3֧Љ>"dd£õm£Qz1þŶS‹ñY4j¬Q€f}27*[¶QŸD™Ðè«Y®\1Rd‚Ñ(A³²Ít¢P±Ë”.Ó'P}¸áµ.\­Z‰åÊ9ràÖ)J„Ë.\ëbáZ W¬V­n­Ã… .\­:áZWo.\·DR5b8pàÀôèѣLjª0yT‰¾{¹àÕ«G®œ-p±buÕ W;\¶p­³e+7oF´#FŒ˜1bĈ#FÌ1bĈ#FŒ2¡bU>|Ñ€#FŒ1d˜ø2ÄÌ5]Ä”!C†Œ²'ˆê”*U÷î©:elþÀn爅$è¦O¨NqëFLÆ'2öô¤ EŒé)T¨ Q ô0ú”MÔ'@£…ÓsâÓ¨Q¦2A§D#Q§f15J£OŠ>™Ũ(C ‘ ±O~N[‡K.\âJ•j œ¸uäd}su'ѺV¸p)RÔ‰®ràJÝ×*–­[òÈuJ 9\±bÝJ4è8pàÀ8pðÀÁˆEàÝ*UU÷ð̓'\8pänÙ…+®u­bÅ*e‹œ¹x¿&„#FÌ1bĈ#FŒ1bƈ3FŒ1d(PrIŠ"Ððåk†Œþ1bÜtñÑcH4fºtéÒ… ™`À4¡ ¥ê¦T¼îÁCu`¨PÆNÂäíÔ©Q£ˆ3—ŽÛ ?Žfú !›(=€NœÄHP6FŒFé1ÅhÖ¨FŸN12õéT¸S§ˆ}ú£Á#X£´…$Š£Q¦NuGŒÑ‰l†P¬±B…>1Enž<\¸ÄáÂ.;pß¶‰%êWâäµ%ޏ[áÀmתպr¸ÖáÂõ*Q N¸pµâdgŽ Uªh@pÁ8pˆK˜L”Unž¼R•.ÁÃwoÞ-säÈÝ .\¸bÅ²Õ ;sÀZX #FŒ1bþƈ#FÌ1bĈ3FŒ˜1bÈP Ð‚È—/Bh¬Ê‡/Z00dĈÓ…‚!JШ£Œ5f˜¦JÓ9UªðÁ;S·Pæºã¯Û©PÜŒ…#Öm” C}:äȃ«EŒ>œ0!C(bIJiëÈظSŸõéTºYŸ}"Æç„¢OÙô˜ã6 ” @Ÿ>1õ‰Q·QÄd P Ø±tÄø`:õ©•¼uëÊÙ÷ŠÜ¸uÛdÙõJÔ:âìÕÛF;sáÌ™ w«T)\¸Öáj… .R‰uêĉ?ìŒÁÛD @€Æ&dÈ8²%N;\n]þ“ëÞ½yðØ­³…+V+\­b­ÃÅ®ž¼nÈb¼ÀA†Ì1cĈ#fŒ1bƈ#FŒ1bĹ@Á.`Àiq ¾|ÍÀ!#†ŒC’˜1Ã….J̘aÆŠ4h›àݘë\7nܼ…êÊÛ©S§¸qëFŒ˜¹a räHP#F£þ˜Áç1P{õi4ŠÑ§QŒF}J—í#b£ˆq;EL FÙ>}âö ШQŸF5Š=b€ C` À!aéBùù” .qòÈÙºõªÔ+S¶ÂÉ2õÊÖ¶tìÙ“+œ9rãÀm3WÎÔ«V­p­ÃÕª.\¸Zqºsþ'DàÈ™:'OÕ9Uš6¡B¦ ž±\¸n…”¨ž|é1dH’$JÌ(Q² 3V¬XÌÙ­n BãϘ1oçŒauÊ›·P êShÆF£:Ñèa õéÈD£lÙˆ:5Š‘AŸNqãêS‚qãf¯·BÜ@êv T7n§ˆ3 ‚ º ãsêÔ(pånÝ⤈'pÛ‘ÛKþ¬RtÕ£N^¸pÛÀ•+G®œ­V­pá«U«X­bµ*•ÈNâØÅŠ%ŽÜ¶sæŒÑã¦ÊØ©[än+שÄ-\¸:•ÂU ®KxxÝÃ7/W,p¸ZµZ‡kÝ:nÆŒÄpñ¢Œ1bÄŒ#f ™1bÄŒ3FŒ1bĈ3¦Ë–-[ʈ#† !-VAׯ2`„ôè1dÈ$I”(Y²dÉ’%h¢aÅ 4x§ˆqóÖ U7L‚Bq3f®›7F  1:4CXCŒÍÚÓTAdb$cÏ(bĆ…e®P6bŸ@ûTè“ ?ÜNq;Åî”nŸÒq;åÍX(sþ§N#vhÆ€„uËVè(n·b™ʼn“©[ãÈ™3.ܶY¢H˜¨W¯¸[·^m3'Ϲr¶pÝjÕªU¬V¸ZµŠUŠS"NëÄá«•,ráÌÝ’ÇÍÔ6S·À‡«U Rå^ýéTêÒ«[ðTáñ4ß¼\·ÖuRd«U,pÞ4ÅpáB1bĈ#FŒ˜1bĈ#FŒ˜1bƈ#fÌ–&e¶”3F 2d¾À(¢*_>ig¾øèdÈ$I’(Y¢dÉ4— Aƒ3h›  Å-T!n 0…Â„Š˜1c… “Ñgà -õ‰Ñ¨F2Nèé3ª£lŒFþ}G, SÄêFlÔ©O˜>a Å1AÆø#Š1cÞ¼}*DÌ¡K*ݧQ…:qâÔ©Ô­mìÀ…#GŽ»q¦þ”à@ªÓ-r¯¶ÝÏ\¹p·ZµêÄ©.\±ZݵW§DœäµºµN”(qälÝ V8X·À½ZWÜ­[¢æ !ÊV,rìØÝº…§/|÷àåꔨS«[ݵpá‚2bĈ#fŒ1bĈ#FÌ1bĈ#FŒ˜2eš”)#FŒ˜1bÄ s¤Å¥|ø¢ydÈ!I’$Q¢dÉ€hРAƒ3gÌ€ÁÃDŒ¨SŸ0… þ…É·n˜N+4cÁ!dÊF ШzL€’1ŠQ£QÙÉElÜ8F‚>aEìÔ¨P§ºÑ;e®›·S¡K¯1cÞˆ#ÆíÐ CHG,^ŸQ2F‰*UÊT¹ráÆÝºnÜ8sÛ8Ñ¡S‚‰Vìä‘#Çn8\·:┈S)\åpኅ‹®N:áj%Nœ(\òĽjEŽÜ-r·ÆÝÇW9[·8 d§S©[ân‘ w®*©îá›—+V+qãâµpáÂ… -dÈ#FŒ1cĈ#FŒ1bĈ#FŒ˜1Mš”)SFŒ1bĈCL˜ 4Xå+ò þÈ C’$I¢d À%hÐ8Cã 34Μ9C¶ÉO¡P¡@a eLU¨c§eÊÔgCŸújÄHÔ¢F{bôi¨Q€1R¤hÔ¨lŸ¾}úÄ7nÜ`â 7s¡¸:elÔ)cÝF}EŒX7J nX7PÈu+®8yìÊm“u+\9sáD™Àp‡ÝºVÙ¹µ®Þº[¥D Ô©U,\òpÅZ«T©V­páâÔ W,\àÄ‘eË»m°Â»UÜ-\¸DÝu‹“ òê…GŽœ8U¦ð\â…ïÞ¼\åÕˆáÂ… X²lÙR† 1dĈ#FÌþ1bĈ#FÌ1bÊ4)³¥ ™1bÄŒ#FŒ2`ŠÐ2âG C† I’ %hœ9söìÙ³gÎÐ,qmS:b†hx uY(cÞŒ3F¨Ð!P„"ög£:€î4ÔhѨp³Fý15J WŠ1u*Ü©QŠFÚj”1sÝ0…uŒ[·tƺy3—.›0bÅ0àX&oè0 Å©\¹[åÌ Çm›9vãLñá@bž=r·bq"‘¨•¼u­.%Êsë®uðÖáÂÕªU«X¸ÖấH‘¨XàdÉZ'ÊÖ¶zÛJmÛfKÞ­m¥LÝÂÅÉÔ­$êÉ»…«¹[¥þJÝò¤"×=|óriáÂ…‹:¬`Ñ‘%K–-`È!3FŒ˜1bƈ#FÌ1bÆ”iR¦L1bÄŒ#fŒ1bÈ€ òàÇ C† 0I%hÌ0{-Z´hÑž9s†Æ4M˜ˆuCGÌX(cñÎy#æ“02@5jO£Fˆ!j¨Q£Q12 FzôЕØ)n‚ˆ1úFŒ#n݈õ©1b݈uK7ŽØ¨lÝŠ   @¼dÝì…ꊓ9v·ÆÉ“W/\8vôÆ•2áU¿rëÖÉÕˆD\ëZݹ“h.\¸Ö­[«.\¸páŠÕªÓQ±háþbg ,võ¶Ù"En›(sò:q2ש”*\tHØ£î8[¤D•2¥êžK¼ðÍ3ÒÂ…‹/¬XÑÅŠŽ+:pàØ²¥Œ2dÄ#fŒ1bĈ)Ó¤L“2bƈ#FŒ1bÄéBáA?~8dH%J˜1‹-š¿hþ¢E{æ 3f›B ã*”1cÞPÅ‹×-(B˜úôŠ-D{>Ôù°gч= Z´§N£:u²eËÈ£S²5Ê6ŠQLIJ#ÖíT:b¡²u×-1bÄ ;`ÀtÇÐÙ#dÌ8påÀ3'¹pìØ}úS‚ƒ½ráêÕ“‡þK”¢JÝ!A¢ÃzëpÕÃÕ©U+\¸JµÂ… W¢9­h‘ÇN–©[ãäÑûæêÛ¶pá`Ý*gœ©R¢þhèT¯Õ:[¢îÜ ”¨T§\—ððÊ—ÏH /¬X±bÅŠ+:°dÑ¡CG–,[Ê!CfŒ1bĈ³¥L™2eĈ#fŒ1bȸq£åÁƒ=‚ 2dÈ!IÌ0“ ›?þüE‹öÌ™34¬  õÉ1n~â™3VÈØ … „)±F5j´h¢FíAtb ?hek4 #F£ê3ŠQ!@Ÿˆ3ŽÛ©pܲe —mÔ¨l+v€ÀþÉŽy‹‡éœ7\ìÈ•"%¯ž8sì¾¹ÒC‚|òìÙ›W\©D%æt Á!P§9±páêÔ©S¢N¸bµÂµW§;f¹zEêU¸[¦Â±'KÖ6Xß¶ÁÚ×)\¦ÊµJ4'.QsìüIô׫[¦0ùQ± Z‹/¬X±bÅŠ+:°èБE‡:tèбeK2dÈŒ#¦ Ž28ÊCfÌ›7o¬U«vMȃöèÑ#È!IŽ(aÖ,Z4þüíó-š34h–0C ¨BÄŒóO(†BÃ*›Ÿl!ªƒÑ¢=uíY¤Fþü©£èÏ"SþeĈO¶OŸBq;5Š·l¦Fn£@£ôhØcA’ó/ž=o¤lÙzNž•2e ЧQЏmã6ÎØ8bÙNña´-[#F1ê³gƆ.^¼xðJźe‹;vä­ãˆŽXý¶3W®T)S·J‰[K;\bÝé®0•MP#J À¢[¨aÇTab'\«W°fÙ"¥ƒ>ãØÕ³7ŽT©WàÀ³õ ;\±pu"… W§9sáZ×®^½võp)šcOœ+[ëØÁUÊT8vá\}c·MÖ¶m·¸™3wë•©N­Zqà OÜ:qàlKÖÂ… þ.„Xya‚…B^XÙ¡ã +:t\Ñ¡C‡Wt\ÑqE‡Ž[¦½yCZµjÕªU«V `5lÖ¸8pàÀÁƒ?~ùdÈ!I’(Q¢D‰%hÐ,Y¢D 3düÚ`À@‚ DÜØb%bÅŠvà† dÈ(Ԉ؞lݺõÄg#F€àÓ¨‡ êÆ TºB†N:El\#bÙödcdj%b‡ ÀºLšB…öíÛ6rìDñID‚ EöìÕ«7‹”(R®L¹²E..s·DÝz«®XÖÕ«·®X­bÑJÄ¡ž¸X®pc·í8vëþ^¹Ú6îÛ6pÛ¶•3Çî)v®l-ÒÈÞ:yëÆ™C×"† .tèÐaÅŠ ^¼òÂÊ+V°è°bÅ XtèÀ¢C:tL£FÚ›jÕªU«°Z5kp®qyàÀƒzôødH!C† I’$‰%J”(Q¢D‰’MšD( @€$H`À€ uÊ Í DlÀ€6l˜qhƆ 6d˜áH˜£B3rìØ™3†,† .^X±bÅŠ+B,H°ðBÈ !Vt\±bÅŠWt`ÑEXtè 3í 5jÕªUX­ZµjϬ]ãÀ<èÑãÇ C† ’dH’$I”$Q¢DI’#G(P € €À8p @H@ ,`†0`@€ 8@Ã2høñF(†úÈèÃÇ1F†f @€uêÐÓTþd;SõêÍH{õÄ­£×oßd}'råÊá*…«®Npáj…«Þ<\¸páZ×éŽz±Ö‘Sô ׫W¯À™+u+=q¦^• Ç­Ü­p²DÁ•HC,{äÈ;¯E .^X±bÅŠ+V¬X±@Á‚‹/„èÐaÅŠ+VtèÐqE‡+:°èÀ’…µ7Ôª¬V­ZµjÖ¬U³–Æ8èñ GA‚ 2dÈ$C’$I’$I’$IZ@€‚0@€€ €$ @à@‚$@  p€À 80cÆþŒ(0`@ 0àÀ€ p À€êŽC7¬X2[²À¨;öìÑ«ÇΖ(Yßb¹r%N^½záÈ‘ƒw+W¬VbáŠÕ)®zípáÂ…«T¢¢bÅjåj]¬o¸l Wê»záJÁâvë–¹m¶JÍr¥(†DòÈ…×- .\¼°bÅŠ+V¬X±‚åÅ ^¼xaÅŠ+Vt\Ñ¡C‡+:®èЇ›iÔR«V­ZµjÕžY³fÍ8xàÀA?~ü2dÈ!C’ I’$I’$C4PÀ€€  €€ H`À@€þ@€À0À6 0@` 3„êc¨‘!J†X 00` 8`À€ p A†Ž%S'LÓ±_áØ¹#'‹O ‚ðÕ«'ïÛ«W°¾‰›åê»zöØ•ÃîÖ¶Rœ8áZ‡+®u¸Ö­ÃµW¬VsHà’Õ ;qäd‘'îÕ-yõÌݺîÕ­r¦n¹÷M”( ¢ê™·Í°.\è°bÅŠ+V¬X±bÅŠ!&Px!ä…:¬XÑaÅŠ+V¬è°²CG2©Q£V­ZµjÕ¬Y³fíÚ5"8pàÀÁƒ=züò#È!C†þ 2dÈ!CùõËÐ5~%KOY X–LY¦ jlØ  ˜ºCÇÔu&lƒ°bêŠS–.Y²bÇŽ¡CwŒØ0aÝ„y+v(À€ P°`@ ` À€ Š;vLŸ>uúØÕ«7N” ÄÙ'ެ[⭇땭uòê‘+wëÖ­[¢8•µW,\ëbá·nÝ:\±iÀÕ*V+qâp‰®®[æäÕ#wëÖ7U§D…#Ç.œ+EØÉ ëV¼.\¼°bÅŠ+V¬X±bÅŠ:´X `Á‹:„X±bÅŠ+:®èСã€ÀP{þCšµjÕ¬Y³f­ZµkÓ(8pàÀôèñãGA‚ 2dÈ!C†‘¦O>}ÿÒéÓ—,Y2uêô)S—LÙ1}êԥ떎_7uÝŽ©ë¦.ºtݺ3tL:añ¼éC×-:oéÐ¥SÇO]¼xêâ©ã§NŸ:uñôéS§N:uÉÔ©¦N¾êø™c7®)Ù³ë›}âdB > Œ `@]™ b4ÊDŸF{ýi4 Ñ¢:‰sŨˆtC×í” P‚Ba( ¨‘‰q}Nb” ” @€öð1HQ ……6#@€Cöü¸sG{òä™Ûvk›¬mäÖ±cÇ.\8pã̱åj©Q¶dÝb'ïÖ-påp™ºî¹r·:á’×)Q+qälÅŠËV¢<ÖÕ[‡ .Z±hÑÂ… þ׺X­bµjÕ©T10¬X±rE‡V¬X±¢ÃŠV¬XÑ¡C@V¬è°be‡ &H˜0aBŒ vTÀ†Ú5kÓܸ™öÆš5kÖ¬U«V­ZµjÕ®U»VíZµjÕܸ³FÌ›1cÆŒCTÜPꆪ¦a¡† ËDƒL}05  Fzíi4ëO E´:‰£U‡# ”Ž˜>‚hœP ¡P!F£ô|tê” >€ñt‚S«E¢e+ôID4ÐêÐC‡VöØ«g.Ü6Xß̱cÇŽž9váÆ}#5JV¸o³`#¥êÖ­[·Ê™Ãe*V+þ\­Zqê´W§NJÅÂÕª“¢<:µÃ+-\±ZuŠ ×:\¸pá2UªÔ§PF`X¹bÅŠ+V¬X±bÅŠ+V¬X±b +V¬è°¢Ë‹$H˜0a„ &T¨°cK5kÖܼIcÍÚ5kÔ¨Y«V­ZµjÕªU«V­ZµjÕª½3f̘1cÆŒ3†L² F3v*”±c¡ŠÒ4Œ!2f*ô ЧQÙ² 4K[‰F´h‰W‡O£B`HA}1:%ƒÏ©SÄŒ}:5Ê”©l‚ ”–"Q‰1b„)¦4t놫ӟ9¸ìÙ«WŽ[¸m¦þ²µcÇ®;qä²½2eêÛ¸pßL‘ WŠ.råÀݺu‹S©W¶:%¢hÝ:\ýIô‡N¢D‰pµŠ«-Z±hµjEŠ®u¸p±‹…«U©O¡~½°bÅŠ+V¬X±bÅŠ+V¬X±Њ+V¬X±bÅŠ• $H˜0a„ *T¨P¡ÂjÖ¬¹™VÍZ5jÖ¬Q£V­ZµjÕªU«V­ZµjÕªU{3f̘1cÆŒ3f ™e™P…âvê¦S¡ˆe u !C™2ÂTèÔ©O£‰¤‡ ?%¶É¢%NÎ@ €†:bĸ"6ê±l€üœ2%ÈÔ­OþââN‰Ztê(P èö©Ýº?sJÔ³'o”©mÛLÁ ®]¸o®d‰%j;väd‰2µM®råpÝ*•H‘N±pµê4§U;\ëZ•šC‚‰9sæ´jÕJ®V­dáÂÕ*­u¸ZáÂuë–©R¢0 ƒaÅŠ+V¬X±be‡+V¬XhÅŠ+V¬X±bÅŠ+$H A„ *L¨`£B… d®Y³f­Z5kÖ¬Q³F­ZµjÕªU«V­ZµjÕªU«fM̘1cÆŒ3fÌ2ˆaútJ¦Pñ2 #4ìW±L™†a Ó§SŸL™($ˆQ8€´ÍÒVþ¢N£FfÌH@À tÙˆjÄh >…¸eCU Õ­O¥øðá3êÏ(vZqZ$êÔ(PÆ ®P¬X‹îhˆeoÝ«[áÂe“•-Û¸[²HÍåÊ•¬mìØ¹"eë'S·L‰*Õª”¸V¸pÑRô‡C,\Z)ê4§ƒ†9%òäé„«U«?sìt¢¥èÎ\¸pÅjÕ*V¬R¢D}fÄŠ+V¬X±bÅŠ+V¬´bÅŠ+V¬X±bÅŠ+V$H A„ &L¨0Ç„ÂP³fÍš5kÖ¨Q£fšµkÕªU«V­ZµjÕªU«V­Úš1cÞŒóf̘1d‚È”þŸOªŒuFˆÐ°L™ 3$Œ1@€¶}Ó“íO#F{>eÓСD‡99rD€@€öˆÑëÆ-(@|ÛöÉÔ+Sà¶)zH"bŒ:ÑIäÊ„ S§Ž0À]!Z:ÝéP‚%âë#Q§N `@º>±D)JDG®~ò¾ÙÚ¶m›8vàl³eK©W¯lk¥¨S+QàÀ‘c·Î–,q­hŵhΜ9%ìØIô‡S6qõêáÂ%ª.\­Àµc‡«U«R­Z)J+V¬X¯L•Å “V¬X±bÅŠ+­X±bE‡+VtèСC‡:®þè !‚ &L˜0a„ *LÀA5jÖ¨Q£F5jÕªU«V­ZµjÕªU«V­ZµjÔÄŒ3f̘1cÆŒ!³Œ>ŸN3†)ݰ_, S6,“!BŸ¢³hQ£q‹}ø g‘ æ4R$cƒ€¡ã&ÏÔ6Eã>‰2•M–+R²8)º£( ?§N‰¥H‘+@§>#v @€n†HáRd*‘:ôèmsµ W6qëÀźEªÓŸDœìˆzUêÕ­X¶¾‰G‹V+Z­:-Ztç:‰Ö±cÇŽœ¸uß¾µÕªS¬X¸Ä±cGNœ8p¸pá«իV¯L•þ%ª¦a0¬X±bÅŠ€V¬X±bÅŠ:tXÑaE‡:tèx!A‚ $H˜0aB… *L¨€c5jÔ¨Q£F5jÔªU«V­ZµjתU«fÍÚ47`º3f̘1cÆŒ!Cf²P >¡2 Ù0‡ÔvˆÆ!B„@}Ú³¨Q£QÚi+±‰‹êÔµGC†̰wîÜ)TÙ@ú4J‘(RŠÑê$J”¢EŠ5úô§”­mÙˆq#ÖgÀ€Ý É%ëÓ^ÙcGJÔ·VëØ)J¤HÔ­V¢J½j%ÎÖ-Q·bá²%‹–¨V´D‰ú3§ÄF­Ú‰#‡Kþ–-Y®L¹²õêU§V­pź%î8r¯pÉÂ%.V«V¯J•%Š“¢OÃbÙqÅ @+V¬X±bÅŠ+V¬X±bÅŠ+V¬X¹¢C‚ $Hˆ0A„ &L¨PaBjÔ¨Q£F5jÔ¬]«v­ÚµkÕ¬MFK–,Y²0)óF̘1cÆŒ3fÌ2e¡@ … S&bš «!ì¡a™4¨‘žY-ú°GœyøÈÄ  /ž9UŸ>šuŠÑ'QhÅJ¤¨S+E£>5õé•)Aœ@ò#LÁ€„#5 ×7Qs8̱KÖ:z¤Hâô*Ö+þ[àlÅŠu \¬V¥À‰£E«“"EŠÝ)Q¢D¢võÚ‰‹eK–¬m߲ɒNV,Q·páÂuK9r¶\Ùú†ëV¬V­Z•%ªÓ'NŸ4ÕØ +V¬X±bÅŠ+V¬X±bÅŠ+V¬X±bÅÊ $H A‚„ &T˜0aŽÔ¨Q£F5kÔ¨Q£FÍ ˜-Y®àÀ’K–,Y²dÉ’…̘1cÆŒ3fÌ2Ò„)”1oé2…†i˜0M40 ElQ6EÚi´Ð ýáC'ОC@#ž*s˜úÄçÓ'Y¢Z‰RD‹–(ZF‰µ–+T·þJ E,ž°;$kܬpß)šCGT«z®D-âd‹œ¸[¶ÀÙ²Eª•­R¢8ÉúÖHÑ"Z‹æ”¨SB­uòÄ­'êÕ,YáÂ} —mÜ7[®È­#K8vänÙ²îU¬V¯H•*%ª“"EŠeúð…+V¬X±bÅŠ+V¬X±bÅŠ+V¬X±bE‡•$H A‚„ &L˜0a„ :¨Q£vµeËÂlÑ¢%K–,X²dÉ’%K–,W²dÉ’%K2cÆŒ3æÍ˜1d”„ê&c¡† Ë”‰P¦P™ü`Ê„)Ü,@ÄÑj´gчEêÔ%J¬B…Bþ0`?o¡Î…JG ·S§þ¼’EJQ§V¸\™bÄh”)W§J2vŠX±nÊœ¼YÛf‘' P¢9¢D­+5k9[¶¾½zN”¨W¤D)¥¨•¢DtæÌùƒ‹\;râÄÑr%ÊÔ+S³Æ .»p¶\±cÇÎ9qälÙ"÷ Ö«[¦J•*%ª'EŠ X +W¬X±bÅŠ+V¬X±bÅŠ+V¬X±bÅŠ+V$H!‚ &H˜0a„ p„SF‡Ž 8pà¨%K–,W²dÉr%Ë•,Y²\É’%K–,dÆŒ3f̘1cÈû•é¦P¡BËDþ¬O&ÂüBª[Q´ikôÑŸ?íQ¤¨YÄ@9@c¨â… Å-Ó'P¡> %+Q¢?‹f}úôi¨YŸ•:õ)[·né @ ¬=sæÆ½%‹­@u:¬“'î9p²¶‰·mÜ«RÛd}{E*‘¢Evê$¢%®];qßb} çJ”¬Y¦\c.\8vãd•Úfë;zäÆÝÚÎÔ+S¥H•*%J”¢D ä§Ð/V¬XÑ¡C‡+VtèÐaÅŠ:¬X±bE‡+V®¼ A‚ $H a„ &LÀc8&à˜ CG–,W®d¹r%Ëþ•,Y®\¹råJ–+Y¶y3f̘1cÆYì¨P˜º…uL˜¡3ÍÀ4 ·mþ´Ò–h‘†:‹É!1çO¢q§²£À@ñâù‰×í±a¡¸ûôÉ”¢Q¥Fq5ŠØ8b§²qãÆ7tÝ a0 ”zÜ豃EJÔ¬XŠîhUï[«päÄÙGîÛ«p²¾}cG.Û¢;s‰«çŽœ¬X¤Ö}3%‹”­m°JÍÇnܸqæ¾m+eË”(zìÀ…wë)S¤L•*%J'EþÈOM^v\±¢C‡V¬XÑaE‡VtX±¢C‡V¬è°2AB þ$H A‚ &L˜0¡Â&à˜€CG–,Y®d¹råJ–+Y²d¹råÊ•,Y²d)3f̘1cÆŒ!³ì×°Oݺ2dÈP£2„*D Ô©QŸÑik­EhÍùð'Оq…mØp A‚4øA¡cÝŽ;Öç(nܲ㪨bÄêö)ºP}6 80`±nô¸·Í-qßÝápÇž¬NãØÛ¶-Ü6YádmÛÆŽÝ·EꈪWOÜ7qâf}ûæÊÔ+Y²N™Ê6nܸqãÆ}ã&k[)Nà¶…Û¶í©R­J•*Uª'AÔ‡#4xþì°bE‡:tèÐaE‡VtXÑ¡C‡Vt\±bå… "HA‚ $L˜P¡Â*T˜0A‡Ž,Y²\¹råÊ•+W²d¹råÊ•+Y²dɲ…̘1cÆŒCF Pé†}êÓG†£  ûp¨#b ÍÚ3ËÝ7@uþtÐP‡=§d€Ú@`@ „±( `À€ P°a€†Nl8p À€Á€ ( ÀcÂäq“e –©YâhuŠu‡ƒ8Y¤Ö…Û&k[¶oô¾Í’•­Ý8X€JüiW9w³²ÉÊfn–¨páfÁ‚µmܸpæÆÛþn›-NJá ÷êÖ­R¤H‘*% '€œ ÄgÏ “hü‚aÅŠ:tXÑqE‡VtèÀ¢‹:tèСÊ $H AB $H0¡Â„ *L˜0A‡Ž,Y²\¹råÊ•+W®dÉråÊ•+W®\É’%Ë–1cÆŒ3†Ì¿bÞ É84ƒ…‚ 9Ú@†#b„ •˜¶B£éÙÈà =†ö 0`@ üúU`@€P @ 0A€ 0`À€ @@€‡hŒ ·m9p°d¹"¥èE¢\±Û¶-œ­pì¾}#÷íþÛºo­•PäÎ^¸väDe“õM›©QÙÆe“Å-ܶmÛ¾‘#'kÖ:q¢ý¹eë–¨N­J•*Õ©@Nœ%¤gÏž=öÌ ôb‡Vtè°bÅŠ:¬\ÑaE‡Vt`±bÅŠ+V^HA‚ "H0a„ &L˜P‡Ž,Y²\¹råÊ•+W²dÉ’åJ–+W²\¹r%K–,dÆŒ3†Ì´`†h̘q`Æ6̘A`À†4öÂ@@ŽɘÑ-ÄŒ= 0€±`Â@@€ @€@ A €þ ˆØV.¹qàdÙråªÕ¢:Š:q2WÊÔ8pÛÆ… ×îÛ7q³DÑ1qŠž½mã 7+[¶S´²eÛk[¸m²le³5îÛ+[±D‰jõªU«R­:•êT `§N¢8*¡gÏ 3>`ÁÆ+V¬è°bÅŠ+V¬è°bÅŠ+X¬X±bÅŠ+V°è"A‚ $H0A„ .L˜PA‡Ž,Y²\¹råÊ•+W®d¹r%Ë•+W®\¹r%K–,Y¶3f ™0  `@Á80€À HP @€ 0  @€`HÙ!J‡þD, ` @€pÀ€€€, ` l.\¸päÀm·M–-QwêpEŠ“)sä‰ûŽÜ¶oâd5²Cg=sÜÆeËnÔ(ZÙ´}ÓÖ¶pÛL™2åJ9\¯D‰Š…‹T«V­Jµj°T©R> *“!C‡9ªáÈV¬X±bÅŠ+V°è°bÅŠ+VtX±bÅŠ+V¬XÁ¢‹ $H aÂ… &L°€CG–,Y²d¹råÊ•+Y®dÉråÊ•,Y®\¹råÊ•+Y²d)óf 2Ál"¤)ÓŒ hÌ`1c þ€€0`@‚ 8€ 6Ù8DI™ºd¿ŠQVìÐ@ÀÐŒ , Á ,¨±€@ nPúu¨9páÂm³%¬oìhp%oܶ[¢8• îÛ7Z¸fµR4‡=zÛ¶›îÛ¨F£²nܶmÜL*eJ–8p²lÅÕ W¬V±ZµXªU§R>#6L˜°L™42tHS_/¬X±bÅŠ+VtèÀbÅŠ+V¬X±bÅŠ+V¬X±¢Ë•+X,X Á‚„ *àСCG–,Y²d¹råÊ•+Y®d¹’%K–,Y²\¹’þåÊ•+Y²dɲ…̘1Ëþ%KÖí:téŠSW,¥b¿јQà 0@à@@ÀÀŒ‡( £$ŒR2”fPú%Œ¥C3h:tˆF J†„¢Á‚’²Ê”%S¦.™:eÉ’)ûLÙ¸pá‘'K–¬X®þ”è@Ξ¼rÛ8ýIäJÜ7[­h-Z´hމzõÂ3g*Ü8S¢FÑʦ-ܸmß¶•úD V¸o¤Dá²Õª®[­ZlUªS«R:‰:5lذP™~ʤÉ!CÀvèÀ¢C‡+V¬X±¢C‡+Vtè°bÅŠ+V¬XÑaåŠ+V¬h±rE‹þX²dÉ’%K–,Y²dÉr%Ë•,Y®d¹’%K–,Y®d¹’åJ–+W®dÉ’%Ë–1d¦%Cæ-^¼aÇÐ ë–îX±aê„F©X², VcƆ6F£%eÊ„¢!¬X&u‡Ž ¦¬X1J„ +&L¥bÂfüR¦NY2eÊ’)SWLX2aÊÔýSWìØ°[á¶‘c7Ε©m¶D•àÀG^½pàÀáuç(\´)Z”HT":õì™cÇnT¶vÙfe35kܸpáÂÁEêÖ6Yálµrõ*–­[·¶jÕªU«VJ‰Rujذa¡2 •)S&M‡~ñСC‡þV¬X±¢C‡V¬è°¢C‡,V¬`±bÅŠX¬XÙqåJ–,Y²d¹’%K–,Y²dÉr%Ë•,W®d¹’åÊ•+W®d¹råJ–+Y®d¹’%K–,dÈèK†¬[¼tÞ0óæí:cÃÔuSVL˜0aŠ%K¦®X±nÅÔ&¬X²nÅŠ ;6¬±a¡ºRw¬›0uÇÔu+&LذbÂ~*6¬X±cÉ„ÅSG,ºnÅŽ+f”±n°¶3ÇNܬWß\-*Q¢»qö䉻ʼnD‰D‰þ$R”(‘¨EtèÙ«Çnœ(WãdeÓæ*[¸qáÂqƒ5 Ö6X¯Æ‰‹5k–¬ocþµjÕªT©RJuêtêÔ©P¡PúTè¨L™ ýò²c‡:¬X±bÅŠVtèÀ¢C‡,:t谢Ê+VtX±‚%Ë•,Z²d¹’åJ–,Y´ìÈ’åÊ•,W²\¹¢åJ–+Y²d¹’åÊ•+Y®\¹r%K–,Y¶€I†®›1oÜNyóãç·nÝB3ª˜°dÅ’%ó†®Û1bÝŽ+vˆ˜† ØŠX(P§Nyëã ]:bŸ "v¬˜±cÝŽ¢QìØ±tÞÒaBçÛ©pãÒuëÖH1?¡d'Ž8[ßf)ºÃ‡Î:võÖ­Ãu«9w8˜ó‡Îœ@tè´«þWoÜ·Q¦¾Í‚ë­l߯ 7«Ô¶m¥À}kå 8€²^µjÕªT«N¤:uê$j*P¨D}ú$èÓ§O˜ ªñ †:tX±bÅŠ+:t\Ñ¡C‡:t\ÑaÅŠ+V¬XÑqåÊ•+Y²\ÉrEË•,Y²dÉr%Ë•,W²\¹r%Ë•+Y®dÉråÊ•+Y®d¹’åÊ•,Y²è6ÌX¨O¨>}Rd"·S§>u%b!CÅŽÅóê1c}úôÅ­›C†úô¡êX:oð¼ ;Õ­Û)cÞºy#6ŒX(P˜Ba1ãX:cÇ>a:uJЧO >bÔGÆ PáÊ…ƒÅþ\¸uãZ‰Jd‚¹q²ÖµÂ…KQ¢N±b%jÕ)QžE‰î”°e;\¤HeÛFKÔ¬Y³Æ™c7–©Y¦L™r¥h@s¯\µjÕŠT)RJuêÔIÔ'Nœ8) Äé#A‚øòCèWŒV¬X±bÅŠ+V¬X±b劕+:°X±bÅŠ+VtX±båÊ•,W²d¹r%Ë•,W²dÉråÊ•,W´d¹’åÊ•+W®\¹råÊ•+W®\¹råÊ•+W®\¡Œ'>Ñáˆ#=‚N|*êe†„©Cg  P˜NëfŽX7o†²;f¬Û1oÃhœ ÏÛ1oÞâã†ì1þc¡Œa:¦@D±dÝBqÂtëT)L&}ês‚ >¦T)b‹Ü·oä^ýQT¢„(v¯D•³ÕªT«X±bÅ¢… W,Z¸bu*AKÞºm¤\É’k”(W³\eê“(S·Â… ç  ­o±\¹jÕŠT+Q¤:uâÔ‰Ó'NŸDýáÄéÓ'F… äG†;¬X±bÅŠ+V¬X±bÅŠ+V¬X±bÅŠ+X¬\ÁbåJ–+W²dÉr%Ë•+Y²dÉråÊ•,W²dÉråJ–+Y®d¹råÊ•+W²\ÉråÊ•+Y¬h¡ŒŸO·>‘@Å ¬O€> úÄH”~;懘±SÜþŒqófΞ·xéÒ+”)S¼xðâÅ‹ÏX¼xñâ‹Ï›1PƺÅ;—¬@_ɼÅCÅ©T)Q¦TâÊĨSœD}ºõ-Öºo®\‰âSBC Xßȱc‡«T'\ëbµj…kÝ:\âpÅjUâ-q®bÉz…+)Q¤D}reJ§OÛÆ‘cœ+Y¯^½råª)R¢:uêÔ‰Ó§NŸ>‰ ô‰Ó'QŒ1äçŒ 5`ì°bÅŠ+V¬X±bÅŠ+V¬X±be‡+WtX±båÊ•+Y®\É’%Ë•,W®\Ñ’%Ë•+W®\Ér%Ë•+W®d¹r%Ë•+W®\¹råÊ-W²\þñK“ŸQŠ>*aŠÓ)sŒøŒâÄMÐŒ6PR/“7b§B3vî\:côâ¥C×Í7tèâÅ‹Ï[1ú$ÈÏ (Åp¡Cˆ+V¬X±bÅŠ+V¬\±bÅŠ+V¬X¹båJ–+Z®dÑ’%Ë•+Z®h¹’þ%Ë•+Y®hÉ¢%Ë•+Y®d¹r%‹–+Y²dÑ’åÊ•,W®\Ùá%™ >Ÿ¸}Å*Q£ êÆé“‚$à1¬:{ÝÎófÎ=xÞÒÅë¦.ž±xÇây‹w,^¼xÞâÅ‹‡Ï¼S¡Žó†Ê¦lK §[·Dâ6ŠÛ)A§>‰:'ŠÓŸF‰è*¡C"pôìÑ'êS©[¶^‘º%n9[¯^ÅzeŠT¢9œÖuŠ%ŽV,\®D‘E*,S¥n4'.œ¹o²dÍ’õêÕ+W¤D‰êÄI‘"NŸ8}úô Ô'Q¨úTH>}Bd¨aÃ… /^À°bÅÊþV®èÐaÅŠ+V¬X±¢Ë•+Y²\É’åJ–+Y®d¹råJ–,W®\¹råÊ•,W®hÉ’åÊ•+W®\¹råJ–,Z²\ñã2?Œ}ô – Qç:õÉ”N °AY¡:eªÔ):Šqè ÁŽ-rõê±WJÑ-[áÀ•2EŽÝ6p·^ÙÚvëU«NwÑRÔJ®X²L‰"5ªÔ¶Y¦Žºµí•)[²dÉ’ Ö«W®L‘Õ©“"NþŠ}úôiÔ(T Fõ “ ?}ú„È@)F .\¼pñâÅ‹V¬ì°bÅŠ+V¬XÑaÅÊ•+Y®\ÉråJ–+Y®\¹’%Ë-W®\Ér%Ë•,W²\¹’%Ë•,W²\¹råÊ•,Y®dÙ¡l‚>âSÈÜ©OŸ¸…2ĢOÆ„@À/}Þ¼uƒ/^ñ1èÓ)S‹þÌ)Qâ;{¶ØÉ³µM¬[°Â…Û6޹[ã¶ÝºuëT©R¯ݹ“¨•8[±bþ‰åÊ”(SoÁ2µm,SÛlÉ’%+¬X³\™"%ª“"EŠ>}bô Ô§O£B  Ô'?‚hôù!¥.\¸páÂ…‹.^¼°bÅŠ+VtèÐaÅÊ•+W®h¹rEË•+W®\ÉrEK–,Y²d¹råÊ-W²hÉ’%K–+W®\¹’劖+W²\¹²ã—&B¡BòóéÓ'?§Œ•2ÆØ©AŸ0ù!À€_ñŽ™óf/ÄÕ6SŸ•ø“èO'{ìêÑcþ7ë–©páDÁ*G¯ž (P¡B…:*T(L˜ aòÓgCˆ”~ÁpáÂ… .\¸xáÂ… .^¼x±ÃÊ•+W´\¹’åJ–+W®\Ér%K–,Y²dÉråÊ•+Y®\¹råÊ•+Y²\¹rEË•,W²\¹²Ã‹²PÞ@qUˆÏ0L¡Œ}2vŽÛ)?˜0•36lÅ’¡Ãž1LÜÎSŠþA§2 åí¦P~N…e̘±P}…2†)Û!@ L€"6c@ ñÌ•âÄéU)>|N}:uÊÛ§Q¡> zåNÑ:áêÅ2nÛ­[áÈq»uÊ;zòÊ+·íV)Q¥Záb«U+Y±8Ñ¡C `?{ì¾}ƒåÊ”)S¦¶mÛ¶M–­Y²fÍreŠ”(QŠ> ú (P B êT(bŸ@aòCèPˆjüúÃ… .\¸páÂ… .\¸páÂÅ +Z²dÉ’åJ–+W²\¹råÊ-Y²hÉråÊ•+W®d¹’åÊ•+W´\¹’%Ë•,W®\ÑbÅ‹&oÝ ðÓ S7PÆþN2Š˜±x‚ˆ©:e “”Ó營1A¡¼3ÆÍØ©SÈN2öÉX¨PÝ2… eÌ›1bĆ…Â$T!} Òt‚Ѐì…+UÊÖ7p°>Áâvj¨OŸ>}ú´ŽÝ?¥è±ƒEŽ\8pÛÌ‘»uk–-rìÖGî¸V¦nÅ ®X¢ZÑpN¢uõì±s%‹S©på¸mÛ¶íÖ6Y²`½zåÊ”(QŸD}úô (P B… êÔ©a @„ÉOŸ=B¢,† .\¸xáÂ… .^¸páÂ… /®\¹råJ–+Y®\¹råJ–+Y®\É’%Ë•+W®dþ¹’åÊ•+Y®dÉråÊ•+W®\¹²†2M¡Bñ)TT¡B˜ˆuCÅí·n˜@qÃÄ Õ°KæíD¿P~Nd,Ô§Sª¸…:uʘ±nݼ E¬›1L¡Œ…UÈ[(ÂN*ôiX&†uãÖª§Oà\:U(\7o£üðõ‰,;ÛØ±cÇŽ9rÛÀ‘ gêÛ¶mß¾GŽ.p¶nÙz…+V,Y­DµøJT SõÄÙú¤È•+S߸mÛ¶mÛ6[¶fÅšåÊ)Q¢D‰bô (P˜F… *Ô©P BB…I¡>ŽB„pdHÙ¯.\¸páÂ… .\¸pñþÂ… .\¼Ðr%Ë-Y®d¹r%‹–+W²hÙ‘%Ë•+W®d¹’劖+Y®d¹råÊ•+W²\¹¢ÅÊ/M¨L’ T7c…¸u3f̘1c~ºù9uêS7b¨q,ž{|0ûÄ''L¡ˆ uŽ[7cÜŒu3†éT(bĺóƒ©(?…d€$È1B ð³Ç W,q¤¾±ãÆÉ˜ O§üôéã-;Qè­#·Ž¹pà¶Ý*WΔ-Y²dmûFŽÝºußpÝÕªÔ·X¸Ä'KT Ÿê¹“E'»p¯lÙº%k›¬[Ù`ÁšõÊ©Q¢>}úô (P B õ)Tþ(TŸB…  &?}mÀ@)Ó1d^b¸páÂ… .\¸páÂ… .\¼pqåÊ•,W®\¹’åÊ•+W®\É’%K–,W®\¹’åJ–,W®\¹’åJ–+Y®\¹reÇ/` õùćÛ'b˜ˆ"ÆçÔ§S&B"fLÕ¹>…„ ®X?bÝø|úTh”±Q¡D2ÅÍ7n§¸"Ö ”1bÆ "ÖX¨S} *J&L (–ŽÞ6Y±d‰UjÔ©S¡>Š˜vŸþ¬7ŽÜ«m¶¶m»µí–)S³l}ûŽ;së^áº%êÖ+\¶®“÷”(W%Ñ#Nœ¹pþ²L‚ ¬m²lÉ’5Ë•«Q¢D‰ú4ê(L >  *P F  &L~ü8Êp€’¡L™†µˆáÂ… .\¸xáÂ… .^¸páâÅ-W®\ÉrEË•,W®\¹r%K–,W®\¹’劖+W®\¹’åÊ•+Y®\¹¢e‡—_~0*Å Ô)AÄy3ꓱS˜N2Ö­Û©q~@  Ù°a§>õùdÂÄ(F¨Nq:5JU8cÜŒ3FŒ[(b…ˆ … (bÆüøÙ0JP(ÂD0 ^ºm²¾‰b´í– SŸ@õ1†‰Ø§BßDÙ!ÇŽ9YÛ¶ wë,X¶¶þ…N¹uìp½º…+Ö«VÁ¹’E.,XÙýùFÏݸqßf‰rõ ¬[ÛnÝÊk–)R£D}ú4êÓ§O @}ê*P¨B  (L‚õ ƒ¡bêˆúÕÂ… .\¸páÂ… .\¸páÂ… +W®d¹’åJ–+W²\¹råÊ•+W²\¹råÊ•,Y²\¹råÊ•+W®\¹re_™>ñtî” L܈"v Ô)T ŒùñÖ·S‚@ù€€0uöˆõሟB&NtêÖ¨[Û¸ µ Ô§BŸ@+D T(PÄN :!” LŸ† ``€:{¯dý¹þHÔ(N‚0}tŠÐ§>™qúC¯»qõÂÝ î–©[ãÖ±cGN\8r䨽Šu 8€œ½"5KÜ·X³H¹*±h;ví\‰ej¬[·NmÛ&K–+S¤>•õ (P @aúêS¨O @¡ Ô§O˜0*4CCaÇŽq+ô«F .\¸páÂ… .^¸páÂ… /®\¹råÊ•+W²\¹råÊ•+W²\¹råÊ•,Y²\¹råÊ•+W®\¹rEË`š@¡ôéT(c§ŒñÊ1?ÆB2ªÐ'b¨8a6ƒdêÐu+ÄèÓ'>ŸFq;%è·@¨NÉ;*þ¨O˜Naêv*T!P >u+ÔÇ ?§2 + @@€nýN)š£çϧ@|Pq;EÌO¡B…@Éâ#ª»zòÄÙÚFÖ­[æÂÉcGŽ\8Y¶ÈÝú†KÀV±Zâ$KÖºo°`¹RÄ'P¸qî¶ÕÊÕ+X°¶Ýºu+Û,S¦F‰Bõé(TŸB…Â*(L¡BúôéS¡OŸ>a"ägC†Ã’©ó懦.\¸páÂ… .\¸páâ… .\¼ÐråÊ•,W®\É’åÊ•+W®\¹råÊ•+W²dÉ’åÊ•+W®\¹rå eÃaÂ$ÃÏ)c˜Ny;ÉÛ§B§@꓌þO§NaÂÔ§€ÅÔ©K'Ð ?}NŇ NªN:¥êÔ§SœB}:Å­(P…0’!ƒÄ)"Ndša €ÇÒ™¢Ã§ÕŸOŠ)âc¢7b¡aj%Š\=rì¾ÙÚ+Ü­pÛØ…ÛŽ»o¯À±{% )R±^³e —¨o¶¾Å2%jÑE䲑rõÊ•©W°nÝÚ¶m,X¦F}õ (P 0  T¨P¡@}õéÓ'TŸ0aÂägƉ Š%KF¯žL5bÄpáÂ… .\¼páÂ… .\¸xaåÊ•,W®\¹’%Ë•,V®d¹råÊ•+W²dÉ’%K–+Wþ²\ɢŊ/À2… %U(cÆd3†‰˜·a§üÂÔçÓ)n·0ùñCCĆ’%K殟Bz@:Uˆ¨OªBmSUŠÛ­m¡Naúô©ŒQ dô %È>~¢1C€ˆÙó£­EŸ\}š…j”©S¡>… %Ê•½vâÖÉÚ¶íÕ¶pìÌÉ 'oœ­päÀ½rœ¨V¯lµG—8\ë\‰"eK”"E‰š•m–©Y°nmÛ¶mÛ­S³L‰úôIÐ'L˜0a• Ô§O˜>a (TŸ>]új˜¡ S—®Ûž>24µˆáÂ… .\¸páÂ… .\¸þpáâ…–+Z²dÉ’åJ–+W²\¹råJ–+W®\Ñr%K–+W²\¹r%Ë/ņ+TH„A Œa¢ÏX·O~BùéÆMP7n§ ÅíX&S—®›ž>zöœÈFlÔ§SÜ²Ý uÊ\·QŸ*DŒ±B†dctH1‚Nx›AcKgB(E¢Dej£nŸNû$È•,{äı 'œ©mäèÉ“gŽ»uãd‘(ê8\¶Lájë–8[­Èá²Eª•+Q²ÝIä Ö¬S°dÝÚ¶í–±m³LúÄè£B‚ *T&L˜aôéÓ§OŸ>} eþ T1B8&L]:@…øÌ@ö+F‹.b¸páÂ…‹.\¼páâ…‹W²dÑ’%Ë•+W®\¹råÊ•+W´\É’åJ–+W´\¹’ÅŠ¿høêÓ'P¡ …u Ô(n‚øøá3 Ó'nŸ}Rå-T·C Hö+]:@…ôÈ ÖHЧBŸ¸27Žž9nÙNëjT7o@0dh1…>aê3ƒR‚8Ö-Ô(EáN™ÚhÔ§O|ôø ¸Xöê…ûܶR¶Â±3'\8pßd4Eê–8påZu*GJ.y¸Záj%*‘¢[¸H‘Jt'P+S§neÛ¶Ûþ¶m§`ň£B…ü"Tˆ B… }bôé¨O >¡:jX¨a@ˆÆ°n£@}*”i!e¿Œ´ˆÃ… .\¸páÂ… /¬d¹²#Ë•+W®\Ñr%K–+W®\¹råJ–,W®\¹r劕À„aúD¬1b£1âv T!PÙ>}útŠ7T˜0…òvª›°b @ˆÆ°n£}bÄH˜PŒ²*ä甹nÜŒ…ë–X!P2N“á§O!G†úuHÃŒ!  n·QÛ¸e˦¨ O‚FaúD¬1Q¢äÕûfJÖ6[¦dÙ*ÎÜ6[¦Šej9vþì^‰*NT©uën•*u'ÐN¸d‘Š¥(ÑE¯`ÁÊkÛ¶m·`õIQ¡B„úìÙÓGÏž>‚ *TèS¡OŸP…:5,T(a  @2B㺧ЌO™2ûõËŒ1\ÄpáÂE 1\¼ðråÊ•+W®\¹reÇ•+W®\¹²CË/VvxÙÁ†/À”"–بP@(j£@1:õé” b£0âÖ-T(a™@A1Bãºë¦§ C  *$”7zæ¸â†IP¨O2Dø9`É>4 ÍØ°aá n 0@]:P¡>ûŠ˜ S ˆþ"–بP‘bGΕ,pÛLÙš\¹[MÍ‚EJ©pòäu*«§X¸ZqÊ“¨®X·nµ*%ªS§GyZ™ÊvjÛ­S·N½õI‘ =|úìñ §Ž‰:{ôôTˆ¦O¡@} *Ô±>`ÀÀ†x„ˆê˜!bÇŽ 3¤é:tÉ€©Ñ"F‹-b¸ˆÆ0vðØcÇŽ;vìØ±c ^¼ü¦,Y²_ÂfÌ(ª(3dB0ãÆ 2dÈD,7PÜBaú*Ô1 `À€ˆxšˆ ª›!bÙº3d¨ºnèÒ…2Öí(c˜üøÙþ bCC‡9b1ÃP‚ @`ƒºt @#FŒX6P NÈ(Ѝ'ø(ú#ޏpëÀÁÚ+\9€ãL“EŠÔ+pâÄûSêÖŸ@à:Åj… ®u·pÝj%*Q§Nœqj ,X°n™*%ê“"Azö8šááˆôôéÓÇO!C…@a *“‰C `ƒa¿ëVìX¡LdšÑ‡ aè’©«‘ìW°dË”y±£FŒ`¿–%óRF 6b؈a#†²eÊ€ý¦¬X¦b3N(˜aÈQŸ f€r„@C >ô)Ô§O!P B *“Bþ€_¿Œ ëFìØ¡F,f8šÑG„#a莡“1 Ô°cñBÍPP@AB5Š)›±!A‚  €€0uÂ0EŒ¨b'f˜a¨£ fÐIT•=r²^ÙZgë@váZ±«)[±^‰Kè§W¸Ê‘“WW,\·pkuË–)Q%JÔªÕ+S°L™*5ª“¢Ezf̘!„{úô‘ÑÇP!C…>a2 “Œ @@4jÈÈä­Ð† 0 À€0 @€ @ @€ @€uÈâ- ‚†ˆ6l˜!bÃŒþ 6lØ0ƒÀ4 šÑç1b…@*DL“ @€4ÑÈÔÍІ 0 À€0P€€€  €@@€À!uÇÒi Bω6l˜ÁbÃŒ 6l°C‡ÃŸvõ¾Åúf  ¨WìÊ™z%ŠS ?þ$ê„«T'S¸Î…wë•-[侑[·mÛ¶Y¥Zuz”§“(R¦Z‘"Uª£E‹> BähOd̠ѧ¡>}NÈè#CÆ  @€4”yK&l˜0 €€‚@€ @þ €` uɆiq@ÃCÃ6:ÄÂPˆ P*VÌÐ6Ì !ƒÆ!"6œ!BĆ @€3”%;jØ/ €‚ @ @ @ uɆiq@ÇCÂ6:4ãP+«Ó";±êÅŠ0–­uä^)RÄI”¨RœDuº%W«R·Ê•+WîÖ¬pàÈ}#ÇŽ\8Y°f‘*Õ©S§N¥H•%JT'N‹É‘ƒA9 <œ˜ñA†† 8hÐP À 0 @6Š©þCw,Þ°bÇ’ +¦î˜°a„6À€ 0( @€°LÅâÅCÝ `€@(0€@80à@€ (`@€0@@6Š©Kv,Þ0cÇ’ +¦®˜0aÂ~6À€` (@ €°LÅÒÅKÝ`€À €œ8\‹á˼o¶DÙ¹#ê¬qäpẠ®Nn‘+WΜ¹pá¶“E޹mÙ`ÁjÕ©S§NJuê$ªS§OŠþB :*d(S#P£ P°ÁÄ…6l8FH˜²dêÔ©K/™±a莩‹×mØ/aÅŠ*vLØ1C,@ @, TLÙ°cÅŠ ¦NºxèâñK¯›»tÝú  €€ @€Ð8–,žºxñ2m AĆ˜6ˆ8FHX±dêÔ©‹Ï²aèŽÅSçm˜0aÅŽ*V¬˜2C3@ @l TLÙ°cÅŠý¦NŸºxèâñK¯›»tÇú €€€8qßZTÔI®z¢Rt‹Ü­WáÄÙŠÕªT'\­Zá*Îþ=yÛl¹’5k»pß¶É‚eŠT§NZµêTªS§N>1Õ¨Ñ"@‹2” T&aÃB3f,^a @ÆF…<èá`‚ƒžpŒˆeÔGØ,„ÓO_?bÃŒ 3f̪cÞ¼3f,²sèâ£gì @ÆFŒ<èé`‚ƒžpfeÔGØ,„ÓO_?€à¢%K–¨N‰HhpµÎ¹uߨÁºEŠT¬X­Zå ĩԭråÌ3õê¸W·nn›­[­ZµêÔ©S+Q¢:u5ʲa¡B… … U¨PªŒ3vʘ1o纥;ÕÍœ*nðâÉ;g •1bðÌ}:egÔ¨O§øˆÄÇÔS´²ekèÄ¢F£15jœ©lŒé9ÑÇÄJ²eÓ6ËÔ8E€²Íb$à 6‹/^ºa¡ˆ…Re kÕ1TÞ¼y3êœ1oÞŒ™#vΛ*nðèÁ;gì“1bðÌ}:ÅÕ¨O£øŒÄÇS³²Íj´è„"F£þ45jÜ©lŠé9ÑçÄžQ²iûæÊÔ8E‚²™ú$C† 6‹/@tÃ;xcrysden-1.6.2/images/down1.gif0000644000175000017500000000017411712736221015043 0ustar tonetoneGIF87añÿÿÏ0ÿÿÿ,U„©Ëí8¢œãA³ÖŒ­A| &’æ™v+ØZï?s8º'š+T´ˆ(— S<ž|ÊŒˆ³¸±P†Wm\…TÕ4+£uI‡Õ“œx¡ȵû ';xcrysden-1.6.2/images/first.gif0000644000175000017500000000031311712736221015135 0ustar tonetoneGIF87a!!òøüøøøüÈ0øü,!!˜ºÜþ0ʹ„¥‚6QDÖ§)œYæ ¢C ¡ºÆî§#[߸¦3/^CSQÈ$Òñ“¶¨Ö"ўЩt¨Ã*¿M«G`›Ã3”ðü­¦Ùpn<îžÓ7!;¸ è•|&~h?ƒ„-‡z‰ ‹,‘’“Ž€2hn™šHœ E ‡¡'£¤¨ª–¦žŽ®’²2· ;xcrysden-1.6.2/images/dotH.bmp0000644000175000017500000000013311712736221014715 0ustar tonetone#define dotH_width 6 #define dotH_height 1 static unsigned char dotH_bits[] = { 0x07, }; xcrysden-1.6.2/images/unmap.gif0000644000175000017500000000115211712736221015130 0ustar tonetoneGIF89aöi··½××ÈëëÐêêÎëëÎööÓììÊõõÒëëÉøøÖÖÖ¿99=ÒÒÆ””±ll nn¤ll£QP—ih¯SS™gg¬VV›‡‡¶EE=ññÏGG›q{zgi¹=\_¬ITV¢ AXXOÝÞÑxx˜22k::u77t77uÁòKK9¶¸¥UUD¬®›KK?NNP¾½ÁÅÆ¾ÉɼÊ̼¬­®ÆÈÉ®¯±ÃÅÆ±±´ÆÈÈ;;:²±±âåäÿÿÿæéæ666µ´µÛÝÛüüüôøôõùõó÷óÞáÞ777´³´ÝßÝ÷û÷øüøöúöàãà³²³·¶·äæäåéå444¨¨®½¾ÃÎÎÔÊÌÐÉËÏÌÌÒÈÊÎDDK<<773344434411A@$$}~|!ùj,Ç€  !"#$%&'(()*+,-./0123444456789:;<=>>>>>>>>>>?@ABCDEEEEEEFCGHIJ>KLLLLLLM>NHIJ>KLLLLLLM>NH€OBCDEEEEEEFCGHPQ>>>>>>>>>>RSTUVWWWWWWWXYZ[\]^_``````abcdeffffffffffghi;xcrysden-1.6.2/images/dot1x3V.bmp0000644000175000017500000000015711712736221015275 0ustar tonetone#define dot1x3V_width 1 #define dot1x3V_height 3 static unsigned char dot1x3V_bits[] = { 0x01, 0x00, 0x00}; xcrysden-1.6.2/images/dm_flat.gif0000644000175000017500000000251511712736221015422 0ustar tonetoneGIF89aöB   $$))**1111 884499AABB JJGGEEIIPP SSZZddeejjjj||ss{{‚‚ŒŒ‹‹‘‘’’››šš¤¤­­««³³³³ººÇÇÌÌÂÂÌÌËËÖÖÓÓÚÚÚÚÓÓ!××9ÜÜ;êê ââèèëëððããUõõQééiùùœþþ¨ÿÿ´ÿÿ»!ù!þCreator::XCRSYDEN-0.x ,þ€€ !'--) '---**////*) '-))**-0310/3/)*)*****0330:93/ ******þ€***0308;::3/ *-)**)**)*//09::::3*;*))**''''1.<=7::91- :)))*&$$''/4?A=:830/*4)*))$$%)+>B€?<2333/!44)))% "$&5@>4.38380*;)))*" #<6./413030-:)%')&****'')'" 3-%''" $'*''''þ€$(0%''%" %')''$:''$  "$)'" :'$")'  €%%  %%  '%   “€  €;xcrysden-1.6.2/images/ballsticks2_2d.gif0000644000175000017500000000674111712736221016623 0ustar tonetoneGIF89a11÷³    ! ""**44>>"$&($2%)$$+*66;;!*-%.1%25)36+9M0=A>A?DBBII CDQQ``ll fgttyynp4AE9INQeku~@@XVXX]e*jkwr~~dk DDJGHOAVlI\bNbiQem]`hTipYovZpw]v}UoŠ\yœb{ƒeˆn‰sv€t‚†#‡†ŽŽ”•›š¡¡©¨´´¼»¥§­¯°±À¿ÃÃÔÔÜÜÖÖääëëõõýýëî#ÐÓ"ðóg‚‹iƒŒlˆŽn‹•r˜z†’v•Ÿy—¢z™¤aÕÝuÑÛlÛä„‹“›¢®²¼¼¢E£[„„ˆ‡ŒŒ‘‘¡¡ª£¬¬±±¸¸¨¯/…–[ÉÂÊÊÓÓååììáÿññýýÖãL„‘œ€ «†¨³‰«¶‹®¹Ž±¾•§´ª¶˜§´¶Â‘µÂ”ºÇ–½Ê™¿Ì«¼Ë›ÂÏžÅÓ¤ÇÖ¡É×£ÌÚªÅÓ¦ÐÞ©Ôâ¬Øç®Ùè°Ûç´áñµêù!ù!þCreator::XCRSYDEN-0.x ,11þþ€8p  l9S €þèÑ“ÈrÆÌ™ €8üôñãçpÅŒ4øôñþãÇ?7 ÀE1\øøñãÇ?p@^ÖXÀáÇ?~úüÉ`@QX’°§?~üøù“Àž„Â0 O?~úøñÃç ”¼yþÀ€~þüùÃÇž €td¹r劓 làÀa£Æ?€M@ Ãàè¼B¥j•ªV«$ ð¢”ÈH“}è€@ftZµjÕªUª\™0`€˜òhŠ¥J–&Y²„ˆ€³jÕªU«T¹jSàˆþI•&Uš4É’¡…z4‰Eg“«U«V©z¥K•*UªT©Ò¤E, r¢éI'W«V©j…*I€’*UªT©Ò$KŠ|B¡¡@T«T©r°Ô§%tXšTiÒ¤J•,1êÞ¸zåJ•Q±˜¬@|˜4i’¥J•&Y:€D(rÄ 4RÙ!C€þÄÒ¤H‘&Y‚ä ù¢å   C‘EŠä €`áÊ4hb@;, €˜3fÌœ(<4ºô)Ìœ9SFèpĤþ¨(ãB0@J BH8bâ $ £JÔ(Rm0(ÀÆ*W­\¹Ê4þ@@€@ªU«V­Z媀 *T«V­ZµÊ•À,Y¬¸¨Ð%œN¥Z­Zµ ¬$€fМ ƒ%©Yš4µZµjU+T4bʘ9#¦ŠL#> Õ ÕªU§N%þ°@c "!Š”+W¨4¡*õI€pÁÌ–àA9f˜áé…I,W´p¹À€dÌœ9sFþÀ8cæ  ˆÆŒ™1) F™2-€®€;xcrysden-1.6.2/images/rotYZ1.gif0000644000175000017500000000440511712736221015164 0ustar tonetoneGIF89a÷ü  & 1 !); 2$-$(2249359>; 2 ?1$"-) ">%(>,_*K$C+O%I)P)i-i 5v6t?{9{"%D$'H&)F&*L+-G),M,/Q).R"*Q-0O.1U!;Z15V26Z59]8<_7:a9=b:>fA~;B^)Ag#Fw<@f>Bj2Mz1TMS.nov|~g-Ug]-_BEn@CkDHqHLvIMzLQ~`Oa`cvG„C‚I† Fƒ G„!I…$M‹-C‡/EŠ(OŠ!G”'P‹)R+TŽ+T-V‘)U—.X’.Z•.\—.[š5N™3U‡1VŽ3Y†3Z‡4Zˆ1]–0[•2^˜2_œ4a›7ež6cœ8fŸ9g :i¢>n¦; 2 ?1$"-) ">%(>,_*K$C+O%I)P)i-i 5v6t?{9{"%D$'H&)F&*L+-G),M,/Q).R"*Q-0O.1U!;Z15V26Z59]8<_7:a9=b:>fA~;B^)Ag#Fw<@f>Bj2Mz1TMS.nov|~g-Ug]-_BEn@CkDHqHLvIMzLQ~`Oa`cvG„C‚I† Fƒ G„!I…$M‹-C‡/EŠ(OŠ!G”'P‹)R+TŽ+T-V‘)U—.X’.Z•.\—.[š5N™3U‡1VŽ3Y†3Z‡4Zˆ1]–0[•2^˜2_œ4a›7ež6cœ8fŸ9g :i¢>n¦\~)Kr)X8Hp?Lt8Ox4V|8Rz:Pxdm(f8U{=ODTWQUXVVXXXXZ]_CEmEGnAIrILvINxPJl]€]‰_Ž^W“a†bˆbcˆf—e’f’&Xˆ'Z‰&_Š)Z„1Y‚9S€?Wƒ&b‰&cŠ+bŠ)e˜-i•%p5{­Bvž^v©[x«_|°lw¥IеW…¨_•»a†°k’±¡ºw¦Ç Æ• …#”!´ »½”5A´B(…beŠz}ÆÈÈÕØÚÓÚÛÜ Ð-Ã9;Ý)*ääæèïøýá;ÿBõXê{ß\^Ý\dåxdöšý ÿ·ÿéÿÿÿÿÿÿgŒ‹¨™–­¶—–£¤±¯®µ¿ª­“ŽÍ•ŽÎ–Е’Ó–‘Ò™“Óš“Õ™”Ó˜”Õš”Õœ’Ñœ”×›—ÚŸ–Ø›˜Ò›™Ô™Ôž›ÙŽªËŽ¶Ò’¯Ã¤”× Ô¡ŸÕ¥›Ý¨˜Ü­©Ä¤ Õ¤¡×£ Ú§£Û¨¤Ù¨¥Ûª¥Û®¥Ø¬§ß«¨Û¬©Û­ªÝ¯¬Ü¦¼Í ¸Ò°­Ü²¯Þ³°Ý´±Ü¶´Ý·µß¸µÞº·ß¯«â²¯ã¶³á¶°å»·ã»¸á¼¹á¾»ä¿¼ã¦ÆÛ¿ÈϰÄÛ¿ÍÚ¾Öç÷„„ºåÀ½åÁ¿äÅ¾çÆÆÅÃÁäÅÃåÇÅåÇÃïÉÇåÊÃéÊÈçÍËéÎÌêÇÄñÂÐäÑËéÑÏìÑÑïÒÐíÕÓìÕÒîÖÔíÔÞêÙ×îÜØî×ÕúÝÜðÛÙûÕçóàßòáßôââÞääââáõãâôæåÿåêóèçôïïøíìÿòñü÷öÿõÿÿúúþþýÿÿÿÿ!ùû,‡    &'&,)*/-+--,////0021D9U&2L0>\~)Kr)X8Hp?Lt8Ox4V|8Rz:Pxdm(f8U{=ODTWQUXVVXXXXZ]_CEmEGnAIrILvINxPJl]€]‰_Ž^W“a†bˆbcˆf—e’f’&Xˆ'Z‰&_Š)Z„1Y‚9S€?Wƒ&b‰&cŠ+bŠ)e˜-i•%p5{­Bvž^v©[x«_|°lw¥IеW…¨_•»a†°k’±¡ºw¦Ç Æ• …#”!´ »½”5A´B(…beŠz}ÆÈÈÕØÚÓÚÛÜ Ð-Ã9;Ý)*ääæèïøýá;ÿBõXê{ß\^Ý\dåxdöšý ÿ·ÿéÿÿÿÿÿÿgŒ‹¨™–­¶—–£¤±¯®µ¿ª­“ŽÍ•ŽÎ–Е’Ó–‘Ò™“Óš“Õ™”Ó˜”Õš”Õœ’Ñœ”×›—ÚŸ–Ø›˜Ò›™Ô™Ôž›ÙŽªËŽ¶Ò’¯Ã¤”× Ô¡ŸÕ¥›Ý¨˜Ü­©Ä¤ Õ¤¡×£ Ú§£Û¨¤Ù¨¥Ûª¥Û®¥Ø¬§ß«¨Û¬©Û­ªÝ¯¬Ü¦¼Í ¸Ò°­Ü²¯Þ³°Ý´±Ü¶´Ý·µß¸µÞº·ß¯«â²¯ã¶³á¶°å»·ã»¸á¼¹á¾»ä¿¼ã¦ÆÛ¿ÈϰÄÛ¿ÍÚ¾Öç÷„„ºåÀ½åÁ¿äÅ¾çÆÆÅÃÁäÅÃåÇÅåÇÃïÉÇåÊÃéÊÈçÍËéÎÌêÇÄñÂÐäÑËéÑÏìÑÑïÒÐíÕÓìÕÒîÖÔíÔÞêÙ×îÜØî×ÕúÝÜðÛÙûÕçóàßòáßôââÞääââáõãâôæåÿåêóèçôïïøíìÿòñü÷öÿõÿÿúúþþýÿÿÿÿþ÷íÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíó`ß> ?hÔHÂDJ+Ÿf%;–bß¾}ûöíÛ·ï—} `¼‚dI”)W<þS–îž>v*öík°Å EtF\ â¡‹T°t¢…lÛ8€ñðéÓ×Î…ekÞ°3'":¸hÅì™5náÊ­“7O4öxc&Ž4>‚€Ø˜­]ͦewî]=}öQàÓ…Ì9uð|ÉÁAH&V±p ‹ví9uùíÛG¡O™6jÐü d‚‡†&£D­ª¥«Ø4làÜÙ›°oŸB‚ù¹#Œ FYÚt Ö-aѪu£‡hß¾} HlÑâž =d8ÕhR(U²r“æ ^„}ûöíÛ·o_©<%vÜ(²¨£GšL½ºÅË:CûöíÛ·oß¾}a²ÌPþ¢ã ©H‘"]BåÊW0jæ ìÛ·oß¾}ûöíÛ·ÏÂG˜ I‚D‰Sª^¿´Ú·oß¾}ûöíÛ·oß¾}û(P @ (`ß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾}ûöíÛ·oß¾€;xcrysden-1.6.2/images/bz.gif0000644000175000017500000000451711712736221014433 0ustar tonetoneGIF89a%%÷ï    %%..$$..33;; 22 ;;))55 $%%"//)!!+++"77'>>5555==:77;;;DDJJ CCKKTT RR [[NNUU[[[[ddkk ll ss yycckkhhttyyss||=]]%ii+ee'{{6ll9dd1rr`’ €€0²¸±S£‹–àô°tÐ W/ Ò‚<Ðg¡Aƒúhi±£>€ÚÄ#‡X;W °’‚K€ÊÕ7mÚÀé3hЙ+éjqfŽ›?pà|É-]­eRNÙ¦aþÑFK-\àÌis¥‘¶43f´Ôœ9‚8±÷íܵv©àÖ)'Î̈#?„üX“UEK@ˆúÌñsˆ@gßîD¢` µ| ¦@.1`À€&RÞùù¢8\´p©CŽ’G@™6'î†P£Œ[úhz6.©@‚ ýdC„»¹ Q© € Ó2à$›4 PÌ 1£·qÊ6}ªÖ Ò‹.†¸¤€ÀÝ¢L`Ú‚ðrr­B˜ª…‹UL+d`]Óõ¡.!vÑ1B+*LãjœP£2.þ\0:$L̰ac 5É´ ã´çR6²X ’*Èià0M_ç”t&†„1fØ ÁåK$fÞJuûÕÂÆ 8´’ë¤%Àk 8g¸”aÄŒ,\ÜÀ ã 'qáu3hP ZùZ@iÔ‚†%‹™,Y¸Ì‘" 8pÜœ¹SŒ› .m âlKÐë€(æfˆ°qF .ZRÌpÓ¦M—,`€y›Ã˜9qHЋ|5@E\ŒZº´iÓ¦Mgºh±ãÅ$rkJ¤ ÑÅT\•m¯¦‰ÓQB þ0mÜpÑ2†–.3P„P„®G‰1lpyPÁW€‹Ê©m7r iÓ —+Z´ØH‘¥K 7Òõ(ÂDŠ\ ðb…MÁnºh±aC‹-6LØ8‚Ǻ%DHˆà‡/€ ÛÖY0ÀŒ–1lhÑP‹–`ŒØÉàÅ@uRÁe 3fذC ¶ €%¹ðš´Z¤ BŠ(b¤x È;iTŠp°0- ²ÍÕ…þ ЀÃÄB|¡KÕŠµuÛRØÚ6e.(9Ò +|èEФMÀjïX! H®iT€%ØxñzwKÊ)AnI£¢@‚SÓ¨I“–Í—/) @À ‚I€€;xcrysden-1.6.2/images/center_nice.gif0000644000175000017500000000444311712736221016274 0ustar tonetoneGIF89a÷  $ !%%&+++-8;444;>?59;8*'4=AB6HN1¡ ¥£­ª» ³³¹¹«(­1 µ#¾!¾)¶& ¹2±;¶<£=&´=%ƒC.…F6–L4ºA¿H%‰_S—OF‰dYŒj{Šzu–sh“yš{u«[B­iU¶gO¾nT¶r]¡se°le¯xpÅÃÎÀÒ ÞÆ!Ç-Ê#Ê-Â4 Ê0Õ&Õ)Û"Û*àí&ì,å)õ-ÃDÒGÆO*ÉX5×{_Ù~c‚{”’~ˆ‰‚dv”††œw®‡z²‚s¾ßÔ„kÿÿÿÿÿÿ ÿÿÿÿ(ÿÿ2üÿ=ÝïZÒênáîOåöOÿÿHÿÿPõÿf‚„…ŒŠ‰‚’‡“–š‡—›š…ˆ›“‘Š›¦’±”—µŒŽ¢©‹«´‘¦®“«´š³»ªœŽ¥›¥™•´™²ž—«£ƒ¥ –°¤„¼±—©«¨´¹·˜»ÇŒ¹Ç¨½Â»¿Â–·²Éˆ¾Ñ¤Ç¼³Ä²­ÄÌ¥ÀȵÂõÆË¼ÉDZÖáÍ›À°«×æÒá¿ÿÿ€õÿšèô‡ùþ§ÿÿ´ÂÌÈÀÍÐÄרÏÝáÑæìÜèìÛîóÉãéèòõóÿÿÿÿÿùÿÿ!ù,‡  $ !%%&+++-8;444;>?59;8*'4=AB6HN1¡ ¥£­ª» ³³¹¹«(­1 µ#¾!¾)¶& ¹2±;¶<£=&´=%ƒC.…F6–L4ºA¿H%‰_S—OF‰dYŒj{Šzu–sh“yš{u«[B­iU¶gO¾nT¶r]¡se°le¯xpÅÃÎÀÒ ÞÆ!Ç-Ê#Ê-Â4 Ê0Õ&Õ)Û"Û*àí&ì,å)õ-ÃDÒGÆO*ÉX5×{_Ù~c‚{”’~ˆ‰‚dv”††œw®‡z²‚s¾ßÔ„kÿÿÿÿÿÿ ÿÿÿÿ(ÿÿ2üÿ=ÝïZÒênáîOåöOÿÿHÿÿPõÿf‚„…ŒŠ‰‚’‡“–š‡—›š…ˆ›“‘Š›¦’±”—µŒŽ¢©‹«´‘¦®“«´š³»ªœŽ¥›¥™•´™²ž—«£ƒ¥ –°¤„¼±—©«¨´¹·˜»ÇŒ¹Ç¨½Â»¿Â–·²Éˆ¾Ñ¤Ç¼³Ä²­ÄÌ¥ÀȵÂõÆË¼ÉDZÖáÍ›À°«×æÒá¿ÿÿ€õÿšèô‡ùþ§ÿÿ´ÂÌÈÀÍÐÄרÏÝáÑæìÜèìÛîóÉãéèòõóÿÿÿÿÿùÿÿþ ¨x0¨`¡â„ ,7¨±S±®P (xÁLÊ1T§disrCf³"hB!,D*vÛ*Z,X˜D†N¢!ÄØff„6-ˆ`Ù1Í¥5(Ve#GΚ g,jŒM)t*h±ÃR'N%\Å«E‹­YïÚ1)ñèœRè²M.)»5‹-ZµhÍšukÙ%PpŠ5€b€8eB3C.wô¶QÓf°#ä<D „P"ÑlF‡ªHHH ¥L(BÔÜ™ò¥”Ü@´&Š?|9Ö°¡Ô#Ù’?”¶þ Ásn^*5(PÓ…|þüÁâªÎ¸_¶Äàô©/€³ÄÍ!õ"‹g^‚øó§/›:Vfð†dË›8(zÍ’çÂŒ7`9’æÏ:bºéðPC1TôX@7Ë«,É@@µáœ?ÒÒò—Æ•8xèc”æ­YتDqðà”oþüI“´È_¿ q ¥Øõ«¤hµfYËÅŠWޤùó·‹uHØÔIÑ¡8=d¶ÍÊÅ* 3,šUùñϾ”0¬áƒnŸ,u(™h7 ^ 3Þ,p‚ Î=þ‚uÑô†Š?Üê„ztìÖ¬psF½@H"4Nüõ þ‚擜<Šåa R]òE*¤I,‘€vdMA#¸x’te,jL ó%Ùô(¥:èþá;'MÀsøüác¦’%#À³ ¢ä4ñçÏŸ?þüùó×É&Q ¸Áàt¡$‰½þüùóǯ\Jš@|ر7„Å)elЦ2rtš6H4mÀ3·#ÌT;S ]bO Ùé¢%K.tL!)FÀ "[Ь€°hOº 8BÁÛ3cR ÑxqÄZ¹Âê@°#À8pP°‚´€;xcrysden-1.6.2/images/dm_stereo.gif0000644000175000017500000000221411712736221015771 0ustar tonetoneGIF89a÷Ž ""%%&&((++..112266778899::;;<<>>??@@AABBDDEEFFFFHHIIJJMMNNOOPPQQRRSSUUVVYY[[__``aaccddffiikkllmmqqssttyyzz{{{{||~~‚‚ƒƒ„„‡‡‡‡ˆˆŽŽŽŽ‘‘’’””————˜˜™™ššššŸŸ¥¥¨¨¬¬°°±±²²³³µµ¶¶··¸¸¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÐÐÕÕ××ÜÜßßßßòò!ù!þCreated with The GIMP,þH° Áƒ*\Ȱ¡ÃƒD!Râ¡Â{ìB”ÂâÁ r¬hX!èÊGô9 š+PÐ 8X8ÔøDfsæÄéb ) d‚°åH#*9z´@€R@€n~ü±rdŒ™b4™!(‘—z’œô(€D™' ¶(Zƒ§Š™ Ø$êØ ‡I=XàÀÄ 1ÆD@6EX,€¶˜aôE`X S#³XL ƒ‹ZÞÊB#”ÚÄ1Æ¢CPôX¡úPÀ]Ž]pãŒ#w" "ÆC!sÄHa¢Áb‡˜Q*RáÀ€rÞü9‚2Ÿ%†É‚áƒ$ PZxS&-u|až>Åp$…X6Sà‚J|gYGÜ!E`Îd‚ t(bA;xcrysden-1.6.2/images/wait.xbm0000644000175000017500000000150111712736221014773 0ustar tonetone#define wait_width 30 #define wait_height 30 static unsigned char wait_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x1f, 0x02, 0x00, 0x00, 0x10, 0xfe, 0xff, 0xff, 0x1f, 0x74, 0x00, 0x80, 0x0b, 0xd4, 0x00, 0xc0, 0x0a, 0xd4, 0x60, 0xc1, 0x0a, 0xd4, 0xb0, 0xc2, 0x0a, 0x94, 0x79, 0x65, 0x0a, 0x94, 0xef, 0x7a, 0x0a, 0x14, 0x5f, 0x34, 0x0a, 0x14, 0x76, 0x1d, 0x0a, 0x14, 0x18, 0x07, 0x0a, 0x14, 0xf0, 0x03, 0x0a, 0x14, 0x18, 0x06, 0x0a, 0x14, 0x18, 0x06, 0x0a, 0x14, 0xf0, 0x03, 0x0a, 0x14, 0xf8, 0x07, 0x0a, 0x14, 0xce, 0x1c, 0x0a, 0x14, 0x87, 0x38, 0x0a, 0x94, 0x41, 0x60, 0x0a, 0x94, 0xb1, 0x62, 0x0a, 0xd4, 0xd8, 0xc5, 0x0a, 0xd4, 0x2c, 0xc5, 0x0a, 0xd4, 0x77, 0xdb, 0x0a, 0xf4, 0xfe, 0xaa, 0x0b, 0xf4, 0xef, 0xbe, 0x0b, 0xfe, 0xff, 0xff, 0x1f, 0x02, 0x00, 0x00, 0x10, 0xfe, 0xff, 0xff, 0x1f}; xcrysden-1.6.2/images/wirecell.gif0000644000175000017500000000451711712736221015626 0ustar tonetoneGIF89a%%÷À   / - 6 ) ## ,,##++**330 0<<11###"/"*!****4444;4:;:CIT[e`mu7D7/j/%u%EEKKL LDDFFKKTTZZPPZZE/EM$ME5EK;Kaallj jssq qzzvvf)fk,kCCCFIFOCOLLLKQKRMRTTTTYTZZZC{Cd[dccceoekkkmqmrmrrrrw{w|||…Œ–› ‹ /–/:ƒ:,¦,"²"$¹$.¿.?©?9µ9%Â%+Ë+0Ú05ú5E”EW W~€~~§~|Ê|ƒƒ„ „ŠŠ’’š/š“0“•:•œ2œ©!©¹0¹‹I‹„Y„šIš‚h‚ˆoˆ„w„’q’®P®ªcª´~´ƒ„ƒˆ…ˆ‹Œ‹‘‹‘“““—˜—˜—˜›››‚«‚‹¬‹› ›”³”“º“ Œ ¢™¢½½¹•¹¢£¢§¨§­¥­«««®²®®¿®³¯³´´´³º³¼¼¼˜Ú˜®Ê®°Â°Æ‰ÆÃ•ÃÊ­ÊÇ·ÇŸÅθÎÞ¯ÞÒ°ÒÒ¼ÒÙ¿Ùãµãó¿óÃÃÃÅÉÅÌÄÌËËËÏÑÏÒÇÒÐÍÐØÄØÔÔÔÚÚÚÜáÜåÊåàÞàìÕìüÏüâãâêëêàûàôìôÿîÿóóó!ù!þCreator::XCRSYDEN-0.x ,%%þ°àI*E<|@‚ZíÚeéU-V–ž IôJ”ž:® AôáÃ!HDàÈ$N’†´ðG¯ ¡4íª)È… 3~Ј¤ ˆb©Êþ€@S¡(Q¢i‘Á…‹4 @²ôd€P¡ ^\¸A€À,y Ã<$"4ÀR!@A @ˆ!\„L0 ¤ d,8´j‚­)°€R+&­< …>À’!XB«Õª’é`È@£OBÔ¢À@PÁ•É€B9’X DZ-þ X!'*˜HQ‚Dñze«Ô£]‚À’€(K,¡5`–-(˜0À¸"¥jÔ«y…&€I”¬˜°€LŠ)´@h @Üài5€(¼B E<™2I6¾˜1Æ lÝàñâB†!´<ð„׫ÀH–x½R`B4g”`’!=\LˆãUаb4 ,ie+Ñ‘I»&…p¢ ˆÐR"e‹ 4´ ÀVbù¹°Áþ-^”P )\„:`©VU˜,(PÁÉVøÐŠ]ªvez2h€ 4vL@…-)–X‚bX±Â‰Z‘ˆ±*—Kžˆ°ƒF74 d )+µ˜@&Ñb€‡V^D¤ å¢! \ìØÑ£ÇŒ XáDKÓh¨À‡VN IM–O¨vôY€‹ 2Ðhq@*4@@ )45 ³è< ¸0áÀ- ô!MT@VWÍÂ1ÈÉþ&`‘¡€"Tˆò*B°`S`i ”W6D!T€d @ hT^¹p >d:ô*ú ú€L¢€ ® À)€'¼ju@#ƒ¨PpàøÀk D@"`€Æ&„˜PY:xm€œ@°‰Ô&d`A”D` ÇŽ/"`‰ X©Åhþ°ÄÊ8pÜÜùåŠÐ +‡8!Õ„P™ãæ)_¬<½Œ“€š`=€§nõêäe…¢L‡ŠÀ’WœŠ™TkS›1im*@@ZÀ€ÕšôiS¥)  „‡#Qž(A€€;xcrysden-1.6.2/images/pointlines_2d.gif0000644000175000017500000000674111712736221016572 0ustar tonetoneGIF89a11÷†  $$<<"$&),$$$..<; (+$-1)47+6:?@2?CNNHISS\\cckkqq}}5CG=BG;IM2CY=MRK]lvzCCMWUUZZMU'_g,baooutyyck(BOTCU[FXaK^eNbhNdxEu{VdkUksXovUpx\u}c|„e~ˆjyƒŠŠ––„…­­¼¼ÃÃËËÔÔÚÚååëëóóýýG„‹f€ˆi„Žk‡m‰’q—u“x—¡~¨‹•š ­´¾ÃÉŽŽ••‰’.¤¤§¨¨¨µ´¸¶¼¼ÁÁÕÕååììòòÿÿ¢­ˆ«·‘¶Â›ÂÏÅÒ ÈÖ¤ÍÛ¦ÐÞ©Ôâ¯Ûê²Þíµâò¸æö¼ëûÄõÿ!ù!þCreator::XCRSYDEN-0.x ,11þ þ@O¬X€€œX¡BÅ 4±R¥Ê+ $Hpb… +TДA#°ÄŠ+T Ð!þS&ÌÀ’(R”!S†Ì1@ (H€† ™2g\€Œ 10@Ì3eÀ°xAÀ0`Z ÓbÀ³þ0 … DP@‚1` X §Ð ä˜ð…>…Œ CŽ 3dX8Ø`â ?~øèqÀþ7qîÜ‘£@… 3t 9¢…‹@~ôÊ@2îСsGÎ 5jà¬éa‚~ú’%dÜ©cÇŽœ3,x`Ù°À< q‡;j@>ºœ€P!Î;s. @ì¸òAÄþŒ9l``À‰+VJi @”*T¨X)2Ü (VªT8ÅJä€ €¦X™2Å  ¡þx¨bÅ X$B„ˆÀàÈ@C–@ Yþ @/_úð@@=ƒò£€€'K…öøáC( €@€'V¬,@–/zíé³GЀ+V¨T±Ò„IFøaH A[þªP©BÅŠ @  Žt)X™B…J•( ò€`ÅŠ•)@HàÁƒ€O¢@2Åþ€”°R¥ŠŒ°B… +! Ä *VB „•*U¬ˆ€®€;xcrysden-1.6.2/images/xcrysden.xpm0000644000175000017500000002177011717503521015716 0ustar tonetone/* XPM */ static char * xcrysden_xpm[] = { "32 32 436 2", " c None", ". c #9494C1", "+ c #ABABDC", "@ c #B8B8E1", "# c #9393BF", "$ c #8989B5", "% c #A3A3D3", "& c #E2E2EC", "* c #B4B4E2", "= c #8080AA", "- c #6E6E96", "; c #8282AE", "> c #9393C5", ", c #9F9FCD", "' c #9090BC", ") c #8787AF", "! c #4B4B6E", "~ c #5A5A7F", "{ c #6F6F97", "] c #76769F", "^ c #6A6A93", "/ c #8381A5", "( c #4A4A6D", "_ c #2A2A4A", ": c #3C3C5B", "< c #3A3B5F", "[ c #5D4E35", "} c #796430", "| c #5D4E2C", "1 c #686682", "2 c #5E574E", "3 c #202141", "4 c #6C6C90", "5 c #524325", "6 c #725D2C", "7 c #565670", "8 c #696983", "9 c #6B6C84", "0 c #685935", "a c #493D20", "b c #626283", "c c #636587", "d c #5F5F83", "e c #8484A3", "f c #7F7F96", "g c #6B582A", "h c #737396", "i c #747497", "j c #8B8BB0", "k c #9494AE", "l c #51516A", "m c #4F4F69", "n c #6A6A81", "o c #6E6969", "p c #4F4C58", "q c #4B4C70", "r c #757177", "s c #60607E", "t c #4C4C69", "u c #9393B4", "v c #7F7F99", "w c #70708F", "x c #655533", "y c #706F91", "z c #676789", "A c #8080A4", "B c #A3A3B6", "C c #8686AC", "D c #4B4B62", "E c #3A3A51", "F c #4A4A63", "G c #51516D", "H c #4C4D66", "I c #2E2E41", "J c #59597A", "K c #2A2D4D", "L c #98834A", "M c #64647D", "N c #4D4D68", "O c #484862", "P c #636386", "Q c #585874", "R c #3B3B52", "S c #42425B", "T c #45455F", "U c #42425C", "V c #6E6E92", "W c #626281", "X c #4F4F6D", "Y c #5F5F81", "Z c #707093", "` c #484860", " . c #242437", ".. c #2D2D41", "+. c #656584", "@. c #9D9BB9", "#. c #3D3B51", "$. c #C7AC53", "%. c #71739B", "&. c #474761", "*. c #28283F", "=. c #40405A", "-. c #7F7FA6", ";. c #6B6B8E", ">. c #9292B5", ",. c #676786", "'. c #34344E", "). c #3A3A55", "!. c #4B4B68", "~. c #494965", "{. c #302E3A", "]. c #6A6A8C", "^. c #8A8AB4", "/. c #A3A3CE", "(. c #BCBCD1", "_. c #9E9DB8", ":. c #69636C", "<. c #AD9A59", "[. c #535370", "}. c #2C2D43", "|. c #222237", "1. c #9D9DCB", "2. c #9A9AC9", "3. c #BCBCE6", "4. c #C6C6E5", "5. c #B4B5DE", "6. c #7D7D9E", "7. c #666687", "8. c #3F3E58", "9. c #212036", "0. c #212139", "a. c #7C7CA4", "b. c #727298", "c. c #8C8CB6", "d. c #ACACCB", "e. c #9D9CC8", "f. c #86818F", "g. c #B1973B", "h. c #2A2006", "i. c #373646", "j. c #8888B3", "k. c #8787B2", "l. c #8383B0", "m. c #AAAAD4", "n. c #C2C2E5", "o. c #AAAADB", "p. c #40415F", "q. c #7B7266", "r. c #78799E", "s. c #545476", "t. c #68688E", "u. c #737399", "v. c #7E7EA4", "w. c #847B73", "x. c #796E65", "y. c #555679", "z. c #5E5F83", "A. c #535474", "B. c #9696C1", "C. c #6F6F96", "D. c #66668C", "E. c #7D7DA8", "F. c #8C8CBA", "G. c #8D8DB9", "H. c #52526E", "I. c #917D3C", "J. c #73632E", "K. c #73749D", "L. c #3A3A58", "M. c #353553", "N. c #9090BA", "O. c #ABA09E", "P. c #27273A", "Q. c #A4A4CC", "R. c #69698F", "S. c #3E3E5F", "T. c #505074", "U. c #616186", "V. c #5A5A7E", "W. c #3F3F58", "X. c #988541", "Y. c #776833", "Z. c #535374", "`. c #2E2E4A", " + c #ACACDF", ".+ c #B8B8ED", "++ c #CFD0FF", "@+ c #D6D6FD", "#+ c #C6C6F1", "$+ c #8D8DB5", "%+ c #2A2A3C", "&+ c #76769D", "*+ c #474769", "=+ c #252542", "-+ c #2B2B49", ";+ c #494963", ">+ c #9A8340", ",+ c #57587D", "'+ c #B0B0E5", ")+ c #9A9ACA", "!+ c #9F9FD3", "~+ c #DDDDFC", "{+ c #E4E4FF", "]+ c #CDCDFF", "^+ c #545474", "/+ c #4F4E68", "(+ c #222129", "_+ c #575776", ":+ c #4C4C6B", "<+ c #9191B4", "[+ c #87879C", "}+ c #9D8943", "|+ c #7E6E36", "1+ c #494968", "2+ c #9C9CCD", "3+ c #8080AC", "4+ c #8383B1", "5+ c #9B9BCE", "6+ c #AAAADF", "7+ c #AFAFE2", "8+ c #8788B7", "9+ c #6B6B94", "0+ c #484341", "a+ c #686780", "b+ c #5E5E7B", "c+ c #52526F", "d+ c #7979A0", "e+ c #8989A2", "f+ c #707091", "g+ c #A28B43", "h+ c #7C6723", "i+ c #535476", "j+ c #B8B9EC", "k+ c #616189", "l+ c #5C5C83", "m+ c #7676A1", "n+ c #8484B1", "o+ c #8182B6", "p+ c #877657", "q+ c #494C77", "r+ c #2F2A21", "s+ c #626385", "t+ c #555573", "u+ c #8080A8", "v+ c #53536E", "w+ c #A28941", "x+ c #8182A9", "y+ c #918D9C", "z+ c #464665", "A+ c #7E757A", "B+ c #7273A2", "C+ c #373758", "D+ c #3F3F63", "E+ c #4D4D72", "F+ c #4C4C70", "G+ c #7C788F", "H+ c #7C6947", "I+ c #A58434", "J+ c #866E26", "K+ c #767CB2", "L+ c #292940", "M+ c #2E2E45", "N+ c #4F506E", "O+ c #76769B", "P+ c #8B8BB3", "Q+ c #A7A8BE", "R+ c #9D97A1", "S+ c #54547A", "T+ c #303051", "U+ c #424265", "V+ c #ACADD4", "W+ c #A6A7C9", "X+ c #5C5D60", "Y+ c #95772A", "Z+ c #947E50", "`+ c #4C4750", " @ c #090B26", ".@ c #9393C0", "+@ c #A6A6D8", "@@ c #B9BAE8", "#@ c #B9B9DD", "$@ c #6F6F92", "%@ c #67678A", "&@ c #7A7AA2", "*@ c #A0A0B8", "=@ c #726869", "-@ c #7F82B1", ";@ c #8989B2", ">@ c #8282AA", ",@ c #68688F", "'@ c #C5C5D8", ")@ c #AEAED3", "!@ c #8F91B9", "~@ c #397C82", "{@ c #4B818F", "]@ c #25253E", "^@ c #9E7B1F", "/@ c #9E97A9", "(@ c #8F8FBC", "_@ c #9D9DCE", ":@ c #D9D9EB", "<@ c #C3C3E8", "[@ c #737395", "}@ c #4C4C6C", "|@ c #5D5D7E", "1@ c #6B6C90", "2@ c #5B596F", "3@ c #484867", "4@ c #4B4C71", "5@ c #515273", "6@ c #525271", "7@ c #8787AE", "8@ c #65658A", "9@ c #6D6D92", "0@ c #7F7FAA", "a@ c #8B8BB6", "b@ c #8181A9", "c@ c #5C6786", "d@ c #5D5F80", "e@ c #5C6483", "f@ c #635D85", "g@ c #7B7AAB", "h@ c #8585B2", "i@ c #7B7BA5", "j@ c #8383AF", "k@ c #A2A2D0", "l@ c #A9A9DA", "m@ c #9A9AC8", "n@ c #6D6D90", "o@ c #3E3E5A", "p@ c #30304B", "q@ c #43435F", "r@ c #40405D", "s@ c #655120", "t@ c #655223", "u@ c #878CB2", "v@ c #525172", "w@ c #434362", "x@ c #5B5B7E", "y@ c #646488", "z@ c #505373", "A@ c #428192", "B@ c #3A7C90", "C@ c #5AA6B1", "D@ c #5097A7", "E@ c #60888F", "F@ c #A3A1CF", "G@ c #5B5B81", "H@ c #5F5F85", "I@ c #7777A1", "J@ c #74749C", "K@ c #545473", "L@ c #2A2A42", "M@ c #1F1F35", "N@ c #515C4B", "O@ c #386E7D", "P@ c #636284", "Q@ c #2F2B48", "R@ c #292642", "S@ c #2C2945", "T@ c #31667E", "U@ c #2F6880", "V@ c #4A849A", "W@ c #4F8D9F", "X@ c #697052", "Y@ c #5A5E45", "Z@ c #9593C4", "`@ c #5A5A80", " # c #333352", ".# c #434366", "+# c #48486A", "@# c #4E7C8E", "## c #3F7B8A", "$# c #3C6678", "%# c #2B566E", "&# c #2B6980", "*# c #336E86", "=# c #39768A", "-# c #2D6372", ";# c #365A69", "># c #47778E", ",# c #466E7D", "'# c #707098", ")# c #3C3C5C", "!# c #262643", "~# c #4A7686", "{# c #4C7B8C", "]# c #4C859A", "^# c #2B677F", "/# c #2D6982", "(# c #306A83", "_# c #28526A", ":# c #21435A", "<# c #416173", "[# c #477182", "}# c #476D7C", "|# c #497282", "1# c #4A7889", "2# c #4C7B8D", "3# c #2B647D", "4# c #215067", "5# c #1C3D53", "6# c #1F4157", "7# c #1C3E53", "8# c #466777", "9# c #466C7D", "0# c #476E7B", "a# c #48707F", "b# c #4A7586", "c# c #4C7B8B", "d# c #447488", "e# c #1B3C52", "f# c #113448", "g# c #183A4E", "h# c #3F6071", "i# c #436474", "j# c #446777", "k# c #486E7C", "l# c #476D7B", "m# c #4A7787", "n# c #4D7C8E", "o# c #486A7B", "p# c #486979", "q# c #446474", "r# c #436372", "s# c #436373", "t# c #47707E", "u# c #4A7484", "v# c #4B7A8C", "w# c #446675", "x# c #426373", "y# c #436272", "z# c #426271", "A# c #4B7888", "B# c #456777", "C# c #456878", " . + @ ", " # $ % & * ", " = - ; > , ' ", " ) ! ~ { ] ^ ", " / ( _ : < [ } ", " | 1 2 3 4 5 6 ", " 7 8 9 0 a b c d e f g h i j k ", " l m n o p q r s t u v w x y z A B C ", " D E F G H I J K L M N O P h Q R S T U V W X Y V Z ", " ` ...+.i @.#. $.%.&.*.=.-.;. >.,.'.).!.~. ", " {.].^./.(._.:.<. [.}.|.1.2.3.4.5.6. 7.8.9.0. ", " a.b.c.d.e.f.g.h.i. j.k.l.m.n.o. p. ", " q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G. H. I. ", " J.K.L.M.N.- O. P. Q.R.S.T.U.V. W. X. ", " Y. Z.`. +.+++@+#+ $+%+&+*+=+-+s ;+ >+ ", " ,+ '+)+!+~+{+]+^+ /+(+_+:+<+[+ }+ ", " |+ 1+ 2+3+4+5+6+7+8+ 9+0+a+b+c+d+e+f+ g+ ", " h+i+ j+k+l+m+n+o+p+ q+r+s+H.U t+u+v+ w+ ", " x+y+z+ A+B+C+D+E+F+G+H+I+J+K+t+L+M+&+N+ ", " O+P+Q+R+6 S+T+U+c.V+W+ X+Y+Z+`+ @Y .@+@@@#@ ", " $@%@&@*@=@-@ ;@>@,@'@)@!@~@{@]@ ^@/@(@_@:@<@ ", " [@}@|@1@b.2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@l@m@ ", " n@o@p@q@r@ s@t@ u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@; J@ ", " K@L@M@ N@O@P@Q@R@S@T@U@V@W@X@Y@Z@`@ #.#+# ", " @###$#%#&#*#=#-#;#>#,# '#)#!# ", " ~#{#]#^#/#(#_#:#<#[#}# ", " |#1#2#3#4#5#6#7#8#9#0# ", " a#b#c#d#e#f#g#h#i#j#k# ", " l#|#m#n#o#8#p#q#r#s# ", " t#u#v#j#w#x#y#z# ", " A#B#r#z# ", " C# "}; xcrysden-1.6.2/images/nocell.gif0000644000175000017500000000344711712736221015275 0ustar tonetoneGIF89a%%ö`  , 2 > .""**33;;; ;00??<<.+.!4!2 2@ A R Y@WXR c cy2M25T5=P="c"(q(BBJJSSS S[[SSB;BU Ucckkbbnnssr r{{y yvva+aLELNHN@R@jJj‹–""+‚+-Œ-!¯!(§("³"'º'7¨79¡9%Á%'É'+Å+,Ø,5Ì52è2ƒƒ‹ ‹””››‘‘ƒ&ƒ§§««­ ­¢¢²²¾¾´!´ÉÉ!ù!þCreator::XCRSYDEN-0.x ,%%þ€,W\8-*,R€T6+..32+,*+*+þ€€'+*  +* A#"388SCF$þ€ B36T_:,-@IB@@H632734JOPNLM 8*+>QQHI@.+€E)+*.]^Z..X`]6*.,9þ€9,!0[S3223:72,AD72..**+,1(CP/2R*.+€I/,.**"&=,BC,þ€3,RV€Z6,SURV]Z.SR8V[\-S7;<%( o€?KG!  ;xcrysden-1.6.2/images/up1.gif0000644000175000017500000000016611712736221014521 0ustar tonetoneGIF87añÿÿÏ0ÿÿÿ,O„©ËíŸÑÍ9ª!ܬœw `5–Ú©åÙ¤îkµ³ #òoüû MˆÑh›—Œ¤+×pö"R•¤¬TWW´‰}¢€š¥ÙJ«;xcrysden-1.6.2/images/jpaint.gif0000644000175000017500000000046011712736221015276 0ustar tonetoneGIF89aó ÿÿc¸ÿ‹Eÿ  ðÍ…?ÿÿÒ´Œÿÿÿ!ù ,ƒÿÿc¸ÿ‹Eÿ  ðÍ…?ÿÿÒ´Œÿÿÿ­p­µÖZk­µÖ‚k­µÖJ)¥s\k­µRJèœR`9d­µR:¡K)çµR: !ˆÎ)åœCVâÀsÎ9åsÈJ qÎ9 cÌ!0%qÎ9€cŒ‡¤sÎ9€s<ç•Î9Isà !²Ö9IÏ9!„CÖZéxÎ9ç„pÈZé@rÎ9pY ²Ö9çÎY0²ÖZëœÎd²ÖZk­sÏó<Ïó<Ïó<Ïó<Ïó<Ïó<Ïó<ø<Ïó<Ïó<Ïó<Ïó<Ïó<E ð<Ïþó<Ïó<Ïó<Ïó<Ïó<Ïó<Ïó€Ïó<Ïó<Ïó<Ïó<Ïó<Ïó<Ïó<Ï>Ïó<Ïó<Ïó<Ïó<Ïó<Ïó<Ïó<ø<Ïó<Ïó<EQ €@Q €@QEø €PEQEQEQEQHQEQEQEQEQEQEQEQ EQEQEQEQEQEQEQEEQEQEQEQEQEQEQREQEQEQEQEQEQEQHQEQEQEQEQEQEQEQ EQEQEQEQEQEQEQEEQEQEQEQEQT;xcrysden-1.6.2/images/solidwirecell.gif0000644000175000017500000000451711712736221016661 0ustar tonetoneGIF89a%%÷ÿ #! 1 9 ##)) +,%)-2>"55==11..$6"8#=89 ,**)&(!>?2..=::944=H&A Q-M-r<'s9DDEJJJ LL GTTT\\ RRAAH[[[^`FgYc[v Xva^k\ eHbcejjj bl klhe lsqnqq vuijb|dtyyuv%IH%IJ-QQ#[T2NM:M_9\\3VW!Jj+Fu/Vs>R>xD@?EAAJGGAV]YUVRKK\G|VQyJggAvuUkiXrra[\geel}}smmtrsywwW†`€~ eƒ.[6\"a‚+g‰+y‘1b6s…Sw¥uy´€[™Z‹i ‡r˜všwšk¥l¦y¶{ ¶k,«}Â~Z„hq”|l¨vƒ¬€¿€$ŠŠ+Œ‹$ƒƒ(•†,’’9……8”™8™œ8 ž;§§4³³ÊÖ‚Eš›Y……T˜˜Qƒ¥S™§K žF¶–@¦¦[¤¤_¸¶b——t†…››w†•hª¨f°¯h¶¶yª©¬¼{¶¶mŠ­|À¾wÂÁƒ€~ŠŠ‹………„Ÿ‹––•šš†Œ¥›²¡™”¼žŒ©©†¨¨¼¼Š¸·”­­œ¦¦™¬°“²²—¸¸‚´§£§¦¡¥½§¸­¢³³¨¹·²ººµ¶¹¸Á˜ªÂ®³Áµ»ÄÀ¿–Ä¿‹ÅÅ›ËÊ—ÅÅ£ÎÏ«ÂæÆÊ­ÔÔ¹ÇÇ´ÑϺÕÖ¾ÑÄÉÊÌÉÐÇרÔÚÚÂÏäÙÒðÏÐæÌââÅææÔããÚæåëììãèçïìòëðïóïïóóó!ù!þCreator::XCRSYDEN-0.x ,%%þ@p@>r>„0€ÃÖíËG®\9sÍò¬Aö®œ"Eñj¥BÈŠ®cn Ž4p¾DX¾QK–$IªW±®ÆÊ‘*ƒýùÆ.J”(K‚,aE­Ïþ``›«G¤@%"BÄ @DÖ=[%J'<šÐŠ–§€ðù…cÇŽE ©RD RÿΊeÊ‘%<®ô"VÀmWvðàÁ£I©)I’$Ù­Ý/{ä8 š²dI'ÞŠ(¦ ö®ìH’„ •$I’|úm“&‡*aªT©R¥%œì¥ #D 1ë> ç^¹$<’$I’dÇ•]Þôµµ„ЍUª*U‚„\4a„üøñ#Ü{ö‹G’ <¦¸Š—ÙkøžqZ©S§GJ@ÅSsF"tP@sWÚÁ*r¦þ>yË<€àÎ;{»¬(iâ$J¹jgÎô¸ñ£Œj!aÎÉ¢zñôqÃæ )R(@ IžºXV>ÕjW‡ 6l¨93í !ª12DÞœ3´ ¸Å %h8&à¹XêZQÀqÆ 92yËÀt’¤ÔK¶@ØT¤H‘bE‰ Üá&]8Âl‰aƒBŽ^w(0íÒ$tàJxÁÒ Š 2”(. º5£€ãF$6lP°á ¦É²Ô,œ‰.4À€á† @ð¢AÀ±u1pà°!† vŽ€Ÿ`¬uË€FKƒþ .XHB‚_ØO‡8lØ `# M”®w *hAã£ÁH. ˆàå·âƒÃ† ZBT{¯ƒ¼x™á@BƒY´0€@Ͼ!7lذA¡Ç4=÷Öi`ЀAƒh´Dð— à¢oˆ 6lL°U Àµ}8`¡„,h²hÉ€Apô•±aã…-Ó60Ðmš† "dh0à–:`HqbN?;DP˜Ð‹ øávë þ4€åKŠ'L°á/š3cѺ¡ÃÓ`@ƒ |ia‚Ž2yï¶uÛç¯7×¶y!0 ¹ÀÅcFfF&dÇä@œnÇ|̸Õ-Û¦54]#¶ €nòü½;flÙµ>p€Ë‡7|ôÄ9€€;xcrysden-1.6.2/images/rotYmin.gif0000644000175000017500000000216611712736221015457 0ustar tonetoneGIF89aç   !#$%&')+,/02368:;?% + ; %%%&'&'('*+*-.-./.565;<;=>= @!!C""E##G%%K''N''O((Q,,Y..]//^//_00`00a11b22d22e33f44i55j66l66m77n77o88p88q99r99s::t;;v<>|??~??G'S.W0^4f8h9k;l<p=?@?{DJKJKLKNON]_]^`^acaghgprprsrsustvtyzyz|z@@€@@AA‚LOŸMP¡OR¥mqãv{÷GƒHŠL ‹M ŒM N!O"”Q"•R"–S"—S#˜T#™T#šU$žW$ X%¤Z&¦\&§\'«^(±a)²b)µd*ºf+»g,Àj,Ák,Âk-Åm-Æm.Êo.Ìp/Ìq/Íq/Îr/Ïr/Ðs0Ñs‚„‚„†„‘’—™— £ £¦£¥§¥«®«­°­¸»¸ÁÅÁÃÆÃÄÇÄÊÍÊÕØÕÙÜÙÚÞÚÝáÝäçäçêçéíéëîëïóïðôðòõò÷û÷úþúýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ,þÿ H° Áƒ*\Ȱ¡Ã‡ Hœ±àD *H¨à"D‰#6| A2D6Ht€I‘7pìà±#G !$$X¹p¢7N„ÌäA´æx"pÀn¦0ù!¤$BsŒ`@B?œ¨ ”;Š@‰ÂÄåŽ :.À@¢`è„ÉÚ"4Bx´èE"£=*(eY\¼p‡ €B„´H:9‡Ä-&$[T´åÊAw4+ž|™ Ñ0*TgO =© `€-Pö¼{GbäÇ =€R Øm1R àe/nw•JÿÉö}òðA€ŠT·óInl篣GÊÄhPñ=vJ½ ÀR +Á{S¢Ô~)8ùÕwH~°_"ñ¸#Ɔ‰"ÿ5˜ÝW˜ØGƒÙ"†ÍÁáGV$âˆ$–8P@;xcrysden-1.6.2/images/rotXmin.gif0000644000175000017500000000215211712736221015451 0ustar tonetoneGIF89aç   !#$%&')+,/02368:;?% + ; %%%&'&'('*+*-.-./.565;<;=>= @!!C""E##G%%K''N''O((Q,,Y..]//^//_00`00a11b22d22e33f44i55j66l66m77n77o88p88q99r99s::t;;v<>|??~??G'S.W0^4f8h9k;l<p=?@?{DJKJKLKNON]_]^`^acaghgprprsrsustvtyzyz|z@@€@@AA‚LOŸMP¡OR¥mqãv{÷GƒHŠL ‹M ŒM N!O"”Q"•R"–S"—S#˜T#™T#šU$žW$ X%¤Z&¦\&§\'«^(±a)²b)µd*ºf+»g,Àj,Ák,Âk-Åm-Æm.Êo.Ìp/Ìq/Íq/Îr/Ïr/Ðs0Ñs‚„‚„†„‘’—™— £ £¦£¥§¥«®«­°­¸»¸ÁÅÁÃÆÃÄÇÄÊÍÊÕØÕÙÜÙÚÞÚÝáÝäçäçêçéíéëîëïóïðôðòõò÷û÷úþúýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ,þÿ H° Áƒ*\Ȱ¡Ã‡#@±bE‰DŠÄˆ£¢;^.B@)£“…¶PÀãÇ -’¤Äh?u®È¤¨À[˜0Ñèæž=…%:1˜ ȱ¥(‘Í›€ "´'B nŠðŒ§”=7ý½£¥@°nvŒ€ŽÙ=€ò²P@”)Nnl [÷îž½ ÂDŽc{ڵö@_B~üرƒÂQß|ª"T;„ðàA£¯CJ˜ H%€îù(Hxäáú!aN¢¯QÁÃnãLïÁà¹qÆ;†ëƘ1J”"9FHHÌ@Ž!Eä*H`½àN‹5h„`¸=AŒ,YâȱÅùõwH øÈtlA‘söMd DH‚ \ˆÑ{½q§á†;xcrysden-1.6.2/images/xcrysden-welcome.gif0000644000175000017500000021027311712736221017306 0ustar tonetoneGIF89aà@÷,1&1!/ 72+/00Qqp+]'$O0-\O3 o4/m2Z]"GGSR'L 1O11J)'X89Yj jllqw%n'i7g0o98g0/pN2_q4QMNXZ6JR kMwIi[wZ,nPHeWcUl6Infdxfpk-qpJONWZLFHVVXVmQ]UfRhjUOPmGFxUnkmqo®›")Î×$žaÇlŒ:Y“EPžU`Ø^] “/– ²¹/² 1°.¸8d›P² Æ /ÆÊ1+Æ/+è*RÆoÇ]Ê)ŽK‰Y—Y/ŸPªK·H¨Y·V³\ˆhŒn—g˜v0s¨g´c·j·n§v·v-»kVœcvˆsËNÇY)ÆR êZÈiÒgÈvÆsÒv,ÄmTÊo¡˜° ²² ȑȭƠ'Ç°Ç È(ÑÖëë ôõÿÿŸ¡\ŠŠuÁ¿f‡•#+šJ.“'VŽ u’S¯p®HH‡XV‡JG–OP“WU›Ze”nnZX¤QS°b]¥hf¨on®vuªyx³"ÉgËYZÎdfÙ² ´˜pŽ‚~²•ލ‰¸‰©–¶—·0©’˜«‰±–¶§«·§ ¬²¹µO“tŒŒQ¬‘j¤¦ljÒŠÈ–É’Ò—Ê©ʬѣѬ Ò©É·Ñ´ֵѻ/Ñ OБnÒ_Û®sаŸÈm ÎÌÅÑÃÑÊ4ÑÃlÛɘ¦¨©˜‰‡º²°²­Ï¶¨¡Ü˜’Ø®²Ì´’殙踩èªÐÜ™ÆÆºÃ–”ۚś­Ë°±ÎœœéĽіÔÓ²ÒÍ“çΚéÛ¨æÖ”îå›êâ«åãÏÑÏÙæßÍÎçíîí!ù,à@þCTH° Áƒ*\Ȱ¡Ã‚!Œø°¢Å‹3jÜȱ£Ç CŠI2’(S.´¤²¥Ë—0cÊœI“&‡#êÜɳ§ÏŸ@ƒ *Ï :(%Ê´©Ó§P£JJµªÕ«X³jÝ µC… 9AˆK¶¬Ù³hÓª]Ë-£&•^¸° nÝ 8˜lË·¯ß¿€9ÜìTiˆ+^̸±ãÇ#KžL¹²å˘3kÞÌY±áÏŸ¿†Lº´i´:;Ì­‹¤ˆ‘×H\èðö´íÛ¦VÚ¹·oÈ#‚ N¼¸ñãÅ gŒ|ðæÐ£KŸý÷äÏÀVÚ‹»»÷´ªYþ#䵑ñ³¹_Ï^·aËÃ=PŸO¿¾ýûøóëßÏÿxï죱g›I‚­×t)PÄxæ5ˆÄleÕ6Ö^ºÁ•Ô'dx„I( n‚½·X$FG‰(¦¨âŠ,¶èâ‹.b £Œ'ÎH#Œ8æ¨ãŽ<²Èßdn÷!iƒ‰u“‡·… Z (@ÞxGD ›l„ExVv"Ê)©¤¢ *ŸÐ†ä¥…x؈ô¡h\l¶éæ›$Ø(çœsÂiçwŽp"~©™mífؘ¦™tAL. à‚H8ñÄGL™žXê&XD Üt‚'£ŒÒ¥* ªÊ„ê—™h‡çªnÊઠþ$¼*무Öjë­*äªë®¼öºë­À+ì°ÄÛæ|Œùi*iv·d¢‹Žçèæ·€^U`Vˆ˜V°©(~ªJ8Á¨æ²¹‰ˆ˜ª¬ÞYì»ð ëë¼ôÖëk¼øæ«¯«<êÙ\²Ú5‹.Y´ÁÅS¦UÚÆA ZW´HáD¤ç•‡D±¤ʆX(V'á §§ j8(ƒzÉÀ¥©+_pí¸ïÌ4»jïÍ8ã\óÎ;³ ]bX Ëà}UAÁÞ=›€¢ ŒÇ(ƒ·vÄ$â¼ÓŽ* `;Ö`"„'à–œJ,(‡‹*¤dJ´_ê ó‰<Çï tçl÷ÝôÒM·þÜ|¿»ã¿=ôÚ”Þ´š]X —Úa™Ô¡ˆ&ÊÚÓ ’wÄß¼£¹Õ§œ@›R"tâÉ×¢„Ý%Êí„óå„óµ›r0·Ú÷ìÄêm»Þxçžûí¼¯ à Àì ´Ç«#Ìþ .$ѵѦ$]®™—„T"‘ãjhÑ/­€xOR~Ä“l¾y;§tr(¢Œ°uJ~þe«&g¤ µ®ˆoé_ìZÀ ï‚PœX/Ú­ œ×éÅ.zÑ‹<žq8H8ÂTB5‹’^ IH=œ(‰/êÀLÀƒFî{Šúž #¶Úð†îÇÛ6p]"ÊÎ&¥|@Ó3å嬨‰ùú¢&¸Åyaq-``FIÊRŽrø¤{µÅMºò•Ä+–‹CƵìPi|M”À˶qyòVxЀîÝÑ.M“áúHÃj.±Eûà¿.m‘ªHE'D°¾SxÓŸÐÚ-¥DarX°L'ð¦È«¨@•¦Œ§+U„.™wq^™#„$%àŽ fíš_ÃJÄYÎr®³ú:Ñ©=óY¬ȶ¶Ý€¤ÀO€…7L q|ãÄãHw£GÚ)XÀâ ÞnB` æ¶© n5ÍiPý•Çdò±aI]êžÚ‚/À,ïžðÌ:Ö­~õ(Y-qRB<¨Sf¸Æ7žð[{üã ¹Èþ?Æ,ûhË  Fc˜­ÅqGºÀE‘mU/Š`´Ÿ]xÄCâ…ž¯½m];ðÁ(è ôo€ãÉMwrEŒNÂ)_læŽÔ}‰=Ŧ‰cTt¢Cà”ÀXp Þš€ç8ÇgÝ‚‹7âtW/Ä™|qd\î¹à/ø.vvE(¦áè²ròœG6§¤‘´€Áɶ¹y˜€óu<Úþèù8‚.t=ë¹èFo€v"Œ"@¯šÏ“›Üx¸ÕѣȺÖɳŒ™m‡ûnéØçú%0¡=°è"ì¨áÕö*Þ€×x \ ÷½Ç7¨.p `þpƒîß@à÷þ `ýº/²}Ÿuô5þüö?ßð&WÑ–·C!Õ0¾ñP£ž@½µÚÀÜH¹õ`V™§lGÀ‡pÎzУWm¦G@€zÙ¦aåz¯{>·¸n¢{»Ç{“1<ÔC6Fv âW :˜Ð‚—À!‘g>†/͇ptã~ëÇpÙçvçd§}Ý~àÇ œ° FH„BØ}äG}çWTéG_ëç~RHxðg,-PL+ôkÉÔNÐåñx8a!ý‡4F"C0py˜·Z67>Š€” s èè V—‡£¸¨[è @XˆVuþ>PVøw1„1ùv¥“]bci¦ 'ÀR¡‰Þô ¬c*3X,5xA7r9¸qÓ·ƒ=è„}AH„F¸ «‹–` ±¸ ¯¸ œ~7ÀƒMk±V~PÈqS8Œ#W…·‚#Á!#Zf÷ÇMðN†ç‘8–ÂÕh0§—ml˜fnèQ²ˆ€ H‡ ï`uÞ ˆ@·ŽzV€èz©{ïPˆ(;„KƒLPâ…OÒ{%XH|õRÓ•]žÐ BÐ  ‰Ø•]¤à]j'jèŠp'r3@Š¥Èp§È‹±æƒ@~F¸ —0‹–p —Ђ(i’$i‹› ‹¼èƒ¿¨þ~r7x/wÄxk5ùvQ$,Z¦ŒõÇŒÈÔ4^Ȉ r9£`‰0˜jyöŽÚƆM↱µœGމ0‡ Hgð ì¸9èØhxhzÚ.ôht£ ”ãñŒO†¼ç`ÃWÖ*Ô ™W¢“‰›&‰¤@*ýg ë²|³B‘t“q—‘ §^Ù—Šó„}ܧ E¸ ³x’'€˜‰Þ¶™)™.h’G¨ d𒪓ê}¤}8‰˜9©“ýd…W8>ù1flù$kötµ¥ÜQA`z@ÐF•nx€ã¨qxWI‡=瀱'ã@ˆ…ØŽ¥7–žfþésh©ûÈ—O’°€R¡b—x‰zy] )‰§À‰ùÊ7pd˜t“ŠÉq;È‘kÙ™›0’–€ ™Y œy ›‰™˜p ¶˜‹ãGšCuqÀ˜ŸÂ}:“Aú›ˆ'›Yˆ)ög›à‰›æq möó9œÂÙ¸†‚&hM1Ž¢œ”p£”ÐŒp¢ÜÉ•@—nÛ –¥‡©ÀŽâ°?tÅ\!øOà eSWþv é©— É—ÚU¤XC2Ÿ²bŸøÙšz¡ûé˜ñ™ß %)™Ù™˜‰ pÊ™(° —€‹š°‹½x¦·Ÿ—u¡wcê§bŠ“þ\„Aš"ɘ…B¢sñø'&úlýðýàöÃM£–­'/zt Phá8J¤Š£qæsßÀ•Fúnr£ ‘«ðŽ ’ FZf‰>Ð=A™L{´N¥©ƒMv¥R+µR ° IÞD dF°…Ž«³z…°^ú*m‡˜W“€Z“~ºŸüqù‘jz Ú¦qú®›é‚vJ~Ž¡{ºƒ‚špÝ—¯r ÷šÀrr2’P›@ù«$ú±º° Û° @ ‡ð°+«üÀë st–Þðn­QLàÛ°Ž Þð(ûã`–éˆþÀõ«ÀúŽÂ\/v6Ó52É*:Ì:v0E¥€‰=iP°:²ÁÁް´4PŸ#µ0«ŽÀxÐàúq€Š“ùi®çZ¯éú}E¸¦íú¦ðÊ™ò¶¶k› j‹šÀd ¶òTR`"«û¹q0PŠ6 ~}›Ÿ7Ðq/`YÐŽ °±J«V›µˆ:°ñÌfŽªu¯¡¸QK±;±›Ë° güpª[ٱ𶠫¹Ÿ+« K †tD0s¾Š°1´Kð¤/–2ùV¥:Ë<«¥¸5k!ž»ºP ›N)"P¹J»Nsªë¼±š@P¼«º ˆŽ\ù  G\±0Ë…‡ÃDÀŤÚQy»)C¥¹R5†¥Îz Ù¢s][âž ‰& ¬Ì M ˜°@ÖŒ°  …@ÖŽ xÆQ놞¸ḭ̈Ò€7ÒúÚÊø[ÔfËÛ´ìÚ7-½ –À1ÍËîJ¾6}Ókû…ÄÌ G½ºA-ÔC½e<ÆÁí°Ž1pY-d½ÑKþ­"‹ÀP¬ÕA‰×ä¨@ ŸK ©ÚŽaIkݰ@ é¶ÞëMÎÞЫçí°Lð R ðy( ç, <ÐßþÜÐȤ 1xíQTDg“o`ÃÐÙEÓ -& Y؇ ÍÈK±;``FS ]¼b;R”Ü kó’ñí°£½¨)~ã—pÆ­ÚcœÒ*íÚRÐãV0Û&y·Ûh«Û»-Ì)À ’̱F_ÚWÜÆmÆbP±` ‡;-€Ï*PÀÕ}ÝØÝÌØÈ”OÀVÊ©7ºëÄëøæÕ笙úæv¾ŽU×K0²þóm• Öz6 ÓìþÝßÓ€F²{¹…¶LKph4$ TÃ\ N]‘á~É WVº¬™H M †À"â°ê`°Ç±jpâ¶c#‹Oï¤@Y°Ùõ}Ü7~8þë'½ƒcŠ=þÚ`c œ`’Ó2ýË5äWŒÓò¶ › l`=Ý·ŽEŒåR~Üökë;Ú ·¼òâ û+ÇHÝÚlÝæ0­è€æm> ‰fb8Êìgൊ`zCÊî’a˜ÖV§g Ú‰PsQIà;ÐEñrî°; Ó¼lïÜ£ƒV ZyÇ$oþÐ4+ÉÓäMuéoéÐêiámØß4ÑŸ«8FÃê°ó<ßá¢} #I¥7[^±@ôHôÚ‘ÀâtóÊ¿Nîd,õúKìÅTVЄÇþÚVäEÇs¡ñ4ý®ÁœÓÂlí×~ œ c`£´ë«J§(ådÌaÌî‘ XŽYítší°`#]n+Lï<ï_ïÐßJ7 õè6ç Îþ0xϰðmCàDàó + aúa•aÚhm’=²G`ßQÙ=ªWñÕä [ŠŸõÎm¶ßmß¶t$ÿæÍŽª3ÉVçX§t±c0%á/Ÿ¬ .ê§` 4þë ›ó­ÎóÔïêž«€ôCO7#›ôÞôµ&nÙ|›¿ÁìUŸ}cpõ@žõõúÚ´,Ê. °x DŽÝ·=öqj¾fÿ(böÑDà@'M0]Ú¤‹"D‚Q¢<Àˆ±… 0<~ò#›"ÅHD™åÅ‹*T`´h1 ʈ‡,bÀéRÆNž2HüŠ3„¢Œf@4ÃAõ "Òõ:ScEõ7U±³q¦ßšƒUÖ` 1p¥Î3zõX+¤`Ä@œá ¥g¡uPÚ&¨õpª½Ö ÂdNÞðÜß(²nÜ (÷#2‡\EuÉHòF~káÝåé[‹V½ §}ùõ`$‘Xˆ ç)¶2žo$f nG  =‰X‹‡?~ú·DH.yN”%b”`(‹xII ˆI!a”:Jl§Iç'È“ÚÈ F Qú¸ (À`;CvÄú9ª§³úêä}€ºGLüNVpä^"Hvu¯r-ôÏ€‘˜ÝþR ¡»=àpW¬Õ7¿Q(«Øˆ®ëT#ŒK‘G 7BްrkJ¡¹x@jœsè ºžð‹B©DQNg”Ô­J ‹ìúáyÌ® Pø¶$‰`cyZ‹ÇƒŠÝ¥})ž—ꄲ'x#a_Ç$ ‰¤EyöP’¨"8Á Ü(Fd°@ÒÃàT©ºZL`E#þÝeGùÎ×<2GšìJ€j+à'õFHB‚EU¤$A >B€Ë ¬ðÃaǃ‹‹O UY²ë.†xI¼›ñ ލc\¢>¾P_<±!N*þ‚i‡Ø€êžqÀ#ˆb=Æá¾(c¤„)óĵèàwq9D›âT<œ e…Ä7Æx¼#aY’Dx°%m@z’‹aú·D,@)ü $„G}ⓌPANö|ý1~ ûÎ.]¢µ»da~qÉ× iP)ÔÇ>Vˆ$>©Sˆ( ‡&¥4Ž öí“â„FÉÁÄ àƒ©\eN)¹“T#YÀÞ#²à†¶ï—5Ò0;Г('Ð2•É2Ë(¬VêG4Çñ„j*t„70Ó<Þ•iIqaKÜÅroP’Hi<ÚÙ¼'0iº§H%2þŠ H nX‚iJƒ"M@0AOW½FBWºä%çÀÈöuÍk+ (XQªï´ ³aÉÂ\`žß0£ÀŠ‚nÆ=H¨DÁºÄ ˜¤Ê&YÚÉ ¢à¬ œh:ŠÜ”#:Í©,×®,ÄÖ~º,j©Ž ̤“¸îR?pd6ŇSì´"MøE/ÎÍÑ&q²ÊÓ-h-Ë\Ð ‘qš¬œ[”€$ô )Á#a-kق𠪱ŽBæ4_G¶4 ‚s„X˜I&`ä–¡Ëjg²}aþ³WöŒ³‹Sâ#ƃø´`£(é¨G£Úþa)±&(g[ÑØ˜’BH ¢–JwË[ þDÂ=œjjSTº¹«tà _,[‘f†Ó ÒB0Ì€ÀË ¸®L U§üÐuâ­‡7`^ÁÆcdò(ã'rŒ.w¾ó› `ßûê@˜Ä$RªÉÿŽÞ¨V|‚·f“˜/D±Z”L‚{@ðÂ'¿ àe(¡ðv¸ƒÆ‚Å;6чïHŒ¶@<iýBÌŠ²Ø™{€J{ZÐX ‹ P€Ë, tjŒŒ¡LR¥¥,Hräp‰‹É |ò“#­×æÈËG@¢î ‰4Ì/—{»È$ØwæL‡þñc«œÖË5g ¬ ŠtÁÓÆæ„! aK8.g z@Ê|c“ñp§«•‚ a/ `@™Oƒ„!BA$‰—l¾KÈ"˜hRˆ1g@ @Ê/ *–j›Ãh¬^@Ù«`V¡©8kcŽà:#}À·„ΟϢä(@É@ó¸na6ßx[Aƒl"e@ò]¬]Ü&!Û$,ÃßÜX+óÈG?·Oú5î.—ÛË2™B˜§ŒÂ‹*•]ާ½ŒÝ(BžìÜ<±lwzú÷7‡0Š„©Ô¿t…JSÊáá ðË$|—4ño•g 9Éþ;cYÔ´¡æi¦ä´ž,w¹ 32H¯Ñœ³6W$Îiî44Þzöñ²± tD`?E—Èè°|æSǾɶäo;ulqVOCÖÁ²õkÐë_‡œr!׿G¬Ï"³´$:|v´§]í8lû—9àåsw×Ñ-ó"Y°w6'‚{IÛ<+¼m:<"x³ßáó¢’wB4ÉC‚Ê“À½ÀãC¾ˆP¾ç{>ÚŠ¾ ¶ê³>«‹í£ ù¿Çqñ{þœÿS²‹ÊˆŒˆnc¿X™÷[»-‹?/›?0û€1Ûð® (¼º" Ø à´`"©¸˜‹ÈÐ&‰É–ñ†ü“ àÅó"g² „‹˜òZ ,$€DËÓ‹è"êøÄ6!\¾„¥(HX½  t="”T?‰òš\5ˆÂ½uÉ9Uɰ-É:‡àÂH¤Ò+§“¾é£>Oz©ëË…8¸‚j—‚€ùø¾l+ƒh¡Ia„Êʼ‹xùÂè˜07q#C·›¿.ƒ» cŠF› ;ã˜9\3¿0½é‘B, <É¿ox"»Ë¿Hó™9àCMþ"¢xˆXX³½¨<$8'8‚¤<$€KüRÔDXº»x„ðÀÔƒE(9Ñ#Åx= ¨° ÛS,µ,ˆ(dE°$XÉ=(±\Q•ŒˆZ´ÅâC™^œH”dë1Ûú¤ 2—*F&LÆ$³6ftFðsi„œ7ƒ„, ±Œˆ´²SÅèÆ´Gr+7à€. ³1ë<¸‹Ø9D™j¿C¸8»K˜Ù+ª¨Š¸ÙG¥P@qÈ«ˆ˜@"½@$¸-…<È&€Èl½‰€pº ð@Æ” P’D£à‘´0 6 0II:Ú Û›xI±éþS¢Iˆ°IÄID ÅÔI_¼¯[ ¡ÄM¡Ä ¬ºcÔ5¤\ÆÅiFgŒÆâ4ÎãDÎ2ˆ´Í’¡y¡›pŸ÷ÉÊ}?q<Ãùë ÉÎ릹8Ëãa€Ú¡‰#ضCÈ€²àÃ9S§M¢žù˜áÇ ÈK)©~àKoØ;pD„¤…4‚†<ÌäX>TLܹ‹CX¾Š”­ ˜LÖk=(Iô‚ØØÌQl½“ùL˜«=,Ípµ¸œ­ÁáIC°¶oÉÉßMe>“¾ ÉÍ%FÞü­\HƒßÔº­SJâLNälÊã´KùÑØ”-çØ%nôƪN·³N°€s\þ<"‹³DK”ñ?”`‚"8‚I)„Ì7‚{‡ª¨+Y‡î¸3™O¬°O„6+&8‚†<‚#0$0‚<-ˆÌDH™Ð”¢!àD»jP@AH!E€ Ó ýÈ“9„±;AR5–\Ó },Qê(»Mý½à>×\Ñ»ØÅæsQœèK…ÕÜ4V˜…3ÐÑíãQátÆ1øÑãtƒ8@Î)“Ÿ‹:¿XDRè˜N&e;'}Ò ˜;|Œ +EKÈ„8‚иðÙ²€ »Sº,S°1HHÓó$8 Ê ¹‡òêªkJ„…ÄÓ<ÍS<åÓEý“b+#þ%A¸Gð¥'EMŽ3¹" ÐHELõ«-1ÖˆZIšhImXÕÜÕß+ÕáSQêHÕå›MÚtÕWÕ“-ˆßš…+¨e$áÎùèUã ÒãQ­+VípXc=;¬\R`jRg5CЀ¦°»Q観4Ë’Ì%ÀÛq¹ ¿±SzU(˜÷lÌøôG/z«˜&þC¢B„ÊÓS{ý¤¶?U Å(¶¦C¯G€ÍIð„ÉŒTH¹3Ù€|Oè„ÄRØ…MLkE ÃTøiE¬!ÇÖˆ¨Æ™ÌXVÕŽ:~…ØÉUõ@dc€AÙ“Ý]¨þ–uÙâ²]ÙÕí)œ%RDªŸ€ê£žÅJêlV¡Zè€&Y^Xƒ*Øà'äQæÕÕ á%b…(¸Uš€c邎olagõJ7l™²ªá³œ2H¼È€…ÝÁ‹ bzM%Pè½C4Bâ €Kqp"Þá?XËÀ¬¼.­bLL ·¸«!Ä ØV‹dÐ’#Ø”c’‚éa0Vã5^ãEýfÜØ]\©™ã›­(ÅŽöæL>€™ø»­#¾ä%äV=äIdÜþœU[@G>]›’ä䃶q„F0ƒ™mÝFšXŠ%g„n?¢Û GÜ%Z°€&©;nZ ³LßBÞÃãá͹‚l^#°e(¸åçGHŠ´7Ác‹5[²aýtÄ"xb‰°b¥˜;ÂX ö."àžÜÀL ¨æ§°¢HÕæ¥~_~չʒc툅Θx $‹\S‚]hG¾›dà\Ä€TUP°ÀÈmUÛ\ ½g'¸`;¸-ƒ~N+øàhLƒƒ1èÕ3H±LÎÐ3RVp e'-Z ˜*ó3§Í‘³lå{›‹kΑ‚¤<’†“†^%x³©u Âãþ}c ô‹¼Ø ƒ<‚›Žˆ`ÛPéÇ2óݶ`C‚ôj¢N%!˜Ð•^c îÊô2V;áíÕƒÇ5”W1g©Éc”HçìÈøDâû–€\dx»øBEkŸ¤à¶¥]P/ЂèÖH™µÙ»(è¥ê.üf©®ïšxÝ]J»ÃvÒ8¦XÃ3‹Þ¶Ò?À=™7iÞ#Èì“~Þ\F# pËtäšq®G8m½O,)ñ}m–I…Tx¢»RfÂØ<+Z‚}Ð¥ ˜NÊ£BÐ[àn$a y„=.ÕîMz™”üœMõTêÆ)ˆþ­,Àn–¸1„@ÝđԴVkó¶>V°,pd(wo»žä2Hƒ4`:êëù²($߈üŽL$5ìÛ•è 0¦è]ÍS„7«#¦E+@{fáY‚9%i[&â$ðü- Ø7Iø'œaÞÓîð =P?IŠ 0å¨ç«£m§ˆ´?±LãN‚IqŽ6¹¨Úï“–æ†\CØnbq#”´jQÍÅHHšŠpra5­úø–(ЂE`ÁCh€å“VW!òéÉ’5Ù{nX…k0 öIYŸeôà3ó1?hš0貑0a Ú’æØï‡ÿ.·ì¬sŒc™/ŽÌ¸þ˜E‰`#(ôç5‚,=H Ã¿„8Ò>#?AZL—ŠpØôNw ×uÂM£¨°Q¯wP-ò0ÑÕL‰Œxn$‡6'?+˜±s€Gž”rxeŒzn¶NIp›3ZGƒm?ƒ3s?Õïd„ŠoŸS©]ž`÷/ƒ»þCyJ׉‡ˆ%bZ¦×%øsI¢Ûð´zÇHߊiK^f&wp‡w‡€Uø 0À»h‰ôÓÖƒøˆ†Ç'Ch¡ë¸xŒw”Ž‚‰‰!ß’Gya?#“? Ç,䔇¶ö4—3„ƒš·ù4øv”ØÕ».½ïïðùúŸ ÚþQ>÷‹»Ùvòü¤XúÆrú§§×<]‚B |Îã‘€¸x‹\à­‡Š„y‡Ý‡„ïtOøóCHÌLÁµ¯°Rï÷¡º{ë˜{š„„FàÇ{ù°üéûûù‘?#x &ïÃ]mÁ·ïŸÅW›Æü4àƒü-´ óhŒü3‚û¸'lé\ÒÎå®LÃFsC¤‡JŽ",hð ÂHKihäáC&…$}£)!Æ‚Ž$HhÐ@ÂŽ=xä$cF x•Jœ¸w2Å bó¦M" %(à'О=/hÐ`âÄÑ ’ðeÂF-V¨xðàÀ€¬ rMþèHÌ.¬^ÍjvÀ²bǰ5ó´+AFVæZ‰ZàD@€/A  àÑcŠÄŠ0nì¸q !«$ÆhïÜ1g6§éÜ£¼¢]°Sæt™1f–Vvd¦jÙ³YÐV¡bnÜ3dÈÀ€!D¥ †/‚ƒJÚ¼X+\¨€aˆK’N\0I¬QBjzØ£Žô%Y˜¤®rC"£`Ò§i³$K›ã#9BÐhP=QPžT Á~ AÒH /PVZQg$<âH#ad–XcYE›l´Yi¥…•Eƒ1"]sÝåYT&]eþ‚@Øy (öc A–Ø%º|v¡A—A™fœ¥qFƒYàEÖx•†ZjcHÁˆsP=hF -TE¢lh`›n+Ì &o¾'œqÇuÐÁ"œ Är%‰´g;øI Dô ƒ_üT˜t:ôD ‚J@µc XŠ]CGrÈ!Š|çÍ(C±©#8—¡# 1èa4 CIÈÊÒ.…SŸ}£ØÏ–pW©(Ýäx 1nŽŒ£ #4Yé KyÄäþÇÜe`s¬£'¸‰­ˆAшHbÇ_[â裑ù‚ï@›ßÜiÅœ¤Ë5Cüâ?,¢q|Ò&üóRÛÀaCu_³)kÑ'HWº°ð‰X?XQu#®Kõè{Öò †7¾aÏxÔÃëþ¨‡Ç.,¦ó_ìÎÖçhýŠ¢ÌÚØ1ãKÚÍÝÜyNŒJL”’íÑæìUàµ\`»òTòt „r¹Kâ þ¸K𠎆¿MuM^U^ ІŒDæQÁæ%\ÄøW©tUIÀd˜AL\¯Uj\˜@&äB €#Üž¤@„‚)8É}U!ØLéIDAÁÅ`)_0Ýó f,X¨Áͱá–À<_ãÙF LÐUŸõéÕn¤šöŵtŸ÷•Ĭ1Ý7äùýÐܤŸ •Ý8]ð  ìŸüÅ%ƃ?ðƒ×ÅC؉]0ÀŸ¾ÿ]ä€ßÄGé_¨ð È zÎg¹â!t…$à]ÞéÖGU .Òѵü]ðEü"0V€(l„ ’ Ú‹2.ã2ªþÓHž º`÷”ÆÏX ÆÈ\A Rpw…ÌèàARqÎn¡@ $Ž!ˆÈ $V ÁžìõAíÂPa'B)´B+˜Âì^ÍØŒÕÁdŒÄH“lÆ™¡C6Ÿ3’á¨EV$Æ•÷ÜË † GÖ!…Á©áaõ]ßfß_Ù‰x” äÇ}0Ç1ú%¢L¦Ý LÁÜ–Å@âÒÅß$Ò&ÚŸ?h¢ÿí_Aq}„bg‰“žû‘ÝR¾Í*‚޶±@GmÀx àÝéHàÞå¢`mÓ6ù–H«uÂt¬exÀ0.&— À2Ö%2ºþ [Œ`Dî% žF4þ¥™EdBZA6jãp#p8ÆL!8Ú$•Q`øÀ¬#àB&h@Ä#ýÚd‚}Ñž$<xB)ô£?ú#@ dÍtœÑà\6&$C> Ì9äCB¤_.ŸN$óAdF2£XØqÚ[HâášTSI¦ÐppÀ eËÒ‘a…ÿ ÊL^çØduâ$v¦ŸÒõä$ ¥Pö?|Ãÿ½äQÖÓ¥âaÁ l´D~À§÷éŸÛL¥IX”AÂ|åì‘-âb –'€‚zB($ï€B(`BZ²¥xÀ,Ï ¼@½Ñ¥]f¨†"£Nuh f0þýåi0äf¦‰æ$æ7ÂŒ~9ÔWv“Hä@&pº½âU¦Ñ¬ °Ä'´6p‚(¬)¤¦‘ª¦°¦!¸f¦ N‰^0$En^© ^©Cº!åäe †HqŽ©qR G¤¤J^KžˆSèx"pgwúÉAô ü@úÉwÆß8txÚ_<íÓ«ÔJ­–®!EÞ+ë±:)7z£„A~‰¼¨‚j Ô@`eë6}Â'œ¦Û¾m?–«<Ìþ-ݦ«ºúc)„B’"B"Ô ¼j ¦ "«½b­E^éÔÊ¿..nlÀÚåÀçÏl -sǪ‰€rè(ID,LÎ)ÅâhžAÆúi ÌvþäŒÑX%âÓœJÛù%L®Š´…I´çåœâþ¹Ž±‹ËÆÊhõJWž›9ºÚ) ‚ò¢‚뜂)˜ê6Å‚–*)˜¸ m„’€ ÌÀÑbè­z)0­ø¦Ô–¯ùþjâ&î•V$Öjmlc×~í"t‘mÙN ü¡œmÚ²m(ÀíÛºB;´ÃÜbƒÝª«ÛzÉqÇ!,¼VAàÎkt”b-ìPäÍ¥/þwpúú«ã¢F†ç À@ ŸpHV“ Ð ÛÆå®%,,Ô‰|€cç–ÑÅÒéÜÔ w2Jžö_€®Ÿ0JüwÞéÒqìüU"%ŽƒyÚÍÕ [   ØîȞݞ8%ä8jSFâØ½N°´lŽÍÊ+oîÀ’eÑÖÑ)¤‚*ı§Û„BH Aªƒ‚«ó²ê%Hèl¯ gÒŠ¯!ŸÆù&r"{ðÔš¡EÞ«û&+brÁׂí!$Â~Ùïýæèý¡Xb+Û¾m(¿íݦæÛ’‚Uß:p¼V²rãcA£ìÁäë0².ër.ÿk—Šp†Þ€0³0›ðþ à2'3Ѐ g ÃÉZ²åpX€˜–vzÃ[3J±"ÝÔqvZlLÖ$!Ê_ >1?Ξ„ÄíûéÖñn[qä¼ lñ®}V8ÍN§‚Ûï Áq8ȱ£Â)„(øÖu‚·â,¸–€¬no÷ò!/­(²FŸï.·!EîAûëûrcŠÂY³æ&;@/àìDgß­-Û¶-Ï4jp(P¦*/+»ò+OAh­áÞ²çò.5u.{Z$‘ <51Gõ1+323³ \nœÄɪYÛS2Ý$Ê/ñ8€ƒ ´X6'±Åzþé9þ*‡ÝÉóíþßtu(ŽüñH¨‡{šb¤N„Vuj@»b­*K,´* ôë¯Cï1ÎZo«Nô ²÷~ïEëêFvùJí0²Gƒ4$c“tbR²%§4´Þ/?]%µ¢mŠeL—êÿÒ´n—Â'ìí*ƒ£¼.«OõÛ²Ní$·r/7s/wGOm„0j4õSW7TKµ0SuU7³_euœ|€ ¤— ü°ÖÛ8œ®Yƒ5qu&bÝ%Çnâ\‹DHdN]_^sQÿi[îÔ_G,TZqK®Ç²àŽvNa›€7‰ÇB84¶AÓqd;™–*ÎþžÂ·†fkvÒ†ogŸ†¸ˆxFƒ6hËr{°G×rHô¤¨7žô%×/lW'ÓvmÃtLònŸf©~‚,ðo·rO_ÁOc¾7Qks?9”¶“K¹û*¦‘¸ˆ—X·ucwvk·UcµwG¬ä]“·61Ç‚[Ëä°½ù鎮žž.'®ç½yñÉ…Šßì®»žËçáóx¯,ãèx_a5zìl@7‰‚KÀ±*HøA³ïüoM6«Š+¸†B h/÷"­Ew¶‰Ÿúˆ£8hGyr7òD^mÖ«jC°ü2³®tÙš£¬\‹Ž–m÷xç6þ܆ÛvB:¶«ƒàÎë·-ßòO9«O{”§où¦A º‰sy—c·v/3wyV#‡8ÑYëyƒ'6ópÛéÞiߤL. šï y7 ÿÁ‚G÷Ÿ7ƒŸÿ·_»'¤¶Žï&:~„ÙÝ´b~HºëTz„O¸ófºds:Ðâv `E2®b4‰k»ÈŸ¸ªk4µ«/ûÆúûNÁ²z#Ø.‚¢¹èèì¬$ñ¯¯ó8Û‚ÂÎ;ϳ­ì-§°²7Ϋ”*ù½ µ´S;Ó³:tŸïÈs{u{;˜‡»¸ŸˆŸàÐt}qØå»Û©LÞ)éÞäéΰ½þó53Ýúzy"À ¶1*s8¶ÑG,Œq£·N„ÿn¤ÚD5ßÄ4±ô¥[¼'‹å…ã6(œmä0ÀA||‡¢º–¼¶—¼ùÖ苾ØÓ7²-·/_Á+skÃü³6ÀÌãøìༀ~²Ï»X A:Ö’ß‚÷t,#=³áÒ7=ò7·Ô&rÔK=P=U‡y†]ýpGdý»¹œóßWSì á©¿Çîu¶³;3Š$nbü úÝË}`›îæ}ÛLô=ðzÓ(@xâ¾ï aᄤ¿1@¨ 70œ*ƒªP™ò$ÄDCB v’Ø TEPE‰¶þQXG8d@†I¦LI“%ݤLYFeK—)ãÄ”9Sf›7qæ´³ÓΜž>ç#g¨œ5jö¨AƒKÓ.T RáRL˜E‡!b€_Á† ›ì³5 ¦M;‘m[¶Bt,a‚èТEa´T©Be •)M±,UãÇÏ9D…&湘q㟉! =LSæK•l0gÆ|ƒó 8<ƒ† !*…±šuk× 8¬î A‡Ž;pïèñc"“¼÷6‰ÜÇ‘ÿð \8qãÇ{D¿»‡o"Á¿}·]\p"Òm×¶Hy"£Ð§OO$÷µÝ9¿ý]}xñÞqO5jHþû £R ‡;îh?O‚H0AOD0Àb9(TBé„!‡ŠÈ­Œ6â¨#a>ID’T:‰%ËZŠ#¥œXlÑE›[,²¡Ô@J)¦°èbЍ¤Ò" C®Êj ®Ä*r,²20«!jh"´Ô²P-µâš+FîÊ‹ ¾üº04+lc,sFŸx:sÊbB1%Íàäl´9I3 5Õ^Ës5bã  L¾ vûM¸àò(9Ü€‚·ÞÊ;Ô›DÅ­‡òž³ÔºQ‚0¸Q¾‹.<ñ¤3O=N…uˆÜsïÒQÄy'žYiÅo»ý@éÇ_Å!Wƒ`½TRþ‰%BƒPAå”…Ç„h‹Á?ü°GjéD7]RqÅÉu±L%3ÊFsܪ*¸¨ H¬YB‚ŒÌ¬²ÌR²¡&8`x` DI¤®0ÀÐ+ª)¼lj©= ;L±s1Θ± ØlEÌÚYd6ä¤S´ÒNKMO=ùd-:øàƒ *è ~0ôPç2ÝA¹ßˆÀ-çߘ®¸é†.o:ݪ+UI‰XUÔo§ÑóÆSo@ ‚jäãTœZɾuÏ ¾úØ®Ïp†UÐcG9Yd=EO¢ÕÀo N˜Ö¡:á˜l;Âe[nA×q•Þ(Wò›þ4Þ¸¨£üP 0£â"^«‚DØÞºÒ×H$“ìwšT}ƒ†6È ¹>da0ÀØ2ª+ºL5 »¸òá1¶)¦›*ûXä64+Ùä:SÆså<[AµØ@°þƒÛ–“Ô¹G½îo¦³ŽhâeÔ¼ï¨#¯¼`$µ<©G­-º«³ÐÓ®ã[V²i•ŸQ (Aç¯Þqx´íp;±ŠÅ ŒÔíÔ´þ–AÀ€ƒ œ ‡80®q{ÉP˜ÂÈåd-t!-`CΆ3tŒd2w#§ìh [˜JUìˆDd¥^ÀW¼bº"¡I±Ë@X`°B$La·Ëþ xç»=1hâI ÁÆ0:ÆE*|ƒK–·<’…æy(»ÓôVÆ'9¶l5àžoòÐô=Ç7ÞøÆ8Æ‘)ó™ÇQB#B½‘>¦5Íi ÖTE5A¹V ¬U~¶Ã5©Í'V¬•8ÐÓüí*V d›;‚5À¹Gr›[F`9· i–€û› jx([!bœ [bƲPŒÅ¤!1™LbÀÐrCYCæ–²C.yw cÄ5шFd! €€ ž¨D±àë+ Ð Z)dÁ×¼–îÂ0Ïí*Y LÔ`1/~Q™ýôç?ªÌ.¦EÂLIÓ¸F“ÙÀ+Xþ0ðF8¶{{ª(k:ÀÝ„/“@¦œ?Ž#hB ¦yá°o‘Œ4`0²v(P‰Ê~—ÒÚ8ÈæxŒ#“üéAØèsOæg?ìå׿6T¦r•JJKçÕ…0Äu´<qYƒ pÀÖF|É-`¦D˜upáYaxVµ®U­Æ¤…@Ó”ÃàGœë¡ãU•0ìõ.¸ó‚nqKœ€œ 0ìa»Ñ'8±Nx&8Ñ @tás Û+Ãr×—¨t¡wÙCRôÉec™n5í “IC¡j,gêPÙÚIee §§Üœt}Šê^v™œF9ªR}\i¦þ¢³QS~~®whú*qܧõðÇu¯žŠr°ª'mJöAWÇâU¬–j ³ñÀu<€ˆ+§z!Á5„ƒÕÿƺì·«^ëâD4V7”•­-¬E¼Ö´3µè2JRØõ¾ôÐs®ðºðc\ƒ—@Áa‚Æ:ö P ?þA(¬xŘXÅ5œ!=à•š¹óÜ]ýÂY‰}6x^(2OäÚ¢†-¼‰0SØÚ5ÞÀ/x pàÐÏ ,z¶µ2knƨán¹ÆETÏróƒJá&Rǽt”[f?rÙéŽÒlsoàÔºØÅn<à!ŽGÞÝŽP=þ¹®0=É:o°Ø×õ‹ZSjÈ” -PÜ7ƒhûÛ_w ˜f4«ê ù­ËŒëƒ5ç”+@宭ưþ@Œ]°b˜ø°aE<â›ø)fñŠaábCœu5ާ ãÀ !)=­1 MjÓÚ‚ÚDã,dhä: ù #[2 :ÃF)f¨ò•m hTËBŽš6æEíV¥fF³ûÖŒSZ²;‰,•Öheç;ǃkQÃwþhMË€ÇzP8bq  °`Ѫ›/µ¤U‹\äªÌê~sé®þÒ„)ü´¨×Z •«\Ôµ¨öË©]L ïD25Š&`xÇþYëÖ€H‡k}ë¤ ×Ýõ‰}ýk(˜b/þ2±ßUç˜Bkb@›´Õ#ÌÁs†ìÖNk·mF8m&ÜÎ[”§ Q‰¢Û¶°@ææCîL‘yWÔBE>þqVvÞév{ +o$\àþ˜Ç¬ô¼¾üm¼dO|T^õÜ =Š®øç‘ŒÏm"'ð»:Ää™Þ4§Ý$Ì–¯œöµ·ýí]^v¯ÓÂì0l0Íçp”Ï~VLá,Ï)côè—Àb‰®ë]óš*Vº‹Yq_$£‚øÏu= ´BÙÉ[£CݯŸýº_9‚Õžþo‡¬3£YÁhÜX[ºOïz ° –ÆRØ­ÞVŠämÞ¬ð’K7Ä'Ïøáð4éR‚òf¥Î O» ’´¦“je­=Zl2ïTÐAFÐ=\ÇÜKíѪE"æ¦"$â:à?@4@õV/X/^/ÀÀÅŒØJŒ÷0 W®ýÀn†HËÔCjä³ü€bCùzÁf­él ±BLúXŒzÍú~í\l²¯’0ÜІ2Îï­Ô í0ìz!õ°¨-m¡öÎÊgÄyØ d@¦ ØH4îïdhKzöo¢üdy€â4€&@£t¦9úþΤÒghЦà€àÌúhøáuЧÉ<:P¨ðñxJ~°¦×f0)‘D0s…¢j• HAÔÂÎÆV°Ñb°-> dÃîJ X }0`€„È`SH­Œ0o¸±½±•0÷î0ì|Ïh!®É~A 9 …®B¬èkúÄ0鮯éX|á~á CxR«Ç‘ ÷ð ýñ]HQ…ÖNd ÿ1§G_†¬G6V#2 RBq{æg‚ƒÍ‘äçÌ®§P1»Ä«‘nªðP»Ä‹Ï®Sô§§r1[åIp2B‚ö&ªþ2"ˆÑâ`p-ªÅD{ø¤<ÀJÀ4Zà*[`©1ö®1³QVî»ÑÈÒxÁ½Q ’ìbˆ´˜Éb™ ­~at6½ë1 {­ÈÅ^¡éVtaü‘ëˆ1¾n-Ûï õ0!Á&³2Rkï+³…1—g"ŸÌ"Oãzæè¢0r¢² Bqå3Aípñ>ûÐõМ!²2ÑóBÑ“UN37…˜¡æ¤ÉæÄ:ò412$!å|< ¤ %ßJÊgxëh¢‚6_R%¯õ-!ϧ\%ñ )R…?†³8‰sA`éTöÆ,ÀDvœó!LÀô:*«ÓF€²s;»s+Áó ’Ckás¡LÍôL͔̒Òóp ß³=åô u÷è3ü1v?ó3èKùó誯úô±s8á0ÏÒ=Å®ìæôQ´='SB)õÌS,Ëþ²yaå84É1Ú®"E³ôï5 ñ#­'UUuUYuUg|R26ÿ.;¾áEÓ¬Q~@:€`ÍâáQq§nU¶CßhüMãLödM˹˜X¹•]ù•a–K€ð†»ç¸nXSÄzµ&¿!xv7’‰%å‘~À~êg’š–T 6=¦¦D ª¬Xk“U:–³by›¹–e@f€KÝ׌ÍOÎÀÆ´„í·ß¸oåø,ïõ’òc/•ôøB-”cÖÿ˜`×°`  Z×¹r-÷ry‚%€ÛôžñÙ_7˜ž7ÖLCø>Ý9Qñ·L#–rA”Û®dMeJ f¸›[ù›]ú¥a:¦eZTyöºW9I8Ìþ„FÌt#gœ‹—ëø¡ºêX Ðzw£ywŠ—Úˆ­vÄ '½i'Iª_ê™G¡`º¦«8¬i`¦Éº¬a:Œ·sœO" b¢œUâxÔ*Ezí¶£íÚ£u!ž76€'š¢çùsëÕ2ÿb9šðò›îëÂ鉀p±Q%ءϰ?—2ýÚM+ùŽ3š€ûù®ßžË”IzHÜ@ã&zRZ¥YÚ¬i›¬gà¶¿Y¨ì›Y@§“Øh 09Ê#x#gzx¤ˆu§ÚŒi°ª:jrµyó`ºŸ¹¹˜V’tÀ¹‰§{rœo;¼išœñi þ4jû›Ã{½Ù»½ÃxŒÉ¹ Ø:&Ò ¾ç{&ÎyÖx®sánÛùrܲÛYoçuQïØ^;ÛMù23”E˜Ãö1Â%œ¡3a&! %|à 3„ùV°+3Õ4Áú¢ÿ-ù›°IÛ=ùL[w”™çÀ­dànÊL#¥_¹¬Ý{Çy|½iÀÇÝ›XR:êPzºRL²Vatïœ ¹Ûì— ðQ€ú§‹¸Êø©‰98’˜¹Ùʵú¦;ràÇy\¶V ÇÑ<Ío›¡àû}íûÍáœ&ò»œ®ß8Àñœ¡ÝØ´3_ ×sûšÄ3ÛÄóÄ2~B³A ¡Ñ¡¡ þ½¤!ÆÁ¤¡á¡ÑµA]Ñ1tƒûÖB7–ÄI—p)¹ÎAº°ï<À;šÏGú+ß@þ$’;UØU@K[z¦yœ¡|ý×=ØŠ„Øg Ôg§'åÈ—|ͼÁwšV˘­Üg|ÆË‹Ûˆóà™±CË!}0W«|ª½»ŠýÜÑ=Ýսɨ×$àüÝã¼&ìÀ…TÎ^ë–Õó<ßáØn)X!×óåÁÉ4MÅ´p“!¸¡ºOú âûà (^ ,^ (½.^ (þ $^¾~¾äÕsØ<ãÙ³A”³E„Ý™ø”¡|ßù=”þeÕhÉBCD¡‡¶Ý{݉~Ýc ¸­#Ì ©ˆ#;Œ5Û“^R&%ʱé§Û˯fÛ§øªµ<ž¬ÉÂÛù,¾¾èÍþìŠ3Èx­áýÍ×` ê¿ë€ ì=çú0ñ=ßó|Ïó:úÑßÿàýUàëWç8_Ž  ™¡ñ«üº â¡®é áòŸ€ºc$áòµ©úŠâ/ù_.=àáÕ³'–b`e¾Õõ^ÏK»ïy¡S‘dëï3œ,èÇZ¦w틞É~É^àè—¼·ŠCÌx¸Û£üÚ&̧º;Q”¿‡™ú¯ü¶þª™4`ËZ þ«<K¹¤Ñ?ýÕýÙ_íIÂÝÛÞí #îk‚îõ›Îù›Õk~öi?çûŸ¢–ÀY³l‡ Í6Z´ˆÃùòÍÔ«[¿~™íeº§ùžæŒø3àË_>Nœ:g ìU5âØ¶kë³åô6/­kmüÿB½8ó‹CYEÑCYmePGs€4RI&¥¤#‰²ÄAÑI'Ÿ€òÉ'¥ŒHb‰¦¹h\^Õ=Ìè#,[ðäéoÊs’ 'xÑK/dpÁv\àþÁ+Õ0-̾CƒeîÓÉuòR™Û¡ :4¤!jD‡'ŠM u©TnvŒ<¼n^™a 1vƒy)q‰Ll¢ŸÅ(6nQ¼;®ˆÅ+\q¢²wª ž¬cÐä³O=Êêhrðħ«” L`°¾ $R‘^ûÚ#?ÚŠ‘m(g;É¥5¾Ù1{û< E~Ñ ¤‰¤‹ìDŒœbŒ•¢1–Y¹ˆTì9*‡ î–ºÔeÆ€Ô_þ2˜±æäZ`Ld Œ:æ¬ê·8>©Ž5x¢æ8zã=Aç`±qö›Xu­lmë¼UÅñ´s®tõâʪg=£q¤#áˆ=ëÙF9¨á¡’&ïÀ…8¡x¬’aþ(M|€¬Â®Z„%\£ÀÚFy¬d}t´®€Åq’rÁ’[Ðâð: U²2C‹‹Ú½Év·™DN dÏ…8#´*F1øJŒ¨Ä2gµ HŠê†£"uºÔí%0Ꜩ6fLÕqk9± Þ6àÀ3K˜4­é¨©¶µj[™zâ†t‚Yà”§¼Ánf¨ªÀÊQ³ÃßœrE“œäóê¸]Ò„0Õq3—x,>ú‰‡~ö´O9x ESš¾æþ¼oZ§µøÎ.ê|W‹hDKZÒˆFeÕánŠ`Ña¥ƒ!ñD)ŠQŽ‚o»ÿ˜ÃT×Ï'=¡)X²|Pc‰×™ öo´&"Q+\ÑôãÚöûZ)šÀ„ü¥¶úUdÚ^ûtדw¿¶ |çsðwìÆuÔ7}•de1b~@Ƕ’e#` tÀ7Wp•WyQPy——y†ÁyžçLK4{±7zvÆrvKmÀ'tR:Cm@·”ƒ·„KI¤8ü†Uü&„CøxEh„Gˆ„I¨„KÈ„Mˆ„"Á§.ç_¼§tW¨tÖûuE[Xj)5‡ K@†K Š |\€oþºÆ@5\ >·s8‡Õ·Zا~`¿S·ƒtçv*¶ÅbŠÔ5ò£ ííÐvó N¨…c«eIই´ €¬¤wý´†sK³up(‡tt×nlƒu%†É65Kw¨ea Uð{ýEyQR ŒÂfWŒP‚›×y 'NJôhJ8„Ñ(@ˆK/øûæ\u@§7'ó;ŽB¸8/8åØoNˆŽé¨Žëx„Px¹G…üsªfjJ‡jªVJ–då#Q3†0á£Ðù³`À|z#]Pq8‡+âuXRk(nFRþ@žÒaÞç=h€$H´˜Tƒ~‰¸ˆV³~51"¤€Çb, ¶wɶ‰Ï’{h 2[éañKsJÇ1ùвÂ+^'>àLp¹¸‹Ö_Á8ŒS9•—gpff‚ËØB)(/æ„Ò¸æ¸oãøƒüŽ9(ƒÁm`Ki —ûæäH–DÈŽw‰—èH{É—}I–FSY$Võ¸ZÀs‰©yjI6–‡b¸À7a §0 fÈ"j¸<3$Ñ‘xA™‹¨vXðZwW3£=i ;¹‘Ä׈@QI5›%’‹ÈîÓb"þò!\Ã~ŸÐ BÐ>@†ùw‰ZCašGñZÆP“¿ Š€ó‡Þˆ~¤+ y|¢Ùé"ÍçFyLpÐ òR§Õ”Zð”&•T™Ãò‰• ÷*ð:šƒ*ØfLX—ÿ¹8טp Žr¦—eI—ÿ)–yé éè—*¡{ùŽI…] a…ij왘=çs<‡˜bÀ˜©æÚ¹l•‰ž™©"aàz¶p Qš*!5µù’Aá\@wzpJ?ÆšŽõ#ÃV”&A~aH›È™‰M™àˆ)Æ>íã>žÅUª,ðY…p¤HŠZA¡‹whe)¬t þÔy‘¾S¶>º‚lʆœ´©?.âáb €šGÉ pžÉ‚‰¨¥‹JŸZJ¨…J•V‰ŒÈ8L*pŸ–Ñ•14/‰¶Ž *޹t  —ÍÕ™2˜Žu° uùxûV„yƒ—уªaä„òxy3*¡w «³z{©*˜ûõ˜ª¢Z|É—|C‘˜ÓÇ¡çs¢‚’˜˜éuªÊ` áù4Œàueh‹šØ"T Ez«43Ë£Îeóæ¦FФIZ_ð^Àf 𤆔*fH;`fp|À_Ðr®É¹gSuj ªä7Hb37ó}…[P¤5šþYe˜œ¹zÐW¿` ‚ Ó:5 À}Z ºžZ0•ZP¨'«¥ŸR`•ˆÚŠêZêŒÐµª®Š³yÓÓ¨KØø³€*$ÑEk*¶°eA ´™ò\np)>ƒ79+µSKµ9›ªWË6Uû °¡´*«¸¶`ëµt€«TèWÀ«½Àʶl Z¬+Qò+:J‰†bТÄà ×° ×ð ݱa€>)žà Op­û犩édäö­üä}wšÇf¬éN`‹Ê _ Ép ×à Ç@b!™ˆ ²b@¸º¿€ }@£u™{­eãÏþ²¾e°dÛóI€!K£pº)Ð žàÊZ]ð¶ K€k Ð\°Šð: Ê«¹Lé”$+ìI¨sK¾s‹²-k•/ëTð›Q³E•„Ô£µ® µ;û\û†*ù«*\Á¿ýK`ú{4M[¿>3¿lÀ̵}9«ƒÀÀa;  ÁÌÀƒ¯e‹¶g«jb¢kÛ¶b‡¬‹·ˆ ¬Øû21£pp¸ K¬Ã× àaä‰}z"Êš.£P¹Ô ®¤b ›+`H­™u) Ë»Ë*° ¬° ˜€ ¥° ¸Pºðšˆ«Kº° Ÿ€ þ«° ×€ _@¸âž Oð§ú#°<š\ Q.¼PfÄ'QbÊ’B "¦` OÌjX ¾  0¬ ¾p t`x@C0ždøÁ†Àž$k²ZZ¾›l¾…оγì«ï«KGˆª¬7lu@ìÀCë¿Ñ_Ñ¿¯¼ϥʞ‰Ê»<¿ t0ÁÃÁÅl̬¯yÁôØ¡l{†Ï|†bÂʧÁÓ<×…Ap(™#b ­ 8hÁ ¾ 5œT#¤,¥`Z#>\§[‘ìR€Zq§Ei¹É–Y{šžå@€f€ TŒ)àMà Ÿ þÅÙ, Ð;°…Ðx ˜ > ˜° ×@Ž< ¦€ž­0 Ú,ò<ÇkÇp¡ò¦W`¹IL5`’§5Èz` `œš 5à!ŒR£ ÊwɘÉäk­eH¾*›?À².«¾- ³ûù•ýY„W‹ÊL ºdËË%c- µÀ¿_M ¸<À¼ÌÖS»—Á ×q ×ÃÌÀÇ`ÌwmÌ„ÀÀúšÌX@;—˜lÛÏŒœ…Œ|"jj$ú3 ¡àÍî6¥@Æ ]‡>}ª,’ÇFš{è 䆰6“ 05l8‹'¦ˆØ! ò (€1AÛDþà·Û}Û° ÒB 6'2I{Xæd~#Äœ@ŠPV¹OcbTƒQ5žc³_ð¿À$–p ²5Õ ¥` £`W( ™†0·KÞN½¤- ³1«IôyW ¿F¨Õ<Àý†Öûˈ3ûÑS¬BfM+Ž*|µêÑ€ àY†4mÍÖ€ ×rM×Çp Ò€×N žáLzÍ×|à×ÝÌ%ì…Y·MÉ@AÍ$jM’’=?ÈRÎ| Ú #]‰Æ‰Z¹ nvP“[8÷Ü .m”,‘Yè—Q¼Ù›b6¸0¾;ÈU.ÒR­@8íã»[Üþ¥m3û¡ÜªÍ+7üuëÔ‘„‹Àư ™P' Ý!òˆ#Ý΢`ö˜šŒ!K¹­¹ÖªÞ*ÐÑÞZq͘XÕõ]µ6‡e ®àv <Èeév:àž aK +òßY+½0 ‘éQvéAé—"é é¯ë±.ë³.ëáu]á~á®áÕ á> þá">âÉw†£p ¨Ñf¸¢zëVÀŽýØu®ãÙÖ À€C ôó~•Xcðü@>Ú`¾„Ôl†ÔYL®H¿YíñãÛX>c•èÙ]ätl.ö,æÑªzL¸¬ ¥~<"?Áþæ¸ðÓˆ”HÒZóS p}åÝçNÀÄ Üèê蛕PuŸ/x;ü9ßêµÔCë¯ÞêY©Žé§^°ÉYïñéxW‘ŸNê²` Ä5à.ßqpJ+ŸòEoô°nësMá»Î뿞áÖõQo ÞáÎÄŽÍ%|†~ÞA §P?ª ¸*"Â^Ó.X³Ý/öí36ô~!żñ윾UîÇÍOû!láIÊÆÅí¾ˆ ¿QÚýäMïuï÷ž™p\÷ÆP ulÇÿ.ÈîPŠH@Ðñ,À‚¯5&ùðÞþ~¶Z`ÞdØ9\"ž€Ðd…²fþPè1ðñ!?ޤLß'Gé neà—ó´² 2Ÿ îA7="²d­”P¾à#?â>ÿóa\Çåi`+/é¼ïý*ŸôPáLÁNoþR/õæ þSO >ÞÁÅ~왵]ÿõ¨P?©ð©%€‹5„tŠT)„­\-”×PÞBˆ®ZM¤‘b)L1 ÃeK—=€l9óµK'”)wñúe‹Øž.[¸€Y”ˆ 9sfØÐÓ„ ;uúT´(B¤¥(*ŒØÔiÓV¦žl 棑½JîJ©’e/b~bÎ\tÑ’:yš0Q£ kÛºHT¨¤þ-.…#%‹¡BKdø)©'K–H($Ë<"Ĉ¡E‹ؼaÓÙ³Р㌎#ÇôiÓ~T¯fÝÐkØ€âØ!VŒØíbÅíæ½{Y²d¶jõr–-›¯\»”ŸìÚ|y®_Ù´9³e+Yod¹µç&f' Aáco]ÞüùÕ¯­tLÚ4øñåO«Vß¾}kùõï·fÝÿÿÌ¡†B„ùðbA/ÄpÐÁF"TdÂ%œÐ!ˆ D9…©V|XâF²ˆ€x¨ PH9H)†üqÑ¡§âp)O–Øh@‰$“šãd¥–^+ FL'µ| ¨¡†2*)¤ôþrÅ!*ŠQ¢‰¤BäE¬ê+c´RÎG]¾ k,šADä©§ PÈ`Î X((¢>Á+J§(,Ck¢š”“`‰,ýá‡É(³,³Í<û,4ÒJ3m ÔÐC/<ñäÀM;ìYæÔß„#.mŽKîš”6‘uÖYSºfè¤s¦[NÅn;îFO@ü i«¡v?t¬•ÀlÓ±][t¸%oÁ—ܤÝi] !ª¹ tPž‡{ñMqßRüÇe‚eTa„O‡œuÎ)§œsÂ?§òã1ÿüþxȯGüïËYgrÀÙÍ’ÛZR¨ò}èK ûÜ÷>ræ 040‚Z‚ºÖ5Q¨ A,ž¼åa(ÎSѾPá/*íeFØK˜)¾p|”þ£$e)MJQ‚ÒÜÉ›~r¿”eOUkÇ¿\40Œ“­HE*QyJ`’Ò—à +GV² HÍIúkECp©ËR! L(P!¬M¤BH Yø¾0†3´Ü2…º©a5<ôƒéÜ DP ±6¹ÁªŒ1‹‘|FGrh˜ h¨1ƒTï £1H\ã’…ÒÅ‚zMò.Œ ‰HD^óbz(wyž°RV"äÁÞGKC¡é¢xˆ*Z؈ý@Œ^ðâgšÈD&P‚«_$#,zèYb|לì€àà?úÁô$«wâ«Êœžl"aêÞH*þHí¡D0û*"ùÅr4ñøÇŸÚj¯u‚ÏrWüÀt·;?VI2½+“«úöº½¦2£t"Þ‹qÌc$óB$ËðÞæÔ÷¾ç †_6àÄ•éé›dœ´ o¸ñ€ZÑÌg>óÓ\ KÈJ² œ6¾Æ/”·Ú‘MOєǑå.ï³í¨slTæxx!Tô~>æ<\‹î¹b~®< ÕÀ½¨ ”wô¤;‘‚¸‹»p:Rð„! "˜„©…Qðb‚Dè’Qƒ9;±{<`xˆxÀl8±d0†9`;lc„³X0¼qè<~`p˜@&­*·`Cþ ìlÀ©‹…S¸ºNȈ ƒÙ°;-]†ax‡ Á ™GDKJ¸M˜>éÐhÀ­£89í°9ð¾ï[£ð[¹‹Z®:¿ó»jˆÉ *jH¿Ûa®øó£ž 9—ûó¿`O0…Sðåù?C*‘­BN“¯P‚x”|‚'ðhT.1ÂPë…ëÀqxA»ëÀ_þ0;@A.ȶ5qÁº«;$ñj%qc ”É¿ã)|aFd@ô†Q ‚©(Â-øˆ¯ë…^@ªoóF»Û‡D±µ Èsd„ ‘p`‡uä‡qø"ظ« dÚ«X"½R+…O0’á«P,ÅP”,HAµ¡ÃȲ¡;ÌC=äCÓ4¨ @¬ŽÑ⧆Cœã‹ŽD\K€¾åsÄæC Ä2©œàÀ¾ìÛ­ÝМ}ÅQüœbH99ª{ˆ¹¸bŰ–‰Ø‘Â9[¤¿\ Œ¨^Ü€I ‚'€)Ñ £S¦,ˆOðªJ …¢è! 4ÈG}”Ät›þþâY†ÍŠ´»€ézà—€‰)¨‚q¡„u È»c‡qð†Œ¼*qÛ»y¤GÔ+ ÄÇlÀIHL-˜‚/c¸\:p̺ë‡Êì_(A@€‰.hÏͺM xKÓŒšÔ|’£0Š xšµ8@Õ[¡•‚–Œ”˨·%Ã7ÉšÉ~ýšü=ÜÃÍ„2ÐÉÝ£„k•lÊD¼††»("3£¬8¤d>¥”ÄMÐèp†«…ƒch98ëÄíãŽ!ÊÊÐÜ(Å=+?˜C?ôKk‰–[.Ù)E³®ž Hÿ#‘ð´džc‚@¯¿äþËOÌ€h€•€èÁIÈ¡º:¸…^À…!hÀÝ<‡o쟠‡[ > «r`‡~ÍÑ$‚/œ1êÔ;º€¥4Œ¥¡ fÜÒIˆª;°ZÀ8ÐMÞ¼Òþékš[¸ƒ©Òu”AIx$èQn› Ž„°4 ÌÔó`j‚¶àP!Å(›‘×ûNðœ=;Ô”2Ïôü7=øTÌz'!""cØ [˜Vé§W©ÏÔ 0ÄÙMXÄJ0Êþ´8¥ü€¦ÔY0P3†dh†ÝÄfXP2Úι³bx PŒƒ4f @¸ ¿tøJ@ûʹ’Åtˆm%¿´þì%ÑF8„ É®Å8Ñ]&hŒa4:I:vS‚ØËì„È< 2×H*–ìÁ<ÈaX8‚'˜„ݬ‡&Sk˜†þ¨ÈsÄ\Œ@åRµ7ºà»ûa’%©òâÑ6ôתþ;xPñØ ; ¢†ÚïØ™Õ‰#×ñʘëVÛ*@Å9Ê­\ž#ˆ”—\„bjd„YÉÏÍKƒÑŒ±)Ђ0(‹ðM<à½/k¼‚3*êÝÍÛÍÛuÒ»»È¡’‚‘ ãð%WäÞá­Ød*/0ºdbž ‘9Ѳ¡Æ2v])Pãlä’5YÊtR~¨‡o<¸ƒ³µE`„"ION¼.©ÈÙ«Ò;!7ä}ßAª”låûe¡FÑß³áßþIÒHƒ `ª`4ÀDûå+À=PÏ&†N¸0;¾®H-Yø…»…:˜… &è«XNmþ6‚( Pp1ç5Ø·8 SY†êxfP†^88íãÛ` Å6ÎÉáyÚaí †c°;p÷À ]ÜT4ƒ#Ü%þ£žq%×¶àIQ kšw…0 0ˆ3ð‚*˜‰0ø]àå’ûÒØý*Ò[€ƒ ^tãHžÓnü†ox?j Þé‡Áûi jo°i¢þq jPêQâé.j(êP"Ú-Ù8Å]~\¸:ðs|±0ædNæU“‚Qž1¬dŽŽ€F1¶*·~k·n¹– )PZZnZLÏ4H'©Ýƒöea.àOlþõôƒ¾ÙZÖ†ÓJ­ÿ:»]¥…8(ƒ4pƒ7¸ÈKè€ P€"0mþì€x€€(ˆ‚çB?ˆcæÚ^xhx†gزfðDÛþœ×àÖç†âçc â è îÐÈ 4sˆãÎ#„Ž?]Ë[$Cžén„E1{w%‘°‚èB0¯^ó¾n0ƒ* ‚«è›ë…øQØü¤ªþ‡+µÈnÌoýÞoþîoÿþïÝüoçïIÒ6öF”½o\pµ›ƒk“ ‘ãóƒŽà*˜‚((k³fÞ9éè, )’¢ðU†k¹–ëºÖß epvZ;Üþ먕ڪÅà.¨qÿ=ðe4ØÃÕnmv€b!g-’Y¨ƒ48ƒ3g6¸HÎölmV‚$(€Q>í(˜‚çÂ@;@ÜZ¢%"Ð0Ú[ÍÕxÚí3êmßÞaŽnâæ³˜ƒ9tKò“\%^h&¶®Eph Oo.tB¥‹ ¨X¨‰ HÚèbo*©§pUó*¸ gã…ø6ðŸÌІ`õ«͘Mõ˜„Ix‚`€@¡êQ†©CuU_õÍu]Ÿu©öôn¬Èº«\ð…_ PDA‡Lo0tõ¦HÇpRFôeµö0‘þ)’*qm/ñº^dɰ W6Èë¸IsçkOEƒ`®Úo÷×8A˜ S £0û'”r"×Õ7(ƒC»C¸P)ïl*·r#`€Q®ëÓ~.:ˆƒº…g0Éêè4Ù\{N4Êç7‡óc •«ÐåÆ#"V®ÇÍstð¨Qb? ×õ悚×9Yš ¢ë*˜‚ ú ¿vkç‚fïugL_=­ ^_ïFP?a¸­¦ußÌ:i’c q‚°4&A‘¦¶N‚— ñä’fk ·v/Ç4談ƒ3‚< jÞ\Gxö ±¶HþGú|Hwöè"ëhgHZk‡./×zIßöFéöº¶‚Òwþçq÷ßr?÷Ç,uGvwwÒ·ñç8Ù ×vÔâ !—-]e2ïè:íÒnƒW€)ÿì$Xø?uCˆGí+XЧ…Z`"Û²>0ºœbíÛÎ*×(yé.\bju¹ÅU#æ($Þ™§ù×¹©.qñ‚)_í¦è•ìQ¹Fé .ÇwvÁOú-pöGl “d@Y€Ø±<“¼7n!»qæ¤Ù2ægO—.[¨Tá&L˜E‡>"BÄdI<„éÔéËP¥^Âl%sæLS¦þž, ™(ÑGCaÀháBeKE5rˆë…ëÇ@‚¿)\(u˜.^¿z#6gžŠ[¾ná"ö"Ø)S¨ ­REK–,Þ¾mû“ Q,ví^É;E ß¾~ûš±bᆷP¡‚Í6ŽÙ¸)#9 å5–Õ`F“WgÎ?{5+z h»{űclV/g²®éâÄjíMœ4ɺAÆJÑQ¢8p@ EŠIžÄˆK–Hh+å·•4nŽÍr¦mwîÚ¢Ùšµl²òÅΣO¯~=ûöè“& WµúÕ¬¡C—n?ÿtæú¨Ž€êbÆ€æ‡5ÔBÈ |@!„^PX¡þ…Vq!iœíˆ‡qF¡#rT"`ÐeÖ]qÖWh½8ÅX ±‡sÐbË/¿ð²‹.94“”Tßs•-v¨ÑÕiÄ‘G‡ˆ](Ô€’J,ÂL_ÆDSMO0È!ŒâSPhQÑ…jÌAŒŽ¾ÙÔE~³8ßS•/WcÇVh`aX‡¾¸bC}e‰HWE{5‡kœqF^›þå—`‚æb‡)ÆØclH6e«ª¡)öY‹f1z‘h²¢á‡qcK-®]ÉlµÑ¦‰&ºñ…Z|EЀqÅ=k\rFqtÒQ—F³ÔÍ6Ùt·þÍwÉÌ’Ìxå!㞺륻n1ðIsÇ4öá—€ÿØß€åPA9åøï¿æ,È ƒ"|¡Ân!cE4z1ðÁçázT¨ŠbQØÅŒwê±^2®H£kàh‹-Îø² l™0e§AÞ ´ç0¸üâŒ-ZQ´h£y”ˆH ÁY¦´Ò' ¸f)bÊäŠÔQ›²²HkRArØ!ç/¾ÈÂA@ÜIóž|j¢K.Võb -vÈÁUȈõYÈ^5*–ß\T¤ÇsØA‹á´ÔGihš×§}}ya£VjcE–ªdgŒ!Øh k¬]ЊwYf±˜kªeþ÷š&Ã{»ý¶¬ÒR›qÐ"—Üν5]VœQG¹Údó ¸ÝiãL¹çšçîºèR=zÈÀ‹Ë4óÞWï½ùî' :ÿªSŽ¿ŠÏ¯Á#,áÂï{áæ›sP¬Œý÷+Sq zð1:gh¨Á˜QèBg=Ѐ•Ê‘-zÁ£\øH9øÙB„')ÁÀE.v´3]¡ÁgTˆ’GªD4£™i[úDÓ¾$&©Á0†­ "x¢5®u zˆ“Êx$‹ 6mD0ÈA€ñ:]ì"R1覆=jt ¬Ñ¸âÿéဠFŽzá _𢵘EǸ3D.’ƒåþpЂ,ærŽÉ\ÆÐ¹1dª€¢‹•‹ÕµÞô±k+ºœâp‹ì@ðu³!Ö&p³ÞHÁ-½£–vWœãLÒZoquÊP‡_ùÎX^óT½vI¯=Õ[e»Ê¯ùpÏÞã¾ô•¾™`¸˜Áñ ö¹~ñó„:Ðï~cûâŸ~a¿¬#bÓá5?Ìa€  nT¸.ö‚¹€`l4‘‰ žÍ‚D­ò‹ÙÁ!„ ©Ä„#4EÛ€ P’–|L3‘Z;äCV­†YCÑ‹r8899Pœº8gÕ)Š×q‰»àÅŸâÖÄ9\Šzà¨þyM]¡ô*ýƒ ÎcŒdx±e»Ø3ÅHÆ8Ô1SjŒÜ\ÀFÊ)&Ž!êhG<æt{üŒYüȦŒ¨E4]CݺiÖð"6°cÅ*Š¥ 6Œ08´Žs„#LÒË9Žï #à ¯ oØ‘¯á‹\d\ÍëÅ,šAë¥òz¬,º^©=zÙ‹–ýÉOÀÐ' 3àa_åãeƒØÌöY˜ÇôŽa?f¶ì¢µ«3“aZc µ\<†áì`MK¶ ›ÊzÎ!QXÂ:g(øƒ! !š˜)Gߨ­j(õš>õi4hIi pa+\!yøÃו¡LjþC†^¤ 5ŠSRx4S]Hp?èÁos \ÝjômW‰›1æf©‰T±¤³u-1ú›•Ô¦¦;’©8Î/Ú4q85êQ|TQJ18À©fG;–!SIUêèHW«†MÁojñˆÏ"È\•³ð….´J›UtÕ6šh "@€Þa’­IØ1×Ú»#lÒ‚qƒ,Ì;Zš’ÒyæBW`ÕCØ'–{÷IÐ~̯¡£|*Pd„3”ƒ_Ž,eäËË¢aüóý°óÙ/8£-ž)3wäŒ;+ö*³k[ÛýöwÏ…à5v¡[am"ŠVô ý6wÉÝÂZ:bOþ¢57FÛ€?WЗT÷ºÙÝ®+Ä”Ð3-EŒ2yw$Î™ÞÆœ‹Ö„mà;Sù*Ins{mlÆÚ6wvÆŽÆ6SZX-®JÉøÅEæ¨ >* <ª”Ê1Du ư9 0Š||Ò‹FÈ…k!ÝZ q¦:#4¬Ž5-Fô&`\Mà  Àq€Vµö˜Ç”4Î$‘NZa o¨E]G{ ¼zGÉEe`ŸlñWn±‰­%–uY<4h_Á‰ð °­ïÌi^¹4;{ŒZ,³ÐZM¶² Mç:ï(n{¦g¸=7pl¯† Í‹nàGG„× áW*]B&þ`š™Þ?£ к¢ òhG©¡æ‰œœi.CqèâêqºèÉŽ//Ü©óõÜpý•Sm8à¶÷è¼3g¤²Ýö6YÌâ nü´ÌmnSnØ^Œc`Àí¢~û ³K¬Èò³œ[-êÞ|ºK¬¢+œa[ wq½aÜUMl@ÓjÎ[þðåP«ZÍñÆ8ò0꼡Gm¹ r-°î²8ñ)&úÔ§^úñôÃØ€‘Ì;ß¾Êì _®ü²Ò Ä-õ_ÒpI 9ÍÓ¼„€Ö0T›ÔØ@#¾üÍ!ž_þ"^àñÈ«q ny ß /d¡, •…8â£1fÛ Âঀ Õà¹iPä R#5¶…ªÈ¤Á,d!éÁØ ,Àê!€@ÀJGŽUËsJÅÇfnæ`E™?^Y–\c9VÉ%¤B^C¢™/‚CF t_DÚ‚2dC-øa+r‚TÖ|®Í×!6eÞÕHXIÚœE¢3èœVÈS¡üL¸$",¦m¢sQÝItÚJtI(€âK¸„8|—P%6NÐ=Þ™¤FE pgŠä-¢nÒoŽS/ÊÂUfeøçâ ¼þ ¨1Ò@©ÀQ5XäüFƒnJE4Õåiž„A\²c†.A!è`bVAƒV‡ä%'d(ŒYÁh€p}U` &\ÀhtðpŒÀã8Ð7”ädþ‚¸DÃ,ØÂĉ!aqf‘Nõ|fò%HhNÖh&¤$øËÉÜBúR¶k>dlÞÂlrƒmZd}ÆNF¶gq½'pæÌ2qgI"ç˜*§Ü4‘MÚýµäÐÄdunZ èit) —ÔÒ|)ÖЪZÃЈyezª§ ²gâ]™g6„dâfTæ"oº /êçüg§f%W¾@ãâm¥‚Úѧ lJƒ’þ騥²L[dÁ[Jçsœ•²c!\㇦j™,hÂ0Œ9< À%Ü›/ŠUp8Œº…ŒN‡A€'ÁA€<ô‰V–,è•kÅ© +é¸z¦|ÈK,á&H“ Ìiæú •V©ÊÍ+k>dJ|Ì&EV¤Q²‚øåæ}þ«˜šßñÂ".â2á]û¹ŸÞ-›.ˆRrÔ›ò\<¡„KF'ITg¦mÚÑ MÒô韪D ð¤)’ç*á0ÐÙmàšÎ™Í›¶ýæ°9%¥gÀJåq¶˜U¥Uþg…ùç1ŠjXªÀ Ì΂B@YŽF‹D¢D(F¬E[`þèÜ*ZE!;î Ï(\Ã7ÔCCŒÂ ëê‚/úT92ëö'¥*`¡,àÂLµbCl@,ïeÃwôB-éð­Ò¸.30¹")¼œkò¥«9`ÙøŒÏd9²aÀüKe¥f½žY•nD Åè«ýˆ“LAå#B¢ßÑìÛØ›ÁâÝHŽ{¶©ÄZÅÆ)aA% # M>ulÑ|l դȪ„JA X ª…ÁX´ÉÊ. ŽÔ¢ì6êËÚ.Þa`ëÛU,,qîìE†)ù¢~f!§zª§(X"cÒ.í©6-oŒÌhôSÁÈTm;’Õ´ÄÞ:>G×þ‚¨Ã8°;ˆ0d‹-’²ù"†Û2kƒY-ÈB.܆(ä8Ð6hÂdâ7pC7à‚gƒð©Rõ.â"®âV|4®’ZY䌓J–—I¼¢æærî¼n–‡€.DŠî¾Þ3Åê>ìH"™æœÝ1SìÊn#ZïÌÊ_μ¥@ÑœZbK Ít¯ÇRȆlJÔ$X™Üy’À áôŠôNïìV/R*1Þâ™ÛöÞ–Hå÷ºâÏÊ_Ð íùv*-( ´ï` êhÐÊT›ýFRè¯rôâ*¶D|Ã9œÃ8xƒpÕÆl,pFeáÒ¾oþÓ¦ªøjÝú+'h08Ä6ˆ. Ùò?ô>Ø7¸¦0õ) ³‘VÅÄð”A.–i™ ß°iîÒšYs®g5*œñQÚÜ"ëê±ÛC1q6,×ì½ÝTѤ……¶$•xñ ïÇîiñÖ 8AN$#ÜP»uMŒ×VÎÊîËîÂ6“Û]9›³š.êÊ #ùš/!è!—Ê…ÙÑû& «–ê<ÌŒ\Áoð…ت%¿^ìIatd09|àBl,#ìÚîçx´ƒy76¢ný«øeÐ^7 ƒ°²C.÷Ã?@u?Øþƒ4®031sg.nDnO,ý#3K)A:–$ü€K3Ss•qè^s6S$h™îé’×1ëž©™–óÂòqóõ£ÞÙž}ÔŠ‹p…#øîH¯=kÚÇR @¶I8‡B™b»]ÄŒ¼ Ê ÅAsï^§s{ÒlÛÙ]ò4å]GôgË5£ZôEoªF2G«€©2²`H0«IÛ…«œtDªÞë]2µO€Ã94DÀÁÌÂPóì(ïtUæ‚3Æà ·ð¢õÀæRƒ7äIS÷ÃSC5TÛÃ1LUGâbõzsæ1Gd|d\÷,3 ×°3C_Xï0Z÷0èþ®µ‡\sDN$\·L\?ì¶^ÿ -ÂgÂêµg/ôÂÞµÊøÙd±UAï bßé7öÇf@¨tHô$¨ZLi,ÐÏe¯93l3ôÁÚì‚›v÷ªé±MtE¢ß•a´ùb%ú#l›*a *JOÁoÐJÔb!Q“¦üF³ž£qwÀõÛHCM'œè1wNoBQ+Ròx/¢]Úe7˜ë0\PÞŽÃ9è²x÷?”·{nz¯÷'î)ÈGWËwä.i»Úwž\Ê¥õ¼ÞAkJˆn÷Id/ð!š øk¤¢³ŒooÎ6x§çŒrêj Š4'þ Å]xG ‰ -¶=Wgœ1OøÄÖ…‰›†”]}Õ]^wº§ç1D/xkl/ó¿, bš’oùžï Ü€¦ï¨b@l{ôl×¶Hù’犤®£‘9¢cLù%;8°Ã'OBd‹ˆ¾š°œ9˜ ËÌ’¹‡ß» l <*DSërœGu5Ð9zcµi%ƒ-|Vé»ÐŸKCWSƒ5PÃ|cY@$:©ä°ú¡Âxîk ±Þ‚ÙNºõFñ‹3°ûC[¯?ꯃ:œ~©Jr¡Å¹ax†Og«Û34€s” O¤ ­×:¼›¨"Õ]ktþv§7tÎäÕ°µ||ÎG1Gñkê²gt§Þ8{؇ª Ø(µ»/m_»ü.¹ÄRØA Æ2@ˆû¸'Á<948¤»ðD6~Ò]™ù»,ù=ì¡!¾d^0A‘,„SÃùxÏ9» ÷á²pÁs‹¯©æ›‹žcOÀ‹Ã/È|ƒO@’fõ•~¯~S32z£ïáÈ×mš¼€äpÞG‰³C{¤žUý§¿§^;P^Iê|IxÅ‚”<J‹°Ia÷î!døH0@l¸&½J—‰™ôÄ\4ÒÛE*N1PÝá±9“3ò'Õ·<ñ×¢^óu_ã/{Oþg婌ýØ2X*†©Ä¬Œrá… ¯t¹âG1cÆŽÅèÀ Š$ñø¤pìØ›$e)Q¢X9gV-^¹vq²É‰UNºnö¼©3§.ž6u]»æ+IÞÀÇŽ¿~ÿ¨VÝ7±b[‹MDöÙ²d˘•e–ÌV²df“ͲevY\°ÅŽ‹sì˜4iÓ¦Qó‹0ºt欱ºrå«#dFñbÉÔU&4èÎA›5oö¬9Ph:¢ñ–>vët¯Z¿”)˦ì×/_³iÏÎ5›—¯Ø¿œñþÕ x/[Ã‰Û ~¼×nåË5wœ8-ZÄÙ‘þ#G ,©t§Â… ˜0‹1:”"&K–0pï¾{öL˜¤OtˆÑ¢0a´€÷>‹ÑØCŽ9ìH:â‚‹­·åxs®¹ßŽ+®8ä’sÐ^4ÜÃÜr×Zj‘…Äeyã6T\‘E\Äá…qPA2ÈG*È (:h;,Öˆc"·n)à ŒPâÈ>RЧÈç ÷$XB‚•X²" ;bši—¡lÚI(¡®Š•2Õì©(£®‘e ˆXÊ©§¢šªªú©†+®À +.²ÊB+­g }š³fY‹¹æª(ÒöªÌ/k#,L3µGÓÁ2¥Éʉ<þ̈ÀŒÅ(³¬³Î<ûÌ3Ñd5íZN»¥– [k-¶ÚjÓA '¤Xã,îA›Ö馳cì² °‹)¨Ø¢;.ªo¼òA/=úÄ7=DîËO?þªàÂ;*®P 5 ´ÃYZ*¦Zn™¥á‡~q…l°aŠo´˜ý1¬ÀñŒø]ò£KdDn‹–‹0" å•“8 ä8Ç”žpЌȂJXr5Ä«ùMÜ&Ÿ\Ðh»0Š/¸1 #@᜼Á¨AEjR«GÞìQjè/_‰ 3¼ægþ„ ‡"+۟ж6A¢m›¡Ô_0U·tØ Id¡9†L¥#ÔÈaÊQ8Ã%.q˜yUfFã¸Ñœr¨™Ü,&g¡å§rŸûÜôØX,ÒQ¨^iƒ–êX§<,¼ÎZÞ¸u;Ü™Gwå$ºöâiëxJžü°†yÑ‹Ïs£ôÚXÉáü+{ÀÎöDÔ½Z( |)_‹nà"‰¹H4¨˜Å\à‚1ܨ eˆC,㧆9ÐÏȰÅ,Æv$+D!#üS™GD"Àqм’Jrv9)-Θ‰/ÜTÍ]ÔhBÁ6>ø o~£„“ȃåô„¥|£NQK!;êQ5=õþcyëF7¸!Öl8 ›[ša¶³©-?l,ó6j\êˆGLâ=èÑP%#1>2U*ÂÈ­ŠVÄ"aÅÅÆÉªqb,Í÷&WÒ[+W"RM¿ìe¯f¹Ô’l¬×³æˆÖig;Wè¶¾0pËv~ª÷SÈuù'vîéÈæH’1ÝL£:=Jr2& CX(E9Ê6Ü ”/²ÁÄjd#³º€ n`À V6¸A–·Ä%2Œñ†[Ø5–IBYŽð˜ƒJd_—©…•Lá gØYÈzÑ›¤Ý¦šÕÄE7¿ No8mDÐ,âDNÍ.Å„P{ ;Î1ŽzãþP»ÕÞÙ|ÐcžÜàFkš>ãsÍØáÙìB |„eâ6·ÁÜÃnúÐÇ>öA|ÜãÂ0‡A5EÂø…Uå(½Ø8/Þª4d4éä($"[¬±80¥j‚Ö;ÓJR5+v¨éöpÓ é´]=åÂðø[Tÿõ§Ãñ¶€-…tA‘ÚDR'_¨Ö+¦Ïkï„«ÊFîuï¼ß«ŠÂ׆µ²aE`ÅÄLIV2”ÁF.€Á‡Ùð°Ê¢ (ªCÜ;”¸¨Æ0ÌAkà‚¿&J€à”Ò"ÓII ÙØ£@âù!³Ã1b!_ô`eÉYÍjvþC€bƒ1“SN$dJ:¡6ŒÌŒyÈC0P{ÂÕR…jû¸Gle;¶^j.ÖÄüÀ‡3ðA¸¥”9äfŽºåíÊ•´rñ†z´³õBcì^Q»¡¾ÃG»èÅÉÙ /´ïªqE9\ 'a§¦ð¬+ GªCŽó­#Nï¨üö´xüÞO‰=¼£"òZ<‚—Z_§>u:ë•)­© éa5aÞû$‡»êaƒµE31ŠÉàß`­²Ðĺ5Q¢YЂÆmÆ8ê15ªÕ¿Ìˆ$FØ$¯ìYà“ @Ä5¸F5¬1 ._ÖiOø2gÅ \Œ÷sÉþ@˜†æ9³)Mù†0úDŒ[ápˆóœël'w¾³¹±…áiÜàÛ?´NˆF4q©Q˜Á¼6ÒùPn>„né©U…TÃÇu 'jQ¢‹ÞÍäìPRU”ÕYŦê[$h"ÍšÈØ³ÉjSX"¹®©è›œ6¤ZÞ)°wŽ=຃gîÉþ³áåˆè©Î›õKgö²Ÿ.+c'üÙ6œ¯q3æv‡UÄVp¯HF+0±``î³Û&ì&á §@Ox¦†Ì0’˜I@Eðß`ÙSˆ2Ó R¸„A ‡{󴘕8Âf8 ¾È×'Ó"bÀi;ØþÁç4p”PÇК —Ñ ŠÜùpF0èìÍqœõxÊ3r­!ŒiH¸‡æÃvÎ󋦣¡Az>˜{ôªxƒ¨¢<­p0Ãé'3¤¾‹¦ìÔ¦ ëLJ:Þ¾îì.ðÖ"ÉÁR'uØŽuÜN‘z- ,ïÚe ¸€§L0©` "Á”gÁäð/Ú0¾¨Íìl°¥"oÆ$oò¼ª­0¯ÄPIp¤Ü<¬Öm–p ×-d¡ôŒìNò„*ÎýL $€  öŒ Áð˜l ¡$AòÀi,«Ë2k³†àÄìø.ÎrœA´a²¡9†ƒfÁ+æþ¢èDhú< øaòèmŠáOePÈfP”arP.‘üPëôV«j8ÍÓ ª §0eºèaÒ–k¦0OR ÏÒáÓ8ãµ(¤ì€èàëêÀ¤h¥Vœerz‘"zQ:Œ‹Q:Êqðth90Z¤e@P‘^ç |m§Jð×°‘!ø.y`ÐÔàÙ¬ÓN‘±ìŠÌ××ÖÑYz7ŒÛ¼ê«ÚJFÎh€FZi ZÉÚJ ™° ¡p&¡)Ô)õòó 0¶RFŽÀ œà ž %a4r)œ&6K„âpÌŽ/ÆÞà~Ô%þ“A5>©¼bx¨Rk¤ͼ*ÑÏægˆÎKn(¢á†’(A-”åàLÎJ¨N8±j¬&1DÅçê&Ò”‹¹êÍÿ¨b¾Ïúá/ÃN7ƒ?Ê»n‘êY ÞÞò%ç2™’Ö/årñ:Vg×ìˆZ¢óè³±;bCPy”'^ØnÅÑÁœ/óÒ.éÒ2-³2‰17S)oÀ^@4WÀôQb Z ÎG /a ]s4aæ2!ñ Ìàd2#” ׬ /’BòPÅ ¬À n1d(Œa—@©þëlÁå%¿Â¶"+â ‚f¾~€iÄ“ÑÐÆþ„ûâ¢-’¡(2´!îÐ( e—š!Œà¬TÔЄÎa+¿ÒjVh…^˹öA+ÿ“¼¡*úÁ+ÃÇr»d4в»ÒR9ÛrÕ6ÓfL3ç2/Sðâh¦Ò‘/û2^¢ÑíxZ1 1[ðu^G1ó× 9p.i DÑGw´93fÌ †Ô ~…ÐE4Ï4Ý5! ÌÇ4A ™0fóiPè6õ$T®)O+ø"n8ÑL%˜© ¢àŽ®@ þàT‡9Õ“=­ÐÔ“+ˆ!uñ)ÌánQ<Éþ ñ¡.´¢'ÙSd >‡’>ë󆃆ÀÂ.çXÏ J%ÎúS©æŒNj^NOˆà+ëÁ¦³HT!ê(tç@-ëÀÕ’Uƒ´7TUå‹CI4ð|ÔV÷2Z:ÐFã%^SE!‚5XBXß%—Š©,é1?ôVAôC1Zku/aµ¸óZgŒ;‰”H´­Â FV@\i¤IQóI£T a3z€„òΰ¾LÃ4 Q oï¬e ¢@FÏ@Mýn˜3=Õ“`åm!Ò `ïàHkMÌ€i†s¢¦uk…PµPïPàÓP„C,ÀBmþÔT®@º ¼@ Ä@ ð )¬K³Ï25!ó ]k§ÔžîpU‡V-Qõç ˆ––;¹Smâ uši¥j¥Õj¯k³–¯ƒkÙÎ/yÕWUlÇ–l‘•©xm´k›UkÛÖmßÖm›¶ikŒ[¹õÃVäÃì‘ÄLIIi$"àdšô\² ‡€]ùó)·2A=òËàðbào#` r)—?)Ùø•÷@Mÿäà@¶‡xrN!W}‹aÑÊs%òàÊ“ü4PËb8¥c=dqË̦ä@M]G!¶  \V ’wÖaf­Ðþ?9ñf¡—*¼aîm0¨ÁgcQB¹Hi»—Ò@iåVn£–;™vkã Y«VZ×¶×Ö}·Ö}mT~ѶW}0Ëí÷lÑV~™Õ}¯£}Ù~ÿ—€ Ø€ÿW|g©Æâ nÕŠÅîÖadÄEÆjFT .¸!ò`fÀƒÙMb`úH¨6ÕÉÞø!³† 2¡j€h:ïd¤@ h<øk]ôu –­ ôÀ ô€sÕ‰9ûĈµ“:¶K| ˆ„á)¾á|ËÁuKeNÈaOz2Ýó=Òcu(Ÿå:‘Ü`nî РZv¸x\y“WyE¥œ÷@SþÈިƛô7 äŽX;M€œážâ¢˜‰ã~àà€òàíá ¥‹ õ‹?¶>Û³Œ‰! mP ¦`‡‡çxãXŽ)aèSêýPg©æt–Ú…B9O¹{“ö ¹Uþ8i™v|£¥|ø‘IY¥?¹“ST5¹1™“;¹’UÚ¦oú‡$W™•¹ÕaØ€ `@–GloÉÇ4#àPB©%0Btù\~ ?kÍD‹$¢‚ÄAJ7Á¾Úb\@ÈŠ‡vŠ làó±¿>Û“¾¢ì ‚·!¬e ‚- ¡!¡?{y©ÒF*ÆA³ª7*ˆÀ‚!ÄLrVqè µ Ù£¤?: PYn9å@· „€+9 äw·{{~[z¸«\[šW¥\m‘Ûkµ”ûÒË{û”›v¹‰”Ü@Œ%x¬V@i@v@#Þ> þ’x©Å۪׬NÀအ«Ù»½—ÐÚ€¬}d!änîÖúdÄ­ÕTÀã:=œÁ‰ÙŠmɽ¦Åë¿ìsûéÓ¹W„ €:¨eY¨a@‚“ôÝã]Þ‘@î‘ f ¶°$pÂÍÒ Ù¡„ðàf¢«’tAØ  X”Y  ª¹Ñ!â#a'Þ·ªÃ@²bûŽö}v•ÁVã¶¼Xäuw(I¾Öþå£`_W¾ ¡\>¡={Ń0.$lÞ)îÆû˜ç{~Çy\þ-…^i×ÀØÕÒÙÍ=Ù•žk™¾Ú¡þé{;êÞëµm9ÙʽÝ/±üßë©_Úe©ÝÀ¬Ž´íq }h >â~îe¯æ¿f Pâ2K¼Ehã½Að# jÉÒ¤i“ANºdͪ#çJ—+S"FtØ¥b=XÐìÙø§cGA CŠ)PÈ@ÃαûF§äœ4vŠÉ”‰¬fM8DÀMׯš­d΢ ª­¨Ñ£F‡&›•ŒYÍbvÒøùsK—)[¦T©’%‹!E`)‰»ŽÜº³åÒš3—®?~ìÆõ âmÜ[~CÖZ&¬¯0\w LxÐ:ƒè(^ÌXqšÅiä8NCþ™NeʘåÈÁ̹3å5 =§Mº´éÓ¨Q«Yͺµë×°c³NM»¶íÛ¸s¯]&N7ÀË!ã¦ñãÈãX· 40X°‰õëF²g/¢ A ;Çù±£<œüÌáBflÖ,Y jJX‹V9+n±ÈË={t G$(’I‚ÐAÈ8q c‡fv3S16Uˆ Þxó ?ô(óÌPD!%bQJ1å2P¥ÑMA…V\yÕXŠŒE 98¢•V9kñÓÏ?p±ÃŽJ켕—5{ùõaL6È“ˆ%ÖXc Aög¾])Ú–í6š—œé&&i­&Û™hÎfþ¦c¶éæ˜\–!çœÀ—ÜÆ5ÇÜs*HGÝuØi· Áà7f˜ÃC4êÍ9ûL3GuÔñÆl°ŸB³Ø±ÆVñÇŸa G¨þaઠ‚Ç7 úÓ„4UˆÌ2ÇÀ1 8Þ°³7AEóa4#«°Ï0µŒMÄHõ‹WE´•2ÖXf™¥#çüØO=àÖsθoå1 ’|)ÙäO¶Ë¤b‡Q9åf–aÇe˜•Áå¾ü‚&Gmš½yZšh®Á¦À'l[œtÖi'žxê‰ *`€Ÿ€*¨Eøë8?@0Æu0u 0àôcMs¼‡œÀ½QirøþÁ¢¢VT*€¡êI€-ôÐCÏq¬ç C ÅHH«­ËDÝ N¼nØ!ˆÆûL²¶,[S³Sía…IK­!Ö^+V¶g­³ã9üüÓ?ö؃ÏÝøëÍ0æ ©ä’ƒÆn»‚ .ckLi¥½iè+gãùò+y—¤}öY›˜ö¥Á«áùçi|~eg¼fpå[*LÛæ–g^ym­óûòœrg;™FÜÜ ¼¯@à D7]ÆÖmœÝu“‡XQF½l 0ÞðsÎ,^¡ýc<>šþá,*ÎX˜Ú3ª#=‡fiÜëÛûï7 ÜßÜBëL¶Þõ2Íà28¼þò7B”µm­]cVÂF‘(H« aQj´¶²´mäúÒÁAÖÍç¨Ç7‚Ñ7kPCI€œ»VH8'%¦2Š[Œ÷hW†îÑ0_ú¢L=ã=Ï€)L¬ûáäšʉt¢Aâ÷å%ÔÅî‰KŒ¢ähذ‡!‡ d€oМ¼€99È ‚‡1âïOÇ8¼á€6B  o¨E6´q‹<Ø…VÑž÷X•‹ˆÏ1߀Ðw —ÍAhÄH$­aØe¸‰Ój•¿¨1ƒɸÅêâ pð£ЈÆ²KX½˜EÔŒ¢8Ì¡#勌¨ÕˆZRp,lþ›J¼uuøRéX [Æu$Nc}™á–Y¸f1ÌŒW`,CEÒáeWÒ5µÉ™Úv[ÒWü"³™ÎÜ‹2šÉÒ•(Åvºóðì&ƒCˆéŽ9_ÄA÷9Æ‹M§:3ÞÀ1pì ÌCfÑ‹dÔ2‡¨ð"‰L$?£ÚÙùÔ*@LJvˆÐýFJ \ MÇÉ1ŒAI¨-ã’ɰE-€ArðŠøà(‹²žP(ÏXJ2–ÁJdDEÏrHÙ´¢-„¡–°%.xvx‹ê(‡:ÌáKt¤k9ÎÑ7jPã˜h%3×*8x±õIƒ‰ÃþÈj(§¹ÚՆݛGÖ=¾òµšÓ¦czcÎÞlS‡9¬¦bζOˆ]ìËÞ'NøM6~à ìb©?Ín¶ ³bêiÏlÂæÐ¶—ª©þF\1ÍÉ@p·p¸ÀÄ5&p·S¼PðÄQ¼U\š› 5 ¥KT¬x+ž@º Á© ¥¨& £€·™+ &`Å©0 áÌZžÈ‚ìºÀʬ֚ Á §P`@»|Ü­' Ú{ÉP¼0ž<€ÉÞj¤|§pÊ|¢p @i ¦p¼  ¡P˵\¯·|¯új½ð  àËðŸ0ÌÄLÌ ð¯ß{Ì"À½ÿÚ¢ ¾ãK¾ @â Oà°:Êð[]¡[Q¿ÃU¿7¦„`¿'ÛåÓ3.1+•VþÀ6ñ—q 3ûÀŒ:‹5fê ¦Â ´[§^–)" ²5¶Pvf·>€vqÊÂ+¼`p“kZ5Ãë”mSÐ-ÿ ÃdL>l©kk|AÄ÷à¶F¬© )®‘¼ÅO|·‡ ¼Þ}¬·Z¼ÅKlÆ& ·ÞZŠzKž ÞÊǹBpÍ×,Æ^,Ç©@Ó¥‹ÆQ,Ô&ðƆÉZÕX ª Œü¬Õš žÐÇ’LÇ{Ì­˜ÖÚ+`š,É0ÉšÊÿª¨|   «| ¦pÊ®ÜׯL €mË¡¯ÚKË‚}؇­ËöJÌÂ\ÌÆŒÌʬ½Ÿp  ¼lÉþ ÍÓ,t!ÞÀ°á×~›±ò ÎDj\4ðgé1ýa—rŒL!ðlûc ¸›QšŽÕh¥‡©iY "L"þã õP À°!¡v™¦TÐô«†"Å Ð* >zÀÂ,l¨>b=yçK­) àpAàIrSƒ”ÊAlÑA"]7Ö tÒ÷ßò})­Á¤zyëÒ.·À‹Åü-Õ ßOì ž°Å`…¼Ó¹¥+£I½Çž á0 {\ºv|· B`®nÈž‹Õ< Bí»¥kj¼Ê©  §p.}àÖ¤ì ¡p&ŸÚË•ž ¼'ðÖþ› ¨lD~Ê¡`äu½ä§L ˆ-ØÛÛ OŽØŠ]¯ŒÝËŽ}•ý¯–ÝË”íÌ‹ Û dîâ+@€¾Þä+Ú^‘a`Úâü£f0 ìP|`šƒ$~°¤ïlÛ5»,·mRp#…îÛÞÜùL@F¡ Àà˜Ý€ =@hZ,Â,SÝ^ƒ ć”vgÀ FpÃÝ»Vƒ4¨2¨ú˜UY0 >ÒÑê0©ÀÄA^e#ݶ%ýÞó=ßõ= ƒß7­Åù]ºzÛÄz»ÇàúÍâ&`qLí^º~ÍîpáŽÆî @ÙÄÞz宺p¬ÆBýþଠ  U­ BÅ,Ô|làð»- ×Òέ(jkÝ­þÖ ä¡ìÉ'@䨀Ê" umÏäzí×}=åŸà¼†ýä´\åÄlÙÅ<°[N°Ã|"€ Æü ˜ò˜€¢.@æ™°Ö¼æmžÐ¥½§M\¢‚¬M 8£=h€.!“ôt…~iÉ0Tlæp öìÛS— ÜŽ¸`Gô ÉM7¢fJ$"ÜYг—ÝÆ@ ®ðLÌ–êºÖÝ¿´#­ÎkZå¨pSÞèë_Õëm{ÒÖ $R( Á.ß) ­zÓ3.ˆîtì . Þ*à@í Zœí-þÅŽø|É}<ÔêîâÎ⎛ø¢ÈAÝ @mÈ€ †ì šÏÇt|É`în-½âjLà¢Ì­jÍ•,>[¼É\ü¡€ Ä_ü¨ ½ Ê" Ï×ïÊ€ýÒ ϽÃ<åºìË/ĬåÉŒ %?ÌÌŒåŽ=Ì+-ïò°Iâ›mó6oÚ;—ƒ–3fÐ+ç`±± gOÀLà2‚ $xLØ8vç¤CÈLâDfÉjõröLã³h;j2Û6m·†€«Ç —7vû¸mû¤Çmn´hK"AÈŠÙ‰Hè ;Ôøñ;WN©RuKË©ƒÚÔþéÓ¨åE8ǯß?|鼦CçÕÞX|cÍÞ»g/­=k„YC7.=ºtU䲂¾öú5!Ê“„5üõË—‚†Âk€lBƒO5j„eb±Oá‡K%äÂ!áÚNuXtb£T*¬AH,ÏS+¦8ÕîT¨< °W¸l!:™°YT(É'œk˜``‚…ç,˜8…JûvíNœÊyxòåO™BOJýúõ¡>yw?¾ñO @…²_ÿÓ~L"0øàƒø0Ùï“þD(0Áრ h!†`Ä & ¥À0 ¥¨¢Ã*¨˜b‹-¦˜¢ »ÐC,°°"qþú¡&?þ ñ@æHÃbŠ)¦'"ˆ¢‰ Â囆„Qf§‚„œ¨[6ÒȦhd‰¤dà˜äœn”œ~º‘2L1¥ÄÉÉd˜)H b‰#¨i¨ÉŠŸo¨1§Î¥ š**=§ŠÀœs¶êÇ+tÂ2«PµÔZËša„Q¹äª‹®XB”`Â%ˆÉúú‹‚뫀ü‚Ì“Éö’ÍTO=1UÆFñdwÂ!Œ0OTÁ¬UWÓMˆàZ3LQjNã$»@ƒLŒ‚ Pe6Ú’£Îê$³.:Ç„°ÖÚP¸PDȼNÈ5/]ôÒc”ONè¤>PÞ›Ï8øäÃW„þ >Aç,À$˜Þ^h0ÂQÄñ&† £b =Œb *¶ñD±¸â 4ÐPoøI'ýðCŽ9vìÑÇ€ ’I‚n¦!knY†I“™%(ŤR&g€!bzTÙ%g¢f£h „:Ê›4JÆ[Îä©§cè ƒ#Ùùfjè4gÐ;ñœ*ϦúÌêŸ~ÎËÐtÈ:Ô·†¡çQ½ÑŠ”QjGS!dÇ“dûRl[Äø*`ð øbŒU!÷+7ÃÃ6\ÃÁìSOs -·VGñÕ€Ø6EÔÅ:Eópb9uƘ… º ”µwk'à:Û¿ë-Üíb'/þ LI×¼uMi/ïBQ/饟÷^çì5î´ .ðÜ.)8ALÎw6\ˆo‚"¢˜? ûﯘDý5æ =öàîrôc€ðÃä @ð¨e.;ˆÎtfŒa0ÄÒÈ™Dš‘A&UÍg? SÐjb”pCÁxQ7 – &£-ü ”–֜آgJ2Æ1|R$v€ml?¬TÌv6=éiPæ05Ô¡®ʉˆ0¬á¨½=ªoÃ`<àQ8Ƥ¢pͪ”c‚ Î1žÐÔ¨.˜Ò&3Žh¢Ȥ.8BãdL@›v„F¬ŠSÇþ— tÂÀ#a.ªéàQ2Ó‰OqBÁ*kAÇÖr޵@±à /vß @‘¼ò,¯=ðbÏôTI½êi/@ýºÞ¹â¥ íù§|æCß pð âF dbZÁ~$º‚þH¤±Ž¡!€5úƒð~˜#eXÙŽ\† ˜I°ƒ 9Ò™$’Œ˜1ɵˆÚ˜B¨l\iõ°†2ŠÄ|(Ƴ˜E-ô¹ÏZàŸWû`F¢Ö‹YèM«ôë*©‡üèç\ôê—- K°ÃÊb±±0ÚðX+@v g8Ê0‹†­¨cj؃fˆÅ! n˜&?¬¡CÒ.é´L†2jOiœ™"çdÆliK&\%¸˜¾ÁÜ H,ìÅ=ºBž]­<<‡5¦!iP¢ÙõJÙº;éˆÆ ø¨?ÜRõÒCŠê]oßX0 øÆ×¥dE¦D±ýrþªF° ÔþjàÃV®zO™`[­1M8Xµ`U¤<ƒY ®…PìŸ.Á~’óGÁˆq/<Ádx§;!¨˜7ÂÛNÁÓÖsÅXÆì‚—sîÓ<·›z :÷j ¾!Ö9šE,b‘´Á n d›,Y+tÌcXÖl4¨2;èˆw>¤±Mƒ¸ygÊXÈB¥!N‹4ÎPóˆÔÈ„“dÔaÞ8G5äŒ?=„´e. ÿ™ –©4Ç9¾! i0zŠ‚¨9æfîF4eîXÒ^{dz+"U¯9€1 kXƒ&Ý[ßè1xѦgüxÓW}*þªžðDåNUËÉf8¿*ª‡ý˜ Î…ãB¸»crUwÎ[¨γũJN‹/·›¾Slo¯X­÷)Œ s¯+ÄÎùD»Ú¥JPØK¯ñé—ü5Ëzì°­‹…(ppƒ°á ÿörd/û5¨ËY>—çÐ&9GÄpQ?ªá#ˆ”ÓâBÂ8CV« ŽŸ™g²mZÍ£6}æt·ÀÒ8Ìq c„¹dˆ1^þ£˜ÛðjÁÉ,€¡ÐÕö¼çÓ¨FÕ­ûD¢OÚPp˜"¦5ýQ´˜·Šö ’º›¼©"­  #‚ûºw…BœY›µ ¨£PYÔIœ¿à5Kþ”ÌðGš!hU¡»Ôà»ó^ÛŒøÈ¿81mé 0«®b<7í8 ¼¶:QŠ1ä9OðèÑ<#”À‚Òó1|é„`ÂÒ#ø »`ÈY6`=6`7h“9Ã9@”99=9p8–ñ‘cÐ3z ©@;'}ʧ‚b!ô“ˆÔb‡aH’ãC“Ø¢>ês94“e0†:z˜¸•`‰+b bh8;ˆDbÐ&Š#:®bDiPeè¹jˆ¿ º¡£?³0ˆ2‹ª“o`‰ØP;/z`Àº{Ð:•ª©a¡¯?ò¢Th5Ó1YþªW‹ªdt 4£Ú‰–Ú¼eãœÐ ƈ#ÎѺ{©?Ò µ+ C: x¶è¶gŒÛ¹ìªÆËA퀗rÙA¸ ÂS €æÑ<º‚O€žéi%“À’Â[‚XQÐ,TÈ6àÂ.tƒ:øÂ0T 4à=K­ê cØ­©† §òÃ'äj!e4;Ôf8† ª¦cÈ™“´¸sŠ¡@d®ær€BdÀ>o¨‡j0à{kˆ3\ •i“¢t8LD“ªÁ'R³†[EQäR¬º'BE'Ò(aÀ³†ÈÈ¢Ù´“Ò}8©·È:ör¯–š•Lq°þDŒad»Å1£NA½Ø)Ë™:¾ç;N’SJã$'ƒ@6œí»…9€ƒˆ32¬A@1Ãlz ƒ`!Â9°Á…s En˜Êøë†T¬?C1‡a08PÅÈ¿Lû® Å{0˸@¯a(@öÚ€Q0µ–²)eä#*¨‚œ½L@É(0ÙÈþËhI¤ 5 “0c:bŒ¨2GgÓ–Ä1# À»ÉdQ7qÓÁr‹1P RøL|ŒçèÇéÈv»¿zBÖlMÌÔ„"M,ô'|¢…%]R‹¿ž¨8f84Ú‡j¨2“茚Šp’C3’Õj¾gðÜx¡á<'¨ ²Îžx¸¢9::¾i˜? ܃¦ñô²£ÌH¬I¨…Be˜…÷ŒÏn˜Ï³ P{(¯B :`0ÿ³‡@L”*ÐDÕÅ©‹‹KE©H‡ S6ºŒ*2šŒØ€ ˆ•ThkãŒÖáa)@’ŒT³U[=…Q0¶Q…jCLMFÁþû s4ãÐ¶é€ ˜ŽNà*½ÁÝÈÁP ¤Ñ¥äùLö¨±NhžÎw㱿²!Â{Ó…"…M…ä§šü-b0ñ?„8hH6¤&s…A“Ip’9ONײ¸“œÎ:¬É;’¬ñ¡ƒ“«‡i0<Ø3sP48ƒ+(¸Ž9*{¦-ó²•!¿dà¡z|ê…[¨…÷$EC-”“:”Fq ´D üë?ÿì‡YLK+†«@º°"öŸJµbtÐü‚ŒQ‘ Q ÃP0_MX±Ð¾,ª£PÕ˟ʰºŒSÆT–eÑËSà*¿«¤?:ŽçPVþtÖgu¼áÑSÐAS°ÊKžN¨Q!dõxPh—mU%ºÂ1üÈ($Wx;]P\Y@Wuå'«±šw•\˜«¸eHÏœlDiØWˈŠx†YPIs`>?ô¦æÓ™5í‰G´3ì¬s0‡@Ø3p~¸9+³‚Õƒ2Lƒ•Wœ†s›;Ó”Uø\Ù– Ъ3GÑÔþc¢}(/]¤ D)K5˪ãTêÕºº€‡aø/`5Q9ÚÃ(€ÖØ O €EÂ/OiaQ*XFLù£<ÁTC»^Õ_ýåË%Ž­Ýmä»®»T1ÜéS°Tè*T`eÅŽuQáþMòAcQ—iI`¹úÌçi—wáGpűúð—à çP\]PÈÆ}\È}W?;áJÏ|ú-\è>ƒ†§Ù\¨a†å\>1%Ý >¨ep¹9ðƒ@]í»Ø+Øjâƒ(æޱ,Ñ4è,›‘.óÝè\8áŠÊãOk8Ô\ Ð{¸Å¸Ð¿M‹{À‡²”cE {zãëÕ|è^º€wˤ@ÿšÀ;âUk_Ï¡€cUâ…Á€äT úÕFoãÕfãŒZY¤TQ°ºÓ7uÜc£äøPV…u̪Pr³–¥Ì ÌÔA+ži%!<7ôð`mþ=ÑaÎÃí1áý€>RÆMÈ}²š^(ÓêÌDj¡Ù¤aš£š•8 e ¡æˆgðR¤@’fb!v3ÔUb`“4Aˆ&:‚o8‡A0‘%NŠr8u Í«±ÑÜ`×þ -føÐ„ÅÍ\È…#E.g~æ ´9¬æf>èú޹@Œ³§Á…àå>ü8rö&„ئG•™Ùƒ3ø,¡†.˜)Èp ‡Ïꇭøu /°~î‚fÊ2”iƒ/²Üeh†×Ei@^ù{ã‡~{ÈG¡T·Ñ›ì]¼¡ãþYöªñ_ÙÐÕijص£†Œ¬íi×Iø¥»›Î ΑßÂø£ªžF݃(b#–ƒ5xì?Ø4¸,Xâr¸)†8ŠÎþO·!‘)¨˜‰q5@ÞúÑBñsmØ–J†6ãÚ¶m:¾‡€‹«»ÿ¬è¹¸EàÆÞæèNõTQpÐ@î) ¤/ uÆÀ ÌÖ±éœKnÎq‡v°;<¢» ÎèFeDj•dñS`¸*6A·—o±Á+V°Â»Ý¸AOŠÛá¡ç(ÂõÌvA¥è!pÔüÃ5ác>W#eð\pðR—k ïדgØHáóë‘û™gH>v`¨ÖgOXsþv bP ?`gÈ^‘yž¦sØ¨ÌÆq&Úq¯‚ü¹˜eêŽ9B° ;ˆK ?ËMhQ”mùtè(— 80ÐëÝí~¸’†nÀÞ.÷òëíhö †e„ŒEb ¤ÄÙ/Ë ´ÛОæw}/*ÔUÀ雞Æ|‡°Ôp»<=g»Ä00üÒÅãwÌ»ýZ CtTðŽpÌoù6áùeI=»%%S¨«{dè1ŽTÚtÔ,áOGaFׄtëRwpgþ…_è×¼¦!~Úâp~ιgH­s†Yˆ³AÄu%I“D0\çÙÌÒÏʃ<˜p…Bödïþ1è‘ýу;‡# i $ç¦l—í©dYPÛÞ:îY5†‹vºq˜:tïòà^wvsïQ¡£Eº÷V _Æyµà˜5!PÕüÕUÖ·XH¾„ä›ÎF‚W…aÙn9OÆHŒ£bFÁCœgñ‹=¼5ú£PBÍiïbSô½;x!+ÙÛ·…î°å;ùåaž3BMoùÅ<˜?MQ·y^è…œ×ùŸ¡9[u\`9¥ “¨Ùp•´†ö§¦b…Mݨg _wqÇÑÌ" ‚®ÿú÷ìd/-ðýÁ˜)0ƒ¯:?€ü¬™C BdÍ”IãÆ­Zþ·|÷îÑ«hñ"ÆŠ7ê³g¢¾ø¾yã·O_>} ï…léòåFŠáÁ£P€ÎvÀɳ@ >y(`"ˆ§Q£R1%IÒ¤¨ž< 1á)U¸¬ZMUµk8wbÃ¥BAƒœz ñ¤'OVµÆJ5Šª‰Lðík"mÏB„tªÊ·“¨Tª‡â**!':uÒ0a‚…É¡6s>qhTžO‘.mºt¨ H›jM*u(R²_Çælû¶mP :‰øäû7ðàÂ;y–eü¸qM²rñjΫׯèΦOfý:öìÚ£)Ž_7gÙŸ=›Nþ™²aãø6+³øþòçÓ¯Oþü ‘ëOlŽ~ò{ E NAÅSHNò 8ã°Ã?ýü³!‡ýà¡…UTÁÅ‚[x‡…ߘÅ"GăÐB =ÔM7Ñ£K<ÆÔ£K éCOBêƒO0Þ€óÍ0Â8éä0Ö¨ô•1eDM\iEÖ(Al SO8Q°Ó˜EÙtÓAŒ"Š'A …Yƒ%¶æTS†ÖRa‰åNœ&„yÖZˆâ'™`EÕ–‰*JW*nav‚ œ¢J*¦tÂפ‹RÕc§'(Y0*©¤jÚ) ˆp«§ÀVZk¦¢Úl²mFn¹†¢Û'þ÷+°Ä€±Ê9× tÒQ'ÞvÍf§Í3¸xÃÎ>ÜX'ÞyØ>“Œ0¶gK-ðÙ7î¸ùé·_Å € X Wè¡GWL±ÅTT‘Å*9ÎzjÈá?ýP’ˆ!ŠŠì™ÑW´ø sDŒ1Æ(cãÝØCTŠ S;¶tO=ö³Ï=ö¸ü10ÖØcd•]IS&¼³3Ï;‹SVZè$Ôwj°ZƒqU•L{‹žïðÙèTáŒbžY5ÚÖ(€¡5æTeödÔVkN;‹ª½e,BL@`UIªiUž ¢)qv§’š ºR•g[pJh¡X` *­þ’Ê ¡˜ë)¤PV«­±áªëm ô ,çÀ {±¡Ý/Ë2k6©kã¬vÊ3N?áE#4äY÷L3Ò|s?Ã(3K/äÊ÷Œðñ™‹ºÅügñ@þa ôvQb¾Tx!E¿DDõoÀý ¼¡Á†’°ˆY|ÇQLÑ…W áü1sÌÆ uÜÉ#ë20ÉO=4´2#Ù£INÊLl6xŒ‚={ Ï®6¦¢UÅM{1Áø²ª\%,Vc“œä”•±œmkmÁJ*Þb€¿ì¤*>Á‰¶”µÑpK†3À^<Šªˆb1¨ N'Mõ ©HU^–F™ÂX þ¨²ÀjǸP°†5¦`œldU+Ëa.WºA'4×¹`yæ  Ýq˜“,eUç:ª{#áˆ:h£$ûPFyžQ»gDƒx¸PO=Ì!YØ‚xãjF2™Há™+yʳƒÜå¼çéAÒ›Âú® 1à@Ð$¼A! aH`Þã;Ö! J4" bÈ‚$ØÁŽIx¡AW€ØXô?ÄócHC ‚#íod=º‡0€q2–àƒbYÈTB˜S¡‰8 rÓj8‹ ÑQ %ƒH‘ W”®¬ÓNfáŠ'T–v¤bLÂZ À4ÆEQ†ª!@SqBJþž²ÊÝö6™Ly RˆƒŒ«v¥›Ô14 mq¨È*Øh‘r\ìbæ§š1’ñm0ãS‹Z§9¤+uÜÇ™¾;¸x]?ªÁ gè‘}TF·Ø#Œ[ØBxɰÅ,’šÔ^$Ã÷9Bü‡9H²@BüôÀ<˜„ˆ 8¼1‰O‚RI"e)1Äðõcë8Ç…Æ‘>|©}î›Øºˆq iðõ!ÂÄÍŠi )±Ä#±†“ŽÀ‚U ± «¦Ž( ¤‚›–ÇÕt’«üåhKBÓDB®`%kV“ÓF‘µQ˜¥'€Y¡ÜB¦Q¤-Q&@ª ·Y€+&þ8E*.uÆp%S¨Ø¡`¨šÐg¹£9 E7+PÄŠr¯©H9£Þ´¤oxÃISjœ•¶t1MÓ»ºÛ‰§;ßàÇ=ðx;ë4#¨çª-ÄUŸmÍ"\ɘÎQÃEùà'ËpdÅ´Ë@bƒ¸¼ú {£ÂQ‰JÈJVí™`º,Ïz!uèå(‡W½À>œ ~øƒ *v‹½Úï¯2›H>R¢¿‰C<²Ç r8ƒ°){¦‘¦9Œ(Yd4³æEhòŽ x²VæSʹ¤í%i ¥rÙ¶fª´e„TI…WÄÖ¸˜@‚ú\¢r[ÃXx''þ‹€+\Ũ¢1]a dv˜Hî« (4@¸ÒdTq–’T¬:j]ìfws¼êîo„ņ7°¥ÈY)KkaÞ6ª—¦ØÉ†6 qÓqà£~寯Ž1ŒsÔc¸(¤~çsT[Ø¢ñ1d2VÚT§2ã\ÆèÏ1â@bÔ Æ„),Ö¨<ú¶³ ì@ø= 0pHb OxÊ$Â=bï±›øH:¨1iÌq˜_‡é±ÀŽŒÆ=x”ƒ‡„™*Ø>žð–uc°ˆµÆ“#{Mx¼#gV¾ø;0k›å&MKZgÑrA!ÜÅ¡ÀÆÃäZ¢ ækž@›þÚ%çÜŠB(M“K'TñÃÆ)fo|ÑSPeEîp‰¢âw‚H»fҳɮv?ð‰Kcú‚²Þi6|š¥²5³J=Sì¤ÝÇ9h!–ù{=ßÀE-ÎSŸdÌ‚â"O‰G÷¦Î'?Æ ñ4„AaD›$ÓÎC¬ýIl›A Ž—B¤P> hØ_f ÷8ÊÍ„%(¢é+â£2Êy¨¬CýÀ>Ì1Øj°þ¯8šY4—%`R {2šÒôМH”".“‰3PîÀ8ÆÃ!„à-b;Ë׈ý“£¥PàT![°/Šv¸£µMÔ gР™ r …Îþ3Êç† ŠY.hDàDМ"3ž‰bÒSC +6Ýé—©ª„‘UÝÕaÖÝ×y‰¡ŽØÉ‘ýT0TˆÊ|O?U/œ±ÅG° [y(ƒyà¸$Cýð•0,YáUØ´M‚â-Þ˜Aã™\½Pè‹l[åiO(U…LÂ,0A!H‚…€C!ˆO,atR„Ò7L ÷$> Ÿ“q„KH„ǸŒ0ÌLH8ÉÜï}ÁüÃ>\á=,™N Z„”…lòYY,ŸN€ÉkõĈ\ôÅØ´ÅÆ•  ðny_Ú|ß–ü“øÑP]˜Å^äYULJþdÜ íÍ¥†J”TTü@ҙƬhÓIšuA]g¨Æb𰏀vÚÈBÚ×Á©=`Ma‡3•7HáÁ¡ 1ƒÒGj !Õˆ4à ¢ ´^âE`WÁ`‹%6f#&m#&Uöp[·mØ^X!",Áw+‰OhA;Šˆ7>ž†R…¬Û²›Â)\ÜÉtÄG(PÊxÏÌéM„5Ä =ÀE¼aEHÙ;PVZ–@[Rð“Pˆ Çý OìÅ=™…˜ `P€jñ "*âVl_#® ÔЙ4Mù ÊÜìÜj\"*\ÑnP†H9(&þNÒM×iDšÿýHñÕ±¢g¸€+¢Öq]-’/4 zé¢êdG2C’Ôc0LµèݯÍG/Ô‚20ÃBð•4LÃ’9£ ^Xâ}Ò A À šÐ JO6æe6bA¨OäõËæÁ¡2"Ä;HB!8#°#ˆˆ‰lc.™˜Ã(Ùã@L*Ü” ‘¸ = ^ÊXg>ӔЃ5íÑÞÍPÜ;JDBP8ÍÒœ\H¢Z¨™ø¦HveyÐI¢dÚ´J®$]dE,˜Â¨ð…×d(ÆÎå Æûã,o,ZÒ©Æ)<¬T—ÿ¡âfþt‚Ô­"Ia Œ ŒÁ¸€R²d]RÙâ-žªÅQ6ôge3àÂÐ#) äÞOÉG2”%36IkFÛZR›µÁ[Â…Âà”Á@øÁ@^& ê% æ’œh_F@[î`jX9áÄ?P‚"Â!8¦øŒHæ 6ˆˆžƒ ‘5ã7˜ƒÚU`jzæÊ$œJØC <&»%)öcø0ÄæÎ FmòŒ;ˆÃ—l™=MaÐ"š¦©ÈqÅY¤"vßI&JÚÈœr”hd†p©BÞ$”\$áQáhŽwnxVÿ™¢G™g¯øMç‹þ|€¤Z€¸¼§|Ò§€ÎS²tèç~¾Ñ6ügëÀÁ·¡•r¬Z¦%„Z Nè[ÁÁ.àÂŒÍ1 ÃÈÁ»ˆ¼`c NA] ëÐA$kœ¨¨è8€æ'¥›anÞx %$B"Ø(ŽB;0&‰h‹Ü‚4°Þ`™=˜C=¼ëi"i’zϘƒÂÅë”Îë2 É¿5™–¾9u©Ï,_NNøáÑ@§Ÿˆ _§HžEš™Úœ¤X'øM:b,ìÖKÆoíÜc(†«¤ Z{þiâ4‘OBWã$P:Ý­@]:j¦aB¤Jªœþ&`‚ÕyÆ{^j|€Ô'ܧ¨ÉÂs€*Uf.ô vOªòƒ90 „^Ø$D#…Á…Þê-ÌR‰ òD1¤ 8Oûhã½àK¾$Hû¨AüÔÁ̧•|þ8 Ï7~ÒÝ2f!áÝ’cB"8‚2Âc.·ŽÜËÜœŒ™+_±Þ0Ɍˠ^”¾kZå+‡L‡lnªäï!Ö0ìˆÄÁ¡CÆBì;xQ É–! Ç,˜h$ôQ@F®…Ol›¤nuœr_ðz_¢ÜaÙd¬Úll,„‚ôÎ%ŽdÔdÏÑ_iˆ(  QoiLQ(¾ì¤Å,Ô嬿þÇÍ~@Îòì¯øìm|’¼Á Äm-€‹,0`Lù'õgnÿŽjUFCÓAˆ’VneÁ„•ÕÊj…Z(×Þ‚2ÜyÐ!…-ØÁü*‚`#&©-¾ŒëãÊÔÁ,§±üÀ$,fÁXM‹$,aÊ’$4‚ î¶‚áâF&0ÈâÚÕ‚¹îÕýÖ`®iÂ+¾öÃ8xA–çv&ËØÃ \Á1$MÈæd…C—ŽÂOhR|™Òì¡Ê¥) ÆkmV*ìIÅgœ&Š¢%'ò2g,Ôñ)üÅdx‚%"Qù¥hHOj¯¥,](†'y~/¥ÕÆþmXP*¥æl'”°DÀ¥­|¾¯}Î/ý~ju௨úïêü/4˜d=°@^ 7ÈêÖâ‚,8ð7Ãyl‡3Ì‚ñ˜Ø’-¼Ü’‚p0GA½¨Aˆ°,h2#s°AäÁ8”à çA838,¡$? ¡øn!h+·‚“Ïâú(Ä ƒÂL®¾í[ŽåXH´sK(\æŽÃ¤•=Gñ=âÃ4 ”5¤CÎæ(D$Ÿ”Éx‚WäÉ…=mÀ‡UÄkµÙ]üÜ_l\Ó¬1·±#b¢”Ù/J‡´ž¢Eùe”™‚dL(l†)lÆh0ס%ãàß!#þrÿ=ÝGåFÏÞ¬$O2¯¨'°x†%_2|B€ûnjñš§öÂý†jêôïêôâÆ(74ã0*§2Z¥UCÚYC5˜%Qy íÌŽ¶lË(’.Wp ȇúòôppÒU½¤AŒ02o‚^'s ÚáA¿àÁƒüuÜm5/a#t³7ã°ø,‚;ŠÈ‚üpû)¨såºÌ=¸3JÀóÿ”æ>ÔÃÄ«,nèš^=|ƒ<§á¿¾—Ö¡8¨P›¹I[Œ“]¸É7Ý„U†_ôEZ„ä\d4oôk…\ÀÜG³Ho¬) …` ´jÑíʆ Nѹ ÒÕ´ixoåþlÑNãìdLÝ®HÔOw—Ï5&»ol!ñZýzr4è/}÷§C ?Ôƒï)\E¼ë?{ÂÀ6¡´…¨‰8(Ÿoï…(`ÉñH¢EŽÙÙdpïF_lrƒt/Æb,Ô§8‘Î2hhâО:Q¡òã0Ý…þešxO²®LÍ’”P«÷{Ƨ´wÑ®T/ -.NU;D5ä÷«® ÖNã†mæ};¬¸(EẠÂáƒ=àˆCl y4CZ7¯²Ë‹íˆhÚ2{cÒh¸³&èõ*¬Â^kBL9ŒÃ'áA³:³,C@žˆhøØ¨¶66#„d+LØ’œä¢3.ü¸¾)$"ñ>¹=—”\•ö=³›ù8|Cèz?ø¼ÆƒC¦ÂÐá•-_ó‘œ\A,¸C×,Í` Æ]´˜DbRŒŸ¬y›ï q'"ñj…ÈSœïœÓùéE^H rEÊJk—\þ/ýi€'®,wºkP·¡E²J£ânøPõ DÑC€ýú–ÁÐ^:ýŠCTƒ«¾jg­Ö2ð­Áâ•…œ•‡ íâÂkƒfªò¾ŸD¬wúKƒ2è²òÈAL¸‚Ü‹¾ûˆûâë|W^o²ƒxA…|R>†¨È‚DAhŒ"|»¶Î¸’û‚¬¤{  +åzLEù¼~”Ãk0 ¥¾›¶¾»Û7ƒ~À×C<¼[™8ì˜@£ðî—æL8°ÉAçfÈuÐñ±±Ô¸ƒ¡t¼Ç»±›oI›•¼Éo,Ê/†[Zû%u/QeþD§E}†ÐÝüyzÆ#Kò'ÜÊ¡ëÊ'ˆ€n|€*vW%=Q+¥œÔ-Ü*”è÷~_m4Îê+;ð‚Š@$ƒóA D&MòæíÛ7p‡)[¶¬™²d·nႳ1X°…߯cÇ_¿~ÿþ™Üw¯[5iÒèÐ ägÏ=]¦PÙB… —*?r‰2%Š•2o4iÚ´tÕÒMšà ˆ·~üˆxcwÎÌ™+T¢T‘’%K!D‰19{¨#C†´hù9eË”.zÎ4M˜5kæèÕ«G’pa~#ù V,_cs9ìÝ«wî;ˆKš¼ŠÏ°{/Vœ¸^¼xðà½S}a”jׯþÝ 1pAÆTž4´'D”8O¢FQÐ`bT* Ç…¤ çÎÝ;æÏ¡ ñ:óv×±?ÇÞ.\÷pÒ¹{?ž|ùñ±Ð«R¿^=ªN41qB(S¨Ná?%ä*ÿ¨„á?ýN)Ð@M ¥“DÁNè”PB!Å -Ì 9 å :ùBPH$ñ“QLñ“Nˆà"€ …àÈa#`:êh!oòȃˆ‰BÈqÁHeœ‰Æ™$£iRmž¹ª¨ü1!…¼Ça’aÆËdÀd&YÀ¼(#\€&A)3ÍúÙ‡3k¨¹c>†ªË§*Àè  ˆ²b þ6dÑ„§–ÒG‘ơʔ¼™äs踋)ˆ’B‹,ØJd &–8«CÞŠë§(¼°‚;𠆚†BŠuÊ*ÛêÑêiLNz€&²{èÉ¡k†‘.ÃŒ¤\é&} ÕGÎ{€ L1ÓRsÍ„ ^{- nƒpDÑ •w¾KEœQ< BwM0á8–sιê óD|ñÝÎßë¼ÓàpÂ3ÏàƒÓc½T@Ï!äcñ„ùN° ?ÿ@±ø¿ LpAŒ°ÂSL)¹ä QÖ°CAðãPLTEL.რ*øaˆxòÇQ€ :H!‡Ø—£LR›l˜ÞÆþé'Ÿl2šgžaæ–!vȚʃžè1aŽñRlf¨3ªŸæ™fÀ<æÌ4ÕôÈ!7ßÔLuÊ!D 1´#Œ¸¯‚¨¢ÈxC]”Ú„M2 $v­ ¥qžçœ@¼º"Š(4-ˬPY"¶!K 2“Q^F0÷xž=¤ç—UÂm®Œ¥kÂþQq8'B @ˆ#u ]ôzG*4ðÏó¾ÌžjäÇÌT8Ó:ÐÌŸwÌeÍk®=ÙÔæzR¡ŠTÌö?ôPÅ\ S¨“·ëd§)Ü O è5 >A Â}.·Ÿ5( bÔ2¸À q`Ãha ‡ÊbIÎx’DHѨYmаÅ,Œ!%žQeã°ÆHGJR/5ÔŠÏPéÔŒH&f,ýµC9+ A K'17ÄøT3ø¬0ª +Í @ØU&G„Y æ¨Kd"©+akÈ‚¥0`+˜! Ã1¤Á³¦µwmm^´üŠcå¥É™´FîQþ’”„f2—1 >rœ»KRKzØH<èqXÕˆ#³é»€ùFAœñõ2|çb&pÜ„ l|Ÿuü´LZhrg&›Wçp´¶µ¯UOli‹ S€BП7Ö[Aÿ6Aï¤)0ä¡OÔÌž)Lîr!é~þ •†À¥EÝ8¸ ÙÝnw¿ Þ§‰w¥hcF-jᥫQ…y‡9â+ßù¢4¥*5µ~ù‹ cØAøCq‚©°Œ¥,eùpB˜ÚÓŸš„!Ž]…«âS¬€r áj¤|Dbª,¡(D ‘¹` S]À‚þàbKcÆÃb«[uŒ;`e2“öˆA=N'þjá£È$9r’áºdÃ>¹zª1-/@œÆa±úZlºÐµQ|Ç™[cæ3»O_¤uÇšOÛ©VΣ³k·y O$°‚&ÅÅ AA¨d3ÙÊ:X¢!ˆôÏ>éJÇÓc€@uÙÐií>ÔÚõ¨)Zj#6´KLjUp Žz„t²>5­Ñvß[w)×ŘÃ|,› Sø‰ÂðG‚î$Kz”¹&Äs›ÀáÓ$r“x‚¶©"orTŠ`‹[à2nrwá èV÷KÚ]cx+YÞµ£7µ†pŽ”Lë3õHVIêAy_z¯l–(D¡.×þá–á _|)Ž L§²¹'Înâå® xBãíãü–ãÌ5[3ËXÉùwò…¡B à…ŠSÄ6æÝŸyo5˜2âÚŒÈúùÞO Vh¿Ñ‘®ôO/)Ô¢¯6¤^µ“vÉS†À꡺Äëè«Ö¨hìö«¿Ì®×üà Ð@® 'Þî êŽîH%ÜN¬À:,§¼á œ©ÂÈ$¾AÃÎáÿ"@ Vðî40`îÜâoæ¢.lâ ,ïÅ0­ÜÍÆ’ àZïó>CÃŽ ÉJo+ƒðVOà^ 5Ö%zã—(À]&N{ÄçbÁ²vCÜ!2Kâþc«ø@k™šIù@Î;Ú!ðÇùà ú̃Îdë¬ÏœD&?ðl¶øðÏHFA`.?¾AlŽJˆÑ:ýôI…”K™ g(­ÒÀýåèâ pNjþ¼Ëéžîþòf!Lâà@#$…bM¾0ìl-¿ÈŽã ×þ ÖŽ.¨ ߢS`ptHåo¤`s¢à ÎÀ cvãÈš]/ʲ%.±2î²Þ¥ +÷¤c|rC^†É³ÌP™øÅ\Ôl OË\þà0ääÐ;þ'ÊÉaˆ© 7Î}ÒL Më´Ü,šRšH>°¯"cËÎîL¶î,þN A±?dnæ ‘f>ÀžøIŸBÀç±Wò$ûI_bÒâ nà ª*njìo'Јz’¤®Fë¸a"dm§¨«×`±×ž2ØÜN*ßBað,F§ÂM ~Q­ ¦v,uŠ©b%Çd¡Ê -Õò/°- aþf.éÂ.ºÀ ü Ýâ`/¹ÆÖÊÆn,0=0ñh„ðóøM ûÁ”8O]OÊÂøÈ,F¡ ÃÇ ß3+‹]@3—D³[ø¥ã<®´þÅù¾CT³äTAå\óœ²/b¡;èP6·é`Ž#£”@@²7OH%3K39-íÒ˜þÓÆ`ÓØ€¡j:!Jir2¼´³Ô@±¡èà`Ð¥dM»ŽÒ<™=‘¡šr=É s->ETJÇ>‡"Õà+·!úvÆá*§„AÞ` ÒR*ãÎ25.±1Íí &4*ô%¸áB‡%CÝêYÓwðê$ø!è!D3iDMð .—äã5Ö%9¦Œ7ÜAÐ'N82Gϰ:²¬G}´~ò7†4únƒ?†7bKCTæ³>Qkj½XQ]g«€`øad¡Ø @Ÿ1.àrL6.þ„ 0¥íÌí |MT-CýÒDW52ø-ßðzLV©åõõpl¥,3[HftE…àEUã;Z#6òY“•:˜)ù<î4 Æ8€Ô*Rä°Îd#e+¼É? ó©çÒç6€!­ŸÚÏK™S&ÝÀ Ú`Lý¶:_ƒhp ¶p¡HâTªš¡ëHjzáN÷õNJ)‘×Òî Ø®=á.sãT:WÜî“+ÑÀð`,lkªb$‚4!”ÑP(UdÂO 䒈«€ x¢.î2tÿ@äàÅ”!ÆørxÙª­LÉx;¯Pþ‚ÌàÀys‡VÕQz[Wƒ¡[<Á8<Fg´]Ëþ Žße8Ä}Æ× ©£4rù˜éi[óúâ#öV[·ÕÎðc­üεçЕŸR²X€ Øý¼´98éúÖþö^³S_Ù”‚ņmàÀuQQƒ¡h”Áƒ÷5„sm„ÓÀ×€-'ê¢ãN` Ô"è“,î3 ÐÀ îàØ”Ètó:V';6)d—vQØOrWpv„»à òÒÒàŽ!Šƒ·ÝÞíŠ0huȘ,|Ç1Ég÷Œ£5àA:B^#¾'{u}fôÉç{rãŽÉ—:þ±GþùX€4@8†#i•c˃~í,‚ü"­‘Ù89’1ºŸ(Ù]ßõ®ë¤ÊÔ™$p%˜'ûÕK&âp´NÄd¿J*Uy;Oj"ÊœÒ (.‚8.rÑ–Ñâ*KGÜØSÌ *ãÌÀ \¤g´¢t2¡\ÍGBÖ1eO‚Bw•ØÜÐ /a›+BŠÏŠ×*“nì¯ðÍœ©År Vãúv2©vã¢hkàÁ®`o]x—Äi•6|Z#Ë„iø: Ÿ#3M€ ·£;¦õ}ÑgôçùøG³Òkƒ=¸ ®K1º´#™€ ø€]  øØ Ý³°¶_˜ƒ²ÝWl—`¢‰äÌCŦHCA´Ëõž Ù´iü´q&µ›s ˜Óf!a'ïÏÍ“;m¤(Â¥F9@GÊM›Áq…»J„ù¹i'tþ" |".AGÅ*Ù¢>B ÌàR†‚(¸ ÒÈœ…°°!)d Æ ½y‚½1e øBi1/Ø޾¿Y­Ò“ü 4㼓h¤/¼cú¡’ˆ%MTO k®V©ÓÝže‰öؘ—î—èbð§±û9¡2ñ…IÙ­µ;>ŽÅY\Õãtn-ºÆ}]nû)&9:o/yL}\¤ï5Èñï¾ð«¼ÊÈÁäp•Q ¡ÁD¦gz¥za2¸ìì JX”–ß½¼-²àv¥`,#~·róàöá»3!$eÎÊ ¼‚.v‚'þd¹Ïï’òôÀ×ÀÝ› =­ØJV[5%èa#„¡®¾øó‹WR µ†A€¡ Ë Å®€!Eã¹[t¯<+H‘I3ÃÁ]4 T=™˜Ã ß!7X=ΧZ‹ƒÖ×;&NmLª(bÞ6¦»$¸µ¾lz²•{B+7ØfY*ë>Aóžî‘!CyÀñ')‹B…RJ‰ÅŒ7~üpiÂ1\=a²f¥ÁrÊ–‘$·P™Ò¥‹ž+hþüñÇN1dÆ”)“Æ[µjÝzÚ³w/¨Ð{øú­Gï0`ÄÚËao˜T8pðу3ÕZ½‰ß†Yª/¬¾{ôÊš¥Þ»µlßþ‰Ò !•¸µâF ‘+ÄÓOmûúýÛ×Ý;w„Ã¥%d &<¥ ްäÉ’ÛY¾|9œ'OBµƒ ù3èÑ—U‘útéC‡8€x »5×°c×¾;·îݼ{ûþ=»BcÈqÃr6ofͪeËV/YµœYwM›öíÜ£yÿîý™øñÏ’Ag†}²ôÉpÑ( ý²èÉÈ^|²Yë—-C† 1qÈá’WèÑ…H[LÁEZhÆ"†0âÈ!‡$b¡…’DNBY ´CIÇ8ü ÓFCLrŽ5uÌ!Ç))XÒI)u{¸HÄÌ„ŒM8å$MO>þ5>üôóO?ø eÖXÓR^Å”0ôàãÍ8ýì#V˜úÐ3æYh©åW*l°–fBŒ"N*iÀ`væd©p—Bˆòe‚ŠCh¡â„C¨g˜µ“ŠŸž€&Zh–©‚Êi"| mºµÆ©¦À} j¨¢òÆpÅ‘ƒ l(ׯ Õ«tÔ]‡]vÜu‡_4ö‘× ë¥ì-xxSO5Ì8Cß®ÏäúxÌDÇŒH€ü±H ŠDEÞ>ᄆ…Hr?”Ân!K°kÈB9ÁDõÀAF DŒs~œÅŒ ž„Ò íø sÌA €È4cSN:þÙÍOPÖä“PBÉ”=À\5 SI¥>õ°Ó¤˜aÑC%0¢|\VZ‰£v§8œy¢Á(wþ¼Vž{š— ª™ J/颞ÅÒY^‹¶ƒJ(˜\ºšl£nÍu×^o*œq©²±ªdwôtÓUgxÚ¹­ ³ÊŽG_zÏ w·2p°H2½ØRŸ²Ì†'ž-üI;­rø­ŒÛ.Ø`a@(!…‡’H"’ŒÃ8…0±D袿[H¼Z4”‡—xŒaàœCŽ &g\Ï“ ò=^%Ö=cI9D,¹Y-/%•™þg&„æÉbqí¡±Œâ ÑŒ½[‚Í?dKSÖ¡˜ ™'–¡¢ŠS|ªi k:õµ*p¿)UŒƒ²‘íÍI›ÚfuÁiPWs+t~å,ñ(Ã=ã¨.láŒjp<ûéÏA-kaK[ 2 ¤0@h *„"6Çr|Ž  èॠü`"å°B~À"jìvTL‰ô€= Larø€šñ»àñäH÷ÈQ–Ô~$eyB¡Gî$é‰%(ôÆ‚1Žo,…)Ö€Y¼'³¿ŒÂ£°Ë›xÖô æPvÙ@Ñ<1 Èf0”,L*“—ûþIÆPâpÇÔTa Ô`M6!` )O‰ÊÛ80 ZÅ´Áꂽ Õ×Á»%Ãjû3îv‹!«Éà àp)gÌ¢É@\1Ї9Â{`I®À­:H‡šÐå ÂI(‚ˆä$çŠXˆCÄ+ “`?ð)ìË|èÂìyO*^ Zt‰ ÑE =,Œ9Ϙ1«PO¡Gçh 8¨ 9ÈÃ7ø&•ýÑLLßbƤâg‡:Œú”¹ OPáˆK8„ ¥qRžœT(S³šÀ&<õ§R Ô îf•7p%((KXõb:ÌÌà-ÃÓ¬\2þ#»|Î,haÕ7 !ç G3r¹Bñ@ƒ—.œ1ÒÀ¸? á@ ¢‚ #7¹¢@ô"@GD%èU x]"J·ƒ”#ž?xDRE+®uK˜d"P0F¬ c¬PŽ×¤ìÉ‘A‰9*{Tâ²±xï{ࣀ#… Á¤Ï0íƒËþô˜¹Èv¥‚jÌK;£ÉvxÒ4ŸÀšNg³ÓR u¹ÌÝšoÐW"5©µXª,šÚ¶§Þ'—w ay’a é$Coûª‡2TVýÌ¢Ñz! ç°A` Sœ‚[O×nŽàPÄ9ñÊ„½òµ¯Š(! 1‰zðÃþ Q¨ìì›X,ꨱ‚˜ƒ:ÐÉꤲ»‡‚²5nvc?aÊPæ&²˜èK]mGý2ŠÀ©-î`dm5°œ!ÊN»ý‹&ÿÄ á¨ÚÕrúÓÜp긪ÔZsŸ¼\2G‚E•…•-È ëÖò:Ëzª1¹ æ`j„)Ü•—õ# eÈç…ÅÐ\²ú"Ⱦ Òfµ°!~„ów-g€õJÄÿþõ*H?ÊQ…¤®^°Ý°˜E +ìG–,ð([Y ,©I åìPB–Ú0Ïdüø˜Š7ÕM ‡ÂñF Á}&Ðñ\y'ÉИ0Ž1A!“FµŠ þ®I2”ìP9ð oˆî \eåWÁ*˼Å/hÕå\yÛÊÒ[;»17íŽç<òqµǸle±­ bƒÄ vìÙB}.b9ÿ»„D¤Ó‹È‚7Ø¡1HÁuçàƒ£SÂ’~ú €x¦ÃáŸß]šÝãO0v’qvúˆ¨CRƒ8)v1«il˜À‘Œq ¬q s¶èv~¡ jT“5c'{ç<ïͲeñìéF{–K­…µ±n+}WíÙWߎ¹Aò´pÍæ®–Ò}…úºµv\Bä ŽFÂB…@¾HDDè[ýN?!…%²ƒ³ÃQ¤u÷‡JÓáþ8A'Öz`¼H Êô<=&¨€¡÷¡¼Ÿø9 ÓâCþáÇGâŸpü&•bh·öq;ˆ+Y3zH€ $ÏÖ¨—zJUm½ð ®g¶',´7ìP è,†“þ±{ g²ƒ WàVfìpxð ;4v—Svõ¶|Âvþ““nw®£õi¹£;ÿÄp^ôpçÀ2q‡FcxË#bC ÖjM˜ZÆbÑóGð29ÀP¶¶1×kA5¡Ð £ÄÇÅSÊ…\±¡s¨†Íõ\ ˆz³”eV¶TXf{ÎЩót8uºWuqV°3"ÿÆy ß!að!d×.í’!29`PY X^0,°sEY„wz' ÷ƒÃÀ2~× Ãië%Ö€Ô3ZUˆÃbaArP˜=ôÐ U˜½Èiñb3Ó…[è…±`dädµQJœ²†ÍH€ä†oX ¼À F·TØe‡èþ ³W{ÞµtSìµîunÒäkÕhP|à Sà-ò Yñ20(W‘‚Þ"í´`ûxæ0Œµƒ=è}¢8ŠÀ —Ö æ—Šžf 1PÀà1rd +ÀGÐjø0 V’ܳjv¢3…ä3ÄØt ÈŒiˆ†Îè’¢ÑHÓfeÕÅL®8Ùx‡½°7õn!TfÀBUCIUi¾Duf5 ÓÔ8x X‡U;ñȈ!W99â-]ç”ü@ ­æ`å\Ôpià‡á—Zqžæ°„u¤OA2-Ö2VØÞð ex‘g'ŽþAI}Q(þgsÇ/ɘ©d¥'“Óft69‡x¨“± ɰ7ã`ç• Í ½+ÎAš¥é³4š€ƒè0ÇÀ{iðfpß o±#|íöŽð˜‚»™¹yfÐNõ€KtÓVÿ${‡–@x ÊP æ°$ü—fA%JQGqÔ~©¦=£Õ‹9 æ@ìb‡'˜€qª†b˜\Ž Ÿ ¹ “C—es—¹tÞÑ î¼4 ÑADI »ts¸–íå^" rpÔàNÁà8Ø´u'‘›SÙ›ïHg[p]I xÀ"ÖÀ#v– „é,Ì þÖ0øGËó<ô ÷` LÁX1 ®øs)f$ršEGŒ†xò…Gv@?UJ ŸOº†óYŸ² Ôxxú¹tÉLÄ" €3” *¦cºšˆÃ q€éò w°V›•íµs¡•÷5X üx°/çuah‰¢)ª¢å¡ Â.jd–õ1ÚF6zxa2 ) }d©Er¤ÖeÀx'á`ªÀÁv58Ge¸Œš‚@Pʪè@º@ŸÑ¦ š`eUJ÷ym¯§¥Ûö,³“0}CUàÇC9¨„J¦«Ir ÂpQç Œc ³•öEþS­Öz­íV;)a%ÒÔ@pÓÏ„aǪ–cÚÅæ@1S?? +O+ 0ced‰‹Š“–”‘”’ƒ‚?@?N+%#="ÿÿÿ!ù ,þ€‚ƒ„…†‡ˆ‰Š‹ŒŽŒ’’†“”•„’™šƒ … ¦§¡ ­® ²´¡ ³‡ÁÂÃÁ‚¶¾‡ÑƼʈà Ž !""##$%å&'êŽ()òò$T”[ÁBž¾EZ¸ ïÅ<4q0у±Nü›ã† ZL˜1†Œ4jèˆÁÆ ÿ({€á@ N˜ÜÁ£‡@‘!äß"Â0Ô,P$‘#;‘$y dIÐrLpÀ£É N ÐáôÄ“2v@‰¢ƒ”)t‚P©Rt„•+,<„3rK´;´l9ø€Ë ]¼lÝ(ïK,2À„3¦b¹AÈ€)c‡ß,Y¾Œø9Ì4ƒ=H£f ›6å•vóÍFÄ‘3‡N;vî¸ÁcC¥ÜòèÙçŸÛ®”ÒTªËU ;xcrysden-1.6.2/images/next.gif0000644000175000017500000000025211712736221014766 0ustar tonetoneGIF87a!!ÂøøüøøüÈ0,!!wºÜþ0ÊIY¨˜‰p3ÞœW!NdyF`0¨«ÓºpÅÝxν&µ½Àà@ÇóÑ„@­ÇR:qÅæsúêG:D4DDMMSS[[eemmzz qr5BF6DI1HLGIW^A(O&T*ckv~,YY|cEJPDTZDWb~€|ŠGw†Zv„Qv‡`‰‰š™’“ŒŽ—™§§««¾½¨©§©º¼(³·*º¾0®³,¾Â1½ÁÁÁÎÌÔÓÚÙ ßßËÎÁÂÕ×ÓÕÞßßàääèæíìààòòýýâä,ÉÍ*ÀÃ(ÔØ,ÔÖ>ÁÆ@˜žQœ¢L´»Rµ¼S¸¿mŽ–~š—w•š|´s³½S¼ÄvœÈk¼Å¤Ä~¥Ót¾É~¨âRÉÐmÂÌpÂÌwÓ݇ Ž”›…'Š$‹6˜ ‘5—?2¢­ª²»£+ŽR˜\·g ±³¨²5†‘K‚•aŸ¬C™¬h•«x¨¹U¡µi¦¼t²Ð»Õ¼Ã.ºÇP»ÎcýÀÀÏÌÆÌËÌÎÒÓÏÕÒÚÖÛÝÇÎ1Ì×;ÚàÜèâßãâæëíçîíáóïòïÿòîòòõûûóúûüþ äçÀÍKˆ†‘Š™¤­Ÿˆ¤š˜²Š•²ˆ§¦ˆ­¹¨µ–·°š»´ ›©£«¹¡°¾©±¿Š²Ö“¶Â–½Í™¼É–¸Ä“ºÔ’½Ú‹¶å£¼Ê«¼Ì¤´Â´´Ä³Ê…ÆÓ’ÁΙÀÍ›ÅÒšÃÝ›É×ÌÚ–ÅÒœÉãšÅæšÇð”Âø¤ÀϨÀΤÅÔ¤ËÔ£ÌÚ­ÅÔ«È׫ÌÚ¤ÑÞ©ÒÖ«ÔݲÅÕ¹ËÛ¢Ìá£Ôâ¦Øæ¨Óã¯Üë¬Üæ¡Ðü!ù!þCreator::XCRSYDEN-0.x ,11þþ€°ÀÇ‹ *éÑ#HÙ8,@jô¨Ñ£F=‚$À€””#¦*-7<-@4@4J>N=E+6D*4I,7P0=L@DBLFTFXJ]\f^lXs_zSjbmf|k{(GW4A^:IV9Gb=Lk&`z.`{G BIST\Xee xxx,u %FF EDCBLPSS [[TT[[edfhxx vvuu~~{|@O]EToL\iGZxJ]}K[rM`UhuUj~\o}g‚k„mˆt‚tzŠ }“Pe…Wo‡Vl\oŠ^r‚]tŒ]s“bx„eyˆew˜c{‚›ˆ–‹£ˆ¢—«—°›³¡¸¯¹ªÅ¯É®Å³Å¶Ï¸Î »Í½×¾Ñ/®Ä ¼ÅÊÜÁÓÊáÛï Öê ØìÞò ãøëÿ8ìþ2âóe€žm†“lƒžj„¢q‹§sެt’£x¬|’¤v‘²x–·}šº} ¯y ³^ÃØ^ÉÞzÈÞŠ1š6¢ §3²,¼!<Çm?‡‡••›š††!‹$ –”(¦›#¡¡¢¢*´³"¹·(´¹:ŸzÅÄÄÄ$ÉÉ-ÂÂ-ÌÌ<ÒÒ ÕÓ(ÞÞ-××2Ö×=Ýá>ãã$àá/áà5ââ=ôô<ÉÒZÔ×Lƒ¡¾‰¢º¨»…¤Ã‹­Ð…³Îš¬È‘±Ê–¶Öœ¼Ý“µØ©¾Ò¦Á±Àå‘Ìé£ÃÚ«ÇפÅâ¦Íê­Ëà¨ËíªÑõµÓë°Õó!ù!þCreator::XCRSYDEN-0.x ,01þþ€ `ȇð©*#h‚ISªN pø3é¥H HpùReþR‰”¤¸ü"&¬€@#+ALxáâåà¤='h¹bḚ,p'_¼HqBK°b]`PHß: þàE`ÅÀ@hë¬`Š,aŒ=k²®Ÿ &¶8û6 0èáˆ]¿DX°aö Û˜@ŠPÑz‡K–¼\´X³L¶6g\Ä85zõòÅ[§ˆ¡þu{ h昴pá¬]ë&Ž[¶jŽEñåÇY÷ ޲c×¶IköFMЃ;³î½ª @@ep¹‰1!€@êÄÂG‹€ŠdÞ¢¹zÔqÔë€ håþ¢@И"iÔ¦IK iäâðÀ§Ò§U¦„kãØ ¤Ò£JŸŽ€sçÒ`Á >Løt@:øÔ½ À‡!8.þCüÒa@Xþl@tþvùè@Gòøé þ @0Qº\·êÉ¢°áϤ&F íš·Ï>Gv¡Ë@èªU¨ZùrWëÐ)Q¤Ôº·¨€XP)R¥O˜)ñ¡A€!|ªuï Ÿ$€Š èaÇÕþ½t"ÀC`£N#^¢‚@€ Iž@m ¤À&”2¥Re”Mâ´$þ øøAÂä6ìÀa!w€;xcrysden-1.6.2/images/ballsticks_3d.gif0000644000175000017500000000665211712736221016543 0ustar tonetoneGIF89a01÷ÿ      $!.& % $'%1,3/825!+$)&6')5 ; 3<1--(&++.3>>99)-##*4!)<(2;-@4A>N8H&/B%/M'1M*5C)5G*4R.9V1>[BL@DFTFXJ]\f^l_zXsSkbmf|k{(GW3@O9GW5CW&_z:IgŒŒ ‹‹„„š™››‘‘—–,‘‘"¦›"¢¢¬¬­­´´»»µµ©©&¸»; {ÃÃÐÎÔÔÆÇ,ÖÖ-Ýá>ëëööçæ6ää=ðð?ÇÎZÓÖK†µ©¼ €ŸÄ‚¡Å†¨Ì‰¬Ò…²Îޱ֕´Ï–¸Ü™«Æ—¾å˜¿æ¥À±œÂæ—Èê¨Æß©Ä׬Ìë©Éä¡Êò¯Ðì§Ðø°Ïæ²Ôî´Ùö!ù!þCreator::XCRSYDEN-0.x ,01þþ€À‡8ø0ÈàèS(#€²äÚfÊ@RéÒ¨L €ºxù 6,ؕЩ$G €1ºÄèVl˜¯þð!É“£@1c¼„& ˜¯+@°S)>€)fºhñ2&L.]X„]½$¿ÊP©¢Å‹/"PçÞ»bºXA¥J•2_´‹žºþ!¾TbÄ3ÄÈ@–ÄZ÷.^½U>ˆ(âˆ-¿Œ=3‰ 7dÙ‚µÎß?~Š 0`€¸4ófíͱhÕŽ¹îÈR•ÊV¾|ïÔ½L¼qÆ-[¶mßÀmKC uZ±:d(U,tèÔ1˜H6-Z´lâÆ}Ë–lÙµsôÜ©úãgТþTªTÑ@8VM´jÝÄmÛÖM7l†¢ã$Š@…q˜€ ²eÒªe«Æ¬Í\´#“'QVŠ0aÍ8É-ƒm ÐñgNŽ6œ Ê÷ꀀÌÚ6màÄIÇÀ† nÐIt‹Ò† ‚Y4gþаi³‚ @´òÈ&HF@ÀM2gÍØ¬@AÈ€G’&R x€šmáà@(ÀC#Iš„råÖ€A ª<ª¶?¶‡G‡‰A‰‰R‰‹[‹“[“‹t‹’k’“u“¤N¤£W£ÂÂà ÃÒÒÆ^Æ„…„……‹‡‹ŠŒŠŸ““‘Ž‘šƒš’’’‘™‘˜–˜›››œ¡œ¡Š¡¢’¢¬›¬¿‡¿°”°¿•¿¡¡¡¤ª¤®¦®ªªª³¡³²«²¾ ¾¿«¿´µ´¸¶¸»»»»Å»¿È¿À†ÀÆÆÁœÁÄ¥ÄÉ®ÉÒ£Òñ´ñÃÄÃÓÔÓØÒØÛÜÛèàèõõõ!ù!þCreator::XCRSYDEN-0.x ,%$þ@ƒ  ÃÀðF .`¤XAp¥CQÀÁ><`ðþ88H¹™ax`€p¡Ž§.p, êQVDáJ  Ê”" ? Ã :H0ÄI'@m …Xá@%C<€Ñ¡ ¬p € [‚ä¢%DC ެ  Gà–1sVЀ¤¦!¼Ha@$Ð%¬°þfLˆ H”ø™ÀF” B¤p8 W²Hábg'%:Lq‘¢Ã€E{-R‚@~ `Œ+ MÊÊ! 88Ðê@Âóƒ 8€Á!€¢‡€ €tôPÀH@¥9Ã@:Zd¢r%ˆ<Ñè%h €ƒ&3VÀ<@€àÁ L[R¤@%‘Ðc¤¸'D @HaHþFˆa”l€€‡Ô€ˆò` ÑèÁÁ*, àÇ‚ ðÀ ›!+@À!M4¨à@|Hè`àˆP‰ϋðdŽNv, @’`|C €BÙp‘e€ü`%?~pB!Dˆà€ò#Q›1`|@€'9 ÂN¨øÀÁÁ8ú y°BEŠ€ Îþ8 ð‰‰X¨q#P:@€à€€qB¨3>ÊÐÙ¤IH†A0e€!EJ”œÔQ‚/rÊ@ò´hÏ!®HIÑA(œ–°Èð‹•)J  :8‚%h¢¤XA&‘àÀ€„&PíÀá… .`ÀB¬X‘"€@ˆ>„0èÁA‡¡ ;xcrysden-1.6.2/images/xcPrintCanvas_right.xbm0000644000175000017500000000042311712736221020011 0ustar tonetone#define xcPrintCanvas_right_width 15 #define xcPrintCanvas_right_height 15 static char xcPrintCanvas_right_bits[] = { 0x00,0x00,0x80,0x00,0x80,0x01,0x80,0x03,0x80,0x07,0xfe,0x0f,0xfe,0x1f,0xfe, 0x3f,0xfe,0x1f,0xfe,0x0f,0x80,0x07,0x80,0x03,0x80,0x01,0x80,0x00,0x00,0x00 }; xcrysden-1.6.2/images/left1.gif0000644000175000017500000000017611712736221015030 0ustar tonetoneGIF87añÿÿÏ0ÿÿÿ,W„©Ë8 Óx1A+»XofÞÁ…£¦ÓÊŠR Çê'צRÚ² äzÌûé\Âa(‚@Ry;:¡Eó™rjµUë4»åF®³ÓÜ5šQõºí†ÇÝî;xcrysden-1.6.2/images/stop.gif0000644000175000017500000000020511712736221014773 0ustar tonetoneGIF89a!!ñøøüÿÿÿ!ù,!!V„©Ëí£œ´Ú;ƒÞ¼sé…› C$Ф‰¦é ¹o+{ðS‡·“Ût¯Ù5€!ƒ¸1.ÁP©`²bLhBjE`½ìaKEz `ÈàŒN«Ó˜¶û Ë;xcrysden-1.6.2/images/rotXplus.gif0000644000175000017500000000344211712736221015654 0ustar tonetoneGIF89a÷¸   !#$%&')+,/02368:;?% + ; %%%&'&'('*+*-.-./.565;<;=>= @!!C""E##G%%K''N''O((Q,,Y..]//^//_00`00a11b22d22e33f44i55j66l66m77n77o88p88q99r99s::t;;v<>|??~??G'S.W0^4f8h9k;l<p=?@?{DJKJKLKNON]_]^`^acaghgprprsrsustvtyzyz|z@@€@@AA‚LOŸMP¡OR¥mqãv{÷GƒHŠL ‹M ŒM N!O"”Q"•R"–S"—S#˜T#™T#šU$žW$ X%¤Z&¦\&§\'«^(±a)²b)µd*ºf+»g,Àj,Ák,Âk-Åm-Æm.Êo.Ìp/Ìq/Íq/Îr/Ïr/Ðs0Ñs‚„‚„†„‘’—™— £ £¦£¥§¥«®«­°­¸»¸ÁÅÁÃÆÃÄÇÄÊÍÊÕØÕÙÜÙÚÞÚÝáÝäçäçêçéíéëîëïóïðôðòõò÷û÷úþúýÿýÿÿÿ!ù¸,þqáÂ… .\¸páÂ… .\¸páÂ… .\¸páÂ… .\¸páÂ… .\¸páÂ… .\¸páÂ… .\¸páÂ… .\¸páÂ… .\páÂ… .\¸páÂ… .\¸páÂ.&H8pà€„¸páÂ… .\¸páÂ… .\¸ðÀ:{ù è\¸páÂ… .\¸páÂ… „ £HŒ"Y²Ä.\¸páÂ… .\¸páƒ4j€ .\¸páÂ… .\¸$P0bG‘!9þàÂ… .\¸páÂ… .\¸páÂ… € Fä(% €¸páÂ… .\¸páÂ… .\¸páÂ… €„9v0.\¸páÂ… .\¸páÂ… .\¸páÀ@Æ!L˜À… .\¸páÂ… .\¸páÂ… .\>>0V8[09E!9[8fBEFJJKKOPVYY\\\Wcf]cgYehbefdhgikgcghfmojlkdoqlsujw{svruxs{~‹‚}‚„b|£„†‚‡‰…ˆŠ…‹Œ‰Œ“Œ”•“—™•–™ššœ›Ÿ œ¥¦¤§©¦¨©¦­®«²´­¯µ·´´±·¸µºº·½¾»¿À¼Áþ»¿À¼ÀÁÅÅÄÇÉÅÉÊÆÌÍËÏÐÍÑÒÏÔÕÓ×ÙÕÙÚÖÜÝÛßàÝàáÞääãçèæèéæçèèììëîðíððîõõô÷ø÷ûûû!ùT, þ€T‚ƒ„…†‡ˆ‰Š‹ŒŽ‘Š'”•–—”)™”(œ„+RS¢£¤¥RN§QRFQ¢Q*ƒ,DK(&+3N¹º¹K»¾¹E(ƒ(KA0­-RQËRÍ1'+KÍRÆ0Ö2F'ƒ'GS>+.G>'2#?FIJ7¡¢G9#Û36CJ>.&"+PXÐဇ#AˆQx¤a ö˜ãÆ‹"üü¡¤I$N† ù¡#È’“KöE¤2Ž‹ÿ­hè„ Â#JŒùA£ˆ$4p¬lù£Æ™­œ1Ĉ>ˆøpç£Þ=—0=È<J‘ JxÔèñ"E¬J¤XT„Vå,”, ò£H $p(’0Ꭱl³þ‹›  H$X@Ä×@~ÆŠñíL%L"7À`À‚yr[ËFìóñ‚TýÕ‡iÁ‰A¸£Eƒ<`€¤©·+Ë 2¤ˆ¸-6tØà"j&Bl_=-SsÝ@|É¡ÃGQO|HÞfƒ²[%`)B¤¹Î!DŠ,a¶o½Ä 2u 5ä”sï`– N(¡„TÚRÂÙ`ƒY`¢á%2QG qC„’rA '˜àA‰,¶èâ‹0Æ(ã ;xcrysden-1.6.2/images/wireframes_2d.gif0000644000175000017500000000547411712736221016554 0ustar tonetoneGIF89a11öh  )$$ +,22;; <<#&&)$''++;;#,/".1'14(36,6:-9<19==O=E(DDPPYYVYfellvv4AF9HM=MR0chGdlFFJJGZUUXYBI$cclkqnttyw||GX^NQWJ]c\kJXiZQcjShoUkr\s{_xL†ƒƒ Œ¦¦¨¨³²¸¸ÈÈgƒŒj„g„˜nŠ“nŒ›u’œx‘›wš¥|›¥„ 8‚‚‰‰‘‘™™¦¦®®ººÀ½Î΂£¯„¥°Œª¶!ù!þCreator::XCRSYDEN-0.x ,11þ€€þ€€%'þ€K,L&3A€ [3Y3[ -R2[þ€EH1\4ZB6d8U€e</BGV c_ 7?9þ€ZH 8:: SU5aX0€:a N>b*Q]^þ€*:;D9€"V.U@Xþ€HUBWgWE€&)(hSIB!WWNM+"Jfþ€GZFRO+€OKþ€€ˆ€€;xcrysden-1.6.2/images/printer.gif0000644000175000017500000000211211712736221015470 0ustar tonetoneGIF89aòÿp€ÿ¾¾¾ÀÀÀÿÿÿ¾¾¾!ù!þ& Imported from XPM image: printer.xpm,‚ÿp€ÿ¾¾¾ÀÀÀÿÿÿ¾¾¾þxwwwçœÇqÇqÇqdža†a†aÀáp8‡Ãáp8ƒÁ`0 ƒÁ`0‡Ãáp8‡Ãáp @ €Á  0`À€ 0`À€8pàÀ8pþà @€0`À8pàÀÀ€ 0`À€ 8p@ (P €(P @ (P @ (P @ 0 @ 0`À€ 0`À€ 0`À€€ (P @ (P @ (P @` @ (P @ (P @ (P@€(P @ (P @ (P @þP€P@P@P@P@P@P@ €`@P@P@P@P@P@P€P@P@P@P@P@P@  @P@P@P@P@P@P€pÀ € € € € € €Àp€pÀ€ € €Ð € € €ÀpÀP@P@P@P@P@ €pÀ€P@P@P@P@P@ÀpÀP@P@P@P@P@ pÀ€ € € € € €pÀpÀpÀp@;xcrysden-1.6.2/images/backward.gif0000644000175000017500000000247711712736221015601 0ustar tonetoneGIF89a!!ñÿøüÿÿÿ!ù!þ& Imported from XPM image: forward.xpm,!!þ       €þ @€ @€  @€ € @@€ @€ @ @€€ @€ @€ @€ @€ @€ @€  @€ @€ @€@@€þ@@@@0@@@@@@ÀÀ@@@@@@ @@@@@@ 0@@@@@@0@@@@@À0@@þ@@@@À@@@@@ @À@ 0À 0À 0À@ @0@ 0@À0@0@À0@ ê @À0À À 0À@;xcrysden-1.6.2/images/xcrysden.png0000644000175000017500000005616411712736221015703 0ustar tonetone‰PNG  IHDRn€ê\ sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ-ψÝl IDATxÚì}wtUUúöóîÓnK#„@ MD)6ìÇ‚cEG±# öÁ2èØÁ±‹ã¨X°‹è¨£(XPé$„´›Ûïé{œsCp¾ï·tftÍï[žµîJ¸I8ûîgïý–çyßCø_p=ñÄ2èºY³ŽÌûé"vJ :. õÓ´@¡,Ke¶‰Hlø T½ùöÛ§ð>¨"@§žÚÿ?]ôß<¸§žú W]5O?ý5»òÊ üñÇ—Ž Âœóªª! #AU5¡(YĘ€œsضûÇSN©˜ nÅ”)ƒ~î×ñëyD4]×å\Ó‚, M ’ªªBU%’$Y®ëº²iº[ãqsÂyç ¾÷^%Mž\!þŽý7îé§¿fþ×ÅŒ±éB@¸.œspp.H!8'I bL’$Iò ‚­õµ×6 š<¹B<ûì¿í¸_òš7ïs\ý$<ùä²—%Iº€s!\×%ÇqÀIӂд 4- "‘uïNÈËÈd€ÖV!GÀ…뺔Í:æÖ­M…& 1·oß!¦NõÛŽûO_>ú)®¿~{lÉ ]àº\8ŽCŽãÀqlضÇq`Û6lÛ†ã8PBq1!$tîL(( p¸.çLH’¬õîÝé½ñã‹D*•üí¨ü%®n8.÷íß8çÂqlò²aÛY–Ë2aÛ&,Ë‚i”JYH§$‰ pNä8 ¶M二„` bÇÏŸÿñ×]w}ôÓÿÕÀÉÿ­›;÷§¸®[꺮àœÃuáºY–-8w©ãI/„BÄhËÒR D„xœ Ót àÜBÄ_ ”$é7à~‰K’䩆¡ä8.<ûfÃqlrBˆhà\ç.\×F2©A–w|ˆ9çä8–Ë9¯˜3çòéÓ'íù ¸ÿàµ`Á:\pÁpȲ2Ù¶“‚ ×uá8\7g×,p.|H„à\ÀÎ!Ûv„$I$Ë’ ’ÀÁ9'×u˜m[ey4€ß€ûO^\0‹ï.س§Œ‘0M‡lÛòŽcÁ¶m¸®Î98wÉVªªe›dY†$ÉÄóÃAB8ŽC¦iÂ4̓¼ûpÿáË4Í c ‹(NŠ––4LÓÜoÇY‘ërpî Çq¡( Ç&YV„,Ë$I’`LcŒ|+H®ëÓ4È0ôÎÿÛ½ÊÿJà$‰c ¥¥]`šÔÔ´¦i×uɶmaÛ&y¶-·ãá8*yaL’¤@’<Ð<;G¹Ë2 ëöp¿ÀUTŠÇã„€5’e¦iäâ¸ö£3÷²m›E…¢(PŒIe‰$IQ»ç ×uÈ4 d³éºß€û_o¾¹GÑUùåµñÖÖX!ç.ˆIbÐu¦i´—¶mæb;4 ²,C–e0&!À¹€ë:Â02”H$7ýÜø:ûìÁþq)½eÛÎe©TB@H’Æ$8Ž ÃȲ,""ض%T5oÇ™$˲oãdáã¼J[d³:nØÆío½|úÜD¦ILqéRñpÿ©ÉÊËŠ¢\FÄc)Š EQ Ë „°¬öÝFšfûÀ©¾“Á˜D¹,Š !¸°m›…¤zô)­_¾àÈ…£‡¯Qþ0Ëþz¿téÿàþ«i_Ú¼:ÖÖ02"‘ˆ‰T*IÉd\¤RqJ¥Rðw#4MŠ¢’¢¨eÏ1‘$Yx1Àáº\¦Anr:Z8th>õ ¢0Oþ´ "Ý6âœ%kr÷]2ÿp}Ù²ÿjàþ«ò>\?§^†O¾Ý 8âÀæa¡â‰£ ömû™ÏqÝœcâí<˲ȳ{6,ËËaZ–I–¥ ]Ï"“IR2ÙöܪõßêVRT°a{æ Í;²JFwûKM»â¬>“§Ù§ù…÷k¶¾¼¸Ÿ=;‘|XûÛŽû)×}× ÁmOlF/€]3sÌ2ËrÇ7ëCÐkð…ˆ¶6¸©TBòv^‚Òé$Òé8Òé\— ägÁ@1HpîçÎŽmÛ–ôïx¿cÆô»"žvf‡¬ÛÐaŒA×b% ÐÍŠÊL¸p©¾ø/ã™,N¸êkþp?ºæ\sLKÆŸž[»ÿл[¸¨ûæxÊ.Z¹±[«êžºãÞåMÍÍ»ïŽÇÛD"C2™@*¢¶XñxL0D >ˆBÁaš©ªºCUÙÀ >sr÷<ó˜ öög•Nßÿ”xÚ½Ÿ ÷ëÀè¡y(ïªY…éÑ#*÷Q>zrú+÷³iÓîųÏÞŽÛ.û^X»/Ývò ƒ«jõÛÃÝ:+5$‚þ=ƒ(ˆH‹„Øã.\V™ûÝŇS®ûößþÌ×^û(ü†zÿöÛ_À½÷^òË7jÔxtï>”-ZôÌÿó(¹øâ[¤tÚtß~{î?ýìæKÆÐ/|/îºjÄsÄ‚—UíjÃæêT[õsl:ÓZuبѴ|Õ 1gÎÛÓw'Ë2炱<¶'©âÝz•² g¦\ò$×õ³,ee=Eß¾бǞMÓfœyfżßû¦›“lÛuçνšÔ¦Û¸è´A…;wdu÷¢.Ūvðà0è@až¼*dW}Ù×+`Ñcã¤Ó¦ë¾?oN¿þ§ƒxÅ@Ó4öØc×ó}ï=X åÖÖ¦ÄË/ϱà¹çÞ§ÖÖ,n»í÷â? Üùç߇W^¹ pÒI—Õ4í U ‘$i°$I›‰På8îÂW_}hKîo.ºè¼ôÒý˜yñ<üâf\> r÷ŠQË-‡²fs3êöÚßmÞQ?€( Ýû»™3Ÿsvî¬â™LRÙÑܵό㿾cЈ®—ZétöO-H[ffoVÏÖ·µµ¾6~ü‘WG£ÍcûöŒ‚‚NüÐC'ðeËoaŒɲœ$µ^üä“ÍïlÙò<€o|÷ßîÌ3¯ÅÛo?8㌫¯·Ë²T¦i(ŠE‘A$À˜G·p.lÛyæÅø\wùùøËs¯àÆ ûwZKÚ5›[QßbßUSßt7Tô.ÃÅÓž¢[o=]ÜsÏ›wUWo¹3‘ˆ#‘h{}éÒ—ÿ·Ù5ð°ƒ'´Uoûæ¤k¾š°ŸÍœ³pü‡¾ùu¿~C@$‰±c$"ÕÕ›¨`LäB¸.êÁ§_ ³f̓ë <úè г Uu ™¾¿O¤Ý;™èß3€‘ƒÂ(ë¢íÍ ±¹Ç_ùÍC¹ß{ÿ‘qpIàw7,ÿhóðØc×ûß?vcì$IRNbèÇ¡ ’qøŠ¶²YóòÙ³/lš;÷-̘qÖÏîw¿»ðÎ;OàŒ3®,aLùž}‚ªªB–URUÈ2#I‚` 8rd¨e9ÙtfÄëoü¥qÖѧ+Jx^íÞ$¶T§ÐÐlÙÔÖ²ú÷èŠ /û ‰˜4cÆåì‘Gž±vî¬r-K—V®ÙXÐÚômò¥{ÆÔwPYåÊ ¦Ü²üÂ?L½žÿÛ£â’K(Ú ©TR¬]ûqÄ)‚s—Ž:êd±eËJr]ß!ˆ8qÎaYnÖ0œ#æÎ½aå7ÎÃ#\ßþ™§W…Ÿ¶›6L>zÀѵ æ,YÂq½ºi8xpå¥*òÂÒyù/GMûªÞxh,Ιõàúëÿ‚yó®Ã¥—Þ¢”o”$©Â³Ã\H’L@ªÚž@€$ á‘„pá8.L“ÿî–[¦¼{ß}¯³Ûn;—ÿK;nòä«KeYndŒÁu¹ yi'ÅÏnxÁ/cÞ®‚ !„p9g†áÚùÎÇË$¤m;£¨®Ó«*k²£T¢¢w7ª¬Ù»ßy~×] Ÿ­ªÚty*•D"ÑöÔW_½rõGOUžÈðíCîXûíÆ«/¾sÅSpé¥wÝÆ˜t/@BÓ4,Yò 4@xºwï.¶n]Eª* ƈyD¬K¦éB×íIóæÝ°dÆŒy°, O>yÓ~ŸûÔ#úÓK«œvÄ€’–¸õ”nò3»+9(‚þ=‡¤T…Ý~úôo7À*ŸsÓΕW>T †ª%I*&"Î9g®ë@’dhZP¨ªFŠ¢ EQÈÛuDÞKÛv ëÎ%·Ývîß®¹fîO vÚ4œþM䥣¤]Œ8÷¶³w !|I§¶*( ¨*ˆX€1Ø¢€)Û–5é‡uõغK_XYÓT¤Ý»tF´9sÞ<ñÄ—]ÛÚZ.ÏdÒ°,ƒ766ü²/VƒjÜASSvL:ûXÆØ½D$A–eဆ`Õª¯QXX„mÛÖƒ1ÅÅ]—'PTä ‹„`HB–eWUåϧM{ ëܹ×ÿhmêiƒ°hi]ëòuµgM<¸ ["åþñËãXða3¾^“8uo‹¹ñ­GÆ.ÿÇ3ãÇœsÓhš¶^’¤b?oÊlÁ'ßÄÆnÙ™ýîµ?ÜòØ}@Léɹë'»= ¢²rz÷€nÝzQmm•e…r‘Ñh“¨©©&I’Û•ÐûrÁ9Ý&m¶ÿ^ À1ÇœEÑPPP@­­-Ðõ,ÇÉÙbòmžBç\¨jÎNËp]™“DN­?a`þtà‚­™LápPȲÛN´oûœÊ8·û$ɳqŒcðtúûD;^6À¡¼¼èzöI’Šu=ƒ1cŽ9Ú²ì«,ËD&“ÜN·Ý †óýcŠ¢Idö¢[UM›Šf²Ûªb'4"|€‹ #H$ˆF[ÛCo5ç<8 ®ëB׳ÈË‹1†×`øðѨ®ÞÛ¶¸®+b²,_ç8N–1ÖÝKÿ¿€Ð·z“É}à:þÌ/ ‰Ø,Y–•.]Š „‹––f˜¦Ñ>.ï¾À>§Ê“aä|ñû'’wÔþdà~ÿû1þmö¹çÞÐÐÖ–ìšhNQì8YöÀË9%Eàœ#›ÍB’$7æZ6LSoݱcå²}÷¹þ©mÛ6º¶mK‰DlêîÝ×üx,=ºv[0@Ëný ziŸ>D<Þvqkk\0&Qn\9ïÍcÉ%bH’Œšš*xࡨ­ÝŽþýbèÐÑøî»Ï Ë*¼Â“oݺâ)ÇI»ÿ®srì±§ŸÇ9ï‹¥`Y6òµ2ûÆ·/ö@sÛŸÃýË-,Ó4~šsòÚkäÎðº®ßì8®`L"" ''ÈÝœs¶ÍйsWtïÞ‘Hß¿’¤ ÉGIIov†Ë#³·è„ %Õm~óÒAG½qÂŽÛJ=÷?óÚ5‹×Œ{6ÇÆÊ•ïaѼåӮ_æ AªAéxz ÜÿË®¹æA †EiiÉ4 ìÚµ£}q¸®¯ìÊÛŒ1ôîÝ€†H$7®ÂĉÇᇖ ‘hc Œ± Ï=·t çnP’d…H^±eKKòÁ'ÙðÞ{•p]àÌ3+þ&à¯xì±KÁ¾àœOÕu eeee†Õ«Wûr Ó?r!‚ÛvriCÿÔê¸ã<p6›iøY*/Æä'³nfŒÈäH bäº6,Ë‚mG…$IdYP&œHÁ`:u*…¦yÕ4ªª@Q$&ÀNtð´½7måMMÜuL¶u§} *ù/|àé>bIG,ž;®ÐR˜ÄjWxÝõÏœ^˜/? jÌ0,Q]½ õõ»¡ilÛ$Ó4`š&rn¾¢¨„Ãy¤ë”•uÇæÍëQSSI“~‡]»ªP^ÞO”–vˆo4-Š"ƒ1`üøpzܸíK ÃùãäÉëàƒªpê©ìïþß±sæ\€Ç»Ô?>%§[·®ˆD‚ˆÇÓhnnk×}r.`š:lÛ&ÆL8Ž'ìµ,¹£>Ô¯ðÌŒF¥æþä8nÊ”X¸p.Î9gÆÜl6s}&“†¡“®g„®gI׳°,ËWXIÂu:ë¬ËÑ­[o¸®Óž×´\&ÜK¤z™pF¦i`åÊ•¼¹i7 ê¯?n™ú3/ÿ=¶¥ãÞ¸oôq…¥]>éÑ»oyp‹éRbšvïÞ]»¶Ã4³"?¿Žã®§E&“¡l6 ÃÈ (Š*c‰ä‹£Ž:Œ1²,Ž’’®¢S§RâœC–eƒA¨jš¦ Ue$A’$ ƒ,Ëý>·N:ÿü!mï¼S‰ßý®÷ܳ³gOiëÝw/¼°  üL8 †)ªª¶Suõ€ÂáR©$t=ƒL&L&-\×ö“Ì*I’â'1Iä<Î9·,CjlÜùÉÀýþ÷3aš{ç'øäÉWnÏf3ý³Ù¬0Œ rÀ†Ž\ÆYg]Žòò~°mï8PÕ€?!žxUU%äº$‹ Ë2—‰ºëiùgwCez¥ݤîÚþÑÓká.˜sôÓý†•]A¦.–l=ö4´`ûö­Ø¾}Ó=ãÇÖ´àƒ©T‚g2i¦ëd³id³èz–eù§†Î]”—÷Á‰'NAii‘°mÏKöÆ‚¦àñ‹ Š‚\¶^ pÎÉ4¤RÎ1gŸ=ðó¹s?e3fǽ÷ú„ââ¼×"‘@¹ëpìihšÕß@–etïÞ“[–Å’É82™4<õY ™Œ·¸8$†p9ûæ{°Âql²,オªo^ùÉGåk¯=œ#׉D²,»YQ¬°m+B’dÁ$Bذ¬4þu¢¬¬7y qÁynµ¢½rF^Ü#ü –ò¤¼†T ªvèäºBø!›B$\^[»ên/ùÞ b±=ÿZ×…¿ÿýožã˜ó¤%K^[òýwï )Í«ûJŽ€efÚãÿE~[‹\çr ºÎÉuI’¿Ë„×ÁKQ8gÄ][´¶¶ÑG½õIyþúãÃaY’%Â÷ëãÎæj½¸¡Åz<£;ÍçW¾ ,×ö€l6õn4Ú‚ÆÆÝÌ4õTU{YÓ´½š0ˆ(=lØ¡fYYo˜¦á»à6ù QnŒþWòª_]xl¾G]…B!\—Áu‰„ ˆï–/£÷ÞzxÕªïÞéÓмçŠaž(iz–õÀ…gŸ½OŸ>wL2?ª¦f;ZZöV)jpm~X°>]³8d(Pa Á™"ʹ˜¥ª™¢ÚÚ• zõÅ W¯ƒ=[ýï—Ÿ}öj{€ªKFú9~\Gû*G=ºÂkmaÂ4M†Ž¶¶$¶o·±w/¡¾ž{6Σ:<ªÞuÇc¯¿<á˜C¤@0¤!M#S×PnZâœíµzåÚ­eçãüÆ–ÌŽ3N½>‘Htºéþí›oÞùdÙ²7.Z±bqyYYׂššUguùÚt:é/ v~‡: IDATû€²üñþË„i”N§Q[ë"•b0MB"ÁȲl[ÀqÇdÛ&xàˆ¥uõ;™>óõÚ’B 6þÝ5Ô5ìÆüùwøTUÛ‚h´®ë`çÎmÇ.zîÈ!Ýk/ %=c“aÉSAÒDÎE¿ÚÚ]êêV>lYa@mí*î}]ýŸ«Ö™zr~-TšÇ”"×ÔÛС˜>@Ž9ñƒaîë(lD£ªŸïƒŸë8„p`Y¶dÛ®½aá…0çôÊïÝÉXB,oD À›¥ÔŠšíÖ=öÙê7,•Š ×µ©oñVëÀ£B½Þþ"[ Ÿ~úªsÛmhšæXo§QΆøÉhWô©}ÅBÔ×sÄãahšÇÉ‘ÇÂÏdpض‰‚¢n {yW¹%îÚ¹¹ùÃîÁóÏÏÆå—Ï™ÖÔÔÐß«k0_ܵke-„•”ÆÔB¸ŽÃ7mýêÅŽóÚ«×!¨­])~±2+Ç•Fóºƒs›<·›çÚ7Á¶má99v@Q\òj·XVÎí•|ðí£p›9Ž…H$oœ#CóŠ‹Ð¸­uÓ­÷§Ëú~—ç"À—>|]=ýúyËwí¬|6!ʦ²œSÑ4¡t™6åum ¾ñoo~ùÕYg]÷e¿~ÃÑÜ\/¼ÅãÕ…ç˜Û¶!I¶Ÿäû•*›¦YV~”ôåBáíZËd³g/ì{íµGîì87Ï??¯¾º\þûß?x¦­-Ê]סի?šÚ>wBê"áP üáŒxþÝmþ.[ùËÖǹƒ¡H Ä`å’¼¹#Éu]·íóðÅñ󇹴k' s¼“eÛB‘ìËB^¾,Vµ•¨šKꛣ6ˆRXþÍ"|÷-¡ki/”wÀ™ø0‘ä@Ø#Œlô‹‡þ»~øá“ƒŽc äµÜàí÷ñZNY9 §éðyG’e²lC’d"b>£!|ù†˲  ¸Ë.›Cóçß!¾ürÉÜh´œ»Ì²Œ›àÏÓGЭ­ÜÝÔ ¼@;h¿Ja£,)áÂá…‚2víÚ),ËìÐ{ˌٴ¿ìÁ†ã(íÉTßëì8wiÏžÝØ»g9]†J6VmjÆÊêPy;O¶¬õÎ\¿`D${ 3ÁypèБ¢¢båçç‹T H$âí¥[9{çÖž­ŽãªÚ~&C×ÍQŽÎñZV9äUÉÜœ\rÉ]˜?ÿqë­ÏuÙ±cÛ5ž]µšÖ¬ùä!P¤ö• YUagõõ?kÎÿÀ¦9Ͼ½Š¢MP‚&4-ˆ’’"ìÙS‡T*Þ±¸>G»ûÅšZÇ ä¯bjÿ]Û¶!É*•— –_ i]ÍfõùñD¼!/Dƒ…€#I,Ÿ1œdš&qÎ[%IýŠo¢@„ €¶mêÚµC‡ŽBYY7˜f!Ö­kƒiû—럒Küªª ÇQÛóâ÷Ú'è쳯»©¾¾î$ÛÎ ‘ˆþa×®µ‹~<ÎC9êwœ[o76î„¢h$BQQ>E…aDñã]×QødÛ*r•®?^d¹£Ôq‘É$)kÝèp<„gž™…Ë.ûÓ‘­­MGéz¶m-Ù°á³O‡?ëÖ}š4Â×t¡‡ d'wüjÀÀÅ'–‡‘n«IÈ…1)4#ŽãYVüœ.¼I±rž›P•lÛùùE<ø ض×"@øÙ G8¶í&“i¥´¢qs0Ô{H6›=¾´;îx>´bŲt]‡ãØ;s  p(¶oïØP”˜„x¼ÙlB¤Ó²,AÓ4áå¶íÉlÛ$Û–…—_uà8Å>p´Ï‘òò‡^ a‹R©^}õOÕ^x·òÌ3³lÐuý•¶¶(\×A2¿Ô{Ï“Cdô}´k È`$’õ?‹©ù·k‘娀&!Ûó}8¯û˹i¹£EN¦©“aè”N'N§(N!™ŒSÏž}HUƒ4pàPÊË˧X¬•R©8Åb­hii¤¦¦ÝÊŽU‹zÖG UÄš[«àÂsÎlܸê¹D"ž“žýûþhÆdÄbÔÔTOª¤²²n4qâDäç’€7Æ,Fét‚Òédîå9÷}’R©$ÒéüštJ$bH$ÚÞ÷bµ˜ã‡WÆb­e¶m¶­g«ª¾­:ôHª¬ü pçÓëœÇoÙI²)#ñ«ì¸kÏ­Àã¯W‚1éPU“à8‘ªk®yÝŸÿüÞU’¤,+íG óƒ[¯6Ûk"ð{÷.tíZŽh4ŽñãÄ+¯ÌG—.e¨¨è‡òò~‡Ã(ï1àžÝQ’D (ØRýÍÖ%ùãQòòËïé±cGåy–eÀq¬Ïª«W|ÕÕ+þi¬ÑhãWÅÅe7œvÚe9r4" ñx«V}ÃÈBU5FÙlÞîõ¼DMÓ ªd9WŒ±ÆÞ;Ò]G׳r2Ù6Çãèæ H§“O%mÜq¶fÍÇWÀ¦M_ŠýÃ(>DÑ4°“-‰Ö_¸\¡$So‰1¤éO@’¤?Á?FÖUYò;þYVI×uØvºÝ^¬]û†  ÇqQPPŽsι……ÅPÕ@nÒ„,Kejd^|Àa'qC´UW‹fϾyÄÞ½u$™Lê2!ˆ¤E‹jé´Óz ¸úêG†÷éÓ½{÷±X‚¶lÙ%–/ÿ†‘¥.]Ê Ë&¼…&C× # ÓÔaYA¡i&ɲڑØl—ËqÎ…m[r:\ùÍ7¯¬¾ðÂÙxùå{0uêÖ××ÂqfšÆL¼ÿÃP]½üGñ¯(W#¸m¥æ/ç©_ç¨$ÐyÇu+P5µ¯e9XÿMÃ7·œf7ÝtêUU¿Ð´ ¤(šÈ‘ƒªêu·óV†‘EKK#6lX‰^½ðºáö,‹/2"YöWUL‘!’,‹_vçŒ:ýô©hh¨}²¶v]íðáÇàÅ×u(Ré%^ziã”O>Ù»wܸ±wuéÒ…oÞ¼>úh1æÏŸCx0 >ÆòÊíG»'Ô‘`Y&Òé%q$“1xµy1$“1ŠÇÛGE,ÖBMMõ|ÆU“àå—ïÁ¬YO—¤R‰ét Žc7®_ÿG¼“`ù?M¡à¢ Â6Œ4ûWî©7ª„ÂØ°P~¶žmÝb 5ûÌž}ÎÑ@`q0¤Üqã©uµœâK¤RI~øI8÷Ü«aÛV»feŸg)üίðòC4ÉÓ‰K.™Š¥Kwô€wßýŒ.¾x`þüõ#?üpÏÖèõzAA¨kCC›øøãéå—ç‰?œÆÆ*|ôÑß ……wœkíJlEQDî(÷™%üØý[s\N(ÖO (° +÷^;â×qNEžˆaeôÕJ¥øÝw/Ü{ïE§Å¡P˜B¡°Ð´€­iWÓÜ4³8üðpñÅ3ͦÚeiž°–wPûr_+Oð ?SåK‚ “—/w>í×Äã¯è¹xñž%ƒõZ]ZZ4°­-%¾øâk±`Á“΢EÏPeå÷Ž6B¡|TV® Î%¯‹ºš_Jšæ…¾àŽ¼>`"W'!²Ù4Y–‰±cÇ‹Q£Æ¼þ ¯X3g>¶óª«þ|<Þv¤ÙK7o^º|èÐ#iݺì7oÏËz]d h#ÜþøÚ_¸kÏõ2²ª/3‚aºÛ`{½% #ƒéÓgBJ&ã'ïÝ[Û6)# K@€õí;ˆÎ?ÿ:‘LÆ÷ë‚×QéS.àœC’€PöÙWú#BÓ¤cÿñøÊáèíÑ£ËQ޾zõ&±pá ´hÑ3´aÃ¥±±fZQQç¡PD0Fè®Þˆ={¶ƒ1 ‘H>ÂáHmm»·¾·{÷–KÄ ¤¤ÊÊʱnÝ×Dõé3ìíC=~rMMµ ’©a÷gؾ£Ž ("ŠªÙèÑÇ  !Ð †Q[»{öìÀ€bóæ58øàÃÐÖÖÔîÉúB"äåE„eÙ—ÏœùXþC]wîçŽ ‘²ÃĨXQôTºòçÎÿ¿lã,Ó ªrV·±fg¦ n¸á©axW4Ú!8t=ógX¿þcîïG½gìS4{5bûˆLÛ¶`šLÓD&£#ËU/ldÛË"_ÇI°mN–e¡{÷^ÔØ¸}S4Ú:v÷î-gìÙÃcyy]ÉÛm»àº.ºè~ë­ó$SI8.G2^#ʺÄP B’d‘H´¶öï?ØêÖ­"‘$I†iê(--CmívbŒ¡®n'ÚÚ¢(/ïGD.B!‚,{ì¸D’$sE‘§LŸ>÷^Hò`‡¤<‘m‰€×ÝØõõÖmïÎ/ý:á€Gó°²™¯so=úèUxà÷Ëc±Ö‹t= ]ϦW¬xÿÁ\Æ~Å QĹ;ز,;ÇŽûÄ"ü&×í ¹e0 ét;v¤QYɱ{7°s§@*eÃ4soµ÷ºžÅ /üpWCÖïËÊ*0|x¤Rí6fÓ¦ïðÒKs¼ÉÚµõÍ–æ½p›ôøJr\†B-9*‘hPn¹å‰Ã ¦Z–…}õv^š¬wï~X±â aÓ¦U(,ì‚®]óQR””T•ùà1’$Ù–eiþi§]¯u¬)¿ú¾•‚;öÆ †ç6"Û³~Ù7ëbïQ^Ã85 "›Ì|áõy޼lxÝó9z^׳€ƒ:H$&z¹=SÊ–{y±ÃÐašFû÷ºžE[[ ªªšÅæÍm¨¯OˆtÚÓ!îû}]˜¦ ÇqPUµþo•hmÝÓļyÞÓ=î»ïÝ?766ÈŽc"“Ž¿/S $XÊM§k ®®ú¯9u˜çéz¯l6òòÞ"‘hƒ,3D£Í¨«Û)ŠŠPU†@€|vˆs’“PVÖõ~¿+DûXLÓî¯j* xÜïœ!~Q÷Ћ^i´ ƆÉWÀC].î¹çÕÕ›3MÃ5ŒltÕªEoøÇd®ö`¸×ÕÕökÃöe彯¡¹šhABðܳDÎy‘$EìëE™c¡=¶Úq\aYY–U¶ïP8ÿü›¿›ªªÖ±>Ú--]úÉ-mm­pÙèwO…BáÓw›¶F›9ëɼhkóa®ëZBÅOˆ\…c G} 8·Ñµk¹Ø¼y5ºt9Uu¡l¶Ud³D®ëÅŸ¹Ò_!Äfø5÷.8¶[‘_„°Í=^åWpN®=«O_-‚° $Òhç‘ZZö¾¶ÀqI×ó¼Lý8lßþm{º%—ë3 ï9ûzPZȱÒþ¤ûñ“K¹ SIrH–%±ï™^Pι'•°,†‘ L™2}` §MzGòÕWÜÕqìݺõ}¯±q·ƒtó.fn3¥ü^à¶Ù¦‘=ÊÓé»R‡ ÛöFD.„ð(H¤€lÛ;wn£Aƒ†bëÖ=Èð!#k¯Ï¹[}JD*§ÆÆ½~‡W§ÝÁ bíÅ÷éš{‚‡âKÚK”;Ôn ?´Ðظë×ÿ೬©v'žø{¾wï@ÍÍ»ÑØhubLˆc$s×)îÛwŠ‹K„¢Èd¦_ê›Ëæ8>x¢¥O&[G°iÓŒ355•°,³Ã‚jRI)€h\tÒ4 )ê€9Ï®ûåŽJáWÑ@5 ÂÊŸÀÍ7Ï?­¦¦z€ëÚ0 ãËÍ›?ÿöàƒOa+W¾¿_+DUÕÖ§Ó)ضàápHB@×upîþÓnÛ'sPý)¹Aäª]=9Ú›ä˜f†L7ÿÉ;7ÌïÕ{ø@Y"oÉuÔäc‡_íÑ7é–ÖÖ=ÏJ’*ÕìTYQK³:[•ΘM½z 81©gQQ'$ Äbm~‡·Wú 1!ÐÚº½z D]] ZZ¡¢b¾ÿþ hZ~M·ï-ëíVlíÇ)ËV6«ŽÃwÿK:ŸŸ à*2;bÑôÏ[Œ=·Á¶m$±™°zõâê_9v,ûö“OZ±kWO&Ó’¢(~“¬ï ØþÑèITÕöK²Ȳê?3G"O\DËkÉqlÄ.9ò»^œqâvºè±Ž÷8ðàÇ·m[DZ‘ɤ/®©Y÷w8ztÉEùò0ö“£oDÿþWLK&SÏäçpEa,me™5˜Ôá¹>e…öì©FII96lX£>EhkkÁu]aYÊf3«rcÙº3]&ÉrˆqÃtÿ%à~V8 ·máS óÂŒ¬ŽÅÿØ»ô¦YÏ\6uó²áÙE›7¾fôèÓÿéo¿üØ« VÅOe³º’J¥!IdY纮Ã+ÙÊÀc˜s¯ÒéÒé¤ðÞO d×â7•ðh—dBÄ£»°»®²ïªæ¼úÏN­_öŽØzÈÈ›nÿäÆÚÝ =ý0cõòå ÿ~ò¤‰8n|y7Ü 7ùõÑ®ë,cŒ!™L¹¦i /è·ý š°,SäJÊüXUÄbQضd2Ž]»ª0jÔáH§~È’¡L&…/¿|}ã‘Gž+€åðRIQI±˜^÷îÆŸ„—y|¿ÝxÙe÷$ri¯ŠsBù!¸éæm€‹·=žHÄaÛ‰–«`ÅŠ÷÷û?ßzh<;ò„‘’•Ó‚Á@Œ1ß~iÐ4O(äßY_%‰T*áË H¥â”NÇ}Ðr\YLÄb­”ŽUþcþ;MÛxaž~k/VnJQYÕyõ•ç?|Ô-ˆL,Y=Î)‘mË*– ¢¦œq¦òðÃÓ·¨1 [.((¢~ýúúN† Ë2`š&†î×ÝeáÉt8ŽŽ=ú`ÆUд0úô„X¬ ét ™LúCŸw=*/‘UÂuðù?ªjþí£ræÌ§ý†dÀ£^ë\{í£§3&]„úZg™ÞpiðÍA’2p¥é†;ÝW[S™ï§Ù7¶nýª¡ãÿ÷êŸÇá¼[¿ÅY³¾á¯ÿùãß ¼ƒì®Õ²Œçå¡T*Ñþ Ï‘¡ë>m"4Í$UÕ„e©í5ÑÄ:”{£e™"km]¶ìÍã W½›šKoùaCÞ´ÞÝd>¬¢ㆇر#ÎcWË©òi³#cÞù¨{±ÖoèÐn®½¾û¶}ÙeŒÊÏ/èTP"ðE[[œdY¹²(Ë2EÇ6¶-£¤¤+:uêBª* "ÐÖ­ëÅØ±“°jÕ×.箜É$çÀÊ• Ï1¡Yepޝê•§*ýkÀÝrËs¸ÿþË}ŸšÐ3 %U•ÀÀX¾È/*ïݶõÖÖÖX–a¯\ùþ”áÃObGu"Yü*ο}9λõ[,üóÈn.Âo«¡‚Ú£Yü°® ñ'ÙiSz#ÉG6›†¡QŽhUU ºžE6›&Ó4 ( yšÅwJ˜rD'¥Ó)š4éÄÌYg·`$IrM^aÏWÑm/}ÿÍ»Ëß[¶†ö]=è–GŠŒÜ7ôáÞ/NI®ÞmþhEß­¨ÙègÞ-, LfŒ¡¡¡[·®'ιÐ4r¬…‚<›g@U½‡TÔ×סÿÁBP}PY¹‘úö­cÆ)¿ùæsK÷ìÙ°d?É‚ÙÖ3’W ‚½¨b^ye#Î?ÿÀŸ!@øÑuóÍó¿`ŒŽôÊZ% †HUÂÛIð¶>%Öv9›²ùòÞuè¢âÏh#1ó:Ó´–~ûÛK;LÓFÔª†–eéÓ–Ôl,‹ã{HR+•¥RpöI'ÍüÑï¿'œ0ý÷Ÿa˜`V\ÁŠâ eY–ÃŽ“À¸qIŒ§Ø¹=ygŸƒÒÈF`ø^2¸À[·°~s™{®ÜÚ“¹mC×£çÀÕWÿ W\ñÅ·=ö×\ó;\~y5ö»öÚû6¼r`>?2»·wG~îÜyçæ ¢íÜIDATŽ?é T*Ŧi ¬]û8=óÌã8ðÀCù£]Ó´á8¥R×Õ1 .—%ÂH —Èç]*нi ¿°éêO{¼Ï"ð"!^Ì›Gš÷^òÁ’ÑxÕ¨4Ï™19™üȼž1ÉAC½íî4Wü²“^ð±r9ð‹FÊvë]7x¦âº¿Ü0rçkŸ—2Ü_M÷Œ»Ž`Y’É$'IŽ“`Û¶È4Á–…˜ê’©T P(¸§Ÿ|ò¬ŸÜ}÷:ø¾ÓN;`WÁ-Ztûg„0~KD,¥Œ™ç˜¹fwØH$’ÜÞÞ@'ªÝå¶¾¸áðCÊ2ž{i;k6æ}øóŸ|â§gœõ9¹ö/ÿ·žÒ•WÞ‡lvX õÓÏ~vI¿þõúôÆ DUv¾D÷ßÿs†‰ ŽÅ´iûÀ4mŒï ­M-ÄÈ00À1iuH„áÅ—žÅª-O¡TO¨O×£}ÜHßc–!qÀö§¹î[¿?ñ„Ó_عa¦ÅChi40k¯æïW‡ilŒm6W71o¡YÄAë’%+ÿ'‘Hc+HE59­×Ф'Òb'šÏZuB ýýí_þòü·D8›BˆãÕBP-!IÉ5S}•´`YI¤Ó…¢@¹TÂsϽÆ=ãiÞ‡/Ä„Éû¢TTÓ¦nÿѲ]û—îþ[b“+¯üLÌ¥rà ࢋŽGW×úÛˆ†ÖƒÚ9 %18à£X±â7( ¬&8pË’`&®¯gÂFM¼7§­^¸ý;ÈIÔA˜&3˜HÌ ‹åïNúú™—7Í,‚äëÊ–­Zë]þԺܿŽcã€Yu‡ï7=uøúûŽB}2¸kÃЇþòâPã1€H) µÁª çBˆÍf>LÓB*eòøñ ÃP8šl¬XÙÁ¶mRCCÃo|ì'?ù+vÚù ^å»Ëåòä¨7;\JvŽ“Ôޚöm“Ú)XL;{Öó¸ ûíáûJ¥"††ú~ÞÑñúñ-®«®º‡"U(¡½}’½mÛÖî0 Ç !bU•q÷u¡¡¡‰…0(‘Hb̘&ìµ— Û–œÉ€¶oW*R«-öür™ÿÐý46VvR{ËxŒÕÌaàK C† ÁÏm¢=Ûà–ŠëÖ¯S{Ÿ;`ú×]_žÑÚl}`æ¤$>8;½ÆÛH¥Ó¼¶ÿ+ä† ˆ89#@”eÙpœ$Ž3TªŽ§NMÓĉr§”H7lÚÄ\©D3Ë%‹eîŸ}öÙ}±·IdL‚@í*;·ru«Þ\TÆ®[í 3vÜJ>Nºzž f‰±c'wõÕ¿ü m)a !º„9åÊKƒHl0 #ËÌBJ6˜y{:Þ¡©â7 5 !Æ*–¹j§j-:,™L¡T*¶Œþ~ \N#•²Q©( áÚ2Lôº§¯ý°SiÀT„¢† Û"Ñ݇ÁA„ž‹ÑšÓtêYÿvÔ=çù‘ko¼ß:è¨OŸ˜C·¸í“‡Ì›¾v}á;O¿TþüFgüæÞçW>ûÌê{6õ¿ÆûÊ C«óª`_õ95Õ+z{M6͆éMMB ,ŠEµ†ë1ô–^åâÅ?ϧR‰ºÍ›7¡X,ÔìhBXH$ÍÎm³išT›3Ô|ùºhÆ-¸Û·wcãÆ.Ï0ŒŠ¢!*fÖôfë"§ˆYdÕÏFM/8aâÄ©˜3g>öSTZ©] )Cíù&kXÄm˜f¼YjŠ©¿¶R)C¤é€Uƒ +F!†ŽB1KHT<—‰ˆ$K˜dTËY«4•Ú,BˆS©úÊÅÒlÝç*Ùx~#ªßÈáSq§ÃŽ“ D"¡ )bf hPòùŒôO¿ôÒÏl~C®’Ö76¦J¥Ò<<<á;ô›y oM13JôF51Ô3U%Û¶“˜ûÌ8< ‚ZH_ô~>""º*Šâ9S¦§¬§(5AF8S ðþMªRJ¹f` { f Ï«°”’|ßc…P’5ÔVÌ©4•6ŒˆÌ"y8[ij^>ÿ„ùâ{ç\·vE´xãìÎî‡×úµ¥Œuoç¬Ü~ûo'>÷Ü“ÛÆËa`ddH3”š(‚D´ï,+ˆ* ¬Š®Õ‚«âí Èw+œÝ„>Q¦&»A!ˈPª¸ùaHf¤’ ÈœÏa¡DQáŸYã$MiÇår¥”;vš›ÛL&P,F½ï¡¶©J{)TUpRJXV¨©}¯†ž¤ŒXà‚X÷&ÁY–}O.—»¸\v¥iZ" ‹¤›î5Ç•§'ÛÛP ~FŒû¨å‰Ô¤çy²”}]¬Y»#µ÷¤äÇ&¶9[véÂèKϺúÙ]Ån\4ÞüfÙ-[öG¼þú«E€ÏóÍd2 €Q©”(z/…‚vÙÛV £¨_;R»já_IøpK%òë-$Æ´ ¹} ˜%òù"ò½Ó'côèFŒoošE= Á2„ô<È’Kà2 !+ýî'üDzR¹|̘1cÍØ¸ñx^%š ‘ÚA {¨ö—{ú0Xzv¹‚!6WŠÓ²8ò¦î?þñ7½‡öéã]·Òîyž&³tQ.—#Öꥀ ¤Yx¨:ºÙe×-£R)!ŸÏˆ\>{zßÎîÛ»wm[{ܽû†½¤”¼¯iЙÇ>î’c—>êàq¹OôîXù¤€tݹs°jm?®:g_¬þËŽ?þLœqÆÁåc9íáLnZ±C¡ ˆC+•S@ZOÃø"ç)¤Z¯Ó÷}ö}<ÏcÏ«P¥RB1;‚žDõ£Ù±b)±íµxpÉå3÷V§¡BÉJâP †a Ádm6Oûø!Ÿ›T7f½ {nCC mmÍÜÛÛOÃÃCrèêï•8±MìÃ]$Eƒ‘|ße̦B!WÞyý /¬.½©gY‰…Ž“è­&“mF…ËåžW$Û¶áyŽVALÓ¨a×A\º8ÿÚÕµ:â¤z͘ÜöÅ [Ë玪7÷ŸÐfÛSÚßnm~û–‹çõ2p«”¸{ÑÏo€ú$™—\p¤¼¿m‚€Íåþõceú“Åb‰…0È4-–²@•JY3}ø¾Ï¶íçECÜM š5(R=ŠÑ(àÀ«Ð›ã 9‰T2MBôõÁó=È1aÂòFr0ÒI˜u)–A@ ’,%±â%$„à .g*mwýÉ;f¿c12’3“aˆM5í|߯9I|?ºW; AU/X±/yž‹\n䵟þôÊ78X³æ¾âa‡Ð†á‰3wÔ¥ÑÁÑn Áé"¸A©T B!‹-[6M–² g2Òiãå-½Ï f ?ªs½Ã~w÷wï-ÛÝѹbXg´À±é›Ç6îÄ…‡Ž OüDÃ_O:gµüÈáÇ4ì5þ“añÄñN#³Àó]Írï»§RŠ<ÌÇ*â)Q¬xš ·ŒüðeÛZ@©øjsè³$DZ1qÒxÅ,äzà0„•JEÃÅÕ—°HZIx#Yš”]‹™ò±éc?f+„áá!Í·\Öö©÷Hø¾‹]ÇÈ„µ±e´¶¤ï— …e³Ã7¼üòã>õÔËñÒKª†—\rÊå2-Yòu>ï¼¥_Éç³wd2#Èç³\(äP,æ¨T*kÂ1P•†)>mP#ÉÂløûõô<×3mÚÁؼùÏï˜%Ùæ¸Ù|xjCqVCÚhŸÜî`ÒX iÛËWZ'/´Ó H’ÉûËf Ž Rí÷,äû®î3wâHµdiQðíó\UOÆì}˜Â¬!U*–Ì4m¯ÉH¦R˨òÇdä4 Jds¢ÔG-;ÃÄüó°m‡‡r%òœC1mÿ³02´s¹¨¦¨°1ÅbA«Ì¶mǹÊâVQô!²á…B.¼ï¾Ì“NºØøíoÿcºñØcà©§–ã _XŒ;ïüÎ3ùÈÑ”’“2L‡¡*w;@„Tå.ÔU;)…Íò@w÷Úy¹\onÊ”±uëSï(´©í­x¥»o(“/®é*ÜLÂùyOŸgmí©LÜ1àÖy>Oï-(ä†8ô+ä P`›h£$•½ªãÙݶEÕw’"4V!;Œr†½ÿ\j"¢á7UaŒÉ’ [Å™ ÅDaÙ9i¤¼^LÜô+LÙùj †Ð?äᯯæðbojäî_ý®é_NúÊ)®[aD#F%e¯Šúô¹qXRµi<Ï¥X3TJœÏg)“üÎk¯­{"‘ͽ½ÞºpÎ97Ò²e23ã”S.þF¡»&ŸÏÕ•J‹yÐÕ$Y꧘ùœî:õ#´u듌ú¨OA߈k>¿ag§žzˆóŸ_ý½ÿÇ/$FÁ´–¡º`LÇA›ÝŒÔ†ÌÈ0Fò#(䳈Èb\×}»v0HÏ…ÑÖ†ôó–q€¡RC¤3ž ©iZZšÔäIÓ3£P.£uèIì[ylôôðú`ˆü¨Ù°Ú÷aËIl_qËUüãg§•ËÅM™Ì0²Ù çr­2µ–C¥RŠÑm*lÇX=‚}ߣR©ðÌÓOÿz¾ï3¾ô¥ëðÓŸ^öö(/ß÷?üß°fÍ/–XzôÑgÍäl)åd"jsÝò€·‡!ÿiÛ¶µ9˜:õ Ýgù·]<Õ ÁÂC¦`ùãÝ(Î<ÅùžsŸ8îóó}V¾RA¡RF.›YqQ²vb(‘ÅŒTêƒ4Bσ¯ww”yW HÝí/Ĭ™HMŸ®o‘PDUͦœ4 ™LN"‰ºº$rÙò#ªe,G°vf±%W±×¡°§ízÁÊE_ú• púél¾óÎ'pœÄ*˲É4-6MEÖ£¨8,T*¤5„§»nã¼/ˆìòÈK/=<=ôT<õÔ/ÿw°PtwÜWñàƒw¼ãÂO™r8º»WãïusÑuôÐ —ò‹¯_GDsH0l”p0<4Ĺ\ŽŠ…,Ã`jsêÐèÙJÃ#\Èç©PÌ!ô]À¶!ØÛFh‡ŠWAÒNÀv¬:®†´¤Øh¡Í7AÊ‚]ád°_(R¦§›Ý4­³öe–I·éU /`ß7ƒJ¹iUÇ­øÁ:gd2™ç²Ù‘T>Ÿá\.‹\.KÅ¢²Ë5‡MCUMÆwu­\sæ,Ä‹/.ÿÛ èÿ›Ðü]…¶‹f¹™!æ° Á•2S裥u ZÆ´qàÈdFxpx€úDv89¶†Í ~@«™I"ÛV¥å ßìz.™Š|† A0Lè’«™N!sX‚Á>‘i²W QìÝ+`L¿;Ž£Ú­JeE£«ú›T sãÓ¹ç.x@úÒKþßž—<Ùq\˶Ëð<Ûs[¨¤A¬¡,QÉüÕ®®•¿PùO¼­Ðþ.$l×ëÑGuw;zHoCˆCI^.ƒÐóIZZZiÖ>ûbú´YhnOEÈyL®eAA8À~@z ¨f½ÓýtÑ 8"EmÎP˜!"I> ÷ôQvËvšÐ:§ìÓ4(”± •úÝUc‘rÙÄX…I=š`ñâ{Äu×}áóuuõãlÛùZ"‘\ŸH$íD"e:NÒ`1³`æÿð™¾¾îÆ®®•¿˜5ë“^yåïë»q=ôüêvó¼æq¦“LKÉØqÀRÂI¨q*mãÆaËæ×Pq=X$´Ó½”afÒŽÇdJÉð}Ã$€Õ|7¼BþPD–ŠçÊ}ѽraøÆÝ® %&ˆI”+•²TmË_°LáÄ/h$¡ã˜áOüj—lȬYŸDW×Jù®3 ½ksWÌ…Á ކÃËe„• @" µàùLË® )Êé*¾òèÿÔà:O"`Bàüþ"‚ @¨ R©ZìSïES/ßè'´À‘_:ðýËGúìg/ÜÿM™U«îÊGB›3gaüœ®®•ï>ÏÉ»yxcT9%U ÇêMº. Cé:XÊX`JJÚÕE‡‚c×û€ %*Û_‡—Q9\VõXŸvý£)š\"É!Aê54 ® ¯g…¼ÂÃ)0Zae¬‰Ç±‰Y*·‘c9iýû&U9὜Ø]GÌ/ ¥2ãº?CŽ5õ‰Ó–Á^>‡PJŽÒX0Ôa)÷nçüæ ð yÔ/57¡Xꇫy*ÔS¥1–]eÕ¼«ß£œ¤oœÞ—ª²æÈ­c @y÷Dñ/54Jf$C‰ú†4‡3ðr2Ru Ó&w°å¾aH¤ˆC‰dŠFCC; qPŒ”¦1­ÍªÁD=‘¢M$eHÔKDW½VñïoÁIÆÒ®» ¡½qŽŽH;Z¯ÑÚÒDÛwô3JEª ö³—ÏGÍu,eHˆ§D"&·‰}Pe>µ´ŽfÇqÊP‰‹ýTÅ\†$ B­Âd N[¼÷Dp»¯ª÷Ef&Ôx”eg¢’4óB}}M X2ÈTÎéìsæXƒwY %C²$ßóȱm´k£0 )V„â¸'töD ž«'ïã_8»•'x_ nÅ­×ô08«Q, TÃìBØÌ †3f4F5ÖCFÏR(ˆ¸-«ã+C©@?aè“çºH86fî³·rNÔ 'Ž{£1iL*¯Ýcêð‰–Î;nä÷­àŽ:ï²h¥w2 ôq‰3ñQàHqrM€bBûXŒŸ0N?&•MÓ办W‹ÇôCÓÚ‚}fOW¸”Z)*¿ˆâp@ßV jl!Ô¾¿êgwt-8ýÜ÷DU»£à6?­°{xè¡í;Ù´KM+AªÙá‚H%?(åØ\Ÿr ˆÈ÷|–RRàʈm°-“FjཧOÅèÑͪAô\&ÔÔYY¿‹¶‰DF*bd¸òwÞ|l}~íû3C,÷Až2”è´±Òà—HUj`ƒ Á,ˆ !5E[[[+Z[G“ëz‚€¢`Ü4 ØŽ Ó4)ðÔüfÄ™6m¹´Ú$V— bÕÎUe»Wþð†£?ùß±úÞŸ¾gk³[ Ž«˜bI€`µñ‰ *”Ó>”·i4”c7z€XaÖ ƒ@÷²`©Å)Jf€´«´¥vAJ³ûÈ®› v˸÷tmv[ç䨯]‚Gn¿þi0¦sú U 1¯Enž^ðêwf 2ŒjU#SÄqò8rl¢»·®äOž{)VÞvÝëIJ™™_V©C}<¢rZpüâ8š&CÔd)ªïq”5Ñ`8 T‘½*‘ÖÆjF»,›Ì|/‡aû#·^µü_ý–ßt9ÿC–{ÀuÔy—á‘[{ù§Î¿âAKBH…ïQÓÕ¤&ë ¡ÜÀŸË"(UÑ5¶Vqó´(#†¸\UÊuB4½æïìXºœñMtv,ù&(öÀëèo\q%-d„d …ú!-ÏA©D „ ÷ã´ÎŽ%+öDýS¨Ê]Ôæ—GB£‡n¸ôq¦Ar@†AÚ«4ˆùâUw-ÛÙ±dÅ‚3{òçý§S•pÌ·¾‹‡¾ÿù i/_ü³—Ù@Â8³³ãæüg.ѹ›Äcÿ¯×ÿÙ8›6wD±3IEND®B`‚xcrysden-1.6.2/images/rotXY1.gif0000644000175000017500000000440511712736221015162 0ustar tonetoneGIF89a÷þ      $ 0!, -<8 3 $(1< ><%'=A 'Z F'N(H%J#E*U'P*T-X3X,e*h/q2h3y 1u8u.{1o6j4s9w8s>z:z"E"*L+-G+$J#-T"/Z%1Z 9Y,2T+4]26X9<^58X#=o.7`/8b'5)>p19b5j8?g9?hB~$Ad Bt.Q|7@j;@fn¦;j£9j«?p§PU„\]–^Qª@o§@o¨@p¨As¯Dv±Cv²Ey´H}ºF{¾Yb¸ig‚dežilŸgi¡jl£cd³dj·ig³nm¶im¼ejºnq¦np¼pn¹qr¹uv»wy¾y{¿ouÂtvÊ{}Ãv|ÇJÁw‚Ç~Ã|„Ê„ –)”$²¾º§*¡3Š?t¦9SÃÍË ÌÒÕÒ ÙßÕß9áäàéõñÿÿõ.å(ßEØNÕXØXêIãW ÿ[à`ã`ÊpšòŠôƒñ‘õ£ÿ¬ÿ¿öÆÿìÿÿ‚†Æ€ƒÆ‚„Ë…‰ÊˆŒÏ†ˆÒŠŽÒØ”Û•šã£¦Ü½ÃÛÁ¤°ÂÂ××ÖÛÛØÞÅËáÉÒæÔÛçãÇÅåËÉìÏÈãÄÈäÚÝóîÌããã!ùÿ,‡      $ 0!, -<8 3 $(1< ><%'=A 'Z F'N(H%J#E*U'P*T-X3X,e*h/q2h3y 1u8u.{1o6j4s9w8s>z:z"E"*L+-G+$J#-T"/Z%1Z 9Y,2T+4]26X9<^58X#=o.7`/8b'5)>p19b5j8?g9?hB~$Ad Bt.Q|7@j;@fn¦;j£9j«?p§PU„\]–^Qª@o§@o¨@p¨As¯Dv±Cv²Ey´H}ºF{¾Yb¸ig‚dežilŸgi¡jl£cd³dj·ig³nm¶im¼ejºnq¦np¼pn¹qr¹uv»wy¾y{¿ouÂtvÊ{}Ãv|ÇJÁw‚Ç~Ã|„Ê„ –)”$²¾º§*¡3Š?t¦9SÃÍË ÌÒÕÒ ÙßÕß9áäàéõñÿÿõ.å(ßEØNÕXØXêIãW ÿ[à`ã`ÊpšòŠôƒñ‘õ£ÿ¬ÿ¿öÆÿìÿÿ‚†Æ€ƒÆ‚„Ë…‰ÊˆŒÏ†ˆÒŠŽÒØ”Û•šã£¦Ü½ÃÛÁ¤°ÂÂ××ÖÛÛØÞÅËáÉÒæÔÛçãÇÅåËÉìÏÈãÄÈäÚÝóîÌãããþÿýû÷ïß¿t4Ò¤I§NH‘"EŠ©Mþýû÷ïß¿ÿ,PaÔªU«VæÎ¡C—nݺuëÜYø÷ïß¿ÿ)&Œ)S§P¡JÕª•¹råСk·àß¿ÿþqSFL+¡B…:… •*U­b•+‡®Ý‚ÿXðb&Œ/Tª€ T¨P§N¥R+ºv þýÓafŒ/^¦,aâIÔªU®`Á’%+VªVåØUø÷oȘ/Uª8Y¢„‰£xýòíË—Ÿ¾z¥TÅZWáß¿!b¼L¡²DI$]º‘›†«×­[¾ä‰BÕJÝ‚ÿˆ€™Òd‰’ AŠpáFŽ®[·nþ“7 UªsþýReÉ%A‚ð¡…¹j½zõê ž'€¡NÉbðï*JŒñq‚‹,ÞÈeóå+˜¯að0}åŠÁ¿@– â£D¦yö¶IwL1bÁ†ù»Gß;ÿþñPÄG¶”]Óf,1dÈŠ6LX0^¬üû—#H'Hà˜e¹oÉ–-[† Y2_»V±bðï_›ƒªUi²j«À¢¯ÉóêÀ,3d†Yc´øèfÃ9iM\Hî,ó­ßú(8HX¨P;xcrysden-1.6.2/images/bold.xbm0000644000175000017500000000062411712736221014754 0ustar tonetone#define bold_width 17 #define bold_height 17 static unsigned char bold_bits[] = { 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0xfc, 0x0f, 0x00, 0xfc, 0x1f, 0x00, 0x38, 0x3c, 0x00, 0x38, 0x38, 0x00, 0x38, 0x3c, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x1f, 0x00, 0xf8, 0x3f, 0x00, 0x38, 0x78, 0x00, 0x38, 0x70, 0x00, 0x38, 0x78, 0x00, 0xfc, 0x3f, 0x00, 0xfc, 0x1f, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00}; xcrysden-1.6.2/images/right1.gif0000644000175000017500000000017411712736221015211 0ustar tonetoneGIF87añÿÿÏ0ÿÿÿ,U„©Ë& Ó/ÆI-Ä¡jÅuH ™çz–ªG²¬û2Sírçø.ñ ;0@O˜ "}¤%nÐt– Q)µº¼‚Ün—¦õÂâé¨I>OÒj¶ú _;xcrysden-1.6.2/images/rotBC.gif0000644000175000017500000000444311712736221015027 0ustar tonetoneGIF89a÷ü     ! &!"((/../),6./1?Z4:Z5Nv3V~7S{7Q}5U|9Qz>Qyiy{ABB^NMEFn@OvBJqLMy_`aabb]†[‚`‹n¦'_ˆ(Z€*^„.[ƒ,]„1Y‚1\…;[†Nv3V~7S{7Q}5U|9Qz>Qyiy{ABB^NMEFn@OvBJqLMy_`aabb]†[‚`‹n¦'_ˆ(Z€*^„.[ƒ,]„1Y‚1\…;[†&CB*(*CERYX=<:5:?@\]____0C**(((*BHVOI;3135<>$&&(*,#1.=!!,+3378<<;= (+$-1*47+7;-8< ?@)6I-<@?DBBIIQQ``kk fgttyyno4AE7EJ9HM>NTGIeos}IILYQQYY\d*xs||dk EEKGHOCT[GY_J]c\_gOcjShoUjqXnuYpv[qyZuŽ\yœayizƒsv€ŽS‡†ŽŽ”•›š¡¡©©´´¼»¥§°°°²ÁÁÔÔÜÜÑÒääëëõõýýìî"ÐÓ"ñôfƒ‹iƒŒl‰’pŒ–{‡’t’œx—¡|›¦aÖÝuÒÛlÚ䆌¥«²·ºŸA¡aÁƒ‚‹Šœœˆ#¢¢«¥­­´®´´¿¿§¯.ÂÂÌÌÑÑÛÛççííôôüýÓàK‡•¡€Ÿª‚£­‡¨´§³ˆªµ±·Ž²¾–¥±—©·‘µÂ–¼É£¼Éª»É›ÂÎÅÒ¤ÇÖ ÈÖ£ÌÛ§ÑߪÕäªØæ¬Ûê¶äóºéò¸íýÂóÿ!ù!þCreator::XCRSYDEN-0.x ,11þþ€ @„a£¦MøÒFM `0àeÍ™6èþ¨Ï€†™3bè`Р>@eà\°` @€~XN’`@€üüñæÀÚ€@~üø3hÇt’Uþ°P  HÀÓIÀŽA‚ ЄÎ €ÊĨ eU*Uâ(“$"”@Ñ (Wª2àC£þL’†  ˆTI5«–(Pªìä( €G(eÊDéP¢J™2)²JΓ'¢DÝiÕ‚`²„é&K’ Ân,y°¬(xÀ¨Ò#LD| @S±²¨ ȤEˆF( @(VéISþˆJ“(!¦ € ™(p ›6mjD2 À6kÔ°(@DÒd@.Ö´iƒFÐ2¥þ¼@#˜PÅÎ àBPB( …,; €¢rþ@ xJÙa€‚sL¹z/_¸È°0¦ÎP­<]ÕJ kÚ°1ãÅ *Z©äP1U T) gÔ¬a“fË›MR(Á„(°X-PþÀh³¦ $t¬j5* €€aMHAj—@àI/]Àˆq@gÖ°aÃæþÐh³†Í™  ÑfÍ4. †51€®€;xcrysden-1.6.2/images/xcMenuEntry_up.xbm0000644000175000017500000000035711712736221017024 0ustar tonetone#define ComboBox_up_width 11 #define ComboBox_up_height 14 static char ComboBox_up_bits[] = { 0xfe,0x03,0xfe,0x03,0x00,0x00,0x20,0x00,0x70,0x00,0xf8,0x00,0xfc,0x01,0xfe, 0x03,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x00}; xcrysden-1.6.2/images/ballsticks1_2d.gif0000644000175000017500000000674111712736221016622 0ustar tonetoneGIF89a11÷­   - ' ##))$%77>>"#&)02%)##**/366;;16:=!),$.1)/3'14*58/:>1>B;>CCCHH BBTTcclk fguu{{qt#AC4AE9GL9HMNSXM:ckt}@@EKQQXXMT!kktt||r}:CBHDU[GY_HPVJ]cNbiI`xQelRhnUkr^ltYpw\s{fhqRj€^z‚c|ƒfˆqyƒ…„””››££³³ººª¬ÍÍÔÔÜÜääììôôýýH•i„Œd€•o‹”mŒšr˜{‰“v•Ÿx•›x–¡zš¤Ÿªa ¨†Š”› ¢®²»Ã†††ˆŽŽ‘“”žžš±¡¡¬¬µ±¸¸ÈÇËËÕÐÜÜææììññýý€˜¢‚£­…¥±‡©´‹®º±½Ž¶Â’¶Ã“¹Å—½Ê›ÁÏžÆÔ¡É×£ÌÚ§Ðß©Ôâ­Øç¯Ûê±Ýì´áñ·éú!ù!þCreator::XCRSYDEN-0.x ,11þþ€(P ”i³¦ùñÓ ã† B 4ˆ0FM7 þ4hРAAŒŒd  4hРA„„@€3eÀ2hРAƒê@u Ü¸ðGРAƒ *Ä€¸|Êô  Ï A‚ 䇇 °Èéòþ€€!ƒ"¨‡! yX¡J…Ê €¤?~M0àƒˆ ð¤"Uª”)S¦$ü`ôÄI– ‰``rx2eÊ”)S¥N± @84i &K˜.aÂÔh¬à„Ê”)S¦J¡‚CbI’þJ—,]²d “"IŠÄÑ„g”)S¦L•R‡ÀL—.]ºté’%G”"‘˜Ó% (T¦L•B%ªJ@€•,]ºté’%LŽ’, !–P¦L•:0Ô 'ˆ`²téÒ¥K–0Aú&ä J…ªT'¥æ´ ˆ°déÒ%K—,aj`HˆBEÊRBiyc@€þ°“%K˜.a’¤€1CLàƒ!%F–X’À €àbL7nlÀ# 2À@š6lØ´$„À.ظi£&„`‚¤€þ¼P#ãE@0eK!hÀÂŽ 8Èc T(Qp$ ç)T§P¡Ò”þ @â)S¦L™2…* àªR¦L™2e •@1dÂÌà‡J–*«J™2eªTª*€lܰA3£I«MX‘2eªªR;€iÖ°i£fŽM)ÒeªT)T›ô`þÄpÃÆØáIªS¦8uòôI€™  <žr`ê Œ @…àÊždȘɀjØ´iÃæþÔhæ ¨á† 5.ÀÆ52@€®€;xcrysden-1.6.2/images/unmap-empty.gif0000644000175000017500000000022111712736221016260 0ustar tonetoneGIF87aPÂøÀÀÀ€€€€øüø,P^ºÜþ0ÊI«½8ÃÀ»ï äFœhz†eÛ*Q ó̺x|ï÷¢œ°(HãmÈÜ$Ÿ…esº(B‘RêÔzUµTn7 Нärî M«]¿8ðÝØïø<}ÏŸ&;xcrysden-1.6.2/images/unmap-isosurface.gif0000644000175000017500000000033511712736221017273 0ustar tonetoneGIF87aPòøÀÀÀ€€€€øüø,PªºÜþ0ÊI«½8ÃÀ»ï äFœhz†MQ”“ûÂJ޳Œ G¾Y) (FÑÏâ[dÐ(O!£VÐE4XÝZ›Øk–ñÜJ•ÚWS=ãRÃð |îÆÒ…€²Y6µ†×ml€qB`l=Qd{P}wu€nuw~††‹Œ.Žr„••Y`ƒ„jo zŒ}{i‘…‚\‘£¬xy™šhK¹H¼Iº¿ÂÃÄÅÀÇÈɺ ;xcrysden-1.6.2/images/last.gif0000644000175000017500000000031111712736221014747 0ustar tonetoneGIF87a!!ÂøøüøøüøüÈ0,!!–ºÜþ0ÊIU !×%tìõ÷€âVT¦ÕÊžL½Äܼ#Y¹ƒ×ø@‚ÈIæžÏc°iZ:¡Q©ŽiEzkS®ïKÎÄ/²—`Ü©ß?7.Ÿ«ëv#:ìù5c6iy‚ƒxv‡ˆC~Ž~H‹Œ*}u=…“]6iš›˜.5¡g¤#ŸC¨*«¬U77~=µ ;xcrysden-1.6.2/images/xcrysden_mask.xbm0000644000175000017500000001134311712736221016706 0ustar tonetone#define xcrysden_mask_width 72 #define xcrysden_mask_height 84 static unsigned char xcrysden_mask_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, 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, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x15, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x38, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x41, 0x40, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x20, 0xfe, 0x80, 0x03, 0x1c, 0x00, 0x00, 0xf4, 0x17, 0x00, 0xf7, 0x01, 0x04, 0x75, 0x00, 0x00, 0xfa, 0x03, 0x10, 0xfa, 0x03, 0xb0, 0xff, 0x00, 0x00, 0xd4, 0x0f, 0x00, 0x75, 0x03, 0x40, 0xfd, 0x00, 0x00, 0xe8, 0xff, 0x8b, 0xff, 0x03, 0x80, 0xfe, 0x01, 0x00, 0x54, 0x07, 0x04, 0x55, 0x57, 0x77, 0x75, 0x01, 0x00, 0xa2, 0x0f, 0x00, 0xfb, 0x03, 0x00, 0xfb, 0x01, 0x00, 0x54, 0xd5, 0x01, 0xd5, 0x01, 0x40, 0x55, 0x01, 0x00, 0x88, 0xfe, 0x43, 0xab, 0xfd, 0xc0, 0xea, 0x00, 0x00, 0x70, 0xf5, 0x17, 0x55, 0xf4, 0x11, 0x55, 0x00, 0x00, 0x20, 0xfa, 0x8f, 0xa3, 0xfa, 0x07, 0x22, 0x00, 0x00, 0x20, 0xd4, 0x1f, 0x40, 0xf5, 0x07, 0x14, 0x00, 0x00, 0x20, 0xe8, 0xff, 0xa1, 0xfe, 0x87, 0x04, 0x00, 0x00, 0x30, 0x54, 0x07, 0x51, 0x55, 0x47, 0x04, 0x00, 0x00, 0x30, 0xa2, 0x8f, 0xbe, 0xfa, 0x03, 0x04, 0x00, 0x00, 0x10, 0x54, 0xc5, 0xd5, 0x55, 0x01, 0x04, 0x00, 0x00, 0x10, 0x88, 0xfe, 0xeb, 0xaa, 0x03, 0x06, 0x00, 0x00, 0x10, 0x50, 0xf5, 0x57, 0x55, 0x11, 0x00, 0x00, 0x00, 0x10, 0x20, 0xfa, 0xaf, 0x23, 0x08, 0x02, 0x00, 0x00, 0x10, 0x44, 0xd5, 0x5f, 0x55, 0x01, 0x00, 0x00, 0x00, 0x18, 0xe2, 0xe9, 0x8f, 0xaa, 0x06, 0x02, 0x00, 0x00, 0x10, 0x50, 0x55, 0x57, 0x55, 0x07, 0x02, 0x00, 0x00, 0x18, 0xa1, 0xa3, 0xef, 0xf8, 0x1f, 0x02, 0x00, 0x00, 0x00, 0x50, 0x55, 0x55, 0xd4, 0x1f, 0x03, 0x00, 0x00, 0x88, 0xa8, 0x8a, 0x62, 0xe8, 0x1f, 0x02, 0x00, 0x00, 0x40, 0x50, 0x55, 0x41, 0x55, 0x17, 0x01, 0x00, 0x00, 0x0e, 0xa0, 0x3b, 0x40, 0xa6, 0x1f, 0x01, 0x00, 0x00, 0x3d, 0x54, 0x55, 0x55, 0x54, 0x15, 0x01, 0x00, 0x80, 0x7f, 0x80, 0xca, 0x7e, 0xea, 0xea, 0x07, 0x00, 0x40, 0x7f, 0x40, 0x45, 0xbf, 0x50, 0x55, 0x0f, 0x00, 0xa0, 0xbf, 0x00, 0xa0, 0x3f, 0x30, 0xf6, 0x1f, 0x00, 0x40, 0xfd, 0x00, 0x50, 0x7f, 0x00, 0xd4, 0x1f, 0x00, 0x80, 0xfe, 0xaa, 0xaf, 0xff, 0x08, 0xe8, 0x1f, 0x00, 0x40, 0x55, 0x00, 0x50, 0x75, 0x45, 0x55, 0x17, 0x00, 0x00, 0xba, 0x01, 0xa0, 0xbb, 0x07, 0xa0, 0x1f, 0x00, 0x40, 0x55, 0x05, 0x50, 0x55, 0x05, 0x50, 0x15, 0x00, 0x80, 0x28, 0x18, 0x98, 0xea, 0x3e, 0x8a, 0x0e, 0x00, 0x00, 0x04, 0x50, 0x54, 0x55, 0x55, 0x51, 0x05, 0x00, 0x00, 0x00, 0x80, 0xbb, 0xbb, 0x3b, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xef, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xbb, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaa, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xba, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x55, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00}; xcrysden-1.6.2/images/solidcell.gif0000644000175000017500000000444511712736221015772 0ustar tonetoneGIF89a%$÷ª  !4>$!4###))&++ "-/0"23384<<#4$8#>=7"8<?C 9B"B4S6[""F%#J)#M-#Q2 T5$[4*U00L<$b;4tN*E"F* O"@?U1 f1"I>CCIFII BLLQ DSHXUFRHSSYT\\CUEYL[D_^b \eKbFcJhYm\s\v]zb]h]bbchmckk aknmnparnqrm{orrvxxwxy tr {s~bu`{j}vw{x GC$Fk)Dn!Op+Fr*Hs1Dw7D|6Ly!oi@ _E%kI$nG8N0Q)|y€e…pƒw‹q„vt”#^(]….^4WŒ2X‹7[”?V”"`„%cŠ,dŽ)hŽ+n#w‰ t–$s™)p’4a•|$”$ )N†PáÂ%K–,Wœ@qb¡€TðÁƒ‡C¤H!âĉ'Q²páÂEO(QœDñQ@>|øðáÇ'L†8qâ„Ê*Y¸ÔÑ’%J'Qx °à£‡>†8a2ĉ'N¢\¡Ò… /\²dÉ% •>xøðá£I%1Nœ8q2Ä •)Vå‰B% —-Y²D‰rå@Ç>†4éRʼn'NœD‰BÅÒ¦M–¨P¡¢… <{öD1|øðþáÇ'Cœ8qâć“(S8}êt‰¦)T¨té£0/0€‡>†Hqâĉ'N|8‰ȩPœ,aú”e @*Dάaã¨M<âÇ"†À8qâĉN¦LAôi¨O Be‰2¥†5f̨éN|øâDÊ'Nœ8ñácÊ“'…NJ5jÔ§)S|ÔPc!` Š&Lœ8qâĉ“Ìp2e Q£@Â2å ?ÌùñƒÃ 8‰â„ˆ“(Q|Ô ð ÁnDy2E™)Q¦ð AƒF!?lX@'y"E"Ôcþƃ8ð¡ =¦DyeŠ5jРAc†…(Å‹¤Ir04hРƒ!HÀp S¦<©A£ 3f̘ñbšP2õèˆ 4A"ĉ$0,0à '>fÔ #3^¼0€H¢ÁƒB„b„‡ 40a 4Œ¸ÑÁa†…pÃS©%$H8hÐÀ‡ 2„ÈaAƒ X¨Q£F4fX°@!fT*¥d„ 4˜€A‚4hРA 5jÔ¨1c†… @&˜ˆ8xð Aƒþ "h(3¡Aƒ 4h`¡È‘5fÌà0Cà Š“ 4hРÁ14hРAƒ(9RƒÆŒ,̈â Aƒ 4hРAƒ4hð …5hИaa< 4hРƒ h°Aƒ 4XP¡F3f̰0@ 4hBDƒ 4h`À€>ܨQc‡ÀÀƒ "DhРAƒ "„0‘"44jИa!`àAƒ í4hÐà‰)LÀ¡£‚  0ð A 4‘D‰(6( 4hРAƒNÈ€Á‚€?1G,:D06J58V9=eBYC\GbJgTZ/EE.CD)@_7@@%Ox+Ms%V|2Hp?KskkD[b8#GGGDElBMuCTMR~U^`‚%^….[‚+^†4Y?1G,:D06J58V9=eBYC\GbJgTZ/EE.CD)@_7@@%Ox+Ms%V|2Hp?KskkD[b8#GGGDElBMuCTMR~U^`‚%^….[‚+^†4YM~°Xáâ_Á‚=»¶í›8sëâݳ!_¾|ù:$éÑ£‹|ÕÒ5ŒÚ5mßʵsgïR¾|ùò!PBĈ&¬¬z5+0bÕ°gNž=ùòåË×aÉ!C„|è²JU,Zº†=»¦íÛ8z–òåË—’"C† Ùþá$Ô¨R­dåúEŒ¶nçäAÈ—/Ÿ€K† "DQœ@©zEK°g×´½›”/_¾| ¢2dˆ'¡>iúTª@Y¹v£ÖM݃|ùòå;ÀÉ"BtpµIÓ&P¦\ÍÒÅË:IùòåË—/_>˜ ‘Âj)R¤NÁêåK˜1nääË—/_¾|ùòå3 K&GŽ9r S'O©p]É—/_¾|ùòåË—/_¾|ùòåË—/_¾|ùòåË—/_¾|ùòåË—/_¾|ùòåË—/_¾|ùòåË—/_¾|ùòåË—/_¾|ùòåË—/_¾|ùòåË—/_¾|ùòåË—/_¾€;xcrysden-1.6.2/images/xcMenuEntry_down.xbm0000644000175000017500000000036511712736221017346 0ustar tonetone#define ComboBox_down_width 11 #define ComboBox_down_height 14 static char ComboBox_down_bits[] = { 0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0xfe,0x03,0xfc, 0x01,0xf8,0x00,0x70,0x00,0x20,0x00,0x00,0x00,0xfe,0x03,0xfe,0x03}; xcrysden-1.6.2/images/xcAbout.gif0000644000175000017500000043022611712736221015425 0ustar tonetoneGIF89aÓ ÷ÿ  13.:(354./.%,79L44k6I7:KJhYI.I4(H4&V7)\91H0)h;.f<0v8-eO0Nh3Vc!]QJ2lA3vB7lC.km_eHRMBCgFGvPfVYqhqPOsmMezqtMh:8š^<ŽJL–KLŽRS©VW¸KL­ig¦Y\ÕVXÊcdÚdeÉikäY]Þ=C‹Šur‹1j„zsˆHªŸȺ åàr‘‘zœ£m ¤YÚ딎:1± 82ˆ/t—/\ˆF9–I<­I;‘yŽIA•JAœLA˜CGYP‹mR‘op¤ME¬RI¦QIµUJ»YR¶LL¶gT [rÎçÆ[9ÈZRÖ\WËUMÊbZÚbYÐdJØjcØphâc[ñd\æjcétkð{sÓUeŽ-‡•)—+œ&•–;†˜6‰6’Ž0†­¨³¬ºµ±µ¤%œ¥7—¬5«#¤³$©·-­›“»–A†E†žK†D‹žR†™H£J‹§G”¦[†§W‰®V”®l†«eŠ®s†¯w‡±jŒ´h“µ|†µw‰·q’ a Â½Ò¹Æ&ºÏ4”Í ÊËÇÒ ÍÙ ÕÑÍØÕÌÖÓ+ÎãÝéçèæôôä+Ýí/ëÚäÄw—ÑY§äRÝñOîæoÜñníÚLÖ¿mÜ“‘²³ &’t¾™{­Œo£¥`³Õ(³ÑS̲ÄœyÎŽkǤyÈ©yηyÓº{Ñ®uöƒzѨXÑÑÑú5êêæì(ØÉvÞÔqÞÖuÙÒlÙèWÔïIÞãeãØtâØpéöVææiêätêóföônÎÑX“‹¬±¶„†¹Š‡¾”†¾˜…±–§¬¤–¹Æ¥·ÄÄЮÌÓ´ÙåÂŒ‰Å•‰É“Ö¹ƒÑ¨‰Ì³´å˜•ò‘îå³Üò®îÛ¤ÒÚǃçЈôæˆÍĺÓÔÒÓèìåÔÚóÒïæåÝùç÷ùùùîìêËÞá´Ï™!ù!þurea-diffden+-0.04.xwd,Ó ‡  13.:(354./.%,79L44k6I7:KJhYI.I4(H4&V7)\91H0)h;.f<0v8-eO0Nh3Vc!]QJ2lA3vB7lC.km_eHRMBCgFGvPfVYqhqPOsmMezqtMh:8š^<ŽJL–KLŽRS©VW¸KL­ig¦Y\ÕVXÊcdÚdeÉikäY]Þ=C‹Šur‹1j„zsˆHªŸȺ åàr‘‘zœ£m ¤YÚ딎:1± 82ˆ/t—/\ˆF9–I<­I;‘yŽIA•JAœLA˜CGYP‹mR‘op¤ME¬RI¦QIµUJ»YR¶LL¶gT [rÎçÆ[9ÈZRÖ\WËUMÊbZÚbYÐdJØjcØphâc[ñd\æjcétkð{sÓUeŽ-‡•)—+œ&•–;†˜6‰6’Ž0†­¨³¬ºµ±µ¤%œ¥7—¬5«#¤³$©·-­›“»–A†E†žK†D‹žR†™H£J‹§G”¦[†§W‰®V”®l†«eŠ®s†¯w‡±jŒ´h“µ|†µw‰·q’ a Â½Ò¹Æ&ºÏ4”Í ÊËÇÒ ÍÙ ÕÑÍØÕÌÖÓ+ÎãÝéçèæôôä+Ýí/ëÚäÄw—ÑY§äRÝñOîæoÜñníÚLÖ¿mÜ“‘²³ &’t¾™{­Œo£¥`³Õ(³ÑS̲ÄœyÎŽkǤyÈ©yηyÓº{Ñ®uöƒzѨXÑÑÑú5êêæì(ØÉvÞÔqÞÖuÙÒlÙèWÔïIÞãeãØtâØpéöVææiêätêóföônÎÑX“‹¬±¶„†¹Š‡¾”†¾˜…±–§¬¤–¹Æ¥·ÄÄЮÌÓ´ÙåÂŒ‰Å•‰É“Ö¹ƒÑ¨‰Ì³´å˜•ò‘îå³Üò®îÛ¤ÒÚǃçЈôæˆÍĺÓÔÒÓèìåÔÚóÒïæåÝùç÷ùùùîìêËÞá´Ï™þþ€þ@þ þþþþþþþ€þ@þ þþþþþþþ€þ@þ þþþþþþþ€þ@þ þþþþþþþ€þ@þ þþþ`@þþÀ€† ‡mþþ€@€ -Z¤èСEþ@þ €þ Z´HÑ!B„"DhÑþþV,:´hÑ!B„"Dˆ!B„Z¤þþ@4¬8´h‘¢C„"Dˆ!B„"Dˆ!B‡þþ@4:´h‘¢C„"Dˆ!B„"Dˆ!B„"DèÐ"€þ@þ4h thÑ¢C„"Dˆ!B„"Dˆ!B„"Dˆ!B„:´È þþ hX¡hÑ¢E‡"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„)2þþhØ HÑ"GŠ"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ¡C‹ þþ аA‘"G‹)RT¨!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"DhÑ þ€þРd‘"G‹)*T¨ÀB… *Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„Z´þ þ РA‰"GŽ)RT¨P¡B… *T¨P¡B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"!B„mþþ aƒ"EŽ)R¤È!C… *T¨P¡B… *T¨!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"DˆÐ¢ þþ`@ƒGŠ9R¤È!C† 2dÈP¡B… *T¨P¡B… "Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"´hþþ€À€%Ž9j¤H‘!C† 2dÈ!C† *T¨P¡B… *T¨P¡B…"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"þDˆ!B„-2@þ `€† Ž9rÔ¨Q#Dˆ2dÈ!C† 2dÈ!C† *T¨P¡B… *T¨!B„"Dˆ!B„"Dˆ!þB„"Dˆ!B„"Dˆ!B„"Dˆ¡CŠ þ` Â† ŒQ¢Ô¨Q#Fˆ!B„"C† 2dÈ!C† hÈ¡B… *T¨P¡B… þ*Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dè"þ € ^.]¢D #FŒ5jÔˆ"Dˆ!BdÈ!C† 2dÈþ!C† *T¨P¡B… *T¨P¡B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„:¤Èþ@À€ (&]ºti$H1bĈ#Fþ5B„"Dˆ2dÈ!C† 2dÈ!C† *T¨P¡B… *T¨!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ:v€þ@À€(PX²ÄêþÒ¤IA‚i$FŒ1jĈQ£F!B„"D† 2dÈ!C† 2dÈ¡B… *T¨P¡B… "Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!BtèСC‡Î¢ þþÀ PXIÇ-7K‘"EzôèÑ#H Aš‰#FŒ1bÔ¨Q#Dˆ!B„‘!C† 2dÈ!C† 2T¨P¡B… *T¨P¡B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„èСC‡:tèС³hþþ€€(PL‡.]ºsÜ*Uª)R¤H=zô$H&1bĈ#FŒ5jÄ"Dˆ!BdÈ!C† 2dÈ!C† *T¨P¡B… *T¨!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„Ñ¡C‡:tèСC‡:tè,ÚþþP¤¶nÝ:tèºqãÆ[¥J–"EŠéÑ£GA‚ $HŒ1bĈQ£F!B„"D 2dÈ!C† 2dÈ!C… *T¨P¡B… "Dˆ!B„"Dˆ!B„"Dˆ!B„"D‡:tèСC‡:tèСC‡:‹6þ€þPÀ ,L @:TI!L:uÀÐyóæ ݹnܸq«T©’¤H‘"=zôèÑ£G A‚‰#FŒ1bÔ¨Q£Fˆ!B„‘!C† 2dÈ!C† 2T¨P¡B… *T¨P!B„"Dˆ!B„"Dˆ@B„"Dˆ:tèСC‡:tèСC‡:tèСC‡Î¢ þ þ0†,W°lÙ"FŒ1[ĈÁP@HH‘kž¼yê„  ˜¯oÞ¼yC×7nÜ*Uª$)R¤H=zô$H AbĈ#FŒ5jÔ"Dˆ!BdÈ!C† 2dÈ!C† *T¨P¡B… *Dˆ!B„"Dˆ!B„"Dˆ:tèСC‡:tèСC‡:tèСC‡:tèÐYdþþ€¤dÉr ,Z´hÙ"FŒ1fÆŒ¹RHQe™0aÂJ”(Q¤\Á‚E‹-[¶ˆ#F̘1cÆŒ3† P¥Š.zôèÑ›·lÙ°eÆ &LØ0uĈ ,X0`À€ÃõÍ›7oè¼uãÆ·J•*EŠ)Ò£G=zô$H“ 1bÄ #FŒ5jÔ¨"Dˆ!BdÈ!C† 2dÈ!C… *T¨P!B„"Dˆ!BtèСC‡þ:tèСC‡:tèСC‡:tèСC‡:tèСC‡:tèØYdþ ÁÇL˜@‰%Š)Y°`Ñ¢eË1bĈ3f̘1cÆŒQ3†Š®yóèÑ£·lÙ°aˆ &L˜0a†©S'Œ±`Á‚ 0_¸¾}óæÍºnݸqãÆ­R¥J’"EŠôèÑ£G=‚ Ò$HŒ1bĈ#F1B„"Dˆ 2dÈ!C† 2T¨P¡B… þ"Dˆ!B„ÑH‡:tèСC‡:tèСC‡:tèСC§:tèСC‡:tèСC‡N:}Vþ.\øð (Q¢D‘rå ,Z´ˆÙ"FŒ1cƘ1cF5jÔ°!&oذaÆ 6lذaÆ ¦NºaĈ ,X°`À€æË×·oÞ¼yC‡®7nܸUªT©’¤H‘"=zôèÑ£G A‚4 #FŒ1bĈQ£FŒ!B„þ"C† 2dÈ!C† *T¨P!B„"Dˆ:tèСC‡:tèСC‡:tèÔ¡C‡:tèСC‡N:uêÔ©S§:tÒ¡C‡Î¢ þ0 >0aÒJ”(Q¤H¹‚E‹–-[Ĉ3ÆŒ3j̨1cÆŒš1c~©S·N:uêÔ©S§N:uê„ ,X°`Á‚ 0`¾|ùÂõÍ›7oÞÐëÆ7n•*Uª)R¤H=zôèÑ#H þM‚Ĉ#FŒ1bÔ¨#Dˆ!B„È!C† 2dÈP¡B… "Dˆ!B„èСC‡:tèСC‡:tèСC‡:uèЩS§N:uêÔ©S§N:uêÔ©S§N:uêÔé³€þ€&\ððá&L @‰% @)R¤`Ñ¢eË1eʘ1à 6j̘1cf̘4èСCçË—/_À€ °`À€  0`À€æË0_¸¾}óæÍÛ9tݺqãÆþ[¥J•,EŠ)Ò£G=z $H 1bĈ#FŒ5jÔ"Dˆ2dÈ!C† *T¨P¡B„"Dˆ:tèСC‡:têСC‡:uêÔ©S§N;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±S§N:uúl þ(@a… <|øÀ„ (Q¢D‰"EÊ,Z´hÑ"4hذaÃF3jÆŒ!ã…R$KÝÎC‡:tè|ùòÐ0`À€ 0`Àþ|ùòå ×·oÞ¼yóv]·nܸqãV©R%I‘"EŠôèÑ£GA‚ $H1bĈ£F!B„"C† 2dÈ¡B… *Dˆ!B„èСC‡:tèСC‡N:uêÔ©S§N;vìØ©S§N:uêÔ©S§N:uêÔ©S§N:uêØ±c§N>þ&L pÁ‚‡>0aÂJ”(Q¢D‘’% –-Z¶”aÓ¦7lذ1cÆŒ™1cÄ$r‰Ò¥H–*Uâvþî:tèÐ}ûöí›/_¾|ùòåË—/\¸p}ûæÍ›7oÞÐëÖ7nÜ*Uª)R¤H‘|ôèÑ£G A‚ #FŒ1bĨQ£Fˆ!BdÈ!C† 2T¨P¡B„"D‡:tèСC‡:têÔ©S§Ž;vìØ©S§N;wîܹsçÎ;wîܹsçÎ;wîܹsçÎ:uêÔ±c§þ!B„ (\°àáÇL˜0aÂJ”(Q¤\¹‚ ,bÊ q㦠6þj̘Q3fŒ?|ú,rԈѤI‘"UªÄ[7tèСóöíÛ·oßpáÂ…ëÛ·oÞ¼yóæÍÛ9tݺqãÆ[¥J•*EŠ)R¤G=zô$H AbĈ#FŒ5j„"D† 2dÈ!C… "Dˆ!:éСC‡:tèЩS§N;vìÔ©SçÎ;wîܹsç8wîܹs8pàÀÎ8pîܹçÎ;wîÔécþ€&Dˆ0a… ,Xððá&L˜0aþÂ$Ê,X´hÙ²eË1bÄ iÓ†Í3jÆŒ1óæŸ>}ú2Ô¨‘£I‘"IªÄ[·sèСóæÍ›·oß¾}ûöÍ›7oÞ¼yó†î\·nܸqãV©R¥J’"EŠéÑ£G=‚ ¤I1bĈ£F!B„È!C† 2T¨P¡B„¢C‡:tèСC§N:vìÔ©SçÎ;wîÜ8pàÀ8pàÀ@8pàÀ8pàܹsçÎ;uúþ @`B„þ"L˜@á <|øÀ„ɇL®dÁ‚E‹–-bĈ#F 2bÌ´Qcf̘1cÎpÊ„P >vê2ÔÒ¤G"YâÆ[·sèÐyóæÍÛ7oÞ¼yóæÍ›7oÞº¡;×­7nܸUªT©R¤H‘"EzôèÑ£G A‚i#FŒ1bÔ¨"Dˆ2dÈ!C… *Dˆ:tèСC‡N:uêØ±S§Î;wîÜ8pàÀœ8qâĉ'Nœ8qâĉ'8pàÀ8pàÀ¹s§Žþþ€&Dˆ!„ (\xÁˆ<|øÀ$Ê,X´hÙ²EŒ1bĈ#fÌ3f̈#FÌ™7«<éˆ9v)j Ò£G‘*UâÆ­:tç¼yóæÍÛ7oÞ¼yóæÍ›·sèºuãÆ7n•*Uª)R¤H‘=zôèÑ#H A‚Ĉ#FŒ5B„"C† 2d¨P¡B„Ñ¡C‡:tèÔ©cÇN:wîÀ¹s8pàÀ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâÀ‰8pàÀ‘cÇþþü‘ån‚„"D˜0a… ,XaÁ“&Q®`Á¢E‹–-[Ĉ3FŒ˜1cÆŒ3FŒ1cĈ!³é(Ozæá3GNŸEŠ1‚éÑ#I•*qëv:oÞ¼yóæÍÛ7oÞ¼yóæ ݹnݸqãÆ[¥J•*IŠ)R¤G=zô$H“ 1bĈQ£Fˆ!2dÈ!C† "Dˆ:tèСC§N;uêܹç8pàÀ'Nœ8qâĉ'Žœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8þqâĉ8pìpþ pÔIÕ«XðÀˆ!B„&L˜páÂ… .|`EJ,X´hÙ²e‹1bĈ3f̘1cÆŒ#FŒ˜1dʸ:êS'=xøð±cç!D =Š©R%nܺ¡C×Í›7oÞ¼yûæÍ›7oÞ¼¡Cw®7€Ü¸qãV©R¥J‘"EŠéÑ£GA‚i$FŒ1jÔ"D† 2d¨P!B„Ñ¡C‡:uêØ©SçÎ;wàÀNœ8qâĉ#'Žœ8qâĉ'Nœ8qâĉþ'Nœ8qâĉ'Nœ8qâĉ'Ž9qâĉ';@þ0ÀÏ©S¨T½roŠ"Dˆ!„ &P @áÂ&L HÉ‚‹-[¶ˆ#F̘1cÆŒ3ÆŒš1cĈ#†Ì–X¯N™úÔIOž?|úôQdÈ#HEªT‰·nèÐyóæÍ›7oÞ¼yóæÍ›7oÞÐëÖ7nܸUªTIR¤H‘"=zôèÑ#H AbĈ£F!BdÈ!C… "D :tèÔ¡SÇN;wàÀœ8qâĉ'Nœþ8qâĉGNœ8qâÌ™3gΜ9sæÌ™3gΜ9qâĉ'Nœ8qâĉ'Nœ8qâÄ™3‡þ0ÀßM™D*•Ê•+wðöéƒ !B„"D˜0!„ &xøðI”(R°hÑ¢eË1bĈ3f̘1c̨1£ÆÌ˜1bĈÑ/Ö«S¦@uò”Ÿ>}ì2ĤG’*UâÆ­:tÞ¼yûæÍÛ7oÞ¾yóæÍ›7tèºuãÆ7n•*U²$)R¤H=z ¤IŒ1bÔ¨"D† 2T¨P!BtèСC‡N;uêÜþ¹s8qäȉ'Nœ8qâĉ'Žœ9sæÌ™3gΜ9sæÌ8gΜ9sæÌ™3gΜ9sæÌ™'N9qâĉ'Nœ8qâÈáÃþ``Æ>}”ÇÓ§R©\År¯_¿~$Dˆ!B„&L˜0!‚…˜0‰EÊ-Z´hÙ"FŒ˜1cÆŒ1cÆŒ3f̨13fŒ1NÒÁ‹õꔩO¡2åÁçC†1‚ôèQ¤J•¸uó†Î›7oÞ¼yóæÍ›7oÞ¼yóæ ºsݸqãÆ[¥J•,EŠ)Ò£GA‚ #FŒ!B„Èþ!C† "D‡:têÔ©Sçœ;pàĉ#GNœ8qâĉ#'Nœ9sæÌ™3gΜ9sæÌ™3gΜ9sæÌ™3gΜ9sæÌ™3gΜ9sæÌ™3gNœ8qâĉ'Nœ8|8þ €…—KŽ-²Ó‡ÏŸ<ž>:•ê,wïúõ w@B„#Dˆ!B„"L°ð &Q¢H¹’‹-Z¶ˆ#f̘2f̘1cÆŒ3jÌŒ#†Kš|ð`½:eêS(=yþð±cç¡FŒ =ŠT©7nÝÐyóæÍ›·oß¾}ûöÍ›7oÞ¼yó†]7nܸqãV©R¥J‘"þEzôèÑ#H AbĈQ#Dˆ 2d¨P!B„èСC§Ž:wîÜ'Nœ8qâĉ'Žœ8sæÌ™3gΜ9sæÌ™3gΜ9søðáÇ>|æÌ™3gΜ9sæÌ™3gΜ9sæÌ™3gΜ9säĉG΀þ Šsç.±º©‘!;vúðÉ£§S'P§\½r÷®Ÿ>~· Dˆ!B„"Dˆ0!B„ ˜0a%Š”+Y²`Ñ¢eË1bÆŒ)c† 6lذ1cF À1cÄ`qÒ/Ÿ;XªLúäI>sìØ9d¨Ñ¤G$UâÆ:tÞ¼yûö .\¸páúöÍþ›7oÞ¼yC‡®7nܸUªT©R¤H‘=zô$JŒ1j„‘!C† *Dˆ:têÔ©sç8pâĉ'Nœ8qâÌ™3gΜ9sæÌ™3g>|øüáÃçÏŸ?|øðáóç>|þüáÇ>sæÌ™3gΜ9sæÌ™3gΜ9sæÌ™3Ç þ@€Š*èÖµK×­’¤G“!2dÇÎ>yòx u*Õ«XðÞõÓÇO["Dˆ!B„"Dˆ@áÂ&P¢D‘"åJ,X´lÙ"FL3fаiÆ 6j̘Q£fŒ,úúÁs÷*•)PŸ<åù3ÇŽB†A‚ô(R%nÜþº¡óæÍÛ·o¸|0`¾páÂõÍ›7oÞΡC×7nÜ*Uª)R¤GA‚ #F!2dÈP¡B„Ñ¡C§Ž:wîÀ'Nœ8qäĉgΜ9sæÌ™3gÎ>|øàÁÃçÏŸ?þ@xП?xøðáÇϟ?|øðáÃgΜ9sæÌ™3gΜ9søü1þ`@„*¹Ö­[·7tè¸q³ôè¤F†èØ‘Ã'žP¡N¥zËÝ»~øøi+!B„"Dˆ!B„&\ðÀJ”(R¤\ɂ˖-bÄ”)SM›6mÚ´aÆ3f̨!ƒE_¿|ðb½Jeþê“§<€øÄ±CÇP#FEªÄ[7tÞ¼}û† 0_À€ ˜/_¸p}óæÍ›·sèºqãÆ[¥J•"EŠôèÑ#H 1bÔ"C† ,Tˆ:tèÔ±Sç8pâĉ#'Nœ8qæÌ™3gΜ9søðùó‡ÏŸ?ðà”'OøðáÇ>|æÌ™3gÎ> þ`)r©S§Ž0`À€ùúæ Ý9n•$=šÉ;qøäÑÊS©T®b¹{—ß¾["Dˆ!B„"Dˆa >0‰EŠ”+Y²`ѲeK™2eФiÓÆ7þnÚ°a£ÆŒ5c¶èÓמ»W©Luú¤'ÏŸ8rì2ÄhÒ£H•*qCwÎÛ7\¾€ 0`À€ 0_¾p}óæÍ:tݸqãV©R¥H‘"=z $FŒ5BdÈ!C…Ñ¡C‡N:uîÀ'Nœ8qâĉ3gΜ9sæÌ™óç>ʃ<ñàÁƒ|øð™3‡Ïþ€€)ª¬S§N±`Á‚ ,0`¾|}C‡®[¥H )*TÇΜ?yô„uJV,wðòáËÇ"Dˆ!B„"L˜@á‚P¢H‘þråJ–,X¶lS¦ š4iÚ¸qãÆ›6lب1cF výú½s÷ÊÕ©P¡ôäÁ3GŽBˆMz©R¥nè¼yÃå 0`À€ ,X°`À€ ˜/_¸¼yó†Ý9nܸUªT)R¤GA‚‰£Fˆ 2d¨!:tèбS§Î8pâĉ'Nœ8sæÌ™3gÎ>xøðù}ÒƒP;v 5‚ô(R%nÝÐyûæ 0`Á‚ ,X°`Ä‚ ,X°`Á€Ì.oÞСëÆ[¥J–"Ezô$HŒ5BdÈ!C…Ñ¡C‡Ž:wîĉ'Nœ8qâÌ™3gÎ>øüùƒ€ôtúTJU,wðàåË—ÏJ"Dˆ!B„&L˜0… >0‰ÒDÊ•,X°hѲ¥ š4mÜ+V¬˜›6mÚ´a£F vðܽReêÓ'=yþرSÈP£I"Uê†ÎÛ7_À ,X0bÆ©S§N:uê† ,X°`Á€óåë›7oè¼qãV©’¥H‘=‚ #F2dÈP!BtèЩc§N9räĉ'Nœ9sæÌ™óçÏŸ?xðàÁ“'Ož•Jõ*–;xùòåסÀ "Dˆ!B„ &L pÁ‚‡˜0‰EJ,Z°”Aƒ& 4mÜs“¦M›6lذCž»W§L}ò”ç;u !‚ô(R%nèÐ} X°`Á„ S§NÝ0a„ 6L:uÈ ,0`À|áúæ :nܸU²)Ò#€ A‚ĈQ#D† *Tˆ:têØ©S§Ž9qâĉ3gΜ9|øð„Ê´„I“&W²`Á¢EË1bĈ3F̘3gμÑ4jÔ§O¡B… ÊS&=zôèÑ“'<›þ @aå·tç*UâÆ[·nè¼yóð›/`À‚ Œ˜0u„ 6L˜°aÆ 6lذaÆ &l˜:uÁ€­;ÇÍÒ$HŽõ 'QªT©zåÞ>~ü¡p@B„"Dˆ0aÂ… <|øðÉ&L˜@‰¥‰”,X°hÙR&M›6mÚ´iÆš3oN™ú”)ÏŸ>v jô(R¥nèÐ} X0bêÔ &L˜0aÄ &LØ0a„ &l˜:u‚ 0\ÞСëÆ[¥J‘"=z $FŒ!2dÈ¡B„Ñ¡S§N:räÄþ‰'Μ9søàùƒž|øðá&Q¢4‘"%K,ZÊ iã¦M›6mذQcæÌ›OžðüéÓÇP#H“"q;‡/`À‚ S§n˜0a† 6lذaÆ 6L˜0a„ 6Lº`Á‚Ì×7oèºqãVIR¤HA‚D‰þ#Fˆ2d¨P!BtèЩS§Ž9qâÄ™3gΟ?xðàÉ£G=žB}êÔéÓ'P¦:Añ¡‰)R¤\É’ -Z¶ˆ#FŒ1bÄŒ3æÌN¦L‰úôéÓ§N:uúä)“=zòäÑcþ ¨°Â «K¬.EŠ)R¤H’*UªT‰7nÝÐóæí._À€ Œ1u„ 6LذaË–-[Ö¬Y³fË–-kÖ¬Y³fÍ–-6l˜:uëÐùBgé’£E‹úÚꓨSª^År·/Ÿ"Dˆ!B„ (X°àáÃ=|`„ “(Q¤\¹’K™4mܸiã¦M›6mب9óæÏ;}5šô¨Ò9tè|l˜:u„ &lذaÖ [¶lÙ²eË– 6l˜°a„ ¦ŽX°`À€þóõͺnܸUª)Ò£G AbĨQ#D† 2Tˆ:têÔ©#'Nœ9sæðùƒž0iEŠ”+W®dÁ‚E‹–-bĈ#fŒ1cÆŒ9s†Ó)T¦L™êS§N>… •IžxðàÉ£GOŸ:uú ”)T¨ò€ñáÃ&L˜D‰"EŠ”+Y°`Ñ¢e‹1bĈ3F̘1cÆœySêÔ)S¦L™õéÓ§NByÒ£GžLþ @`ÊI—X]ºôèÑ£G=zôèQ¤H‘"I’T©R%nܸq놮›7oßpù X°`Áˆ S'L˜0a–-[¶¬Ù²e˘1›Ælš5kÖ¬Y«VÍš5kÖ¤I“fMš|øðá&Q¢D‰"åJ,X´hѲEŒ1bÄŒ3f̘1gÞ´R•ªÔ)S¦Lõ©S§OžôèÑ£'Ïþ0 ÂŠ“(]º4 Ò£G=zôèÑ£G=z)R¤H’*UªT‰7nܼ¡óæÍÛ7\¾€,X0bÃÔ &LذaË–5[¶ŒÙ4f̘Y«V­Z´jѪU«V­6lËT”ÐáBF1f€†.]¥IŽøô ä)“„"Dˆ!B„&L˜0a… @xøðáÇL˜D‘"EŠ”(Y°l)S¦Œ3f̘3þf̘2¿ÔÉS§n˜0aÆ ¶lÙ²eËæÍ“Ö¬Ù²eË–-[¶lÙ²eËš5[¶lÙ²eÆ &L˜:aÁ‚ì›7tè¸q«T)R¤GAšÄˆ£Fˆ *Dˆ;uàĉ3g@xðÌ£G§P:}eÊÔ)U¤6@ððáÇ>|øð &P¢H¹’% -Z´lÙ"FŒ1dÄŒ3fÌ™3­T¥*UªÔ)S¦@úÔé“'=zôdþ ÀH—.]º $H=zôèÑ£G=zôèÑ£G‘"EŠ)R¥J•VâÆ·nèСóæí._¾€ ,˜0uÄ 6lÙ²fË–9“fÍ6lÕ²9‹V Û5jÔ¨Qã5‚.`ÀˆQ£FáæIS§Ý9J‹úâSB„"Dˆ!„ &L˜0áÂ… @€ðàáÇþ>|`Â$J,[ʈ3fŒ3fÌŒ3fL™_Ëä5“6oÞ¼yóš5kÖlÙ²eË–-[¶lÙ²eË–-[¶lÙ²eËš-[¶lÙ°aÄ ¦NX°`Á€ùúæ Ý9nÜ*UŠéÑ#H 1bÔ‘!CŠÑ¡cGNœ8sæðÁƒO=žB…êô©”)S§R©êA… >xðàáƒ>|`„ ”&W²dÁ‚E‹–-·ˆ#FŒ1cÆŒ3æL«WªR¥J•Ê”)P >uêäI=™þ(é$HAzôèÑ£G=zôèÑ£G=zôèQ¤H‘$EŠT©R¥J•¸qãÆ­Û9tèÐyûæË—/_À‚ ¦Nºa† [&™4fÎŒué‚eÊ€\¸ü:cì4h , ñ 1jØ A#ÇeÖ¤ÍS·.Ý9JŽêD8 !B„"Dˆþ!B„&L˜@áÂ… .€„‡L˜D‘‚EË–-bÄŒcÆŒ3fÆŒCͲfÌœ-sæÌÙ²eË–9[æÌÙ2gΜ9sæÌ™3gΜ-[¶lÙ²eÍ–-[¶lÙ²eË–-F,X0`À¾yCwŽ·J•"Ezô$FŒ!2d¨:väĉ3g0¹’%K,X°hѲEŒ1bĈ3f̘1gÞ¸z¥*Õ)Q¦@úÔ©S¨LzôäÉ$Hþ€ ¬&=zôèÑ£G=zôèÑ£G=zôèÑ£G"EŠ)R¤H‘,UªT©R¥J•*UâÆ·nÞСC‡/\¾€©“7,“#G H‘’ -Z¶ˆ#fŒ2c´DþX°€Ä 0nܰÆ 4rh£†Íš´eËÔ­kWI„"Dˆ!B„"Dˆ!„ "L˜@a„ >0aÒDŠ)W´lÙ"F̘2f̘hF3cÆ qV­š5kÖ¤I›ÆŒ3f̘1cÆŒ3f̘1c6m3g˘MvK… 2dÈ!C†ŒÚ€#æË:tܸUªéÑ#H5BdÈ!:uìÄ‘3‡ž|øðáÃ&L¤\É’ -Z´l#FŒ1bÄŒ3fÌ™7®^¥JUþê”)P :uê¤Gž|`Â$J)W²`Á¢EË–-bĈ#F̘1cÆœóJU©S¦@}êÔ)”=zòàÁ“G(ÒYŠ)R¤H‘"EŠ)R¤G=zôèÀG‘"EŠô(þR¤G=zôèÑ£G A‚4iÒ$H1‚D‰$00‰%J)R²dÁ‚E‹–-bĈ3ÆŒ5f̬ق`‰0bܰaÆ 4jô@ µg&Lœè!DÈ!&&@€AB„"Dˆ!B„"Dˆ!B„(\ðàáî`Ѳe‹1e̘AÆ 6jÔŒcìZµjÕ¦1³63f̘1cÆŒ3f̘M³æ,ƒ/\¸€ 1bÔ¨Q£F 4hÔ¸á˺sܸIŠô£Fˆ Ñ©SGÎ>xðäÉ*Ô'S¦R½zõ –;wðÞíÃw„þ &P @á‚… "DˆaB„ (\¸` …˜0‰EÊ•+X°hѲe‹1bĈ#f̘1gÞ¤:eʨOBeÒ“'þ2u*•*W°ÜÁƒ—¯_?~Ú D˜0!„ &L˜ !B„"D˜0a„ .\°ðá&M¢4‘r -Z¶l#FŒ1bÄŒ3æÌ›T¨@êÔÉ“ž€òèñÔé“)S¥T½‚˼|ýúéÓÇÏÊ&H˜0aB„"Dˆ!B„"L˜0a… ,xøÀ„ “(Q¤\Á‚E‹–-[Ĉ#FŒ1cÆŒ9󿔩OBeÒ“Ož?|æÌ™3çÏŸþTJW©R¥J•*U²$I’$I’"IŠ)R¤H‘"EzôèÑ#H&1bÔH‘¡BtèØ±#GNœ?s6XøÀ„ “(Q¤H‘r%K–,X°hѲEL™2hРA£† 6lԨт` %^¸p#F ,x!³åÀ„‰*z2dȶmÛ¶‰+wï?á¶mÛ¶MÛˆ:t¨!B„"D˜0Â…›H¹’EË1eÊ AæM6lÔ˜Q3fŒ±kÖ¬YcÆŒ3f̘1cÆŒÙ4kÎF0(ñâ… .`À€FŒ1jþÔ¨A£ 4hРAƒ¦uÝ*Ez4‰‘!BtìÈá“'OŸB™:•JÕ«XîàåÛ×OŸ>}ýúI€0 "Dˆ!B„"Dˆ!B„&L˜@á >0aÂ$J)W°`Ñ¢eË1bĈ#F̘1cÎpBÕ)T&=yðâ3gΜ9sæÌùG€þ•Òq«T©R¥J•*UªT©R¥J•*I’)R¤H‘=‚ £F† ¢S§Žœ8qøüу爘0‰%Š)W°dÉ‚ -ZĈ)c 6mÚ´iÃF3c<,X@‚D‰.\Àˆ!C2d˜0qBE!B„ ²mÛ¶mäÌÝë×ïÞ=sæÌ™3g®4d H!B„&L¸ðI”+Y´lS¦ 4mÜ´iÆ3jÆ1fÍ3f̦1›6mÚ4f̦Ys6bþÀ%^¼pá 0`Ĉ£F5hРAƒ 6hРá ·H&52DÇŽœ9òèñô©Ó©T©TÅrç.^:vúôõÓ§¯_¸"Hˆ!B„"Dˆ!B„"Dˆ!B„ &L pÁ‚‡˜0EÊ,X´hÙ²EŒ1bĈ3fŒ™3œFuÒ“ÏŸ9sæÈ‰'Žœ9sÁþ €·tܸqãÆ[¥J•*UªT©R¥J•*IŠ)Ò£G Aj„ÈP!:uäÄ™ÃçO=z.€ðð (Q¢H‘r%K,X°`Á‚‹1eÌ AÓÆ›bÅØ˜13fŒ–  QâÅ 2`ìB¦ËÁ&N¨P!Dˆ!C¶mÛ¶\9÷îù3G®\9räȉû·KA"Hˆ!B„ <0‰"%‹–-bÊ”Aæ7mÚ°QcÆŒ™1dþœMcƌٲeË–9[Ælš5g#(ñâ… .`À€#FŒ1bÔ¨Qƒ 4hаaÆ 7ГôhR#CtìÈáP=::¥êÕ«V^²0iâÄI{ýúñW@B„"Dˆ!B„ $Dˆ!B„"Dˆ0a„ &\¸ðáÃ&L˜D‘r -Z¶l#FŒ˜1bÄŒcæ §Qzðüá'Ž9vìØ±cÇNŸ?pþ°Ò7nܸqÈ7nܸq«T©R¥J‘"Ezô$Fˆ ¢cÇN>òäéäéÂ>0a%Š)R¤dÉ‚ -Z´hÁ"¦L™2eÒ¸q㦠6fÌŒƒ@Á 0`ð¢/dÈ|8aÂÄ *z"dȶmÛ¶‰+gîÞ=såÈ‘#GŽ9qâ‰P°`Á‚"Dˆ0aÂ…L¤dÁ²þeK™2hØ´qãÆ›6lÔ˜Q3fL™fÍš5k¶ŒÙ2gË–I[Öa%^¼pá 0`Àˆ#FŒ5jÔ Aƒ 6lذaƒÆs¸"MjdˆŽ9|ðäñôé“)U›¼@Á¤‰”,X´8qò ¿~ Dˆ!B„$H€! ”!B„"L˜0a„ ,|øð &Q¤\Á‚E‹–-[Ĉ#FŒ1cƘ9ÃiO>sâØ±sèP!BtèÔ±c'þÚ¡ëÖ­[·nݸqãÆ7nÜ*Uª$)R¤G(1jd¨;væðÁ“G(O&xøÀ„ (QF‘rEÊ•,Y°`Á¢eË1[Ä”Aƒ&M7nÜ´aƒÆŒ™1gví²eË– ºv!C† Ú#F˜8qB… !B„ ²mÛ¶mäÌùógŽ9räÈ‘#'N´]þ ,X°@B„"L¸àáC”,X¶l)SM7nйq㦠›1jÌŒClÞ²eË–É“&­3f, AâÅ‹.\¸€ 1bĈ£F 5hРaÆ 6lØÈqƒ[¥I õ±ÃçO=¡>BågˆL˜D‘r‹,Z¸aÇïV Hˆ AB $^È(ñ‚D„ Hˆ!B„"D˜0‚…>0aÂ$Š”+X°hѲe‹1bĈ#fÌ3ÏøÙ3'N:… *dÈP¡BŠìØ ÄþŠvèСC‡ݹsݺuãÆ·J•*Ez $F† ѱcgΟvæüÉ£G(QJ@€øÀ„ ”(R®dÁ‚EË2dØñc…‡"h Qâ… .`ĨQ‰$Dˆ!B„"L `áÇL˜0‰"% ,Z´lÙ"FŒ1bĈ3ÆÌ@säÐ!dQ#FŒ52dè>} þ@€b:oÞ¼¡C‡:tݸqãÆ­’¤H Ab¤È;røüÁ£Ç“(S| Pðð &P¢D‰"劔+Y²`Á‚‹–-[Ä”)ƒ&M7ÅŠ¹iÃ3fÈ£F4hРA{öŒš.þ#FŒ0aâÄ =„2dȶmÛ¶•+W®9qâĉ'Nœ¸pР!Cf àˆ*Dˆ0a L¤dѲ¥L4iÚ¸)Ö®7nØ Q3f̘_êÖ©S7L˜°aËF,X@‚‰/\¸p 0`Àˆ#FŒ5jРAƒ 6lذaÆ ˜,A2dÇΜ0EÊ•,X°hÑ"† vüøñãÇ.Â%J¼xñâ… 1jРC„"Dˆ!B„(Xøðá&L¢HÉ‚‹-[¶ˆ#FÌ1bÆŒ93†B†1‚4iÒ$JŒþ5R´¨O X‡î›7oÞ¼yó†]7nÜ*UŠé$Fˆ Ñ©#‡ 0aÂJ”(R¤H‘"%K,X°`ѲEŒ˜2eФiã¦X17nÚ°þ13f ™.Ö°]»v-Ú3jÔ¨]Ká`Dƒ&L˜8¡BE!B„²mÛ6qãÈ‘·Mœ8qâĉ·í5jÐ!ƒÖá@„&\¸ðÉ•,X¶”I“¦M7nйqÓ† 3fÆŒƒË—¯`ÃÔ©8ï–‚$H(Qâ… .`¸€ 0bĈ£F4nذaÆ 6lذA£Æ£I†êÄ™“'¨8&\°àá&L¢H‘’ -Z¶ˆ!C†?~üÂ%X D‰/^¸pFŒ5hЈ!B„&d˜€@„ >|øÀ„ “(R®`Á¢EË–-bĈ#þF̘1cΈéc#HEŠôhÒ$HêÓÇ(ÖÃ…ëÛ7oÞ¼¡ëÆ[¥J‘AbÔÈ;røüÁ£Ç(T©$@¸ðáÃ&L @‰EŠ)RšdÉ‚ þ,Z´l)S¦ š4mܸ)VÌ›6fÆŒ!Ãe™4kÖ®a«æL˜6mC¶m;Ñ`„ 'N¨PÑCˆ!C†lÛ¶mÛ6qÛ¶m'Nœ¸mÛ¶UÆíµkØtˆa„ >0ir% –-eÊ AÓÆM17nذA£F͘1cÒtC‡Î0bê: p@‚‰%^¸páÂ… 0`À€#FŒ5bÔ¨qㆠ6làÀaÆ 6Ò˜1ÉP8òxâ‚ ,|øÀ„I”(R®`Á¢e‹1cÆaå“ H(QâÅ .`Àˆ£F 1"@ˆ!$HŒdˆá‚…þ>0aÒDŠ”+X°hѲe‹1bĈ3f̘3b5šéQ$I•*Ezôh£FŠúô1@uÀ€ùÂ…ë›7tè¸q«dé$H ªgžþ|`„ ”(Q¢H‘"劔+Y°`Ñ‚E‹–-bÊ”Aƒ&Mš6nܸqãÆŒ1b´¬S·lY0mB† G®\9åŒaÂĉ*T"DÈ!Û¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ6iÖ¤I³fÍšµ"L˜@áÂ&R®dÁ²eK4iÚ¸qãÆ 6l̘3f /“"uC·®Š‚$H(Q¢Ä‹/\¸pá 0`Àˆ#F5nܰa8lذaÃF Ù‘óGž .X°`ćL˜D‰"åJ,Z¶ˆ3ÆŒ2¢$X°€ €$J”xñÂ… 0bÔ¨þA#GŒ A‚É—/_2D¸`áÇL˜D‰Ò$ ,Z´lÙ"FŒ1cÄŒ3æÌ›EE’T‰7n•"=š©‘¢>} ¦0`¾py󆮷J‘Abd¨þ8sðäñJTªW­D˜@á@&L˜0%J”(W¤\‘r%K,X°hÙ²EL™2eФIÓÆ7mØ”3†Œ!Ú† Ù&Ž\¹råüùówŸ¶#F˜0qB… B„2dȶmÛ¶mÛ¶mÛ¶mÛÄmÛ.ܲeòæÍ›'¡B„(\øÀDÊ,Z¶l)SM7nÜ´aÆ5jÆŒ#F¤G•Ð%H°€‰%J”(ñâÅ .\¸€ 0bÀˆqãÆ6làÀ6lذAc†;|ôà¡ á‚ @xøð &Q¤HÉ‚E‹1bÆŒ1c†‰þ  A¢D‰/^¸€#FŒ5hàhaĈ$H|ùò‰„ ,|øð “(R®dÁ‚ -[Ĉ#FŒ1cÆŒ9ãÅÑ$I•¸q놮[%I‘&Mjt¨’þ€© ˜¯oÞÐu«$éÑ$F†Ù‘3'O¡D¥RËÃ(\øÀ„I(Q¢D‘"EŠ)W²dÉ’‹-[¶lÙR¦ š4iÚ´icfŒ2bÈhÙ¹råÊùóçïÞ½~üøñã7bÄ&NœP¡¢‡!B„ 2dÛ¶mÛ¶mÛ¶mÛ¶mÛĉÛºuè*Tˆ!… ˜D¹’Ë–-eʤIÓÆ›6mР1cf̘1cÎx±ãˆ•• Q¢D‰%J¼xñâ… .\À€ 0`ĸqÆ 8pà°aÆ 6rÔ Ó'O (\°p>|þ`Â$Š)W²`ѲEŒ3fÔŒñ`Á‚$H”(QâÅ .`À€ƒ 8–A‚ ’/_¾|Éa >0aÂ$Š)Y°`Ñ¢eË1bĈ#f̘1g¼8ŠT‰·nèÐãV)Ò£Iõ#þ`ÂæËºn•"=‚ÔÈ;|ðèñÊTªW±X0a… ˜0%J”(R¤\‘"åJ–,Y²dÁ‚EË–-[Ê”Aƒ&Mš4fÆŒ#FŒ'àÌùówï^¿~üøñãǯ_?#FŒaÂĉ*Tô"Dˆ!C† ²mÛ¶mB†²mÛ¶mâÄmÛŽR "D pá“(R²dѲ¥L4iÚ´qÓ¦ 6fÌŒ3fÌ™7|úBÁ‚$J”(Q¢D‰/^¼xñÂ… 0\À€ 0bܸqÆ 6lذaÆþ3e¢a… @€øðáÇL˜D‰"åJ,Z¶ˆcÆ 5Z X°€ %J¼xáÂ… 0`Ô°aÇ #H A‚äË—/H$D˜pÁ‚‡L˜D‰"åJ,X´hÙ"FŒ˜1cÆŒ3f ™F”*qãÖ 7tç*YŠ4 R#E}àþÐaž0`À€}C×Û#HŒ õ±ÃO JÉzå^‡&L pÁ‚&Q D‰EŠ”+R¤H¹’%K–,X´`Ù²eK™2eРAƒ¦Ì˜1bĈãܽ~ýøñãÇ_?}þì•+7®Ãˆ#L˜0qâ„ *z"Dˆ!C† "Dˆ!B†lÛ¶mÛ6qâÄI!B„ >0aEJ-[Ê”A“&M›6mÚ 1cÆŒ™1ÇŒC   X°€D $J”(QâE‰/^¼pñÂ… .`þÀ€ 1nܰaÆ 6lذA#F&%&P pá‚…>|øð &Q¤\É‚EË1bʘaÃf  A¢D‰/^¸pŒ4lØÀÑ $H|ùòåË&\°àá&Q¤\‘r -Z¶ˆ#†Ì˜1cÆŒ#ÆÑ$nܸyCç ]·J’Mb¤èP%€þD§.0\èÎUŠIÑ!;sþäñÊ”¬Wîò; !„ .Xðð ”(Q¢D‘"EŠ)W®dÉ’ -[¶l)S¦L™2eÊ”)3fŒ1bœ°ãÇ¿~÷üÙ+WnܶmÛ†8hà`„ &Lœ8qB…ŠB„"Dˆ!C„œP!Dˆ!C†lÛ¶mÛ6 "D˜@á‡L˜DÉ¢eK—2hРAƒ& 4f̘13f̘1gÞâÁ‚  A‚þD‰%^”(QâÅ‹/^¸pá 0`À€#À7lذaÆ 6lÔÀA .\°àáÇ>0aÂ$Š”+Y°hÙ²EL3hجù ‚$H(QâÅ 0`ÀˆQƒ† 6p,A‚ ’/_¾€I‚ „ ,xøÀ$Š”+R®`Á¢EË1bĈ3f̘1cƈqt‰·nèСC×­R¤G“)êÓG þ )æ©æëÛ9I&5:d‡OO L©zåÞ>+"D˜@á >0aÂ$J”(M¤4‘"EÊ•,Y²dÁ¢EË–-[Ê”)S¦L1cĈ#FŒ“tüîù³W®Ü¸pÛ† ѦMײeºF8p0b„ &NœP¡BE!B„"DÈ 'N¨è!Dˆ!C†lÛ&AB„.XøðI“(W²hÙ²e‹˜2eРAƒ3fþÌŒ3fŒR X°`Á$H(Q¢Ä‹%J¼xñâÅ‹/\¸páÂ… 0`ĸqÆ 6lذaƒ &L pá >|øðá&L˜H¹’‹–-bÄ”AM›5P @€` $J”xá 1jРaÃŽH AòåË0`"Hˆ0 >4‰EÊ•,X´lÙ"FŒ1cÆŒ3fŒ™1^]âÆ[7oèÎU’i¤FŠúô1þ Å0a„ “&R®`Ñ¢E‹4hÚ¸i3&h A¢D‰/\À€£F 6lØÈ± $H¾|ù&‚„&¤pÁˆQ¢D‘’‹-bĈ3f̘1c̨Q3fŒ"G–*UªÄ[7n•"=šÄHÑ¡>} þH1O0_ÝQRÔ‡OOŸL©Š/ß>+"Dˆ@áÂ… @xøÀ„ (P¢D‰EŠ)RšHÉ’ -[¶lÙ²e‹˜2bnÙ²eË–-\¬l"DÛ DŒÎS'3kÑ¢]Æ [¶lÙR¤pà`„ 'NôèÑã0té¸YáÀ„‰þ'Tô"Dˆ "D¸àá&Q¢H‘’% ,[Ê”Aƒ 6h̘1cf̘1gÄ$H€‚ hX  $J”(QâÅ‹%^¼xñÂÅ‹.\À€FŒ7nØ Qƒ 4bD˜páÂ… ,xøðá&L˜4‰EÊ•,X°`Ñ‚&M›bnÄ$H€‚H(QâÅ 0bĨAÆ 8Z A‚É—/_¾D!B„ .\°ðJ)W²`ѲEŒ1cÆŒ3ÆŒ3fƈYäh’¤J•*UâV)$H5*d§O þRÌS‡ëœ¤IŠìðÑó ”ªXîòáÛ§í@„"L¸pÁ‚>0a¤ (Q¢D‰EŠ)Y²dÉ‚‹-Z´hѲeË–-[ÄlÑâÄÊ8Y¤Båñãèœ/u˘Y‹íZ´gÏžQ{FµgÙ²9Ëþ¶l™4€Ò¤-S :K”¼¬1„‰*Tô !B ,|`¤I)R²dÁ‚e‹˜2eРAÆ3fÌŒ3fŒ˜  @°`Á‚ h AB $H(Q¢D‰/^¼xñâ… 0\À€# 0bÄ AƒF .\¸`ÁÂ>|`„ “(Q¢H‘r‹–-[Ê AÆ  @°` %J¼xáFŒ5lذa $H ùòåË—"Dˆ0aÂ… .0‰¥É,Z´ˆ#fÌ3f̘1cF͘1oú8šô(R¤H‘$E‚‰Q#C‡úØdþ@€*óÔùâ©Q@›>™JË]>}ú:ˆ!B„ .X°àáÃ&L˜0aJ”(Q¢D‘"EŠ”&R¤HÉ’ -Z´hÙ²EÌ–-Zœ¤Û ¨MuC§nY3þkÕ®={ 4h%\™.Z4jÔ®]«fm³eêÖ¡ã6ÉQ >sîŒh`Âĉ"Dˆ0á‡L˜@‰"EJ–,X¶l)S 4hРAcÆŒ™1cÆŒ“ ‚,X°`Á‚ ,X A $H(Q¢D‰%^¼xñâ… .\¸€#FŒ1jЀ!aÂ… ,X°Âǘ0i%J)R²hÙR¦ 4hИQóAA,X@‚D‰/\ÀˆãÆ 8pØÀq $H|ù!B„"L pá‚…L¢H¹‚EË1dÆŒ1cF3f̘13fŒŸE‹þM‚4iÒ¤G 52d¨;|@@Ø<`çAR'S©^¹Ë‡O "DˆaÂ… ,xøð &L˜4J”(Q¢D‰"EÊ)W²dÁ‚‹-Z´lþÙ¢E‹KùÜ©2E*Тs¾Ô-“6íÚ³gР!Cf‚… 5jäȑڳg×¢Y›Öl™:_è,Qê(Ó)Q„L4!!B„&Xøð &Q¢H‘’%‹–-eÊ Aƒ 3f̘3fŒš,  H€Á‚ 4,X°`Á‚ h A‚ $HX¢D‰%^¼xñâ… .`Àˆ#FŒ0$L pÁ‚… @xøðá&L D‰"EJ-[Ê”Aƒ 3j (H€‚  A¢Ä 0bܸa96 A‚ ’/_"Dˆ!B„ (\°ðI”+X´l#þfŒ3lب£F3jÆœy¨¢FŒ1j #C† Ñ©SÇÎ8˜§·I†ìüñ$JÕ+xùðé“ !B„"L pá‚>|øÀ„ &L˜@%Jþ”(M¢D‘"EÊ•,Y²`Á¢E‹-[´`q’.Ÿ;U¦<Zt ºeÖ¢]{ 2dºt¸€£ 9„ ƒíÙ³hÖ¤- %G}þè…ê•;v* Hˆ!B„ >|`„I”(R¤dÁ²eK™2eÊ”1cÆŒ3cÆŒ3A @°`Á‚ ,X°`Á‚H A‚ $H(Q¢D‰/^¼pá 0bĈáB .Xć>|`ÂJ”(QF¹‚eK—2hÒ¤Aƒ† $@°`Á $H”(ñÂŒ7làÀAƒ #H AòåK„þ"Dˆa >0‘‚EË1bÊ aæM6lذQ3F͘1cê³èP!C† 5Bd¨:vìÄáó'Ž€ôÔ¡«Ô¨ŸMIzå._>|$Dˆ!B„ .þ\°`ÁÇ>0a„ &P D‰%J)MšH‘r%K–,X°`Ñ¢E‹,YôåË÷êT§?‹.¡“·LZµkÏ !CÆcÁ 0bРAƒF ^È A{v­š5iÃÔ¡³äÈÎO§N½r·¯_ "D@ÁÇL˜0‰"EÊ,X´hÙ²e‹˜2eÌ”1cÆÌ˜1cÔ P€ @€Á‚ ,X°`Á‚h A‚ $H”(Q¢D‰.^¸€ 0\L˜@á @xøðáǘD‰%J)X¶l)SMš4l؈IA, A‚D‰/^ÀˆþqãÆ 4hÔ0b €H|™ !B„"D˜@áÂ&W°h#¦ 6mܸqÓ† 5fÆŒQ3æ 'O€õ±S‡C‡ѱcGŽœ8sæ$ =uè&)²hþ©WîÞíÃ×á@„"Dˆ0Â… ,xøðáÃ&L˜0a ”(L D‰% @)W¤\¹r% ,X°`Ñr劾~ûb¥òôgÑ%tê–Y«ví4d»$X#FŒ4hÐÈq 2hО]³Æl™:_çÙäÉTªXïøé« !B„&xøðá&Q¢HÉ’ ,[¶lÙR¦L3e̘3fÌ-  @ @€`Á‚ ,X°`Á‚H A‚ %H”(ñâÅ‹.\À€†‹ .\¸`Á‚‡>|øÀ„ “(Q¢D‰"%‹–-[¶”Aƒ&Mþ5 @‚ H(QâÅ 0`ĈQƒ FŒA‚É#"Dˆ!B„ .|‚EË1eРiãÆ7nÚ°cÆÌ˜1cÆœñä `<|âȱӧ;râĉ#gÎ>€ þ0OݹItøè!åʼ}ùÀ!B„"L pá >|øðáÇL˜0a„ (Q¢D‰%J)R®dÁ‚ ,W®èë·/–*O€]B·n™µj× ACÖAA‚%`Àˆ0 4n C Ú³jÖ˜-Sç«[£>€<•zå._?}$Dˆ!B >|`ÂJ)Y²dÁ‚EË–-[Ä”)Sf̘1fĈ3†‚‚$H€ @°`Á ,X°`Á‚ h A‚ $J”(ñâÅ .`Àx1áÂ… ,Xððáǘ0þa„I”(Q¢\É‚E‹–-eРI£æƒ$@€` $J”xáŒ1jÔ¨‘cƒ#H A’A„"Dˆ0áÂ…W°hÙR¦ š6mÜsã¦M3f̘3f̘0œLuʤÐ>øÌ‰gΜ9sæðÁóG þRÐ[wΑ?›R¹r—¯ß¾$Dˆ!B„ (\¸pÁ‡>|øðáÇL˜0a (Q¢D‰"EÊ•,Y°`Á‚åJ}ýòÅ:*ТKçÖɳVíÚ3hÈx(@` 0bÔ¨Q£/dР=«VÙ2uè,9ê£'T©Wîöõë'AB„"D¸âÃ&L˜Œ"EŠ)W°hѲeË1eʈ#FŒ˜1cÆ`A   H  @€ ,X°`Á‚ , A‚ $J¼xñâ…þ $,\¸pá‚ >|øðá&L˜0aJ)W²dÁ¢¥L™2bÆ P€ ,Ð@‚D‰/^¸€#FŒ5rl0bĈ$H$Hˆ!B„&\°Àä -[Ê”A“Æ›bnаAcÆŒ™1cÆŒCæ*SŸByÒ“ž?þüù“ÏŸ?xþüÑÃþ€ôÖk4ç'R±àíëgo "Dˆ0a .Xøà„‡>|øð &L˜0i (Q¤H¹r%K,X²4Á¢oŸ»W¨DZ4éÜ:y̬]{ ™-  xFŒ1bÔÐ… ´gצ5[¦%G}ô„J ^¾~ö$Hˆ!B„,|øÀ„I“(R¢H‘r -Z´hÙ"¦Œ1bĈ3†Œ˜w$H€$@€  @€‚ þ,X°`Á‚  A‚‰%J”xQ‚Â… .\°`Á‡>|øÀ„ &L D‰"åJ,[¶l#FÌ  @€A H(QâÅ 0`Àˆ£FŽ FŒ1bI„"Dˆ!… ¢HÉ‚e‹˜2hÒ´I“ 4lÌŒ13f̘1bĈq¥Ê”©Pž<éÉ“'Ož|øð &L˜0%Š)R®\É’% –#èòås÷ê”(@‹&S'ÏYµkÏ !CÖ A‚%`ÀˆQ#†ŒÈA{ö¬šµfÃֻ䈞P§bÁË—ÏJ "Dˆ‚ >|`¥I”(Q¤dÁ‚ -Z¶l#FŒ1bÆé‚& $@€þ @€ A‚ @€`,X°`Á$ Q‚ &\¸`á ,xøðáÀ˜0a„ ”(Q¢HÉ‚EË–-bĈƒB H€` $J”(ñ 0bĨ±Áˆ#FŒ‰!B„"L¸àI)W´lS 4fР1ƒ š1cÆŒ#FŒ'¬^©:uª”¨PByÒ£GOž|øÀ„ &LšD‰¥‰)R¤\i’Å^¾|îT•òh¥sëä1›ví4hÈv)P` 0bÈ€Á 4hÏ®U³Ölغs“ñÉDJU,xùòÙƒP!B„"\¸`á>0aEŠ”+W²\Á‚EË1bþÄŒ#F ™^ÉŽ)›—o– $@€ @€A‚ H€ X°`Á‚ `à „ ,\¸`Á‚>|øðáÃ&L˜@‰%J)Y´lÙ²EŒ˜1[$@€‚, A¢D‰/\À€FŒ5bd0bĈ#"Dˆ!‚„ >0"% –-eÊ Aƒ š2eʘ1#FŒ1bÄŒC†•»X¯d¥:u Ô§OŸB…òäÉS&=zôäÉ“'þ·æ¡»´hNR®`ÁË—/;  Hˆa„ (\¸pá‚ >|øáƒ‡>0a„ &L D‘"劔&GØõË—/–+Q›þô¡tnݰfÓª={ 2[,€!CF º!ƒöìYµjÒ–©[×Ò!>™H©Š/_¿~$Dˆ! .XþâÃ&L˜D‘"EŠ)Y°lÙ"FŒ1dƈÓëØ±cÇŽeƒ•*  @€ @€A$H A‚ @°`Á‚ *L˜@á‚… ,X°`áÇ>|øð (P¢D‘"%‹–-[¶lÙ"FL‚ @€ Á‚$H(QâÅ 0`ĈF† Œ1!B„"D `á)W²`ÙR¦ š2eÊ”)S¦L3cÄ#FŒ1bÈhÉç.Ö«W²R2eêÓ§OŸ>u Ê“=zôèÉdþ€À²yè.)šˆÔ©Wîòåƒ÷Ί„Hˆ0a .\¸`„ ,€ððáÇL˜0a„ ”(R¤49â­_¾|ðb¹•éOGç|©[&ÍÙµgÐBC† ,^¼èÁ 2hО]«f­Ù2uè*9²óÇS¨Sþ±àåëׯÃ"Dˆ0a <|øð &Q¢D‰" -[¶l#FŒ1aj;vìØ±cÉŒ±Ú4HC‚ $@€ @€ @€  @€ „ (\¸pá‚ ,|øðáÇ>0a ”(Q¤`Ñ¢‹–-[ÄlI$@°` $J¼xá 1bÄ8’!C† F Hˆ!B„>0‰"%K–,[Ê”)S¦L™2fĈ1SFŒ1bĈ#f‹|ùܹ‹õê•«T¦L™ÊS§NŸBuò¤G=‚þ °l:J}æÚ”JÕ+wùòå{ÇNŠH˜0Â… .X°`Á‚… <|øðá&L˜0a¥É‘&èúåËçΫT¡ôZ䨛/uËšY«ví4hÐ!Ûek2dÈAƒþö¬Ú5kÒšÉ#†ÎR£>€<: ^¾~üÂ!B€"L˜pÁ‚>|`„ (Q¤dÉ‚‹–-Z¶hÑÂåI­Zµj;vìØ±dÉŒ‰¢ƒ (H  @€$P @A$D˜0a… .\°`Á‚>|øðáÃ&L˜@%Š,Y²dÁ¢E‹- $@€‚, A‚D‰/\À€† Ø–yÙãª^‡"Dˆ a)R¤dÉ’eK™2eÊ”)S¦Œ1[¶lÙ²eË–-bÄlq’Ž_¾wîÜÁzõ*U©S¦L•õéþS§N¡<éÑ£'“ @,›wnÒ!;}‘J¥*–»|ûöõëWïŠ @€0a„ .X¸pÁ>|øðá ŽDñ†¯_¾|ðܽ’%J”ž@ŠUB§nY3þiÕª={ 4dÈ!C† 4hÏž]«f­Ù2uÀºMRÔ'P(P§^¹ƒ×¯_¿$Dˆ!B„ .\áćL˜0aEÊ)R®dÁ‚‹-\žÐ¢U«V­ZµŽ;– ­!hÑ¢E‹­:(P @ (P @"jKa`‚"L˜@… ,X°àÁÇ>|`„ &P DiEJ–,X°hѲ…G  @€ ‚ H(Qâ… 0`Àƒ½uzTíW@B„"L¸劔,Y²lÙR¦L™2bÄlÑ¢E‹–-b¶lÙ²eË–-NþÖõ÷ï;w°\½R•*UªS¦@úÔ©S(O™ôèÉ$hÃÔ›dhN M¤N¡zË]¾}ûøåƒ÷Ž;v·P @ @€a ,Xø@¥;|ýúõþËÏ],W¥ByÊÓç¤JèÔ kÖÌZ´kÏžAƒ 4hРAƒöìÙµjÖ¦I[¦¥IŠúòÊ”ªXîòáëgoB "Dˆ0aÂ… .X°ðáÃ&M¢DiÒ$Š)W²`Á¢E -Z´hѪU«V­ZÇh…â -ZµjÕ:vìX­Zµj³Õ¡C‡DÔJ–,Y²Z´ŽÕ a „ (\x @|øðáÇL˜0a„ ”(QšH¹’ ,Z¸ƒÖ@A$@°` $J¼xáÂ… 2\PæNѨXùVˆ! ¢HÉ’% –-[¶lÁ‚þ -Z´hÑ¢EË1[´hÑ¢ÅI:~øòå{Ï,X¯^¥J•ê”)S @}êôÉ“=z2 €À|øðá&L˜@%Š)R®`Á¢…‹1lÙ(HA‚ .X°@‰/^¸pC† hØÖMʃ*_<þ"D˜à!J)Y°hÙ²E‹,X°`Á‚ -Z´hÑ¢E‹-Z´8IÇOŸ¾~ùÞÁs Ö«W©R¥uÊ(P:…ò¤GOžL‚¤˜§îœ%HŠúÚä)”¨S¨Tþ©z+–;wáåÛ·oß¾}ûöñãÇß¾|ûöåË·oß¾}ûòÁƒç.Ö+U©D…Ò“gŽC“º¡ ¦n3fÖ¢U»öìÙ³gÏž={öìÙµjѬM[¶l˜:_ç&5²ÃçÏ&Q§T½‚å._¿~üØ¡ˆPà„&P¸pá‚ >|øð &L¢HiräH’.ìxˆ"-Z´jÑ "DZ´hѪU«V­ZÇŽ;¦L™2jÊ”%K–,Y²dÉ’%S¦ŒZ&L˜@ ,\°pÁ‡>|øð &M D‰EŠ,X°\ÉE´$@€`Á‚ (þQâÅ .X¸ Fo]%>¦Üå[q B„ Q¢D‘’% -X°`É‚ €X°`Á‚E‹,X°hÑ¢E‹–$éøéÓ§oß»wðÜÁrõêUªT¥N™êS§N2éÑ“Gþ)æ©óeiR£EåÉ£ÇS(S¦L©zõêÕ«W¯bÅŠË|À€Ñ#G¨x³×?{¸B„‚­!B„‚-Z´jÕªUëØ±cÇŽ)S¦L™²dÉ’%K–,Y²cÔ°a»V¡Â„ (P¸`Á‚ ,XøðáÇ>0a„ (Q¢D‘’ þ'^ÒÑÃF   X°`Á$J”xñÂÅ ^Ôè©ãÆÇT¬}à H Ð$J”(R²dÁ’%K–,Y²`É‚ ,X°`Á‚ ,X´`I’ŽŸ>}úúá{÷ž;X®^©Juª”©R @}êä  '=zòäÉÄþ@ŠyêÐu‹4©Ñ¢>|þÚäÉ“§P¤D™2eÊ”*UªT©zõêÕ+Uª^½zõêÕ«W¯^©RuÊ”)PŸ>eÊógNCŒóL0i˦Y³V­Úµk×®]»víZµhÓ¬Is&mذu¸ÐU¢ÔÈŽ?€2…2ДªWîÜÁË·/ß¾~üرK‡ )<@€a‚ TªP©Â®^¿~ýúñÛ—ž;VLB„"Dˆ!BТE‹V­ZµjÕ:vìØ1eÊ”)S–,Y²dÉ’%;v 6l×"T˜0a .\¸pá‚ ,€þðàáÃ&L˜0aÂ$J)R®dÁâÄQ«nêèa£Æ£ ,X@‚‰%t°ÐE­šµu‹ôˆzµ/ßLšD‰"EÊ•,Y²dÉ’%K–,Y²`Á’% ,X°dÁ‚ ,IØõÓ§O¿~ïÞ¹sËÕ«W©R•:e ¨O}õ)”'=zòàùÃGN:ˆ Eâ†Î—ºa–5sÆÌšµiÕ¢U«V­ZµjÕ¦M³ÆlÙ²eÂÔÃ…îœ%JŽÙéOžB•:¥J•ªX±b¹ƒ^¾}ùòíÛ·ß¾}ûöíÛ×/_¾|ðܹ‹ëÕ+U©L¡B¥$Dˆ!B„A‹-ZµjÕªU«Ö±cÇŽþ)S–ìX²dÉ’%K–ìØ±]kÕ‚Pa„ &L˜@Â… ,\°`ˆ>|øð &L¢D‘råJVîDõQdI=lبQCfËD‡>xñ¢F­š4uèõÙ¤ÊÝ>|$0aÂJ”(R¤H¹r劔+R¤H¹’%Ë•,Y²dÉråÊ•,W’xë§OŸ>}ýð½{çÎ,W¯R¥*UÊ(P >u åI=yòàɳÉþ€Áæ©óå ]7K‘&AjÔh‘";vúر3GŸ?€ýùPž0a„ ”(R¤$A—ï@Qø8J·Žž5lبQ£F5lØèÑSgÉQŸ@¥^ÁÛ—/‚&L˜@%J”(R¤H‘"EŠ)R®\¹"åJ–,W®H‘Ò$ :~ýôéÓ×/ß»wðÜÁrõêUªT§J™2êÓ§N¡<éÑ“'úô±cg‘"EŒ&=’Ô °`ê„ [Öl3f̬Yc6­ZµjÕ¦1³f3fËš-&L:`¸Ðu“4 R#G‹úôéc‡@zôd  (Q¤B™2… *U§T©r¥J•ªS¨þP:uêÔ)S§D…ò ”!B„"DZ´hÑ¢U«V­Zµj;vìØ±cÇŽ;vìØ±cÇØåÛ§O[„"L˜0a„ (\¸pá @€ððáÇL˜0a%J“&öö¹S¥ªÕE—ÖÉ›G=zôèÑ›'OºK‹øè!¥*¼}àHøÀ„ (P D‰0Š)R¤\‘"EŠ)W¤H‘"EŠ)MŽ ã×OŸ>}ýúá{Ï,X®^¥J•ª”)P @}êä)T&=zòäÁƒÏ@‚þ 60_èСëVIR¤G“&Q¢Ô¨Q#D† ²cÇŽ>}úرcGŽ9rìØéÓÇŽC‡58éQ¤JÝÐù 6L°aËš-c6Ù4kÖš5›6­Y³fÖ¦1c6Í3iˆ ¦.0_è¸U²dé%HŠ)Z´¨OŸ>}úôùþHOž2éñDŠ(P @2e (Q¢@‰ *T¨P}øü Lž2éÑHO¦L™2yòä)“OKB„"Dˆ!BТE‹-Z´jÕªU«Ö±cÇŽ;vìØ±cÇŽÕrç^¾~ýøé»…‚Â"L˜0a .\¸pÁ>|`„ ”(Mšàמ»XªHyÒó§#GŽ(Mšä¨OŸ?z<…Jõ*¼|ùêA&L˜0ÒJ”(Q¢D‰"%J”(Q¢D‘"¥É‘+ßôõÓ§OŸ¾~ýÞ½ƒç,W¯^¥:Uê”)P @}êÔ©S&=zòäÁƒ >|øþü‰3À€`ò€æË:tçºqãVI’¤H&M‚4‰$FŒ!2dÈ!CŠ!B„¨#F(Mz©R·sè| &L°aÖ5[æŒ3f̘Y³ÖŒY³f̦YcþÆŒ³iÌ–5k6oÙ0aÆ S§.X°`ëÖ­ :tçΡ;gÉÒ¥K—(A2dHÑ¢E}úôéÓ‡ €€þà”'Ož|`ÒäH}øòåƒç.V*R¡ByÒ“GOž|`„ &L˜0i (P¢49r$Š—zýúéÓ§¯_?|øþÞÁsç–«W¯R¥*UÊ”)P >}êôÉ“=zòäɃ@|øð™3g ¤˜',0`À¾yó†]·nܸq«d)R¤H‘=zôèѤI MšiÒ£G‘"UþªÄ:tÞ| L0a†-[ÖlÙ2gÓ˜1cÆŒÙ4kÖ¬Yc&m3f̘1c63fΜ5kÖ¬™4iÒš5k¶lY3iÍ–-k¶Lž} L˜0áÇ>0a„ &L˜@rþäÈ‘#]Øéã×OŸ>}ýúõÃ÷0aEÊ,X´l#FŒ1cÆŒ±U«V­ZµjÕê2Ê“'O¡@%êÔ)Tª^½Š uêÔÉ“=zòäɃž?|øðá3gΜ9sæðÑ ƒº`À€þÃõÍ›·sèºuëÆ7n•*Uª)R¤H‘$EŠ$©R¥J+qãÖ :o¸€ Œ˜:a„ ¶lY³eË–9c63f̘1cÆŒ3fͬIc&Íš5kÖ¤I³fÍš4iÖ¬Y³fÍšµjÖ¬Y³VÍš5kÖ¬Y“&­³fˆ ¦.0tç¸EzÉ¡:vìÌ™óP=‚6€°`Á‡L˜Di"åJ,[Ĉ3f̘1olÕªU«V­.{òÊ“'S&=ž}ýôÝ*p„ ,`À`Á ªPùfO¿~ýôáç¯ß¾|øÞÁƒçÎ,X®^©JuªT)€¦Lõ©S§N¡2éÑ£'OsæÌ™3gNœ9|4þè 0_¸¾yóæíºnܸqãÆ­R¥J•*UªT©R¥J•*UâÆ[7tèÐyà °`Ć©&LذeË–-k¶lÙ2g̦1cÆŒ3f̘1cÆÌ@kÖ¬Y›Æ¬™5kÒšY³f­ZµjÕ¢E‹-Z´jÕ¢E«-Z´jÕ¬YcæŒY³fˆ SçË×¹J‘ARDÈNŸ9|òäɤ .\ððI”+X´hÑ¢EË1cÆŒ3fÌ[µju´ÏŸ?ćŸ?€þÒ“É“'OžB}eÊ*TªT©RõêÕ«W¯^½Š+V¬þX±^½z¥*•*U©R½zõê•+W°ÜÁ{÷ß>}úôéÓ§O_?~ìP  ‚‚J•*UªT©gÏ?~ýúéÇ_¿~ûúå{÷vìÔ©c§OŸ>}úôéÓgN>€}úôéÓ§¯?~üøñãÇ?~ýúõǾ|ûöíË—ïÝ;xðܹƒËÕ«WªT¥*UÊ”)S @}úÔ©S'OzôèÉ“'}úرӇÏ|øôéÓ§OŸ>}úôéÇ_¾|ýöíë—ß;xðà¹sç¬X¯^½R•*UªT§L™* Ô§N}êÔ©S¨LzôèÉ“'ðtt@B„(|`ÒDþJ,X´hÙ"FŒ1bĈ3f̘1bÄŒsFÌœ9vB鑤JÝΡóÌ—¯uëÔ©S§N:uëÖ¡[·.]:tèÎU² R#E‹õéÓ‡@€òèÉÔ)Ô§P¢NJ•JÕ«X±bÅrçÎ@xðà½Ë—/_¾|ðòåƒç|øð™3gΜ9sâĉ'Nœ8qâÀcÎþ€¹ÐC×­7nܸqãÆ7nܸqãÆ 7nܸu놮›7oÞ¾ùò X°`ÁˆS7L˜0aÄ 6lÙ²eˤ-[¶lÙ2g̘McÆŒ3f̬Yk6MZµjÕªU«V­ÚµgÑž={öìÙ³gÏž={öìÙ³gѪ]‹­š4fËæ ¦ÎºJ“þÙéó''O$Dˆ Â&M¢\Á‚E‹–-[Ĉ#FŒ˜1cÆŒ3fŒ1cĈáÃÇŽ"DEâ†/_ÀÔ©S7lذeË–-[¶l™|òd:Åင&xøÀ$Š”,X°hѲe‹1bƈ3f̘1jÌŒ#FŒ˜3oþôé£Ò£HÜÐù ¦NݰeË–IkÖLZ³fÖ¬Y“&­Y³fÍ–É“7L:uë€ùB×ÍÒ$H“):d'Μ?€òèÉäÉ“(P¦L™:uJÕ«W¯^½zõêÕ«W¯^½zõêÕ+WªT©:UêÔ©S§N:uê”)S¦L™2 (PŸ>}êÔéS(O™ôèÑ£'OžæÌ™3gΜ9sâĉ'Nœ8qℜ;}8þ°’®[7nܸqãÆ7nܸqãÆ7nݸuëv]7oÞ¾}Ãå 0`Á‚#FLÝ0a„ &lذaÖ-[¶¬Ù²eË–-sÆl3f̘1›f­Y³fÕªU«V­Z´jþ×¢E«öìÙ³gÏž={öìÙ³hÕ^«-Z5k̘-¦Î:nѱóG§S¤$Hˆ!‚…L˜@‘’‹-Z¶ˆ#FŒ˜1cÆŒ1cF5cƈÙ"FÌŸ?}Az霯`ê† ¶¬Y3g̤Y³fÍZµjÓ¬Y³fMš4iÍš5[6l˜:uÁ€ù:Ç­R$H ²Ó§Ï@yåÉÔéS¨P¢D‰2uê”)S¦L:•*UªT©R™2eÊ”)S¦L™%ªT©R L™ (PŸ@}úÔ©S§NByʤG=zòäɃ<þðáógΜ9sæÌ™3'Nœ8qâþĉ'8pàܹS§(¤ëÆ7nܸqãÆ7nܸqãÆ7nݺ¡;çÍ›·o¸|,X°`ÁˆS7L˜0a„ 6lذeË–-kÖlÙ²eËœ1cþÆŒ3f̬YcÖ¬YµjÕªU«VíZµhÑž={öìÙ³gÏž=»víZµhѬY›ÆlÙ0uÀЋԈŽ?™>Rµâ@„&|øÀ„I”(W°hѲeË€bĈcÆŒ3f̘1cF͘1b¶ˆñ’§Ï"G“$óL°aËš9›fÍšµjÕ¢E‹­ZµjѪU«fÍZ3gͤ-[6l˜:uÀ|¡;WiÒ¤F†êӇϟ?yòèÉäÉ“'O¡>}úô (Q¢D‰Ê¨OŸ>u å)T'O¡}úÔ©S§N>… Ê“=zôèÑ“'OæÌ™3gΜ9sâĉ'Nœ8qâÀœ;wêÔé£@ éºqãÆ7nܸqãÆ7nܸuãÖ­[7tÞ¼yóöí›/_À€ ,1bÄÔ &L˜0þa„ 6lÙ²eË–5[¶lÙ2g̘1cÆŒ3kÖš5›V­ZµjÕªE»v­ÚµhÑ¢=‹ö¬ÚµkתE‹VÍš4gË– S ·KŽñù£ç“)U²$HˆAÂ…˜0‰¥I-Z´lÙ"f̘2f̘Q£F3f̨3fË–-€õYD)7t¸Ô [Öl3kÖ¦U«V àµk×®]»víZµhÑ¢U³fM³fÍš-6LÝ:_¾Ðu«iR£FŠõ±3‡ÏŸ?xðàÑ£'S¦Lž™RõJÉ$Løð &Q¢H¹‚E‹–-[ÄŒ)cÆŒ4lØ´a£ÆŒ3fƈٲÅSž?}QªtÎW0uä-c&ÍZµjÕª]‹-Ú³hÑ¢]»v­ZµhѪY›ÆlY3yË„ SÌ:tÜ"Mš©‘¢CvìØh‡ÏŸ?„|æÌ™3gΜ9sâĉ'Nœ8qâÄ8wîÔ©S§N>XIÇ­R¥J•*¬T©þ7nܸqãÖ[·nÝÐóæÍ›·o¸|ù X°`Á‚#FLÝ0a„ 6LذeÆ-[¶lY³eË–-s¶l3f̘1³&­Y³iÕªU«V­ZµjÑ¢U«V­Z´hÑ¢E³fmš3fˆ S윥Iúðù“)Ô)U±àI!B„>0aÂ$Š)W²`Á¢eË1e̘AæM›6mذQcF͘1[´pò”‡Ï"G“¸¡ó¥NزfΦY«V­ZµkÑž={öìÙ³gϪ]«V­Z´iÖ¤1sæ¬Ù2aÂÔó…]·J‘MbÔÈ¡Cvúر#GΜ9søðáóçÏŸ?þþüùó‡Ï<€ðäÉ“sæÌ™3gΜ9qâĉ'N€qâÀ8wîÜ©S§N:uèØQ2þ`€•t•*UªT©R¥JܸqãÆ7nݺuCwΛ7oÞ¾áòåË0`À‚ Œ1bê† &L˜°a† 6lÙ²eÍ–-[¶l™3fÓ˜1cÆŒ™5kÍšM›V­ZµjÕªU«V­ÀjÓ¬Y“ÆÌÙ²fË„©S‡î\$H†úÊãIÔ©W±àíÓV B„"L¸ðI“(Q¤\É‚EË–-eÊ Aƒ¦M7nÜ´iÃF 3jƈq²E©Lxú,¢d ®uê„5cÆÌZµjÕª]«íÙ³jÏ¢={íZ´jÕªM³&³þeË–-&L]0`ÀС;Ç­Ò£I“ Aj„ÈP¡B…RTÇŽ;vêȱcÇŽ9qâĉ3gΜ9|øüùøÌ™3gΜ9sæÌ‰'Nœ8qâĉ'8pàÀ¹sçN:vêÔ©C‡>w þ`%]¥J•*UªT©7nܸqãÆ­[·nçÐuóæÍÛ·o¸|ù °`Á‚#FL˜ºa„ &L˜°aˆ [¶l™´eË–-sæŒ3f̘1cfͳfͦM³V­ZµjÕ¦1“fÍ3fΖI[6L0_ç"A2ÔçOO¢R¹zå._¿"Dˆ!B >0‰0Š”+Y°`ѲEL™2hдq㦘7nÚ°a£ÆÌ˜1Z°ÄJµ)ÓŸ>‹(YB‡+˜ºaÍœI³V­Zµj×®]þ‹ö,Z´jÑ¢]«V­ZµiÖ¬1›ælY³eÄ S 0_èÐq«TéÑ£I“ 5jÔ‘!C† "Dè:tìØ±SçÎ8räĉ3gΜ9sæðáÃç @yòäÁƒøðáÇ>|æÌ™3gΜ9sæÌ‰'Nœ8qâĉ'Nœ8pàÀÎ;wêÔ©c§N:uèСC‡:tqþ€€Â¹J•*UªT©R¥JܸqãÆ[·nÝÐëæÍÛ7oßpùæ 0`À‚ Œ1aê† &LØ0a† ¶lÙ²fË–-[æŒÙ4f̘1cÆlš5i͘5cÖLšµi̘McælÙ²aÂÔó…®Ò$F„ìüÉã‰Ô)W±Ü½ëÇïV"Dˆ0a ,xˆ"EþŠ”+Y°hÙ²¥L™2hÒ´qÓ¦›bíИ3fŒ'éà¹{•j“ž?}]:‡Î—ºaÚ-c&ÍšµhÑ¢U«V­ZµjÕªU«6­™5k̘1[¶¬Ù²eÄ ¦.X0`¾¾¡C×[%K’"=zôÒ$HŒ5j„È!C† ¢C‡:uêȉ'À8qæÌ™3gΜ9sæÌáÇÏ>sæÌ™3gΜ9sæÌ™3gNœ8qâĉ'Nœ8qâÀ8wîܹS§N;vêÔ©C‡:tèСC‡EþPàf©R¥J•*UªT‰7nܸqëÖí:oÞ¼yóöí._¾€ °`Á‚#FL˜:a„ 6LذaÖ-[¶¬Ù²eË–9cÆŒ3f̘5›fÍš´fÖ¬YcÆŒ3fË–5[&l˜:_¾ÐIšdÈ@zB‰:õ*–»|úþøi+!B„"L˜@á >0i"åJ,Z¶lÙ²e š4mÚ¤iãÆ™1cÆŒã$Ý>x°d‘òˆOG—Ρó¥nØ0iËœI³fÍÚ´iÕªU«V­ZµjÓšY³ÆŒ3fË–-[¶lØ0a†©  ˜¯oèÐãÆ­R%I‘=z $FŒ!BdÈ¡B„èСS§N:räĉ'Μ9sæÌ™3‡Ïœ9sæÌ™3gÎ>sæÌ™3gNœ8qâĉ'Nœ8qâĉ0N8pàÀ¹sçÎ:uêÔ©S§N:tèСC‡:tèСCg‘þÎY’T©R¥J•*UâÆ7nܺu;‡î\7oÞ¼}û†Ë—/`À€,X0bĈ S'L˜0a„ 6lزeËš-[¶l™3fÓ˜1cÆŒ3f̬YhÍÚ´f̘1›ÆlÙ2yÆ© þ ·GŽ ÙáóGO(S©^¹{ÇO?m"Dˆ!B„&P¸`áÇL˜0‰"åJ-Z¶`ÙRM4eʈ3F̘1bœœÛÏ]¬T¤6ê³È‘¥nè|©6lY³e̦I³fÍZ³iÓ¢5kÖ¬Y3kÓ˜1cÆÌÙ²eó– &L˜0u‚æ —7tÞ¸q«TIR¤HA‚‰£Fˆ2d¨!:tèÔ©S§Ž9qâĉgΜ9sæÌ™3gΜ9sæÌ™3gΜ8qâĉ'Nœ8qâĉ'8pàÀçÎ;wêÔ©SÇN:uêСC‡N:tèСC‡þ:tè,Ò@K’"UªT©R¥JܸqãÆ[·nݼ¡óæÍ›7oÞ¾áòå 0`À‚ Œ1bÃÔ &L˜0aÆ [¶lÙ²fË–-sÆŒ3f̘1cƬY³iþÓš5cÆŒ³iÌœ-“·L˜º`¾Ð{4©‘9ô„2eê,xùúõ³AB„Fˆ!„ .Xððá&L˜@‰EÊ•,Z¶lÙ"FŒ1bÆŒ3FŒ“tùò¹‹%+•§<ì(šdéœ/_ê„ [Öl3f̬Y³fÍÚ´fÍšY³f3f̘-[¶lÙ²eÄ &L°`Á€Ãå ºnܸU’)Ò£G AbĨ"C† *D‡:vêÔ‘#'Nœ8qâĉgΜ9sæÌ™3gNœ8qâĉ'Nœ8qâĉ'Nœ8qàÀœ;wîܹS§N;vêþÔ©S‡:tèСS‡:tèСC‡:‹4`圤H•*UªT©R%nܸqãÖ­[·sè¼yóæÍ›·o¸|ù °`Á‚#FL˜ºa„ 6LذaÖ-[þÖlÙ²eËœ1cÆŒ3f̘1kÖ¬Y³f̘1cƌٲeÍ– ¦˜/t•&5²# O¡L©zå^?}ü¬!B„"D˜0á‚… >|`„ (QšH¹‚E‹–-[¶ˆ#FŒ1cÄ8I—/<€±\ µéÏ;&UBç+˜:aÖ5[¶Œ3f̦Y³fÍš5kÒ˜1cÆŒÙ4fË–-k¶lÙ°a„ S',X0`ÀpyC‡®7n•$EŠôè$HŒ1B„È!C…Ñ¡C§N:uäȉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qàÀþ8pîܹsçN:uêØ©S§:tèСC‡:tèСC‡:tèСC‡Î"@Xá&)R¥J•*UªÄ7nܸuëÖíºnÞ¼yóöí._¾|,X°þ`Áˆ¦N˜0a„ 6lزeË–5[¶l™3fÓ˜1cÆŒ3fͤY³fÍš4f̘Mc¶lY³e†©ó…®Û#JŠúÌù“Ç“¨Sªb¹ƒ×¯Ÿ½ Dˆ!B„&P¸pÁ‡˜0a„ ”(W²`Á¢E‹–-bÄl#FÌ–$èúõƒëÕ©P¤Í±£’¤n耩&lزfËœ1›ÆŒ3f̘1cÆŒ3f̘1c¶ à²eË–-[6l˜0aÂÔ  0\ÞÐ¡ãÆ­R%I‘=z #F2d¨!:têÔ©S§N9pâĉ'Nœ8qâĉ'Nœ8qþâĉGŽœ8qàÀ8pàܹsçÎ;uêÔ©cÇN:tèСC‡:uèСC‡:tèСC‡:tèÐQ¤dV¸I’T©R¥J•*qãÆ7nݺuþ;‡îœ7oÞ¼yûö —/_À€ ,X0bÄ„©&L˜0a† ¶lÙ²fË–-[æŒÙ4f̘1cÆÌšµi͘5³fM3fÓ˜9k¶l˜0uë|¡ãfiR#;sþdò$ꔪWîàõãÇOÛ"Dˆ!B„ .\øðáÃ&>0aEÊ•,Y°`Á¢e‹-[´hÑ’]?|ùܽJuÊS>v5šT ¯`ê„ [&oÙ2g̘1cÆŒ3fÌš1cÆŒ3fÓœ-[¶¬Ù²eˆ &L˜:bÁ‚†ËºsܸUª)Ò£G&1bÄ"C† Hˆ:têÔ©Sþç8pâÈ‘'Nœ8qâĉ#GŽ9räÄ8pàÀ¹sçÎ;wêÔ©cÇŽ:uêÔ¡C‡:têСC‡:tèСC‡:tèСC‡:tÑ! À þ7I’*UªT©R%nܸqãÆ­[·nçÐDçÍ›7oÞ¾}ÃåË0`À€ Œ1aê„ &L˜°aÆ-[¶¬Ù²eË–9c63f̘M³Æ¬Y³fͬY³63fËšÍ[&L˜:_èÎY¢´ÈΜ?›H‰2uêU,xýøõ«‡â@„"Dˆ !B <|øÀäÇL¢D‰"åJ–,Y°hÙ¢‹-Wšàë×^¬W©DyʨF“¸¡óLÝ0aÖ-[¶ŒÙ4f̘1cÆŒ3f̘1cÆŒ3gË–-k¶lÙ°a„ S7,X°`À€áò†î7n•*EŠôè$HþŒ5B„È!C…Ñ¡C‡N;uêÔ¹çN8pàÀ'Ž9räÈç8pîÀ¹sçÎ:uÖ©SÇŽ;uêÔ¡S‡:tèСC§:tèСC‡:tèСC‡:tèСC‡Etþ°bIR¥J•*UªT‰7nܸqãÖ­[·sèÎyóæÍÛ·oß|ù °`Á‚#&LÝ0a„ 6lذeË–-[¶l™3g™McÆŒ³iÖš5kÖ¬Y³fÓ¬Y³&mš³eÍš-¦˜/tÜ&QRd§O M¡L™RË]¾}ûâA!B„"D0á‚… "Dˆ!B„&\ @á >|øðáÃ&L¢D‰"劔+X°4±×¯ß;w¯R•ò”PŸB E:çËW0u†-[ÖlÙ²e̘1cÆŒ3f̘1cÆŒ3þf̘9[¶lY³eË– &L˜0u‚Ì—7tè¸q«T)R¤G A‚ĨQ#D† 2T¨!:tèСC§Ž;vìÔ©S§Ž:uêÔ©S§N;vìØ±S§N:tèÔ©C‡:tèСC‡:tèСC‡:tèСC‡:tèСC‡:tèСC‡!B„-Ú þ…s–,UªT©R¥J•¸qãÆ7nݺuë†Ý9oÞ¼yûö —/_À€ ,X°`ÄÔ©&L˜0a† ¶lÙ²eÍ–-[¶ŒÙ4f̦Y³ÖlÚ4kÕªU«V­ZµjÕ¬I“fMÚ²eò†©[·®[%Kõù“GO(Q§TÅju@B„"Dˆ!„ (P¸p„<|`„ “(Q¤D‰ðJ*ýöÁs÷J)Oyþô±£R¤sè|S'LذeÍ–-þ[æŒ3f̘1cÆŒ3f̘1cÆŒ3gË–-[ÖlÙ²a„ 6L]°`Á€Ãå :nÜ*UŠéÑ#H1bÔ"C† *Dˆ:tèСC‡:uêÔ©S§N:uêÔ©S§:tèСC‡:tèСC‡:tèСC‡:tèСC‡:tèСC‡:tèСCˆ!B„"Dˆ!B‹4þPᜥJ•*UªT©R%nܸqãÆ·nݺC‡Î›7oÞ¼}û†Ë—/`À€ ,X0bêÔ©&L˜0aÆ ¶lY³fÍ–9cÆl3fÖ¬5“V­Zµj×®U‹­ZµjÕªY³&­Y³fˆ©S·]ºKìÌùÈ“¨S¨þ!B„"Dˆ0a (\¸`ÁÂ>0ùÀ¤I”&L˜``·Ï],U§DyÊó§þF,¡ól:a–-[¶l™3f̦1cÆŒ3f̘dÆŒ3f̘1cÆÌÙ²eËš-[¶lذa„©,0`¾¾yC×·J’"Ezô$HŒ5B„È!C† *Dˆ:tèСC‡:tèСC‡:tèСS‡N:tèСC‡:tèСC‡:tèСC‡:tèСC‡:tèСC‡!B„"Dˆ!B„"DèÐ" þT8W©R¥J•*UªÄ7nܸqãÆ·nÝСCwΛ7oÞ¾}ÃåË0`À€ ,X0aêÔ©&L˜0a† [¶l™´fË–1›Ælš5kÖ°aÃv-›±lذ]»víÚµkÕªM³fÍš5iËä©S·îÜ%HŠ9 äI*>$Dˆ!B„"Dˆ0! .X pÁÇ>þ0ùðá*ðb©2Ê“ž?}9ºt0bÃÔ©6l™´fË–1›63f̘1cÆŒ3f̘1cÆŒ3fÌ–-[¶lY³eˆ &L˜0uÄ‚ —7tè¸q«T)R¤G=‚ #F!BdÈ!C† *Dˆ!B„èСC‡:tèСC‡:tèСC‡:tèСC‡:tèСC‡:tèСC‡:tèСC‡!B„"Dˆ!B„"Dˆ!B„:´Hþ€ ç*UªT©R%€•*UâÆ7nܸqãÆ·nÞСC‡Î›7oÞ¾áòåË0`À‚  X0bêÔ©S§n˜0a„ [¶lY3gΦY³&̘±\YºLqÂ¥KcÙ²=£öìÙ3jÔ°M f ›5iËäÉS·.Ý%J‹úäÑsJÉ "Dˆ!þB„"Dˆ0a„ &P pá‚ .€˜à•)P<Zä¦1nܸ±m4iÒš-sæŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1c6™³eË–-k¶lÙ²aÆ ¦nX°`À€ûæ ]7nÜ*U’éÑ£G AbĈQ#Dˆ2dÈ!C… *TˆP!B„"Dˆ!B„èСC‡@:tèСC‡:tèСC‡:tèСC‡:tèСC‡!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„-ÒþEºJ•*UªT©R%nܸqãÆ7nܸqãÖ­Û9tèСóæÍ›·oß¾áÂåË—/`À€  `°`Á‚ S§NºaÆ [6ž4cRŽ92åÊ-Z¶ˆ!C† ™3Ù¨Q£F× ,bÌv ›5iËþ–©[·.Ý%G}úð¡p@B„"Dˆ!B„"L˜!„ (P¸pá„ |L‰ (ТF+^ÈQ£F4r丱̚4iÒ¤I“&™4kÒ˜1cÆŒ3f̘1cÆŒ3f̘1c¶lÙ²eÒ–-[6l˜0a„©  0`¸¼¡C×·J•"Ezôè$H 1bÔ¨Q#Dˆ 2dÈ!C† *T¨P¡B… "Dˆ!B„"Dˆ!B„"Dˆ:tèСC‡B„"Dˆ!B„"Dˆ!B„"!B„"Dˆ!B„"Dˆ¡C‹ þ ð’®R¥J•*UªT‰7nܸqãÆ7nܸqãÖ­[7tèСC‡Î›7oÞ¾}û†îÛ7\¾páòåË0`Á‚S§N‹(]²BB‡ 0jÔ Qƒ† 5´a«VmZµjÕ¬Y³fÍš5i̘1cÆŒ3f̘1cÆŒ3gΖ-[¶LÚ²eˆ &L˜0uÄ‚Ì×7oèÐqãV©R¥H‘=z $HŒ1bÔ¨"Dˆ 2dÈ!C† 2d¨P¡B… *T¨!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆþ!B„"Dˆ!B„"tH ¬¤«T©R¥J•*qãÆ7nܸqãÆ7nܸqãÆ­›·sçСC‡:tèСC‡:tèСC‡:_¸|SW†#þQ¢H‘’% -Z¶ˆ#F̘1cÆŒé’@ 0bĨQ#GŽΨU«VÍZ3yêÖ¡»t©•’ Dˆ!B„"Dˆ!B„FˆÂ%€9¢tn·$^¸pF 6lذA£F mÔ®U«-Z´hÕ¦5cfM3f̘1cÆŒ3f̘9sælÙ²eË–-[¶lذa„ ¦NX°`À€ùÂåͺnܸUª$)R¤GA‚‰$FŒ1jÔ¨"Dˆ 2dÈ!C† 2dÈ¡B… *T¨P¡B…"Dˆ!B„"Dˆ!B„"Dˆ!B„þ"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„-¢C€+é*UªÄ7nܸqãÆ7nܸqãÆ7nܸqãÆ7nܸqãÆ7nܸUªþT©R¥J•*qãÖí\º\(00a%J)W²`Á¢EË1bÄŒcÆÌ˜1jÄDXà"FŒ1jÔ ‘ã4jϪE›&­™0a%Š)R²dÁ‚EË–-bĈcÆŒ6f̘Q£Å‚$^¸€£F3!ƒíÙµjØn8¡Bˆ!C¶mۦ…@‘…m䯱B§NžðäÑÓiØ0%Š)W²dÁ‚ ,Z´lSM7mÚ´iÓF™1cÈTXÀ€D‰.^Ȩq 2hÔ|8aâ„ B„2dÛ¶mÛÆ•»w¯ß=såÊ•+W޹ÐÙRÁ‚/^¼páÂ… 0b¸¸€¡‰”+X°hÙPŒ1cĈþ!C†L™eÍœ-“¶lÙ°aÄ &L˜0a„ &L˜0aÃÔ©FŒX°`Á‚æË®oÞ¼yC×7n•*Uª$)R¤H‘=zôè$H M‚Ĉ#FŒ1jÔ¨"Dˆ!BdÈ!C† 2dÈ!C† *T¨P¡B… *T¨P!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„Z¤þíСC‡:tè¼uëÆ7nܸUª$)R¤G 1b¤¨:uäÌá“'O ”Lñá&Q¢D‘"åJ–,X°`Á¢e‹–-bÄ”AÓÆM17nØŒ1cfÌ*":,`À@¼!ƒ홃#Lœ8¡¢‡!B†lÛ¶m›¸ræîÝ»gŽ\9räÈ‘#'2  X@¢D‰/\¼páÆþ‹ ˜D‘’‹–-bĈ#f̘1cÆŒókÞ¼e„ &L˜:uÄ S§N:uêÔ©S§NX0bÁ‚ ,0`À|ùÂõÍ›·sèºqãÆ[¥J•*EŠ)R¤G=z $H 1bĈ#FŒ5j„"Dˆ2dÈ!C† 2dÈ!C… *T¨P¡B… *T¨!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B‡þ ×:oÞ¼yó†:tçºqãÆ·J•$Ezôh¤F† ѱ#gŸ?xôxeJ >0a%J)W¤dÉ‚ -Z¶ˆÙ"FL3iÜ´+æ¦ 5fÌŒ!s²]»víÚ… 2hШér0b„ 'T¨"DÈ!Û¶mÛV®Ü½{þÊ‘#GŽ9räÄþñBÆCA  A¢Ä‹.\¼˜`á“(W²`ѲEŒ1bÆŒ3f̘1cÆ”!¶l˜:uêÔ©&L:u„ 6L±`Ä‚ ,X°`Á€Ì®oß¾yó†Î[7nܸq«T©’$I‘"EzôèÑ£G A‚ $F1bÔˆ£F!B„"D† 2dÈ!C† 2dÈP¡B… *T¨P¡B… *Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"DˆÐ!BþäZ÷Í›7oÞ¼y;‡]·nܸq«TIR$€ Ab„È:râüÉ“G§O¦”H°ðá&L¢D‰"EÊ•,Y°`Á¢eË–-bÊ”A“¦›bíܸicÆŒ3dÄPƒ 4dÈAƒµFŒ0aâ„ B„2dþÛ¶mÛÆ•3çÏ_9räÈ‘#GŽœ8aÈx(H€`Á‚$H(Qâ…‹,|`å -Z¶ˆ#F̘1cÆŒ£ÆÌ˜1cˆ© 0`À€,X°`Á‚ ,X°`Á€  0`¾|ùÂõí›7oÞΡëÆ7n•*Uª$)R¤H‘=zôèÑ#H A‚Ĉ#FŒ1bÔ¨#Dˆ!B„È!C† 2dÈ!C† *T¨P¡B… *T¨ÀB… "Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B‡-Z´ˆþ€¹ÖùÂõí›7oÞ¼CwŽ7n•*Ezô#D† Ù‘‡ž|`„ ”(Q¤\‘r% ,þX°hÙ²e‹˜2eРIãÆM±vnÚ°13fŒ.¿š5³†­ZµkØ®evKÅ  F˜0qℊB„2dȶmÛÆ#'n›8qâĉ·mÛ3hÐ!Û•"… )RøaÂ…L2‹–-bĈ)cÆŒ3jذQcÆŒ3jÆŒ)3iÒ¤H’$UªÄ­Û9tèСCçÍ›·o¸páÂ… .\ß¾}ûæÍ›7oÞº¡;×7nܸUªT©’¤H‘"EzôèÑ£G A‚ #FŒ5bĨQ£Fˆ!B„"C† 2dÈ!C† 2dÈP¡B… *T¨P¡B… þ*Tˆ!B„"Dˆ!B„"Dˆ!B„-Z´Hц :¨# 0_¾pyC‡Ž·J‘Abd¨;søäÑã)¨Sª˜þpáÇL˜@‰%Š)R¤\É‚‹-Z´l)S¦ 4iܸ)VÌ›6hƈÃ%0ÒDJ-[¶ˆSÆ 6mÚ´aÆ 3f̘Q3fŒ";Š5b‰Ò¤G‘"YªÄ[·sèСCçÍ›7oÞ¼yóæÍ›7oÞ¼yë†î\·nݸqãV©R¥J’"EŠ à£G=z $H 1bĈ#Fþ5B„"Dˆ2dÈ!C† 2dÈ!C† *T¨P¡B… *T¨P¡B…"Dˆ!B„:´hÑ"%8þÐA^°`À€Ãкn•$=šÔÈÐ!;vøàÑÓé“©T¯b­8a… L˜0i%J)R¤H¹‚%K,X°`Á¢EL™2eÊ I“&M4fÊŒ!#f +D†ˆG®\¹rþüù»w¯¿pFŒ0aâÄ *z"dÈ!Û¶mÛ¶mÛ¶mÛ¶m·-œðäñÊTªW±à­8a„ ,|`%J”(Q¤H‘"åJ–,Y°hÁ¢eË–-[Ê”)S¦L™2f̘)#FŒ-Xüù»w¯?~üøñã×OŸ>í1b„ 'NœP¡¢‡!B„2dÈmÛ¶ 2dÛ¶mÛĉÛnݺuëÚQ9aÂ…¢H¹‚‹–-bÄ”A“¦7nܸiÓ† 5f̨3fÌ™?yòüécÇŽB†1‚4éQ$I•*qãþÖíºsÞ¼yóæÍ›7oÞ¼yóæÍ:tݺqãÆ[¥J•*IŠ)R¤G=z $H 1bĈ#FŒ5j„"Dˆ!2dÈ!C† 2dÈ!C† 2T¨P¡B… R¤hÑ¢E‹6l 0€þ@@®yê‚ó…®[¥HêÓçOžL¡Lzåž½"L˜@Á‚  D‰%Š)W¤\É’%K,X°lÙ²eË–2eÊ”)S¦L™2eƈ£K?~üøñãǯŸ>öì•7n›ƒ#F˜0aÂĉ*Tô"Dˆ!B† 2DH!B† Ù¶mÛ¶mâ¶mGÉÀ "L¸ðI)W°`ѲEL™2hÒ¸qSÌ7nÚ´aÃÆŒ3fÆŒ9󦓞þ}öì•7nÛ¶mC„h3ÑÀÁˆ&L˜0qâ„ *z"Dˆ!B†9¡Bˆ!B† Ù¶mÛ6qâÄ!‚ !„ >0‰r‹–-[Ä”)ƒ&M7ÅŠ¹þqãÆ›6mÔ˜1£f̘1g6‰òPOž?sæØé³È¢F&=Š$©R%nܼ¡óæÍ›7oÞ¼yóæí›7oÞ¼Cw®7nܸUªT©R¤H‘"EzôèÑ£G A‚4 #FŒ1bĨQ#Fˆ!B„"C† 2dÈ!C† 2dH‘#G‹mØ``þèš§.t•ARd‡=¡@™z Þ¾~DˆÂ… <|`„I“(Q¢H‘rEÊ•,Y²`Á‚ –-[¶l)S¦L™1cĈ#fË–,þìÙ+7nܶmÛ†h»uK—3kØtpàÀÁ&L˜8qB…Š=„"Dˆ&NœPÑCˆ!B†lÛ¶m9"L pÁÃþ&R¤\Ñ¢e‹˜2eФiã¦X±bÅܸqãÆ 3fÔŒ3æ §S >yÒ“çÏ;v2ԈѤG‘$UâÆ:tÞ¼yóæÍ›7oß¼yóæÍ›·sèÎìÆ7n•*Uª)R¤H‘=zôè$H M‚Ĉ#F1jÔˆ"Dˆ!B„È!C† 2dH‘"GŽ)Ú°Àþºä©†Ž[¤IŠúðÁãÉ“)U¯ÜåãÇ&\¸pÁ‚‡˜0aJ”(Q¤H‘r%K,X°hÁ¢eË–-bĈ#FÌ–-[¶l!ƒeܶmC†I›¯eÒ¦Y³V­¶kÙt¥p@¢Ä‰/Nœ8¡â„Š3„Ñ–Â'Nþ¨P!Dˆ!C†lÛfB„ ,xøÀ$J)X¶lS¦L4iÚ¸)V¬]»vnÜ´QcÆŒ3cÆœãꔩOôäùçO;† 5‚éQ¤J•¸qó†Î›7oÞ¾}ûöíÛ·oß¼yóæÍºsݺqãÆ­R¥J•$EŠ)Ò£G=‚ $HŒ1bĈ#F5B„"D!BdÈ¢FŽ9R²ÁÀ€þ0`™™Rå._¿}Ú Dˆ aÂ… ,€ðð €Lš@%J”(R¤H‘r% ,X°hÑ¢e‹-Z¶lÙ²e‹˜-Z®ц S >v&&¯Ù4kÑ¢]{F Û3/dĨAƒþF'NèêqëV°eóæKa 'N¨è!Dˆ!C$Hˆ0‚…L˜0‰%Ë–-[Ĉ)ƒ&M7ÅÚµk×Î 6j̘1£f̘1dZ½JeêS¨LyððéÓÇN!CŒ =Š$©7nÝСóæíÛ7\¸páÂ…ëÛ7oÞ¼yó†]7nܸq«T©R%I‘"EŠôèÑ£G A‚i$FŒ1bĈQ£F!B„Q#GŽ9R²ÁÀ@þt˜§˜¯n“õá£ç¨S±Üíë×/Å"D˜@á‚ >0a„ “&P¢D‰%J”(R¤H¹’%K–,X°`Ñ¢EË–-[ÄlÑ‚åÊ;x¯P…´à¤sÀþä-“V­ÚµgÏ éÁà… 1jÔ¨A£†j×°a³fmY3yòÔÝ2á`„‰'Tô"Dˆ &P°ð &Q¢HѲeË–-eФIÓÆM»bnÜ´aƒ†3cÌŒ#†LšX¯N™ú*S<|úØ9dH#H"UªÄºsÞ¼}Ã…Ë—/_¾|ùÂ…ë›7oÞ¼C×7nܸUªT)R¤H‘"=zôèÑ#H A‚‰#FŒ1bÔ¨Q£FŽ9j´aþæ©vîR£>6…2¥*–»|ýôA€!B„(\°`ćL˜0a ”(Q¢D‰%Š)R®dÉ’% ,X´hÑ¢þe‹-Z°\·/*P›úP:LÝ2kÕ®={FÍ–%^¸€£ 4häÐEíÙµjѤ9k&LݺsVŒ8„‰*z˜€! >0a%Š)Y°hÙR¦L™4iÜ+æ¦M›6h̰1cfŒ3bÄÙ/Ö«S¦@…Ò“ç;vj Ò#IܸqC‡ÎÛ·o¸| 0_¾|áúöÍ›7oçÐyëÆ7n•*U’)R¤H=zô$H&1bĈ#FŽ(Q¢äeÃþ@°yê|q›´¨ O¥TÅr—/Ÿ> "Dˆ!„ .Xøðá&L˜4 ”(þQ¢4‰EŠ)R®dÉ‚ -Z´hÑ¢E )ïò¹SejS GçÔÉcf­Ú3hÐ5X° Ä 0bÔ Aƒ†1A{víZµiË–©vŽ’£>wVŒaâD"D˜pá&P¢H‘’% –-[Ê”AÓ¦M7nÜ´aƒ† 3fŽ#FŒ2ZâÁ‹¥ê”©Oôäá3ÇNC Azd©·nè¼yû†Ë0`À€ ˜/_¾p}ûæÍ›7tçºqãÆ[¥J•$EŠ)Ò£G=‚ ¤I Q¢DÉËþlÞ:t•Ùù£‡”ªWîòåÃAB„"D˜þ@á >|øð &Lš0%J”(Q¢H‘rEŠ”+Y²`Á‚E‹-Z´h¹rß>wªLééÓ¨Û:y̪U{ ™-xŒ5hаA£/dО=«fÍY3yÀºMZÈS)R+8€ !B„.XøÀ$J)R®dÁ¢eK—2hФiÓ¦›6mИAcf̘1bĈãd]>w±T™2õÉ“ž?sìØ)d¤G‘*qC‡ÎÛ7\¾€ 0€À€ ˜/_¸¼yóæ ݹnܸqãV©R%I‘"EŠôèÑ£G&QºD‰•— þ@›·®¤þCv‘Jõʼ}úPˆ!B„&P¸pÁ‚‡>|øÀ„ &L @‰%Š”&R¤D‘"åJ–,X°`Á‚‹,NÎõÛçî•(=sUZ'™µkÏ !¡Á%\À€£ 6hÔ¸… ´gתMk¦Î×9J‹y*õÊ]¾p$Dˆ0a„ šD‰EÊ•,X´lÙR¦L4hÒ¤IÓ¦™2f̈!#FŒ1bœ¬ãÏÝ+U¦@…Ò“gN;„ 5šôHR¥nè¼}Ãå 0`À€  0`À€æ ×7oÞ¼¡C×­7nÜ*Uª$)R¤H’.±ºtéÒŠ þ þ@€`óÖU‚d‡Q®bÁë—O["Dˆ0 .X°àáÇ>0a„ &L˜D‰%J”(R¤H¹’%K,X°`Á‚%Iº|ûà¹"µiN#nëä-³ví4d $@°€Ä 1bÔ Aƒ0!ƒöìZ5iËÔù:G©OO§^¹ãî@„"L˜@á“(Q¢H‘’ –-[¶ˆ)S 4hÒ´A3FŒ1bÄŒ#FŒtüúÁƒõê¨Ozòü‰S‡Ž!H"UâÖ 7\¾€ ,X°`Á‚ ,0`À€ó…ë›7oèÐuãÆþ[¥J•*uKwé’ þ Ø|‘J+ß¾~àHˆ!B„&\¸pÁ‚…>|øðáǘ0a„ (P¢D‰"åŠ)Y²dÁ‚%K’sýò¹{eJOJçÖ-[fíÚ3hÈR(@Á‚/bÔ¨Q#FŒ2^ CíÙ5k›ÉS‡îÒ">zR¹Š•oŸ¶"Dˆ0aÂ… >0aÂ$J)W®`Á‚E‹–-eÄlÙ"FŒ1bĈ#FÌ1\ÒäË—Ï],W§ByÊógŽBŒ =’þÄ 7_À€ ŒØ0uêÔ©S'ŒX°`Á‚  0_¾¾¡C·®Ý:o(P€þ‚ÍCw©Ÿ@²TÁÛׯŸ•"Dˆ! .\°àáÇ>|øðáÇL˜0a„ ”(Q¢D‘"EÊ•,Y²\i‚¯_¾Xª@m äèܺaÒªU£   X°€ .`À€CFdР=»f­Ù2uç(õùã)Õ+wùöi;!B„&\°àá&L˜D‰"EŠ”,Y°`Ѳe À-[¶l#FŒ1bÄ!C&Œþ|øò¹{¥Ê)Oyþô飈ѤHÜÐyó X0aêÔ©S7lذaÃÔ©S7ŒX°`Á‚ FLݺu¹RP@ þ €`óÐQêó'PªXðòíÛîÀ "D˜0a <€øðáÃ>|øðáÃ&L˜0a%J”(M¤H‘råÊ•#Ýúñƒ÷ê(=}q[§NZµjÏ !Û•  xñ .dÈØ… Ú³kÕ¤5“·ÎR#;€Bzå.¾ "Dˆ0a„ <|`„ (QšH‘"å -Z¶lþÙ²e‹˜-bĈ³… "A€Á—/Ÿ»W©N…ò„çOŸCˆ&=ªÔ .`Á„©Sp˜0a„ &L˜0aÃÔ©S7l˜|øð &L˜0%J)R¤HIÒE_¿}î^™òÈN£s¾äI›í4hÈl)H€Á%^¸pà ]ÈA{vͳeêÐM:Äg)T±àíÃ'AB„"L˜pá‚þ˜0aJ”&R¤HÁ¢E‹-Z´hÙ²eË–-[È!$H Eòås÷*Õ©Pzþôéc¨Ñ¤HÝÐá&L:a„ &LØ0a„ ¶LÞ|øð &L @‰EJ“#IØõë/–*SžÉiTÉ—ºeÒª]{ 2[  X@‚D‰.X¼Ð… ´gתIk&o]¥Fuþþx¥Ê]¾~ú$Hˆ!B„ (\°àá&Lš@EJ)Y°`Á‚‹-Z´hÑ¢EK!A‚ $Hxî^©å) >vAŠÔ .`êÔ &lذaÆ ¶lÙ¼yótUIA`þ€ôÔs$‡O Rªb¹ƒ—/_¾p8A„ (\¸pá‚ @€ððáÇ>0a„ €Pša’ _¿~ùܽ:%JÏ;Ž,¡S·Œ™µjÏžAC†l— 0`ÀàþEdÈA{v­šµfËÔ¡›Ô¨OO¦T¹Ë×O_ "Dˆ0a .|`„ &L D‰"%K,X°`Á‚ ,Z´á$H"A‚ B.Ö+U¤<åÔG¤HÝÐù¦n˜0aÖ-k&m=zôè«Òa@þ ƒ0a„ (Q¤H‘"EŠ”,Y²`Á‚ .B‚ R$H A‚ÄREÊ“@}1zÄ ¯`êÔ &OÚxîb©:ÊSž@‹(UBL^³iÖª]{ 4dÈ!C† 2hР=»V­Ú´fËÔ¡³Ô¨O O N½r—/Ÿ>"Dˆ!„ (\°`ÁÇL˜0%J”(Q¢H‘råJ–,Y²`á‚ A‚ $HY§HyÔgQ£I•ÐS§nزyô¬I“¦« þ‚Í[Ç Ò!;6‘eJÕ«XðòåË·o?~ùÞáÃg_=+þ^¬X±bÅŠ•[öðá³§o_¾|ùòÁsçîÕ«S¢BéÄg%K耩[¶ÌZµkÕžQƒ 4hРAƒíÙ³gÕªIc¶L¯s“õäI”ªWîò½Ã‡â€„"Dˆ0a ,xøðá&M 0%Š)R¤\É’%K.'~$H A‚ÁQÊ“ž?}Mª„n:yóÒ£ÌVþ@]óÐY‚ÔhQŸ@ž>:þå Ö«X±Ü¹ƒ—oß¾}ûöíÛ·o?~üøñãÇß¾|ùòåË—ž;w±^©:e*”'<ú‚d 0uÚI³VíÚµgÏžQ{ 4hÏž=»V­š´fˆóÅ Ò¢>y<’˼|ùðI€!B„&L˜@á‚>|`„ &P D‰"EŠ)W²\¹råÇ@€$H 7@é ÔÇѤnëäÍ[LW‡€þ@þؼuÝ9ZÔ'Ð&=žD™:u *U¯bÅŠË;wîÜÁƒ+$Dˆ!B„ (\°`ÁÇL˜0a¤ (Q¢D‘"EÊ)NLüøñã @€ä†&@‹(±J‡.Wþ þèš·Ž[$HŽõùóO @*•ê”)S§N:… •ªW¯^½zðÕ«W¯^½zõê•+U©Rõ)T¦sìØ9ÔhR¤nèp©6l™4g̦Y³f­Z´hÑ¢E³fMš³fˆ S‡ ]¥Iìôù£Ç¨R²b¹ƒ÷.¾|ö¬@8p@„ 'P pá‚ >|øðá&L˜0ÒäÈ‘&sæÌùó ?yôèÑ£'Pž}áF8A„ .\°àÁÇ>|`†#G¨°ë·/¼vìøñãÇŽþ@þ :ÌSçË:tÜ$Eš4 ’£F*DˆN:}úôéc‡>|æðùž?þü™3'Ž9vì2ԈѤHÜÐùL°aË–-sÆŒ3fÒ¤1cÆŒ™3fÍ– ¦˜/t•5*DGΟ<™>*%+V,wîàåË×_?{V¬@€ L˜`Á‚ 0TþéV¯_?~ú„|öôÙ³bÅŠ+V¬XÉeOŸ¾~õØåbBåHƒ> 44;;DD LL AAKKRR \\ RR[[aa jjddcclllluuxxtttt{{||ƒƒ‹‹““››ŒŒ ££££««¬¬¶¶´´ºº¬¬,»»1ÅÅÂÂÌÌÔÔÜÜÄÄ$ÎÎ&ÔÔ%ÑÑ>ÚÚ3ããêêððùùææ%èè/óó,óó0ùù>ÂÂDÕÕHôôAõõIññZùùTþþdÿÿuÿÿ‹!ù!þCreator::XCRSYDEN-0.x ,þ€€*067>>=3/5045667=?@=50/03567==>>>@%600/00367==>>>>@%500/-/þ€0457ADC>>>7?/00/---/44:HMLC====50//-,++-006INNE=776=*0--,(((--04*3334 19 94 == 3269;;C K HDJEHP ZR[O#L2 N8Z:ibjkgu{{ tb"f=d8o?r#t,r6CC LM @DKKMUUHPOXJTT XVZZ TTRQ^^Y]Wa\bbBmAtFuPcch`jj``lgkko| vvrrv}}}z€…Ї‰";?ª©-"K€TšD›MªL¶@$«q´d‚‚‹‹‹‹”ˆ’’””˜—šš››¢°–¥¥§¨¬¬««­°´´±±»»ÀÀÕÕÕÕÜÜÅÅ"ååññ!ù!þCreator::XCRSYDEN-0.x ,þ Á‰'°”i‰Q , ÀI"A… Irä¨R&5¬ÀÒ¨ 'Ô pÒFS'e°þ” `À L!ªtÉ Ð‘€:˜Y1(¡A @`‘D @€`üÈiÇ‚‰Ìt0 €e"!R€ã!pú,ŠƒçÊŠÀ²¦ –“ 0 ù£@døÐ!ÀË$Ö8j $G À 6" ãNBEìøPñd š+žXã$Ñ °$@r¹³g oÀ°`+Xœ8äˆ`ÈŒ é!勘%%Hà [Ìþ@8.Ìp€4€˜ qCŽ„déàÁ pFŽÈ@GŸ9'ZÄ€ãÐ…@ðÈÈ!áÊ$[ªÐHÒB„ BxprÀ‘p 8 `¦.=hàÁ CȘqA $ÒM(X°p!‚ ‘32‚L8R…‹,È €°2 à`Àñã…Œ  0@þäÈ!CBPP 0ȱ!C† @€` ;xcrysden-1.6.2/images/center1.gif0000644000175000017500000000101211712736221015344 0ustar tonetoneGIF89añÏ0ÿÿÿÿÿ!ù,þ @€ @€ @€ @€FL˜0a„ &L˜ @„ #&L˜0a„ &Œ`„B @„  ˆ0aˆ#Da„L˜0aÄ„&D˜0¡BL˜0cD€&L¨0"@€ &L¸P À„  L( €fŒa„F0!À„  ˜qãB D0a„"L˜0¡Âˆ& À„ %J”(1¡@€0a„D À„D˜0a@€&aD‰%*LÜ @€#˜Pa„ FL˜0aÀ„" ¨pãÆ€.LaD€T˜0!@ˆ˜P @„&L Â… "Œ`B… &1c„ ˆPa„T1a„T˜0!@„!F„˜0aB&L @€BL˜0"@€ &L˜0a„ #&L( „ &L˜0a„F¢D‰%J”(Q¢D‰ @€ @€ @€ @;xcrysden-1.6.2/images/rep_asym.gif0000644000175000017500000000242611712736221015634 0ustar tonetoneGIF89a÷  , ,#!$8##**,, 7766 <<<< 8>)77 @'L+K*[.e5jD4@-A}*H_8Q[+Fb#Fs!J~<\nDD LLRR ZZ TT]\Qb?bb kk ddddhgiikkrr {{ssqqty||z{`m;or$ot*oz7qu%uy"x{"s|2PjZBafLheIkr^{fiyDc|\C„JM”!LŒ"O‘#Q–&W8^€'[¤)]¦*_©,d²-j¼0m¿4sÅ3uË5xÍ={Á:|Ì6{ÕCoŽCrœ‚ j„_blw—h=‚Ó;†ä<‹ì?òNˆ±Y°eš¡p¤ KÕDçD”çH˜òQœéO¨þ\°ýƒƒƒƒ„„ŒŒŒŒ”“””›š››†“9”œ/Ÿ©2¢¢¤¤©©««¶¶°°½½¼¼š¶eÄÄÄÄÍÍÏÏÖÖÜÜããêꃰ‹º¸!ù!þCreator::XCRSYDEN-0.x ,þH° Áƒ*\ȰaB%N0H @€C„Z0¤GO9-$&p€€ŒÙH¡Â;xôä¹sçDCrå‰ñ‚@E ¤pÈ‘‹ q6ÊCÀÄ‹Q0B)ÂwÝ! „Œ$ZD'…Uƒê42T@ˆQ *H"t çÏŸ>†‰Éab @h ˆ‘7á?‚Щ“P ?8P8¸ã(ÏŒõ$ࢇEŒB'& Eƒ ‚vÁ£ ^’P)³…HŽ98r¨¢§Â1H,¡B¦L›4|òäy¡‚Ïâµ–p!ä .dâÚÀ9ƒd :~ò̱óTaH®d©‚å›2fÔÀpQâŽB@•P.±ÅODAl@"ƒ ±ÀÈgÀ: 1ÆLlÀ„MP†* À!ˆˆYh±M4aAhÐD<¨@€ŒØ¤ÐVX1ÆC„x`A;¼0G#sThS41aXvÇ +Dp@ 6,"Hv °„xÀ çé wÐ!"%8TÀ€I4‚ vØ R–$ <Ѐh†6êè£ ;xcrysden-1.6.2/images/rep_unit.gif0000644000175000017500000000261211712736221015637 0ustar tonetoneGIF89a÷è     ) %, , 6"<#6(('.4522 88 A#J'D%I)F*H+\3X7W.`0f6jz*byFFLL OTPP PRXXY\DP7U_1iiffkjjk~rrrube gm+go1er=u|+DYQI`TOi[XkLLjiXtcYwk[xgY{s\}euCbuLdxO`}eD‚H‡IˆM“$Mƒ!K‹"O’$Tˆ$R•$U'Xž*W’*[œ%W¡'Z¢*]¥)^©3c:f’=j–:j™*b¢,c­,e²-h·.j»0e°1iµ2m»8o³4r¾;s°9uº?{·/mÁ1oÂ2qÄ3vÍ6xÌ<{Ä<|Ë5zÓ6}Ù:~ÓHq‡Gs‘N|•Cu¡@v©Cy¬B}º@Ã|€%q:z„6{Š?i‚]qƒHa€mo‹dg†s>€Ê<‚Õ<„Ü9„â<ˆç=‹ë>ñ?‘ì?ðN¡M„ªGƒºIƒµI…½Uˆ¦P޼f‘Œj—Œb”š|¨‘K‹ÅAƒÕC‡ÛB‰ÛH‘ÓMØOšÜR’ÄU•ËP–ßDŒâ@Œì@ðF’çG‘èK’äL–ìM˜ìC•ôGœùJšõ_ªÚM£÷N ùT£ôW§ûW®ÿ\­ý[°ÿd³ýƒƒŒŒ““š™››‘–%›¤/™¦:¦¥§©¡¥$¦«%¶º%€“LŽœ@…›R™Z–¦G¬c¼Ã,ºÇ;ÎÏÓÔÜÛÇÎ-ËÎ ˆ»›!ù!þCreator::XCRSYDEN-0.x ,þH° Áƒ :H¡ÂA‡7ú„,ˆœ±#¨07 øF·ðy“f¦mΚ éaaÆ¡NÇŒ¥Àh [¸D8¥beéÙ´nšìØáä+‡˜•«ç'aÊd-rÕë4sìÌyZ 9d$•£ÇП<›~éâ”GÎ%sZJŒaðÀœNÅ ku*.:fè24§Ì”qã tÀPÀàAp…«ž6kLúdÕ–8r˜ì¼0p0Ì5}ãf‰Š¢y:uF ·;xcrysden-1.6.2/images/ak.gif0000644000175000017500000002726711712736221014422 0ustar tonetoneGIF89auN÷î\VFhN%tH(zcQr%^j#fi$iw+hs,x-*†..“):$1‘,3™-?•/:œ6/=-Ž9/“30‹30Œ22•-<¡H¢Z­f¸$B–+A›+K#Rž0G3S™(B¡-D£(M£*J©#W«,T¥(T¬&W² Z²,R±,^´4K§6[«>Zµ&c®$`´"aº l½(`º)i¼2d¶>mº0t¼jÆkÃmÂxÉuÇvÅwÆtÅxÊ}ÎyÒ|Ò%iÂ,eÁ%pÅ"sÊ"}Ì-qÃ,|Æ)}Ì%|Ò.zÑ2yË8sÅJ-„J,‡K2‰E<™R6”Y?£}>JE¨JUºSJ¶^Q¸Hc¾O½fH²uF®tO¬FlÃHaÅFuÆE|ÊKwÈOvÓViÈ^{ØdRÀfZÑ}}ö‡×Ñ*‰Í'…Ó Ö.ƒÓ#–Ø$—Ù.’Õ+‘Ú1‡Í:‡Ë3ˆ×5Ô=…×=‹Ô3Û:›Û!œä-Ÿâ<Ÿâ%¡Û.¡Ú=¥Ù=®æCƒ·DˆÌF‰ÍGÎH‰ËGŒÑH—ÏB”ÛL•ÔI˜ÑH™ÓLœÕXŒÌPØG™âN•âWŠáB¤ÜN¢ÖL¤ÖL¡ÚK±ÝR ÛR¥ÙT®Û_¥ÞY±Ý_´ßO¦äI¯æF­ñV¡ãV¬æ^ âZ§ëU¨ñT°êZ»ìVºój…ælŽåhšåq–ìv•ò|•ùaµÙc êe¨ãk§ën¦ô`´âc³ìj¿éb·óg½ósªîp±òw¶õqÊú|Øü‚/f…1h‰6‘7m”;r®"A®"C­$I­%I¬)S«.Zª-_©1i§7z¨4x£EzÂQmòxxù~~1“>¦9…¥>™ŽF˜A’BªªK–­N³O‰·Sž B¥»Y»Ÿxí¬cËÃXƒÅ]»ÓdÜk¼ân‹ÃlÙÔgÅãqÌçtÊùùõŒyüÿÿÿÿÿÿ!ùï!þ# Imported from GIF image: logo.gif,uN‡\VFhN%tH(zcQr%^j#fi$iw+hs,x-*†..“):$1‘,3™-?•/:œ6/=-Ž9/“30‹30Œ22•-<¡H¢Z­f¸$B–+A›+K#Rž0G3S™(B¡-D£(M£*J©#W«,T¥(T¬&W² Z²,R±,^´4K§6[«>Zµ&c®$`´"aº l½(`º)i¼2d¶>mº0t¼jÆkÃmÂxÉuÇvÅwÆtÅxÊ}ÎyÒ|Ò%iÂ,eÁ%pÅ"sÊ"}Ì-qÃ,|Æ)}Ì%|Ò.zÑ2yË8sÅJ-„J,‡K2‰E<™R6”Y?£}>JE¨JUºSJ¶^Q¸Hc¾O½fH²uF®tO¬FlÃHaÅFuÆE|ÊKwÈOvÓViÈ^{ØdRÀfZÑ}}ö‡×Ñ*‰Í'…Ó Ö.ƒÓ#–Ø$—Ù.’Õ+‘Ú1‡Í:‡Ë3ˆ×5Ô=…×=‹Ô3Û:›Û!œä-Ÿâ<Ÿâ%¡Û.¡Ú=¥Ù=®æCƒ·DˆÌF‰ÍGÎH‰ËGŒÑH—ÏB”ÛL•ÔI˜ÑH™ÓLœÕXŒÌPØG™âN•âWŠáB¤ÜN¢ÖL¤ÖL¡ÚK±ÝR ÛR¥ÙT®Û_¥ÞY±Ý_´ßO¦äI¯æF­ñV¡ãV¬æ^ âZ§ëU¨ñT°êZ»ìVºój…ælŽåhšåq–ìv•ò|•ùaµÙc êe¨ãk§ën¦ô`´âc³ìj¿éb·óg½ósªîp±òw¶õqÊú|Øü‚/f…1h‰6‘7m”;r®"A®"C­$I­%I¬)S«.Zª-_©1i§7z¨4x£EzÂQmòxxù~~1“>¦9…¥>™ŽF˜A’BªªK–­N³O‰·Sž B¥»Y»Ÿxí¬cËÃXƒÅ]»ÓdÜk¼ân‹ÃlÙÔgÅãqÌçtÊùùõŒyüÿÿÿÿÿÿþß½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞþ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ;€ïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ9+y|¹z÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{þ÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÀwïÞ½{÷îÝ»wïÞ½£ R·Þ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»mZÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»zîÐÁÓ.U»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îþÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞbÑéΤvïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½Kg$ÆS“ܹk7 žwïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îN,zE«§_ïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïž9 AÄIž?·`ÕBõîÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»þwïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½a‚E•<«ÜõºuëÝ»wïÞ½{÷îšvjDLP³ë5ï`½{ES X8±sNœ\ªÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{ðÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïD BcT’Q®Ôüy÷î×;R|åz#LØtçÞ½{÷îÝ»wïÞ½{'E„#(b(Ùc§Ô©wïÞ½{÷îÝ»wïþÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷î݉ KfÀÙcêO¤ ïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïàˆàCÅ GiäÀy÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½øîÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{GâÄ GòÀYtËÉ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{NWìnM‚`á„‘àÞ½þ{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wï° a‚ 8š:m{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wgøŒRân”»"H  !åÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ|÷îÝ»wïÞ½{÷îÝ»wïhˆ  pÀðôz÷îÝ»wïÞ½{÷îÝ»wïÞ½K "Æ6wîÜñšâþŽ„;м{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ» 1¤ürçÎ’*«î¼{÷›™+¬Þ½{÷î0Z*Ô¹sçÎ(*îÀAp'â]®wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{&"Q7wîºsçn7¯Þ2d‰R­wïÞi‹´ ˆþ0wîܹ+°Ç;äܱx·ëÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïV 3ãnŽ;wîܹs£ -J˜nÑ ‹(ˆ¹sçÎ;a¸X¹sG»*ïàH{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷î wyÔüÉâÎ;wîÜ¡ˆÑKJ™]þîÜiPòÀ;wݹsWŽ×:wî @pçŽÆ»)CÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½³!Ì%5Âh¹sçÎ;wX蘴ëU;wíιsçÎ;wî<•rçÎÝ wîÜ­xÇíÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wܹƒ£ÆÝ.wîÜþ¹sçîÂwn´ËufÐ6wîܹsçŽ&tîÜ•Cáλ"ïÞ•z÷îÝ;€ïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷n7wqãœ;wîܹ!bF Cè Ø)ãbÑ,08`ªáÎ;w'ܹsçnÆ»w ²¼{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ‘pþçÎ 5îÎrçÎ;LQNˆXbÂM-"+Œ,s-\jܹsç®;wîÜx÷î]»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÀwïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ» ܹs×B;wîܹ&g† ÌXa¤ÆDxPÊãŽ×-wîܹsçÎ;w$Þ½{7ëÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îþÝ»wïÞ½{wAš;wî¼IsçÎ;:,ˆH›" 'H@ˆÀâH$oVµãuλvîܹsçN»wï¥y÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷à»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞpçλ<Òܹ›±-DwîP½*‡„’îf¨ ’k’µB½rr€;wîܹ»ðîÝ;±Þ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»þwïÞ½{÷îÝ»wïÞ½{÷î bîܹs‡Ç”Øt¹sçn;tîÜ% çΈ 4Ž(©$I lxF‘pçÎ;w1Þ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{ðÝ»wSar#Â;wî¨]VÀ;:îfµ«âÎ;w| RgÌQ”ÈúSË»_îòœqçÎ]»Uµ¦\rçÎ\Ž$n$ÐþâÊŒ5n¸[rĤE¨Ü€2õîÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÀwïÞ½c@Å;$DH ¡äÂŒN4ݹÕÎW7U¹Ú¹Ó¥&—)R’ì°àÖ‚·n¾Ô¸s玈;wîD@±BÉ“2*½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wï~¹sçÎ4qîÜA`ä‰&;492£‹– w‚Ô¹ãæ"þÇwîܹs×Ë;wîÜÅp÷…„ '̨‘DI˜wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ/wîܹk!Í»"® ˜ƒ &&I\Q’uëU5x´ùäÎ;wîܽºãÎ;wDŽaBŒ :f‘qåÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{‡D;wqçN˜ˆˆ¨pçÍŸþT’xÁÊCãˆîܹsçÎ;)M¦¸s7eÉŒ+îܹ“"‚ Þ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ»wïX‚ʼn#§?ïÞ±¢Õ©Ð“\¸~©z§+Ò˜B—<=rf̘1cÆ1ËVÈÖ¯þwïÞ½{÷îÝ»wïÞ½{ǪѣWžº3f̘1dX| ‹³‰ïÞ½{÷îÝ»wïÞõ*õè%[ª%ÓÔh™1cÆŒkfȧwïÞ½{÷îÝ»wïÞ½{WÈÒ'Ob3f̘1kbœ%3fŒYC‡,±bÕîÝ»wïÞ½øîÝ»wïÞ½;@ƒ m€AF‡R9¹òF9$ùðáÇ>¦‘âÝ»wïÞ½{÷îÝ»w¼þÙĉQdÆVYJf̘1cÆœiÔèÝ»wïÞ½{÷îÝ»wïÞ²Õ*‘dÆŒ;–Œ™3cÆŒS6f“'ZïÞ½{÷îÝ»wïÞ½{÷îÝ»wï*T¨P¡B): Ø£a¡pWb=Id7>|øðáÃȈ%¼{÷îÝ»wïÞ½{§¦Õ£Cž,eC†ÌØ,KËŒ3fÌX²la½{÷îÝ»wïÞ½{÷®Ý«C«Vai†Ì˜1cÈ”13f̘1cÆÀxÚëÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ;a*T¨P¡B… *ì„ —6Yž¸òáÇ>|ø€ðãÄ»wïÞ½{÷þîÝ»w¬2ÔˆfÈŒ!˶K“·dÆŒ3f̘—GïÞ½{÷îÝ»wïÞ½cÕè+KÎŒ3f̲jÖŒ3f̘1oayz÷îÝ»wïÞ½{÷îÝ»wïÞ½{÷îÝ€ *T¨P¡B… øð±&ˆ>|øðáÇd¼{÷îÝ»wïÞ½{÷®Ó!C0Y²f̘1dÌ Ââ̘1cÆŒëbÉÓ«wïÞ½{÷îÝ»w¬Ùò$†™1cÆŒc–è‘1cÆŒ3–,[£Mžv½{÷îÝ»wïÞ½{÷îÝ»wïÞ½{W¡B… *T¨P¡BN>|øðáÇ>|øèQBÄþƒwï¾{÷îÝ»wïÞ­Ût¨‘%N†’3f̘1gÙ²13f̘1cƼ|øðáÇ>ˆñîÝ»wïÞ½{÷îÝ»]cqâä¨K2gÞ²eËæ-[6fÆŒ3fÌX¶B :tè¢1…#æÕfÈŒ3f YµM½¶3f̘1cɬmy4Ë¢C‡ S¨Ð!K®Þ½{÷îÝ»w*T¨P¡B… *TáÇþ>|øðáÆïÞ½{÷îÝ»wïÞýjçÊУY›²!óÆ«V[y¢µ ‹1cÆŒ3æ¬ £DÂ’,Y5,†Úµ™1cÆŒc†…¬KÉ3fÌ2d^=:ÔèÑ!,Î’YÛr¨‘£wïÞ½{÷îÝ‹ *T¨P¡B… *øðáÇ>|èñ¡Ã»wïÞ½{÷îÝ»w½<5z´©ÑgÆ’eã(Ñ¡0™z1†Ì˜1cÆ){ôèQ#,ÉŒCæ,Ë!Kžº3f̘1cÙ´*L3cÆŒ3f¬š˜C5ê’ ™1dͶjôîÝ»wïÞ½{G¡B… *þT¨P¡B…T>|øðáÇo2dy÷îÝ»wïÞ½{÷N §F–.aq–ÌX³,*$†¬FÖ’3f̘1d–liã͘1€ÆŒ!«f¨U"oÆŒ3f Y—M.Áò”Ř1cÆŒKæMŒ-N`¬3fÌX2kX½{÷îÝ»wïÞ½#P¡B… *T¨P¡>|øBÁÄkïÞ½{÷îÝ»wïÞ½k$¦K2cÆŒ3f̲lˆ,añæŒY2cÆŒ3f̘³G›ÀX3fÌX2gÙºdCf̘1cÆŒC†¬š,b²3f̘1cÆŒ{´ L5cÆŒS–mË£wïÞ½{þ÷îÝ»wï:T¨P¡B… *T¨À͇ÃLp@òîÝ»wïÞ½{÷îÝ»w˜²0c–,³eÌ’!C–Í«,ʘ-[¦lÙ²eË–-«öè¬FÌ’%ó&3fË”-[ÆŒY²dÉœYòÄŒ@fË”)[¶l3eË,ñz…ˆY²eÉœÓèÝ»wïÞ½{÷îÝ;sP*T¨P¡B… *HäÃÇÔÞ½{÷îÝ»wïÞ½{÷îÝ,V³1V/2\/5Q5a@F.M.I3F_JZ^GDia[|ECMCDSDIuHWmVPvO„Œ † Œ •˜™ ’ •ˆ“ —œ%¤'«9 †$„&(…%'•(0‡0>Š?¶R°X¸U©dµn½uÆxž©Š»›Ì¹Ú§Û«ÞÂÛÊÞÓæÂéÌèÝõìúóþþŽŸ–1”<¸²$½%ŽAÇ ÆÍÀ%å ìê ðþ!ù!þCreated with The GIMP,þH° Áƒ4@¡Ã‚ XT¹2àáÀî¼ùƒ¦¡ÅƒXÜXcc›4? ð⎚*N¨áQ@eAób”(ˆl d æÍžI–.]ŠtH6ôsT©ÕIzü$°ÉÂMœFVÃ"¢Ô"lÞªÖª£,jÔÆ†AIÛZ”â€ÅndŒ˜‘GRÛKŒ‚œñàƒ6k\t(b¢P[IBBtH‰6jÖÜp H E*QZôãÁ‡/Ú¼ !C Ÿ˜”€‘% ‰%*¹§NL\P¸™2`€#N0Tᡃ9p¤x2…ªT¦(jˆŽ4 s 7²‹BÅžý¦6ÌU˜"ÇΨöíI‰é±õc„´cœ‚_{dìПE¬!Ç'²G ,TwÑ 5|AJƒèp„„€A 'h2`(CPa†P”a ”‚ )œ ñ@Z4@\°…]¬@ÂkBI<„LiÐ €°æ))å”;xcrysden-1.6.2/images/dotV.bmp0000644000175000017500000000017111712736221014735 0ustar tonetone#define dotV_width 1 #define dotV_height 6 static unsigned char dotV_bits[] = { 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, }; xcrysden-1.6.2/images/overstrike.xbm0000644000175000017500000000045611712736221016234 0ustar tonetone#define overstrike_width 16 #define overstrike_height 16 static unsigned char overstrike_bits[] = { 0x00, 0x00, 0xe0, 0x07, 0xf0, 0x0f, 0x30, 0x0c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x1c, 0xf0, 0x0f, 0xe0, 0x07, 0x00, 0x00}; xcrysden-1.6.2/images/sticks_3d.gif0000644000175000017500000000665211712736221015710 0ustar tonetoneGIF89a01÷ù        $+$"'$+ "&-5035;$(%2#, 6 ; ##!" -$)+++ .255<< &) &*5'-8(*6&1>-7<6GLZ7F`:Ic=Pf&`{.`{C DSXZXae zyx,DDDDCBLPSSZZ\[edfh||uu{|CQlM^kGZxJ[qJ]}P_nUh~Zm{ x‡w‘ {’Nc„Wo‡UlŒ^r‚^pawƒh{Œcyœƒ•›…“† ‰£–®›¬Ÿ±›±¢° ®¿²¼¨Â±É ´Ì ¼ÎºÃ½Ç¹Í/­ÄÂÒ ÉÚÃÎÃÕÌÝÅÐÑÞíþíý"Óà#àí/áó7æûm…“k„¡uªt’¤u¯|’£v‘°~›¶~œ¹} ¯y ³^Â×^ÈÞzÈÞŠ1”4ž7¡4«4´ 7¼!<Çm?‚‚ˆˆ’’Ÿž…… Œ$–”(™™&¦›#££®®$±±"³³.¹·(´¹:ŸzÄÃÂÂ-ÈÈ+ÂÂ4ÀÀ8ÎÎ7ÌÌ<ÒÒ*ÛÛ+ÕÕ5ÖÖ=Ýá>áá2åå>íí7îî<ÉÒZÔ×L‚𬀽ƒ¢¾ˆ¡¹¨»†¥ÅŠ©À…²Î•«Åš­Èž·Í—¶Ó›¼×œ¼Ü›¿æ©½Ò¦Á±žÀÓÀÜ‘Îë ÂÖ£ÄÛ«ÆÜ­ËÑ£Äã¦Êâ¦Ëé®Ìà¨Êî®Ôô²Îå²Òæ´Ôì¸Ôé°Öô!ù!þCreator::XCRSYDEN-0.x ,01þþ€` C†dÒ!à'S£ þÀp(!Xá"@0#’§9€Ø+Ö Ä›º$  ’啬*àæ9x0⊫YZ@€'· þð`D•V³º@¨ð)(`€ˆ*^hõ:`@h-_œ €!°ì‚&L€Lðàf\<&LœÑõì@B‰MòÒfNÝ;9œ0“K™32H¬£Æ×°såâ‘ãVªÏ5þvr Q¦Ö0g¾€1k™1b}Þ<Éñ!‡Rìö aL-eÔŽýº•¦L  €Ž6¡Ø}š€4Ì•AA" €8Þôy'J`[Ó‚‘l´é³* _Óþx`¼ˆ“£€ `ÒÔà0çO%JÀ—bÑÎ áÈŸEB€˜jÖÆ@†58î¶¥þ@<ó´U0PöH9Àlùø€ nõà€(âÚ1þ 4øÐ$ϵpõì±€‚E¥2W¯ž¼o¡²¡ƒàÇ¢Mœ:±JÏšMðœb'§ `#H†ê±a!A ˜ØÅîÓ@@ 22°ñþ»k€£MUv à…”@’.ù@#uaâAè(þÔØÁw€;xcrysden-1.6.2/images/zoomdown.gif0000644000175000017500000000242211712736221015665 0ustar tonetoneGIF89aô ((,(@DHøøÈÜÐÐäÐÐàØØèØØàààèðèðèèôèðôðøüøøüø!ù!þ' Imported from GIF image: zoomdown.gif,„ ((,(@DHøøÈÜÐÐäÐÐàØØèØØàààèðèðèèôèðôðøüøøüøþ AAAAAAAA@@ @ @ @ @ @       4H @€ € Aƒ 4hРAƒ <þ @€4h@€ @€€ @€€  @€ @ Á @€ @€ @ƒ @€hð @€ ð  @€< @€,hРAƒ 4hРA€ @€4hРAƒ 4hðÀ @€ @€€4hРAƒ 8x @€@°À4þÐ@ <ð€@@@@ À<ð8<@@@@€8à€8 P@@@@€ PÀ@@@@@ð@@@@@@@<@@@@@@P@@þ@@@@@PÀ@@@@@@@ð@@@@@@@<@@@@@@P@@@@@@@@@@@@@@@@@@@@@@„;xcrysden-1.6.2/images/xcrysden_big.gif0000644000175000017500000003236611712736221016503 0ustar tonetoneGIF89a`n÷Š ]IYe0Yi0Yi8Ym8am8aq8au8iu8aaIaeIaeQiiQimQimYiuAiyAi}Aq}Aq}IqqYquYquayyay}ayyiy}iq‚Iq†IyŽIyŽQy’Q8¦¦Aº¾AÇÏIß熒Q†–Q†–Y†šYŽšYŽžY†‚i††i†‚q††qŽŠqŽŠyŽŽyŽža–’yŽ¢a–¦a–ªa–ªiž®iž²i¦¶q¦ºq¦¾q¦¾y®¾y®Ãy®Çy–’†––†––Žžš†žšŽžžŽžž–¦¢–¦¦–¦¦ž®ªž®®ž®®¦¶²¦¶¶¦¶¶®¾º®¾º¶¾¾¶®Ç†¶Ë†¶Ï†¶Ó†¾Ó†¾ÓŽ¾×Ž¾ÛŽÇÛŽÇß–ÇöÇþÇǾÏ˾Çã–Ïã–Ïç–ÏçžÏëžÏïž×ïž×óž×ï¦×ó¦×÷¦ß÷¦ßû¦ßû®ßÿ®çÿ®ÇÇÇÏËÇÏÏÇÏÏÏ×ÓÇ×ÓÏ××Ï×××ßÛ×ßß×ßßßçãßççßçãççççïëçïïçïëïïïï÷óï÷÷ï÷ó÷÷÷÷ÿû÷ÿûÿ!ù‹!þXCrySDen,`n‡ ]IYe0Yi0Yi8Ym8am8aq8au8iu8aaIaeIaeQiiQimQimYiuAiyAi}Aq}Aq}IqqYquYquayyay}ayyiy}iq‚Iq†IyŽIyŽQy’Q8¦¦Aº¾AÇÏIß熒Q†–Q†–Y†šYŽšYŽžY†‚i††i†‚q††qŽŠqŽŠyŽŽyŽža–’yŽ¢a–¦a–ªa–ªiž®iž²i¦¶q¦ºq¦¾q¦¾y®¾y®Ãy®Çy–’†––†––Žžš†žšŽžžŽžž–¦¢–¦¦–¦¦ž®ªž®®ž®®¦¶²¦¶¶¦¶¶®¾º®¾º¶¾¾¶®Ç†¶Ë†¶Ï†¶Ó†¾Ó†¾ÓŽ¾×Ž¾ÛŽÇÛŽÇß–ÇöÇþÇǾÏ˾Çã–Ïã–Ïç–ÏçžÏëžÏïž×ïž×óž×ï¦×ó¦×÷¦ß÷¦ßû¦ßû®ßÿ®çÿ®ÇÇÇÏËÇÏÏÇÏÏÏ×ÓÇ×ÓÏ××Ï×××ßÛ×ßß×ßßßçãßççßçãççççïëçïïçïëïïïï÷óï÷÷ï÷ó÷÷÷÷ÿû÷ÿûÿþ-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹þ-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ"€‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ"(Sæ,Z´hÑ¢E‹-Z´hÑ¢E‹-Zþ´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÀE‹-Z´hÑ¢E‹-Z´(†’)`òðÄgÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z䢔/uò DˆPŸE‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hþÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-ºà‰“/sø*Dè!>‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´à¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-j`!Æ(_òøI„("D-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢þE‹-j`Á…‘%Sèø!„¨"B„ø,Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-rðÀ…&Qìì)Dˆ!B€ú,ZpÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z À†FžL¡ƒgÏ@}úèY´hÑ¢E‹-Z´hÑ¢E‹þ-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-R°`ABŽ8‰FžX´hÑ¢EJ‰³hÑ¢E‹-Z´hÑþ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E X´hÑ¢E‹Q°`Ë Z´hÑ¢E‹ø`ÅÍ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢EMÀÌÑSgÑ¢E‹-Z´h‘ ,Z´hÑ¢E‹’,Z„ÀÌ¢EK Y´hÑ¢E‹-ZdàD8‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢Eþ‹-Z´h‘%½ÌÉà @‹-Z´¨Ã€-Z´hÑ¢E‹b,Z´èšE‹\x©£gÑ¢E‹-Z´hÑ¢ ¬´Y´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ #Q¾ÜÑh!B„-Z„`E‹-Z´hÑ¢E‹˜,Z´HF#Q.ÜÑ3 E‹-Z´hÑ¢E‹œ°gÑ¢E‹-Z´hÑ¢E‹¢€™3gÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´è‚ $N¾ÐéC!D‡ `Ñ¢E‹-Z´hÑ¢EBþ-Z´H‡%QÔáÏ Cy-Z´hÑ¢E‹-:` ›E‹-Z´hQ €I¢Ì©Ãç >‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´È…F xÁã'¢Dˆ$00`Ñ¢E‹-Z´hÑ¢E„,Z´hÑ-J¦( ãÑ Dˆ -Z´hÑ¢E‹-Z´hÑWÚ,Z´hц"M¾ÌÑӇРC„-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hAF–L¡ã‡P!Bˆ à³hÑ¢E‹-Z´hÑ¢EI-Z´È•J „Á#¨"0ˆZ´hÑ¢E‹-Z´hÑ¢ENdYþ³è‹!N¤ÌɈÐ!Bˆ-Z´hÑ¢E‹-Z´hÑ¢E‹-Z¤ B–@¡£'P Bê³hÑ¢E‹-Z´hÑ"!‹-Z¤À@-3Ž@£¢B ´hÑ¢E‹-Z´hÑ¢E‹-: "KF˜x¡Ó‡P"Dˆâ³hÑ¢E‹-Z´hÑ¢E‹-Z´h‚bi €âCÇF2‹lÄQ²hÑ¢E‹-˜B‡A…B’L¡Ó‡!B…ê³hÑ¢E‹-²hÑ¢,‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢]-Z´h‚ bYâÄ ˜:wôäÉæÎœ/MztY´hÑ¢E1–HRgÁ‚ 1Œ4CgÏ@€âÃgÑ¢E‹-rPdÑþ¢E]-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E@ª,Z´h‘‚ 6¸b„ ”)_èЩC'Ê¢E‹8¡âàÂ0lpñBˆ^IÒd :uöèÙƒgÑ¢E‹-J²hÑ"d-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢EV-Z´hÑ dX¤È&P¤|™2É¢E‹e‘€ƒŒ˜.†8‰â@Ï6Ä‚„I”)`æÔ™CgÑ¢E‹ÅX´hÑ¢k-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢Eþ[-Z´hÑ¢ TÀ°"ˆ$1ôiEÉ¢E‹¹Ø²hQh\Yâ…N `ØCH’%P¤|™&Ê¢E‹-Z²hÑ¢E4Ü,Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢EÈ,Z´hÑ¢E (h°àÂ3Š\àcDÈ¢EN¾ÌÉ“gÑ¢ VÌP…Žž{¦4¸€áE#Iš4âDÉ¢E‹ Y´hÑ¢E9Ö,Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢EÎ,Z´hÑ¢E‹,PР .\ÄÀÐgQ‘&_æèéÐ  0þ1òä Ÿ/ 4hPËEŒ$I‚dÑ¢E‹*Y´hÑ¢E@²,Z´hÑ¢E‹-Z´hÑ"€‹-Z´hÑ¢E‹-Z´hÑ¢E‹L´Y´hÑ¢E‹-R°@Á X¨pá #P¦ÐÉ!B„`p!$Ïœ)t,P°@A… +VĈcÅ¢E‹%Y´hÑ¢E‹€èX´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹p¸Y´hÑ¢E‹-*¢`‚ (X° $NÀÔéC"DˆUÐCÇH'QÀ(X `‚ .\À`aÑ¢E‹„,Z´hÑ¢E‹¶,Zþ´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹xtY´hÑ¢E‹U²hÑ ,Zä BŒ"N¦àშ¢Bˆñ¹°F$M LQ°@À (X `Ñ¢E‹-Y´hÑ¢E‹uY´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹Uñ±hÑ¢E‹-B²hÑ¢Ex-€¦F–L¡ã§¢BˆêSà F0 Ê Y$dÑ¢E‹Š,Z´hÑ¢E‹"œY´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹YY´hþÑ¢E‹ÅX´hÑ¢E.–(˜¢ AƒA’8 ƒÇŸ@€õá³àƒ .„ Ie ’ ‹a€2EÏ¢Eb,Z´hÑ¢E‹> Y´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹uY´hÑ¢E‹5Y´à¢E+Œ4cbiÌ„rBPŸE‹- fÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-ZT¥Ç¢E‹Œ,þZ´hÑ¢E Xp‘€€€(S(X `Á‚0lX±¡N9PXy³hÑ¢ *¬‚$Š1-Z´hÑ¢XÀ Â1Šy±¤É’%‹ Y´hÑ¢E Šì(³hÑ"'´¤yPaÅ‹"H˜8™eŠ‘&‹-Z´ƒÌ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢Fš|™£§Ï @…-Z´h-PÐ`ƒ .^òÂH‘E‡”¬“‡ŸEIQ©²hÑ¢E‹ÈÐҦŠDŒ,qâ¤I@‹-ZTÈ¢E‹.Z´hÑþ¢E‹-Z´hÑ¢E‹-Z´hÑ¢0Œ@™B'O @„Z´Á‹-R°@Á`ÐàÂ…‹E0ŒDipG @„-ª‚cÑ¢Exð,P!…4\Äbĉ‘ B9™BŸ:‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ" 08ƒP¡Dˆ!¢0€€€E‹-Z¤`‚ ,¨ð Â‚ A–@Yp§O B„ê²hQ>‹-Z `ZÖ`pñ"†“E3–H¡s§ B-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´h‘ƒ 0Š4™r‡¢Bˆ 0`Ñ¢Eþ‹-Z´hÑ ,P°Ì BDÓ"D:Ô§ŸE‹-Z´h‚ "¨àr¦‚ƒEŠ,™&BƒÒ³hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢VY2…ŽB…@ˆÏ¢E‹-Z´hÑ¢E‹-Z´hÑ b( Cˆ!"DhÑ¢E‹-Z´èÅ ,€Pc‹š .†8™BgO!Dˆ)´hÑ¢E‹-Z´hÑ¢E‹-Z´h‘ 6Ä@âÌ={ćϢE‹-Z´hÑ¢E‹-Z´hÑ‚bq2ŸB„ "ԇϢE‹þ-Z´ˆÉ¢E‹-Z´(.+†(™f!D…"ÔgÑ¢E‹-Z´hÑ¢E‹-Z´hÑ 0Ä¢¤É€`êÜÙ£g'‹-Z´hÑ¢E‹-Z´hÑ¢ .¸(¢d =| žE‹-Z´ÈÈ¢E‹-Z´hÑ¢ VQ…ΞB„:ТE‹-Z´hÑ¢E‹-Z´hÑ¢E XØCH’&Q¦Ì™S‡E T¨€Ê +\ĈQĈ ¬ˆaDI”)sèäÑÃ'Ï‹-ZTAÈ¢E‹-Z´hÑ¢ 0Ä(âÄ ž=~ˆÏ¢E‹-Zþ´hÑ¢E‹-Z´hÑ¢E 4À°"†%L Hó ”E‹-Z´hÑ¢E‹-Z´hÑ¢ \€1㈒(SÀ̹SçΔ 0`pá"FŒBŒYÒ ” 0¸(’ä À)tèàÑÓg'‹-Z´hÑ¢E‹-Z´hÑ¢E‹(Xà†B$iÒŠ“$‹-Z´hÑ¢E‹-Z´hÑ¢E (¨€ÁE #Jœ@ñ2Ì”&$H cÑ¢E‹-Z´hÑ¢E 8ØðbÈ‘&P¾€©Cç'‹-Z´hÑ¢E‹-Z´hÑ¢E‹,PР… /b1’$ ’dÈ,Z´hþÑ¢E‹-Z´hÑ¢E‹,hpá‚‹F4qÊ##H фĢE‹-Z´hÑ¢E 8¸°âE$MœLùæ $‹-Z´hÑ¢E‹-Z´hÑ¢E‹)X `Á V¸ˆ#†‹Enˆ)³hÑ¢E‹-Z´hÑ¢E‹(XРƒ ,^)‚I’"#FŒ A‚ ‹-Z´hÑ¢E‹,PðÀÂBŒ,iÅI”%‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z¤`‚ 4¸pC…E‹-âp£ ™E‹-Z´hÑ¢E‹FŒX `Á6¸ˆCHŒ#FŒ1‚ þ$-Z´hÑ¢E(X° Âƒ .„A’dI’"‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´HÁ ,P°`Á¢E‹-Z´H1c-Z´hÑ¢#FŒP°@Á T°€áˆ#FŒ1b $HX´hÑ",P°@A6Ä€!$HŒE‹-Z´hÑ¢E‹-Z´hÑ¢E‹-ZpÑ¢E ,P°hÑ¢E‹-Z´hÑ¢Ep˜é²hш#FŒ1bÄ ,P°`Áˆ#FŒ1bĈ$H AbQ-Z´@Á T¨°ÆE‹-Z´hÑ¢E‹þ-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹IÈAfĈ#FŒ1bĈ (X0bĈ#FŒ1bĈ#F a€€‹-Z´h‚ (X  Á¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-ZÔaĈ#FŒ1bĈ#FŒP0bĈ#FŒ1bĈ#FŒ@@€ˆE‹-¸hÑ¢E (X `Ñ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-þZ´(@€#FŒ1bĈ#FŒ1bĈ#FŒ1bĈ#FŒ1@„‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´(@€FŒ1bĈ#FŒ1bĈ#FŒ1bĈ#B„B„‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´(@€ 0bĈ#FŒ1bĈ#FŒ1bĈ!B„þ"„"-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hQ€`Ĉ#FŒ1bĈ#FŒ1bĈ!B„"„"-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hQ€ Àˆ#FŒ1bĈ#FŒ1"Dˆ!B„"„"-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑþ¢E‹.Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢ @€FŒ1bĈ#FŒ"Dˆ!B„"D"D,Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢ @€Œ1bĈ#F„"Dˆ!B„"D"D,Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢þ @€0bĈ!B„"Dˆ!B„"DEˆX´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E @€ Àˆ!B„"Dˆ!B„"Dˆ"DˆX´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E @€ @€!B„"Dˆ!B„"Dˆ"DþˆX´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ"€‹ @€ @€!B„"Dˆ!B„"Dˆ!Dˆ±hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹ @€ @€!B„"Dˆ!B„"Dˆ!Dˆ±hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Zþ´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹ @€ @€!B„"Dˆ!B„"Dˆ!Dˆ±hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÀE‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹ @€ @€B„"Dˆ!B„"Dˆ!Bˆ!bÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-  þ@€ @€B„"Dˆ!B„"Dˆ!Bˆ!bÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-  @€ @€B„"Dˆ!B„`ˆ!B„!BÄ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z @€ @€„"Dˆ!B„"Dˆ!B„!BÄ¢þE‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´(@€ @€„"Dˆ!B„"Dˆ!B„±hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-ZpÑ¢E‹-Z´hÑ¢ @€"Dˆ!B„"Dˆ!B„°hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹þ-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹ @€"Dˆ!B„"Dˆ!,Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹ @€"Dˆ!B„"Dˆ‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-¸hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-þZ´(@€"Dˆ!B„"D€E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hQ€"Dˆ!B„`Ñ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢"Dˆ!B °hÑ¢E‹-Z´hÑ¢E‹-Z´þhÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹ Dˆ!B,Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-  Dˆ‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑþ¢E‹-Z´hÑ¢E‹.Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hQˆE‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢Eþ‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹õ-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ"€‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹;xcrysden-1.6.2/images/italic.xbm0000644000175000017500000000044211712736221015277 0ustar tonetone#define italic_width 16 #define italic_height 16 static unsigned char italic_bits[] = { 0x00, 0x00, 0xe0, 0x1f, 0x80, 0x07, 0x00, 0x03, 0x00, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x60, 0x00, 0xf0, 0x00, 0xfc, 0x03, 0x00, 0x00}; xcrysden-1.6.2/images/xcrysden.gif0000644000175000017500000001543011712736221015653 0ustar tonetoneGIF89aHTö{ ]IYe0Yi0Yi8am8aq8aaIaeIaeQiiQimQimYiuAiyAi}Aq}Aq}IqqYquYquayyay}ayyiy}iq‚Iq†Iy†IyŠIyŠQyŽQ8¦¦Aº¾AÇÏIß熒Q†–YŽžY†‚i††i††qŽŠqŽŠyŽŽyŽža–’y–¦a–ªiž®iž²iž²qž¶q¦ºq¦¾q¦¾y®¾y®Ãy®Çy–’†––†––ŽžšŽžžŽžž–¦¢–¦¦–¦¦ž®ªž®®ž®®¦¶²¦¶¶¦¶¶®¾º®¾º¶¾¾¶®Ç†¶Ë†¶Ï†¾ÓŽ¾×ŽÇߎÇß–ÇöÇþÇǾÏ˾Çã–Ïç–ÏçžÏëž×ïž×óž×ï¦×ó¦×÷¦ß÷¦ßû¦ßû®ßÿ®ÇÇÇÏËÇÏÏÇÏÏÏ×ÓÇ×ÓÏ××Ï×××ßÛ×ßß×ßßßçãßççßçççïëçïïçïëïïïï÷óï÷÷ï÷ó÷÷÷÷ÿû÷ÿûÿ!ù|!þXCrySDen,HT† ]IYe0Yi0Yi8am8aq8aaIaeIaeQiiQimQimYiuAiyAi}Aq}Aq}IqqYquYquayyay}ayyiy}iq‚Iq†Iy†IyŠIyŠQyŽQ8¦¦Aº¾AÇÏIß熒Q†–YŽžY†‚i††i††qŽŠqŽŠyŽŽyŽža–’y–¦a–ªiž®iž²iž²qž¶q¦ºq¦¾q¦¾y®¾y®Ãy®Çy–’†––†––ŽžšŽžžŽžž–¦¢–¦¦–¦¦ž®ªž®®ž®®¦¶²¦¶¶¦¶¶®¾º®¾º¶¾¾¶®Ç†¶Ë†¶Ï†¾ÓŽ¾×ŽÇߎÇß–ÇöÇþÇǾÏ˾Çã–Ïç–ÏçžÏëž×ïž×óž×ï¦×ó¦×÷¦ß÷¦ßû¦ßû®ßÿ®ÇÇÇÏËÇÏÏÇÏÏÏ×ÓÇ×ÓÏ××Ï×××ßÛ×ßß×ßßßçãßççßçççïëçïïçïëïïïï÷óï÷÷ï÷ó÷÷÷÷ÿû÷ÿûÿþ€€þ€€þ€;IUlqq&AJgnuuy€ (?Kisvyxu >Ghqyþ€vyro+DKjlqool€);DIUfkje );CEKKUCþ€);ACFEb  );;+ 5^€5`Pþ€7[+HekqoAZE7_&?Kenquu€ &\Binqq9ZJUj(AJjrzy{=bEUir>xu9[;IUlqurþ€ &Heluuyq ;CVkqrton .+ASkwu:ur€9'=Hfryyyx(>BKUijkeUUgfKUB8&=Fejnoxm ;CVovuuro )>DIKeUH+N+@þ€ESUj&k<@AEFISUUVUf*AHfinool (=@KEH=:R *?CIKTn &+AEKUife &:;K€:AUgpn?Z +>AnE&+AEIKTF J;IUlquuqa &+:l;Iflqny *=?CAþ€P>Hfoyy{uu [ *BTfqtvuu &++)R ;FUpuyvun9<=(CKlszxyqu€ ^ ;BUlrruqoR2TK )?KiuvyxuLa (=BKUikmjFW8Cþ€:E)=EfloqrnS@PW(>CIKfeUPW=+?ETdjklKX%1€ (=@HFIAQ#X>Ho )>CIKUTC>_4 &;=H=Kenj ;FUpl@*>AFFF>aþ€M &H+FTjout+@kA&-;>+PP;EUlyvyu iFAHK B€/X+ESmvyxxo&;@F (5^@+Ke +ASjuuuqqþ€ ;>ECFK:q;Nc:&BKU &=CKdiknk;+*Bgo>PO€ +BS)(>CISgff&&;Hlqluq[,0A (@Hj (=@FHKE9>;Eemy yun_þ€8& &=Hf (;>A@;Y +ESovyUxq_M=+K ((&$Z +>Ifnoroo€9R=:?GJ =[,Z ;@HSgjHi/HUi +=CEH þ€c%]&;@FIUTT8+DUiqru +:?=UCTjmgAR.[;>EHAN:FKkuxuu€ >I:krrv$4u%^*+:;Kennl;DVmyyz(?Kqvyyux.^*ETjouutþ€)BKmsuun >Ffpyvyr@.` +CUkvyyxo )=GSjkonn;FVprutrm0+C€Kmvyvyq+=EHUfgf ((+:>@EH+>HSfinkk"B (=Hfpprqq+>DFKKI &->HJeþ€efK""; ;@HTgkmj ):@AC;c+>DFIHB""""&;?FIUUe &(+( 4€` +;@@@!!!""";>EEIE 3a!! &(!!!!!"""" +:>=-þ€ 6_!!!!!!!!!!!!"""" 4!!!!!!!!!! !!!!!!!!!!"€!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!þ€!!!!!!! !!!!!!!!!!!!! €!!!!!!!!!!! !!!!!!! þ€!!!! ! € þ€  €  þ€ €þ€€þ€€þ€€;xcrysden-1.6.2/images/right.gif0000644000175000017500000000022711712736221015127 0ustar tonetoneGIF87a!!ñÿÿÏ0ÿÿÿ,!!p„©Ë푈 1+½XGd^†#‰ y*¶ŠPJ×tü©ëÎÛøsá C>ʆ¬ý¯¤sérJaEs*µb·Úm¶ëE˜añ±œŸÑêu¸MÈçô+Þ²ãóµ=?ÝæÈ1H(`H˜HظP;xcrysden-1.6.2/images/forward.gif0000644000175000017500000000247711712736221015467 0ustar tonetoneGIF89a!!ñÿøüÿÿÿ!ù!þ& Imported from XPM image: forward.xpm,!!þ€@       €€€þ @€€ @€ @€€ @€@@€ @€ @@@ @€ @€ €  @€ @€ @€ @€ @€ @€0 @€þ@@@@@À@@@@@@@@@@@@ @@@@@@ 00@@@@@@0À@@@@@0@@þ@@@0 @@@@@À0À 0À 0À@ @À@ 0@À @0À@0@0@À0 ê@À0@ ÀÀ 0À @;xcrysden-1.6.2/images/cell.gif0000644000175000017500000000432011712736221014727 0ustar tonetoneGIF89a"%÷÷   ##,, ''**44>> 11 <<""--1166%+"/43 :; 3<###*++ ;;+001//1226<>r//{--CBBEKKHEEKKKOPPSTTU]]YZZAiiOwwOxxUjjc@@`OO`VVoPPuFFzOOeddiddkllpddrrrszzzuu{{{‚‚ ••‹‹ƒƒŒŒ’’šš¢¢¬¬´´$€€*††.ŒŒ ””2‰‰!¦¦!¬¬)  $³³%»»*»»"ÊÊ ÐÐ4ÂÂ3ÑÑ&ââ+ôôC‹‹H‹‹_……@­­hv€€y„„ Œ†Š“‘™!!”--œ++¥ª¤­«!!¬33LL™RR‚xx||žoo—vv–~~£NN´DD»AA£xxºnnÀEEÐVV‚ƒƒ‡ŒŒŠ‹‹‹‹Ÿ‘’’–š••ššš•  ž¤¤›±±«„„ª¼ŽŽºžž¤££«««¤¸¸«±±´««»££´³³³»»º´´º»»¥ÀÀ±ÅűË˾·××Ã¥¥Í¥¥ÁµµÃÁÁÁÏÏËÂÂÌÌÌÊÐÐÖÄÄÔÉÉÕÕÕÖÞÞÚÑÑÚÛÛáÀÀáÎÎêÓÓíÞÞôÂÂòÞÞïëëöööÿÿÿ!ù!þCreator::XCRSYDEN-0.x ,"%þ € @ 6wÛN€Ä1bÓˆ‘ئ@ÁgbX+`„´<`€™aw $±“  € >|~lÀ²$Z.þ H⌙5yH¸À† €êVué¤Ë(k¶‘V+S@ U\tYCõ U.Y 2 €ØC¢Œ#C¨”(‡æ@ªW¢D%À£lxp";hÐ`ñfܸÂ"À I>LóÀ*&Ä 0áAµP @€†é@™´€¶.¸˜Ñ£Ç‹5í%‚4HМX\¸pA0ìÞ€1* ‚£Ñ ôÀâ²Í6iôéÔ¢€øè!(„©kßÔ0àΞeäFPÚò l„1€‚Ø7ÝŠ1˜(S¬BbÂ’‘‰bؤ¥ €€;xcrysden-1.6.2/NEWS0000644000175000017500000001544013555525332012566 0ustar tonetoneVersion: 1.6: ------------- * "Reload" button added to the main window (at the bottom toolbar) that reloads the structure from file; useful for structure building * lattice-vector reduction (Wigner-Seitz cell and Brilluouin-zone were incorrect for non-reduced lattice-vectors) * compatibility with Quantum ESPRESSO (QE) 6.x, in particular: - display of structures from neb.x input file - aware of the new ibrav lattice definitions of QE (e.g. negative ibrav and ibrav=91); - display of conventional cell-mode for centered lattice display from pw.x output - compatible with "ATOMIC_POSITIONS (crystal_sg)" specs, but it needs pw.x on $PATH * compatibility with CRYSTAL17 * ported to Tcl/Tk-8.6 (thanks to Julien Lefevre) and Togl-2.0 * because the API of Togl2.0 changed, the syntax of *.xcrysden scripts changed as well (for the Togl part); old *.xcrysden scripts can be loaded with --os or --oldscript command line option * Togl options can be specified in ~/.xcrysden/custom-definitions file (e.g. if xcrysden crashes with "X Error of failed request: ...", try setting "set toglOpt(accum) false"; but beware that this disables anti-aliasing) * if "Print To File" produces blank images, add "set printSetup(dumpWindow) 1" to ~/.xcrysden/custom-definitions file * correct illumination of isosurfaces even if the DATAGRID box is left-oriented (cube files in Gaussian use left-oriented boxes); * new "File-->Save Current State" menu entry. It saves only a display "state" of the currently displyed structure; this is useful for scripting (see below item) * new "--print" command line option for batch printing. This is useful within the shell scripts to achieve "automatic" printing. Example: xcrysden --xsf file.xsf --script state.xcrysden --print file.png * bug-fix: Wien2K examples (File-->XCrySDen Examples ...-->WIEN2K Struct Files) did not work if xcrysden was installed to read-only path Version: 1.5: ------------- * display of structure from Orca output * new Movie-Maker: xcrysden allows for real-time capture of display. Three modes are supported: "real-time capture", "every redisplay", and "manual". * several movie encoders are supported, in particular - for Animated-GIF: convert (from ImageMagick), gifsicle, and whirlgif; convert is used by default. - for AVI/MPEG: mencoder (from mplayer) and ppmtompeg. Mencoder is used by default. * better algorithm for isosurface shading (nicer surfaces) * no more external package specifications in ~/.xcrysden/custom-definitions, due to automatic package finding mechanism. The only exception is the CRYSTAL package (http://www.crystal.unito.it/), which still needs to be explicitly defined. * customization of Fermi surface viewer is possible in ~/.xcrysden/custom-definitions * new command-line option --custom for reading customization from specified file * compatibility with Quantum-Espresso 5.x, WIEN2k_08+, and CRYSTAL14 * XCRYSDEN_TOPDIR and XCRYSDEN_SCRATCH environmental variables are not required anymore. The use of the former is deprecated and the latter is set to /tmp if unspecified. * the use of "xcConfigure" is deprecated * "make install" now installs the package system-wide (see README file for more details). * ~/.xcrysden/Xcrysden_resources is used instead of ~/.xcrysden/Xcrysden_defaults. This is due to a new font handling mechanism in The Tcl/Tk 8.5, which makes the fonts as specified by old ~/.xcrysden/Xcrysden_defaults to look pretty ugly. * improved measurement procedure: the selection of atoms is more precise (i.e. easier) and the coordinates of mouse-click selected atoms can be displayed in Angstrom, Bohr, crystal-primitive, crystal-conventional, and alat units. Measured distances are reported also in bohr units, and the printout format of measured distances and angles is configurable * adding mouse-wheel support for display-zooming (I finally got a mouse with a wheel). * a "stop-playing" button added to animations control window * crystal borders are displayed by default for periodic structures * checking for stale files in $XCRYSDEN_SCRATCH (prompts the user for their deletion) * only one flavor of source package (external library sources are download and compiled on request) * many bug fixes * for further information, see ChangeLog Version: 1.4: ------------- * automatic labeling of k-points for k-path selection (thanks to Peter Blaha) * Stereo display mode (thanks to Gerardo Ballabio) * Anaglyph display mode, i.e., fake stereo, requires red-blue glasses (thanks to Eric VERFAILLIE) * a few Bug fixes in visualization of Fermi surfaces (thanks to Pablo de la Mora) * improved EPS printing (also PDF printing) thanks to new gl2ps-1.2.4. The vectorial EPS printing of Lighting-On mode is finally good enough. * comments added to the XSF format; comment-lines start with the "#" character and can be located only in between the sections, but within a given section. Version: Beta-1.2 ----------------- * improved visualization of Fermi surfaces (a few Bug fixes; thanks to Pablo de la Mora) * visualization of vector-fields * dummy "X" atom does not have bonds anymore * multi-band display of Fermi surfaces in one widget * added support for CRYSTAL03 * more configurable options for forces (color, thickness) * Coordinate system color is configurable Version: Beta-1.0 ----------------- * XCRYSDEN covered by GNU GENERAL PUBLIC LICENSE * XCRYSDEN ported to MAC OSX (requires Xserver) * XCRYSDEN ported to MS-Windows (under CYGWIN). Does not require X-server, but require CYGWIN (http://www.cygwin.com/). * Visualization of H-bonds (lighting-on mode only). * Update of the PWscf IO filters (compatible with PWscf v.2.0). * XCRYSDEN interface was mad compatible with CRYSTAL03 * Simple bond editing: the covalent-radius item (Modify-->Atomic Radius menu) has been split into covalent- and display-radius items. By changing the covalent radii of given atomic types the display of bonds can be altered. * Improved "Save Current State and Structure" mechanism. * XCRYSDEN can be embedded in an another aplication's window by using --use option, i.e., "xcrysden --use window-id". * Adding reduce "-r" option to reduce the dimensionality of the structure (works for XSF file only): "xcrysden -r 2 --xsf file.xsf" will display the structure from file.xsf as slab (dim=2) even if it was specified as crystal (dim=3) in file.xsf * Visualization of Fermi surfaces a bit improved * Some bug fixes ... * Fixing bug for transformation of selected k-points to WIEN2k format (fixed by Florent Boucher). BEWARE: it seems this transformation remains buggy. Use at your own risk, and please, check carefully every time the resultant klist file: the program prints some useful supporting information during the transformation to WIEN2k format. xcrysden-1.6.2/README0000644000175000017500000001565713522751422012754 0ustar tonetone________________________________________________________________________ * * * README & INSTALL file for XCRYSDEN * * * ________________________________________________________________________ XCrySDen web site is http://www.xcrysden.org/. The code can be downloaded either as source or compiled package. The pre-compiled package is available in two flavors for GNU/Linux, named as shared and semishared. Both packages use dynamic (i.e. shared) libraries, the difference being that the semishared package has several needed shared libraries included within itself (i.e. Tcl/Tk, Togl, Mesa, Glu. and FFTW), thus hopefully diminishing the software requirements. XCRYSDEN may be included in several OS distributions, hence you may first check if it exists for your distribution. If it does then it is recommended to use it (e.g. on GNU/Linux Debian based system you can install xcrysden as: sudo apt install xcrysden). If xcrysden is not available for your distribution, then read below instructions how to compile the source package. ________________________________________________________________________ INSTALLATION INSTRUCTIONS ________________________________________________________________________ 1. Installing the compiled package 2. User customization 3. Compiling the source package ________________________________________________________________________ 1.) HOW TO INSTALL THE COMPILED PACKAGE ________________________________________________________________________ The compiled package does not require the compilation, hence its installation is fairly simple. -- FOR IMPATIENT: minimal installation instructions -- 1. unpack the xc-VERSION.tar.gz package file e.g., as: tar zxvf xc-VERSION.tar.gz or: gunzip -c xc-VERSION.tar.gz | tar xvf - 2. cd into the so-created directory (i.e., cd xcrysden-VERSION/) 3. launch the program as "./xcrysden" Starting from XCrySDen-1.5, the use of XCRYSDEN_TOPDIR environmental variable is deprecated, because it was a source of confusion for many users. Consider to unset it in case it was defined during the installation of previous versions. Optionally, XCRYSDEN_SCRATCH environmental variable can be defined. It is the place where XCrySDen writes scratch (temporary) files. If the variable is not defined the /tmp/ directory will be used. BEWARE: If an older XCrySDen version is already installed and XCRYSDEN_TOPDIR variable defined then you need to manually unset (or update) the XCRYSDEN_TOPDIR variable definition in your profile !!! ________________________________________________________________________ 2.) USER CUSTOMIZATION ________________________________________________________________________ XCrySDen can be user-customized manually. For this reason create $HOME/.xcrysden/ directory and copy the "Tcl/custom-definitions" and optionally "Tcl/Xcrysden_resources" there (the Tcl/ is a subdirectory in the XCrySDen root directory). These can be then modified according to user preference. Starting from XCrySDen-1.5, the use of './xcConfigure' is deprecated (it has caused more problems than advantages). For more info about customization, see: http://www.xcrysden.org/doc/custom.html ________________________________________________________________________ 3.) HOW TO COMPILE THE SOURCE PACKAGE ________________________________________________________________________ 3.1 SOFTWARE REQUIREMENTS: XCrySDen depends on several libraries, in particular: - Tcl/Tk - OpenGL (e.g., Mesa and Glu) - Togl (2.0 or later) - FFTW3 - BWidget The compilation of XCrySDen requires the development versions of these and other libraries (see system/README), because not only the library files, but also their header files are required. To aid at easier compilation, these libraries will be automatically downloaded from the web if so instructed (see below). Alternatively, these can be download from: Tcl/Tk: http://prdownloads.sourceforge.net/tcl/ Mesa: ftp://ftp.freedesktop.org/pub/mesa/ Togl: https://sourceforge.net/projects/togl/files/Togl/2.0/ FFTW: http://www.fftw.org/download.html BWidget: http://sourceforge.net/projects/tcllib/files/BWidget/ In addition to these libraries, also the X11 libraries are needed for compilation. [ NOTICE: during the compilation the required BWidget package (small size) will be always automatically donwloaded from: http://sourceforge.net/projects/tcllib/files/BWidget/ ] 3.2 COMPILATION: First read the system/README file. It is the easiest to compile the shared version of xcrysden (because it is more easy to install software dependencies with a package manager system, such as apt or dnf, then to compile needed libraries from sources). To compile XCrySDen sources the "Make.sys" file must exist in the package root directory. Templates can be find in system/ sub-directory. Copy an appropriate template file as, e.g.: $ cp ./system/Make.sys-shared Make.sys and edit the "Make.sys" to suit your needs. If you want the compilation to automatically download and compile the external library sources (Tcl/Tk, Mesa, Togl, FFTW) define "COMPILE_ALL = yes" (see system/Make.sys-semishared for more details). Then compile as: $ make all If everything went well and compilation was fully successful, you have a usable xcrysden. Try: ./xcrysden; if it works that's it. To make xcrysden loadable from a terminal, you can create an alias (e.g. alias xcrysden=$XCRYSDEN_TOPDIR/xcrysden) or make a symbolic link so that xcrysden will be on your PATH (e.g. ln -s $XCRYSDEN_TOPDIR/xcrysden /usr/local/bin), where $XCRYSDEN_TOPDIR is the root directory of xcrysden. 3.3 INSTALLING SYSTEM WIDE (shared flavor only): XCrySDen (shared-flavor of compilation only) can be installed system-wide as: $ make install By default this will install the package into /usr/local/. The installation directory can be changed by invoking "make install" as: $ prefix=/MY/INSTALLATION/DIR make install where /MY/INSTALLATION/DIR stands for installation directory. This will install the package into ($prefix/bin/xcrysden, $prefix/lib/xcrysden/, $prefix/share/xcrysden/). 3.4 TROUBLE SHOOTING: If the installation has failed for some reason then read the printed error message. Also read carefully the instructions inside the "Make.sys" and edit the file according to your needs. The most often cause of failure is that either some header files were not found or that there are some missing references, which means that the code will have to be linked against additional libraries. If the failure appeared in compilation of external library, then try to compile this library manually, i.e., do "cd external/src/LIB", where LIB is the corresponding library directory, and read the installation instructions therein. In case of unsolvable problems, first google for help and only then ask for help on XCrySDen mailing list (xcrysden@democritos.it, http://www.democritos.it/mailman/listinfo/xcrysden). -- Anton Kokalj (tone.kokalj@ijs.si), Thu Aug 8 2019xcrysden-1.6.2/make.include0000644000175000017500000000337413522476003014346 0ustar tonetone# program for fetching external library sources from the web # (the usage is: $(DOWNLOAD) url) DOWNLOAD = wget # Tcl/Tk version & download info TCL_MAJOR_VERSION = 8 TCL_MINOR_VERSION = 6 TCL_RELEASE_SERIAL = 9 TCL_VER2 = $(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION) TCL_VER3 = $(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION).$(TCL_RELEASE_SERIAL) TCL_TGZ = tcl$(TCL_VER3)-src.tar.gz TK_TGZ = tk$(TCL_VER3)-src.tar.gz TCL_URL = http://prdownloads.sourceforge.net/tcl # Mesa (and Glu) version & download info MESA_VER = 18.3.6 MESA_TGZ = mesa-$(MESA_VER).tar.gz MESA_URL = ftp://ftp.freedesktop.org/pub/mesa GLU_VER = 9.0.1 GLU_TGZ = glu-$(GLU_VER).tar.gz GLU_URL = $(MESA_URL)/glu # Tgol version & download info TOGL_VER = 2.0 TOGL_TGZ = Togl$(TOGL_VER)-src.tar.gz TOGL_URL = https://sourceforge.net/projects/togl/files/Togl/$(TOGL_VER) # FFTW version & download info FFTW_VER = 3.3.8 FFTW_TGZ = fftw-$(FFTW_VER).tar.gz FFTW_URL = http://www.fftw.org # Meschach version & download info MESCHACH_VER = 1.2 MESCHACH_TGZ = mesch12b.tar.gz MESCHACH_URL = http://www.math.uiowa.edu/~dstewart/meschach # Bwidget version BWIDGET_VER = 1.9.13 BWIDGET_TGZ = bwidget-$(BWIDGET_VER).tar.gz BWIDGET_URL = http://sourceforge.net/projects/tcllib/files/BWidget/$(BWIDGET_VER) # ---don't-touch--------------------------------------------------------- TCL_DOWNLOAD = $(TCL_URL)/$(TCL_TGZ) TK_DOWNLOAD = $(TCL_URL)/$(TK_TGZ) MESA_DOWNLOAD = $(MESA_URL)/$(MESA_TGZ) GLU_DOWNLOAD = $(GLU_URL)/$(GLU_TGZ) FFTW_DOWNLOAD = $(FFTW_URL)/$(FFTW_TGZ) MESCHACH_DOWNLOAD = $(MESCHACH_URL)/$(MESCHACH_TGZ) BWIDGET_DOWNLOAD = $(BWIDGET_URL)/$(BWIDGET_TGZ) TOGL_DOWNLOAD = $(TOGL_URL)/$(TOGL_TGZ) # ----------------------------------------------------------------------- xcrysden-1.6.2/F/0000755000175000017500000000000013556022211012235 5ustar tonetonexcrysden-1.6.2/F/atomlab.f0000644000175000017500000001262711712736221014040 0ustar tonetone PROGRAM ATOMLAB C PROGRAM FOR FINDING LABEL OF ATOM TO BE SUBSITUTED/REMOVED C ATOMSUBS, ATOMREMO OPTIONS C USAGE: atomlab C C type == 1 return atomlabel C type == 2 take coordinates of added atom and translate it to cell 0 C C FILE1: gengeom file (UNIT 11) C FILE2: file where NAT X Y Z are writen (STDIN) C C cr98: fourth argument is present if CRYSTAL version is 98 or newer; C read coorinates rather from unit33 IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' INTEGER NAT(NAC) REAL*8 X(NAC),Y(NAC),Z(NAC),DVEC(3,3),IDVEC(3,3) REAL*8 A(NAC),B(NAC),C(NAC),MINDIS2,MINTOL CHARACTER*80 FILE1,FILE2 CHARACTER ARG1 COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR COMMON/IVEC/ IDVEC COMMON/BOHRR/ BOHR,IMODE3 !this is not used, but is needed because !this program uses readf1 routine PARAMETER (MINTOL=1.D-4) c this is just because of common/bohrr/ IMODE3=0 BOHR=0 C TYPE OF RUN C 1 ... return atom label C 2 ... return atom coordinates after translation to basic cell CALL GETARG(1,ARG1) c 2nd argument CALL GETARG(2,FILE1) OPEN(UNIT=11,FILE=FILE1,STATUS='OLD') C read GENGEOM FILE CALL READF1('DIM-GROUP',IGROUP,IDIM) CALL READF1('PRIMVEC',0,IDIM) CALL READF1('RECIP-PRIMVEC',0,IDIM) CALL READF1('PRIMCOORD',0,IDIM) CLOSE(11) c 3rd argument CALL GETARG(3,FILE2) OPEN(UNIT=13,FILE=FILE2,STATUS='OLD') C read FILE2 READ(13,*) ATN,XS,YS,ZS CLOSE(13) c 4th argument C does FOURTH ARGUMENT exists if (Iargc() .eq. 4) then C read XYZ coordinates form unit 33 (XYZ format file) Call ReadXYZ(NATR, NAT, X, Y, Z) endif C from XYZ coordinates to ABC coordinates of primitiv cell DO I=1,NATR IF(IDIM .eq. 1) A(I)=X(I)*IDVEC(1,1) IF(IDIM .eq. 2) THEN A(I)=X(I)*IDVEC(1,1)+Y(I)*IDVEC(2,1) B(I)=X(I)*IDVEC(1,2)+Y(I)*IDVEC(2,2) ENDIF IF(IDIM .eq. 3) THEN A(I)=X(I)*IDVEC(1,1)+Y(I)*IDVEC(2,1)+Z(I)*IDVEC(3,1) B(I)=X(I)*IDVEC(1,2)+Y(I)*IDVEC(2,2)+Z(I)*IDVEC(3,2) C(I)=X(I)*IDVEC(1,3)+Y(I)*IDVEC(2,3)+Z(I)*IDVEC(3,3) ENDIF ENDDO IF(IDIM .eq. 1) THEN AS=XS*IDVEC(1,1) ELSEIF(IDIM .eq. 2) THEN AS=XS*IDVEC(1,1)+YS*IDVEC(2,1) BS=XS*IDVEC(1,2)+YS*IDVEC(2,2) ELSEIF(IDIM .eq. 3) THEN AS=XS*IDVEC(1,1)+YS*IDVEC(2,1)+ZS*IDVEC(3,1) BS=XS*IDVEC(1,2)+YS*IDVEC(2,2)+ZS*IDVEC(3,2) CS=XS*IDVEC(1,3)+YS*IDVEC(2,3)+ZS*IDVEC(3,3) ENDIF C now we must relate (AS,BS,CS) to one of (A(i),B(i),C(i)) C translate (AS,BS,CS) in the first cell IF(IDIM .gt. 0) AS=AS-DBLE(NINT(AS)) !AS is between [-0.5,0.5] IF(IDIM .gt. 1) BS=BS-DBLE(NINT(BS)) IF(IDIM .gt. 2) CS=CS-DBLE(NINT(CS)) IF(IDIM .eq. 1) XS=AS*DVEC(1,1) IF(IDIM .eq. 2) THEN XS=AS*DVEC(1,1)+BS*DVEC(2,1) YS=AS*DVEC(1,2)+BS*DVEC(2,2) ENDIF IF(IDIM .eq. 3) THEN XS=AS*DVEC(1,1)+BS*DVEC(2,1)+CS*DVEC(3,1) YS=AS*DVEC(1,2)+BS*DVEC(2,2)+CS*DVEC(3,2) ZS=AS*DVEC(1,3)+BS*DVEC(2,3)+CS*DVEC(3,3) ENDIF C IF TYPE OF RUN IS 2 --> RETURN (AS,BS,CS) IF(ARG1.EQ.'2')THEN WRITE(6,'(3(F18.10,2x))') XS,YS,ZS GOTO 1000 ENDIF c print *,'as,bs,cs',as,bs,cs MINDIS2=3.0d0 !this is maximum DSQRT(distance) within one cell DO I=1,NATR C in CRYSTAL95 all coordinates of non-equivalent atoms in primitiv C cell are within [-0.5,0.5], but because of roundoff error something C that is actually a little lower than 0.5 became a litle greter than 0.5 C and instead of ~0.5 we get ~-0.5 -> CHECK THAT C THIS WILL BE CHECKED BY NEAREST DISTANCE (THIS IS SIMILAR TO MC C BOUNDARY CONDITIONS) IF (IDIM .eq. 0) THEN ADIS2=(X(i)-XS) * (X(i)-XS) BDIS2=(Y(i)-YS) * (Y(i)-YS) CDIS2=(Z(i)-ZS) * (Z(i)-ZS) ENDIF IF (IDIM .eq. 1) THEN ADIS2=DISTANCE2(A(i),AS) BDIS2=(Y(i)-YS) * (Y(i)-YS) CDIS2=(Z(i)-ZS) * (Z(i)-ZS) ENDIF IF (IDIM .eq. 2) THEN ADIS2=DISTANCE2(A(i),AS) BDIS2=DISTANCE2(B(i),BS) CDIS2=(Z(i)-ZS) * (Z(i)-ZS) ENDIF IF (IDIM .eq. 3) THEN ADIS2=DISTANCE2(A(i),AS) BDIS2=DISTANCE2(B(i),BS) CDIS2=DISTANCE2(C(i),CS) ENDIF DIS2=ADIS2+BDIS2+CDIS2 c print *,'dis2=',dis2 IF(DIS2.LT.MINDIS2)THEN MINDIS2=DIS2 LABEL=I ENDIF ENDDO c print *,mindis2,mintol C DSQRT(MINDIS2) MUST BE LOWER THAN MINTOL, OTHERWISE WE DIDN'T FIND C APPROPRIATE ATOM NAT100 = NAT(LABEL) - INT(NAT(LABEL)/100)*100 ! ATN is within [0..99], so should be NAT100 IF(DSQRT(MINDIS2).LT.MINTOL.AND.NAT100.EQ.ATN)THEN WRITE(6,*) LABEL ELSE STOP 'WARNING: no appropriate atom was found !!!!' ENDIF 1000 CONTINUE END c get the square of distance REAL*8 FUNCTION DISTANCE2(A1,A2) REAL*8 A1,A2 IF(DABS(A1-A2).GT.0.5d0)THEN DISTANCE2=(1.0d0-DABS(A1-A2))*(1.0d0-DABS(A1-A2)) ELSE DISTANCE2=(A1-A2)*(A1-A2) ENDIF RETURN END xcrysden-1.6.2/F/fsReadBXSF.f0000644000175000017500000000274511715231354014310 0ustar tonetonec c reads BXSF file (BEGIN_BLOCK_BANDGRID3D section) and write c ordinary XSF file with lattice vectors and BZ c program fsReadBXSF implicit none c c Usage: fsreadBXSF input output c character line*80, input*256, output*256 logical finished REAL*8 invvec(3,3), dir(3,3), vec(3,3), o1, o2, o3 integer string_length, i, j, k, iband finished=.false. if (iargc().ne.2) then write(*,*) 'Usage: fsreadBXSF input output' stop endif call getarg(1,input) call getarg(2,output) open(unit=11, file=input, status='old') open(unit=12, file=output, status='unknown') do while (.not.finished) read(11,'(a20)') line i = string_length(line) if ( line(1:11) .eq. 'BANDGRID_3D' $ .or. line(1:17) .eq. 'BEGIN_BANDGRID_3D' ) then read(11,*) iband read(11,*) i, j, k read(11,*) o1, o2, o3 read(11,*) ((invvec(i,j),j=1,3),i=1,3) finished=.true. endif enddo call ZeroMat (dir, 3, 3) call InvertSqMat123 (invvec, dir, 3) call MatTranspose (dir, vec, 3, 3) write(12,*) 'DIM-GROUP' write(12,*) '3 1' call WVec ('PRIMVEC', vec) call WVec ('RECIP-PRIMVEC', invvec) call WignerSeitz(invvec, 'BRILLOUIN-ZONE-PRIMCELL') write(12,*) 'PRIMCOORD' write(12,*) '1 1' write(12,*) '1 0.0 0.0 0.0' END xcrysden-1.6.2/F/readf1.f0000644000175000017500000001340011715231102013540 0ustar tonetone SUBROUTINE READF1(ARG,IGROUP,IDIM) C THIS ROUTINE READS "GENGEOM" FILE IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' CHARACTER*(*) ARG CHARACTER*20 ARGM(12),CARG REAL*8 X(NAC),Y(NAC),Z(NAC),DVEC(3,3),IDVEC(3,3), 1 TMPVEC(3,3),XC(NAC,4),YC(NAC,4),ZC(NAC,4),fv(NAC,3) INTEGER NAT(NAC) !I THINK NAC ATOMS PER CELL IS MORE THAN ENOUGH CHARACTER*256 LINE LOGICAL notfound, Lprimvec COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR COMMON/FV/ FV,NFV COMMON/IVEC/ IDVEC COMMON/BOHRR/ BOHR,IMODE3 COMMON/KEYWORD/ notfound, Lprimvec include 'mode.inc' PARAMETER (NARGM=12) DATA ARGM/'DIM-GROUP','MOLECULE','POLYMER','SLAB','CRYSTAL', $ 'PRIMVEC','CONVVEC','PRIMCOORD', * 'CONVCOORD','RECIP-PRIMVEC','RECIP-CONVVEC','SYMMOP'/ notfound = .false. IND=999 C ********* REWIND 11 C ********* LARG=INDEX(ARG,' ')-1 IF(LARG.EQ.-1)LARG=LEN(ARG) DO I=1,NARGM CARG=ARGM(I) LCARG=INDEX(CARG,' ')-1 c print *,'carg=',carg(1:5),'|' IF(CARG(1:LCARG).EQ.ARG(1:LARG)) THEN IND=I GOTO 1 ENDIF ENDDO c ********************************************************** WRITE(6,*) 'READF1> KEYWORD ', ARG, ' NOT KNOWN!!! ' STOP c ********************************************************** c is desired keyword present in the file 1 CONTINUE c DEBUG_BEGIN c READ(UNIT=11,FMT=*,END=99) CARG READ(UNIT=11,FMT='(a20)',END=99) CARG i = string_length(carg) c DEBUG_END LCARG=INDEX(CARG,' ')-1 c print *,'|',carg(1:lcarg),'|' IF(CARG(1:LCARG).NE.ARG(1:LARG)) GOTO 1 GOTO(5,6,7,8,9,10,15,20,25,35,45,999) IND 99 continue c **************************** c this is nasty, but necessary c **************************** if ( arg(1:7) .eq. 'CONVVEC' ) then WRITE(12,'(1x,a)') 'CONVVEC' WRITE(12,'(3(1x,f15.10)/3(1x,f15.10)/3(1x,f15.10))') 1 ((DVEC(J,I),I=1,3),J=1,3) endif notfound=.true. 999 RETURN C READ DIMENSION & GROUP NUMBER 5 CONTINUE READ(11,*) IDIM,IGROUP WRITE(12,'(1x,a)') 'DIM-GROUP' WRITE(12,*) IDIM,IGROUP RETURN C keyword MOLECULE 6 CONTINUE IDIM=0 IGROUP=1 RETURN C keyword POLYMER 7 CONTINUE c WRITE(12,'(1x,a)') 'POLYMER' IDIM=1 IGROUP=1 WRITE(12,'(1x,a)') 'DIM-GROUP' WRITE(12,*) IDIM,IGROUP RETURN C keyword SLAB 8 CONTINUE c WRITE(12,'(1x,a)') 'SLAB' IDIM=2 IGROUP=1 WRITE(12,'(1x,a)') 'DIM-GROUP' WRITE(12,*) IDIM,IGROUP RETURN C keyword CRYSTAL 9 CONTINUE c WRITE(12,'(1x,a)') 'CRYSTAL' IDIM=3 IGROUP=1 WRITE(12,'(1x,a)') 'DIM-GROUP' WRITE(12,*) IDIM,IGROUP RETURN 10 CONTINUE WRITE(12,'(1x,a)') 'PRIMVEC' GOTO 16 15 CONTINUE WRITE(12,'(1x,a)') 'CONVVEC' 16 CONTINUE C READ CELL VECTORS READ(11,*) ((DVEC(J,I),I=1,3),J=1,3) IF(IMODE3.EQ.M3_BOHR)THEN !convert from borh to angstroms DO I=1,3 DO J=1,3 DVEC(J,I) = BOHR * DVEC(J,I) ENDDO ENDDO ENDIF c make the VECTORS consistent with dimenison call DIMIFY_VEC(DVEC,IDIM) WRITE(12,'(3(1x,f15.10)/3(1x,f15.10)/3(1x,f15.10))') 1 ((DVEC(J,I),I=1,3),J=1,3) C *** sometimes we will need inverse matrix of DVEC *** call InvertSqMat123(dvec,idvec,3) RETURN 20 CONTINUE WRITE(12,'(1x,a)') 'PRIMCOORD' READ(11,*) NATR,NCELL WRITE(12,*) NATR,NCELL c print *,'natr=',natr,'; ncell=',ncell DO I=1,NATR C ALL NAT(I,*) ARE THE SAME -> SO NAT(I) 777 continue read(11,'(a)') line c print *,'line=',line,'|' nf=iCountFields(line) if (nf.lt.1) goto 777 NFV=nf-4 read(line,*) NAT(I),X(I),Y(I),Z(I), (fv(i,j), j=1,NFV) IF(IMODE3.EQ.M3_BOHR) THEN X(I) = X(I) * BOHR Y(I) = Y(I) * BOHR Z(I) = Z(I) * BOHR ENDIF WRITE(12,'(i3,3x,6(f15.10,2x))') NAT(I),X(I),Y(I),Z(I), $ (fv(i,j), j=1,NFV) ENDDO RETURN 25 CONTINUE c ******** c CONVCOOR c ******** if (.not.Lprimvec) WRITE(12,'(1x,a)') 'PRIMCOORD' C READ COORDINATES READ(11,*) NATR,NCELL if (.not.Lprimvec) WRITE(12,*) NATR, ' 1' c print *,'natr=',natr,'; ncell=',ncell DO I=1,NATR DO J=1,NCELL C ALL NAT(I,*) ARE THE SAME -> SO NAT(I) READ(11,*) NAT(I),XC(I,J),YC(I,J),ZC(I,J) IF(IMODE3.EQ.M3_BOHR) THEN XC(I,J) = XC(I,J) * BOHR YC(I,J) = YC(I,J) * BOHR ZC(I,J) = ZC(I,J) * BOHR ENDIF if (.not.Lprimvec) WRITE(12,'(i3,3x,3(f15.10,2x))') $ NAT(I),XC(I,J),YC(I,J),ZC(I,J) ENDDO if(.not.Lprimvec) then x(i) = xc(i,1) y(i) = yc(i,1) z(i) = zc(i,1) endif ENDDO RETURN 35 CONTINUE WRITE(12,'(1x,a)') 'RECIP-PRIMVEC' GOTO 46 45 CONTINUE WRITE(12,'(1x,a)') 'RECIP-CONVVEC' 46 CONTINUE C READ RECIPROCAL VECTORS: they are written in normal form, C but should be read in TRANSPOSE form; take care READ(11,*) ((IDVEC(J,I),J=1,3),I=1,3) IF(IMODE3.EQ.M3_BOHR)THEN !convert from borh to angstroms DO I=1,3 DO J=1,3 IDVEC(J,I) = BOHR * IDVEC(J,I) ENDDO ENDDO ENDIF WRITE(12,'(3(1x,f15.10)/3(1x,f15.10)/3(1x,f15.10))') $ ((IDVEC(J,I),J=1,3),I=1,3) RETURN C *** sometimes we will need inverse matrix of DVEC *** END xcrysden-1.6.2/F/latgen.f900000644000175000017500000005166013522042401014033 0ustar tonetone !---------------------------------------------------------------------------- ! ! Copyright (C) 2001-2011 Quantum ESPRESSO group ! This file is distributed under the terms of the ! GNU General Public License. See the file `License' ! in the root directory of the present distribution, ! or http://www.gnu.org/copyleft/gpl.txt . ! ! ! The code below is taken from Quantum ESPRESSO (QE) as to ensure that ! lattice types are defined as in QE. ! ! ---------------------------------------------------------------------------- MODULE kinds IMPLICIT NONE SAVE ! INTEGER, PARAMETER :: DP = kind(1.d0) END MODULE kinds MODULE constants USE kinds, ONLY : DP IMPLICIT NONE SAVE ! REAL(DP), PARAMETER :: BOHR_RADIUS_ANGS = 0.52917720859_DP END MODULE constants !---------------------------------------------------------------------------- !------------------------------------------------------------------------- SUBROUTINE latgen(ibrav,celldm,a1,a2,a3,omega) !----------------------------------------------------------------------- ! sets up the crystallographic vectors a1, a2, and a3 in atomic units ! ! ibrav is the structure index: ! 1 cubic P (sc) 8 orthorhombic P ! 2 cubic F (fcc) 9 1-face (C) centered orthorhombic ! 3 cubic I (bcc) 10 all face centered orthorhombic ! 4 hexagonal and trigonal P 11 body centered orthorhombic ! 5 trigonal R, 3-fold axis c 12 monoclinic P (unique axis: c) ! 6 tetragonal P (st) 13 one face (base) centered monoclinic ! 7 tetragonal I (bct) 14 triclinic P ! Also accepted: ! 0 "free" structure -12 monoclinic P (unique axis: b) ! -3 cubic bcc with a more symmetric choice of axis ! -5 trigonal R, threefold axis along (111) ! -9 alternate description for base centered orthorhombic ! -13 one face (base) centered monoclinic (unique axis: b) ! 91 1-face (A) centered orthorombic ! ! celldm are parameters which fix the shape of the unit cell ! omega is the unit-cell volume ! ! NOTA BENE: all axis sets are right-handed ! Boxes for US PPs do not work properly with left-handed axis ! USE kinds, ONLY: DP IMPLICIT NONE INTEGER, INTENT(in) :: ibrav real(DP), INTENT(inout) :: celldm(6) real(DP), INTENT(inout) :: a1(3), a2(3), a3(3) real(DP), INTENT(out) :: omega ! real(DP), PARAMETER:: sr2 = 1.414213562373d0, & sr3 = 1.732050807569d0 INTEGER :: i,j,k,l,iperm,ir real(DP) :: term, cbya, s, term1, term2, singam, sen ! ! user-supplied lattice vectors ! IF (ibrav == 0) THEN IF (sqrt( a1(1)**2 + a1(2)**2 + a1(3)**2 ) == 0 ) & CALL errore ('latgen', 'wrong at for ibrav=0', 1) IF (sqrt( a2(1)**2 + a2(2)**2 + a2(3)**2 ) == 0 ) & CALL errore ('latgen', 'wrong at for ibrav=0', 2) IF (sqrt( a3(1)**2 + a3(2)**2 + a3(3)**2 ) == 0 ) & CALL errore ('latgen', 'wrong at for ibrav=0', 3) IF ( celldm(1) /= 0.D0 ) THEN ! ! ... input at are in units of alat => convert them to a.u. ! a1(:) = a1(:) * celldm(1) a2(:) = a2(:) * celldm(1) a3(:) = a3(:) * celldm(1) ELSE ! ! ... input at are in atomic units: define celldm(1) from a1 ! celldm(1) = sqrt( a1(1)**2 + a1(2)**2 + a1(3)**2 ) ENDIF ! ELSE a1(:) = 0.d0 a2(:) = 0.d0 a3(:) = 0.d0 ENDIF ! IF (celldm (1) <= 0.d0) CALL errore ('latgen', 'wrong celldm(1)', abs(ibrav) ) ! ! index of bravais lattice supplied ! IF (ibrav == 1) THEN ! ! simple cubic lattice ! a1(1)=celldm(1) a2(2)=celldm(1) a3(3)=celldm(1) ! ELSEIF (ibrav == 2) THEN ! ! fcc lattice ! term=celldm(1)/2.d0 a1(1)=-term a1(3)=term a2(2)=term a2(3)=term a3(1)=-term a3(2)=term ! ELSEIF (abs(ibrav) == 3) THEN ! ! bcc lattice ! term=celldm(1)/2.d0 DO ir=1,3 a1(ir)=term a2(ir)=term a3(ir)=term ENDDO IF ( ibrav < 0 ) THEN a1(1)=-a1(1) a2(2)=-a2(2) a3(3)=-a3(3) ELSE a2(1)=-a2(1) a3(1)=-a3(1) a3(2)=-a3(2) ENDIF ! ELSEIF (ibrav == 4) THEN ! ! hexagonal lattice ! IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) ! cbya=celldm(3) a1(1)=celldm(1) a2(1)=-celldm(1)/2.d0 a2(2)=celldm(1)*sr3/2.d0 a3(3)=celldm(1)*cbya ! ELSEIF (abs(ibrav) == 5) THEN ! ! trigonal lattice ! IF (celldm (4) <= -0.5_dp .or. celldm (4) >= 1.0_dp) & CALL errore ('latgen', 'wrong celldm(4)', abs(ibrav)) ! term1=sqrt(1.0_dp + 2.0_dp*celldm(4)) term2=sqrt(1.0_dp - celldm(4)) ! IF ( ibrav == 5) THEN ! threefold axis along c (001) a2(2)=sr2*celldm(1)*term2/sr3 a2(3)=celldm(1)*term1/sr3 a1(1)=celldm(1)*term2/sr2 a1(2)=-a1(1)/sr3 a1(3)= a2(3) a3(1)=-a1(1) a3(2)= a1(2) a3(3)= a2(3) ELSEIF ( ibrav == -5) THEN ! threefold axis along (111) ! Notice that in the cubic limit (alpha=90, celldm(4)=0, term1=term2=1) ! does not yield the x,y,z axis, but an equivalent rotated triplet: ! a/3 (-1,2,2), a/3 (2,-1,2), a/3 (2,2,-1) ! If you prefer the x,y,z axis as cubic limit, you should modify the ! definitions of a1(1) and a1(2) as follows:' ! a1(1) = celldm(1)*(term1+2.0_dp*term2)/3.0_dp ! a1(2) = celldm(1)*(term1-term2)/3.0_dp ! (info by G. Pizzi and A. Cepellotti) ! a1(1) = celldm(1)*(term1-2.0_dp*term2)/3.0_dp a1(2) = celldm(1)*(term1+term2)/3.0_dp a1(3) = a1(2) a2(1) = a1(3) a2(2) = a1(1) a2(3) = a1(2) a3(1) = a1(2) a3(2) = a1(3) a3(3) = a1(1) ENDIF ELSEIF (ibrav == 6) THEN ! ! tetragonal lattice ! IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) ! cbya=celldm(3) a1(1)=celldm(1) a2(2)=celldm(1) a3(3)=celldm(1)*cbya ! ELSEIF (ibrav == 7) THEN ! ! body centered tetragonal lattice ! IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) ! cbya=celldm(3) a2(1)=celldm(1)/2.d0 a2(2)=a2(1) a2(3)=cbya*celldm(1)/2.d0 a1(1)= a2(1) a1(2)=-a2(1) a1(3)= a2(3) a3(1)=-a2(1) a3(2)=-a2(1) a3(3)= a2(3) ! ELSEIF (ibrav == 8) THEN ! ! Simple orthorhombic lattice ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)', ibrav) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) ! a1(1)=celldm(1) a2(2)=celldm(1)*celldm(2) a3(3)=celldm(1)*celldm(3) ! ELSEIF ( abs(ibrav) == 9) THEN ! ! One face (base) centered orthorhombic lattice (C type) ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)', & abs(ibrav)) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', & abs(ibrav)) ! IF ( ibrav == 9 ) THEN ! old PWscf description a1(1) = 0.5d0 * celldm(1) a1(2) = a1(1) * celldm(2) a2(1) = - a1(1) a2(2) = a1(2) ELSE ! alternate description a1(1) = 0.5d0 * celldm(1) a1(2) =-a1(1) * celldm(2) a2(1) = a1(1) a2(2) =-a1(2) ENDIF a3(3) = celldm(1) * celldm(3) ! ELSEIF ( ibrav == 91 ) THEN ! ! One face (base) centered orthorhombic lattice (A type) ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)', ibrav) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) ! a1(1) = celldm(1) a2(2) = celldm(1) * celldm(2) * 0.5_DP a2(3) = - celldm(1) * celldm(3) * 0.5_DP a3(2) = a2(2) a3(3) = - a2(3) ! ELSEIF (ibrav == 10) THEN ! ! All face centered orthorhombic lattice ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)', ibrav) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) ! a2(1) = 0.5d0 * celldm(1) a2(2) = a2(1) * celldm(2) a1(1) = a2(1) a1(3) = a2(1) * celldm(3) a3(2) = a2(1) * celldm(2) a3(3) = a1(3) ! ELSEIF (ibrav == 11) THEN ! ! Body centered orthorhombic lattice ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)', ibrav) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) ! a1(1) = 0.5d0 * celldm(1) a1(2) = a1(1) * celldm(2) a1(3) = a1(1) * celldm(3) a2(1) = - a1(1) a2(2) = a1(2) a2(3) = a1(3) a3(1) = - a1(1) a3(2) = - a1(2) a3(3) = a1(3) ! ELSEIF (ibrav == 12) THEN ! ! Simple monoclinic lattice, unique (i.e. orthogonal to a) axis: c ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)', ibrav) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) IF (abs(celldm(4))>=1.d0) CALL errore ('latgen', 'wrong celldm(4)', ibrav) ! sen=sqrt(1.d0-celldm(4)**2) a1(1)=celldm(1) a2(1)=celldm(1)*celldm(2)*celldm(4) a2(2)=celldm(1)*celldm(2)*sen a3(3)=celldm(1)*celldm(3) ! ELSEIF (ibrav ==-12) THEN ! ! Simple monoclinic lattice, unique axis: b (more common) ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)',-ibrav) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)',-ibrav) IF (abs(celldm(5))>=1.d0) CALL errore ('latgen', 'wrong celldm(5)',-ibrav) ! sen=sqrt(1.d0-celldm(5)**2) a1(1)=celldm(1) a2(2)=celldm(1)*celldm(2) a3(1)=celldm(1)*celldm(3)*celldm(5) a3(3)=celldm(1)*celldm(3)*sen ! ELSEIF (ibrav == 13) THEN ! ! One face centered monoclinic lattice unique axis c ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)', ibrav) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) IF (abs(celldm(4))>=1.d0) CALL errore ('latgen', 'wrong celldm(4)', ibrav) ! sen = sqrt( 1.d0 - celldm(4) ** 2 ) a1(1) = 0.5d0 * celldm(1) a1(3) =-a1(1) * celldm(3) a2(1) = celldm(1) * celldm(2) * celldm(4) a2(2) = celldm(1) * celldm(2) * sen a3(1) = a1(1) a3(3) =-a1(3) ELSEIF (ibrav == -13) THEN ! ! One face centered monoclinic lattice unique axis b ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)',-ibrav) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)',-ibrav) IF (abs(celldm(5))>=1.d0) CALL errore ('latgen', 'wrong celldm(5)',-ibrav) ! sen = sqrt( 1.d0 - celldm(5) ** 2 ) a1(1) = 0.5d0 * celldm(1) a1(2) =-a1(1) * celldm(2) a2(1) = a1(1) a2(2) =-a1(2) a3(1) = celldm(1) * celldm(3) * celldm(5) a3(3) = celldm(1) * celldm(3) * sen ! ELSEIF (ibrav == 14) THEN ! ! Triclinic lattice ! IF (celldm (2) <= 0.d0) CALL errore ('latgen', 'wrong celldm(2)', ibrav) IF (celldm (3) <= 0.d0) CALL errore ('latgen', 'wrong celldm(3)', ibrav) IF (abs(celldm(4))>=1.d0) CALL errore ('latgen', 'wrong celldm(4)', ibrav) IF (abs(celldm(5))>=1.d0) CALL errore ('latgen', 'wrong celldm(5)', ibrav) IF (abs(celldm(6))>=1.d0) CALL errore ('latgen', 'wrong celldm(6)', ibrav) ! singam=sqrt(1.d0-celldm(6)**2) term= (1.d0+2.d0*celldm(4)*celldm(5)*celldm(6) & -celldm(4)**2-celldm(5)**2-celldm(6)**2) IF (term < 0.d0) CALL errore & ('latgen', 'celldm do not make sense, check your data', ibrav) term= sqrt(term/(1.d0-celldm(6)**2)) a1(1)=celldm(1) a2(1)=celldm(1)*celldm(2)*celldm(6) a2(2)=celldm(1)*celldm(2)*singam a3(1)=celldm(1)*celldm(3)*celldm(5) a3(2)=celldm(1)*celldm(3)*(celldm(4)-celldm(5)*celldm(6))/singam a3(3)=celldm(1)*celldm(3)*term ! ELSE ! CALL errore('latgen',' nonexistent bravais lattice',ibrav) ! ENDIF ! ! calculate unit-cell volume omega ! CALL volume (1.0_dp, a1, a2, a3, omega) ! RETURN ! END SUBROUTINE latgen !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- SUBROUTINE abc2celldm ( ibrav, a,b,c,cosab,cosac,cosbc, celldm ) !---------------------------------------------------------------------------- ! ! returns internal parameters celldm from crystallographics ones ! USE kinds, ONLY: dp USE constants, ONLY: bohr_radius_angs IMPLICIT NONE ! INTEGER, INTENT (in) :: ibrav REAL(DP), INTENT (in) :: a,b,c, cosab, cosac, cosbc REAL(DP), INTENT (out) :: celldm(6) ! IF (a <= 0.0_dp) CALL errore('abc2celldm','incorrect lattice parameter (a)',1) IF (b < 0.0_dp) CALL errore('abc2celldm','incorrect lattice parameter (b)',1) IF (c < 0.0_dp) CALL errore('abc2celldm','incorrect lattice parameter (c)',1) IF ( abs (cosab) > 1.0_dp) CALL errore('abc2celldm', & 'incorrect lattice parameter (cosab)',1) IF ( abs (cosac) > 1.0_dp) CALL errore('abc2celldm', & 'incorrect lattice parameter (cosac)',1) IF ( abs (cosbc) > 1.0_dp) CALL errore('abc2celldm', & 'incorrect lattice parameter (cosbc)',1) ! celldm(1) = a / bohr_radius_angs celldm(2) = b / a celldm(3) = c / a ! IF ( ibrav == 14 .or. ibrav == 0 ) THEN ! ! ... triclinic lattice ! celldm(4) = cosbc celldm(5) = cosac celldm(6) = cosab ! ELSEIF ( ibrav ==-12 .or. ibrav ==-13 ) THEN ! ! ... monoclinic P or base centered lattice, unique axis b ! celldm(4) = 0.0_dp celldm(5) = cosac celldm(6) = 0.0_dp ! ELSEIF ( ibrav ==-5 .or. ibrav ==5 .or. ibrav ==12 .or. ibrav ==13 ) THEN ! ! ... trigonal and monoclinic lattices, unique axis c ! celldm(4) = cosab celldm(5) = 0.0_dp celldm(6) = 0.0_dp ! ELSE ! celldm(4) = 0.0_dp celldm(5) = 0.0_dp celldm(6) = 0.0_dp ! ENDIF ! END SUBROUTINE abc2celldm !------------------------------------------------------------------------- !------------------------------------------------------------------------- SUBROUTINE at2celldm (ibrav,a1,a2,a3,celldm) !----------------------------------------------------------------------- ! ! Returns celldm parameters computed from lattice vectors a1,a2,a3 ! a1, a2, a3 are in "alat" units ! If Bravais lattice index ibrav=0, only celldm(1) is set to alat ! See latgen for definition of celldm and lattice vectors. ! a1, a2, a3, ibrav, alat are not modified ! USE kinds, ONLY: DP IMPLICIT NONE INTEGER, INTENT(in) :: ibrav REAL(DP), INTENT(in) :: a1(3), a2(3), a3(3) REAL(DP), INTENT(out) :: celldm(6) ! celldm = 0.d0 ! SELECT CASE ( ibrav ) CASE (0) celldm(1) = 1.0_dp CASE (1) celldm(1) = sqrt( dot_product (a1,a1) ) CASE (2) celldm(1) = sqrt( dot_product (a1,a1) * 2.0_dp ) CASE (3,-3) celldm(1) = sqrt( dot_product (a1,a1) / 3.0_dp ) * 2.0_dp CASE (4) celldm(1) = sqrt( dot_product (a1,a1) ) celldm(3) = sqrt( dot_product (a3,a3) ) / celldm(1) CASE (5, -5 ) celldm(1) = sqrt( dot_product (a1,a1) ) celldm(4) = dot_product(a1(:),a2(:)) / celldm(1) & / sqrt( dot_product( a2,a2) ) CASE (6) celldm(1)= sqrt( dot_product (a1,a1) ) celldm(3)= sqrt( dot_product (a3,a3) ) / celldm(1) CASE (7) celldm(1) = abs(a1(1))*2.0_dp celldm(3) = abs(a1(3)/a1(1)) CASE (8) celldm(1) = sqrt( dot_product (a1,a1) ) celldm(2) = sqrt( dot_product (a2,a2) ) / celldm(1) celldm(3) = sqrt( dot_product (a3,a3) ) / celldm(1) CASE (9, -9 ) celldm(1) = abs(a1(1))*2.0_dp celldm(2) = abs(a2(2))*2.0_dp/celldm(1) celldm(3) = abs(a3(3))/celldm(1) CASE (91 ) celldm(1) = sqrt( dot_product (a1,a1) ) celldm(2) = abs (a2(2))*2.0_dp/celldm(1) celldm(3) = abs (a3(3))*2.0_dp/celldm(1) CASE (10) celldm(1) = abs(a1(1))*2.0_dp celldm(2) = abs(a2(2))*2.0_dp/celldm(1) celldm(3) = abs(a3(3))*2.0_dp/celldm(1) CASE (11) celldm(1) = abs(a1(1))*2.0_dp celldm(2) = abs(a1(2))*2.0_dp/celldm(1) celldm(3) = abs(a1(3))*2.0_dp/celldm(1) CASE (12,-12) celldm(1) = sqrt( dot_product (a1,a1) ) celldm(2) = sqrt( dot_product(a2(:),a2(:)) ) / celldm(1) celldm(3) = sqrt( dot_product(a3(:),a3(:)) ) / celldm(1) IF ( ibrav == 12 ) THEN celldm(4) = dot_product(a1(:),a2(:)) / celldm(1) / & sqrt(dot_product(a2(:),a2(:))) ELSE celldm(5) = dot_product(a1(:),a3(:)) / celldm(1) / & sqrt(dot_product(a3(:),a3(:))) ENDIF CASE (13) celldm(1) = abs(a1(1))*2.0_dp celldm(2) = sqrt( dot_product(a2(:),a2(:))) / celldm(1) celldm(3) = abs (a1(3)/a1(1)) celldm(4) = a2(1)/a1(1)/celldm(2)/2.0_dp ! SQRT(DOT_PRODUCT(a1(:),a1(:)) * DOT_PRODUCT(a2(:),a2(:))) !celldm(4) = DOT_PRODUCT(a1(:),a2(:)) / & ! SQRT(DOT_PRODUCT(a1(:),a1(:)) * DOT_PRODUCT(a2(:),a2(:))) CASE (-13) celldm(1) = abs(a1(1))*2.0_dp celldm(2) = abs (a2(2)/a2(1)) celldm(3) = sqrt( dot_product(a3(:),a3(:))) / celldm(1) celldm(5) = a3(1)/a1(1)/celldm(3)/2.0_dp !celldm(5) = DOT_PRODUCT(a1(:),a3(:)) / & ! SQRT(DOT_PRODUCT(a1(:),a1(:)) * DOT_PRODUCT(a3(:),a3(:))) CASE (14) celldm(1) = sqrt(dot_product(a1(:),a1(:))) celldm(2) = sqrt( dot_product(a2(:),a2(:))) / celldm(1) celldm(3) = sqrt( dot_product(a3(:),a3(:))) / celldm(1) celldm(4) = dot_product(a3(:),a2(:))/sqrt(dot_product(a2(:),a2(:)) * & dot_product(a3(:),a3(:))) celldm(5) = dot_product(a3(:),a1(:)) / celldm(1) / & sqrt( dot_product(a3(:),a3(:))) celldm(6) = dot_product(a1(:),a2(:)) / celldm(1) / & sqrt(dot_product(a2(:),a2(:))) CASE DEFAULT CALL infomsg('at2celldm', 'wrong ibrav?') END SELECT ! !celldm(1) = celldm(1) * alat ! END SUBROUTINE at2celldm !--------------------------------------------------------------------- !--------------------------------------------------------------------- SUBROUTINE volume (alat, a1, a2, a3, omega) !--------------------------------------------------------------------- ! ! Compute the volume of the unit cell defined by 3 vectors ! a1, a2, a3, given in units of "alat" (alat may be 1): ! omega = alat^3 * [ a1 . (a2 x a3) ] ! ( . = scalar product, x = vector product ) ! USE kinds, ONLY: dp IMPLICIT NONE ! REAL(dp), INTENT(IN) :: alat, a1(3), a2(3), a3(3) REAL(dp), INTENT(OUT) :: omega ! omega = a1(1) * ( a2(2)*a3(3)-a2(3)*a3(2) ) - & a1(2) * ( a2(1)*a3(3)-a2(3)*a3(1) ) + & a1(3) * ( a2(1)*a3(2)-a2(2)*a3(1) ) ! IF ( omega < 0.0_dp) THEN call infomsg('volume','axis vectors are left-handed') omega = ABS (omega) END IF ! IF ( alat < 1.0_dp) call infomsg('volume','strange lattice parameter') omega = omega * alat**3 ! RETURN ! END SUBROUTINE volume !--------------------------------------------------------------------- !---------------------------------------------------------------------- SUBROUTINE infomsg( routine, message ) !---------------------------------------------------------------------- ! ! ... This is a simple routine which writes an info message ! ... from a given routine to output. ! IMPLICIT NONE ! CHARACTER (LEN=*) :: routine, message ! the name of the calling routine ! the output message ! WRITE( * , '(5X,"Message from routine ",A,":")' ) routine WRITE( * , '(5X,A)' ) message ! RETURN ! END SUBROUTINE infomsg !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- SUBROUTINE errore( calling_routine, message, ierr ) !---------------------------------------------------------------------------- ! ! ... This is a simple routine which writes an error message to output: ! ... if ierr <= 0 it does nothing, ! ... if ierr > 0 it stops. ! IMPLICIT NONE ! CHARACTER(LEN=*), INTENT(IN) :: & calling_routine, & ! the name of the calling calling_routine message ! the output message INTEGER, INTENT(IN) :: ierr ! the error flag ! IF( ierr <= 0 ) RETURN ! ! ... the error message is written un the "*" unit ! WRITE( UNIT = *, FMT = '(/,1X,78("%"))' ) WRITE( UNIT = *, FMT = '(5X, "Error in routine ", A, " (error #", I3, "):")' ) & TRIM(calling_routine), ierr WRITE( UNIT = *, FMT = '(5X,A)' ) TRIM(message) WRITE( UNIT = *, FMT = '(1X,78("%"),/)' ) ! WRITE( *, '(" stopping ...")' ) ! STOP 1 RETURN ! END SUBROUTINE errore !---------------------------------------------------------------------------- xcrysden-1.6.2/F/param.inc0000644000175000017500000000017511712736221014040 0ustar tonetonec NAC ..... number of atoms in cell c INATOM ... maximum number of atoms PARAMETER(NAC=50000, INATOM=200000) xcrysden-1.6.2/F/calplane.f0000644000175000017500000001040311712736221014166 0ustar tonetonec naredil bom takole: nml=AxB v (x,y,z) reprezentaciji, nato pa c gre nml v (h*,k,*l*) reprezentacijo c c |x| |a| |a| |x| c |y| = A |b| ==> |b| = A^-1|y| c |z| |c| |c| |z| c c A = matrix of reciprocal vectors ==> A^-1 is a matrix of direct vectors c ================ PROGRAM CALPLANE CHARACTER*80 file1,file2 REAL dv1(3),dv2(3),dv3(3),p1(3),p2(3),p3(3) REAL vec1(3),vec2(3),nml(3) CHARACTER*7 word PARAMETER (MINTOL=0.001) INTEGER ia(3) COMMON/INDX/ IA C This program calculates selected plane c file1...direct vectors coord. c file2...coordinates of 3 selected points in XYZ CALL GETARG(1,FILE1) CALL GETARG(2,FILE2) OPEN(11,FILE=FILE1,STATUS='OLD') OPEN(12,FILE=FILE2,STATUS='OLD') 20 CONTINUE READ(11,'(1x,a)') WORD IF(WORD.NE.'CONVVEC')GOTO20 c read direct vectors READ(11,*) (DV1(i),i=1,3) READ(11,*) (DV2(i),i=1,3) READ(11,*) (DV3(i),i=1,3) c translate to reciprocal C read 3 sel. points READ(12,*) (P1(i),i=1,3) READ(12,*) (P2(i),i=1,3) READ(12,*) (P3(i),i=1,3) CLOSE(11) CLOSE(12) c vec1 is (P1)-(P2); vec2 is (P3)-(P2) do i=1,3 vec1(i)=P1(i)-P2(i) vec2(i)=P3(i)-P2(i) enddo CALL FVecProduct(vec1,vec2,nml) c translate to [h*k*l*] basis AH=nml(1)*DV1(1) + nml(2)*DV2(1) + nml(3)*DV3(1) AK=nml(1)*DV1(2) + nml(2)*DV2(2) + nml(3)*DV3(2) AL=nml(1)*DV1(3) + nml(2)*DV2(3) + nml(3)*DV3(3) C ROUND the components of normal vector --> Just good enough C for unit cells without BASIS CALL GETINDX(AH,AK,AL) C choose Miller indexes so that there will be a minority of negative C numbers NNEG=0 NNUL=0 DO I=1,3 IF(IA(I).LT.0)NNEG=NNEG+1 IF(IA(I).EQ.0)NNUL=NNUL+1 ENDDO IF(((NNUL.EQ.2).AND.(NNEG.EQ.1)).OR. * (NNEG.GE.2))THEN DO I=1,3 IA(I)=-IA(I) ENDDO ENDIF C first unrounded M. indexes, and then rounded indexes WRITE(6,*) AH,AK,AL,(IA(I),I=1,3) END c ======================================= SUBROUTINE FVecProduct(vec1,vec2,resvec) IMPLICIT REAL (A-H,O-Z) REAL vec1(3),vec2(3),resvec(3) resvec(1) = vec1(2)*vec2(3) - vec2(2)*vec1(3) resvec(2) = vec1(3)*vec2(1) - vec2(3)*vec1(1) resvec(3) = vec1(1)*vec2(2) - vec2(1)*vec1(2) RETURN END c ============================ SUBROUTINE GETINDX(AH,AK,AL) INTEGER IFC(2),IA(3) REAL A(3),B(2),MIN COMMON/INDX/ IA A(1)=REAL(AH) A(2)=REAL(AK) A(3)=REAL(AL) c tolerance TOL1=0.001 TOL2=0.001 c determine the lowest number MIN=ABS(A(1))+ABS(A(2))+ABS(A(3)) DO I=1,3 IF(ABS(A(I)).LT.MIN.AND.ABS(A(I)).GT.0.0)THEN MIN=A(I) II=I ENDIF ENDDO c devide all numbers by the smallest one c two larger numbers are copied to b() N=0 DO I=1,3 A(I)=A(I)/MIN IF(I.NE.II)THEN N=N+1 B(N)=A(I) ENDIF ENDDO ifc(1)=1 ifc(2)=1 c find an integer multiplier for b() DO 92 J=1,2 I=0 91 CONTINUE I=I+1 B1=ABS(REAL(I)*B(J)) IF(ABS(B1).LT.1.E-5)GOTO92 !B(J) is zero B2=ABS(B1-ABS(REAL(NINT(REAL(I)*B(J))))) IF(B2.LT.TOL2)THEN IFC(J)=I ELSE c some combination of triplet-numbers can produce realy huge numbers, c so this loop can never and, lets say that the greater allowed I is 10000 if(i.gt.10000)then tol2=2.*tol2 i=0 endif GOTO91 ENDIF 92 CONTINUE c what is the smallest common multiplier for b() IDEL=1 IMIN=ABS(IFC(1)) IF(ABS(IFC(2)).LT.IMIN)IMIN=ABS(IFC(2)) DO I=2,IMIN AD=REAL(IFC(1))/REAL(I)-REAL(INT(IFC(1)/I)) BD=REAL(IFC(2))/REAL(I)-REAL(INT(IFC(2)/I)) IF(AD.LT.TOL1.AND.BD.LT.TOL1)IDEL=IDEL*I ENDDO c update result IFAC=IFC(1)*IFC(2)/IDEL DO J=1,3 IA(J)=NINT(A(J)*IFAC) !Miller indexes ENDDO RETURN END xcrysden-1.6.2/F/multislab.f0000644000175000017500000002421211712736221014406 0ustar tonetone program MultiSlab c ************************************************************* c program reads SLAB structure from xc_struct.$$ and generate a c multislab c ************************************************************* c c USAGE: multislab [< ] c c mode: SYMMINFO c MULTISLAB_NO_INVERSION c MULTISLAB_INVERSION IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' INTEGER NAT(NAC), INN(NAC) INTEGER MAXNAT ! maximum atomic number in structure INTEGER NPT, ISPLIT ! used for Wien97 REAL*8 X(NAC),Y(NAC),Z(NAC),DVEC(3,3),IDVEC(3,3),TMPVEC(3,3) REAL*8 A(NAC),B(NAC),C(NAC), MIN_NNDIST(NAC), RMT(NAC), R0(NAC) REAL*8 SYMMOP(1,3,3), SYMMTR(1,3) REAL*8 V1(3), V2(3), V3(3) CHARACTER*80 FILE1, TITLE, MODE CHARACTER*10 ATOM(100), ATOM_UPPER(100) CHARACTER*4 type REAL*8 FRMT(NAC) LOGICAL l_inv_center, l_inv, lzero3 COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR COMMON/IVEC/ IDVEC COMMON/BOHRR/ BOHR,IMODE3 !this is not used, but is needed because !this program uses readf1 routine PARAMETER (RAD2DEG = 57.295779513084d0, TOLMIN=1.d-7) PARAMETER ( $ M1_SYMMINFO = 0, $ M1_MULTISLAB_NO_INVERSION = 1, $ M1_MULTISLAB_INVERSION = 2 ) DATA SYMMOP/ $ 1.0d0, 0.0d0, 0.0d0, $ 0.0d0, 1.0d0, 0.0d0, $ 0.0d0, 0.0d0, 1.0d0/ DATA SYMMTR/ $ 0.0d0, 0.0d0, 0.0d0/ include 'atoms.inc' C CONVERSION FROM BOHRS TO ANGS. BOHR=0.529177d0 narg=IArgc() if (narg.ne.2) then print *, $'Usage: multislab [< ]' stop endif Call GetArg(1,MODE) len = index(mode, ' ') - 1 if (mode(1:len) .eq. 'SYMMINFO') imode=M1_SYMMINFO if (mode(1:len) .eq. 'MULTISLAB_NO_INVERSION') $ imode=M1_MULTISLAB_NO_INVERSION if (mode(1:len) .eq. 'MULTISLAB_INVERSION') $ imode=M1_MULTISLAB_INVERSION Call GetArg(2,FILE1) Open(unit=11,file=file1,status='old') Call ReadF1('DIM-GROUP', igroup, idim) if (idim.lt.2) stop 'MultiSlab:: so far I am converting to $ multislab just from slabs and multi-slabs (dim=2,3) !!!' Call ReadF1('PRIMVEC', 0, idim) Call ReadF1('PRIMCOORD', 0, idim) Close(11) if(imode.gt.M1_SYMMINFO) then Read(*,*) vac_thickness else vac_thickness = 0.0d0 endif c find an atom with lower Z and set Z -> 0.0 zmin=z(1) zmax=z(1) do i=2,natr if (z(i).lt.zmin) zmin=z(i) if (z(i).gt.zmax) zmax=z(i) enddo do i=1,natr z(i)=z(i)-zmin enddo c assign the third vector dvec(3,1)=0.0d0 dvec(3,2)=0.0d0 dvec(3,3)=zmax-zmin lzero3=.false. if (abs(dvec(3,3)).lt.tolmin) then dvec(3,3) = 1.0d0 lzero3=.true. endif c get the inverse matrix call Invert3x3(dvec,idvec) c **************************************************************** c now get the fractional coordinates of atoms and c translate them if necessary ( in WIEN97 fractional coorinates c are in range [0,1) ) maxnat = 1 do i=1,natr nat(i) = nat(i) - int( nat(i) / 100 ) * 100 ! nat from 0 to 99 if(nat(i).gt.maxnat) maxnat = nat(i) a(i) = x(i)*idvec(1,1) + y(i)*idvec(2,1) + z(i)*idvec(3,1) b(i) = x(i)*idvec(1,2) + y(i)*idvec(2,2) + z(i)*idvec(3,2) c(i) = x(i)*idvec(1,3) + y(i)*idvec(2,3) + z(i)*idvec(3,3) if(lzero3) c(i)=0.0d0 if(a(i).lt.0.0d0) a(i) = a(i) + 1.0d0 if(b(i).lt.0.0d0) b(i) = b(i) + 1.0d0 if(c(i).lt.0.0d0) c(i) = c(i) + 1.0d0 c Write(6,21) nat(i), a(i), b(i), c(i) enddo c //////////////////////////////////// c do we have center of inversion !!! c c THIS DOESN'T WORK AT ALL --> fix in the future !!! c //////////////////////////////////// l_inv_center=.true. i=1 do while (i.lt.natr .and. l_inv_center) l_inv=.false. j=i+1 do while (j.le.natr .and. .not.l_inv) if ( abs(1.0d0-a(i)-a(j)) .lt. tolmin .and. $ abs(1.0d0-b(i)-b(j)) .lt. tolmin .and. $ abs(1.0d0-c(i)-c(j)) .lt. tolmin ) l_inv=.true. j=j+1 enddo if (.not. l_inv) l_inv_center=.false. i=i+1 enddo if(imode.eq.M1_SYMMINFO) then if(l_inv_center) then write(*,*) 1 else write(*,*) 0 endif else if(imode.eq.M1_MULTISLAB_INVERSION .and. l_inv_center) then vact2 = vac_thickness / 2.0d0 do i=1,natr z(i)=z(i) + vact2 enddo endif c re-assign the 4th component of third vector dvec(3,3)=zmax-zmin + vac_thickness c write the C95's unit 34; this will not be used in future title = 'EXTERNAL' Call WriteFTN34(title, 3, 1, dvec, 1, symmop, symmtr, $ natr, nat, x, y, z) c get the inverse matrix call Invert3x3(dvec,idvec) c **************************************************************** c now get the fractional coordinates of atoms and c translate them if necessary ( in WIEN97 fractional coorinates c are in range [0,1) ) maxnat = 1 do i=1,natr nat(i) = nat(i) - int( nat(i) / 100 ) * 100 ! nat from 0 to 99 if(nat(i).gt.maxnat) maxnat = nat(i) a(i) = x(i)*idvec(1,1) + y(i)*idvec(2,1) + z(i)*idvec(3,1) b(i) = x(i)*idvec(1,2) + y(i)*idvec(2,2) + z(i)*idvec(3,2) c(i) = x(i)*idvec(1,3) + y(i)*idvec(2,3) + z(i)*idvec(3,3) if(a(i).lt.0.0d0) a(i) = a(i) + 1.0d0 if(b(i).lt.0.0d0) b(i) = b(i) + 1.0d0 if(c(i).lt.0.0d0) c(i) = c(i) + 1.0d0 c Write(6,21) nat(i), a(i), b(i), c(i) enddo c get the nearest neighbor distances do i=1,natr min_nndist(i) = 99.9d10 do j=1,natr if (i.ne.j) then a2 = a(j) + nint(a(i)-a(j)) b2 = b(j) + nint(b(i)-b(j)) c2 = c(j) + nint(c(i)-c(j)) x1 = a(i)*dvec(1,1) + b(i)*dvec(2,1) + c(i)*dvec(3,1) y1 = a(i)*dvec(1,2) + b(i)*dvec(2,2) + c(i)*dvec(3,2) z1 = a(i)*dvec(1,3) + b(i)*dvec(2,3) + c(i)*dvec(3,3) x2 = a2*dvec(1,1) + b2*dvec(2,1) + c2*dvec(3,1) y2 = a2*dvec(1,2) + b2*dvec(2,2) + c2*dvec(3,2) z2 = a2*dvec(1,3) + b2*dvec(2,3) + c2*dvec(3,3) d = Dist(x1,y1,z1, x2,y2,z2) if (d.lt.min_nndist(i)) then min_nndist(i) = d inn(i) = j endif endif enddo enddo c ************************* c get a,b,c,alpha,beta,gamma ap = VecSize3(dvec,1) / BOHR bp = VecSize3(dvec,2) / BOHR cp = VecSize3(dvec,3) / BOHR do i=1,3 v1(i) = dvec(1,i) v2(i) = dvec(2,i) v3(i) = dvec(3,i) enddo alpha = dacos( ScalarProduct(v2, v3) / $ (VecSize(v2) * VecSize(v3)) ) * RAD2DEG beta = dacos( ScalarProduct(v3,v1) / $ (VecSize(v3) * VecSize(v1)) ) * RAD2DEG gamma = dacos( ScalarProduct(v1,v2) / $ (VecSize(v1) * VecSize(v2)) ) * RAD2DEG type='P ' c if gamma is very close to 120.d0 make it 120.0d0 and set lattice c type to hexagonal if ( abs(gamma-120.d0) .lt. tolmin ) then gamma=120.0d0 type='H ' endif c ******************************************* c get some aproximation for muffin tin radius c ******************************************* c let the smallest offset between RMT spheres be 0.1 a.u. OFFSET = 0.1d0/2.d0 ! each sphre gets half of offset do i=1,natr if (nat(i).eq.1) frmt(i) = 0.50d0 if (nat(i).gt.1 .and. nat(i).lt.21) frmt(i) = 1.00d0 if (nat(i).ge.21 .and. nat(i).lt.39) frmt(i) = 1.10d0 if (nat(i).ge.39 .and. nat(i).lt.57) frmt(i) = 1.15d0 if (nat(i).ge.57) frmt(i) = 1.20d0 r0(i) = 0.000005d0 if (nat(i).le.71) r0(i) = 0.00001d0 if (nat(i).le.36) r0(i) = 0.00005d0 if (nat(i).le.18) r0(i) = 0.0001d0 enddo do i=1,natr rmt(i) = frmt(i) * min_nndist(i) / $ ( BOHR * (frmt(i) + frmt(inn(i))) ) - OFFSET enddo isplit = 8 npt = 781 c **************************** c now write WIEN97 struct file c **************************** write(*,'(a)') $ 'Wien97 struct file generated by XCrySDen program' write(*,'(a4,a24,i2)') type, 'LATTICE.NONEQUIV. ATOMS:',natr if (maxnat.lt.40) then write(*,'(a13,a4)') 'MODE OF CALC=', 'NREL' else write(*,'(a13,a4)') 'MODE OF CALC=', 'RELA' endif write(*,'(6f10.6)') ap, bp, cp, alpha, beta, gamma do i=1,natr write(*,'(a5,i3,a4,f10.8,a3,f10.8,a3,f10.8)') $ 'ATOM=', -i,': X=', a(i), ' Y=', b(i), ' Z=', c(i) write(*,'(a15,i2,a17,i2)') 'MULT=', 1, 'ISPLIT=', isplit write(*,'(a10,a5,i5,a5,f10.8,a5,f10.4,a5,f5.1)') $ atom(nat(i)),'NPT=',npt,'R0=',r0(i), $ 'RMT=',rmt(i),'Z:', real(nat(i)) write(*,'(a20,3f10.7)') 'LOCAL ROT MATRIX: ', 1.0,0.0,0.0 write(*,'(20x,3f10.7)') 0.0, 1.0, 0.0 write(*,'(20x,3f10.7)') 0.0, 0.0, 1.0 enddo write(*,'(i4,A)') 1,' NUMBER OF SYMMETRY OPERATIONS' write(*,'(3i2,f10.7)') 1, 0, 0, 0.0 write(*,'(3i2,f10.7)') 0, 1, 0, 0.0 write(*,'(3i2,f10.7)') 0, 0, 1, 0.0 write(*,'(i8)') 1 21 FORMAT(I5,3F16.10) endif END xcrysden-1.6.2/F/wn_readbakgen.f0000644000175000017500000002254513032733454015212 0ustar tonetone program ReadBaKgen implicit real*8 (a-h,o-z) ! ========================================= ! Usage: $0 OUTPUTBAND-file OUTPUTKGEN-file ! ========================================= PARAMETER ( MINE=1,MAXE=2) ! $ MAX_NKPT = 500000, ! $ MAX_IRNKPT = 7000, ! $ MAX_NBANDS = 700, ! $ MINE = 1, ! $ MAXE = 2) character*6 match_line1 character*13 match_line2 character*256 filename character*80 line character*12 label, label1 CHARACTER*11 status, form logical not_match integer n(3) integer index(6),itk ! integer coor(3,MAX_NKPT), k_ired_ind(MAX_NKPT) ! integer fileseq_ired_ind(MAX_IRNKPT) ! integer seq2ired_ind(MAX_NKPT) ! dimension band_w(MAX_NBANDS,2), eigen(MAX_NBANDS,MAX_IRNKPT) integer,allocatable :: coor(:,:), k_ired_ind(:) integer,allocatable :: fileseq_ired_ind(:) integer,allocatable :: seq2ired_ind(:) real*8,allocatable :: band_w(:,:), eigen(:,:) dimension recVec(3,3) ! 123456 data match_line1 /' G1'/ ! 1234567890123 data match_line2 /' NO. OF MESH'/ call getarg(2,filename) if(filename.eq.' ') call getarg(1,filename) OPEN(11,FILE=filename,STATUS='OLD',ERR=8000) 8003 READ(11,*,END=8001) IUNIT,FILENAME,STATUS,FORM,IRECL OPEN(IUNIT,FILE=FILENAME,STATUS=STATUS,FORM=FORM,ERR=8002) GOTO 8003 8000 WRITE(*,*) ' ERROR IN OPENING BAKGEN.DEF !!!!' STOP 'SPAG.DEF' 8002 WRITE(*,*) ' ERROR IN OPENING UNIT:',IUNIT WRITE(*,*) ' FILENAME: ',FILENAME,' STATUS: ',STATUS, & ' FORM:',FORM STOP 'OPEN FAILED' 8001 CONTINUE label =' ' label1=' ' do i=1,12 if(filename(i:i).ne.'.') then label(i:i)=filename(i:i) else goto 100 endif enddo 100 continue ! ! read IRREDUBIBLE SET of K-POINT ENERGIES ! read(7,'(a)') line ! 'IRREDUCIBLE-KPOINT-SET' read(7,*) emin, emax read(7,*) nbands, n_ir_kpt allocate ( coor(3,n_ir_kpt*48), k_ired_ind(n_ir_kpt*48) ) allocate ( fileseq_ired_ind(n_ir_kpt) ) allocate ( seq2ired_ind(n_ir_kpt*48)) allocate ( band_w(nbands,2), eigen(nbands,n_ir_kpt)) do i=1,nbands read(7,*) iband, band_w(i,MINE), band_w(i,MAXE) do j=1,n_ir_kpt read(7,*) ik, eigen(i,j) ! write(*,*) ik, eigen(i,j) enddo enddo ! read(7,*) line ! 'END-IRREDUCIBLE-KPOINT-SET' close(7) ! ***************************** ! OUTPUTKGEN file is closed !!! ! ***************************** ! read reciprocal vectors ! |11 21 31| |x1 x2 x3| ! VEC = |12 22 32| => VEC = |y1 y2 y3| ! |13 23 33| |z1 z2 z3| ! ------------------------------- ! VEC(i,j) = VEC(#vec,xyz) !!!!!! ! ------------------------------- not_match=.true. do while(not_match) read(8,'(a80)') line if (match_line1 .eq. line(1:6)) then not_match=.false. ! recvec are written in columns in OUTPUTKGEN file !!! do j=1,3 read(8,*) (recVec(i,j),i=1,3) enddo endif enddo ! find the number of K-points not_match=.true. do while(not_match) read(8,'(a80)') line if (match_line2 .eq. line(1:13))then not_match=.false. read(line,'(43x,i7)',err=111) nkpt goto 112 111 read(line,'(44x,i6)') nkpt ! old format 112 continue endif enddo ! read the division factors read(8,'(53x,3i5)') (n(i),i=1,3) read(8,*) line ! ! read the k-coordinates(integer) & ireducible-point-indeces ! ind=0 do i=1,n(1)+1 do j=1,n(2)+1 do k=1,n(3)+1 ind=ind+1 read(8,*) itk,(coor(l,ind),l=1,3),k_ired_ind(ind) enddo enddo enddo ! read " weights of k-points:" line !!! read(8,*) line do i=1,n_ir_kpt read(8,*) itk, fileseq_ired_ind(i) enddo close(8) ! **************************** ! OUTPUTKGEN file is closed!!! ! **************************** ! ! reassign k_ired_ind() as is done in "$WIENROOT/SRC_kgen/zuord.f" ! ind1=0 ind2=0 do i=1,n(1)+1 do j=1,n(2)+1 do k=1,n(3)+1 ind1=ind1+1 if (ind1 .eq. k_ired_ind(ind1)) then ind2=ind2+1 ! k_ired_ind(ind1)=ind2 seq2ired_ind(ind1)=ind2 !!!! ! print *,k_ired_ind(ind1), ! $ (coor(l,k_ired_ind(ind1)),l=1,3) else seq2ired_ind(ind1) = k_ired_ind( k_ired_ind(ind1) ) endif enddo enddo enddo ! ! write ENERGIES of K-POINTS in XSF file ! write(10,*) 'BEGIN_BLOCK_BANDGRID3D' write(10,*) 'band_energies' write(10,*) 'BANDGRID_3D_BANDS' write(10,*) nbands write(10,*) n(1)+1,n(2)+1,n(3)+1 write(10,*) 0.0,0.0,0.0 !origin ! ------------------------------- ! VEC(i,j) = VEC(#vec,xyz) !!!!!! ! ------------------------------- write(10,*) (recVec(1,j),j=1,3) !reciprocal vectors write(10,*) (recVec(2,j),j=1,3) !reciprocal vectors write(10,*) (recVec(3,j),j=1,3) !reciprocal vectors do ib=1,nbands write(10,*) 'BAND: ',ib ic=0 ind1=0 do i=1,n(1)+1 do j=1,n(2)+1 do k=1,n(3)+1 ic=ic+1 ind1 = ind1 + 1 ind2 = k_ired_ind(ind1) index(ic) = seq2ired_ind(ind2) ! index(ic) = ind2 ! print *,ind1,index(ic), ! do l=1,n_ir_kpt ! if(fileseq_ired_ind(l) .eq. ind2) index(ic)=l ! enddo if(ic.eq.6)then ! print *,(index(ii),ii=1,6) write(10,'(6(E12.6,1x))') (eigen(ib,index(ii)),ii=1,6) ic=0 endif enddo enddo enddo if (ic.gt.0) write(10,'(6(E12.6,1x))') & (eigen(ib,index(ii)),ii=1,ic) enddo write(10,*) 'END_BANDGRID_3D' write(10,*) 'END_BLOCK_BANDGRID3D' goto 1000 999 print *,'could not open file: ',filename stop 'OPEN FAILED' 1000 continue END ! ! THIS IS THE RIGHT ORDER, STUDY IT !!! ! ! if(iswitch.eq.1)write(66,*)' internal and cartesian k-vectors:' ! DO 10 I1=1,N(1)+1 ! DO 10 I2=1,N(2)+1 ! DO 10 I3=1,N(3)+1 ! I=I+1 ! IF(I.GT.NMSHP) THEN ! PRINT*,'I.GT.NMSHP,STOP',I,I1,I2,I3 ! STOP ! END IF ! IF(I.EQ.NUM(I))THEN ! NDIM=NDIM+1 ! IF(NDIM.GT.IDKP) THEN ! WRITE(66,1000) !1000 FORMAT(1H ,'NUMBER OF INEQUIVALENT POINTS ECCEEDS IDKP') ! STOP ! END IF ! NUM(I)=NDIM ! RINDA=(DBLE(I1-1)+DBLE(ISHIFT(1))/2.D0)/DBLE(N(1)) ! RINDB=(DBLE(I2-1)+DBLE(ISHIFT(2))/2.D0)/DBLE(N(2)) ! RINDC=(DBLE(I3-1)+DBLE(ISHIFT(3))/2.D0)/DBLE(N(3)) ! BK(1,NDIM)=GBAS(1,1)*RINDA+GBAS(2,1)*RINDB+GBAS(3,1)*RINDC ! BK(2,NDIM)=GBAS(1,2)*RINDA+GBAS(2,2)*RINDB+GBAS(3,2)*RINDC ! BK(3,NDIM)=GBAS(1,3)*RINDA+GBAS(2,3)*RINDB+GBAS(3,3)*RINDC !c BK(1,NDIM)=GBAS(1,1)*RINDA+GBAS(1,2)*RINDB+GBAS(1,3)*RINDC !c BK(2,NDIM)=GBAS(2,1)*RINDA+GBAS(2,2)*RINDB+GBAS(2,3)*RINDC !c BK(3,NDIM)=GBAS(3,1)*RINDA+GBAS(3,2)*RINDB+GBAS(3,3)*RINDC ! bki(1,ndim)=rinda ! bki(2,ndim)=rindb ! bki(3,ndim)=rindc ! if(iswitch.eq.1) ! * write(66,100) rinda,rindb,rindc,bk(1,ndim),bk(2,ndim),bk(3,ndim) ! 100 format(3f10.5,10x,3f10.5) ! ELSE ! IF(NUM(I).GT.NMSHP) PRINT*,'ERROR' ! NUM(I)=NUM(NUM(I)) ! ! END IF !10 CONTINUE ! NKP=NDIM ! RETURN ! END xcrysden-1.6.2/F/pw_util.f0000644000175000017500000001130413525474306014102 0ustar tonetone!------------------------------------------------------------------------ INTEGER FUNCTION ibrav2igroup(ibrav) !----------------------------------------------------------------------- implicit NONE integer ibrav ibrav2igroup = 1 if (abs(ibrav) .eq. 1) ibrav2igroup = 1 if (abs(ibrav) .eq. 2) ibrav2igroup = 5 if (abs(ibrav) .eq. 3) ibrav2igroup = 6 if (abs(ibrav) .eq. 4) ibrav2igroup = 9 if (abs(ibrav) .eq. 5) ibrav2igroup = 7 if (abs(ibrav) .eq. 6) ibrav2igroup = 1 if (abs(ibrav) .eq. 7) ibrav2igroup = 6 if (abs(ibrav) .eq. 8) ibrav2igroup = 1 if (abs(ibrav) .eq. 9) ibrav2igroup = 4 if (abs(ibrav) .eq. 91) ibrav2igroup = 4 if (abs(ibrav) .eq. 10) ibrav2igroup = 5 if (abs(ibrav) .eq. 11) ibrav2igroup = 6 if (abs(ibrav) .eq. 12) ibrav2igroup = 1 if (abs(ibrav) .eq. 13) ibrav2igroup = 4 if (abs(ibrav) .eq. 14) ibrav2igroup = 1 RETURN END !----------------------------------------------------------------------- !----------------------------------------------------------------------- LOGICAL FUNCTION zero_latvec(v) !----------------------------------------------------------------------- implicit NONE real*8 v(3,3), VecSize zero_latvec = ( & (VecSize(v(1,1)) .lt. 1d-6) .and. & (VecSize(v(1,2)) .lt. 1d-6) .and. & (VecSize(v(1,3)) .lt. 1d-6) ) return END !----------------------------------------------------------------------- !----------------------------------------------------------------------- SUBROUTINE set_convvec(ibrav, celldm, pv, cv) !----------------------------------------------------------------------- ! This routine is used for pw.x I/O files and generates the ! conventional lattice vectors, cv(3,3), based on ibrav, celldm(), ! and pv() data, where pv() are primitive lattice vectors ! ! N.B: ! * pv() must be in atomic Bohr units ! * in output the cv() are also in atomic Bohr units !------------------------------------------------------------------------ IMPLICIT NONE integer ibrav, i, j real*8 celldm(6), pv(3,3), cv(3,3) ! CALL ZeroMat(cv, 3, 3) ! ! only centered lattices have cv() different from pv() ! IF ( (ibrav .eq. 2) .or. (abs(ibrav) .eq. 3) ) THEN ! ! fcc (2) and bcc (3 or -3) ! cv(1,1) = 1.0d0 cv(2,2) = 1.0d0 cv(3,3) = 1.0d0 ELSEIF ( ibrav .eq. 7 ) THEN ! ! tetragonal I (bct) ! cv(1,1) = 1.0d0 cv(2,2) = 1.0d0 cv(3,3) = celldm(3) ! C/A ELSEIF ( (abs(ibrav) .eq. 9) & .or. (ibrav .eq. 91) & .or. (ibrav .eq. 10) & .or. (ibrav .eq. 11) ) THEN ! ! Orthorhombic lattices: ! * ibrav == 9 or -9: 1-face (C) centered orthorhombic ! * ibrav == 91: 1-face (A) centered orthorhombic ! * ibrav == 10: face-centered ! * ibrav == 11: body-centered cv(1,1) = 1.0d0 cv(2,2) = celldm(2) ! B/A cv(3,3) = celldm(3) ! C/A ELSEIF ( ibrav .eq. 13 ) THEN ! ! Monoclinic base-centered (unique axis c) ! ! cv(1,1) -- 1st vector ! cv(1,2) -- 2nd vector ! cv(1,3) -- 3rd vector ! cv(1,1) = 1.0d0 cv(1,2) = pv(1,2)/celldm(1) cv(2,2) = pv(2,2)/celldm(1) cv(3,3) = celldm(3) ! C/A ELSEIF ( ibrav .eq. -13 ) THEN ! ! Monoclinic base-centered (unique axis b) ! ! cv(1,1) -- 1st vector ! cv(1,2) -- 2nd vector ! cv(1,3) -- 3rd vector ! cv(1,1) = 1.0d0 cv(2,2) = celldm(2) ! B/A cv(1,3) = pv(1,3)/celldm(1) cv(3,3) = pv(3,3)/celldm(1) ENDIF ! ! scale cv() with celldm(1) as to convert them to Bohr atomic units ! DO i=1,3 DO j=1,3 cv(j,i) = celldm(1) * cv(j,i) ENDDO ENDDO RETURN END !----------------------------------------------------------------- c ----------------------------------------------------------------------- LOGICAL FUNCTION matches (str1, str2) c .true. if str1 is contained in str2, .false. otherwise c This function is taken from PWscf package (www.pwscf.org). c ----------------------------------------------------------------------- implicit none character str1*(*), str2*(*) integer len1, len2, l len1 = len(str1) len2 = len(str2) do l = 1, len2 - len1 + 1 if ( str1(1:len1) .eq. str2(l:l + len1 - 1) ) then matches = .true. return endif enddo matches = .false. return end xcrysden-1.6.2/F/cube2xsf_fabris.f0000644000175000017500000000773611712736221015475 0ustar tonetonec ***************************************************************** program cube2xsf_fabris c Usage: cube2xsf mode cubefile c c MODE: c 1 ... scalar property (like density) c 4 ... scalar+vector (like density+gradient) c 5 ... scalar+vector+scalar (like density+gradient+laplacian) c c BEWARE: onle MODE.eq.1 is implemented !!! c c AUTHOR: Anton Kokalj (tone.kokalj@ijs.si) c DATE: Sat Feb 22 15:36:05 CET 2003 c ***************************************************************** implicit real*8 (a-h, o-z) PARAMETER ( $ M_SCA=1, $ M_SCA_VEC=4, $ M_SCA_VEC_SCA=5, $ B2A=0.529177d0, $ MAXATOM = 5000, $ MAXMO = 150, ! maximum number of orbitals $ MAXGRID = 75 ! maximum size of the grid, i.e., (MAGRID x MAXGRID x MAXGRID) $ ) character filename*256, title*80, mode*1, fileout*256 integer n(3), !increments $ mo_index(MAXMO), !indices of MOs $ nat(MAXATOM) logical lmo !do we have MO plot real*8 $ xo(3), !origin $ dx(3,3), !increments $ v(3,3), !spanning vectors $ val(MAXGRID,MAXGRID,MAXGRID,MAXMO), !values in cubefile $ x(MAXATOM), y(MAXATOM), z(MAXATOM) lmo=.false. narg = iargc() if (narg.ne.2) $ stop 'Usage: cube2xsf mode cubefile' call getarg(1,mode) call getarg(2,filename) read(mode,*) imode if (imode.ne.1) then write(*,*) 'imode.gt.1 not implemented' STOP endif open(unit=1, file=filename(1:len(filename)), status='old') read(1,*) title read(1,*) title read(1,*) natoms, (xo(i),i=1,3) do i=1,3 read(1,*) n(i), (dx(i,j),j=1,3) enddo c calculate the spanning vectors do i=1,3 do j=1,3 c matrix array is as: v(#,xyz) v(i,j) = dble(n(i)-1)*dx(i,j) enddo enddo c ** c ** do we have MO plot ??? c ** if ( natoms .lt. 0 ) then lmo=.true. natoms=-1*natoms endif c ** c ** fastest runing direction in G98 is 1,2,3 and the corrsponding in c ** XSF is 3,2,1; CORRECT THAT do i=1,natoms read(1,*) nat(i), c, x(i), y(i), z(i) x(i) = x(i) * B2A y(i) = y(i) * B2A z(i) = z(i) * B2A c write(*,'(i3,2x,3f12.6)') nat, x*B2A, y*B2A, z*B2A enddo nmo=1 if (lmo) then read(1,'(10I5:)') nmo, (mo_index(i),i=1,nmo) else mo_index(1)=1 endif c read all the values and store in memory do i1=1,n(1) do i2=1,n(2) read(1,'(6(E13.5):)') ((val(i1,i2,i3,j),j=1,nmo),i3=1,n(3)) enddo enddo c c loop over all the orbitals c do imo=1,nmo if (lmo) then write(fileout,'(''mo-'',i3.3,''.xsf'')') mo_index(imo) else write(fileout,'(''denpot.xsf'')') endif open(unit=9, file=fileout, status='unknown') write(9,'(1x,a5)') 'ATOMS' do i=1,natoms write(9,'(i3,2x,3f12.6)') nat(i), x(i), y(i), z(i) enddo write(9,'(a)') 'BEGIN_BLOCK_DATAGRID_3D' if(lmo)then write(9,'(a16,i3.3)') 'g98_3D_ORBITAL_#',mo_index(imo) else write(9,'(a)') 'g98_3D_unknown' endif write(9,'(a)') 'DATAGRID_3D_g98Cube' write(9,*) n(3),n(2),n(1) write(9,*) (xo(i)*B2A,i=1,3) do i=3,1,-1 write(9,*) (v(i,j)*B2A,j=1,3) enddo c write values to XSF files do i1=1,n(1) do i2=1,n(2) write(9,'(6(E13.5):)') (val(i1,i2,i3,imo),i3=1,n(3)) enddo enddo c write XFS footer write(9,'(a)') 'END_DATAGRID_3D' write(9,'(a)') 'END_BLOCK_DATAGRID_3D' enddo END xcrysden-1.6.2/F/ttcplane.f0000644000175000017500000002346211712736221014232 0ustar tonetone SUBROUTINE TTCBOXES(TTC) IMPLICIT REAL*8 (A-H,O-Z) REAL*8 TTCVEC(3,6,8),TTC(3,13),TTC12(3,2,8),TTCPOINT(3,7,8) INTEGER TTCBOX(5,8),NTTCVEC(8),TTCPAIR(2,6,8) REAL*8 MINTOL,NULL COMMON/TTCBOXS/ TTCVEC,NTTCVEC,TTCPAIR,TTCPOINT PARAMETER (CON13=1.0d0/3.0d0, CON23=2.0d0/3.0d0, MINTOL=1.d-6, 1 NULL=0.0d0, TWO=2.0d0, TWON=-2.0d0) C ************************************************************************ C TTCVEC --- vectors for all 8 boxes C TTC --- coordinates for RTTC/HTTC points C TTC12 --- to TTC points we add one point in front and one on the back C TTCBOX --- indexes of TTC points, which are in box C NTTCVEC--- number of vectors in box C TTCPAIR--- which pair of points are basis for vector C ************************************************************************ C ***** to each "ttcbox box" we add first and last point, C here are coordinates ***** DATA TTC12/ 1 NULL, TWO, NULL, 1 TWO, NULL, NULL, 2 TWON,TWON, NULL, 2 TWO, NULL, NULL, 3 TWON,TWON, NULL, 3 TWO, TWO, NULL, 4 NULL,TWON, NULL, 4 TWO, TWO, NULL, 5 NULL,TWON, NULL, 5 TWON, NULL, NULL, 6 TWO, TWO, NULL, 6 TWON, NULL, NULL, 7 TWO, TWO, NULL, 7 TWON,TWON, NULL, 8 NULL, TWO, NULL, 8 TWON,TWON, NULL/ C *** indexes of "BOXs" POINTS *** DATA TTCBOX/ 1 3,4,5,6,1, 2 5,6,1,0,0, 3 5,6,1,2,0, 4 6,1,2,0,0, 5 6,1,2,3,4, 6 2,3,4,0,0, 7 2,3,4,5,0, 8 3,4,5,0,0/ C *** how many points are in each box *** DATA NTTCVEC/6,4,5,4,6,4,5,4/ C *** from TTC & TTC12 make TTCPOINTs *** C *** insert first point *** DO I=1,8 DO K=1,3 TTCPOINT(K,1,I)=TTC12(K,1,I) ENDDO ENDDO C *** TTC -> TTCPOINT *** DO I=1,8 !four boxes DO J=2,NTTCVEC(I) !vectors per boxes DO K=1,3 !xyz coor of point TTCPOINT(K,J,I)=TTC(K,TTCBOX(J-1,I)) ENDDO ENDDO ENDDO C *** insert last point *** DO I=1,8 DO K=1,3 TTCPOINT(K,NTTCVEC(I)+1,I)=TTC12(K,2,I) ENDDO ENDDO C FROM POINTS -> VECTORS c print *,'TTCVEC>' DO I=1,8 !four boxes DO J=1,NTTCVEC(I) !vectors per boxes DO K=1,3 !xyz coor of point TTCVEC(K,J,I)=TTCPOINT(K,J+1,I)-TTCPOINT(K,J,I) ENDDO write(6,*) (TTCVEC(k,j,i),k=1,3) ENDDO c print *,'------------------------------' ENDDO c print *,'TTCPOINT' c do i=1,8 c do j=1,7 c print *,(ttcpoint(k,j,i),k=1,3) c enddo c print *,'-------------------------------' c enddo C **** VECPAIR --- prvi vector je vector, ki skupaj z C tvori ravnino, C **** drugi pa pove katera stran je "prava" DATA TTCPAIR/ C *** "BOX1" PAIRS *** 1 1,-2, 2 2,3, 3 3,4, 4 4,5, 5 5,-6, 6 6,5, C *** "BOX2" PAIRS *** 1 1,-2, 2 2,3, 3 3,-4, 4 4,3, 5 0,0, 6 0,0, C *** "BOX3" PAIRS *** 1 1,-2, 2 2,3, 3 3,4, 4 4,-5, 5 5,4, 6 0,0, C *** "BOX4" PAIRS *** 1 1,-2, 2 2,3, 3 3,-4, 4 4,3, 5 0,0, 6 0,0, C *** "BOX5" PAIRS 1 1,-2, 2 2,3, 3 3,4, 4 4,5, 5 5,-6, 6 6,5, C *** "BOX6" PAIRS 1 1,-2, 2 2,3, 3 3,-4, 4 4,3, 5 0,0, 6 0,0, C *** "BOX7" PAIRS 1 1,-2, 2 2,3, 3 3,4, 4 4,-5, 5 5,4, 6 0,0, C *** "BOX8" PAIRS 1 1,-2, 2 2,3, 3 3,-4, 4 4,3, 5 0,0, 6 0,0/ RETURN END C tocka1(p1,p2,p3) pove kje je skatla, tocka2(r1,r2,r3) pa katero tocko C ocenjujemo LOGICAL FUNCTION TTCBOX(NBOX,P1,P2,P3,R1,R2,R3,DVEC) IMPLICIT REAL*8 (A-H,O-Z) REAL*8 TTCPOINT(3,7,8),TTCVEC(3,6,8),DVEC(3,3),IDVEC(3,3) INTEGER NTTCVEC(8),TTCPAIR(2,6,8),TMPVECP1,TMPVECP2 LOGICAL ISINTTC,LTTC(2,8),LDONE COMMON/TTCBOXS/ TTCVEC,NTTCVEC,TTCPAIR,TTCPOINT COMMON/IVEC/ IDVEC !inverse matrix of DVEC(3,3) PARAMETER(CON13=1.0d0/3.0d0, CON23=2.0d0/3.0d0) TTCBOX=.TRUE. LDONE=.FALSE. C x,y,z are "relative coord." of point in box x=r1-p1 y=r2-p2 z=r3-p3 C transform (x,y,z) to DVEC basis xx=x*IDVEC(1,1)+y*IDVEC(2,1)+z*IDVEC(3,1) yy=x*IDVEC(1,2)+y*IDVEC(2,2)+z*IDVEC(3,2) zz=x*IDVEC(1,3)+y*IDVEC(2,3)+z*IDVEC(3,3) c print *,'xx,yy,zz>',xx,yy,zz LTTC(1,1)=YY.GT.1.0d0 LTTC(2,1)=XX.GT.1.0d0 LTTC(1,2)=XX.LT.-1.0d0.AND.YY.LT.-1.0d0 LTTC(2,2)=XX.GT.1.0d0 LTTC(1,3)=XX.LT.-1.0d0.AND.YY.LT.-1.0d0 LTTC(2,3)=XX.GT.1.0d0.AND.YY.GT.1.0d0 LTTC(1,4)=YY.LT.-1.0d0 LTTC(2,4)=XX.GT.1.0d0.AND.YY.GT.1.0d0 LTTC(1,5)=YY.LT.-1.0d0 LTTC(2,5)=XX.LT.-1.0d0 LTTC(1,6)=XX.GT.1.0d0.AND.YY.GT.1.0d0 LTTC(2,6)=XX.LT.-1.0d0 LTTC(1,7)=XX.GT.1.0d0.AND.YY.GT.1.0d0 LTTC(2,7)=XX.LT.-1.0d0.AND.YY.LT.-1.0d0 LTTC(1,8)=YY.GT.1.0d0 LTTC(2,8)=XX.LT.-1.0d0.AND.YY.LT.-1.0d0 C *** first check 3th part of the box ** I=NTTCVEC(NBOX) PX=P1+TTCPOINT(1,I,NBOX)*DVEC(1,1)+ 1 TTCPOINT(2,I,NBOX)*DVEC(2,1)+TTCPOINT(3,I,NBOX)*DVEC(3,1) PY=P2+TTCPOINT(1,I,NBOX)*DVEC(1,2)+ 1 TTCPOINT(2,I,NBOX)*DVEC(2,2)+TTCPOINT(3,I,NBOX)*DVEC(3,2) PZ=P3+TTCPOINT(1,I,NBOX)*DVEC(1,3)+ 1 TTCPOINT(2,I,NBOX)*DVEC(2,3)+TTCPOINT(3,I,NBOX)*DVEC(3,3) C is (R1,R2,R3) in the 3TH part of the box if(lttc(2,nbox))then c print *,'PART> 3th',xx,yy ldone=.true. if(.not.isinttc(nbox,ttcpair(1,i,nbox),ttcpair(2,i,nbox), 1 px,py,pz,r1,r2,r3,dvec)) ttcbox=.false. endif DO I=1,NTTCVEC(NBOX)-1 c print *,'NTTCVEC> i=',i,'; xx,yy,zz>',xx,yy,zz TMPVECP1=TTCPAIR(1,I,NBOX) TMPVECP2=TTCPAIR(2,I,NBOX) c print *,'vec1=',tmpvecp1 c print *,'vec2=',tmpvecp2 C IS POINT(R1,R2,R3) ON THE RIGHT SIDE OF THE PLANE????? PX=P1+TTCPOINT(1,I,NBOX)*DVEC(1,1)+ 1 TTCPOINT(2,I,NBOX)*DVEC(2,1)+TTCPOINT(3,I,NBOX)*DVEC(3,1) PY=P2+TTCPOINT(1,I,NBOX)*DVEC(1,2)+ 1 TTCPOINT(2,I,NBOX)*DVEC(2,2)+TTCPOINT(3,I,NBOX)*DVEC(3,2) PZ=P3+TTCPOINT(1,I,NBOX)*DVEC(1,3)+ 1 TTCPOINT(2,I,NBOX)*DVEC(2,3)+TTCPOINT(3,I,NBOX)*DVEC(3,3) c print *,'PXYZ> ',px,py,pz C is (R1,R2,R3) in the 1ST part of the box; C for 1ST part i must be 1 -> this means: first point and first vector if(i.eq.1.and.lttc(1,nbox))then c print *,'PART> 1st',xx,yy ldone=.true. if(.not.isinttc(nbox,tmpvecp1,tmpvecp2, 1 px,py,pz,r1,r2,r3,dvec)) ttcbox=.false. endif C is (R1,R2,R3) in the 2ND part of the box: if(i.gt.1.and.(.not.ldone))then c print *,'PART> 2nd',xx,yy if(.not.isinttc(nbox,tmpvecp1,tmpvecp2, 1 px,py,pz,r1,r2,r3,dvec)) ttcbox=.false. endif ENDDO !DO I=1,NVEC(NBOX) RETURN END LOGICAL FUNCTION ISINTTC(NBOX,NVC1,NVC2,P1,P2,P3,R1,R2,R3,dvec) REAL*8 P1,P2,P3,R1,R2,R3 REAL*8 DVEC(3,3),MINTOL REAL*8 A,B,C !components of normal vector REAL*8 D,KFC ! Ax + By + Cz + D = 0 REAL*8 AVEC,BVEC,CVEC,AVEC2,BVEC2,CVEC2 C if nvec2<0 negative=.true.; third vector is turned upside down LOGICAL NEGATIVE REAL*8 TTCPOINT(3,7,8),TTCVEC(3,6,8) INTEGER NTTCVEC(8),TTCPAIR(2,6,8) COMMON/TTCBOXS/ TTCVEC,NTTCVEC,TTCPAIR,TTCPOINT PARAMETER (MINTOL=1.0d-6) NVEC1=NVC1 NVEC2=NVC2 c print *,'nvec1=',nvec1,', nvec2=',nvec2 NEGATIVE=.FALSE. ISINTTC=.FALSE. IF(NVEC2.LT.0.)THEN NVEC2=-NVEC2 NEGATIVE=.TRUE. ENDIF C plvec is in coloumn major mode, but dvec is in row-major mode C *** transform plvec1 in XYZ basis *** AVEC=DVEC(1,1)*TTCVEC(1,NVEC1,NBOX)+ 1 DVEC(2,1)*TTCVEC(2,NVEC1,NBOX)+DVEC(3,1)*TTCVEC(3,NVEC1,NBOX) BVEC=DVEC(1,2)*TTCVEC(1,NVEC1,NBOX)+ 1 DVEC(2,2)*TTCVEC(2,NVEC1,NBOX)+DVEC(3,2)*TTCVEC(3,NVEC1,NBOX) CVEC=DVEC(1,3)*TTCVEC(1,NVEC1,NBOX)+ 1 DVEC(2,3)*TTCVEC(2,NVEC1,NBOX)+DVEC(3,3)*TTCVEC(3,NVEC1,NBOX) A=BVEC*DVEC(3,3)-DVEC(3,2)*CVEC B=CVEC*DVEC(3,1)-DVEC(3,3)*AVEC C=AVEC*DVEC(3,2)-DVEC(3,1)*BVEC C *** transform ttcvec2 in XYZ basis *** AVEC2=DVEC(1,1)*TTCVEC(1,NVEC2,NBOX)+ 1 DVEC(2,1)*TTCVEC(2,NVEC2,NBOX)+DVEC(3,1)*TTCVEC(3,NVEC2,NBOX) BVEC2=DVEC(1,2)*TTCVEC(1,NVEC2,NBOX)+ 1 DVEC(2,2)*TTCVEC(2,NVEC2,NBOX)+DVEC(3,2)*TTCVEC(3,NVEC2,NBOX) CVEC2=DVEC(1,3)*TTCVEC(1,NVEC2,NBOX)+ 1 DVEC(2,3)*TTCVEC(2,NVEC2,NBOX)+DVEC(3,3)*TTCVEC(3,NVEC2,NBOX) IF(A*AVEC2+B*BVEC2+C*CVEC2.LT.0.0d0)THEN A=-A B=-B C=-C ENDIF c print *,'TTCVEC:',TTCVEC(1,NVEC1,NBOX),TTCVEC(2,NVEC1,NBOX), c 1 TTCVEC(3,NVEC1,NBOX)*DVEC(3,1) c print *,'DVEC',DVEC(3,1),DVEC(3,2),DVEC(3,3) c print *,'p1,p2,p3=',p1,p2,p3 c print *,'r1,r2,r3=',r1,r2,r3 D=-A*P1-B*P2-C*P3 c print *,'a,b,c,d::',a,b,c,d KFC=A*R1+B*R2+C*R3+D c print *,'kfc1=',kfc,', kfc2=',A*R1+B*R2+C*R3-(-A*P1-B*P2-C*P3) IF(KFC.GE.(0.0d0-MINTOL).AND.(.NOT.NEGATIVE)) ISINTTC=.TRUE. IF(KFC.LE.(0.0d0+MINTOL).AND.NEGATIVE) ISINTTC=.TRUE. c print *,'ISINTTC=',isinttc RETURN END xcrysden-1.6.2/F/kPath-old.f0000644000175000017500000001750011712736221014237 0ustar tonetone program kpath c ************************************ c Usage: kpath c ************************************ c k-list-dat should look like: c ---------------------------- c KP, NK, IDV, Emin, Emax ... # of special k-points, # of-points, c devider (IDV), Emin, Emax c IX IY IZ LABEL ... ix, iy, iz -> k-coordinate: (ix,iy,iz)/idv c REPEAT KP times IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' CHARACTER*128 file1,file2 INTEGER icoor(3,NAC), nkp_seg(NAC), NAT(NAC) REAL*8 idvec(3,3), dis(NAC), frcoor(3,NAC), coor(3,NAC) REAL*8 ivm(3,3) REAL*8 dis_sum, rpv(3,3), rcv(3,3), mat(3,3), dvec(3,3) REAL*8 X(NAC), Y(NAC), Z(NAC) CHARACTER*10 label(NAC) CHARACTER*4 input_vec LOGICAL ldiv COMMON/IVEC/ IDVEC COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR PARAMETER ( TOLMIN=1.0d-8 ) include 'get.inc' if ( iargc() .lt. 2 ) then write(*,*) 'Usage: kpath ' STOP endif c read XSF file Call GetArg(1,FILE1) len=index(file1,' ')-1 Open(11,FILE=FILE1(1:len),STATUS='OLD') c reciprocal vectors are in form: c --------------------------------- c | x1 y1 z1 | | 11 21 31 | c IDVEC = | x2 y2 z2 | = | 12 22 32 | c | x3 y3 z3 | | 13 23 33 | c calculate the distance between k-coordinates and estimate number c of points for each segment c read k-list-file Call GetArg(2,FILE2) len=index(file2,' ')-1 Open(21,FILE=FILE2(1:len),STATUS='OLD') read(21,*,END=99) KP, NK, IDV, Emin, Emax read(21,'(A4)') input_vec if (kp.le.1) then write(*,*) 'less then two special k-points selected' stop endif Call ReadF1('DIM-GROUP',IGROUP,IDIM) c read both sets of reciprocal vectors if ( input_vec(1:4) .eq. 'prim' ) then Call ReadF1('RECIP-CONVVEC', IDUM1, IDUM2) do i=1,3 do j=1,3 rcv(j,i) = idvec(j,i) enddo enddo Call ReadF1('RECIP-PRIMVEC', IDUM1, IDUM2) do i=1,3 do j=1,3 rpv(j,i) = idvec(j,i) enddo enddo else Call ReadF1('RECIP-PRIMVEC', IDUM1, IDUM2) do i=1,3 do j=1,3 rpv(j,i) = idvec(j,i) enddo enddo Call ReadF1('RECIP-CONVVEC', IDUM1, IDUM2) do i=1,3 do j=1,3 rcv(j,i) = idvec(j,i) enddo enddo endif c ************************************************************** c get the transpose of idvec; this is the matrix for getting the c Cartesian coordinates. call MatTranspose(idvec, ivm, 3, 3) c ************************************************************** dis_sum=0.0d0 do i=1,KP read(21,*,END=99) (icoor(j,i),j=1,3), label(i) do j=1,3 frcoor(j,i) = dble(icoor(j,i)) / dble(idv) enddo c transform coor from fractional to cartesian COORDINATES coor(1,i) = frcoor(1,i)*ivm(1,1) + 1 frcoor(2,i)*ivm(2,1) + frcoor(3,i)*ivm(3,1) coor(2,i) = frcoor(1,i)*ivm(1,2) + 1 frcoor(2,i)*ivm(2,2) + frcoor(3,i)*ivm(3,2) coor(3,i) = frcoor(1,i)*ivm(1,3) + 1 frcoor(2,i)*ivm(2,3) + frcoor(3,i)*ivm(3,3) c print *,'i, coor::', i, coor(1,i), coor(2,i), coor(3,i) if (i .gt. 1) then dis(i-1) = Dist( coor(1,i), coor(2,i), coor(3,i), 1 coor(1,i-1), coor(2,i-1), coor(3,i-1) ) c print *, 'dis::', i-1, dis(i-1) dis_sum = dis_sum + dis(i-1) endif enddo call ZeroMat(mat,3,3) c if needed convert frcoor to other basis (prim/conv) if (IConvCoor(igroup,input_vec,rcv) .eq. IGET_PRIM) then Call ReadF1('PRIMVEC', idum1, idum2) c call MatMult(dvec, 3, 3, rcv, 3, mat) c bug resolved thanks to Florent Boucher call MatMult(rcv, 3, 3, dvec, 3, mat) call GetIntCoor(frcoor, icoor, mat, idv, kp) else if (IConvCoor(igroup,input_vec,rcv) .eq. IGET_CONV) then c convert from primitive to conventional frcoor Call ReadF1('CONVVEC', idum1, idum2) c call MatMult(dvec, 3, 3, rpv, 3, mat) c bug resolved thanks to Florent Boucher call MatMult(rpv, 3, 3, dvec, 3, mat) call GetIntCoor(frcoor, icoor, mat, idv, kp) endif c najmanjsi skupni delitelj bo PRODUCT(nkp_seg(i),i=1,kp-1)*idv, c zato morajo biti nkp_seg zelo lepo deljivi, mogoce z deset ali c kaj takega. KP, ki jo je podal uporabnik naj bo samo za informacijo!!! k_aver = nint( dble(nk) / dble(kp-1)) nn = 10 if (k_aver .lt. 40) nn = 5 if (k_aver .lt. 30) nn = 4 if (k_aver .lt. 20) nn = 3 if (k_aver .lt. 10) nn = 2 100 continue c print *,'nn::', nn c estimate number of k-points for each segment mult=1 nkp_max = 1 do i=1,KP-1 c here nk_seg(i) is nn times smaler then it should be nkp_seg(i) = nint( dble(nk) * dis(i) / (dis_sum * nn) ) c print *, 'ratio:', dis(i) / dis_sum, c 1 ' nkp_seg(',i,')', nkp_seg(i) if (nkp_seg(i) .gt. nkp_max) nkp_max = nkp_seg(i) mult = mult * nkp_seg(i) enddo c print *, 'mult, nkp_max::', mult, nkp_max if (kp.gt.3) then do i=nkp_max,2,-1 ldiv=.true. do j=1,kp-1 if ( Mod(nkp_seg(j),i) .ne. 0 ) ldiv=.false. c print *, 'i, j, Mod(nkp_seg(j),i)', i, j, c $ mod(nkp_seg(j),i) enddo if (ldiv) then c print *, 'mult & i:', i mult = mult / i endif enddo endif mult=mult*nn if ( idv*mult .gt. 9999) then c idv_common*mult is to large to fit to i4 format c (i4 because some (ix,iy,iz) might be negative, so we need one c place for minus); ENLARGE the nn if(nn.ge.10) nn=2*nn if(nn.eq.5) nn=10 if(nn.eq.4) nn=5 if(nn.eq.3) nn=4 if(nn.eq.2) nn=3 goto 100 endif c print *, 'mult #2', mult c ************************************************* c *** get the right fractional coordinates for WIEN c ************************************************* new_idv = mult*idv c now write the K-list do i=1,kp-1 nkp_nn = nkp_seg(i)*nn if (nkp_seg(i) .eq. 0) then WRITE(*,*) 1 'ERROR: IDV*NK to big! Decrease number of k-points' STOP endif ix = icoor(1,i)*mult iy = icoor(2,i)*mult iz = icoor(3,i)*mult if (i.eq.1) then write(*,'(A10,4I5,F5.1,2F5.2,2x,A30)') 1 label(i), ix, iy, iz, new_idv, 2.0, Emin, Emax, $ 'k-list generated by XCrySDen' else write(*,'(A10,4I5,F5.1)') label(i), ix, iy, iz, new_idv, 2.0 endif c print *,'i,nkp_seg::', i, nkp_seg(i) do j=1,nkp_nn-1 ix = icoor(1,i)*mult + 1 j*mult*(icoor(1,i+1) - icoor(1,i))/nkp_nn iy = icoor(2,i)*mult + 1 j*mult*(icoor(2,i+1) - icoor(2,i))/nkp_nn iz = icoor(3,i)*mult + 1 j*mult*(icoor(3,i+1) - icoor(3,i))/nkp_nn write(*,'(10X,4I5,F5.1)') ix, iy, iz, new_idv, 2.0 enddo enddo ix = icoor(1,kp)*mult iy = icoor(2,kp)*mult iz = icoor(3,kp)*mult write(*,'(A10,4I5,F5.1)') label(kp), ix, iy, iz, new_idv, 2.0 write(*,'(A3)') 'END' GOTO 1000 99 continue STOP 'unexpected end of k-list-file' 1000 continue END xcrysden-1.6.2/F/Makefile0000644000175000017500000000614213556022211013700 0ustar tonetoneTOPDIR = $(PWD)/.. include ../Make.sys .SUFFIXES : .o .f .f90 .f90.o: $(FC) $(FFLAGS) -c $< .f.o: $(FC) $(FFLAGS) -c $< OBJ = gengeom.o \ multhexa.o \ multatom.o \ box.o \ ttcplane.o \ readf1.o \ auxil.o \ wigner.o \ wigner12d.o \ reduce.o \ convexhull.o \ p2c.o OBJ2 = calplane.o OBJ3 = atomlab.o \ readXYZ.o \ readf1.o \ auxil.o OBJ5 = str2xcr.o \ auxil.o OBJ6 = multislab.o \ readf1.o \ auxil.o \ writeftn34.o OBJ7 = savestruct.o \ readf1.o \ auxil.o OBJ8 = kPath.o \ getintcoor.o \ auxil.o \ readf1.o OBJ88= pwKPath.o \ auxil.o \ readf1.o OBJ9 = wn_readbands.o OBJ10 = SRC_spaghetti/get_k.o SRC_spaghetti/get_ei.o OBJ11 = pwi2xsf_old.o OBJ111= pwi2xsf.o latgen.o auxil.o pw_util.o OBJ12 = fsReadBXSF.o auxil.o wigner.o convexhull.o reduce.o OBJ13 = pwo_xsf2xsf.o latgen.o auxil.o pw_util.o all: compile install compile: spaghetti gengeom calplane atomlab recvec str2xcr \ fracCoor multislab ftnunit savestruct kPath pwKPath \ fhi_inpini2ftn34 fhi_coord2xcr \ wn_readbands wn_readbakgen pw fsReadBXSF \ cube2xsf xsf2cube spaghetti: cd SRC_spaghetti; $(MAKE) gengeom: $(OBJ) $(FC) $(FFLAGS) -o gengeom $(OBJ) calplane: $(OBJ2) $(FC) $(FFLAGS) -o calplane $(OBJ2) atomlab: $(OBJ3) $(FC) $(FFLAGS) -o atomlab $(OBJ3) recvec: recvec.o auxil.o $(FC) $(FFLAGS) -o recvec recvec.o auxil.o str2xcr: $(OBJ5) $(FC) $(FFLAGS) -o str2xcr $(OBJ5) fracCoor: fracCoor.o auxil.o readf1.o $(FC) $(FFLAGS) -o fracCoor fracCoor.o auxil.o readf1.o multislab: $(OBJ6) $(FC) $(FFLAGS) -o multislab $(OBJ6) savestruct: $(OBJ7) $(FC) $(FFLAGS) -o savestruct $(OBJ7) ftnunit: ftnunit.o $(FC) $(FFLAGS) -o ftnunit ftnunit.o kPath: $(OBJ8) $(FC) $(FFLAGS) -o kPath $(OBJ8) pwKPath: $(OBJ88) $(FC) $(FFLAGS) -o pwKPath $(OBJ88) fhi_inpini2ftn34: fhi_inpini2ftn34.o $(FC) $(FFLAGS) -o fhi_inpini2ftn34 fhi_inpini2ftn34.o fhi_coord2xcr: fhi_coord2xcr.o $(FC) $(FFLAGS) -o fhi_coord2xcr fhi_coord2xcr.o wn_readbands: $(OBJ9) $(FC) $(FFLAGS) -o wn_readbands $(OBJ9) $(OBJ10) wn_readbakgen: wn_readbakgen.o $(FC) $(FFLAGS) -o wn_readbakgen wn_readbakgen.o pw: pwi2xsf pwi2xsf_old pwo_xsf2xsf pwi2xsf_old: $(OBJ11) $(FC) $(FFLAGS) -o pwi2xsf_old $(OBJ11) pwi2xsf: $(OBJ111) $(FC) $(FFLAGS) -o pwi2xsf $(OBJ111) pwo_xsf2xsf: $(OBJ13) $(FC) $(FFLAGS) -o pwo_xsf2xsf $(OBJ13) fsReadBXSF: $(OBJ12) $(FC) $(FFLAGS) -o fsReadBXSF $(OBJ12) cube2xsf: cube2xsf.o $(FC) $(FFLAGS) -o cube2xsf cube2xsf.o xsf2cube: xsf2cube.o $(FC) $(FFLAGS) -o xsf2cube xsf2cube.o PROGRAMS = \ gengeom calplane atomlab recvec str2xcr fracCoor \ multislab savestruct ftnunit kPath pwKPath \ fhi_inpini2ftn34 fhi_coord2xcr \ wn_readbands wn_readbakgen pwi2xsf pwi2xsf_old pwo_xsf2xsf fsReadBXSF \ cube2xsf xsf2cube install: for prog in $(PROGRAMS); do \ if test -x $$prog.exe ; then cp $$prog.exe ../bin ; \ elif test -x $$prog ; then cp $$prog ../bin ; fi; \ done clean: -rm -f *.o *.mod gdb.com for prog in $(PROGRAMS); do \ if test -f $$prog.exe ; then rm $$prog.exe; \ elif test -f $$prog ; then rm $$prog; fi; \ done -cd SRC_spaghetti; rm -f *.o -cd SRC_nn; rm -f nn *.o $(OBJ): mode.inc xcrysden-1.6.2/F/getintcoor.f0000644000175000017500000001164111712736221014571 0ustar tonetone Integer Function IConvCoor(igroup, input_vec, rcv) CHARACTER*4 input_vec REAL*8 rcv(3,3), scalar, tolmin include 'get.inc' tolmin=1.0d-6 C-------------------- C GROUP NUMBERS:: C-------------------- C N. symbol C 1.....P C 2.....A (=CXY) C 3.....B (=CXZ) C 4.....C (=CYZ) C 5.....F C 6.....I (body centered) C 7.....R C 8.....H C 9.....TRIGONAL_NOT_RHOMOHEDRAL (this is basically hexagonal) c ------------------------------------------------------------------------ c **** **** WIENXX definition:: c ------------------------------------------------------------------------ c H, R, P, C(monoclinic) --> correspond to PRIMITIVE reciprocal vectors c ^^^^^^^^^^^^ is this really true !!! c F, B, C(orthorhombic) --> correspond to CONVENTIONAL reciprocal vectors if ( (igroup.eq.2 .or. igroup.eq.4 .or. $ igroup.eq.5 .or. igroup.eq.6) ) then c c CASE: A, C, F, I(=body-centered) c c bug resolved by Florent Boucher if ( input_vec(1:4).eq.'prim' ) then IConvCoor=IGET_CONV else IConvCoor=IDO_NOTHING endif RETURN elseif ( igroup.eq.3 ) then c c CASE: B, i.e, CXZ centered c c check if it is orthorombic or monoclinic !!! c if gamma.eq.90.0d0 -> scalar product is zero !!! scalar = rcv(1,1)*rcv(2,1) + rcv(1,2)*rcv(2,2) + $ rcv(1,3)*rcv(2,3) if ( abs(scalar).lt.tolmin .and. $ input_vec(1:4).eq.'prim') then c it is orthorombic IConvCoor=IGET_CONV else if ( abs(scalar).ge.tolmin .and. $ input_vec(1:4).eq.'conv' ) then c it is monoclinic IConvCoor=IGET_PRIM endif RETURN else c c CASE: P, H, R c if ( input_vec(1:4).eq.'conv' ) then IConvCoor=IGET_PRIM RETURN endif endif IConvCoor=IDO_NOTHING RETURN END subroutine GetIntCoor(fr, icoo, mat, idv, kp) include 'param.inc' INTEGER icoo(3,NAC) REAL*8 fr(3,NAC), coo(3,NAC), mat(3,3) do i=1,kp coo(1,i)=fr(1,i)*mat(1,1) + fr(2,i)*mat(1,2) + fr(3,i)*mat(1,3) coo(2,i)=fr(1,i)*mat(2,1) + fr(2,i)*mat(2,2) + fr(3,i)*mat(2,3) coo(3,i)=fr(1,i)*mat(3,1) + fr(2,i)*mat(3,2) + fr(3,i)*mat(3,3) c print *, 'FR:: ',fr(1,i),fr(2,i),fr(3,i) c print *, 'COO:: ',coo(1,i),coo(2,i),coo(3,i) enddo c determine new IDV idv = IGetIDV(coo, kp) c print *,'IDV::',idv c get new icoo do i=1,kp do j=1,3 icoo(j,i) = nint( dble(idv) * coo(j,i) ) enddo c print *, 'ICOO:: ',icoo(1,i),icoo(2,i),icoo(3,i) enddo END Integer Function IGetIDV(coor, kp) include 'param.inc' IMPLICIT REAL*8 (A-H,O-Z) REAL*8 coor(3,NAC), min INTEGER imen(300) PARAMETER (TOLMIN = 1.0d-5) do i=1,kp n=(i-1)*3 do 100 j=1,3 imen(n+j) = 0 imin = 1 min = 1.0d0 c if coor > 1.0 -> subtract integer part!!! p = abs(coor(j,i)) - dint(coor(j,i)) c print *, 'POINT(',i,',',j,'):: ',p if ( p.lt.TOLMIN .or. abs(p-1.0d0).lt.TOLMIN ) then imen(n+j) = 1 goto 100 endif do ii=1,100 !100 should be more then enough for special points do jj=1,ii f = abs( p - dble(jj)/dble(ii) ) c print *,'F::',f if ( f .lt. min ) then min = f imin = ii endif if ( f .lt. TOLMIN ) then imen(n+j) = ii goto 100 endif enddo enddo if ( imen(n+j) .eq. 0 ) imen(n+j)=imin c print *, 'IMEN:: ',imen(n+j),imin c print *,' ' 100 continue enddo c *** now find the minimum common multiplier 110 continue iss = imen(1) idv = iss n = 3*kp do i=2,n iss = idv idv = IGetMinMult( iss, imen(i) ) c print *, 'IGETMULT:: ', idv enddo IGetIDV = idv RETURN END Integer Function IGetMinMult( ia, ib) if ( ia.eq.0 .and. ib.eq.0 ) then IGetMinMult=1 RETURN endif c suppose that: ia>ib --> check if it is if ( ib .gt. ia ) then ic = ia ia = ib ib = ic endif if ( ib .eq. 0 ) then IGetMinMult=ia RETURN endif ic = 1 c now: ia is greater than ib */ do i=1,ib if ( mod(ia*ib,ib) .eq. 0 ) then ic = i goto 120 endif enddo 120 CONTINUE IGetMinMult=ia*ic RETURN END xcrysden-1.6.2/F/fhi_coord2xcr.f0000644000175000017500000000502011712736221015141 0ustar tonetonec ******************************************* program InpIni2XCR implicit real*8 (a-h,o-z) c Usage: inpini2xcr inpini_file [get_species] c c if get_species argument is present (it can be what-ever) c then just return the list of species c ******************************************* include 'param.inc' PARAMETER( !type of execution $ IGET_FTN34=0, ! produce ftn34 $ IGET_SPECIES=1, ! get species names $ BOHR=0.529177d0 ! bohr $ ) character*256 file character*20 $ file_out, $ name(NAC), $ coor_name(NAC) integer $ nat(NAC), $ coor_index(NAC) logical $ tford(NAC) real*8 $ a(3,3), $ coor(3,NAC) narg=iargc() if (narg.lt.1 .or. narg.gt.2) $ stop 'Usage: fhi_coord2xcr [getspecies]' iexec_type = IGET_FTN34 if (narg.eq.2) iexec_type = IGET_SPECIES call getarg(1,file) len = index(file,' ') - 1 open(unit=1, file=file(1:len), status='old') file_out = 'fhi_coord.xcr' open(unit=2, file=file_out, status='unknown') do i=1,3 read(1,*) (a(j,i), j=1,3) do j=1,3 a(j,i) = BOHR*a(j,i) enddo enddo read(1,*) n_all_species iat = 0 do i=1,n_all_species read(1,*) n_i_species read(1,*) name(i) do ii=1,n_i_species iat = iat + 1 read(1,*) (coor(j,iat), j=1,3), tford(iat) coor_name(iat) = name(i) coor_index(iat) = i do j=1,3 coor(j,iat) = BOHR * coor(j,iat) enddo enddo enddo c *** c *** RETURN list of species c *** if (iexec_type .eq. IGET_SPECIES)then open(unit=3,file='fhi_species_name.list', status='unknown') write(3,*) n_all_species write(3,'(a10)') (name(i),i=1,n_all_species) else c *** c *** WRITE XSF file c *** open(unit=4, file='fhi_species_nat.list', status='old') read(4,*) n_all_species read(4,*) (nat(i),i=1,n_all_species) write(2,*) 'DIM-GROUP' write(2,*) '3 1' write(2,*) 'PRIMVEC' write(2,1000) a write(2,*) 'PRIMCOORD' write(2,*) iat, 1 do i=1,iat write(2,1001) nat(coor_index(i)), (coor(j,i), j=1,3) enddo endif 1000 format(2(3(F15.9,2X),/),3(F15.9,2X)) 1001 format(I5,3(F15.9,2X)) END xcrysden-1.6.2/F/multatom.f0000644000175000017500000004324311712736221014261 0ustar tonetone SUBROUTINE MULTATOM(CELLC,INCELL,IGROUP,NATOM,TPH,IDIM,IMODE2) C TPH...FLAG FOR TRIPLE-PRIMITIV-HEXAGONAL CELL IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' c ********************************************************************** c in order to allow compiling on non-g77 compilers; replace NATOM arrays c with INATOM parameter c ********************************************************************** LOGICAL TPH REAL*8 X(NAC),Y(NAC),Z(NAC),DVEC(3,3),CELLC(3,INCELL), * XC(6*INATOM),YC(6*INATOM),ZC(6*INATOM), * XTPH(INATOM),YTPH(INATOM),ZTPH(INATOM),TPHFRAME(3,3), * IDVC(3,3), FV(NAC,3), small_number INTEGER TPHFLAG(INATOM) INTEGER NAT(NAC) !I THINK 100 ATOMS PER CELL IS MORE THAN ENOUGH LOGICAL EQUAL,LPRINT,ISINSIDE,BOX COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR COMMON/DIR/ NXDIR,NYDIR,NZDIR COMMON/FV/ FV,NFV PARAMETER (CON13=1.0d0/3.0d0, CON23=2.0d0/3.0d0, $ small_number=1.0d-10) include 'mode.inc' C ************************************************************************* C **** data for TPH frames *** DATA TPHFRAME/ 1 0.0d0, 0.0d0, 0.0d0, 2 CON23, CON13, 0.0d0, 3 CON13, CON23, 0.0d0/ c print *,'MULTATOM> I am IN' c print *,'MULTATOM> NATR,NCELL',natr,ncell c print *,'INCELL,IGROUP',incell,igroup c print *,'NXDIR, NYDIR, NZDIR::',nxdir,nydir,nzdir c print *,'CELLC:: ',((CELLC(i,j),i=1,3),j=1,incell) c print *,'DVEC:: ',((DVEC(i,j),i=1,3),j=1,3) c print *,'NAT::',(NAT(i),i=1,natr) c print *,'X::',(X(i),i=1,natr) c print *,'Y::',(Y(i),i=1,natr) c print *,'Z::',(Z(i),i=1,natr) print *,'Entering multatom routine' c idv will be used for calculating fractional coorinates call InvertSqMat123(dvec, idvc, idim) NX=NXDIR NY=NYDIR NZ=NZDIR C do we have M2_CELL or M2_TR_ASYM_UNIT??? C if M2_TR_ASYM_UNIT then reduce (NXDIR,NYDIR,NZDIR) by 1 IF (IMODE2.EQ.M2_TR_ASYM_UNIT)THEN NXDIR=NXDIR-1 NYDIR=NYDIR-1 NZDIR=NZDIR-1 ENDIF IF(IDIM.LT.3) THEN NZDIR=0 NZ =0 ENDIF IF(IDIM.LT.2) THEN NYDIR=0 NY =0 ENDIF IF(IDIM.LT.1) THEN NXDIR=0 NX =0 ENDIF C **** more data for TPH; crystal cells cut-out DATA CALL BOXES C ************************************************ C ****** ATOMS SECTION ****** C ************************************************ C WRITE "ATOMS" TO FILE2; MARK THE BEGINNING OF "ATOMS" SECTION WRITE(12,*) 'ATOMS' C THIS IS USED FOR CUT-OFF CRITERIA (LOOK BELOW) DNX=0.0d0 DNY=0.0d0 DNZ=0.0d0 IF(NXDIR.GT.0 .and. IDIM.GT.0)DNX=DBLE(NXDIR) IF(NXDIR.EQ.0 .and. IDIM.GT.0)DNX=1.0d0 IF(NYDIR.GT.0 .and. IDIM.GT.1)DNY=DBLE(NYDIR) IF(NYDIR.EQ.0 .and. IDIM.GT.1)DNY=1.0d0 IF(NZDIR.GT.0 .and. IDIM.GT.2)DNZ=DBLE(NZDIR) IF(NZDIR.EQ.0 .and. IDIM.GT.2)DNZ=1.0d0 DO I=0,NXDIR DO J=0,NYDIR DO K=0,NZDIR DI=DBLE(I) DJ=DBLE(J) DK=DBLE(K) DO II=1,NATR rx=x(ii)*idvc(1,1) + y(ii)*idvc(2,1) + z(ii)*idvc(3,1) ry=x(ii)*idvc(1,2) + y(ii)*idvc(2,2) + z(ii)*idvc(3,2) rz=x(ii)*idvc(1,3) + y(ii)*idvc(2,3) + z(ii)*idvc(3,3) DO IN=1,INCELL C lprint is logical parameter "for crystal-cut-out" lprint=.true. c ***************************************************** c COORDINATES must be within [-0.5,0.5), check that !!! c ***************************************************** c There was a roundoff problem for as simple structure as NaCl c (problem reported by W. YU). To avoid this round-off problem let's c add a small number ACMP=CELLC(1,IN)+rx + small_number BCMP=CELLC(2,IN)+ry + small_number CCMP=CELLC(3,IN)+rz + small_number print *,'Before: Xcmp:', nat(ii), acmp, bcmp, ccmp IF(IMODE2.EQ.M2_CELL) then if (idim.gt.0) ACMP=ACMP-DINT(ACMP) if (idim.gt.1) BCMP=BCMP-DINT(BCMP) if (idim.gt.2) CCMP=CCMP-DINT(CCMP) endif c now we subtract that small number ACMP=ACMP - small_number BCMP=BCMP - small_number CCMP=CCMP - small_number print *,' after: Xcmp:', nat(ii), acmp, bcmp, ccmp ACMP=ACMP+DI BCMP=BCMP+DJ CCMP=CCMP+DK c print *,'MULTATOM> ACMP,BCMP,CCMP',ACMP,BCMP,CCMP XX=ACMP*DVEC(1,1)+BCMP*DVEC(2,1)+CCMP*DVEC(3,1) YY=ACMP*DVEC(1,2)+BCMP*DVEC(2,2)+CCMP*DVEC(3,2) ZZ=ACMP*DVEC(1,3)+BCMP*DVEC(2,3)+CCMP*DVEC(3,3) c XX=XPOS+X(II) c YY=YPOS+Y(II) c ZZ=ZPOS+Z(II) C if M2_TR_ASYM_UNIT then SKIP CUTTING IF(IMODE2.EQ.M2_TR_ASYM_UNIT) GOTO 99 C ************************************************************************* C WE WANT THAT CRYSTALL IS CUT OUT NICELY ON THE OUT-BORDERS C IF .not."OUT OF RANGE" -> GO C *** CUTTING for .NOT.TPH *** if(.not.tph.and.( 1 (i.eq.0.or.i.eq.nxdir).or. 1 (j.eq.0.or.j.eq.nydir).or. 2 (k.eq.0.or.k.eq.nzdir)) ) then c *** if we are dealing with SLAB, we don't perform AB cutting if(idim.eq.3)then c *** *** lower AB plane *** *** if(.not.isinside(dvec,1,2,3,0.0d0,0.0d0, 1 0.0d0,xx,yy,zz)) lprint=.false. c *** *** upper AB plane if(.not.isinside(dvec,1,2,-3, 1 dnz*dvec(3,1), 2 dnz*dvec(3,2), 3 dnz*dvec(3,3),xx,yy,zz)) lprint=.false. endif c *** *** lower AC plane if(.not.isinside(dvec,1,3,2,0.0d0,0.0d0,0.0d0, 1 xx,yy,zz)) lprint=.false. c *** *** upper AC plane if(.not.isinside(dvec,1,3,-2, 1 dny*dvec(2,1), 2 dny*dvec(2,2), 3 dny*dvec(2,3),xx,yy,zz)) lprint=.false. c *** *** lower BC plane if(.not.isinside(dvec,2,3,1,0.0d0,0.0d0,0.0d0, 1 xx,yy,zz)) lprint=.false. c *** *** upper BC plane if(.not.isinside(dvec,2,3,-1, 1 dnx*dvec(1,1), 2 dnx*dvec(1,2), 3 dnx*dvec(1,3),xx,yy,zz)) lprint=.false. endif c *** *** if (lprint=false).or.(polymer(idim=1)).or. c (imode2=m2_tr_asym_unit) -> print atom coordinates 99 continue c ******************************************************************** c t.k: this is bug for (idim.eq.1), since it should be cutted accoring c to dvec(1,*) criteria c ******************************************************************** print *,'nat, xx, yy, zz, accepted:', $ nat(ii),xx,yy,zz,lprint if((idim.eq.1)) then if ( (XX.gt.-1.0d-6 .AND. $ XX.lt.(dvec(1,1)*dnx+1.0d-6) .AND. $ imode2.eq.m2_cell) .OR. $ imode2.eq.m2_tr_asym_unit ) then WRITE(12,21) NAT(II),XX,YY,ZZ, $ (FV(II,ifv),ifv=1,nfv) endif else if((lprint.and.(.not.tph)).or. 1 (imode2.eq.m2_tr_asym_unit)) then WRITE(12,21) NAT(II),XX,YY,ZZ, $ (FV(II,ifv),ifv=1,nfv) endif C ************************************************************************* C *** TPH CUTTING; TPH cutting is just for crystals !!!! *** IF(TPH.and.(idim.eq.3)) THEN C TAKE A SPECIAL CARE FOR TRIPLE-PRIMITIV HEXAGONAL CELL(S) C *** AB planes *** c print *,'IF(TPH) THEN' if(k.eq.0.or.k.eq.nzdir)then c *** *** lower AB plane *** *** if(.not.isinside(dvec,1,2,3, 1 0.0d0,0.0d0,0.0d0, 2 xx,yy,zz)) lprint=.false. c *** *** upper AB plane if(.not.isinside(dvec,1,2,-3, 1 dnz*dvec(3,1), 2 dnz*dvec(3,2), 3 dnz*dvec(3,3),xx,yy,zz)) lprint=.false. endif C *** AC & BC PLANES *** IF(I.EQ.0.AND.J.EQ.0)THEN c print *,'BOX1' IF(.NOT.BOX(1,0.0d0,0.0d0,0.0d0, 1 xx,yy,zz,dvec)) * LPRINT=.FALSE. ENDIF IF(I.EQ.NXDIR.AND.J.EQ.NYDIR)THEN c print *,'BOX5' IF(.NOT.BOX(5, 1 dnx*dvec(1,1)+dny*dvec(2,1), 2 dnx*dvec(1,2)+dny*dvec(2,2), 3 dnx*dvec(1,3)+dny*dvec(2,3), 4 xx,yy,zz,dvec)) * LPRINT=.FALSE. ENDIF IF(J.EQ.0.AND.(I.GT.0.AND.I.LT.NXDIR))THEN c print *,'BOX2' IF(.NOT.BOX(2, 1 di*dvec(1,1),di*dvec(1,2),di*dvec(1,3), 2 xx,yy,zz,dvec)) * LPRINT=.FALSE. ENDIF IF(J.EQ.NYDIR.AND.(I.GT.0.AND.I.LT.NXDIR))THEN c print *,'BOX-2' IF(.NOT.BOX(-2, 1 di*dvec(1,1)+dny*dvec(2,1), 2 di*dvec(1,2)+dny*dvec(2,2), 3 di*dvec(1,3)+dny*dvec(2,3), 4 xx,yy,zz,dvec)) * LPRINT=.FALSE. ENDIF IF(I.EQ.NXDIR.AND.J.EQ.0)THEN C print *,'BOX3' IF(.NOT.BOX(3, 1 dnx*dvec(1,1),dnx*dvec(1,2), 2 dnx*dvec(1,3),xx,yy,zz,dvec)) * LPRINT=.FALSE. ENDIF IF(J.EQ.NYDIR.AND.I.EQ.0)THEN c print *,'BOX6' IF(.NOT.BOX(6, 1 dny*dvec(2,1),dny*dvec(2,2), 2 dny*dvec(2,3),xx,yy,zz,dvec)) * LPRINT=.FALSE. ENDIF IF(I.EQ.NXDIR.AND.(J.GT.0.AND.J.LT.NYDIR))THEN c print *,'BOX4' IF(.NOT.BOX(4, 1 dnx*dvec(1,1)+dj*dvec(2,1), 2 dnx*dvec(1,2)+dj*dvec(2,2), 3 dnx*dvec(1,3)+dj*dvec(2,3), 4 xx,yy,zz,dvec)) * LPRINT=.FALSE. ENDIF IF(I.EQ.0.AND.(J.GT.0.AND.J.LT.NYDIR))THEN c print *,'BOX-4' IF(.NOT.BOX(-4, 1 dj*dvec(2,1),dj*dvec(2,2),dj*dvec(2,3), 2 xx,yy,zz,dvec)) * LPRINT=.FALSE. ENDIF C if lprint=.true. write coordinates IF(LPRINT) WRITE(12,21) NAT(II),XX,YY,ZZ, $ (FV(II,ifv),ifv=1,nfv) ENDIF 21 FORMAT(I5,6F16.10) ENDDO ENDDO ENDDO ENDDO ENDDO C ************************************************ C ****** FRAMES SECTION ****** C ************************************************ N=0 NTPH=0 DO I=0,NX DO J=0,NY DO K=0,NZ DI=DBLE(I) DJ=DBLE(J) DK=DBLE(K) IF(.NOT.TPH)THEN c print *,'NATOM,N,',natom,n c print *,'nxdir,nydir,nzdir::',i,j,k C *** THIS IS FOR CRYSTAL FRAMES; NOT FOR TPH CRYSTAL FRAMES *** C if i = nx than there is no frame in "A"-direction, because this C frame line would be from nx->nx+1 and thats out of range IF(I.LT.NX) CALL MAKEFRAME(NATOM,N,DVEC, * XC,YC,ZC,DI,DJ,DK,DI+1,DJ,DK) IF(J.LT.NY) CALL MAKEFRAME(NATOM,N,DVEC, * XC,YC,ZC,DI,DJ,DK,DI,DJ+1,DK) IF(K.LT.NZ) CALL MAKEFRAME(NATOM,N,DVEC, * XC,YC,ZC,DI,DJ,DK,DI,DJ,DK+1) ELSE C ****************************************** C *** NOW MAKE ALSO THP'S CRYSTAL FRAMES *** C ****************************************** DO IN=1,INCELL C *** frames are "written" only if this condition is .TRUE. IF((.NOT.(IN.EQ.1.AND.(I.EQ.0.OR.J.EQ.0))) * .AND.(.NOT.(IN.EQ.2.AND.I.EQ.NXDIR.AND. * J.EQ.0)) * .AND.(.NOT.(IN.EQ.3.AND.J.EQ.NYDIR.AND. * I.EQ.0)))THEN NTPH=NTPH+1 ACMP=TPHFRAME(1,IN)+DI BCMP=TPHFRAME(2,IN)+DJ CCMP=TPHFRAME(3,IN)+DK XPOS=ACMP*DVEC(1,1)+BCMP*DVEC(2,1) 1 +CCMP*DVEC(3,1) YPOS=ACMP*DVEC(1,2)+BCMP*DVEC(2,2) 1 +CCMP*DVEC(3,2) ZPOS=ACMP*DVEC(1,3)+BCMP*DVEC(2,3) 1 +CCMP*DVEC(3,3) XTPH(NTPH)=XPOS YTPH(NTPH)=YPOS ZTPH(NTPH)=ZPOS IF(IN.EQ.1) TPHFLAG(NTPH)=2 IF(IN.GT.1) TPHFLAG(NTPH)=1 ENDIF ENDDO ENDIF ENDDO ENDDO ENDDO C NOW MARK THE BEGINNING OF "FRAMES" SECTION IF(N.GT.0 .OR. NTPH.GT.0) WRITE(12,*) 'FRAMES' IF(.NOT.TPH)THEN C ********************************** C *** FRAMES FOR NOT TPH'S CELLS *** C ********************************** IFLAG=1 !this is just for now, but this flag is for frame's type DO I=1,N,2 WRITE(12,22) IFLAG,XC(I),YC(I),ZC(I),XC(I+1),YC(I+1),ZC(I+1) ENDDO 22 FORMAT(I1,2X,3F16.10,2X,3F16.10) ELSE C ****************************** C *** FRAMES FOR TPH'S CELLS *** C ****************************** ADIS=DIAGONAL(DVEC,1,2)/3 CDIS=VECSIZE3(DVEC,3) c print *,'DVEC1=',(dvec(1,i),i=1,3) c print *,'DVEC2=',(dvec(2,i),i=1,3) c print *,'DVEC3=',(dvec(3,i),i=1,3) c print *,'CDIS=',CDIS DO I=1,NTPH-1 DO J=I+1,NTPH DIS=DIST(XTPH(I),YTPH(I),ZTPH(I),XTPH(J),YTPH(J),ZTPH(J)) c print *,'DIS=',DIS IF(EQUAL(DIS,ADIS)) THEN IF(TPHFLAG(I).EQ.1.AND.TPHFLAG(J).EQ.1) * WRITE(12,23) '1',XTPH(I),YTPH(I),ZTPH(I), * XTPH(J),YTPH(J),ZTPH(J) IF( (TPHFLAG(I).EQ.1.AND.TPHFLAG(J).EQ.2) .OR. * (TPHFLAG(I).EQ.2.AND.TPHFLAG(J).EQ.1) ) * WRITE(12,23) '2',XTPH(I),YTPH(I),ZTPH(I), * XTPH(J),YTPH(J),ZTPH(J) ELSEIF(EQUAL(DIS,CDIS)) THEN IF(TPHFLAG(I).EQ.1.AND.TPHFLAG(J).EQ.1) * WRITE(12,23) '1',XTPH(I),YTPH(I),ZTPH(I), * XTPH(J),YTPH(J),ZTPH(J) 23 FORMAT(A1,2X,3F16.10,2X,3F16.10) ENDIF ENDDO ENDDO ENDIF RETURN END C *** THIS SUBROUTINE MAKE ONE FRAME *** SUBROUTINE MAKEFRAME(NATOM,N,DVEC,XC,YC,ZC,DI,DJ,DK,DI1,DJ1,DK1) IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' c ********************************************************************** c in order to allow compiling on non-g77 compilers; replace NATOM arrays c with INATOM parameter c ********************************************************************** REAL*8 XC(6*INATOM),YC(6*INATOM),ZC(6*INATOM),DVEC(3,3) c print *,'MAKEFRAME> n=',n N=N+1 XC(N)=DI*DVEC(1,1)+DJ*DVEC(2,1)+DK*DVEC(3,1) YC(N)=DI*DVEC(1,2)+DJ*DVEC(2,2)+DK*DVEC(3,2) ZC(N)=DI*DVEC(1,3)+DJ*DVEC(2,3)+DK*DVEC(3,3) N=N+1 XC(N)=DI1*DVEC(1,1)+DJ1*DVEC(2,1)+DK1*DVEC(3,1) YC(N)=DI1*DVEC(1,2)+DJ1*DVEC(2,2)+DK1*DVEC(3,2) ZC(N)=DI1*DVEC(1,3)+DJ1*DVEC(2,3)+DK1*DVEC(3,3) RETURN END REAL*8 FUNCTION DIAGONAL(DVEC,I,J) REAL*8 DVEC(3,3),NL,AI,AJ,PI,VECSIZE3,DSQRT PARAMETER (PI=3.14159265358979323844d0) NL=0.0d0 AI=VECSIZE3(DVEC,I) AJ=VECSIZE3(DVEC,J) DIAGONAL=DSQRT(AI*AI+AJ*AJ-2*AI*AJ*DCOS(2*PI/3)) RETURN END xcrysden-1.6.2/F/auxil.f0000644000175000017500000002431113513076151013534 0ustar tonetonec ------------------------------------------------------------------------ subroutine DIMIFY_VEC(DVEC,IDIM) c ------------------------------------------------------------------------ real*8 DVEC(3,3) if (idim.eq.1)then dvec(1,2)=0.0d0 dvec(1,3)=0.0d0 dvec(2,1)=0.0d0 dvec(2,2)=1.0d0 dvec(2,3)=0.0d0 dvec(3,1)=0.0d0 dvec(3,2)=0.0d0 dvec(3,3)=1.0d0 elseif (idim.eq.2)then dvec(1,3)=0.0d0 dvec(2,3)=0.0d0 dvec(3,1)=0.0d0 dvec(3,2)=0.0d0 dvec(3,3)=1.0d0 endif return END c ---------------------------------------------------------------- INTEGER function string_length(word) c trims the string from both sides and returns its trimmed length c ---------------------------------------------------------------- CHARACTER word*(*) word = adjustl(word) string_length = len_trim(word) RETURN END c =============================== SUBROUTINE WVEC(WORD,VEC) c subroutine write vector to unit12 CHARACTER*(*) WORD REAL*8 VEC(3,3) WRITE(12,'(1x,a)') word DO J=1,3 WRITE(12,'(3(1x,f15.10)/3(1x,f15.10)/3(1x,f15.10))') $ (VEC(J,I),I=1,3) ENDDO RETURN END c =============================== SUBROUTINE WIVEC(WORD,VEC) c WARNING:: reciprocal vectors are written in transpose matrix; c take care of that c subroutine write vector to unit12 CHARACTER*(*) WORD REAL*8 VEC(3,3) WRITE(12,'(1x,a)') word DO J=1,3 WRITE(12,'(3(1x,f15.10)/3(1x,f15.10)/3(1x,f15.10))') $ (VEC(I,J),I=1,3) ENDDO RETURN END c ========================= INTEGER FUNCTION C2I(ARG) CHARACTER*(*) ARG c print *,'arg>',arg I=INDEX(ARG,' ')-1 IF(I.EQ.0) I=LEN(ARG) C2I=0 DO M=1,I C2I=C2I + (ICHAR(ARG(M:M)) - 48)*10**(I-M) ENDDO c print *,'iarg>',c2i RETURN END c ============================================================ REAL*8 FUNCTION DET3X3D(x11,x12,x13,x21,x22,x23,x31,x32,x33) REAL*8 x11,x12,x13,x21,x22,x23,x31,x32,x33 DET3X3D=x11*x22*x33 + x12*x23*x31 + x13*x21*x32- * x31*x22*x13 - x32*x23*x11 - x33*x21*x12 RETURN END c ============================================================ REAL*8 FUNCTION DET2X2D(x11,x12,x21,x22) REAL*8 x11,x12,x21,x22 DET2X2D=x11*x22 - x21*x12 RETURN END c ======================================= SUBROUTINE VecProduct(vec1,vec2,resvec) REAL*8 vec1(3),vec2(3),resvec(3) resvec(1) = vec1(2)*vec2(3) - vec2(2)*vec1(3) resvec(2) = vec1(3)*vec2(1) - vec2(3)*vec1(1) resvec(3) = vec1(1)*vec2(2) - vec2(1)*vec1(2) RETURN END c ==================================== REAL*8 FUNCTION ScalarProduct(v1,v2) REAL*8 v1(3), v2(3) ScalarProduct = v1(1)*v2(1) + v1(2)*v2(2) + v1(3)*v2(3) RETURN END c ============================ REAL*8 FUNCTION VecSize(vec) REAL*8 vec(3) VecSize = dsqrt(vec(1)*vec(1) + vec(2)*vec(2) + vec(3)*vec(3)) RETURN END c ================================== SUBROUTINE MATMULT(A,NI,NJ,B,NK,C) REAL*8 A(NJ,NI),B(NK,NJ),C(NK,NI) C *** THIS SUBROUTINE MULTIPLIES TWO MATRICES *** C C C(KCOL,IROW)=SUM(J){ A(JCOL,IROW)*B(KCOL,JROW) } C C MATRIX C MUST BE ALREADY INITIALISED C *********************************************** DO K=1,NK DO I=1,NI DO J=1,NJ C(K,I)=C(K,I)+A(J,I)*B(K,J) ENDDO ENDDO ENDDO RETURN END c ================================ REAL*8 FUNCTION VECSIZE3(DVEC,N) REAL*8 DVEC(3,3),DSQRT VECSIZE3=DSQRT(DVEC(N,1)**2+DVEC(N,2)**2+DVEC(N,3)**2) RETURN END c ======================================= REAL*8 FUNCTION DIST(X1,Y1,Z1,X2,Y2,Z2) REAL*8 X1,Y1,Z1,X2,Y2,Z2,DSQRT DIST=DSQRT((X2-X1)**2+(Y2-Y1)**2+(Z2-Z1)**2) RETURN END c =========================== LOGICAL FUNCTION EQUAL(A,B) REAL*8 A,B,MINTOL PARAMETER (MINTOL=1.d-6) C print *,'A=',A,'B=',B IF(ABS(A-B).LT.MINTOL) THEN EQUAL=.TRUE. ELSE EQUAL=.FALSE. ENDIF RETURN END c ========================= SUBROUTINE MatTranspose(src,dst,m,n) REAL*8 src(m,n), dst(n,m) do i=1,n do j=1,m dst(i,j)=src(j,i) enddo enddo RETURN END c ========================= SUBROUTINE MATCOPY(a,b,m,n) REAL*8 A(m,n), B(m,n) do i=1,n do j=1,m b(j,i)=a(j,i) enddo enddo RETURN END c =========================== SUBROUTINE ZeroMat(a,m,n) REAL*8 A(m,n) do i=1,n do j=1,m a(j,i) = 0.0d0 enddo enddo RETURN END c =========================== SUBROUTINE IdentityMat(a,m,n) REAL*8 A(m,n) do i=1,n do j=1,m a(j,i) = 0.0d0 enddo a(i,i) = 1.0d0 enddo RETURN END c =========================== SUBROUTINE Mat33ToMat22(m) real*8 m(3,3) do i=1,3 m(3,i) = 0.0d0 m(i,3) = 0.0d0 enddo m(3,3) = 1.0d0 return end c =========================== SUBROUTINE Mat33ToMat11(m) real*8 m(3,3) call Mat33ToMat22(m) do i=1,3 m(2,i) = 0.0d0 m(i,2) = 0.0d0 enddo m(2,2) = 1.0d0 return end c =========================== SUBROUTINE INVERT2x2(vec) REAL*8 vec(3,3), tmp(3,3) REAL*8 v1(3), v2(3), v3(3) call Mat33ToMat22(vec) Call IdentityMat(tmp, 3, 3) do i=1,3 v1(i) = vec(1,i) v2(i) = vec(2,i) v3(i) = 0.0d0 enddo v3(3) = 1.0d0 Call RecipVec(tmp, 1, v1, v2, v3) Call RecipVec(tmp, 2, v2, v3, v1) Call MatTranspose(tmp, vec, 3, 3) RETURN END c =========================== SUBROUTINE RecipVec(vec, i, v1, v2, v3) REAL*8 vec(3,3), v1(3), v2(3), v3(3) REAL*8 vp(3), sp, ScalarProduct Call VecProduct( v2, v3, vp ) sp = ScalarProduct(v1, vp) do jj=1,3 vec(i,jj) = vp(jj) / sp ! devision by zero can occur here enddo RETURN END SUBROUTINE InvertSqMat123(mat, invmat, ldim) real*8 mat(3,3), invmat(3,3), tmpmat(3,3) call MatCopy(mat, invmat, 3, 3) if (ldim .le. 1) then call Mat33ToMat11(invmat) if (ldim .eq. 0) then invmat(1,1) = 1.0d0 else invmat(1,1) = 1.0d0/mat(1,1) endif else if(ldim .eq. 2) then call Mat33ToMat22(invmat) call Invert2x2(invmat) else if(ldim .eq. 3) then call Invert3x3(mat,invmat) else stop 'dimension of matrix greater then 3' endif return END c ------------------------------------------------- integer function iCountFields(word) c counts the number fo fields in character c ------------------------------------------------- character word*(*), auxword*255 logical lspace, WhiteSpace iCountFields=0 lspace=.false. ilen=len(word) c left trim do i=1,ilen if ( .not. WhiteSpace(word(i:i)) ) goto 1 enddo 1 continue ifirst=i c right trim do i=ilen,1,-1 if ( .not. WhiteSpace(word(i:i)) ) goto 2 enddo 2 continue ilast=i if (ifirst .lt. ilast) iCountFields=1 c print *,'TT:', ilen,ifirst,ilast do i=ifirst,ilast if ( WhiteSpace(word(i:i)) ) then if (.not.lspace) then lspace=.true. iCountFields=iCountFields+1 endif else lspace=.false. endif enddo return END c ------------------------------------------------------------------------- logical function WhiteSpace(char) c returns true if character is white-space or TAB c ------------------------------------------------------------------------- character char WhiteSpace = .false. if ((char.eq.' ') .or. (char.eq.'\t')) WhiteSpace = .true. return END c ------------------------------------------------------------------------ subroutine Invert3x3(mat, invmat) c Calculate the 3x3 inversion matrix. This routine is based on c routine invmat3 of FPMP/CP90 packages. Copyright (C) 2002 FPMD c group and CP90 group. The routine is distributed under the terms of c the GNU General Public License. c ------------------------------------------------------------------------ implicit none real*8 mat(3,3), invmat(3,3), norm real*8 d11, d12, d13, d22, d23, d33, d21, d31, d32 d11=mat(2,2)*mat(3,3)-mat(2,3)*mat(3,2) d12=mat(2,3)*mat(3,1)-mat(2,1)*mat(3,3) d13=mat(2,1)*mat(3,2)-mat(3,1)*mat(2,2) d22=mat(1,1)*mat(3,3)-mat(1,3)*mat(3,1) d23=mat(3,1)*mat(1,2)-mat(1,1)*mat(3,2) d33=mat(1,1)*mat(2,2)-mat(1,2)*mat(2,1) d21=mat(3,2)*mat(1,3)-mat(1,2)*mat(3,3) d31=mat(1,2)*mat(2,3)-mat(2,2)*mat(1,3) d32=mat(1,3)*mat(2,1)-mat(1,1)*mat(2,3) norm=mat(1,1)*d11+mat(1,2)*d12+mat(1,3)*d13 c check for singular matrix if (ABS(norm).lt.1.d-20) stop 'singular matrix in Invert3x3' invmat(1,1)=d11/norm invmat(2,2)=d22/norm invmat(3,3)=d33/norm invmat(1,2)=d21/norm invmat(1,3)=d31/norm invmat(2,3)=d32/norm invmat(2,1)=d12/norm invmat(3,1)=d13/norm invmat(3,2)=d23/norm return end subroutine normalize_vec(n,vec) implicit none integer n, i real*8 vec(*), norm norm=0.0d0 do i=1,n norm = norm + vec(i)*vec(i) enddo norm = dsqrt(norm) c if norm is zero don't normalize if (norm.lt.1.d-20) return do i=1,n vec(i) = vec(i) / norm enddo return end xcrysden-1.6.2/F/gengeom.f0000644000175000017500000010207613521300551014031 0ustar tonetone PROGRAM GENGEOM C ******************************************* C *** GENERAL GEOMETRIC PURPOSE PROGRAM *** C ******************************************* c ======================================================================= c USAGE: c gengeom MODE1 MODE2 MODE3 IGRP NXDIR NYDIR NZDIR OUTPUT INPUT c 0 1 2 3 4 5 6 7 8 9 c ======================================================================= c program read data from ftn34, but if INPUT ARGUMENT is present it c rather read data from gengeom_formated INPUT file instead C NXDIR,NYDIR,NZDIR --> n. of repeatitions in each directions C ***** C IGR - SEQUENTIAL GROUP NUMBER (USED ONLY FOR CRYSTALS) C posebej je treba paziti na R/H !!!!! C ***** c how the vectors are packed to matrix:: c -------------------------------------- c DIRECT VECTORS:: c ---------------- c VECTOR1 GOES TO FIRST COLOUMN, VETCOR2 TO SECOND & VECTOR3 TO c THIRD COLOUMN;;; DV(COL,ROW); vec(# ,x/y/z) c ============= c |11 21 31| |x1 x2 x3| c VEC = |12 22 32| => DV = |y1 y2 y3| c |13 23 33| |z1 z2 z3| c c RECIPROCAL VECTORS:: (in transpose manner) c -------------------- c VECTOR1 GOES TO FIRST ROW, VETCOR2 TO SECOND & VECTOR3 TO c THIRD ROW;;; vec(x/y/z, #) c ============= c |11 21 31| |x1* y1* z1*| c IVEC = |12 22 32| =>IDV = |x2* y2* z2*| c |13 23 33| |x3* y3* z3*| c c so: |1 0 0| c VEC x IVEC == |0 1 0| c |0 0 1| IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' CHARACTER*256 MODE1, MODE2, MODE3, * ANX, ANY, ANZ, FILE2, INPUT REAL*8 PC(3,1),AC(3,2),BC(3,2),CC(3,2),FC(3,4),IC(3,2),RC(3,3), * HC(3,3),CSTMC(3,4),P2A(3,3),P2B(3,3),P2C(3,3),P2F(3,3), * P2I(3,3),R2H(3,3),P2AI(3,3),P2BI(3,3),P2CI(3,3),P2FI(3,3), * P2II(3,3),R2HI(3,3),P2H(3,3),P2HI(3,3), * DV(3,3),SOP(3,3,48),TRX(48),TRY(48),TRZ(48), * DVC(3,3),CON13,CON23,HTTC(3,13),RTTC(3,13),MINTOL, * DVEC(3,3),TMPVEC(3,3),X(NAC),Y(NAC),Z(NAC), * IDVEC(3,3),IDV(3,3),IDVC(3,3), * RCR(3,3),RTTCR(3,13),S_AC(3,2),S_BC(3,2),S_CC(3,2), * S_FC(3,4),S_IC(3,2),S_RC(3,3),S_HC(3,3) INTEGER C2I, NAT(NAC) LOGICAL L, lreverse, IsReverse, notfound, Lprimvec include 'mode.inc' COMMON/FTN34/ SOP,TRX,TRY,TRZ,DV,IDIM,IGROUP,NSYMOP COMMON/APOS/ AC,BC,CC,FC,IC,HC,RC,DVC,CSTMC COMMON/DIR/ NXDIR,NYDIR,NZDIR COMMON/IVEC/ IDVEC COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR COMMON/BOHRR/ BOHR,IMODE3 COMMON/KEYWORD/ notfound, Lprimvec PARAMETER (CON13=1.0d0/3.0d0, CON23=2.0d0/3.0d0, MINTOL=1.d-6, $ CON13N=-1.0d0/3.0d0, CON23N=-2.0d0/3.0d0, $ TOLMIN=1.d-6) C VARIABLE NAMES: C DV{1|2|3}.............3 direct vectors in PRIMITIV cell C DVC{1|2|3}............3 direct vectors in CONVENTIONAL cell C TR{X|Y|Z}.............X,Y,Z COMPONENT OF TRANSL. DUE TO POINT SYM. OPER. C IDIM..................DIMENSION OF THE SYSTEM C IGROUP................GROUP NUMBER (LOOK BELOW) C SOP...................SYM. OPERATORS (MATRICES) C *********************************************** C TRANSFORMATION of PRIMITIV CELL to CONVENTIONAL C *********************************************** C =================== C IGROUP DEFINITIONS: C =================== C GROUP NUMBER USED IN ftn34 C N. symbol N.of atoms Variable C 1.....P --> 1 PC C 2.....A --> 2 AC C 3.....B --> 2 BC C 4.....C --> 2 CC C 5.....F --> 4 FC C 6.....I --> 2 IC C 7.....R --> 3 RC --> RTTC C REMARK: ALL HEXAGONAL CELLS ARE OF TYPE 1 IN FTN34 !!!!! C SO I'LL USE 8 FOR HEXAGONAL CELL C 8.....H --> 3 HC --> HTTC C for TRIGONAL CELL that are not RHOMOHEDRAL, I will use additional flag C 9.....TRIGONAL_NOT_RHOMOHEDRAL C 10....custom; used just when calling CONVATOM to tell to read CSTMC C ---------------------------------------- C ---------------------------------------- C TRANSFORMATION MATRICES: C ------------------------ C EXAMPLE: C P2C means: PRIMITIV to C-centered C P2C and the rest refer to coor. of point, so C P2CI and the rest refer to transf. of vectors C P2CI means "inverse of P2C" DATA PC/ 1 0.0d0, 0.0d0, 0.0d0/ C CONVENTIONAL CELL; COORD. OF LATTICE POINTS WITHIN CELL DATA S_AC/ 1 0.0d0, 0.0d0, 0.0d0, 2 0.0d0, 0.5d0, 0.5d0/ DATA S_BC/ 1 0.0d0, 0.0d0, 0.0d0, 2 0.5d0, 0.0d0, 0.5d0/ DATA S_CC/ 1 0.0d0, 0.0d0, 0.0d0, 2 0.5d0, 0.5d0, 0.0d0/ DATA S_FC/ 1 0.0d0, 0.0d0, 0.0d0, 2 0.5d0, 0.5d0, 0.0d0, 3 0.0d0, 0.5d0, 0.5d0, 4 0.5d0, 0.0d0, 0.5d0/ DATA S_IC/ 1 0.0d0, 0.0d0, 0.0d0, 2 0.5d0, 0.5d0, 0.5d0/ DATA S_HC/ 1 0.0d0, 0.0d0, 0.0d0, 2 CON23, CON13, 0.0d0, 3 CON13, CON23, 0.0d0/ C RHOMBOHEDRALY CENTERED (OBVERSE SETTINGS) - hexagonal axes C CRYSTALXX uses this ^^^^^^^ DATA S_RC/ 1 0.0d0, 0.0d0, 0.0d0, 2 CON23, CON13, CON13, 3 CON13, CON23, CON23/ C RHOMBOHEDRALY CENTERED (REVERSE SETTINGS) - hexagonal axes C WIEN uses this ^^^^^^^ DATA RCR/ 1 0.0d0, 0.0d0, 0.0d0, 2 CON13, CON23, CON13, 3 CON23, CON13, CON23/ C HEXAGONALY TRIPLE CENTERED CELL - HEXAGONAL SHAPE DATA HTTC/ 1 1.0d0, 0.0d0, 0.0d0, 1.0d0, 1.0d0, 0.0d0, 2 0.0d0, 1.0d0, 0.0d0, -1.0d0, 0.0d0, 0.0d0, 3 -1.0d0,-1.0d0, 0.0d0, 0.0d0,-1.0d0, 0.0d0, 4 0.0d0, 0.0d0, 0.0d0, 5 CON23, CON13, 0.0d0, CON13, CON23, 0.0d0, 6 CON13N, CON13, 0.0d0, CON23N,CON13N, 0.0d0, 7 CON13N,CON23N, 0.0d0, CON13,CON13N, 0.0d0/ C RHOMBOHEDRAL - described as TRIPLE HEXAGONAL CELL - HEXAGONAL SHAPE c OBVERSE SETTINGS c ^^^^^^^ DATA RTTC/ 1 1.0d0, 0.0d0, 0.0d0, 1.0d0, 1.0d0, 0.0d0, 2 0.0d0, 1.0d0, 0.0d0, -1.0d0, 0.0d0, 0.0d0, 3 -1.0d0,-1.0d0, 0.0d0, 0.0d0,-1.0d0, 0.0d0, 4 0.0d0, 0.0d0, 0.0d0, 5 CON23, CON13, CON13, CON13, CON23, CON23, 6 CON13N, CON13, CON13, CON23N,CON13N, CON23, 7 CON13N,CON23N, CON13, CON13,CON13N, CON23/ c REVERSE SETTINGS c ^^^^^^^ DATA RTTCR/ 1 1.0d0, 0.0d0, 0.0d0, 1.0d0, 1.0d0, 0.0d0, 2 0.0d0, 1.0d0, 0.0d0, -1.0d0, 0.0d0, 0.0d0, 3 -1.0d0,-1.0d0, 0.0d0, 0.0d0,-1.0d0, 0.0d0, 4 0.0d0, 0.0d0, 0.0d0, 5 CON13, CON23, CON13, CON23, CON13, CON23, 6 CON23N, CON23, CON13, CON13N,CON23N, CON23, 7 CON23N,CON13N, CON13, CON23,CON23N, CON23/ C TRANSFORMATION MATRICES IN CRYSTAL95 DATA P2A/ 1 1.0d0, 0.0d0, 0.0d0, 2 0.0d0, 0.5d0,-0.5d0, 3 0.0d0, 0.5d0, 0.5d0/ DATA P2AI/ 1 1.0d0, 0.0d0, 0.0d0, 2 0.0d0, 1.0d0, 1.0d0, 3 0.0d0,-1.0d0, 1.0d0/ DATA P2B/ 1 0.5d0, 0.0d0, 0.5d0, 2 0.0d0, 1.0d0, 0.0d0, 3 -0.5d0, 0.0d0, 0.5d0/ DATA P2BI/ 1 1.0d0, 0.0d0,-1.0d0, 2 0.0d0, 1.0d0, 0.0d0, 3 1.0d0, 0.0d0, 1.0d0/ DATA P2C/ 1 0.5d0,-0.5d0, 0.0d0, 2 0.5d0, 0.5d0, 0.0d0, 3 0.0d0, 0.0d0, 1.0d0/ DATA P2CI/ 1 1.0d0, 1.0d0, 0.0d0, 2 -1.0d0, 1.0d0, 0.0d0, 3 0.0d0, 0.0d0, 1.0d0/ DATA P2F/ 1 0.0d0, 0.5d0, 0.5d0, 2 0.5d0, 0.0d0, 0.5d0, 3 0.5d0, 0.5d0, 0.0d0/ DATA P2FI/ 1 -1.0d0, 1.0d0, 1.0d0, 2 1.0d0,-1.0d0, 1.0d0, 3 1.0d0, 1.0d0,-1.0d0/ DATA P2I/ 1 -0.5d0, 0.5d0, 0.5d0, 2 0.5d0,-0.5d0, 0.5d0, 3 0.5d0, 0.5d0,-0.5d0/ DATA P2II/ 1 0.0d0, 1.0d0, 1.0d0, 2 1.0d0, 0.0d0, 1.0d0, 3 1.0d0, 1.0d0, 0.0d0/ DATA R2H/ 1 CON23,CON13N,CON13N, 2 CON13, CON13,CON23N, 3 CON13, CON13, CON13/ DATA R2HI/ 1 1.0d0, 0.0d0, 1.0d0, 2 -1.0d0, 1.0d0, 1.0d0, 3 0.0d0,-1.0d0, 1.0d0/ C HEXAGONAL CELL P --> TRIPLE HEXAGONAL CELL H1; C INTERNATIONAL TABLES OF CRYSTALOGRAPHY, 1993; TABLE 5-1 DATA P2H/ 1 CON23,CON13N, 0.0d0, 2 CON13, CON13, 0.0d0, 3 0.0d0, 0.0d0, 1.0d0/ DATA P2HI/ 1 1.0d0, 1.0d0, 0.0d0, 2 -1.0d0, 2.0d0, 0.0d0, 3 0.0d0, 0.0d0, 1.0d0/ C === END_OF_DATA_BLOCK === call MATCOPY(S_AC,AC,3,2) call MATCOPY(S_BC,BC,3,2) call MATCOPY(S_CC,CC,3,2) call MATCOPY(S_FC,FC,3,4) call MATCOPY(S_IC,IC,3,2) call MATCOPY(S_RC,RC,3,3) call MATCOPY(S_HC,HC,3,3) C CONVERSION FROM BOHRS TO ANGS. BOHR=0.529177d0 NCSTMC=0 c number of command line arguments must not be lower than 8 NARG=IARGC() IF(NARG.LT.8)THEN WRITE(*,*) 1 'usage: gengeom [input]' STOP ENDIF C *********************************** C *** READ MODE & N?DIR ARGUMENTS *** C *********************************** C look in 'mode.inc' for definitions !!!! CALL GETARG(IARG_MODE1,MODE1) CALL GETARG(IARG_MODE2,MODE2) CALL GETARG(IARG_MODE3,MODE3) CALL GETARG(IARG_NXDIR,ANX) CALL GETARG(IARG_NYDIR,ANY) CALL GETARG(IARG_NZDIR,ANZ) IMODE1=C2I(MODE1) IMODE2=C2I(MODE2) IMODE3=C2I(MODE3) NXDIR =C2I(ANX) NYDIR =C2I(ANY) NZDIR =C2I(ANZ) c determine aproximate number of atoms (COUNT JUST ONE ATOM PER CELL) NATOMS=(NXDIR+2) * (NYDIR+2) *(NZDIR+1) !overestimated, thats good CALL GETARG(IARG_OUTPUT,FILE2) IFILE2=INDEX(FILE2,' ') OPEN(UNIT=12,FILE=FILE2(1:IFILE2-1),STATUS='UNKNOWN') C file2='tmp.tmp' C OPEN(UNIT=12,FILE='tmp.tmp',STATUS='UNKNOWN') c --- DEBUG_BEGIN --- c print *,'IMODE1=',IMODE1,'; IMODE2=',IMODE2,'; IMODE3=',IMODE3 c print *,'NXDIR=',NXDIR,'; NYDIR=',NYDIR,'; NZDIR=',NZDIR c print *,'IFILE2=',IFILE2,'; OUTPUT::',FILE2(1:IFILE2-1) c --- DEBUG_END --- c ********************************* c take care of imode3; imode3 comprise several modes, that are based on c following criteria: 1258, 1 is mode3, 2 is mode4, 5 is mode5, 8 is mode6 c so far only MODE3 & MODE4 are used!!!! IMODE4=MOD(IMODE3,10) IMODE3=(IMODE3-IMODE4)/10 C ********************************* C *** write INFO record *** WRITE(12,'(1x,a)') 'INFO' WRITE(12,'(a,3x,i4,1x,i4,1x,i4)') 'nunit',NXDIR,NYDIR,NZDIR IF(IMODE2.EQ.M2_CELL) WRITE(12,'(a,3x,a)') 'unit','cell' IF(IMODE2.EQ.M2_TR_ASYM_UNIT) 1 WRITE(12,'(a,3x,a)') 'unit','tr_asym' IF(IMODE1.EQ.M1_PRIM .OR. IMODE1.EQ.M1_PRIM3) THEN WRITE(12,'(a,3x,a)') 'celltype', 'primcell' ELSE WRITE(12,'(a,3x,a)') 'celltype', 'convcell' ENDIF IF(IMODE1.EQ.M1_HEXA_SHAPE .OR. IMODE1.EQ.M1_PRIM3) THEN WRITE(12,'(a,3x,a)') 'shape','hexagonal' ELSE WRITE(12,'(a,3x,a)') 'shape','parapipedal' ENDIF WRITE(12,'(1x,a)') 'END_INFO' C ********************************* IGROUP_input=0 IF(NARG.EQ.9)THEN C ********************************* C *** is INPUT ARGUMENT PRESENT *** C *** read from INPUT *** C ********************************* IDUM1=0 IDUM2=0 CALL GETARG(IARG_INPUT,INPUT) I_INPUT=INDEX(INPUT,' ') OPEN(UNIT=11,FILE=INPUT(1:I_INPUT),STATUS='OLD') c READF1 has two common's that are: c /MULTAT/ X,Y,Z,NAT,DVEC,NATR c /IVEC/ IDVEC c backward compatibility CALL READF1('DIM-GROUP',IGROUP,IDIM) c -- CALL READF1('MOLECULE',IGROUP,IDIM) CALL READF1('POLYMER',IGROUP,IDIM) CALL READF1('SLAB',IGROUP,IDIM) CALL READF1('CRYSTAL',IGROUP,IDIM) CALL READF1('PRIMVEC',IGROUP,IDIM) if (notfound) then Lprimvec=.false. else Lprimvec=.true. CALL MATCOPY(DVEC,DV,3,3) endif CALL READF1('CONVVEC',IGROUP,IDIM) if ((.not.notfound) .and. (.not.Lprimvec) ) then call Matcopy(dvec,dv,3,3) write(12,'(1x,a)') 'PRIMVEC' write(12,'(3(1x,f15.10)/3(1x,f15.10)/3(1x,f15.10))') 1 ((dvec(j,i),i=1,3),j=1,3) else if (notfound .and. (.not.Lprimvec)) then WRITE(6,*) 'PRIMVEC and CONVEC keywords not found !!!' STOP endif CALL MATCOPY(DVEC,DVC,3,3) if (Lprimvec) then CALL READF1('PRIMCOORD',IDUM1,IDUM2) !here NAT is read else c assuming PRIMCOORD == CONVCOORD CALL READF1('CONVCOORD',IDUM1, IDUM2) endif CALL GetCenteredPoints(DV, DVC, IDIM, CSTMC, NCSTMC) IGROUP_input=IGROUP !to save original igroup read from input IGROUP=10 !10 means custom (input file was read) c DEBUG_BEGIN c if (IGROUP_input.EQ.7) c $ print *,'DEBUG: IsReverse = ', IsReverse(CSTMC,RCR) c print *,'DEBUG: NCSTMC::', NCSTMC c do i=1,4 c print *,'DEBUG: CSTMC::',(CSTMC(j,i),j=1,3) c enddo c DEBUG_END if (ncstmc.gt.4) then c Largest number of special centered points has FCC == 4; if NCSTMC exceed c 4, something is wrong STOP 'more then four centered points; conventional vectors $ are probably badly chosen' ENDIF CLOSE(11) ELSE C ************************************************* C ***** READ FTN34; all modes need this ******* C ************************************************* NATR=0 c READFTN34 has one common: C /FTN34/ IDIM,IGROUP,DV,NSYMOP,SOP,TRX,TRY,TRZ CALL READFTN34(NATR, IMODE4) !NATR is read C **************************** C get the CONVENTIONAL VECTORS C **************************** call ZEROMAT(DVC, 3, 3) C P->P IF(IGROUP.EQ.1) THEN DO J=1,3 DO I=1,3 DVC(I,J)=DV(I,J) ENDDO ENDDO ENDIF C P->A IF(IGROUP.EQ.2) CALL MATMULT(DV,3,3,P2AI,3,DVC) C P->B IF(IGROUP.EQ.3) CALL MATMULT(DV,3,3,P2BI,3,DVC) C P->C IF(IGROUP.EQ.4) CALL MATMULT(DV,3,3,P2CI,3,DVC) C P->F IF(IGROUP.EQ.5) CALL MATMULT(DV,3,3,P2FI,3,DVC) C P->I IF(IGROUP.EQ.6) CALL MATMULT(DV,3,3,P2II,3,DVC) C PR->H; primitiv-rhombohedrall to triple-hexagonal R cell IF(IGROUP.EQ.7) CALL MATMULT(DV,3,3,R2HI,3,DVC) C PH->H; primitiv hexagonal --> triple hexagonal H cell IF(IGROUP.EQ.8 .OR. IGROUP.EQ.9) 1 CALL MATMULT(DV,3,3,P2HI,3,DVC) C WRITE CONVENTIONAL DIRECT VECTORS CALL WVEC('CONVVEC',DVC) ENDIF c /////////////////////////////////////////////////////// c // below is common to ftn34 and XCrySDen format file // c /////////////////////////////////////////////////////// C NOW CALCULATE POSITIONS OF ATOMS NEEDED WITHIN CONV.CELL CALL CONVATOM(IGROUP,NARG,NCSTMC,IMODE4) !primcoord & convcoord are writen to UNIT12 C make reciprocal vectors (TRANSPOSE form) CALL ZeroMat(IDV, 3, 3) CALL ZeroMat(IDVC, 3, 3) c initialise tmpvec matrix; tmpvec is dummy anyway call InvertSqMat123(DV, IDV, IDIM) call InvertSqMat123(DVC, IDVC, IDIM) c write PRIMITIV & CONVENTIONAL RECIPROCAL VECTORS in normal not c transpose form CALL WIVEC('RECIP-PRIMVEC',IDV) CALL WIVEC('RECIP-CONVVEC',IDVC) c write WIGNER-SEITZ CELL IF(IDIM.EQ.3 .AND. IMODE1.NE.M1_INFO) THEN CALL WignerSeitz(DV, 'WIGNER-SEITZ-PRIMCELL') CALL WignerSeitz(DVC, 'WIGNER-SEITZ-CONVCELL') Call MatTranspose(IDV, TMPVEC, 3, 3) CALL WignerSeitz(TMPVEC, 'BRILLOUIN-ZONE-PRIMCELL') Call MatTranspose(IDVC, TMPVEC, 3, 3) CALL WignerSeitz(TMPVEC, 'BRILLOUIN-ZONE-CONVCELL') ELSEIF(IDIM.EQ.2 .AND. IMODE1.NE.M1_INFO) THEN CALL WignerSeitz2D(DV, 'WIGNER-SEITZ-PRIMCELL') Call MatTranspose(IDV, TMPVEC, 3, 3) CALL WignerSeitz2D(TMPVEC, 'BRILLOUIN-ZONE-PRIMCELL') ELSEIF(IDIM.EQ.1 .AND. IMODE1.NE.M1_INFO) THEN CALL WignerSeitz1D(DV, 'WIGNER-SEITZ-PRIMCELL') CALL WignerSeitz1D(IDV, 'BRILLOUIN-ZONE-PRIMCELL') ENDIF C **************************** C deside upon IMODE1 IF(IMODE1.EQ.M1_INFO) GOTO 1111 !info mode GOTO(150,250,250,250) IMODE1 C ============================ 150 CONTINUE C ******************************************************* C * CALCULATE COORDINATES FOR PRIMITIV CELL(S); * C * ^^^^^^^^ * C * IMODE1 = M1_PRIM * C ******************************************************* c ASSING primitiv-vectors to DVEC & IDVEC CALL MATCOPY(DV,DVEC,3,3) !dvec is used in MULTATOM; common/MULTAT/ CALL MATCOPY(IDV,IDVEC,3,3) C IF IDIM=0 JUST PRINT THE COORDINATES IF(IDIM.EQ.0)THEN CALL MOLECULE ELSE c print *,'NATOMS',NATOMS CALL MULTATOM(PC,1,1,NATOMS,.false.,IDIM,IMODE2) ENDIF GOTO 1111 250 CONTINUE C ********************************************************* C ** calculate coordinates for CONVENTIONAL cell(s) && ** C ** also M1_PRIM3; look below ^^^^^^^^^^^^ ** C ********************************************************* c C ********************************************************** C for TRIGONAL/HEXAGONAL/RHOMBOHEDRAL SYSTEMS: C ** IMODE1=M1_CONV ........ PARAPIPEDAL SHAPED TRIPLE hexagonal CELL C ** IMODE1=M1_HEXA_SHAPE .. HEXAGONAL SHAPED TRIPLE hexagonal CELL c C for TRIGONAL_NOT_RHOMBO/HEXAGONAL systems C ** IMODE1=M1_PRIM3 --> HEXAGONAL SHAPED PRIMITIV CELL c ^^^^^^^^ C ********************************************************** C *** so far, only crystals can be converted from prim. to conv. cell *** IF(IDIM.NE.3) 1 STOP 'conversion to conventional cell for non-crystal' c ASSING conventional-direct-vectors to DVEC CALL MATCOPY(DVC,DVEC,3,3) !dvec is used in MULTATOM & MULTHEXA CALL MATCOPY(IDVC,IDVEC,3,3) C HEXAGONAL SHAPED PRIMITIV RHOMOHEDRAL CELL c IF(IMODE1.EQ.M1_PRIM3 .AND. IGROUP.EQ.7) !maybe turn this off c 1 CALL MULTATOM(RC,3,8,NATOMS*3,.true.,3,IMODE2) C HEXAGONAL SHAPED PRIMITIV TRIGONAL_NOT_RHOMBO/HEXAGONAL CELL C t.k.: maybe TRIGONAL is not allowed for this IF(IMODE1.EQ.M1_PRIM3 .AND. $ (IGROUP.EQ.8 .OR. IGROUP.EQ.9 .OR. $ IGROUP_input.EQ.8 .OR. IGROUP_input.EQ.9)) then CALL MULTATOM(HC,3,8,NATOMS*3,.true.,3,IMODE2) goto 1111 ENDIF C WHEATER (NOT HEXA/RHOMBO/TRIGONAL_NOT_RHOMBO) L=.FALSE. IF(IGROUP.EQ.1) CALL MULTATOM(PC,1,IGROUP,NATOMS,L,3,IMODE2) IF(IGROUP.EQ.2) CALL MULTATOM(AC,2,IGROUP,NATOMS*2,L,3,IMODE2) IF(IGROUP.EQ.3) CALL MULTATOM(BC,2,IGROUP,NATOMS*2,L,3,IMODE2) IF(IGROUP.EQ.4) CALL MULTATOM(CC,2,IGROUP,NATOMS*2,L,3,IMODE2) IF(IGROUP.EQ.5) CALL MULTATOM(FC,4,IGROUP,NATOMS*4,L,3,IMODE2) IF(IGROUP.EQ.6) CALL MULTATOM(IC,2,IGROUP,NATOMS*2,L,3,IMODE2) IF(IGROUP.EQ.10) then if(IGROUP_input.EQ.7 .and. IMODE1.EQ.M1_HEXA_SHAPE) then c rhombohedral lreverse=IsReverse(CSTMC, RCR) if(lreverse) then c reverse settings CALL MULTHEXA(RTTCR,IGROUP,NATOMS*13) goto 1111 endif elseif(IGROUP_input.GE.8 .and. IMODE1.EQ.M1_HEXA_SHAPE) then c hexagonal IGROUP=IGROUP_input else CALL MULTATOM(CSTMC,NCSTMC,IGROUP,NATOMS*NCSTMC,L,3,IMODE2) goto 1111 endif ENDIF C TRIPLE HEXA/RHOMBO C M1_HEXA_SHAPE & M2_TR_ASYM_UNIT together are not allowed IF(IMODE1.EQ.M1_HEXA_SHAPE .AND. IMODE2.EQ.M2_TR_ASYM_UNIT) * STOP 'M1_HEXA_SHAPE & M2_TR_ASYM_UNIT can not be used together' IF(IMODE1.EQ.M1_CONV .AND. IGROUP.EQ.7) * CALL MULTATOM(RC,3,7,NATOMS*3,L,3,IMODE2) IF(IMODE1.EQ.M1_CONV .AND. (IGROUP.EQ.8 .OR. IGROUP.EQ.9)) * CALL MULTATOM(HC,3,8,NATOMS*3,L,3,IMODE2) IF(IMODE1.EQ.M1_HEXA_SHAPE .AND. IGROUP.EQ.7) * CALL MULTHEXA(RTTC,IGROUP,NATOMS*13) IF(IMODE1.EQ.M1_HEXA_SHAPE .AND. (IGROUP.EQ.8 .OR. IGROUP.EQ.9)) * CALL MULTHEXA(HTTC,IGROUP,NATOMS*13) 1111 CONTINUE CLOSE(12) END c INTEGER FUNCTION DETGROUP(IGR) C FUNCTION DETERMINES IF GROUP IS OF HEXAGONAL TYPE C 8 FOR HEXAGONAL TYPE c DETGROUP=1 c IF(IGR.GE.143.AND.IGR.LE.194)DETGROUP=8 c RETURN c END SUBROUTINE READFTN34(NATR, IMODE4) C THIS SUBROUTINE READ THE ftn34 IMPLICIT REAL*8 (A-H,O-Z) CHARACTER*80 CDUM,AGRP REAL*8 DV(3,3),SOP(3,3,48),TRX(48),TRY(48),TRZ(48) INTEGER C2I COMMON/FTN34/ SOP,TRX,TRY,TRZ,DV,IDIM,IGROUP,NSYMOP COMMON/BOHRR/ BOHR,IMODE3 include 'mode.inc' c --- DEBUG_BEGIN --- c print *,'in READFTN34; IMODE4=',IMODE4 c --- DEBUG_END --- if (IMODE4 .eq. M4_CR95) then READ(34,*) CDUM READ(34,*) IDIM,IGROUP elseif (IMODE4 .eq. M4_CR98) then READ(34,*) IDIM,IGROUP,ITYPE else STOP 'unknown IMODE4, must be M4_CR95 or M4_CR98' endif C TAKE CARE IF CELL OF TYPE 1 IS HEXAGONAL TYPE IF(IGROUP.EQ.1) THEN CALL GETARG(IARG_IGRP,AGRP) c agrp is '8' for HEXAGONAL systems and '9' for TRIGONAL_NOT_RHOMBOHEDRAL IGROUP=C2I(AGRP) ENDIF WRITE(12,*) 'DIM-GROUP' WRITE(12,*) IDIM,IGROUP C VECTOR1 GOES TO FIRST COLOUMN, VETCOR2 TO SECOND & VECTOR3 TO C THIRD COLOUMN;;; DV(COL,ROW) C |11 21 31| |x1 x2 x3| C VEC = |12 22 32| => DV = |y1 y2 y3| C |13 23 33| |z1 z2 z3| READ(34,*) ((DV(I,J),J=1,3),I=1,3) IF(IMODE3.EQ.M3_BOHR)THEN !convert from bohrs to angstroms DO I=1,3 DO J=1,3 DV(J,I) = BOHR * DV(J,I) ENDDO ENDDO ENDIF if(idim.lt.3)dv(3,3) = 1.0d0 if(idim.lt.2)dv(2,2) = 1.0d0 if(idim.lt.1)dv(1,1) = 1.0d0 WRITE(12,*) 'PRIMVEC' DO I=1,3 WRITE(12,'(3(1x,f15.10)/3(1x,f15.10)/3(1x,f15.10))') $ (DV(I,J),J=1,3) ENDDO READ(34,*) NSYMOP DO I=1,NSYMOP C READ SYMM. OPERATOR DO J=1,3 READ(34,*) (SOP(JJ,J,I),JJ=1,3) ENDDO C READ CARTESIAN COMP. OF THE TRANSALTIUON DUE TO SYM. OPER. READ(34,*) TRX(I),TRY(I),TRZ(I) IF(IMODE3.EQ.M3_BOHR)THEN !convert from bohrs to angstroms trx(i)=trx(i)*BOHR try(i)=try(i)*BOHR trz(i)=trz(i)*BOHR ENDIF ENDDO C READ NATR; READ(34,*) NATR C NAT,X,Y,Z WILL ARE READ in CONVATOM subroutine !!!!!! c print *,'READFTN34_END' RETURN END SUBROUTINE CONVATOM(IGROUP,NARG,NCSTMC,IMODE4) IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' CHARACTER*80 FILE2 INTEGER NAT(NAC) REAL*8 AC(3,2),BC(3,2),CC(3,2),FC(3,4),IC(3,2),RC(3,3),HC(3,3), $ CSTMC(3,4), * DVC(3,3),SOP(3,3,48),TRX(48),TRY(48),TRZ(48), * XC(NAC,4),YC(NAC,4),ZC(NAC,4), * X(NAC),Y(NAC),Z(NAC),DVEC(3,3) COMMON/APOS/ AC,BC,CC,FC,IC,HC,RC,DVC,CSTMC COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR COMMON/BOHRR/ BOHR,IMODE3 include 'mode.inc' c DEBUG_BEGIN c print *,'DEBUG: CONVATOM' c print *,'DEBUG: NCSTMC::', NCSTMC c do i=1,4 c print *,'DEBUG: CSTMC::',(CSTMC(j,i),j=1,3) c enddo c DEBUG_END C READ NAT,X,Y,Z FROM UNIT 11 (FILE1) & PREPARE ATOMS FOR DIFFERENT C CENTERED CELL c print *,'IN CONVATOM' DO I=1,NATR if (narg.eq.8) then READ(34,*) NAT(I),X(I),Y(I),Z(I) IF(IMODE3.EQ.M3_BOHR) THEN X(I) = X(I) * BOHR Y(I) = Y(I) * BOHR Z(I) = Z(I) * BOHR ENDIF endif enddo if (IMODE4 .eq. M4_CR98) then c generate all equivalent atoms from non-equivalent call GenEquPos !GenEquPos is still bugy endif c write PRIMCOOR just if we have read data from unit34 if (narg.eq.8) then WRITE(12,*) 'PRIMCOORD' WRITE(12,*) NATR,' 1' endif DO I=1,NATR if(narg.eq.8) WRITE(12,'(i3,3x,3(f15.10,2x))') $ NAT(I),X(I),Y(I),Z(I) c print *,'i;nat,x,y,z>>',i,NAT(I),X(I),Y(I),Z(I) C ALL DIFFERENT GROUPS HAVE (0,0,0) XC(I,1)=X(I) YC(I,1)=Y(I) ZC(I,1)=Z(I) GOTO(101,201,301,401,501,601,701,801,801,1001) IGROUP 201 CONTINUE C *** P->A CALL GETCCOOR(DVC,AC,2,X,Y,Z,XC,YC,ZC,I,NATR) GOTO 1001 301 CONTINUE C *** P->B CALL GETCCOOR(DVC,BC,2,X,Y,Z,XC,YC,ZC,I,NATR) GOTO 1001 401 CONTINUE C *** P->C CALL GETCCOOR(DVC,CC,2,X,Y,Z,XC,YC,ZC,I,NATR) GOTO 1001 501 CONTINUE C *** P->F c print *,'before DO' DO IN=2,4 CALL GETCCOOR(DVC,FC,IN,X,Y,Z,XC,YC,ZC,I,NATR) ENDDO c print *,'after DO' GOTO 1001 601 CONTINUE C *** P->I CALL GETCCOOR(DVC,IC,2,X,Y,Z,XC,YC,ZC,I,NATR) GOTO 1001 701 CONTINUE C *** PR->R; primitiv rhombohedral --> rhombohedraly centered DO IN=2,3 c print *,'RC>>>>',(rc(j,in),j=1,3) CALL GETCCOOR(DVC,RC,IN,X,Y,Z,XC,YC,ZC,I,NATR) ENDDO GOTO 1001 C *** P->H 801 CONTINUE DO IN=2,3 CALL GETCCOOR(DVC,HC,IN,X,Y,Z,XC,YC,ZC,I,NATR) ENDDO C *** P->CSTMC 1001 CONTINUE DO IN=1,NCSTMC CALL GETCCOOR(DVC,CSTMC,IN,X,Y,Z,XC,YC,ZC,I,NATR) ENDDO 101 CONTINUE ENDDO C WRITE COORD. OF ATOMS WITHIN CONV. CELL IN XYZ COORD. WRITE(12,*) 'CONVCOORD' C NCELL.......N. of ATOMS PER CONV. CELL if (igroup.lt.10) then NCELL=NCDET(IGROUP) else NCELL=NCSTMC ! ncstmc was determined by GetCenteredPoints endif c print *,'DEBUG: NCELL=',ncell WRITE(12,*) NATR,NCELL DO I=1,NATR DO II=1,NCELL WRITE(12,'(i3,3x,3(f15.10,2x))') $ NAT(I),XC(I,II),YC(I,II),ZC(I,II) ENDDO ENDDO c print *,'CONVATOM_END' RETURN END SUBROUTINE GenEquPos IMPLICIT REAL*8 (a-h,o-z) include 'param.inc' INTEGER NAT(NAC) REAL*8 DV(3,3),SOP(3,3,48),TRX(48),TRY(48),TRZ(48), * X(NAC),Y(NAC),Z(NAC),DVEC(3,3) REAL*8 v(3), vr(3), dvinv(3,3), a(3), d(3) REAL*8 rx(NAC), ry(NAC), rz(NAC) LOGICAL not_equal, equal COMMON/FTN34/ SOP,TRX,TRY,TRZ,DV,IDIM,IGROUP,NSYMOP COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR PARAMETER (TOLMIN=1.0d-6) call InvertSqMat123(dv, dvinv, 3) c print *,'DV::',((dv(i,j),i=1,3),j=1,3) c print *,'IDV::',((dvinv(i,j),i=1,3),j=1,3) c to fractional do i=1,natr vr(1)=x(i) vr(2)=y(i) vr(3)=z(i) call ZeroMat(a,3,1) call MatMult(dvinv, 3, 3, vr, 1, a) rx(i)=a(1) ry(i)=a(2) rz(i)=a(3) enddo n_non_a=natr do i=1,n_non_a na = nat(i) v(1) = x(i) v(2) = y(i) v(3) = z(i) do j=1,nsymop vr(1) = trx(j) vr(2) = try(j) vr(3) = trz(j) call MatMult(sop(1,1,j),3,3,v,1,vr) c print *,i,j,(vr(k),k=1,3) c to fractional call ZeroMat(a,3,1) call MatMult(dvinv, 3, 3, vr, 1, a) c to [-0.5,0.5] do i3=1,idim a(i3)=a(i3) - dnint(a(i3)) enddo c to Cartesian call ZeroMat(vr,3,1) call MatMult(dv, 3, 3, a, 1, vr) c check if we have new atom not_equal=.true. k=1 do while (k .le. natr .and. not_equal) if ( nat(k) .ne. na ) goto 1 d(1)=rx(k)-a(1) d(2)=ry(k)-a(2) d(3)=rz(k)-a(3) do i3=1,idim d(i3)=d(i3) - dnint(d(i3)) enddo if ( abs(d(1)) + abs(d(2)) + abs(d(3)) .lt. TOLMIN ) $ not_equal=.false. 1 continue k=k+1 enddo c print *,'vr_point:',i,na,vr(1),vr(2),vr(3),.not.not_equal if (not_equal) then c print *,'DIFF:', abs(d(1)) + abs(d(2)) + abs(d(3)) natr=natr+1 nat(natr) = na x(natr) = vr(1) y(natr) = vr(2) z(natr) = vr(3) rx(natr)= a(1) ry(natr)= a(2) rz(natr)= a(3) c debug--debug c print *,'new_position: ', a(1), a(2), a(3) endif enddo enddo return END INTEGER FUNCTION NCDET(IGROUP) C DETERMINE HOW MENY ATOMS WILL BE IN CONV. CELL IF(IGROUP.EQ.1 .OR. IGROUP.EQ.9) NCDET=1 IF((IGROUP.GT.1.AND.IGROUP.LT.5).OR.(IGROUP.EQ.6)) NCDET=2 IF(IGROUP.EQ.5) NCDET=4 IF(IGROUP.EQ.7.OR.IGROUP.EQ.8) NCDET=3 RETURN END SUBROUTINE GETCCOOR(A33,B33,BROW,X,Y,Z,XC,YC,ZC,NA,NATR) include 'param.inc' REAL*8 B33(3,*),A33(3,3),RA(3,3),COOR(3),X(NATR),Y(NATR),Z(NATR), * XC(NAC,4),YC(NAC,4),ZC(NAC,4),RX(3) INTEGER BROW C ******** C ATTENTION: HERE WE HAVE MULT. OFF "SAME-LAYING" ELEMENTS, C BECAUSE B33(*,BROW) IS ROW VECTOR INSTEAD OF COLOUMN !!!! C ******** c print *,'DVC::',((a33(i,j),j=1,3),i=1,3) c print *,'FC::',(b33(i,brow),i=1,3) DO J=1,3 COOR(J)=0.0d0 DO I=1,3 COOR(J)=COOR(J)+A33(I,J)*B33(I,BROW) ENDDO ENDDO XC(NA,BROW)=X(NA)+COOR(1) YC(NA,BROW)=Y(NA)+COOR(2) ZC(NA,BROW)=Z(NA)+COOR(3) c ***************************************************** c COORDINATES must be within [-1,1], check that !!! c ***************************************************** call InvertSqMat123( A33, RA, 3 ) do i=1,3 rx(i) = xc(na,brow)*ra(1,i) + yc(na,brow)*ra(2,i) + $ zc(na,brow)*ra(3,i) if ( rx(i) .gt. 1.0d0 ) then rx(i) = rx(i) - 1.0d0 else if ( rx(i) .lt. -1.0d0 ) then rx(i) = rx(i) + 1.0d0 endif enddo c print *, 'DEBUG: fractC #',na,'::',rx(1),rx(2),rx(3) xc(na,brow) = rx(1)*a33(1,1) + rx(2)*a33(2,1) + rx(3)*a33(3,1) yc(na,brow) = rx(1)*a33(1,2) + rx(2)*a33(2,2) + rx(3)*a33(3,2) zc(na,brow) = rx(1)*a33(1,3) + rx(2)*a33(2,3) + rx(3)*a33(3,3) RETURN END C SUBROUTINE READARG(NATOM,F1,F2,NX,NY,NZ) C COMMON/DIR/ NXDIR,NYDIR,NZDIR C CHARACTER*80 ANX,ANY,ANZ,FILE1,FILE2 C INTEGER C2I,F1,F2 C this command read: NXDIR, NYDIR, NZDIR arguments C THIS SUBROUTINE READ THE REST OF COMMAND LINE ARGUMENTS C & ESTIMATE THE NUMBER OF ATOMS THAT WILL BE PRODUCED C WITH MULTIPLICATION (COUNT JUST ONE ATOM PER CELL) C C CALL GETARG(F1,FILE1) C OPEN(UNIT=11,FILE=FILE1,STATUS='OLD') C CALL GETARG(F2,FILE2) C OPEN(UNIT=12,FILE=FILE2,STATUS='UNKNOWN') C CALL GETARG(NX,ANX) C CALL GETARG(NY,ANY) C CALL GETARG(NZ,ANZ) C NXDIR=C2I(ANX) C NYDIR=C2I(ANY) C NZDIR=C2I(ANZ) c print *,'anx,any,anz',anx,any,anz C NUMBER OF ATOMS/CELLS (ONE PER CELL) C NATOM=(NXDIR+2)*(NYDIR+2)*(NZDIR+1) c print *,'nx,ny,nz>',nxdir,nydir,nzdir C RETURN C END C THIS SUBROUTINE IS USED WHEN WE ARE DEALING WITH MOLECULE: C IT WRITE A COORDINATES OF MOLECULE/CLUSTER SUBROUTINE MOLECULE include 'param.inc' INTEGER NAT(NAC) REAL*8 X(NAC),Y(NAC),Z(NAC),DVEC(3,3) COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR WRITE(12,*) 'ATOMS' DO I=1,NATR WRITE(12,21) NAT(I),X(I),Y(I),Z(I) ENDDO 21 FORMAT(I5,3F16.10) RETURN END LOGICAL Function IsReverse(CSTMC,RCR) REAL*8 CSTMC(3,4), RC(3,3), RCR(3,3), TOLMIN LOGICAL isequal TOLMIN=1.0d-6 c R(x/y/z,#point) do ir=1,3 isequal=.FALSE. c can we find RCR(*,ir) point among CSTMC(*,#) points do ic=1,3 do j=1,3 if ( abs(CSTMC(j,ic)-RCR(j,ir)) .lt. TOLMIN ) $ isequal=.TRUE. enddo enddo if (.not.isequal) then c RCR(*,ir) point wasn't find -> OBVERSE SETTINGS IsReverse=.FALSE. return endif enddo IsReverse=.TRUE. return End xcrysden-1.6.2/F/fhi_inpini2ftn34.f0000644000175000017500000001115511712736221015471 0ustar tonetonec ******************************************************** program InpIni2XCR c Usage: inpini2xcr inpini_file [get_species] c c if get_species argument is present (it can be what-ever) c then just return the list of species c ******************************************************** include 'param.inc' PARAMETER( !type of execution $ IGET_FTN34=0, ! produce ftn34 $ IGET_SPECIES=1 ! get species names $ ) implicit real*8 (a-h,o-z) character*256 file character*10 $ name(NAC) integer $ nrx(3), $ ineq_pos(3), $ symop(48,3,3), $ coor_index(NAC), $ nat(NAC) real*8 $ nel, $ xk(3,10000), $ wkpt(10000), $ a(3,3), $ b(3,3), $ valence_charge(NAC), $ ion_fac, $ ion_damp, $ coor(3,NAC), $ vau0(3,NAC), $ coor_valcharge(NAC) logical $ tmetal, tdegen, $ tmold, tband, $ tpsmesh, coordwave, $ t_init_basis_s, t_init_basis_p, t_init_basis_d, $ coorflag(3,NAC), tford(NAC) narg = iargc() if (narg.lt.1 .or. narg.gt.2) $ stop 'Usage: fhi_inpini2xcr [get_species]' iexec_type = IGET_FTN34 if (narg.eq.2) iexec_type = IGET_SPECIES call getarg(1,file) len = index(file,' ') - 1 open(unit=1, file=file(1:len), status='old') read(1,*) nsx,nax,nx,ngwx1,ngwx88 read(1,*) ngwix,nx_init,nrx(1),nrx(2),nrx(3),nschltz read(1,*) nx_basis,max_basis_n,nlmax_init read(1,*) nnrx,nkpt,nlmax,mmaxx,n_fft_store read(1,*) minpes, ngrpx, nrpes read(1,*) ibrav, pgind read(1,*) nel,tmetal,ekt,tdegen read(1,*) ecut,ecuti read(1,*) tmold,tband,nrho read(1,*) npos, nthm, nseed read(1,*) T_ion, T_init, Q, nfi_rescale read(1,*) nsp,tpsmesh,coordwave read(1,*) nkpt do i=1,nkpt read(1,*) (xk(j,i), j=1,3), wkpt(i) enddo do i=1,3 read(1,*) (a(j,i), j=1,3) enddo do i=1,3 read(1,*) (b(j,i), j=1,3) enddo read(1,*) alat,omega iat=0 do i=1,nsx read(1,*) name(i),number,valence_charge(i), ion_fac read(1,*) ion_damp,rgauss,l_max,l_loc read(1,*) t_init_basis_s, t_init_basis_p, t_init_basis_d do ii=1,number iat = iat + 1 read(1,*) (coor(j,iat), j=1,3), $ (coorflag(j,iat), j=1,3), tford(iat) if (npos.eq.1 .or. npos.eq.4) read(1,*) (vau0(j,iat), j=1,3) coor_index(iat) = i coor_valcharge(iat) = valence_charge(i) enddo read(1,*) (ineq_pos(j),j=1,3) enddo c ********************************************************************** c we already have enough information, but lets read the rest of the file c ********************************************************************** read(1,*) nsymop do ii=1,nsymop read(1,'(i3)') isymop do i=1,3 read(1,*) (symop(isymop,j,i),j=1,3) enddo enddo c after SYMOP there are two lines - I don't know the meaning - IGNORE c *** c *** RETURN list of species c *** if (iexec_type .eq. IGET_SPECIES)then open(unit=2,file='fhi_species_name.list', status='unknown') write(2,*) nsx write(2,'(a10)') (name(i),i=1,nsx) else c *** c *** WRITE fort.34 file c *** open(unit=3, file='fhi_species_nat.list', status='old') read(3,*) nsx read(3,*) (nat(i),i=1,nsx) igroup=1 if ( ibrav.eq.0 ) igroup=1 !user-supplied --> primitive (SO FAR!!!) if ( ibrav.eq.1 ) igroup=1 !simple-cubic --> primitive if ( ibrav.eq.2 ) igroup=5 !fcc --> fcc if ( ibrav.eq.3 ) igroup=6 !bcc --> bcc if ( ibrav.eq.4 ) igroup=8 !haxagonal --> hexagonal if ( ibrav.eq.8 ) igroup=1 !orthorhombic --> primitive if ( ibrav.eq.10) igroup=7 !rhombohedral --> rhombohedral if ( ibrav.eq.12) igroup=1 !bc orthorombic--> primitive write(34,*) 'EXTERNAL' write(34,*) 3,igroup write(34,1000) a write(34,*) '1' write(34,*) '1. 0. 0.' write(34,*) '0. 1. 0.' write(34,*) '0. 0. 1.' write(34,*) '0. 0. 0.' write(34,*) iat do i=1,iat write(34,*) nat(coor_index(i)), (coor(j,i), j=1,3) enddo write(34,*) 'END' endif 1000 format(2(3(F15.9,2X),/),3(F15.9,2X)) END xcrysden-1.6.2/F/pwi2xsf_old.f0000644000175000017500000004312513525474746014675 0ustar tonetonec ------------------------------------------------------------------------ program pwi2xsf_old c reads preprocesed (with pwi2xsf.sh) PW-input file (OLD versions ~ 1.0) c and converts to XSF format file c c Usage: pwi2xsf.sh < PW-preprocessed file c ------------------------------------------------------------------------ implicit none integer maxtyp real*8 $ bohr parameter (maxtyp = 100, bohr = 0.529177d0) integer $ ibrav, ! label for Bravais lattice $ nat, ! number of atoms $ ntyp ! number of pseudopotentials real*8 $ celldm(6), ! cell parameters $ alat ! lattice parameter character $ dummy*80 integer $ ityp, ! type of PP $ atn(maxtyp), ! nuclear charge $ ounit, ! output unit $ i, j ! dummies real*8 $ tau( 3 ), + p( 3,3 ), ! lattice vectors (PRIMITIVE) + c( 3,3 ) ! lattice vectors (CONVETIONAL) logical $ ltaucry namelist/input/ ibrav, nat, celldm, ltaucry ltaucry = .false. ounit=6 c set default values nat = 0 ibrav = 0 celldm(1) = 0.0d0 do i=1,maxtyp atn(i) = 0 enddo open(1, file='nuclei.charges', status='old') read (1,*) ntyp do i=1,ntyp read (1,*) j,atn(j) enddo close(1) read (5,input) if ( nat.eq.0 .or. celldm(1).eq.0.0d0 ) then print *,'ERROR reading INPUT. STOPPING !!!' STOP endif if ( ibrav.eq.0 ) then c read custom lattice read (5,*) ((p(i,j),i=1,3),j=1,3) read (5,*) dummy call dcopy(p,c,9) else call pwLatgen( ibrav, celldm, $ p(1,1), p(1,2), p(1,3), c(1,1), c(1,2), c(1,3) ) endif alat = bohr*celldm(1) call write_XSF_header (alat, p, c, nat, ounit) do i=1,nat read(5,*) tau(1), tau(2), tau(3), ityp if (ltaucry) call pwCryst_to_cart(1, tau, p, 1) write(ounit,'(i3,2x,3f15.10)') atn(ityp), $ alat*tau(1), alat*tau(2), alat*tau(3) enddo END c ------------------------------------------------------------------------ subroutine write_XSF_header (alat, p, c, nat, ounit) c writes the header for XSF structure file c ------------------------------------------------------------------------ real*8 $ alat, ! lattice parameter $ p(3,3), c(3,3), ! lattive vectors (PRIMITIVE & CONVETIONAL) $ p1(3,3), c1(3,3) ! lattive vectors in ANGSTROMS unit integer $ nat, ! number of atoms $ ounit ! output unit integer $ i, j ! dummies do i=1,3 do j=1,3 p1(i,j) = alat*p(i,j) c1(i,j) = alat*c(i,j) enddo enddo write(ounit,'('' DIM-GROUP'')') write(ounit,*) 3, 1 write(ounit,'(/,'' PRIMVEC'')') write(ounit,'(3(f15.10,2x,f15.10,2x,f15.10,/))') $ ((p1(i,j),i=1,3),j=1,3) write(ounit,'('' CONVVEC'')') write(ounit,'(3(f15.10,2x,f15.10,2x,f15.10,/))') $ ((c1(i,j),i=1,3),j=1,3) write(ounit,'('' PRIMCOORD'')') write(ounit,*) nat, 1 return end c ------------------------------------------------------------------------ subroutine dcopy(src,dst,n) c ------------------------------------------------------------------------ real*8 $ src(*), dst(*) integer $ n, i do i=1,n dst(i) = src(i) enddo return end c This is basically a rewrite of Quantum ESPRESSO's latgen routine, c rewritten to suite current needs. c c This file is distributed under the terms of the GNU General Public c License. See the file `License' in the root directory of the present c distribution, or http://www.gnu.org/copyleft/gpl.txt . c c c--------------------------------------------------------------------- subroutine pwLatgen( ibrav, celldm, p1, p2, p3, c1, c2, c3 ) c--------------------------------------------------------------------- c c This routine sets up the crystallographic vectors p1, p2, and p3. c The a's are expressed in units of celldm(1) ( a0 for c cubic lattices). This version contains all 14 Bravais lattices. c implicit none c c First the input variables c real*8 + celldm( 6 ), ! input: the dimensions of the lattice + p1( 3 ), ! output: the first lattice vector (PRIMITIVE) + p2( 3 ), ! output: the second lattice vector + p3( 3 ), ! output: the third lattice vector + c1( 3 ), ! output: the first lattice vector(CONVETIONAL) + c2( 3 ), ! output: the second lattice vector + c3( 3 ) ! output: the third lattice vector integer + ibrav ! input: the index of the Bravais lattice c c Here the local variables required by the routine c real*8 + sr2, ! the square root of 2.0 + sr3 ! the square root of 3.0 parameter (sr2 = 1.4142 13562 373d0, sr3 = 1.7320 50807 569d0) real*8 + term, !\ + term1, ! \ + term2, ! Auxiliary variables + cbya, ! / + singam, !/ + sin, ! the sine function + sen integer + ipol ! counter on the coordinates if ( celldm( 1 ) .le. 0.d0 ) + call pwError( 'latgen', 'wrong celldm', max(1,ibrav) ) if ( ibrav .eq. 0 ) then c c user supplied lattice c do ipol = 1, 3 p1( ipol ) = 0.d0 p2( ipol ) = 0.d0 p3( ipol ) = 0.d0 c1( ipol ) = 0.d0 c2( ipol ) = 0.d0 c3( ipol ) = 0.d0 end do endif if ( ibrav .eq. 1 ) then c c simple cubic lattice c p1( 1 ) = 1.0d0 p2( 2 ) = 1.0d0 p3( 3 ) = 1.0d0 elseif ( ibrav .eq. 2 ) then c c fcc lattice c term = 1.0d0 / 2.d0 p1( 1 ) = - term p1( 3 ) = term p2( 2 ) = term p2( 3 ) = term p3( 1 ) = - term p3( 2 ) = term c1( 1 ) = 1.0d0 c2( 2 ) = 1.0d0 c3( 3 ) = 1.0d0 c ********** return elseif ( ibrav .eq. 3 ) then c c bcc lattice c term = 1.0d0 / 2.d0 do ipol = 1, 3 p1( ipol ) = term p2( ipol ) = term p3( ipol ) = term enddo p2( 1 ) = - term p3( 1 ) = - term p3( 2 ) = - term c1( 1 ) = 1.0d0 c2( 2 ) = 1.0d0 c3( 3 ) = 1.0d0 c ********** return elseif ( ibrav .eq. 4 ) then c c hexagonal lattice c if ( celldm( 3 ) .le. 0.d0 ) + call pwError( 'latgen', 'wrong celldm', 4 ) cbya = celldm( 3 ) p1( 1 ) = 1.0d0 p2( 1 ) = -1.0d0 / 2.d0 p2( 2 ) = sr3 / 2.d0 p3( 3 ) = cbya elseif ( abs(ibrav) .eq. 5 ) then c c trigonal lattice c if ( celldm( 4 ) .le. -0.5d0 .or. celldm (4) .ge. 1.0d0 ) + call pwError( 'latgen', 'wrong celldm', 5 ) term1=sqrt(1.d0 + 2.d0*celldm(4)) term2=sqrt(1.d0 - celldm(4)) if ( ibrav == 5 ) then ! threefold axis along c (001) p2(2) = sr2*term2/sr3 p2(3) = term1/sr3 p1(1) = term2/sr2 p1(2) =-p1(1)/sr3 p1(3) = p2(3) p3(1) =-p1(1) p3(2) = p1(2) p3(3) = p2(3) elseif ( ibrav == -5 ) then ! threefold axis along (111) p1(1) = (term1 - 2.0d0*term2) / 3.0d0 p1(2) = (term1 + term2) / 3.0d0 p1(3) = p1(2) p2(1) = p1(3) p2(2) = p1(1) p2(3) = p1(2) p3(1) = p1(2) p3(2) = p1(3) p3(3) = p1(1) endif elseif ( ibrav .eq. 6 ) then c c tetragonal lattice c if ( celldm( 3 ) .le. 0.d0 ) + call pwError( 'latgen', 'wrong celldm', 6 ) cbya = celldm( 3 ) p1( 1 ) = 1.0d0 p2( 2 ) = 1.0d0 p3( 3 ) = cbya elseif ( ibrav .eq. 7 ) then c c body centered tetragonal lattice c if ( celldm( 3 ) .le. 0.d0 ) + call pwError( 'latgen', 'wrong celldm', 7 ) cbya=celldm(3) p2(1)=1.0d0/2.d0 p2(2)=p2(1) p2(3)=cbya/2.d0 p1(1)= p2(1) p1(2)=-p2(1) p1(3)= p2(3) p3(1)=-p2(1) p3(2)=-p2(1) p3(3)= p2(3) c1(1) = 1.0d0 c2(2) = 1.0d0 c3(3) = cbya c ********** return elseif ( ibrav .eq. 8 ) then c c Simple orthorombic lattice c if ( celldm( 2 ) .le. 0.d0 .or. celldm( 3 ) .le. 0.d0 ) $ call pwError( 'latgen', 'wrong celldm', 8 ) p1( 1 ) = 1.0d0 p2( 2 ) = celldm( 2 ) p3( 3 ) = celldm( 3 ) elseif ( abs(ibrav) .eq. 9 ) then c c One face centered orthorombic lattice c if ( celldm( 1 ) .le. 0.d0 .or. celldm( 2 ) .le. 0.d0 + .or. celldm( 3 ) .le. 0.d0 ) + call pwError( 'latgen', 'wrong celldm', 9 ) if ( ibrav .eq. 9 ) then ! old PWscf description p1( 1 ) = 0.5d0 p1( 2 ) = p1(1) * celldm( 2 ) p2( 1 ) = - p1( 1 ) p2( 2 ) = p1( 2 ) else ! alternate description p1(1) = 0.5d0 p1(2) =-p1(1) * celldm(2) p2(1) = p1(1) p2(2) =-p1(2) endif p3( 3 ) = celldm( 3 ) c1(1) = 1.0d0 c2(2) = celldm(2) c3(3) = celldm(3) c ********** return elseif ( ibrav .eq. 10 ) then c c All face centered orthorombic lattice c if ( celldm( 2 ) .le. 0.d0 .or. celldm( 3 ) .le. 0.d0 ) + call pwError( 'latgen', 'wrong celldm', 10 ) p2( 1 ) = 0.5d0 p2( 2 ) = 0.5d0 * celldm( 2 ) p1( 1 ) = p2( 1 ) p1( 3 ) = 0.5d0 * celldm( 3 ) p3( 2 ) = 0.5d0 * celldm( 2 ) p3( 3 ) = p1( 3 ) c1(1) = 1.0d0 c2(2) = celldm(2) c3(3) = celldm(3) c ********** return elseif ( ibrav .eq. 11 ) then c c Body centered orthorombic lattice *** HERE c if ( celldm( 2 ) .le. 0.d0 .or. celldm( 3 ) .le. 0.d0 ) + call pwError( 'latgen', 'wrong celldm', 11 ) p1( 1 ) = 0.5d0 p1( 2 ) = 0.5d0 * celldm( 2 ) p1( 3 ) = 0.5d0 * celldm( 3 ) p2( 1 ) = - p1( 1 ) p2( 2 ) = p1( 2 ) p2( 3 ) = p1( 3 ) p3( 1 ) = - p1( 1 ) p3( 2 ) = - p1( 2 ) p3( 3 ) = p1( 3 ) c1(1) = 1.0d0 c2(2) = celldm(2) c3(3) = celldm(3) c ********** return elseif ( ibrav .eq. 12 ) then c c Simple monoclinic lattice, unique (i.e. orthogonal to a) axis: c c if ( celldm( 2 ) .le. 0.d0 .or. celldm( 3 ) .le. 0.d0 $ .or. abs(celldm(4)) .ge. 1.d0 ) $ call pwError( 'latgen', 'wrong celldm', 12 ) sen = sqrt( 1.d0 - celldm( 4 ) ** 2 ) p1( 1 ) = 1.0d0 p2( 1 ) = celldm( 2 ) * celldm( 4 ) p2( 2 ) = celldm( 2 ) * sen p3( 3 ) = celldm( 3 ) else if (ibrav ==-12) then ! ! Simple monoclinic lattice, unique axis: b (more common) ! if (celldm(2) .le. 0.d0) $ call pwError ('latgen', 'wrong celldm(2)', ibrav) if (celldm(3) .le. 0.d0) $ call pwError ('latgen', 'wrong celldm(3)', ibrav) if (abs(celldm(5)).ge.1.d0) $ call pwError ('latgen', 'wrong celldm(5)', ibrav) sen=sqrt(1.d0-celldm(5)**2) p1(1) = 1.0d0 p2(2) = celldm(2) p3(1) = celldm(3)*celldm(5) p3(3) = celldm(3)*sen elseif ( ibrav .eq. 13 ) then c c One face centered monoclinic lattice c if ( celldm( 2 ) .le. 0.d0 + .or. celldm( 3 ) .le. 0.d0 + .or. abs ( celldm( 4 ) ) .ge. 1.d0 ) + call pwError( 'latgen', 'wrong celldm', 13 ) sen = sqrt( 1.d0 - celldm(4) ** 2 ) p1(1) = 0.5 p1(3) =-p1(1) * celldm(3) p2(1) = celldm(2) * celldm(4) p2(2) = celldm(2) * sen p3(1) = p1(1) p3(3) =-p1(3) c1(1) = 1.0d0 c2(1) = p2(1) c2(2) = p2(2) c3(3) = celldm(3) return elseif ( ibrav .eq. 14 ) then c c Triclinic lattice c if ( celldm( 2 ) .le. 0.d0 + .or. celldm( 3 ) .le. 0.d0 + .or. abs ( celldm( 4 ) ) .ge. 1.d0 + .or. abs ( celldm( 5 ) ) .ge. 1.d0 + .or. abs ( celldm( 6 ) ) .ge. 1.d0 ) + call pwError( 'latgen', 'wrong celldm', 14 ) singam = sqrt( 1.d0 - celldm( 6 ) ** 2 ) term = 1.d0 $ + 2.d0 * celldm( 4 ) * celldm( 5 ) * celldm( 6 ) $ - celldm( 4 )**2 + - celldm( 5 )**2 $ - celldm( 6 )**2 if (term < 0.d0) call pwError('latgen', $ 'celldm do not make sense, check your data', ibrav) term = sqrt(term / ( 1.d0 - celldm( 6 ) ** 2 )) p1( 1 ) = 1.0d0 p2( 1 ) = celldm( 2 ) * celldm( 6 ) p2( 2 ) = celldm( 2 ) * singam p3( 1 ) = celldm( 3 ) * celldm( 5 ) p3( 2 ) = celldm( 3 ) * $ (celldm(4) - celldm(5)*celldm(6)) / singam p3( 3 ) = celldm( 3 ) * term else call pwError('latgen', ' wrong ibrav ', ibrav ) endif c ********** c if we came here then just copy p vectors to c vectors !!! c ********** do ipol = 1, 3 c1( ipol ) = p1( ipol ) c2( ipol ) = p2( ipol ) c3( ipol ) = p3( ipol ) enddo return end c c----------------------------------------------------------------------- subroutine pwCryst_to_cart ( nvec, vec, trmat, iflag ) c----------------------------------------------------------------------- c c This routine transforms the atomic positions or the k-point c components from crystallographic to carthesian coordinates ( iflag=1) c and viceversa ( iflag=-1 ). c Output carth. coordinates are stored in the input ('vec') array. c c implicit none c c first the dummy variables c integer + nvec, ! input: number of vectors (atom. pos. or k-points) + ! to be transf. from cryst. to carth. axes + iflag ! input: gives the sense of the transformation real*8 + vec(3,nvec), ! input/output: cryst./carth. coord. of the vectors + ! (atom. pos. or k-points) + trmat(3,3) ! input: transformation matrix ! if iflag=1: ! trmat = at , basis of the real-space latt. ! for atoms or ! = bg , basis of the rec.-space latt. ! for k-points ! if iflag=-1: the opposite c c here the local variables c integer + nv, ! counter on vectors + kpol ! counter on polarizations real*8 + vau(3) ! auxil. vector (containing the temp. transf. coord.) c c Compute the carth. coordinates of each vectors c (atomic positions or k-points components) c do nv = 1, nvec if ( iflag.eq.1 ) then do kpol = 1,3 vau(kpol) = trmat(kpol,1)*vec(1,nv) + + trmat(kpol,2)*vec(2,nv) + + trmat(kpol,3)*vec(3,nv) enddo else do kpol = 1,3 vau(kpol) = trmat(1,kpol)*vec(1,nv) + + trmat(2,kpol)*vec(2,nv) + + trmat(3,kpol)*vec(3,nv) enddo endif do kpol = 1,3 vec(kpol,nv) = vau(kpol) enddo enddo c return end ! ! This is taken from an old version of Quantum ESPRESSO's errore ! routine. ! ! This file is distributed under the terms of the GNU General Public ! License. See the file `License' in the root directory of the present ! distribution, or http://www.gnu.org/copyleft/gpl.txt . ! c---------------------------------------------------------------------- subroutine pwError( routin, messag, ierr ) c---------------------------------------------------------------------- c c This is a simple routine which writes an error message to c output. If ierr = 0 it does nothing, if ierr < 0 it c writes the message but does not stop, if ierr > 0 stops. c implicit none character*(*) + routin, ! the name of the calling routine + messag ! the output message integer + ierr ! the error flag if(ierr.eq.0) return write(6,*) ' ' write(6,'(1x,78(''%''))') write(*,'(5x,''from '',a,'' : error #'',i10)') routin, ierr write(*,'(5x,a)') messag write(6,'(1x,78(''%''))') if(ierr.gt.0) then write(*,'('' stopping ...'')') stop else write(6,*) ' ' return end if end xcrysden-1.6.2/F/readXYZ.f0000644000175000017500000000152311712736221013740 0ustar tonetone SUBROUTINE ReadXYZ(NATR,NAT,X,Y,Z) include 'param.inc' INTEGER NAT(NAC) REAL*8 X(NAC),Y(NAC),Z(NAC) CHARACTER*80 DUMMY CHARACTER*4 ATSYM CHARACTER*10 ATOM(100), ATOM_UPPER(100) include 'atoms.inc' do while (.true.) read(33,*,end=200) natr read(33,*) dummy do i=1,natr read(33,*) atsym, x(i), y(i), z(i) c from "ATOMIC SYMBOL" to "ATOMIC NUMBER" len0=Index(atsym,' ')-1 do j=1,100 len=Index(atom(j),' ')-1 if ( (atsym(1:len0).eq.atom(j)(1:len)) $ .or. (atsym(1:len0).eq.atom_upper(j)(1:len)) ) then nat(i)=j goto 100 endif enddo 100 continue enddo enddo 200 continue RETURN END xcrysden-1.6.2/F/voronoi.inc0000644000175000017500000000056213513072344014433 0ustar tonetone REAL*8 MAXERR, MAXERR2 INTEGER MAXPOI,MAX_POLY, MAX_VERT, MAX_PL_VER, MAX_NORD PARAMETER( * MAXERR = 1.d-10, * MAXERR2 = 1.d-8, ! * MAXPOI = 26, * MAXPOI = 1000, * MAX_POLY = 100, * MAX_VERT = 400, * MAX_PL_VER = 100, $ MAX_NORD = 100) xcrysden-1.6.2/F/SRC_nn/0000755000175000017500000000000013556022211013357 5ustar tonetonexcrysden-1.6.2/F/SRC_nn/dirlat.f0000644000175000017500000002602711712736221015021 0ustar tonetoneC SUBROUTINE DIRLAT (nat,ortho,alpha,beta,gamma) C C LATGEN GENERATES THE BRAVAIS MATRIX BR2(3,3), WHICH TRANSFORMS C A RECIPROCAL LATTICE VECTOR OF A SPECIAL COORDINATE SYSTEM (IN C UNITS OF 2 PI/A(I)) INTO CARTESIAN SYSTEM C Convention: R_i = (i,*) C IMPLICIT REAL*8 (A-H,O-Z) LOGICAL ORTHO CHARACTER*4 LATTIC C COMMON /CHAR / LATTIC COMMON /GENER / BR2(3,3) C----------------------------------------------------------------------- C pi=4.d0*atan(1.d0) alpha0=alpha beta0=beta gamma1=gamma*pi/180.d0 beta1=beta*pi/180.d0 alpha1=alpha*pi/180.d0 cosg1=(cos(gamma1)-cos(alpha1)*cos(beta1))/sin(alpha1)/sin(beta1) gamma0=acos(cosg1) IF(LATTIC(1:1).EQ.'H') GOTO 10 IF(LATTIC(1:1).EQ.'S') GOTO 20 IF(LATTIC(1:1).EQ.'P') GOTO 20 IF(LATTIC(1:1).EQ.'B') GOTO 30 IF(LATTIC(1:1).EQ.'F') GOTO 40 IF(LATTIC(1:1).EQ.'C') GOTO 50 IF(LATTIC(1:1).EQ.'R') GOTO 80 STOP 'LATTIC WRONG' C C.....HEXAGONAL CASE 10 BR2(1,1)=SQRT(3.d0)/2.d0 BR2(1,2)=-.5d0 BR2(1,3)=0.0d0 BR2(2,1)=0.0d0 BR2(2,2)=1.0d0 BR2(2,3)=0.0d0 BR2(3,1)=0.0d0 BR2(3,2)=0.0d0 BR2(3,3)=1.d0 ORTHO=.FALSE. GOTO 100 C C.....PRIMITIVE LATTICE CASE 20 continue C BR2(1,1)=1.0d0*sin(gamma0)*sin(beta1) BR2(1,2)=1.0d0*cos(gamma0)*sin(beta1) BR2(1,3)=1.0d0*cos(beta1) BR2(2,1)=0.0d0 BR2(2,2)=1.0d0*sin(alpha1) BR2(2,3)=1.0d0*cos(alpha1) BR2(3,1)=0.0d0 BR2(3,2)=0.0d0 BR2(3,3)=1.0d0 ORTHO=.TRUE. if(gamma.ne.90.d0) ortho=.false. if(beta.ne.90.d0) ortho=.false. if(alpha.ne.90.d0) ortho=.false. write(*,*) alpha0,beta0,gamma0,ortho,br2 GOTO 100 C C.....BC CASE (DIRECT LATTICE) 30 CONTINUE BR2(1,1)=-0.5d0 BR2(1,2)=0.5d0 BR2(1,3)=0.5d0 BR2(2,1)=0.5d0 BR2(2,2)=-0.5d0 BR2(2,3)=0.5d0 BR2(3,1)=0.5d0 BR2(3,2)=0.5d0 BR2(3,3)=-0.5d0 ORTHO=.TRUE. GOTO 100 C C.....FC CASE (DIRECT LATTICE) 40 CONTINUE BR2(1,1)=0.0d0 BR2(1,2)=0.5d0 BR2(1,3)=0.5d0 BR2(2,1)=0.5d0 BR2(2,2)=0.0d0 BR2(2,3)=0.5d0 BR2(3,1)=0.5d0 BR2(3,2)=0.5d0 BR2(3,3)=0.0d0 ORTHO=.TRUE. GOTO 100 C C.....CXY CASE (DIRECT LATTICE) 50 CONTINUE IF(LATTIC(2:3).EQ.'XZ') GOTO 60 IF(LATTIC(2:3).EQ.'YZ') GOTO 70 BR2(1,1)=0.5d0 BR2(1,2)=-0.5d0 BR2(1,3)=0.0d0 BR2(2,1)=0.5d0 BR2(2,2)=0.5d0 BR2(2,3)=0.0d0 BR2(3,1)=0.0d0 BR2(3,2)=0.0d0 BR2(3,3)=1.0d0 ORTHO=.TRUE. GOTO 100 C C.....CXZ CASE (DIRECT LATTICE) 60 CONTINUE C.....CXZ ORTHOROMBIC CASE if(gamma.eq.90.d0) then BR2(1,1)=0.5d0 BR2(1,2)=0.0d0 BR2(1,3)=-0.5d0 BR2(2,1)=0.0d0 BR2(2,2)=1.0d0 BR2(2,3)=0.0d0 BR2(3,1)=0.5d0 BR2(3,2)=0.0d0 BR2(3,3)=0.5d0 ORTHO=.TRUE. GOTO 100 ELSE C.....CXZ MONOCLINIC CASE write(*,*) 'gamma not equal 90' SINAB=SIN(gamma1) COSAB=COS(gamma1) C BR2(1,1)=0.5d0*sinab BR2(1,2)=0.5d0*cosab BR2(1,3)=-0.5d0 BR2(2,1)=0.0d0 BR2(2,2)=1.0d0 BR2(2,3)=0.0d0 BR2(3,1)=0.5d0*sinab BR2(3,2)=0.5d0*cosab BR2(3,3)=0.5d0 ORTHO=.FALSE. GOTO 100 ENDIF C C.....CYZ CASE (DIRECT LATTICE) 70 CONTINUE BR2(1,1)=1.0d0 BR2(1,2)=0.0d0 BR2(1,3)=0.0d0 BR2(2,1)=0.0d0 BR2(2,2)=0.5d0 BR2(2,3)=0.5d0 BR2(3,1)=0.0d0 BR2(3,2)=-0.5d0 BR2(3,3)=0.5d0 ORTHO=.TRUE. GOTO 100 C.....RHOMBOHEDRAL CASE 80 BR2(1,1)=1/2.d0/sqrt(3.d0) BR2(1,2)=-1/2.d0 BR2(1,3)=1/3.d0 BR2(2,1)=1/2.d0/SQRT(3.d0) BR2(2,2)=1*0.5d0 BR2(2,3)=1/3.d0 BR2(3,1)=-1/SQRT(3.d0) BR2(3,2)=0.d0 BR2(3,3)=1/3.d0 ORTHO=.FALSE. GOTO 100 C 100 CONTINUE write(66,*) 'Bravais Matrix:' write(66,999) br2 999 format(3f15.5) C RETURN END xcrysden-1.6.2/F/SRC_nn/Makefile0000644000175000017500000000052113556022211015015 0ustar tonetoneinclude ../../Make.sys OBJ = nn.o \ dirlat.o \ ord2.o all: nn install nn: $(OBJ) $(FC) $(FFLAGS) $(OBJ) -o nn install: if test -f nn.exe ; then cp nn.exe ../../bin ; \ elif test -f nn ; then cp nn ../../bin ; fi clean: -rm *.o if test -f nn.exe; then \ rm nn.exe; \ elif test -f nn; then \ rm nn; \ fi xcrysden-1.6.2/F/SRC_nn/ord2.f0000644000175000017500000000337011712736221014404 0ustar tonetone SUBROUTINE ORD2(A,NR,IMAX) C ORDERS ELEMENTS IN ARRAY A INCREASING IN SIZE C REORDERS CORRESPONDING INDICES (NR) IMPLICIT REAL*8 (A-H,O-Z) LOGICAL CONT DIMENSION A(*),NR(*) DO 50 I=1,IMAX 50 NR(I)=I 100 I=1 CONT=.FALSE. 110 I=I+1 IF(A(I).LT.A(I-1))THEN C INTERCHANGE I AND (I-1) ELEMENT IN ARRAYS A AND NR HLP=A(I) A(I)=A(I-1) A(I-1)=HLP NHLP=NR(I) NR(I)=NR(I-1) NR(I-1)=NHLP CONT=.TRUE. ENDIF IF(I.LT.IMAX)GO TO 110 IF(CONT) GO TO 100 RETURN END xcrysden-1.6.2/F/SRC_nn/nn.f0000644000175000017500000005161611712736221014157 0ustar tonetone PROGRAM NN C C NEAREST NEIGBOUR DISTANCES C (USING LAPW STRUCTURE FILE) C WRITTEN BY K.SCHWARZ AND P.BLAHA C OCTOBER 1988, QTP, U.OF FLORIDA, GAINESVILLE C PARAMETER (NATO=512) PARAMETER (NNN=10000) PARAMETER (NDIF= 999) PARAMETER (mshell= 100) C NATO NUMBER OF ATOMS C NNN NUMBER OF NEIGHBOURS C NDIF NONEQUIVALENT ATOMS C MSHELL Max. Nr. of SHELLS C IMPLICIT REAL*8 (A-H,O-Z) parameter (dlimit=1.d-4) LOGICAL ORTHO,ovlap(NATO),used(nato*ndif),error CHARACTER*4 LATTIC CHARACTER*10 KNAME,NAME,namen(ndif) CHARACTER*11 STATUS,FORM CHARACTER*79 TITLE CHARACTER*80 FNAME C C----------------------------------------------------------------------- C C dimension zz(nato), icnt(ndif,mshell,48),shdist(ndif,mshell) dimension shellz(ndif,mshell,48),iz(ndif,mshell),ishell(ndif*nato) dimension ityp(ndif*nato),imult(ndif*nato),POSN(3,NDIF) DIMENSION DIF(3),XX(3),PP(3),P(3),DISTS(NNN),NR(NNN),PNN(3,NNN) DIMENSION NNAT(NNN),help(3) COMMON /GENER / BR2(3,3) COMMON /STRUK / POS(3,NDIF),A(3),RMT(NATO),V(NATO),PIA(3),VI, * IATNR(NATO),MULT(NATO) DIMENSION R0(NATO),R0N(NDIF),DH(NATO),JRJ(NATO),JRJN(NDIF) dimension rmtt(NATO),rmttn(NDIF),zzn(NDIF) COMMON /ROTMAT/ ROTLOC(3,3,NATO),ROTIJ(3,3,NDIF),TAUIJ(3,NDIF) COMMON /CHAR/ LATTIC,NAME(NATO) C C----------------------------------------------------------------------- C write(*,*) ' please specify nn-bondlength factor: (usually=2)' read(*,*) dfac call getarg(2,fname) if(fname.eq.' ') call getarg(1,fname) OPEN(1,FILE=fname,STATUS='OLD',ERR=8000) c OPEN(1,FILE='//zeus/usr/lapw/def/nn.def',STATUS='OLD',ERR=8000) 8003 READ(1,*,END=8001) IUNIT,FNAME,STATUS,FORM,IRECL OPEN(IUNIT,FILE=FNAME,STATUS=STATUS,FORM=FORM, *ERR=8002) GOTO 8003 8000 WRITE(*,*) ' ERROR IN OPENING NN.DEF !!!!' STOP 'NN.DEF' 8002 WRITE(*,*) ' ERROR IN OPENING UNIT:',IUNIT WRITE(*,*) ' FILENAME: ',FNAME,' STATUS: ',STATUS, *' FORM:',FORM STOP 'OPEN FAILED' 8001 CONTINUE c CALL XUFLOW(0) RTB2=SQRT(3.d0)/2.d0 C C C.....START READING FILE STRUCT, writing new struct (21) READ(20,1510) TITLE print *, title write(66,1510) TITLE write(21,1510) TITLE READ(20,1511) LATTIC,NAT,title print *, lattic,nat,title write(66,1511) LATTIC,NAT,title IF(NAT.GT.NATO) STOP 'NATO TOO SMALL' C READ IN LATTICE CONSTANTS read(20,17) A(1),A(2),A(3),alpha,beta,gamma if(alpha.eq.0.d0) alpha=90.d0 if(beta .eq.0.d0) beta =90.d0 if(gamma.eq.0.d0) gamma=90.d0 write(66,17) A(1),A(2),A(3),alpha,beta,gamma dstmax=min(20.d0,2.99d0*min(a(1),a(2),a(3))) 17 FORMAT(6F10.6) C INDEX COUNTS ALL ATOMS IN THE UNIT CELL, JATOM COUNTS ONLY THE C NONEQUIVALENT ATOMS INDEX=0 DO 50 JATOM = 1,NAT print *,'jatom=', jatom INDEX=INDEX+1 IF(INDEX.GT.NDIF) STOP 'NDIF TOO SMALL' READ(20,1012) IATNR(JATOM),( POS(J,INDEX),J=1,3 ),MULT(JATOM) write(66,1012) IATNR(JATOM),( POS(J,INDEX),J=1,3 ),MULT(JATOM) IF (MULT(JATOM).EQ.0) THEN write(66,1020) JATOM,INDEX,MULT(JATOM) STOP ' NNN: MULT EQ 0' ENDIF DO 55 M=1,MULT(JATOM)-1 INDEX=INDEX+1 IF(INDEX.GT.NDIF) STOP 'NDIF TOO SMALL' READ(20,1011) IATNR(JATOM),( POS(J,INDEX),J=1,3) write(66,1011) IATNR(JATOM),( POS(J,INDEX),J=1,3) 55 CONTINUE READ(20,1050) NAME(JATOM),JRJ(JATOM),R0(JATOM),RMTT(jatom), & zz(jatom) write(66,1050) NAME(JATOM),JRJ(JATOM),R0(JATOM),RMTT(jatom) if((jrj(jatom)/2)*2.eq.jrj(jatom)) then write(*,*)'WARNING: JRJ of atom',jatom,' is even:',jrj(jatom) write(*,*)'CHANGE it to ODD number !!!!' write(66,*)'WARNING: JRJ of atom',jatom,' is even:',jrj(jatom) write(66,*)'CHANGE it to ODD number !!!!' endif DH(JATOM)=LOG(RMTT(jatom)/R0(JATOM)) / (JRJ(JATOM)-1) RMT(JATOM)=R0(JATOM)*EXP( DH(JATOM)*(JRJ(JATOM)-1) ) READ(20,1051) ((ROTLOC(I1,I2,JATOM),I1=1,3),I2=1,3) write(66,1051) ((ROTLOC(I1,I2,JATOM),I1=1,3),I2=1,3) 50 CONTINUE C C C.....SET UP LATTICE, AND IF REQUIRED ROTATION MATRICES CALL DIRLAT (nat,ortho,alpha,beta,gamma) C pi=4.d0*atan(1.d0) cosgam=cos(gamma/180.d0*pi) singam=sin(gamma/180.d0*pi) INDEX=0 DO 200 JATOM=1,NAT do 149 i=1,nat 149 ovlap(i)=.true. DO 190 M=1,MULT(JATOM) INDEX=INDEX+1 DO 150 J=1,3 150 XX(J)=POS(J,INDEX) write(66,1)JATOM,M,NAME(JATOM),XX(1),XX(2),XX(3) 1 FORMAT(/,' ATOM:',I2,2X,'EQUIV.',I3,2X,A10,' AT',3F10.5) NC=0 DO 180 I1=-4,4 DO 180 I2=-4,4 DO 180 I3=-4,4 IF(ortho) THEN P(1)=I1*BR2(1,1)+I2*BR2(2,1)+I3*BR2(3,1) P(2)=I1*BR2(1,2)+I2*BR2(2,2)+I3*BR2(3,2) P(3)=I1*BR2(1,3)+I2*BR2(2,3)+I3*BR2(3,3) ELSE P(1)=I1 P(2)=I2 P(3)=I3 IF(LATTIC(1:3).eq.'CXZ') THEN P(1)=I1*0.5d0+i3*0.5d0 P(2)=I2 P(3)=-I1*0.5d0+i3*0.5d0 END IF ENDIF K=0 DO 120 JAT=1,NAT DO 110 MM=1,MULT(JAT) K=K+1 DIST=0. DO 100 L=1,3 PP(L)=POS(L,K)+P(L) 100 DIF(L)=XX(L)-PP(L) IF (.not.ortho) THEN help(1)=dif(1) help(2)=dif(2) help(3)=dif(3) if(lattic(1:1).eq.'R') then dif(1)=help(1)*BR2(1,1)+help(2)*BR2(2,1)+help(3)*BR2(3,1) dif(2)=help(1)*BR2(1,2)+help(2)*BR2(2,2)+help(3)*BR2(3,2) dif(3)=help(1)*BR2(1,3)+help(2)*BR2(2,3)+help(3)*BR2(3,3) elseif(lattic(1:3).eq.'CXZ') then dif(1)=help(1)*singam dif(2)=(help(1)*cosgam*a(1)+help(2)*a(2))/a(2) dif(3)=help(3) else dif(1)=(help(1)*BR2(1,1)*a(1)+help(2)*BR2(2,1)*a(2)+ * help(3)*BR2(3,1)*a(3))/a(1) dif(2)=(help(1)*BR2(1,2)*a(1)+help(2)*BR2(2,2)*a(2)+ * help(3)*BR2(3,2)*a(3))/a(2) dif(3)=(help(1)*BR2(1,3)*a(1)+help(2)*BR2(2,3)*a(2)+ * help(3)*BR2(3,3)*a(3))/a(3) endif ENDIF DO 103 L=1,3 103 DIST=DIST+DIF(L)*DIF(L)*A(L)*A(L) DIST=SQRT(DIST) IF(DIST.GT.dstmax) GO TO 110 IF(DIST.LT..001) GO TO 110 NC=NC+1 if(nc.gt.nnn) stop ' nnn too small' DISTS(NC)=DIST NNAT(NC)=JAT DO 105 L=1,3 105 PNN(L,NC)=PP(L) C write(66,2)JAT,NAME(JAT),PP(1),PP(2),PP(3),DIST C 2 FORMAT(' TO ATOM:',I2,2X,A10,' AT',3F8.4, C * ' IS ',F10.5,' A.U.') 110 CONTINUE 120 CONTINUE 180 CONTINUE CALL ORD2(DISTS,NR,NC) N1=1 N2=NR(N1) N3=NNAT(N2) SUMRAD=RMT(JATOM)+RMT(N3) IF(M.EQ.1) THEN IF(SUMRAD.LE.DISTS(N1))THEN WRITE(*,7)JATOM,NAME(JATOM),N3,NAME(N3) 7 FORMAT(/,3X,2(' ATOM',I2,2X,A10)) WRITE(*,5)JATOM,RMT(JATOM),N3,RMT(N3),SUMRAD,DISTS(1) write(66,5)JATOM,RMT(JATOM),N3,RMT(N3),SUMRAD,DISTS(1) 5 FORMAT(' RMT(',I2,')=',F7.5,' AND RMT(',I2,')=',F7.5,/, * ' SUMS TO',F8.5,2X,'LT. NN-DIST=',F8.5) ELSE ovlap(n3)=.false. write(66,4) JATOM,RMT(JATOM),N3,RMT(N3), SUMRAD, DISTS(N1) 4 FORMAT(/,' ERROR !!!!!!!!!!!!!!!', */,' RMT(',I2,')=',F7.5,' AND RMT(',I2,')=',F7.5,/, * ' SUMS TO',F8.5,' GT NNN-DIST=',F8.5) WRITE(*,4) JATOM,RMT(JATOM),N3,RMT(N3), SUMRAD, DISTS(N1) ENDIF ENDIF c.....determination of "equal" atoms c olddis=0.d0 ishell(index)=0 c DO 185 N1=1,NC N2=NR(N1) N3=NNAT(N2) SUMRAD=RMT(JATOM)+RMT(N3) if(dists(n1).lt.dfac*dists(1)) then write(66,3) N3,NAME(N3),(PNN(L,N2),L=1,3),DISTS(N1), * DISTS(N1)*0.529177 IF(ovlap(n3).and.SUMRAD.GE.DISTS(N1)) THEN ovlap(n3)=.false. write(66,4) JATOM,RMT(JATOM),N3,RMT(N3), SUMRAD, DISTS(N1) WRITE(*,4) JATOM,RMT(JATOM),N3,RMT(N3), SUMRAD, DISTS(N1) end if end if c if((dists(n1)-olddis).gt.dlimit) then c.....new shell ishell(index)=ishell(index)+1 iz(index,ishell(index))=1 olddis=dists(n1) if(ishell(index).ge.mshell) goto 187 icnt(index,ishell(index),iz(index,ishell(index)))=1 shellz(index,ishell(index),iz(index,ishell(index)))=zz(n3) shdist(index,ishell(index))=olddis else c.....old shell do i=1,iz(index,ishell(index)) if(zz(n3).eq.shellz(index,ishell(index),i)) then icnt(index,ishell(index),i)=icnt(index,ishell(index),i)+1 goto 186 endif enddo iz(index,ishell(index))=iz(index,ishell(index))+1 shellz(index,ishell(index),iz(index,ishell(index)))=zz(n3) icnt(index,ishell(index),iz(index,ishell(index)))=1 endif 186 continue c 185 CONTINUE 187 CONTINUE c c.....limit shells to some maximum do i=1,ishell(index) if(shdist(index,i).gt.dstmax-dstmax/5.d0) then ishell(index)=i goto 190 endif c write(66,*) 'SHELL:',i,shdist(index,i) c do j=1,iz(index,i) c write(66,*) icnt(index,i,j),shellz(index,i,j) c enddo enddo c 190 CONTINUE 200 CONTINUE C write(66,552) 552 format(//,'SHELL STRUCTURE for all ATOMS:',/, *'ATOM | DISTANCE #of NEIGHBORS Z |') INDEX=0 DO JATOM=1,NAT DO M=1,MULT(JATOM) INDEX=INDEX+1 write(66,553)index,((shdist(index,i),icnt(index,i,j), * shellz(index,i,j),j=1,iz(index,i)),i=1,4) 553 format(i3,8(' |',f6.3,i3,f5.1)) enddo enddo write(66,*) C inat=0 do i=1,index ityp(i)=i imult(i)=0 used(i)=.false. enddo write(66,554) 554 format(/,'LISTING of INDEX of all EQUIVALENT ATOMS:') ityp1=0 ij=0 i=0 do 500 i0=1,nat do 500 i00=1,mult(i0) i=i+1 if(used(i)) goto 500 write(66,*) do 501 j=i,index c compare atom with index i with all other atoms do 510 i1=1,ishell(i)-1 if(abs(shdist(i,i1)-shdist(j,i1)).gt.dlimit) goto 501 do 511 i2=1,iz(i,i1) do j2=1,iz(j,i1) if((icnt(i,i1,i2).eq.icnt(j,i1,j2)).and. * (shellz(i,i1,i2).eq.shellz(j,i1,j2))) goto 511 enddo goto 501 511 continue 510 continue write(66,555) i,j 555 format(' ATOM:',i4,' and ATOM:',i4,' are equivalent') if(i.eq.j) then ityp1=ityp1+1 namen(ityp1)=name(i0) JRJN(ityp1)=jrj(i0) R0N(ityp1)=r0(i0) RMTTN(ityp1)=rmtt(i0) zzn(ityp1)=zz(i0) endif ityp(j)=ityp1 if(inat.lt.ityp(j)) inat=ityp(j) imult(ityp1)=imult(ityp1)+1 used(j)=.true. ij=ij+1 posn(1,ij)=pos(1,j) posn(2,ij)=pos(2,j) posn(3,ij)=pos(3,j) 501 continue 500 continue C write(66,*) error=.false. INDEX=0 DO JATOM=1,NAT write(66,556) jatom,mult(jatom),imult(jatom) 556 format(/,' ATOM KIND:',i4,' OLD and NEW MULTIPLICITY: ',2i4) if(mult(jatom).ne.imult(jatom)) then error=.true. write(66,*)'ERROR: MULT not equal. The new multiplicity is', * ' different from the old one' write(6,*)'ERROR: Mult not equal. PLEASE CHECK outputnn-file' end if DO M=1,MULT(JATOM) INDEX=INDEX+1 557 format(5x,'ATOM INDEX:',i4,' OLD and NEW ATOM KIND:',2i4) if(jatom.ne.ityp(index)) then error=.true. write(66,557) index,jatom,ityp(index) write(66,*) 'ERROR: ITYP not equal. The new type is', * ' different from the old one' write(6,*)'ERROR: ityp not equal. PLEASE CHECK outputnn-file' endif enddo enddo C if(.not.error) stop 'NN ENDS' write(66,*) write(66,*) 'NEW LIST of EQUIVALENT POSITIONS written to', & ' case.struct_nn' c.....write new struct file C write(21,1511) LATTIC,inat,title write(21,17) A(1),A(2),A(3),alpha,beta,gamma index=0 do jatom=1,inat INDEX=INDEX+1 write(21,1012) -JATOM,( POSN(J,INDEX),J=1,3 ),iMULT(JATOM),8 write(66,*) write(66,1011) -JATOM,( POSN(J,INDEX),J=1,3 ),NAMEN(JATOM), & zzn(jatom) DO M=1,iMULT(JATOM)-1 INDEX=INDEX+1 write(21,1011) -JATOM,( POSN(J,INDEX),J=1,3) write(66,1011) -JATOM,( POSN(J,INDEX),J=1,3) ENDDO write(21,1050) NAMEN(JATOM),JRJN(JATOM),R0N(JATOM),RMTTN(jatom) & ,zzn(jatom) write(21,1512) 1.0,0.0,0.0 write(21,1512) 0.0,1.0,0.0 write(21,1512) 0.0,0.0,1.0 enddo write(21,*) 0 c STOP 'NN created a new CASE.STRUCT_NN FILE' C 3 FORMAT(' ATOM',I3,2X,A10,'AT',3F8.4, * ' IS',F9.5,' A.U.',f10.5,' ANG') 1011 FORMAT(4X,I4,4X,F10.8,3X,F10.8,3X,F10.8,5x,a10,f5.1) 1012 FORMAT(4X,I4,4X,F10.8,3X,F10.8,3X,F10.8,/,15X,I2,17X,I2) 1020 FORMAT(///,3X,'ERROR IN EBND : MULT(JATOM)=0 ...', * /, 20X,'JATOM',I4,3X,'INDEX',I4,3X,'MULT=',I3) 1050 FORMAT(A10,5X,I5,5X,F10.8,5X,F10.4,5x,f5.1) 1051 FORMAT(20X,3F10.7) 1510 FORMAT(A79) 1511 FORMAT(A4,23X,I3,/,13X,A4) 1512 FORMAT(20x,3f10.7) END xcrysden-1.6.2/F/ftnunit.f0000644000175000017500000000017411712736221014102 0ustar tonetone program ftnunit c used by XCrySDen to find out what is the name of frtran unit write(99,*) 'test' end xcrysden-1.6.2/F/multhexa.f0000644000175000017500000002550611712736221014250 0ustar tonetone SUBROUTINE MULTHEXA(TTC,IGROUP,NATOM) C TTC...DATA FOR HTTC OR RTTC IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' c ********************************************************************** c in order to allow compiling on non-g77 compilers; replace NATOM arrays c with INATOM parameter c ********************************************************************** REAL*8 TTC(3,13),TOL,XC(INATOM),YC(INATOM),ZC(INATOM), * AAB(2),BAB(2),X(NAC),Y(NAC),Z(NAC),DVEC(3,3),A(3) INTEGER ITTC(13,6),NTTC(6),CONTYP(13),FLAG(INATOM),NAT(NAC) LOGICAL EQUAL,ISINSIDE,TTCBOX,LPRINT REAL*8 AC(3,2),BC(3,2),CC(3,2),FC(3,4),IC(3,2),RC(3,3),HC(3,3), 1 DVC(3,3),IDVC(3,3) COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR COMMON/DIR/ NXDIR,NYDIR,NZDIR COMMON/APOS/ AC,BC,CC,FC,IC,HC,RC,DVC PARAMETER (TOL=1.0d-8) c print *,'MULTHEXA' C THERE IS FIVE ARBITRARY DIFFERENT PIECES OF HTTC/RTTC C FROM THIS FIVE PIECES IT'S POSSIBLE TO PUT TOGETHER THE CRYSTAL C PIECE #1: 4,5,6th --> end; end is last point (point 13) C PIECE #2: 3,4,5,6th --> end C PIECE #3: 1--> end C PIECE #4: 1,5,6 --> end C PIECE #5: 5,6 --> end C there is also 6th piece, whose purpose is filling the crystal so, C that when cutting on out borders, it will be cut-out nicely C PIECE #6: 7 --> end C NTTC...TELLS HOW MANY ATOMS IS IN EVERY PIECE DATA NTTC/10,11,13,10,9,7/ DATA ITTC/ 1 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 0, 0, 2 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 0, 3 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 4 1, 5, 6, 7, 8, 9,10,11,12,13, 0, 0, 0, 5 5, 6, 7, 8, 9,10,11,12,13, 0, 0, 0, 0, 6 7, 8, 9,10,11,12,13, 0, 0, 0, 0, 0, 0/ C THIS IS FOR CELL-FRAMES BASED CONNECTIVITY C CONNECTIVITY TYPES: C 0...NO CONNECTIVITY C 1...OUTER CONNECTIVITY C 2...INNER CONNECTIVITY C 3...O/I CONNECTIVITY C TO EACH POSITION WE ASSIGN CORRESPONDING FLAG c DATA CONTYP/3,1,3,1,3,1,2,0,0,0,0,0,0/ c Tue Apr 8 14:32:28 METDST 1997;; changed to DATA CONTYP/1,3,1,3,1,3,2,0,0,0,0,0,0/ C THIS IS FOR PROPAGATION DIRECTION OF CRYSTAL GROWTH C IF PROPAGATION IS IN A,B PLANE THEN PROPAGATION DIRECTIONS ARE: C A+(A+B)->AAB & B+(A+B)->BAB DATA AAB/2.0d0,1.0d0/ DATA BAB/1.0d0,2.0d0/ CALL TTCBOXES(TTC) c idv will be used for calculating fractional coorinates call InvertSqMat123(dvec, idvc, 3) C ************************************************ C ****** ATOMS SECTION ****** C ************************************************ C WRITE "ATOMS" TO FILE2, TO MARK THE BEGINNING OF "ATOMS" SECTION WRITE(12,*) 'ATOMS' C IF NXDIR=0 OR NYDIR=0 -> CALL MULTATOM IF((NXDIR.EQ.0.OR.NYDIR.EQ.0).AND.IGROUP.EQ.7) * CALL MULTATOM(RC,3,IGROUP,NATOM,.false.,3,1) IF((NXDIR.EQ.0.OR.NYDIR.EQ.0).AND.IGROUP.EQ.8) * CALL MULTATOM(HC,3,IGROUP,NATOM,.false.,3,1) DNX=DBLE(NXDIR) DNY=DBLE(NYDIR) DNZ=DBLE(NZDIR) c print *,'MULTHEXA' N=0 DO I=0,NXDIR+1 DO J=0,NYDIR+1 DO K=0,NZDIR C DETERMINE WHICH PIECE TO ADD IF(I.EQ.0.OR.I.GT.NXDIR.OR. 1 J.EQ.0.OR.J.GT.NYDIR)THEN IPIECE=6 ELSEIF(I.EQ.NXDIR.AND.J.EQ.NYDIR)THEN IPIECE=3 ELSEIF(I.EQ.1.AND.J.LT.NYDIR)THEN IPIECE=1 ELSEIF(I.EQ.NXDIR.AND.J.LT.NYDIR)THEN IPIECE=4 ELSEIF(I.LT.NXDIR.AND.J.EQ.NYDIR)THEN IPIECE=2 ELSE IPIECE=5 ENDIF c print *,'ipiece=',ipiece C CALCULATE THE ORIGIN OF THE PIECE TO BE ADDED DI=DBLE(I-1) DJ=DBLE(J-1) DK=DBLE(K) c print *,'di,dj,dk',di,dj,dk AORIG=AAB(1)*DI+BAB(1)*DJ BORIG=AAB(2)*DI+BAB(2)*DJ CORIG=DK DO II=1,NTTC(IPIECE) ACMP=AORIG+TTC(1,ITTC(II,IPIECE)) BCMP=BORIG+TTC(2,ITTC(II,IPIECE)) CCMP=CORIG+TTC(3,ITTC(II,IPIECE)) C CHECK IF "CCMP" IS "OUT OF RANGE"; THAT IS, WE WANT THAT C OUR CRYSTAL IS CUT OUT NICELY ON THE OUT-BORDERS C IF "OUT OF RANGE" --> DELETE POINT XPOS=ACMP*DVEC(1,1)+BCMP*DVEC(2,1)+CCMP*DVEC(3,1) YPOS=ACMP*DVEC(1,2)+BCMP*DVEC(2,2)+CCMP*DVEC(3,2) ZPOS=ACMP*DVEC(1,3)+BCMP*DVEC(2,3)+CCMP*DVEC(3,3) C *** *** FRAMES *** *** if((i.gt.0.and.i.le.nxdir).and. 1 (j.gt.0.and.j.le.nydir))then N=N+1 XC(N)=XPOS YC(N)=YPOS ZC(N)=ZPOS C FOURTH COORDINATE IS FOR CONNECTIVITY FLAG(N)=CONTYP(ITTC(II,IPIECE)) endif DO JJ=1,NATR lprint=.true. c ***************************************************** c COORDINATES must be within [-1,1], check that !!! c ***************************************************** rx=x(jj)*idvc(1,1)+y(jj)*idvc(2,1)+z(jj)*idvc(3,1) ry=x(jj)*idvc(1,2)+y(jj)*idvc(2,2)+z(jj)*idvc(3,2) rz=x(jj)*idvc(1,3)+y(jj)*idvc(2,3)+z(jj)*idvc(3,3) A(1)=ACMP - AORIG + RX A(2)=BCMP - BORIG + RY A(3)=CCMP - CORIG + RZ do ia=1,3 if ( a(ia) .gt. 1.0d0 ) then a(ia) = a(ia) - 1.0d0 else if ( a(ia) .lt. -1.0d0 ) then a(ia) = a(ia) + 1.0d0 endif enddo a(1)=a(1) + AORIG a(2)=a(2) + BORIG a(3)=a(3) + CORIG XX=a(1)*DVEC(1,1)+a(2)*DVEC(2,1)+a(3)*DVEC(3,1) YY=a(1)*DVEC(1,2)+a(2)*DVEC(2,2)+a(3)*DVEC(3,2) ZZ=a(1)*DVEC(1,3)+a(2)*DVEC(2,3)+a(3)*DVEC(3,3) c print *,'NEW ATOM' C *********************************************************************** C WE WANT THAT CRYSTAL IS CUT OUT NICELY ON THE OUT-BORDER C IF .not. "OUT OF RANGE" -> GO C *** *** AB planes *** *** if(k.eq.0.or.k.eq.nzdir)then C *** lower AB plane *** if(.not.isinside(dvec,1,2,3, 1 0.0d0,0.0d0,0.0d0,xx,yy,zz)) * lprint=.false. C *** upper AB plane *** if(.not.isinside(dvec,1,2,-3, 1 dnz*dvec(3,1), 2 dnz*dvec(3,2), 3 dnz*dvec(3,3),xx,yy,zz)) lprint=.false. endif if(i.eq.0) dii=di+1.0d0 if(i.gt.0.and.i.le.nxdir) dii=di if(j.eq.0) djj=dj+1.0d0 if(j.gt.0.and.j.le.nydir) djj=dj if(i.gt.nxdir) DI=DI-1.0d0 if(j.gt.nydir) DJ=DJ-1.0d0 AORIG2=AAB(1)*DII+BAB(1)*DJJ BORIG2=AAB(2)*DII+BAB(2)*DJJ p1=aorig2*dvec(1,1)+borig2*dvec(2,1) p2=aorig2*dvec(1,2)+borig2*dvec(2,2) p3=aorig2*dvec(1,3)+borig2*dvec(2,3) C *** AC & BC PLANES *** if(i.le.1.and.j.le.1)then c print *,'BOX1' if(.not.ttcbox(1,p1,p2,p3,xx,yy,zz,dvec)) 1 lprint=.false. endif if((i.gt.1.and.i.lt.nxdir).and.j.le.1)then c print *,'BOX2' if(.not.ttcbox(2,p1,p2,p3,xx,yy,zz,dvec)) 1 lprint=.false. endif if(i.ge.nxdir.and.j.le.1)then c print *,'BOX3' if(.not.ttcbox(3,p1,p2,p3,xx,yy,zz,dvec)) 1 lprint=.false. endif if(i.ge.nxdir.and.(j.gt.1.and.j.lt.nydir))then c print *,'BOX4' if(.not.ttcbox(4,p1,p2,p3,xx,yy,zz,dvec)) 1 lprint=.false. endif if(i.ge.nxdir.and.j.ge.nydir)then c print *,'BOX5>',p1,p2,p3,'i,j=',i,j if(.not.ttcbox(5,p1,p2,p3,xx,yy,zz,dvec)) 1 lprint=.false. endif if((i.gt.1.and.i.lt.nxdir).and.j.ge.nydir)then c print *,'BOX6' if(.not.ttcbox(6,p1,p2,p3,xx,yy,zz,dvec)) 1 lprint=.false. endif if(i.le.1.and.j.ge.nydir)then c print *,'BOX7' if(.not.ttcbox(7,p1,p2,p3,xx,yy,zz,dvec)) 1 lprint=.false. endif if(i.le.1.and.(j.gt.1.and.j.lt.nydir))then c print *,'BOX8' if(.not.ttcbox(8,p1,p2,p3,xx,yy,zz,dvec)) 1 lprint=.false. endif C *** if (lprint) then print coor IF(LPRINT)THEN C **** ** write coor ** **** WRITE(12,21) NAT(JJ),XX,YY,ZZ 21 FORMAT(I5,3F16.10) ENDIF ENDDO ENDDO !DO II=1,NTTC(IPIECE) ENDDO !K= ENDDO !J= ENDDO !I= C ********************************************************* C ******** FRAMES --- FRAMES --- FRAMES ********** C ********************************************************* IF (N.GT.0) WRITE(12,*) 'FRAMES' ADIS=VECSIZE3(DVEC,1) CDIS=VECSIZE3(DVEC,3) DO I=1,N-1 DO J=I+1,N DIS=DIST(XC(I),YC(I),ZC(I),XC(J),YC(J),ZC(J)) write(20,*) dis, adis, cdis IF(EQUAL(DIS,ADIS)) THEN write(21,*) dis,adis IF( (FLAG(I).EQ.1.AND.FLAG(J).EQ.3) .OR. * (FLAG(I).EQ.3.AND.FLAG(J).EQ.1) ) * WRITE(12,23) '1',XC(I),YC(I),ZC(I),XC(J),YC(J),ZC(J) IF( (FLAG(I).EQ.1.AND.FLAG(J).EQ.2) .OR. * (FLAG(I).EQ.2.AND.FLAG(J).EQ.1) ) * WRITE(12,23) '2',XC(I),YC(I),ZC(I),XC(J),YC(J),ZC(J) ELSEIF(EQUAL(DIS,CDIS)) THEN write(21,*) dis,cdis IF( (FLAG(I).EQ.1.AND.FLAG(J).EQ.1) .OR. * (FLAG(I).EQ.3.AND.FLAG(J).EQ.3) ) * WRITE(12,23) '1',XC(I),YC(I),ZC(I),XC(J),YC(J),ZC(J) ENDIF ENDDO ENDDO 23 FORMAT(A1,2X,3F16.10,2X,3F16.10) RETURN END xcrysden-1.6.2/F/writeftn34.f0000644000175000017500000000216711712736221014430 0ustar tonetone subroutine WriteFTN34( $ title, ! tittle (arbitrary) $ idim, ! dimensionality of the system $ igroup, ! group of the system $ vec, ! primitive vectors $ nsymm, ! n of symmetry operations $ symmop, ! symmetry operators matrices $ symmtr, ! translation of symmop $ natr, ! number of atoms in primitive unit cell $ nat, x, y, z) ! atomic number & cartesian coordinates IMPLICIT REAL*8 (A-H,O-Z) REAL*8 vec(3,3), symmop(nsymm,3,3), symmtr(nsymm,3), $ x(natr), y(natr), z(natr) INTEGER nat(natr) CHARACTER*80 title Write(34, '(A)') title Write(34, *) idim, igroup do i=1,3 Write(34,*) (vec(i,j), j=1,3) enddo Write(34,*) nsymm do i=1,nsymm do j=1,3 Write(34,*) (symmop(i,j,k), k=1,3) enddo Write(34,*) (symmtr(i,j), j=1,3) enddo Write(34,*) natr do i=1,natr Write(34,*) nat(i), x(i), y(i), z(i) enddo Write(34,'(A)') 'END' END xcrysden-1.6.2/F/convexhull.f0000644000175000017500000002204612704150325014601 0ustar tonetone SUBROUTINE ConvexHull( * index, !index of plane/polygon * iverplane, !data of vertex collection for index's plane * nvrt, !number of vertices in index's plane * allvertex) !all vertex coordinates IMPLICIT NONE include 'voronoi.inc' INTEGER index INTEGER iverplane(MAX_PL_VER,MAX_POLY) INTEGER nvrt REAL*8 allvertex(3,MAX_VERT) REAL*8 * vertex(3,MAX_PL_VER), !vertex of polygon * vec1(3),vec2(3),nml(3), !nml == normal of plane/polygon * normal(4), !normal of polygon * x(3),y(3),z(3) !arbitrarily esed INTEGER iorder(MAX_NORD) !order of sorted vertices LOGICAL lfirst,notend REAL*8 cosyfi, sinyfi, coszfi, sinzfi, minfi, fi, yfi, zfi, $ ver1, xnml1, PolarAngle, sign INTEGER i, j, iTmp, iYmax, iYmin, nord c We have plane in 3D; it maybe parallel to Y axis or near parallel and c that is something that we not want, we will rotate the plane such that c it will be parallel to XY plane, and than we will get the order of c vertices. If we have the order of vertices, we are able do draw a convex c poligon. c take three points, and calculate normal of plane do i=1,3 vec1(i) = allvertex(i,iverplane(3,index)) - * allvertex(i,iverplane(1,index)) vec2(i) = allvertex(i,iverplane(2,index)) - * allvertex(i,iverplane(1,index)) enddo CALL VecProduct(vec1,vec2,nml) c --- --- DEBUG_BEGIN --- --- c PRINT *,'VEC1:: ',(vec1(i),i=1,3) c PRINT *,'VEC2:: ',(vec2(i),i=1,3) c PRINT *,'NML :: ',(nml(i), i=1,3) c PRINT *,'nmlsize = ',VecSize(nml) c do i=1,nvrt c PRINT *,iverplane(i,index),'; ', c * (allvertex(j,iverplane(i,index)),j=1,3) c enddo c --- --- DEBUG_END --- --- c maybe nml is already Z-oriented if(abs(nml(1)).lt.MAXERR2 .and. abs(nml(2)).lt.MAXERR2) then do i=1,nvrt vertex(1,i) = allvertex(1,iverplane(i,index)) vertex(2,i) = allvertex(2,iverplane(i,index)) vertex(3,i) = allvertex(3,iverplane(i,index)) enddo goto 99 endif c first rotate around Z axis zfi = dacos(nml(1) / dsqrt(nml(1)*nml(1) + nml(2)*nml(2))) if(nml(2).gt.0.0d0) zfi=-zfi coszfi=dcos(zfi) sinzfi=dsin(zfi) xnml1 = nml(1)*coszfi - nml(2)*sinzfi nml(2) = nml(1)*sinzfi + nml(2)*coszfi nml(1) = xnml1 !this must be so c now rotate around Y-axis yfi = dacos(nml(3) / dsqrt(nml(1)*nml(1) + nml(2)*nml(2) + * nml(3)*nml(3))) if(nml(1).gt.0.0d0) yfi=-yfi cosyfi=dcos(yfi) sinyfi=dsin(yfi) c --- --- DEBUG_BEGIN --- --- nml(1) = xnml1*cosyfi + nml(3)*sinyfi nml(3) = -xnml1*sinyfi + nml(3)*sinyfi c PRINT *,'zfi =',zfi, '; yfi =',yfi c PRINT *,'cos(zfi)=',coszfi,'; cos(yfi)=',cosyfi c PRINT *,'sin(zfi)=',sinzfi,'; sin(yfi)=',sinyfi c PRINT *,'nml>', nml(1),nml(2),nml(3) if(abs(nml(1)).gt.1.d-5 .or. abs(nml(2)).gt.1.d-5) * WRITE(*,*)'ALGORITHM ERROR: nml:',(nml(i),i=1,3) c --- --- DEBUG_END --- --- do i=1,nvrt c ---Z axis rotation--- ver1 = allvertex(1,iverplane(i,index))*coszfi - * allvertex(2,iverplane(i,index))*sinzfi vertex(2,i) = allvertex(1,iverplane(i,index))*sinzfi + * allvertex(2,iverplane(i,index))*coszfi vertex(3,i) = allvertex(3,iverplane(i,index)) c ---Y axis rotation--- vertex(1,i) = ver1*cosyfi + vertex(3,i)*sinyfi vertex(3,i) = -ver1*sinyfi + vertex(3,i)*cosyfi enddo 99 continue c --- --- DEBUG_BEGIN --- --- c do i=1,nvrt c PRINT *,'rotated-vertex(',nvrt,') = ',(vertex(j,i),j=1,3) c enddo c --- --- DEBUG_END --- --- c this is Jarvis's march algorithm for Covex Hull c ----------------------------------------------- c first we find two points; Ymin & Ymax points c I think that colinear points are omitted, because of our c previous construction iYmin = 1 iYmax = 1 do i=2,nvrt if(vertex(2,i) .lt. vertex(2,iYmin)) * iYmin = i if(vertex(2,i) .gt. vertex(2,iYmax)) * iYmax = i enddo c --- --- DEBUG_BEGIN --- --- c PRINT *,'iYmin=',iYmin,'; iYmax=',iYmax c --- --- DEBUG_END --- --- nord=1 iorder(1)=iYmin lfirst=.true. notend=.true. sign=1.0d0 do while (notend .and. nord.lt.MAX_NORD) do 100 i=1,nvrt c --- --- DEBUG_BEGIN --- --- c PRINT *,'JARVIS MARCH: i=',i,'; iYmin=',iYmin c PRINT *,' nord=',nord, c * '; iorder(nord)=',iorder(nord) c --- --- DEBUG_END --- --- if(i.eq.iorder(nord)) goto 100 if(lfirst) then c print *,'DEBUG> i-vertex :',i,'::', c $ (vertex(ipol,i),ipol=1,3) c print *,'DEBUG> iorder(nord)-vertex:',iorder(nord),'::', c $ (vertex(ipol,iorder(nord)),ipol=1,3) minfi=PolarAngle(i,iorder(nord),vertex,sign) iTmp=i lfirst=.false. c endif else fi=PolarAngle(i,iorder(nord),vertex,sign) c print *,'DEBUG> i,iorder(nord)::',i,iorder(nord), c $ '; fi=',fi, minfi if(fi.lt.minfi) then minfi=fi iTmp=i endif endif 100 continue c PRINT *,'after 100; iTmp=',iTmp,' iYmin=',iYmin if(iTmp.eq.iYmin)then notend=.false. goto 101 endif lfirst=.true. nord=nord+1 c print *, 'iorder(',nord,')=',iTmp iorder(nord)=iTmp if(iTmp.eq.iYmax) sign=-1.0d0 101 continue enddo if (nord.ge.MAX_NORD)then write(*,*) 'ALGORITHM ERROR: nord became too large' endif 102 continue c ================================================================== c the sign of normal is determined by requiring that the origin c is inside the convex polygon do i=1,3 x(i) = allvertex(1,iverplane(iorder(i),index)) y(i) = allvertex(2,iverplane(iorder(i),index)) z(i) = allvertex(3,iverplane(iorder(i),index)) enddo normal(1) = (y(1)-y(2))*z(3) + (y(3)-y(1))*z(2) + (y(2)-y(3))*z(1) normal(2) = (x(2)-x(1))*z(3) + (x(1)-x(3))*z(2) + (x(3)-x(2))*z(1) normal(3) = (x(1)-x(2))*y(3) + (x(3)-x(1))*y(2) + (x(2)-x(3))*y(1) normal(4) = * x(1)*(y(2)*z(3)-y(3)*z(2)) + * y(1)*(x(3)*z(2)-x(2)*z(3)) + * z(1)*(x(2)*y(3)-x(3)*y(2)) call normalize_vec(3,normal) write(12,*) nvrt if (normal(4).lt.0d0) then do i=nvrt,1,-1 write(12,'(2(3e15.7,1x))') $ (allvertex(j,iverplane(iorder(i),index)),j=1,3), * (normal(j),j=1,3) enddo else normal(1) = -normal(1) normal(2) = -normal(2) normal(3) = -normal(3) do i=1,nvrt write(12,'(2(3e15.7,1x))') $ (allvertex(j,iverplane(iorder(i),index)),j=1,3), * (normal(j),j=1,3) enddo endif c WRITE(13,*) normal(4) c CALL VecProduct(vec1,vec2,normal) c =================================================================== RETURN END c ========================================================= REAL*8 FUNCTION PolarAngle(index, iref, vertex, sign) c ========================================================= c fn. calculate polar angle between points index & iref c PI2 == 2*PI IMPLICIT NONE include 'voronoi.inc' REAL*8 vertex(3,*) c ,MAXERR c PARAMETER( c * MAXERR = 1.0d-10) REAL*8 v(3) REAL*8 vsize, sign, PI2 PARAMETER (PI2=6.28318530717958647688d0) INTEGER index, iref, i c print *, 'Polar-angle: index,iref:', index, iref do i=1,3 v(i)=vertex(i,index)-vertex(i,iref) c PRINT *,' VERTEX-index:: ', vertex(i,index), c $ '; VERTEX-iref:: ', vertex(i,iref) enddo c vsize shouldn't be ZERO vsize=dsqrt(v(1)*v(1) + v(2)*v(2) + v(3)*v(3)) c --- --- DEBUG_BEGIN --- --- c PRINT *,'vsize=',vsize,'; sign*v(1)/vsize=', sign*v(1)/vsize if(abs(vsize).lt.MAXERR)then PRINT *,'DEBUG> distance between two points lower than MAXERR' PRINT *,' index = ', index, '; iref = ', iref PRINT *,' distance = ', abs(vsize) STOP endif c --- --- DEBUG_END --- --- PolarAngle = DACOS(sign*v(1)/vsize) c print *, 'Polar-angle.1=',PolarAngle ! if(sign*v(2).lt.0.0d0 .and. abs(v(2)/vsize).gt.HALF001_DEG) if(sign*v(2).lt.0.0d0 .and. abs(v(2)/vsize).gt.MAXERR) * PolarAngle=PI2 - PolarAngle c print *, 'Polar-angle.2=',PolarAngle RETURN END xcrysden-1.6.2/F/mode.inc0000644000175000017500000000232311712736221013661 0ustar tonetonec parameters for order of arguments c IARG_IGRP: c 1 ..... TRIGONAL systems c 2 ..... HEXAGONAL systems PARAMETER ( * IARG_MODE1 =1, * IARG_MODE2 =2, * IARG_MODE3 =3, * IARG_IGRP =4, !IGROUP for TRIGONAL/HEXAGONAL systems * IARG_NXDIR =5, * IARG_NYDIR =6, * IARG_NZDIR =7, * IARG_OUTPUT=8, * IARG_INPUT =9 ) c M1 ....... mode1 c M2 ....... mode2 PARAMETER ( * M1_INFO=0, !INFO mode * M1_PRIM=1, !PRIMITIV CELL; in case of H/R PARAPIPEDAL SHAPE * M1_CONV=2, !CONVENTIONAL CELL; in case of H/R it is PARAPIPEDAL SHAPE * M1_HEXA_SHAPE=3,!CONV CELL for H/R; HEXAGONAL SHAPE * M1_PRIM3=4, !PRIMITIV cell for H/R; HEXAGONAL SHAPE * M2_CELL=1, !CELL is unit of repetition * M2_TR_ASYM_UNIT=2) !BASIS (traslational asymmetric part) is unit of repetition C example: IMODE3 = 13 --> M3 = 1, M4 = 3 PARAMETER ( * M3_ANGS=1, !input is given in angs. * M3_BOHR=2, !input is given in bohrs * M4_CR95=1, !CRYSTAL version is CRYSTAL95 * M4_CR98=2) !CRYSTAL version is CRYSTAL98 xcrysden-1.6.2/F/fracCoor.f0000644000175000017500000000361211712736221014151 0ustar tonetonec ------------------------------ program fracCoor c Usage: fracCoor XSF-file x y z c ------------------------------ implicit real*8 (a-h, o-z) include 'param.inc' CHARACTER filen*120, ax*32, ay*32, az*32 REAL*8 xx(3), x(NAC), y(NAC), z(NAC), dvec(3,3), rvec(3,3), v(3) INTEGER nat(NAC) COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR narg=iargc() if ( narg .ne. 4 ) then print *,'Usage: fracCoor XSF-file x y z' STOP endif call getarg(1,filen) open(unit=11, file=filen, status='old') call getarg(2,ax) call getarg(3,ay) call getarg(4,az) read(ax,*) xx(1) read(ay,*) xx(2) read(az,*) xx(3) call readf1('DIM-GROUP', igroup, idim) call readf1('PRIMVEC', idum1, idim) if (idim .eq. 0) then write(6,'(3f15.8,2x)') xx(1), xx(2), xx(3) goto 999 else call InvertSqMat123(dvec, rvec, idim) c print *,dvec c print *,rvec if (idim .eq. 1) then write(6,'(3f15.8,2x)') xx(1)*rvec(1,1), xx(2), xx(3) else if (idim .eq. 2) then a = rvec(1,1)*xx(1) + rvec(2,1)*xx(2) b = rvec(1,2)*xx(1) + rvec(2,2)*xx(2) write(6,'(3f15.8,2x)') a, b, xx(3) else if (idim .eq. 3) then a = rvec(1,1)*xx(1) + rvec(2,1)*xx(2) + rvec(3,1)*xx(3) b = rvec(1,2)*xx(1) + rvec(2,2)*xx(2) + rvec(3,2)*xx(3) c = rvec(1,3)*xx(1) + rvec(2,3)*xx(2) + rvec(3,3)*xx(3) write(6,'(3f15.8,2x)') a, b, c endif endif 999 continue END c subroutine ZeroVec(v,ind) c REAL*8 v(3,3) c do i=1,3 c v(ind,i)=0.0d0 c enddo c return c END c c subroutine UnitVec(v,ind) c REAL*8 v(3,3) c do i=1,3 c v(ind,i)=0.0d0 c enddo c v(ind,ind)=1.0d0 c return c END xcrysden-1.6.2/F/SRC_spaghetti/0000755000175000017500000000000013556022211014734 5ustar tonetonexcrysden-1.6.2/F/SRC_spaghetti/param.inc0000644000175000017500000000024611712736221016536 0ustar tonetone INTEGER NEVL, NKP, NATO c go over all reasonable limits !!!! PARAMETER (NEVL = 3000) PARAMETER (NKP = 10000) PARAMETER (NATO = 500) xcrysden-1.6.2/F/SRC_spaghetti/Makefile0000644000175000017500000000012313556022211016370 0ustar tonetoneinclude ../../Make.sys OBJ = get_ei.o get_k.o default: $(OBJ) clean: -rm *.o xcrysden-1.6.2/F/SRC_spaghetti/get_ei.f0000644000175000017500000000211413032733501016335 0ustar tonetone subroutine get_ei (aline,ener,ne) c *************************************************** c IMPLICIT REAL*8 (A-H,O-Z) cc INCLUDE 'param.inc' c dimension ener(*) character aline*80 character ram_fi*80 c----------------------------------------------------------------------- c c.....COPY THE LINE TO AN INTERNAL FILE write(ram_fi,'(a80)') aline c c.....READ THE EIGENVALUES read(ram_fi,'(2x,5f13.7)') (ener(j), j=ne+1,ne+5) if (ener(ne+1).eq. 0.000000) then return elseif (ener(ne+2).eq. 0.000000) then c 1 eigenvalue has been read ne=ne+1 return elseif (ener(ne+3).eq. 0.000000) then c 2 eigenvalue have been read ne=ne+2 return elseif (ener(ne+4).eq. 0.000000) then c 3 eigenvalue have been read ne=ne+3 return elseif (ener(ne+5).eq. 0.000000) then c 4 eigenvalue have been read ne=ne+4 return else c 5 eigenvalues have been read ne=ne+5 return endif end xcrysden-1.6.2/F/SRC_spaghetti/get_k.f0000644000175000017500000000072311712736221016203 0ustar tonetone subroutine get_k (aline,vkx,vky,vkz,kname) c ****************************************** c IMPLICIT REAL*8 (A-H,O-Z) character aline*80,kname*12 character ram_file*80 c----------------------------------------------------------------------- c c.....COPY THE LINE TO AN INTERNAL FILE write(ram_file,'(a80)') aline c c.....READ THE K-POINT COORDINATES read(ram_file,'(7x,3f10.5,3x,a12)') vkx,vky,vkz,kname return end xcrysden-1.6.2/F/savestruct.f0000644000175000017500000001764211712736221014626 0ustar tonetone program SaveSFile c ********************************************************************** c program CONVERT XSF format to WIEN STRUCT FILE format c ********************************************************************** IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' INTEGER NAT(NAC) INTEGER C2I REAL*8 X(NAC),Y(NAC),Z(NAC),DVEC(3,3),IDVEC(3,3),TMPVEC(3,3) REAL*8 iRdvec(3,3) REAL*8 A(NAC),B(NAC),C(NAC) REAL*8 SYMMOP(1,3,3), SYMMTR(1,3) CHARACTER*80 FILE1, TITLE, MODE CHARACTER*4 GTYPE LOGICAL l_inv_center, l_inv COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR COMMON/IVEC/ IDVEC COMMON/BOHRR/ BOHR,IMODE3 !this is not used, but is needed because !this program uses readf1 routine PARAMETER (RAD2DEG = 57.295779513084, TOLMIN=1.d-7) DATA SYMMOP/ $ 1.0d0, 0.0d0, 0.0d0, $ 0.0d0, 1.0d0, 0.0d0, $ 0.0d0, 0.0d0, 1.0d0/ DATA SYMMTR/ $ 0.0d0, 0.0d0, 0.0d0/ narg=IArgc() if (narg.ne.1) then stop 'Usage: savestruct file1' endif Call GetArg(1,FILE1) Open(unit=11,file=file1,status='old') Call ReadF1('DIM-GROUP', igroup, idim) if (idim.ne.3) stop 'SaveStruct:: so far I am converting to $ WIEN97 STRUCT FILE just from crystals (dim=3) !!!' if (igroup .eq. 1) GTYPE='P ' if (igroup .eq. 2) GTYPE='CYZ ' ! A type if (igroup .eq. 3) GTYPE='CXZ ' ! B type if (igroup .eq. 4) GTYPE='CXY ' ! C type if (igroup .eq. 5) GTYPE='F ' if (igroup .eq. 6) GTYPE='B ' if (igroup .eq. 7) GTYPE='R ' if (igroup .eq. 8) GTYPE='H ' if (igroup .eq. 9) GTYPE='H ' if (igroup .gt. 10) GTYPE='P ' !just in case c this should works for H,P; but for F, B, C R, CONVVEC/PRIMCOORD c should probably be used !!!!!!!!!!!!!1 Call ReadF1('PRIMVEC', 0, idim) !dvec & idvec are assigned Call ReadF1('PRIMCOORD', 0, idim) c get the inverse matrix call Invert3x3(dvec,iRdvec) if ((igroup .gt. 1) .and. (igroup .lt. 8)) then Call ReadF1('CONVVEC', 0, idim) !dvec & idvec are assigned if (igroup .eq. 7) then c for rhombohedral hexagonal vectors and rhobohedral coordinates c must be specified do i=1,3 do j=1,3 idvec(j,i)=iRdvec(j,i) enddo enddo endif endif Close(11) Call SaveStructFile(gtype, dvec, idvec, natr, nat, x, y, z) END subroutine SaveStructFile(gtype, dvec, idvec, natr, nat, x, y, z) IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' INTEGER NAT(NAC), INN(NAC) INTEGER MAXNAT ! maximum atomic number in structure INTEGER NPT, ISPLIT ! used for Wien97 REAL*8 X(NAC),Y(NAC),Z(NAC),DVEC(3,3),IDVEC(3,3),TMPVEC(3,3) REAL*8 A(NAC),B(NAC),C(NAC), MIN_NNDIST(NAC), RMT(NAC), R0(NAC) REAL*8 SYMMOP(1,3,3), SYMMTR(1,3) REAL*8 V1(3), V2(3), V3(3) CHARACTER*10 ATOM(100), ATOM_UPPER(100) CHARACTER*4 gtype REAL*8 FRMT(NAC) PARAMETER (RAD2DEG = 57.295779513084, TOLMIN=1.d-7) include 'atoms.inc' C CONVERSION FROM BOHRS TO ANGS. BOHR=0.529177d0 c **************************************************************** c now get the fractional coordinates of atoms and c translate them if necessary ( in WIEN97 fractional coorinates c are in range [0,1) ) maxnat = 1 do i=1,natr nat(i) = nat(i) - int( nat(i) / 100 ) * 100 ! nat from 0 to 99 if(nat(i).gt.maxnat) maxnat = nat(i) a(i) = x(i)*idvec(1,1) + y(i)*idvec(2,1) + z(i)*idvec(3,1) b(i) = x(i)*idvec(1,2) + y(i)*idvec(2,2) + z(i)*idvec(3,2) c(i) = x(i)*idvec(1,3) + y(i)*idvec(2,3) + z(i)*idvec(3,3) if(a(i).lt.0.0d0) a(i) = a(i) + 1.0d0 if(b(i).lt.0.0d0) b(i) = b(i) + 1.0d0 if(c(i).lt.0.0d0) c(i) = c(i) + 1.0d0 c Write(6,21) nat(i), a(i), b(i), c(i) enddo c get the nearest neighbor distances do i=1,natr min_nndist(i) = Dist(dvec(1,1), dvec(1,2), dvec(1,3), $ dvec(2,1), dvec(2,2), dvec(2,3)) !this always greater then nndist do j=1,natr if (i.ne.j) then a2 = a(j) + nint(a(i)-a(j)) b2 = b(j) + nint(b(i)-b(j)) c2 = c(j) + nint(c(i)-c(j)) x1 = a(i)*dvec(1,1) + b(i)*dvec(2,1) + c(i)*dvec(3,1) y1 = a(i)*dvec(1,2) + b(i)*dvec(2,2) + c(i)*dvec(3,2) z1 = a(i)*dvec(1,3) + b(i)*dvec(2,3) + c(i)*dvec(3,3) x2 = a2*dvec(1,1) + b2*dvec(2,1) + c2*dvec(3,1) y2 = a2*dvec(1,2) + b2*dvec(2,2) + c2*dvec(3,2) z2 = a2*dvec(1,3) + b2*dvec(2,3) + c2*dvec(3,3) d = Dist(x1,y1,z1, x2,y2,z2) if (d.lt.min_nndist(i)) then min_nndist(i) = d inn(i) = j endif endif enddo enddo c ************************* c get a,b,c,alpha,beta,gamma ap = VecSize3(dvec,1) / BOHR bp = VecSize3(dvec,2) / BOHR cp = VecSize3(dvec,3) / BOHR do i=1,3 v1(i) = dvec(1,i) v2(i) = dvec(2,i) v3(i) = dvec(3,i) enddo alpha = dacos( ScalarProduct(v2, v3) / $ (VecSize(v2) * VecSize(v3)) ) * RAD2DEG beta = dacos( ScalarProduct(v3,v1) / $ (VecSize(v3) * VecSize(v1)) ) * RAD2DEG gamma = dacos( ScalarProduct(v1,v2) / $ (VecSize(v1) * VecSize(v2)) ) * RAD2DEG c ******************************************* c get some aproximation for muffin tin radius c ******************************************* c let the smallest offset between RMT spheres be 0.1 a.u. OFFSET = 0.1d0/2.d0 ! each sphre gets half of offset do i=1,natr if (nat(i).eq.1) frmt(i) = 0.50d0 if (nat(i).gt.1 .and. nat(i).lt.21) frmt(i) = 1.00d0 if (nat(i).ge.21 .and. nat(i).lt.39) frmt(i) = 1.10d0 if (nat(i).ge.39 .and. nat(i).lt.57) frmt(i) = 1.15d0 if (nat(i).ge.57) frmt(i) = 1.20d0 r0(i) = 0.000005d0 if (nat(i).le.71) r0(i) = 0.00001d0 if (nat(i).le.36) r0(i) = 0.00005d0 if (nat(i).le.18) r0(i) = 0.0001d0 enddo do i=1,natr rmt(i) = frmt(i) * min_nndist(i) / $ ( BOHR * (frmt(i) + frmt(inn(i))) ) - OFFSET enddo isplit = 8 npt = 781 c **************************** c now write WIEN97 struct file c **************************** write(*,'(a)') $ 'Wien97 struct file generated by XCrySDen program' write(*,'(a4,a23,i3)') gtype, 'LATTICE.NONEQUIV. ATOMS',natr if (maxnat.lt.40) then write(*,'(a13,a4)') 'MODE OF CALC=', 'NREL' else write(*,'(a13,a4)') 'MODE OF CALC=', 'RELA' endif write(*,'(6f10.6)') ap, bp, cp, alpha, beta, gamma do i=1,natr c i should be positive for cubic symmetry and negative for non-cubic c *** ** * CHANGE THAT * ** *** write(*,'(a4,i4,a4,f10.8,a3,f10.8,a3,f10.8)') $ 'ATOM', -i,': X=', a(i), ' Y=', b(i), ' Z=', c(i) write(*,'(a15,i2,a17,i2)') 'MULT=', 1, 'ISPLIT=', isplit write(*,'(a10,a5,i5,a5,f10.8,a5,f10.4,a5,f5.1)') $ atom(nat(i)),'NPT=',npt,'R0=',r0(i), $ 'RMT=',rmt(i),'Z:', real(nat(i)) write(*,'(a20,3f10.7)') 'LOCAL ROT MATRIX: ', 1.0,0.0,0.0 write(*,'(20x,3f10.7)') 0.0, 1.0, 0.0 write(*,'(20x,3f10.7)') 0.0, 0.0, 1.0 enddo write(*,'(i4,A)') 1,' NUMBER OF SYMMETRY OPERATIONS' write(*,'(3i2,f10.7)') 1, 0, 0, 0.0 write(*,'(3i2,f10.7)') 0, 1, 0, 0.0 write(*,'(3i2,f10.7)') 0, 0, 1, 0.0 write(*,'(i8)') 1 21 FORMAT(I5,3F16.10) END xcrysden-1.6.2/F/xsf2cube.f0000644000175000017500000000662013052605542014136 0ustar tonetonec ***************************************************************** program xsf2cube c Usage: xsf2cube xsffile c c BEWARE: the cube file should contain solely a single scalar field !!!! c c AUTHOR: Anton Kokalj (tone.kokalj@ijs.si) c DATE: Tue Jan 2011 c ***************************************************************** implicit none integer $ maxat, $ nxx, $ nyy, $ nzz real*8 B2A parameter ( $ maxat = 10000, $ nxx = 500, $ nyy = 500, $ nzz = 800, $ B2A=0.529177d0 $ ) integer i, j, k, natoms, nx, ny, nz, atn(maxat) integer xsf_unit, out_unit, count character dummy*256, xsfFile*256 character*4 nat(maxat) real value(nxx,nyy,nzz), charge(maxat), val real*8 vec(3,3), tau(3,maxat), origin(3), span(3,3) character*2 atom(100), atom_upper(100), aval*25 include 'atoms.inc' call getarg(1,xsfFile) out_unit=6 if ( (len_trim(xsfFile).eq.1) .and. xsfFile(1:1).eq.'-' ) then c read XSF from standard xsf_unit=5 else xsf_unit=20 open(unit=xsf_unit, $ file=xsfFile(1:len_trim(xsfFile)), status='old') endif c CRYSTAL|SLAB|POLYMER|MOLECULE read (xsf_unit,'(a80)') dummy c PRIMVEC read (xsf_unit,'(a80)') dummy read (xsf_unit,*) ((vec(i,j),i=1,3),j=1,3) c PRIMCOORD read (xsf_unit,'(a80)') dummy read (xsf_unit,*) natoms do i=1,natoms read(xsf_unit,*) nat(i), (tau(j,i),j=1,3) do j=1,100 if ( (nat(i)(1:min(len_trim(nat(i)),2)).eq. $ atom(j)(1:len_trim(atom(j)))) .or. $ (nat(i)(1:min(len_trim(nat(i)),2)).eq. $ atom_upper(j)(1:len_trim(atom(j)))) ) then atn(i)=j charge(i)=real(j) endif enddo enddo c DATAGRID header read (xsf_unit,*) dummy read (xsf_unit,*) dummy read (xsf_unit,*) dummy read (xsf_unit,*) nx, ny, nz read (xsf_unit,*) (origin(i),i=1,3) read (xsf_unit,*) ((span(i,j),i=1,3),j=1,3) if ( nx.gt.nxx) stop 'NX > NXX, increase the NXX parameter' if ( ny.gt.nyy) stop 'NY > NYY, increase the NYY parameter' if ( nz.gt.nzz) stop 'NZ > NZZ, increase the NZZ parameter' c read the datagrid read (xsf_unit,*) $ (((value(i,j,k),i=1,nx),j=1,ny),k=1,nz) c Cube header write(out_unit,*) 'scalar_field' write(out_unit,*) 'converted from XSF file' write(out_unit,'(I5,3F12.6)') natoms, (origin(i)/B2A,i=1,3) c N.B.: to make a proper cube file for Bader program, the cube file c should not contain the edge points, which are periorid replicas, c hence the actual number of points is (nx-1,ny-1,nz-1) !!! write(out_unit,'(I5,3F12.6)') $ nx-1, (span(i,1)/B2A/dble(nx-1), i=1,3) write(out_unit,'(I5,3F12.6)') $ ny-1, (span(i,2)/B2A/dble(ny-1), i=1,3) write(out_unit,'(I5,3F12.6)') $ nz-1, (span(i,3)/B2A/dble(nz-1), i=1,3) do i=1,natoms write(out_unit,'(I5,4F12.6)') $ atn(i), charge(i), (tau(j,i)/B2A,j=1,3) enddo c write the datagrid do i=1,nx-1 do j=1,ny-1 write (out_unit,'(6(E13.5):)') (value(i,j,k),k=1,nz-1) enddo enddo END xcrysden-1.6.2/F/wigner12d.f0000644000175000017500000002317013513100523014205 0ustar tonetone SUBROUTINE WignerSeitz1D(vec,word) IMPLICIT REAL*8 (a-h,o-z) REAL*8 vec(3,3) CHARACTER*(*) word REAL*8 vertex(3,3), nml(3) Call ZeroMat(vertex, 3, 3) vertex(1,1) = -0.5d0 * vec(1,1) vertex(2,1) = 0.5d0 * vec(1,1) nml(1) = 0.0d0 nml(2) = 1.0d0 nml(3) = 0.0d0 Write(12,'(1x,a)') word write(12,*) 2 do i=1,2 write(12,*) (vertex(i,j),j=1,3), (nml(j),j=1,3) enddo Write(12,'(1x,a,"_END")') word RETURN END SUBROUTINE WignerSeitz2D(srcvec,word) IMPLICIT REAL*8 (a-h,o-z) include 'voronoi.inc' REAL*8 srcvec(3,3), vec(3,3) CHARACTER*(*) word c this SUBROUTINE is not efficient but is very simple !!! REAL*8 * vertex(3,MAX_VERT),!VERTICES OF VORONOI POLIHEDRA * point(3,26), !equation of plane: ax+by+cz=d; point = (a,b,c,d) * vect1(3), !arbitrary vector 1 * vect2(3), !arbitrary vector 2 * nml(3), ! nml=vect1 x vect2 * t(3) INTEGER * iverplane2(MAX_PL_VER,1), !copy of iverplane * icc(3) LOGICAL * activ(MAX_PL_VER), * newvertex, lnew, lline, equal12, equal13, equal23, equalvert c NPOI.........number of point c NVER.........number of vertices C =========================================== C |11 21| 31| |x1 x2| C VEC = |12 22| 32| => VEC = |y1 y2| C =========================================== ! ! if lattice vectors are not reduced, reduce them ! call ReduceBasis2d(srcvec,vec) ! *** Write(12,'(1x,a)') word c make all neighbour points of origin (0,0); there are 8 such points NPOI=0 do i = -1, 1 do j = -1, 1 if(i.ne.0 .or. j.ne.0)then !disregard point(0,0) di=dble(i) dj=dble(j) NPOI=NPOI+1 c equation of line: ax+by=c, point = (a,b,c) point(1,NPOI)=di*vec(1,1) + dj*vec(2,1) point(2,NPOI)=di*vec(1,2) + dj*vec(2,2) point(3,NPOI)=0.5d0 * ( * point(1,NPOI)*point(1,NPOI) + * point(2,NPOI)*point(2,NPOI)) endif enddo enddo c --- --- DEBUG_BEGIN --- --- c PRINT *,'NUMBER OF POINTS: ',NPOI c do i=1,NPOI c write(*,*) (point(j,i),j=1,4) c enddo c PRINT *,'' c --- --- DEBUG_END --- --- C find vertices as intersections of two lines; C lines are made at the middle of origin and points NVER=0 do i=1,NPOI-1 do j=i+1,NPOI det=det2x2d( $ point(1,i), point(1,j), $ point(2,i), point(2,j) ) c print *,'DEBUG> det = ',det if(abs(det).gt.MAXERR)then detx=det2x2d( * point(3,i), point(3,j), * point(2,i), point(2,j) ) dety=det2x2d( * point(1,i), point(1,j), * point(3,i), point(3,j)) px=detx/det py=dety/det c PRINT *,'px,py,pz>',px,py,pz c print *,'DEBUG> px,py,pz:: ',px,py,pz C if vertex is closer to origin than to any other point, C than we have new vertex l=0 newvertex=.true. do while (newvertex .and. l.lt.NPOI) l=l+1 dist1=dsqrt(px*px + py*py) dist2=dsqrt( * (px-point(1,l))*(px-point(1,l)) + * (py-point(2,l))*(py-point(2,l)) ) c print *, c * 'DEBUG> l:',l,' ==>dist1 = ', c * dist1,'; dist2 = ',dist2 if(dist1.gt.(dist2 + MAXERR)) newvertex=.false. enddo c print *,'DEBUG> l=',l,'newvertex=',newvertex if(newvertex) then NVER=NVER+1 vertex(1,NVER) = px vertex(2,NVER) = py vertex(3,NVER) = 0.0d0 activ(NVER) = .true. endif endif enddo enddo c --- --- DEBUG_BEGIN --- --- * PRINT *,'ALL VERICES OF VORONOI: NVER=',NVER * do i=1,NVER * WRITE(*,*) (vertex(j,i),j=1,3),'; --> ', * * (vindex(j,i),j=1,3) * enddo * WRITE(*,*) '' c --- --- DEBUG_END --- --- c some vertices that belong to one line may be identical or colinear, c get rid of that vertices do ic=1,NVER-2 if ( activ(ic) ) then do jc=ic+1,NVER-1 if ( activ(jc) ) then do kc=jc+1,NVER if ( activ(kc) ) then c get rid of identical points equal12 = * abs(vertex(1,ic)-vertex(1,jc)).lt.MAXERR .and. * abs(vertex(2,ic)-vertex(2,jc)).lt.MAXERR equal13 = * abs(vertex(1,ic)-vertex(1,kc)).lt.MAXERR .and. * abs(vertex(2,ic)-vertex(2,kc)).lt.MAXERR equal23 = * abs(vertex(1,jc)-vertex(1,kc)).lt.MAXERR .and. * abs(vertex(2,jc)-vertex(2,kc)).lt.MAXERR equalvert=.true. if(equal12.and.equal13)then c all three points are identical c disregard with lower indices: ic < jc < kc activ(ic)=.false. activ(jc)=.false. elseif(equal12)then activ(ic)=.false. elseif(equal13)then activ(ic)=.false. elseif(equal23)then activ(jc)=.false. else equalvert=.false. endif c --- --- DEBUG_BEGIN --- --- c PRINT *,'i=',i,'; equalvert=',equalvert c --- --- DEBUG_BEGIN --- --- if(.not.equalvert)then do lc=1,3 vect1(lc) = vertex(lc,jc) * - vertex(lc,ic) vect2(lc) = vertex(lc,kc) * - vertex(lc,ic) enddo CALL VecProduct(vect1,vect2,nml) size = VecSize(nml) c --- --- DEBUG_BEGIN --- --- c PRINT *,'SIZE>', c * (vertex(lc,iverplane(ic,i)) c * ,vertex(lc,iverplane(jc,i)) c * ,vertex(lc,iverplane(kc,i)),lc=1,3) c PRINT *,'SIZE::',size,'MAXERR::',MAXERR c --- --- DEBUG_END --- --- if(abs(size).lt.MAXERR)then c colinear points; disregard middle point icc(1)=ic icc(2)=jc icc(3)=kc t(1)=0.0d0 t(2)=1.0d0 t(3)=gett3( * vertex(1,ic), * vertex(1,jc), * vertex(1,kc)) do lc=2,3 icc1=icc(lc) do lc1=lc-1,1,-1 if(t(lc1).lt.t(icc1)) * goto 101 icc(lc1+1)=icc(lc1) enddo lc1=0 101 icc(lc1+1)=icc1 enddo c --- --- DEBUG_BEGIN --- --- c PRINT *,'i=',i, c * ';SORTING ORDER OF VERT:' c PRINT *,'ic=',ic,'; ', c * (vertex(iver,iverplane(icc(1),i)),iver=1,3) c PRINT *,'jc=',jc,'; ', c * (vertex(iver,iverplane(icc(2),i)),iver=1,3) c PRINT *,'kc=',kc,'; ', c * (vertex(iver,iverplane(icc(3),i)),iver=1,3) c --- --- DEBUG_END --- --- activ(icc(2))=.false. !middle point disregarded endif !if(abs(size).lt.MAXERR)then endif !if(.not.equalvert)then endif enddo !kc endif enddo !jc endif enddo !ic NVER2=0 do ic=1,NVER c --- --- DEBUG_BEGIN --- --- c PRINT *,'ic=',ic,'; activ(ic,i)=',activ(ic,i) c PRINT *,(vertex(lc,iverplane(ic,i)),lc=1,3) c --- --- DEGUB_END --- --- if(activ(ic))then NVER2=NVER2+1 iverplane2(NVER2,1)=ic endif enddo if(NVER2.gt.2) then c --- --- DEBUG_BEGIN --- --- c WRITE(*,*)'PLANE N.:',i,'; NVPL2=',NVPL2,'; NVPL',NVPL, c * '; INDEX LIST/VERTEX LIST' c do ideb=1,NVPL2 c WRITE(*,*) iverplane2(ideb,nplane),'; ', c * (vertex(j,iverplane2(ideb,nplane)),j=1,3) c enddo c WRITE(*,*)'NUMBER OF PLANES: ',nplane c --- --- DEBUG_END --- --- c now we have nverplane(i) vertices in plane i; make Convex Hull c for that plane CALL ConvexHull(1,iverplane2,NVER2,vertex) endif Write(12,'(1x,a,"_END")') word RETURN END xcrysden-1.6.2/F/pwKPath.f0000644000175000017500000001525611712736221014000 0ustar tonetonec ------------------------------------------------------------------------ program kpath c Usage: kpath c ------------------------------------------------------------------------ c k-list-dat should look like: c ---------------------------- c KP, NK ... No. of special k-points, No. interp. k-points c crystal_coor_type ... prim or conv c KX KY KZ label ... special k-point coordinates, label IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' CHARACTER*128 file1,file2 INTEGER nkp_seg(NAC), NAT(NAC), nk, kp, nkp_sum, i, j REAL*8 idvec(3,3), dis(NAC), frcoor(3,NAC), coor(3,NAC), fr(3,NAC) REAL*8 prim(3), conv(3), inv(3,3) REAL*8 ivm(3,3) REAL*8 dis_sum, rpv(3,3), rcv(3,3), m(3,3), dvec(3,3) REAL*8 X(NAC), Y(NAC), Z(NAC), fx, fy, fz, f CHARACTER*10 label(NAC) CHARACTER*4 input_vec LOGICAL ldiv COMMON/IVEC/ IDVEC COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR PARAMETER ( TOLMIN=1.0d-8 ) c reciprocal vectors are in form: c --------------------------------- c | x1 y1 z1 | | 11 21 31 | c IDVEC = | x2 y2 z2 | = | 12 22 32 | c | x3 y3 z3 | | 13 23 33 | if ( iargc() .lt. 2 ) then write(*,*) 'Usage: kpath ' STOP endif c read XSF file call GetArg(1,FILE1) len=index(file1,' ')-1 open(11,FILE=FILE1(1:len),STATUS='OLD') c read k-list-file call GetArg(2,FILE2) len=index(file2,' ')-1 open(21,FILE=FILE2(1:len),STATUS='OLD') read(21,*,END=99) KP, NK read(21,'(A4)') input_vec if (kp.le.1) then write(*,*) 'less then two special k-points selected' stop endif c supportInfo-1.kpath and supportInfo-2.kpath files open(33,file='supportInfo-1.kpath',status='unknown') c open(34,file='supportInfo-2.kpath',status='unknown') call ReadF1('DIM-GROUP',IGROUP,IDIM) c read both sets of reciprocal vectors if ( input_vec(1:4) .eq. 'prim' ) then call ReadF1('RECIP-CONVVEC', IDUM1, IDUM2) call MatCopy(idvec,rcv,3,3) call ReadF1('RECIP-PRIMVEC', IDUM1, IDUM2) call MatCopy(idvec,rpv,3,3) else call ReadF1('RECIP-PRIMVEC', IDUM1, IDUM2) call MatCopy(idvec,rpv,3,3) call ReadF1('RECIP-CONVVEC', IDUM1, IDUM2) call MatCopy(idvec,rcv,3,3) endif c ************************************************************** c get the transpose of idvec; this is the matrix for getting the c Cartesian coordinates. call MatTranspose(idvec, ivm, 3, 3) c ************************************************************** write(33,'('' Selected k-points in CARTESIAN coordinates:'')') c calculate the distance between k-coordinates and estimate number c of points for each segment dis_sum=0.0d0 do i=1,KP read(21,*,END=99) (frcoor(j,i),j=1,3), label(i) c transform coor from fractional to cartesian COORDINATES coor(1,i) = frcoor(1,i)*ivm(1,1) + 1 frcoor(2,i)*ivm(2,1) + frcoor(3,i)*ivm(3,1) coor(2,i) = frcoor(1,i)*ivm(1,2) + 1 frcoor(2,i)*ivm(2,2) + frcoor(3,i)*ivm(3,2) coor(3,i) = frcoor(1,i)*ivm(1,3) + 1 frcoor(2,i)*ivm(2,3) + frcoor(3,i)*ivm(3,3) write(33,'(3x,3(f10.5,1x),3x,a5)') $ coor(1,i), coor(2,i), coor(3,i), label(i) if (i .gt. 1) then dis(i-1) = dist( coor(1,i), coor(2,i), coor(3,i), 1 coor(1,i-1), coor(2,i-1), coor(3,i-1) ) dis_sum = dis_sum + dis(i-1) endif enddo call ZeroMat(m,3,3) if ( input_vec(1:4) .eq. 'conv' ) then c convert frcoor to primitive basis call Invert3x3(rpv,inv) do i=1,kp do j=1,3 frcoor(j,i) = $ coor(1,i)*inv(j,1) + $ coor(2,i)*inv(j,2) + $ coor(3,i)*inv(j,3) enddo enddo endif c now write the K-list nkp_sum=0 do i=1,kp-1 nkp_seg(i) = nint( dble(nk-1) * dis(i) / dis_sum ) nkp_sum = nkp_sum + nkp_seg(i) if (nkp_seg(i) .eq. 0) then write(*,*) 1 'ERROR: NK too small!!! Increase number of k-points' STOP endif enddo write(*,*) 'K_POINTS crystal' write(*,*) nkp_sum+1 do i=1,kp-1 do j=1,nkp_seg(i) f = dble(j-1)/dble(nkp_seg(i)) fx = frcoor(1,i) + f*(frcoor(1,i+1) - frcoor(1,i)) fy = frcoor(2,i) + f*(frcoor(2,i+1) - frcoor(2,i)) fz = frcoor(3,i) + f*(frcoor(3,i+1) - frcoor(3,i)) write(*, '(5x,3(f15.10,1x),3x,''1.0'')') fx, fy, fz c supporting info c write(34,'(5x,3(f15.10,1x),3x,''1.0'')') fx, fy, fz enddo enddo fx = frcoor(1,kp) fy = frcoor(2,kp) fz = frcoor(3,kp) write(*, '(5x,3(f15.10,1x),3x,''1.0'')') fx, fy, fz c supporting info c write(34,'(5x,3(f15.10,1x),3x,''1.0'')') fx, fy, fz GOTO 1000 99 continue STOP 'unexpected end of k-list-file' 1000 continue c c POSTSCRIPT: write some supporting information c c RECIPROCAL-PRIMITIVE write(33,'('' '')') write(33,'('' Selected k-points in crystal coordinates:'')') write(33, $ '('' (with respect to RECIPROCAL-PRIMITIVE vectors)'')') call Invert3x3(rpv,inv) do i=1,KP do j=1,3 c prim(j) = c $ coor(1,i)*inv(1,j) + c $ coor(2,i)*inv(2,j) + c $ coor(3,i)*inv(3,j) prim(j) = $ coor(1,i)*inv(j,1) + $ coor(2,i)*inv(j,2) + $ coor(3,i)*inv(j,3) enddo write(33,'(3x,3(f10.5,1x),3x,a5)') $ prim(1), prim(2), prim(3), label(i) enddo c RECIPROCAL-CONVENTIONAL write(33,'('' '')') write(33,'('' Selected k-points in crystal coordinates:'')') write(33, $ '('' (with respect to RECIPROCAL-CONVENTIONAL vectors)'')') call Invert3x3(rcv,inv) do i=1,KP do j=1,3 c conv(j) = c $ coor(1,i)*inv(1,j) + c $ coor(2,i)*inv(2,j) + c $ coor(3,i)*inv(3,j) conv(j) = $ coor(1,i)*inv(j,1) + $ coor(2,i)*inv(j,2) + $ coor(3,i)*inv(j,3) enddo write(33,'(3x,3(f10.5,1x),3x,a5)') $ conv(1), conv(2), conv(3), label(i) enddo END xcrysden-1.6.2/F/recvec.f0000644000175000017500000000230111712736221013654 0ustar tonetone program recv character*10 idum real*8 a(3,3),ar(3,3) read(34,*) IDUM read(34,*) l,k read(34,*) ((a(i,j),j=1,3),i=1,3) write(*,'(3(3f12.5/))') ((a(i,j),j=1,3),i=1,3) call recvec(a,ar) write(*,'(3(3f12.5/))') ((ar(i,j),j=1,3),i=1,3) end C VECTOR1 GOES TO FIRST COLOUMN, VETCOR2 TO SECOND & VECTOR3 TO C THIRD COLOUMN;;; DV(COL,ROW) C |11 21 31| |x1 x2 x3| C VEC = |12 22 32| => DV = |y1 y2 y3| C |13 23 33| |z1 z2 z3| SUBROUTINE RecVec(a,ar) IMPLICIT REAL*8 (a-h,o-z) REAL*8 a(3,3),ar(3,3) REAL*8 ab(3),bc(3),ca(3),PI2 PI2=8.0d0*DATAN(1.0d0) do i=1,3 do j=1,3 a(i,j)=a(i,j)/0.529d0 c print *,a(i,j) enddo enddo CALL VecProduct(a(1,2),a(1,3),bc) CALL VecProduct(a(1,3),a(1,1),ca) CALL VecProduct(a(1,1),a(1,2),ab) c write(*,'(3(3f12.5/))') (a(i),i=1,3),(bv(i),i=1,3),(cv(i),i=1,3) vol=a(1,1)*bc(1) + a(2,1)*bc(2) + a(3,1)*bc(3) do i=1,3 ar(1,i)=PI2*bc(i)/vol ar(2,i)=PI2*ca(i)/vol ar(3,i)=PI2*ab(i)/vol enddo RETURN END xcrysden-1.6.2/F/kPath.f0000644000175000017500000002031311712736221013457 0ustar tonetone program kpath c ************************************ c Usage: kpath c ************************************ c k-list-dat should look like: c ---------------------------- c KP, NK, IDV, Emin, Emax ... # of special k-points, # of-points, c devider (IDV), Emin, Emax c IX IY IZ LABEL ... ix, iy, iz -> k-coordinate: (ix,iy,iz)/idv c REPEAT KP times IMPLICIT REAL*8 (A-H,O-Z) include 'param.inc' CHARACTER*128 file1,file2 INTEGER icoor(3,NAC), nkp_seg(NAC), NAT(NAC) REAL*8 idvec(3,3), dis(NAC), frcoor(3,NAC), coor(3,NAC) REAL*8 prim(3), conv(3), inv(3,3) REAL*8 ivm(3,3) REAL*8 dis_sum, rpv(3,3), rcv(3,3), mat(3,3), dvec(3,3) REAL*8 X(NAC), Y(NAC), Z(NAC) CHARACTER*10 label(NAC) CHARACTER*4 input_vec LOGICAL ldiv COMMON/IVEC/ IDVEC COMMON/MULTAT/ X,Y,Z,NAT,DVEC,NATR PARAMETER ( TOLMIN=1.0d-8 ) include 'get.inc' if ( iargc() .lt. 2 ) then write(*,*) 'Usage: kpath ' STOP endif c read XSF file Call GetArg(1,FILE1) len=index(file1,' ')-1 Open(11,FILE=FILE1(1:len),STATUS='OLD') c reciprocal vectors are in form: c --------------------------------- c | x1 y1 z1 | | 11 21 31 | c IDVEC = | x2 y2 z2 | = | 12 22 32 | c | x3 y3 z3 | | 13 23 33 | c calculate the distance between k-coordinates and estimate number c of points for each segment c read k-list-file Call GetArg(2,FILE2) len=index(file2,' ')-1 Open(21,FILE=FILE2(1:len),STATUS='OLD') read(21,*,END=99) KP, NK, IDV, Emin, Emax read(21,'(A4)') input_vec if (kp.le.1) then write(*,*) 'less then two special k-points selected' stop endif c supportInfo-1.kpath file open(33,file='supportInfo-1.kpath',status='unknown') c supportInfo-2.kpath file open(34,file='supportInfo-2.kpath',status='unknown') Call ReadF1('DIM-GROUP',IGROUP,IDIM) c read both sets of reciprocal vectors if ( input_vec(1:4) .eq. 'prim' ) then Call ReadF1('RECIP-CONVVEC', IDUM1, IDUM2) do i=1,3 do j=1,3 rcv(j,i) = idvec(j,i) enddo enddo Call ReadF1('RECIP-PRIMVEC', IDUM1, IDUM2) do i=1,3 do j=1,3 rpv(j,i) = idvec(j,i) enddo enddo else Call ReadF1('RECIP-PRIMVEC', IDUM1, IDUM2) do i=1,3 do j=1,3 rpv(j,i) = idvec(j,i) enddo enddo Call ReadF1('RECIP-CONVVEC', IDUM1, IDUM2) do i=1,3 do j=1,3 rcv(j,i) = idvec(j,i) enddo enddo endif c ************************************************************** c get the transpose of idvec; this is the matrix for getting the c Cartesian coordinates. call MatTranspose(idvec, ivm, 3, 3) c ************************************************************** write(33,'('' Selected k-points in CARTESIAN coordinates:'')') dis_sum=0.0d0 do i=1,KP read(21,*,END=99) (icoor(j,i),j=1,3), label(i) do j=1,3 frcoor(j,i) = dble(icoor(j,i)) / dble(idv) enddo c transform coor from fractional to cartesian COORDINATES coor(1,i) = frcoor(1,i)*ivm(1,1) + 1 frcoor(2,i)*ivm(2,1) + frcoor(3,i)*ivm(3,1) coor(2,i) = frcoor(1,i)*ivm(1,2) + 1 frcoor(2,i)*ivm(2,2) + frcoor(3,i)*ivm(3,2) coor(3,i) = frcoor(1,i)*ivm(1,3) + 1 frcoor(2,i)*ivm(2,3) + frcoor(3,i)*ivm(3,3) write(33,'(3x,3(f10.5,1x),3x,a5)') $ coor(1,i), coor(2,i), coor(3,i), label(i) if (i .gt. 1) then dis(i-1) = Dist( coor(1,i), coor(2,i), coor(3,i), 1 coor(1,i-1), coor(2,i-1), coor(3,i-1) ) dis_sum = dis_sum + dis(i-1) endif enddo call ZeroMat(mat,3,3) c if needed convert frcoor to other basis (prim/conv) if (IConvCoor(igroup,input_vec,rcv) .eq. IGET_PRIM) then Call ReadF1('PRIMVEC', idum1, idum2) c bug resolved by Florent Boucher call MatMult(rcv, 3, 3, dvec, 3, mat) call GetIntCoor(frcoor, icoor, mat, idv, kp) else if (IConvCoor(igroup,input_vec,rcv) .eq. IGET_CONV) then c convert from primitive to conventional frcoor Call ReadF1('CONVVEC', idum1, idum2) c bug resolved by Florent Boucher call MatMult(rpv, 3, 3, dvec, 3, mat) call GetIntCoor(frcoor, icoor, mat, idv, kp) endif c now write the K-list do i=1,kp-1 nkp_seg(i) = nint( dble(nk) * dis(i) / dis_sum ) if (nkp_seg(i) .eq. 0) then WRITE(*,*) 1 'ERROR: IDV*NK to big! Decrease number of k-points' STOP endif cfb new_idv = nkp_seg(i)*idv mult = nkp_seg(i) cfb ix = icoor(1,i)*mult iy = icoor(2,i)*mult iz = icoor(3,i)*mult if (i.eq.1) then write(*,'(A10,4I5,F5.1,2F5.2,2x,A30)') 1 label(i), ix, iy, iz, new_idv, 2.0, Emin, Emax, $ 'k-list generated by XCrySDen' else write(*,'(A10,4I5,F5.1)') label(i), ix, iy, iz, new_idv, 2.0 endif do j=1,nkp_seg(i)-1 ix = icoor(1,i)*mult + 1 j*mult*(icoor(1,i+1) - icoor(1,i))/nkp_seg(i) iy = icoor(2,i)*mult + 1 j*mult*(icoor(2,i+1) - icoor(2,i))/nkp_seg(i) iz = icoor(3,i)*mult + 1 j*mult*(icoor(3,i+1) - icoor(3,i))/nkp_seg(i) write(*,'(10X,4I5,F5.1)') ix, iy, iz, new_idv, 2.0 enddo c supporting info write(34,'(''K-point '',a10,'':'', 3i5,2x,''/'',1x,i5, $ 1x,''-->'',1x,3f8.4)') $ label(i), $ icoor(1,i)*mult, icoor(2,i)*mult, icoor(3,i)*mult, $ new_idv, $ dble(icoor(1,i)*mult)/dble(new_idv), $ dble(icoor(2,i)*mult)/dble(new_idv), $ dble(icoor(3,i)*mult)/dble(new_idv) c / enddo ix = icoor(1,kp)*mult iy = icoor(2,kp)*mult iz = icoor(3,kp)*mult write(*,'(A10,4I5,F5.1)') label(kp), ix, iy, iz, new_idv, 2.0 write(*,'(A3)') 'END' c supporting info write(34,'(''K-point '',a10,'':'', 3i5,2x,''/'',1x,i5, $ 1x,''-->'',1x,3f8.4)') $ label(kp), ix, iy, iz, new_idv, $ dble(ix)/dble(new_idv), $ dble(iy)/dble(new_idv), $ dble(iz)/dble(new_idv) c / GOTO 1000 99 continue STOP 'unexpected end of k-list-file' 1000 continue c c POSTSCRIPT: write some supporting information c c RECIPROCAL-PRIMITIVE write(33,'('' '')') write(33,'('' Selected k-points in crystal coordinates:'')') write(33, $ '('' (with respect to RECIPROCAL-PRIMITIVE vectors)'')') call Invert3x3(rpv,inv) do i=1,KP do j=1,3 c prim(j) = c $ coor(1,i)*inv(1,j) + c $ coor(2,i)*inv(2,j) + c $ coor(3,i)*inv(3,j) prim(j) = $ coor(1,i)*inv(j,1) + $ coor(2,i)*inv(j,2) + $ coor(3,i)*inv(j,3) enddo write(33,'(3x,3(f10.5,1x),3x,a5)') $ prim(1), prim(2), prim(3), label(i) enddo c RECIPROCAL-CONVENTIONAL write(33,'('' '')') write(33,'('' Selected k-points in crystal coordinates:'')') write(33, $ '('' (with respect to RECIPROCAL-CONVENTIONAL vectors)'')') call Invert3x3(rcv,inv) do i=1,KP do j=1,3 c conv(j) = c $ coor(1,i)*inv(1,j) + c $ coor(2,i)*inv(2,j) + c $ coor(3,i)*inv(3,j) conv(j) = $ coor(1,i)*inv(j,1) + $ coor(2,i)*inv(j,2) + $ coor(3,i)*inv(j,3) enddo write(33,'(3x,3(f10.5,1x),3x,a5)') $ conv(1), conv(2), conv(3), label(i) enddo END xcrysden-1.6.2/F/pwi2xsf.f0000644000175000017500000004216513525473356014036 0ustar tonetonec ------------------------------------------------------------------------ program pwi2xsf c Reads preprocesed (with pwi2xsf.sh) PW-input file c and converts to XSF format file c c This program reads the NEWLY formated preprocesed-PW.X input c c Usage: pwi2xsf.sh < PW-preprocessed file c ------------------------------------------------------------------------ implicit none integer $ maxtyp, ! maximum number of different types of atoms $ maxatom, ! maximum number fo atoms $ maximage, ! maximum number of images $ NOT_SPECIFIED_UNIT, $ ALAT_UNIT, $ BOHR_UNIT, $ ANGSTROM_UNIT, $ CRYSTAL_UNIT real*8 $ bohr parameter ( $ maxtyp = 100, $ maxatom = 10000, $ maximage= 50, $ bohr = 0.52917720859d0, $ $ NOT_SPECIFIED_UNIT = 0, $ ALAT_UNIT = 1, $ BOHR_UNIT = 2, $ ANGSTROM_UNIT = 3, $ CRYSTAL_UNIT = 4 ) integer $ ibrav, ! label for Bravais lattice $ igroup, ! the XSF's group label of Bravais lattice $ nat, ! number of atoms $ ntyp, ! number of pseudopotentials $ num_of_images, ! number of NEB images $ inp_num_of_images, ! number of NEB images in the input $ cell_unit, ! length-unit of cell-parameters $ atomic_posunit(maximage) ! length-unit of atomic positions real*8 $ celldm(6), ! cell parameters $ alat, ! lattice parameter $ a, b, c, cosab, cosac, cosbc, ! lattice parameters $ omega ! unit cell volume (not used) character $ calculation*80, ! type of calculation $ line*120 ! line of input character*3 $ atm(maxatom,maximage) ! atomic symbols integer $ ityp, ! type of PP $ ounit, ! output unit $ i, j, ipol, ! dummies $ inat, iim, iim_old, ! counters $ length, string_length ! length of string real*8 $ x,y,z, ! Cartesian coordinates & weights $ w1,w2, ! linear interpolation weights $ dx, dy, dz, ! auxiliary $ tau(3,maxatom,maximage), ! atomic coordinates + pv( 3,3 ), ! lattice vectors (PRIMITIVE) + cv( 3,3 ), ! lattice vectors (CONVENTIONAL) $ old_total_dist, old_dist(maximage), ! old(=input) inter-image distances $ new_total_dist, new_dist, ! new(=output) inter-image distances $ scale ! auxiliary logical $ ltaucry, matches, last_image data cv/ $ 0.0d0, 0.0d0, 0.0d0, $ 0.0d0, 0.0d0, 0.0d0, $ 0.0d0, 0.0d0, 0.0d0/ namelist/system/ $ ibrav, nat, celldm, a, b, c, cosab, cosac, cosbc, $ calculation, num_of_images ounit = 6 iim = 0 last_image = .false. c set default values calculation = 'scf' num_of_images = 1 nat = 0 ibrav = 0 celldm(1) = 0.0d0 a = 0.0D0 b = 0.0D0 c = 0.0D0 cosab = 0.0D0 cosac = 0.0D0 cosbc = 0.0D0 c----------------------------------------------------------------------- c read namelist system c----------------------------------------------------------------------- read (5,system) c----------------------------------------------------------------------- if ( nat.eq.0 ) then call errore('pwi2xsf', 'error while reading pw.x input',1) endif c was lattice specified in terms of A, B, C,... if ( celldm(1) .eq. 0.0D0 .AND. a .ne. 0.0D0 ) THEN CALL abc2celldm ( ibrav, a,b,c,cosab,cosac,cosbc, celldm ) else if ( celldm(1) .ne. 0.0D0 .AND. a .ne. 0.0D0 ) THEN ! call errore('pwi2xsf', 'both celldm() and a,b,c specified', 2) ! endif c c read the rest of the input c 990 continue read(5,'(a120)',end=999) line line = adjustl(line) length = string_length( line ) c c CELL_PARAMETERS c if ( line(1:15) .eq. 'CELL_PARAMETERS' ) then c find out the length-unit ... line(1:length-15) = adjustl(line(16:length)) length = string_length (line) cell_unit = NOT_SPECIFIED_UNIT if ( celldm(1).eq.0.0d0 ) then celldm(1) = 1.0d0 endif if (length.gt.0 ) then if ( matches('ALAT',line) ) then cell_unit = ALAT_UNIT elseif ( matches('BOHR',line) ) then cell_unit = BOHR_UNIT elseif ( matches('ANGSTROM',line) ) then cell_unit = ANGSTROM_UNIT elseif ( matches('CUBIC',line) .or. $ matches('HEXA', line) ) then ! old style syntax cell_unit = ALAT_UNIT ! else ! print *, 'ERROR: wrong unit in CELL_PARAMETERS' ! print *, ' must be alat, bohr, or angstrom' ! STOP endif endif read (5,*) ((pv(i,j),i=1,3),j=1,3) scale = 1.0d0 if ( (cell_unit .eq. ALAT_UNIT) .or. $ (cell_unit .eq. NOT_SPECIFIED_UNIT) ) then scale = celldm(1) ! lattice is specified in alat units elseif ( cell_unit .eq. ANGSTROM_UNIT ) then scale = 1.0d0/bohr elseif ( cell_unit .eq. BOHR_UNIT ) then scale = 1.0d0 endif c convert pv() lattice vectors to atomic units do i=1,3 pv(1,i) = pv(1,i)*scale pv(2,i) = pv(2,i)*scale pv(3,i) = pv(3,i)*scale enddo ! elseif ( line(1:16) .eq. 'ATOMIC_POSITIONS' ) then c c ATOMIC_POSITIONS c c find out the length-unit line(1:length-16) = adjustl(line(17:length)) length = string_length (line) ! iim = iim + 1 ! atomic_posunit(iim) = ALAT_UNIT ! if (length.gt.0 ) then ! if ( matches('CRYSTAL_SG',line) ) then call errore('pwi2xsf', & 'crystal_sg currently not supported', 3) ! elseif ( matches('ALAT',line) ) then atomic_posunit(iim) = ALAT_UNIT elseif ( matches('BOHR',line) ) then atomic_posunit(iim) = BOHR_UNIT elseif ( matches('CRYSTAL',line) ) then atomic_posunit(iim) = CRYSTAL_UNIT elseif ( matches('ANGSTROM',line) ) then atomic_posunit(iim) = ANGSTROM_UNIT endif endif c c READ ATOMS c IF ( (calculation(1:3) .ne. 'NEB') .and. $ (calculation(1:3) .ne. 'SMD') ) THEN if ( (iim .gt. 1) .and. $ (calculation(1:4) .ne. 'PATH') ) then call errore('pwi2xsf', & 'several ATOMIC_POSITIONS cards &for non PATH calculation', 4) endif ! call read_atoms(nat,atm(1,iim),tau(1,1,iim)) ! ELSE c c old format path calculation (NEB or SMD) c last_image = .false. iim = iim - 1 do while(.not.last_image) ! iim = iim + 1 ! read (5,'(a120)') line ! line: first_image if ( matches('LAST_IMAGE',line) ) last_image = .true. ! if (iim .gt. 1) $ atomic_posunit(iim) = atomic_posunit(iim-1) ! call read_atoms(nat,atm(1,iim),tau(1,1,iim)) enddo ENDIF endif ! inp_num_of_images = iim goto 990 ! 999 continue if ( ibrav.ne.0 ) then ! get primitive-lattice vectors in atomic units call latgen(ibrav,celldm, pv(1,1), pv(1,2), pv(1,3), omega) ! get conventional-lattice vectors in atomic units call set_convvec(ibrav, celldm, pv, cv) endif call write_XSF_header & (num_of_images, ibrav, bohr, pv, cv, nat, ounit) c coordinates to ANGSTROMs alat = bohr*celldm(1) ! alat in angstrom units do iim=1,inp_num_of_images do inat=1,nat if ( atomic_posunit(iim) .eq. BOHR_UNIT ) then tau(1,inat,iim) = bohr * tau(1,inat,iim) tau(2,inat,iim) = bohr * tau(2,inat,iim) tau(3,inat,iim) = bohr * tau(3,inat,iim) elseif ( atomic_posunit(iim) .eq. ALAT_UNIT ) then tau(1,inat,iim) = alat * tau(1,inat,iim) tau(2,inat,iim) = alat * tau(2,inat,iim) tau(3,inat,iim) = alat * tau(3,inat,iim) elseif ( atomic_posunit(iim) .eq. CRYSTAL_UNIT ) then call pwCryst_to_cart(1, tau(1,inat,iim), pv, 1) ! pwCryst_to_cart returns coordinates in atomic units tau(1,inat,iim) = bohr * tau(1,inat,iim) tau(2,inat,iim) = bohr * tau(2,inat,iim) tau(3,inat,iim) = bohr * tau(3,inat,iim) endif enddo enddo if ( num_of_images .lt. 2 ) then c write atoms for non-PATH calculation do inat=1,nat write(ounit,'(a3,2x,3f15.10)') atm(inat,1), $ tau(1,inat,1), tau(2,inat,1), tau(3,inat,1) enddo else c calculate intermediate images for PATH calculation old_total_dist = 0.0d0 old_dist(1) = 0.0d0 do iim = 2, inp_num_of_images old_dist(iim) = 0.0 do inat=1,nat dx = tau(1,inat,iim) - tau(1,inat,iim-1) dy = tau(2,inat,iim) - tau(2,inat,iim-1) dz = tau(3,inat,iim) - tau(3,inat,iim-1) old_dist(iim) = old_dist(iim) + dx*dx + dy*dy + dz*dz enddo old_dist(iim) = sqrt( old_dist(iim) ) old_total_dist = old_total_dist + old_dist(iim) old_dist(iim) = old_total_dist enddo new_dist = old_total_dist / dble(num_of_images-1) c -------------------------------------------------- c perform INTERPOLATION c -------------------------------------------------- new_total_dist = 0.0 do iim=1,num_of_images-1 do iim_old=1,inp_num_of_images-1 if ( new_total_dist .ge. old_dist(iim_old) $ .and. $ new_total_dist .lt. old_dist(iim_old+1) + 1d-10 ) $ then w1 = ( old_dist(iim_old+1) - new_total_dist ) $ / $ ( old_dist(iim_old+1) - old_dist(iim_old) ) w2 = 1.0d0 - w1 write(ounit,'('' PRIMCOORD '',i5)') iim write(ounit,*) nat, 1 do inat=1,nat x = w1*tau(1,inat,iim_old)+w2*tau(1,inat,iim_old+1) y = w1*tau(2,inat,iim_old)+w2*tau(2,inat,iim_old+1) z = w1*tau(3,inat,iim_old)+w2*tau(3,inat,iim_old+1) write(ounit,'(a3,2x,3f15.10)') $ atm(inat,iim_old), x, y, z enddo goto 11 endif enddo 11 continue new_total_dist = new_total_dist + new_dist enddo c print last image write(ounit,'('' PRIMCOORD '',i5)') iim write(ounit,*) nat, 1 do inat=1,nat x = tau(1,inat,inp_num_of_images) y = tau(2,inat,inp_num_of_images) z = tau(3,inat,inp_num_of_images) write(ounit,'(a3,2x,3f15.10)') $ atm(inat,inp_num_of_images), x, y, z enddo endif END c ------------------------------------------------------------------------ subroutine read_atoms(nat,atm,coor) c read atomic coordinates c ------------------------------------------------------------------------ implicit none integer $ nat, ! number of atoms $ ipol,inat, ! counters $ length, string_length ! length of a string character $ line*120 ! line of input character*3 $ atm(*) ! atomic symbols real*8 $ coor(3,*) do inat=1,nat 10 continue read (5,'(a120)') line length = string_length( line ) if (length.eq.0) then c an empty line, read again goto 10 endif read (line,*) atm(inat),(coor(ipol,inat),ipol=1,3) enddo return end c ------------------------------------------------------------------------ SUBROUTINE write_XSF_header & (num_of_images, ibrav, bohr, p, c, nat, ounit) c writes the header for XSF structure file c ------------------------------------------------------------------------ implicit none real*8 $ bohr, ! Bohr radius in ANGSTROMS unit $ p(3,3), c(3,3), ! lattive vectors in Bohr units (PRIMITIVE & CONVENTIONAL) $ p1(3,3), c1(3,3) ! lattive vectors in ANGSTROMS unit integer $ ibrav, ! label for Bravais lattice $ igroup, ! group of DIM-GROUP $ ibrav2igroup, ! function for transforming ibrav to igroup $ nat, ! number of atoms $ num_of_images, ! number of NEB images $ ounit ! output unit integer $ i, j ! dummies logical zero_latvec do i=1,3 do j=1,3 p1(i,j) = bohr*p(i,j) c1(i,j) = bohr*c(i,j) enddo enddo igroup = ibrav2igroup(ibrav) if (num_of_images .gt. 1) $ write(ounit,'('' ANIMSTEPS '',i5)') num_of_images write(ounit,'('' DIM-GROUP'')') write(ounit,'('' 3 '',i3)') igroup write(ounit,'(/,'' PRIMVEC'')') write(ounit,'(3(f15.10,2x,f15.10,2x,f15.10,/))') $ ((p1(i,j),i=1,3),j=1,3) ! write CONVENTIONAL VECTORS is they are not zero IF ( .not. zero_latvec(c1) ) THEN ! write(ounit,'('' CONVVEC'')') write(ounit,'(3(f15.10,2x,f15.10,2x,f15.10,/))') $ ((c1(i,j),i=1,3),j=1,3) ENDIF ! if (num_of_images .eq. 1) then write(ounit,'('' PRIMCOORD'')') write(ounit,*) nat, 1 endif return end c----------------------------------------------------------------------- subroutine pwCryst_to_cart ( nvec, vec, trmat, iflag ) c----------------------------------------------------------------------- c c This routine transforms the atomic positions or the k-point c components from crystallographic to carthesian coordinates ( iflag=1) c and viceversa ( iflag=-1 ). c Output carth. coordinates are stored in the input ('vec') array. c c implicit none c c first the dummy variables c integer + nvec, ! input: number of vectors (atom. pos. or k-points) + ! to be transf. from cryst. to carth. axes + iflag ! input: gives the sense of the transformation real*8 + vec(3,nvec), ! input/output: cryst./carth. coord. of the vectors + ! (atom. pos. or k-points) + trmat(3,3) ! input: transformation matrix ! if iflag=1: ! trmat = at , basis of the real-space latt. ! for atoms or ! = bg , basis of the rec.-space latt. ! for k-points ! if iflag=-1: the opposite c c here the local variables c integer + nv, ! counter on vectors + kpol ! counter on polarizations real*8 + vau(3) ! auxil. vector (containing the temp. transf. coord.) c c Compute the carth. coordinates of each vectors c (atomic positions or k-points components) c do nv = 1, nvec if ( iflag.eq.1 ) then do kpol = 1,3 vau(kpol) = trmat(kpol,1)*vec(1,nv) + + trmat(kpol,2)*vec(2,nv) + + trmat(kpol,3)*vec(3,nv) enddo else do kpol = 1,3 vau(kpol) = trmat(1,kpol)*vec(1,nv) + + trmat(2,kpol)*vec(2,nv) + + trmat(3,kpol)*vec(3,nv) enddo endif do kpol = 1,3 vec(kpol,nv) = vau(kpol) enddo enddo c return end xcrysden-1.6.2/F/p2c.f0000644000175000017500000001326511712736221013104 0ustar tonetone SUBROUTINE GetCenteredPoints(dv, dvc, idim, cp, npoi) implicit real*8 (a-h,o-z) real*8 dv(3,3), dvc(3,3), cp(3,4) real*8 xyz2con(3,3),res_dv(3),res_dvc(3),poi(3),poiC(3) real*8 parallelepipedDiagonal integer SHORTEST_DIAGONAL, LONGEST_DIAGONAL parameter (tolmin= 1.0d-7) include 'p2c.inc' c dv ... primitive direct vectors c dvc ... conventional reciprocal vectors c cp ... special centered points (calculated & returned) c npoi ... # of special centered points (calculated & returned) c ******************************************************************** c calculate the inverse matrix of conventional vectors matrix in order c to convert from XYZ coor to conventional fractional coor c ******************************************************************** c call MatCopy(dvc, xyz2con, idim, idim) call InvertSqMat123(dvc, xyz2con, idim) c print *,'GCP: xyz2con:' c do 10 i=1,3 c 10 print *,xyz2con(1,i),xyz2con(2,i),xyz2con(3,i) c c print *,'GCP: dvc:' c do 11 i=1,3 c 11 print *,dvc(1,i),dvc(2,i),dvc(3,i) c c print *,'GPC: dv:',dv c this is just in case: (polymers & slabs) c do i=1,3 c do j=1,3 c if ((i.gt.idim) .or. (j.gt.idim)) then c if (i.eq.j) then c xyz2con(i,j) = 1.0d0 c else c xyz2con(i,j) = 0.0d0 c endif c endif c enddo c enddo c ************************************************************************* c determine sphere size of primitive and conventional vectors and its ratio c ************************************************************************* do i=1,3 c shortest possible diagonal res_dv(i) = parallelepipedDiagonal ( dv, SHORTEST_DIAGONAL ) c print *,'res_dv:',res_dv c longest possible diagonal res_dvc(i) = parallelepipedDiagonal ( dvc, LONGEST_DIAGONAL ) enddo rp = VecSize( res_dv ) c print *,'rp:',rp c due to above calculation res_dv can be zero vector and rp can be zero; c if that happens set it to half Angstroms if (rp .lt. tolmin) rp=1.5d0 rc = VecSize( res_dvc ) ir = int( rc/rp ) if ( rc/rp - dble(int(rc/rp)) .gt. tolmin ) ir = ir + 1 print *, 'GCP: ', rp,rc,ir c ********************** c get the special points c ********************** irx = ir iry = ir irz = ir if (idim.lt.3) irz=0 if (idim.lt.2) iry=0 if (idim.lt.1) then npoi = 1 cp(1,1) = 0.0d0 cp(2,1) = 0.0d0 cp(3,1) = 0.0d0 RETURN ! it is a MOLECULE; return endif npoi=0 do i=-irx,irx do j=-iry,iry do k=-irx,irx di = dble(i) dj = dble(j) dk = dble(k) do l=1,3 poi(l) = di*dv(1,l) + dj*dv(2,l) + dk*dv(3,l) enddo c multiply p with conversion matrix to get conventinal fractional coor c call MatMult(xyz2con, 3, 3, poi, 1, poiC) do ii=1,3 poiC(ii) = xyz2con(1,ii)*poi(1) + $ xyz2con(2,ii)*poi(2) + xyz2con(3,ii)*poi(3) enddo c print *, 'GCP: poi=', poi(1), poi(2), poi(3) c print *, 'GCP: fract_poiC=', poiC(1), poiC(2), poiC(3) c check if poiC is inside the cell: condition 0<=poiC<1 if ( poiC(1).gt.-tolmin .and. poiC(1).lt.(1.d0-tolmin) $ .and. $ poiC(2).gt.-tolmin .and. poiC(2).lt.(1.d0-tolmin) $ .and. $ poiC(3).gt.-tolmin .and. poiC(3).lt.(1.d0-tolmin) ) $ then npoi = npoi + 1 do l=1,3 cp(l,npoi) = poiC(l) enddo c print *, 'Centered point: ', c $ cp(1,npoi), cp(2,npoi), cp(3,npoi) c print *, 'Centered point: ', c $ poiC(1), poiC(2), poiC(3) endif enddo enddo enddo RETURN END REAL*8 FUNCTION parallelepipedDiagonal(vec,type) implicit none real*8 vec(3,3), sq_diag(4), diag_d(3,4), min, max integer i, type, SHORTEST_DIAGONAL, LONGEST_DIAGONAL include 'p2c.inc' c diag_d(i,1) = +vec(i,1) + vec(i,2) + vec(i,3) c diag_d(i,3) = -vec(i,1) + vec(i,2) + vec(i,3) c diag_d(i,4) = +vec(i,1) - vec(i,2) + vec(i,3) c diag_d(i,2) = -vec(i,1) - vec(i,2) + vec(i,3) do i=1,3 c diagonal-1: (0,0,0)-->(1,1,1) diag_d(i,1) = vec(i,1) + vec(i,2) + vec(i,3) c diagonal-2: (1,1,0)-->(0,0,1) diag_d(i,2) = vec(i,3) - vec(i,1) - vec(i,2) c diagonal-3: (1,0,0)-->(0,1,1) diag_d(i,3) = vec(i,2) + vec(i,3) - vec(i,1) c diagonal-4: (0,1,0)-->(1,0,1) diag_d(i,4) = vec(i,1) + vec(i,3) - vec(i,2) enddo do i=1,4 sq_diag(i) = $ diag_d(1,i)*diag_d(1,i) + $ diag_d(2,i)*diag_d(2,i) + $ diag_d(3,i)*diag_d(3,i) enddo if (type .eq. SHORTEST_DIAGONAL) then min = sq_diag(1) if (sq_diag(2) .lt. min) min = sq_diag(2) if (sq_diag(3) .lt. min) min = sq_diag(3) if (sq_diag(4) .lt. min) min = sq_diag(4) parallelepipedDiagonal = sqrt(min) else max = sq_diag(1) if (sq_diag(2) .gt. max) max = sq_diag(2) if (sq_diag(3) .gt. max) max = sq_diag(3) if (sq_diag(4) .gt. max) max = sq_diag(4) parallelepipedDiagonal = sqrt(max) endif return end xcrysden-1.6.2/F/slabVthick.f0000644000175000017500000001463011712736221014507 0ustar tonetone PROGRAM SlabVThick c ************************************************************************* c *** Usage: slabvthick {-v vacuum_thickness}|{-s vacuum_thickness} \ c *** struct-file c *** c *** -f c *** vacuum_thickness is in fractional units c *** regarding the vacuum_thickness in old c *** struct file c *** c *** -s c *** vacuum thickness is in fractional units c *** accoring to the thickness of slab c *** (without vacuum) c ************************************************************************* implicit real*8 (a-h,o-z) parameter (nato=1000) character*80 title character*4 typ, mode character*10 aname(nato) character*2 flag character*256 file, char_vacT_new dimension x(3,nato),klz(nato), rmt(nato), z(nato), r0(nato), $ rot_loc(nato,3,3) integer ai(nato), npt(nato), mult(nato), isplit(nato) logical linv, lf if (iargc().ne.3) then print *, $'Usage: slabvthick {-v vacuum_thickness}|{-s vacuum_thickness} ', $'struct-file' stop endif Call GetArg(1,flag) lf=.false. if ( flag(1:2) .eq. '-f' ) then lf=.true. elseif ( flag(1:2) .eq. '-s' ) then lf=.false. else print *, $'Usage: slabvthick {-v vacuum_thickness}|{-s vacuum_thickness} ', $'struct-file' stop endif Call GetArg(2,char_vacT_new) vacT_new = c2d(char_vacT_new) print *,'VAC_T: ', vacT_new Call GetArg(3,file) len = index(file, ' ') - 1 Open(unit=1, file=file(1:len), status='old') read(1,99900) title read(1,99901) typ,nat read(1,99902) mode read(1,99903) a,b,c,alpha,beta,gamma na=0 do 10 i=1,nat na=na+1 if(na.gt.nato) goto 9990 read(1,99990) ai(i), x(1,na),x(2,na),x(3,na) read(1,99991) mult(i), isplit(i) do 11 im=2,mult(i) na=na+1 if(na.gt.nato) goto 9990 read(1,99990) ai(i), x(1,na),x(2,na),x(3,na) 11 continue read(1,99992) aname(i), npt(i), r0(i), rmt(i), z(i) read(1,99993) (rot_loc(i,1,iy), iy=1,3) read(1,99993) (rot_loc(i,2,iy), iy=1,3) read(1,99993) (rot_loc(i,3,iy), iy=1,3) 10 continue goto 9999 9990 write(*,*)'Too many atoms. Increase parameter nato in source ', * 'code.' stop 9999 continue c ************************************************************ c We must checked if slab is located on the middle of the slab c or not !!! c IF on the middle than it should remain in the middle c c IF it is located on the middle the Zaverage must be 0.5 !!!! c ************************************************************ c find an atom with lower Z and an average Z Zsum=x(3,1) zmin=x(3,1) zmax=x(3,1) linv=.false. do i=2,na Zsum=Zsum + x(3,i) if (x(3,i).lt.zmin) zmin=x(3,i) if (x(3,i).gt.zmax) zmax=x(3,i) enddo if ( dabs(Zsum/dble(na) - 0.5d0) .lt. 1.0d-5 ) linv=.true. slabT = zmax - zmin vacT = 1.0d0 - slabT if (lf) then vacT_new = vacT * vacT_new else vacT_new = slabT * vacT_new endif c change c and x(3,*): c = c * vacT_new / vacT if (linv) then c *** we have center of inversion do i=1,na if ( x(3,i) .gt. 0.5d0 ) $ x(3,i) = 0.5d0 + (x(3,1)-0.5d0) * vacT_new / vacT if ( x(3,i) .lt. 0.5d0 ) $ x(3,i) = 0.5d0 - (0.5d0-x(3,i)) * vacT_new / vacT enddo else c *** no center of inversion do i=1,na x(3,i) = X(3,i) * vacT_new / vacT enddo endif 99900 format(a79) 99901 format(a4,24x,i2) 99902 format(13x,a4) 99903 format(6F10.7) 99904 format(2(3F15.9/),3f15.9) 99990 format(5x,i3,4x,f10.7,3x,f10.7,3x,f10.7) 99991 format(15x,i2,17x,i2) 99992 format(a10,5x,i5,5x,f10.8,5x,f10.5,5x,f5.2) 99993 format(20x,3f10.8) c **************************** c now write WIEN97 struct file c **************************** write(*,'(a)') $ 'WIEN97 struct file generated by XCrySDen program' write(*,'(a4,a24,i2)') typ, 'LATTICE.NONEQUIV. ATOMS:',nat write(*,'(a13,a4)') 'MODE OF CALC=', mode write(*,'(6f10.6)') a, b, c, alpha, beta, gamma na=0 do i=1,nat na=na+1 write(*,'(a5,i3,a4,f10.8,a3,f10.8,a3,f10.8)') $ 'ATOM=', ai(i), $ ': X=', x(1,na), ' Y=', x(2,na), ' Z=', x(3,na) write(*,'(a15,i2,a17,i2)') 'MULT=', mult(i), $ 'ISPLIT=', isplit(i) do im=2,mult(i) na=na+1 write(*,'(a5,i3,a4,f10.8,a3,f10.8,a3,f10.8)') $ 'ATOM=', ai(i), $ ': X=', x(1,na), ' Y=', x(2,na), ' Z=', x(3,na) enddo read(1,99992) aname(i), npt(i), r0(i), rmt(i), z(i) write(*,'(a10,a5,i5,a5,f10.8,a5,f10.4,a5,f5.1)') $ aname(i),'NPT=',npt(i),'R0=',r0(i), $ 'RMT=',rmt(i),'Z:', z(i) write(*,'(a20,3f10.7)') 'LOCAL ROT MATRIX: ', $ (rot_loc(i,1,iy), iy=1,3) write(*,99993) (rot_loc(i,2,iy), iy=1,3) write(*,99993) (rot_loc(i,3,iy), iy=1,3) enddo write(*,'(i4,A)') 1,' NUMBER OF SYMMETRY OPERATIONS' write(*,'(3i2,f10.7)') 1, 0, 0, 0.0 write(*,'(3i2,f10.7)') 0, 1, 0, 0.0 write(*,'(3i2,f10.7)') 0, 0, 1, 0.0 write(*,'(i8)') 1 END c ========================= REAL*8 FUNCTION C2D(ARG) implicit real*8 (a-h,o-z) character*(*) arg print *,'c2d> arg:',arg c INTEGER PART i = index(arg,'.')-1 print *,'c2d> i(.):',i c2d = 0.0d0 if(i .eq. 0)then i = len(arg) do m=1,i c2d = c2d + dble((ichar(arg(m:m)) - 48)*10**(i-m)) enddo return endif do m=1,i c2d = c2d + dble((ichar(arg(m:m)) - 48)*10**(i-m)) enddo print *,'c2d> c2d(INT):',c2d c REAL PART j = index(arg,' ')-1 print *,'c2d> j( )',j if(j .eq. 0) j=len(arg) do m=i+2,j c2d = c2d + dble(ichar(arg(m:m)) - 48)/dble(10**(m-(i+1))) enddo print *,'c2d> c2d(ALL):',c2d return end xcrysden-1.6.2/F/get.inc0000644000175000017500000000014611712736221013515 0ustar tonetone PARAMETER( $ IDO_NOTHING = 0, $ IGET_PRIM = 1, $ IGET_CONV = 2 ) xcrysden-1.6.2/F/cube2xsf.f0000644000175000017500000001117313523240001014121 0ustar tonetonec ***************************************************************** program cube2xsf c Usage: cube2xsf mode cubefile c c MODE: c 1 ... scalar property (like density) c 4 ... scalar+vector (like density+gradient) c 5 ... scalar+vector+scalar (like density+gradient+laplacian) c c BEWARE: onle MODE.eq.1 is implemented !!! c c AUTHOR: Anton Kokalj (tone.kokalj@ijs.si) c DATE: Sat Feb 22 15:36:05 CET 2003 c ***************************************************************** implicit none integer M_SCA, M_SCA_VEC, M_SCA_VEC_SCA, MAXATOM, MAXMO, MAXGRID real*8 B2A PARAMETER ( $ M_SCA=1, $ M_SCA_VEC=4, $ M_SCA_VEC_SCA=5, $ B2A=0.529177d0, $ MAXATOM = 5000, $ MAXMO = 1000, $ MAXGRID = 1000 $ ) character filename*256, title*80, mode*1, fileout*256 integer n(3), !increments $ mo_index(MAXMO), !indices of MOs $ nat(MAXATOM), $ natoms, narg, i, i1, i2, i3, j, imo, nmo, imode logical lmo !do we have MO plot real*8 c, ! charge $ xo(3), !origin $ dx(3,3), !increments $ v(3,3), !spanning vectors $ val(MAXGRID,MAXMO), !values in cubefile $ x(MAXATOM), y(MAXATOM), z(MAXATOM) lmo=.false. narg = iargc() if (narg.ne.2) $ stop 'Usage: cube2xsf mode cubefile' call getarg(1,mode) call getarg(2,filename) read(mode,*) imode if (imode.ne.1) then write(*,*) 'imode.gt.1 not implemented' STOP endif open(unit=1, file=filename(1:len(filename)), status='old') read(1,'(a80)') title read(1,'(a80)') title read(1,*) natoms, (xo(i),i=1,3) do i=1,3 read(1,*) n(i), (dx(i,j),j=1,3) enddo if ( n(3) .gt. MAXGRID ) $ STOP 'NZ > MAXGRID, increase MAXGRID parameter' c calculate the spanning vectors do i=1,3 do j=1,3 c matrix array is as: v(#,xyz) v(i,j) = dble(n(i)-1)*dx(i,j) enddo enddo c ** c ** do we have MO plot ??? c ** if ( natoms .lt. 0 ) then lmo=.true. natoms=-1*natoms endif c ** c ** fastest runing direction in G98 is 1,2,3 and the corrsponding in c ** XSF is 3,2,1; CORRECT THAT do i=1,natoms read(1,*) nat(i), c, x(i), y(i), z(i) x(i) = x(i) * B2A y(i) = y(i) * B2A z(i) = z(i) * B2A c write(*,'(i3,2x,3f12.6)') nat, x*B2A, y*B2A, z*B2A enddo nmo=1 if (lmo) then read(1,'(10I5:)') nmo, (mo_index(i),i=1,nmo) else mo_index(1)=1 endif if ( nmo .gt. MAXMO ) $ STOP 'NMO > MAXMO, increase MAXMO parameter' c ** c ** write XSF DATAGRID header c ** do imo=1,nmo if (lmo) then write(fileout,'(''mo-'',i3.3,''.xsf'')') mo_index(imo) else write(fileout,'(''denpot.xsf'')') endif open(unit=9+imo, file=fileout, status='unknown') write(9+imo,'(1x,a5)') 'ATOMS' do i=1,natoms write(9+imo,'(i3,2x,3f12.6)') nat(i), x(i), y(i), z(i) enddo write(9+imo,'(a)') 'BEGIN_BLOCK_DATAGRID_3D' if(lmo)then write(9+imo,'(a16,i3.3)') 'g98_3D_ORBITAL_#',mo_index(imo) else write(9+imo,'(a)') 'g98_3D_unknown' endif write(9+imo,'(a)') 'DATAGRID_3D_g98Cube' write(9+imo,*) n(3),n(2),n(1) write(9+imo,'(3e20.12)') (xo(i)*B2A,i=1,3) do i=3,1,-1 write(9+imo,'(3e20.12)') (v(i,j)*B2A,j=1,3) enddo enddo c write values to XSF files do i1=1,n(1) do i2=1,n(2) c read(1,'(6(E13.5):)') ((val(i3,j),j=1,nmo),i3=1,n(3)) c c Michael Rutter requested for the free format reading of cube c file. Let's see how this will work. c read(1,err=99,fmt=*) ((val(i3,j),j=1,nmo),i3=1,n(3)) do imo=1,nmo write(9+imo,'(6(E13.5):)') (val(i3,imo),i3=1,n(3)) enddo enddo enddo 100 continue c write XFS footer do imo=1,nmo write(9+imo,'(a)') 'END_DATAGRID_3D' write(9+imo,'(a)') 'END_BLOCK_DATAGRID_3D' enddo goto 999 99 continue c error occured during reading write(*,*) 'Error reading CUBE datagrid: i1 =', i1, '; i2 =', i2 write(*,*) ' current i3 and imo = ', i3, imo goto 100 999 continue END xcrysden-1.6.2/F/wigner.f0000644000175000017500000003406613513100316013704 0ustar tonetone SUBROUTINE WignerSeitz(srcvec,word) implicit none include 'voronoi.inc' REAL*8 srcvec(3,3), vec(3,3) CHARACTER*(*) word c this SUBROUTINE is not efficient but is very simple !!! REAL*8 * vertex(3,MAX_VERT),!VERTICES OF VORONOI POLIHEDRA * point(4,MAXPOI), !equation of plane: ax+by+cz=d; point = (a,b,c,d) * vect1(3), !arbitrary vector 1 * vect2(3), !arbitrary vector 2 * nml(3), ! nml=vect1 x vect2 * t(3) INTEGER * vindex(3,MAX_VERT), !information of vertex's indices * indexlist(MAX_POLY), !list of all-different indices * iverplane(MAX_PL_VER,MAX_POLY), !indices of vertices in plane/polygon * iverplane2(MAX_PL_VER,MAX_POLY), !copy of iverplane * nverplane(MAX_POLY), !number of vertices in plane/polygon * icc(3) LOGICAL * activ(MAX_PL_VER,MAX_POLY), !flag for iverplane(,) * newvertex, lnew, lplane, equal12, equal13, equal23, equalvert INTEGER i, j, k, ic, jc, kc, icc1, lc, lc1, ideb, ii, jj, kk, $ iverIC, iverJC, iverKC, l, nind, nplane, nver, nvpl, nvpl2, $ npoi REAL*8 det3x3d, det, detx, dety, detz, di, dj, dk, dist1, dist2, $ px, py, pz, size, VecSize, gett3 c NPOI.........number of point c NVER.........number of vertices c NIND.........number of different indices and planes that polihedra c is made of c NVPL.........number of vertex in polygon/plane C =========================================== C |11 21 31| |x1 x2 x3| C VEC = |12 22 32| => VEC = |y1 y2 y3| C |13 23 33| |z1 z2 z3| C =========================================== ! ! if lattice vectors are not reduced, reduce them ! call ReduceBasis3d(srcvec,vec) ! *** do i=1,MAX_POLY do j=1,MAX_PL_VER activ(MAX_PL_VER,MAX_POLY) = .false. enddo enddo Write(12,'(1x,a)') word c make all neighbour points of origin (0,0,0); there are 26 such c points for the first star, and 124 such points for the 1st+2nd c star; using 2nd star should be enough for most cases ... NPOI=0 do i = -2, 2 do j = -2, 2 do k = -2, 2 if(i.ne.0 .or. j.ne.0 .or. k.ne.0)then !disregard point(0,0,0) di=dble(i) dj=dble(j) dk=dble(k) NPOI=NPOI+1 c equation of plane: ax+by+cz=d, point = (a,b,c,d) point(1,NPOI)=di*vec(1,1) + dj*vec(2,1) + dk*vec(3,1) point(2,NPOI)=di*vec(1,2) + dj*vec(2,2) + dk*vec(3,2) point(3,NPOI)=di*vec(1,3) + dj*vec(2,3) + dk*vec(3,3) point(4,NPOI)=0.5d0 * ( * point(1,NPOI)*point(1,NPOI) + * point(2,NPOI)*point(2,NPOI) + * point(3,NPOI)*point(3,NPOI)) endif enddo enddo enddo C find vertices as intersections of three planes; C planes are made at the middle of origin and points NVER=0 do i=1,NPOI-2 do j=i+1,NPOI-1 do k=j+1,NPOI det=det3x3d( * point(1,i), point(1,j), point(1,k), * point(2,i), point(2,j), point(2,k), * point(3,i), point(3,j), point(3,k)) if(abs(det).gt.MAXERR)then detx=det3x3d( * point(4,i), point(4,j), point(4,k), * point(2,i), point(2,j), point(2,k), * point(3,i), point(3,j), point(3,k)) dety=det3x3d( * point(1,i), point(1,j), point(1,k), * point(4,i), point(4,j), point(4,k), * point(3,i), point(3,j), point(3,k)) detz=det3x3d( * point(1,i), point(1,j), point(1,k), * point(2,i), point(2,j), point(2,k), * point(4,i), point(4,j), point(4,k)) px=detx/det py=dety/det pz=detz/det C if vertex is closer to origin than to any other point, C than we have new vertex l=0 newvertex=.true. do while (newvertex .and. l.lt.NPOI) l=l+1 dist1=dsqrt(px*px + py*py + pz*pz) dist2=dsqrt( * (px-point(1,l))*(px-point(1,l)) + * (py-point(2,l))*(py-point(2,l)) + * (pz-point(3,l))*(pz-point(3,l))) if(dist1.gt.(dist2 + MAXERR)) newvertex=.false. enddo if(newvertex) then NVER=NVER+1 vertex(1,NVER) = px vertex(2,NVER) = py vertex(3,NVER) = pz vindex(1,NVER) = i vindex(2,NVER) = j vindex(3,NVER) = k endif endif enddo enddo enddo c --- --- DEBUG_BEGIN --- --- PRINT *,'ALL VERICES OF VORONOI: NVER=',NVER do i=1,NVER WRITE(*,*) (vertex(j,i),j=1,3),'; --> ', * (vindex(j,i),j=1,3) enddo WRITE(*,*) ' ' c --- --- DEBUG_END --- --- c number of planes that a polyhedra is made of, is the number of different c indices, that appear in vindex(,). Each index represents one plane. c search for all different indices NIND=0 do i=1,NVER do ii=1,3 lnew=.true. j=1 do while(lnew .and. j.le.NIND) if(indexlist(j).eq.vindex(ii,i)) lnew=.false. j=j+1 enddo if(lnew)then NIND=NIND+1 indexlist(NIND)=vindex(ii,i) endif enddo enddo c --- --- DEBUG_BEGIN --- --- WRITE(*,*)'INDEX LIST:' do i=1,NIND WRITE(*,*) i,': ',indexlist(i) enddo WRITE(*,*)' ' c --- --- DEBUG_END --- --- c so we have NIND different planes; if vertex has index M, that means c that it is a member of Mth plane; make plane data structure c c some vertices that belong to one plane may be identical or colinear, c get rid of that vertices NPLANE=0 do i=1,NIND NVPL=0 !number of vertex in polygon/plane lplane=.true. do j=1,NVER do jj=1,3 if(vindex(jj,j).eq.indexlist(i)) then c vertex 'j' belongs to plane 'i' NVPL=NVPL+1 iverplane(NVPL,i)=j activ(NVPL,i)=.true. nverplane(i)=NVPL endif enddo enddo c if NVPL<3 -> this is not a plane; disregard if(NVPL.lt.3) lplane=.false. c get rid of colinear and identical points if(lplane)then do ic=1,NVPL-2 if(activ(ic,i)) then do jc=ic+1,NVPL-1 if(activ(jc,i))then do kc=jc+1,NVPL if(activ(kc,i))then iverIC=iverplane(ic,i) iverJC=iverplane(jc,i) iverKC=iverplane(kc,i) c get rid of identical points equal12 = * abs(vertex(1,iverIC)-vertex(1,iverJC)).lt.MAXERR2 .and. * abs(vertex(2,iverIC)-vertex(2,iverJC)).lt.MAXERR2 .and. * abs(vertex(3,iverIC)-vertex(3,iverJC)).lt.MAXERR2 equal13 = * abs(vertex(1,iverIC)-vertex(1,iverKC)).lt.MAXERR2 .and. * abs(vertex(2,iverIC)-vertex(2,iverKC)).lt.MAXERR2 .and. * abs(vertex(3,iverIC)-vertex(3,iverKC)).lt.MAXERR2 equal23 = * abs(vertex(1,iverJC)-vertex(1,iverKC)).lt.MAXERR2 .and. * abs(vertex(2,iverJC)-vertex(2,iverKC)).lt.MAXERR2 .and. * abs(vertex(3,iverJC)-vertex(3,iverKC)).lt.MAXERR2 equalvert=.true. if(equal12.and.equal13)then c all three points are identical c disregard with lower indices: ic < jc < kc activ(ic,i)=.false. activ(jc,i)=.false. elseif(equal12)then activ(ic,i)=.false. elseif(equal13)then activ(ic,i)=.false. elseif(equal23)then activ(jc,i)=.false. else equalvert=.false. endif c --- --- DEBUG_BEGIN --- --- c PRINT *,'i=',i,'; equalvert=',equalvert c --- --- DEBUG_BEGIN --- --- if(.not.equalvert)then do lc=1,3 vect1(lc) = vertex(lc,iverJC) * - vertex(lc,iverIC) vect2(lc) = vertex(lc,iverKC) * - vertex(lc,iverIC) enddo CALL VecProduct(vect1,vect2,nml) size = VecSize(nml) c --- --- DEBUG_BEGIN --- --- c PRINT *,'SIZE>', c * (vertex(lc,iverplane(ic,i)) c * ,vertex(lc,iverplane(jc,i)) c * ,vertex(lc,iverplane(kc,i)),lc=1,3) c PRINT *,'SIZE::',size,'MAXERR2::',MAXERR2 c --- --- DEBUG_END --- --- if(abs(size).lt.MAXERR2)then c colinear points; disregard middle point icc(1)=ic icc(2)=jc icc(3)=kc t(1)=0.0d0 t(2)=1.0d0 t(3)=gett3( * vertex(1,iverIC), * vertex(1,iverJC), * vertex(1,iverKC)) do lc=2,3 icc1=icc(lc) do lc1=lc-1,1,-1 if(t(lc1).lt.t(icc1)) * goto 101 icc(lc1+1)=icc(lc1) enddo lc1=0 101 icc(lc1+1)=icc1 enddo c --- --- DEBUG_BEGIN --- --- c PRINT *,'i=',i, c * ';SORTING ORDER OF VERT:' c PRINT *,'ic=',ic,'; ', c * (vertex(iver,iverplane(icc(1),i)),iver=1,3) c PRINT *,'jc=',jc,'; ', c * (vertex(iver,iverplane(icc(2),i)),iver=1,3) c PRINT *,'kc=',kc,'; ', c * (vertex(iver,iverplane(icc(3),i)),iver=1,3) c --- --- DEBUG_END --- --- activ(icc(2),i)=.false. !middle point disregarded endif !if(abs(size).lt.MAXERR2)then endif !if(.not.equalvert)then endif enddo !kc endif enddo !jc endif enddo !ic if(lplane)then NVPL2=0 do ic=1,NVPL c --- --- DEBUG_BEGIN --- --- c PRINT *,'ic=',ic,'; activ(ic,i)=',activ(ic,i) c PRINT *,(vertex(lc,iverplane(ic,i)),lc=1,3) c --- --- DEGUB_END --- --- if(activ(ic,i))then NVPL2=NVPL2+1 iverplane2(NVPL2,nplane+1)=iverplane(ic,i) nverplane(nplane+1)=NVPL2 endif enddo endif endif if(lplane .and. NVPL2.gt.2) then NPLANE=NPLANE+1 c --- --- DEBUG_BEGIN --- --- WRITE(*,*)'PLANE N.:',i,'; NVPL2=',NVPL2,'; NVPL',NVPL, * '; INDEX LIST/VERTEX LIST' do ideb=1,NVPL2 WRITE(*,*) iverplane2(ideb,nplane),'; ', * (vertex(j,iverplane2(ideb,nplane)),j=1,3) enddo WRITE(*,*)'NUMBER OF PLANES: ',nplane c --- --- DEBUG_END --- --- NVPL=0 c now we have nverplane(i) vertices in plane i; make Convex Hull c for that plane CALL ConvexHull(nplane,iverplane2,NVPL2,vertex) endif enddo Write(12,'(1x,a,"_END")') word RETURN END c ==================================== c equation of line: x = x1 + t(x2-x1) c function return a t3 for third point c ==================================== REAL*8 FUNCTION GETT3(ver1,ver2,ver3) IMPLICIT none include 'voronoi.inc' REAL*8 ver1(3), ver2(3), ver3(3) !three vertices REAL*8 dx, dy, dz, sum dx = ver2(1)-ver1(1) dy = ver2(2)-ver1(2) dz = ver2(3)-ver1(3) sum = dx+dy+dz if(abs(sum).lt.MAXERR) then if(abs(dx).gt.MAXERR) then sum=dx elseif(abs(dy).gt.MAXERR) then sum=dy elseif(abs(dy).gt.MAXERR) then sum=dz else gett3=0.0d0 !three points overlap return endif endif gett3 = (ver3(1)+ver3(2)+ver3(3) - ver1(1)+ver1(2)+ver1(3)) / sum return END xcrysden-1.6.2/F/box.f0000644000175000017500000002446011712736221013207 0ustar tonetoneC ************************************************************************ C ** rutina pove, ce je tocka(R1,R2,R3) na isti strani ravnine kot DVEC[k] C ** *** ravnino dolocata vector DVEC[i],DVEC[j] in tocka(P1,P2,P3) ***** LOGICAL FUNCTION ISINSIDE(DVEC,I,J,K,P1,P2,P3,R1,R2,R3) REAL*8 DVEC(3,3),P1,P2,P3,R1,R2,R3,KFC,MINTOL REAL*8 A,B,C !components of normal vector REAL*8 D ! Ax + By + Cz + D = 0 C if k<0 negative=.true.; third vector is turned upside down LOGICAL NEGATIVE PARAMETER (MINTOL=1.0d-3) c print *,p1,p2,p3,r1,r2,r3,i,j,k c print *,'k=',k NEGATIVE=.FALSE. ISINSIDE=.FALSE. kk=k IF(KK.LT.0)THEN KK=-KK NEGATIVE=.true. ENDIF A=DVEC(I,2)*DVEC(J,3)-DVEC(J,2)*DVEC(I,3) B=DVEC(I,3)*DVEC(J,1)-DVEC(J,3)*DVEC(I,1) C=DVEC(I,1)*DVEC(J,2)-DVEC(J,1)*DVEC(I,2) IF(A*DVEC(KK,1)+B*DVEC(KK,2)+C*DVEC(KK,3).LT.0.0d0)THEN A=-A B=-B C=-C ENDIF D=-A*P1-B*P2-C*P3 KFC=A*R1+B*R2+C*R3+D IF(KFC.GE.(0.0d0-MINTOL).AND.(.NOT.NEGATIVE)) ISINSIDE=.TRUE. IF(KFC.LE.(0.0d0+MINTOL).AND.NEGATIVE) ISINSIDE=.TRUE. c print *,'INSIDE=',isinside RETURN END SUBROUTINE BOXES IMPLICIT REAL*8 (A-H,O-Z) REAL*8 PLPOINT(3,4,6),PLVEC(3,3,6) INTEGER NPOINT(6),NVEC(6),VECPAIR(2,3,6) REAL*8 MINTOL, NULL COMMON/BOXS/ PLVEC,NVEC,VECPAIR,PLPOINT PARAMETER (CON13=1.0d0/3.0d0, CON23=2.0d0/3.0d0, MINTOL=1.d-6, 1 NULL=0.0d0) C NPOINT(4) TELLS NUMBER OF POINTS FOR EACH "BOX" DATA NPOINT/4,4,3,4,4,3/ C NVEC(4) tells number of vectors for each "box" DATA NVEC/3,3,2,3,3,2/ DATA PLPOINT/ C *** "BOX1" POINTS *** 1 1.0d0, 0.5d0, NULL, 2 CON23, CON13, NULL, 3 CON13, CON23, NULL, 4 0.5d0, 1.0d0, NULL, C *** "BOX2" POINTS *** 1 1.0d0, 0.5d0, NULL, 2 CON23, CON13, NULL, 3 CON13, CON23, NULL, 4 NULL, 0.5d0, NULL, C *** "BOX3" POINTS *** 1 0.5d0, 1.0d0, NULL, 2 CON13, CON23, NULL, 3 NULL, 0.5d0, NULL, 4 NULL, NULL, NULL, !"BOX3" has just three points C *** "BOX4" POINTS *** 1 0.5d0, NULL, NULL, 2 CON23, CON13, NULL, 3 CON13, CON23, NULL, 4 0.5d0, 1.0d0, NULL, C *** "BOX5" POINTS *** 1 0.5d0, NULL, NULL, 2 CON23, CON13, NULL, 3 CON13, CON23, NULL, 4 NULL, 0.5d0, NULL, C *** "BOX6" POINTS *** 1 1.0d0, 0.5d0, NULL, 2 CON23, CON13, NULL, 3 0.5d0, NULL, NULL, 4 NULL, NULL, NULL/ !"BOX6" has just three points c do i=1,6 c do j=1,4 c print *,(plpoint(k,j,i),k=1,3) c enddo c print *,'---------------------' c enddo C FROM POINTS -> VECTORS DO I=1,6 !four boxes DO J=1,NVEC(I) !vectors per boxes DO K=1,3 !xyz coor of point PLVEC(K,J,I)=PLPOINT(K,J+1,I)-PLPOINT(K,J,I) ENDDO write(6,*) (plvec(k,j,i),k=1,3) ENDDO c print *,'------------------------------' ENDDO C **** VECPAIR --- prvi vector je vector, ki skupaj z C tvori ravnino, C **** drugi pa pove katera stran je "prava" DATA VECPAIR/ C *** "BOX1" PAIRS *** 1 1,2, 2 2,3, 3 3,-1, C *** "BOX2" PAIRS *** 1 1,2, 2 2,-3, 3 3,2, C *** "BOX3" PAIRS *** 1 1,2, 2 2,-1, 3 0,0, !BOX3 HAS JUST TWO PAIRS C *** "BOX4" PAIRS *** 1 1,2, 2 2,-3, 3 3,2, C *** "BOX5" PAIRS 1 1,3, 2 2,3, 3 3,-2, C *** "BOX6" PAIRS 1 1,2, 2 2,-1, 3 0,0/ !BOX6 HAS JUST TWO PAIRS RETURN END C tocka1(p1,p2,p3) pove kje je skatla, tocka2(r1,r2,r3) pa katero tocko C ocenjujemo LOGICAL FUNCTION BOX(NBX,P1,P2,P3,R1,R2,R3,DVEC) IMPLICIT REAL*8 (A-H,O-Z) REAL*8 PLPOINT(3,4,6),PLVEC(3,3,6),DVEC(3,3),IDVEC(3,3) INTEGER NVEC(6),VECPAIR(2,3,6),TMPVECP1,TMPVECP2 LOGICAL ISINBOX COMMON/BOXS/ PLVEC,NVEC,VECPAIR,PLPOINT COMMON/IVEC/ IDVEC !inverse matrix of DVEC(3,3) PARAMETER(CON13=1.0d0/3.0d0, CON23=2.0d0/3.0d0) c print *,'IN BOX !!!' BOX=.TRUE. ISIDE=1 NBOX=NBX C if nbox < 0 we must turn around the box IF(NBOX.LT.0)THEN NBOX=-NBOX ISIDE=-1 ENDIF C if we deal with NBOX=2.or.NBOX=4, we will need this x=r1-p1 y=r2-p2 z=r3-p3 C transform (x,y,z) to DVEC basis xx=x*IDVEC(1,1)+y*IDVEC(2,1)+z*IDVEC(3,1) yy=x*IDVEC(1,2)+y*IDVEC(2,2)+z*IDVEC(3,2) zz=x*IDVEC(1,3)+y*IDVEC(2,3)+z*IDVEC(3,3) c print *,'xx,yy,zz>',xx,yy,zz DO I=1,NVEC(NBOX) c print *,'INVEC=',i TMPVECP1=VECPAIR(1,I,NBOX) TMPVECP2=ISIDE*VECPAIR(2,I,NBOX) c print *,'vec1=',tmpvecp1 c print *,'vec2=',tmpvecp2 C IS POINT(R1,R2,R3) ON THE RIGHT SIDE OF THE PLANE C POINT1(PX,PY,PZ) MUST BE CALCULATED c take into account that plpoint(3,*,*) is always ZERO !!! PX=P1+PLPOINT(1,I,NBOX)*DVEC(1,1)+PLPOINT(2,I,NBOX)*DVEC(2,1) PY=P2+PLPOINT(1,I,NBOX)*DVEC(1,2)+PLPOINT(2,I,NBOX)*DVEC(2,2) PZ=P3+PLPOINT(1,I,NBOX)*DVEC(1,3)+PLPOINT(2,I,NBOX)*DVEC(2,3) c print *,'PXYZ> ',px,py,pz C **************************** C *** handle BOXES 1,3,5,6 *** C **************************** if(nbox.ne.2.and.nbox.ne.4)then if(.not.isinbox(nbox,tmpvecp1,tmpvecp2, 1 px,py,pz,r1,r2,r3,dvec)) box=.false. endif C ********************************** C *** *** handle BOXES 2 & 4 *** *** C ********************************** if(nbox.eq.2.or.nbox.eq.4)then C *** "BOX2" **** if(nbox.eq.2)then C is r1,r2,r3 in the 3th part of the box; C for 3th part i must be 1 -> this means: first point and first vector if(i.eq.1.and.xx.ge.CON23)then c print *,'PART> 3th',xx if(.not.isinbox(nbox,tmpvecp1,tmpvecp2, 1 px,py,pz,r1,r2,r3,dvec)) box=.false. endif C is r1,r2,r3 in the 2nd part of the box if(i.eq.2.and.xx.ge.CON13.and. 1 xx.lt.CON23)then c print *,'PART> 2nd',xx if(.not.isinbox(nbox,tmpvecp1,tmpvecp2, 1 px,py,pz,r1,r2,r3,dvec)) box=.false. endif C is r1,r2,r3 in the first part of the box if(i.eq.3.and.xx.lt.CON13)then c print *,'PART> 1st' if(.not.isinbox(nbox,tmpvecp1,tmpvecp2, 1 px,py,pz,r1,r2,r3,dvec)) box=.false. endif C *** "BOX4" *** elseif(nbox.eq.4)then C is r1,r2,r3 in the 3th part of the box; C for 3th part i must be 3 -> this means third point & 3th vector if(i.eq.3.and.yy.ge.CON23)then c print *,'PART> 3th',i,yy if(.not.isinbox(nbox,tmpvecp1,tmpvecp2, 1 px,py,pz,r1,r2,r3,dvec)) box=.false. endif C is r1,r2,r3 in the 2nd part of the box if(i.eq.2.and.yy.ge.CON13.and. 1 yy.lt.CON23)then c print *,'PART> 2nd',i,yy if(.not.isinbox(nbox,tmpvecp1,tmpvecp2, 1 px,py,pz,r1,r2,r3,dvec)) box=.false. endif C is r1,r2,r3 in the first part of the box if(i.eq.1.and.yy.lt.CON13)then c print *,'PART> 1st',i,yy if(.not.isinbox(nbox,tmpvecp1,tmpvecp2, 1 px,py,pz,r1,r2,r3,dvec)) box=.false. endif endif !BOX4 endif !BOX4.OR.BOX2 enddo !DO I=1,NVEC(NBOX) RETURN END LOGICAL FUNCTION ISINBOX(NBOX,NVC1,NVC2,P1,P2,P3,R1,R2,R3,dvec) REAL*8 P1,P2,P3,R1,R2,R3 REAL*8 DVEC(3,3),MINTOL REAL*8 A,B,C !components of normal vector REAL*8 D,KFC ! Ax + By + Cz + D = 0 REAL*8 AVEC,BVEC,CVEC,AVEC2,BVEC2,CVEC2 C if k<0 negative=.true.; third vector is turned upside down LOGICAL NEGATIVE REAL*8 PLPOINT(3,4,6),PLVEC(3,3,6) INTEGER NVEC(6),VECPAIR(2,3,6) COMMON/BOXS/ PLVEC,NVEC,VECPAIR,PLPOINT PARAMETER (MINTOL=1.0d-6) NVEC1=NVC1 NVEC2=NVC2 c print *,'nvec1=',nvec1,'nvec2=',nvec2 NEGATIVE=.FALSE. ISINBOX=.FALSE. IF(NVEC2.LT.0.)THEN NVEC2=-NVEC2 NEGATIVE=.TRUE. ENDIF C plvec is in coloumn major mode, but dvec is in row-major mode C *** transform plvec1 in XYZ basis *** AVEC=DVEC(1,1)*PLVEC(1,NVEC1,NBOX)+DVEC(2,1)*PLVEC(2,NVEC1,NBOX)+ 1 DVEC(3,1)*PLVEC(3,NVEC1,NBOX) BVEC=DVEC(1,2)*PLVEC(1,NVEC1,NBOX)+DVEC(2,2)*PLVEC(2,NVEC1,NBOX)+ 1 DVEC(3,2)*PLVEC(3,NVEC1,NBOX) CVEC=DVEC(1,3)*PLVEC(1,NVEC1,NBOX)+DVEC(2,3)*PLVEC(2,NVEC1,NBOX)+ 1 DVEC(3,3)*PLVEC(3,NVEC1,NBOX) A=BVEC*DVEC(3,3)-DVEC(3,2)*CVEC B=CVEC*DVEC(3,1)-DVEC(3,3)*AVEC C=AVEC*DVEC(3,2)-DVEC(3,1)*BVEC C *** transform plvec2 in XYZ basis *** AVEC2=DVEC(1,1)*PLVEC(1,NVEC2,NBOX)+DVEC(2,1)*PLVEC(2,NVEC2,NBOX)+ 1 DVEC(3,1)*PLVEC(3,NVEC2,NBOX) BVEC2=DVEC(1,2)*PLVEC(1,NVEC2,NBOX)+DVEC(2,2)*PLVEC(2,NVEC2,NBOX)+ 1 DVEC(3,2)*PLVEC(3,NVEC2,NBOX) CVEC2=DVEC(1,3)*PLVEC(1,NVEC2,NBOX)+DVEC(2,3)*PLVEC(2,NVEC2,NBOX)+ 1 DVEC(3,3)*PLVEC(3,NVEC2,NBOX) IF(A*AVEC2+B*BVEC2+C*CVEC2.LT.0.0d0)THEN A=-A B=-B C=-C ENDIF c print *,'PLVEC:',PLVEC(1,NVEC1,NBOX),PLVEC(2,NVEC1,NBOX), c 1 PLVEC(3,NVEC1,NBOX)*DVEC(3,1) c print *,'DVEC',DVEC(3,1),DVEC(3,2),DVEC(3,3) c print *,'p1,p2,p3=',p1,p2,p3 c print *,'r1,r2,r3=',r1,r2,r3 D=-A*P1-B*P2-C*P3 c print *,'a,b,c,d::',a,b,c,d KFC=A*R1+B*R2+C*R3+D c print *,'kfc1=',kfc,', kfc2=',A*R1+B*R2+C*R3-(-A*P1-B*P2-C*P3) IF(KFC.GE.(0.0d0-MINTOL).AND.(.NOT.NEGATIVE)) ISINBOX=.TRUE. IF(KFC.LE.(0.0d0+MINTOL).AND.NEGATIVE) ISINBOX=.TRUE. c print *,"ISINBOX=",isinbox RETURN END xcrysden-1.6.2/F/atoms.inc0000644000175000017500000000251311712736221014061 0ustar tonetone DATA ATOM/ $ 'H ','He','Li','Be','B ','C ','N ','O ', $ 'F ','Ne','Na','Mg','Al','Si','P ','S ', $ 'Cl','Ar','K ','Ca','Sc','Ti','V ','Cr', $ 'Mn','Fe','Co','Ni','Cu','Zn','Ga','Ge', $ 'As','Se','Br','Kr','Rb','Sr','Y ','Zr', $ 'Nb','Mo','Tc','Ru','Rh','Pd','Ag','Cd', $ 'In','Sn','Sb','Te','I ','Xe','Cs','Ba', $ 'La','Ce','Pr','Nd','Pm','Sm','Eu','Gd', $ 'Tb','Dy','Ho','Er','Tm','Yb','Lu','Hf', $ 'Ta','W ','Re','Os','Ir','Pt','Au','Hg', $ 'Tl','Pb','Bi','Po','At','Rn','Fr','Ra', $ 'Ac','Th','Pa','U ','Np','Pu','Am','Cm', $ 'Bk','Cf','Es','Fm'/ DATA ATOM_UPPER/ $ 'H ','HE','LI','BE','B ','C ','N ','O ', $ 'F ','NE','NA','MG','AL','SI','P ','S ', $ 'CL','AR','K ','CA','SC','TI','V ','CR', $ 'MN','FE','CO','NI','CU','ZN','GA','GE', $ 'AS','SE','BR','KR','RB','SR','Y ','ZR', $ 'NB','MO','TC','RU','RH','PD','AG','CD', $ 'IN','SN','SB','TE','I ','XE','CS','BA', $ 'LA','CE','PR','ND','PM','SM','EU','GD', $ 'TB','DY','HO','ER','TM','YB','LU','HF', $ 'TA','W ','RE','OS','IR','PT','AU','HG', $ 'TL','PB','BI','PO','AT','RN','FR','RA', $ 'AC','TH','PA','U ','NP','PU','AM','CM', $ 'BK','CF','ES','FM'/ xcrysden-1.6.2/F/str2xcr.f0000644000175000017500000002501611712736221014024 0ustar tonetonec -------------------------------------------------------------------------- c Peter BLAHA, Inst.f.Techn.Elektrochemie, TU Vienna, A-1060 Vienna c Phone: +43-1-58801-5187 FAX: +43-1-5868937 c Email: pblaha@email.tuwien.ac.at WWW: http://www.tuwien.ac.at/theochem/ c -------------------------------------------------------------------------- c ****************************************************************** c Changes made by Tone Kokalj, Date: Mon Jul 13 15:36:23 CEST 1998 c c 1. filename is now specified as command line argument c 2. conversion from fractional coordinates to Cartesian was changed c c where change was made -> I signed as t.k c ****************************************************************** program str2xcr C implicit real*8 (a-h,o-z) parameter (nato=100000) character*4 typ dimension x(4,nato),klz(nato) dimension con(3,3),bra(3,3) !t.k logical rhombo !t.k C x.....Atomkoordinaten, Kugelradius C klz...Kernladungszahl c * c * rhombo = .true. when system is rhombohedral; c * because constants are specified as conventional (hexagonal), c * but fractional coordinates are specified as c * primitive (rhombohedral) c * rhombo=.false. !t.k call o_file C oeffnet die noetigen files (fehlerkontrolle)! call matrix(nat,typ,a,b,c,bra,con,rhombo) !t.k C schreibt bravais-matrix, uebergibt nat (number of atoms) call koord(nat,nato,na,x,klz) call writeStr(na,x,klz,typ,a,b,c,bra,con,rhombo) !t.k call option end subroutine o_file character*256 namstr,namlat character*10 test call GetArg(1,namstr) !t.k do 1000 i=256,1,-1 1000 if(namstr(i:i).ne.' ') goto 1010 1010 if(i.gt.110)goto 9992 namlat=namstr namstr(i+1:i+7)='.struct' namlat(i+1:i+4)='.xcr' open(unit=1,file=namstr,form='formatted',status='old',err=9993) open(unit=2,file=namlat,form='formatted', $ status='unknown',err=9994) return 9992 write(*,*)'Filename too long' stop 9993 write(*,*)'struct-File does not exist' stop 9994 write(*,*)'File ',namlat(1:i+4),' already exists.' write(*,*)' Overwrite (y/n)?' read(*,99901)test if(test.eq.'y' .or. test.eq.'Y') then open(unit=2,file=namlat,form='formatted') return else stop endif 99900 format(a80) 99901 format(a1) end subroutine matrix(nat,typ,a,b,c,bra,con,rhombo) !t.k implicit real*8 (a-h,o-z) dimension bra(3,3),con(3,3) !t.k character*4 typ logical rhombo !t.k character*79 title c * c * con(3,3) is matrix that holds the conventional vectors c * do 10 i=1,3 do 10 j=1,3 con(j,i)=0.0d0 !t.k bra(j,i)=0.0d0 10 continue read(1,99900) title write(2,*) 'INFO' !t.k write(2,*) title write(2,*) 'END_INFO' read(1,99901) typ,nat read(1,99902) read(1,99903) a,b,c,alpha,beta,gamma if(alpha.eq.0d0) alpha=90d0 if(beta .eq.0d0) beta =90d0 if(gamma.eq.0d0) gamma=90d0 pi = 4.d0*atan(1.d0) gamma1= gamma*pi/180.d0 beta1 = beta*pi/180.d0 alpha1= alpha*pi/180.d0 cosg1 =(cos(gamma1)-cos(alpha1)*cos(beta1))/sin(alpha1)/sin(beta1) gamma0=acos(cosg1) c gamma=gamma*acos(0d0)/90d0 cIGROUP: c 1.....P centered c 2.....A centered c 3.....B centered (not body, but B-face) c 4.....C centered c 5.....F centered c 6.....I centered (body centered) c 7.....R centered (rhomohedral) c 8.....H centered (hexagonal) (space groups: 168-194) c 9.....TRIGONAL_NOT_RHOMBOHEDRAL (space groups: 143-167) c umrechnung ins bogenmass c this is ussualy used; if not it will be changed when needed con(1,1)=a !t.k con(2,2)=b !t.k con(3,3)=c !t.k if(typ(1:3).eq.'CXY') then bra(1,1)=a/2d0 bra(2,1)=-b/2d0 bra(1,2)=a/2d0 bra(2,2)=b/2d0 bra(3,3)=c igroup=4 else if (typ(1:3).eq.'CYZ') then bra(1,1)=a bra(2,2)=-b/2d0 bra(3,2)=c/2 bra(2,3)=b/2d0 bra(3,3)=c/2d0 igroup=2 else if(typ(1:3).eq.'CXZ') then con(1,1)=a*sin(gamma1) !t.k con(2,1)=a*cos(gamma1) !t.k bra(1,1)=a*sin(gamma1)/2d0 bra(2,1)=a*cos(gamma1)/2d0 bra(3,1)=-c/2d0 bra(2,2)=b bra(1,3)=a*sin(gamma1)/2d0 bra(2,3)=a*cos(gamma1)/2d0 bra(3,3)=c/2d0 igroup=3 else if(typ(1:1).eq.'P') then bra(1,1)=a*sin(gamma0)*sin(beta1) bra(2,1)=a*cos(gamma0)*sin(beta1) bra(3,1)=a*cos(beta1) bra(1,2)=0.0d0 bra(2,2)=b*sin(alpha1) bra(3,2)=b*cos(alpha1) bra(1,3)=0.0d0 bra(2,3)=0.0d0 bra(3,3)=c do i=1,3 do j=1,3 con(i,j)=bra(i,j) !conventional vectors equal to primitive enddo enddo c *** OLD (no triclini lattice) *** c con(1,1)=a*sin(gamma) !t.k c con(2,1)=a*cos(gamma) !t.k c bra(1,1)=a*sin(gamma) c bra(2,1)=a*cos(gamma) c bra(2,2)=b c bra(3,3)=c igroup=1 else if(typ(1:1).eq.'F') then bra(1,1)=a/2d0 bra(2,1)=b/2d0 bra(1,2)=a/2d0 bra(3,2)=c/2d0 bra(2,3)=b/2d0 bra(3,3)=c/2d0 igroup=5 else if(typ(1:1).eq.'B') then c Florent suggested this: bra(1,1)=-a/2d0 bra(2,1)=b/2d0 bra(3,1)=c/2d0 bra(1,2)=a/2d0 bra(2,2)=-b/2d0 bra(3,2)=c/2d0 bra(1,3)=a/2d0 bra(2,3)=b/2d0 bra(3,3)=-c/2d0 igroup=6 c bra(1,1)=a/2d0 c bra(2,1)=-b/2d0 c bra(3,1)=c/2d0 c bra(1,2)=a/2d0 c bra(2,2)=b/2d0 c bra(3,2)=-c/2d0 c bra(1,3)=-a/2d0 c bra(2,3)=b/2d0 c bra(3,3)=c/2d0 c igroup=6 else if(typ(1:1).eq.'R') then rhombo=.true. !t.k c conventional vectors are hexagonal con(1,1)=a*sqrt(3d0)/2d0 con(2,1)=-a/2d0 bra(1,1)=a/sqrt(3d0)/2d0 bra(2,1)=-a/2d0 bra(3,1)=c/3d0 bra(1,2)=a/sqrt(3d0)/2d0 bra(2,2)=a/2d0 bra(3,2)=c/3d0 bra(1,3)=-a/sqrt(3d0) bra(3,3)=c/3d0 igroup=7 else if(typ(1:1).eq.'H') then c conventional and primitive vectors are the same in this case con(1,1)=a*sqrt(3d0)/2d0 !t.k con(2,1)=-a/2d0 !t.k bra(1,1)=a*sqrt(3d0)/2d0 bra(2,1)=-a/2d0 bra(2,2)=a bra(3,3)=c igroup=8 else goto 9990 end if write(2,*) 'DIM-GROUP' write(2,*) 3,igroup write(2,*) 'PRIMVEC' write(2,99904) bra write(2,*) 'CONVVEC' write(2,99904) con write(2,*) 'SYMMOP' write(2,*) 1 write(2,*) 1.d0,0.d0,0.d0 write(2,*) 0.d0,1.d0,0.d0 write(2,*) 0.d0,0.d0,1.d0 write(2,*) 0.d0,0.d0,0.d0 return 9990 write(*,*)'Unknown lattice type' stop 99900 format(a79) 99901 format(a4,23x,i3) 99902 format(13x,a4) 99903 format(6F10.7) 99904 format(2(3F15.9/),3f15.9) end subroutine koord(nat,nato,na,x,klz) implicit real*8 (a-h,o-z) dimension x(4,*),klz(*) na=0 do 10 i=1,nat na=na+1 if(na.gt.nato) goto 9990 read(1,99990)x(1,na),x(2,na),x(3,na) read(1,99991)mult do 11 im=2,mult na=na+1 if(na.gt.nato) goto 9990 11 read(1,99990)x(1,na),x(2,na),x(3,na) read(1,99992)rmt,z do 12 im=na-mult+1,na x(4,im)=rmt/3d0 12 klz(im)=z read(1,99993) read(1,99993) 10 read(1,99993) return 9990 write(*,*)'Too many atoms. Increase parameter nato in source ', c'code.' stop 99990 format(5x,3x,4x,f10.7,3x,f10.7,3x,f10.7) 99991 format(15x,i2,17x,i2) 99992 format(10x,5x,5x,5x,10x,5x,f10.5,5x,f5.2) 99993 format(20x,3f10.8) end subroutine writeStr(na,x,klz,typ,a,b,c,bra,con,rhombo) !t.k implicit real*8 (a-h,o-z) real*8 ibra(3,3) !t.k character*4 typ dimension x(4,*),klz(*),bra(3,3),con(3,3),tmp(3,3) logical rhombo !t.k write(2,*) 'PRIMCOORD' write(2,99900) na, 1 c t.k: changed completely!!! do i=1,na if ( .not. rhombo ) then c from conventional fracional coordinates to Cartesian xx=x(1,i)*con(1,1) + x(2,i)*con(1,2) + x(3,i)*con(1,3) yy=x(1,i)*con(2,1) + x(2,i)*con(2,2) + x(3,i)*con(2,3) zz=x(1,i)*con(3,1) + x(2,i)*con(3,2) + x(3,i)*con(3,3) c ********************************************************* c some obla-di obla-da manipulation will be neccessary !!! c ********************************************************* c AIM: primitive fractional coordinates must be c between [-0.5,0.5); c we must get the corresponding Cartesin coordinates c ********************************************************* c initialise ibra & tmp matrix; tmp is dummy anyway call Invert3x3(bra,ibra) c goto primitive fractional coordinates aa=xx*ibra(1,1) + yy*ibra(1,2) + zz*ibra(1,3) bb=xx*ibra(2,1) + yy*ibra(2,2) + zz*ibra(2,3) cc=xx*ibra(3,1) + yy*ibra(3,2) + zz*ibra(3,3) else c rhobohedral fractional coordinates are already specified in c primitive (rhombohedral) coordinates aa=x(1,i) bb=x(2,i) cc=x(3,i) endif c aa,bb,cc must be in range of (-1,1); aa=aa-dnint(aa) !is this good enough!!!! bb=bb-dnint(bb) cc=cc-dnint(cc) c go back to Cartesian coordinate xx=aa*bra(1,1) + bb*bra(1,2) + cc*bra(1,3) yy=aa*bra(2,1) + bb*bra(2,2) + cc*bra(2,3) zz=aa*bra(3,1) + bb*bra(3,2) + cc*bra(3,3) write(2,99901)klz(i),xx,yy,zz enddo c write(2,99901)x(1,i),x(2,i),x(3,i),x(4,i),klz(i) return 99900 format(2i5) 99901 format(i4,3f15.9) end subroutine option implicit real*8 (a-h,o-z) close(2) write(*,*)'Translation has been finished.' return end xcrysden-1.6.2/F/reduce.f0000644000175000017500000001211613513100622013650 0ustar tonetone!------------------------------------------------------------------------ ! ! below are routines for vector reduction that are needed for proper ! construction of voronoi polyhdra of unreduced lattices ! !------------------------------------------------------------------------ SUBROUTINE ReduceBasis3d(src,dst) ! ! BEWARE: xcrysden usage of vectors in this directory is: ! ! |11 21 31| |x1 x2 x3| ! VEC = |12 22 32| ==> VEC = |y1 y2 y3| ! |13 23 33| |z1 z2 z3| ! ! but the "reduce" routines uses vectors in standard sense, i.e.: ! ! vecA = src(*,1), vecB = src(*,2), vecC = src(*,3) ! ! which is transposed wrt xcrysden usage, hence we will need ! to call MatTranspose 2x ! implicit none REAL*8 src(3,3), dst(3,3), red(3,3) LOGICAL is_basis_reduced ! transpose to vecA = src(*,1), ... call MatTranspose(src,red,3,3) ! vec = src^T if ( .not. is_basis_reduced(red) ) then call reduce_basis_doit(red) endif ! transpose back to vecA = src(1,*), ... call MatTranspose(red,dst,3,3) ! dst = red^T return END SUBROUTINE ReduceBasis2d(src,dst) ! ! BEWARE: xcrysden usage of vectors in this directory is: vecA = src(1,*) ! but the "reduce" routines uses vectors in standard sense, i.e.: vecA = src(*,1), ... ! hence we need to call MatTranspose 2x ! implicit none REAL*8 src(3,3), dst(3,3), red(3,3) ! transpose to vecA = src(*,1), ... call MatTranspose(src,red,3,3) ! vec = src^T call gauss_reduce(red(1,1), red(1,2)) ! vecs A, B ! transpose back to vecA = src(1,*), ... call MatTranspose(red,dst,3,3) ! dst = red^T return END SUBROUTINE reduce_basis_doit(vec) ! BEWARE: vec needs to be in the following form: ! A = src(*,1), B = src(*,2), C = src(*,3) implicit none REAL*8 vec(3,3) LOGICAL reduced, are_dot_products_reduced INTEGER ic, i, j ic = 0 reduced = .false. do while ( .not. reduced) call gauss_reduce(vec(1,2), vec(1,3)) ! vecs B, C call gauss_reduce(vec(1,1), vec(1,3)) ! vecs A, C call gauss_reduce(vec(1,1), vec(1,2)) ! vecs A, B reduced = are_dot_products_reduced(vec) ic = ic + 1 if (ic .gt. 1000) goto 111 enddo 111 continue return END SUBROUTINE gauss_reduce(v1,v2) implicit none real*8 v1(3), v2(3), swap(3), VecSize, ScalarProduct, r integer i, ir logical reduced ! reduced = .false. ! do while ( .not. reduced ) if ( VecSize(v1) - VecSize(v2) .gt. 1d-6 ) $ call anti_swap_v3(v1,v2) ! v1 must be shorter, anti-swap r = ScalarProduct(v1,v2) / ScalarProduct(v1,v1) ir = nint(r) if (ir .ne. 0) then v2(1) = v2(1) - ir*v1(1) v2(2) = v2(2) - ir*v1(2) v2(3) = v2(3) - ir*v1(3) endif reduced = ( VecSize(v2) - VecSize(v1) .gt. -1d-6 ) enddo return END SUBROUTINE anti_swap_v3(v1,v2) implicit none real*8 v1(3), v2(3), swap(3) integer i do i=1,3 swap(i) = -v1(i) v1(i) = v2(i) v2(i) = swap(i) enddo return END SUBROUTINE sort_basis_vecs(v) implicit none REAL*8 v(3,3), VecSize ! BEWARE: "v" needs to be in the following form: ! A = v(*,1), B = v(*,2), C = v(*,3) if ( VecSize(v(1,1)) - VecSize(v(1,2)) .gt. 1d-6 ) $ call anti_swap_v3(v(1,1), v(1,2)) if ( VecSize(v(1,1)) - VecSize(v(1,3)) .gt. 1d-6 ) $ call anti_swap_v3(v(1,1), v(1,3)) if ( VecSize(v(1,2)) - VecSize(v(1,3)) .gt. 1d-6 ) $ call anti_swap_v3(v(1,2), v(1,3)) return END logical function is_basis_reduced(v) implicit none ! BEWARE: "v" needs to be in the following form: ! A = v(*,1), B = v(*,2), C = v(*,3) real*8 v(3,3), VecSize logical are_dot_products_reduced ! check that |a| <= |b| if ( (VecSize(v(1,1)) - VecSize(v(1,2))) .gt. 1d-6 ) then is_basis_reduced=.false. return endif ! dot-products seem to be a sufficient condition ... is_basis_reduced = are_dot_products_reduced(v) return end logical function are_dot_products_reduced(v) implicit none real*8 v(3,3), ScalarProduct ! BEWARE: "v" needs to be in the following form: ! A = v(*,1), B = v(*,2), C = v(*,3) logical ab, ac, bc ab = ( dabs(ScalarProduct(v(1,1),v(1,2))) - 0.5d0* $ ScalarProduct(v(1,1),v(1,1)) .le. 1d-6 ) ac = ( dabs(ScalarProduct(v(1,1),v(1,3))) - 0.5d0* $ ScalarProduct(v(1,1),v(1,1)) .le. 1d-6 ) bc = ( dabs(ScalarProduct(v(1,2),v(1,3))) - 0.5d0* $ ScalarProduct(v(1,2),v(1,2)) .le. 1d-6 ) are_dot_products_reduced = ( ab .and. ac .and. bc ) return END xcrysden-1.6.2/F/wn_readbands.f0000644000175000017500000001521713032733454015050 0ustar tonetone C ********************************************* C *** program based on spag.f program of WIENxx C ********************************************* CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C Program modified for the present purposes by: C C ------ C C Anton Kokalj Email: Tone.Kokalj@ijs.si C C Dept. of Physical and Organic Chemistry Phone: x 386 1 477 3520 C C Jozef Stefan Institute Fax: x 386 1 477 3811 C C Jamova 39, SI-1000 Ljubljana C C SLOVENIA C C C C Source: $TESTS/wnReadBands.f C C ------ C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC c case spaghetti: c set exe = spaghetti c cat << theend > $def c 5 , '$file.insp', 'old','formatted',0 c 6 , '$file.outputsp$updn', 'unknown','formatted',0 c 9 , '$file.qtl$updn', 'unknown','formatted',0 c 10 ,'$file.spaghetti${updn}_ene','unknown','formatted',0 c 11 ,'$file.spaghetti${updn}_ps', 'unknown','formatted',0 c 20 ,'$file.struct', 'old','formatted',0 c 7 ,'$file.output1${updn}', 'old','formatted',0 c theend program ReadBands IMPLICIT REAL*8 (A-H,O-Z) ccc include 'SRC_spaghetti/param.inc' PARAMETER (MINE = 1, MAXE = 2) c character aline*80,fname*80,ram_file*80 CHARACTER*11 STATUS,FORM character k_pat*7,ei_pat*28 character dummy*1,label1*12 character k_name*12,symbol*12,label*12 character title*80,lattice*4 c ccc dimension jatom_list(NATO) ccc dimension eigen(NEVL,NKP),char(NEVL,NKP) ccc dimension n_ene(NKP) ccc dimension vk(3,NKP),k_name(NKP) ccc dimension lines(NKP),xval(NKP) ccc dimension band_w(NEVL,2) real*8,allocatable :: eigen(:,:) integer,allocatable :: n_ene(:) dimension vk(3) real*8,allocatable :: band_w(:,:) real*8 tmp_eigen(9999) dimension qtl(13),icomma(15) ccc logical break(nkp) c data k_pat /' K='/ data ei_pat /'EIGENVALUES BELOW THE ENERGY'/ c call getarg(2,fname) if(fname.eq.' ') call getarg(1,fname) OPEN(1,FILE=fname,STATUS='OLD',ERR=8000) 8003 READ(1,*,END=8001) IUNIT,FNAME,STATUS,FORM,IRECL OPEN(IUNIT,FILE=FNAME,STATUS=STATUS,FORM=FORM, * ERR=8002) GOTO 8003 8000 WRITE(*,*) ' ERROR IN OPENING BAND.DEF !!!!' STOP 'BAND.DEF' 8002 WRITE(*,*) ' ERROR IN OPENING UNIT:',IUNIT WRITE(*,*) ' FILENAME: ',FNAME,' STATUS: ',STATUS, * ' FORM:',FORM STOP 'OPEN FAILED' 8001 CONTINUE label=' ' label1=' ' do i=1,12 if(fname(i:i).ne.'.') then label(i:i)=fname(i:i) else goto 9 endif enddo c c.....READ K-VECTORS c 9 n_kpt=0 nn_ene_max=0 10 CONTINUE read(7,'(a80)',end=20) aline if (aline(1:7).eq.k_pat) then c THIS IS THE BEGINNING OF AN EIGENVALUE SECTION (output1) n_kpt=n_kpt + 1 nn_ene=0 read(7,'(a1)') dummy read(7,'(a1)') dummy c READ EIGENVALUES OF K-VECTOR 11 read(7,'(a80)') aline if (aline(15:42).eq.ei_pat) then goto 10 else call get_ei(aline, tmp_eigen, nn_ene) if(nn_ene_max.lt.nn_ene) nn_ene_max=nn_ene goto 11 endif else goto 10 endif 20 continue allocate(band_w(nn_ene_max,2),eigen(nn_ene_max,n_kpt)) allocate(n_ene(n_kpt)) rewind 7 n_kpt=0 100 CONTINUE read(7,'(a80)',end=200) aline if (aline(1:7).eq.k_pat) then c THIS IS THE BEGINNING OF AN EIGENVALUE SECTION (output1) n_kpt=n_kpt + 1 cc if(n_kpt.gt.nkp) then cc write(6,*) ' parameter NKP too small:',nkp cc stop 'NKP TOO SMALL' cc end if n_ene(n_kpt)=0 call get_k (aline,vk(1),vk(2), & vk(3),k_name) read(7,'(a1)') dummy read(7,'(a1)') dummy c READ EIGENVALUES OF K-VECTOR 110 read(7,'(a80)') aline if (aline(15:42).eq.ei_pat) then c write(6,*) 'k=',k_name(n_kpt),' done' c write(6,*) 'numb e(k) found=',n_ene(n_kpt) goto 100 else cc if(n_ene(n_kpt).ge.nevl-4) then cc write(6,*) 'parameter nevl too small:',nevl cc stop 'NEVL TOO SMALL' cc endif call get_ei(aline, eigen(1,n_kpt), n_ene(n_kpt)) goto 110 endif else goto 100 endif c c.....ALL K-VECTORS HAVE BEEN READ; SEARCH FOR K-POINT WITH SMALLEST c NUMBER OF EIGENVALUES c 200 continue c write(*,*) 'number of k-points read=',n_kpt cc nu_min=NEVL+1 nu_min=9999999 do 205 j=1,n_kpt if (n_ene(j).lt.nu_min) then nu_min=n_ene(j) k_min=j endif 205 continue c write(6,*) 'smallest number eigenvalues at k=',k_min,' (', c * k_name(k_min),')' c write(6,*) ' =',nu_min c tk c DETERMINE BAND WIDTHS in terms of (Emin,Emax) c c insert code here !!! emin=+99999.9 emax=-99999.9 do i=1,nu_min band_w(i,MINE)=+99999.9 band_w(i,MAXE)=-99999.9 do j=1,n_kpt if(eigen(i,j).lt.band_w(i,MINE)) band_w(i,MINE)=eigen(i,j) if(eigen(i,j).gt.band_w(i,MAXE)) band_w(i,MAXE)=eigen(i,j) enddo if(band_w(i,MINE).lt.emin) emin=band_w(i,MINE) if(band_w(i,MAXE).gt.emax) emax=band_w(i,MAXE) enddo c c write IRREDUBIBLE SET of K-POINTS and ENERGIES c write(6,*) 'IRREDUCIBLE-KPOINT-SET' write(6,'(2F12.6)') emin, emax write(6,*) nu_min, n_kpt write(8,*) nu_min do i=1,nu_min write(6,'(10x,I6,10x,2F12.6)') $ i, band_w(i,MINE), band_w(i,MAXE) write(8,'(10x,I6,10x,2F12.6)') $ i, band_w(i,MINE), band_w(i,MAXE) do j=1,n_kpt c write(*,'(i6,2x,3F10.6,5x,F12.6)') c $ j, vk(1,j), vk(2,j), vk(3,j), eigen(i,j) write(6,'(i6,2x,F12.6)') j, eigen(i,j) enddo enddo write(6,*) 'END-IRREDUCIBLE-KPOINT-SET' END xcrysden-1.6.2/F/p2c.inc0000644000175000017500000000013611712736221013421 0ustar tonetone PARAMETER ( $ SHORTEST_DIAGONAL = 0, $ LONGEST_DIAGONAL = 1 ) xcrysden-1.6.2/F/pwo_xsf2xsf.f0000644000175000017500000000627013525474653014722 0ustar tonetone!----------------------------------------------------------------------- PROGRAM pwo_xsf2xsf !----------------------------------------------------------------------- ! ! Usage: pwo_xsf2xsf ibrav ! ! This program reads the XSF file produced by pwo2xsf.sh filter and ! tries to assign CONVVEC on the basis of provided "ibrav" index, ! which is specified as command-line argument. ! ! The resulting XSF file is written to standard output. !----------------------------------------------------------------------- IMPLICIT NONE integer narg, ibrav, natoms, nsteps, i, j, ia integer igroup, ibrav2igroup character*256 line, abrav character atm*4, keyword*32 real*8 pv(3,3), cv(3,3), celldm(6), tau(3), VecSize logical zero_latvec, matches call ZeroMat(cv,3,3) narg = iargc() if (narg .ne. 1) $ stop 'Usage: pwo_xsf2xsf ibrav' call getarg(1,abrav) read(abrav,*) ibrav igroup = ibrav2igroup(ibrav) nsteps = 1 ! ANIMSTEPS or CRYSTAL|SLAB|POLYMER|MOLECULE call read_line(line) IF ( matches('ANIMSTEPS', line) ) THEN write (*,*) trim(line) read(line,*) keyword, nsteps ! CRYSTAL|SLAB|POLYMER|MOLECULE call read_line(line) ENDIF IF ( matches('CRYSTAL', line) ) THEN write(*,'('' DIM-GROUP'')') write(*,'('' 3 '',i3)') igroup ELSE write (*,*) trim(line) ENDIF DO ia=1,nsteps ! PRIMVEC or PRIMCOOR call readwrite_line(line) ! IF ( matches('PRIMVEC', line) ) THEN read (*,*) ((pv(i,j),i=1,3),j=1,3) write(*,'(3(f15.10,2x,f15.10,2x,f15.10,/))') $ ((pv(i,j),i=1,3),j=1,3) ! try to assign CONVVEC call at2celldm $ (ibrav, pv(1,1), pv(1,2), pv(1,3), celldm) call set_convvec(ibrav, celldm, pv, cv) ! write CONVENTIONAL VECTORS is they are not zero IF ( .not. zero_latvec(cv) ) THEN ! write(*,'('' CONVVEC'')') write(*,'(3(f15.10,2x,f15.10,2x,f15.10,/))') $ ((cv(i,j),i=1,3),j=1,3) ENDIF ! read PRIMCOOR line call readwrite_line(line) ENDIF IF ( matches('PRIMCOOR', line) ) THEN call readwrite_line(line) ! natoms, 1 read (line,*) natoms do i=1,natoms call readwrite_line(line) enddo write(*,*) '' ENDIF ENDDO END !----------------------------------------------------------------------- SUBROUTINE readwrite_line(line) character*256 line 10 continue read (*,'(a256)') line line = adjustl(line) ! check for empty line if ( len_trim(line) .eq. 0) goto 10 write (*,*) trim(line) return END SUBROUTINE read_line(line) character*256 line 10 continue read (*,'(a256)') line line = adjustl(line) ! check for empty line if ( len_trim(line) .eq. 0) goto 10 return END xcrysden-1.6.2/system/0000755000175000017500000000000013556022211013374 5ustar tonetonexcrysden-1.6.2/system/Make.sys-shared0000644000175000017500000000354713525512272016275 0ustar tonetone######################################################################### # # System-dependent definitions suitable for compiling xcrysden using # a system shared libraries (needs Tcl/Tk/Togl/GL/GLU/FFTW libraries) # ######################################################################## #------------------------------------------------------------------------ # if you have a GNU make it is better to set the MAKE variable to point # to gnu make #------------------------------------------------------------------------ MAKE = make #------------------------------------------------------------------------ # compilers & flags #------------------------------------------------------------------------ # C-preprocessor flags CPPFLAGS ?= # C-compiler flags CFLAGS += -ffast-math -funroll-loops -fPIC -pedantic -Wall CC = gcc #LDLIB = -ldl MATH = -lm -lc FFLAGS ?= -fdefault-double-8 -fdefault-real-8 -O2 FC = gfortran #------------------------------------------- #debug options #CFLAGS = -g #------------------------------------------- #------------------------------------------------------------------------ # X-libraries & include files #------------------------------------------------------------------------ X_LIB = -lXmu -lX11 X_INCDIR = #------------------------------------------------------------------------ # # Libraries # TCL_LIB = -ltcl$(TCL_VER2) TK_LIB = -ltk$(TCL_VER2) TOGL_LIB = -lTogl GLU_LIB = -lGLU GL_LIB = -lGL FFTW3_LIB = -lfftw3 EXT_LIB = # this is only used for some testing purposes #MESCHACH_LIB = -lmeschach # # Include directories # TCL_INCDIR = -I/usr/include/tcl$(TCL_VER2) TK_INCDIR = TOGL_INCDIR = GL_INCDIR = FFTW3_INCDIR = # this is only used for some testing purposes #MESCHACH_INCDIR = #------------------------------------------------------------------------ xcrysden-1.6.2/system/Make.cygwin0000644000175000017500000000326713522511264015507 0ustar tonetone######################################################################### # # System-dependent definitions CYGWIN. # # EDIT ACCORDING TO YOUR OWN NEEDS !!! # ######################################################################## MAKE = make CYGWIN = -f Makefile.cygwin #------------------------------------------------------------------------ # compilers & flags #------------------------------------------------------------------------ CC = cc -g SHARED = -shared CFLAGS = -O2 #-mno-cygwin #-mcygwin CPPFLAGS = -DCYGWIN -DWIN32 -DUSE_FONTS -DNEAR_BUG LDLIB = MATH = FC = g77 -O2 # -mcygwin FFLAGS = #------------------------------------------------------------------------ # Libraries and include files #------------------------------------------------------------------------ X_LIB = # -L/usr/X11R6/lib -lX11.dll X_INCDIR = TCL_PREFIX = /usr TCL_VER = 84 TCL_LIB = -L$(TCL_PREFIX)/lib -ltcl$(TCL_VER) -ltclstub$(TCL_VER) TK_LIB = -ltk$(TCL_VER) -ltkstub$(TCL_VER) TOGL_LIB = -lTogl$(TOGL_VER) GLU_LIB = -lglu32 GL_LIB = -lopengl32 -lgdi32 FFTW3_LIB = -lfftw3 # this is only used for some testing purposes #MESCHACH_LIB = TCLTK_SRC = /usr/src/tcltk-20080420-1 # on some machines this is needed: -I$(TCLTK_SRC)/tk/xlib TCL_INCDIR = -I$(TCLTK_SRC)/tcl/generic -DUSE_TCL_STUBS TK_INCDIR = -I$(TCLTK_SRC)/tk/generic -I$(TCLTK_SRC)/tk/win/ -DUSE_TK_STUBS -I$(TCLTK_SRC)/tk/xlib TOGL_INCDIR = GL_INCDIR = -I/usr/include/opengl FFTW3_INCDIR = # this is only used for some testing purposes #MESCHACH_INCDIR = #------------------------------------------------------------------------ xcrysden-1.6.2/system/Make.sys-semishared-macosx-x11-macports0000644000175000017500000000640513554611413022673 0ustar tonetone######################################################################### # # Make.sys for X11 semishared compilation on Mac OS X # # It will download Tcl, Tk, and Togl tarballs from the internet and # compile them for use with X11. After compilation they are installed # in external/lib & external/include. # # # This Make.sys uses the MacPorts and requires the following packages: # # xorg-libX11 # xorg-libXmu # mesa # libGLU # fftw-3 # ImageMagick (optional, but highly recommended) # ######################################################################## #------------------------------------------------------------------------ # if you have a GNU make it is better to set the MAKE variable to point # to gnu make #------------------------------------------------------------------------ MAKE = make #------------------------------------------------------------------------ # compilers & flags #------------------------------------------------------------------------ # C-preprocessor flags CPPFLAGS ?= # C-compiler flags CFLAGS += -ffast-math -funroll-loops -fPIC -pedantic -Wall CC = gcc #LDLIB = -ldl MATH = -lm -lc FFLAGS += -static-libgfortran -static-libgcc -fdefault-double-8 -fdefault-real-8 -O2 FC = gfortran #------------------------------------------- #debug options #CFLAGS = -g #------------------------------------------- #------------------------------------------------------------------------ # X-libraries & include files #------------------------------------------------------------------------ X_LIB = -lXmu -lX11 X_INCDIR = -I/opt/local/include #------------------------------------------------------------------------ # EXTERNAL LIBRARIES: Tcl/Tk/Mesa/Togl/FFTW # setting to "yes" will compile the corresponding library in external/src/ COMPILE_TCLTK = yes COMPILE_TOGL = yes COMPILE_MESA = no COMPILE_FFTW = no # this is only used for some testing purposes COMPILE_MESCHACH = no # Do we want a shared library version of Tcl/Tk/Mesa/Togl? If we want # shared then set the following flags to: --enable-shared else set the # following flag to: --disable-shared TCLTK_OPTIONS = --enable-shared \ --with-x CFLAGS=-I/opt/local/include --x-includes=/opt/local/include --x-libraries=/opt/local/lib TOGL_OPTIONS = --enable-shared --with-tcl=$(TOPDIR)/external/lib --with-tk=$(TOPDIR)/external/lib \ --with-x CFLAGS=-I/opt/local/include --x-includes=/opt/local/include --x-libraries=/opt/local/lib MESA_OPTIONS = --enable-shared GLU_OPTIONS = --enable-shared MESA_TARGET = linux FFTW_OPTIONS = --enable-shared #------------------------------------------------------------------------ # # Libraries # TCL_LIB = -L$(TOPDIR)/external/lib -ltcl$(TCL_VER2) TK_LIB = -ltk$(TCL_VER2) TOGL_LIB = -lTogl$(TOGL_VER) GLU_LIB = -L/opt/local/lib -lGLU GL_LIB = -lGL FFTW3_LIB = -L/opt/local/lib -lfftw3 # this is only used for some testing purposes #MESCHACH_LIB = -lmeschach # # Include directories # TCL_INCDIR = -I$(TOPDIR)/external/include TK_INCDIR = TOGL_INCDIR = GL_INCDIR = -I/opt/local/include FFTW3_INCDIR = # this is only used for some testing purposes #MESCHACH_INCDIR = #------------------------------------------------------------------------ xcrysden-1.6.2/system/Make.sys-semishared-macosx-x11-xquartz0000644000175000017500000000612413554611460022561 0ustar tonetone######################################################################### # # Make.sys for X11 semishared compilation on Mac OS X # # It will download Tcl, Tk, Togl, and FTTW3 tarballs from the # internet and compile them for use with X11. After compilation they # are installed in external/lib & external/include. # # # This Make.sys uses the XQuartz. # ######################################################################## #------------------------------------------------------------------------ # if you have a GNU make it is better to set the MAKE variable to point # to gnu make #------------------------------------------------------------------------ MAKE = make #------------------------------------------------------------------------ # compilers & flags #------------------------------------------------------------------------ # C-preprocessor flags CPPFLAGS ?= # C-compiler flags CFLAGS += -ffast-math -funroll-loops -fPIC -pedantic -Wall CC = gcc #LDLIB = -ldl MATH = -lm -lc FFLAGS += -static-libgfortran -static-libgcc -fdefault-double-8 -fdefault-real-8 -O2 FC = gfortran #------------------------------------------- #debug options #CFLAGS = -g #------------------------------------------- #------------------------------------------------------------------------ # X-libraries & include files #------------------------------------------------------------------------ X_LIB = -lXmu -lX11 X_INCDIR = -I/opt/X11/include #------------------------------------------------------------------------ # EXTERNAL LIBRARIES: Tcl/Tk/Mesa/Togl/FFTW # setting to "yes" will compile the corresponding library in external/src/ COMPILE_TCLTK = yes COMPILE_TOGL = yes COMPILE_MESA = no COMPILE_FFTW = no # this is only used for some testing purposes COMPILE_MESCHACH = no # Do we want a shared library version of Tcl/Tk/Mesa/Togl? If we want # shared then set the following flags to: --enable-shared else set the # following flag to: --disable-shared TCLTK_OPTIONS = --enable-shared \ --with-x CFLAGS=-I/opt/X11/include --x-includes=/opt/X11/include --x-libraries=/opt/X11/lib TOGL_OPTIONS = --enable-shared --with-tcl=$(TOPDIR)/external/lib --with-tk=$(TOPDIR)/external/lib \ --with-x CFLAGS=-I/opt/X11/include --x-includes=/opt/X11/include --x-libraries=/opt/X11/lib MESA_OPTIONS = --enable-shared GLU_OPTIONS = --enable-shared MESA_TARGET = linux FFTW_OPTIONS = --enable-shared #------------------------------------------------------------------------ # # Libraries # TCL_LIB = -L$(TOPDIR)/external/lib -ltcl$(TCL_VER2) TK_LIB = -ltk$(TCL_VER2) TOGL_LIB = -lTogl$(TOGL_VER) GLU_LIB = -L/opt/X11/lib -lGLU GL_LIB = -lGL FFTW3_LIB = -lfftw3 # this is only used for some testing purposes #MESCHACH_LIB = -lmeschach # # Include directories # TCL_INCDIR = -I$(TOPDIR)/external/include TK_INCDIR = TOGL_INCDIR = GL_INCDIR = -I/opt/X11/include FFTW3_INCDIR = # this is only used for some testing purposes #MESCHACH_INCDIR = #------------------------------------------------------------------------ xcrysden-1.6.2/system/Make.sys-shared-macosx-x11-macports0000644000175000017500000000477513554625540022033 0ustar tonetone######################################################################### # # Make.sys for X11 shared compilation on Mac OS X # # This Make.sys uses the MacPorts and requires the following packages: # # xorg-libX11 # xorg-libXmu # tcl # tk # mesa # libGLU # fftw-3 # ImageMagick (optional, but highly recommended) # ######################################################################## #------------------------------------------------------------------------ # if you have a GNU make it is better to set the MAKE variable to point # to gnu make #------------------------------------------------------------------------ MAKE = make #------------------------------------------------------------------------ # compilers & flags #------------------------------------------------------------------------ # C-preprocessor flags CPPFLAGS ?= # C-compiler flags CFLAGS += -ffast-math -funroll-loops -fPIC -pedantic -Wall CC = gcc #LDLIB = -ldl MATH = -lm -lc FFLAGS += -static-libgfortran -static-libgcc -fdefault-double-8 -fdefault-real-8 -O2 FC = gfortran #------------------------------------------- #debug options #CFLAGS = -g #------------------------------------------- #------------------------------------------------------------------------ # X-libraries & include files #------------------------------------------------------------------------ X_LIB = -lXmu -lX11 X_INCDIR = -I/opt/local/include #------------------------------------------------------------------------ # EXTERNAL LIBRARIES: Togl # N.B.: Togl from macports is not OK, let's compile it from sources # COMPILE_TOGL = yes TOGL_OPTIONS = --exec-prefix=$(TOPDIR)/external --enable-shared --with-tcl=/opt/local/lib --with-tk=/opt/local/lib \ --with-x CFLAGS=-I/opt/local/include --x-includes=/opt/local/include --x-libraries=/opt/local/lib #------------------------------------------------------------------------ # # Libraries # TCL_LIB = -L$(TOPDIR)/external/lib -ltcl$(TCL_VER2) TK_LIB = -ltk$(TCL_VER2) TOGL_LIB = -lTogl$(TOGL_VER) GLU_LIB = -L/opt/local/lib -lGLU GL_LIB = -lGL FFTW3_LIB = -L/opt/local/lib -lfftw3 # this is only used for some testing purposes #MESCHACH_LIB = -lmeschach # # Include directories # TCL_INCDIR = -I$(TOPDIR)/external/include TK_INCDIR = TOGL_INCDIR = GL_INCDIR = -I/opt/local/include FFTW3_INCDIR = # this is only used for some testing purposes #MESCHACH_INCDIR = #------------------------------------------------------------------------ xcrysden-1.6.2/system/README0000644000175000017500000000326113551352513014264 0ustar tonetoneNOTE: It is the easiest to compile the shared version of xcrysden, because it is more easy to install library dependencies with a package manager system, such as apt or dnf, then to compile needed libraries from sources. The compilation of xcrysden requires several development versions of libraries, in particular: ---------------------------------------------------------------------------- ** To compile SHARED version of xcrysden the following libraries are needed: ---------------------------------------------------------------------------- libx11-dev libxmu-dev tcl8.6-dev tk8.6-dev mesa-common-dev libglu1-mesa-dev libtogl-dev libfftw3-dev N.B.: these are Debian package names. On Debian based distributions, they can be installed as: sudo apt install libx11-dev libxmu-dev tcl8.6-dev tk8.6-dev mesa-common-dev libglu1-mesa-dev libtogl-dev libfftw3-dev NOTE FOR OTHER LINUX-DISTROS: first google for the correponding package names and then install them with the correponding package manager (e.g. "dnf" for Fedora based distros). ------------------------------------------------------------------------ ** To compile SEMISHARED version of xcrysden one needs: ------------------------------------------------------------------------ libx11-dev libxmu-dev pkg-config libxrandr-dev llvm-dev libelf-dev N.B.: these are Debian package names that can be install via "apt install" on Debian based distributions. ---------------------------------------------------------------------------- ** To use SHARED version of xcrysden the following libraries are needed: ---------------------------------------------------------------------------- libxmu6 tk8.6 libglu1-mesa libtogl2 libfftw3-3 libgfortran5xcrysden-1.6.2/system/Make.macosx-x11-old0000644000175000017500000000573013522510173016657 0ustar tonetone######################################################################### # # System-dependent definitions for Mac OS X using Mesa and "unix-like" # Tcl/Tk. # # Mike Ford 12/03/04 # University of Technology, Sydney # # Updated by Tone on Mon Dec 22 2008 # # ----------------------------------------------------------------------- # # !!! EDIT ACCORDING TO YOUR OWN NEEDS !!! # # ----------------------------------------------------------------------- # # BEWARE: The Apple X11 libraries don't work, but XCrySDen still runs # under the Apple X11 window server. Please link with the Darwin X # libraries instead. # See: http://ftp.xfree86.org/pub/XFree86/4.4.0/binaries/Darwin-ppc-7.x/ # You need to download the following packages: # # Xprog.tgz ... for static X11 and OpenGL libraries # Xbin.tgz ... for dynamic X11 and OpenGL libraries # ######################################################################## #------------------------------------------------------------------------ # if you have a GNU make it is better to set the MAKE variable to point # to gnu make #------------------------------------------------------------------------ MAKE = make #------------------------------------------------------------------------ # compilers & flags #------------------------------------------------------------------------ CFLAGS = -funroll-loops -fPIC -DTOGL_USE_FONTS -DHAVE_NO_GETLINE CC = gcc #LDLIB = -ldl MATH = -lm FFLAGS = FC = g77 -O2 #------------------------------------------------------------------------ # X-libraries & include files # # for STATIC compilation one should add: -lpthread #------------------------------------------------------------------------ # NOTE: Use the XDarwin server instead of Apple's Xserver DARWIN_X11_PREFIX = /usr/X11R6-darwin X_LIB = -L$(DARWIN_X11_PREFIX)/lib -lXmu -lX11 -lXext X_INCDIR = -I$(DARWIN_X11_PREFIX)/include #------------------------------------------------------------------------ # Libraries and include files #------------------------------------------------------------------------ # # Libraries (use .a for static and .dylib for dynamic libraries) # # BEWARE: must use the darwin OpenGL libraries TCL_LIB = -ltcl$(TCL_VER2).dylib TK_LIB = -ltk$(TCL_VER2).dylib GLU_LIB = -L$(DARWIN_X11_PREFIX)/lib -lGLU.dylib GL_LIB = -lGL.dylib FFTW3_LIB = -lfftw3.dylib # this is only used for some testing purposes #MESCHACH_LIB = -lmeschach.dylib # # Include directories (set accoring to your needs) # TCL_INCDIR = \ -I/Library/Frameworks/Tcl.framework/Versions/$(TCL_VER2)/Headers \ -I/Library/Frameworks/Tcl.framework/Versions/$(TCL_VER2)/PrivateHeaders TK_INCDIR = \ -I/Library/Frameworks/Tk.framework/Versions/$(TCL_VER2)/Headers \ -I/Library/Frameworks/Tk.framework/Versions/$(TCL_VER2)/PrivateHeaders GL_INCDIR = \ -I$(DARWIN_X11_PREFIX)/include FFTW3_INCDIR = # this is only used for some testing purposse #MESCHACH_INCDIR = #------------------------------------------------------------------------ xcrysden-1.6.2/system/Make.sys-static0000644000175000017500000001150713522752720016312 0ustar tonetone######################################################################## # # System-dependent definitions for Linux (static linking). # # (DEPRECATED) static compilation and linking is really deprecated ! # # EDIT ACCORDING TO YOUR OWN NEEDS !!! # ######################################################################## #------------------------------------------------------------------------ # if you have a GNU make it is better to set the MAKE variable to point # to gnu make #------------------------------------------------------------------------ MAKE = make #------------------------------------------------------------------------ # compilers & flags #------------------------------------------------------------------------ # static: #---------------------------- # C-preprocessor flags CPPFLAGS = # C-compiler flags CFLAGS = -static -ffast-math -funroll-loops -pedantic -Wall LDFLAGS = -static LDLIB = -ldl -lpthread -lz MATH = -lm CC = gcc # let us see if -statig-libgfortran is sufficient (to avoid the use of # -static which produces huge executables (libc.so.6 should be present # on every system) FFLAGS = -static-libgfortran -static-libgcc FC = gfortran -fdefault-double-8 -fdefault-real-8 -O2 #------------------------------------------------------------------------ # X-libraries & include files # # linking static libraries is a total mess, consider using the shared # libraries instead (i.e. see system/Make.sys-shared file) # ------------------------------------------------------------------------ X_LIB = -lXmu -lX11 -lXss -lXext -lXft -lfontconfig -lstdc++ -lXt -lxcb -lfreetype -lXrender -lz -lexpat -lSM -lICE -lXau -lXdmcp -lX11 -lpng -luuid X_INCDIR = ### ### use EITHER THIS: ### # #-Possibility-1---------------------------------------------------------- # # # # If you want to use your own libraries and include files, then (1) # # uncomment the following lines and set the variables accordingly, and # # (2) uncomment the "Possibility-2" lines below. # # # #------------------------------------------------------------------------ # # # # # Libraries # # # TK_LIB = -ltk$(TCL_VER2) # TCL_LIB = -ltcl$(TCL_VER2) # TOGL_LIB = -lTogl$(TOGL_VER) # GLU_LIB = -lGLU # GL_LIB = -lGL # FFTW3_LIB = -lfftw3 # # this is only used for some testing purposes # MESCHACH_LIB = -lmeschach # # # # # Include directories # # # TCL_INCDIR = -I/usr/include/tcl$(TCL_VER2) # TK_INCDIR = # TOGL_INCDIR = # GL_INCDIR = # FFTW3_INCDIR = # # #------------------------------------------------------------------------ ### ### or THAT: ### #-Possibility-2----------------------------------------------------------- # # XCRYSDEN package may contain the Tcl/Tk, Mesa, FFTW, and Meschach # sources !!! # #------------------------------------------------------------------------ # setting to "yes" will compile corresponding library in external/src/ COMPILE_TCLTK = yes COMPILE_TOGL = yes COMPILE_MESA = yes COMPILE_FFTW = yes # this is only used for some testing purposes COMPILE_MESCHACH = no # alternatively, this will also compile anything #COMPILE_ALL = yes # # Do we want a shared library version of Tcl/Tk/Mesa or static? If we # want shared then set the following flags to: --enable-shared else # set the following flag to: --disable-shared # TCLTK_OPTIONS = --disable-shared TOGL_OPTIONS = --disable-shared --with-tcl=$(TOPDIR)/external/lib --with-tk=$(TOPDIR)/external/lib # BEWARE: MESA_OPTIONS --> these cannot be built as static library MESA_OPTIONS = --enable-static --disable-shared --with-driver=xlib --disable-dri --disable-gbm --disable-egl GLU_OPTIONS = --disable-shared MESA_TARGET = linux FFTW_OPTIONS = --disable-shared # # Libraries (static linking) # for shared linking the libraries postfix should be .so # for static linking the libraries postfix should be .a # TCL_LIB = $(TOPDIR)/external/lib/libtcl$(TCL_VER2).a TK_LIB = $(TOPDIR)/external/lib/libtk$(TCL_VER2).a TOGL_LIB = $(TOPDIR)/external/lib/libToglstub$(TOGL_VER).a \ $(TOPDIR)/external/lib/libTogl$(TOGL_VER).a \ $(TOPDIR)/external/lib/libtclstub$(TCL_VER2).a \ $(TOPDIR)/external/lib/libtkstub$(TCL_VER2).a GLU_LIB = $(TOPDIR)/external/lib/libGLU.a GL_LIB = $(TOPDIR)/external/lib/libGL.a $(TOPDIR)/external/lib/libglapi.a FFTW3_LIB = $(TOPDIR)/external/lib/libfftw3.a # this is only used for some testing purposes #MESCHACH_LIB = $(TOPDIR)/external/lib/libmeschach.a # # Include directories # TCL_INCDIR = -I$(TOPDIR)/external/src/tcl$(TCL_VER3)/generic TK_INCDIR = -I$(TOPDIR)/external/src/tk$(TCL_VER3)/generic TOGL_INCDIR = GL_INCDIR = -I$(TOPDIR)/external/include FFTW3_INCDIR = # this is only used for some testing purposes #MESCHACH_INCDIR = #------------------------------------------------------------------------ xcrysden-1.6.2/system/Make.sys-semishared0000644000175000017500000000574713525544260017161 0ustar tonetone######################################################################### # # System-dependent definitions suitable for creating a semishared # binary distribution of xcrysden by downloading all the external # library sources (i.e. Tcl/Tk/Togl/GL/GLU/FFTW3) in external/src/ # and compiling them. After compilation these will be installed into # external/lib/ & external/include/ subdirectories, which can be then # included in the produced compiled-package tarball upon executing # "make bindist-semishared". # ######################################################################## #------------------------------------------------------------------------ # if you have a GNU make it is better to set the MAKE variable to point # to gnu make #------------------------------------------------------------------------ MAKE = make #------------------------------------------------------------------------ # compilers & flags #------------------------------------------------------------------------ # C-preprocessor flags CPPFLAGS ?= # C-compiler flags CFLAGS += -ffast-math -funroll-loops -fPIC -pedantic -Wall CC = gcc #LDLIB = -ldl MATH = -lm -lc FFLAGS += -static-libgfortran -static-libgcc -fdefault-double-8 -fdefault-real-8 -O2 FC = gfortran #------------------------------------------- #debug options #CFLAGS = -g #------------------------------------------- #------------------------------------------------------------------------ # X-libraries & include files #------------------------------------------------------------------------ X_LIB = -lXmu -lX11 X_INCDIR = #------------------------------------------------------------------------ # EXTERNAL LIBRARIES: Tcl/Tk/Mesa/Togl/FFTW # setting to "yes" will compile the corresponding library in external/src/ COMPILE_TCLTK = yes COMPILE_TOGL = yes COMPILE_MESA = yes COMPILE_FFTW = yes # this is only used for some testing purposes COMPILE_MESCHACH = no # Do we want a shared library version of Tcl/Tk/Mesa/Togl? If we want # shared then set the following flags to: --enable-shared else set the # following flag to: --disable-shared TCLTK_OPTIONS = --enable-shared TOGL_OPTIONS = --enable-shared --with-tcl=$(TOPDIR)/external/lib --with-tk=$(TOPDIR)/external/lib MESA_OPTIONS = --enable-shared GLU_OPTIONS = --enable-shared MESA_TARGET = linux FFTW_OPTIONS = --enable-shared #------------------------------------------------------------------------ # # Libraries # TCL_LIB = -L$(TOPDIR)/external/lib -ltcl$(TCL_VER2) TK_LIB = -ltk$(TCL_VER2) TOGL_LIB = -lTogl$(TOGL_VER) GLU_LIB = -lGLU GL_LIB = -lGL FFTW3_LIB = -lfftw3 # this is only used for some testing purposes #MESCHACH_LIB = -lmeschach # # Include directories # TCL_INCDIR = -I$(TOPDIR)/external/include TK_INCDIR = TOGL_INCDIR = GL_INCDIR = FFTW3_INCDIR = # this is only used for some testing purposes #MESCHACH_INCDIR = #------------------------------------------------------------------------ xcrysden-1.6.2/system/Make.macosx-x11-old.README0000644000175000017500000000451511712736221017616 0ustar tonetoneIf you encounter problems while compiling XCRYSDEN on MAC OSX below notes from Mike Ford might be useful. Tone Kokalj, Fri Apr 2 13:19:27 CEST 2004 Compiling XCRYSDEN for MacOS X v10.2 ************************************ Mike Ford 12/03/04 University of Technology, Sydney 1) Set up the Make.sys file --------------------------- Have to use COMPILE_TCLTK=no and COMPILE_MESA=no option and compile MESA-4.0, tcl8.4 and tk8.4 seperately. Use the g77 and gcc compilers. Compile using XDarwin v1.1.0.1 Xwindow libraries, not the Apple X11 server libraries. The program will still run under the Apple X11 server (I have window servers installed, one in the directory /usr/X11R6, the other in /usr/X11R6-darwin). NOTE: In the following it is assumed that the top installed directory is /applications/XCrySDen-B1.0s 2) Compile Mesa-4.O ------------------- Confiugre with makefiles with: $ cd /applications/XCrySDen-B1.0s/external/src/Mesa-4.0 with: $ ./configure --disable-shared \ --prefix=/applications/XCrySDen-B1.0s/external \ --x-libraries=/usr/X11R6-xdarwin/lib \ --x-includes=/usr/X11R6-xdarwin/include \ --disable-3dnow In the file /applications/XCrySDen-B1.0s-all/external/src/Mesa-4.0/si-glu/libtess/memalloc.h replace '#include ' with '#include ' In the file /applications/XCrySDen-B1.0s-all/external/src/Mesa-4.0/libtool change 'build_old_libs=no' to 'build_old_libs=yes' Compile with: $ make install 3) Compile tcl8.3.3 ------------------- Configure makefiles with: $ cd /applications/XCrySDen-b1.0s/external/src/tcl8.3.3/unix $ ./configure --disable-shared \ --prefix=/applications/XCrySDen-B1.0s/external \ --x-libraries=/usr/X11R6-xdarwin/lib \ --x-includes=/usr/X11R6-xdarwin/include \ Compile with: $ make install 4) Compile tk8.3.3 ------------------ Configure makefiles with: $ cd /applications/XCrySDen-b1.0s/external/src/tk8.3.3/unix $ ./configure --disable-shared \ --prefix=/applications/XCrySDen-B1.0s/external \ --x-libraries=/usr/X11R6-xdarwin/lib \ --x-includes=/usr/X11R6-xdarwin/include \ Compile with: $ make install 5) Compile XCrySDen ------------------- $ cd /applications/XCrySDen-B1.0s-all $ make all xcrysden-1.6.2/xcrysden.bat0000644000175000017500000000050511712736221014404 0ustar tonetone@echo off rem *** Edit according to your configuration: rem *** 1. where is your cygwin root directory (CYGWIN)? rem *** 2. where is your xcrysden root directory (XCRYSDEN_TOPDIR)? set CYGWIN=C:\cygwin set XCRYSDEN_TOPDIR=C:\cygwin\home\tone\src\XCrySDen-1.5.18-src %CYGWIN%\bin\bash -l %XCRYSDEN_TOPDIR%\xcrysdenxcrysden-1.6.2/contrib/0000755000175000017500000000000013556022211013510 5ustar tonetonexcrysden-1.6.2/contrib/smallcharge.f900000644000175000017500000000274411712736221016326 0ustar tonetone!------------------------------------------------------------------------------ ! Small Readcharge program ! Conversion from .xsf file (XCrySDen) to x,y,z,rho(x,y,z) format file. ! Arnaud Ponchel- Laboratoire d'Etudes des Microstructures - ONERA - 01/2000 - !------------------------------------------------------------------------------ Program readcharge ! nx,ny,nz: number of charge densities points in the 3 directions ! a,b,c: lattice parameters ! x,y,z: cartesian coordinates of a point in the 3D grid ! ix,iy,iz: incrementations of x,y,z ! Must entry the dimension of the array integer :: l,n,u,nx,ny,nz real,dimension(524800) :: t real :: a,b,c,x,y,z,ix,iy,iz open(96,file='RHO.inp',status='unknown') open(97,file='RHO.out',status='new') ! Definition of parameters u=0 n=1 a=7.996/0.529 b=7.996/0.529 c=8.158/0.529 nx=80 ny=80 nz=82 l=nx*ny*nz-5 ix=a/nx iy=b/ny iz=c/nz ! Reading of the rho values in the array t(i) ! From the case.xsf file (only 3D-grid values) ! (6 columns file) do while (n