espresso-5.1/PWgui-5.1/0000755000077300007730000000000012341333047015046 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/ChangeLog0000644000077300007730000001267612341332513016631 0ustar giannozzgiannozzJan 23 2012 Anton Kokalj (tone.kokalj@ijs.si) * adding bands.x and dos.x modules * editing of ChangeLog has been discontinued and in the meantime, the pwgui was made syncronized with the incoming QE 5.0. Dec 2 2008 Anton Kokalj (tone.kokalj@ijs.si) * syncronizing pwgui with QE CVS, i.e., updating pw, ph, and atomic modules. Jun 2 2008 Anton Kokalj (tone.kokalj@ijs.si) * fixing a "recently introduced" bug: widgtes (enabled/disabled) associated to various type of K_POINTS input were not managed properly (spotted by Lorenzo Paulatto) May 8 2008 Anton Kokalj (tone.kokalj@ijs.si) * syncronizing all PWgui help files (with the aid og helpdoc utility) * small updates to all modules * changing the version number to 4.0 Jan/Feb 2008 Anton Kokalj (tone.kokalj@ijs.si) * syncronizing PWgui modules with QE CVS (very many changes). The ld1.x (atomic) module fully completed now. ph.x module reorganized in different pages. Tue May 23 2006 Anton Kokalj (tone.kokalj@ijs.si) * synchronizing PWgui modules with QE-3.1 2005-09-14 19:23 giannozz * modules/chdens/chdens-event.tcl, modules/chdens/chdens-help.tcl, modules/chdens/chdens.tcl, modules/chdens/commands.tcl, doc/pwdocs/Makefile, modules/pp/pp-event.tcl, modules/pp/pp-help.tcl, modules/pp/pp.tcl, src/pwscf.itcl: GUI updated to reflect new input of pp.x - chdens.x input removed, documentation (marginally) updated 2005-09-13 15:54 kokalj * modules/atomic/: atomic.tcl, atomic-event.tcl: Elaborating a bit on Paolo's coding. In particular, making pages and event handlers ... 2005-09-12 19:13 giannozz * modules/atomic/atomic-event.tcl, modules/atomic/atomic-help.tcl, modules/atomic/atomic.tcl, modules/atomic/commands.tcl, VERSION, src/pwscf.itcl: First attempt, not yet completely working, of a GUI for the atomic code 2005-08-03 11:07 giannozz * modules/chdens/: chdens-event.tcl, chdens-help.tcl, chdens.tcl: GUI for chdens updated 2005-08-02 18:13 giannozz * doc/pwdocs/: Makefile, htmlise.sh: manual => users-guide Fri Mar 25 2005 Anton Kokalj (tone.kokalj@ijs.si) * pwgui_vfs/Makefile.*: the standalone binaries can be now created much easier Thu Mar 24 2005 Anton Kokalj (tone.kokalj@ijs.si) * pw.tcl, pw-help.tcl: adding the pwscf's wf_collect variable Thu Mar 24 2005 Stefano de Gironcoli (degironc@sissa.it) * pw.tcl, pw-help.tcl, pw-event.tcl: adding nspin=4 option and angle1, angle2 variables needed in the noncollinear case Wed Mar 23 2005 Anton Kokalj (tone.kokalj@ijs.si) * pw.tcl, pw-help.tcl: pw.x module updated to syntax of PWscf-2.1.2 * pp.tcl, pp-help.tcl: pp.x module slightly updated to syntax of PWscf-2.1.2 * run.itcl: changing a bit the "Run" behaviour Tue Feb 01 2005 Anton Kokalj (tone.kokalj@ijs.si) * pw.tcl:: fixing the "posint" bug with the k-shift validation (set to binary (0/1) validation Mon Jan 17 2005 Anton Kokalj (tone.kokalj@ijs.si) * projwfc module updated (files: pwojwfc.tcl, projwfc-help.tcl) * run.itcl: regsub syntax bug fixed Mon Sep 20 2004 Anton Kokalj (tone.kokalj@ijs.si) and Carlo Sbraccia (sbraccia@sissa.it) * adding "Run" menubutton: added file: run.itcl; adapted files: menustate.itcl (adding runnable support), pwscf.itcl, settings.itcl. Sat Sep 04 2004 Anton Kokalj (tone.kokalj@ijs.si) and Carlo Sbraccia (sbraccia@sissa.it) * updating PWgui for PWscf 2.1 ( a lot of changes ) * PWgui version: the PWgui version will now match the version of PWscf, so that the compatibility of the two codes will be obvious Fri Apr 23 2004 Anton Kokalj (tone.kokalj@ijs.si) * pw-event.tcl: tracevar on "nat": the starting_magnetization entries were not updated accordingly * chdens-event.tcl: tracevar on "plot_out": the epsilon/idpol entries were not updated accordingly Tue Apr 06 2004 Anton Kokalj (tone.kokalj@ijs.si) * modutils.tcl: adding some ::pwscf::readFilter::* utility procs for better support of the syntax-error handling mechanism for reading the input files (added procs: findNamelists, findCards, findNamelistsAndCards) * adding readfilter for chdens.x, prowfc.x modules, and improving readfilter procs for pw.x, ph.x, pp.x, d3.x modules Mon Apr 05 2004 Anton Kokalj (tone.kokalj@ijs.si) * Makefile, sys_utils/starkit.sh, pwgui_vfs/: adding support for building starpack binaries * pw.tcl, pw-help.tcl: correction of format of last_image coordinates for calculation='neb' Thu Apr 01 2004 Anton Kokalj (tone.kokalj@ijs.si) * pw.tcl: correcting typo "minization" -> "minimization" Wed Mar 03 2004 Anton Kokalj (tone.kokalj@ijs.si) * Makefile: cvsinit target: cd doc/pwdocs --> -cd /doc/pwdocs Mon Feb 21 2004 Anton Kokalj (tone.kokalj@ijs.si) * adding external/lib/Makefile * adding _create_bin target to ./Makefile * improving tarball targets of ./Makefile * adding Tcl-related http's to ./INSTALL file Mon Feb 20 2004 Anton Kokalj (tone.kokalj@ijs.si) * adding the defaultPager and defaultEditor. i.e., internal editor and pager (better porting to non-unix systems) Fri Feb 20 2004 Anton Kokalj (tone.kokalj@ijs.si) * package was renamed from TkPWscf to PWgui * porting the package to MS-Windows Wed Feb 18 2004 Anton Kokalj (tone.kokalj@ijs.si) * src-tcl/ directory renamed to src/ * CVS: moving the PWgui and GUIB repositories to O-sesame repository. Some changes of Makefile etc. were required Tue Feb 17 2004 Anton Kokalj (tone.kokalj@ijs.si) * ChangeLog: the beginning of the ChangeLog ChangeLog ends here espresso-5.1/PWgui-5.1/TODO0000644000077300007730000000022512341332513015532 0ustar giannozzgiannozz* would be nice to have kind of beginner mode for more complex modules such as pw.x, where only the most common variable items would be displayedespresso-5.1/PWgui-5.1/VERSION0000644000077300007730000000000412341333047016110 0ustar giannozzgiannozz5.1 espresso-5.1/PWgui-5.1/THANKS0000644000077300007730000000047612341332513015765 0ustar giannozzgiannozzThanks to: Paolo Giannozi for adding ld.x module, among other things ... Carlo Sbraccia: for making PWgui compatible with PWscf 2.1, for bug reports. Carlo Cavazzoni, and Roberto Gori: for discussions and testing. Stefano Baroni and the rest of the PWscf team: for showing interest in PWgui project. espresso-5.1/PWgui-5.1/pwgui.bat0000644000077300007730000000043412341332513016667 0ustar giannozzgiannozz@echo off rem *** rem *** This is a template Batch file for MS-Windows (edit to suit your needs) rem *** rem *** EDIT: set the PWGUI variable to point to correct directory !!! set initdir=%HOMEPATH% set PWGUI=C:\Tone\PWgui-0.6.1 cd %initdir% start wish %PWGUI%\pwgui.tclespresso-5.1/PWgui-5.1/lib/0000755000077300007730000000000012341333047015614 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/0000755000077300007730000000000012341333047017141 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/ChangeLog0000644000077300007730000001577512341332511020725 0ustar giannozzgiannozzTue Apr 22 2014 Anton Kokalj (tone.kokalj@ijs.si) * open.itcl: improving the parsing of Fortran namelist (the parsing was incorrect if the comment character was present in the last line before the end-of-namelist character) Tue Dec 2 2008 Anton Kokalj (tone.kokalj@ijs.si) * gui.itcl: adding kind of limited-support for mouse-wheel to scrolled notebook's pages Thu May 8 2008 Anton Kokalj (tone.kokalj@ijs.si) * store.itcl: adding storeModuleItems public method to moduleObj (for more info see file: store.itcl) * gui.itcl: adding -wrap "option" to addHelp method. * guibKeywords.tcl: adding grouphelp guib keyoword for specifying a common help to a set of "grouped" variables. * guib.tcl: modifying module guib's keyword: instead of object name an object prefix is passed to routine and a unique object name is then generated and returned (i.e. #auto no more require). * help.itcl: adding "helpdoc" format for help. * making code compatible with Itcl namespace awareness (i.e. class --> itcl::class, ...) Fri Feb 15 2008 Anton Kokalj (tone.kokalj@ijs.si) * adding forget&create states to groupwidget GUIB keyword. For this purpose, the objWidgetArray(WIDGET,$obj) arrays elements have been rename to objWidgetArray(CHILDSITEWIDGET,$obj) (hold's childsite widget-name for $obj), while the objWidgetArray(WIDGET,$obj) holds the $obj's (master) widget-name. * tclUtils.tcl: fixing bug in ::tclu::lremove (didn't work properly for single element list) * keywidgets.itcl: fixing bug in ::guib::keywidgets::Dimension class: postConfigure method should be called whenever the number of dimension widgets (i.e. -start/-end) changes, hence it's now called in _manageDims method and not in constructor. Thu Feb 14 2008 Anton Kokalj (tone.kokalj@ijs.si) * build.itcl: proc ::guib::moduleObj::_configurePage: first updating the state and only then querying the existance of page widgets and if the page is viewable. * table.itcl: fixing severe bug in _addCol and _deleteCol: loop condition was false (wrong index used). * moduleObj.itcl: common private proc _validateFmtString uses the ::tclu::format (instead of Tcl-format) now. Wed Feb 13 2008 Anton Kokalj (tone.kokalj@ijs.si) * gui.itcl: splitting teh file into gui.itcl (which holds the ::guib::GUI class) and simpleGui.itcl (for the simple-standalone gui). * gui.itcl: fixing subtle bug: when a tab/page has been deleted the remaining pages were not treated correctly, because the variables associated with remaining pages were not updated/re-indexed. Adding tabsCounter variable, which counts all tab/pages that are created, and arrays are indexed according to it with index2tabsCounter($index) array, where $index is the current index of the tab. Mon Feb 11 2008 Anton Kokalj (tone.kokalj@ijs.si) * table.itcl: table's cells can contain the optionemu widget. * optionmenuhelp.itcl: adding -nohelp option to optionmenuhelp widget. Thu Feb 7 2008 Anton Kokalj (tone.kokalj@ijs.si) * namelist's variables of string type are automatically quoted when saving the input file. The settings(NAMELIST.quote_strings) and set settings(NAMELIST.quote_char) variables control the quiting behaviour. * improving the parsing of definition files: the values of options -widget and -validate are checked for correctness * adding -optionalcols option to table GUIB keyword, which specifies the optional columns, i.e., if optionalcols > 0 then columns >= optionalcols are optional * table.itcl: fixing bug in ::guib::keywidgets::Table::_addCol: using _widget method intead of calling entry Tk-command. Mon Sep 26 13:25:34 CEST 2005 * moduleObj.itcl: adding optionSetDefault and _scopedName methods. Making all necessary for the -validate module's option. * table.itcl: table's -validate option is working now * guib-keywords-def.tcl: adding -varscope option to "module" guib keyword. * validate.itcl: adding a few new validators: string, int, real * gui.itcl: adding "::guib::GUI::addHelp cascade" passibility. Few other minor improvements. * tclUtils.tcl: adding dummy and several functions for arguments manipulation * tkUtils.tcl: improving widgetName, toplevelName functions. tku::errorDialog and tku::warningDialog deprecated, use tclu::errorDialog and tclu::warningDialog instead. Adding tku::exitApp function. Mon Aug 25 2005 Anton Kokalj (tone.kokalj@ijs.si) * validate.itcl: adding int and real validators Mon Aug 08 2005 Anton Kokalj (tone.kokalj@ijs.si) * gui.itcl, spininthelp.itcl: adding the "addHelp help cascade" possibility, i.e., the help menu can have cascades. Tue Feb 01 2005 Anton Kokalj (tone.kokalj@ijs.si) * validate.itcl, spininthelp.itcl: adding the "binary" (i.e. 0/1) validator * lib/tclUtils.tcl: fixing a small bug in ::tclu::warningDialog. Sat Jan 29 2005 Anton Kokalj (tone.kokalj@ijs.si) * lib/tclUtils.tcl: fixing typo in ::tclu::_error_or_warning_dialog routine Mon Sep 20 2004 Anton Kokalj (tone.kokalj@ijs.si) * gui.itcl: adding "getSelected saveFile" query. Making "save" and "saveAs" methods public * help.itcl: setting the width of help console to 700 pixels (temporarily) * widgets.itcl: making $nev(PWD) as default dir for Entrydirselect * lib/tclUtils.tcl: improving nonblocking mechanism (adding "stdout" and "save" subcommands of nonblocking command) Mon Sep 13 2004 Anton Kokalj (tone.kokalj@ijs.si) * table.itcl: table's checkbutton didn't display updated text upon variable's value change. Fixed by using -textvariable option. The method _checkbuttonText not used anymore. Sat Sep 04 2004 Anton Kokalj (tone.kokalj@ijs.si) * adding a "scriptvar" Guib keywords (=script variables used inside the module definition files) Tue Apr 06 2004 Anton Kokalj (tone.kokalj@ijs.si) * open.itcl: adding ::guib::moduleObj::readFileError and ::guib::moduleObj::readFileWrongFormat for dealing with wrong-formatted input files Mon Apr 05 2004 Anton Kokalj (tone.kokalj@ijs.si) * guibKeywords.itcl: adding a check if help's $ident is valid Fri Apr 02 2004 Anton Kokalj (tone.kokalj@ijs.si) * improving error handling mechanism for ::guib::moduleObj::readFile method (i.e. reading an input file). Adding _openSyntaxError private method for the purpose. The problem was that when a syntax error was present in the input file, this could cause Guib to enter into an invinite loop (spotted by Mickael Profeta) Mon Feb 24 2004 Anton Kokalj (tone.kokalj@ijs.si) * updating doc/usage.tex file and doc/usage/diagrams * adding doc/usage/diagrams/Makefile * renaming doc/usage/diagrams/TkPWscf.* to PWgui.* Mon Feb 23 2004 Anton Kokalj (tone.kokalj@ijs.si) * tclUtils.tcl: fixing tempFile routine to work also for MS-Windows * guib.bat: adding a batch file for MS-DOS/Windows Fri Feb 20 2004 Anton Kokalj (tone.kokalj@ijs.si) * addapting the package to work with Tcl/Tk8.4, Itcl/Itk 3.2, and Iwidgets 4.0 * porting the package to MS-Windows Tue Feb 17 2004 Anton Kokalj (tone.kokalj@ijs.si) * adding help button component to table widget * ChangeLog: the beginning of the ChangeLog ChangeLog ends here espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/TODO0000644000077300007730000002625312341332511017634 0ustar giannozzgiannozz* make a proc: optionmenuhelp -nohelp 1 --> proc optionmenu {} that will pass -nohelp 1 to optionmenuhelp * gui::_openInput: if the two same files are open add some postfix so that the tabname will indicate the 2nd file is opened * when deleting some tab from tabset the enumaration/naming of newly created tabs are not handled correctly. * the state of a given line cannot be changed (i.e. no enable, disable, forget, create): only state of input's variable widgets can be manipulated: would be cool to do that also for line, group, namelist There is actually groupwidget (also keywordwidget) method, but this should be generalized. * there should be a way to specify the maximum length of label (if longer, it's split into several lines). * ::guib::keywordObj::setOptions : needs a better validation for widget and validate option values: maybe they should be checked in the guib-keyword's procs * ::guib::moduleObj::_isDisabledKey : this method should return 0 or 1 and not return -code continue --> don't use this, the caller code is less explicit ------------------------------------------------------------------------ -- BELOW TEXT IS OUT-OF-DATE: ------------------------------------------------------------------------ x.) add a silent save method (no complain). Enhance the save method. Currently, there is too much complains... x.) there is a mass with _comafy $ident now. Some procs expects dim(elem), while the other dim,elem. Check that. x.) optionmenuhelp widget: menubbuton does not disable upon disable request x.) make also "widgetcget" GUIB keyword !!! x.) keyword widgetconfigure bypass the keywordObj cmd() array, hence it become out of date. FIX this synchronization. DONE; check it x.) make a public method that will assign all _guibVar elements to cooresponding variables, i.e., set $varName $_guibVar($ident) !!! x.) should we allow () chars in indentifier. In principle, this is possible, by always _comafy the $ident!!! x.) varvalue should return value, not textvalue, while vartextvalue should return textvalue (create a vartextvalue routine and adapt the code accordingly) (Partly DONE; checking needed) x.) make some mechanism which will enable/disable the GUIB-widget decoration (i.e. Line:, Namelist:, ...), and also chenge the themes on the fly (NOTE: there is already a -noframe option) x.) CONSIDER: in moduleObj constructor all the variables and array elements should be defined in order to avoid variable does not exists errors !!! x.) check all Varident strings (fastly DONE) x.) when testing, test also the namelist "undefined variable" test also help for different stacking x.) getIdFromVarident: the names should be getIdFromVariable & getIdFromIdent. x.) consider the -textvalue -value -default ... options for dimension & tables. Usually, the dimensions are used for some numeric values, and above options are not significant. We can simplify and common -textvalue -value -default for all the dimension elements. Moreover, the varObjList list stores only the root of dimension variable (i.e. if we have dim(10), only the root "dim" is stored. Also the routines valueToTextvalue and textvalueToValue only takes the root-name into account !!! The only expection to the common treatment of the above value is for -default for dimension, which supposes every element can have different default-value. Here is the code: #t.k. # INCOMING: SYNTAX of -default for the dimension: # -default { elem1-default elem2-default elem3-default ... } if { ! [info exists $textVar] } { set default [lindex $itk_option(-default) $icount] if { $default == "" } { set default [lindex $itk_option(-default) end] } $_moduleObj dimset $var $idim $default } #/ x.) implement the cardlist: cardlist -name **** { card ATOMIC_POSITIONS { var { .... }; var { .... } keyword xxxx; var { .... } newline line -name "XXXX" { .... } line -name "XXXX" { .... } } card BLA_BLA card WHATEVER } 0.) I should rename the nomenclature !!! There are seven types of guib keywords: 1. objects -- these create the guib::base object (page, line, namelist, optional, required, group) 2. items -- these are: var, dimension, table, keyword, help 4. events -- event driven keywords (tracevar, widget, groupwidget, widgetconfigure, keywordconfigure) 5. getsets -- keywords associated with querying and setting input variables (varvalue, varname, varset, dimvalue, dimname, dimset, tablevalue, tablename, tableset) 6. specials -- special keywords (readfilter, writefilter, postprocess, this, loaddata) 7. decorations -- these are void, and only create some guib widget decorations (separator) Thre are two levels of objects: moduleObj --> this is the top object holding the everything (i.e. module name -title title -script {...}) keywordObj --> this are keyword objects (constructed by keywords: page, line, namelist, optional, required, group) Hence, I should rename the classes as: guib::moduleObj guib::keywordObj 2.) construct the "separator" magewidget DONE ------------------------------------------------------------------------ DONE ------------------------------------------------------------------------ DONE ------------------------------------------------------------------------ DONE ------------------------------------------------------------------------ DONE ------------------------------------------------------------------------ DONE ------------------------------------------------------------------------ DONE ------------------------------------------------------------------------ 2.) the packwidgets should be stack-like, i.e., specifying packwidgets should have effect on a current or a higher stacking levels !!! (DONE) x.) Transformations: moduleObj.itcl: variables: ---------- traceVarList --> traceVaridentList traceVarModeScriptList --> traceVaridentModeScriptList varWidgetList --> varidentWidgetList varObjList --> varidentObjList methods: -------- getWidgetFromVar --> getWidgetFromVarident _addVarWidget --> _addVaridentWidget _addVarObj --> _addVaridentObj _getObjFromVar --> _getObjFromVarident keywordObj.itcl: methods: -------- getIdFromVar --> getIdFromVarname getIdFromIdent --> getIdFromVarident Status: DONE x.) fix this in open.itcl: body ::guib::moduleObj::_openReadNamelistVar {obj} { set ind [string first = $readline] if { $ind <= 0 } { ::tku::errorDialog "syntax error in the input file. Error in the namelist" } scan [lindex [split $readline =] 0] %s result # do we have dimension/table var(1) or var(1,2) ??? set postfix [lindex [split $result ()] 1] if { $postfix != "" } { set postfix (${postfix}) } ::tclu::DEBUG _openReadNamelistVar: postfix=$postfix # If namelist's variable are case-insensitive, then try to find a # registered variable (i.e. from varObjList) that matches in # "-nocase" fashion !!! foreach {varobj} $varObjList { #FIX.t.k.: map from varname --> varident !!! DONE x.) replace tablename with tableref, sma for dim* DONE x.) check for all *Var routines (_addVarWidget, _addVarObj). Check for everything that contain "Var" DONE. x.) check for all "getOptionValue $id variable" and replace with "getOptionValue $id ident" DONE. x.) in save.itcl: for {set i $start} {$i <= $end} {incr i} { # TODO: a validation against the format-string set varName ${dimName}($i) #FIX.t.k. #... DONE. x.) check for tableName and tableIdent !!! (same for dimName ...) DONE. x.) update the getIdFromVar (shoudl refer to ident !!!) DONE x.) in open.itcl: while { $readline != {} } { set varName [_openReadNamelistVar $childObj] set varValue [_openReadNamelistValue] # check if varName is defined; if NOT # ... TODO: put it under "undefined" variables # (only if undefined variables are supported, # otherwise report an error in the input) -------------------> # TODO: map from varName to varIdent !!! DONE. x.) check this code (TODO mark): body ::guib::moduleObj::_getObjFromVar {varIdent} { set i [lsearch -glob $varObjList [list $varIdent *]] if { $i == -1 } { # TODO: check this ... (I guess it is useless) # maybe varIdent corresponds to dimension, # i.e. var(x), but we need just "var" set varIdent [lindex [split $varIdent "("] 0] set i [lsearch -glob $varObjList [list $varIdent *]] } if { $i == -1 } { return {} } else { return [lindex [lindex $varObjList $i] 1] } } DONE. x.) now I changed the syntax to var ident ?options? Before fully updating the code, make clear when we want the value of -variable and when ident!!! For example, ident is unique, the value of -variable is not (in general). For querying the widgets and other info of a given variable, the "ident" should be used, but when saving the file, the value of "-variable" should be used instead. Due to this, we have to adapt varname-varvalue-varset family of options. First the "varname" should be renamed to "varref" or "varpointer" or "var****" Replacements: varvalue var --> varvalue ident varname var --> varref ident varset var value --> varset ident value Then we should add an additional routine that returns -variable option-value of a given key on the basis of ident. Possible syntax could be: > keyinfo $ident option or > getFromIdent $ident pattern or > getFromIdent options $ident pattern > getFromIdent option $ident option or > indentinfo $ident what (<-- THIS WAS SELECTED !!!) NOTE: this getFromIndent is not a GUIB keyword since it will probably be only used internally !!! DONE. x.) correct this error: body ::guib::moduleObj::_manageNameObj {key args} { .... # ERROR: # make a unique name of nameObjList # TODO: this is not OK, as later the searching by "gropuwidget" # will be unsuccessful !!! set _i 0 while { [lsearch $nameObjList $value] > -1 } { set value "${value}~[incr _i]" } lappend nameObjList [list $value $childObj] # END: ... } SOLUTION: solution is the following syntax: namelist ident -name name { ... } CONSIDER: consider adapting such a syntax for items and objects, i.e., keyword ident -optionn value { ... } DONE. 1.) check the validation procedures (nonnegint, nonposint, and alike) (DONE) 3.) namelist variables should be case-insensitive, make a settings() variable for specifying the case-insensitivity of the input. (DONE) 4.) there was en error reading line {} do to nesting object possibility. The reading was fixed, but writing is still erroneous !!! (DONE) seems also writing works) x.) check what is going on with nameObjList DONE. x.) in build.itcl: check for -variable and -ident options !!! DONE. x.) table: open.save does not work !!! DONE. x.) it is not clear for keyword: keyword ident keyword (are we refering to keyword or to ident when enabling/disabling)!!! DONE. x.) make a method/proc for changing the default values of options() DONE. x.) handle the "!", i.e., comments in namelists DONE. espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/VERSION0000644000077300007730000000000612341332511020200 0ustar giannozzgiannozz0.5.1 espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/THANKS0000644000077300007730000000026412341332511020051 0ustar giannozzgiannozzThanks to: Carlo Cavazzoni, and Roberto Gori: for discussions, testing and bug reports. Stefano Baroni and the rest of the PWscf team: for showing interest in GUIB project espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/lib/0000755000077300007730000000000012341333047017707 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/lib/tclIndex0000644000077300007730000001251712341332511021405 0ustar giannozzgiannozz# 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(::tku::widgetName) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::toplevelName) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::toplevelExists) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::disableAll) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::enableAll) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::getAllDescendants) [list source [file join $dir tkUtils.tcl]] set auto_index(getAllDescendants_) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::mouseWheelScrollCanvas) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::mouseWheelScrollDeleteBindings) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::centerWindow) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::createFont) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::setCursor) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::resetCursor) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::watchExec) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::getOpenFile) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::getSaveFile) [list source [file join $dir tkUtils.tcl]] set auto_index(::tku::exitApp) [list source [file join $dir tkUtils.tcl]] set auto_index(::tclu::dummy) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::absolutePath) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::usage) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::writeFile) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::readFile) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::lineread) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::DEBUG) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::ERROR) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::abort) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::errorDialog) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::warningDialog) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::_error_or_warning_dialog) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::labelMsg) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::putsFlush) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::printf) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::printfFlush) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::fprintf) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::fprintfFlush) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::public) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::getPublic) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::private) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::getPrivate) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::range) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::newset) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::incr) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::ifexists) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::scan) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::_nextFmtSpec) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::lpresent) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::lremove) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::lpop) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::ladd) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::lget) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::lequal) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::format) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::tempFile) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::_tempFile_name) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::_tempFile_delete) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::tempDir) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::stringMatch) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::nonblocking) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::_nonblockingEvent) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::expandArgs) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::getArgs) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::extractArgs) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::modePatternArgs) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::mustBeEvenNumOfArgs) [list source [file join $dir tclUtils.tcl]] set auto_index(::tclu::mustBeOddNumOfArgs) [list source [file join $dir tclUtils.tcl]] espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/lib/tclUtils.tcl0000644000077300007730000013213312341332511022214 0ustar giannozzgiannozz# # $RCSfile: tclUtils.tcl,v $ -- # # This file contains the Tone Kokalj's Tcl utilities functions. # # Copyright (c) 2003-2008 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: tclUtils.tcl,v 1.16 2009-08-03 14:10:18 kokalj Exp $ # #------------------------------------------------------------------------ #****h* TclTkLib/::tclu # NAME # TCLU == Tone Kokalj's Tcl Utilities # # COPYRIGHT # 2001--2004 (c) by Tone Kokalj # AUTHOR # Tone Kokalj # CREATION DATE # Starting on Fri Dec 14 08:32:59 CET 2001 # NOTES # Here are the basic Tcl-only utility functions. #****** #------------------------------------------------------------------------ package require fileutil package provide tclu 0.9 namespace eval ::tclu { variable DEBUG 0 variable DEBUG_FILE 0 variable debug variable error variable public variable private variable _line "------------------------------------------------------------------------" variable tempFile variable nonblocking set tempFile(counter) 0 set tempFile(files) {} set tempFile(dirs) {} set nonblocking(counter) -1 namespace export dummy namespace export absolutePath namespace export usage namespace export writeFile namespace export readFile namespace export lineread namespace export DEBUG namespace export ERROR namespace export errorDialog namespace export warningDialog namespace export labelMsg namespace export putsFlush namespace export printf namespace export printfFlush namespace export fprintf namespace export fprintfFlush namespace export public namespace export getPublic namespace export private namespace export getPrivate namespace export range namespace export newset namespace export ifexists namespace export lpresent namespace export lremove namespace export lpop namespace export ladd namespace export lget namespace export lequal namespace export tempFile namespace export tempDir namespace export stringMatch namespace export nonblocking namespace export expandArgs namespace export getArgs namespace export extractArgs namespace export modePatternArgs namespace export mustBeEvenNumOfArgs namespace export mustBeOddNumOfArgs # Don't export the following cmd's, because their names clash with # Tcl-commands: # scan # format # incr } #****f* ::tclu/::tclu::dummy # SYNOPSIS proc ::tclu::dummy {} { # PURPOSE # Do nothing. # SOURCE return "" } #****** #****f* ::tclu/::tclu::absolutePath # SYNOPSIS proc ::tclu::absolutePath {path} { # PURPOSE # Return absolute path. Please use "file normalize instead". # ARGUMENTS # * name -- name of the file # SOURCE return [file normalize $path] } #****** #****f* ::tclu/::tclu::usage # SYNOPSIS proc ::tclu::usage {args} { # USAGE # ::tclu::usage ?channelID? text # PURPOSE # Prints a USAGE message. # ARGUMENTS # * channelID -- (optional) a channel identifier as returned from call to open or socket # * text -- a usage-text to be printed # EXAMPLE # ::tclu::usage stderr "::tclu::usage ?channelID? text" # SOURCE variable _line if { [llength $args] > 2 } { ::tclu::usage "::tclu::usage ?channelID? text" } set channel stderr set text [lindex $args end] if { [llength $args] == 2 } { set channel [lindex $args 0] } puts $channel $_line puts $channel [labelMsg Usage $text] putsFlush $channel $_line\n } #******** #****f* ::tclu/::tclu::writeFile # SYNOPSIS proc ::tclu::writeFile {filename content {flag w}} { # DESCRIPTION # Write a content to a file. # ARGUMENTS # * filename -- name of the file to be written # * content -- content to be writtento a file # * flag -- (optional) access flag for "open" Tcl command, i.e., w, w+, a, a+ # EXAMPLE # ::tclu::writeFile test.txt {This is a test.txt file} w # SOURCE set fID [open $filename $flag] puts $fID $content flush $fID close $fID } #******** #****f* ::tclu/::tclu::readFile # SYNOPSIS proc ::tclu::readFile {args} { # USAGE # ::tclu::readFile ?-nonewline? filename # # DESCRIPTION # Reads a file and returns its content. If the -nonewline # switch is specified then the last character of the file is # discarded if it is a newline. # # SOURCE set filename [lindex $args end] set fID [open $filename r] set bytes [file size $filename] if { [llength $args] == 2 } { set flag [lindex $args 0] set output [read $flag $fID] } else { set output [eval read $fID $bytes] } close $fID return $output } #******** #****f* ::tclu/::tclu::lineread # SYNOPSIS proc ::tclu::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 } #****** #****f* ::tclu/::tclu::DEBUG # SYNOPSIS proc ::tclu::DEBUG {args} { # USAGE # ::tclu::DEBUG ?-stderr? message # # DESCRIPTION # Prints a DEBUG message either to stdout or to stderr (when # -stderr option is specified). # # If ::tclu::DEBUG_FILE variable is set it also prints debugging # message to DEBUG file. # # EXAMPLE # ::tclu::DEBUG -stderr "Variable A has a value: $A" # SOURCE variable DEBUG variable DEBUG_FILE variable debug if { [lindex $args 0] == "-stderr" } { set channel stderr set text [lrange $args 1 end] } else { set channel stdout set text $args } if { $DEBUG } { puts $channel "DEBUG:: $text" flush $channel } if { $DEBUG_FILE } { if { ! [info exists debug(channel)] } { set debug(channel) [open DEBUG w] set debug(id) 0 } if { [info level] > 1 } { puts $debug(channel) "--\nDEBUG message \#$debug(id); Call from: [info level -1]\n$text" } else { puts $debug(channel) "--\nDEBUG message \#$debug(id); Call from top-level\n$text" } flush $debug(channel) incr debug(id) } } #******** #****f* ::tclu/::tclu::ERROR # SYNOPSIS proc ::tclu::ERROR {errMsg {info {}} {code {}}} { # DESCRIPTION # Like a Tcl-error cmd, but add the ERROR: prefix to the error message # ARGUMENTS # * errMsg -- error message # * info -- used to initialize the global variable errorInfo, # which is used to accumulate a stack trace # * error -- its value is stored in Tcl's errorCode variable # RETURN VALUE # Generates and error message. # EXAMPLE # ::tclu::ERROR {an error hac occurred because variable xyz is not defined} # SOURCE variable error variable _line set error(errMsg) "[labelMsg ERROR $errMsg]\n" set error(info) $info set error(code) $code uplevel 1 { error $::tclu::error(errMsg) $::tclu::error(info) $::tclu::error(code) } } #******** #****f* ::tclu/::tclu::abort # SYNOPSIS proc ::tclu::abort {msg {exit_status 1}} { # PURPOSE # Print a message and abort (i.e. exit from application). # ARGUMENTS # * msg -- message to print to stderr before exiting. # * exit_status -- (optional, default = 1) # SOURCE puts stderr "\n[labelMsg ABORT $msg]" if { [info level] > 1 } { puts stderr "\nABORT statement executed in: [info level -1]" } else { puts stderr "\nABORT statement executed in top-level" } exit $exit_status } #****** #****f* ::tclu/::tclu::errorDialog # SYNOPSIS proc ::tclu::errorDialog {errMsg} { # DESCRIPTION # Prints an error message either to stderr or into tk_messageBox # when Tk package is present. # ARGUMENTS # * errMsg -- error message # EXAMPLE # ::tclu::errorDialog "an error hac occurred because variable xyz is not define" _error_or_warning_dialog error $errMsg } #******** #****f* ::tclu/::tclu::warningDialog # SYNOPSIS proc ::tclu::warningDialog {warnMsg} { # DESCRIPTION # Prints a warning message either to stderr or into tk_messageBox # when Tk package is present. # ARGUMENTS # * warnMsg -- warning message # EXAMPLE # ::tclu::warningDialog "file \"$file\" does not exist" _error_or_warning_dialog warning $warnMsg } #******** proc ::tclu::_error_or_warning_dialog {type msg} { variable _line set types {error warning} if { [lsearch -exact $types $type] >= 0 } { set TYPE [string toupper $type] if { [catch {package present Tk}] } { # make a nicely formated message set message "\n$_line\n" append message "[labelMsg $TYPE $msg]\n" append message "$_line\n" puts stderr $message flush stderr } else { tk_messageBox -title $TYPE -message $msg -type ok -icon $type } } else { error "wrong type \"$type\" in ::tclu::_error_or_warning_dialog, should be [join $types ,]" } } #****f* ::tclu/::tclu::labelMsg # SYNOPSIS proc ::tclu::labelMsg {label msg} { # PURPOSE # Create a nicely formated (multi-line) message with starting # "label". In particular, the 2nd and subsequent lines will be # properly indented. See the example below. # # EXAMPLE # This call: # ::tclu::labelMsg ERROR { the soure of the error is # a bit curious. # } # # will produce the following message: # # ERROR: the source of the error is # a bit curious. # # ARGUMENTS # * label -- label-text to apper as a prefix of the message # * msg -- message to label and format # SOURCE set il 1 set len [string length $label] set message {} foreach line [split [string trim $msg] \n] { if { $il == 1 } { append message [::format "%${len}s: %s\n" $label $line] incr len incr il } else { append message [::format "%${len}s %s\n" {} $line] } } return [string trim $message] } #****** #****f* ::tclu/::tclu::putsFlush # SYNPOSIS proc ::tclu::putsFlush {args} { # USAGE # ::tclu::putsFlush ?-nonewline? ?channelId? string # # DESCRIPTION # Identical to Tcl's puts, but invoke the flush immediately after. # See puts man-page of Tcl. # # SOURCE 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 } #******** #****f* ::tclu/::tclu::printf # SYNOPSIS proc ::tclu::printf {format args} { # USAGE # ::tclu::printf format ?arg? ?arg? ... # # DESCRIPTION # A C-style printf: it prints to stdout like the C-style printf. # ARGUMENTS # * format -- format description # * args -- arguments to print # EXAMPLE # ::tclu::printf "%s%d\n" "Value of i:" $i # SOURCE puts stdout [eval format [list $format] $args] } #******** #****f* ::tclu/::tclu::printfFlush # SYNOPSIS proc ::tclu::printfFlush {format args} { # USAGE # ::tclu::printfFlush format ?arg? ?arg? ... # # DESCRIPTION # Prints to stdout in like C-style printf and flushes stdout. # # ARGUMENTS # * format -- format description # * args -- arguments to print # EXAMPLE # ::tclu::printfFlush "%s%d\n" "Value of i:" $i # SOURCE puts stdout [eval format [list $format] $args] flush stdout } #******** #****f* ::tclu/::tclu::fprintf # SYNOPSIS proc ::tclu::fprintf {channel format args} { # USAGE # ::tclu::fprintf channel format ?arg? ?arg? ... # DESCRIPTION # A C-style fprintf: prints to $channel like C-style fprintf would. # ARGUMENTS # * channel -- a channel identifier such as returned from call to # open or socket # * format -- format description # * args -- arguments to print # EXAMPLE # ::tclu::fprintf $channelID "%s%d\n" "Value of i:" $i # SOURCE puts $channel [eval format [list $format] $args] } #******** #****f* ::tclu/::tclu::fprintfFlush # SYNOPSIS proc ::tclu::fprintfFlush {channel format args} { # USAGE # ::tclu::fprintf channel format ?arg? ?arg? ... # DESCRIPTION # Prints to $channel like the C-style fprintf would and flashes the $channel. # ARGUMENTS # * channel -- a channel identifier such as returned from call to # open or socket # * format -- format description # * args -- arguments to print # EXAMPLE # ::tclu::printfFlush $channelID "%s%d\n" "Value of i:" $i # SOURCE puts $channel [eval format [list $format] $args] flush $channel } #******** #------------------------------------------------------------------------ #****f* ::tclu/::tclu::public # NAME # ::tclu::public -- miminc a "public" keyword of [Incr Tcl] # USAGE # ::tclu::public proc1 ?proc2? ... # # DESCRIPTION # This is dummy proc, used to enhance the syntax and # readability of the code. This should be used to define public procs # in a namescape. # ARGUMENTS # * args -- a procs to be registered as public # RETURN VALUE # None. # EXAMPLE # ::tclu::public proc1 proc2 proc3 #******** #------------------------------------------------------------------------ proc ::tclu::public {args} { variable public set public(args) $args uplevel 1 { set namespace [namespace current] foreach proc $::tclu::public(args) { lappend ::tclu::public(procs,$namespace) $proc } } } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::getPublic # NAME # ::tclu::getPublic -- returns all public procs inside a current namespace # that matches a pattern # USAGE # ::tclu::getPublic ?pattern? # # DESCRIPTION # Returns all public procs names inside a current namespace that matches a # pattern. If pattern is omitted, then all public procs manes are returned. # ARGUMENTS # * pattern -- a pattern to match against the public proc names # RETURN VALUE # All public procs names inside a current namespace that matches. # EXAMPLE # ::tclu::getPublic *get* # SEE ALSO # ::tclu::public #******** #------------------------------------------------------------------------ proc ::tclu::getPublic {{pattern *}} { variable public set public(pattern) $pattern uplevel 1 { set procs {} set namespace [namespace current] foreach proc $::tclu::public(procs,$namespace) { if { [string match $::tclu::public(pattern) $proc] } { lappend procs $proc } } return $procs } } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::private # NAME # ::tclu::private -- miminc a "private" keyowrd of C++ # USAGE # ::tclu::private proc1 ?proc2? ... # # DESCRIPTION # This is dummy proc - used to enhance the syntax and # readability of the code. This should be used to define private procs # in a namescape # ARGUMENTS # * args -- a procs to be registered as private # RETURN VALUE # None. # EXAMPLE # ::tclu::private proc1 proc2 proc3 #******** #------------------------------------------------------------------------ proc ::tclu::private {args} { variable private set private(args) $args uplevel 1 { set namespace [namespace current] foreach proc $::tclu::private(args) { lappend ::tclu::private(procs,$namespace) $proc } } } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::getPrivate # NAME # ::tclu::getPrivate -- returns all private procs inside a current namespace # that matches a pattern # USAGE # ::tclu::getPrivate ?pattern? # # DESCRIPTION # Returns all private procs names inside a current namespace that matches a # pattern. If pattern is omitted, then all private procs manes are returned. # ARGUMENTS # * pattern -- a pattern to match against the private proc names # RETURN VALUE # All private procs names inside a current namespace that matches. # EXAMPLE # ::tclu::getPrivate *get* # SEE ALSO # ::tclu::private #******** #------------------------------------------------------------------------ proc ::tclu::getPrivate {{pattern *}} { variable private set private(pattern) $pattern uplevel 1 { set procs {} set namespace [namespace current] foreach proc $::tclu::private(procs,$namespace) { if { [string match $::tclu::private(pattern) $proc] } { lappend procs $proc } } return $procs } } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::range # NAME # ::tclu::range -- variation of lrange Tcl command, the difference is that it # concatenates the elements # USAGE # ::tclu::range list start end # # DESCRIPTION # It is like lrange Tcl command, the difference is that it concats # (i.e. format "%s ") insted of list the elements together. # ARGUMENTS # * list -- a list to search # * start -- first element in the range # * end -- last element in the range (can also have a value "end") # RETURN VALUE # Return the elements in the range [start,end] concatenated together. # EXAMPLE # ::tclu::range $list 1 3 #******** #------------------------------------------------------------------------ proc ::tclu::range {list start end} { set out {} if { $end == "end" } { set end [expr {[llength $list] - 1}] } for {set i $start} {$i <= $end} {incr i} { append out [format "%s " [lindex $list $i]] } return [string trim $out] } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::newset # NAME # ::tclu::newset -- sets the variable ONLY if it doesn't already exists # USAGE # ::tclu::newset varName value # DESCRIPTION # Sets the variable only if it doesn't already exists !!! # ARGUMENTS # varName - name of a variable to set # value - value to be assigned to varName # RETURN VALUE # Returns $value. # EXAMPLE # ::tclu::newset today {Dec 14} #******** #------------------------------------------------------------------------ proc ::tclu::newset { varName {value {}} } { upvar 1 $varName var if { ![info exists var] } { set var $value } return $value } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::incr # NAME # ::tclu::incr -- increases the variable by value # USAGE # ::tclu::incr varName ?value? # DESCRIPTION # Like the Tcl incr command, but if the variable doesn't already # exists it sets it to zero. # ARGUMENTS # * varName -- name of the variable # * value -- increase value # RETURN VALUE # Returns the value of a variable on exit. # EXAMPLE # ::tclu::incr ipol -1 #******** #------------------------------------------------------------------------ proc ::tclu::incr {varName {value 1}} { upvar 1 $varName var if { ![info exists var] } { set var 0 } else { ::incr var $value } return $var } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::ifexists # NAME # ::tclu::ifexists -- execute a script in uplevel 1 level if variable exists # USAGE # ::tclu::ifexists varName script # DESCRIPTION # Execute the script only when variable varName exists. # ARGUMENTS # * varName -- name of the variable # * script -- script to execute # RETURN VALUE # None. # EXAMPLE # ::tclu::ifexists ipol { incr ipol -2 } #******** #------------------------------------------------------------------------ proc ::tclu::ifexists {varName script} { upvar 1 $varName var if { [info exists var] } { uplevel 1 $script } } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::scan # NAME # ::tclu::scan -- an enhanced Tcl scan command with the %S option # USAGE # ::tclu::scan string formatString var1 ?var2? ... # DESCRIPTION # This is an enhanced Tcl scan command with an additional %S or %nS # formating option, n being an integer. The %S option means a text-string which # can contain the white-spaces. The %S reads up to the end of the string, # while %nS reads n characters. # ARGUMENTS # * string -- string to scan # * formatString -- string which holds the format conversion specifiers # * args -- a list of variables which will hold the scaned values # RETURN VALUE # Number of scan conversions or -1 if an EOF occurs. # EXAMPLE # ::tclu::scan $string "%S %6.3f" textString floatNumber #******** #------------------------------------------------------------------------ proc ::tclu::scan {string formatString args} { #------------------------------------------------------------------------ # possible solutions for the %S # ----------------------------- # 1.) %S reads the whole string or ???reads "to je tone" or 'to je tone'??? # 2.) %[0-9]+S reads [0-9]+ characters !!! # hence this means one must be extremely careful with it, since # %s%S%f would be a nonsense, since %S would scan trough the whole string !!! #------------------------------------------------------------------------ # # Search for the %S format-string and make "composite" scan command. # Example: # ::tclu::scan {1.2 2.5 {To je Tone}} %15.10f%15.10f%S var1 var2 var3 # # this example should store 1.2 in var1, 2.5 in var2, and "To je # Tone" in var3 set startIndex 0 set nvar [llength $args] for {set i 0} {$i < $nvar} {incr i} { set varname [lindex $args $i] upvar $varname var set _fmt [_nextFmtSpec $formatString] if { [regexp {^%[0-9]*S} $_fmt] } { # %S formating option has been specified if { [regexp {^%[0-9]+S} $_fmt] } { # scan only requested number of characters, and assing them to var set var [string range $string 0 [expr {[string trim $_fmt %S] - 1}]] } else { # scan the whole string, i.e. assign $string to var set var $string return [expr {$i + 1}] } } elseif { [::scan "$string" $_fmt var] < 0 } { return -1 } set formatString [string range $formatString [string length $_fmt] end] set pos [string first $var $string] set string [string range $string [expr {[string length $var] + 1 + $pos}] end] } return $i } proc ::tclu::_nextFmtSpec {string} { set ind [string first % $string 0] set ind [string first % $string [incr ind]] if { $ind == -1 } { return [string range $string 0 end] } else { return [string range $string 0 [expr {$ind - 1}]] } } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::lpresent # NAME # ::tclu::lpresent -- checks if the element is in list # USAGE # ::tclu::lpresent list element # DESCRIPTION # This proc checks if element is present in the list. # ARGUMENTS # * list -- list to check # * element -- value of a list element to query # RETURN VALUE # Returns 1 if element is present in list and 0 otherwise. # EXAMPLE # ::tclu::lpresent $list $element #******** #------------------------------------------------------------------------ proc ::tclu::lpresent {list element} { set ind [lsearch -exact $list $element] return [expr {$ind >= 0 ? 1 : 0}] } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::lremove # NAME # ::tclu::lremove -- removes element from list # USAGE # ::tclu::lremove listVar element # DESCRIPTION # This proc removes all occurrences on the element from the listVar. # ARGUMENTS # * listVar -- name of the variable holding the list # * element -- value of a list element to query # RETURN VALUE # returns 1 if element was removed and 0 otherwise. # EXAMPLE # ::tclu::lremove thisList $element #******** #------------------------------------------------------------------------ proc ::tclu::lremove {listVar element} { upvar $listVar lvar # Fast-check: does listVar holds a single element which is equal to $element ? if { $lvar == $element } { # remove the only element set lvar {} return 1 } set result 0 foreach elem $lvar { if { ! [string match $element $elem] } { lappend nl $elem } else { set result 1 } } if { [info exists nl] } { set lvar $nl } return $result } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::lpop # NAME # ::tclu::lpop -- remove i-th element from list # USAGE # ::tclu::lpop listVar index # DESCRIPTION # This proc removes the ith element from the listVar. # ARGUMENTS # * listVar -- name of the variable holding the list # * index -- index (0 ... end) of element to drop from list [optional, default = "end"] # RETURN VALUE # New list with removed element. # EXAMPLE # ::tclu::lpop thisList end #******** #------------------------------------------------------------------------ proc ::tclu::lpop {listVar {index end}} { upvar $listVar lvar set len [llength $lvar] if { $index == "end" } { set index [expr {$len - 1}] } if { ! [string is integer $index] } { error "wrong index $index, must be integer number or \"end\"" } if { $index < 0 || $index > $len - 1 } { error "index out of range" } set result "" set count 0 foreach elem $lvar { if { $count != $index } { lappend result $elem } incr count } set lvar $result return $result } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::ladd # NAME # ::tclu::ladd -- adds an element to list only if it's not in the list # USAGE # ::tclu::ladd listVar element # DESCRIPTION # This proc is similar to Tcl lappend, put it adds an element to # the list only when it is not already present the list. # ARGUMENTS # * listVar -- name of the variable holding the list # * element -- value of a list element to query # RETURN VALUE # returns 1 if element was added and 0 otherwise. # EXAMPLE # ::tclu::ladd thisList $element #******** #------------------------------------------------------------------------ proc ::tclu::ladd {listVar element} { upvar $listVar lvar if { [lsearch -exact $lvar $element] < 0 } { lappend lvar $element #uplevel "lappend $listVar [list $element]" return 1 } else { return 0 } } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::lget # USAGE # ::tclu::lget list index # DESCRIPTION # This proc is like Tcl lindex, but if index is larger then "end" # then it returns last element in list. # ARGUMENTS # * list -- a list # * index -- index of the list element # RETURN VALUE # returns the index's element from list, or the last one if index > end. # EXAMPLE # ::tclu::lget $mylist $element #******** #------------------------------------------------------------------------ proc ::tclu::lget {list index} { set length [llength $list] set lm [expr {$length - 1}] set index [expr {$index > $lm ? "end" : $index}] return [lindex $list $index] } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::lequal # USAGE # ::tclu::lequal list1 list2 # DESCRIPTION # This proc checks if list1 is equal to list2 and if so it returns # 1, otherwise 0. # ARGUMENTS # * list1 -- 1st list # * list2 -- 2nd list # RETURN VALUE # 1 or 0, depending on the equality of list 1 and list2. #******** #------------------------------------------------------------------------ proc ::tclu::lequal {list1 list2} { if { [llength $list1] != [llength $list2] } { return 0 } foreach e1 $list1 e2 $list2 { if { ! [string match $e1 $e2] } { return 0 } } return 1 } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::format # NAME # ::tclu::format -- an enhanced Tcl-format command with the %S option added # USAGE # ::tclu::format formatString args # DESCRIPTION # This is an enhanced format command with the additional %S # option. The %S option means a text-string which can contain the # white-spaces. For format %s and %S would be the same, but not for the # scan. Therefore %S in format is used for compatibility of %S in # ::tclu::scan # ARGUMENTS # * formatString -- string which holds the format conversion specifiers # * args -- arguments which will be formated # RETURN VALUE # Formated string. # EXAMPLE # ::tclu::format "%S %6.3f" {Value of the variable is:} 10.3 #******** #------------------------------------------------------------------------ proc ::tclu::format {formatString args} { regsub -all {(%)([-]?)([0-9]*)(S)} $formatString {\1\2\3s} formatString return [eval ::format [list $formatString] $args] } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::tempFile # NAME # ::tclu::tempFile -- utility for managing temporary files # USAGE # ::tclu::tempFile name|open|delete ?args? # DESCRIPTION # This procedure namages the temporary files. It has three different # modes of operations: # # tempFile name ?prefix? -- returns the full path-name of the temporary # file. If prefix is specified, the filename # will be of type prefix.* # # tempFile open ?prefix? -- does as tempFile name, but additionally opens # the file for writing. Returns the channel ID. # # tempFile delete all # or # tempFile delete $filename1 ?$filename2? # -- deletes the temporary files. The "tempFile # delete all" deletes all temporary files, whereas in # other mode only specified files are deleted. # # RETURN VALUE # 1. In mode "name" the routine returns the full temporary-file pathname. # 2. In mode "open" the routine returns the channel ID of opened temporary-file # 3. In mode "delete" the routine returns an empty string. # EXAMPLE # set tempfile [::tclu::tempFile name] #******** #------------------------------------------------------------------------ proc ::tclu::tempFile {what args} { variable tempFile switch -- $what { name { # # returns the name of a tempfile # # Usage: tempFile name ?prefix? return [_tempFile_name $args] } open { # # set the name and opens the tempFile for writing; # returns the channel # # Usage: tempFile open ?prefix? set tmpfile [::tclu::_tempFile_name $args] set channel [open $tmpfile w] return $channel } delete { # # delete a temporary directory # # Usage: tempFile delete all|$filenames if { $args == "" } { ::tclu::usage "::tclu::tempFile delete all\nor\n::tclu::tempFile delete \$filename1 ?\$filename2? ..." } _tempFile_delete $tempFile(files) $args } default { error "expected \"name\", \"open\", or \"delete\", but got \"$what\"" } } return "" } proc ::tclu::_tempFile_name {args} { variable tempFile global env tcl_platform # PURPOSE # Returns the name of a tempfile. # USAGE # _tempFile_name ?prefix? if { $args == "" } { set prefix temp } else { set prefix [lindex $args 0] } set tmpdir [::fileutil::tempdir] if { ! [file writable $tmpdir] } { error "Failed to get a writable temporary directory" } if { $tcl_platform(platform) == "unix" } { set file ${prefix}.[pid].$tempFile(counter) } else { set file ${prefix}[pid]n$tempFile(counter) } set tmpfile [file join $tmpdir $file] incr tempFile(counter) lappend tempFile(files) $tmpfile return $tmpfile } proc ::tclu::_tempFile_delete {allfiledirs what} { # # delete the tempFile|tempDir # # usage: _tempFile_delete allfiledirs all|$filenames|$dirnames if { $what == "all" } { set files $allfiledirs } else { set files $what } catch {eval {file delete -force} $files} } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::tempDir # NAME # ::tclu::tempDir -- utility for managing temporary directories # USAGE # ::tclu::tempDir create|delete ?args? # DESCRIPTION # This procedure namages the temporary directories. It has two different # modes of operations: # # tempDir create ?prefix? -- returns the full path-name of the created # temporary directory. If prefix is specified, # the dirname will be of type prefix.* # # tempDir delete all # or # tempDir delete $dirname1 ?$dirname2? ... # -- deletes the temporary directories. The "tempDir # delete all" deletes all directories, whereas in # other mode only specified directories are deleted. # # RETURN VALUE # * In mode "create" the routine returns the full temporary-dir pathname. # * In mode "delete" the routine returns an empty string. # EXAMPLE # set tmpdir [::tclu::TempDir $name] #******** #------------------------------------------------------------------------ proc ::tclu::tempDir {what args} { variable tempFile switch -- $what { create { # # create a temporary directory # # usage: tempDir create ?prefix? set tempdir [_tempFile_name $args] file mkdir $tempdir lappend tempFile(dirs) $tempdir return $tempdir } delete { # # delete a temporary directory # # usage: tempDir delete all|dirname if { $args == "" } { ::tclu::usage "::tclu::tempDir delete all\nor\n::tclu::tempDir delete \$dirname1 ?\$dirname2? ..." } _tempFile_delete $tempFile(dirs) $args } default { error "expected \"name\", \"open\", or \"delete\", but got \"$what\"" } } return "" } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::stringMatch # NAME # ::tclu::stringMatch -- "string match" according to nocase specification # USAGE # stringMatch pattern string ?nocase? # DESCRIPTION # This procedure is a variation of the theme on Tcl's "string match # ?-nosace? pattern string" command. The only difference between the two is # the usage. Namely: # # Tcl command: string match ?-nocase? pattern string # # ::tclu:: proc: stringMatch pattern string 0|1 # # ARGUMENTS # * pattern -- as in "string match $pattern $string" # * string -- as in "string match $pattern $string" # * nocase -- flag for case sensitive/insensitive match (must be 0|1) # RETURN VALUE # Returns 1 if pattern and string matches, and 0 otherwise. # EXAMPLE # set match [::tclu::stringMatch what* WhatEver 0] #******** #------------------------------------------------------------------------ proc ::tclu::stringMatch {pattern string {nocase 0}} { if { $nocase == 0 } { return [string match $pattern $string] } else { return [string match -nocase $pattern $string] } } #------------------------------------------------------------------------ #****f* ::tclu/::tclu::nonblocking # NAME # ::tclu::nonblocking -- executes a program in nonblocking mode # USAGE # ::tclu::nonblocking open|exec|unset|kill ?args? # DESCRIPTION # This procedure namages the executions of external programs in # nonblocking mode. Modes of operations: # # 1. nonblocking open -- returns an ID for subsequent call to "nonblocking exec" # # 2. nonblocking exec id args -- executes external program ($args) in nonblocking mode. The "id" is the return-value of the previous "nonblocking open" call. # # 3. nonblocking stdout id cmd -- will call the cmd and pass the new text on stdout to a proc "cmd". The proc should be of form: cmd id text # # 4. nonblocking save id file -- will save the stdout to file # # 5. nonblocking unset id -- will unset all nonblocking(*,$id) array elements. Call this when a nonblocking id'th information is not needed anymore. # # 6. nonblocking kill id -- kills the nonblocking id process # # RETURN VALUE # 1. In mode "open" the routine returns the ID. # # EXAMPLE # Here is a simple example: # set id [::tclu::nonblocking open] # ::tclu::nonblocking exec $id $myProgram $myProgramOption # # # here do something with the ::tclu::nonblocking(*,$id) information # .... # # # now the ::tclu::nonblocking(*,$id) information is not needed anymore # ::tclu::nonblocking unset $id #******** #------------------------------------------------------------------------ proc ::tclu::nonblocking {mode args} { variable nonblocking switch -exact -- $mode { open { set count [incr nonblocking(counter)] set nonblocking(status,$count) 1 return $count } exec { set count [lindex $args 0] if { ! [string is integer $count] } { ::tclu::ERROR "expected integer but got $count" return 0 } if { ! [info exists nonblocking(status,$count)] } { ::tclu::ERROR "not a valid id, $count, for nonblocking exec ..." return 0 } if { [info exists nonblocking(done,$count)] } { ::tclu::ERROR "\"::tclu::nonblocking exec $count\" is locked, likely it has already been executed priviously" return 0 } set args [lrange $args 1 end] set nonblocking(done,$count) 0 set nonblocking(fID,$count) [open [concat | $args] r] fconfigure $nonblocking(fID,$count) -blocking 0 fileevent $nonblocking(fID,$count) readable [list ::tclu::_nonblockingEvent $count] #tkwait variable ::tclu::nonblocking(done,$count) vwait ::tclu::nonblocking(done,$count) return $nonblocking(status,$count) } stdout { set count [lindex $args 0] set nonblocking(stdoutCmd,$count) [lindex $args 1] } save { set count [lindex $args 0] set saveFile [lindex $args 1] writeFile $saveFile $nonblocking(output,$count) } unset { foreach id $args { if { ![info exists nonblocking(done,$id)] } { ::tclu::ERROR "nonblocking exec id $id does not exists" } array unset nonblocking *,$id } } kill { foreach id $args { if { ! [info exists nonblocking(done,$id)] } { ::tclu::ERROR "nonblocking exec id $id does not exists" } catch {close $nonblocking(fID,$count)} } } default { ::tclu::usage "::tclu::nonblocking open|exec|unset|kill ?args?" } } } proc ::tclu::_nonblockingEvent {count} { variable nonblocking if { ! [eof $nonblocking(fID,$count)] } { set txt [gets $nonblocking(fID,$count)] append nonblocking(output,$count) $txt\n if { [info exists nonblocking(stdoutCmd,$count) ] } { # form of stdout cmd is: # either: cmd id text # or: {cmd arg1 arg2 ...} id text # so we should use eval ... eval $nonblocking(stdoutCmd,$count) $count [list $txt\n] } } else { if { [catch {close $nonblocking(fID,$count)}] } { ::tclu::errorDialog "error while closing nonblocking execution \#.$count" set nonblocking(status,$count) 0 } if { [info exists nonblocking(stdoutCmd,$count) ] } { #signal end of run to the stdout ... eval $nonblocking(stdoutCmd,$count) $count [list { *** END-OF-RUN *** }] } set nonblocking(done,$count) 1 } } # ------------------------------------------------------------------------ #****f* ::tclu/::tclu::expandArgs # NAME # ::tclu::expandArgs -- expands the arguments # USAGE # tclu::expandArgs code # DESCRIPTION # This proc expands the argumants, for example: # # The args may be in expanded or list form: # expanded-form: -option value -option value # list-form: { -option value -option value } # # The the call \"tclu::expandArgs $args\" will return for both modes, # the expanded from, i.e.: -option value -option value #****** # ------------------------------------------------------------------------ proc ::tclu::expandArgs {code} { if { [llength $code] == 1 } { # list-mode return [lindex $code 0] } else { # expanded mode return $code } } # ------------------------------------------------------------------------ #****f* ::tclu/::tclu::getArgs # NAME # ::tclu::getArgs -- get requested option-value pairs from arguments # USAGE # tclu::getArgs optionList args # ARGUMENTS # * optionList -- list of selected options to return the option-value pairs # * args -- list of all option-value pairs # RETURN VALUE # The requested option-value pairs that were found in the arguments. #****** # ------------------------------------------------------------------------ proc ::tclu::getArgs {optList args} { set args [expandArgs $args] set result "" foreach {opt value} $args { # is the option acceptable if { [lsearch -exact $optList $opt] > -1} { lappend result $opt $value } } return $result } # ------------------------------------------------------------------------ #****f* ::tclu/::tclu::extractArgs # USAGE # tclu::extractArgs optionList argsVar # ARGUMENTS # * optionList -- list of options to extract # * argsVar -- name of the variable holding the arguments (option-value pairs) # DESCRIPTION # Extract the requested options from arguments and remove them from # argsVar. # RETURN VALUE # The requested option-value pairs that were found in the arguments. #****** # ------------------------------------------------------------------------ proc ::tclu::extractArgs {optList argsVar} { upvar $argsVar args set result "" set newArgs "" foreach {opt value} $args { if { [lsearch -exact $optList $opt] > -1} { lappend result $opt $value } else { lappend newArgs $opt if { $value != {} } { lappend newArgs $value } } } set args $newArgs return $result } #****f* ::tclu/::tclu::modePatternArgs # NAME # modePatternArgs -- parse the args for mode & pattern # # USAGE # tclu::modePatternArgs $modeVarname $ppaternVarname {$mode $pattern} # # DESCRIPTION # This proc facilitates the use of $args as "mode pattern" in the # style of "array names arrayName ?mode? ?pattern?". If some proc # accept $args in this style, then this routine helps. On exit the # modeVar variable holds the mode, while patternVar the pattern. # # RETURN VALUE # None. #****** proc ::tclu::modePatternArgs {modeVar patternVar args} { upvar $modeVar mode upvar $patternVar pattern # args == {mode -glob} {namePattern *} set mode -glob set namePattern * set args [expandArgs $args] if { [llength $args] == 1 } { set pattern [lindex $args 0] } elseif { [llength $args] == 2 } { set mode [lindex $args 0] set pattern [lindex $args 1] } elseif { [llength $args] > 2 } { error "wrong usage, should be get*** ?mode? ?pattern?" } } #****f* ::tclu/::tclu::mustBeEvenNumOfArgs # NAME # mustBeEvenNumOfArgs -- trigger an error if number of arguments is not even # USAGE # tclu::mustBeEvenNumOfArgs arguments #****** proc ::tclu::mustBeEvenNumOfArgs {arg} { if { [llength $arg] % 2 } { uplevel { error "number of arguments must be even, but the actual number is odd" } } } #****f* ::tclu/::tclu::mustBeOddNumOfArgs # NAME # mustBeOddNumOfArgs -- trigger an error if number of arguments is not odd # USAGE # tclu::mustBeOddNumOfArgs arguments #****** proc ::tclu::mustBeOddNumOfArgs {arg} { if { ! ([llength $arg] % 2) } { uplevel { error "number of arguments must be odd, but the actual number is even" } } } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/lib/pkgIndex.tcl0000644000077300007730000000057312341332511022164 0ustar giannozzgiannozz #****h* /TclTkLib # # DESCRIPTION # This is Tone Kokalj's Tcl/Tk utility library. It consits of two # parts: tcl-part (file: tclUtils.tcl, package: tclu) and tk-part # (file: tkUtils.tcl, package: tku). # #**** set version 0.9 package ifneeded tclu $version [list source [file join $dir tclUtils.tcl]] package ifneeded tku $version [list source [file join $dir tkUtils.tcl]] espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/lib/tkUtils.tcl0000644000077300007730000003531012341332511022047 0ustar giannozzgiannozz# # $RCSfile: tkUtils.tcl,v $ -- # # This file contains the Tone Kokalj's Tk utilities functions. # # Copyright (c) 2003 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: tkUtils.tcl,v 1.10 2009-08-03 14:22:43 kokalj Exp $ # #------------------------------------------------------------------------ #****h* TclTkLib/::tku # NAME # TKU == Tone Kokalj's Tk Utilities # # COPYRIGHT # 2002--2004 (c) by Tone Kokalj # # AUTHOR # Tone Kokalj # # CREATION DATE # Starting on Fri Dec 14 08:32:59 CET 2001 # # NOTES # Here are the basic Tk utility functions #****** #------------------------------------------------------------------------ package provide tku 0.9 package require Tk namespace eval ::tku { variable cursor variable widgetCounter 0 variable toplevelCounter 0 variable getAllDescendants_list set cursor(default) [. cget -cursor] set cursor(watch) watch namespace export widgetName namespace export toplevelName namespace export toplevelExists namespace export disableAll namespace export enableAll namespace export getAllDescendants namespace export centerWindow namespace export createFont namespace export setCursor namespace export resetCursor namespace export watchExec namespace export getOpenFile namespace export getSaveFile namespace export exitApp } #------------------------------------------------------------------------ #****f* ::tku/::tku::widgetName # NAME # ::tku::widgetName -- generates new widget name # USAGE # ::tku::widgetName ?parent? ?lastName? # # DESCRIPTION # This proc is used for generating a unique widget name. # # ARGUMENTS # * parent -- widget name of the parent widget # * lastName -- a prefix for the lastname of the widget (i.e. .a.a.lastname) # # RETURN VALUE # A unique widget name. # # EXAMPLE # ::tku::widgetName $parent #******** #------------------------------------------------------------------------ proc ::tku::widgetName {{wid {}} {lastName {}}} { variable widgetCounter while {1} { if { [winfo exists ${wid}.${lastName}$widgetCounter] } { incr widgetCounter } else { return ${wid}.${lastName}$widgetCounter } } } #------------------------------------------------------------------------ #****f* ::tku/::tku::toplevelName # NAME # ::tku::toplevelName -- generates new toplevel-widget name # USAGE # ::tku::toplevelName ?prefix? # # DESCRIPTION # This proc is used for generating a unique toplevel-widget name. # # ARGUMENTS # * prefix -- prefix for the widget name (for example ".tplw") # # RETURN VALUE # A unique toplevel-widget name. # # EXAMPLE # ::tku::toplevelName $parent #******** #------------------------------------------------------------------------ proc ::tku::toplevelName {{prefix .tplw}} { variable toplevelCounter set prefix .[string trim $prefix "."] while {1} { if { [winfo exists ${prefix}$toplevelCounter] } { incr toplevelCounter } else { return ${prefix}$toplevelCounter } } } #------------------------------------------------------------------------ #****f* ::tku/::tku::toplevelExists # NAME # ::tku::toplevelExists -- checks if toplevel already exists # USAGE # ::tku::toplevelExists pathName # # DESCRIPTION # This proc is used for checking if widget pathName already exists. # If it does not exists it just returns the pathName, otherwise the # "return -code return" is issued, to return from the caller proc. # # ARGUMENTS # * pathName -- widget path-name # # RETURN VALUE # If pathName widget does not exists it returns pathName, otherwise # returns the "-code return". # # EXAMPLE # ::tku::toplevelExists $widget #******** #------------------------------------------------------------------------ proc ::tku::toplevelExists {pathName} { if { [winfo exists $pathName] } { return -code return } else { return $pathName } } #****f* ::tku/::tku::disableAll # SYNOPSIS proc ::tku::disableAll {wlist} { # PURPOSE # Disables all wlist widgets and its children recursively. # ARGUMENTS # * wlist -- list of widgets to disable # SOURCE foreach w $wlist { if { ! [winfo exists $w] } { continue } set children [winfo children $w] if { $children != "" } { foreach w $children { disableAll $w catch {$w configure -state disabled} } } } } #****** #****f* ::tku/::tku::enableAll # SYNOPSIS proc ::tku::enableAll {wlist} { # PURPOSE # Enable all widgets and its children recursively. # ARGUMENTS # * wlist -- list of widgets to enable # SOURCE foreach w $wlist { if { ! [winfo exists $w] } { continue } set children [winfo children $w] if { $children != "" } { foreach w $children { enableAll $w catch {$w configure -state normal} } } } } #****** #****f* ::tku/::tku::getAllDescendants # SYNOPSIS proc ::tku::getAllDescendants {w} { # PURPOSE # Return a list of all descendants of a given window. # ARGUMENTS # * w -- window for which to return all its descendants # SOURCE variable getAllDescendants_list if { [info exists getAllDescendants_list] } { set getAllDescendants_list "" } return [getAllDescendants_ $w] } proc getAllDescendants_ {wlist} { global getAllDescendants_list foreach w $wlist { if { ![winfo exists $w] } continue lappend getAllDescendants_list $w set children [winfo children $w] if { $children != "" } { foreach child $children { getAllDescendants_ $child } } } return $getAllDescendants_list } #****** #****f* ::tku/::tku::mouseWheelScrollCanvas # SYNOPSIS proc ::tku::mouseWheelScrollCanvas {can} { # PURPOSE # Arrange all necessary that a given canvas will be scrolled by # mouse-wheel, even when the canvas possesses many descendant # widgets (i.e. binds all descendants of a given canvas widget # to scroll the canvas by mouse-wheel. # ARGUMENTS # * can -- path of the canvas widget # SOURCE set scrollCmd_B4 [list $can yview scroll -2 units] set scrollCmd_B5 [list $can yview scroll +2 units] # TODO: please tune the %D on windows set scrollCmd_Wheel [list $can yview scroll %D units] set scrWin [getAllDescendants $can] global tcl_platform 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 } } } } #****** #****f* ::tku/::tku::mouseWheelScrollDeleteBindings # SYNOPSIS proc ::tku::mouseWheelScrollDeleteBindings {can} { # PURPOSE # The opposite of the ::tku::mouseWheelScrollCanvas command: it # destroys all the mouse-wheel binding assciated with the # scrolling of the given canvas, so that mouse-wheel does not # have any effect more. # ARGUMENTS # * can -- path of the canvas widget # SOURCE set scrWin [::tku::getAllDescendants $can] global tcl_platform foreach wid $scrWin { if { [winfo exists $wid] } { if { $tcl_platform(platform) == "unix" } { bind $wid "" bind $wid "" } else { # TODO: please tune the %D on windows bind $wid "" } } } } #****f* ::tku/::tku::centerWindow # SYNOPSIS proc ::tku::centerWindow {thisWin {otherWid {}}} { # PURPOSE # Centers the toplevel with respect to another widget or the # screen as a whole. # ARGUMENTS # * thisWin -- name of widget to center # * otherWid -- name of widhet the thisWin will be centered onto # SOURCE update idletasks # if otherWid is {}, then center width respect to the root window set w [winfo reqwidth $thisWin] set h [winfo reqheight $thisWin] # root window height/width set rh [winfo screenheight $thisWin] set rw [winfo screenwidth $thisWin] if { $otherWid == "" } { set reqX [expr {($rw-$w)/2}] set reqY [expr {($rh-$h)/2}] } else { set wfudge 5 ;# wm width fudge factor set hfudge 20 ;# wm height fudge factor set otherWidW [winfo width $otherWid] set otherWidH [winfo height $otherWid] set reqX [expr {[winfo rootx $otherWid]+($otherWidW-($otherWidW/2))-($w/2)}] set reqY [expr {[winfo rooty $otherWid]+($otherWidH-($otherWidH/2))-($h/2)}] # Adjust for errors - if too long or too tall if { $reqX+$w+$wfudge > $rw } { set reqX [expr {$rw-$w-$wfudge}] } if { $reqX < $wfudge } { set reqX $wfudge } if { $reqY+$h+$hfudge > $rh } { set reqY [expr {$rh-$h-$hfudge}] } if { $reqY < $hfudge } { set reqY $hfudge } } wm geometry $thisWin +$reqX+$reqY } #****** #****f* ::tku/::tku::createFont # SYNOPSIS proc ::tku::createFont {args} { # PURPOSE # Create new Tk Font with requested attributes (args=="option value" # pairs), and return its name # ARGUMENTS # * args -- arguments passed to font configure (i.e. option value # pairs specifying font attributres, see font Tk-command) # # SOURCE set fontName [font create] eval font configure $fontName $args return $fontName } #****** #****f* ::tku/::tku::setCursor # SYNOPSIS proc ::tku::setCursor {cursorName {window .}} { # PURPOSE # Set a new cursor, one among those defined by cursor variables. # So far supported names are: # * watch # * default # ARGUMENTS # * cursorName -- name for the new cursor # * window -- (optional) name of window for which to change cursor # (propagates to its children too) # SOURCE variable cursor switch -exact -- $cursorName { watch { set _cursor $cursor(watch) } default { set _cursor $cursor(default) } } foreach t [winfo children $window] { if { [info commands $t] != "" } { $t config -cursor $_cursor } } $window config -cursor $_cursor update } #****** #****f* ::tku/::tku::resetCursor # SYNOPSIS proc ::tku::resetCursor {{window .}} { # PURPOSE # Sets a default cursor for specified window. # ARGUMENTS # * window -- (optional) name of window for which to set the cursor to default # (propagates to its children too) # SOURCE variable cursor foreach t [winfo children $window] { if { [info commands $t] != "" } { $t config -cursor $cursor(default) } } $window config -cursor $cursor(default) update } #****** #------------------------------------------------------------------------ #****f* ::tku/::tku::watchExec # NAME # ::tku::watchExec -- execute a script and display a watch cursor # USAGE # ::tku::watchExec script # # DESCRIPTION # This proc executes a script and displays a watch cursor during exec. The # content of the script is evaluated at the caller level (i.e. uplevel 1 # # ARGUMENTS # * parent -- widget name of the parent widget # * lastName -- a prefix of the last-name of the widget (i.e. .a.a.lastname) # # RETURN VALUE # Returns the last return-value of the last command in the script. # # EXAMPLE # ::tku::watchExec { # do_whatever $a $b # do_this_and_that $c $d # } #******** #------------------------------------------------------------------------ proc ::tku::watchExec {script} { ::tku::setCursor watch set result [uplevel 1 $script] ::tku::resetCursor return $result } #****f* ::tku/::tku::getOpenFile # SYNOPSIS proc ::tku::getOpenFile {file args} { # PURPOSE # Get (return) the name of file for opening, in particular: # if $file == "" --> query file # else --> check if file exists # ARGUMENTS # * file -- name of file to open (if empty-string, query the file to open) # * args -- arguments passed to tk_getOpenFile if file == {} # SOURCE if { $file == {} } { # query file ... set file [eval tk_getOpenFile $args] if { $file == "" } { return -code return } } else { # check if file exists if { ![file exists $file] } { # note: tku's errorDialog should not use return ::tclu::warningDialog "file \"$file\" does not exists !!!" return -code return } } return $file } #****** #****f* ::tku/::tku::getSaveFile # SYNOPSIS proc ::tku::getSaveFile {file args} { # PURPOSE # Get (return) the name of file for saving, in particular: # if $file == "" --> query file # else --> check if dirname of file exists and is writeable # ARGUMENTS # * file -- name of file to open (if empty-string, query the file to open) # * args -- arguments passed to tk_getSaveFile if file == {} # SOURCE if { $file == {} } { # query file ... set file [eval tk_getSaveFile $args] if { $file == "" } { return -code return } } else { # check if dirname of file exists set dirname [file dirname $file] if { ! [file writable $dirname] } { ::tclu::errorDialog "can't create file \"$file\". Permission denied !!!" return -code return "" } if { ! [file isdirectory $dirname] } { # note: tku's errorDialog should not use return tclu::errorDialog "can't create \"$file\". Directory $dirname does not exists. !!!" return -code return "" } } return $file } #****** #****f* ::tku/::tku::exitApp # SYNOPSIS proc ::tku::exitApp {{cmdAtExit {}}} { # PURPOSE # Exit from application if user clicks "Yes" button. # ARGUMENTS # * cmdAtExit -- command to execute before exiting # SOURCE set button [tk_messageBox -message "Really quit?" \ -type yesno -icon question] if { $button == "yes" } { # do everything requested before exiting ... if { $cmdAtExit != "" } { eval $cmdAtExit } # delete all temporary files ... ::tclu::tempFile delete all exit } } #****** espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/0000755000077300007730000000000012341333047017730 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/guib-keywords-def.tcl0000644000077300007730000001610112341332511023755 0ustar giannozzgiannozz# # $RCSfile: guib-keywords-def.tcl,v $ -- # # This file contains ... # # Copyright (c) 2003 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: guib-keywords-def.tcl,v 1.5 2008-05-08 18:44:36 kokalj Exp $ # #------------------------------------------------------------------------ #****v* guib.itcl/options # NAME # options -- this is the guib::options variables holding options of GUIB keywords !!! # # DESCRIPTION # The allowed options of the GUIB keyowrds are stored in # options(keyword) variable. For example, for the "var" keyword, the # allowed options are stored in options(var) variable. The structure of # the options(keyword) variables is accoring to the cmdline::getoptions # requirements. # # SOURCE # # BEWARE: if options has an argument we add ".arg" extension to it # #------------------------------------------------------------------------ # DEFINITION of standard "module" options. #------------------------------------------------------------------------ set options(module) { {title.arg GUI {Human readable name for the module}} {script.arg {} {Scirpt of the module}} {varscope.arg {} {Scope for variables}} } #------------------------------------------------------------------------ # DEFINITION of options for nameObj objects (line, namelist, group) #------------------------------------------------------------------------ set options(page) { { name.arg {} {The name of the line} } } set options(line) { { name.arg {} {The name of the line} } { decor.arg prefixed {Style of decoration-label: prefixed, normal or none} } } set options(namelist) { { name.arg {} {The name of the namelist} } { decor.arg prefixed {Style of decoration-label: prefixed, normal or none} } } set options(group) { { name.arg {} {The name of the namelist} } { decor.arg none {Style of decoration-label: prefixed, normal or none} } } #------------------------------------------------------------------------ # DEFINITION of standard "var" options. Applies to the # following keywords: var, auxilvar, dimension #------------------------------------------------------------------------ set standard_var_options { { variable.arg {} {The name of the variable} } { text.arg {} {Displayed top-text for the variable} } { label.arg {} {Displayed label for the variable} } { value.arg {} {Allowed values for the variable} } { textvalue.arg {} {Allowed values for the variable that will be diplayed in a widget like radiobutton} } { default.arg {} {Default value for the variable} } { fmt.arg {} {Format speficication for the variable} } { validate.arg {} {The validation type for the value (i.e. numeric, alphabetic, integer, hexidecimal, real, and alphanumeric)} } { infmt.arg {} {Input format speficication for the variable} } { outfmt.arg {} {Output format speficication for the variable} } { widget.arg entry {Widget to be displayed for this variable} } { helptext.arg {} {help text for this var} } { helpfmt.arg txt {Format of the help.} } } set options(var) $standard_var_options set options(auxilvar) $standard_var_options set options(scriptvar) { { value.arg {} {Allowed values for the variable} } { textvalue.arg {} {Allowed values for the variable that will be diplayed in a widget like radiobutton} } } #------------------------------------------------------------------------ # DEFINITION of additional dimension options #------------------------------------------------------------------------ set special_dimension_options { {start.arg 0 {starting element of the dimension} } {end.arg 0 {last element of the dimension} } {pack.arg top {packing-side of the dimension widget} } } set options(dimension) [concat $standard_var_options $special_dimension_options] #------------------------------------------------------------------------ # DEFINITION of table options #------------------------------------------------------------------------ set options(table) { {caption.arg {} {The caption of the table}} {head.arg {} {The head of the table}} {variable.arg {} {The name of the variable holding the table data}} {validate.arg {} {Specification of the validation for the tables columns}} {cols.arg 1 {Number of columns}} {rows.arg 1 {Number of rows}} {widgets.arg entry {List of widgets/per-columns to use for table cells}} {onvalues.arg 1 {List of on-values for the table cell widget like checkbutton}} {offvalues.arg 0 {List of off-values for the table cell widget like checkbutton}} {fmt.arg {} {Format speficication for the variable} } {infmt.arg {} {Input format speficication for the variable} } {outfmt.arg {} {Output format speficication for the variable} } {helptext.arg {} {help text for this var.}} {helpfmt.arg txt {Format of the help.}} {optionalcols.arg -1 {Marks which columns are optional: if optionalcols > 0 then columns >= optionalcols are optional}} } #------------------------------------------------------------------------ # DEFINITION of help options #------------------------------------------------------------------------ #{variable.arg {} {name of a variable for which this help is meant} } set options(help) { {helpfmt.arg txt2html "Format of the help, must be one of html, txt2html, txt, or helpdoc"} {vartype.arg {} "Type of the variable"} {helptext.arg {} "Help-text"} } #------------------------------------------------------------------------ # definitions of separator options #------------------------------------------------------------------------ set options(separator) { {label.org {} {Text for the label of separator widget}} } #------------------------------------------------------------------------ # definitions of text options #------------------------------------------------------------------------ set options(text) { {caption.arg {} {The caption of the text.}} {label.arg {} {Text for the label of separator widget.}} {readvar.arg {} {Variable holding the content of the text upon the file-read. Requires the readfilter routine.}} {helptext.arg {} {help text for this var.}} {helpfmt.arg txt {Format of the help.}} } #**** #------------------------------------------------------------------------espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/guibKeywords.itcl0000644000077300007730000013502012341332511023257 0ustar giannozzgiannozz# # $RCSfile: guibKeywords.itcl,v $ -- # # This file contains the implementation of the GUIB keywords. GUIB # keywords are the public methods of moduleObj class, and are used in # GUIB module definition files (for more details see file: # moduleObj.itcl) # # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: guibKeywords.itcl,v 1.7 2008-05-08 18:44:36 kokalj Exp $ # # ------------------------------------------------------------------------ # # Implementation of GUIB Keywords METHODS # # ======================================================================== # ------------------------------------------------------------------------ #****m* moduleObj/valueToTextvalue # NAME # ::guib::moduleObj::valueToTextvalue -- map value to textvalue # USAGE # valueToTextvalue varIdent value # DESCRIPTION # This method maps from value to textvalue. Some variable might # have two sets of values: (i) human-readable (i.e. textvalue), which # can be mapped in combobox for user-friendliness and (ii) computer # readable code or digit (i.e. value). This routine is one of the two # routines that maps between the value and textvalue. See also # textvalueToValue method. # ARGUMENTS # varIdent -- the GUIB-variable's identifier # value -- the value of the varIdent's variable # RETURN VALUE # Returns the mapped corresponding textvalue on the basis of value. # EXAMPLE # $obj valueToTextvalue $varIdent $value #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::valueToTextvalue {varIdent value} { # tk_temp if { $varIdent == "" } { return } #/tk_temp set obj [_getObjFromVarident $varIdent] if { $obj == "" } { ::tclu::ERROR "failed to locate object from identifier $varIdent" } set id [$obj getIdFromVarident $varIdent] set _textvalues [$obj getOptionValue $id textvalue] set _values [$obj getOptionValue $id value] foreach val $_values text $_textvalues { if { [::tclu::stringMatch $val $value $::guib::settings(INPUT.nocase)] } { if { $text != "" } { return $text } else { return $val } } } return $value } # ------------------------------------------------------------------------ #****m* moduleObj/textvalueToValue # NAME # ::guib::moduleObj::textvalueToValue -- map value to textvalue # USAGE # textvalueToValue varIdent textvalue # DESCRIPTION # This method maps from textvalue to value. Some variable might # have two sets of values: (i) human-readable (i.e. textvalue), which # can be mapped in combobox for user-friendliness and (ii) computer # readable code or digit (i.e. value). This routine is one of the two # routines that maps between the value and textvalue. See also # valueToTextvalue method. # ARGUMENTS # varIdent -- the GUIB-variable's identifier # textvalue -- the textvalue of the varIdent's variable # RETURN VALUE # Returns the mapped corresponding value on the basis of textvalue. # EXAMPLE # $obj textvalueToValue $varIdent $textvalue #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::textvalueToValue {varIdent textvalue} { # tk_temp if { $varIdent == "" } { return } #/tk_temp set obj [_getObjFromVarident $varIdent] if { $obj == "" } { ::tclu::ERROR "failed to locate object from identifier $varIdent" } set id [$obj getIdFromVarident $varIdent] set _textvalues [$obj getOptionValue $id textvalue] set _values [$obj getOptionValue $id value] foreach text $_textvalues val $_values { # take care of case-insensitivity ::tclu::DEBUG +++varIdent=$varIdent : text=$text , textvalue=$textvalue if { [::tclu::stringMatch $text $textvalue $::guib::settings(INPUT.nocase)] } { return $val } } return $textvalue } # ------------------------------------------------------------------------ #****m* moduleObj/page # NAME # ::guib::moduleObj::page -- the "page" GUIB keyword # USAGE # page -name name { ...code... } # DESCRIPTION # -- GUIB keyword !!! # Keyword "page" groups the set of widgets and arranges them # to appear on a separate page of the tab-notebook. # RETURN VALUE # None. # EXAMPLE # page -name name { # ...some code here ... # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::page {ident args} { eval _manageNameObj page $ident $args } # ------------------------------------------------------------------------ #****m* moduleObj/optional # NAME # ::guib::moduleObj::optional -- the "optional" GUIB keyword # USAGE # optional { ...code... } # # DESCRIPTION # -- GUIB keyword !!! # Keyword "optional" marks the namelist's variables as # optional. The "optional" keyword can appear only inside namelist's code. # # RETURN VALUE # None. # EXAMPLE # optional { # ...some code here ... # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::optional {code} { _manageVoidObj optional $code } # ------------------------------------------------------------------------ #****m* moduleObj/required # NAME # ::guib::moduleObj::required -- the "required" GUIB keyword # USAGE # required { ...code... } # # DESCRIPTION # -- GUIB keyword !!! # Keyword "required" marks the namelist's variables as # required. The "required" keyword can appear only inside namelist's code. # # RETURN VALUE # None. # EXAMPLE # required { # ...some code here ... # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::required {code} { _manageVoidObj required $code } # ------------------------------------------------------------------------ #****m* moduleObj/namelist # NAME # ::guib::moduleObj::namelist -- the namelist GUIB keyword # USAGE # namelist -name name { ...code...} # # DESCRIPTION # -- GUIB keyword !!! # Keyword "namelist" is meant for marking the FORTRAN namelist. Code inside # the namelist is meant as the namelist specification. Typical # keyword used inside namelist is "var". # # RETURN VALUE # None. # EXAMPLE # namelist -name name { # ...some code here ... # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::namelist {ident args} { # check for the nesting of namelists, which is not allowed !!! if { [_findKeywordObjType [$this _getCurrentObj] namelist] == 1 } { ::tclu::ERROR "\"namelists\" are nested" } if { [_findKeywordObjType [$this _getCurrentObj] namelist] == 1 } { ::tclu::ERROR "keyword \"namelist\" is allowed only outside line" } eval _manageNameObj namelist $ident $args } # ------------------------------------------------------------------------ #****m* moduleObj/group # NAME # ::guib::moduleObj::group -- the group GUIB keyword # USAGE # group -name name { ...code...} # # DESCRIPTION # -- GUIB keyword !!! # Keyword "group" is meant for grouping the bunch of input-entities # together. For example, let say that upon some user-action we need # to disable/enable several input-entities. This would make a # "tracevar" scripts to be long as we would need to specify the # behavior for each variable separately. However we can group these # variables together by sandwiching then by the "group" keyword, and # then simply enable/disable the whole group. # # RETURN VALUE # None. # EXAMPLE # group -name group1 { # line -name whatever1 { # var { ... } # var { ... } # } # line -name whatever2 { # var { ... } # var { ... } # } # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::group {ident args} { eval _manageNameObj group $ident $args } # ------------------------------------------------------------------------ #****m* moduleObj/line # NAME # ::guib::moduleObj::line -- the line GUIB keyword # USAGE # line -name line-name { ...code... } # # DESCRIPTION # -- GUIB keyword !!! # Keyword "line" is meant for processing a line of input. Typical # keywords used inside line are "var" and "keyword". # # RETURN VALUE # None. # EXAMPLE # line -name "K-point mesh" { # var { -label "nk1:" -variable nk1 -widget spinint -validate posint -default 1 } # var { -label "nk2:" -variable nk2 -widget spinint -validate posint -default 1 } # var { -label "nk3:" -variable nk3 -widget spinint -validate posint -default 1 } # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::line {ident args} { # check for the nesting of lines, which is not allowed !!! if { [_findKeywordObjType [$this _getCurrentObj] line] == 1 } { ::tclu::ERROR "\"lines\" are nested" } if { [_findKeywordObjType [$this _getCurrentObj] namelist] == 1 } { ::tclu::ERROR "keyword \"line\" is allowed only outside namelist" } eval _manageNameObj line $ident $args } # ------------------------------------------------------------------------ #****m* moduleObj/text # NAME # ::guib::moduleObj::text -- the text GUIB keyword # USAGE # text ident {option value ?...?} # or # text ident ?option value? ?...? # # DESCRIPTION # -- GUIB keyword !!! # Keyword "text" is meant for processing a general text. For the # description of all "text" options see in the guib-keywords-def.tcl file # the definition of options(text) variable. # # The "text" possesses a special option: "-readvar", which specifies # the name of the variable, where the content of the text is stored # after the input-file has been read. The assignment of the variable # should be done in the "readfilter" command. Therefore this option # requires the "readfilter" routine. If readfilter routine in not # provided and if the -readvar's variable is not set in the # "readfilter" routine, then the content of the text will be void # after the input-file has been read. # # The "text" keyword is standalone, i.e., it is allowed only outside # namelist and line. # # RETURN VALUE # None. # EXAMPLE # text text1 { # -label "Enter text1:" # -readvar ::myNamescape::myVar # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::text {ident args} { set code [_expandArgs $args] set obj [_getCurrentObj] if { [_findKeywordObjType $obj namelist] == 1 \ && [_findKeywordObjType $obj line] == 1} { ::tclu::ERROR "keyword \"text\" is allowed only outside namelist or line" } _manageKeyword $obj text $ident $code } # ------------------------------------------------------------------------ #****m* moduleObj/var # NAME # ::guib::moduleObj::var -- the var GUIB keyword # USAGE # var ident {option value ?...?} # or # var ident ?option value? ?...? # # DESCRIPTION # -- GUIB keyword !!! # Keyword "var" is meant for processing a variable. For the # description of all var options see in the guib-keywords-def.tcl file # the definition of options(var) variable. The "var" keyword is not standalone, and # should appear inside namelist or line. # # RETURN VALUE # None. # EXAMPLE # var var1 { # -variable varName1 # -text "The varName1 variable stands for ..." # -label "Enter varName1:" # -widget spinint # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::var {ident args} { set code [_expandArgs $args] set obj [_getCurrentObj] if { [_findKeywordObjType $obj namelist] == 0 \ && [_findKeywordObjType $obj line] == 0} { ::tclu::ERROR "keyword \"var\" is allowed only inside namelist or line" } _manageKeyword $obj var $ident $code } # ------------------------------------------------------------------------ #****m* moduleObj/auxilvar # NAME # ::guib::moduleObj::auxilvar -- the auxilvar GUIB keyword # USAGE # auxilvar ident {option value ?...?} # or # auxilvar ident ?option value? ?...? # # DESCRIPTION # -- GUIB keyword !!! # Keyword "auxilvar" is a dummy-variable and is provided for # auxiliary purposes. It is neither read nor saved to/from input, but # is there to help managing the state of a given set of widgets. For example, # lets say we can describe something by two possible ways and each way # uses different input-variables (exclusively). Then by using "auxilvar" # (and "tracevar"), we can enable one-possibility and disable the other. # RETURN VALUE # None. # EXAMPLE # auxilvar chooseVar1 { # -label "How would you like to pay:" # -value {"by cash" "by credit-card"} # -widget radiobox # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::auxilvar {ident args} { set code [_expandArgs $args] set obj [_getCurrentObj] # NOTE: auxilvar can also be present outside namelist/line ... #if { [_findKeywordObjType $obj namelist] == 0 \ # && [_findKeywordObjType $obj line] == 0} { # ::tclu::ERROR "keyword \"auxilvar\" is allowed only inside namelist or line" #} _manageKeyword $obj auxilvar $ident $code } # ------------------------------------------------------------------------ #****m* moduleObj/scriptvar # NAME # ::guib::moduleObj::scriptvar -- the scriptvar GUIB keyword # USAGE # scriptvar ident {option value ?...?} # or # scriptvar ident ?option value? ?...? # # DESCRIPTION # -- GUIB keyword !!! # Keyword "scriptvar" is provided for defining a script variables, # i.e. a variables that can be set/queried for the scripting purpuses, # but have otherwise no relevance to the the input-syntax whatsoever. # # EXAMPLE # scriptvar myVar1 # #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::scriptvar {ident args} { set code [_expandArgs $args] set obj [_getCurrentObj] _manageKeyword $obj scriptvar $ident $code } # ------------------------------------------------------------------------ #****m* moduleObj/dimension # NAME # ::guib::moduleObj::dimension -- the dimension GUIB keyword # USAGE # dimension { ...options... } # # DESCRIPTION # -- GUIB keyword !!! # Keyword "dimension" is meant for processing a 1D dimension (i.e. 1D # array). The "dimension" is like a FORTRAN dimension # (i.e. a(1), a(2), ...). For the description of all dimension options # see in the guib-keywords-def.tcl file the definition of options(dimension) # variables. # # RETURN VALUE # None. # EXAMPLE # dimension { # ...options... # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::dimension {ident args} { set code [_expandArgs $args] set obj [_getCurrentObj] if { [_findKeywordObjType $obj namelist] == 0 } { ::tclu::ERROR "keyword \"dimension\" is allowed only inside namelist" } _manageKeyword $obj dimension $ident $code } # ------------------------------------------------------------------------ #****m* moduleObj/table # NAME # ::guib::moduleObj::table -- the table GUIB keyword # USAGE # table { ...options... } # # DESCRIPTION # -- GUIB keyword !!! # Keyword "table" is meant for processing a 2D dimension (i.e 2D # array). The "table" is like a FORTRAN 2D dimension (i.e. coor(1,1), # coor(1,2), ...). Typical usage of table is, for example, the # specification of atomic coordinates. For the description of all # dimension options see in the guib-keywords-def.tcl file the definition of # options(table) variables. # # RETURN VALUE # None. # EXAMPLE # table { # ...options... # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::table {ident args} { set code [_expandArgs $args] set obj [_getCurrentObj] # table is allowed inside and outside the namelist !!! _manageKeyword $obj table $ident $code } # ------------------------------------------------------------------------ #****m* moduleObj/keyword # NAME # ::guib::moduleObj::keyword -- the keyword GUIB keyword # USAGE # keyword ident KEYWORD # # DESCRIPTION # -- GUIB keyword !!! # Keyword "keyword" is meant for specifying the input keywords. # # RETURN VALUE # None. # EXAMPLE # Let us suppose the following input: # # ALPHA nalpha # TEXT # textvar # # Then this can be specified as: # # line alphaLine { # keyword alpha ALPHA # var nalpha -label "Specify a number (nalpha):" # } # line text { # keyword text TEXT\n # var textvar -label "Specify some text (textvar):" # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::keyword {ident keyword} { set obj [_getCurrentObj] if { [_findKeywordObjType $obj namelist] == 1 } { ::tclu::ERROR "keyword \"dimension\" is allowed only outside namelist" } set id [$obj incrID] $obj setKey $id keyword $ident $obj setOptions $id [list keyword $keyword] } # ------------------------------------------------------------------------ #****m* moduleObj/help # NAME # ::guib::moduleObj::help -- the help GUIB keyword # USAGE # help varIdent { ...options... } # or # help varIdent ...options... # # DESCRIPTION # -- GUIB keyword !!! # Keyword "help" is meant for specifying an extensible help about # some variable. A long help texts for each variable would make a # GUIB script difficult to read, since they would be very long # and one would have to search for the definitions among long # help texts. Hence this keyword is meant as follows: # at the top of the guib script one specifies the definition # of the variables, ..., and when that is done then one can start # specifying the help texts for the variables. This way makes # the guib scripts more readable. # # RETURN VALUE # None. # EXAMPLE # help varIdent1 { # -helpfmt txt|html|txt2html # -helptext {...here is the help of the variable...} # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::help {ident args} { set code [_expandArgs $args] array set opt [cmdline::getoptions code $options(help)] # find the object containing the variable #if { $opt(variable) == {} } { #return #} set obj [_getObjFromVarident $ident] if { $obj == {} } { ::tclu::ERROR "syntax error in help-keyword; ident \"$ident\" does not exists" #return } set id [$obj getIdFromVarident $ident] # assign the parsed help options $obj setOptions $id [array get opt] } # ------------------------------------------------------------------------ #****m* moduleObj/grouphelp # NAME # ::guib::moduleObj::grouphelp -- the grouphelp GUIB keyword # USAGE # grouphelp {varIdent1 varIdent2 varIdent3 ...} { ...options... } # or # grouphelp {varIdent1 varIdent2 varIdent3 ...} ...options... # # DESCRIPTION # -- GUIB keyword !!! # Its like "help", but multiple variables that shares the same help # can be passed. The method calls "help" method for each of them. # # RETURN VALUE # None. # EXAMPLE # grouphelp {varIdent1 varIdent2} { # -helpfmt txt|html|txt2html # -helptext {...here is the help of the variable...} # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::grouphelp {idents args} { set code [_expandArgs $args] foreach ident $idents { eval [list help $ident] $args } } # ------------------------------------------------------------------------ #****m* moduleObj/tracevar # NAME # ::guib::moduleObj::tracevar -- the tracevar GUIB keyword # USAGE # tracevar varIdent mode script # # DESCRIPTION # -- GUIB keyword !!! # Keyword "tracevar" is meant for tracing the variables. It happens # many times, that specifying some value for a particular variable # makes some new widget to appear and others to disappear. The purpose # of the tracevar proc is just that. See also the "widget" and # "tableconfigure" as well as "varvalue", "varref" and "varset" procs. # # ARGUMENTS # varIdent -- the GUIB-variable's identifier # mode -- is the trace mode for the variable (r, w, or u). # See also the manual of the Tcl trace command. # script -- this is a script to execute upon the trace event. # RETURN VALUE # None. # EXAMPLE # tracevar myVarIdent1 w { # if { [varvalue varIdent1] == "yes" } { # widget enable varIdent2a # widget disable varIdent2b # } else { # widget disable varIdent2a # widget enable varIdent2b # } # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::tracevar {varIdent mode script} { lappend traceVaridentList [varref $varIdent] lappend traceVaridentModeScriptList [list $mode $script] after idle [code $this _tracevar $varIdent $mode] } # ------------------------------------------------------------------------ #****m* moduleObj/varvalue # NAME # ::guib::moduleObj::varvalue -- the varvalue GUIB keyword # USAGE # varvalue varIdent # # DESCRIPTION # -- GUIB keyword !!! # Keyword "varvalue" is meant for querying the value of a particular # GUIB variable. A typical usage of varvalue keyword is inside the # tracevar scripts. # # RETURN VALUE # The value of the queried variable. # EXAMPLE # set varValue [varvalue varIdent2a] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::varvalue {ident} { # transform var(a) to var,a and var(a,b) to var,a,b !!! set ident [_comafy $ident] if { [info exists _guibVar($ident)] } { tclu::DEBUG +++ _guibVar($ident)=$_guibVar($ident) return [textvalueToValue $ident $_guibVar($ident)] } else { return {} } } # ------------------------------------------------------------------------ #****m* moduleObj/vartextvalue # NAME # ::guib::moduleObj::vartextvalue -- the vartextvalue GUIB keyword # USAGE # vartextvalue varIdent # # DESCRIPTION # -- GUIB keyword !!! # Keyword "vartextvalue" is meant for querying the value of a particular # GUIB variable. A typical usage of vartextvalue keyword is inside the # tracevar scripts. # # RETURN VALUE # The textvalue of the queried variable. # EXAMPLE # set varTextvalue [vartextvalue varIdent2a] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::vartextvalue {ident} { # transform var(a) to var,a and var(a,b) to var,a,b !!! set ident [_comafy $ident] if { [info exists _guibVar($ident)] } { return $_guibVar($ident) } else { return {} } } # ------------------------------------------------------------------------ #****m* moduleObj/dimvalue # NAME # ::guib::moduleObj::dimvalue -- the dimvalue GUIB keyword # USAGE # dimvalue dimIdent index # # DESCRIPTION # -- GUIB keyword !!! # Keyword "dimvalue" is meant for querying the value of a particular # element of dimension. A typical usage of dimvalue keyword is inside the # tracevar scripts. # # RETURN VALUE # The value of the dimIdent(index). # EXAMPLE # set elem(3) [dimvalue mydim 3] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::dimvalue {ident i1} { if { [info exists _guibVar($ident,$i1)] } { return [textvalueToValue $ident $_guibVar($ident,$i1)] } else { return {} } } # ------------------------------------------------------------------------ #****m* moduleObj/dimtextvalue # NAME # ::guib::moduleObj::dimtextvalue -- the dimtextvalue GUIB keyword # USAGE # dimtextvalue dimIdent index # # DESCRIPTION # -- GUIB keyword !!! # Keyword "dimtextvalue" is meant for querying the value of a particular # element of dimension. A typical usage of dimtextvalue keyword is inside the # tracevar scripts. # # RETURN VALUE # The textvalue of the dimIdent(index). # EXAMPLE # set elem(3) [dimtextvalue mydim 3] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::dimtextvalue {ident i1} { if { [info exists _guibVar($ident,$i1)] } { return $_guibVar($ident,$i1) } else { return {} } } # ------------------------------------------------------------------------ #****m* moduleObj/tablevalue # NAME # ::guib::moduleObj::tablevalue -- the tablevalue GUIB keyword # USAGE # tablevalue tableIdent irow icol # # DESCRIPTION # -- GUIB keyword !!! # Keyword "tablevalue" is meant for querying the value of a particular # element of table. A typical usage of tablevalue keyword is inside the # tracevar scripts. # # RETURN VALUE # The value of the tableIdent(irow,icol). # EXAMPLE # set elem(3,1) [tablevalue mytable 3 1] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::tablevalue {ident i1 i2} { if { [info exists _guibVar($ident,$i1,$i2)] } { return [textvalueToValue $ident $_guibVar($ident,$i1,$i2)] } else { return {} } } # ------------------------------------------------------------------------ #****m* moduleObj/tabletextvalue # NAME # ::guib::moduleObj::tabletextvalue -- the tabletextvalue GUIB keyword # USAGE # tabletextvalue tableIdent irow icol # # DESCRIPTION # -- GUIB keyword !!! # Keyword "tabletextvalue" is meant for querying the textvalue of a particular # element of table. A typical usage of tabletextvalue keyword is inside the # tracevar scripts. # # RETURN VALUE # The textvalue of the tableIdent(irow,icol). # EXAMPLE # set elem(3,1) [tabletextvalue mytable 3 1] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::tabletextvalue {ident i1 i2} { if { [info exists _guibVar($ident,$i1,$i2)] } { return $_guibVar($ident,$i1,$i2) } else { return {} } } # ------------------------------------------------------------------------ #****m* moduleObj/varref # NAME # ::guib::moduleObj::varref -- the varref GUIB keyword # USAGE # varref varIdent # # DESCRIPTION # -- GUIB keyword !!! # Keyword "varref" is meant for querying the real name of the variable. # Namely, the variable names as specified by the -variable option of the # GUIB keywords are only symbolic names. The actual names are the one of the # the _guibVar array (e.g. _guibVar(varIdent)). # # RETURN VALUE # The real name of a variable. # EXAMPLE # set realName [varref varIdent] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::varref {ident} { set ident [_comafy $ident] return [scope "_guibVar($ident)"] } # ------------------------------------------------------------------------ #****m* moduleObj/dimref # NAME # ::guib::moduleObj::dimref -- the dimref GUIB keyword # USAGE # dimref dimIdent index # # DESCRIPTION # -- GUIB keyword !!! # Keyword "dimref" is meant for querying the real name of the dimension's variable. # Namely, the variable names as specified by the -variable option of the # GUIB keywords are only symbolic names. The actual names are the one of the # the _guibVar array (e.g. _guibVar(dimIdent,$index)). # # RETURN VALUE # The real name of a dimIdent(index). # EXAMPLE # set realName($index) [dimref dimIdent $index] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::dimref {ident i1} { return [scope "_guibVar($ident,$i1)"] } # ------------------------------------------------------------------------ #****m* moduleObj/tableref # NAME # ::guib::moduleObj::tableref -- the tableref GUIB keyword # USAGE # tableref tableIdent irow icol # # DESCRIPTION # -- GUIB keyword !!! # Keyword "tableref" is meant for querying the real name of table's variable. # Namely, the variable names as specified by the -variable option of the # GUIB keywords are only symbolic names. The actual names are the one of the # the _guibVar array (e.g. _guibVar(tableIdent,$irow,$icol)). # # RETURN VALUE # The real name of a tableIdent(irow,icol). # EXAMPLE # set realName($irow,$icol) [tableref tableIdent $irow $icol] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::tableref {ident i1 i2} { return [scope "_guibVar($ident,$i1,$i2)"] } # ------------------------------------------------------------------------ #****m* moduleObj/varset # NAME # ::guib::moduleObj::varset -- the varset GUIB keyword # USAGE # varset varIdent what value ?usage? # # DESCRIPTION # -- GUIB keyword !!! # Keyword "varset" is meant for setting the "GUIB" variables. # Namely, the variable names as specified by identifier or the # -variable option of the GUIB keywords are only symbolic names. The # actual names are the one of the the _guibVar array # (e.g. _guibVar(varIdent)). # # ARGUMENTS # var -- a symbolic name of the variable # what -- what to set -value|-textvalue # value -- value or textvalue (according to what) to set to the $ident variable # usage -- used only internally (error message upon wrong usage) # RETURN VALUE # The textvalue of the set variable. # EXAMPLE # varset varIdent -textvalue "yes" #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::varset {ident what value {usage {usage: varset $ident -value|-textvalue $value}}} { set ident [_comafy $ident] switch -exact -- $what { -value - value { set _guibVar($ident) [valueToTextvalue $ident $value] } -textvalue - textvalue { set _guibVar($ident) $value } default { ::tclu::ERROR $usage } } return $_guibVar($ident) } # ------------------------------------------------------------------------ #****m* moduleObj/dimset # NAME # ::guib::moduleObj::dimset -- the dimset GUIB keyword # USAGE # dimset dimIdent index what value # # DESCRIPTION # -- GUIB keyword !!! # Keyword "dimset" is meant for setting the "GUIB" dimension's variables. # Namely, the variable names as specified by the -variable option of the # GUIB keywords are only symbolic names. The actual names are the one of the # the _guibVar array (e.g. _guibVar(dimIdent,$index)). # # ARGUMENTS # dimIdent -- the GUIB-dimensions's identifier # index -- the index'th element of the dimension # what -- what to set -value|-textvalue # value -- value or textvalue (according to what) to set to the $dimIdent($index) variable # RETURN VALUE # The textvalue of the set variable. # EXAMPLE # dimset dimIdent $index "yes" #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::dimset {ident i1 what value} { set ident [_comafy $ident],$i1 return [varset $ident $what $value {usage: dimset $ident $index -value|-textvalue $value}] } # ------------------------------------------------------------------------ #****m* moduleObj/tableset # NAME # ::guib::moduleObj::tableset -- the tableset GUIB keyword # USAGE # tableset tableIdent irow icol what value # # DESCRIPTION # -- GUIB keyword !!! # Keyword "tableset" is meant for setting the "GUIB" table's variables. # Namely, the variable names as specified by the -variable option of the # GUIB keywords are only symbolic names. The actual names are the one of the # the _guibVar array (e.g. _guibVar(tableIdent,$irow,$icol)). # # ARGUMENTS # tableIdent -- the GUIB-table's identifier # irow icol -- the irow,icol'th element of the table # what -- what to set -value|-textvalue # value -- value to assign to the $tableIdent($irow,$icol) variable # RETURN VALUE # The textvalue of the set variable. # EXAMPLE # tableset tableIdent $irow $icol -textvalue "yes" #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::tableset {ident i1 i2 what value} { set ident [_comafy $ident],$i1,$i2 return [varset $ident $what $value {usage: tableset $ident $irow $icol -value|-textvalue $value}] } # ------------------------------------------------------------------------ #****m* moduleObj/widget # NAME # ::guib::moduleObj::widget -- the widget GUIB keyword # USAGE # widget varIdent action # # DESCRIPTION # -- GUIB keyword !!! # Keyword "widget" is meant for setting the state of the widget # associated with the GUIB variable. A typical usage of widget keyword # is inside the tracevar scripts. # # ARGUMENTS # varIdent -- GUIB-variable's identifier (used for locating the corresponding widget) # action -- what to do (should be one of forget|create|enable|disable) # RETURN VALUE # None. # EXAMPLE # widget myvar enable #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::widget {varIdent action} { _widget $action $varIdent } # ------------------------------------------------------------------------ #****m* moduleObj/widgetconfigure # NAME # ::guib::moduleObj::widgetconfigure -- the widgetconfigure GUIB keyword # USAGE # widgetconfigure varIdent option value ?option value? ... # # DESCRIPTION # -- GUIB keyword !!! # Keyword "widgetconfigure" is meant for configuring the widget # associated with the GUIB variable. A typical usage of widget keyword # is inside the tracevar scripts. # # ARGUMENTS # varIdent -- GUIB-variable's identifier (used for locating the corresponding widget) # args -- the option value pairs (allowed options are those accepted by the corresponding guib-widget) # RETURN VALUE # None. # EXAMPLE # widgetconfigure myvar -text "Whatever ..." #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::widgetconfigure {varIdent args} { # t.k. # first try to update the keywordObj database according to args # if { [set obj [_getObjFromVarident $varIdent]] != "" } { #puts stderr "::guib::moduleObj::widgetconfigure : obj = $obj ; varIdent = $varIdent" set id [$obj getIdFromVarident $varIdent] set key [$obj getKey $id] #puts stderr "::guib::moduleObj::widgetconfigure : key = $key ; id = $id" if { [info exists options($key)] } { #puts stderr "::guib::moduleObj::widgetconfigure : set argvVar $args" set argvVar $args foreach {opt value} $args { $obj setOptions $id [list [string trimleft $opt -] $value] #puts stderr "::guib::moduleObj::widgetconfigure : $obj setOptions $id [list $opt $value]" } #while { [::cmdline::getKnownOpt argvVar $options($key) opt value] > 0 } { # $obj setOptions $id [list $opt $value] # puts stderr "::guib::moduleObj::widgetconfigure : $obj setOptions $id [list $opt $value]" # #} } } #/t.k. # # now configure the widget # set widget [getWidgetFromVarident $varIdent] if { $widget == "" } { #error "widget \"$widget\" not found" return } eval $widget configure $args } # ------------------------------------------------------------------------ #****m* moduleObj/widgetcget # NAME # ::guib::moduleObj::widgetcget -- the widgetcget GUIB keyword # USAGE # widgetcget varIdent option # DESCRIPTION # -- GUIB keyword !!! # Keyword "widgetcget" is meant for querying the current value of # the configuration option given by option. Option may have any of the # values accepted by the corresponding widget command. # ARGUMENTS # varIdent -- GUIB-variable's identifier (used for locating the corresponding widget) # option -- the querying option # RETURN VALUE # Returns the current value of the configuration option given by # option. # EXAMPLE # set value [widgetcget myvar -myoption] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::widgetcget {varIdent option} { set widget [getWidgetFromVarident $varIdent] if { $widget == "" } { #error "widget \"$widget\" not found" return "" } return [$widget cget $option] } # ------------------------------------------------------------------------ #****m* moduleObj/keywordconfigure # NAME # ::guib::moduleObj::keywordconfigure -- the keywordconfigure GUIB keyword # USAGE # keywordconfigure keyword state # # DESCRIPTION # -- GUIB keyword !!! # Keyword "keywordconfigure" is meant is meant for for setting the # state of the a given keyword. If a given keyword id disabled it will # be ignored when reading/writing the input/output files. # # ARGUMENTS # keyword -- the name of the keyword (used for locating the corresponding keyword) # state -- the state of the keyword (must be enable|disable) # RETURN VALUE # None. # EXAMPLE # keywordconfigure MY_KEYWORD enable #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::keywordconfigure {keyIdent state} { switch -exact -- $state { enable { ::tclu::lremove disabledKeywordidentList $keyIdent } disable { ::tclu::ladd disabledKeywordidentList $keyIdent } default { ::tclu::ERROR "wrong state \"$state\", must be enable or disable" } } ::tclu::DEBUG event: disabledKeywordidentList == $disabledKeywordidentList } # ------------------------------------------------------------------------ #****m* moduleObj/packwidgets # NAME # ::guib::moduleObj::packwidgets -- the packwidgets GUIB keyword # USAGE # packwidgets top | bottom | left | right # # DESCRIPTION # -- GUIB keyword !!! # Keyword "packwidgets" is meant for manupulation the -side option # of the pack Tk command. The dafault value is "top", but if one wants # to pack widget as left, then this can be achieved via "packwidgets # left" command. Packwidget command is affective only on the current # or higher stack-levels. # # RETURN VALUE # None. # EXAMPLE # packwidgets left #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::packwidgets {side} { switch -exact -- $side { top - bottom - left - right { set obj [_getCurrentObj] set id [$obj incrID] $obj setKey $id packwidgets $obj setOptions $id [list side $side] } default { ::tclu::ERROR "unknown side \"$dise\", must be one of top, bottom, left or right" } } } # ------------------------------------------------------------------------ #****m* moduleObj/separator # NAME # ::guib::moduleObj::separator -- the "separator" GUIB keyword # USAGE # separator ?-label label? # # DESCRIPTION # -- GUIB keyword !!! # Keyword "separator" creates a separator widget. Separator can # display a label as well. # # RETURN VALUE # None. # EXAMPLE # separator -label "Next variables:" #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::separator {args} { _separator [_getCurrentObj] $args } # ------------------------------------------------------------------------ #****m* moduleObj/readfilter # NAME # ::guib::moduleObj::readfilter -- the "readfilter" GUIB keyword # USAGE # readfilter cmd # # DESCRIPTION # -- GUIB keyword !!! # Keyword "readfilter" is used for telling the GUIB that when an # input-file is open, it should first be parsed by the proc specified # by "readfilter" keyword. A typical usage of readfilter keyword is in # situations where GUIB cannot handle well the input-file, and we need # some pre-processing of the input. Usually when the "readfilter" is # used for input pre-processing, then the "writefilter" should be used # for post-processing the outout. # # The readfilter "cmd" proc should be of the following form: # # proc myReadFilter {moduleObj channel} { # ... code here ... # return $myChannel # } # # Where "moduleObj" is object-name of the moduleObj, and "channel" is # the input-file channel (i.e. set channel [open $myInput r]). The # proc MUST return a file-channel of the pre-processed input. # # RETURN VALUE # Returns the "cmd". # SOURCE itcl::body ::guib::moduleObj::readfilter {cmd} { set readFilter $cmd } #******** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* moduleObj/writefilter # NAME # ::guib::moduleObj::writefilter -- the "writefilter" GUIB keyword # USAGE # writefilter cmd # # DESCRIPTION # -- GUIB keyword !!! # Keyword "writefilter" is used for telling the GUIB that when an # output is written, it should post-process by the proc specified by # "writefilter" keyword, before writting to a file or stdout. A # typical usage of writefilter keyword is in situations where GUIB # cannot handle well the input-file, and we need some pre-processing # of the input by "readfilter" proc. In such a case also the # "writefilter" is used for post-processing the outout. # # The writefilter "cmd" proc should be of the following form: # # proc myWriteFilter {moduleObj outputContent} { # ... code here ... # return $myOutputContent # } # # Where "moduleObj" is object-name of the moduleObj, and # "outputContent" variable holds the output. The proc MUST return the # content of the processed output. # # RETURN VALUE # Returns the "cmd". # SOURCE itcl::body ::guib::moduleObj::writefilter {cmd} { set writeFilter $cmd } #******** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* moduleObj/postprocess # NAME # ::guib::moduleObj::postprocess -- executes a given script after the GUI is built # USAGE # postprocess script # # DESCRIPTION # -- GUIB keyword !!! # Keyword "postprocess" is used for specifying a script that will # be executed after the Tk-GUI is built. A typical usage is setting # the default values of the variables, so that variable traces will be # executed. This can be used for enabling/disabling GUIB widgets. # # RETURN VALUE # Returns the content of the script. # EXAMPLE # postprocess { # varset myVar -textvalue "default value" # } # SOURCE itcl::body ::guib::moduleObj::postprocess {script} { set postprocessScript $script } #******** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* moduleObj/this # NAME # ::guib::moduleObj::this -- returns the name of the moduleObj object # USAGE # this script # # DESCRIPTION # -- GUIB keyword !!! # Keyword "this" returns the name of the moduleObj object. Namely, # under some circumstance, the name of the moduleObj object is # required in the GUIB module-definition files. # # RETURN VALUE # Returns the name of the moduleObj object, i.e., returns the value # of $this). # SOURCE itcl::body ::guib::moduleObj::this {} { return $this } #******** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* moduleObj/loaddata # NAME # ::guib::moduleObj::loaddata -- the loaddata GUIB keyword # USAGE # loaddata varIdent cmd # # DESCRIPTION # -- GUIB keyword !!! # Keyword "loaddata" is meant for loading the large chuncks of data # for keywidgets. A typical usage is "loading the tables" from file. # # ARGUMENTS # varIdent -- GUIB-variable's identifier, i.e., identifier of table/dimension/var for which to load data # cmd -- routine for loading the data of the "proc cmd {moduleObj} {...}" form # RETURN VALUE # None. # EXAMPLE # loaddata myTable load_MyTable # # The "load_MyTable" command must be of the form: # # proc {moduleObj} { # ... code ... # } #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::loaddata {varIdent cmd {buttonText "Load from file ..."}} { lappend _loadData(varlist) $varIdent lappend _loadData(cmdlist) $cmd lappend _loadData(textlist) $buttonText } # ------------------------------------------------------------------------ #****m* moduleObj/groupwidget # NAME # ::guib::moduleObj::groupwidget -- the groupwidget GUIB keyword # USAGE # groupwidget ident action # # DESCRIPTION # -- GUIB keyword !!! # Keyword "groupwidget" is meant for configuring the group of GUIB # widgets. This keyword is like a "widget" keyword, but instead to a # single widget acts on a group of widgets, that were encapsulated # inside a given group keyword. A typical usage of groupwidget keyword # is inside the tracevar scripts. # # ARGUMENTS # ident -- the identifier of the object # action -- what to do (should be one of enable|disable) # RETURN VALUE # None. # EXAMPLE # groupwidget name enable #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::groupwidget {ident action} { # we could also do like this: #------------------------------------- #set obj [identinfo $ident keywordObj] #set id [identinfo $ident id] #set nameObj [$obj getChild $id] #if { $nameObj == "" < 0 } { # return #} set ind [lsearch -glob $nameObjList "$ident *"] if { $ind < 0 } { return } set nameObj [lindex [lindex $nameObjList $ind] 1] _groupwidget $nameObj $action } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/text.itcl0000644000077300007730000001152412341332511021567 0ustar giannozzgiannozz# # $RCSfile: text.itcl,v $ -- # # This file contains the text widget for the "text" GUIB keyword. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: text.itcl,v 1.2 2008-05-08 18:44:36 kokalj Exp $ # # ------------------------------------------------------------------------ #****f* keywidgets/text # NAME # ::guib::keywidgets::text -- the "text" keywidget # USAGE # text pathName ?-option value? ?-option value? ?...? # RETURN VALUE # The pathName of the text widget. # SOURCE proc ::guib::keywidgets::text {pathName moduleObj args} { uplevel ::guib::keywidgets::Text $pathName $moduleObj $args } #**** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****c* keywidgets/Text # NAME # ::guib::keywidgets::Text -- a class for managing keywidget associated with "text" GUIB keyword # METHODS # ...insert... #**** # ------------------------------------------------------------------------ itcl::class ::guib::keywidgets::Text { #inherit ::guib::keywidgets::Options inherit ::itk::Widget public { method getText {} method setText {text} } itk_option define -state state State normal itk_option define -caption caption Caption {} itk_option define -varname varname Varname {} itk_option define -label label Label {} itk_option define -readvar readvar Readvar {} itk_option define -helptext helptext Helptext {} itk_option define -helpfmt helpfmt Helpfmt {} itk_option define -vartype vartype Vartype {} constructor {moduleObj args} { update; update idletask tclu::DEBUG constructing KEYWIDGETS::TEXT set keywidget text set _moduleObj $moduleObj # -------------------------------------------------- # add CAPTION component holding the value of the -caption option # itk_component add caption { message $itk_interior.caption -relief solid -bd 1 \ -background White -anchor w } { #keep -text rename -background -captionbackground captionBackground Background } bind $itk_component(caption) {::guib::widgets::messageAspect %W} #-------------------------------------------------- update; update idletask tclu::DEBUG itk_initialize eval itk_initialize $args # ------------------------------------------------------------------------ # add TEXT component if { $itk_option(-helptext) == "" } { set helpCmd {} } else { set helpCmd [list ::guib::widgets::displayhelp $itk_option(-varname) \ $itk_option(-vartype) $itk_option(-helpfmt) $itk_option(-helptext)] } update; update idletask tclu::DEBUG itk_component add texthelp #-textvariable $[$_moduleObj varref $itk_option(-varident)] itk_component add text { #::iwidgets::scrolledtext $itk_interior.text \ # -labeltext $itk_option(-label) \ # -wrap none ::guib::widgets::texthelp $itk_interior.text \ -labelpos n \ -labeltext $itk_option(-label) \ -wrap none \ -helpcommand $helpCmd } { #keep -textvariable ; } pack $itk_component(text) -side top -fill x #------------------------------------------------------------------------ } } itcl::body ::guib::keywidgets::Text::setText {text} { # delete existing text and insert new one $itk_component(text) delete 1.0 end $itk_component(text) insert 1.0 $text } itcl::body ::guib::keywidgets::Text::getText {} { return [$itk_component(text) get 1.0 end] } itcl::configbody ::guib::keywidgets::Text::caption { if { $itk_option(-caption) != "" } { $itk_component(caption) configure -text $itk_option(-caption) if { ! [winfo viewable $itk_component(caption)] } { pack $itk_component(caption) -side top -fill x -padx 3 -pady 2 } } else { pack forget $itk_component(caption) } } itcl::configbody ::guib::keywidgets::Text::state { switch -exact -- $itk_option(-state) { active - normal { ::tku::enableAll $itk_interior } disabled { ::tku::disableAll $itk_interior } default { error "wrong widget state \"$itk_option(-state)\", should be normal or disabled" } } } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/tclIndex0000644000077300007730000007442212341332511021431 0ustar giannozzgiannozz# 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(::guib::keywordObj) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::getID) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::incrID) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::setKey) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::setChild) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::setOptions) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::getKey) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::getChild) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::getOptions) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::getOptionValue) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::getIdFromVarname) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::getIdFromVarident) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::getOutFmt) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::getInFmt) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::nameObj) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::keywordObj::voidObj) [list source [file join $dir keywordObj.itcl]] set auto_index(::guib::widgets::messageAspect) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::toplevel) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Toplevel) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entrybutton) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Entrybutton) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entryfileselect) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entryfileselectquote) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Entryfileselect) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Entryfileselect::_fileSelect) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entrydirselect) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entrydirselectquote) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Entrydirselect) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Entrydirselect::_dirselect) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entryhelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Entryhelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entrybuttonhelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Entrybuttonhelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entryfileselecthelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entryfileselectquotehelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Entryfileselecthelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entrydirselecthelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::entrydirselectquotehelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Entrydirselecthelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::comboboxhelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Comboboxhelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Comboboxhelp::textvalues) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::texthelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Texthelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Texthelp::delete) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Texthelp::get) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Texthelp::insert) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::scalehelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Scalehelp) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Scalehelp::textvariable) [list source [file join $dir widgets.itcl]] set auto_index(::guib::widgets::Scalehelp::scaleConfig_) [list source [file join $dir widgets.itcl]] set auto_index(::guib::moduleObj::saveAs) [list source [file join $dir save.itcl]] set auto_index(::guib::moduleObj::save) [list source [file join $dir save.itcl]] set auto_index(::guib::moduleObj::print) [list source [file join $dir save.itcl]] set auto_index(::guib::moduleObj::getOutput) [list source [file join $dir save.itcl]] set auto_index(::guib::moduleObj::_manageSave) [list source [file join $dir save.itcl]] set auto_index(::guib::moduleObj::_save) [list source [file join $dir save.itcl]] set auto_index(::guib::moduleObj::_quoteValue) [list source [file join $dir save.itcl]] set auto_index(::iwidgets::spinint) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::Spinint) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::Spinint::constructor) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::Spinint::validate) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::Spinint::range) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::Spinint::step) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::Spinint::wrap) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::Spinint::up) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::Spinint::down) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::spininthelp) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::widgets::Spininthelp) [list source [file join $dir spininthelp.itcl]] set auto_index(::guib::loadModule) [list source [file join $dir guib.itcl]] set auto_index(::guib::module) [list source [file join $dir guib.itcl]] set auto_index(::guib::exitApp) [list source [file join $dir guib.itcl]] set auto_index(::guib::properArrayName) [list source [file join $dir guibUtils.itcl]] set auto_index(::guib::arrayInstance) [list source [file join $dir guibUtils.itcl]] set auto_index(::guib::arrayName) [list source [file join $dir guibUtils.itcl]] set auto_index(::guib::elemName) [list source [file join $dir guibUtils.itcl]] set auto_index(::guib::comafy) [list source [file join $dir guibUtils.itcl]] set auto_index(::guib::keywidgets::table) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::caption) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::head) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::cols) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::rows) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::validate) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::state) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::widgets) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::onvalues) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::offvalues) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::_addRow) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::_addCol) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::_deleteRow) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::_deleteCol) [list source [file join $dir table.itcl]] set auto_index(::guib::keywidgets::Table::_widget) [list source [file join $dir table.itcl]] set auto_index(::guib::widgets::dialogshell) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::constructor) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::thickness) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::buttonboxpos) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::separator) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::padx) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::pady) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::childsite) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::index) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::add) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::insert) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::delete) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::hide) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::show) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::default) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::invoke) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::buttonconfigure) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::widgets::Dialogshell::buttoncget) [list source [file join $dir dialogshell.itcl]] set auto_index(::guib::moduleObj::makeEmbedGUI) [list source [file join $dir build.itcl]] set auto_index(::guib::moduleObj::_buildGUI) [list source [file join $dir build.itcl]] set auto_index(::guib::moduleObj::_buildGUI_constructItem) [list source [file join $dir build.itcl]] set auto_index(::guib::moduleObj::_configurePage) [list source [file join $dir build.itcl]] set auto_index(::guib::moduleObj::_packSide) [list source [file join $dir build.itcl]] set auto_index(::guib::moduleObj::openFile) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::readFile) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::readFileError) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::readFileWrongFormat) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::_openSyntaxError) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::_open) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::_openCompareStr) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::_openGets) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::_openReadNamelistVar) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::_openReadNamelistValue) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::_openReadKeyword) [list source [file join $dir open.itcl]] set auto_index(::guib::moduleObj::_isDisabledKey) [list source [file join $dir open.itcl]] set auto_index(::guib::keywidgets::text) [list source [file join $dir text.itcl]] set auto_index(::guib::keywidgets::Text) [list source [file join $dir text.itcl]] set auto_index(::guib::keywidgets::Text::setText) [list source [file join $dir text.itcl]] set auto_index(::guib::keywidgets::Text::getText) [list source [file join $dir text.itcl]] set auto_index(::guib::keywidgets::Text::caption) [list source [file join $dir text.itcl]] set auto_index(::guib::keywidgets::Text::state) [list source [file join $dir text.itcl]] set auto_index(::guib::GUI) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::constructor) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::activate) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::addModule) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::addHelp) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::newGUI) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::page) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::component) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::getSelected) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::extra) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::state) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::__manageState) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_mainwindowState) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::__createNotebook) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_selectedTab) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::__setCurrentTabName) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_toplevelTitle) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_newInput) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_openInput) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::save) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::saveAs) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_closeCurrentTab) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_closeTab) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_closeWindow) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_help) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_toolbarNew) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_toolbarOpen) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::__toolbarNewOpen) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::_toolbarCmd) [list source [file join $dir gui.itcl]] set auto_index(::guib::GUI::__tmpSelected) [list source [file join $dir gui.itcl]] set auto_index(::guib::moduleObj) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_validateFmtString) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_comafy) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_openGets) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_expandArgs) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::__storeItem) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_findKeywordObjType) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::setModuleFile) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::getModuleFile) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_setCurrentObj) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_getCurrentObj) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_getCurrentObjType) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_addVaridentWidget) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_addVaridentObj) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::getWidgetFromVarident) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::varnameToVarident) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::identinfo) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_getObjFromVarident) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_getAfterWidget) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_getAfterMappedWidget) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_manageKeyword) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_manageNameObj) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_manageVoidObj) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::loaddataGetInfo) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_clearOutput) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_appendOutput) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_getOutput) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_makeIdent) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_isUniqueIdent) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_addIdent) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_checkIdentChars) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::isNotDisabledWidget) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_deleteDisabledWid) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_addDisabledWid) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_validateFmtString) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_comafy) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_findKeywordObjType) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_expandArgs) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_tracevar) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_traceCmd) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_widget) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_separator) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_groupwidget) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_scopedName) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::saveToVar) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_saveToVar) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::loadFromVar) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_loadFromVar) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::getAllVar) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::_getAllVar) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::optionSetDefault) [list source [file join $dir moduleObj.itcl]] set auto_index(::guib::moduleObj::storeModuleItems) [list source [file join $dir store.itcl]] set auto_index(::guib::moduleObj::__storeItem) [list source [file join $dir store.itcl]] set auto_index(::guib::moduleObj::_storeModuleItems) [list source [file join $dir store.itcl]] set auto_index(::guib::simpleTplwGUI) [list source [file join $dir simpleGui.itcl]] set auto_index(::guib::embedGUI) [list source [file join $dir simpleGui.itcl]] set auto_index(::guib::menuOpen) [list source [file join $dir simpleGui.itcl]] set auto_index(::guib::moduleObj::makeSimpleTplwGUI) [list source [file join $dir simpleGui.itcl]] set auto_index(::guib::moduleObj::valueToTextvalue) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::textvalueToValue) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::page) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::optional) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::required) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::namelist) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::group) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::line) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::text) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::var) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::auxilvar) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::scriptvar) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::dimension) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::table) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::keyword) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::help) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::grouphelp) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::tracevar) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::varvalue) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::vartextvalue) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::dimvalue) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::dimtextvalue) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::tablevalue) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::tabletextvalue) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::varref) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::dimref) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::tableref) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::varset) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::dimset) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::tableset) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::widget) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::widgetconfigure) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::widgetcget) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::keywordconfigure) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::packwidgets) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::separator) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::readfilter) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::writefilter) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::postprocess) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::this) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::loaddata) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::moduleObj::groupwidget) [list source [file join $dir guibKeywords.itcl]] set auto_index(::guib::widgets::radioboxhelp) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp::constructor) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp::insert) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp::selected) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp::_additems) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp::_selectitem) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp::_traceTextvariable) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp::textvariable) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp::textvalues) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::widgets::Radioboxhelp::state) [list source [file join $dir radioboxhelp.itcl]] set auto_index(::guib::keywidgets::Options) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::auxilvar) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::var) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Var) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::dimension) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Dimension) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Dimension::_manageDims) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::state) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::text) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::label) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::value) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::textvalue) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::default) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::validate) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::infmt) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::outfmt) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::widget) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::helptext) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Options::helpfmt) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Dimension::noframe) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Dimension::start) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Dimension::end) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::keywidgets::Dimension::pack) [list source [file join $dir keywidgets.itcl]] set auto_index(::guib::widgets::optionmenuhelp) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::constructor) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::insert) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::selected) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::_additems) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::_selectitem) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::_traceTextvariable) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::nohelp) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::textvariable) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::textvalues) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::Optionmenuhelp::state) [list source [file join $dir optionmenuhelp.itcl]] set auto_index(::guib::widgets::displayhelp) [list source [file join $dir help.itcl]] set auto_index(::guib::widgets::validate_functions) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::whatever) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::binary) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::int) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::posint) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::nonposint) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::negint) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::nonnegint) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::real) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::posreal) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::nonposreal) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::negreal) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::nonnegreal) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::fortranreal) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::fortranposreal) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::fortrannonposreal) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::fortrannegreal) [list source [file join $dir validate.itcl]] set auto_index(::guib::widgets::fortrannonnegreal) [list source [file join $dir validate.itcl]] espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/help.itcl0000644000077300007730000001061112341332511021527 0ustar giannozzgiannozz# $RCSfile: help.itcl,v $ -- # # This file contains the routines for managing the display of # the help for a given GUI-module. This help is accessed by pressing # the "Help" button of a given ****help megawidget. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: help.itcl,v 1.3 2008-05-08 18:44:37 kokalj Exp $ # # # NOTE: the documentation of this file is yet to be build # # ------------------------------------------------------------------------ # DISPLAYHELP # ------------------------------------------------------------------------ #****f* widgets/displayhelp # NAME # ::guib::widgets::displayhelp -- displayhelp megawidget # USAGE # displayhelp varName helpFmt helpText # DESCRIPTION # Displayhelp megawidget display a help associated with a given # input variable defined in module definition file. # ARGUMENTS # varName -- the GUIB input variable's identifier # helpFmt -- the format of the help-text, (html|txt2html|txt) # helpText -- the help-text to be displayed # RETURN VALUE # Returns the path of the displayhelp's toplevel widget. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::displayhelp {varName varType helpFmt helpText} { set t [::guib::widgets::toplevel [::tku::widgetName] -title "Help console: $varName"] #set labelText "Description of the variable: $varName" set labelText "" set HELP_FMT [string toupper $helpFmt] switch -- $HELP_FMT { "HELPDOC" { # this is for html generated by helpdoc utility set labelText "" set html_head "\n\nDescription of the item: $varName\n\n" set html_tail "\n\n" set helpText "$html_head $helpText $html_tail" set wid [::iwidgets::scrolledhtml $t.html \ -labeltext $labelText \ -wrap none \ -hscrollmode static \ -vscrollmode static] $wid render $helpText } "HTML" - "TXT2HTML" { set html_head { Description of the variable: $varName Variable: $varName

} if { $varType != "" } { set html_vartype " Variable's type: $varType
" } else { set html_vartype "" } set html_tail { } if { $HELP_FMT == "TXT2HTML" } { set helpText [format %s%s%s%s%s%s \ [subst $html_head] [subst $html_vartype] \ "

\n" $helpText "
" \ [subst $html_tail]] } else { set helpText [format %s%s%s%s \ [subst $html_head] [subst $html_vartype] \ $helpText \ [subst $html_tail]] } set wid [::iwidgets::scrolledhtml $t.html \ -labeltext $labelText \ -linkcommand [list $t.html import -link] \ -wrap word -vscrollmode static \ -hscrollmode static] $wid render $helpText } "TXT" { # format == TXT (in the FUTURE also add the support for LaTex) set wid [::iwidgets::scrolledtext $t.text \ -labeltext $labelText \ -vscrollmode static \ -hscrollmode static \ -wrap none] set txt_head { Variable: $varName Variable's type: $varType } $wid insert end [format %s%s [subst $txt_head] $helpText] } default { ::tclu::ERROR "unknown help format $helpFMT, must be html, txt2html, or txt" } } #$wid configure -width 700 -height 300 set bb [::iwidgets::buttonbox $t.bb] $bb add Close -text "Close" -command "destroy $t" $bb default Close pack $bb -side top -fill x -expand 0 pack $wid -before $bb -side top -fill both -expand 1 ::tku::centerWindow $t return $t } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/build.itcl0000644000077300007730000003254312341332511021706 0ustar giannozzgiannozz# $RCSfile: build.itcl,v $ -- # # This file contains the the Tk GUI builder. That is, on the basis # of information as contained in the corresponding module definition # file the GUI using the iwidgets mega-widget library is build. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: build.itcl,v 1.6 2008-05-08 18:44:37 kokalj Exp $ # # ------------------------------------------------------------------------ #****m* moduleObj/makeEmbedGUI # NAME # ::guib::moduleObj::makeEmbedGUI -- makes an embedded GUI into a container window # USAGE # makeEmbedGUI wid # DESCRIPTION # Makes an embedded GUI (based on moduleObj definition) into a # container window (NOT STAND-ALONE). This method is called by # ::guib::embedGUI and, ::guib::moduleObj::makeSimpleTplwGUI, ... # ARGUMENTS # wid -- container widget into which the GUI will be created # RETURN VALUE # None. # EXAMPLE # $moduleObj makeEmbedGUI .mycontainer #**** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::makeEmbedGUI {wid} { ::tclu::ifexists objLevel { set objLevel 0 set pageLevel 0 unset lineEntryList unset packSide set packSide(0) top } #-- build GUI recursively _buildGUI $this $wid #-- foreach PackSide {top left} { if { [info exists lineEntryList($PackSide)] } { eval ::iwidgets::Labeledwidget::alignlabels $lineEntryList($PackSide) } } if { [info exists postprocessScript] } { if { $postprocessScript != {} } { eval $postprocessScript } } } # ------------------------------------------------------------------------ #****im* moduleObj/_buildGUI # NAME # ::guib::moduleObj::_buildGUI -- builds a Tcl/Tk based GUI recursively # # USAGE # _buildGUI masterObj obj wid # # DESCRIPTION # This proc build the Tcl/Tk GUI recursively. Insert description ... # # ARGUMENTS # masterObj - # obj - # wid - # RETURN VALUE # None. # # EXAMPLE # _buildGUI $masterObj $currentObj $widget_container #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_buildGUI {obj wid} { # BEWARE: do not call this proc directly, call the makeEmbedGUI instead !!! # The "makeEmbedGUI" makes some initialization, such as # setting the objLevel variable to 0 before calling the _buildGUI # at the 0-th objLevel !!! # just in case !!! if { ! [info exists objLevel] } { set objLevel 0 } if { ! [info exists pageLevel] } { set pageLevel 0 } if { ! [info exists packSide($objLevel)] } { # default for {set i $objLevel} {$i >= 0} {incr i -1} { if { [info exists packSide($i)] } { set packSide($objLevel) $packSide($i) break } } ::tclu::newset packSide($objLevel) top } set NItem [$obj getID] set objWidgetArray(CHILDSITEWIDGET,$obj) $wid for {set id 0} {$id <= $NItem} {incr id} { set key [$obj getKey $id] set childObj [$obj getChild $id] switch -exact -- $key { packwidgets { set packSide($objLevel) [$obj getOptionValue $id side] continue } keyword { continue } } if { $childObj != {} } { # we have new object incr objLevel switch -exact $key { page - required - optional { incr pageLevel if { ![info exists page($pageLevel)] } { set page($pageLevel,W) 0 set page($pageLevel,H) 0 set showPage 1 set tabpos n if { $pageLevel >= 3 } { set tabpos w } set page($pageLevel) [iwidgets::tabnotebook [::tku::widgetName $wid tnb] -tabpos $tabpos] pack $page($pageLevel) -fill both -expand 1 -ipadx 5 -ipady 5 } if { $key != "required" && $key != "optional" } { set name [$childObj cget -name] } else { set name "[string totitle $key] variables" } set wid [$page($pageLevel) add -label $name] set wid [frame $wid.f -background \#336699] pack $wid -fill both set objWidgetArray(WIDGET,$childObj) $wid ############################################## # RECURSIVELY parse the content of this PAGE # ############################################## _buildGUI $childObj $wid ################### # POST-PROCESSING # ################### bind $wid [list after idle [code $this _configurePage %W $page($pageLevel) $tabpos]] bind $wid [list after idle [code $this _configurePage %W $page($pageLevel) $tabpos]] ::tclu::ifexists showPage { $page($pageLevel) view $name unset showPage } ############################### # we are done with this level # ############################### incr pageLevel -1 } namelist - line - group { set decor [$obj getOptionValue $id decor] switch -glob -- $decor { prefix* - normal { if { $decor == "normal" } { set label "[$childObj cget -name]" } else { set label "[string totitle $key]: [$childObj cget -name]" } set nWid [iwidgets::labeledframe [::tku::widgetName $wid f] -labeltext $label] set childsite [frame [$nWid childsite].f -class Background] pack $nWid -side top -fill x -expand 1 -padx 3 -pady 2 pack $childsite -expand 1 -fill both -ipadx 0 -ipady 0 -padx 5 -pady 5 } none { set nWid [frame [::tku::widgetName $wid f] -class Background] pack $nWid -side [_packSide $objLevel] -expand 1 -fill both -ipadx 0 -ipady 0 -padx 0 -pady 0 set childsite $nWid } default { ::tclu::ERROR "wrong decor style, must be one of prefixed, normal or none" } } set objWidgetArray(WIDGET,$childObj) $nWid ################################################## # RECURSIVELY parse the content of this childObj # ################################################## _buildGUI $childObj $childsite } default { ::tclu::abort "the object-type \"$key\" is unknown" } } unset packSide($objLevel) incr objLevel -1 } else { ################## # BUILDING STAGE # ################## _buildGUI_constructItem $id $obj $wid $key e_list } } foreach PackSide {top left} { if { [info exists e_list($PackSide)] } { eval ::iwidgets::Labeledwidget::alignlabels $e_list($PackSide) } } # incoming #::tclu::ifexists packSide($objLevel) { # unset packSide($objLevel) #} } itcl::body ::guib::moduleObj::_buildGUI_constructItem {id obj wid key {elist {}}} { if { $elist != "" } { upvar $elist e_list } array set _cmd [$obj getOptions $id *] set _packSide [_packSide $objLevel] if { $key == "scriptvar" } { # ignore ; } elseif { $key == "separator" } { # # SEPARATOR # # TODO: make a separator keywidget set l [label [::tku::widgetName $wid] \ -text [$obj getOptionValue $id label] \ -background \#336699 \ -foreground \#ffffff \ -anchor c] pack $l -side $_packSide -fill x -padx 5 -pady 5 } elseif { $key == "table" } { # # TABLE # set helpCmd "" set helptext [$obj getOptionValue $id helptext] if { $helptext != "" } { set helpCmd [list ::guib::widgets::displayhelp \ [$obj getOptionValue $id variable] \ [$obj getOptionValue $id vartype] \ [$obj getOptionValue $id helpfmt] \ $helptext] } set varIdent [$obj getOptionValue $id ident] set t [::guib::keywidgets::table \ [::tku::widgetName $wid] $this \ -caption [$obj getOptionValue $id caption] \ -head [$obj getOptionValue $id head] \ -varname [$obj getOptionValue $id variable] \ -varident $varIdent \ -validate [$obj getOptionValue $id validate] \ -widgets [$obj getOptionValue $id widgets] \ -onvalues [$obj getOptionValue $id onvalues] \ -offvalues [$obj getOptionValue $id offvalues] \ -cols [$obj getOptionValue $id cols] \ -rows [$obj getOptionValue $id rows] \ -helpcommand $helpCmd] pack $t -side $_packSide -fill x -padx 3 -pady 2 # # Register the table associated with the variable (needed for # the variable->table retrieval) # _addVaridentWidget $varIdent $t } elseif { $key == "text" } { # # TEXT # set varIdent [$obj getOptionValue $id ident] set t [::guib::keywidgets::text \ [::tku::widgetName $wid] $this \ -caption [$obj getOptionValue $id caption] \ -varname [$obj getOptionValue $id variable] \ -label [$obj getOptionValue $id label] \ -readvar [$obj getOptionValue $id readvar] \ -helptext [$obj getOptionValue $id helptext] \ -helpfmt [$obj getOptionValue $id helpfmt] \ -vartype [$obj getOptionValue $id vartype]] # -varident [$obj getOptionValue $id ident] tclu::DEBUG _build: packing ::guib::keywidgets::text pack $t -side $_packSide -fill x -padx 3 -pady 2 -expand 1 tclu::DEBUG _build: _addVaridentWidget # # Register the text associated with the variable (needed for # the variable->table retrieval) # _addVaridentWidget $varIdent $t tclu::DEBUG _build: after _addVaridentWidget } else { # # VAR & AUXILVAR & DIMENSION # foreach elem { ident variable text label value textvalue default fmt validate infmt outfmt widget helptext helpfmt vartype noframe start end pack } { if { [info exists _cmd($id,$elem)] } { set _$elem $_cmd($id,$elem) } else { set _$elem {} } } set e [::guib::keywidgets::$key \ [::tku::widgetName $wid] $this \ -varident $_ident \ -varname $_variable \ -text $_text \ -label $_label \ -value $_value \ -textvalue $_textvalue \ -default $_default \ -fmt $_fmt \ -validate $_validate \ -infmt $_infmt \ -outfmt $_outfmt \ -widget $_widget \ -helptext $_helptext \ -helpfmt $_helpfmt \ -vartype $_vartype \ -noframe $_noframe \ -start $_start \ -end $_end \ -pack $_pack] pack $e -side $_packSide -fill x -padx 3 -pady 2 -expand 1 # # Register the widget associated with the variable (needed for # the variable->widget retrieval) # if { $key == "dimension" } { _addVaridentWidget $_ident $e } foreach elem [$e getVaridentWidpath] { set ident [lindex $elem 0] set path [lindex $elem 1] _addVaridentWidget $ident $path } # # register the labeledwidget derived widgets for the # alignlabels # if { $key == "dimension" && $_pack != "" } { # entries in dimension should be aligned separately set Pack $_pack } elseif { $_packSide == "top" || $_packSide == "bottom" } { set Pack top } else { set Pack left } foreach elem [$e getWidpathWidtype] { set path [lindex $elem 0] set type [lindex $elem 1] switch -exact -- $type { entry - optionmenu - spinint { lappend e_list($Pack) $path } default { lappend e_list($Pack) $path } } } if { [$obj cget -type] == "line" } { ::tclu::ifexists e_list($Pack) { if { ! [info exists lineEntryList($Pack)] } { set lineEntryList($Pack) {} } foreach elem $e_list($Pack) { ::tclu::ladd lineEntryList($Pack) $elem } } } } tclu::DEBUG exiting ::guib::moduleObj::_buildGUI_constructItem update; update idletask tclu::DEBUG exiting ::guib::moduleObj::_buildGUI_constructItem 2 } itcl::body ::guib::moduleObj::_configurePage {thisPage tabnotebook tabpos} { update if { ! [winfo exists $thisPage] } { return } if { ! [winfo viewable $thisPage] } { return } set bindScript [bind $thisPage ] bind $thisPage {} set tabset [$tabnotebook component tabset] set W [winfo reqwidth $thisPage] set H [winfo reqheight $thisPage] set Tw [winfo reqwidth $tabset] set Th [winfo reqheight $tabset] if { $tabpos == "w" || $tabpos == "e" } { set W [expr $W + $Tw] if { $Th > $H } { set H $Th } } else { set H [expr $H + $Th] if { $Tw > $W } { set W $Tw } } set list [pack info $tabnotebook] set ind [expr [lsearch -exact $list -ipadx] + 1] set ipadx [expr 2 * [lindex $list $ind]] $tabnotebook configure -width [expr $W - $ipadx] -height $H update # don't delete the if {} sentence if { [winfo exists $thisPage] } { bind $thisPage $bindScript } } itcl::body ::guib::moduleObj::_packSide {objLevel} { for {set i $objLevel} {$i >= 0} {incr i -1} { if { [info exists packSide($objLevel)] } { return $packSide($objLevel) } } return top }espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/gui.itcl0000644000077300007730000010642312341332511021372 0ustar giannozzgiannozz# # $RCSfile: gui.itcl,v $ -- # # This file contains the ::guib::GUI class, which is used by one of # the moduleObj's GUI contruction methods. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: gui.itcl,v 1.12 2009-08-03 14:33:38 kokalj Exp $ # # ------------------------------------------------------------------------ #****c* ::guib/GUI # NAME # ::guib::GUI -- a class for constructing a complex GUI for the real applications # USAGE # ::guib::GUI $objname \ # -title "title that appears in the mainwondow" \ # -appname "short name of application" # # $objname addModule module ident modulename moduleFile fileTypes # $objname addHelp help helpName helpEntrymenuText helpFile # # Where the fileTypes if of form: # # set fileTypes { # {{X input file} {*.x.inp} } # {{description} {extension}} # {{...} {...} # } # # DESCRIPTION # This class is used by real applications to construct the GUI's # main window with menu, toolbar, etc... # # METHODS # 1. Public methods # activate -- # addModule -- # addHelp -- # newGUI -- # component -- # extra -- # save -- # saveAs -- # # 2. Protected/Private methods # 2.1 Menu methods # _newInput -- # _openInput -- # _closeTab -- # _closeWindow -- # _help -- # # 2.2 Toolbar methods # _toolbarNew -- # _toolbarOpen -- # __toolbarNewOpen -- # _toolbarCmd -- # # 2.3 Other methods (state of the menus, tabs ...) # _toplevelTitle -- # _mainwindowState -- # _selectedTab -- # __createNotebook -- # __setCurrentTabName -- #**** # ------------------------------------------------------------------------ itcl::class ::guib::GUI { # -------------------------------------------------- # VARIABLES # -------------------------------------------------- public common counter 0 public common aliveCounter 0 public variable title {}; # the "window" title of the GUI public variable appname {}; # short name of application private variable nTabs 0; # used only for label in the tabs !!! private variable tabsCounter 0; # counts how many tabs have been created private variable index2tabsCounter private variable widget private variable currentTab private variable toplevelTitle private variable helpVar private variable help private variable saveFile private variable module private variable extra {} private variable state {} private variable addModule private variable addHelp private variable menuSeparatorCount -1 # -------------------------------------------------- # PUBLIC methods # -------------------------------------------------- constructor {args} {} public method activate {} public method addModule {mode args} public method addHelp {mode args} public method newGUI {} public method component {name} public method extra {code} public method state {code} #public method newTab {name} #public method tabconfigure {args} public method page {mode args} public method getSelected {what} #public method get {what args} #public method set {what args} public method save {{nocomplain 0}} public method saveAs {} # -------------------------------------------------- # PROTECTED/PRIVATE methods # -------------------------------------------------- # # MENU methods # protected method _newInput {moduleIdent moduleName moduleFile} #private method __newInput {name moduleFile} protected method _openInput {moduleIdent moduleName moduleFile} #private method __openInput {moduleName moduleFile} protected method _closeTab {index} protected method _closeCurrentTab {} protected method _closeWindow {} protected method _help {helpName helpFile {wrap word}} # # TOOLBAR methods # protected method _toolbarNew {} protected method _toolbarOpen {} private method __toolbarNewOpen {what prefixText cmd} protected method _toolbarCmd {t cmd moduleIdent moduleName moduleFile} # # other methods (state of the menus, tabs ...) # protected method _toplevelTitle {name1 name2 op} protected method _mainwindowState {{name1 {}} {name2 {}} {op {}}} protected method _selectedTab {} private method __createNotebook {} private method __setCurrentTabName {name} private method __manageState # temporary methods ... private method __tmpSelected {} } # ------------------------------------------------------------------------ # CONSTRUCTOR # # Usage: ::guib::GUI -title title -appname appname # ------------------------------------------------------------------------ itcl::body ::guib::GUI::constructor {args} { eval configure $args incr counter incr aliveCounter set currentTab(index) -1 set index2tabsCounter(-1) -1; # used whet currentTabs(index) == -1 set module(INDEX) 0 set help(INDEX) 0 # -------------------------------------------------- # create a Toplevel window # -------------------------------------------------- set widget(toplevel) [::tku::toplevelName .gui] iwidgets::mainwindow $widget(toplevel) -padx 0 -pady 0 if { $counter <= 1 } { set toplevelTitle(prefix) "$title" } else { set toplevelTitle(prefix) "$title (\#.$counter)" } $widget(toplevel) configure -title $toplevelTitle(prefix) wm protocol $widget(toplevel) WM_DELETE_WINDOW [code $this _closeWindow] bind $widget(toplevel) ::guib::exitApp bind $widget(toplevel) [code $this _closeWindow] # -------------------------------------------------- # create a Menubar (File & Help) # -------------------------------------------------- set widget(menubar) [$widget(toplevel) menubar] set mb $widget(menubar) $mb configure -helpvariable [scope helpVar] -menubuttons { menubutton file -text "File" -menu { options -tearoff false } menubutton help -text "Help" -menu { options -tearoff false } } # -------------------------------------------------- # Menubutton: File # -------------------------------------------------- $mb add command .file.newwin -label "New $appname Window" \ -command [code $this newGUI] \ -helpstr "Create new window"; # TODO: fix this ... # New -------------------------------------------------- New $mb add cascade .file.newinp -label "New ..." # Open -------------------------------------------------- Open $mb add separator .file.sep1 $mb add cascade .file.openinp -label "Open ..." # Save -------------------------------------------------- Save $mb add separator .file.sep2 $mb add command .file.save -label "Save" -command [code $this save] \ -helpstr "Save the current input" $mb add command .file.saveas -label "Save As" \ -command [code $this saveAs] \ -helpstr "Save the current input under the different name" # Close -------------------------------------------------- Close $mb add separator .file.sep3 $mb add command .file.closetab -label "Close Tab" \ -command [code $this _closeCurrentTab] \ -helpstr "Close the current tab" $mb add command .file.closewin -label "Close $appname Window" \ -command [code $this _closeWindow] \ -helpstr "Close the current window" $mb add command .file.exit -label "Exit" -command ::guib::exitApp \ -helpstr "Exit application" # -------------------------------------------------- # create a Toolbar # -------------------------------------------------- set tb [$widget(toplevel) toolbar] $tb configure -helpvariable [scope helpVar] set widget(toolbar) $tb $tb component hull configure -borderwidth 1 $tb component hull configure -relief raised $tb add button filenew -borderwidth 1 -relief flat -image filenew \ -helpstr "Create new input file" \ -balloonstr "Create new input file" \ -command [code $this _toolbarNew] $tb add button fileopen -borderwidth 1 -relief flat -image fileopen \ -helpstr "Open an existing input file" \ -balloonstr "Open an existing input file" \ -command [code $this _toolbarOpen] $tb add button filesave -borderwidth 1 -relief flat -image filesave \ -helpstr "Save the current input" \ -balloonstr "Save the current input" \ -command [code $this save] $tb add button filesaveas -borderwidth 1 -relief flat -image filesaveas \ -helpstr "Save the current input under the different name" \ -balloonstr "Save the current input under the different name" \ -command [code $this saveAs] $tb add button fileclose -borderwidth 1 -relief flat -image fileclose \ -helpstr "Close the current tab" \ -balloonstr "Close the current tab" \ -command [code $this _closeCurrentTab] $tb add button exitApp -borderwidth 1 -relief flat -image exitApp \ -helpstr "Exit application" \ -balloonstr "Exit application" \ -command ::guib::exitApp #set pwscf [$tb add label pwscf -borderwidth 1 -relief flat -image pwscf] #pack configure $pwscf -side right # -------------------------------------------------- # create a container frame # -------------------------------------------------- set widget(container) [$widget(toplevel) childsite] grid configure $widget(container) -padx 0 -pady 0 set widget(logoframe) [frame $widget(container).logoframe -background White] pack $widget(logoframe) -expand 1 -fill both -ipadx 0 -ipady 0 -padx 0 -pady 0 # -------------------------------------------------- # configure help-bar # -------------------------------------------------- $widget(toplevel) component help configure -textvariable [scope helpVar] # -------------------------------------------------- # determine the mainwindow state # -------------------------------------------------- #_mainwindowState trace variable toplevelTitle(prefix) w [code $this _toplevelTitle] trace variable toplevelTitle(postfix) w [code $this _toplevelTitle] trace variable nTabs w [code $this _mainwindowState] #trace variable tabsCounter w [code $this _mainwindowState] trace variable currentTab(index) w [code $this _mainwindowState] } # ------------------------------------------------------------------------ # activate -- # ------------------------------------------------------------------------ itcl::body ::guib::GUI::activate {} { # -------------------------------------------------- # activate main WINDOW # -------------------------------------------------- update idletask $widget(toplevel) activate set w [winfo width $widget(toplevel)] set h [winfo height $widget(toplevel)] if { $w < 200 } { set w 200 } if { $h < 200 } { set h 200 } $widget(toplevel) configure -width $w -height $h _mainwindowState } # ------------------------------------------------------------------------ # addModule -- # USAGE # addModule module path moduleName moduleFile fileTypes # or # addModule separator path # or # addModule cascade path cascadeText # ------------------------------------------------------------------------ itcl::body ::guib::GUI::addModule {mode args} { lappend addModule $mode $args set mb $widget(menubar) # handle the path set path [lindex $args 0] regsub -all {\.} $path {new\.} newPath regsub -all {\.} $path {open\.} openPath #set newPath $path #set openPath $path switch -- $mode { separator { # Usage: addModule separator path $mb add separator .file.newinp.${newPath} $mb add separator .file.openinp.${openPath} return [list .file.newinp.separator$menuSeparatorCount \ .file.openinp.separator$menuSeparatorCount] } cascade { # Usage: addModule cascade path cascadeText set cascadeText [lindex $args 1] $mb add cascade .file.newinp.${newPath}new -label "New $cascadeText" $mb add cascade .file.openinp.${openPath}open -label "Open $cascadeText" return [list .file.newinp.$path .file.openinp.$path] } module { # Usage: addModule module path moduleName moduleFile fileTypes set moduleIdent $path set moduleName [lindex $args 1] set moduleFile [lindex $args 2] set fileTypes [lindex $args 3] set ind $module(INDEX) set _fileTypes { {{Input Files} {*.in *.inp} } {{All Files} * } } #set fileTypes [concat $_fileTypes $fileTypes] set fileTypes [concat $fileTypes $_fileTypes] set module(IDENT,$ind) $path set module(NAME,$ind) $moduleName set module(FILE,$moduleName) $moduleFile set module(FILETYPES,$moduleName) $fileTypes # add entries for "New Input ..."--->.... $mb add command .file.newinp.$newPath \ -label "New $moduleName Input" \ -command [code $this _newInput $moduleIdent $moduleName $moduleFile] \ -helpstr "Create new $moduleName input file" # add entries for "Open Input ..."--->.... $mb add command .file.openinp.$openPath \ -label "Open $moduleName Input" \ -command [code $this _openInput $moduleIdent $moduleName $moduleFile] \ -helpstr "Open an existing $moduleName input file" incr module(INDEX) return [list .file.newinp.$path .file.openinp.$path] } default { ::tclu::ERROR "unknown addModule mode $mode, must be separator, cascade or module" } } } # ------------------------------------------------------------------------ # addHelp -- # USAGE # addHelp help helpName helpEntrymenuText helpFile # or # addHelp separator # or # addHelp cascade ... # ------------------------------------------------------------------------ itcl::body ::guib::GUI::addHelp {mode args} { #puts stderr "::guib::GUI::addHelp $mode $args"; flush stderr lappend addHelp $mode $args set mb $widget(menubar) switch -- $mode { separator { # Usage: addHelp separator ?path? incr menuSeparatorCount if { $args != "" } { set separatorPath $args } else { set separatorPath separator$menuSeparatorCount } $mb add separator .help.$separatorPath return .help.separator$menuSeparatorCount } cascade { # Usage: addModule cascade path cascadeText set cascadePath [lindex $args 0] set cascadeText [lindex $args 1] $mb add cascade .help.$cascadePath -label "$cascadeText" } help { # Usage: addHelp helpName helpEntrymenuText helpFile ?wrap? set helpName [lindex $args 0] set helpEntrymenuText [lindex $args 1] set helpFile [lindex $args 2] set wrap [lindex $args 3] set ind $help(INDEX) set help(NAME,$ind) $helpName set help(ENTRYLABEL,$helpName) $helpEntrymenuText set help(FILE,$helpName) $helpFile $mb add command .help.$helpName -label $helpEntrymenuText \ -command [code $this _help $helpEntrymenuText $helpFile $wrap] \ -helpstr "displays $helpEntrymenuText" incr help(INDEX) } default { ::tclu::ERROR "unknown addHelp mode $mode, must be separator or help" } } } # ------------------------------------------------------------------------ # newGUI -- # ------------------------------------------------------------------------ itcl::body ::guib::GUI::newGUI {} { set obj [::guib::GUI \#auto -title $title -appname $appname] # define all the modules foreach {mode args} $addModule { eval {$obj addModule $mode} $args } #for {set i 0} {$i < $module(INDEX)} {incr i} { # set moduleName $module(NAME,$i) # $obj addModule $module(IDENT,$i) $moduleName $module(FILE,$moduleName) $module(FILETYPES,$moduleName) #} # define all the help foreach {mode args} $addHelp { eval {$obj addHelp $mode} $args } #for {set i 0} {$i < $help(INDEX)} {incr i} { # set helpName $help(NAME,$i) # $obj addHelp $helpName $help(ENTRYLABEL,$helpName) $help(FILE,$helpName) #} $obj extra $extra $obj state $state $obj activate } # ------------------------------------------------------------------------ # page -- # ------------------------------------------------------------------------ itcl::body ::guib::GUI::page {mode args} { switch -exact -- $mode { add { # Usage: page add name # Purpose: add a new page to notebook set name [lindex $args 0] set id $tabsCounter # add new tab/page to notebook __createNotebook set page [$widget(notebook) add -label $name] $widget(notebook) view $name set index [$widget(notebook) index end] set index2tabsCounter($index) $id incr nTabs incr tabsCounter # store some variables set tabName($id) $name set widget(page,$id) $page # create container for the new page set sf [iwidgets::scrolledframe $page.sf -hscrollmode dynamic -vscrollmode dynamic] pack $sf -fill both -expand 1 -ipadx 5 -ipady 5 set can [$sf component canvas] set vsb [$sf component vertsb] set wid [$sf childsite] $can config -background White $wid config -background White global tcl_platform foreach w_ [list $can $vsb $wid] { if { $tcl_platform(platform) == "unix" } { bind $w_ <4> [list $can yview scroll -5 units] bind $w_ <5> [list $can yview scroll +5 units] } else { bind $w_ [list $can yview scroll %D units] } } set widget(canvas,$id) $can set cf [frame $wid.f -relief flat -bd 0 -container 1] pack $cf -fill both -expand 1 _selectedTab bind $page +[code $this _selectedTab] return $cf } delete { # Usage: page delete index # Purpose: deletes a given notebook page set index [lindex $args 0] _closeTab $index } disable { # Usage: page disable index # Purpose: disable index'th page set index [lindex $args 0] set page [$widget(notebook) childsite $index] $widget(notebook) pageconfigure $index -state disabled pack forget $page } enable { # Usage: page disable index # Purpose: disable index'th page set index [lindex $args 0] set page [$widget(notebook) childsite $index] $widget(notebook) pageconfigure $index -state normal pack $page -anchor nw -fill both -expand yes } default { ::tclu::ERROR "wrong mode $mode, must be add, delete, enable, disable or configure" } } #configure { # # BEWARE: this can easily break the integrity of the GUI, # # as the new page-state will not be registered in GUI # # variables ... !!! # set index [lindex $args 0] # set opts [lrange $args 1 end] # eval $widget(notebook) pageconfigure $index $opts #} } # ------------------------------------------------------------------------ # component # ------------------------------------------------------------------------ itcl::body ::guib::GUI::component {name} { # valid names: # menubar # toolbar # ... switch -exact -- $name { toplevel { return $widget(toplevel) } menubar { return $widget(menubar) } toolbar { return $widget(toolbar) } container { return $widget(container) } logoframe { return $widget(logoframe) } default { ::tclu::ERROR "wrong component name $name, should be one of toplevel, menubar, toolbar, container, logoframe" } } } # ------------------------------------------------------------------------ # getSelected -- # ------------------------------------------------------------------------ itcl::body ::guib::GUI::getSelected {what} { set index $currentTab(index) set id $index2tabsCounter($index) switch -glob -- $what { moduleObj { if { [info exists module(OBJ,$id)] } { return $module(OBJ,$id) } else { return "" } } moduleIdent { if { [info exists module(OBJ.moduleIdent,$id)] } { return $module(OBJ.moduleIdent,$id) } else { return "" } } moduleName { if { [info exists module(OBJ.moduleName,$id)] } { return $module(OBJ.moduleName,$id) } else { return "" } } saveFile { return $saveFile($id) } tabIndex { return $currentTab(index) } tabName { return $currentTab(name) } default { ::tclu::ERROR "unknown getSelected mode \"$what\", must be moduleObj, selectedTabIndex or selectedTabName" } } } # ------------------------------------------------------------------------ # extra -- # ------------------------------------------------------------------------ itcl::body ::guib::GUI::extra {code} { append extra "$code\n" eval $code } # ------------------------------------------------------------------------ # state -- # ------------------------------------------------------------------------ itcl::body ::guib::GUI::state {code} { foreach cmdline [split $code \n;] { if { ! [string match \#* [lindex $cmdline 0]] } { if { [llength $cmdline] != 3 && [llength $cmdline] != 0 } { ::tclu::ERROR "syntax error in \"state\" code; usage: type name cmd; $cmdline" } append state "$cmdline\n" } } #append state "$code " #foreach {type name cmd} $code { # lappend state [list $type $name $cmd] #} } itcl::body ::guib::GUI::__manageState {} { set ModuleIdent "" if { $nTabs > 0 } { set index [$widget(notebook) view] set id $index2tabsCounter($index) # t.k.: module(IDENT,$index) wrong if { [info exists module(OBJ.moduleIdent,$id)] } { set ModuleIdent $module(OBJ.moduleIdent,$id) } else { set ModuleIdent "" } } set mb $widget(menubar) set tb $widget(toolbar) foreach {type name cmd} $state { switch -exact -- $type { menubar { $mb menuconfigure $name -state [eval $cmd [list $this $ModuleIdent]] } toolbar { $tb itemconfigure $name -state [eval $cmd [list $this $ModuleIdent]] } default { ::tclu::ERROR "wrong state type $type, must be menubar or toolbar" } } } } # ------------------------------------------------------------------------ # # PROTECTED.PRIVATE METHODS associated with the "STATE" of the MENUS, TABS, ... # # ------------------------------------------------------------------------ itcl::body ::guib::GUI::_mainwindowState {{name1 {}} {name2 {}} {op {}}} { set mb $widget(menubar) set tb $widget(toolbar) if { $nTabs == 0 } { # menubar $mb menuconfigure .file.save -state disabled $mb menuconfigure .file.saveas -state disabled $mb menuconfigure .file.closetab -state disabled # toolbar $tb itemconfigure filesave -state disabled $tb itemconfigure filesaveas -state disabled $tb itemconfigure fileclose -state disabled } elseif { $nTabs > 0 } { $mb menuconfigure .file.closetab -state normal $tb itemconfigure fileclose -state normal set index [$widget(notebook) view] set id $index2tabsCounter($index) if { [info exists module(OBJ,$id)] } { # menubar $mb menuconfigure .file.save -state normal $mb menuconfigure .file.saveas -state normal # toolbar $tb itemconfigure filesave -state normal $tb itemconfigure filesaveas -state normal } else { $mb menuconfigure .file.save -state disabled $mb menuconfigure .file.saveas -state disabled # toolbar $tb itemconfigure filesave -state disabled $tb itemconfigure filesaveas -state disabled } } # handle user-supplied state code __manageState } itcl::body ::guib::GUI::__createNotebook {} { if { ! [info exists widget(notebook)] } { # destroy logo-image (i.e. $widget(logoframe)) destroy $widget(logoframe) # create a tabnotebook set widget(notebook) [iwidgets::tabnotebook $widget(container).tnb \ -tabpos n -auto yes] pack $widget(notebook) -fill both -expand 1 \ -padx 0 -pady 0 -ipadx 0 -ipady 0 } } itcl::body ::guib::GUI::_selectedTab {} { if { $nTabs > 0 } { set tabset [$widget(notebook) component tabset] set currentTab(index) [$widget(notebook) view] set currentTab(name) [$tabset tabcget $currentTab(index) -label] set toplevelTitle(postfix) $currentTab(name) set id $index2tabsCounter($currentTab(index)) if { [info exists widget(canvas,$id)] } { ::tku::mouseWheelScrollCanvas $widget(canvas,$id) } } else { set currentTab(index) -1 set currentTab(name) {} set toplevelTitle(postfix) {} } } itcl::body ::guib::GUI::__setCurrentTabName {name} { # set the name for the selected tab ... set id $index2tabsCounter($currentTab(index)) set currentTab(name) $name set tabName($id) $name set toplevelTitle(postfix) $name set tabset [$widget(notebook) component tabset] $tabset tabconfigure $currentTab(index) -label $name } itcl::body ::guib::GUI::_toplevelTitle {name1 name2 op} { if { $op == "w" && $name1 == "toplevelTitle" } { set prefix {} set postfix {} if { [info exists toplevelTitle(prefix)] } { set prefix $toplevelTitle(prefix) } if { [info exists toplevelTitle(postfix)] } { set postfix $toplevelTitle(postfix) } set title "$prefix \[$postfix\]" $widget(toplevel) configure -title $title } } # ------------------------------------------------------------------------ # # "New Input" METHODS # # ------------------------------------------------------------------------ itcl::body ::guib::GUI::_newInput {moduleIdent moduleName moduleFile} { #return [__newInput $moduleIdent $moduleName $moduleFile] #__newInput:: set id $tabsCounter set name "$moduleName Input (\#.$tabsCounter)" # add new tab/page to notebook __createNotebook set page [$widget(notebook) add -label $name] $widget(notebook) view $name set index [$widget(notebook) index end] set index2tabsCounter($index) $id incr nTabs incr tabsCounter # store some variables set tabName($id) $name set saveFile($id) {} set widget(page,$id) $page # create container widget for the new input set cf [frame $widget(page,$id).f -class Guib -relief flat -bd 0] set sf [iwidgets::scrolledframe $cf.sf -hscrollmode dynamic -vscrollmode dynamic] pack $cf -fill both -expand 1 pack $sf -fill both -expand 1 -ipadx 5 -ipady 5 set can [$sf component canvas] set vsb [$sf component vertsb] set wid [$sf childsite] $can config -background White $wid config -background White global tcl_platform foreach w_ [list $can $vsb $wid] { if { $tcl_platform(platform) == "unix" } { bind $w_ <4> [list $can yview scroll -5 units] bind $w_ <5> [list $can yview scroll +5 units] } else { bind $w_ [list $can yview scroll %D units] } } set widget(canvas,$id) $can # create the embedGUI for the input set pwd [pwd] cd [file dirname $moduleFile] set module(OBJ,$id) [::guib::embedGUI $moduleFile $wid] set module(OBJ.moduleIdent,$id) $moduleIdent set module(OBJ.moduleName,$id) $moduleName _mainwindowState cd $pwd # mark the created page as the current one _selectedTab bind $page +[code $this _selectedTab] return $module(OBJ,$id) } # ------------------------------------------------------------------------ # # "Open Input" METHODS # # ------------------------------------------------------------------------ itcl::body ::guib::GUI::_openInput {moduleIdent moduleName moduleFile} { #return [__openInput $moduleName $moduleFile] #__openInput:: set openTitle "Open $moduleName Input" # filetypes == { {{definition} {extension}} {...} } set defaultExt [string trim [lindex [lindex $module(FILETYPES,$moduleName) 0] 1] *] # revert the fileTypes-order set len [expr {[llength $module(FILETYPES,$moduleName)] - 1}] for {set i $len} {$i >= 0} {incr i -1} { lappend fileTypes [lindex $module(FILETYPES,$moduleName) $i] } set file [tk_getOpenFile -initialdir [pwd] \ -title $openTitle \ -defaultextension $defaultExt \ -filetypes $fileTypes] if { $file == {} } { return -code return } set fileChannel [open $file r] # construct the module set obj [_newInput $moduleIdent $moduleName $moduleFile] # load the file set result [namespace eval ::guib [list $obj readFile $fileChannel]] if { $result == "WRONG_FORMAT" } { # input file is in wrong format, close the corresponding GUI-tab close $fileChannel _closeCurrentTab return "" } close $fileChannel set index [$widget(notebook) index end] set id $index2tabsCounter($index) #set tabName($index) "$moduleName Input (File: [file tail $file])" set tabName($id) "$moduleName: [file tail $file]" set saveFile($id) $file __setCurrentTabName $tabName($id) return $obj } # ------------------------------------------------------------------------ # # "Save" METHODS # # ------------------------------------------------------------------------ itcl::body ::guib::GUI::save {{nocomplain 0}} { set id $index2tabsCounter($currentTab(index)) set moduleObj $module(OBJ,$id) if { $saveFile($currentTab(index)) == "" } { saveAs } else { namespace eval ::guib [list $moduleObj save $saveFile($id) $nocomplain] } } itcl::body ::guib::GUI::saveAs {} { set id $index2tabsCounter($currentTab(index)) set moduleObj $module(OBJ,$id) set fileTypes $module(FILETYPES,$module(OBJ.moduleName,$id)) set result [namespace eval ::guib [list $moduleObj saveAs $fileTypes]] if { $result != "" } { set saveFile($id) $result set ind [string first ":" $currentTab(name) 0] __setCurrentTabName "[string range $currentTab(name) 0 $ind] [file tail $saveFile($id)]" } return $result } # ------------------------------------------------------------------------ # # "Close XXX" METHODS # # ------------------------------------------------------------------------ itcl::body ::guib::GUI::_closeCurrentTab {} { set index $currentTab(index) _closeTab $index } itcl::body ::guib::GUI::_closeTab {index} { set index [$widget(notebook) index $index] if { $index < 0 } { return } set id $index2tabsCounter($index) # reassign the index2tabsCounter($i) with $i > $index set nt1 [expr $nTabs - 1] for {set i $index} {$i < $nt1} {incr i} { set i1 [expr $i + 1] set index2tabsCounter($i) $index2tabsCounter($i1) } if { $nTabs > 1 && $index == $currentTab(index) } { set nextIndex [expr {$index < 1 ? "end" : $index - 1}] $widget(notebook) view $nextIndex } if { [info exists widget(canvas,$id)] } { ::tku::mouseWheelScrollDeleteBindings $widget(canvas,$id) } catch [code $widget(notebook) delete $index] if { [info exists module(OBJ,$id)] } { unset module(OBJ,$id) array unset module OBJ.*,$id } incr nTabs -1 _selectedTab } itcl::body ::guib::GUI::_closeWindow {} { set button [tk_messageBox -message "Really close this window?" \ -type yesno -icon question] if { $button == "yes" } { destroy $widget(toplevel) if { $aliveCounter == 1} { exit } incr aliveCounter -1 rename $this {} } } # ------------------------------------------------------------------------ # # "Help" METHODS # # ------------------------------------------------------------------------ itcl::body ::guib::GUI::_help {helpName helpFile {wrap word}} { set id $tabsCounter # add new tab/page to notebook __createNotebook set name $helpName set page [$widget(notebook) add -label $name] $widget(notebook) view $name set index [$widget(notebook) index end] set index2tabsCounter($index) $id # store some variables incr nTabs incr tabsCounter #set index [$widget(notebook) index end] set tabName($id) $name set widget(page,$id) $page # create widgets set html [iwidgets::scrolledhtml $widget(page,$id).html \ -textbackground White \ -wrap $wrap \ -hscrollmode static -vscrollmode static] pack $html -fill both -expand 1 -ipadx 5 -ipady 5 set pwd [pwd] $html import $helpFile _selectedTab bind $page +[code $this _selectedTab] } # ------------------------------------------------------------------------ # # "Toolbar" METHODS # # ------------------------------------------------------------------------ itcl::body ::guib::GUI::_toolbarNew {} { #option readfile [file join $::env(PWGUI) src-tcl pwscf.theme] startupFile __toolbarNewOpen new "Create new" _newInput } itcl::body ::guib::GUI::_toolbarOpen {} { #option readfile [file join $::env(PWGUI) src-tcl pwscf.theme] startupFile __toolbarNewOpen open "Open an existing" _openInput } itcl::body ::guib::GUI::__toolbarNewOpen {what prefixText cmd} { set t .[namespace tail $this]_toolbar$what if { [winfo exists $t] } { raise $t $widget(toplevel) return } ::guib::widgets::Toplevel $t \ -class "Actiondialog" -title "Action Dialog" for {set i 0} {$i < $module(INDEX)} {incr i} { set moduleName $module(NAME,$i) set moduleIdent $module(IDENT,$i) set tb($i) [button $t.$i \ -text "$prefixText $module(NAME,$i) input file" \ -command [code $this _toolbarCmd $t $cmd $moduleIdent $moduleName $module(FILE,$moduleName)]] $tb($i) config \ -background \#ffffaa \ -activebackground \#ffffff \ -highlightbackground \#000000 pack $tb($i) -side top -expand 1 -fill both -padx 0 -pady 0 } #set x [winfo x $t] #set y [winfo y $t] #set w [winfo reqwidth $t] #set h [winfo reqheight $t] #$t config -geometry ${w}x${h} ::tku::centerWindow $t $widget(toplevel) } itcl::body ::guib::GUI::_toolbarCmd {t cmd moduleIdent moduleName moduleFile} { destroy $t $cmd $moduleIdent $moduleName $moduleFile } # ------------------------------------------------------------------------ # Temporary # ------------------------------------------------------------------------ itcl::body ::guib::GUI::__tmpSelected {} { set id $index2tabsCounter($currentTab(index)) puts stderr "" puts stderr "-------------------------------------------------" puts stderr " Page No. $id is selected (tabindex = $currentTab(index))" puts stderr "-------------------------------------------------" puts stderr " page's name: $currentTab(name)" if { [info exists module(OBJ,$id)] } { puts stderr " module's name: $module(OBJ,$id)" } puts stderr "--" flush stderr } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/optionmenuhelp.itcl0000644000077300007730000001752112341332511023654 0ustar giannozzgiannozz# # $RCSfile: optionmenuhelp.itcl,v $ -- # # This file contains the "optionmenuhelp megawidget implementation. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: optionmenuhelp.itcl,v 1.5 2008-05-08 18:44:36 kokalj Exp $ # option add *Optionmenuhelp.menubackground Gray widgetDefault # ------------------------------------------------------------------------ # USUAL options. # ------------------------------------------------------------------------ itk::usual ::guib::widgets::Optionmenuhelp { keep -activebackground -activeborderwidth -activeforeground \ -background -borderwidth -cursor -disabledforeground -font \ -foreground -highlightcolor -highlightthickness -labelfont \ -popupcursor } # ------------------------------------------------------------------ # OPTIONMENUHELP # ------------------------------------------------------------------ #****f* widgets/optionmenuhelp # NAME # ::guib::widgets::optionmenuhelp -- optionmenuhelp megawidget # USAGE # optionmenuhelp pathName ?option value? ?...? # DESCRIPTION # optionmenuhelp = optionmenu + help-button # OPTIONS # Special OPTIONS # -textvariable # -textvalues # -state # -width # -borderwidth # -highlightthickness # -helpcommand -- command for the help button # -helppadx -- "padx" for the help button # -helppady -- "pady" for the help button # -nohelp -- display help button (true|false) # METHODS # Widget METHODS # (see Optionmenuhelp documentation) # RETURN VALUE # Returns the path of the optionmenuhelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::optionmenuhelp {pathName args} { uplevel ::guib::widgets::Optionmenuhelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Optionmenuhelp # NAME # ::guib::widgets::Optionmenuhelp -- a class for optionmenuhelp megawidget # METHODS # Public METHODS # insert # selected #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Optionmenuhelp { inherit iwidgets::Labeledwidget private variable _textvariable private variable _items constructor {args} {} destructor {} # define methods ... public method insert {index string args} public method selected {} private method _additems {items} protected method _selectitem {item} protected method _traceTextvariable {name1 name2 op} itk_option define -textvariable textvariable TextVariable _textvariable itk_option define -textvalues textvalues Textvalues {} itk_option define -state state State normal itk_option define -width width Width 0 itk_option define -borderwidth borderWidth BorderWidth 2 itk_option define -highlightthickness highlightThickness HighlightThickness 1 itk_option define -nohelp nohelp NoHelp 0 eval $::guib::widgets::def(helpCommand) } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body ::guib::widgets::Optionmenuhelp::constructor {args} { global tcl_platform component hull configure -highlightthickness 0 itk_component add menuBtn { menubutton $itk_interior.menuBtn \ -menu $itk_interior.menuBtn.menu \ -indicatoron 1 \ -relief raised } { usual rename -background -menubackground menuBackground Background } itk_component add popupMenu { menu $itk_interior.menuBtn.menu -tearoff no } { usual rename -background -menubackground menuBackground Background ignore -tearoff } itk_component add help { button $itk_interior.help } { usual eval $::guib::widgets::def(helpOptions) } # # Initialize the widget based on the command line options. # eval itk_initialize $args pack $itk_component(menuBtn) -side left -fill x -expand 1 if { ! $itk_option(-nohelp) } { pack $itk_component(help) -side left \ -padx $itk_option(-helppadx) -pady $itk_option(-helppady) } if { $itk_option(-textvariable) != {} } { upvar $itk_option(-textvariable) textvarValue set _textvariable $textvarValue $itk_component(menuBtn) configure -textvariable $itk_option(-textvariable) } } # ------------------------------------------------------------------ # METHOD: insert index string ?string? # # Insert an item in the popup menu. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Optionmenuhelp::insert {index string args} { set args [linsert $args 0 $string] _additems $args return "" } itcl::body ::guib::widgets::Optionmenuhelp::selected {} { return $_textvariable } itcl::body ::guib::widgets::Optionmenuhelp::_additems {items} { foreach item $items { $itk_component(popupMenu) add command -label $item \ -command [code $this _selectitem $item] } } itcl::body ::guib::widgets::Optionmenuhelp::_selectitem {item} { set $itk_option(-textvariable) $item set _textvariable $item } itcl::body ::guib::widgets::Optionmenuhelp::_traceTextvariable {name1 name2 op} { upvar $itk_option(-textvariable) textVarname #trace vdelete $itk_option(-textvariable) w [code $this _traceTextvariable] set _textvariable $textVarname #trace variable $itk_option(-textvariable) w [code $this _traceTextvariable] } itcl::configbody ::guib::widgets::Optionmenuhelp::nohelp { if { ! [winfo ismapped $itk_interior.menuBtn] } { return } if { $itk_option(-nohelp) } { if { [winfo ismapped $itk_interior.help] } { pack forget $itk_interior.help } } else { if { ! [winfo ismapped $itk_interior.help] } { pack $itk_interior.help -side left -padx $itk_option(-helppadx) -pady $itk_option(-helppady) } } } itcl::configbody ::guib::widgets::Optionmenuhelp::textvariable { trace variable $itk_option(-textvariable) w [code $this _traceTextvariable] } itcl::configbody ::guib::widgets::Optionmenuhelp::textvalues { upvar $itk_option(-textvariable) textvarValue # by this option we delete the previous optionmenu entries # and add new one ... $itk_component(popupMenu) delete 0 end # check if $_textvariable has allowed value #if { [lsearch -exact $itk_option(-textvalues) $textvarValue] < 0 } { # value is not allowed # $this _selectitem "" #} _additems $itk_option(-textvalues) } itcl::configbody ::guib::widgets::Optionmenuhelp::state { switch -exact -- $itk_option(-state) { active - normal { #::tku::enableAll $itk_component(hull) #::tku::enableAll $itk_component(label) ::tku::enableAll $itk_component(menuBtn) ::tku::enableAll $itk_component(popupMenu) } disabled { #::tku::disableAll $itk_component(hull) #::tku::disableAll $itk_component(label) ::tku::disableAll $itk_component(menuBtn) ::tku::disableAll $itk_component(popupMenu) } default { error "wrong value of -state option \"$itk_option(-state)\", should be normal, active, or disabled" } } } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/save.itcl0000644000077300007730000003656712341332511021557 0ustar giannozzgiannozz# # $RCSfile: save.itcl,v $ -- # # This file contains methods connected to saving the input-content. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: save.itcl,v 1.5 2008-11-28 14:42:56 kokalj Exp $ # # ------------------------------------------------------------------------ #****m* moduleObj/saveAs # NAME # ::guib::moduleObj::saveAs -- saves the input-file into a given filename # USAGE # saveAs ?filetypes? # DESCRIPTION # This method quieries for a filename and saves the input-file into it. # ARGUMENTS # filetypes -- specification of filetypes in the save form as for # tk_getOpenFile, tk_getSaveFile # RETURN VALUE # The name of the saved file. # EXAMPLE # $this saveAs { {{Input File} {*.inp}} {{Output File} {.out}} } #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::saveAs {{filetypes {}}} { if { $filetypes == "" } { set filetypes { {{Input File} {.inp} } {{Output File} {.out} } {{All Files} * } } } set defExt [string trim [lindex [lindex [lindex $filetypes 0] 1] 0] *] set sfile [tk_getSaveFile -initialdir [pwd] \ -title "Save Input File" \ -defaultextension $defExt \ -initialfile sample$defExt \ -filetypes $filetypes] if { $sfile == {} } { return {} } save $sfile return $sfile } # ------------------------------------------------------------------------ #****m* moduleObj/save # NAME # ::guib::moduleObj::save -- saves input-content into "file" # USAGE # save file ?nocomplain? # DESCRIPTION # This proc saves input-content into "file". The format of the saved file # is according to the specification of the GUIB module definition file # ARGUMENTS # file -- name of file to save the input # nocomplain -- don't complain about unset variables (0|1) # RETURN VALUE # Returns the name of the "file". # EXAMPLE # $this save myfile #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::save {file {nocomplain 0}} { set OutputContent [_manageSave $nocomplain] ::tclu::writeFile $file $OutputContent w # DEBUG ::tclu::DEBUG $OutputContent #/ return $file } # ------------------------------------------------------------------------ #****m* moduleObj/print # NAME # ::guib::moduleObj::print -- prints input-content to stdout # USAGE # print ?nocomplain? # DESCRIPTION # This proc prints input-content to stdout. The format of the saved file # is according to the specification of the GUIB module definition file # ARGUMENTS # nocomplain -- don't complain about unset variables (0|1) # RETURN VALUE # None. # EXAMPLE # $this print #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::print {{nocomplain 0}} { set OutputContent [_manageSave $nocomplain] puts stdout $OutputContent #return $OutputContent } # ------------------------------------------------------------------------ #****m* moduleObj/getOutput # NAME # ::guib::moduleObj::getOutput -- returns the input-content # USAGE # getOutput # DESCRIPTION # This proc returns the input-content without any complain about # the unset variables. # RETURN VALUE # The input-content. # EXAMPLE # set output [$this getOutput] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::getOutput {} { return [_manageSave 1] } # ------------------------------------------------------------------------ #****im* moduleObj/_manageSave # NAME # ::guib::moduleObj::_manageSave -- wrapper for the _save method # USAGE # _manageSave nocomplain # ARGUMENTS # nocomplain -- don't complain about unset variables (0|1) # RETURN VALUE # None. # EXAMPLE # set outputContent [_manageSave 1] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_manageSave {nocomplain} { _clearOutput _save $this if { $unsetVars != {} && ! $nocomplain } { # reduce the size of unsetVars to 10 lines if { [llength $unsetVars] > 10 } { set unsetVars "[lrange $unsetVars 0 9] ..." } set answer [tk_messageBox -icon warning -title "WARNING" -message "Some variables are not set. List of unset variables: $unsetVars\n\nDou you still want to save a file?" -type yesno] if { $answer == "no" } { return -code return {} } } if { $writeFilter != "" } { set OutputContent [$writeFilter $this [_getOutput]] } else { set OutputContent [_getOutput] } } # ------------------------------------------------------------------------ #****im* moduleObj/_save # NAME # ::guib::moduleObj::_save -- stores the input-content into the "output" variable recursively # USAGE # _save keywordObj # DESCRIPTION # This proc does all the job for "save" method, that is, stores the # output into the "output" variable recursively # RETURN VALUE # None. # EXAMPLE # $this _save $obj #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_save {obj} { if { $saveError == 1 } { # an error has occured; return return } set NItem [$obj getID] for {set id 0} {$id <= $NItem} {incr id} { set key [$obj getKey $id] set childObj [$obj getChild $id] if { $childObj != {} } { #------------------------------------------------------------ # # we have new child object # #------------------------------------------------------------ # object types are: # page, namelist, optional, required, line, group #------------------------------------------------------------ if { [::tclu::lpresent $disabledNameObjList $childObj] } { # object is disabled --> skip-it continue } if { $key == "namelist" } { set namelist 1 set name [$obj getOptionValue $id name] if { ! [::tclu::lpresent $disabledNameObjList $childObj] } { _appendOutput [format " &$name\n"] } } #new: ?? handle \n for line keyword, 1st.part ?? set _line 0 if { $key == "line" } { set _line 1 } #/new _save $childObj #new: ?? handle \n for line keyword, last.part ?? if { $_line == 1 } { set _line 0 if { ! [::tclu::lpresent $disabledNameObjList $childObj] } { _appendOutput "\n" } } #/new } else { #------------------------------------------------------------ # # we have a new key # #------------------------------------------------------------ # input-content keys are: var, dimension, table, keyword #------------------------------------------------------------ # check if the key is disabled ... _isDisabledKey $obj $id [$obj getOptionValue $id ident] set varValueList {} set varNameList {} set fmt {} set makeFmt 0 switch -exact -- [$obj getKey $id] { "keyword" { # # OUTSIDE namelist # set keyword [$obj getOptionValue $id keyword] if { [string match "*\n" $keyword] } { _appendOutput $keyword } else { _appendOutput "$keyword " } } "text" { # # OUTSIDE namelist # set varIdent [$obj getOptionValue $id ident] set widget [getWidgetFromVarident $varIdent] set text [$widget getText] _appendOutput $text\n } "var" { set varName [$obj getOptionValue $id variable] set varIdent [$obj getOptionValue $id ident] set varValue [varvalue $varIdent] set widget [getWidgetFromVarident $varIdent] if { [isNotDisabledWidget $widget] } { set fmt [$obj getOutFmt $id] if { $fmt == "%S" || $varValue == {} } { set fmt "%s " } if { [_findKeywordObjType $obj namelist] == 0 } { # # OUTSIDE NAMELIST # if { $varValue == {} } { #tk_messageBox -icon warning -title "WARNING" -message "Variable \"$varName\" is not set !!!" -type ok lappend unsetVars $varName } else { set string [_validateFmtString $fmt [list $varValue] "could not write a variable. Please check the entry connected with the $varName variable"] if { $saveError == 0 } { _appendOutput $string } } } else { # # INSIDE NAMELIST # if { [_findKeywordObjType $obj required] == 1 \ && $varValue == {} } { # variable is required but missing # TODO: error variable is required !!! #tk_messageBox -icon warning -title "WARNING" -message "Variable \"$varName\" is required namelist variable, but is not set !!!" -type ok lappend unsetVars $varName } if { $varValue != {} } { set string [_validateFmtString "$::guib::settings(NAMELIST.varname_format) = $fmt,\n" \ [list $varName [_quoteValue $varValue]] \ "could not write a variable. Please check the entry connected with the $varName variable"] if { $saveError == 0 } { _appendOutput $string } } } } } "dimension" { # # INSIDE namelist # set fmt [$obj getOutFmt $id] if { $fmt == "%S" } { set fmt "%s" } set dimName [$obj getOptionValue $id variable] set dimIdent [$obj getOptionValue $id ident] set dimWid [getWidgetFromVarident $dimIdent] set start [$dimWid cget -start] set end [$dimWid cget -end] for {set i $start} {$i <= $end} {incr i} { # TODO: a validation against the format-string set varIdent ${dimIdent}($i) set varName ${dimName}($i) set varValue [dimvalue $dimIdent $i] set widget [getWidgetFromVarident $varIdent] if { [isNotDisabledWidget $widget] } { if { [_findKeywordObjType $obj required] == 1 \ && $varValue == {} } { # variable is required but missing #tk_messageBox -icon warning -title "WARNING" -message "Variable \"$varName\" is a required namelist variable, but is not set !!!" -type ok lappend unsetVars $varName } if { $varValue != {} } { set string [_validateFmtString "$::guib::settings(NAMELIST.varname_format) = $fmt,\n" \ [list $varName [_quoteValue $varValue]] \ "could not write a variable. Please check the entry connected with the $varName variable"] if { $saveError == 0 } { _appendOutput $string } } } } } "table" { #---------------------------------------------------------- # INSIDE/OUTSIDE namelist # TODO: make special handlers for dimensions and tables # format set _fmt [$obj getOutFmt $id] if { $_fmt == "%S" } { set makeFmt 1 } set tableName [$obj getOptionValue $id variable] set tableIdent [$obj getOptionValue $id ident] set tableWid [getWidgetFromVarident $tableIdent] set nrow [$tableWid cget -rows] set ncol [$tableWid cget -cols] if { [_findKeywordObjType $obj namelist] == 0 } { if { ![isNotDisabledWidget $tableWid]} { continue } # # OUTSIDE NAMELIST # for {set ir 1} {$ir <= $nrow} {incr ir} { set varValueList {} set varNameList {} set fmt {} for {set ic 1} {$ic <= $ncol} {incr ic} { set varName ${tableName}($ir,$ic) set varValue [tablevalue $tableIdent $ir $ic] if { $varValue == {} } { # check if the column $ic is optional, if not mark the variable as not specified set optind [$obj getOptionValue $id optionalcols] if { ($optind < 0) || ($optind >= 0 && $ic < $optind) } { lappend unsetVars $varName } } # take care of format if { $makeFmt || $varValue == {} } { append fmt "%s " } else { append fmt "[lindex $_fmt [expr $ic - 1]] " } lappend varValueList $varValue lappend varNameList $varName } set string [_validateFmtString $fmt\n $varValueList "could not write a line of output. Please check the entries connected to the following variables: $varNameList"] if { $saveError == 0 } { _appendOutput $string } } } else { # # INSIDE NAMELIST # for {set ir 1} {$ir <= $nrow} {incr ir} { for {set ic 1} {$ic <= $ncol} {incr ic} { set varIdent ${tableName}($ir,$ic) set varName ${tableName}($ir,$ic) set varValue [tablevalue $tableIdent $ir $ic] set widget [getWidgetFromVarident $varIdent] if { [isNotDisabledWidget $widget] } { if { [_findKeywordObjType $obj required] == 1 \ && $varValue == {} } { # variable is required but missing #tk_messageBox -icon warning -title "WARNING" -message "Variable \"$varName\" is a required namelist variable, but is not set !!!" -type ok lappend unsetVars $varName } if { $makeFmt } { set fmt "%s" } else { set fmt [lindex $_fmt [expr $ic - 1]] } if { $varValue != {} } { set string [_validateFmtString "$::guib::settings(NAMELIST.varname_format) = $fmt,\n" \ [list $varName [_quoteValue $varValue]] "could not write a variable. Please check the entry connected with the $varName variable"] if { $saveError == 0 } { _appendOutput $string } } } } } } ; # if-else } default { # do nothing } } ; # switch } ; # if-else } ; # for # # check if we need to close the namelist # # BEWARE: we can have required {...} or optional {...} inside namelist, # and can come here, and the namelist is not yet finished ... # Check that the object-type is namelist !!! if { $namelist == 1 } { if { [$obj cget -type] == "namelist" } { # we are really at the end of namelist set namelist 0 if { ! [::tclu::lpresent $disabledNameObjList $obj] } { _appendOutput [format $::guib::settings(NAMELIST.end_string)\n] } } } } itcl::body ::guib::moduleObj::_quoteValue {value} { # PURPOSE # Quote a namelist-variable's value if the corresponding # variable is of string type and quoting is enabled. To be used # only from ::guib::moduleObj::_save method. uplevel 1 { set dummy {} if { $::guib::settings(NAMELIST.quote_strings) == 1 } { set type [$obj getOptionValue $id validate] if { [regexp string|whatever $type] } { set dummy $::guib::settings(NAMELIST.quote_char) } } } # quote the value if it is not already quoted if { ! [regexp ^\['\"\] $value] } { set value $dummy${value} } if { ! [regexp \['\"\]$ $value] } { set value ${value}$dummy } return ${value} } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/open.itcl0000644000077300007730000005111312341332511021542 0ustar giannozzgiannozz# # $RCSfile: open.itcl,v $ -- # # This file contains the implementation for reading/parsing the # input file according to definition of input syntax as specified in # guib-definition file. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: open.itcl,v 1.6 2008-05-08 18:44:37 kokalj Exp $ # # ------------------------------------------------------------------------ #****m* moduleObj/openFile # NAME # ::guib::moduleObj::openFile -- open an input-file and calls readFile # # USAGE # openFile fileName # # RETURN VALUE # Returns opened filename. # EXAMPLE # $moduleObj openFile myFile.inp #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::openFile {fileName} { if { ! [file exists $fileName] } { ::tclu::errorDialog "file \"$fileName\" does not exists" return } set fileChannel [open $fileName r] readFile $fileChannel $fileName } # ------------------------------------------------------------------------ #****m* moduleObj/readFile # NAME # ::guib::moduleObj::readFile -- reads and input-file # # USAGE # readFile fileChannel ?fileName? # # DESCRIPTION # This method reads the content of file-channel of a given input # file. An example of the usage of the method is in ::guib::menuOpen # proc, i.e., upon the user selection of an input file this method is # called. # # RETURN VALUE # OK -- input file is OK # SYNTAX_ERROR -- input file contains syntax errors # WRONG_FORMAT -- input file is not in appropriate format # # EXAMPLE # $moduleObj readFile $fID myFile.inp #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::readFile {fileChannel {fileName {}}} { variable ::guib::status set readNewLine 1 set readError 0 if { $readFilter != "" } { set fileChannel [$readFilter $this $fileChannel] } if { $readError == 1 } { # a fatal syntax error in input file was detected in # readfilter routine. Skip reading the file. return WRONG_FORMAT } ::tku::watchExec {_open $this $fileChannel} if { [winfo exists $toplevel] } { # a moduleObj has its own toplevel (i.e. ::guib::simpleTplwGUI mechanism) set title [$this cget -title] set postfix "(File: [file tail $fileName]) (No.$::guib::module($title))" set toplevelTitle "$title $postfix" $toplevel configure -title $toplevelTitle } if { $readError } { return SYNTAX_ERROR } return OK } # ------------------------------------------------------------------------ #****m* moduleObj/readFileError # NAME # ::guib::moduleObj::readFileError -- method for dealing with file-read errors # # USAGE # readFileError errMsg # # DESCRIPTION # When an error occurs while reading an input file, this method # should be called to display an error and skip the reading of the # input file. This method is supposed to be used from readfilter routines. # # ARGUMENTS # errMsg -- error message to display when syntax error is encountered #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::readFileError {errMsg} { set readError 1 ::tclu::errorDialog "while reading input file: $errMsg" } # ------------------------------------------------------------------------ #****m* moduleObj/readFileWrongFormat # NAME # ::guib::moduleObj::readFileWrongFormat -- method for dealing with wrong-formatted input file # # USAGE # readFileWrongFormat formatName ?diagnosisText? # DESCRIPTION # When an input-file is not in a proper format, this method should be # called to display an appropriate error-message and skip the reading # of the input file. This method is supposed to be used from # readfilter routines. # # ARGUMENTS # formatName -- name of the format (i.e. an arbitrary string) # diagnosisText -- a text containing a diagnose of the syntax errors [OPTIONAL] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::readFileWrongFormat {formatName {diagnosisText {}}} { set readError 1 set errMsg "selected file is not a ${formatName}-formatted or contains severe syntax errors." if { $diagnosisText != "" } { append errMsg "\n\nDiagnosis:\n$diagnosisText" } tk_messageBox -title ERROR -message "Read ERROR: $errMsg" -type ok -icon error #::tclu::errorDialog $errMsg } # ------------------------------------------------------------------------ #****im* moduleObj/_openSyntaxError # NAME # ::guib::moduleObj::_open -- method for dealing with file-read errors # # USAGE # _openSyntaxError errMsg ?addSkipMsg? # # DESCRIPTION # When an error occurs while reading an input file, this method # should be called to correctly handle the error. When a syntax error # is encountered the reading should be skippe immediately, otherwise # the GUI might trap in an infinite loop!!! # # ARGUMENTS # errMsg -- error message to display when syntax error is encountered # addSkipMsg -- do we add "Skipping the rest of the input file" text #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_openSyntaxError {errMsg {addSkipMsg 1}} { set readError 1 if { $addSkipMsg == 1 } { ::tclu::errorDialog "syntax error in the input file: ${errMsg}\n\nSkipping the rest of the input file !!!" } else { ::tclu::errorDialog $errMsg } } # ------------------------------------------------------------------------ #****im* moduleObj/_open # NAME # ::guib::moduleObj::_open -- reads the content of file-channel of a given input-file recursively # # USAGE # _open keywordObj fileChannel # # DESCRIPTION # This method reads the content of file-channel of a given # input-file recursively. Hence, it makes all the work for readFile # method. # # ARGUMENTS # obj -- the keywordObj object where the read content will be stored # fileChannel -- file-channel of a given input file # RETURN VALUE # None. # # EXAMPLE # _open $keywordObj $fID #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_open {obj fileChannel} { if { $readError == 1 } { # skip reading of the input file immediately ... return } set NItem [$obj getID] for {set id 0} {$id <= $NItem} {incr id} { if { $readError == 1 } { # skip reading of the input file immediately ... return } update; update idletask set key [$obj getKey $id] set childObj [$obj getChild $id] if { $childObj != {} } { #------------------------------------------------------------ # # we have new child object # #------------------------------------------------------------ # object types are: "page", "namelist", "optional", # "required", "line", "group" #------------------------------------------------------------ if { [::tclu::lpresent $disabledNameObjList $childObj] } { # object is disabled --> skip-it continue } if { $key == "namelist" } { # -------------------------------------------------- # INSIDE namelist # -------------------------------------------------- # namelist can have dimensions and tables, and since some # variables might be optional, we do not know the length # of the namelist, therefore read until end-of-namelist is # encountered set name [$obj getOptionValue $id name] set readline [_openGets $fileChannel] ::tclu::DEBUG open: --namelist-- readline: $readline # t.k. #_openCompareStr \ # [string range $readline 1 [string length &$name]] "&$name" _openCompareStr -nocase $readline "&$name" while {1} { set readline [_openGets $fileChannel] # check if we need to close the namelist if { [regexp -nocase -- $::guib::settings(NAMELIST.end_regexp) $readline] } { #set readline [_openGets $fileChannel] break } # There can be sevaral vars on one line. Scan trough # varname = varvalue pairs until the end of line ... while { $readline != {} } { # check for comment-character "!" if { [string match ! [string range [lindex $readline 0] 0 0]] } { # ignore the rest of line. break } set varIdent [_openReadNamelistVar $childObj $fileChannel] set varValue [_openReadNamelistValue] varset $varIdent -value $varValue ::tclu::DEBUG open: --namelist-- var: $varIdent ::tclu::DEBUG open: --namelist-- value: $varValue } } } else { set _line 0 if { $key == "line" } { set _line 1 } #---- _open $childObj $fileChannel #---- if { $_line } { set readNewLine 1 } } } else { #------------------------------------------------------------ # # we have a new key # #------------------------------------------------------------ # input-content keys are: var, dimension, table, keyword #------------------------------------------------------------ # check if the key is disabled ... _isDisabledKey $obj $id [$obj getOptionValue $id ident] #set ident [$obj getOptionValue $id ident] #if { $ident != "" } { # set widget [getWidgetFromVarident $ident] # if { [::tclu::lpresent $disabledWidList $widget] } { # continue # } # # maybe it is a keyword ... # if { [$obj getOptionValue $id keyword] != "" } { # if { [::tclu::lpresent $disabledKeywordidentList $ident] } { # continue # } # } #} if { $readNewLine } { set readline [_openGets $fileChannel] } set varIdentList {} set fmt {} set makeFmt 0 #"dimension" { # #------------------------------------------------------ # #--> INSIDE namelist # #------------------------------------------------------ # # one gets here, since usually one does not specify all # # namelist variables. Hence we should proceed to next # # iteration, but new readline should not be read !!!! # set readNewLine 0 #} # -------------------------------------------------- # If we came here, we are OUTSIDE namelist !!! # -------------------------------------------------- switch -exact -- [$obj getKey $id] { "keyword" { set keyword [$obj getOptionValue $id keyword] # NOTE: check if keyword contain the newline # character; if it does then it is OK as next iteration # new-line will be read. However if it doesn't than # we should scan forward ... # # -->one solution is to use readNewLine variable !!! ::tclu::DEBUG --keyword-- Keyword: \"$keyword\" ::tclu::DEBUG --keyword-- Readline: \"$readline\" _openReadKeyword $keyword if { [string match "*\n" $keyword] } { # read forward the line set readNewLine 1 } else { set readNewLine 0 ::tclu::DEBUG --keyword-- readline=0 ::tclu::DEBUG --keyword-- New.readline: $readline } } "var" { set fmt [$obj getInFmt $id] if { $fmt == {} } { set fmt "%s" ; # ???? } set varIdent [$obj getOptionValue $id ident] set widget [getWidgetFromVarident $varIdent] set varValue "" eval {::tclu::scan $readline $fmt} varValue if { $varValue != "" } { regsub -- $varValue $readline {} readline } #t.k.: check if it is allowed for varValue not # to be set in above line if { [info exists varValue] } { varset $varIdent -value $varValue } set readNewLine 0 } "text" { set varIdent [$obj getOptionValue $id ident] set readVar [$obj getOptionValue $id readvar] set widget [getWidgetFromVarident $varIdent] tclu::DEBUG +++ readvar == $readVar tclu::DEBUG +++ readvar exists: [info exists $readVar] if { [info exists $readVar] } { upvar \#0 $readVar readValue varset $varIdent -textvalue $readValue $widget setText $readValue } set readNewLine 0 } "table" { #------------------------------------------------------ # -->here only OUTSIDE namelist set _fmt [$obj getInFmt $id] if { $_fmt == {} } { set makeFmt 1 } set tableIdent [$obj getOptionValue $id ident] set tableWid [$this getWidgetFromVarident $tableIdent] set nrow [$tableWid cget -rows] set ncol [$tableWid cget -cols] for {set ir 1} {$ir <= $nrow} {incr ir} { set varIdentList {} set fmt {} for {set ic 1} {$ic <= $ncol} {incr ic} { # format set varIdent ${tableIdent}($ir,$ic) if { $makeFmt } { append fmt "%s " } else { append fmt "[lindex $_fmt [expr $ic - 1]] " } lappend varIdentList $varIdent } eval {::tclu::scan $readline $fmt} $varIdentList foreach varident $varIdentList { upvar 0 $varident varvalue if { [info exists varvalue] } { #t.k.: check if it is allowed for varvalue not # to exists varset $varident -value $varvalue } } if {$ir < $nrow} { ::tclu::DEBUG table: readline set readline [_openGets $fileChannel] } set readNewLine 1 } } default { # other keys like packwidgets; do not read a new line ... set readNewLine 0 } } ; # switch } ; # if-else } ; # for # t.k.: Tue Sep 30 15:35:50 CEST 2003--2004below lines were OK for # most cases, but failed when objects where found inside the "line # { ... }" object, i.e., line { group {...}; group {...}} has # failed !!! #--- #if { $line } { # set readNewLine 1 # set line 0 #} #--- #/t.k. } itcl::body ::guib::moduleObj::_openCompareStr {args} { set argc [llength $args] if { $argc == 2 } { set nocase 0 set lineStr [lindex $args 0] set str [lindex $args 1] } elseif { $argc == 3 && [lindex $args 0] == "-nocase" } { set nocase 1 set lineStr [lindex $args 1] set str [lindex $args 2] } else { ::tclu::ERROR "usage: _openCompareStr ?-nocase? lineStr str" } set readStr {} if { [scan $lineStr %s readStr] != 1 } { #-->EOF _openSyntaxError "end of file while reading input" eof return -code return } if { $nocase } { set result [string compare -nocase $readStr $str] } else { set result [string compare $readStr $str] } if { $result != 0 } { #-->READ ERROR _openSyntaxError "NOT-MATCH ERROR" return -code return } } itcl::body ::guib::moduleObj::_openGets {fileChannel} { # check for empty line: read as long as to skip all the empty lines set readNewLine 1 set i [gets $fileChannel _line] # # We might have a string such as: "string what ever" # Replace double-quotes with single quotes # regsub -all -- \" $_line ' line # the regular expresion for empty line is: {^[[:space:]]+$|^$} #while { $i > -1 && [regexp {^[[:space:]]+$|^$} $line] } {} while { $i > -1 && [llength $line] == 0 } { set i [gets $fileChannel _line] regsub -all -- \" $_line ' line } ::tclu::DEBUG --readline-- $line return $line } #body ::guib::moduleObj::_openGets_llength {line} { # # # # We might have a string such as: "string what ever" # # Replace double-quotes with single quotes # # # regsub -all -- \" $line ' _line # return [llength $_line] #} itcl::body ::guib::moduleObj::_openReadNamelistVar {obj fileChannel} { set ind [string first = $readline] if { $ind <= 0 } { _openSyntaxError "syntax error in the namelist" return -code return } scan [lindex [split $readline =] 0] %s result # do we have dimension/table, i.e., var(1) , var(1,2) ??? set varName [lindex [split $result ()] 0] set elem [lindex [split $result ()] 1] if { $elem != "" } { set elem (${elem}) } # # map from varName (or varName(elem)) to varIdent # # assume read variable is a scalar set ident [varnameToVarident $obj $result $::guib::settings(NAMELIST.varname_nocase)] if { $ident != "" } { return $ident } else { # maybe read variable is a dimension/table set ident [varnameToVarident $obj $varName $::guib::settings(NAMELIST.varname_nocase)] if { $ident != "" } { return ${ident}${elem} } } # # if we came here, we have an undefined variable # if { $::guib::settings(NAMELIST.variable_support_undefined) } { if { ! [info exists objWidgetArray(UNDEFINED_VAR,$obj)] } { # make the "Undefined variables" label set objWidgetArray(UNDEFINED_VAR,$obj) 1 _separator $obj {-label "--- The following undefined variables were found ---"} _buildGUI_constructItem [$obj getID] $obj $objWidgetArray(CHILDSITEWIDGET,$obj) separator } _manageKeyword $obj var [_makeIdent $result] \ [list -label "Undefined variable ($result):" -variable $result] _buildGUI_constructItem [$obj getID] $obj $objWidgetArray(CHILDSITEWIDGET,$obj) var return $result } # If we came here, then the variable could not be allocated _openSyntaxError "namelist's variable \"$result\" not allowed." return -code return } itcl::body ::guib::moduleObj::_openReadNamelistValue {} { # trim white-space and tabs characters set readline [string trim $readline "\t "] set index [expr [string first = $readline 0] + 1] set readline [string trim [string range $readline $index end] "\t "] ::tclu::DEBUG --_openReadNamelistValue-- readline: $readline if { [string first ' $readline] == 0 } { ::tclu::DEBUG --_openReadNamelistValue-- YES # # we have a string such as: 'string what ever' or "string what ever" # scan $readline {'%[^']} value # now shrink the readline set index [expr [string first ' $readline 1] + 1] set readline [string trim [string range $readline $index end] "\t ,"] return '${value}' } else { ::tclu::DEBUG --_openReadNamelistValue-- NO # # not a string # set value [string trim [lindex $readline 0] "\t ,"] # now shrink the readline set index [expr [string first $value $readline 0] + [string length $value] + 1] set readline [string trim [string range $readline $index end] "\t ,"] return $value } } itcl::body ::guib::moduleObj::_openReadKeyword {keyword} { set keyword [string trim $keyword \n] if { $::guib::settings(INPUT.nocase) } { set _count [regsub -nocase -- $keyword $readline {} readline] } else { set _count [regsub -- $keyword $readline {} readline] } ::tclu::DEBUG --count $_count $keyword $readline if { $_count == 0 } { set keyword [string trim $keyword "\n"] _openSyntaxError "expecting keyword \"$keyword\", but read \"$readline\" instead." return -code return } } itcl::body ::guib::moduleObj::_isDisabledKey {obj id ident} { set ident [$obj getOptionValue $id ident] if { $ident != "" } { set widget [getWidgetFromVarident $ident] if { [::tclu::lpresent $disabledWidList $widget] } { return -code continue } # maybe it is a keyword ... if { [$obj getOptionValue $id keyword] != "" } { if { [::tclu::lpresent $disabledKeywordidentList $ident] } { return -code continue } } } return "" } #body ::guib::moduleObj::_openReadNamelistValue {} { # # foreach elem [split $readline {=, }] { # # get rid of empty elements # if { $elem != "" } { # lappend List $elem # } # } # # # a namelist variable value can contain { =,} characters, which means # # we have split that. But of this occurs than the value must be bracketed # # in ', and should not be double ' (i.e '') !!! # # # # ...check for this here... # # set Len [llength $List] # if { $Len > 2 } { # # there is more than one variable on the line; shorten the # # readline # set readline {} # for {set i 2} {$i < $Len} {incr i 2} { # append readline "[lindex $List $i] = [lindex $List [expr $i + 1]] " # } # } else { # set readline {} # } # ::tclu::DEBUG --namelist-- readline: $readline # return [string trimright [lindex $List 1] ,] #} espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/simpleGui.itcl0000644000077300007730000001633212341332511022543 0ustar giannozzgiannozz# # $RCSfile: simpleGui.itcl,v $ -- # # This file contains the moduleObj's GUI contrustion methods. There # are two types of different moduleObj's GUIconstruction methods: # # makeSimpleTplwGUI -- # Makes a simple self-contained toplevel GUI (based on moduleObj # definition) with the File menu entry (STAND-ALONE) # # makeEmbedGUI -- # Makes only an embedded GUI (based on moduleObj definition) # into a container window (NOT STAND-ALONE) # # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: simpleGui.itcl,v 1.2 2008-05-08 18:44:36 kokalj Exp $ # # ------------------------------------------------------------------------ #****f* ::guib/simpleTplwGUI # NAME # ::guib::simpleTplwGUI -- loads a module-definition file and constructs simple stand-alone GUI # USAGE # simpleTplwGUI moduleFile # DESCRIPTION # Makes a complete stand-alone Simple-GUI in its own toplevel-window # with a menubar. It works as follows: # # 1. loads a module-definition file (a moduleObj is created) # 2. create a simple toplevel- GUI by calling the moduleObj's # makeSimpleTplwGUI method # RETURN VALUE # Returns the name of moduleObj object. # EXAMPLE # simpleTplwGUI examples/my_gui.tcl #**** # ------------------------------------------------------------------------ proc ::guib::simpleTplwGUI {moduleFile} { set obj [loadModule $moduleFile] $obj makeSimpleTplwGUI #return [code $obj] return $obj } # ------------------------------------------------------------------------ #****f* ::guib/embedGUI # NAME # ::guib::embedGUI -- makes a GUI into the $containerWidget # USAGE # embedGUI moduleFile containerWidget # DESCRIPTION # Makes a non stand-alone GUI in $containerWidget # It works as follows: # # 1. reads a module-definition file (a moduleObj is created) # 2. create an embedded GUI by calling the moduleObj's # makeEmbedGUI method # RETURN VALUE # Returns the name of moduleObj object. # EXAMPLE # embedGUI examples/my_gui.tcl $containerWidget #**** # ------------------------------------------------------------------------ proc ::guib::embedGUI {moduleFile containerWidget {varscope {}}} { set t [winfo toplevel $containerWidget] ::tku::setCursor watch $t set obj [loadModule $moduleFile $varscope] $obj makeEmbedGUI [expr {$containerWidget != "." ? $containerWidget : "" }] ::tku::resetCursor $t #return [code $obj] return $obj } # ------------------------------------------------------------------------ #****f* ::guib/menuOpen # NAME # ::guib::menuOpen -- function used by "Open" file-menu # USAGE # menuOpen moduleFile # DESCRIPTION # This proc is used by the "Open" file-menu of makeSimpleTplwGUI # method to open input files. The proc first queries for the input # filename and then opens it. # RETURN VALUE # Returns the name of moduleObj object or an empty string if WRONG_FORMAT. # EXAMPLE # menuOpen examples/my_gui.tcl #**** # ------------------------------------------------------------------------ proc ::guib::menuOpen {moduleFile} { set filetypes { {{Input File} {*.inp} } {{All Files} * } } set file [tk_getOpenFile -initialdir [pwd] \ -title "Open Input File" \ -defaultextension [string trim [lindex [lindex $filetypes 0] 1] *] \ -filetypes $filetypes] if { $file == {} } { return 0 } set fileChannel [open $file r] set moduleObj [::guib::simpleTplwGUI $moduleFile] if { [$moduleObj readFile $fileChannel $file] == "WRONG_FORMAT" } { # input file is in wrong format, close the corresponding GUI-tab close $fileChannel _closeCurrentTab return "" } close $fileChannel return $moduleObj } # ------------------------------------------------------------------------ #****m* moduleObj/makeSimpleTplwGUI # NAME # ::guib::moduleObj::makeSimpleTplwGUI -- method used by ::guib::simpleTplwGUI proc (actually constructs the GUI) # USAGE # makeSimpleTplwGUI # DESCRIPTION # This method is used by ::guib::simpleTplwGUI proc and actually # constructs the GUI, that is, it creates a main-window with File menu and # GUI based on the moduleFile definition. # RETURN VALUE # None. # EXAMPLE # $obj makeSimpleTplwGUI #**** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::makeSimpleTplwGUI {} { global ::helpVar #set W 700 #set H 600 # # create a Toplevel window # set module [string tolower [namespace tail $this]] set toplevel .$module set title [$this cget -title] set postfix "(No.$::guib::module($title))" set toplevelTitle "$title $postfix" iwidgets::mainwindow $toplevel -title $toplevelTitle # # create a Menubar # set mb [$toplevel menubar] $mb configure -helpvariable ::helpVar -menubuttons { menubutton file -text "File" -menu { options -tearoff false } } $mb add command .file.new -label "New" \ -helpstr "Open new document" \ -command [list ::guib::simpleTplwGUI $_moduleFile] $mb add command .file.open -label "Open" \ -helpstr "Open document" \ -command [list ::guib::menuOpen $_moduleFile] $mb add command .file.save -label "Save" \ -helpstr "Save document" \ -command "[code $this saveAs]" $mb add command .file.close -label "Close" \ -helpstr "Close current document" \ -command "destroy $toplevel; delete object $this" $mb add separator .file.sep1 $mb add command .file.exit -label "Exit" -command {::guib::exitApp} -helpstr "Exit application" # # create a container frame (e.g. scrolledframe) # set cf [frame [$toplevel childsite].cf -class Guib -relief flat -bd 0] pack $cf -expand 1 -fill both -padx 0 -pady 0 -ipadx 0 -ipady 0 set sf [iwidgets::scrolledframe $cf.sf -hscrollmode dynamic -vscrollmode dynamic] pack $sf -fill both -expand 1 -ipadx 5 -ipady 5 set can [$sf component canvas] set wid [$sf childsite] set widBG [option get $wid background *Scrolledframe*Frame*background] set canBG [option get $can background *Scrolledframe*Canvas*background] catch {$wid configure -background $widBG} catch {$can configure -background $canBG} # # configure help-bar # $toplevel component help configure -textvariable ::helpVar # # activate main WINDOW # $toplevel activate # # build the GUI recursively # makeEmbedGUI $wid } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/guib.itcl0000644000077300007730000001071612341332511021533 0ustar giannozzgiannozz# # $RCSfile: guib.itcl,v $ -- # # This file contains the definition of the ::guib namespace ... # For more detailed description see the texts below. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: guib.itcl,v 1.4 2008-05-08 18:44:36 kokalj Exp $ # # ------------------------------------------------------------------------ #****h* GUIB/::guib # NAME # GUIB == Graphical User Interface Builder # # DESCRIPTION # All GUIB implementation (i.e. classes and other fuctions) are # done inside the ::guib namespace. # # GUIB is mented for creating GUIs for management of input files # for ab-initio programs aimed at atomistic simulations, which are # written in FORTAN and their input files follow more or less # particular logic. GUIB fits well to these needs, but probably can # also meet a requirements for other purposes. # # COPYRIGHT # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # AUTHOR # Anton Kokalj # # CREATION DATE # Starting on Fri Dec 29 08:32:59 CET 2001 #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # loads a module definition. # # In the definition file, we have: # # module moduleName -title title -script { ... } # # # THEREFORE: when sourcing the definiton file, the ::guib::module proc # will be called (see below) # ------------------------------------------------------------------------ proc ::guib::loadModule {moduleFile {varscope {}}} { if { [file pathtype $moduleFile] != "absolute" } { set moduleFile [file join [pwd] $moduleFile] } set dir [file dirname $moduleFile] set file [file tail $moduleFile] set pwd [pwd] cd $dir set obj [source $file] cd $pwd $obj setModuleFile $moduleFile # # set the varscope # if { $varscope != "" } { $obj configure -varscope $varscope } return $obj } # ------------------------------------------------------------------------ #****f* ::guib/module # NAME # ::guib::module -- creates a new GUI module # # USAGE # module nameName -title title -script script # # DESCRIPTION # -- GUIB keyword !!! # It is used for creating a GUIs module. # # ARGUMENTS # moduleName - identifier of a module (technically is an object name) # args - the args comprises the "-title title -script script" # where the title is a human-readable module title and the # script is the module definition script. # RETURN VALUE # None. # # EXAMPLE # module myModule -title {This is a Test Module} -script { ...Tcl/GUIB code...} #****** # ------------------------------------------------------------------------ proc ::guib::module {moduleName args} { variable module variable options array set opt [cmdline::getoptions args $::guib::options(module)] ::tclu::incr ::guib::module($opt(title)) #return [code [moduleObj $moduleName -title $opt(title) -script $opt(script) -varscope $opt(varscope)]] set moduleName ::guib::[string trimleft $moduleName] return [moduleObj ${moduleName}\#auto -title $opt(title) -script $opt(script) -varscope $opt(varscope)] } proc ::guib::exitApp {} { set button [tk_messageBox -message "Really quit?" \ -type yesno -icon question] if { $button == "yes" } { # (TODO): save everything ... # delete all temporary files ... ::tclu::tempFile delete all exit } } ##--------------------- ## testing: ##--------------------- #source guibBase.itcl #source guibModule.itcl #---------------------- espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/dialogshell.itcl0000644000077300007730000003217212341332511023074 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # ::guib::widgets::Dialogshell # # Code below is based on ::iwidgets::dialogshell, but modified for # present purposes. # ------------------------------------------------------------------------ # ::wididgets::Dialogshell # ---------------------------------------------------------------------- # This class implements a dialog shell which is a top level widget # composed of a button box, separator, and child site area. The class # also has methods to control button construction. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: dialogshell.itcl,v 1.4 2008-05-08 18:44:37 kokalj Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 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. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Dialogshell { keep -background -cursor -foreground -modality } # ------------------------------------------------------------------ # DIALOGSHELL # ------------------------------------------------------------------ proc ::guib::widgets::dialogshell {pathName args} { uplevel ::guib::widgets::Dialogshell $pathName $args } itcl::class ::guib::widgets::Dialogshell { inherit ::guib::widgets::Toplevel constructor {args} {} itk_option define -thickness thickness Thickness 3 itk_option define -buttonboxpos buttonBoxPos Position s itk_option define -separator separator Separator on itk_option define -padx padX Pad 0 itk_option define -pady padY Pad 0 itk_option define -width width Width "" { if { $itk_option(-width) != "" } { [childsite] configure -width $itk_option(-width) } } itk_option define -height height Height "" { if { $itk_option(-height) != "" } { $itk_interior configure -height $itk_option(-height) } } public method childsite {} public method index {args} public method add {args} public method insert {args} public method delete {args} public method hide {args} public method show {args} public method default {args} public method invoke {args} public method buttonconfigure {args} public method buttoncget {index option} } # # Use option database to override default resources of base classes. # #option add *Dialogshell.master "." widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::constructor {args} { #itk_option remove ::guib::widgets::Shell::padx ::guib::widgets::Shell::pady # # Create the user child site, separator, and button box, # itk_component add -protected dschildsite { frame $itk_interior.dschildsite } itk_component add separator { frame $itk_interior.separator -relief sunken } itk_component add bbox { ::iwidgets::Buttonbox $itk_interior.bbox } { usual rename -padx -buttonboxpadx buttonBoxPadX Pad rename -pady -buttonboxpady buttonBoxPadY Pad } # # Set the itk_interior variable to be the childsite for derived # classes. # set itk_interior $itk_component(dschildsite) # # Set up the default button so that if is pressed in # any widget, it will invoke the default button. # bind $itk_component(hull) [code $this invoke] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -thickness # # Specifies the thickness of the separator. It sets the width and # height of the separator to the thickness value and the borderwidth # to half the thickness. # ------------------------------------------------------------------ itcl::configbody ::guib::widgets::Dialogshell::thickness { $itk_component(separator) config -height $itk_option(-thickness) $itk_component(separator) config -width $itk_option(-thickness) $itk_component(separator) config \ -borderwidth [expr $itk_option(-thickness) / 2] } # ------------------------------------------------------------------ # OPTION: -buttonboxpos # # Specifies the position of the button box relative to the child site. # The separator appears between the child site and button box. # ------------------------------------------------------------------ itcl::configbody ::guib::widgets::Dialogshell::buttonboxpos { set parent [winfo parent $itk_component(bbox)] switch $itk_option(-buttonboxpos) { n { $itk_component(bbox) configure -orient horizontal grid $itk_component(bbox) -row 0 -column 0 -sticky ew grid $itk_component(separator) -row 1 -column 0 -sticky ew grid $itk_component(dschildsite) -row 2 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 0 grid rowconfigure $parent 1 -weight 0 grid rowconfigure $parent 2 -weight 1 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 grid columnconfigure $parent 2 -weight 0 } s { $itk_component(bbox) configure -orient horizontal grid $itk_component(dschildsite) -row 0 -column 0 -sticky nsew grid $itk_component(separator) -row 1 -column 0 -sticky ew grid $itk_component(bbox) -row 2 -column 0 -sticky ew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid rowconfigure $parent 2 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 grid columnconfigure $parent 2 -weight 0 } w { $itk_component(bbox) configure -orient vertical grid $itk_component(bbox) -row 0 -column 0 -sticky ns grid $itk_component(separator) -row 0 -column 1 -sticky ns grid $itk_component(dschildsite) -row 0 -column 2 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid rowconfigure $parent 2 -weight 0 grid columnconfigure $parent 0 -weight 0 grid columnconfigure $parent 1 -weight 0 grid columnconfigure $parent 2 -weight 1 } e { $itk_component(bbox) configure -orient vertical grid $itk_component(dschildsite) -row 0 -column 0 -sticky nsew grid $itk_component(separator) -row 0 -column 1 -sticky ns grid $itk_component(bbox) -row 0 -column 2 -sticky ns grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid rowconfigure $parent 2 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 grid columnconfigure $parent 2 -weight 0 } default { error "bad buttonboxpos option\ \"$itk_option(-buttonboxpos)\": should be n,\ s, e, or w" } } } # ------------------------------------------------------------------ # OPTION: -separator # # Boolean option indicating wheather to display the separator. # ------------------------------------------------------------------ itcl::configbody ::guib::widgets::Dialogshell::separator { if {$itk_option(-separator)} { $itk_component(separator) configure -relief sunken } else { $itk_component(separator) configure -relief flat } } # ------------------------------------------------------------------ # OPTION: -padx # # Specifies a padding distance for the childsite in the X-direction. # ------------------------------------------------------------------ itcl::configbody ::guib::widgets::Dialogshell::padx { grid configure $itk_component(dschildsite) -padx $itk_option(-padx) } # ------------------------------------------------------------------ # OPTION: -pady # # Specifies a padding distance for the childsite in the Y-direction. # ------------------------------------------------------------------ itcl::configbody ::guib::widgets::Dialogshell::pady { grid configure $itk_component(dschildsite) -pady $itk_option(-pady) } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Return the pathname of the user accessible area. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::childsite {} { return $itk_component(dschildsite) } # ------------------------------------------------------------------ # METHOD: index index # # Thin wrapper of Buttonbox's index method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::index {args} { uplevel $itk_component(bbox) index $args } # ------------------------------------------------------------------ # METHOD: add tag ?option value ...? # # Thin wrapper of Buttonbox's add method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::add {args} { uplevel $itk_component(bbox) add $args } # ------------------------------------------------------------------ # METHOD: insert index tag ?option value ...? # # Thin wrapper of Buttonbox's insert method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::insert {args} { uplevel $itk_component(bbox) insert $args } # ------------------------------------------------------------------ # METHOD: delete tag # # Thin wrapper of Buttonbox's delete method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::delete {args} { uplevel $itk_component(bbox) delete $args } # ------------------------------------------------------------------ # METHOD: hide index # # Thin wrapper of Buttonbox's hide method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::hide {args} { uplevel $itk_component(bbox) hide $args } # ------------------------------------------------------------------ # METHOD: show index # # Thin wrapper of Buttonbox's show method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::show {args} { uplevel $itk_component(bbox) show $args } # ------------------------------------------------------------------ # METHOD: default index # # Thin wrapper of Buttonbox's default method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::default {args} { uplevel $itk_component(bbox) default $args } # ------------------------------------------------------------------ # METHOD: invoke ?index? # # Thin wrapper of Buttonbox's invoke method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::invoke {args} { uplevel $itk_component(bbox) invoke $args } # ------------------------------------------------------------------ # METHOD: buttonconfigure index ?option? ?value option value ...? # # Thin wrapper of Buttonbox's buttonconfigure method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::buttonconfigure {args} { uplevel $itk_component(bbox) buttonconfigure $args } # ------------------------------------------------------------------ # METHOD: buttoncget index option # # Thin wrapper of Buttonbox's buttoncget method. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Dialogshell::buttoncget {index option} { uplevel $itk_component(bbox) buttoncget [list $index] \ [list $option] } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/validate.itcl0000644000077300007730000003022412341332511022372 0ustar giannozzgiannozz# # $RCSfile: validate.itcl,v $ -- # # This file contains ... # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: validate.itcl,v 1.5 2008-02-15 16:54:19 kokalj Exp $ # # ------------------------------------------------------------------ # PROCEDURE: validate_functions # # The nonnegint string procedure is meant for mapping the -validate option # value to appropriate validation functions and is used inside guib-widgets. # ------------------------------------------------------------------ # ------------------------------------------------------------------------ #****f* widgets/validate_functions # NAME # ::guib::widgets::validate_functions -- driver routine for validation mechanism connected with entry widget # USAGE # validate_functions # DESCRIPTION # This is the driver routine for the validation widget mechanism # (i.e. -validate option). The following validations are supported: # # whatever -- # string -- # binary -- # int -- # posint -- # nonposint -- # negint -- # nonnegint -- # real -- # posreal -- # nonposreal -- # negreal -- # nonnegreal -- # fortranreal -- # fortranposreal -- # fortrannonposreal -- # fortrannegreal -- # fortrannonnegreal -- #******** # ------------------------------------------------------------------------ proc ::guib::widgets::validate_functions {} { uplevel 1 { switch -glob -- $itk_option(-validate) { whatever { set itk_option(-validate) "::guib::widgets::whatever %P" } string { set itk_option(-validate) "::guib::widgets::whatever %P" } binary { set itk_option(-validate) "::guib::widgets::binary %P" } int* { set itk_option(-validate) "::guib::widgets::int %P" } posint* { set itk_option(-validate) "::guib::widgets::posint %P" } nonposint* { set itk_option(-validate) "::guib::widgets::nonposint %P" } negint* { set itk_option(-validate) "::guib::widgets::negint %P" } nonnegint* { set itk_option(-validate) "::guib::widgets::nonnegint %P" } real { set itk_option(-validate) "::guib::widgets::real %P" } posreal { set itk_option(-validate) "::guib::widgets::posreal %P" } nonposreal { set itk_option(-validate) "::guib::widgets::nonposreal %P" } negreal { set itk_option(-validate) "::guib::widgets::negreal %P" } nonnegreal { set itk_option(-validate) "::guib::widgets::nonnegreal %P" } fortranreal { set itk_option(-validate) "::guib::widgets::fortranreal %P" } fortranposreal { set itk_option(-validate) "::guib::widgets::fortranposreal %P" } fortrannonposreal { set itk_option(-validate) "::guib::widgets::fortrannonposreal %P" } fortrannegreal { set itk_option(-validate) "::guib::widgets::fortrannegreal %P" } fortrannonnegreal { set itk_option(-validate) "::guib::widgets::fortrannonnegreal %P" } } #default { # if { $itk_option(-validate) != "" } { # error "wrong validation option, $itk_option(-validate)" # } #} } } # ------------------------------------------------------------------ # PROCEDURE: whatever string # # The whatever procedure validates character input for a given # Entryfield to be whatever and is always accepted. # ------------------------------------------------------------------ proc ::guib::widgets::whatever {string} { return 1 } # ------------------------------------------------------------------ # PROCEDURE: binary string # # The binary procedure validates character input for a given # Entryfield to be a binary, i.e. 0 or 1, and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::binary {string} { return [regexp {^[01]$} $string] } # ------------------------------------------------------------------ # PROCEDURE: int string # # The integer procedure validates character input for a given # Entryfield to be nteger and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::int {string} { return [regexp {^[+\-]?[0-9]*$} $string] } # ------------------------------------------------------------------ # PROCEDURE: posint string # # The positive-integer procedure validates character input for a given # Entryfield to be positive-integer and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::posint {string} { if { $string == "" } { return 1 } set result [regexp {^[+]?[0-9]*$} $string] if { $result == 1 } { if { $string == "+" } { return 1 } else { return [expr $string > 0] } } else { return $result } } # ------------------------------------------------------------------ # PROCEDURE: nonposint string # # The non-positive-integer procedure validates character input for a given # Entryfield to be non-positive-integer and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::nonposint {string} { set result [regexp {^[-]?[0-9]*$} $string] if { $result == 1 } { return [expr ${string}0 <= 0] } else { return $result } } # ------------------------------------------------------------------ # PROCEDURE: negint string # # The negative-integer procedure validates character input for a given # Entryfield to be negative-integer and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::negint {string} { if { $string == "" } { return 1 } set result [regexp {^-[0-9]*$} $string] if { $result == 1 } { if { $string == "-" } { return 1 } else { return [expr ${string}0 < 0] } } else { return $result } } # ------------------------------------------------------------------ # PROCEDURE: nonnegint string # # The non-negative-integer procedure validates character input for a given # Entryfield to be non-negative-integer and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::nonnegint {string} { return [regexp {^[+]?[0-9]*$} $string] } # ------------------------------------------------------------------ # PROCEDURE: real string # # The real procedure validates character input for a given # Entryfield to be real and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::real {string} { return [regexp {^[+\-]?[0-9]*\.?[0-9]*([0-9]\.?[eE][-+]?[0-9]*)?$} $string] } # ------------------------------------------------------------------ # PROCEDURE: posreal string # # The posreal procedure validates character input for a given Entryfield # to be positive-real and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::posreal {string} { set result [nonnegreal $string] return $result # BEWARE: see fortranposreal !!! #if { $result == 1 } { # return [expr ${string}0 > 0.0] #} else { # return $result #} } # ------------------------------------------------------------------ # PROCEDURE: nonposreal string # # The nonposreal procedure validates character input for a given Entryfield # to be non-positive-real and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::nonposreal {string} { if { $string == "" } { return 1 } set result [regexp {^[-]?[0-9]*\.?[0-9]*([0-9]\.?[eE][-+]?[0-9]*)?$} $string] if { $result == 1 } { if { $string == "-" } { return 1 } else { return [expr ${string} <= 0.0] } } else { return $result } } # ------------------------------------------------------------------ # PROCEDURE: negreal string # # The negreal procedure validates character input for a given Entryfield # to be negative-real and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::negreal {string} { set result [regexp {^-[0-9]*\.?[0-9]*([0-9]\.?[eE][-+]?[0-9]*)?$} $string] return $result # BEWARE: see fortranposreal !!! #if { $result == 1 } { # return [expr ${string}0 < 0.0] #} else { # return $result #} } # ------------------------------------------------------------------ # PROCEDURE: nonnegreal string # # The nonnegreal procedure validates character input for a given Entryfield # to be non-negative-real and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::nonnegreal {string} { return [regexp {^[+]?[0-9]*\.?[0-9]*([0-9]\.?[eE][-+]?[0-9]*)?$} $string] } # ------------------------------------------------------------------ # PROCEDURE: fortranreal string # # The fortran-real procedure validates character input for a given # Entryfield to be real (i.e. allows the numbers of type 1.2d+01) and # returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::fortranreal {string} { return [regexp {^[-+]?[0-9]*\.?[0-9]*([0-9]\.?[eEdD][-+]?[0-9]*)?$} $string] } # ------------------------------------------------------------------ # PROCEDURE: fortranposreal string # # The fortranposreal procedure validates character input for a given # Entryfield to be positive-real (i.e. allows the "d" exponent) and # returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::fortranposreal {string} { set result [fortrannonnegreal $string] return $result #if { $result == 1 } { # regsub -nocase d $string e string # # BEWARE: # # allow the folowing strings: # # + or . or 0 # # +0 or +. or +0.0001 --> must be the same as NONNEG .... # #...if { [regexp {^[+.0]} $string] ... } fix this # return [expr ${string}0 > 0.0] #} else { # return $result #} } # ------------------------------------------------------------------ # PROCEDURE: fortrannonposreal string # # The fortrannonposreal procedure validates character input for a # given Entryfield to be non-positive-real (i.e. allows the "d" # exponent) and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::fortrannonposreal {string} { set result [regexp {^[-]?[0-9]*\.?[0-9]*([0-9]\.?[eEdD][-+]?[0-9]*)?$} $string] if { $result == 1 } { regsub -nocase d $string e string return [expr ${string}0 <= 0.0] } else { return $result } } # ------------------------------------------------------------------ # PROCEDURE: fortrannegreal string # # The fortrannegreal procedure validates character input for a given # Entryfield to be negative-real (i.e. allows the "d" exponent) and # returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::fortrannegreal {string} { set result [regexp {^-[0-9]*\.?[0-9]*([0-9]\.?[eEdD][-+]?[0-9]*)?$} $string] return $result } # ------------------------------------------------------------------ # PROCEDURE: fortrannonnegreal string # # The fortrannonnegreal procedure validates character input for a # given Entryfield to be non-negative-real (i.e. allows the "d" # exponent) and returns the result. # ------------------------------------------------------------------ proc ::guib::widgets::fortrannonnegreal {string} { return [regexp {^[+]?[0-9]*\.?[0-9]*([0-9]\.?[eEdD][-+]?[0-9]*)?$} $string] } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/table.itcl0000644000077300007730000004237312341332511021700 0ustar giannozzgiannozz# $RCSfile: table.itcl,v $ -- # # This file contains the implementation of the "table" widget. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: table.itcl,v 1.6 2008-05-08 18:44:36 kokalj Exp $ # # # NOTE: the documentation of this file yet to be build # #table pathName \ # -caption {caption-text} \ # -head {head list} \ # -cols \# \ # -rows \# \ # -validate {validate list} \ # -variname arrayVariableName \ # -varident arrayVariableIdent \ option add *Table*Message.foreground \#000000 widgetDefault option add *Table*Message.background \#ffffff widgetDefault option add *Table*Message.relief solid widgetDefault option add *Table*Message.borderWidth 1 widgetDefault option add *Table*Message.anchor c widgetDefault option add *Table*Entry.width 10 widgetDefault # ------------------------------------------------------------------------ #****f* keywidgets/table # NAME # ::guib::keywidgets::table -- the "table" keywidget # USAGE # table pathName ?-option value? ?-option value? ?...? # RETURN VALUE # The pathName of the table widget. # SOURCE proc ::guib::keywidgets::table {pathName args} { uplevel ::guib::keywidgets::Table $pathName $args } #******** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****c* keywidgets/Table # NAME # ::guib::keywidgets::Table -- a class for managing keywidget associated with "table" GUIB keyword # METHODS # ...insert... #**** # ------------------------------------------------------------------------ itcl::class ::guib::keywidgets::Table { inherit ::itk::Widget private variable col private variable row private variable nRows 0 private variable nCols 0 private variable head private variable validate #private variable _loadDataVar {} private variable _loadDataCmd {} private variable _loadDataText {} private variable _moduleObj itk_option define -widgets widgets Widgets entry itk_option define -onvalues onvalues Value 1 itk_option define -offvalues offvalues Value 0 itk_option define -caption caption Caption {} itk_option define -head head Head {} itk_option define -rows rows Rows 0 itk_option define -cols cols Cols 0 itk_option define -varname varname Varname _dummyName {} itk_option define -varident varident Varident _dummyVar {} itk_option define -validate validate Command whatever itk_option define -state state State {} constructor {moduleObj args} { set _moduleObj $moduleObj #itk_component add -- topframe { # frame $itk_interior.topframe -bd 0 -highlightthickness 0 #} itk_component add -- caption { # this will be for table caption !!! message $itk_interior.caption } { #usual #eval $::guib::keywidgets::def(tableCaptionOptions) rename -background -captionbackground captionBackground Background } itk_component add -- help { button $itk_interior.help } { keep -width eval $::guib::widgets::def(helpOptions) } itk_component add -- body { frame $itk_interior.body } { keep -background #usual #eval $::guib::keywidgets::def(tableBodyOptions) } eval itk_initialize $args #pack $itk_component(topframe) -side top -fill x -expand 1 #pack $itk_component(caption) -in $itk_component(topframe) -side left -fill x -padx 15 -pady 15 #pack $itk_component(help) -in $itk_component(topframe) -side left -padx $itk_option(-helppadx) -pady $itk_option(-helppady) #pack $itk_component(body) -side top -fill x -padx 3 -pady 2 grid $itk_component(caption) -row 0 -column 0 -columnspan 2 -sticky ew -padx 5 -pady 5 grid $itk_component(help) -row 1 -column 1 -sticky e -padx $itk_option(-helppadx) -pady $itk_option(-helppady) grid $itk_component(body) -row 2 -column 0 -columnspan 2 -sticky ew -padx 3 -pady 2 grid propagate $itk_interior 1 set LoaddataInfo [$_moduleObj loaddataGetInfo $itk_option(-varident)] if { $LoaddataInfo != "" } { #set _loadDataVar [lindex $LoaddataInfo 0] set _loadDataCmd [lindex $LoaddataInfo 1] set _loadDataText [lindex $LoaddataInfo 2] set cmd [lindex $_loadDataCmd 0] if { [info commands $cmd] == "" } { tclu::ERROR "loaddata command $cmd not found" } itk_component add loaddata { button $itk_interior.loaddata -text $_loadDataText \ -command [concat $_loadDataCmd $_moduleObj] } { rename -background -buttonbackground buttonBackground Background } set bg [option get $itk_component(loaddata) background *Table*Button.background] catch {$itk_component(loaddata) config -bg $bg} #pack $itk_component(loaddata) -before $itk_component(body) \ # -side top -padx 15 -pady 2 -ipadx 15 grid $itk_component(loaddata) -row 1 -column 0 -columnspan 1 -sticky ew -padx 15 -pady 2 -ipadx 15 } } eval $::guib::widgets::def(helpCommand) private method _addCol {index} private method _addRow {index} private method _deleteCol {index} private method _deleteRow {index} private method _widget {ir ic} #private method _checkbuttonText {cb var} } # ------------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # OPTION: -caption # # This option is displays the table caption # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Table::caption { if { $itk_option(-caption) != {} } { $itk_component(caption) configure \ -text "$itk_option(-caption)" \ -aspect [expr int(2 * [string length $itk_option(-caption)])] bind $itk_component(caption) { ::guib::widgets::messageAspect %W } } } # ------------------------------------------------------------------------ # OPTION: -head # # This option is used for the creation of table head # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Table::head { if { $itk_option(-head) != {} } { set ind 1 foreach label $itk_option(-head) { if { ! [info exists head($ind)] } { # ind-th head's label does not yet exists set l [label $itk_component(body).0_$ind -text $label -background \#ffffff \ -width [expr [string length $label] + 4]] grid $l -row 0 -column $ind -sticky ewns \ -padx 1 -pady 1 -ipadx 0 -ipady 0 set head($ind) 1 ; # ind-th head's label exists } else { set l [grid slaves $itk_component(body) -row 0 -column $ind] $l configure -text $label } incr ind } } } # ------------------------------------------------------------------------ # OPTION: -cols # # This option is used for specifying the number of tables's columns # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Table::cols { if { $itk_option(-cols) == "" } { return } if { ! [string is integer $itk_option(-cols)] } { return } if { $itk_option(-cols) < 1 } { ::tclu::ERROR "number of columns lower than 1" } if { $itk_option(-cols) > $nCols } { # # create new cols # set nc [expr $nCols + 1] for {set ic $nc} {$ic <= $itk_option(-cols)} {incr ic} { _addCol $ic } } elseif { $itk_option(-cols) < $nCols } { # # delete existing cols # for {set ir $nCols} {$ir > $itk_option(-cols)} {incr ir -1} { _deleteCol $ir } } set nCols $itk_option(-cols) } # ------------------------------------------------------------------------ # OPTION: -rows # # This option is used for specifying the number of tables's rows # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Table::rows { if { $itk_option(-rows) == {} } { # this happens when user deleted the number from the entry return } if { ! [string is integer $itk_option(-rows)] } { return } if { $itk_option(-rows) < 0 } { ::tclu::ERROR "number of rows lower than 0" } if { $itk_option(-rows) > $nRows } { # # create new rows # set nr [expr $nRows + 1] for {set ir $nr} {$ir <= $itk_option(-rows)} {incr ir} { _addRow $ir } } elseif { $itk_option(-rows) < $nRows } { # # delete existing rows # for {set ir $nRows} {$ir > $itk_option(-rows)} {incr ir -1} { _deleteRow $ir } } set nRows $itk_option(-rows) } # ------------------------------------------------------------------------ # OPTION: -validate # # This option is used for specifying the validation of the table's columns # TODO: implement the option # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Table::validate { if { $itk_option(-validate) == {} } { set validate whatever #set ind 1 #foreach item $itk_option(-validate) { # set validate($ind) $item # incr i # #TODO: make something like: # #set validate($ind) "::tclu::validate::numeric %c|%P" #} } } # ------------------------------------------------------------------------ # OPTION: -state # # This option is used for setting the state of the table # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Table::state { if { $itk_option(-state) == "normal" } { ::tku::enableAll $itk_interior } elseif { $itk_option(-state) == "disabled" } { ::tku::disableAll $itk_interior } } # ------------------------------------------------------------------------ # OPTION: -widgets # # This option is used for setting the widgets/per-columns of the table # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Table::widgets { #puts stderr "::guib::keywidgets::Table::widgets called from [info level -1], -widgets = $itk_option(-widgets)" } # ------------------------------------------------------------------------ # OPTION: -onvalues # # This option is used for setting the on-values for the table cell widgets # like checkbutton # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Table::onvalues { } # ------------------------------------------------------------------------ # OPTION: -offvalues # # This option is used for setting the off-value for the table cell widgets # like checkbutton # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Table::offvalues { } # ------------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # METHOD: _addRow (private) # # This private method handles the additon of a row # ------------------------------------------------------------------------ itcl::body ::guib::keywidgets::Table::_addRow {ir} { # # add row's label # if { ! [winfo exists $itk_component(body).${ir}_0] } { set l [label $itk_component(body).${ir}_0 -text $ir -background \#ffffff] grid $l -row $ir -column 0 -sticky ewns -padx 1 -pady 1 -ipadx 0 -ipady 0 } # # add row's columns # for {set ic 1} {$ic <= $nCols} {incr ic} { set e [_widget $ir $ic] grid $e -row $ir -column $ic -sticky ewns \ -padx 0 -pady 0 -ipadx 0 -ipady 0 set col($ic) 1 ; # column $ic exists now } set row($ir) 1 ; # row $ir exists now } # ------------------------------------------------------------------------ # METHOD: _addCol (private) # # This private method handles the additon of a column # ------------------------------------------------------------------------ itcl::body ::guib::keywidgets::Table::_addCol {ic} { # # add column $ic to all rows !!! # #set validate [::tclu::lget $itk_option(-validate) [expr $ic - 1]] #if { $validate == "string" || $validate == "" } { # set validate whatever #} for {set ir 1} {$ir <= $nRows} {incr ir} { set e [_widget $ir $ic] #set e [entry $itk_component(body).${ir}_${ic} \ # -textvariable $itk_option(-varident)($ir,$ic) \ # -validate key \ # -validatecommand "::guib::widgets::$validate %P"] grid $e -row $ir -column $ic -sticky ewns \ -padx 0 -pady 0 -ipadx 0 -ipady 0 } set col($ic) 1 ; # column $ic exists now } # ------------------------------------------------------------------------ # METHOD: _deleteRow (private) # # This private method handles the deletion of a row # ------------------------------------------------------------------------ itcl::body ::guib::keywidgets::Table::_deleteRow {ir} { # # delete row's label # set l [grid slaves $itk_component(body) -row $ir -column 0] #grid remove $l destroy $l # # delete row's columns # for {set ic 1} {$ic <= $nCols} {incr ic} { set e [grid slaves $itk_component(body) -row $ir -column $ic] #grid remove $e destroy $e } unset row($ir) ; # row $ir does not exist } # ------------------------------------------------------------------------ # METHOD: _deleteRow (private) # # This private method handles the deletion of column # ------------------------------------------------------------------------ itcl::body ::guib::keywidgets::Table::_deleteCol {ic} { # # delete column $ic for all rows !!! # for {set ir 0} {$ir <= $nRows} {incr ir} { set e [grid slaves $itk_component(body) -row $ir -column $ic] if { $ir == 0 } { # # This is table's HEAD. # unset head($ic) } # # The HEAD labels might be missing!!! In this case the # $e == {} and grid remove {} would cause an error. # if { $e != {} } { #grid remove $e destroy $e } } unset col($ic) ; # column $ic does not exist } # ------------------------------------------------------------------------ # METHOD: _widget (private) # # This private method handles the table widgets creation # ------------------------------------------------------------------------ itcl::body ::guib::keywidgets::Table::_widget {ir ic} { set ic1 [expr $ic - 1] set widtxtcmd [::tclu::lget $itk_option(-widgets) $ic1] set on [::tclu::lget $itk_option(-onvalues) $ic1] set off [::tclu::lget $itk_option(-offvalues) $ic1] # syntax: widget.buttontext.buttoncommand set wid [lindex $widtxtcmd 0] set txt [lindex $widtxtcmd 1] set cmd [lindex $widtxtcmd 2] set textVar [$_moduleObj tableref $itk_option(-varident) $ir $ic] if { ! [info exists $textVar] } { set $textVar {} } switch -exact -- $wid { entry - entryfileselect { if { $wid == "entryfileselect" } { set wid ::guib::widgets::entryfileselect } set result [$wid $itk_component(body).${ir}_${ic} \ -background seashell \ -textvariable $textVar] # temp ... if { $wid == "entry" } { set validate [::tclu::lget $itk_option(-validate) [expr $ic - 1]] if { $validate == "string" || $validate == "" } { set validate whatever } $itk_component(body).${ir}_${ic} configure -validate key \ -validatecommand "::guib::widgets::$validate %P" } # ... end } entrybutton { if { [llength $widtxtcmd] != 3 } { ::tclu::ERROR "expected \"widget buttontext buttoncommand\" elements, but got: $widtxtcmd\"" } set result [::guib::widgets::entrybutton $itk_component(body).${ir}_${ic} \ -background seashell \ -textvariable $textVar \ -buttontext $txt \ -buttoncommand [list eval $cmd $ir $ic]] } checkbutton { upvar $textVar value set textVar [$_moduleObj tableref $itk_option(-varident) $ir $ic] set cb $itk_component(body).${ir}_${ic} set result [checkbutton $cb \ -variable $textVar \ -textvariable $textVar \ -onvalue $on \ -offvalue $off] # not used anymore: -command [code $this _checkbuttonText $cb $textVar] } optionmenu { if { [llength $widtxtcmd] != 2 } { ::tclu::ERROR "expected \"optionmenuhelp {item1 ...}\" elements, but got: $widtxtcmd\"" } set result [::guib::widgets::optionmenuhelp $itk_component(body).${ir}_${ic} -textvariable $textVar -textvalues $txt -nohelp 1] } default { ::tclu::ERROR "widget type \"$wid\" not supported" } } return $result } #body ::guib::keywidgets::Table::_checkbuttonText {cb var} { # upvar $var varValue # $cb configure -text $varValue #}espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/spininthelp.itcl0000644000077300007730000003457212341332511023150 0ustar giannozzgiannozz# # $RCSfile: spininthelp.itcl,v $ -- # # This file contains contains the spininthelp megawidget. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: spininthelp.itcl,v 1.3 2008-05-08 18:44:36 kokalj Exp $ # # ------------------------------------------------------------------------ # Description: # Below is the modified iwidgets::Spinint code, which is called # ::guib::widgets::Spinint # # Patches: # 1.) If the value of entry is "", then upon increasing/decreasing the value # of zero is implicitly assumed # 3.) the dafault of -warp option is set to false # 2.) Adding new validation functions like (posint, negint, nonposint, ...) # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # iwidgets::Spinint # ---------------------------------------------------------------------- # Implements an integer spinner widget. It inherits basic spinner # functionality from Spinner and adds specific features to create # an integer-only spinner. # Arrows may be placed horizontally or vertically. # User may specify an integer range and step value. # Spinner may be configured to wrap when min or max value is reached. # # NOTE: # Spinint integer values should not exceed the size of a long integer. # For a 32 bit long the integer range is -2147483648 to 2147483647. # # ---------------------------------------------------------------------- # AUTHOR: Sue Yockey Phone: (214) 519-2517 # E-mail: syockey@spd.dsccc.com # yockey@acm.org # # @(#) $Id: spininthelp.itcl,v 1.3 2008-05-08 18:44:36 kokalj Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 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. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # ------------------------------------------------------------------------ # SPININT "usual" options. # ------------------------------------------------------------------------ itk::usual Spinint { keep -background -borderwidth -cursor -foreground -highlightcolor \ -highlightthickness -insertbackground -insertborderwidth \ -insertofftime -insertontime -insertwidth -labelfont \ -selectbackground -selectborderwidth -selectforeground \ -textbackground -textfont -width } # ------------------------------------------------------------------ # SPININT # ------------------------------------------------------------------ #****f* widgets/spinint # NAME # ::guib::widgets::spinint -- spinint megawidget # USAGE # spinint pathName ?option value? ?...? # DESCRIPTION # The spinint is a megawidget with label on the left, entry on # the middle, and up&down spinners on the right # OPTIONS # Special OPTIONS # -range # -step # -wrap # -validate -- the validate command for the spinint widget (must be # binary, nonnegint, posint, nonposint, or negint) # RETURN VALUE # Returns the path of the spinint, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::iwidgets::spinint {pathName args} { uplevel ::guib::widgets::Spinint $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Spinint # NAME # ::guib::widgets::Spinint -- a class for spinint megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Spinint { inherit iwidgets::Spinner constructor {args} { # deafult validation is "numeric" Spinner::constructor -validate numeric } { #usual } itk_option define -range range Range "" itk_option define -step step Step 1 itk_option define -wrap wrap Wrap false itk_option define -validate validate Command {} public method up {} public method down {} } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body ::guib::widgets::Spinint::constructor {args} { eval itk_initialize $args $itk_component(entry) delete 0 end if {[lindex $itk_option(-range) 0] == ""} { $itk_component(entry) insert 0 "0" } else { $itk_component(entry) insert 0 [lindex $itk_option(-range) 0] } } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -validate # # Sets the validation function for spinner. # ------------------------------------------------------------------ itcl::configbody ::guib::widgets::Spinint::validate { # 1. allowed validations are of integer type: binary, numeric, integer, # posint, negint, nonposint, nonnegint switch -glob -- $itk_option(-validate) { {} - *numeric* - *integer* - *posint* - *negint* - *nonposint* - *nonnegint* - *binary* { # validation function is OK } default { error "invalid validation function \"$itk_option(-validate)\", should be one of binary, numeric, integer, posinteger, neginteger, nonposinteger, or nonneginteger" return } } # 2. validation for spinner-arrow mechanism set maxint 2147483647 switch -glob -- $itk_option(-validate) { binary* { set itk_option(-range) "0 1" } nonnegint* { set itk_option(-range) "0 $maxint" } posint* { set itk_option(-range) "1 $maxint" } nonposint* { set itk_option(-range) "-$maxint 0" } negint* { set itk_option(-range) "-$maxint -1" } } # 3. keyboard validation ::guib::widgets::validate_functions } # ------------------------------------------------------------------ # OPTION: -range # # Set min and max values for spinner. # ------------------------------------------------------------------ itcl::configbody ::guib::widgets::Spinint::range { if {$itk_option(-range) != ""} { if {[llength $itk_option(-range)] != 2} { error "wrong # args: should be\ \"$itk_component(hull) configure -range {begin end}\"" } set min [lindex $itk_option(-range) 0] set max [lindex $itk_option(-range) 1] if {![regexp {^-?[0-9]+$} $min]} { error "bad range option \"$min\": begin value must be\ an integer" } if {![regexp {^-?[0-9]+$} $max]} { error "bad range option \"$max\": end value must be\ an integer" } if {$min > $max} { error "bad option starting range \"$min\": must be less\ than ending: \"$max\"" } } } # ------------------------------------------------------------------ # OPTION: -step # # Increment spinner by step value. # ------------------------------------------------------------------ itcl::configbody ::guib::widgets::Spinint::step { } # ------------------------------------------------------------------ # OPTION: -wrap # # Specify whether spinner should wrap value if at min or max. # ------------------------------------------------------------------ itcl::configbody ::guib::widgets::Spinint::wrap { } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: up # # Up arrow button press event. Increment value in entry. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Spinint::up {} { set min_range [lindex $itk_option(-range) 0] set max_range [lindex $itk_option(-range) 1] set val [$itk_component(entry) get] if { $val == "" } { # implicitly assume the value 0 set val 0 # for some validations value 0 is not allowed; check if { $min_range > 0 } { set val $min_range } elseif { $max_range < 0 } { set val $max_range } $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $val return } if {[lindex $itk_option(-range) 0] != ""} { # # Check boundaries. # if {$val >= $min_range && $val < $max_range} { incr val $itk_option(-step) # # Re-check boundaries. # if {$val >= $min_range && $val <= $max_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $val } else { # # This is wrap when -step > 1. # if {$itk_option(-wrap)} { if {$val > $max_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $min_range } else { uplevel #0 $itk_option(-invalid) } } else { uplevel #0 $itk_option(-invalid) } } } else { if {$itk_option(-wrap)} { if {$val == $max_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $min_range } else { uplevel #0 $itk_option(-invalid) } } else { uplevel #0 $itk_option(-invalid) } } } else { # # No boundaries. # incr val $itk_option(-step) $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $val } } # ------------------------------------------------------------------ # METHOD: down # # Down arrow button press event. Decrement value in entry. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Spinint::down {} { ::tclu::DEBUG range: $itk_option(-range) set min_range [lindex $itk_option(-range) 0] set max_range [lindex $itk_option(-range) 1] set val [$itk_component(entry) get] if { $val == "" } { # implicitly assume the value 0 set val 0 } if {[lindex $itk_option(-range) 0] != ""} { # # Check boundaries. # if {$val > $min_range && $val <= $max_range} { incr val -$itk_option(-step) # # Re-check boundaries. # if {$val >= $min_range && $val <= $max_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $val } else { # # This is wrap when -step > 1. # if {$itk_option(-wrap)} { if {$val < $min_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $max_range } else { uplevel #0 $itk_option(-invalid) } } else { uplevel #0 $itk_option(-invalid) } } } else { if {$itk_option(-wrap)} { if {$val == $min_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $max_range } else { uplevel #0 $itk_option(-invalid) } } else { uplevel #0 $itk_option(-invalid) } } } else { # # No boundaries. # incr val -$itk_option(-step) $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $val } } # ------------------------------------------------------------------------ # SPININTHELP # ------------------------------------------------------------------------ #****f* widgets/spininthelp # NAME # ::guib::widgets::spininthelp -- spininthelp megawidget # USAGE # spininthelp pathName ?option value? ?...? # DESCRIPTION # spininthelp = spinint + help-button # OPTIONS # Special OPTIONS # -validate -- the validate command for the spinint widget (must be # binary, nonnegint, posint, nonposint, or negint) # -helpcommand -- command for the help button # -helppadx -- "padx" for the help button # -helppady -- "pady" for the help button # METHODS # Widget METHODS # (see Spininthelp documentation) # RETURN VALUE # Returns the path of the spininthelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::spininthelp {pathName args} { uplevel ::guib::widgets::Spininthelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Spininthelp # NAME # ::guib::widgets::Spininthelp -- a class for spininthelp megawidget # METHODS # Public METHODS # (See the Spinint documentation) #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Spininthelp { inherit ::guib::widgets::Spinint constructor {args} { variable ::guib::widgets::helpOptions itk_component add -- help { button $itk_interior.help } { eval $::guib::widgets::def(helpOptions) } eval itk_initialize $args grid $itk_component(help) -row 0 -rowspan 2 -column 2 \ -padx $itk_option(-helppadx) -pady $itk_option(-helppady) } eval $::guib::widgets::def(helpCommand) } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/store.itcl0000644000077300007730000000540512341332511021740 0ustar giannozzgiannozz# # $RCSfile: store.itcl,v $ -- # # This file contains the storeModuleItems method, which stores all # input-content items from the module file into "public" module_items # array. The usage would be to make it easier to retrieve items from # the module file, such as, for example, automatic checking for # missing or obsolete items in the module files. # # Copyright (c) 2008 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: store.itcl,v 1.1 2008-05-08 18:43:13 kokalj Exp $ # itcl::body ::guib::moduleObj::storeModuleItems {} { if { [info exists module_item] } { unset module_item } if { [info exists module_itemL] } { unset module_itemL } _storeModuleItems $this } itcl::body ::guib::moduleObj::__storeItem {key name ident {insideNamelist 0}} { set lowercase_name [string tolower $name] set module_item($name) $key set module_item(ident,$name) $ident set module_item(insideNamelist,$name) $insideNamelist append module_itemL "$name $lowercase_name " } itcl::body ::guib::moduleObj::_storeModuleItems {obj} { set NItem [$obj getID] for {set id 0} {$id <= $NItem} {incr id} { set key [$obj getKey $id] set childObj [$obj getChild $id] if { $childObj != {} } { # # we have one of new child object: page, namelist, # optional, required, line, group # switch -- $key { namelist { __storeItem $key [$obj getOptionValue $id name] [$obj getOptionValue $id ident] } } _storeModuleItems $childObj } else { # # we have a new key; input-content keys are: var, # dimension, table, keyword # set key [$obj getKey $id] switch -exact -- $key { keyword { set name [string trim [$obj getOptionValue $id keyword]] __storeItem $key $name [$obj getOptionValue $id ident] } var - dimension - table - text { if { $key == "text" } { puts stderr "key = text" } __storeItem $key [$obj getOptionValue $id variable] [$obj getOptionValue $id ident] \ [_findKeywordObjType $obj namelist] } } } } } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/keywordObj.itcl0000644000077300007730000004324012341332511022722 0ustar giannozzgiannozz# # $RCSfile: keywordObj.itcl,v $ -- # # This file contains the implementation of the ::guib::keywordObj # class. The ::guib::keywordObj is the base class for the GUIB # objects. There are several ::guib::keywordObj classes. The highest # super-class derived from super-class is the ::guib::moduleObj # class. Namely, the construction of the GUI is embedded inside the # "module" keyword, for example: # # module #auto -title "Simple GUI -script { # ... # } # # The "module" keyword construct the moduleObj object, which holds the # whole GUI. The "moduleObj" IS-A "keywordObj" class. Inside the # module's script are GUIB keywords, the two main types being # item-keywords (var, dimension, table, keyword, ...) and # object-keywords (page, line, group, namelist, ...). These latest are # derived from keywordObj base-class. Currently, there are # ::guib::keywordObj::nameObj and ::guib::keywordObj::voidObj # derived-classes. The first is used for the object-keyword which have # the "-name" option (page, line, namelist), while the latter is used # for optional and required object-keywords. # # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: keywordObj.itcl,v 1.3 2008-05-08 18:44:36 kokalj Exp $ # # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****c* ::guib/keywordObj # NAME # ::guib::keywordObj -- a base class for the GUIB # # DESCRIPTION # This is a base class for the GUIB. All the GUIB objects (i.e. # moduleObj, nameObj, and voidObj) inherit it. # # The GUIB script is a Tcl script which is encapsulated inside the # "module" keyword and contains GUIB keywords (plus all Tcl # stuff). These keywords are methods of moduleObj class (expect # "module" which is a proc). Some of this keywords create new objects # (page, namelist, optional, required, line, group) and then the # script belonging to such a keyword is executed within that object # scope (i.e. this is how the nesting of the object-keywords is # managed). The keywords belonging to a given keywordObj's object are # sequentially labeled with an ID. Here an example of how the # hierarchy of keywordObj is handled. Consider the following script: # # module \#auto -title "Testing" -script { # page p1 -name "Page No.1" { # line l1st -name "1st line" { # var title -label "Title:" # var code -label "Code:" # } # line l2nd -name "2nd line" { # var description -label "Description:" # } # } # line llast -name "last line" { # var conclusion -label "Conclusion:" # } # } # # The corresponding hierarchy tree is the following: # # moduleObj[module] # | # +--(ID=0)--keywordObj[page] (p1) # | | # | +--ID=0--keywordObj[line] (l1st) # | | | # | | +--ID=0--item[var] (title) # | | +--ID=1--item[var] (code) # | | # | +--ID=1--keywordObj[line] (l2nd) # | | # | +--ID=0--item[var] (description) # | # +--(ID=1)--keywordObj[line] (llast) # | # +--ID=0--item[var] (conclusion) # # # METHODS # getID -- keywords within a keywordObj object are sequentially # labeled (1st item's ID==0), this method returns the # current value of the counter, which equals to the # number of items within a given keywordObj object # incrID -- increases the current counter value and returns its # new value # setKey -- stores the current keyword # setChild -- stores the name of the newly created keywordObj object # setOptions -- merges a default and parsed option values of a keyword # and stores them # getKey -- returns the keyword which has the requested ID # getChild -- returns the child keywordObj object which has the requested ID # getOptions -- returns all the options of the ID-th keyword # (i.e. result has the form of [arrey get arrayName]) # getOptionValue -- return the ID-th option value # getIdFromVarname -- returns the ID of the keyword which contains the # requested variable (i.e. -variable option) # getIdFromVarident -- returns the ID of the keyword which contains the # requested variable's identifier (i.e. -variable option) # getOutFmt -- returns the output-format # getInFmt -- returns the input-format # #****** # ------------------------------------------------------------------------ itcl::class ::guib::keywordObj { public variable parent {} public variable widget {} public variable type {} protected variable cmd protected variable child protected variable itemID -1 method getID {} method incrID {} method setKey {id key {ident ""}} method setChild {id childObj} method setOptions {id opts} method getKey {id} method getChild {id} method getOptions {id {pattern *}} method getOptionValue {id option} method getIdFromVarname {varName} method getIdFromVarident {varIdent} method getOutFmt {id} method getInFmt {id} } # ------------------------------------------------------------------------ #****m* keywordObj/getID # NAME # ::guib::keywordObj::getID -- returns the current counter ID value # USAGE # getID # DESCRIPTION # Keywords within a keywordObj object are sequentially labeled (1st # item's ID==0). This method returns the current value of the counter, # which equals to the number of items within a given keywordObj object. # RETURN VALUE # The current ID number. # EXAMPLE # set id [$obj getID] # SOURCE itcl::body ::guib::keywordObj::getID {} { return $itemID } #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* keywordObj/incrID # NAME # ::guib::keywordObj::incrID -- increases the counter ID's value by +1 # USAGE # incrID # RETURN VALUE # The increased ID number. # EXAMPLE # set id [$obj incrID] # SOURCE itcl::body ::guib::keywordObj::incrID {} { return [incr itemID] } #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* keywordObj/setKey # NAME # ::guib::keywordObj::setKey -- stores the name of the ID-th keyword (item) # USAGE # setKey id key # ARGUMENTS # id -- the ID number # key -- the name of the keyword # RETURN VALUE # The value of argument key. # EXAMPLE # $obj setKey $id line # SOURCE itcl::body ::guib::keywordObj::setKey {id key {ident ""}} { if { $ident != "" } { # I should check if ident already exists !!! set cmd($id,ident) $ident # the default value of cmd($id,variable) is $cmd($id,ident) #set cmd($id,variable) $ident } return [set cmd($id,key) $key] } #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* keywordObj/setChild # NAME # ::guib::keywordObj::setChild -- stores the child keywordObj object name of the ID-th item # USAGE # setChild id childObj # DESCRIPTION # Some of the GUIB keywords creates new keywordObj objects (i.e. child objects). # This method stores the name of the child objects. These objects have # a sequential ID like the rest of the GUIB keywords items. # ARGUMENTS # id -- the ID number # childObj -- the name of the child keywordObj object # RETURN VALUE # The name of the child keywordObj object. # EXAMPLE # $obj setChild $id $childObj # SOURCE itcl::body ::guib::keywordObj::setChild {id childObj} { return [set child($id) $childObj] } #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* keywordObj/setOptions # NAME # ::guib::keywordObj::setOptions -- stores the options of the ID-th keyword # USAGE # setOptions id opts # ARGUMENTS # id -- the ID number # opts -- the list of option-value pairs in the "array get" style # RETURN VALUE # The option-value pairs of the ID-th keyword. # EXAMPLE # $obj setOptions [array get $options] # SOURCE itcl::body ::guib::keywordObj::setOptions {id opts} { foreach {elem value} $opts { # do some checking for the allowed values for various options if { $value != "" } { switch -exact $elem { validate { regsub -all integer $value int vl foreach v $vl { if { ! [string match $v string] && [info procs ::guib::widgets::${v}*] == {} } { if { ! [auto_load ::guib::widgets::$v] } { ::tclu::abort "syntax error in definition file: wrong validation, $vl,\nspecified by -validate option" } } } } widget { set wid [lindex $value 0] if { [info procs ::guib::widgets::${wid}help] == {} } { if { ! [auto_load ::guib::widgets::${wid}help] } { #set allowed [info procs ::guib::widgets::*help] #regsub -all ::guib::widgets:: $allowed {} allowed #regsub -all help $allowed {} allowed ::tclu::abort "syntax error in definition file: wrong widget, $wid,\nspecified by -widget option" } } } } } set cmd($id,$elem) $value } return $opts } #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* keywordObj/getKey # NAME # ::guib::keywordObj::getKey -- returns the name of the ID-th keyword (item) # USAGE # getKey id # RETURN VALUE # The name of the ID-th keyword. # EXAMPLE # set key [$obj getKey $id] # SOURCE itcl::body ::guib::keywordObj::getKey {id} { return [lindex [array get cmd $id,key] 1] } #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* keywordObj/getChild # NAME # ::guib::keywordObj::getChild -- returns the child keywordObj object name of the ID-th keyword # USAGE # getChild id # RETURN VALUE # The name of the child object. # EXAMPLE # set childObj [$obj getChild $id] # SOURCE itcl::body ::guib::keywordObj::getChild {id} { return [lindex [array get child $id] 1] } #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* keywordObj/getOptions # NAME # ::guib::keywordObj::getOptions -- returns the options of the ID-th keyword # USAGE # getOptions id ?pattern? # ARGUMENTS # id -- the ID number # patern -- the glob pattern for the option retrival (default value of pattern is *) # RETURN VALUE # The option-value pairs of the ID-th keyword that match pattern # EXAMPLE # set opts [$obj getOptions var*] # SOURCE itcl::body ::guib::keywordObj::getOptions {id {pattern *}} { return [array get cmd $id,$pattern] } #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* keywordObj/getOptionValue # NAME # ::guib::keywordObj::getOptionValue -- returns the value of a given ID-th keyword option # USAGE # getOptionValue id option # ARGUMENTS # id -- the ID number # option -- the name of the querying option # RETURN VALUE # The value of the querying ID-th keyword option # EXAMPLE # set value [$obj getOptionvalue $id textvalue] # SOURCE itcl::body ::guib::keywordObj::getOptionValue {id option} { return [lindex [array get cmd $id,$option] 1] } #****** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****m* keywordObj/getIdFromVarname # NAME # ::guib::keywordObj::getIdFromVarname -- returns the ID of a keyword which contain the specified variable # USAGE # getIdFromVarname varName # DESCRIPTION # The method returns the ID of a keyword which contain the specified # variable, that is, the value of the keywords -variable option. # RETURN VALUE # Returns the ID of a keyword which contain the specified variable or -1 # if the variable is not found. # EXAMPLE # set id [$obj getIdFromVarname varName] #****** # ------------------------------------------------------------------------ itcl::body ::guib::keywordObj::getIdFromVarname {varName} { for {set id 0} {$id <= $itemID} {incr id} { if { [info exists cmd($id,variable)] } { #if { $varName == $cmd($id,variable) } { # return $id #} if { [::tclu::stringMatch $varName $cmd($id,variable) $::guib::settings(NAMELIST.varname_nocase)]} { return $id } } } return -1 } # ------------------------------------------------------------------------ #****m* keywordObj/getIdFromVarident # NAME # ::guib::keywordObj::getIdFromVarident -- returns the ID of a keyword which contain the specified GUIB's variable identifier # USAGE # getIdFromVarident VarIdent # DESCRIPTION # This method is used to get the ID of the keyword containing the # specified identifier. This is used, for example, by the "help" # keyword where the help associated with some variable's idenifier is # specified. For this purpose an ID (and keywordObj' object pointer) # of the corresponding keyword is needed in order to set the help data # via the "$obj setOptions $id "help $help". # RETURN VALUE # Returns the ID of a keyword which contain the specified identifier or -1 # if the keyword is not found. # EXAMPLE # set id [$obj getIdFromVarident varIdent] #****** # ------------------------------------------------------------------------ itcl::body ::guib::keywordObj::getIdFromVarident {varIdent} { for {set id 0} {$id <= $itemID} {incr id} { if { [info exists cmd($id,ident)] } { if { $varIdent == $cmd($id,ident) } { return $id } } } return -1 } # ------------------------------------------------------------------------ #****m* keywordObj/getOutFmt # NAME # ::guib::keywordObj::getOutFmt # USAGE # getOutFmt id # DESCRIPTION # This method returns the output format. It first queries the # "outfmt" GUIB option, if it is not set then it queries the "fmt" # option. # RETURN VALUE # Returns the output-format string. # EXAMPLE # set outFmt [$obj getOutFmt $id] #******** # ------------------------------------------------------------------------ itcl::body ::guib::keywordObj::getOutFmt {id} { set _fmt [getOptionValue $id outfmt] if { $_fmt == {} } { set _fmt [getOptionValue $id fmt] } if { $_fmt == {} } { # if $_fmt is still {} return %S return %S } else { return $_fmt } } # ------------------------------------------------------------------------ #****m* keywordObj/getInFmt # NAME # ::guib::keywordObj::getInFmt # USAGE # getInFmt id # DESCRIPTION # This method returns the input format. It first queries the # "outfmt" GUIB option, if it is not set then it queries the "fmt" # option. # RETURN VALUE # Returns the input-format string. # EXAMPLE # set inFmt [$obj getInFmt $id] #******** # ------------------------------------------------------------------------ itcl::body ::guib::keywordObj::getInFmt {id} { set _fmt [getOptionValue $id infmt] if { $_fmt == {} } { set _fmt [getOptionValue $id fmt] } #if { $_fmt == {} } { # # if $_fmt is still {} return %S # return %S #} else { # return $_fmt #} return $_fmt } # ------------------------------------------------------------------------ #****c* keywordObj/nameObj # NAME # ::guib::keywordObj::nameObj -- a class for the name GUIB objects (e.g. page, namelist) # PURPOSE # This is the class for the "name" GUIB object. The name object are those, # whose corresponding keywords have -name option (e.g. page, namelist) # IS-A # ::guib::keywordObj # METHODS # None. #******** # ------------------------------------------------------------------------ itcl::class ::guib::keywordObj::nameObj { inherit keywordObj public variable name {} constructor {args} { eval configure $args } } # ------------------------------------------------------------------------ #****c* keywordObj/voidObj # NAME # ::guib::keywordObj::voidObj -- a class for the void GUIB objects (e.g. optional, required) # PURPOSE # This is the class for the "void" GUIB object. The void object are those, # whose corresponding keywords don't have -name option (e.g. page, namelist) # IS-A # ::guib::keywordObj # METHODS # None. #******** # ------------------------------------------------------------------------ itcl::class ::guib::keywordObj::voidObj { inherit keywordObj constructor {args} { eval configure $args } } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/widgets.itcl0000644000077300007730000010445712341332511022261 0ustar giannozzgiannozz# $RCSfile: widgets.itcl,v $ -- # # This file contains mega-widgets designed specially # for the GUIB. The new mega-widgets are build using the # [Incr Tk] and Iwidgets framework. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: widgets.itcl,v 1.5 2008-05-08 18:44:37 kokalj Exp $ # # ------------------------------------------------------------------------ #****h* ::guib/widgets # FUNCTION # The widgets module is used for managing the GUIB widgets. The GUIB # widgets are mega-widgets built by using the [Incr Tk] and Iwidgets framework. # # We have the following GUIB mega-widget: # # ::guib::widgets::toplevel pathName ?option value? ?...? # ::guib::widgets::entrybutton pathName ?option value? ?...? # ::guib::widgets::entryfileselect pathName ?option value? ?...? # ::guib::widgets::entryfileselectquote pathName ?option value? ?...? # ::guib::widgets::entrydirselect pathName ?option value? ?...? # ::guib::widgets::entrydirselectquote pathName ?option value? ?...? # ::guib::widgets::entryhelp pathName ?option value? ?...? # ::guib::widgets::entrybuttonhelp pathName ?option value? ?...? # ::guib::widgets::entryfileselecthelp pathName ?option value? ?...? # ::guib::widgets::entryfileselectquotehelp pathName ?option value? ?...? # ::guib::widgets::entrydirselecthelp pathName ?option value? ?...? # ::guib::widgets::entrydirselectquotehelp pathName ?option value? ?...? # ::guib::widgets::comboboxhelp pathName ?option value? ?...? # ::guib::widgets::optionmenuhelp pathName ?option value? ?...? # ::guib::widgets::radioboxhelp pathName ?option value? ?...? # ::guib::widgets::texthelp pathName ?option value? ?...? # ::guib::widgets::displayhelp varName helpFmt helpText # #**** # ------------------------------------------------------------------------ option add *textBackground seashell widgetDefault option add *helpText Help widgetDefault option add *helpRelief raised widgetDefault option add *helpBorderWidth 1 widgetDefault option add *helpPadX 5 widgetDefault option add *helpPadY 0 widgetDefault #option add *helpState disabled widgetDefault option add *fileselectBackground Gray widgetDefault option add *dirselectBackground Gray widgetDefault option add *buttonBackground Gray widgetDefault option add *Entry*width 5 widgetDefault namespace eval ::guib::widgets { variable def } # ------------------------------------------------------------------------ #****f* widgets/messageAspect # NAME # ::guib::widgets::messageAspec -- configures message-widgets using a "reasonable" width vs. height aspect # USAGE # messageAspect widget # RETURN VALUE # None. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::messageAspect {path} { set aspect [expr int(100 * (0.93 * double([winfo width $path]) / double([winfo height $path])))] $path configure -aspect $aspect } # ------------------------------------------------------------------------ # common options for ****help megawidgets # ------------------------------------------------------------------------ set ::guib::widgets::def(helpOptions) { keep -activebackground -activeforeground -disabledforeground keep -background -cursor -foreground -font keep -highlightcolor -highlightthickness -state rename -text -helptext helpText Text rename -textvariable -helptextvariable helpTextVariable Variable rename -relief -helprelief helpRelief Relief rename -borderwidth -helpborderwidth helpBorderWidth BorderWidth rename -state -helpstate helpState State rename -width -helpwidth helpWidth Width } # ------------------------------------------------------------------------ # common new options (i.e. commands) for **** help widgets # ------------------------------------------------------------------------ set ::guib::widgets::def(helpCommand) { itk_option define -helpcommand helpCommand Command "" { if { $itk_option(-helpcommand) == "" } { set itk_option(-helpstate) disabled $itk_component(help) configure -state disabled } else { set itk_option(-helpstate) normal $itk_component(help) configure -state normal -command $itk_option(-helpcommand) } } itk_option define -helppadx helpPadX Pad 5 {} itk_option define -helppady helpPadY Pad 5 {} } set ::guib::widgets::def(validateCommand) { itk_option define -validate validate Command {} { ::guib::widgets::validate_functions } } # ------------------------------------------------------------------------ # TOPLEVEL (i.e. modified itk::Toplevel widget) # ------------------------------------------------------------------------ #****f* widgets/toplevel # NAME # ::guib::widgets::toplevel -- toplevel widget # USAGE # toplevel pathName ?option value? ?...? # OPTIONS # -title -- title of toplevel # -iconname -- name of icon, i.e, the window manager should display # the name inside the icon associated with toplevel-window # -geometry -- geometry of toplevel in format of "wm geometry", i.e., # widthxheightxy # -transient -- make a transient toplevel (0|1) # -class -- class of the toplevel-window # # RETURN VALUE # Returns the path of a toplevel, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::toplevel {pathName args} { uplevel ::guib::widgets::Toplevel $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Toplevel # NAME # ::guib::widgets::Toplevel -- a class for toplevel widget # PURPOSE # This is a class for toplevel widget. Is is more convinient to use # than generic Tk's toplevel widget, as it has additional options, # such as "-title", "-geometry", ... #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Toplevel { inherit itk::Archetype itk_option define -title title Title "" { if { [winfo exists $itk_hull] } { wm title $itk_hull $itk_option(-title) } } itk_option define -iconname iconName IconName "" { if { [winfo exists $itk_hull] } { wm iconname $itk_hull $itk_option(-iconname) } } itk_option define -geometry geometry Geometry "" { if { [winfo exists $itk_hull] && $itk_option(-geometry) != "" } { wm geometry $itk_hull $itk_option(-geometry) } } itk_option define -transient transient Transient 0 { if { [winfo exists $itk_hull] } { if { $itk_option(-transient) } { wm transient $itk_hull [winfo toplevel [winfo parent $itk_hull]] } else { wm transient $itk_hull } } } itk_option define -class class Class Toplevel {} constructor {args} { eval itk_initialize $args # # Create a toplevel window with the same name as this object # set itk_hull [namespace tail $this] set itk_interior $itk_hull itk_component add hull { toplevel $itk_hull \ -class $itk_option(-class) } { keep -background -cursor -takefocus } wm title $itk_hull $itk_option(-title) wm iconname $itk_hull $itk_option(-iconname) #wm geometry $itk_hull $itk_option(-geometry) if { $itk_option(-transient) } { wm transient $itk_hull [winfo toplevel [winfo parent $itk_hull]] } else { wm transient $itk_hull } bind itk-delete-$itk_hull "itcl::delete object $this" set tags [bindtags $itk_hull] bindtags $itk_hull [linsert $tags 0 itk-delete-$itk_hull] } destructor { if {[winfo exists $itk_hull]} { set tags [bindtags $itk_hull] set i [lsearch $tags itk-delete-$itk_hull] if {$i >= 0} { bindtags $itk_hull [lreplace $tags $i $i] } destroy $itk_hull } } private variable itk_hull "" } #class ::guib::widgets::Toplevel { # inherit ::itk::Toplevel # # constructor {args} { eval itk_initialize $args } # # itk_option define -iconname iconName IconName "" { # #::tclu::DEBUG "Iconname: $itk_option(-iconname)" # wm iconname $itk_interior $itk_option(-iconname) # } # itk_option define -geometry geometry Geometry "" { # wm geometry $itk_interior $itk_option(-geometry) # } # itk_option define -transient transient Transient 0 { # if { $itk_option(-transient) } { # wm transient $itk_interior [winfo toplevel [winfo parent $itk_interior]] # } # } #} # ------------------------------------------------------------------------ # ENTRYBUTTON # ------------------------------------------------------------------------ #****f* widgets/entrybutton # NAME # ::guib::widgets::entrybutton -- entrybutton megawidget # USAGE # entrybutton pathName ?option value? ?...? # DESCRIPTION # The entrybutton is a megawidget with label on the left, entry on # the middle, and command button on the right. # OPTIONS # Special OPTIONS # -buttoncommand -- the command for the "button" widget # -validate -- the validate command for the entry widget (choose # among supported validate_functions) # RETURN VALUE # Returns the path of the entrybutton, i.e., pathName. #******** # ------------------------------------------------------------------------ #usual ::guib::widgets::Entrybutton { # keep -activebackground -activeborderwidth -activeforeground \ # -background -borderwidth -cursor -disabledforeground -font \ # -foreground -highlightcolor -highlightthickness -highlightbackground \ # -labelfont -popupcursor #} proc ::guib::widgets::entrybutton {pathName args} { uplevel ::guib::widgets::Entrybutton $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Entrybutton # NAME # ::guib::widgets::Entrybutton -- a class for entrybutton megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Entrybutton { inherit ::iwidgets::Entryfield constructor {args} { itk_component add -- button { button $itk_interior.button } { usual rename -text -buttontext buttonText Text rename -background -buttonbackground buttonBackground Background rename -highlightbackground -buttonhighlightbackground buttonHighlightbackground Background } eval itk_initialize $args pack $itk_component(button) -side left } itk_option define -buttoncommand buttonCommand Command "" { bind $itk_component(button) \ +[code eval $itk_option(-buttoncommand)] } eval $::guib::widgets::def(validateCommand) } # ------------------------------------------------------------------------ # ENTRYFILESELECT # ------------------------------------------------------------------------ #****f* widgets/entryfileselect # NAME # ::guib::widgets::entryfileselect -- entryfileselect megawidget # USAGE # entryfileselect pathName ?option value? ?...? # DESCRIPTION # The entryfileselect is a megawidget with left aligned label, # entry, and fileselect button. This megawidget is meant for # specifying filenames. # OPTIONS # Special OPTIONS # -quote -- quote the selected filename (0|1); (example: 'myfile') # RETURN VALUE # Returns the path of the entryfileselect, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entryfileselect {pathName args} { uplevel ::guib::widgets::Entryfileselect $pathName $args } # ------------------------------------------------------------------------ #****f* widgets/entryfileselectquote # NAME # ::guib::widgets::entryfileselectquote -- entryfileselectquote megawidget # USAGE # entryfileselectquote pathName ?option value? ?...? # DESCRIPTION # The entryfileselectquote is a entryfileselect-type megawidget, # but the selected filename will be quoted (i.e. -quote 1). # RETURN VALUE # Returns the path of the entryfileselectquote, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entryfileselectquote {pathName args} { append args " -quote 1" uplevel ::guib::widgets::Entryfileselect $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Entryfileselect # NAME # ::guib::widgets::Entryfileselect -- a class for entryfileselect megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Entryfileselect { inherit ::iwidgets::Entryfield private method _fileSelect {} constructor {args} { itk_component add -- fileBtn { button $itk_interior.fileBtn -text "File ..." \ -command [code $this ::guib::widgets::Entryfileselect::_fileSelect] } { usual rename -background -fileselectbackground fileselectBackground Background } #itk_component add -- extfileselect { # iwidgets::extfileselectiondialog [::tku::widgetName] -modality application #} eval itk_initialize $args pack $itk_component(fileBtn) -side left } itk_option define -quote quote Quote 0 {} eval $::guib::widgets::def(validateCommand) } itcl::body ::guib::widgets::Entryfileselect::_fileSelect {} { #$itk_component(extfileselect) activate #set file [$itk_component(extfileselect) get] # using tk_getOpenFile instead set file [tk_getOpenFile -title "Select a File"] if { $file != "" } { switch -- $::guib::settings(FILENAME.only_tail) { 1 - yes - on { set file [file tail $file] } } if { $itk_option(-quote) == 0 } { set $itk_option(-textvariable) $file } else { set $itk_option(-textvariable) '${file}' } } } # ------------------------------------------------------------------------ # ENTRYDIRSELECT # ------------------------------------------------------------------------ #****f* widgets/entrydirselect # NAME # ::guib::widgets::entrydirselect -- entrydirselect megawidget # USAGE # entrydirselect pathName ?option value? ?...? # DESCRIPTION # The entrydirselect is a megawidget with left aligned label, # entry, and dirselect button. This megawidget is meant for specifying # directory names. # OPTIONS # Special OPTIONS # -quote -- quote the selected dirname (0|1); (example: 'mydir') # RETURN VALUE # Returns the path of the entrydirselect, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entrydirselect {pathName args} { uplevel ::guib::widgets::Entrydirselect $pathName $args } # ------------------------------------------------------------------------ #****f* widgets/entrydirselectquote # NAME # ::guib::widgets::entrydirselectquote -- entrydirselectquote megawidget # USAGE # entrydirselectquote pathName ?option value? ?...? # DESCRIPTION # The entrydirselectquote is a entrydirselect-type megawidget, # but the selected dirname will be quoted (i.e. -quote 1). # RETURN VALUE # Returns the path of the entrydirselectquote, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entrydirselectquote {pathName args} { append args " -quote 1" uplevel ::guib::widgets::Entrydirselect $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Entrydirselect # NAME # ::guib::widgets::Entrydirselect -- a class for entrydirselect megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Entrydirselect { inherit ::iwidgets::Entryfield private method _dirselect {} constructor {args} { itk_component add -- fileBtn { button $itk_interior.fileBtn -text "Directory ..." \ -command [code $this ::guib::widgets::Entrydirselect::_dirselect] } { usual rename -background -dirselectbackground dirselectBackground Background } eval itk_initialize $args pack $itk_component(fileBtn) -side left } itk_option define -quote quote Quote 0 {} eval $::guib::widgets::def(validateCommand) } itcl::body ::guib::widgets::Entrydirselect::_dirselect {} { if { $itk_option(-textvariable) != {} } { upvar $itk_option(-textvariable) varValue if { $varValue != "" } { set IniDir $varValue } } # try first with PWD if { ! [info exists IniDir] } { global env set IniDir $env(PWD) } set dir [tk_chooseDirectory -initialdir $IniDir \ -title "Choose directory" -mustexist 0] if { $dir == "" } { return } # do we need to add a trailing slash to dirname ??? switch -- $::guib::settings(DIRNAME.trailing_slash) { 1 - on - yes { set dir [string trimright $dir /]/ } } if { $dir != "" } { if { $itk_option(-quote) == 0 } { set $itk_option(-textvariable) $dir } else { set $itk_option(-textvariable) '${dir}' } } } # ------------------------------------------------------------------------ # ENTRYHELP # ------------------------------------------------------------------------ #****f* widgets/entryhelp # NAME # ::guib::widgets::entryhelp -- entryhelp megawidget # USAGE # entryhelp pathName ?option value? ?...? # DESCRIPTION # The entryhelp is a megawidget with left aligned label, # entry, and help button. # OPTIONS # Special OPTIONS # -helpcommand -- command for the help button # -helppadx -- "padx" for the help button # -helppady -- "pady" for the help button # -validate -- the validate command for the entry widget (choose # among supported validate_functions) # RETURN VALUE # Returns the path of the entryhelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entryhelp {pathName args} { uplevel ::guib::widgets::Entryhelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Entryhelp # NAME # ::guib::widgets::Entryhelp -- a class for entryhelp megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Entryhelp { inherit ::iwidgets::Entryfield constructor {args} { #variable ::guib::widgets::helpOptions itk_component add -- help { button $itk_interior.help } { keep -width eval $::guib::widgets::def(helpOptions) } eval itk_initialize $args pack $itk_component(help) -side left \ -padx $itk_option(-helppadx) -pady $itk_option(-helppady) } eval $::guib::widgets::def(helpCommand) eval $::guib::widgets::def(validateCommand) } # ------------------------------------------------------------------------ # ENTRYBUTTONHELP # ------------------------------------------------------------------------ #****f* widgets/entrybuttonhelp # NAME # ::guib::widgets::entrybuttonhelp -- entrybuttonhelp megawidget # USAGE # entrybuttonhelp pathName ?option value? ?...? # DESCRIPTION # entrybuttonhelp = entrybutton + help-button # OPTIONS # Special OPTIONS # -buttoncommand -- the command for the "button" widget # -helpcommand -- command for the help button # -helppadx -- "padx" for the help button # -helppady -- "pady" for the help button # -validate -- the validate command for the entry widget (choose # among supported validate_functions) # RETURN VALUE # Returns the path of the entrybuttonhelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entrybuttonhelp {pathName args} { uplevel ::guib::widgets::Entrybuttonhelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Entrybuttonhelp # NAME # ::guib::widgets::Entrybuttonhelp -- a class for entrybuttonhelp megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Entrybuttonhelp { inherit ::guib::widgets::Entrybutton constructor {args} { itk_component add -- help { button $itk_interior.help } { eval $::guib::widgets::def(helpOptions) } eval itk_initialize $args pack $itk_component(help) -side left \ -padx $itk_option(-helppadx) -pady $itk_option(-helppady) } eval $::guib::widgets::def(helpCommand) eval $::guib::widgets::def(validateCommand) } # ------------------------------------------------------------------------ # ENTRYFILESELECTHELP # ------------------------------------------------------------------------ #****f* widgets/entryfileselecthelp # NAME # ::guib::widgets::entryfileselecthelp -- entryfileselecthelp megawidget # USAGE # entryfileselecthelp pathName ?option value? ?...? # DESCRIPTION # entryfileselecthelp = entryfileselect + help-button # OPTIONS # Special OPTIONS # -quote -- quote the selected filename (0|1); (example: 'myfile') # -helpcommand -- command for the help button # -helppadx -- "padx" for the help button # -helppady -- "pady" for the help button # RETURN VALUE # Returns the path of the entryfileselecthelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entryfileselecthelp {pathName args} { uplevel ::guib::widgets::Entryfileselecthelp $pathName $args } # ------------------------------------------------------------------------ #****f* widgets/entryfileselectquotehelp # NAME # ::guib::widgets::entryfileselectquotehelp -- entryfileselectquotehelp megawidget # USAGE # entryfileselectquotehelp pathName ?option value? ?...? # DESCRIPTION # The entryfileselectquotehelp is a entryfileselecthelp-type megawidget, # but the selected filename will be quotehelpd (i.e. -quote 1). # RETURN VALUE # Returns the path of the entryfileselectquotehelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entryfileselectquotehelp {pathName args} { append args " -quote 1" uplevel ::guib::widgets::Entryfileselecthelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Entryfileselecthelp # NAME # ::guib::widgets::Entryfileselecthelp -- a class for entryfileselecthelp megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Entryfileselecthelp { inherit ::guib::widgets::Entryfileselect constructor {args} { itk_component add -- help { button $itk_interior.help } { eval $::guib::widgets::def(helpOptions) } eval itk_initialize $args pack $itk_component(help) -side left \ -padx $itk_option(-helppadx) -pady $itk_option(-helppady) } eval $::guib::widgets::def(helpCommand) } # ------------------------------------------------------------------------ # ENTRYDIRSELECTHELP # ------------------------------------------------------------------------ #****f* widgets/entrydirselecthelp # NAME # ::guib::widgets::entrydirselecthelp -- entrydirselecthelp megawidget # USAGE # entrydirselecthelp pathName ?option value? ?...? # DESCRIPTION # entrydirselecthelp = entrydirselect + help-button # OPTIONS # Special OPTIONS # -quote -- quote the selected dirname (0|1); (example: 'mydir') # -helpcommand -- command for the help button # -helppadx -- "padx" for the help button # -helppady -- "pady" for the help button # RETURN VALUE # Returns the path of the entrydirselecthelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entrydirselecthelp {pathName args} { uplevel ::guib::widgets::Entrydirselecthelp $pathName $args } # ------------------------------------------------------------------------ #****f* widgets/entrydirselectquotehelp # NAME # ::guib::widgets::entrydirselectquotehelp -- entrydirselectquotehelp megawidget # USAGE # entrydirselectquotehelp pathName ?option value? ?...? # DESCRIPTION # The entrydirselectquotehelp is a entrydirselecthelp-type megawidget, # but the selected dirname will be quotehelpd (i.e. -quote 1). # RETURN VALUE # Returns the path of the entrydirselectquotehelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::entrydirselectquotehelp {pathName args} { append args " -quote 1" uplevel ::guib::widgets::Entrydirselecthelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Entrydirselecthelp # NAME # ::guib::widgets::Entrydirselecthelp -- a class for entrydirselecthelp megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Entrydirselecthelp { inherit ::guib::widgets::Entrydirselect constructor {args} { itk_component add -- help { button $itk_interior.help } { eval $::guib::widgets::def(helpOptions) } eval itk_initialize $args pack $itk_component(help) -side left \ -padx $itk_option(-helppadx) -pady $itk_option(-helppady) } eval $::guib::widgets::def(helpCommand) } # ------------------------------------------------------------------------ # COMBOBOXHELP # ------------------------------------------------------------------------ #****f* widgets/comboboxhelp # NAME # ::guib::widgets::comboboxhelp -- comboboxhelp megawidget # USAGE # comboboxhelp pathName ?option value? ?...? # DESCRIPTION # comboboxhelp = combobox + help-button # OPTIONS # Special OPTIONS # -helpcommand -- command for the help button # -helppadx -- "padx" for the help button # -helppady -- "pady" for the help button # METHODS # Widget METHODS # (see [Incr Tcl]'s Combobox documentation) # RETURN VALUE # Returns the path of the comboboxhelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::comboboxhelp {pathName args} { uplevel ::guib::widgets::Comboboxhelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Comboboxhelp # NAME # ::guib::widgets::Comboboxhelp -- a class for comboboxhelp megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Comboboxhelp { inherit ::iwidgets::Combobox constructor {args} { itk_component add -- help { button $itk_interior.help } { eval $::guib::widgets::def(helpOptions) } eval itk_initialize $args grid $itk_component(help) -row 0 -rowspan 2 -column 2 \ -padx $itk_option(-helppadx) -pady $itk_option(-helppady) } itk_option define -textvalues textvalues TextValues {} eval $::guib::widgets::def(helpCommand) } itcl::configbody ::guib::widgets::Comboboxhelp::textvalues { if { $itk_option(-textvalues) != "" } { #$this delete list 0 end eval {$this insert list end} $itk_option(-textvalues) } } # ------------------------------------------------------------------------ # TEXTHELP # ------------------------------------------------------------------------ #****f* widgets/texthelp # NAME # ::guib::widgets::texthelp -- texthelp megawidget # USAGE # texthelp pathName ?option value? ?...? # DESCRIPTION # The texthelp is a megawidget with left aligned label, # text, and help button. # OPTIONS # Special OPTIONS # -helpcommand -- command for the help button # -helppadx -- "padx" for the help button # -helppady -- "pady" for the help button # RETURN VALUE # Returns the path of the texthelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::texthelp {pathName args} { uplevel ::guib::widgets::Texthelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Texthelp # NAME # ::guib::widgets::Texthelp -- a class for texthelp megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Texthelp { inherit ::iwidgets::Scrolledtext public { method delete {start end} method get {index text} method insert {index text} } #protected { # #variable _textvariable # # #method _keyPress {} #} #itk_option define -textvariable textvariable TextVariable _textvariable constructor {args} { #variable ::guib::widgets::helpOptions itk_component add -- help { button $itk_interior.help } { keep -width eval $::guib::widgets::def(helpOptions) } #bind $itk_component(text) +[code $this _keyPress] eval itk_initialize $args grid $itk_component(help) -row 0 -column 3 \ -padx $itk_option(-helppadx) -pady $itk_option(-helppady) #if { $itk_option(-textvariable) != {} } { # upvar $itk_option(-textvariable) textvarValue # $itk_component(text) insert 1.0 $textvarValue #} } eval $::guib::widgets::def(helpCommand) } itcl::body ::guib::widgets::Texthelp::delete {start end} { $itk_component(text) delete $start $end #set $itk_option(-textvariable) [$itk_component(text) get 1.0 end] } itcl::body ::guib::widgets::Texthelp::get {start end} { set result [$itk_component(text) get 1.0 end] #set $itk_option(-textvariable) $result return $result } itcl::body ::guib::widgets::Texthelp::insert {index text} { $itk_component(text) insert 1.0 $text #set $itk_option(-textvariable) [$itk_component(text) get 1.0 end] } #body ::guib::widgets::Texthelp::_keyPress {} { # set $itk_option(-textvariable) [$itk_component(text) get 1.0 end] #} option add *Scalehelp*Scale.orient horizontal widgetDefault option add *Scalehelp*Scale.length 20m widgetDefault option add *Scalehelp*Scale.sliderLength 4m widgetDefault option add *Scalehelp*Scale.from 0 widgetDefault option add *Scalehelp*Scale.to 10 widgetDefault option add *Scalehelp*Scale.resolution 1 widgetDefault #option add *Scalehelp*Scale.width 5 widgetDefault option add *Scalehelp*Scale.tickInterval 5 widgetDefault itk::usual ::guib::widgets::Scalehelp { keep -orient -length -sliderlength -from -to -resolution -width -tickinterval -borderwidth } # ------------------------------------------------------------------------ # SCALEHELP # ------------------------------------------------------------------------ #****f* widgets/scalehelp # NAME # ::guib::widgets::scalehelp -- scalehelp megawidget # USAGE # scalehelp pathName ?option value? ?...? # DESCRIPTION # scalehelp = scale + help-button # OPTIONS # Special OPTIONS: # -scalebd -- border-width for the scale # The following scale's options are supported: # -orient -- orientation of scale # -length -- length of scale widget # -sliderlength # -from # -to # -resolution # -tickinterval # METHODS # Widget METHODS # (see [Incr Tcl]'s Scale documentation) # RETURN VALUE # Returns the path of the scalehelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::scalehelp {pathName args} { uplevel ::guib::widgets::Scalehelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Scalehelp # NAME # ::guib::widgets::Scalehelp -- a class for scalehelp megawidget #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Scalehelp { inherit ::iwidgets::Labeledwidget itk_option define -textvariable textVariable Variable "" itk_option define -orient orient Orient horizontal scaleConfig_ itk_option define -sliderlength sliderLength SliderLength 4m scaleConfig_ itk_option define -from from From 0 scaleConfig_ itk_option define -to to To 10 scaleConfig_ itk_option define -resolution resolution Resolution 1 scaleConfig_ itk_option define -tickinterval tickInterval TickInterval 5 scaleConfig_ protected method scaleConfig_ {} constructor {args} { itk_component add -- scale { scale $itk_interior.scale } { usual rename -width -scalewidth scaleWidth Width rename -borderwidth -scalebd scaleBorderWidth BorderWidth } itk_component add -- help { button $itk_interior.help } { eval $::guib::widgets::def(helpOptions) } eval itk_initialize $args pack $itk_component(scale) -side left -fill x pack $itk_component(help) -side left -padx $itk_option(-helppadx) -pady $itk_option(-helppady) } eval $::guib::widgets::def(helpCommand) } itcl::configbody ::guib::widgets::Scalehelp::textvariable { if { $itk_option(-textvariable) != "" } { $itk_interior.scale configure -variable $itk_option(-textvariable) } } itcl::body ::guib::widgets::Scalehelp::scaleConfig_ {} { $itk_interior.scale configure \ -orient $itk_option(-orient) \ -sliderlength $itk_option(-sliderlength) \ -from $itk_option(-from) \ -to $itk_option(-to) \ -resolution $itk_option(-resolution) \ -tickinterval $itk_option(-tickinterval) } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/moduleObj.itcl0000644000077300007730000016621412341332511022532 0ustar giannozzgiannozz# # $RCSfile: moduleObj.itcl,v $ -- # # This file contains the implementation of the ::guib::moduleObj # class. The construction of the GUI is embedded inside the "module" # keyword, for example: # # module #auto -title "Simple GUI -script { # ... # } # # The "module" keyword construct the moduleObj object, which holds the # whole GUI. The "moduleObj" is an extension of "keywordObj" class, # that is, moduleObj-class is-a keywordObj. In other words moduleObj # class inherit the keywordObj class. See file keywordObj.itcl for the # definition of keywordObj class. # # The implementation of GUIB keywords, which are public methods of # moduleObj class, is contained in file guibKeywords.itcl. # # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: moduleObj.itcl,v 1.8 2008-05-08 18:44:36 kokalj Exp $ # # ------------------------------------------------------------------------ #****h* ::guib/moduleObj # FUNCTION # The moduleObj is a class for the GUIB module. See the documentation # on the ::guib::moduleObj class. #**** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****c* ::guib/moduleObj # NAME # ::guib::moduleObj -- a class for the GUIB module # PURPOSE # It is the class for the GUIB module. The GUI constructed by the # GUIB is embedded inside the "module" keyword, for example: # # module #auto -title "Simple GUI -script { # ... # } # # The "module" keyword construct the moduleObj object, which holds the # whole GUI. # # IS-A # ::guib::keywordObj # # METHODS # 1. GUIB-KEYWORDS:: # 1.1 object keywords: # page # namelist # group # optional # required # line # # 1.2 item keywords: # var # auxilvar # dimension # text # table # keyword # help # grouphelp # # 1.3 event-driven keywords: # tracevar # widget # groupwidget # widgetconfigure # widgetcget # keywordconfigure # # 1.4 getsets keywords, i.e. keyword associated with the variables: # varvalue # vartextvalue # varref # varset # dimvalue # dimtextvalue # dimref # dimset # tablevalue # tabletextvalue # tableref # tableset # # 1.5 special keywords: # readfilter # writefilter # postprocess # this # loaddata # valueToTextvalue # textvalueToValue # scriptvar # # 1.6 decoration keywords: # packwidgets # separator # # 2. PUBLIC METHODS # setModuleFile -- stores the full pathname of a module-definition file # getModuleFile -- gets the full pathname of a module-definition file # loaddataGetInfo -- return the value _loaddata array for a give variable # makeSimpleTplwGUI -- constructs a simple toplevel standalone GUI with File menu # makeEmbedGUI -- make a non-standalone GUI into a given contained widget # saveAs -- query for file and save the input into it queried file # save -- save the input into current file # print -- similar to "save" but instead prints to stdout # getOutput -- similar to "print" but instead returns the content # saveToVar -- store the value of all GUIB-variables into GUIB-variables # openFile -- opens an input-file and calls readFile # readFile -- reads an input-file from a given file-channel # readFileError -- method for dealing with file-read errors # readFileWrongFormat -- method for dealing with wrong-formatted input file # isNotDisabledWidget -- checks is a given widget associated with a particular input-variable is not disabled # getWidgetFromVarident -- returns a widget-pathname of a given input-variable # varnameToVarident -- tries to return a GUIB-variable's identifier on the basis of "varName" # indentinfo -- returns a queried information for a given keyword (i.e. based on identifier) # optionSetDefault -- ... # loadFromVar -- inverse of saveToVar, i.e., it varsets GUIB-variables from the variables # getAllVar -- returns all defined GUIB_variables # optionSetDefault -- set dafule value for a given option # storeModuleItems -- stores all input-content items (var, dimension, table) into module_items array # # 3. PROTECTED/PRIVATE METHDOS # 3.1 methods connected to guib::keywordObj class # _setCurrentObj -- stores a current object and its type into currentObj, currentObjType variables # _getCurrentObj -- gets current object # _getCurrentObjType -- gets current object's type # # 3.2 methods connected to input variables # _addVaridentWidget -- adds a variable & widget pair to varidentWidgetList variable # _addVaridentObj -- adds a variable and the object to whome the variable belong to to varidentObjList variable # _getObjFromVarident -- returns the object associated with a given variable's identifier # # 3.3 auxiliary methods for GUIB keywords # _manageNameObj -- manages all the job for name-object type keywords # _manageVoidObj -- manages all the job for void-object type keywords # _manageKeyword -- manages all the job for item type keywords # _separator -- manages all the job for "separator" keyword # _widget -- manages all the job for the "widget" keyword # _groupwidget -- manages all the job for the "groupwidget" keyword # _groupwidget__disableAll -- disables all given widgets # _groupwidget__enableAll -- enables all given widgets # _tracevar -- {varIdent mode} # _traceCmd -- these two methods manage the job for "tracevar" keyword # # 3.4 methods for manipulating variable's widgets # _getAfterWidget -- returns the variables' widgets that follows after a given variable's widget # _getAfterMappedWidget -- # _deleteDisabledWid -- removes the widget from the disabledWidList list # _addDisabledWid -- add a given variable's widget to disabledWidList # # 3.5 methods for building the GUI's widgets # _buildGUI -- recursively builds the GUI # _buildGUI_constructItem -- subroutine of _buildGUI for managing the widgets of item's keyword # _configurePage -- configures the pages of tabnotebooks # _packSide -- returns the pack-side of a given widget # # 3.6 methods connected with the "Open" menu # _open -- recursively reads the input file # _openCompareStr -- reads a string from input-line and compares it to a given string according to "-nocase" status # _openReadNamelistVar -- reads the next name of a variable in the namelist # _openReadNamelistValue -- reads the next value of a variable in the namelist # _openReadKeyword -- reads keyword from the input according to "-nocase" status # _openSyntaxError -- method for dealing with file-read errors # # 3.7 methods connected with the "Save" menu # _manageSave -- wrapper for "_save" method # _save -- does the job for "save" method, that is, stores the output into the "output" variable recursively # _clearOutput -- clears the output (must be used before constructing the output) # _appendOutput -- append a given string to the output, that is, to the "output" variable # _getOutput -- returns the value of the "output" variable, which holds the content of the output # _saveToVar -- does the job for "saveToVar" method # _quoteValue -- returns the string variable's value as quoted (if quoting is enabled) # # 3.8 methods connected to GUIB keyword identifier # _makeIdent -- makes a unique GUIB-variables identifier (used for undefined-variables) # _isUniqueIdent -- checks if ident is unique # _addIdent -- adds (registers) identifier # _checkIdentChars -- checks if identifier string contains only ^[[:alnum:]_.:]+$ type characters # # 3.9 other methdos # _loadFromVar -- ... # _scopedName -- # # 3.10 miscellaneous methods # _storeModuleItems (see file: store.itcl) # # COMMANDS # _validateFmtString -- construct the formated string and check it against the format specifiers # _comafy -- transforms the strings of type array(elem) to array,elem # _openGets -- read a line of input (skips all the empty lines) # _expandArgs -- returns option-value pairs in a non-listed form, i.e. opt1 val1 opt2 val2 ..., and not {op1 val1 opt2 val2 ...} # _findKeywordObjType -- checks if a given object-type is present in the stack # #****** #------------------------------------------------------------------------ itcl::class ::guib::moduleObj { # moduleObj IS-A keywordObj, namely, it is a toplevel keywordObj inherit keywordObj # _guibVar array contains the "textvalues" of GUIB-variables # (example of GUIB variable: var $ident ?option value? ?...?), # that is, _guibVar($ident) is a real variable for the # $ident-variable and contain its "textvalue" !!! public variable _guibVar # # VARIABLES # public variable title {} public variable script {} public variable varscope {} public variable toplevel {} public variable toplevelTitle {} public common module_item public common module_itemL private variable options private variable _moduleFile {} private variable currentObj {} private variable currentObjType {} private variable traceVaridentList {} private variable traceVaridentModeScriptList {} private variable varidentWidgetList {} private variable objWidgetArray private variable varidentObjList {} private variable disabledWidList {} private variable disabledKeywordidentList {} private variable widgetPackInfo private variable nameObjList {} private variable disabledNameObjList {} private variable _loadData private variable _identInfo private variable _allVar; # used by getAllVar method # # variables associated with _buildGUI method private variable objLevel private variable pageLevel private variable lineEntryList private variable packSide # # variables for "save" method # private variable writeFilter {} private variable output {} private variable namelist {} private variable unsetVars {} private variable saveError 0 # # variables for "open" method # private variable readFilter {} private variable readError 0 private variable readline {} private variable readNewLine 1 # postprocessScript: variable holding postprocess script that # will be executed after the Tk-GUI is build. Typical usage is # setting the default values, so that variable traces will be # executed. This can be used for enabling/disabling the keywidgets private variable postprocessScript private variable dummy ; # used for whatever temporary purpose # # METHODS # constructor {args} { set currentObj $this set currentObjType module array set options [array get ::guib::options] ::tclu::DEBUG options: [array get options] set _loadData(varlist) {} set _loadData(cmdlist) {} set _loadData(textlist) {} set _identInfo(identlist) {} eval configure $args eval $script } # ============================================================== # definition of all GUIB script KEYWORDS (they are methods) !!! # ============================================================== # 1.) object keywords: public method page {ident args} public method namelist {ident args} public method group {ident args} public method line {ident args} public method optional {code} public method required {code} # 2.) item keywords: public method var {ident args} public method auxilvar {ident args} public method dimension {ident args} public method text {ident args} public method table {ident args} public method keyword {ident args} public method help {ident args} public method grouphelp {idents args} # 3.) event-driven keywords: public method tracevar {varIdent mode script} public method widget {varIdent action} public method groupwidget {name action} public method widgetconfigure {varIdent args} public method widgetcget {varIdent option} public method keywordconfigure {keyIdent state} # 4.) getsets keywords, i.e. keyword associated with the variables: public method varvalue {ident} public method vartextvalue {ident} public method varref {ident} public method varset {ident what value {usage {usage: varset $ident -value|-textvalue $value}}} public method dimvalue {ident i1} public method dimtextvalue {ident i1} public method dimref {ident i1} public method dimset {ident i1 what value} public method tablevalue {ident i1 i2} public method tabletextvalue {ident i1 i2} public method tableref {ident i1 i2} public method tableset {ident i1 i2 what value} # 5.) special keywords: public method readfilter {cmd} public method writefilter {cmd} public method postprocess {script} public method this {} public method loaddata {varIdent cmd {buttonText "Load from file ..."}} public method valueToTextvalue {varIdent value} public method textvalueToValue {varIdent textvalue} public method scriptvar {ident args} # 6.) decoration keywords: public method packwidgets {side} public method separator {args} # # public METHODS # public method setModuleFile {file} public method getModuleFile {} public method loaddataGetInfo {varIdent} public method makeSimpleTplwGUI {} public method makeEmbedGUI {wid} public method saveAs {{filetypes {}}} public method save {file {nocomplain 0}} public method saveToVar {{namespace_scope ::}} public method print {{nocomplain 0}} ; # same as save but prints to stdout public method getOutput {} ; # similar to print but instead returns the content public method openFile {fileName} public method readFile {fileChannel {fileName {}}} public method readFileError {errMsg} public method readFileWrongFormat {formatName {diagnosisText {}}} public method isNotDisabledWidget {widget} public method getWidgetFromVarident {varIdent} public method varnameToVarident {obj varName {nocase 0}} public method identinfo {ident what} public method optionSetDefault {key option defaultValue} public method loadFromVar {} public method getAllVar {{types a*}} public method storeModuleItems {} # -------------------------------------------------- # methods connected to guib::keywordObj class # -------------------------------------------------- private method _setCurrentObj {obj types} private method _getCurrentObj {} private method _getCurrentObjType {} # -------------------------------------------------- # methods connected to input variables # -------------------------------------------------- private method _addVaridentWidget {varIdent widgetName} private method _addVaridentObj {varIdent obj} private method _getObjFromVarident {varIdent} # # methods connected to GUIB keyword identifier # private method _makeIdent {string} private method _isUniqueIdent {ident} private method _addIdent {ident} private method _checkIdentChars {ident {allowComma 0}} # # private METHODS connected to GUIB keywords # private method _manageNameObj {key ident args} private method _manageVoidObj {key code} private method _manageKeyword {obj key ident code} private method _separator {obj code} private method _widget {action varIdent} private method _groupwidget {obj action} private method _groupwidget__disableAll {wlist} private method _groupwidget__enableAll {wlist} protected method _tracevar {varIdent mode} private method _traceCmd {name1 name2 op} private method _getAfterWidget {widget} private method _getAfterMappedWidget {widget} private method _deleteDisabledWid {widget} private method _addDisabledWid {widget} # # BUILD private methods (build.itcl) # private method _buildGUI {obj wid} private method _buildGUI_constructItem {id obj wid key {elist {}}} private method _configurePage {page tabnotebook tabpos} private method _packSide {objLevel} # # OPEN methods # private method _open {obj fileChannel} private method _openCompareStr {args} private method _openReadNamelistVar {obj fileChannel} private method _openReadNamelistValue {} private method _openReadKeyword {keyword} private method _openSyntaxError {text {addSkipMsg 1}} private method _isDisabledKey {obj id ident} # # methods for managing the OUTPUT (i.e. connected to SAVE menu) # private method _save {obj} private method _manageSave {nocomplain} private method _clearOutput {} private method _appendOutput {string} private method _getOutput {} private method _saveToVar {obj namespace_scope} private method _quoteValue {value} # # other methods # private method _loadFromVar {obj} private method _scopedName {varName} private method _getAllVar {obj type} private method _storeModuleItems {obj} # # functions # private proc _validateFmtString {fmt valuesList errorMessage} private proc _comafy {var} ; # TODO: should be a normal guib utility proc private proc _openGets {fileChannel} private proc _expandArgs {code} private proc __storeItem {key name ident {insideNamelist 0}} # although this proc operates on keywordObj, it makes sense to be # defined in moduleObj class, since moduleObj class organizes # keywordObj hierarchically. The keywordObjects do not know for # one another. private proc _findKeywordObjType {obj type}; } # ------------------------------------------------------------------------ #****m* moduleObj/setModuleFile # NAME # ::guib::moduleObj::setModuleFile -- stores the full pathname of the module-file # USAGE # setModuleFile file # DESCRIPTION # This method stores the full pathname of the file that holds the # module definition. The path of the filename is stored in as # absolute pathname. # ARGUMENTS # file -- file-name of module-file # EXAMPLE # $moduleObj setModuleFile $moduleFile #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::setModuleFile {file} { if { [file pathtype $file] != "absolute" } { set file [file join [pwd] $file] } set _moduleFile $file } # ------------------------------------------------------------------------ #****m* moduleObj/getModuleFile # NAME # ::guib::moduleObj::getModuleFile -- returns the absolute pathname of the module-file # ARGUMENTS # None. # RETURN VALUE # Absolute pathname of the module-file. # EXAMPLE # set moduleFile [$moduleObj getModuleFile] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::getModuleFile {} { return $_moduleFile } # ------------------------------------------------------------------------ #****im* moduleObj/_setCurrentObj # NAME # ::guib::moduleObj::_setCurrentObj -- set the current GUIB object # USAGE # _setCurrentObj obj type # DESCRIPTION # Some keywords of module GUIB definition script define the new objects. # This is how the nesting of keywords is implemented. This method stores # the newly created object (name and type) as a current one. # ARGUMENTS # obj -- keywordObj's object name # type -- keywordObj's object type (e.g. page, namelist, ...) # RETURN VALUE # The object name # EXAMPLE # $moduleObj _setCurrentObj $childObj $key #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_setCurrentObj {obj type} { set currentObj $obj set currentObjType $type return $obj } # ------------------------------------------------------------------------ #****im* moduleObj/_getCurrentObj # NAME # ::guib::moduleObj::_getCurrentObj -- returns the current keywordObj's object name # ARGUMENTS # None. # RETURN VALUE # The current object name # EXAMPLE # set childObj [$moduleObj _getCurrentObj] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_getCurrentObj {} { return $currentObj } # ------------------------------------------------------------------------ #****im* moduleObj/_getCurrentObjType # NAME # ::guib::moduleObj::_getCurrentObjType -- returns the current object type # ARGUMENTS # None. # RETURN VALUE # The current object type # EXAMPLE # set childObjType [$moduleObj _getCurrentObjType] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_getCurrentObjType {} { return $currentObjType } # ------------------------------------------------------------------------ #****im* moduleObj/_addVaridentWidget # NAME # ::guib::moduleObj::_addVaridentWidget -- adds a new variable-widget pair to a list # USAGE # _addVaridentWidget varIdent widgetName # ARGUMENTS # varIdent -- the GUIB-variable's identifier # widgetName -- the path of the variable's widget # RETURN VALUE # The added variable-widget pair. # EXAMPLE # $moduleObj _addVaridentWidget $varIdent $widgetPath #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_addVaridentWidget {varIdent widgetName} { lappend varidentWidgetList [list $varIdent $widgetName] return [list $varIdent $widgetName] } # ------------------------------------------------------------------------ #****im* moduleObj/_addVaridentObj # NAME # ::guib::moduleObj::_addVaridentObj -- adds a new variable-object pair to a list # USAGE # _addVaridentObj varIdent obj # ARGUMENTS # varIdent -- the GUIB-variable's identifier # obj -- the associated keywordObj's object # RETURN VALUE # The added variable-object pair. # EXAMPLE # $moduleObj _addVaridentObj $varIdent $obj #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_addVaridentObj {varIdent obj} { lappend varidentObjList [list $varIdent $obj] return [list $varIdent $obj] } # ------------------------------------------------------------------------ #****m* moduleObj/getWidgetFromVarident # NAME # ::guib::moduleObj::getWidgetFromVarident -- returns the widget pathname which is associated with a variable # USAGE # getWidgetFromVarident varIdent # ARGUMENTS # varIdent -- the GUIB-variable's identifier # RETURN VALUE # The widget pathname associated with the variable. # EXAMPLE # set widget [$moduleObj getWidgetFromVarident $varIdent] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::getWidgetFromVarident {varIdent} { set i [lsearch -glob $varidentWidgetList [list $varIdent *]] if { $i == -1 } { return {} } else { return [lindex [lindex $varidentWidgetList $i] 1] } } # ------------------------------------------------------------------------ #****m* moduleObj/varnameToVarident # NAME # ::guib::moduleObj::varnameToVarident -- tries to return a GUIB-variable's identifier on the basis of "varName" # USAGE # varnameToVarident obj varName ?nocase? # ARGUMENTS # obj -- keywordObj object pointer # varName -- the name of the variable (i.e. value of -variable option of a given obj's keyword) # nocase -- compare the varName-ident case sensitively/insensitively (must be 0|1) # RETURN VALUE # The identifier of a GUIB's variable # EXAMPLE # set ident [$moduleObj varnameToVarident $obj $varName 1] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::varnameToVarident {obj varName {nocase 0}} { set result "" set NItem [$obj getID] for {set id 0} {$id <= $NItem} {incr id} { set childObj [$obj getChild $id] if { $childObj != "" } { # an object; search it set result [varnameToVarident $childObj $varName $nocase] if { $result != "" } { return $result } } else { # a key set ident [$obj getOptionValue $id ident] set var [$obj getOptionValue $id variable] if { [::tclu::stringMatch $varName $var $nocase] } { return $ident } } } # if we come here, the identifier of given varName wasn't found return "" } itcl::body ::guib::moduleObj::identinfo {ident what} { # check id ident is an identifier !!! if { [lsearch -exact $_identInfo(identlist) $ident] < 0 } { set exists 0 } else { set exists 1 } if { $what == "exists" } { return $exists } if { ! $exists } { ::tclu::ERROR "identifier $ident does not exists" } switch -exact -- $what { keywordObj { return $_identInfo(keywordObj,$ident) } id { return $_identInfo(id,$ident) } default { ::tclu::ERROR "wrong mode of ideninfo method (usage: indentinfo ident mode), should be one of keywordObj, id" } } } # ------------------------------------------------------------------------ #****im* moduleObj/_getObjFromVarident # NAME # ::guib::moduleObj::_getObjFromVarident -- returns the object associated with a given variable's identifier # USAGE # _getObjFromVarident varIdent # ARGUMENTS # varIdent -- the GUIB-variable's identifier # RETURN VALUE # The keywordObj's object-name that holds the variable. # EXAMPLE # set obj [$moduleObj _getObjFromVarident $varIdent] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_getObjFromVarident {varIdent} { set i [lsearch -glob $varidentObjList [list $varIdent *]] if { $i == -1 } { # maybe varIdent corresponds to dimension, # i.e. var(x), but we need just "var" set varIdent [lindex [split $varIdent "("] 0] set i [lsearch -glob $varidentObjList [list $varIdent *]] if { $i == -1 } { # check for comafied dimension name set varIdent [lindex [split $varIdent ","] 0] set i [lsearch -glob $varidentObjList [list $varIdent *]] } } if { $i == -1 } { return {} } else { return [lindex [lindex $varidentObjList $i] 1] } } # ------------------------------------------------------------------------ #****im* moduleObj/_getAfterWidget # NAME # ::guib::moduleObj::_getAfterWidget -- returns the widget after the specified one # USAGE # _getAfterWidget widget # ARGUMENTS # widget -- path-name of the widget # RETURN VALUE # The widget-pathname of the widget which is after the specified one # EXAMPLE # set widget [$moduleObj _getAfterWidget $thisWidgetName] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_getAfterWidget {widget} { set i [lsearch -glob $varidentWidgetList [list * $widget]] if { $i == -1 } { return {} } else { return [lindex [lindex $varidentWidgetList [expr $i + 1]] 1] } } itcl::body ::guib::moduleObj::_getAfterMappedWidget {widget} { # WARNING : this proc does not work: needs checking !!! for {set aw [_getAfterWidget $widget]} { ! [winfo ismapped $aw] } {set aw [_getAfterWidget $aw]} { if { $aw == "" } { return "" } } return $aw } # ------------------------------------------------------------------------ #****im* moduleObj/_manageKeyword # NAME # ::guib::moduleObj::_manageKeyword -- does all for the GUIB item-type kewyords # USAGE # _manageKeyword obj key ident code # DESCRIPTION # This is a kernel method for processing the GUIB item-type # keywordslike var, dimension, keyword. This proc is called from # "var", "keyword", "dimension", etc. methods. # ARGUMENTS # obj -- the keywordObj's object to whom the current item-keyword belong # key -- the type (name) of the item-keyword (i.e. var, dimension, ...) # code -- code of the keyword # RETURN VALUE # None. # EXAMPLE # _manageKeyword obj key code #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_manageKeyword {obj key ident code} { _addIdent $ident set id [$obj incrID] if { $key == "text" } { tclu::DEBUG code == $code tclu::DEBUG options == $options($key) } # set the key and parse the options and add them to the "list" $obj setKey $id $key $ident $obj setOptions $id [cmdline::getoptions code $options($key)] # if the value of -variable option is "", then set it to $ident if { $key == "var" || $key == "auxilvar" || $key == "dimension" || $key == "table" } { if { [$obj getOptionValue $id variable] == "" } { $obj setOptions $id [list variable $ident] } } if { $key == "text" } { $obj setOptions $id [list variable $ident] } # manage identinfo set _identInfo(keywordObj,$ident) $obj set _identInfo(id,$ident) $id _addVaridentObj $ident $obj } # ------------------------------------------------------------------------ #****im* moduleObj/_manageNameObj # NAME # ::guib::moduleObj::_manageNameObj -- manages all the job for name-object type keywords # USAGE # _manageNameObj key ident args # # DESCRIPTION # This is a kernel method for processing the GUIB name-object like # page and namelist. The nameobject are the one whose keyword # has the -name option (e.g. page -name "Page #.1" {...script...}). # This method is called inside "page" or "namelist" methods and then it # manages the keywords content and stores it. # ARGUMENTS # key -- the type (name) of the object-keyword (i.e. namelist, group, ...) # args -- the code of the object-keyword # RETURN VALUE # None. # EXAMPLE # _manageNameObj page $args #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_manageNameObj {key ident args} { _addIdent $ident set parentObj [_getCurrentObj] set parentType [_getCurrentObjType] # parse the object's "-name" option #if { [cmdline::getopt args {name.arg} opt value] < 0 } { # ::tclu::ERROR "an error occured while parsing the $key option: $opt" #} array set opts [cmdline::getoptions args $options($key)] set id [$parentObj incrID] $parentObj setKey $id $key $ident $parentObj setOptions $id [array get opts] #$parentObj setOptions $id [list $opt $value] # cmdline::getopts takes as args: -name name {script} and then it drops # -name name and it returns {{script}}, but we want just {script}, # therefore below we will use [lindex $args 0] !!! set code [lindex $args 0] # manage identinfo set _identInfo(keywordObj,$ident) $parentObj set _identInfo(id,$ident) $id # make a nameObj; its is a child object of parent object (parentObj)) set childObj [::guib::keywordObj::nameObj $ident\#auto \ -name $opts(name) -type $key -parent $parentObj] $parentObj setChild $id $childObj lappend nameObjList [list $ident $childObj] # set the current object to the childObj, and execute a script. Then # reassign the current object to the parentObj _setCurrentObj $childObj $key eval $code _setCurrentObj $parentObj $parentType } # ------------------------------------------------------------------------ #****im* moduleObj/_manageVoidObj # NAME # ::guib::moduleObj::_manageVoidObj -- manages all the job for void-object type keywords # USAGE # _manageVoidObj key code # # DESCRIPTION # This is a kernel method for processing the GUIB void-objects like # "optional" and "required". The void-objects are the one whose keyword # doesn't have the -name option (e.g. required {...script...}). # This method is called inside "optional" or "required" methods and then it # manages the keywords content and stores it. # ARGUMENTS # key -- the type (name) of the object-keyword (i.e. namelist, group, ...) # args -- the code of the object-keyword # RETURN VALUE # None. # EXAMPLE # _manageVoidObj required $code #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_manageVoidObj {key code} { set parentObj [_getCurrentObj] set parentType [_getCurrentObjType] set id [$parentObj incrID] $parentObj setKey $id $key set childObj [::guib::keywordObj::voidObj "${key}#auto" -type $key -parent $parentObj] $parentObj setChild $id $childObj # set the current object to the childObj, and execute a script. Then # reassign the current object to the parentObj _setCurrentObj $childObj $key eval $code _setCurrentObj $parentObj $parentType } # ------------------------------------------------------------------------ #****m* moduleObj/loaddataGetInfo # NAME # ::guib::moduleObj::loaddataGetInfo -- return the value _loaddata array for a give variable # USAGE # loaddataGetInfo varIdent # # DESCRIPTION # We would like to load a GUIB table from file. Hence in a module # file a "loaddata" keyword was specified as "loaddata varIdent cmd # buttonText". Then kind of "Load from file" button-widget will appear # in the GUI. The "loaddataGetInfo" method is used to retrieve the # "cmd" and "buttonText" of a given varIdent. # # ARGUMENTS # varIdent -- identifier of the GUIB variable for which to load data # RETURN VALUE # Returns the loaddata's "varIdent cmd buttonText", where "cmd" is # the "Load from file" command, and "buttonText" is the text that # appear in the "Load from file" button. # # EXAMPLE # set info [loaddataGetInfo $myTable] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::loaddataGetInfo {varIdent} { set i [lsearch -glob $_loadData(varlist) $varIdent] if { $i == -1 } { return {} } else { return [list \ [lindex $_loadData(varlist) $i] \ [lindex $_loadData(cmdlist) $i] \ [lindex $_loadData(textlist) $i]] } } # ======================================================================== # "save" GUI methods # ======================================================================== # ------------------------------------------------------------------------ #****im* moduleObj/_clearOutput # NAME # ::guib::moduleObj::_clearOutput -- clears the output (must be used before constructing the output) # USAGE # _clearOutput # DESCRIPTION # The _clearOutput prepares everything for making a new output. The # output is constructed in such a way that it is appended by pieces to # "output" variable. At the end the content of the "output" variable # can be saved to file (save,saveAs) or printed to stdout (print). # RETURN VALUE # None. #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_clearOutput {} { set saveError 0 set output {} set unsetVars {} } # ------------------------------------------------------------------------ #****im* moduleObj/_appendOutput # NAME # ::guib::moduleObj::_appendOutput -- append a given text to the output, that is, to the "output" variable # USAGE # _appendOutput text # DESCRIPTION # The _appendOutput method is used during the construction of the # output with the recursive _save method. # RETURN VALUE # None. #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_appendOutput {string} { append output $string } # ------------------------------------------------------------------------ #****im* moduleObj/_getOutput # NAME # ::guib::moduleObj::_getOutput -- returns the value of the "output" variable # USAGE # _getOutput # RETURN VALUE # The value of the "output" variable. # EXAMPLE # set outputContent [_getOutput] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_getOutput {} { return $output } # ------------------------------------------------------------------------ #****im* moduleObj/_makeIdent # NAME # ::guib::moduleObj::_makeIdent -- makes a unique GUIB-variables identifier # USAGE # _makeIdent string # DESCRIPTION # Makes a unique GUIB-variables identifier (used for undefined-variables). # RETURN VALUE # The unique identifier. # EXAMPLE # set ident [_makeIdent myVar] # SOURCE #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_makeIdent {string} { set string [_comafy $string] # let's allow the comma _checkIdentChars $string 1 set _string $string set counter -1 while {1} { if { [lsearch -exact $_identInfo(identlist) $string] < 0 } { return $string } else { # attempt to make a unique identifier incr counter set string var_${counter}_${_string} } } } # ------------------------------------------------------------------------ #****im* moduleObj/_isUniqueIdent # NAME # ::guib::moduleObj::_isUniqueIdent -- checks if ident is unique # USAGE # _makeIdent ident # ARGUMENTS # ident -- the identifier (of GUIB keyword) # RETURN VALUE # Returns 1 if ident is unique, and 0 otherwise. # EXAMPLE # set unique [_isUniqueIdent myIdent] # SOURCE #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_isUniqueIdent {ident} { # let's allow the comma _checkIdentChars $ident 1 if { [lsearch -exact $_identInfo(identlist) $ident] < 0 } { return 1 } else { return 0 } } # ------------------------------------------------------------------------ #****im* moduleObj/_addIdent # NAME # ::guib::moduleObj::_addIdent -- add (register) identifier # USAGE # _addIdent ident # ARGUMENTS # ident -- the identifier (of GUIB keyword) # RETURN VALUE # Value of ident. # EXAMPLE # _addIdentt myIdent # SOURCE #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_addIdent {ident} { # t.k. #set ident [_comafy $ident] #/ # let's allow the comma _checkIdentChars $ident 1 # check if ident is unique if { ! [_isUniqueIdent $ident] } { ::tclu::ERROR "identifier $ident is not unique." } lappend _identInfo(identlist) $ident return $ident } # ------------------------------------------------------------------------ #****im* moduleObj/_checkIdentChars # NAME # ::guib::moduleObj::_checkIdentChars -- checks if identifier string contains only ^[[:alnum:]_.:]+$ type characters # USAGE # _checkIdentChars ident ?allowComma? # ARGUMENTS # ident -- the identifier (of GUIB keyword) # RETURN VALUE # None. # EXAMPLE # _checkIdentChars myIdent # SOURCE #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_checkIdentChars {ident {allowComma 0}} { if { $allowComma } { set match [regexp {^[[:alnum:]_.:,]+$} $ident] } else { set match [regexp {^[[:alnum:]_.:]+$} $ident] } if { ! $match } { ::tclu::errorDialog "identifier \"$ident\" is composed from non-allowed characters. Due to this the program might behave erratically" } } # ------------------------------------------------------------------------ #****m* moduleObj/isNotDisabledWidget # NAME # ::guib::moduleObj::isNotDisabledWidget -- checks if widget is in a not present in disabledWidList list # USAGE # isNotDisabledWidget widget # DESCRIPTION # The "disabledWidList" list is used by "_widget" method to keep a # record on disabled widgets. This method checks if a given widget is not present # on the list of disabled widgets. # RETURN VALUE # Returns 1 when widget is not found in disabledWidList, otherwise returns 0. # EXAMPLE # set widgetState [$moduleObj isNotDisabledWidget $widget] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::isNotDisabledWidget {widget} { set ind [lsearch -exact $disabledWidList $widget] if { $ind < 0 } { return 1 } else { return 0 } } # ------------------------------------------------------------------------ #****im* moduleObj/_deleteDisabledWid # NAME # ::guib::moduleObj::_deleteDisabledWid -- removes the widget from the disabledWidList list # USAGE # _deleteDisabledWid widget # DESCRIPTION # The "disabledWidList" list is used by "_widget" method to keep a # record on disabled widgets. This method removes a given widget from # the list of disabled widgets. # RETURN VALUE # None. # EXAMPLE # $moduleObj _deleteDisabledWid $widget #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_deleteDisabledWid {widget} { ::tclu::lremove disabledWidList $widget #set ind [lsearch -exact $disabledWidList $widget] #if { $ind > -1 } { # set l1 [lrange $disabledWidList 0 [expr $ind - 1]] # set l2 [lrange $disabledWidList [expr $ind + 1] end] # set disabledWidList [concat $l1 $l2] #} } # ------------------------------------------------------------------------ #****im* moduleObj/_addDisabledWid # NAME # ::guib::moduleObj::_addDisabledWid -- adds the widget to the disabledWidList list # USAGE # _addDisabledWid widget # DESCRIPTION # The "disabledWidList" list is used by "_widget" method to keep a # record on disabled widgets. This method adds a given widget to # the list of disabled widgets. # RETURN VALUE # None. # EXAMPLE # $moduleObj _addDisabledWid $widget #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_addDisabledWid {widget} { ::tclu::ladd disabledWidList $widget #if { [lsearch -exact $disabledWidList $widget] < 0 } { # lappend disabledWidList $widget #} } # ======================================================================== # # Auxiliary functions # # ======================================================================== # ------------------------------------------------------------------------ #****if* moduleObj/_validateFmtString # NAME # ::guib::moduleObj::_validateFmtString -- construct the formated string and check it against the format specifiers # PURPOSE # This proc constructs formated string and checks it against the # format specifiers. The possible format errors are caught. If format # error occurs then the saveError variable is set to 1 and an error # message is raised in tk_messageBox for notification. # RETURN VALUE # The format string. # EXAMPLE # set string [_validateFmtString [list format "%s %s" $value1 $value2] #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_validateFmtString {fmt valuesList errorMsg} { if { [catch {set string [eval {::tclu::format $fmt} $valuesList]} fmtError] } { tk_messageBox -icon error -title "Typing ERROR" -message "Typing ERROR: $errorMsg\n\nFormat error: $fmtError" -type ok set saveError 1 return } return $string } # ------------------------------------------------------------------------ #****if* moduleObj/_comafy # NAME # ::guib::moduleObj::_comafy -- tranforms the strings of type a(1) to a,1 # USAGE # _comafy var # RETURN VALUE # The transformed string, i.e. a(1) is transformed to a,1 # EXAMPLE # set a3 [_comafy a(3)] #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_comafy {var} { set var [string trimright $var ")"] regsub -all -- {\(} $var {,} newvar return $newvar } # ------------------------------------------------------------------------ #****if* moduleObj/_findKeywordObjType # NAME # ::guib::moduleObj::_findKeywordObjType # USAGE # ::guib::moduleObj::_findKeyowrdObjType obj key # # DESCRIPTION # This proc search for the requested object in the # nesting-stack. It returns 1 if the object was found and 0 otherwise. # RETURN VALUE # Returns 1 if the object was found and 0 otherwise. # EXAMPLE # _findKeywordObjType $obj $key #******** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::_findKeywordObjType {obj key} { # i.e. key == type while { $obj != {} } { if { [$obj cget -type] == $key } { return 1 } set obj [$obj cget -parent] } return 0 } # ------------------------------------------------------------------------ #****if* moduleObj/_expandArgs # NAME # ::guib::moduleObj::_expandArgs -- expands the args arument # USAGE # _expandArgs code # DESCRIPTION # Some GUIB keywords can have the two forms: # # var varIdent -variable varName -label "VarName:" # or # var varIdent { -variable varName -label "VarName:" } # # Hence this proc is used to axpand the second form of args, which is # the transformed to first form. # RETURN VALUE # The transformed string, i.e. a(1) si transformed to a,1 # EXAMPLE # set a3 [_expandArgs a(3)] # SOURCE itcl::body ::guib::moduleObj::_expandArgs {code} { if { [llength $code] == 1 } { # syntax: var { -option value -option value } return [lindex $code 0] } else { # syntax: var -option value -option value return $code } } #******** # ------------------------------------------------------------------------ # ======================================================================== # # Auxiliary methods for GUIB keywords # # ======================================================================== # # auxiliary methods for "tracevar" GUIB keyword # itcl::body ::guib::moduleObj::_tracevar {varIdent mode} { trace variable [varref $varIdent] $mode [code $this _traceCmd] } itcl::body ::guib::moduleObj::_traceCmd {name1 name2 op} { # IMPORTANT: name1 is _guibVar, while name2 is a name of a # guib variable, therefore ... set ind [lsearch -exact $traceVaridentList [varref $name2]] if { $ind >= 0 } { set scriptMode [lindex $traceVaridentModeScriptList $ind] if { [lindex $scriptMode 0] == $op } { eval [lindex $scriptMode 1] } } } # # auxiliary method for "widget" GUIB keyword # itcl::body ::guib::moduleObj::_widget {action varIdent} { set widget [getWidgetFromVarident $varIdent] if { $widget == {} } { return } switch -exact $action { forget { if { [winfo exists $widget] } { catch { set widgetPackInfo($widget) [pack info $widget] } catch { pack forget $widget } } _addDisabledWid $widget } create { set afterWidget [_getAfterWidget $widget] if { $afterWidget != {} } { if { [winfo parent $widget] != [winfo parent $afterWidget] } { # widget doesn't belong to the same parent set afterWidget {} } } if { ! [winfo ismapped $widget] } { # TODO: I should remember the side and other options if { [info exists widgetPackInfo($widget)] } { eval pack $widget $widgetPackInfo($widget) } else { pack $widget -side top -fill x -padx 3 -pady 2 } if { $afterWidget != {} && [winfo ismapped $afterWidget] } { pack configure -before $afterWidget } } _deleteDisabledWid $widget } enable { $widget configure -state normal _deleteDisabledWid $widget } disable { $widget configure -state disabled _addDisabledWid $widget } default { ::tclu::ERROR "unknown widget action, must be one of: create, forget, enable, or disable" } } } # # auxiliary method for "separator" GUIB keyword # itcl::body ::guib::moduleObj::_separator {obj code} { set id [$obj incrID] if { [cmdline::getopt code {label.arg} opt value] < 0 } { ::tclu::ERROR "an error occured while parsing the separator option: $opt" } $obj setKey $id separator $obj setOptions $id [list $opt $value] } # # auxiliary method for "groupwidget" GUIB keyword # itcl::body ::guib::moduleObj::_groupwidget {obj action} { switch -exact -- $action { enable { ::tclu::lremove disabledNameObjList $obj } disable { ::tclu::ladd disabledNameObjList $obj } create { ::tclu::lremove disabledNameObjList $obj if { ! [info exists objWidgetArray(WIDGET,$obj)] } { ::tclu::ERROR "the objWidgetArray(WIDGET,$obj) variable does not exists: should't happen" return } set widget $objWidgetArray(WIDGET,$obj) if { ! [winfo ismapped $widget] } { if { [info exists widgetPackInfo($widget)] } { eval pack $widget $widgetPackInfo($widget) } else { pack $widget -fill x -expand 1 } } set action enable } forget { ::tclu::ladd disabledNameObjList $obj if { ! [info exists objWidgetArray(WIDGET,$obj)] } { ::tclu::ERROR "the objWidgetArray(WIDGET,$obj) variable does not exists: should't happen" return } set widget $objWidgetArray(WIDGET,$obj) if { [winfo exists $widget] } { catch {set widgetPackInfo($widget) [pack info $widget]} catch {pack forget $widget} } set action disable } default { ::tclu::ERROR "unknown action \"$action\", must be enable, disable, create or forget" } } set NItem [$obj getID] for {set id 0} {$id <= $NItem} {incr id} { set key [$obj getKey $id] set childObj [$obj getChild $id] if { $childObj != {} } { # we have new object; handle it recursively only if it is not disabled _groupwidget $childObj $action } else { # # TODO: disabling/enabling of dimension does not work # because of variable vs. variable(1) mismatch # # check also for tables ... # set varIdent [$obj getOptionValue $id ident] if { $varIdent == {} } { continue } set widget [getWidgetFromVarident $varIdent] if { $widget == {} } { continue } #set table [getTableFromVar $varIdent] switch -exact $action { enable { if { [lsearch -exact $disabledWidList $widget] < 0 } { catch {$widget config -state normal} } } disable { catch {$widget config -state disabled} } default { ::tku:ERROR "unknown groupwidget action, must be one of: enable, or disable" } } } } } #======================================================================== # # INCOMING # # ======================================================================== itcl::body ::guib::moduleObj::_scopedName {varName} { if { $varscope == "" } { return $varName } else { #return [concat ${varscope}::${varName}] return [concat ${varscope} ${varName}] } } # ------------------------------------------------------------------------ #****m* moduleObj/saveToVar # NAME # ::guib::moduleObj::saveToVar -- store the value of all GUIB-variables into GUIB-variables # USAGE # saveToVar ?namespace_scope? # RETURN VALUE # None. # EXAMPLE # $this saveToVar ::myNamespace #****** # ------------------------------------------------------------------------ itcl::body ::guib::moduleObj::saveToVar {{namespace_scope ::}} { _saveToVar $this $namespace_scope } itcl::body ::guib::moduleObj::_saveToVar {obj namespace_scope} { set NItem [$obj getID] for {set id 0} {$id <= $NItem} {incr id} { set key [$obj getKey $id] set childObj [$obj getChild $id] if { $childObj != {} } { # we have new keywordObj object, goes down the stack _saveToVar $childObj $namespace_scope } else { # we have new keyword switch -exact -- $key { "var" { set varName [_scopedName [$obj getOptionValue $id variable]] set varIdent [$obj getOptionValue $id ident] set varValue [varvalue $varIdent] namespace eval $namespace_scope [list set $varName $varValue] } "dimension" { set dimName [_scopedName [$obj getOptionValue $id variable]] set dimIdent [$obj getOptionValue $id ident] #set dimWid [getWidgetFromVarident $dimIdent] #set start [$dimWid cget -start] #set end [$dimWid cget -end] set start [$obj getOptionValue $id start] set end [$obj getOptionValue $id end] for {set i $start} {$i <= $end} {incr i} { set varValue [dimvalue $dimIdent $i] set varName [::guib::arrayInstance ${dimName}($i)] namespace eval $namespace_scope [list set $varName $varValue] } } "table" { set tableName [_scopedName [$obj getOptionValue $id variable]] set tableIdent [$obj getOptionValue $id ident] #set tableWid [getWidgetFromVarident $tableIdent] #set rows [$tableWid cget -rows] #set cols [$tableWid cget -cols] set rows [$obj getOptionValue $id rows] set cols [$obj getOptionValue $id cols] for {set ir 1} {$ir <= $rows} {incr ir} { for {set ic 1} {$ic <= $cols} {incr ic} { set varValue [tablevalue $tableIdent $ir $ic] set varName [::guib::arrayInstance ${tableName}($ir,$ic)] namespace eval $namespace_scope [list set $varName $varValue] } } } } } } } itcl::body ::guib::moduleObj::loadFromVar {} { _loadFromVar $this } itcl::body ::guib::moduleObj::_loadFromVar {obj} { set NItem [$obj getID] for {set id 0} {$id <= $NItem} {incr id} { set key [$obj getKey $id] set childObj [$obj getChild $id] if { $childObj != {} } { # we have new keywordObj object, goes down the stack _loadFromVar $childObj } else { # we have new keyword switch -exact -- $key { "var" { set varName [_scopedName [$obj getOptionValue $id variable]] set varIdent [$obj getOptionValue $id ident] upvar \#0 $varName varValue if { [info exists varValue] } { varset $varIdent -value $varValue } } "dimension" { set dimName [$obj getOptionValue $id variable] set dimIdent [$obj getOptionValue $id ident] set start [$obj getOptionValue $id start] set end [$obj getOptionValue $id end] for {set i $start} {$i <= $end} {incr i} { set dimn [_scopedName [::guib::arrayInstance ${dimName}($i)]] upvar \#0 $dimn varValue if { [info exists varValue] } { dimset $dimIdent $i -value $varValue } } } "table" { set tableName [$obj getOptionValue $id variable] set tableIdent [$obj getOptionValue $id ident] set rows [$obj getOptionValue $id rows] set cols [$obj getOptionValue $id cols] for {set ir 1} {$ir <= $rows} {incr ir} { for {set ic 1} {$ic <= $cols} {incr ic} { set tabn [_scopedName [::guib::arrayInstance ${tableName}($ir,$ic)]] upvar \#0 $tabn varValue if { [info exists varValue] } { tableset $tableIdent $ir $ic -value $varValue } } } } } }; # if }; # for } # # types == regular-expresion for mathing the type of var: var, dimenison, table # The types == a* will thus match all types. # itcl::body ::guib::moduleObj::getAllVar {{types a*}} { set _allVar "" _getAllVar $this $types ::tclu::DEBUG getAllVar: vars == $_allVar return $_allVar } itcl::body ::guib::moduleObj::_getAllVar {obj types} { set NItem [$obj getID] for {set id 0} {$id <= $NItem} {incr id} { set key [$obj getKey $id] set childObj [$obj getChild $id] if { $childObj != {} } { # we have new keywordObj object, go down the stack _getAllVar $childObj $types } else { # we have new keyword if { [regexp -- $types $key] } { # switch -exact -- $key { "var" { set varName [_scopedName [$obj getOptionValue $id variable]] lappend _allVar $varName } "dimension" { set dimName [$obj getOptionValue $id variable] #set dimIdent [$obj getOptionValue $id ident] #set dimWid [getWidgetFromVarident $dimIdent] #set start [$dimWid cget -start] #set end [$dimWid cget -end] set start [$obj getOptionValue $id start] set end [$obj getOptionValue $id end] for {set i $start} {$i <= $end} {incr i} { set varName [_scopedName [::guib::arrayInstance ${dimName}($i)]] lappend _allVar $varName } } "table" { set tableName [$obj getOptionValue $id variable] #set tableIdent [$obj getOptionValue $id ident] #set tableWid [getWidgetFromVarident $tableIdent] #set rows [$tableWid cget -rows] #set cols [$tableWid cget -cols] set rows [$obj getOptionValue $id rows] set cols [$obj getOptionValue $id cols] for {set ir 1} {$ir <= $rows} {incr ir} { for {set ic 1} {$ic <= $cols} {incr ic} { set varName [_scopedName [::guib::arrayInstance ${tableName}($ir,$ic)]] lappend _allVar $varName } } } } } # end of switch } } } # optionSetDefault -- set dafule value for a given option itcl::body ::guib::moduleObj::optionSetDefault {key option defaultValue} { ::tclu::DEBUG options: [array get options] if { ! [info exists options($key)] } { ::tclu::ERROR "either unknown keyword \"$key\", or keyword \"$key\" does not have adjustable options" } regsub -- ^- $option {} option foreach _option $options($key) { foreach {_opt _defVal _text} $_option { if { [regsub -- .arg$ $_opt {} opt] && [string equal $opt $option] } { lappend optlist [list $_opt $defaultValue $_text] } else { lappend optlist [list $_opt $_defVal $_text] } } } set options($key) $optlist ::tclu::DEBUG options: $options($key) } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/aindex0000755000077300007730000000060112341332511021116 0ustar giannozzgiannozz#!/bin/sh # \ exec tclsh $0 package require Itcl namespace import -force itcl::* puts "\n Creating the tclIndex file ..." if { [glob -nocomplain -- *.itcl] != {} } { auto_mkindex [pwd] *.itcl puts " tclIndex file created !!!" puts " Size of tclIndex file: [exec wc tclIndex]" } else { puts "\n Can't create tclIndex file: no *.itcl files found !!!" } puts " DONE.\n" exit espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/keywidgets.itcl0000644000077300007730000005175512341332511022774 0ustar giannozzgiannozz# $RCSfile: keywidgets.itcl,v $ -- # # # This file contains the keywidgets. The keywidgets are kind of # meta-widgets. Well, they are not really widgets, but keywidget # prepares everything for a given keyword-item to be displayed as a # requested widget. A requested widget is then constructed from a call # withing a given kewidget. # # We have the following keywidgets: # # ::guib::keywidgets::Var -- keywidget for "var" keyword # ::guib::keywidgets::Dimension -- keywidget for "dimension" keyword # ::guib::keywidgets::Table -- keywidget for "table" keyword (see file: table.itcl) # ... # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: keywidgets.itcl,v 1.5 2008-05-08 18:44:37 kokalj Exp $ # # ------------------------------------------------------------------------ # TODO: # ------------------------------------------------------------------------ # 1. method getWidpathWidtype {} { # return $listWidpathWidtype # } # # method getVaridentWidpath {} { # return $listVarWidpath # } # # instead of this I should make three lists: listVar, listWidpath, listWidtype, and # corresponding methods # # 2. in ::guib::keywidgets::Options I have the following declaration # protected variable keywidget # protected variable listWidpathWidtype {} # protected variable listVarWidpath {} # protected variable _moduleObj # # this is not very nice as only one starts with _, while the others don't # ------------------------------------------------------------------------ #****h* ::guib/keywidgets # FUNCTION # The keywidgets module is used for managing the keywidgets. The # keywidgets are kind of meta-widgets. Well, they are not really # widgets, but keywidget prepares everything for a given keyword-item # to be displayed as a requested widget. A requested widget is then # constructed from a call withing a given kewidget. # # We have the following keywidgets: # # ::guib::keywidgets::Var -- keywidget for "var" keyword # ::guib::keywidgets::Dimension -- keywidget for "dimension" keyword # ::guib::keywidgets::Table -- keywidget for "table" keyword (see file: table.itcl) # ... #**** # ------------------------------------------------------------------------ namespace eval ::guib::keywidgets {} # ------------------------------------------------------------------------ #****c* keywidgets/Options # NAME # ::guib::keywidgets::Options -- a class for managing the options of keywidgets # PURPOSE # This class is a base class used by the ::guib::keywidgets::* # classes. Its function is the management of keywidgets options. # # METHODS # 1. PUBLIC METHODS # childsite -- returns the child-site widget path of a given keywidget # getWidpathWidtype -- # getVaridentWidpath -- # # 2. PROTECTED/PRIVATE METHODS # postConfigure -- configures the keywidgets options posteriory #**** # ------------------------------------------------------------------------ itcl::class ::guib::keywidgets::Options { inherit ::itk::Widget itk_option define -state state State normal # Var and Dimension's options itk_option define -varname varname Varname {}; #OK itk_option define -varident varident Varident {}; #OK itk_option define -text text Text {}; #OK itk_option define -label label Label {}; #OK itk_option define -value value Value {} itk_option define -textvalue textvalue Textvalue {} itk_option define -default default Default {}; #OK itk_option define -fmt fmt Fmt {} itk_option define -validate validate Validate {} itk_option define -infmt infmt Infmt {} itk_option define -outfmt outfmt Outfmt {} itk_option define -widget widget Widget entry; #OK itk_option define -helptext helptext Helptext {}; #OK itk_option define -helpfmt helpfmt Helpfmt {}; #TODO itk_option define -vartype vartype Vartype {} # Dimension's only options itk_option define -noframe noframe Noframe 0 itk_option define -start start Start 0 itk_option define -end end End 0 itk_option define -pack pack Pack top protected variable keywidget protected variable listWidpathWidtype {} protected variable listVarWidpath {} protected variable _moduleObj constructor {args} { eval itk_initialize $args } # # PUBLIC METHODS # public method childsite {} { return $itk_interior } public method getWidpathWidtype {} { return $listWidpathWidtype } public method getVaridentWidpath {} { return $listVarWidpath } # # PROTECTED METHOD # protected method postConfigure {} { set ind 0 foreach elem $listWidpathWidtype { set path [lindex $elem 0] set type [lindex $elem 1] #puts " postConfigure.type/path: $type / $path" switch -exact -- $keywidget { var - dimension { set validate $itk_option(-validate) set textvalue $itk_option(-textvalue) if { $textvalue == {} } { set textvalue $itk_option(-value) } } default { ::tclu::ERROR "key \"$keywidget\" is not supported" } } #if { $validate == "" } { # set validate {return 1} #} switch -exact -- $type { entry - spinint - entryfileselect - entryfileselectquote - entrydirselect - entrydirselectquote { if { $validate != "" } { $path configure -validate $validate } } combobox { $path configure -editable false foreach item $textvalue { $path insert list end $item } } optionmenu - radiobox { foreach item $textvalue { $path insert end $item } } scale { # do nothing ... } default { # check for entrybutton set wid [lindex $type 0] if { $wid != "entrybutton" } { ::tclu::ERROR "widget-type \"$type\" is not supported" } } } incr ind } } } # ------------------------------------------------------------------------ # custom Mega-Widget associated associated with the "var" guib keyword # ------------------------------------------------------------------------ itk::usual ::guib::keywidgets::Var { keep \ -state \ -varname \ -varident \ -text \ -label \ -value \ -textvalue \ -default \ -fmt \ -validate \ -infmt \ -outfmt \ -widget \ -helptext \ -helpfmt ignore \ -noframe \ -start \ -end \ -pack } # ------------------------------------------------------------------------ #****f* keywidgets/auxilvar # NAME # ::guib::keywidgets::auxilvar -- the "auxilvar" keywidget # USAGE # auxilvar pathName ?-option value? ?-option value? ?...? # RETURN VALUE # The pathName of the auxilvar widget. # SOURCE proc ::guib::keywidgets::auxilvar {pathName moduleObj args} { uplevel ::guib::keywidgets::Var $pathName $moduleObj $args } #**** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****f* keywidgets/var # NAME # ::guib::keywidgets::var -- the "var" keywidget # USAGE # var pathName ?-option value? ?-option value? ?...? # RETURN VALUE # The pathName of the var widget. # SOURCE proc ::guib::keywidgets::var {pathName moduleObj args} { uplevel ::guib::keywidgets::Var $pathName $moduleObj $args } #**** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****c* keywidgets/Var # NAME # ::guib::keywidgets::Var -- a class for managing keywidget associated with "var" GUIB keyword # METHODS # ...insert... #**** # ------------------------------------------------------------------------ itcl::class ::guib::keywidgets::Var { inherit ::guib::keywidgets::Options constructor {moduleObj args} { set keywidget var set _moduleObj $moduleObj # -------------------------------------------------- # CAPTION widget holding the value of the -text option # itk_component add caption { message $itk_interior.caption -relief solid -bd 1 \ -background White -anchor w \ -aspect [expr int(2 * [string length $itk_option(-text)])] } { #keep -text rename -background -captionbackground captionBackground Background } bind $itk_component(caption) {::guib::widgets::messageAspect %W} #-------------------------------------------------- eval itk_initialize $args ::tclu::DEBUG var: varident -- $itk_option(-varident) ::tclu::DEBUG var: varname -- $itk_option(-varname) if { $itk_option(-helptext) == "" } { set helpCmd {} } else { set helpCmd [list ::guib::widgets::displayhelp $itk_option(-varname) \ $itk_option(-vartype) $itk_option(-helpfmt) $itk_option(-helptext)] } $_moduleObj varset $itk_option(-varident) -textvalue $itk_option(-default) # # VARIABLE widget # set wid [lindex $itk_option(-widget) 0] set txt [lindex $itk_option(-widget) 1] set cmd [lindex $itk_option(-widget) 2] set textVar [$_moduleObj varref $itk_option(-varident)] if { $wid != "entrybutton" } { itk_component add var { ::guib::widgets::${wid}help $itk_interior.var \ -labeltext $itk_option(-label) \ -textvariable $textVar \ -helpcommand $helpCmd } { keep -textvariable } } else { # entrybutton if { [llength $itk_option(-widget)] != 3 } { ::tclu::ERROR "expected \"entrybutton buttontext buttoncommand\" elements, but got: $itk_option(-widget)\"" } itk_component add var { ::guib::widgets::${wid}help $itk_interior.var \ -labeltext $itk_option(-label) \ -textvariable $textVar \ -helpcommand $helpCmd \ -buttontext $txt \ -buttoncommand [list eval $cmd] } { keep -textvariable } } pack $itk_component(var) -side top -fill x # register the widget for the "getWidpathWidtype" method lappend listWidpathWidtype [list $itk_component(var) $itk_option(-widget)] lappend listVarWidpath [list $itk_option(-varident) $itk_component(var)] # # post-configuration (i.e. -validate options for entryfields, and # item insertion for comboboxes and optionmenus # postConfigure } } # ------------------------------------------------------------------------ # custom Mega-Widget associated with the "dimension" guib keyword # ------------------------------------------------------------------------ itk::usual Dimension { keep \ -state \ -varname \ -varident \ -text \ -label \ -value \ -textvalue \ -default \ -fmt \ -validate \ -infmt \ -outfmt \ -widget \ -helptext \ -helpfmt \ -noframe \ -start \ -end \ -pack } # ------------------------------------------------------------------------ #****f* keywidgets/dimension # NAME # ::guib::keywidgets::dimension -- the "dimension" keywidget # USAGE # dimension pathName ?-option value? ?-option value? ?...? # RETURN VALUE # The pathName of the dimension widget. # SOURCE proc ::guib::keywidgets::dimension {pathName moduleObj args} { uplevel ::guib::keywidgets::Dimension $pathName $moduleObj $args } #**** # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ #****c* keywidgets/Dimension # NAME # ::guib::keywidgets::Dimension -- a class for managing keywidget associated with "dimension" GUIB keyword # METHODS # ...insert... #**** # ------------------------------------------------------------------------ itcl::class ::guib::keywidgets::Dimension { inherit ::guib::keywidgets::Options # Dimension's only options itk_option define -noframe noframe Noframe 0 itk_option define -start start Start 0 itk_option define -end end End 0 itk_option define -pack pack Pack top # _dim is the dimension holding the following elements: _dim(start) _dim(end) # private variable _dim private variable _child private variable _helpCmd private method _manageDims {} constructor {moduleObj args} { set keywidget dimension set _moduleObj $moduleObj eval itk_initialize $args if { $itk_option(-helptext) == "" } { set _helpCmd {} } else { set _helpCmd [list ::guib::widgets::displayhelp $itk_option(-varname) \ $itk_option(-vartype) $itk_option(-helpfmt) $itk_option(-helptext)] } # # Display the LABELED-FRAME which will hold the whole dimension # switch -exact -- $itk_option(-noframe) { 1 - yes - true { itk_component add dimFrame { frame $itk_interior.dimFrame -relief flat -borderwidth 0 -class Background } { # } set _child $itk_interior.dimFrame } 0 - no - false - {} { itk_component add dimFrame { iwidgets::labeledframe $itk_interior.dimFrame -labeltext $itk_option(-label) -labelpos nw } { # } set _child [$itk_component(dimFrame) childsite] } default { ::tclu::ERROR "invalid value \"$noframe\" for -noframe option, should be one of: 1, yes, true, 0, no, false, or {}" } } pack $itk_component(dimFrame) -side top -fill x # # Display the CAPTION widget holding the value of the -text option # itk_component add caption { message $_child.caption \ -text $itk_option(-text) -relief solid -bd 1 \ -background White -anchor w \ -aspect [expr int(2 * [string length $itk_option(-text)])] } { rename -background -captionbackground captionBackground Background } if { $itk_option(-text) != {} } { pack $itk_component(caption) -side top -fill x -padx 3 -pady 2 } bind $itk_component(caption) {::guib::widgets::messageAspect %W} set _dim(start) $itk_option(-start) set _dim(end) $itk_option(-end) # # Display the necessary widgets for the DIMENSION # _manageDims } } itcl::body ::guib::keywidgets::Dimension::_manageDims {} { if { (! [info exists _child]) || \ $itk_option(-start) == "" || $itk_option(-end) == ""} { return } # RECIPE: delete the old ones; create the new ones for {set idim $_dim(start)} {$idim <= $_dim(end)} {incr idim} { if { [info exists itk_component(dim$idim) ] } { if { [winfo exists $itk_component(dim$idim) ] } { destroy $itk_component(dim$idim) } } } set listWidpathWidtype "" set listVarWidpath "" # for entrybutton we have: {entrybutton buttontext buttoncmd} set wid [lindex $itk_option(-widget) 0] set txt [lindex $itk_option(-widget) 1] set cmd [lindex $itk_option(-widget) 2] #/ for {set idim $itk_option(-start); set icount 0} {$idim <= $itk_option(-end)} {incr idim; incr icount} { set var $itk_option(-varident) set name $itk_option(-varname) set path $_child.dim$idim set labelText ${name}($idim) set textVar [$_moduleObj dimref $var $idim] #if { ! [info exists ::guib::moduleObj::guibVar($_moduleObj,$var)] } { # set ::guib::moduleObj::guibVar($_moduleObj,$var) $itk_option(-default) #} #t.k. # INCOMING: SYNTAX of -default for the dimension: # -default { elem1-default elem2-default elem3-default ... } if { ! [info exists $textVar] } { set default [lindex $itk_option(-default) $icount] if { $default == "" } { set default [lindex $itk_option(-default) end] } $_moduleObj dimset $var $idim -textvalue $default } #/ if { $wid != "entrybutton" } { itk_component add dim$idim { ::guib::widgets::${wid}help $path \ -labeltext "${labelText}:" \ -textvariable $textVar \ -helpcommand $_helpCmd } { keep -textvariable } } else { # entrybutton if { [llength $itk_option(-widget)] != 3 } { ::tclu::ERROR "expected \"entrybutton buttontext buttoncommand\" elements, but got: $itk_option(-widget)\"" } itk_component add dim$idim { ::guib::widgets::${wid}help $path \ -labeltext "${labelText}:" \ -textvariable $textVar \ -helpcommand $_helpCmd \ -buttontext $txt \ -buttoncommand [list eval $cmd $idim] } { keep -textvariable } } pack $path -side $itk_option(-pack) -fill x -padx 3 -pady 2 lappend listWidpathWidtype [list $path $itk_option(-widget)] lappend listVarWidpath [list ${var}($idim) $path] } # # post-configuration (i.e. -validate option) for entryfields, and # item insertion for comboboxes and optionmenus # postConfigure set _dim(start) $itk_option(-start) set _dim(end) $itk_option(-end) } itcl::configbody ::guib::keywidgets::Options::state { switch -exact -- $itk_option(-state) { active - normal { ::tku::enableAll $itk_interior if { $keywidget == "dimension" } { # one should check if some of the dim(x) is on # disabled list and should not enable it, and since it # was enabled above, we should disable it for {set idim $itk_option(-start)} {$idim <= $itk_option(-end)} {incr idim} { set widget [lindex [lindex $listWidpathWidtype [expr $idim - $itk_option(-start)]] 0] if { ! [$_moduleObj isNotDisabledWidget $widget] } { catch "$widget configure -state disabled" } } } } disabled { ::tku::disableAll $itk_interior } default { error "wrong widget state \"$itk_option(-state)\", should be normal or disabled" } } } # ------------------------------------------------------------------------ # CONFIGBODY -text # # -text options is used for displaying a text in the $itk_component(caption) # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Options::text { if { [info exists itk_component(caption)] } { if { $itk_option(-text) != "" } { $itk_component(caption) configure -text $itk_option(-text) if { ! [winfo viewable $itk_component(caption)] } { pack $itk_component(caption) -side top -fill x -padx 3 -pady 2 } } else { pack forget $itk_component(caption) } } } # ------------------------------------------------------------------------ # CONFIGBODY -label # # -label option is used for displaying a label on the left side of entry/optionmenu/... # ------------------------------------------------------------------------ itcl::configbody ::guib::keywidgets::Options::label { if { $keywidget == "var" } { if { [info exists itk_component(var)] } { $itk_component(var) configure -labeltext $itk_option(-label) } } elseif { $keywidget == "dimension" } { if { [info exists itk_component(dimFrame)] } { $itk_component(dimFrame) configure -labeltext "Dimension: $itk_option(-label)" } } else { ::tclu::ERROR "keywidget \"$keywidget\" not yet supported" } } itcl::configbody ::guib::keywidgets::Options::value { # check if itk_option(-textvalue) exists, if not one should replace # the current "values" of the optionmenu/radiobox/combobox with the new values ... } itcl::configbody ::guib::keywidgets::Options::textvalue { # replace the current "values" of the optionmenu/radiobox/combobox # with the new values ... } itcl::configbody ::guib::keywidgets::Options::default { # do nothing, since option -default is meant only at the beginning, # before user sets any value } itcl::configbody ::guib::keywidgets::Options::validate { #TODO } itcl::configbody ::guib::keywidgets::Options::infmt { # nothing to do } itcl::configbody ::guib::keywidgets::Options::outfmt { # nothing to do } itcl::configbody ::guib::keywidgets::Options::widget { # changing the widget-type after it was created is not allowed } itcl::configbody ::guib::keywidgets::Options::helptext { # TODO } itcl::configbody ::guib::keywidgets::Options::helpfmt { # probably this is not allowed, as the textformat determines the # help-display widget type } itcl::configbody ::guib::keywidgets::Dimension::noframe { # not allowed to change; do nothing } itcl::configbody ::guib::keywidgets::Dimension::start { # TODO if { $keywidget == "dimension" } { ::guib::keywidgets::Dimension::_manageDims } else { # TODO } } itcl::configbody ::guib::keywidgets::Dimension::end { # TODO if { $keywidget == "dimension" } { ::guib::keywidgets::Dimension::_manageDims } else { # TODO } } itcl::configbody ::guib::keywidgets::Dimension::pack { # think about this: is this a good idea or should it be forbidden ??? } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/radioboxhelp.itcl0000644000077300007730000001741712341332511023272 0ustar giannozzgiannozz# # $RCSfile: radioboxhelp.itcl,v $ -- # # This file contains the "radioboxhelp megawidget implementation. # # Copyright (c) 2003--2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: radioboxhelp.itcl,v 1.4 2010-05-05 09:29:21 kokalj Exp $ # # # Use option database to override default resources of base classes. # option add *Radioboxhelp.labelMargin 10 widgetDefault option add *Radioboxhelp.labelPos wn widgetDefault option add *Radioboxhelp.borderWidth 0 widgetDefault option add *Radioboxhelp.relief flat widgetDefault option add *Radioboxhelp.selectColor White widgetDefault # ------------------------------------------------------------------------ # USUAL options. # ------------------------------------------------------------------------ itk::usual ::guib::widgets::Radioboxhelp { keep -background -borderwidth -cursor -disabledforeground \ -foreground -labelfont -font -selectcolor } # ------------------------------------------------------------------ # RADIOBOXHELP # ------------------------------------------------------------------ #****f* widgets/radioboxhelp # NAME # ::guib::widgets::radioboxhelp -- radioboxhelp megawidget # USAGE # radioboxhelp pathName ?option value? ?...? # DESCRIPTION # radioboxhelp = radiobox + help-button # OPTIONS # Special OPTIONS # -textvariable # -textvalues # -state # -width # -borderwidth # -highlightthickness # -helpcommand -- command for the help button # -helppadx -- "padx" for the help button # -helppady -- "pady" for the help button # METHODS # Widget METHODS # (see Radioboxhelp documentation) # RETURN VALUE # Returns the path of the radioboxhelp, i.e., pathName. #******** # ------------------------------------------------------------------------ proc ::guib::widgets::radioboxhelp {pathName args} { uplevel ::guib::widgets::Radioboxhelp $pathName $args } # ------------------------------------------------------------------------ #****c* widgets/Radioboxhelp # NAME # ::guib::widgets::Radioboxhelp -- a class for radioboxhelp megawidget # METHODS # Public METHODS # insert # selected #**** # ------------------------------------------------------------------------ itcl::class ::guib::widgets::Radioboxhelp { inherit iwidgets::Labeledwidget protected variable _textvariable private variable _items private variable _rb 0 constructor {args} {} destructor {} # define methods ... public method insert {index string args} #public method invoke {} public method selected {} private method _additems {items} protected method _selectitem {} protected method _traceTextvariable {name1 name2 op} itk_option define -textvariable textvariable TextVariable _textvariable itk_option define -textvalues textvalues Textvalues {} itk_option define -state state State normal itk_option define -width width Width 0 itk_option define -borderwidth borderWidth BorderWidth 2 itk_option define -highlightthickness highlightThickness HighlightThickness 1 eval $::guib::widgets::def(helpCommand) } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body ::guib::widgets::Radioboxhelp::constructor {args} { global tcl_platform #component hull configure -highlightthickness 0 itk_component add radioFrame { frame $itk_interior.radioFrame -bd 0 -relief flat } { keep -background } itk_component add help { #frame $itk_interior.hf -bd 0 -relief flat -highlightthickness 0 #pack $itk_interior.hf -side left -fill both -padx 0 -pady 0 button $itk_interior.help } { usual eval $::guib::widgets::def(helpOptions) } pack $itk_component(radioFrame) -side left -fill x -expand 1 # # Initialize the widget based on the command line options. # eval itk_initialize $args pack $itk_component(help) -side top \ -padx $itk_option(-helppadx) -pady $itk_option(-helppady) if { $itk_option(-textvariable) != {} } { upvar $itk_option(-textvariable) textvarValue set _textvariable $textvarValue } } # ------------------------------------------------------------------ # METHOD: insert index string ?string? # # Insert an item in the radiobox. # ------------------------------------------------------------------ itcl::body ::guib::widgets::Radioboxhelp::insert {index string args} { set args [linsert $args 0 $string] _additems $args return "" } itcl::body ::guib::widgets::Radioboxhelp::selected {} { return $_textvariable } #body ::guib::widgets::Radioboxhelp::invoke {} { # if { $itk_option(-textvariable) != {} } { # for {set i 1} {$i <= $_rb} {incr i} { # ::tclu::DEBUG invoke ----> [$itk_component(rb$_rb) cget -value] == $_textvariable # if { [$itk_component(rb$_rb) cget -value] == $_textvariable } { # $itk_component(rb$_rb) invoke # } # } # } # return $_textvariable #} itcl::body ::guib::widgets::Radioboxhelp::_additems {items} { foreach item $items { incr _rb itk_component add rb$_rb { radiobutton $itk_component(radioFrame).rb$_rb -highlightthickness 0 \ -variable $itk_option(-textvariable) \ -anchor w \ -justify left \ -value $item \ -text $item \ -command [code $this _selectitem] } { usual ignore -highlightthickness -highlightcolor rename -font -labelfont labelFont Font } pack $itk_component(rb$_rb) -side top -fill x -expand 1 } return "" } itcl::body ::guib::widgets::Radioboxhelp::_selectitem {} { set $itk_option(-textvariable) $_textvariable return $_textvariable } itcl::body ::guib::widgets::Radioboxhelp::_traceTextvariable {name1 name2 op} { upvar $itk_option(-textvariable) textVarname trace vdelete $itk_option(-textvariable) w [code $this _traceTextvariable] set _textvariable $textVarname trace variable $itk_option(-textvariable) w [code $this _traceTextvariable] } itcl::configbody ::guib::widgets::Radioboxhelp::textvariable { trace variable $itk_option(-textvariable) w [code $this _traceTextvariable] } itcl::configbody ::guib::widgets::Radioboxhelp::textvalues { # by this option we delete the previous radiobuttons and add # new one ... set comps [component] foreach comp $comps { if { [string match rb* $comp] } { itk_component delete $comp } } set _rb 0 # check if $_textvariable has allowed value #if { [lsearch -exact $itk_option(-textvalues) $itk_option(-textvariable)] < 0 } { # # value is not allowed # set _textvariable "" # $this _selectitem #} _additems $itk_option(-textvalues) } itcl::configbody ::guib::widgets::Radioboxhelp::state { switch -exact -- $itk_option(-state) { active - normal { ::tku::enableAll $itk_component(label) ::tku::enableAll $itk_component(radioFrame) } disabled { ::tku::disableAll $itk_component(label) ::tku::disableAll $itk_component(radioFrame) } default { error "wrong value of -state option \"$itk_option(-state)\", should be normal, active, or disabled" } } } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/src/guibUtils.itcl0000644000077300007730000001022312341332511022545 0ustar giannozzgiannozz# # $RCSfile: guibUtils.itcl,v $ -- # # This file contains a few utility procs for Guib. # # Copyright (c) 2005 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: guibUtils.itcl,v 1.1 2005-09-26 11:44:41 kokalj Exp $ # # ------------------------------------------------------------------------ #****f* guib/properArrayName # NAME # ::guib::properArrayName -- get a proper name for array variable # USAGE # properArrayName $varName $elemName $index # RETURN VALUE # The proper name for array variable. For example: # # properArrayName myVar blue 1,2 # # will return \"myVar(blue,1,2)\", while: # # properArrayName myVar {} 1,2 # # will return \"myVar(1,2)\". #******** # ------------------------------------------------------------------------ proc ::guib::properArrayName {varName elemName index} { if {$elemName != "" } { set var ${varName}($elemName,$index) } else { set var ${varName}($index) } } # ------------------------------------------------------------------------ #****f* guib/arrayInstance # NAME # ::guib::arrayInstance -- get a proper name of array instance # USAGE # arrayInstance $string # RETURN VALUE # If the string is for example blue(1)(2), then this will # be transformed to blue(1,2). # EXAMPLE # set a [arrayInstance blue(1)(2)] #******** # ------------------------------------------------------------------------ proc ::guib::arrayInstance {string} { regsub -all -- {\)\(} $string {,} arrayInstance return $arrayInstance } # ------------------------------------------------------------------------ #****f* guib/arrayName # NAME # ::guib::arrayName -- get the name of array from the full array instance string # USAGE # arrayName $arrayInstance # RETURN VALUE # The name of array, for example, from the \"myVar(elem)\" the # \"myVar\" string will be returned # EXAMPLE # set name [arrayName myArray(elem)] #******** # ------------------------------------------------------------------------ proc ::guib::arrayName {arrayInstance} { set ind [string first \( $arrayInstance] if { $ind > -1 } { # we have array return [string range $arrayInstance 0 [expr $ind - 1]] } # its normal variable name return $arrayInstance } # ------------------------------------------------------------------------ #****f* guib/elemName # NAME # ::guib::elemName -- get the name of array element from the full array instance string # USAGE # elemName $arrayInstance # RETURN VALUE # The name of array element, if $arrayInstance is a normal # variable-name an empty string is returned. # EXAMPLE # set a3 [comafy a(3)] #******** # ------------------------------------------------------------------------ proc ::guib::elemName {arrayInstance} { set ind [string first \( $arrayInstance] if { $ind > -1 } { # we have array set end [string length $arrayInstance] return [string range $arrayInstance [expr $ind + 1] [expr $end - 2]] } # its normal variable, return empty string return "" } # ------------------------------------------------------------------------ #****f* guib/comafy # NAME # ::guib::comafy -- tranforms the strings of type a(1) to a,1 # USAGE # comafy $var # RETURN VALUE # The transformed string, i.e. a(1) is transformed to a,1 # EXAMPLE # set a3 [comafy a(3)] #******** # ------------------------------------------------------------------------ proc ::guib::comafy {var} { set var [string trimright $var ")"] regsub -all -- {\(} $var {,} newvar return $newvar } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/COPYING0000644000077300007730000004311012341332511020166 0ustar giannozzgiannozz GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/NEWS0000644000077300007730000000216312341332511017635 0ustar giannozzgiannozzVersion: 0.4 * adding -optionalcols option to "table" Guib keyword: for example, -optionalcols 3, means that columns from 3 to the end are optional * enhancing the table widget * adding forget&create states to groupwidget * improving a bit the parsing error-reporting * many bug fixes * GUIB enviromental variable is not mandatory anymore Version: 0.3.2 * binary validator is added Version: 0.3.1 * slight improvement of guib::GUI class Version: 0.3.0 * a "scriptvar" Guib keyword was added, which can be used inside module definition files. "scriptvar" is a variable which is not related to the input syntax, hence it has no associated widget, but the rest is the same as with "var", for example, event (tracing) mechanism, ... Version: 0.2.3 * further improved syntax-error handling mechanism for reading corrupted input file. Version: 0.2.2 * improved syntax-error handling mechanism for reading the input file. Version: 0.2.1 * addapting the package to work with Tcl/Tk8.4, Itcl/Itk 3.2, and Iwidgets 4.0 * porting the package to MS-Windows Version: 0.2.0 * table widget has a help component * beginning of the NEW fileespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/BUGS0000644000077300007730000000004512341332511017616 0ustar giannozzgiannozzBUGS -- known bugs. BUGS ends here.espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/COPYRIGHT0000644000077300007730000000167612341332511020441 0ustar giannozzgiannozz ============================================================================== * * * GUIB Copyright / License Information * * * ============================================================================== Copyright (C) 2003--2004 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. 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. espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/INSTALL0000644000077300007730000000376012341332511020173 0ustar giannozzgiannozz ============================================================================== * * * INSTALLATION instructions for GUIB * * * ============================================================================== Because GUIB is written in [incr Tcl]---an extension of Tcl scripting language----no compilation is needed. *** HOWEVER *** the package depends on the [incr Tcl] and related software (see SOFTWARE REQUIREMENTS section below). VERY SHORT INSTALLATION INSTRUCTIONS: ------------------------------------- 1. untar the GUIB archive, 2. define the GUIB environmental variable, A BIT LONGER INSTALLATION INSTRUCTIONS: --------------------------------------- To install the GUIB package do the following: 1.) untar the *.tgz archive. use one of the following: gunzip -c guib.tgz | tar xvf - or gunzip guib.tgz; tar xvf guib.tar or tar zxvf guib.tgz (for GNU tar program only) 2.) define the GUIB environmental variable to point to the package root directory * for Bourne compatible shells: GUIB=/guib/root/dir; export GUIB * for Csh compatible shells: setenv GUIB /guib/root/dir SOFTWARE REQUIREMENTS FOR SOURCE PACKAGE ---------------------------------------- The GUIB package depends on the following Tcl-related software: Tcl + Tk >= 8.3 Itcl + Itk >= 3.1 Iwidgets >= 3.0 The Itcl, Itk, and Iwidgets stand for: [incr Tcl], [incr Tk], and [incr Widgets]. All these packages are usually already present on modern Linux distributions, otherwise their RPMs (DEBs) can be easily found on the WEB. See for example: http://incrtcl.sourceforge.net/ Troubleshooting *************** For some RedHat distributions the "itkwish" package used to be broken, while for some Debian distributions the "guib" used to crash if it was called with "wish" package. If you experience such kind of troubles then replace the call to "wish" ("itkwish") with "itkwish" ("wish") in file "guib". -- Anton Kokalj (tone.kokalj@ijs.si), Tue Feb 17 12:27:54 CET 2004 espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/init.tcl0000644000077300007730000001213412341332511020604 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # initialize the ::guib namespace and set the library & version variables # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # load Tcl/Tk + [Incr Tcl]/[Incr Tk]/[Incr Widgets] # ------------------------------------------------------------------------ package require Tk #package require Itcl package require Itk package require Iwidgets # We need to import all of the itcl functions into the global # namespace. namespace import -force itcl::* namespace eval ::guib { namespace export module variable library [file dirname [info script]] variable version [gets [open [file join $library VERSION] r]] variable options variable module variable library # associative-dimension "settings" is used for user-spefic seetings variable settings #------------------------------------------------------------------------ # CONVENTION for settings() array elements: #------------------------------------------------------------------------ # The elements of the settings() array have the following names: # settings(WHAT.details). For example, all elements that are # dealing with filename, have the following names: # settings(FILENAME.*) #------------------------------------------------------------------------ # regular expresion for the for the endlist-string set settings(NAMELIST.end_regexp) {^ &end|^/|^ /} # string to write for the end-of-namelist set settings(NAMELIST.end_string) { &end} # case-sensitivity of namelists variable names (i.e., _nocase like # the "-nocase" tcl-option) set settings(NAMELIST.varname_nocase) 1 # format for printing namelist's variables names set settings(NAMELIST.varname_format) { %15s} # support for undefined namelist variables (0|1) set settings(NAMELIST.variable_support_undefined) 0 # do we quotre the string [charagetr*(*)] type of variables (0|1) set settings(NAMELIST.quote_strings) 1 set settings(NAMELIST.quote_char) ' # case-sensitivity of input (0|1) set settings(INPUT.nocase) 0 #--- # For case-insensitive input ( $settings(INPUT.nocase) == 1 ): # print the keywords as "upper|lower|unchanged" set settings(INPUT.nocase_preference_keyword) upper; # not USED yet # print the variable values as "upper|lower|unchanged" set settings(INPUT.nocase_preference_varvalue) unchanged; # not USED yet #--- # whether to add a trailing slash to dirnames set settings(DIRNAME.trailing_slash) 0 # whether to use only file-tail for filenames set settings(FILENAME.only_tail) 0 # ------------------------------------------------------------------------ # IMAGES # ------------------------------------------------------------------------ # create toolbar images ... image create photo filenew -format gif \ -file [file join $env(GUIB) images filenew2.gif] image create photo fileopen -format gif \ -file [file join $env(GUIB) images fileopen2.gif] image create photo filesave -format gif \ -file [file join $env(GUIB) images filesave2.gif] image create photo filesaveas -format gif \ -file [file join $env(GUIB) images filesaveas2.gif] image create photo fileclose -format gif \ -file [file join $env(GUIB) images fileclose2.gif] image create photo exitApp -format gif \ -file [file join $env(GUIB) images exit2.gif] } # ------------------------------------------------------------------------ # load TclLib: # we only need the cmdline package of TclLib # ------------------------------------------------------------------------ lappend auto_path [file join $guib::library external lib] package require cmdline 1.2 #------------------------------------------------------------------------ # load TCLU & TKU library #------------------------------------------------------------------------ lappend auto_path [file join $guib::library lib] package require tclu package require tku #------------------------------------------------------------------------ # load GUIB #------------------------------------------------------------------------ lappend auto_path [file join $guib::library src] # ------------------------------------------------------------------------ # provide package GUIB # ------------------------------------------------------------------------ package provide Guib $guib::version namespace eval ::guib { # we should source the file guib-keywords-def.tcl in order to load # the definiton of GUIB keywords options source [file join $library src guib-keywords-def.tcl] # we should source the file widgets.itcl in order to load the # definiton of ::guib::widgets namespace variables !!! source [file join $library src widgets.itcl] source [file join $library src keywidgets.itcl] #source [file join $library src keywordObj.itcl] #source [file join $library src moduleObj.itcl] } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/AUTHORS0000644000077300007730000000015512341332511020205 0ustar giannozzgiannozzAuthors of GUIB. Anton Kokalj Also see files ChangeLog and THANKS. AUTHORS ends hereespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/README0000644000077300007730000000653112341332511020021 0ustar giannozzgiannozz ============================================================================== * * * README file for GUIB * * * ============================================================================== This is the GUIB software. The name "GUIB" stands for Graphical User Interface Builder. Unfortunately, the name is misleading. The GUIB is NOT a general-purpose Graphical User Interface Builder. THE GUIB IS A UTILITY LIBRARY THAT FACILITATE THE CREATION OF GRAPHICAL-USER-INTERFACES (GUI) AIMED AT CREATING AND MANIPULATING INPUT FILES FOR NUMERICAL SIMULATION PROGRAMS. The idea behind the GUIB project is to construct a special meta-language with two purposes: (i) define the syntax of the input file of a given numerical program (ii) provide simultaneously automatic construction of the GUI on the basis of this definition. This is achieved by providing a definition file which defines the two entities (input syntax and the GUI). In the following text the term input file stands for an input file of a given numerical program, while the term definition file is a file that describes the syntax of the input file. For an example of how to construct a simple GUI see: http://www-k3.ijs.si/kokalj/guib/description.html. For further description see the GUIB web-page: http://www-k3.ijs.si/kokalj/guib/ Directory structure of GUIB: lib/ auxiliary Tcl/Tk routines, i.e., tclUtils.tcl, tkUtils.tcl doc/ programming documentation generated from source-code examples/ a few examples (definition files: *.tcl; input files: *.inp) external/ external cmdline package (from Tcllib library) images/ some icons src/ GUIB source code directory Description of some src/ files: moduleObj.itcl implementation of moduleObj class keywordObj.itcl implementation of keywordObj class guibKeywords.itcl implementation of all GUIB keywords build.itcl build Tk-based GUI defined by module definition file open.itcl open an input file save.itcl save edited input file gui.itcl application GUI: procs for "simple-GUI" and implementation of more elaborate GUI class guib-keywords-def.tcl definition of options of GUIB-keywords COPYING ------- The GUIB is covered by the GNU General Public License. Note that the GUIB uses also the cmdline package from Tcllib library. The source code of cmdline is included verbatim. The Tcllib is covered by other free software license, see file external/lib/cmdline/license.terms. For the material included in the directory images/ see the file images/icons.license. All the material included in this distribution 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. These programs are distributed in the hope that they 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., 675 Mass Ave, Cambridge, MA 02139, USA. -- Anton Kokalj (tone.kokalj@ijs.si), Tue Feb 17 12:52:58 CET 2004espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/guib.tcl0000644000077300007730000000301012341332511020560 0ustar giannozzgiannozz# # $RCSfile: guib.tcl,v $ -- # # This is the main application file, i.e., might be called as # "wish guib.itcl". # # Copyright (c) 2003 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: guib.tcl,v 1.3 2008-02-15 16:50:18 kokalj Exp $ # if { [info exists env(GUIB)] } { lappend auto_path [file join $env(GUIB)] } else { puts stderr " " puts stderr " Please define the GUIB enviromental variable !!!" puts stderr " GUIB should point to the package root directory." puts stderr " " exit } package require Guib wm withdraw . option readfile [file join $::guib::library guib.theme] startupFile if { $argc < 1 } { puts stderr "" puts stderr "Usage: guib module-file" puts stderr "" exit } set moduleFile [lindex $argv 0] set ::tclu::DEBUG 0 set ::tclu::DEBUG_FILE 0 namespace eval ::guib { simpleTplwGUI $::moduleFile } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/0000755000077300007730000000000012341332543020763 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/lib/0000755000077300007730000000000012341332543021531 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/lib/cmdline/0000755000077300007730000000000012341332543023144 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/lib/cmdline/pkgIndex.tcl0000644000077300007730000000020612341332511025412 0ustar giannozzgiannozzif {![package vsatisfies [package provide Tcl] 8.2]} {return} package ifneeded cmdline 1.3 [list source [file join $dir cmdline.tcl]] espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/lib/cmdline/cmdline.tcl0000644000077300007730000007160612341332511025270 0ustar giannozzgiannozz# cmdline.tcl -- # # This package provides a utility for parsing command line # arguments that are processed by our various applications. # It also includes a utility routine to determine the # application name for use in command line errors. # # Copyright (c) 1998-2000 by Ajuba Solutions. # Copyright (c) 2001-2006 by Andreas Kupries . # Copyright (c) 2003 by David N. Welton # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: cmdline.tcl,v 1.2 2008-02-15 17:01:31 kokalj Exp $ package require Tcl 8.2 package provide cmdline 1.3 namespace eval ::cmdline { namespace export getArgv0 getopt getKnownOpt getfiles getoptions \ getKnownOptions usage } # ::cmdline::getopt -- # # The cmdline::getopt works in a fashion like the standard # C based getopt function. Given an option string and a # pointer to an array or args this command will process the # first argument and return info on how to proceed. # # Arguments: # argvVar Name of the argv list that you # want to process. If options are found the # arg list is modified and the processed arguments # are removed from the start of the list. # optstring A list of command options that the application # will accept. If the option ends in ".arg" the # getopt routine will use the next argument as # an argument to the option. Otherwise the option # is a boolean that is set to 1 if present. # optVar The variable pointed to by optVar # contains the option that was found (without the # leading '-' and without the .arg extension). # valVar Upon success, the variable pointed to by valVar # contains the value for the specified option. # This value comes from the command line for .arg # options, otherwise the value is 1. # If getopt fails, the valVar is filled with an # error message. # # Results: # The getopt function returns 1 if an option was found, 0 if no more # options were found, and -1 if an error occurred. proc ::cmdline::getopt {argvVar optstring optVar valVar} { upvar 1 $argvVar argsList upvar 1 $optVar option upvar 1 $valVar value set result [getKnownOpt argsList $optstring option value] if {$result < 0} { # Collapse unknown-option error into any-other-error result. set result -1 } return $result } # ::cmdline::getKnownOpt -- # # The cmdline::getKnownOpt works in a fashion like the standard # C based getopt function. Given an option string and a # pointer to an array or args this command will process the # first argument and return info on how to proceed. # # Arguments: # argvVar Name of the argv list that you # want to process. If options are found the # arg list is modified and the processed arguments # are removed from the start of the list. Note that # unknown options and the args that follow them are # left in this list. # optstring A list of command options that the application # will accept. If the option ends in ".arg" the # getopt routine will use the next argument as # an argument to the option. Otherwise the option # is a boolean that is set to 1 if present. # optVar The variable pointed to by optVar # contains the option that was found (without the # leading '-' and without the .arg extension). # valVar Upon success, the variable pointed to by valVar # contains the value for the specified option. # This value comes from the command line for .arg # options, otherwise the value is 1. # If getopt fails, the valVar is filled with an # error message. # # Results: # The getKnownOpt function returns 1 if an option was found, # 0 if no more options were found, -1 if an unknown option was # encountered, and -2 if any other error occurred. proc ::cmdline::getKnownOpt {argvVar optstring optVar valVar} { upvar 1 $argvVar argsList upvar 1 $optVar option upvar 1 $valVar value # default settings for a normal return set value "" set option "" set result 0 # check if we're past the end of the args list if {[llength $argsList] != 0} { # if we got -- or an option that doesn't begin with -, return (skipping # the --). otherwise process the option arg. switch -glob -- [set arg [lindex $argsList 0]] { "--" { set argsList [lrange $argsList 1 end] } "-*" { set option [string range $arg 1 end] if {[lsearch -exact $optstring $option] != -1} { # Booleans are set to 1 when present set value 1 set result 1 set argsList [lrange $argsList 1 end] } elseif {[lsearch -exact $optstring "$option.arg"] != -1} { set result 1 set argsList [lrange $argsList 1 end] if {[llength $argsList] != 0} { set value [lindex $argsList 0] set argsList [lrange $argsList 1 end] } else { set value "Option \"$option\" requires an argument" set result -2 } } else { # Unknown option. set value "Illegal option \"-$option\"" set result -1 } } default { # Skip ahead } } } return $result } # ::cmdline::getoptions -- # # Process a set of command line options, filling in defaults # for those not specified. This also generates an error message # that lists the allowed flags if an incorrect flag is specified. # # Arguments: # arglistVar The name of the argument list, typically argv. # We remove all known options and their args from it. # optlist A list-of-lists where each element specifies an option # in the form: # (where flag takes no argument) # flag comment # # (or where flag takes an argument) # flag default comment # # If flag ends in ".arg" then the value is taken from the # command line. Otherwise it is a boolean and appears in # the result if present on the command line. If flag ends # in ".secret", it will not be displayed in the usage. # usage Text to include in the usage display. Defaults to # "options:" # # Results # Name value pairs suitable for using with array set. proc ::cmdline::getoptions {arglistVar optlist {usage options:}} { upvar 1 $arglistVar argv set opts [GetOptionDefaults $optlist result] set argc [llength $argv] while {[set err [getopt argv $opts opt arg]]} { if {$err < 0} { set result(?) "" break } set result($opt) $arg } if {[info exist result(?)] || [info exists result(help)]} { error [usage $optlist $usage] } return [array get result] } # ::cmdline::getKnownOptions -- # # Process a set of command line options, filling in defaults # for those not specified. This ignores unknown flags, but generates # an error message that lists the correct usage if a known option # is used incorrectly. # # Arguments: # arglistVar The name of the argument list, typically argv. This # We remove all known options and their args from it. # optlist A list-of-lists where each element specifies an option # in the form: # flag default comment # If flag ends in ".arg" then the value is taken from the # command line. Otherwise it is a boolean and appears in # the result if present on the command line. If flag ends # in ".secret", it will not be displayed in the usage. # usage Text to include in the usage display. Defaults to # "options:" # # Results # Name value pairs suitable for using with array set. proc ::cmdline::getKnownOptions {arglistVar optlist {usage options:}} { upvar 1 $arglistVar argv set opts [GetOptionDefaults $optlist result] # As we encounter them, keep the unknown options and their # arguments in this list. Before we return from this procedure, # we'll prepend these args to the argList so that the application # doesn't lose them. set unknownOptions [list] set argc [llength $argv] while {[set err [getKnownOpt argv $opts opt arg]]} { if {$err == -1} { # Unknown option. # Skip over any non-option items that follow it. # For now, add them to the list of unknownOptions. lappend unknownOptions [lindex $argv 0] set argv [lrange $argv 1 end] while {([llength $argv] != 0) \ && ![string match "-*" [lindex $argv 0]]} { lappend unknownOptions [lindex $argv 0] set argv [lrange $argv 1 end] } } elseif {$err == -2} { set result(?) "" break } else { set result($opt) $arg } } # Before returning, prepend the any unknown args back onto the # argList so that the application doesn't lose them. set argv [concat $unknownOptions $argv] if {[info exist result(?)] || [info exists result(help)]} { error [usage $optlist $usage] } return [array get result] } # ::cmdline::GetOptionDefaults -- # # This internal procedure processes the option list (that was passed to # the getopt or getKnownOpt procedure). The defaultArray gets an index # for each option in the option list, the value of which is the option's # default value. # # Arguments: # optlist A list-of-lists where each element specifies an option # in the form: # flag default comment # If flag ends in ".arg" then the value is taken from the # command line. Otherwise it is a boolean and appears in # the result if present on the command line. If flag ends # in ".secret", it will not be displayed in the usage. # defaultArrayVar The name of the array in which to put argument defaults. # # Results # Name value pairs suitable for using with array set. proc ::cmdline::GetOptionDefaults {optlist defaultArrayVar} { upvar 1 $defaultArrayVar result set opts {? help} foreach opt $optlist { set name [lindex $opt 0] if {[regsub -- .secret$ $name {} name] == 1} { # Need to hide this from the usage display and getopt } lappend opts $name if {[regsub -- .arg$ $name {} name] == 1} { # Set defaults for those that take values. set default [lindex $opt 1] set result($name) $default } else { # The default for booleans is false set result($name) 0 } } return $opts } # ::cmdline::usage -- # # Generate an error message that lists the allowed flags. # # Arguments: # optlist As for cmdline::getoptions # usage Text to include in the usage display. Defaults to # "options:" # # Results # A formatted usage message proc ::cmdline::usage {optlist {usage {options:}}} { set str "[getArgv0] $usage\n" foreach opt [concat $optlist \ {{help "Print this message"} {? "Print this message"}}] { set name [lindex $opt 0] if {[regsub -- .secret$ $name {} name] == 1} { # Hidden option continue } if {[regsub -- .arg$ $name {} name] == 1} { set default [lindex $opt 1] set comment [lindex $opt 2] append str [format " %-20s %s <%s>\n" "-$name value" \ $comment $default] } else { set comment [lindex $opt 1] append str [format " %-20s %s\n" "-$name" $comment] } } return $str } # ::cmdline::getfiles -- # # Given a list of file arguments from the command line, compute # the set of valid files. On windows, file globbing is performed # on each argument. On Unix, only file existence is tested. If # a file argument produces no valid files, a warning is optionally # generated. # # This code also uses the full path for each file. If not # given it prepends [pwd] to the filename. This ensures that # these files will never conflict with files in our zip file. # # Arguments: # patterns The file patterns specified by the user. # quiet If this flag is set, no warnings will be generated. # # Results: # Returns the list of files that match the input patterns. proc ::cmdline::getfiles {patterns quiet} { set result {} if {$::tcl_platform(platform) == "windows"} { foreach pattern $patterns { set pat [file join $pattern] set files [glob -nocomplain -- $pat] if {$files == {}} { if {! $quiet} { puts stdout "warning: no files match \"$pattern\"" } } else { foreach file $files { lappend result $file } } } } else { set result $patterns } set files {} foreach file $result { # Make file an absolute path so that we will never conflict # with files that might be contained in our zip file. set fullPath [file join [pwd] $file] if {[file isfile $fullPath]} { lappend files $fullPath } elseif {! $quiet} { puts stdout "warning: no files match \"$file\"" } } return $files } # ::cmdline::getArgv0 -- # # This command returns the "sanitized" version of argv0. It will strip # off the leading path and remove the ".bin" extensions that our apps # use because they must be wrapped by a shell script. # # Arguments: # None. # # Results: # The application name that can be used in error messages. proc ::cmdline::getArgv0 {} { global argv0 set name [file tail $argv0] return [file rootname $name] } ## # ### ### ### ######### ######### ######### ## # Now the typed versions of the above commands. ## # ### ### ### ######### ######### ######### ## # typedCmdline.tcl -- # # This package provides a utility for parsing typed command # line arguments that may be processed by various applications. # # Copyright (c) 2000 by Ross Palmer Mohn. # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: cmdline.tcl,v 1.2 2008-02-15 17:01:31 kokalj Exp $ namespace eval ::cmdline { namespace export typedGetopt typedGetoptions typedUsage # variable cmdline::charclasses -- # # Create regexp list of allowable character classes # from "string is" error message. # # Results: # String of character class names separated by "|" characters. variable charclasses catch {string is . .} charclasses regexp -- {must be (.+)$} $charclasses dummy charclasses regsub -all -- {, (or )?} $charclasses {|} charclasses } # ::cmdline::typedGetopt -- # # The cmdline::typedGetopt works in a fashion like the standard # C based getopt function. Given an option string and a # pointer to a list of args this command will process the # first argument and return info on how to proceed. In addition, # you may specify a type for the argument to each option. # # Arguments: # argvVar Name of the argv list that you want to process. # If options are found, the arg list is modified # and the processed arguments are removed from the # start of the list. # # optstring A list of command options that the application # will accept. If the option ends in ".xxx", where # xxx is any valid character class to the tcl # command "string is", then typedGetopt routine will # use the next argument as a typed argument to the # option. The argument must match the specified # character classes (e.g. integer, double, boolean, # xdigit, etc.). Alternatively, you may specify # ".arg" for an untyped argument. # # optVar Upon success, the variable pointed to by optVar # contains the option that was found (without the # leading '-' and without the .xxx extension). If # typedGetopt fails the variable is set to the empty # string. SOMETIMES! Different for each -value! # # argVar Upon success, the variable pointed to by argVar # contains the argument for the specified option. # If typedGetopt fails, the variable is filled with # an error message. # # Argument type syntax: # Option that takes no argument. # foo # # Option that takes a typeless argument. # foo.arg # # Option that takes a typed argument. Allowable types are all # valid character classes to the tcl command "string is". # Currently must be one of alnum, alpha, ascii, control, # boolean, digit, double, false, graph, integer, lower, print, # punct, space, true, upper, wordchar, or xdigit. # foo.double # # Option that takes an argument from a list. # foo.(bar|blat) # # Argument quantifier syntax: # Option that takes an optional argument. # foo.arg? # # Option that takes a list of arguments terminated by "--". # foo.arg+ # # Option that takes an optional list of arguments terminated by "--". # foo.arg* # # Argument quantifiers work on all argument types, so, for # example, the following is a valid option specification. # foo.(bar|blat|blah)? # # Argument syntax miscellany: # Options may be specified on the command line using a unique, # shortened version of the option name. Given that program foo # has an option list of {bar.alpha blah.arg blat.double}, # "foo -b fob" returns an error, but "foo -ba fob" # successfully returns {bar fob} # # Results: # The typedGetopt function returns one of the following: # 1 a valid option was found # 0 no more options found to process # -1 invalid option # -2 missing argument to a valid option # -3 argument to a valid option does not match type # # Known Bugs: # When using options which include special glob characters, # you must use the exact option. Abbreviating it can cause # an error in the "cmdline::prefixSearch" procedure. proc ::cmdline::typedGetopt {argvVar optstring optVar argVar} { variable charclasses upvar $argvVar argsList upvar $optVar retvar upvar $argVar optarg # default settings for a normal return set optarg "" set retvar "" set retval 0 # check if we're past the end of the args list if {[llength $argsList] != 0} { # if we got -- or an option that doesn't begin with -, return (skipping # the --). otherwise process the option arg. switch -glob -- [set arg [lindex $argsList 0]] { "--" { set argsList [lrange $argsList 1 end] } "-*" { # Create list of options without their argument extensions set optstr "" foreach str $optstring { lappend optstr [file rootname $str] } set _opt [string range $arg 1 end] set i [prefixSearch $optstr [file rootname $_opt]] if {$i != -1} { set opt [lindex $optstring $i] set quantifier "none" if {[regexp -- {\.[^.]+([?+*])$} $opt dummy quantifier]} { set opt [string range $opt 0 end-1] } if {[string first . $opt] == -1} { set retval 1 set retvar $opt set argsList [lrange $argsList 1 end] } elseif {[regexp -- "\\.(arg|$charclasses)\$" $opt dummy charclass] || [regexp -- {\.\(([^)]+)\)} $opt dummy charclass]} { if {[string equal arg $charclass]} { set type arg } elseif {[regexp -- "^($charclasses)\$" $charclass]} { set type class } else { set type oneof } set argsList [lrange $argsList 1 end] set opt [file rootname $opt] while {1} { if {[llength $argsList] == 0 || [string equal "--" [lindex $argsList 0]]} { if {[string equal "--" [lindex $argsList 0]]} { set argsList [lrange $argsList 1 end] } set oneof "" if {$type == "arg"} { set charclass an } elseif {$type == "oneof"} { set oneof ", one of $charclass" set charclass an } if {$quantifier == "?"} { set retval 1 set retvar $opt set optarg "" } elseif {$quantifier == "+"} { set retvar $opt if {[llength $optarg] < 1} { set retval -2 set optarg "Option requires at least one $charclass argument$oneof -- $opt" } else { set retval 1 } } elseif {$quantifier == "*"} { set retval 1 set retvar $opt } else { set optarg "Option requires $charclass argument$oneof -- $opt" set retvar $opt set retval -2 } set quantifier "" } elseif {($type == "arg") || (($type == "oneof") && [string first "|[lindex $argsList 0]|" "|$charclass|"] != -1) || (($type == "class") && [string is $charclass [lindex $argsList 0]])} { set retval 1 set retvar $opt lappend optarg [lindex $argsList 0] set argsList [lrange $argsList 1 end] } else { set oneof "" if {$type == "arg"} { set charclass an } elseif {$type == "oneof"} { set oneof ", one of $charclass" set charclass an } set optarg "Option requires $charclass argument$oneof -- $opt" set retvar $opt set retval -3 if {$quantifier == "?"} { set retval 1 set optarg "" } set quantifier "" } if {![regexp -- {[+*]} $quantifier]} { break; } } } else { error "Illegal option type specification:\ must be one of $charclasses" } } else { set optarg "Illegal option -- $_opt" set retvar $_opt set retval -1 } } default { # Skip ahead } } } return $retval } # ::cmdline::typedGetoptions -- # # Process a set of command line options, filling in defaults # for those not specified. This also generates an error message # that lists the allowed options if an incorrect option is # specified. # # Arguments: # arglistVar The name of the argument list, typically argv # optlist A list-of-lists where each element specifies an option # in the form: # # option default comment # # Options formatting is as described for the optstring # argument of typedGetopt. Default is for optionally # specifying a default value. Comment is for optionally # specifying a comment for the usage display. The # options "-help" and "-?" are automatically included # in optlist. # # Argument syntax miscellany: # Options formatting and syntax is as described in typedGetopt. # There are two additional suffixes that may be applied when # passing options to typedGetoptions. # # You may add ".multi" as a suffix to any option. For options # that take an argument, this means that the option may be used # more than once on the command line and that each additional # argument will be appended to a list, which is then returned # to the application. # foo.double.multi # # If a non-argument option is specified as ".multi", it is # toggled on and off for each time it is used on the command # line. # foo.multi # # If an option specification does not contain the ".multi" # suffix, it is not an error to use an option more than once. # In this case, the behavior for options with arguments is that # the last argument is the one that will be returned. For # options that do not take arguments, using them more than once # has no additional effect. # # Options may also be hidden from the usage display by # appending the suffix ".secret" to any option specification. # Please note that the ".secret" suffix must be the last suffix, # after any argument type specification and ".multi" suffix. # foo.xdigit.multi.secret # # Results # Name value pairs suitable for using with array set. proc ::cmdline::typedGetoptions {arglistVar optlist {usage options:}} { variable charclasses upvar 1 $arglistVar argv set opts {? help} foreach opt $optlist { set name [lindex $opt 0] if {[regsub -- {\.secret$} $name {} name] == 1} { # Remove this extension before passing to typedGetopt. } if {[regsub -- {\.multi$} $name {} name] == 1} { # Remove this extension before passing to typedGetopt. regsub -- {\..*$} $name {} temp set multi($temp) 1 } lappend opts $name if {[regsub -- "\\.(arg|$charclasses|\\(.+).?\$" $name {} name] == 1} { # Set defaults for those that take values. # Booleans are set just by being present, or not set dflt [lindex $opt 1] if {$dflt != {}} { set defaults($name) $dflt } } } set argc [llength $argv] while {[set err [typedGetopt argv $opts opt arg]]} { if {$err == 1} { if {[info exists result($opt)] && [info exists multi($opt)]} { # Toggle boolean options or append new arguments if {$arg == ""} { unset result($opt) } else { set result($opt) "$result($opt) $arg" } } else { set result($opt) "$arg" } } elseif {($err == -1) || ($err == -3)} { error [typedUsage $optlist $usage] } elseif {$err == -2 && ![info exists defaults($opt)]} { error [typedUsage $optlist $usage] } } if {[info exists result(?)] || [info exists result(help)]} { error [typedUsage $optlist $usage] } foreach {opt dflt} [array get defaults] { if {![info exists result($opt)]} { set result($opt) $dflt } } return [array get result] } # ::cmdline::typedUsage -- # # Generate an error message that lists the allowed flags, # type of argument taken (if any), default value (if any), # and an optional description. # # Arguments: # optlist As for cmdline::typedGetoptions # # Results # A formatted usage message proc ::cmdline::typedUsage {optlist {usage {options:}}} { variable charclasses set str "[getArgv0] $usage\n" foreach opt [concat $optlist \ {{help "Print this message"} {? "Print this message"}}] { set name [lindex $opt 0] if {[regsub -- {\.secret$} $name {} name] == 1} { # Hidden option } else { if {[regsub -- {\.multi$} $name {} name] == 1} { # Display something about multiple options } if {[regexp -- "\\.(arg|$charclasses)\$" $name dummy charclass] || [regexp -- {\.\(([^)]+)\)} $opt dummy charclass]} { regsub -- "\\..+\$" $name {} name set comment [lindex $opt 2] set default "<[lindex $opt 1]>" if {$default == "<>"} { set default "" } append str [format " %-20s %s %s\n" "-$name $charclass" \ $comment $default] } else { set comment [lindex $opt 1] append str [format " %-20s %s\n" "-$name" $comment] } } } return $str } # ::cmdline::prefixSearch -- # # Search a Tcl list for a pattern; searches first for an exact match, # and if that fails, for a unique prefix that matches the pattern # (i.e, first "lsearch -exact", then "lsearch -glob $pattern*" # # Arguments: # list list of words # pattern word to search for # # Results: # Index of found word is returned. If no exact match or # unique short version is found then -1 is returned. proc ::cmdline::prefixSearch {list pattern} { # Check for an exact match if {[set pos [::lsearch -exact $list $pattern]] > -1} { return $pos } # Check for a unique short version set slist [lsort $list] if {[set pos [::lsearch -glob $slist $pattern*]] > -1} { # What if there is nothing for the check variable? set check [lindex $slist [expr {$pos + 1}]] if {[string first $pattern $check] != 0} { return [::lsearch -exact $list [lindex $slist $pos]] } } return -1 } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/lib/license.terms0000644000077300007730000000415412341332511024226 0ustar giannozzgiannozzThis software is copyrighted by Ajuba Solutions 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. espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/lib/pkgIndex.tcl0000644000077300007730000000156412341332511024007 0ustar giannozzgiannozz# Tcl package index file, version 1.1 # All tcllib packages need Tcl 8 (use [namespace]) if {![package vsatisfies [package provide Tcl] 8]} {return} # Extend the auto_path to make tcllib packages available if {[lsearch -exact $::auto_path $dir] == -1} { lappend ::auto_path $dir } # For Tcl 8.3.1 and later, that's all we need if {[package vsatisfies [package provide Tcl] 8.4]} {return} if {(0 == [catch { package vcompare [info patchlevel] [info patchlevel] }]) && ( [package vcompare [info patchlevel] 8.3.1] >= 0 )} {return} # For older Tcl releases, here are equivalent contents # of the pkgIndex.tcl files of all the modules if {![package vsatisfies [package provide Tcl] 8.0]} {return} set maindir $dir set dir [file join $maindir cmdline] ; source [file join $dir pkgIndex.tcl] set dir [file join $maindir fileutil] ; source [file join $dir pkgIndex.tcl] espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/lib/fileutil/0000755000077300007730000000000012341332543023346 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/lib/fileutil/fileutil.tcl0000644000077300007730000016116312341332511025672 0ustar giannozzgiannozz# fileutil.tcl -- # # Tcl implementations of standard UNIX utilities. # # Copyright (c) 1998-2000 by Ajuba Solutions. # Copyright (c) 2002 by Phil Ehrens (fileType) # Copyright (c) 2005-2007 by Andreas Kupries # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: fileutil.tcl,v 1.1 2008-02-15 17:01:46 kokalj Exp $ package require Tcl 8.2 package require cmdline package provide fileutil 1.13.3 namespace eval ::fileutil { namespace export \ grep find findByPattern cat touch foreachLine \ jail stripPwd stripN stripPath tempdir tempfile \ install fileType writeFile appendToFile \ insertIntoFile removeFromFile replaceInFile \ updateInPlace test tempdirReset } # ::fileutil::grep -- # # Implementation of grep. Adapted from the Tcler's Wiki. # # Arguments: # pattern pattern to search for. # files list of files to search; if NULL, uses stdin. # # Results: # results list of matches proc ::fileutil::grep {pattern {files {}}} { set result [list] if {[llength $files] == 0} { # read from stdin set lnum 0 while {[gets stdin line] >= 0} { incr lnum if {[regexp -- $pattern $line]} { lappend result "${lnum}:${line}" } } } else { foreach filename $files { set file [open $filename r] set lnum 0 while {[gets $file line] >= 0} { incr lnum if {[regexp -- $pattern $line]} { lappend result "${filename}:${lnum}:${line}" } } close $file } } return $result } # ::fileutil::find == # Below is the core command, which is portable across Tcl versions and # platforms. Functionality which is common or platform and/or Tcl # version dependent, has been factored out/ encapsulated into separate # (small) commands. Only these commands may have multiple variant # implementations per the available features of the Tcl core / # platform. # # These commands are # # FADD - Add path result, performs filtering. Portable! # GLOBF - Return files in a directory. Tcl version/platform dependent. # GLOBD - Return dirs in a directory. Tcl version/platform dependent. # ACCESS - Check directory for accessibility. Tcl version/platform dependent. proc ::fileutil::find {{basedir .} {filtercmd {}}} { set result {} set filt [string length $filtercmd] if {[file isfile $basedir]} { # The base is a file, and therefore only possible result, # modulo filtering. FADD $basedir } elseif {[file isdirectory $basedir]} { # For a directory as base we do an iterative recursion through # the directory hierarchy starting at the base. We use a queue # (Tcl list) of directories we have to check. We access it by # index, and stop when we have reached beyond the end of the # list. This is faster than removing elements from the be- # ginning of the list, as that entails copying down a possibly # large list of directories, making it O(n*n). The index is # faster, O(n), at the expense of memory. Nothing is deleted # from the list until we have processed all directories in the # hierarchy. # # We scan each directory at least twice. First for files, then # for directories. The scans may internally make several # passes (normal vs hidden files). # # Looped directory structures due to symbolic links are # handled by _fully_ normalizing directory paths and checking # if we encountered the normalized form before. The array # 'known' is our cache where we record the known normalized # paths. set pending [list $basedir] set at 0 array set known {} while {$at < [llength $pending]} { # Get next directory not yet processed. set current [lindex $pending $at] incr at # Is the directory accessible? Continue if not. ACCESS $current # Files first, then the sub-directories ... foreach f [GLOBF $current] { FADD $f } foreach f [GLOBD $current] { # Ignore current and parent directory, this needs # explicit filtering outside of the filter command. if { [string equal [file tail $f] "."] || [string equal [file tail $f] ".."] } continue # Extend result, modulo filtering. FADD $f # Detection of symlink loops via a portable path # normalization computing a canonical form of the path # followed by a check if that canonical form was # encountered before. If ok, record directory for # expansion in future iterations. set norm [fileutil::fullnormalize $f] if {[info exists known($norm)]} continue set known($norm) . lappend pending $f } } } else { return -code error "$basedir does not exist" } return $result } # Helper command for fileutil::find. Performs the filtering of the # result per a filter command for the candidates found by the # traversal core, see above. This is portable. proc ::fileutil::FADD {filename} { upvar 1 result result filt filt filtercmd filtercmd if {!$filt} { lappend result $filename return } set here [pwd] cd [file dirname $filename] if {[uplevel 2 [linsert $filtercmd end [file tail $filename]]]} { lappend result $filename } cd $here return } # The next three helper commands for fileutil::find depend strongly on # the version of Tcl, and partially on the platform. # 1. The -directory and -types swithes were added to glob in Tcl # 8.3. This means that we have to emulate them for Tcl 8.2. # # 2. In Tcl 8.3 using -types f will return only true files, but not # links to files. This changed in 8.4+ where links to files are # returned as well. So for 8.3 we have to handle the links # separately (-types l) and also filter on our own. # Note that Windows file links are hard links which are reported by # -types f, but not -types l, so we can optimize that for the two # platforms. # # 3. In Tcl 8.3 we also have a crashing bug in glob (SIGABRT, "stat on # a known file") when trying to perform 'glob -types {hidden f}' on # a directory without e'x'ecute permissions. We code around by # testing if we can cd into the directory (stat might return enough # information too (mode), but possibly also not portable). # # For Tcl 8.2 and 8.4+ glob simply delivers an empty result # (-nocomplain), without crashing. For them this command is defined # so that the bytecode compiler removes it from the bytecode. # # This bug made the ACCESS helper necessary. # We code around the problem by testing if we can cd into the # directory (stat might return enough information too (mode), but # possibly also not portable). if {[package vsatisfies [package present Tcl] 8.4]} { # Tcl 8.4+. # (Ad 1) We have -directory, and -types, # (Ad 2) Links are returned for -types f/d if they refer to files/dirs. # (Ad 3) No bug to code around proc ::fileutil::ACCESS {args} {} proc ::fileutil::GLOBF {current} { concat \ [glob -nocomplain -directory $current -types f -- *] \ [glob -nocomplain -directory $current -types {hidden f} -- *] } proc ::fileutil::GLOBD {current} { concat \ [glob -nocomplain -directory $current -types d -- *] \ [glob -nocomplain -directory $current -types {hidden d} -- *] } } elseif {[package vsatisfies [package present Tcl] 8.3]} { # 8.3. # (Ad 1) We have -directory, and -types, # (Ad 2) Links are NOT returned for -types f/d, collect separately. # No symbolic file links on Windows. # (Ad 3) Bug to code around. proc ::fileutil::ACCESS {current} { if {[catch { set h [pwd] ; cd $current ; cd $h }]} {return -code continue} return } if {[string equal $::tcl_platform(platform) windows]} { proc ::fileutil::GLOBF {current} { concat \ [glob -nocomplain -directory $current -types f -- *] \ [glob -nocomplain -directory $current -types {hidden f} -- *]] } } else { proc ::fileutil::GLOBF {current} { set l [concat \ [glob -nocomplain -directory $current -types f -- *] \ [glob -nocomplain -directory $current -types {hidden f} -- *]] foreach x [concat \ [glob -nocomplain -directory $current -types l -- *] \ [glob -nocomplain -directory $current -types {hidden l} -- *]] { if {![file isfile $x]} continue lappend l $x } return $l } } proc ::fileutil::GLOBD {current} { set l [concat \ [glob -nocomplain -directory $current -types d -- *] \ [glob -nocomplain -directory $current -types {hidden d} -- *]] foreach x [concat \ [glob -nocomplain -directory $current -types l -- *] \ [glob -nocomplain -directory $current -types {hidden l} -- *]] { if {![file isdirectory $x]} continue lappend l $x } return $l } } else { # 8.2. # (Ad 1,2,3) We do not have -directory, nor -types. Full emulation required. proc ::fileutil::ACCESS {args} {} if {[string equal $::tcl_platform(platform) windows]} { # Hidden files cannot be handled by Tcl 8.2 in glob. We have # to punt. proc ::fileutil::GLOBF {current} { set current \\[join [split $current {}] \\] set res {} foreach x [glob -nocomplain -- [file join $current *]] { if {![file isfile $x]} continue lappend res $x } return $res } proc ::fileutil::GLOBD {current} { set current \\[join [split $current {}] \\] set res {} foreach x [glob -nocomplain -- [file join $current *]] { if {![file isdirectory $x]} continue lappend res $x } return $res } } else { # Hidden files on Unix are dot-files. We emulate the switch # '-types hidden' by using an explicit pattern. proc ::fileutil::GLOBF {current} { set current \\[join [split $current {}] \\] set res {} foreach x [glob -nocomplain -- [file join $current *] [file join $current .*]] { if {![file isfile $x]} continue lappend res $x } return $res } proc ::fileutil::GLOBD {current} { set current \\[join [split $current {}] \\] set res {} foreach x [glob -nocomplain -- [file join $current *] [file join $current .*]] { if {![file isdirectory $x]} continue lappend res $x } return $res } } } # ::fileutil::findByPattern -- # # Specialization of find. Finds files based on their names, # which have to match the specified patterns. Options are used # to specify which type of patterns (regexp-, glob-style) is # used. # # Arguments: # basedir Directory to start searching from. # args Options (-glob, -regexp, --) followed by a # list of patterns to search for. # # Results: # files a list of interesting files. proc ::fileutil::findByPattern {basedir args} { set pos 0 set cmd ::fileutil::FindGlob foreach a $args { incr pos switch -glob -- $a { -- {break} -regexp {set cmd ::fileutil::FindRegexp} -glob {set cmd ::fileutil::FindGlob} -* {return -code error "Unknown option $a"} default {incr pos -1 ; break} } } set args [lrange $args $pos end] if {[llength $args] != 1} { set pname [lindex [info level 0] 0] return -code error \ "wrong#args for \"$pname\", should be\ \"$pname basedir ?-regexp|-glob? ?--? patterns\"" } set patterns [lindex $args 0] return [find $basedir [list $cmd $patterns]] } # ::fileutil::FindRegexp -- # # Internal helper. Filter command used by 'findByPattern' # to match files based on regular expressions. # # Arguments: # patterns List of regular expressions to match against. # filename Name of the file to match against the patterns. # Results: # interesting A boolean flag. Set to true if the file # matches at least one of the patterns. proc ::fileutil::FindRegexp {patterns filename} { foreach p $patterns { if {[regexp -- $p $filename]} { return 1 } } return 0 } # ::fileutil::FindGlob -- # # Internal helper. Filter command used by 'findByPattern' # to match files based on glob expressions. # # Arguments: # patterns List of glob expressions to match against. # filename Name of the file to match against the patterns. # Results: # interesting A boolean flag. Set to true if the file # matches at least one of the patterns. proc ::fileutil::FindGlob {patterns filename} { foreach p $patterns { if {[string match $p $filename]} { return 1 } } return 0 } # ::fileutil::stripPwd -- # # If the specified path references is a path in [pwd] (or [pwd] itself) it # is made relative to [pwd]. Otherwise it is left unchanged. # In the case of [pwd] itself the result is the string '.'. # # Arguments: # path path to modify # # Results: # path The (possibly) modified path. proc ::fileutil::stripPwd {path} { # [file split] is used to generate a canonical form for both # paths, for easy comparison, and also one which is easy to modify # using list commands. set pwd [pwd] if {[string equal $pwd $path]} { return "." } set pwd [file split $pwd] set npath [file split $path] if {[string match ${pwd}* $npath]} { set path [eval [linsert [lrange $npath [llength $pwd] end] 0 file join ]] } return $path } # ::fileutil::stripN -- # # Removes N elements from the beginning of the path. # # Arguments: # path path to modify # n number of elements to strip # # Results: # path The modified path proc ::fileutil::stripN {path n} { set path [file split $path] if {$n >= [llength $path]} { return {} } else { return [eval [linsert [lrange $path $n end] 0 file join]] } } # ::fileutil::stripPath -- # # If the specified path references/is a path in prefix (or prefix itself) it # is made relative to prefix. Otherwise it is left unchanged. # In the case of it being prefix itself the result is the string '.'. # # Arguments: # prefix prefix to strip from the path. # path path to modify # # Results: # path The (possibly) modified path. proc ::fileutil::stripPath {prefix path} { # [file split] is used to generate a canonical form for both # paths, for easy comparison, and also one which is easy to modify # using list commands. if {[string equal $prefix $path]} { return "." } set prefix [file split $prefix] set npath [file split $path] if {[string match ${prefix}* $npath]} { set path [eval [linsert [lrange $npath [llength $prefix] end] 0 file join ]] } return $path } # ::fileutil::jail -- # # Ensures that the input path 'filename' stays within the the # directory 'jail'. In this way it preventsuser-supplied paths # from escaping the jail. # # Arguments: # jail The path to the directory the other must # not escape from. # filename The path to prevent from escaping. # # Results: # path The (possibly) modified path surely within # the confines of the jail. proc fileutil::jail {jail filename} { if {![string equal [file pathtype $filename] "relative"]} { # Although the path to check is absolute (or volumerelative on # windows) we cannot perform a simple prefix check to see if # the path is inside the jail or not. We have to normalize # both path and jail and then we can check. If the path is # outside we make the original path relative and prefix it # with the original jail. We do make the jail pseudo-absolute # by prefixing it with the current working directory for that. # Normalized jail. Fully resolved sym links, if any. Our main # complication is that normalize does not resolve symlinks in the # last component of the path given to it, so we add a bogus # component, resolve, and then strip it off again. That is why the # code is so large and long. set njail [eval [list file join] [lrange [file split \ [Normalize [file join $jail __dummy__]]] 0 end-1]] # Normalize filename. Fully resolved sym links, if # any. S.a. for an explanation of the complication. set nfile [eval [list file join] [lrange [file split \ [Normalize [file join $filename __dummy__]]] 0 end-1]] if {[string match ${njail}* $nfile]} { return $filename } # Outside the jail, put it inside. ... We normalize the input # path lexically for this, to prevent escapes still lurking in # the original path. (We cannot use the normalized path, # symlinks may have bent it out of shape in unrecognizable ways. return [eval [linsert [lrange [file split \ [LexNormalize $filename]] 1 end] 0 file join [pwd] $jail]] } else { # The path is relative, consider it as outside # implicitly. Normalize it lexically! to prevent escapes, then # put the jail in front, use PWD to ensure absoluteness. return [eval [linsert [file split [LexNormalize $filename]] 0 \ file join [pwd] $jail]] } } # ::fileutil::test -- # # Simple API to testing various properties of # a path (read, write, file/dir, existence) # # Arguments: # path path to test # codes names of the properties to test # msgvar Name of variable to leave an error # message in. Optional. # label Label for error message, optional # # Results: # ok boolean flag, set if the path passes # all tests. namespace eval ::fileutil { variable test array set test { read {readable {Read access is denied}} write {writable {Write access is denied}} exec {executable {Is not executable}} exists {exists {Does not exist}} file {isfile {Is not a file}} dir {isdirectory {Is not a directory}} } } proc ::fileutil::test {path codes {msgvar {}} {label {}}} { variable test if {[string equal $msgvar ""]} { set msg "" } else { upvar 1 $msgvar msg } if {![string equal $label ""]} {append label { }} if {![regexp {^(read|write|exec|exists|file|dir)} $codes]} { # Translate single characters into proper codes set codes [string map { r read w write e exists x exec f file d dir } [split $codes {}]] } foreach c $codes { foreach {cmd text} $test($c) break if {![file $cmd $path]} { set msg "$label\"$path\": $text" return 0 } } return 1 } # ::fileutil::cat -- # # Tcl implementation of the UNIX "cat" command. Returns the contents # of the specified files. # # Arguments: # args names of the files to read, interspersed with options # to set encodings, translations, or eofchar. # # Results: # data data read from the file. proc ::fileutil::cat {args} { # Syntax: (?options? file)+ # options = -encoding ENC # | -translation TRA # | -eofchar ECH # | -- if {![llength $args]} { # Argument processing stopped with arguments missing. return -code error \ "wrong#args: should be\ [lindex [info level 0] 0] ?-eofchar|-translation|-encoding arg?+ file ..." } # We go through the arguments using foreach and keeping track of # the index we are at. We do not shift the arguments out to the # left. That is inherently quadratic, copying everything down. set opts {} set mode maybeopt set channels {} foreach a $args { if {[string equal $mode optarg]} { lappend opts $a set mode maybeopt continue } elseif {[string equal $mode maybeopt]} { if {[string match -* $a]} { switch -exact -- $a { -encoding - -translation - -eofchar { lappend opts $a set mode optarg continue } -- { set mode file continue } default { return -code error \ "Bad option \"$a\",\ expected one of\ -encoding, -eofchar,\ or -translation" } } } # Not an option, but a file. Change mode and fall through. set mode file } # Process file arguments if {[string equal $a -]} { # Stdin reference is special. # Test that the current options are all ok. # For stdin we have to avoid closing it. set old [fconfigure stdin] set fail [catch { SetOptions stdin $opts } msg] ; # {} SetOptions stdin $old if {$fail} { return -code error $msg } lappend channels [list $a $opts 0] } else { if {![file exists $a]} { return -code error "Cannot read file \"$a\", does not exist" } elseif {![file isfile $a]} { return -code error "Cannot read file \"$a\", is not a file" } elseif {![file readable $a]} { return -code error "Cannot read file \"$a\", read access is denied" } # Test that the current options are all ok. set c [open $a r] set fail [catch { SetOptions $c $opts } msg] ; # {} close $c if {$fail} { return -code error $msg } lappend channels [list $a $opts [file size $a]] } # We may have more options and files coming after. set mode maybeopt } if {![string equal $mode maybeopt]} { # Argument processing stopped with arguments missing. return -code error \ "wrong#args: should be\ [lindex [info level 0] 0] ?-eofchar|-translation|-encoding arg?+ file ..." } set data "" foreach c $channels { foreach {fname opts size} $c break if {[string equal $fname -]} { set old [fconfigure stdin] SetOptions stdin $opts append data [read stdin] SetOptions stdin $old continue } set c [open $fname r] SetOptions $c $opts if {$size > 0} { # Used the [file size] command to get the size, which # preallocates memory, rather than trying to grow it as # the read progresses. append data [read $c $size] } else { # if the file has zero bytes it is either empty, or # something where [file size] reports 0 but the file # actually has data (like the files in the /proc # filesystem on Linux). append data [read $c] } close $c } return $data } # ::fileutil::writeFile -- # # Write the specified data into the named file, # creating it if necessary. # # Arguments: # options... Options and arguments. # filename Path to the file to write. # data The data to write into the file # # Results: # None. proc ::fileutil::writeFile {args} { # Syntax: ?options? file data # options = -encoding ENC # | -translation TRA # | -eofchar ECH # | -- Spec Writable $args opts fname data # Now perform the requested operation. file mkdir [file dirname $fname] set c [open $fname w] SetOptions $c $opts puts -nonewline $c $data close $c return } # ::fileutil::appendToFile -- # # Append the specified data at the end of the named file, # creating it if necessary. # # Arguments: # options... Options and arguments. # filename Path to the file to extend. # data The data to extend the file with. # # Results: # None. proc ::fileutil::appendToFile {args} { # Syntax: ?options? file data # options = -encoding ENC # | -translation TRA # | -eofchar ECH # | -- Spec Writable $args opts fname data # Now perform the requested operation. file mkdir [file dirname $fname] set c [open $fname a] SetOptions $c $opts set at [tell $c] puts -nonewline $c $data close $c return $at } # ::fileutil::insertIntoFile -- # # Insert the specified data into the named file, # creating it if necessary, at the given locaton. # # Arguments: # options... Options and arguments. # filename Path to the file to extend. # data The data to extend the file with. # # Results: # None. proc ::fileutil::insertIntoFile {args} { # Syntax: ?options? file at data # options = -encoding ENC # | -translation TRA # | -eofchar ECH # | -- Spec ReadWritable $args opts fname at data set max [file size $fname] CheckLocation $at $max insertion if {[string length $data] == 0} { # Another degenerate case, inserting nothing. # Leave the file well enough alone. return } foreach {c o t} [Open2 $fname $opts] break # The degenerate cases of both appending and insertion at the # beginning of the file allow more optimized implementations of # the operation. if {$at == 0} { puts -nonewline $o $data fcopy $c $o } elseif {$at == $max} { fcopy $c $o puts -nonewline $o $data } else { fcopy $c $o -size $at puts -nonewline $o $data fcopy $c $o } Close2 $fname $t $c $o return } # ::fileutil::removeFromFile -- # # Remove n characters from the named file, # starting at the given locaton. # # Arguments: # options... Options and arguments. # filename Path to the file to extend. # at Location to start the removal from. # n Number of characters to remove. # # Results: # None. proc ::fileutil::removeFromFile {args} { # Syntax: ?options? file at n # options = -encoding ENC # | -translation TRA # | -eofchar ECH # | -- Spec ReadWritable $args opts fname at n set max [file size $fname] CheckLocation $at $max removal CheckLength $n $at $max removal if {$n == 0} { # Another degenerate case, removing nothing. # Leave the file well enough alone. return } foreach {c o t} [Open2 $fname $opts] break # The degenerate cases of both removal from the beginning or end # of the file allow more optimized implementations of the # operation. if {$at == 0} { seek $c $n current fcopy $c $o } elseif {($at + $n) == $max} { fcopy $c $o -size $at # Nothing further to copy. } else { fcopy $c $o -size $at seek $c $n current fcopy $c $o } Close2 $fname $t $c $o return } # ::fileutil::replaceInFile -- # # Remove n characters from the named file, # starting at the given locaton, and replace # it with the given data. # # Arguments: # options... Options and arguments. # filename Path to the file to extend. # at Location to start the removal from. # n Number of characters to remove. # data The replacement data. # # Results: # None. proc ::fileutil::replaceInFile {args} { # Syntax: ?options? file at n data # options = -encoding ENC # | -translation TRA # | -eofchar ECH # | -- Spec ReadWritable $args opts fname at n data set max [file size $fname] CheckLocation $at $max replacement CheckLength $n $at $max replacement if { ($n == 0) && ([string length $data] == 0) } { # Another degenerate case, replacing nothing with # nothing. Leave the file well enough alone. return } foreach {c o t} [Open2 $fname $opts] break # Check for degenerate cases and handle them separately, # i.e. strip the no-op parts out of the general implementation. if {$at == 0} { if {$n == 0} { # Insertion instead of replacement. puts -nonewline $o $data fcopy $c $o } elseif {[string length $data] == 0} { # Removal instead of replacement. seek $c $n current fcopy $c $o } else { # General replacement at front. seek $c $n current puts -nonewline $o $data fcopy $c $o } } elseif {($at + $n) == $max} { if {$n == 0} { # Appending instead of replacement fcopy $c $o puts -nonewline $o $data } elseif {[string length $data] == 0} { # Truncating instead of replacement fcopy $c $o -size $at # Nothing further to copy. } else { # General replacement at end fcopy $c $o -size $at puts -nonewline $o $data } } else { if {$n == 0} { # General insertion. fcopy $c $o -size $at puts -nonewline $o $data fcopy $c $o } elseif {[string length $data] == 0} { # General removal. fcopy $c $o -size $at seek $c $n current fcopy $c $o } else { # General replacement. fcopy $c $o -size $at seek $c $n current puts -nonewline $o $data fcopy $c $o } } Close2 $fname $t $c $o return } # ::fileutil::updateInPlace -- # # Run command prefix on the contents of the # file and replace them with the result of # the command. # # Arguments: # options... Options and arguments. # filename Path to the file to extend. # cmd Command prefix to run. # # Results: # None. proc ::fileutil::updateInPlace {args} { # Syntax: ?options? file cmd # options = -encoding ENC # | -translation TRA # | -eofchar ECH # | -- Spec ReadWritable $args opts fname cmd # readFile/cat inlined ... set c [open $fname r] SetOptions $c $opts set data [read $c] close $c # Transformation. Abort and do not modify the target file if an # error was raised during this step. lappend cmd $data set code [catch {uplevel 1 $cmd} res] if {$code} { return -code $code $res } # writeFile inlined, with careful preservation of old contents # until we are sure that the write was ok. if {[catch { file rename -force $fname ${fname}.bak set o [open $fname w] SetOptions $o $opts puts -nonewline $o $res close $o file delete -force ${fname}.bak } msg]} { if {[file exists ${fname}.bak]} { catch { file rename -force ${fname}.bak $fname } return -code error $msg } } return } proc ::fileutil::Writable {fname mv} { upvar 1 $mv msg if {[file exists $fname]} { if {![file isfile $fname]} { set msg "Cannot use file \"$fname\", is not a file" return 0 } elseif {![file writable $fname]} { set msg "Cannot use file \"$fname\", write access is denied" return 0 } } return 1 } proc ::fileutil::ReadWritable {fname mv} { upvar 1 $mv msg if {![file exists $fname]} { set msg "Cannot use file \"$fname\", does not exist" return 0 } elseif {![file isfile $fname]} { set msg "Cannot use file \"$fname\", is not a file" return 0 } elseif {![file writable $fname]} { set msg "Cannot use file \"$fname\", write access is denied" return 0 } elseif {![file readable $fname]} { set msg "Cannot use file \"$fname\", read access is denied" return 0 } return 1 } proc ::fileutil::Spec {check alist ov fv args} { upvar 1 $ov opts $fv fname set n [llength $args] ; # Num more args incr n ; # Count path as well set opts {} set mode maybeopt set at 0 foreach a $alist { if {[string equal $mode optarg]} { lappend opts $a set mode maybeopt incr at continue } elseif {[string equal $mode maybeopt]} { if {[string match -* $a]} { switch -exact -- $a { -encoding - -translation - -eofchar { lappend opts $a set mode optarg incr at continue } -- { # Stop processing. incr at break } default { return -code error \ "Bad option \"$a\",\ expected one of\ -encoding, -eofchar,\ or -translation" } } } # Not an option, but a file. # Stop processing. break } } if {([llength $alist] - $at) != $n} { # Argument processing stopped with arguments missing, or too # many return -code error \ "wrong#args: should be\ [lindex [info level 1] 0] ?-eofchar|-translation|-encoding arg? file $args" } set fname [lindex $alist $at] incr at foreach \ var $args \ val [lrange $alist $at end] { upvar 1 $var A set A $val } # Check given path ... if {![eval [linsert $check end $a msg]]} { return -code error $msg } return } proc ::fileutil::Open2 {fname opts} { set c [open $fname r] set t [tempfile] set o [open $t w] SetOptions $c $opts SetOptions $o $opts return [list $c $o $t] } proc ::fileutil::Close2 {f temp in out} { close $in close $out file copy -force $f ${f}.bak file rename -force $temp $f file delete -force ${f}.bak return } proc ::fileutil::SetOptions {c opts} { if {![llength $opts]} return eval [linsert $opts 0 fconfigure $c] return } proc ::fileutil::CheckLocation {at max label} { if {![string is integer -strict $at]} { return -code error \ "Expected integer but got \"$at\"" } elseif {$at < 0} { return -code error \ "Bad $label point $at, before start of data" } elseif {$at > $max} { return -code error \ "Bad $label point $at, behind end of data" } } proc ::fileutil::CheckLength {n at max label} { if {![string is integer -strict $n]} { return -code error \ "Expected integer but got \"$n\"" } elseif {$n < 0} { return -code error \ "Bad $label size $n" } elseif {($at + $n) > $max} { return -code error \ "Bad $label size $n, going behind end of data" } } # ::fileutil::foreachLine -- # # Executes a script for every line in a file. # # Arguments: # var name of the variable to contain the lines # filename name of the file to read. # cmd The script to execute. # # Results: # None. proc ::fileutil::foreachLine {var filename cmd} { upvar 1 $var line set fp [open $filename r] # -future- Use try/eval from tcllib/control catch { set code 0 set result {} while {[gets $fp line] >= 0} { set code [catch {uplevel 1 $cmd} result] if {($code != 0) && ($code != 4)} {break} } } close $fp 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 } # ::fileutil::touch -- # # Tcl implementation of the UNIX "touch" command. # # touch [-a] [-m] [-c] [-r ref_file] [-t time] filename ... # # Arguments: # -a change the access time only, unless -m also specified # -m change the modification time only, unless -a also specified # -c silently prevent creating a file if it did not previously exist # -r ref_file use the ref_file's time instead of the current time # -t time use the specified time instead of the current time # ("time" is an integer clock value, like [clock seconds]) # filename ... the files to modify # # Results # None. # # Errors: # Both of "-r" and "-t" cannot be specified. if {[package vsatisfies [package provide Tcl] 8.3]} { namespace eval ::fileutil { namespace export touch } proc ::fileutil::touch {args} { # Don't bother catching errors, just let them propagate up set options { {a "set the atime only"} {m "set the mtime only"} {c "do not create non-existant files"} {r.arg "" "use time from ref_file"} {t.arg -1 "use specified time"} } set usage ": [lindex [info level 0] 0]\ \[options] filename ...\noptions:" array set params [::cmdline::getoptions args $options $usage] # process -a and -m options set set_atime [set set_mtime "true"] if { $params(a) && ! $params(m)} {set set_mtime "false"} if {! $params(a) && $params(m)} {set set_atime "false"} # process -r and -t set has_t [expr {$params(t) != -1}] set has_r [expr {[string length $params(r)] > 0}] if {$has_t && $has_r} { return -code error "Cannot specify both -r and -t" } elseif {$has_t} { set atime [set mtime $params(t)] } elseif {$has_r} { file stat $params(r) stat set atime $stat(atime) set mtime $stat(mtime) } else { set atime [set mtime [clock seconds]] } # do it foreach filename $args { if {! [file exists $filename]} { if {$params(c)} {continue} close [open $filename w] } if {$set_atime} {file atime $filename $atime} if {$set_mtime} {file mtime $filename $mtime} } return } } # ::fileutil::fileType -- # # Do some simple heuristics to determine file type. # # # Arguments: # filename Name of the file to test. # # Results # type Type of the file. May be a list if multiple tests # are positive (eg, a file could be both a directory # and a link). In general, the list proceeds from most # general (eg, binary) to most specific (eg, gif), so # the full type for a GIF file would be # "binary graphic gif" # # At present, the following types can be detected: # # directory # empty # binary # text # script # executable [elf, dos, ne, pe] # binary graphic [gif, jpeg, png, tiff, bitmap, icns] # ps, eps, pdf # html # xml # message pgp # compressed [bzip, gzip, zip, tar] # audio [mpeg, wave] # gravity_wave_data_frame # link # doctools, doctoc, and docidx documentation files. # proc ::fileutil::fileType {filename} { ;## existence test if { ! [ file exists $filename ] } { set err "file not found: '$filename'" return -code error $err } ;## directory test if { [ file isdirectory $filename ] } { set type directory if { ! [ catch {file readlink $filename} ] } { lappend type link } return $type } ;## empty file test if { ! [ file size $filename ] } { set type empty if { ! [ catch {file readlink $filename} ] } { lappend type link } return $type } set bin_rx {[\x00-\x08\x0b\x0e-\x1f]} if { [ catch { set fid [ open $filename r ] fconfigure $fid -translation binary fconfigure $fid -buffersize 1024 fconfigure $fid -buffering full set test [ read $fid 1024 ] ::close $fid } err ] } { catch { ::close $fid } return -code error "::fileutil::fileType: $err" } if { [ regexp $bin_rx $test ] } { set type binary set binary 1 } else { set type text set binary 0 } # SF Tcllib bug [795585]. Allowing whitespace between #! # and path of script interpreter set metakit 0 if { [ regexp {^\#\!\s*(\S+)} $test -> terp ] } { lappend type script $terp } elseif {[regexp "\\\[manpage_begin " $test]} { lappend type doctools } elseif {[regexp "\\\[toc_begin " $test]} { lappend type doctoc } elseif {[regexp "\\\[index_begin " $test]} { lappend type docidx } elseif { $binary && [ regexp {^[\x7F]ELF} $test ] } { lappend type executable elf } elseif { $binary && [string match "MZ*" $test] } { if { [scan [string index $test 24] %c] < 64 } { lappend type executable dos } else { binary scan [string range $test 60 61] s next set sig [string range $test $next [expr {$next + 1}]] if { $sig == "NE" || $sig == "PE" } { lappend type executable [string tolower $sig] } else { lappend type executable dos } } } elseif { $binary && [string match "BZh91AY\&SY*" $test] } { lappend type compressed bzip } elseif { $binary && [string match "\x1f\x8b*" $test] } { lappend type compressed gzip } elseif { $binary && [string range $test 257 262] == "ustar\x00" } { lappend type compressed tar } elseif { $binary && [string match "\x50\x4b\x03\x04*" $test] } { lappend type compressed zip } elseif { $binary && [string match "GIF*" $test] } { lappend type graphic gif } elseif { $binary && [string match "icns*" $test] } { lappend type graphic icns bigendian } elseif { $binary && [string match "snci*" $test] } { lappend type graphic icns smallendian } elseif { $binary && [string match "\x89PNG*" $test] } { lappend type graphic png } elseif { $binary && [string match "\xFF\xD8\xFF*" $test] } { binary scan $test x3H2x2a5 marker txt if { $marker == "e0" && $txt == "JFIF\x00" } { lappend type graphic jpeg jfif } elseif { $marker == "e1" && $txt == "Exif\x00" } { lappend type graphic jpeg exif } } elseif { $binary && [string match "MM\x00\**" $test] } { lappend type graphic tiff } elseif { $binary && [string match "BM*" $test] && [string range $test 6 9] == "\x00\x00\x00\x00" } { lappend type graphic bitmap } elseif { $binary && [string match "\%PDF\-*" $test] } { lappend type pdf } elseif { ! $binary && [string match -nocase "*\*" $test] } { lappend type html } elseif { [string match "\%\!PS\-*" $test] } { lappend type ps if { [string match "* EPSF\-*" $test] } { lappend type eps } } elseif { [string match -nocase "*\<\?xml*" $test] } { lappend type xml if { [ regexp -nocase {\<\!DOCTYPE\s+(\S+)} $test -> doctype ] } { lappend type $doctype } } elseif { [string match {*BEGIN PGP MESSAGE*} $test] } { lappend type message pgp } elseif { $binary && [string match {IGWD*} $test] } { lappend type gravity_wave_data_frame } elseif {[string match "JL\x1a\x00*" $test] && ([file size $filename] >= 27)} { lappend type metakit smallendian set metakit 1 } elseif {[string match "LJ\x1a\x00*" $test] && ([file size $filename] >= 27)} { lappend type metakit bigendian set metakit 1 } elseif { $binary && [string match "RIFF*" $test] && [string range $test 8 11] == "WAVE" } { lappend type audio wave } elseif { $binary && [string match "ID3*" $test] } { lappend type audio mpeg } elseif { $binary && [binary scan $test S tmp] && [expr {$tmp & 0xFFE0}] == 65504 } { lappend type audio mpeg } # Additional checks of file contents at the end of the file, # possibly pointing into the middle too (attached metakit, # attached zip). ## Metakit File format: http://www.equi4.com/metakit/metakit-ff.html ## Metakit database attached ? ## if {!$metakit && ([file size $filename] >= 27)} { # The offsets in the footer are in always bigendian format if { [ catch { set fid [ open $filename r ] fconfigure $fid -translation binary fconfigure $fid -buffersize 1024 fconfigure $fid -buffering full seek $fid -16 end set test [ read $fid 16 ] ::close $fid } err ] } { catch { ::close $fid } return -code error "::fileutil::fileType: $err" } binary scan $test IIII __ hdroffset __ __ set hdroffset [expr {[file size $filename] - 16 - $hdroffset}] # Further checks iff the offset is actually inside the file. if {($hdroffset >= 0) && ($hdroffset < [file size $filename])} { # Seek to the specified location and try to match a metakit header # at this location. if { [ catch { set fid [ open $filename r ] fconfigure $fid -translation binary fconfigure $fid -buffersize 1024 fconfigure $fid -buffering full seek $fid $hdroffset start set test [ read $fid 16 ] ::close $fid } err ] } { catch { ::close $fid } return -code error "::fileutil::fileType: $err" } if {[string match "JL\x1a\x00*" $test]} { lappend type attached metakit smallendian set metakit 1 } elseif {[string match "LJ\x1a\x00*" $test]} { lappend type attached metakit bigendian set metakit 1 } } } ## Zip File Format: http://zziplib.sourceforge.net/zzip-parse.html ## http://www.pkware.com/products/enterprise/white_papers/appnote.html ;## lastly, is it a link? if { ! [ catch {file readlink $filename} ] } { lappend type link } return $type } # ::fileutil::tempdir -- # # Return the correct directory to use for temporary files. # Python attempts this sequence, which seems logical: # # 1. The directory named by the `TMPDIR' environment variable. # # 2. The directory named by the `TEMP' environment variable. # # 3. The directory named by the `TMP' environment variable. # # 4. A platform-specific location: # * On Macintosh, the `Temporary Items' folder. # # * On Windows, the directories `C:\\TEMP', `C:\\TMP', # `\\TEMP', and `\\TMP', in that order. # # * On all other platforms, the directories `/tmp', # `/var/tmp', and `/usr/tmp', in that order. # # 5. As a last resort, the current working directory. # # The code here also does # # 0. The directory set by invoking tempdir with an argument. # If this is present it is used exclusively. # # Arguments: # None. # # Side Effects: # None. # # Results: # The directory for temporary files. proc ::fileutil::tempdir {args} { if {[llength $args] > 1} { return -code error {wrong#args: should be "::fileutil::tempdir ?path?"} } elseif {[llength $args] == 1} { variable tempdir [lindex $args 0] variable tempdirSet 1 return } return [Normalize [TempDir]] } proc ::fileutil::tempdirReset {} { variable tempdir {} variable tempdirSet 0 return } proc ::fileutil::TempDir {} { global tcl_platform env variable tempdir variable tempdirSet set attempdirs [list] set problems {} if {$tempdirSet} { lappend attempdirs $tempdir lappend problems {User/Application specified tempdir} } else { foreach tmp {TMPDIR TEMP TMP} { if { [info exists env($tmp)] } { lappend attempdirs $env($tmp) } else { lappend problems "No environment variable $tmp" } } switch $tcl_platform(platform) { windows { lappend attempdirs "C:\\TEMP" "C:\\TMP" "\\TEMP" "\\TMP" } macintosh { set tmpdir $env(TRASH_FOLDER) ;# a better place? } default { lappend attempdirs \ [file join / tmp] \ [file join / var tmp] \ [file join / usr tmp] } } lappend attempdirs [pwd] } foreach tmp $attempdirs { if { [file isdirectory $tmp] && [file writable $tmp] } { return $tmp } elseif { ![file isdirectory $tmp] } { lappend problems "Not a directory: $tmp" } else { lappend problems "Not writable: $tmp" } } # Fail if nothing worked. return -code error "Unable to determine a proper directory for temporary files\n[join $problems \n]" } namespace eval ::fileutil { variable tempdir {} variable tempdirSet 0 } # ::fileutil::tempfile -- # # generate a temporary file name suitable for writing to # the file name will be unique, writable and will be in the # appropriate system specific temp directory # Code taken from http://mini.net/tcl/772 attributed to # Igor Volobouev and anon. # # Arguments: # prefix - a prefix for the filename, p # Results: # returns a file name # proc ::fileutil::tempfile {{prefix {}}} { return [Normalize [TempFile $prefix]] } proc ::fileutil::TempFile {prefix} { set tmpdir [tempdir] set chars "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" set nrand_chars 10 set maxtries 10 set access [list RDWR CREAT EXCL TRUNC] set permission 0600 set channel "" set checked_dir_writable 0 set mypid [pid] for {set i 0} {$i < $maxtries} {incr i} { set newname $prefix for {set j 0} {$j < $nrand_chars} {incr j} { append newname [string index $chars \ [expr {int(rand()*62)}]] } set newname [file join $tmpdir $newname] if {[file exists $newname]} { after 1 } else { if {[catch {open $newname $access $permission} channel]} { if {!$checked_dir_writable} { set dirname [file dirname $newname] if {![file writable $dirname]} { return -code error "Directory $dirname is not writable" } set checked_dir_writable 1 } } else { # Success close $channel return $newname } } } if {[string compare $channel ""]} { return -code error "Failed to open a temporary file: $channel" } else { return -code error "Failed to find an unused temporary file name" } } # ::fileutil::install -- # # Tcl version of the 'install' command, which copies files from # one places to another and also optionally sets some attributes # such as group, owner, and permissions. # # Arguments: # -m Change the file permissions to the specified # value. Valid arguments are those accepted by # file attributes -permissions # # Results: # None. # TODO - add options for group/owner manipulation. proc ::fileutil::install {args} { set options { {m.arg "" "Set permission mode"} } set usage ": [lindex [info level 0] 0]\ \[options] source destination \noptions:" array set params [::cmdline::getoptions args $options $usage] # Args should now just be the source and destination. if { [llength $args] < 2 } { return -code error $usage } set src [lindex $args 0] set dst [lindex $args 1] file copy -force $src $dst if { $params(m) != "" } { set targets [::fileutil::find $dst] foreach fl $targets { file attributes $fl -permissions $params(m) } } } # ### ### ### ######### ######### ######### proc ::fileutil::LexNormalize {sp} { set spx [file split $sp] # Resolution of embedded relative modifiers (., and ..). if { ([lsearch -exact $spx . ] < 0) && ([lsearch -exact $spx ..] < 0) } { # Quick path out if there are no relative modifiers return $sp } set absolute [expr {![string equal [file pathtype $sp] relative]}] # A volumerelative path counts as absolute for our purposes. set sp $spx set np {} set noskip 1 while {[llength $sp]} { set ele [lindex $sp 0] set sp [lrange $sp 1 end] set islast [expr {[llength $sp] == 0}] if {[string equal $ele ".."]} { if { ($absolute && ([llength $np] > 1)) || (!$absolute && ([llength $np] >= 1)) } { # .. : Remove the previous element added to the # new path, if there actually is enough to remove. set np [lrange $np 0 end-1] } } elseif {[string equal $ele "."]} { # Ignore .'s, they stay at the current location continue } else { # A regular element. lappend np $ele } } if {[llength $np] > 0} { return [eval [linsert $np 0 file join]] # 8.5: return [file join {*}$np] } return {} } # ### ### ### ######### ######### ######### ## Forward compatibility. Some routines require path normalization, ## something we have supported by the builtin 'file' only since Tcl ## 8.4. For versions of Tcl before that, to be supported by the ## module, we implement a normalizer in Tcl itself. Slow, but working. if {[package vcompare [package provide Tcl] 8.4] < 0} { # Pre 8.4. We do not have 'file normalize'. We create an # approximation for it based on earlier commands. # ... Hm. This is lexical normalization. It does not resolve # symlinks in the path to their origin. proc ::fileutil::Normalize {sp} { set sp [file split $sp] # Conversion of the incoming path to absolute. if {[string equal [file pathtype [lindex $sp 0]] "relative"]} { set sp [file split [eval [list file join [pwd]] $sp]] } # Resolution of symlink components, and embedded relative # modifiers (., and ..). set np {} set noskip 1 while {[llength $sp]} { set ele [lindex $sp 0] set sp [lrange $sp 1 end] set islast [expr {[llength $sp] == 0}] if {[string equal $ele ".."]} { if {[llength $np] > 1} { # .. : Remove the previous element added to the # new path, if there actually is enough to remove. set np [lrange $np 0 end-1] } } elseif {[string equal $ele "."]} { # Ignore .'s, they stay at the current location continue } else { # A regular element. If it is not the last component # then check if the combination is a symlink, and if # yes, resolve it. lappend np $ele if {!$islast && $noskip} { # The flag 'noskip' is technically not required, # just 'file exists'. However if a path P does not # exist, then all longer paths starting with P can # not exist either, and using the flag to store # this knowledge then saves us a number of # unnecessary stat calls. IOW this a performance # optimization. set p [eval file join $np] set noskip [file exists $p] if {$noskip} { if {[string equal link [file type $p]]} { set dst [file readlink $p] # We always push the destination in front of # the source path (in expanded form). So that # we handle .., .'s, and symlinks inside of # this path as well. An absolute path clears # the result, a relative one just removes the # last, now resolved component. set sp [eval [linsert [file split $dst] 0 linsert $sp 0]] if {![string equal relative [file pathtype $dst]]} { # Absolute|volrelative destination, clear # result, we have to start over. set np {} } else { # Relative link, just remove the resolved # component again. set np [lrange $np 0 end-1] } } } } } } if {[llength $np] > 0} { return [eval file join $np] } return {} } } else { proc ::fileutil::Normalize {sp} { file normalize $sp } } # ::fileutil::relative -- # # Taking two _directory_ paths, a base and a destination, computes the path # of the destination relative to the base. # # Arguments: # base The path to make the destination relative to. # dst The destination path # # Results: # The path of the destination, relative to the base. proc ::fileutil::relative {base dst} { # Ensure that the link to directory 'dst' is properly done relative to # the directory 'base'. if {![string equal [file pathtype $base] [file pathtype $dst]]} { return -code error "Unable to compute relation for paths of different pathtypes: [file pathtype $base] vs. [file pathtype $dst], ($base vs. $dst)" } set base [LexNormalize [file join [pwd] $base]] set dst [LexNormalize [file join [pwd] $dst]] set save $dst set base [file split $base] set dst [file split $dst] while {[string equal [lindex $dst 0] [lindex $base 0]]} { set dst [lrange $dst 1 end] set base [lrange $base 1 end] if {![llength $dst]} {break} } set dstlen [llength $dst] set baselen [llength $base] if {($dstlen == 0) && ($baselen == 0)} { # Cases: # (a) base == dst set dst . } else { # Cases: # (b) base is: base/sub = sub # dst is: base = {} # (c) base is: base = {} # dst is: base/sub = sub while {$baselen > 0} { set dst [linsert $dst 0 ..] incr baselen -1 } # 8.5: set dst [file join {*}$dst] set dst [eval [linsert $dst 0 file join]] } return $dst } # ::fileutil::relativeUrl -- # # Taking two _file_ paths, a base and a destination, computes the path # of the destination relative to the base, from the inside of the base. # # This is how a browser resolves relative links in a file, hence the # url in the command name. # # Arguments: # base The file path to make the destination relative to. # dst The destination file path # # Results: # The path of the destination file, relative to the base file. proc ::fileutil::relativeUrl {base dst} { # Like 'relative', but for links from _inside_ a file to a # different file. if {![string equal [file pathtype $base] [file pathtype $dst]]} { return -code error "Unable to compute relation for paths of different pathtypes: [file pathtype $base] vs. [file pathtype $dst], ($base vs. $dst)" } set base [LexNormalize [file join [pwd] $base]] set dst [LexNormalize [file join [pwd] $dst]] set basedir [file dirname $base] set dstdir [file dirname $dst] set dstdir [relative $basedir $dstdir] # dstdir == '.' on input => dstdir output has trailing './'. Strip # this superfluous segment off. if {[string equal $dstdir "."]} { return [file tail $dst] } elseif {[string equal [file tail $dstdir] "."]} { return [file join [file dirname $dstdir] [file tail $dst]] } else { return [file join $dstdir [file tail $dst]] } } # ::fileutil::fullnormalize -- # # Normalizes a path completely. I.e. a symlink in the last # element is resolved as well, not only symlinks in the higher # elements. # # Arguments: # path The path to normalize # # Results: # The input path with all symlinks resolved. proc ::fileutil::fullnormalize {path} { # When encountering symlinks in a file copy operation Tcl copies # the link, not the contents of the file it references. There are # situations there this is not acceptable. For these this command # resolves all symbolic links in the path, including in the last # element of the path. A "file copy" using the return value of # this command copies an actual file, it will not encounter # symlinks. # BUG / WORKAROUND. Using the / instead of the join seems to work # around a bug in the path handling on windows which can break the # core 'file normalize' for symbolic links. This was exposed by # the find testsuite which could not reproduced outside. I believe # that there is some deep path bug in the core triggered under # special circumstances. Use of / likely forces a refresh through # the string rep and so avoids the problem with the path intrep. return [file dirname [Normalize $path/__dummy__]] #return [file dirname [Normalize [file join $path __dummy__]]] } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/external/lib/fileutil/pkgIndex.tcl0000644000077300007730000000101012341332511025606 0ustar giannozzgiannozzif {![package vsatisfies [package provide Tcl] 8.2]} {return} package ifneeded fileutil 1.13.3 [list source [file join $dir fileutil.tcl]] #if {![package vsatisfies [package provide Tcl] 8.3]} {return} #package ifneeded fileutil::traverse 0.3 [list source [file join $dir traverse.tcl]] #if {![package vsatisfies [package provide Tcl] 8.4]} {return} #package ifneeded fileutil::multi 0.1 [list source [file join $dir multi.tcl]] #package ifneeded fileutil::multi::op 0.5 [list source [file join $dir multiop.tcl]] espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/0000755000077300007730000000000012341333047020757 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/run.sh0000755000077300007730000000007212341332511022114 0ustar giannozzgiannozz#!/bin/sh for test in *.tcl do ../guib $test; doneespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/pages.inp0000644000077300007730000000140512341332511022561 0ustar giannozzgiannozz2 1 3 &first v1 = 1 , v2 = 2 , v11 = 3 , v12 = 4 , t1(1,1) = 5, t1(1,2) = 6, t1(1,3) = 7, t1(1,4) = 8, t1(2,1) = 9, t1(2,2) = 10, t1(2,3) = 11, t1(2,4) = 12, dim1(1) = d11, dim1(2) = d12, dim1(3) = d13, &end 11 12 13 21 22 23 31 32 33 a b c d e f &second v3 = 1 , v4 = 2 , t2(1,1) = 3, t2(1,2) = 4, t2(1,3) = 5, t2(1,4) = 6, t2(2,1) = 7, t2(2,2) = 8, t2(2,3) = 9, t2(2,4) = 10, dim1(1) = 11, dim1(2) = 13, dim1(3) = 14, &end espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/simpleSim.inp0000644000077300007730000000054612341332511023431 0ustar giannozzgiannozzwater molecule &Parameters type = 'Structural optimization' , functional = 'B3LYP' , basis = '6-311G*' , natoms = 3 , &end ATOMIC_COORDINATES H 0.0000000000 0.2000000000 -1.0000000000 O 0.0000000000 0.0000000000 0.0000000000 H 0.0000000000 0.2000000000 1.0000000000 END espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/dimension.inp0000644000077300007730000000031012341332511023441 0ustar giannozzgiannozz &DIMENSION howmany = 3 , myDim1(1) = 1, myDim1(2) = 2, myDim1(3) = 3, textvalue-test(1) = 3rd, textvalue-test(2) = 2nd, textvalue-test(3) = 1st, &end espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/pages.tcl0000644000077300007730000000464012341332511022561 0ustar giannozzgiannozzmodule pages -title "Testing GUIB implemantation: test No.1" -script { # support for undefined variables in the input files set ::guib::settings(NAMELIST.variable_support_undefined) 1 # Page #.1 page p1 -name "Page.1" { line l1 -name "choose" { var choo { -label "What to do:" -variable choose -widget optionmenu -textvalue { "Enable Page.2" "Enable Page.3" "Enable Pages 2&3" "Disable Pages 2&3" } -value {0 1 2 3} } page p1.1 -name "Inside Page: feel " { var feel { -label "How do you feel:" -widget radiobox -value {0 1 2} -textvalue {bad good excellent} -default bad } } page p1.2 -name "Inside Page: day" { var day { -label "Which day is today:" -widget optionmenu -value {0 1 2 3 4 5 6 7} -textvalue {Mon Tue Wed Thu Fri Sat Sun} -default Wed } } } } # Page #.2 page p2 -name "Page.2" { namelist n1 -name first { foreach {var} {v1 v2 v11 v12} label {"First var:" "Second var:" "3rd var:" "4th var:"} { var $var -label $label } table t1 -caption "Test table" -head "X Y Z N" -rows 2 -cols 4 packwidgets left dimension d1 -variable dim1 -label "Dimension \#.1" -start 1 -end 3 } line l2 -name "Table" { table t_line -caption "Simple Table" -head "c1 c2 c3" -rows 3 -cols 3 } table t12 -caption "Simple Table \#.2" -head "c1 c2 c3" -rows 2 -cols 3 } # Page #.3 page p3 -name "Page.3" { namelist n2 -name second { var v3 -label "3rd var:" var v4 -label "4th var:" table t2 -caption "Test table" -head "X Y Z N" -rows 2 -cols 4 dimension d2 -variable dim1 -label "Dimension \#.3" -start 1 -end 3 } } # # specialities # tracevar choo w { switch -- [varvalue choo] { "Enable Page.2" { groupwidget p2 enable groupwidget p3 disable } "Enable Page.3" { groupwidget p2 disable groupwidget p3 enable } "Enable Pages 2&3" { groupwidget p2 enable groupwidget p3 enable } "Disable Pages 2&3" { groupwidget p2 disable groupwidget p3 disable } } } postprocess { varset choo -textvalue "Select a value here" } help feel -helpfmt txt2html -helptext { Describe how you weel. } help day -helpfmt txt2html -helptext { Tell me which day it is. } }espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/validate.tcl0000644000077300007730000000122112341332511023243 0ustar giannozzgiannozzmodule validate -title "Validation procs test" -script { # support for undefined variables in the input files set ::guib::settings(NAMELIST.variable_support_undefined) 1 namelist validate -name "VALIDATION" { foreach type { whatever nonnegint posint nonposint negint nonnegreal posreal nonposreal negreal fortranreal fortrannonnegreal fortranposreal fortrannonposreal fortrannegreal string } { var $type -label [string totitle $type]: -validate $type } } } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/dimension.tcl0000644000077300007730000000100412341332511023436 0ustar giannozzgiannozzmodule dimension -title "Test namelist's dimensions" -script { namelist dim -name "DIMENSION" { var howmany -label "Size of dimension:" -widget spinint -default 3 dimension myDim1 -start 1 -end 3 dimension myDim2 { -variable textvalue-test -widget radiobox -start 1 -end 3 -value { first second third } -textvalue { 1st 2nd 3rd } -default 2nd } } tracevar howmany w { widgetconfigure myDim1 -end [varvalue howmany] } } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/two_pages.tcl0000644000077300007730000000132612341332511023450 0ustar giannozzgiannozzmodule two_pages -title "Testing GUIB implemantation: testing pages" -script { # Page #.2 page p2 -name "Page.2" { namelist n1 -name first { puts stderr "*** nml" foreach {var} {v1 v2 v11 v12} label {"First var:" "Second var:" "3rd var:" "4th var:"} { puts stderr "*** var $var" var $var -label $label } } } # Page #.1 page p1 -name "Page.1" { line l1 -name "choose" { var choo { -label "What to do:" -variable choose -widget optionmenu -textvalue { "Enable Page.2" "Enable Page.3" "Enable Pages 2&3" "Disable Pages 2&3" } -value {0 1 2 3} } } } }espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/kpoints.tcl0000644000077300007730000000311012341332511023140 0ustar giannozzgiannozzmodule kpoints -title "An example GUI" -script { line ktype -name "K-point input" { keyword kpoints K_POINTS var kpoint_type { -label "K-Point input" -textvalue { "Automatic generation" "Gamma point only" } -value { automatic gamma } -widget radiobox } } packwidgets left line kmesh -name "K-point mesh" { var nk1 -label "nk1:" -widget entry -validate posint -default 1 var nk2 -label "nk2:" -widget entry -validate posint -default 1 var nk3 -label "nk3:" -widget entry -validate posint -default 1 } #line kshift -name "K-point mesh shift" { # var s1 -label "s1:" -widget entry -validate posint -default 1 # var s2 -label "s2:" -widget entry -validate posint -default 1 # var s3 -label "s3:" -widget entry -validate posint -default 1 #} line kshift -name "K-point mesh shift" { var s1 -label "s1:" -widget scale -default 1 var s2 -label "s2:" -widget scale -default 1 var s3 -label "s3:" -widget scale -default 1 } tracevar kpoint_type w { set value [vartextvalue kpoint_type] if { $value == "Automatic generation" } { set status enable } else { set status disable } groupwidget kmesh $status groupwidget kshift $status } postprocess { foreach scale {s1 s2 s3} { widgetconfigure $scale -from 0 -to 1 -resolution 1 } } help s1 -helptext {This is shift in first direction} } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/README0000644000077300007730000000105112341332511021627 0ustar giannozzgiannozz------------------------ README file for Examples ------------------------ This directory contains a few examples of simple GUIB definition files. The *.tcl files are the definition files for GUIs, while *.inp are corresponding input files as saved by the GUIs. They can be opened using the File->Open menu of the corresponding GUIs. To construct a given GUI you need to define the GUIB environmental variable to point to the GUIB root directory. Then execute: $GUIB/guib file.tcl where file.tcl stands for a given example of *.tcl definition file. espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/kpoints.inp0000644000077300007730000000004312341332511023146 0ustar giannozzgiannozzK_POINTS automatic 8 8 8 1 1 1 espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/simpleSim.tcl0000644000077300007730000000211412341332511023416 0ustar giannozzgiannozzmodule simpleSim -title "Simulation Setup" -script { line title -name "Title" { var jobtitle -label "Job title:" -fmt %S } namelist pars -name Parameters { var type { -label "Job type:" -value {"'Single-point calculation'" "'Structural optimization'"} -widget optionmenu -default "'Single-point calculation'" } var functional { -label "DFT Functional:" -value {'PBE' 'RPBE' 'B3LYP' } -widget optionmenu -default 'B3LYP' } var basis { -label "Gaussian basis set:" -value {'STO-3G' '3-21G' '6-21G' '6-311G' '6-311G*'} -widget optionmenu -default '6-311G' } var natoms -label "natoms" -widget spinint -validate posint -default 1 } keyword coord ATOMIC_COORDINATES\n table atoms { -caption "Enter atomic coorditanes" -head {"Atomic symbol" X-Coordinate Y-Coordinate Z-Coordinate} -cols 4 -rows 1 -outfmt "%3s %15.10f %15.10f %15.10f" } keyword coord_end END\n tracevar natoms w { widgetconfigure atoms -rows [varvalue natoms] } } espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/examples/validate.inp0000644000077300007730000000076012341332511023256 0ustar giannozzgiannozz &VALIDATION whatever = bla..bla , nonnegint = 111 , posint = +111 , nonposint = 000 , negint = -123 , nonnegreal = 000 , posreal = 1.2e34 , nonposreal = -1.2e30 , negreal = -1.2e+34 , fortranreal = 1.0d12 , fortrannonnegreal = 1.0d12 , fortranposreal = 1.0d45 , fortrannonposreal = -1.0d12 , fortrannegreal = -1.0d56 , var1 = 'tone-kokalj' , variable2 = 'katarina-kokalj' , &end espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/pkgIndex.tcl0000644000077300007730000000030712341332511021411 0ustar giannozzgiannozz# Tcl package index file, version 1.0 set channel [open [file join $dir VERSION] r] set version [gets $channel] close $channel package ifneeded Guib $version [list source [file join $dir init.tcl]] espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/guib0000755000077300007730000000442512341332511020015 0ustar giannozzgiannozz#!/bin/sh # ---------------------------------------------------------------------- # PROGRAM: guib # USAGE: guib module-file # PURPOSE: tries to be a simple GUI based on module definition file # ---------------------------------------------------------------------- # Anton Kokalj # Jozef Stefan Institute, Ljubljana, Slovenia # INFM DEMOCRITOS National Simulation Center, Trieste, Italy # Email: Tone.Kokalj@ijs.si # ====================================================================== # Copyright (c) 2002,2003 Anton Kokalj # ====================================================================== # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 ANTON KOKALJ 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. # if test "x`type readlink`" = "x"; then # no readlink cmd; make a function-substitute readlink() { echo `ls -l $1 | awk '{print $NF}'` } fi pathname() { file=`type -p $1` if test $? -gt 0; then file=`which $1` if test $? -gt 0; then # give-up file=$1 fi fi echo $file } pathdir() { file=`pathname $1` while test -h $file; do file=`readlink $file` done dir=`dirname $file` ( cd $dir; pwd ) } if test -z "$GUIB" ; then # try to guess the GUIB value export GUIB=`pathdir $0` fi if test $# -eq 1 ; then if test \( "$1" = "-v" \) -o \( "$1" = "--version" \) ; then version=`cat $GUIB/VERSION` echo $version exit 0 fi else echo " Usage: $0 GUIB-definition-file " exit 1 fi if test -d $GUIB/bin ; then echo " GUIB: using the \"$GUIB/itkwish\" interpreter " $GUIB/bin/itkwish $GUIB/guib.tcl $@ else echo " GUIB: using the system default \"tclsh\" interpreter " tclsh $GUIB/guib.tcl $@ fi espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/guib.theme0000644000077300007730000001026312341332511021110 0ustar giannozzgiannozz*Background.selectColor: White *Guib*Entry.width: 10 *Guib*Entryfield.width: 10 *Guib*Spinint.width: 10 *Guib*Spininthelp.width: 10 *Guib*Entryhelp.width: 10 *Guib*Spinner.width: 10 *Mainwindow.width: 960 *Mainwindow.height: 804 *Scrolledframe.hscrollMode: dynamic *Scrolledframe.vscrollMode: dynamic *Scrolledframe.relief: sunken *Scrolledframe.borderWidth: 1 *Scrolledframe*Frame*background: White *Scrolledframe*Canvas*background: White *Scrolledframe.width: 940 *Scrolledframe.height: 600 #*Guib*Scrolledframe.activeBackground: red #*Guib*Scrolledframe.selectBackground: blue #*Guib*Scrolledframe.selectForeground: green #*Guib*Scrolledframe*Frame.background: White #*Guib*Scrolledframe*Canvas.background: White *Tabset.padX: 0 *Tabset.padY: 0 *Guib*Tabnotebook.width: 900 *Guib*Tabnotebook.tabPos: n *Guib*Tabnotebook.auto: 1 *Guib*Tabnotebook.angle: 0 *Guib*Tabnotebook.background: #336699 *Guib*Tabnotebook.tabBackground: #ffffee *Guib*Tabnotebook.tabForeground: #0000ff *Guib*Tabnotebook.foreground: #ffffff *Guib*Tabnotebook.bevelAmount: 4 *Guib*Tabnotebook.gap: 2 *Guib*Tabnotebook.margin: 5 *Guib*Tabnotebook.tabBorders: true *Guib*Tabnotebook.raiseSelect: true *Guib*Tabnotebook.borderWidth: 2 *Guib*Tabnotebook.backdrop: #999999 *Guib*Tabnotebook.equalTabs: false *Guib*Background.background: #336699 *Guib*Var*background: #eeeeff *Guib*Var*captionForeground: #000000 *Guib*Var*captionBackground: #ffffff *Guib*Dimension*background: #eeeeff *Guib*Dimension*captionForeground: #000000 *Guib*Dimension*captionBackground: #ffffff *Guib*Table.background: #eeeeff *Guib*Table*Entry.background: seashell *Guib*Table*Entry.relief: sunken *Guib*Table*Entry.borderWidth: 1 *Guib*Table*Entry.highlightThickness: 1 *Guib*Table*Entry.width: 10 *Guib*Table*captionForeground: #000000 *Guib*Table*captionBackground: #ffffff *Guib*Table*Message.relief: solid *Guib*Table*Message.borderWidth: 1 *Guib*Table*Message.anchor: c *Guib*Table*Label.relief: sunken *Guib*Table*Label.borderWidth: 1 *Guib*Table*Checkbutton.background: Gray *Guib*Table*Button.background: Gray *Guib*Table*Entryfileselect.borderWidth: 1 *Guib*Table*Entryfileselect.highlightThickness: 1 *Guib*Table*buttonHighlightbackground: #eeeeff *Guib*Labeledframe.background: #ffffaa *Guib*Labeledframe.labelPos: nw *Guib*Labeledframe.relief: ridge *Guib*Labeledframe.borderWidth: 2 *Guib*Combobox*Button*background: Gray *Guib*Entryfield*background: #eeeeff *Guib*Entryfield*highlightBackground: #eeeeff *Guib*buttonBackground: Gray *fileselectBackground: Gray *dirselectBackground: Gray *Guib*menuBackground: Gray *Scrolledhtml.fontname: helvetica *Scrolledhtml.fontsize: large *Scrolledhtml.width: 900 *Scrolledhtml.height: 400 espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/images/0000755000077300007730000000000012341333047020406 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/lib/Guib-0.5.1/images/fileclose2.gif0000644000077300007730000000264312341332511023124 0ustar giannozzgiannozzGIF89a )))...+++(((%%% 111@@@MMMPPPLLLGGGAAA999,,,555IIIZZZdddgggfffbbb[[[SSS<<< ^^^nnnxxxzzzyyyvvvrrriii___TTTeee|||ttt\\\CCC 666aaa}}}YYY>>>///###NNNuuu{{{qqqmmmooo888һ777JJJۺBBB!!!000ڸ嶶www쾾HHHUUU''' 333XXX```$$$ QQQ;;;jjjsssFFF]]]ȰpppVVVOOO:::DDDWWW""" ---EEE***&&&!,  H*\ȰC@ H`@q *X! #@1D 'Da C*Vh 1JP0C5l0#~2-b*&D>>,,, 666sssooo^^^???LLLrrr___(((qqqӽ!!!pppXXX777%%%ZZZVVVOOO111㹹}}}jjjvvvyyyYYYzzzmmm\\\lllBBBgggnnnwww```'''Ʈkkk]]]uuuAAA444[[[GGG|||TTTddd"""$$$~~~hhhfffiii///ttteeeWWWcccRRRPPPKKKIIINNNQQQ)))HHH@@@CCCپDDD555JJJ<<%HD 'PP'K+D>`A/`Đ 3h԰qLr-V\1 A !<imEADɒ m$˄_ i "Hml/c) T9bE+Xj&̀"  1 @#DFш#pkH>TI$p k4"$P#BdPd&8!Zpx"I#Qd@Ep T'h':!(Ax҈"&9)F-x³Ϛ"J "mh"Kd0*8A.=Dy*sd *}BL_bB}%FB #\GHeK j,PL+@@[`(!, P,Hs80 -r-0't .tB@. .R,K/;espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/images/filenew2.gif0000644000077300007730000000264712341332511022614 0ustar giannozzgiannozzGIF89a FFFκfffҶ~bΪrrrҺjƺ¢RNNªږ~~vζΎVVVzzrƢzjRvvrºƮھnnn^ZZҾҖֶzrf־Ҳ^^Zvnf~vjbrƪzzzʲҾzºzʶֺzvrjjfҞjښҶҪʦbbbrnjΪRRR~vfʒ~zr~vn®j¾~zv~Κ枊rª־Ҿβ~Ʈʲ֦Ҷަ¶VRR~vrƾn¦ֺ~~zv־vvvjjjή¦ʶҾ~rnnƲʶ!,  k2@N<B HbNLx (̢#ɁL} ˖&&=d@#G=9QĞ=@U>LS{.)ӟ`&ʨ/YnkX]x Qǩ7tQ> q D[zF}۳ΩNjLUBɓ /K"nν%=|#gf}pP>;xϞ.  M+[R|# q`}FtҖT((<0`bI,Ht X{DK`XqZ0˿02,o;0;رZo;espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/images/fileopen2.gif0000644000077300007730000000277012341332511022761 0ustar giannozzgiannozzGIF89a rrn"""~J666vFrZFnJJJjVVRvRޚZjrZ^^^&&&ҒR~^ffbjF~~z2"^ަƆ~fN>>>znJ*bnnj>*"zzv~ƆNJ6&zbNjZJZzjNvv~nb~rf~Nvj22.n^RNNNjjfb†¾ʎ^2rFNvvr~BBBB.zRRN†R~n>֖V~B:2b~jRΒzbbb^^VRnZzFRFFBzj–frBVŠ b>jFjRzFrF2r†~:::nFښZZZZv΂fN‚zzzjjjŽzfڞƲ~J’bʊNN:*vfnbZvF~zv涶rrr~NbjRnnn J~vږZzjʒΖ򾆊fff~~~vvvbbbF2"RRRFFFnVVVҒV~fRV†jVrƊ222v!,  HBjJ,F@.$80U4{f!/U"Y34S$sL=d`B\$i5 cŽaAr-"9e $'gXӲd4 !)h4V_L2;b1 ؓ+x}UM>Q#X`T"u 4)AmG0K5G5B;\ej% ;espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/images/filesaveas2.gif0000644000077300007730000000301712341332511023275 0ustar giannozzgiannozzGIF89a ZZZv Zꂂ...vB^:::bbbjjjrRRRv>ҚfZ~^B&^2vvvfr:JJJZ ^B⾞bZN.ҞfNꪆjjRnnnBBBbN®^"""z~F ~~~v^NV6rbrR>:2*Z6&666&&&RB2ΒZJrrrvުvf&^^^rZNBnJ&zzz.VVV~ZfffJrFFFF>6222~FNNNښ~>>>^RNΊŠʖj"j***ުFޢjnz޾NƖjjfz^2rzr^6JV2fJzB6.Ғr殖~fvƺRF>^Brj.Nަnfb^ꮂŽfޮ~rN&j>:6^Jrv b2J*r^f F!, Q)¿QÇApdB% 40`ďqRtJ:4s -=lXKʄ1Ghpc9RfǙ)qjԧ;"F XhiTC&]B` (:Ph%b zD j PY! 1гT-[V85^ `A0iPb ĠL`Ȑ2D`& 0oAƮQ2DSQnz)l!K>T  Q)8\uj$ iaD DQg,F;EU@ 8쒴H jl$}", RK\XC]"P;espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/images/icons.license0000644000077300007730000000103212341332511023054 0ustar giannozzgiannozzThe following icons: exit2.gif fileclose2.gif filenew2.gif fileopen2.gif filesave2.gif filesaveas2.gif are slightly modified hicolor/32x32 KDE icons (exit.png, fileclose.png, filenew.png, fileopen.png, filesave.png, and filesaveas.png, respecively), and are covered by the "KDE Artwork License" (http://artist.kde.org/new/license.html), which states: The other KDE icons, like the older HiColor and LoColor ones, have the following license: "The images inside this directory are COMPLETELY FREE for commercial and non-commercial use." espresso-5.1/PWgui-5.1/lib/Guib-0.5.1/guib.bat0000644000077300007730000000036412341332511020555 0ustar giannozzgiannozz@echo off rem *** rem *** This is a template Batch file for MS-Windows (edit to suit your needs) rem *** rem *** EDIT: set the GUIB variable to point to the correct directory !!! set GUIB=C:\Tone\Guib start wish %GUIB%\guib.tcl %1 espresso-5.1/PWgui-5.1/src/0000755000077300007730000000000012341333047015635 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/src/about.html0000644000077300007730000000114412341332511017630 0ustar giannozzgiannozz
About PWgui 
-----------


PWgui is an input-file builder and a simple GUI for the PWscf set of
programs contained within the open-source Quantum ESPRESSO suite for
quantum simulation of materials (see http://www.quantum-espresso.org).

PWgui was written by Anton Kokalj and released under the GNU General
Public License Version 2. It is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
or merchantability or fitness for a particular purpose.

See the GNU General Public License for more details.

    
espresso-5.1/PWgui-5.1/src/pwscf.itcl0000644000077300007730000002061212341332511017630 0ustar giannozzgiannozz# # $RCSfile: pwscf.itcl,v $ -- # # This file is the main Tcl file for the PWSCF GUI. # # Copyright (c) 2003 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: pwscf.itcl,v 1.15 2011-04-06 10:14:48 kokalj Exp $ # tk_setPalette #d9d9d9 option add *Menu*borderWidth 1 startupFile option add *Menubar*borderWidth 1 100 option add *Menubar*activeBorderWidth 1 100 option add *Menubar*activeBackground \#007d8d startupFile option add *Menubar*activeForeground \#ffffff startupFile option readfile [file join $::env(PWGUI) src pwscf.theme] startupFile option readfile [file join $::guib::library guib.theme] startupFile option add *selectColor \#ffffff userDefault # # initialization # pwscf::init # ------------------------------------------------------------------------ # create IMAGES # ------------------------------------------------------------------------ image create photo logo -format gif \ -file [file join $env(PWGUI) images pwgui-logo.gif] image create photo pwscf -format gif \ -file [file join $env(PWGUI) images pwscf-logo.gif] # ------------------------------------------------------------------------ # create the PWgui's GUI object # ------------------------------------------------------------------------ set gui [::guib::GUI \#auto -title "PWgui: A PWscf's GUI" -appname PWgui] # ------------------------------------------------------------------------ # define the PWSCF's modules # ------------------------------------------------------------------------ $gui addModule module pw "PW.X" [file join $env(PWGUI) modules pw pw.tcl] { {{PW.X Input Files} {*.pw.in *.pw.inp}} } $gui addModule separator sep1 $gui addModule module neb "NEB.X's neb.dat" [file join $env(PWGUI) modules neb neb.tcl] { {{NEB.X (neb.dat) Input Files} {*.dat}} } $gui addModule module ph "PH.X" [file join $env(PWGUI) modules ph ph.tcl] { {{PH.X Input Files} {*.ph.in *.ph.inp}} } $gui addModule module pp "PP.X" [file join $env(PWGUI) modules pp pp.tcl] { {{PP.X Input Files} {*.pp.in *.pp.inp}} } $gui addModule module pr "ProjWFC.X" [file join $env(PWGUI) modules projwfc projwfc.tcl] { {{ProjWFC.X Input Files} {*.pr.in *.pr.inp}} } $gui addModule module bands "Bands.X" [file join $env(PWGUI) modules bands bands.tcl] { {{Bands.X Input Files} {*.bands.in *.bands.inp}} } $gui addModule module dos "Dos.X" [file join $env(PWGUI) modules dos dos.tcl] { {{Dos.X Input Files} {*.dos.in *.dos.inp}} } $gui addModule module d3 "D3.X" [file join $env(PWGUI) modules d3 d3.tcl] { {{D3.X Input Files} {*.d3.in *.d3.inp}} } $gui addModule module ld "LD1.X" [file join $env(PWGUI) modules atomic atomic.tcl] { {{LD1.X Input Files} {*.ld1.in *.ld1.inp}} } #$gui addModule cascade pwscf "PWscf files ..." { # $gui addModule command ... # ... #} #$gui addModule cascade fpmd "FPMD files ... " { # $gui addModule command ... # ... #} # ------------------------------------------------------------------------ # help Files # ------------------------------------------------------------------------ #$gui addHelp help usersguide "User's Guide for Quantum-ESPRESSO" [file join $env(PWGUI) doc pwdocs users-guide users-guide.html] $gui addHelp help usersguide "User's Guide for Quantum-ESPRESSO" [file join $env(PWGUI) doc pwdocs user_guide user_guide.html] word $gui addHelp separator $gui addHelp help pw "PW.X Input Syntax" [file join $env(PWGUI) doc pwdocs INPUT_PW.html] none $gui addHelp help neb "NEB.DAT Input Syntax" [file join $env(PWGUI) doc pwdocs INPUT_NEB.html] none $gui addHelp help ph "PH.X Input Syntax" [file join $env(PWGUI) doc pwdocs INPUT_PH.html] none $gui addHelp help pp "PP.X Input Syntax" [file join $env(PWGUI) doc pwdocs INPUT_PP.html] none $gui addHelp help projwfc "ProjWFC.X Input Syntax" [file join $env(PWGUI) doc pwdocs INPUT_PROJWFC.html] none $gui addHelp help bands "Bands.X Input Syntax" [file join $env(PWGUI) doc pwdocs INPUT_BANDS.html] none $gui addHelp help dos "Dos.X Input Syntax" [file join $env(PWGUI) doc pwdocs INPUT_DOS.html] none $gui addHelp help d3 "D3.X Input Syntax" [file join $env(PWGUI) doc pwdocs INPUT_D3.html] none $gui addHelp help ld "LD1.X Input Syntax" [file join $env(PWGUI) doc pwdocs INPUT_LD1.html] none $gui addHelp separator $gui addHelp help about "About PWgui" [file join $env(PWGUI) src about.html] none # ------------------------------------------------------------------------ # EXTRA GUI stuff ... # ------------------------------------------------------------------------ $gui extra { # # add Settings menu-entry to FILE menu # set mb [component menubar] $mb insert .file.closetab command .file.settings -label "Settings" -command [list ::pwscf::settings $this] $mb insert .file.closetab separator .file.setsep # # EDIT menubutton # $mb add menubutton .edit -text "Edit" -menu { options -tearoff false } $mb add command .edit.editOrig -label "Input with editor" -command [list ::pwscf::edit::inputByEditor original $this] $mb add command .edit.editCopy -label "Input's copy with editor" -command [list ::pwscf::edit::inputByEditor copy $this] $mb add separator .edit.sep1 $mb add command .edit.settings -label "Settings" -command [list ::pwscf::settings $this] # # VIEW menubutton # $mb add menubutton .view -text "View" -menu { options -tearoff false } $mb add command .view.xcrysden -label "Structure with XCrySDen" -command [list ::pwscf::view::structByXcrysden $this] $mb add command .view.input -label "Input file" -command [list ::pwscf::view::inputByPager $this] # t.k. #$mb add separator .view.sep1 #$mb add command .view.xc -label "XCRYSDEN" -command [list ::pwscf::XCRYSDEN $this] #/ # # RUN menubutton # $mb add menubutton .run -text "Run" -menu { options -tearoff false } $mb add command .run.run -label "Run calculation" -command [list ::pwscf::run::run $this] $mb add command .run.runAs -label "Configure & Run calculation" -command [list ::pwscf::run::runAs $this] $mb add separator .run.sep1 $mb add command .run.runXC -label "Run calculation + XCrySDen's display" -command [list ::pwscf::run::runAndXC $this] $mb add command .run.runAsXC -label "Configure & Run calculation + XCrySDen's display" -command [list ::pwscf::run::runAsAndXC $this] # # add a PWscf's logo to TOOLBAR # set tb [component toolbar] set pwscf [$tb add label pwscf -borderwidth 1 -relief flat -image pwscf] pack configure $pwscf -side right # # put a big logo picture in logoframe # set con [component logoframe] set imagelabel [label $con.l -image logo -anchor center -background White] pack $imagelabel -expand 1 -ipadx 0 -ipady 0 -padx 0 -pady 0 } # ------------------------------------------------------------------------ # STATE GUI stuff ... # ------------------------------------------------------------------------ $gui state { # syntax: menubar path command menubar .edit.editOrig ::pwscf::menustate::editable menubar .edit.editCopy ::pwscf::menustate::editable menubar .view.input ::pwscf::menustate::editable menubar .view.xcrysden ::pwscf::menustate::xcrysden menubar .run.run ::pwscf::menustate::runnable menubar .run.runAs ::pwscf::menustate::runnable menubar .run.runXC ::pwscf::menustate::runnableXC menubar .run.runAsXC ::pwscf::menustate::runnableXC # syntax: toolbar label command #... } # ------------------------------------------------------------------------ # now activate the GUI ... # ------------------------------------------------------------------------ $gui activate espresso-5.1/PWgui-5.1/src/init.itcl0000644000077300007730000000352012341332511017450 0ustar giannozzgiannozz# # $RCSfile: init.itcl,v $ -- # # This file contains some initialization code for PWgui. # # Copyright (c) 2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `LICENCE' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: init.itcl,v 1.1 2004-02-23 12:19:48 kokalj Exp $ # proc ::pwscf::init {} { variable settings global env # check if settings(EDITOR) is OK checkCmd settings(EDITOR) # check for vi & vim, i.e, "xterm -e vi" foreach editor {vi vim} { if { [string match "* $editor" $settings(EDITOR)] } { # check if "less" cmd exists if { [auto_execok $editor] == "" } { set settings(PAGER) PWgui } } } # check if settings(PAGER) is OK checkCmd settings(PAGER) # check for less, i.e, "xterm -e less" if { [string match {* less} $settings(PAGER)] } { # check if "less" cmd exists if { [auto_execok less] == "" } { set settings(PAGER) PWgui } } } proc ::pwscf::checkCmd {varName} { upvar $varName var if { [string match -nocase "PWgui" $var] } { if { [llength $var] > 1 } { set editor [lindex $var 0] } else { set editor $var } if { [auto_execok $var] == "" } { # there is no $var command, revert to internal-editor set var PWgui } } } espresso-5.1/PWgui-5.1/src/run.itcl0000644000077300007730000003104012341332511017307 0ustar giannozzgiannozz# # $RCSfile: run.itcl,v $ -- # # This file contains ... # # Copyright (c) 2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: run.itcl,v 1.8 2009-07-16 16:58:45 kokalj Exp $ # proc ::pwscf::run::run {guiObj {init 1} {use_defaults 1}} { variable ::pwscf::settings variable run # initializing ... if { $init == 1 } { _init $guiObj } set moduleObj [$guiObj getSelected moduleObj] set moduleIdent [$guiObj getSelected moduleIdent] if { $use_defaults == 1 } { # use default values set _run(RUN.prefix,$moduleObj) $::pwscf::settings(RUN.prefix) set _run(RUN.postfix,$moduleObj) $::pwscf::settings(RUN.postfix) set _run(PW,$moduleObj) $::pwscf::settings(PW) set _run(PH,$moduleObj) $::pwscf::settings(PH) set _run(PP,$moduleObj) $::pwscf::settings(PP) set _run(PROJWFC,$moduleObj) $::pwscf::settings(PROJWFC) set _run(D3,$moduleObj) $::pwscf::settings(D3) set _run(LD1,$moduleObj) $::pwscf::settings(LD1) } else { # use values as specified in the current configuration set _run(RUN.prefix,$moduleObj) $run(RUN.prefix,$moduleObj) set _run(RUN.postfix,$moduleObj) $run(RUN.postfix,$moduleObj) set _run(PW,$moduleObj) $run(PW,$moduleObj) set _run(PH,$moduleObj) $run(PH,$moduleObj) set _run(PP,$moduleObj) $run(PP,$moduleObj) set _run(PROJWFC,$moduleObj) $run(PROJWFC,$moduleObj) set _run(D3,$moduleObj) $run(D3,$moduleObj) set _run(LD1,$moduleObj) $run(LD1,$moduleObj) } # # determine what program to run # switch -glob -- $moduleIdent { *pw { set runCmd "$_run(RUN.prefix,$moduleObj) $_run(PW,$moduleObj) $_run(RUN.postfix,$moduleObj)" # find out the outdir and create it !!! _mkdirOutdir $moduleObj } *ph { set runCmd "$_run(RUN.prefix,$moduleObj) $_run(PH,$moduleObj) $_run(RUN.postfix,$moduleObj)" # find out the outdir and create it !!! _mkdirOutdir $moduleObj } *pp { set runCmd "$_run(RUN.prefix,$moduleObj) $_run(PP,$moduleObj) $_run(RUN.postfix,$moduleObj)" # find out the outdir and create it !!! _mkdirOutdir $moduleObj } *pr { set runCmd "$_run(RUN.prefix,$moduleObj) $_run(PROJWFC,$moduleObj) $_run(RUN.postfix,$moduleObj)" # find out the outdir and create it !!! _mkdirOutdir $moduleObj } *d3 { set runCmd "$_run(RUN.prefix,$moduleObj) $_run(D3,$moduleObj) $_run(RUN.postfix,$moduleObj)" # find out the outdir and create it !!! _mkdirOutdir $moduleObj } *ld1 { set runCmd "$_run(RUN.prefix,$moduleObj) $_run(LD1,$moduleObj) $_run(RUN.postfix,$moduleObj)" # find out the outdir and create it !!! _mkdirOutdir $moduleObj } default { # module not yet supported ... return 0 } } # # run the calculation # if { $run(mode,$moduleObj) == "nonblocking" } { # run in non-blocking mode (i.e. on the fly) set execID [::tclu::nonblocking open] # display stdout into pager while calculating ::tclu::nonblocking stdout $execID "::pwscf::run::defaultStdOutPager [list $moduleObj]" # run the calculation set status [eval ::tclu::nonblocking exec $execID $runCmd < $run(inpFile,$moduleObj) 2> $run(errFile,$moduleObj)] # CALCULATION is finished, hence ... # save the stdout to outFile ::tclu::nonblocking save $execID $run(outFile,$moduleObj) # we are done ::tclu::nonblocking unset $execID return $status } else { # run in background and forget about it ... eval exec $runCmd < $run(inpFile,$moduleObj) > $run(outFile,$moduleObj) 2> $run(errFile,$moduleObj) & set run(run.done,$moduleObj) 1 return 1 } } proc ::pwscf::run::runAs {guiObj} { variable run # first configure and then run ... set t [::tku::toplevelExists .pwgui_settings] # initializing ... _init $guiObj set moduleObj [$guiObj getSelected moduleObj] set moduleIdent [$guiObj getSelected moduleIdent] set prog [getProg $moduleIdent] # create a configure module set obj [_configureModule $moduleObj $prog] ::guib::widgets::dialogshell $t -title "Configure calculation" -separator 1 -transient 0 $t add Cancel -text "Cancel" -command [list ::pwscf::run::_cancel $t $guiObj] $t add Apply -text "Apply & Run" -command [list ::pwscf::run::_configApply $t $obj $guiObj] $t default Apply # # build the config-GUI recursively # set cs [$t childsite] $obj makeEmbedGUI $cs ::tku::centerWindow $t } proc ::pwscf::run::runAndXC {guiObj} { variable run # first run the calculation set status [run $guiObj] # now display with xcrysden if status is OK, and program is pw.x or pp.x _displayXC $guiObj $status } proc ::pwscf::run::runAsAndXC {guiObj} { variable run # first run the calculation runAs $guiObj # wait for calculation to finish set moduleObj [$guiObj getSelected moduleObj] tkwait variable ::pwscf::run::run(run.done,$moduleObj) # now display with xcrysden if status is OK, and program is pw.x or pp.x _displayXC $guiObj $run(status,$moduleObj) } proc ::pwscf::run::defaultStdOutPager {moduleObj id newLine} { variable run set create 0 if { ! [info exists run(textWidget,$moduleObj)] } { set create 1 } elseif { ! [winfo exists $run(textWidget,$moduleObj)] } { set create 1 } if { $create } { # calling the pager for the first time: create the toplevel # and text widgets ... set t [::guib::widgets::dialogshell [::tku::widgetName] -title "Output file: $run(outFile,$moduleObj)" -separator 1 -transient 0] $t add Close -text Close -command [list destroy $t] $t default Close set w [$t childsite] set run(textWidget,$moduleObj) [::iwidgets::scrolledtext $w.text \ -labeltext "Output file:\n$run(outFile,$moduleObj)" \ -hscrollmode dynamic -vscrollmode dynamic \ -wrap none -state normal] pack $run(textWidget,$moduleObj) -side top -fill both -expand 1 } $run(textWidget,$moduleObj) configure -state normal $run(textWidget,$moduleObj) insert end $newLine $run(textWidget,$moduleObj) yview moveto 1 $run(textWidget,$moduleObj) configure -state disabled } proc ::pwscf::run::_init {guiObj} { variable ::pwscf::settings variable run # initializing ... set moduleObj [$guiObj getSelected moduleObj] set moduleIdent [$guiObj getSelected moduleIdent] ::tclu::newset run(mode,$moduleObj) $run(mode) ::tclu::newset run(RUN.prefix,$moduleObj) $::pwscf::settings(RUN.prefix) ::tclu::newset run(RUN.postfix,$moduleObj) $::pwscf::settings(RUN.postfix) ::tclu::newset run(PW,$moduleObj) $::pwscf::settings(PW) ::tclu::newset run(PH,$moduleObj) $::pwscf::settings(PH) ::tclu::newset run(PP,$moduleObj) $::pwscf::settings(PP) ::tclu::newset run(PROJWFC,$moduleObj) $::pwscf::settings(PROJWFC) ::tclu::newset run(D3,$moduleObj) $::pwscf::settings(D3) ::tclu::newset run(LD1,$moduleObj) $::pwscf::settings(LD1) # # determine what are the IO-files # set inpFile [$guiObj getSelected saveFile] if { $inpFile == "" } { # save the file set inpFile [$guiObj saveAs] if { $inpFile == "" } { # Cancel button was pressed return -code return 0 } } else { $guiObj save 1 ; # "1" here is for nocomplain. I am not sure if nocomplain is good idea ??? } # get the output-file from the input-file; also the error file #set head [regsub {\.(inp|in)$} $inpFile {}] regsub {\.(inp|in)$} $inpFile {} head set run(inpFile,$moduleObj) $inpFile set run(outFile,$moduleObj) $head.out set run(errFile,$moduleObj) $head.err set run(status,$moduleObj) 1 set run(run.done,$moduleObj) 0 } proc ::pwscf::run::getProg {moduleIdent} { switch -glob -- $moduleIdent { *pw { return pw.x } *ph { return ph.x } *pp { return pp.x } *pr { return projwfc.x } *d3 { return d3.x } *atomic { return ld1.x } default { # module not yet supported ... return "" } } } proc ::pwscf::run::_configureModule {moduleObj prog} { set var [string toupper [string trimright $prog .x]] set script [subst -nocommands { optionSetDefault line decor normal optionSetDefault namelist decor normal separator -label "--- PWscf settings ---\n\n The calculation will be executed as: prefix $prog postfix < input > output" line pwscf_fix -name "Prefix & postfix (i.e. Prefix = mpirun -np 2 .AND. Postfix = -npool 2)" { var RUN.prefix -variable ::pwscf::run::run(RUN.prefix,$moduleObj) -label "Prefix:" var RUN.postfix -variable ::pwscf::run::run(RUN.postfix,$moduleObj) -label "Postfix:" } line pwscf_exe -name "Specify $prog executable (i.e. /usr/local/bin/$prog)" { var $var -variable ::pwscf::run::run($var,$moduleObj) -label "Executable \\\"pw.x\\\":" -widget entryfileselect } line io_files -name "Input & Output files" { var inFile -variable ::pwscf::run::run(inpFile,$moduleObj) -label "Input file:" -widget entryfileselect var outFile -variable ::pwscf::run::run(outFile,$moduleObj) -label "Output file:" -widget entryfileselect var errFile -variable ::pwscf::run::run(errFile,$moduleObj) -label "Error file:" -widget entryfileselect } line run_mode -name "Mode of calculation:" { var mode { -variable ::pwscf::run::run(mode,$moduleObj) -label "Mode of calculation:" -textvalue { "on the fly (for short jobs)" "in background (for longer jobs)" } -value { nonblocking background } -widget radiobox } } postprocess { loadFromVar widgetconfigure inFile -width 60 } }] set obj [::guib::moduleObj settings\#auto -title "PWgui: settings" -script $script] } proc ::pwscf::run::_configApply {t configObj guiObj} { variable run if { [winfo exists $t] } { destroy $t } # save "config" variables $configObj saveToVar ::pwscf::run # run the calculation set status [run $guiObj no_init no_defaults] # check the status of the run set moduleObj [$guiObj getSelected moduleObj] if { $status == 1 } { set run(status,$moduleObj) 1 } else { set run(status,$moduleObj) 0 } set run(run.done,$moduleObj) 1 } proc ::pwscf::run::_cancel {t guiObj} { variable run # destroy "config" toplevel if { [winfo exists $t] } { destroy $t } # set the status to zero set moduleObj [$guiObj getSelected moduleObj] set run(status,$moduleObj) 0 set run(run.done,$moduleObj) 1 } proc ::pwscf::run::_mkdirOutdir {moduleObj} { set outdir [string trim [namespace eval ::guib "$moduleObj varvalue outdir"] '\"] if { $outdir != "" } { if { ! [file isdirectory $outdir] } { if { [catch {file mkdir $outdir} errMsg] } { ::tclu::warningDialog "cannot create temporary directory \"$outdir\". Aborting the calculation !!!\n\nERROR message: $errMsg" return -code return 0 } } if { ! [file writable $outdir] } { ::tclu::warningDialog "temporary directory \"$outdir\" is not writable" return -code return 0 } } } proc ::pwscf::run::_displayXC {guiObj status} { variable run set moduleObj [$guiObj getSelected moduleObj] set moduleIdent [$guiObj getSelected moduleIdent] set prog [getProg $moduleIdent] if { $status == 1 } { if { $prog == "pw.x" } { # launch XCRYSDEN in background mode and display the # structure from output file exec xcrysden --pwo $run(outFile,$moduleObj) & } elseif { $prog == "pp.x" } { # check if the output_format == 3 || output_format == 5, and display # the structure/property from fileout set output_format [namespace eval ::guib "$moduleObj vartextvalue output_format"] set fileout [string trim [namespace eval ::guib "$moduleObj varvalue fileout"] '\"] if { [string match *XSF* $output_format] } { # it is an XSF format exec xcrysden --xsf $fileout & } } } } espresso-5.1/PWgui-5.1/src/tclIndex0000644000077300007730000001035112341332511017325 0ustar giannozzgiannozz# 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(::pwscf::_uniqueTabname) [list source [file join $dir auxil.itcl]] set auto_index(::pwscf::view::inputByPager) [list source [file join $dir view.itcl]] set auto_index(::pwscf::view::structByXcrysden) [list source [file join $dir view.itcl]] set auto_index(::pwscf::view::defaultPager) [list source [file join $dir view.itcl]] set auto_index(::pwscf::settings) [list source [file join $dir settings.itcl]] set auto_index(::pwscf::_settingsOK) [list source [file join $dir settings.itcl]] set auto_index(::pwscf::_settingsApply) [list source [file join $dir settings.itcl]] set auto_index(::pwscf::_settingsSave) [list source [file join $dir settings.itcl]] set auto_index(::pwscf::_settingsSave_Unix) [list source [file join $dir settings.itcl]] set auto_index(::pwscf::_settingsSaveToFile) [list source [file join $dir settings.itcl]] set auto_index(::pwscf::_settingsModule) [list source [file join $dir settings.itcl]] set auto_index(::pwscf::edit::inputByEditor) [list source [file join $dir edit.itcl]] set auto_index(::pwscf::edit::defaultEditor) [list source [file join $dir edit.itcl]] set auto_index(::pwscf::edit::_defaultEditorCancel) [list source [file join $dir edit.itcl]] set auto_index(::pwscf::edit::_defaultEditorClose) [list source [file join $dir edit.itcl]] set auto_index(::pwscf::edit::_defaultEditorDone) [list source [file join $dir edit.itcl]] set auto_index(::pwscf::edit::_defaultEditorSave) [list source [file join $dir edit.itcl]] set auto_index(::pwscf::edit::_defaultEditorSaveAs) [list source [file join $dir edit.itcl]] set auto_index(::pwscf::run::run) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::runAs) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::runAndXC) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::runAsAndXC) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::defaultStdOutPager) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::_init) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::getProg) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::_configureModule) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::_configApply) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::_cancel) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::_mkdirOutdir) [list source [file join $dir run.itcl]] set auto_index(::pwscf::run::_displayXC) [list source [file join $dir run.itcl]] set auto_index(::pwscf::menustate::editable) [list source [file join $dir menustate.itcl]] set auto_index(::pwscf::menustate::xcrysden) [list source [file join $dir menustate.itcl]] set auto_index(::pwscf::menustate::runnable) [list source [file join $dir menustate.itcl]] set auto_index(::pwscf::menustate::runnableXC) [list source [file join $dir menustate.itcl]] set auto_index(::pwscf::init) [list source [file join $dir init.itcl]] set auto_index(::pwscf::checkCmd) [list source [file join $dir init.itcl]] set auto_index(::pwscf::readFilter::replaceFlag) [list source [file join $dir modutil.itcl]] set auto_index(::pwscf::readFilter::replaceVarFlag) [list source [file join $dir modutil.itcl]] set auto_index(::pwscf::readFilter::logicalFlag) [list source [file join $dir modutil.itcl]] set auto_index(::pwscf::readFilter::purifyCardLine) [list source [file join $dir modutil.itcl]] set auto_index(::pwscf::readFilter::amassIndex) [list source [file join $dir modutil.itcl]] set auto_index(::pwscf::readFilter::default) [list source [file join $dir modutil.itcl]] set auto_index(::pwscf::readFilter::findNamelists) [list source [file join $dir modutil.itcl]] set auto_index(::pwscf::readFilter::findCards) [list source [file join $dir modutil.itcl]] set auto_index(::pwscf::readFilter::findNamelistsAndCards) [list source [file join $dir modutil.itcl]] set auto_index(::pwscf::selectFileRoot) [list source [file join $dir modutil.itcl]] espresso-5.1/PWgui-5.1/src/menustate.itcl0000644000077300007730000000363312341332511020517 0ustar giannozzgiannozz# # $RCSfile: menustate.itcl,v $ -- # # This file contains ... # # Copyright (c) 2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: menustate.itcl,v 1.4 2009-07-16 16:58:45 kokalj Exp $ # proc ::pwscf::menustate::editable {obj moduleIdent} { ::tclu::DEBUG editable: moduleIdent = $moduleIdent if { $moduleIdent == "" } { return disabled } else { return normal } } proc ::pwscf::menustate::xcrysden {obj moduleIdent} { global env ::tclu::DEBUG xcrysden: moduleIdent = $moduleIdent if { [auto_execok xcrysden] != "" && ! [info exists env(XCRYSDEN_TOPDIR)] } { } if { ( ! [info exists env(XCRYSDEN_TOPDIR)] && [auto_execok xcrysden] == "" ) || ! [string match *pw $moduleIdent] } { return disabled } else { return normal } } proc ::pwscf::menustate::runnable {obj moduleIdent} { ::tclu::DEBUG runnable: moduleIdent = $moduleIdent if { [regexp {(pw|ph|pp|pr|d3|atomic)} $moduleIdent] } { return normal } else { return disabled } } proc ::pwscf::menustate::runnableXC {obj moduleIdent} { global env ::tclu::DEBUG runnable: moduleIdent = $moduleIdent if { [regexp {(pw|pp)} $moduleIdent] && [info exists env(XCRYSDEN_TOPDIR)] } { return normal } else { return disabled } } espresso-5.1/PWgui-5.1/src/auxil.itcl0000644000077300007730000000305512341332511017632 0ustar giannozzgiannozz# # $RCSfile: auxil.itcl,v $ -- # # This file contains ... # # Copyright (c) 2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: auxil.itcl,v 1.1 2004-02-20 15:12:02 kokalj Exp $ # # ------------------------------------------------------------------------ # _uniqueTabname -- generates unique tabname # ------------------------------------------------------------------------ proc ::pwscf::_uniqueTabname {name} { variable tabNames if { ! [info exists tabNames] } { lappend tabNames $name return $name } else { if { [lsearch $tabNames $name] < 0 } { lappend tabNames $name return $name } else { # $name already exists; generate unique one set i 0 while { [lsearch $tabNames "$name (\#$i)"] >= 0 } { ::tclu::DEBUG _uniqueTabname: i=$i : [lsearch $tabNames "$name (\#$i)"] incr i } lappend tabNames "$name (\#$i)" return "$name (\#$i)" } } } espresso-5.1/PWgui-5.1/src/view.itcl0000644000077300007730000001037412341332511017464 0ustar giannozzgiannozz# # $RCSfile: view.itcl,v $ -- # # This file contains ... # # Copyright (c) 2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: view.itcl,v 1.6 2009-07-16 16:58:45 kokalj Exp $ # proc ::pwscf::view::inputByPager {guiObj} { variable ::pwscf::settings set moduleObj [$guiObj getSelected moduleObj] set moduleIdent [$guiObj getSelected moduleIdent] set tmpFile [::tclu::tempFile name pwscf_$moduleIdent] namespace eval ::guib "$moduleObj save $tmpFile 1" if { [string match -nocase "PWgui" $::pwscf::settings(PAGER)] } { defaultPager $tmpFile } else { if { [catch {eval exec $::pwscf::settings(PAGER) $tmpFile &}] } { # revert to default PAGER defaultPager $tmpFile } } } proc ::pwscf::view::structByXcrysden {guiObj} { variable ::pwscf::settings global env if { ! [info exists env(XCRYSDEN_TOPDIR)] && [auto_execok xcrysden] != "" } { # # new versions of xcrysden does not require XCRYSDEN_TOPDIR anymore; # check if it is installed ... # set xc [auto_execok xcrysden] if { $xc != "" } { set xc_dir [file dirname $xc] if { ! [file exists $xc_dir/usage] } { # xcrysden script is installed system wide ... search further ... foreach line [split [::tclu::readFile $xc] \n] { if { [string match *XCRYSDEN_TOPDIR=* $line] } { set xc_dir [regsub XCRYSDEN_TOPDIR= $line {}] } } } set env(XCRYSDEN_TOPDIR) $xc_dir } else { tk_messageBox -title Notification -type ok -icon info \ -message "Seems that xcrysden is not installed !!!" return } } set moduleObj [$guiObj getSelected moduleObj] set moduleIdent [$guiObj getSelected moduleIdent] set tabName [$guiObj getSelected tabName] set tmpFile [::tclu::tempFile name pwscf.$moduleIdent] namespace eval ::guib "$moduleObj save $tmpFile 1" # check if XCRYSDEN version supports --use option if { [file exists $env(XCRYSDEN_TOPDIR)/usage] } { if { [string match *--use* [::tclu::readFile $env(XCRYSDEN_TOPDIR)/usage]] } { set allowEmbedding 1 } else { set allowEmbedding 0 } } else { set allowEmbedding 0 } if { $::pwscf::settings(XCRYSDEN.openAs) == "notebook-page" && $allowEmbedding } { # create new notebook page for XCRYSDEN ... ::tclu::DEBUG structByXcrysden.1 set name [::pwscf::_uniqueTabname "XCRYSDEN: [lindex $tabName end]"] set w [$guiObj page add $name] set tabIndex [$guiObj getSelected tabIndex] update set winID [winfo id $w] # BEWARE: xcrysden should be executed in nonblocking (not # background) mode, and upon exit, the page should be closed ::tclu::DEBUG structByXcrysden.2 set execID [::tclu::nonblocking open] eval ::tclu::nonblocking exec $execID xcrysden --use $winID --pwi $tmpFile ::tclu::DEBUG structByXcrysden.3 ::tclu::nonblocking unset $execID # XCRYSDEN has exited; delete xcrysden page ... $guiObj page delete $tabIndex } else { # launch XCRYSDEN in background mode exec xcrysden --pwi $tmpFile & } } #proc ::pwscf::XCRYSDEN {obj} { # set w [$obj page add XCRYSDEN] # update # set id [winfo id $w] # exec xcrysden --use $id & #} proc ::pwscf::view::defaultPager {file} { set t [::guib::widgets::dialogshell [::tku::widgetName] -title "Pager: $file" -separator 1 -transient 0] $t add Close -text Close -command [list destroy $t] $t default Close set w [$t childsite] set text [::iwidgets::scrolledtext $w.text \ -hscrollmode dynamic -vscrollmode dynamic \ -wrap none -state normal] $text import $file $text configure -state disabled pack $text -side top -fill both -expand 1 } espresso-5.1/PWgui-5.1/src/pwscf.theme0000644000077300007730000000410312341332511017774 0ustar giannozzgiannozz*Entry.width: 15 *Entryfield.width: 15 *Spinint.width: 15 *Spininthelp.width: 15 *Entryhelp.width: 15 *Spinner.width: 15 *Button.background: #aaaaaa *menuBackground: #aaaaaa *Scrolledframe.hscrollMode: dynamic *Scrolledframe.vscrollMode: dynamic *Scrolledframe.relief: sunken *Scrolledframe.borderWidth: 1 *Scrolledframe*Frame*background: White *Scrolledframe*Canvas*background: White *Scrolledframe.width: 960 *Scrolledframe.height: 707 *Tabset.padX: 0 *Tabset.padY: 0 *Tabnotebook.tabPos: n *Tabnotebook.auto: 1 *Tabnotebook.angle: 15 *Tabnotebook.background: #d9d9d9 *Tabnotebook.tabBackground: #999999 *Tabnotebook.tabForeground: Black *Tabnotebook.foreground: Black *Tabnotebook.bevelAmount: 0 *Tabnotebook.gap: overlap *Tabnotebook.margin: 0 *Tabnotebook.tabBorders: true *Tabnotebook.raiseSelect: true *Tabnotebook.borderWidth: 2 *Tabnotebook.backdrop: #d9d9d9 *Tabnotebook.equalTabs: false *Actiondialog.Button.height: 3 *Actiondialog.Button.borderWidth: 4 *Actiondialog.Button.background: #ffffaa *Actiondialog.Button.activeBackground: #ffffff *Actiondialog.Button.highlightBackground: #000000 *Toolbar.padX: 0 *Toolbar.padY: 0 *Labeledframe*justify: left !! doesn't work yet: *Dialogshell.width: 800 *Dialogshell.Frame.width: 800 *Shell.width: 800 !!*font: fixed !!*labelFont: fixed espresso-5.1/PWgui-5.1/src/modutil.itcl0000644000077300007730000002540212341332511020165 0ustar giannozzgiannozz# # $RCSfile: modutil.itcl,v $ -- # # This file contains utilities functions used/shared by # various modules, such as auxiliary functions for # readfilters, ... # # Copyright (c) 2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: modutil.itcl,v 1.4 2008-02-15 17:30:04 kokalj Exp $ # namespace eval ::pwscf::readFilter {} #****f* module/Functions # SYNOPSIS proc ::pwscf::readFilter::replaceFlag {line reference args} { # PURPOSE # Handle properly multiple flags with the same meaning, that is, # for example: map 'methfessel-paxton', or 'm-p', or 'mp' --> 'methfessel-paxton' # EXAMPLE # readFilter::replaceFlag $line methfessel-paxton m-p mp # ARGUMENTS # * line -- line of input to replace the flag to a reference value # * reference -- reference value for flag (i.e. 'methfessel-paxton') # * args -- possible other value of flag with the same meaning ('m-p' and 'mp') # SOURCE set _line $line foreach flag $args { if { [regexp \[\"'\]${flag}\[\"'\] $line] } { regsub $flag $line $reference _line break } } return $_line } #****** #****f* module/Functions # SYNOPSIS proc ::pwscf::readFilter::replaceVarFlag {line var optsList} { # PURPOSE # Handle properly multiple flags with the same meaning, that is, # for example: map 'methfessel-paxton', or 'm-p', or 'mp' --> 'methfessel-paxton' # EXAMPLE # readFilter::replaceVarFlag $line $var optList # ARGUMENTS # * line -- line of input to replace the flag to a reference value # * var -- name of the variable for which to replace a flag to a reference flag # * optList -- kind of double-list of options (the first option-value is taken as a reference), i.e.: # set optList { # {'gaussian' 'gauss'} # {'methfessel-paxton' 'm-p' 'mp'} # {'marzari-vanderbilt' 'cold' 'm-v' 'mv'} # {'fermi-dirac' 'f-d' 'fd'} # } # SOURCE if { ! [string match *${var}* $line] } { return $line } set substituted 0 set spl [split $line =] set nl [llength $spl] set new_spl [lindex $spl 0] for {set i 1} {$i < $nl} {incr i} { set var_ [string trim [lindex [lindex $spl [expr $i - 1]] end] ,] set value_ [lindex $spl $i] if { $var_ == $var } { # ok we find the proper variable; replace its flag with the reference value foreach opts $optsList { # set reference [lindex $opts 0] set flags [lrange $opts 1 end] foreach flag $flags { # if { [regexp ${flag} $value_] } { # set value_ [regsub $flag $value_ $reference] set substituted 1 break } } } } lappend new_spl $value_ } if { $substituted } { set line [join $new_spl =] } return $line } #****** proc ::pwscf::readFilter::logicalFlag {line} { # PURPOSE # Convert all variants of .TRUE. .true. .T. .t. ---> .true. # and all variants of .FALSE. .false. .F. .f. ---> .false. foreach true {true t} { set regexp "= {0,}\[.\]${true}\[.\]" if { [regexp -nocase -- $regexp $line] } { regsub -all -nocase -- $regexp $line {= .true.} line } } foreach false {false f} { set regexp "= {0,}\[.\]${false}\[.\]" if { [regexp -nocase -- $regexp $line] } { regsub -all -nocase -- $regexp $line {= .false.} line } } return $line } proc ::pwscf::readFilter::purifyCardLine {cardLine} { # PURPOSE # Purify the card-line, which can hold something like: "ATOMIC_POSITIONS { alat }", # but we want: ""ATOMIC_POSITIONS alat" set _part1 [lindex $cardLine 0] set _part2 [string tolower [string trim [lrange $cardLine 1 end] "{}()"]] return "${_part1} ${_part2}" } proc ::pwscf::readFilter::amassIndex {line {maxIndex 0}} { # PURPOSE # search for the largest index of amass()-dimension in $line and # return the largest index found; $line is a line of input foreach field [split $line =] { if { [regexp -nocase {amass\([0-9]+\)} $field matchVar] } { regexp {[0-9]+} $matchVar index if { $index > $maxIndex } { set maxIndex $index } } } return $maxIndex } # consider these variables: # Variable: exist_namelist -- namelists that must exist # Variable: exist_cards -- cards that must exist proc ::pwscf::readFilter::default {moduleObj channel {filterMode logical} {replList {}}} { # PURPOSE # Default readfilter, which can have several possible modes: # # Variable: filterMode # Description: # mode=amass search for largest amass(*) index and assign the # ntyp variables # # mode=logical repleace all possible values of Fortran logical # variables with .true. or .false. # # The value of filterMode is cumulative, i.e., "amass logical" is # allowed # # Variable: replList # Description: replList are double list of the form # { {replaceFromList1 replaceToItem1} {replaceFromList2 replaceToItem2} ... } # set amass 0 set logical 0 if { [string match "*amass*" $filterMode] } { set amass 1 } if { [string match "*logical*" $filterMode] } { set logical 1 } set maxIndex 0 set output {} while { ! [eof $channel] } { gets $channel _line if { $amass } { set maxIndex [amassIndex $_line $maxIndex] } if { $logical } { set _line [logicalFlag $_line] } if { $replList != "" } { foreach repl $replList { set replFromList [lindex $repl 0] set replToItem [lindex $repl 1] set _line [eval {replaceFlag $_line $replToItem} $replFromList] #foreach replItem $replFromList { # set _line [replaceFlag $_line $replToItem $replItem] #} } } append output $_line\n } if { $maxIndex > 0 && $amass } { $moduleObj varset ntyp -value $maxIndex } # close the old channel close $channel # open a new channel (i.e. temporary file) and write the # $output to it set tmpfile [::tclu::tempFile name input] set newChannel [open $tmpfile w+] puts $newChannel $output flush $newChannel # rewind the newChannel seek $newChannel 0 start return $newChannel } proc ::pwscf::readFilter::findNamelists {moduleObj channel namelists errMsgVar} { upvar $errMsgVar errMsg # PURPOSE: # Find if given namelists exist in the input file. # # Variable: namelists -- list of namelist (namelists names should be without "&" prefix) # # errMsgVar -- contain the error message on output # # Returns: # 1 -- if namelist is present # 0 -- if namelist is not present # init ... set _errMsg "- the following namelists are missing:\n" foreach name $namelists { set exist($name) 0 } # start from the beginning of input file seek $channel 0 start # search the file while { ! [eof $channel] } { gets $channel _line foreach name $namelists { if { [string match -nocase "*&${name}*" $_line] } { set exist($name) 1 } } } # file position back to the start of file seek $channel 0 start # post-processing ... set result 1 foreach name $namelists { if { $exist($name) == 0 } { # should we make some info about the missing namelists append _errMsg " &${name}\n" #lappend pwscf($moduleObj,missing.namelists) "&$name" set result 0 } } if { ! $result } { set errMsg $_errMsg } return $result } proc ::pwscf::readFilter::findCards {moduleObj channel cardlists errMsgVar {nocase 0}} { upvar $errMsgVar errMsg # PURPOSE # Find if given cards exist in the input file. # # Variable: cardlist -- list of cards to search for # # errMsgVar -- contain the error message on output # # Returns: # 1 -- if namelist is present # 0 -- if namelist is not present # init ... set _errMsg "- the following cards are missing:\n" foreach name $cardlists { set exist($name) 0 } # start from the beginning of input file seek $channel 0 start # search the file while { ! [eof $channel] } { gets $channel _line foreach name $cardlists { if { [::tclu::stringMatch "*${name}*" $_line $nocase] } { set exist($name) 1 } } } # file position back to the start of file seek $channel 0 start # post-processing ... set result 1 foreach name $cardlists { if { $exist($name) == 0 } { # should we make some info about the missing cardlists append _errMsg " ${name}\n" #lappend pwscf($moduleObj,missing.cards) "$name" set result 0 } } if { ! $result } { set errMsg $_errMsg } return $result } proc ::pwscf::readFilter::findNamelistsAndCards {moduleObj channel formatName namelists cards errMsgVar {cards_nocase 0}} { upvar $errMsgVar errMsg # # Purpose: find if given namelists and cards exist in the input file set nml_status [::pwscf::readFilter::findNamelists $moduleObj $channel $namelists nml_errMsg] set card_status [::pwscf::readFilter::findCards $moduleObj $channel $cards card_errMsg $cards_nocase] if { $nml_status == 0 || $card_status == 0 } { #set errMsg "selected file is not a pw.x formatted or contains severe syntax errors.\n\nDiagnosis:\n" if { $nml_status == 0 } { append errMsg " $nml_errMsg\n" } if { $card_status == 0 } { append errMsg " $card_errMsg" } return 0 } return 1 } proc ::pwscf::selectFileRoot {moduleObj variable} { # PURPOSE # Select the root of a filename and quote it. # Example: file.ext --> 'file' variable pwscf set _dir [string trim [$moduleObj varvalue outdir] "'"] if { [file isdirectory $_dir] } { set dir $_dir } elseif { [info exists pwscf($moduleObj,LASTDIR,punchfile)] } { set dir $pwscf($moduleObj,LASTDIR,punchfile) } else { set dir $pwscf(PWD) } set file [tk_getOpenFile \ -initialdir $dir \ -title "Select a Punch File"] if { $file == "" } { return } set pwscf($moduleObj,LASTDIR,punchfile) [file dirname $file] set file '[file tail [file rootname $file]]' $moduleObj varset $variable -value $file } espresso-5.1/PWgui-5.1/src/aindex0000755000077300007730000000060112341332511017023 0ustar giannozzgiannozz#!/bin/sh # \ exec tclsh $0 package require Itcl namespace import -force itcl::* puts "\n Creating the tclIndex file ..." if { [glob -nocomplain -- *.itcl] != {} } { auto_mkindex [pwd] *.itcl puts " tclIndex file created !!!" puts " Size of tclIndex file: [exec wc tclIndex]" } else { puts "\n Can't create tclIndex file: no *.itcl files found !!!" } puts " DONE.\n" exit espresso-5.1/PWgui-5.1/src/settings.itcl0000644000077300007730000002254712341332511020357 0ustar giannozzgiannozz# # $RCSfile: settings.itcl,v $ -- # # This file contains ... # # Copyright (c) 2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: settings.itcl,v 1.7 2009-07-16 16:58:45 kokalj Exp $ # proc ::pwscf::settings {gui} { set t [::tku::toplevelExists .pwgui_settings] set obj [_settingsModule] ::guib::widgets::dialogshell $t -title "PWgui Settings" -separator 1 -transient 0 $t add Close -text Close -command [list destroy $t] $t add Save -text Save -command [list ::pwscf::_settingsSave $obj] $t add Apply -text Apply -command [list ::pwscf::_settingsApply $obj] $t add OK -text "Apply & Close" -command [list ::pwscf::_settingsOK $t $obj] $t default OK # # build the GUI recursively # set cs [$t childsite] $obj makeEmbedGUI $cs $t configure -width 700 #::tku::centerWindow $t } proc ::pwscf::_settingsOK {t obj} { _settingsApply $obj destroy $t } proc ::pwscf::_settingsApply {obj} { $obj saveToVar ::pwscf puts stderr [array get ::pwscf::settings] puts stderr "::pwscf::settings_how_exe = $::pwscf::settings_how_exe" if { $::pwscf::settings_how_exe == "path" } { set ::pwscf::settings(PW) $::pwscf::settings(BINDIR)/pw.x set ::pwscf::settings(PH) $::pwscf::settings(BINDIR)/ph.x set ::pwscf::settings(PP) $::pwscf::settings(BINDIR)/pp.x set ::pwscf::settings(PROJWFC) $::pwscf::settings(BINDIR)/projwfc.x set ::pwscf::settings(D3) $::pwscf::settings(BINDIR)/d3.x set ::pwscf::settings(LD1) $::pwscf::settings(BINDIR)/ld1.x } } proc ::pwscf::_settingsSave {obj} { _settingsApply $obj switch $::tcl_platform(platform) { unix { # save settings to $HOME/.pwgui/pwgui.settings _settingsSave_Unix $obj } macintosh { # I don't know how to do it for macintosh _settingsSave_Unix $obj } default { # ... and neither for MS-Windows _settingsSave_Unix $obj } } } proc ::pwscf::_settingsSave_Unix {obj} { global env set dir [file join $env(HOME) .pwgui] if { ! [file exists $dir] } { # $HOME/.pwgui/ does not exists yet, create it if { [catch {file mkdir $dir}] } { ::tku::errorDialog "unable to save PWgui Settings, because directory $dir can't be created" } } if { [file isdirectory $dir] } { _settingsSaveToFile $obj $dir/pwgui.settings } else { ::tku::errorDialog "unable to save PWgui Settings, because \"$dir\" is not directory" } } proc ::pwscf::_settingsSaveToFile {obj file} { ::tclu::DEBUG _settingsSaveToFile: $obj set vars [$obj getAllVar var] set content "# ---------------------------------------------------------------------\n" append content "# BEWARE: this file was generated by PWgui\n" append content "# and will be overwritten by PWgui upon Save-settings request\n" append content "# ---------------------------------------------------------------------\n\n" foreach var $vars { upvar \#0 $var varValue if { [info exists varValue] } { append content "set $var \"${varValue}\"\n" } } ::tclu::writeFile $file $content } proc ::pwscf::_settingsModule {} { set obj [::guib::moduleObj settings\#auto -title "PWgui: settings" -script { optionSetDefault line decor normal optionSetDefault namelist decor normal page pwscf -name "PWscf settings" { line pwscf_fix -name "Prefix & postfix (i.e. Prefix = mpirun -np 2 && Postfix = -npool 2)" { var RUN.prefix -variable ::pwscf::settings(RUN.prefix) -label "Prefix:" var RUN.postfix -variable ::pwscf::settings(RUN.postfix) -label "Postfix:" } line pwscf_exe -name "Specify executables (i.e. /usr/local/bin/pw.x)" { auxilvar HOW_EXE { -label "How to specify executables:" -widget radiobox -textvalue { "by specifying the path" "each executable separately" } -value { path binaries } } group path -decor normal { var BINDIR -variable ::pwscf::settings(BINDIR) -label "Specify the path for QE binaries:" -widget entrydirselect } group binaries -decor normal { var PW -variable ::pwscf::settings(PW) -label "Executable \"pw.x\":" -widget entryfileselect var PH -variable ::pwscf::settings(PH) -label "Executable \"ph.x\":" -widget entryfileselect var PP -variable ::pwscf::settings(PP) -label "Executable \"pp.x\":" -widget entryfileselect var PROJWFC -variable ::pwscf::settings(PROJWFC) -label "Executable \"projwfc.x\":" -widget entryfileselect var D3 -variable ::pwscf::settings(D3) -label "Executable \"d3.x\":" -widget entryfileselect var LD1 -variable ::pwscf::settings(LD1) -label "Executable \"ld1.x\":" -widget entryfileselect } } } page general -name "PWgui settings" { line pwguil1 -name "Editors & Viewers" { var EDITOR -variable ::pwscf::settings(EDITOR) -label "Text-file editor:" -widget combobox var PAGER -variable ::pwscf::settings(PAGER) -label "Text-file viewer program:" -widget combobox var HTMLVIEWER -variable ::pwscf::settings(HTMLVIEWER) -label "HTML viewer program:" -widget combobox } line pwguil2 -name "XCrySDen" { var XCRYSDEN.openAs { -variable ::pwscf::settings(XCRYSDEN.openAs) -label "Launch XCRYSDEN:" -value {standalone notebook-page} -textvalue {"as standalone application" "in notebook page"} -widget radiobox } } } page syntax -name "Input-syntax settings" { line pIOl1 -name "FORTRAN namelists" { # take care of GUIB's settings() array var NAMELIST.end_regexp -variable ::guib::settings(NAMELIST.end_regexp) -label "Read-regexp for FORTRAN namelist end-marker:" var NAMELIST.end_string -variable ::guib::settings(NAMELIST.end_string) -label "Write-string for FORTRAN namelist end-marker:" var NAMELIST.varname_nocase { -variable ::guib::settings(NAMELIST.varname_nocase) -label "FORTRAN namelist variable's names\nare case insensitive:" -textvalue {Yes No} -value {1 0} -widget radiobox } var NAMELIST.varname_format { -variable ::guib::settings(NAMELIST.varname_format) -label "FORTRAN namelist variable's name write format:" } var NAMELIST.variable_support_undefined { -variable ::guib::settings(NAMELIST.variable_support_undefined) -label "Allow undefined variables in the FORTRAN namelist:" -textvalue {Yes No} -value {1 0} -widget radiobox } } # NOT SUPPORTED YET: #line pIOl2 -name "Case sensitivity of input-files" { # var INPUT.nocase { # -variable ::guib::settings(INPUT.nocase) # -label "Syntax of input-files is case-sensitive" # -textvalue {Yes No} -value {1 0} # -widget radiobox # } # # # separator -label "-- Prefereces for case-insensitive input-file syntax --" # # var INPUT.nocase_preference_keyword { # -variable ::guib::settings(INPUT.nocase_preference_keyword) # -label "Write keywords as:" # -value {upper lower unchanged} # -textvalue {"Upper-case" "Lower-case" "Unchanged"} # -widget optionmenu # } # var INPUT.nocase_preference_varvalue { # -variable ::guib::settings(INPUT.nocase_preference_varvalue) # -label "Write string-values as:" # -value {upper lower unchanged} # -textvalue {"Upper-case" "Lower-case" "Unchanged"} # -widget optionmenu # } #} } page debug -name "DEBUG settings" { line p3l1 -name "DEBUGING" { # take care of GUIB's settings() array var ::tclu::DEBUG { -label "Print debugging messages to StdOut/StdErr:" -value {1 0} -textvalue {Yes No} -widget radiobox } var ::tclu::DEBUG_FILE { -label "Print debugging messages to file DEBUG:" -value {1 0} -textvalue {Yes No} -widget radiobox } } } tracevar HOW_EXE w { set how [varvalue HOW_EXE] if { $how == "path" } { varset HOW_EXE -value path set ::pwscf::settings_how_exe path groupwidget path enable groupwidget binaries disable } else { set ::pwscf::settings_how_exe binaries groupwidget path disable groupwidget binaries enable } } postprocess { loadFromVar #foreach var { # INPUT.nocase INPUT.nocase_preference_keyword INPUT.nocase_preference_varvalue #} { # # not supported yet --> disable # widget $var disable #} foreach elem {EDITOR PAGER} { widgetconfigure $elem -editable true -textvalues $::pwscf::settings($elem.list) } widgetconfigure PW -width 50 set how [varvalue HOW_EXE] if { $how == {} } { varset HOW_EXE -value path } puts stderr "how=$how" } }] return $obj } espresso-5.1/PWgui-5.1/src/edit.itcl0000644000077300007730000001151112341332511017431 0ustar giannozzgiannozz# # $RCSfile: edit.itcl,v $ -- # # This file contains ... # # Copyright (c) 2004 Anton Kokalj Email: tone.kokalj@ijs.si # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 # ANTON KOKALJ 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. # # # $Id: edit.itcl,v 1.2 2004-02-23 12:14:43 kokalj Exp $ # proc ::pwscf::edit::inputByEditor {what guiObj} { variable ::pwscf::settings variable edit variable counter if { ! [info exists counter] } { set counter 0 } else { incr counter } set moduleObj [$guiObj getSelected moduleObj] set moduleIdent [$guiObj getSelected moduleIdent] set tmpFile [::tclu::tempFile name pwscf_$moduleIdent] namespace eval ::guib "$moduleObj save $tmpFile 1" # check if EDITOR is OK if { [auto_execok [lindex $::pwscf::settings(EDITOR) 0]] == "" } { # rescue me ... set editor PWgui } else { # EDITOR is OK set editor $::pwscf::settings(EDITOR) } # do the editing switch -exact -- $what { original { # edit original input with EDITOR # disable selected page .. set index [$guiObj getSelected tabIndex] $guiObj page disable $index # load file into editor ... if { [string match -nocase "PWgui" $editor] } { defaultEditor $tmpFile $counter tkwait variable ::pwscf::edit::edit(done,$counter) } else { set id [::tclu::nonblocking open] eval ::tclu::nonblocking exec $id $editor $tmpFile ::tclu::nonblocking unset $id } # enable pack previously disabled page ... $guiObj page enable $index # load the edit file back into the GUI ... namespace eval ::guib "$moduleObj openFile $tmpFile" } copy { # edit copy of input with EDITOR if { [string match -nocase "PWgui" $editor] } { defaultEditor $tmpFile } else { if { [catch {eval exec $editor $tmpFile &}] } { defaultEditor $tmpFile } } } default { ::tclu::ERROR "wrong mode $what, must be original or copy" } } } proc ::pwscf::edit::defaultEditor {file {counter ""}} { variable edit set t [::guib::widgets::toplevel [::tku::widgetName] -title "File: $file" -transient 0] set edit(saveFile,$t) $file set edit(counter,$t) $counter set text [::iwidgets::scrolledtext $t.text \ -hscrollmode dynamic -vscrollmode dynamic \ -wrap none -state normal] $text import $file set bb [::iwidgets::buttonbox $t.bb] $bb add Cancel -text "Cancel" -command [list ::pwscf::edit::_defaultEditorCancel $t] $bb add Save -text "Save" -command [list ::pwscf::edit::_defaultEditorSave $t $text] $bb add SaveAs -text "Save As" -command [list ::pwscf::edit::_defaultEditorSaveAs $t $text] $bb add Close -text "Save & Close" -command [list ::pwscf::edit::_defaultEditorClose $t $text] $bb default Close pack $text -side top -fill both -expand 1 pack $bb -side top -fill x -expand 1 } proc ::pwscf::edit::_defaultEditorCancel {t} { variable edit set button [tk_messageBox \ -message "Changes will be lost. Really close this window?" \ -type yesno -icon question] if { $button == "yes" } { _defaultEditorDone $t } } proc ::pwscf::edit::_defaultEditorClose {t textWid} { _defaultEditorSave $t $textWid _defaultEditorDone $t } proc ::pwscf::edit::_defaultEditorDone {t} { variable edit set counter $edit(counter,$t) array unset edit *,$t if { $counter != "" } { set edit(done,$counter) 1 } destroy $t } proc ::pwscf::edit::_defaultEditorSave {t textWid} { variable edit if { [info exists edit(saveFile,$t)] } { $textWid export $edit(saveFile,$t) } } proc ::pwscf::edit::_defaultEditorSaveAs {t textWid} { variable ::pwscf::pwscf variable edit set filetypes { {{Input Files} {.inp}} {{Input Files} {.in} } {{All Files} * } } set saveFile [tk_getSaveFile \ -initialdir $::pwscf::pwscf(PWD) \ -title "Save File As" \ -defaultextension .inp \ -filetypes $filetypes] # maybe Cancel button was pressed if { $saveFile == "" } { return } # now save the file set edit(saveFile,$t) $saveFile _defaultEditorSave $t $textWid $t configure -title "File: [file tail $saveFile]" } espresso-5.1/PWgui-5.1/doc/0000755000077300007730000000000012341333047015613 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/doc/pwdocs/0000755000077300007730000000000012341333047017112 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/doc/pwdocs/INPUT_PH.html0000644000077300007730000010337112341333046021272 0ustar giannozzgiannozz

------------------------------------------------------------------------
INPUT FILE DESCRIPTION

Program: ph.x / PWscf / Quantum Espresso
------------------------------------------------------------------------


Input data format: { } = optional, [ ] = it depends, # = comment

Structure of the input data:
===============================================================================

title_line

&INPUTPH
   ...
/

[ xq(1) xq(2) xq(3) ]                        # if ldisp != .true.  and  qplot != .true.

[ nqs                                        # if qplot == .true.
  xq(1,i)    xq(2,i)    xq(3,1)    nq(1)
  ...
  xq(1,nqs)  xq(2,nqs)  xq(3,nqs)  nq(nqs) ]

[ atom(1)  atom(2)  ... atom(nat_todo) ]     # if "nat_todo" was specified



========================================================================
Line of input:

      title_line
   
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Variable:       title_line
      
      Type:           CHARACTER
      Description:    Title of the job, i.e., a line that is reprinted on output.
      +--------------------------------------------------------------------
      
===End of line-of-input=================================================


========================================================================
NAMELIST: &INPUTPH

   +--------------------------------------------------------------------
   Variable:       amass(i), i=1,ntyp
   
   Type:           REAL
   Default:        0.0
   Description:    Atomic mass [amu] of each atomic type.
                   If not specified, masses are read from data file.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       outdir
   
   Type:           CHARACTER
   Default:        value of the ESPRESSO_TMPDIR environment variable if set;
                   current directory ('./') otherwise
   Description:    Directory containing input, output, and scratch files;
                   must be the same as specified in the calculation of
                   the unperturbed system.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       prefix
   
   Type:           CHARACTER
   Default:        'pwscf'
   Description:    Prepended to input/output filenames; must be the same
                   used in the calculation of unperturbed system.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       niter_ph
   
   Type:           INTEGER
   Default:        maxter=100
   Description:    Maximum number of iterations in a scf step. If you want
                   more than 100, edit variable "maxter" in PH/phcom.f90
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tr2_ph
   
   Type:           REAL
   Default:        1e-12
   Description:    Threshold for self-consistency.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       alpha_mix(niter)
   
   Type:           REAL
   Default:        alpha_mix(1)=0.7
   Description:    Mixing factor (for each iteration) for updating
                   the scf potential:
                   
                   vnew(in) = alpha_mix*vold(out) + (1-alpha_mix)*vold(in)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nmix_ph
   
   Type:           INTEGER
   Default:        4
   Description:    Number of iterations used in potential mixing.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       iverbosity
   
   Type:           INTEGER
   Default:        0
   Description:    0 = short output
                   1 = verbose output
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       reduce_io
   
   Type:           LOGICAL
   Default:        .false.
   Description:    Reduce I/O to the strict minimum.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       max_seconds
   
   Type:           REAL
   Default:        1.d7
   Description:    Maximum allowed run time before the job stops smoothly.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       fildyn
   
   Type:           CHARACTER
   Default:        'matdyn'
   Description:    File where the dynamical matrix is written.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       fildrho
   
   Type:           CHARACTER
   Default:        ' '
   Description:    File where the charge density responses are written.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       fildvscf
   
   Type:           CHARACTER
   Default:        ' '
   Description:    File where the the potential variation is written
                   (for later use in electron-phonon calculation).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       epsil
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. in a q=0 calculation for a non metal the
                   macroscopic dielectric constant of the system is
                   computed. Do not set epsil to .true. if you have a
                   metallic system or q/=0: the code will complain and stop.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lrpa
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. the dielectric constant is calculated at the
                   RPA level with DV_xc=0.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lnoloc
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. the dielectric constant is calculated without
                   local fields, i.e. by setting DV_H=0 and DV_xc=0.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       trans
   
   Type:           LOGICAL
   Default:        .true.
   Description:    If .true. the phonons are computed.
                   If trans .and. epsil are .true. effective charges are
                   calculated.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lraman
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. calculate non-resonant Raman coefficients
                   using second-order response as in:
                   M. Lazzeri and F. Mauri, Phys. Rev. Lett. 90, 036401 (2003).
   +--------------------------------------------------------------------
   
   ///---
      OPTIONAL VARIABLES FOR RAMAN:
      
      +--------------------------------------------------------------------
      Variable:       eth_rps
      
      Type:           REAL
      Default:        1.0d-9
      Description:    Threshold for calculation of  Pc R |psi>.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       eth_ns
      
      Type:           REAL
      Default:        1.0e-12
      Description:    Threshold for non-scf wavefunction calculation.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       dek
      
      Type:           REAL
      Default:        1.0e-3
      Description:    Delta_xk used for wavefunction derivation wrt k.
      +--------------------------------------------------------------------
      
   \\\---
   
   +--------------------------------------------------------------------
   Variable:       recover
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. restart from an interrupted run.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       low_directory_check
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. search in the phsave directory only the
                                    quantities requested in input.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       only_init
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. only the bands and other
                                     initialization quantities are calculated.
                                     (used for GRID parallelization)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       qplot
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. a list of q points is read from input.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       q2d
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. three q points and relative weights are
                              read from input. The three q points define the rectangle
                              q(:,1) + l (q(:,2)-q(:,1)) + m (q(:,3)-q(:,1)) where
                              0< l,m < 1. The weights are integer and those of points two
                              and three are the number of points in the two directions.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       q_in_band_form
   
   Type:           LOGICAL
   Default:        .false.
   Description:    This flag is used only when qplot is .true. and q2d is
                             .false.. When .true. each couple of q points q(:,i+1) and
                             q(:,i) define the line from q(:,i) to q(:,i+1) and nq
                             points are generated along that line. nq is the weigth of
                             q(:,i). When .false. only the list of q points given as
                             input is calculated. The weights are not used.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       electron_phonon
   
   Type:           CHARACTER
   Default:        ' '
   Description:    If equal to 'simple' electron-phonon lambda coefficients
                   are computed for a given q and a grid of k-points specified
                   by the variables nk1, nk2, nk3, k1, k2, k3.
                   
                   If equal to 'interpolated' electron-phonon is calculated
                   by interpolation over the Brillouin Zone as in
                   M. Wierzbowska, et al. arXiv:cond-mat/0504077
                   
                   For metals only, requires gaussian smearing.
                   
                   If trans=.true., the lambdas are calculated in the same
                   run, using the same k-point grid for phonons and lambdas.
                   If trans=.false., the lambdas are calculated using
                   previously saved DeltaVscf in fildvscf, previously saved
                   dynamical matrix, and the present punch file. This allows
                   the use of a different (larger) k-point grid.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       zeu
   
   Type:           LOGICAL
   Default:        zeu=epsil
   Description:    If .true. in a q=0 calculation for a non metal the
                   effective charges are computed from the dielectric
                   response. This is the default algorithm. If epsil=.true.
                   and zeu=.false. only the dielectric tensor is calculated.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       zue
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. in a q=0 calculation for a non metal the
                   effective charges are computed from the phonon
                   density responses. This is an alternative algorithm,
                   different from the default one (if trans .and. epsil )
                   The results should be the same within numerical noise.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       elop
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. calculate electro-optic tensor.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       fpol
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. calculate dynamic polarizabilities
                   Requires epsil=.true. ( experimental stage:
                   see example09 for calculation of methane ).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ldisp
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. the run calculates phonons for a grid of
                   q-points specified by nq1, nq2, nq3 - for direct
                   calculation of the entire phonon dispersion.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nogg
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. disable the "gamma_gamma" trick used to speed
                   up calculations at q=0 (phonon wavevector) if the sum over
                   the Brillouin Zone includes k=0 only. The gamma_gamma
                   trick exploits symmetry and acoustic sum rule to reduce
                   the number of linear response calculations to the strict
                   minimum, as it is done in code phcg.x. This option MUST
                   BE USED if a run with ph.x is to be followed by a run
                   with d3.x for third-order terms calculation.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ldiag
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. forces the diagonalization of the dynamical
                   matrix also when only a part of the dynamical matrix
                   has been calculated. It is used together with start_irr
                   and last_irr. If all modes corresponding to a
                   given irreducible representation have been calculated,
                   the phonon frequencies of that representation are
                   correct. The others are zero or wrong. Use with care.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lqdir
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. ph.x creates inside outdir a separate subdirectory
                   for each q vector. The flag is set to .true. when ldisp=
                   .true. and fildvscf /= ' ' or when an electron-phonon
                   calculation is performed. The induced potential is saved
                   separately for each q inside the subdirectories.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       search_sym
   
   Type:           LOGICAL
   Default:        .true.
   Description:    Set it to .false. if you want to disable the mode
                   symmetry analysis.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      nq1, nq2, nq3
   
   Type:           INTEGER
   Default:        0,0,0
   Description:    Parameters of the Monkhorst-Pack grid (no offset) used
                   when ldisp=.true. Same meaning as for nk1, nk2, nk3
                   in the input of pw.x.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      nk1, nk2, nk3, k1, k2, k3
   
   Type:           INTEGER
   Default:        0,0,0,0,0,0
   Description:    When these parameters are specified the phonon program
                   runs a pw non-self consistent calculation with a different
                   k-point grid thant that used for the charge density.
                   This occurs even in the Gamma case.
                   nk1,nk2,nk3 are the parameters of the Monkhorst-Pack grid
                   with offset determined by k1,k2,k3.
   +--------------------------------------------------------------------
   
   ///---
      SPECIFICATION OF IRREDUCIBLE REPRESENTATION
      
      +--------------------------------------------------------------------
      Variable:       start_irr
      
      Type:           INTEGER
      Default:        1
      See:            last_irr
      Description:    Perform calculations only from start_irr to last_irr
                      irreducible representations.
                      
                      IMPORTANT:
                         * start_irr must be <= 3*nat
                         * do not specify "nat_todo" together with
                           "start_irr", "last_irr"
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       last_irr
      
      Type:           INTEGER
      Default:        3*nat
      See:            start_irr
      Description:    Perform calculations only from start_irr to last_irr
                      irreducible representations.
                      
                      IMPORTANT:
                         * start_irr must be <= 3*nat
                         * do not specify "nat_todo" together with
                           "start_irr", "last_irr"
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       nat_todo
      
      Type:           INTEGER
      Default:        0, i.e. displace all atoms
      Description:    Choose the subset of atoms to be used in the linear response
                      calculation: "nat_todo" atoms, specified in input (see below)
                      are displaced. Can be used to estimate modes for a molecule
                      adsorbed over a surface without performing a full fledged
                      calculation. Use with care, at your own risk, and be aware
                      that this is an approximation and may not work.
                      IMPORTANT:
                         * nat_todo <= nat
                         * if linear-response is calculated for a given atom, it
                           should also be done for all symmetry-equivalent atoms,
                           or else you will get incorrect results
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       modenum
      
      Type:           INTEGER
      Default:        0
      Description:    For single-mode phonon calculation : modenum is the index of the
                      irreducible representation (irrep) into which the reducible
                      representation formed by the 3*nat atomic displacements are
                      decomposed in order to perform the phonon calculation.
                      Note that a single-mode calculation will not give you the
                      frequency of a single phonon mode: in general, the selected
                      "modenum" is not an eigenvector. What you get on output is
                      a column of the dynamical matrix.
      +--------------------------------------------------------------------
      
   \\\---
   
   ///---
      Q-POINT SPECIFICATION
      
      +--------------------------------------------------------------------
      Variable:       start_q
      
      Type:           INTEGER
      Default:        1
      See:            last_q
      Description:    Used only when ldisp=.true..
                      Computes only the q points from start_q to last_q.
                      
                      IMPORTANT:
                         * start_q must be <= nqs (number of q points found)
                         * do not specify "nat_todo" together with
                           "start_q", "last_q"
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       last_q
      
      Type:           INTEGER
      Default:        number of q points
      See:            start_q
      Description:    Used only when ldisp=.true..
                      Computes only the q points from start_q to last_q.
                      
                      IMPORTANT
                         * last_q must be <= nqs (number of q points)
                         * do not specify "nat_todo" together with
                           "start_q", "last_q"
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       dvscf_star
      
      Type:           STRUCTURE
      Default:        disabled
      Description:    It contains the following components:
                      dvscf_star%open  (logical, default: .false.)
                      dvscf_star%dir   (character, default: outdir//"Rotated_DVSCF" or the
                                        ESPRESSO_FILDVSCF_DIR environment variable)
                      dvscf_star%ext   (character, default: "dvscf") the extension to use
                                        for the name of the output files, see below
                      dvscf_star%basis (character, default: "cartesian") the basis on which
                                        the rotated dvscf will be saved
                      dvscf_star%pat   (logical, default: true) save an optional file with the
                                       displacement patterns and q vector for each dvscf file
                      
                      IF dvscf_star%open is .true. use symmetry to compute and store the variation
                      of the self-consistent potential on every q* in the star of the present q.
                      
                      The rotated dvscf will then be stored in directory dvscf_star%dir with name
                      prefix.dvscf_star%ext.q_name//"1". Where q_name is derived from the coordinates
                      of the q-point, expressed as fractions in crystalline coordinates
                      (notice that ph.x reads q-points in cartesian coordinates).
                      E.g. q_cryst= (0, 0.5, -0.25) -> q_name = "0_1o2_-1o4"
                      
                      The dvscf can be represented on a basis of cartesian 1-atom displacements
                      (dvscf_star%basis='cartesian') or on the basis of the modes at the rotated q-point
                      (dvscf_star%basis='modes'). Notice that the el-ph wannier code requires 'cartesian'.
                      Each dvscf file comes with a corresponding pattern file with an additional ".pat"
                      suffix; this file contains information about the basis and the q-point of the dvscf.
                      
                      Note: rotating dvscf can require a large amount of RAM memory and can be i/o
                            intensive; in its current implementation all the operations are done
                            on a single processor.
                      Note2: this feature is currently untested with image parallelisation.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       drho_star
      
      Type:           STRUCTURE
      See:            dvscf_star
      Default:        disabled
      Description:    It contains the following components:
                      drho_star%open  (logical, default: .false.)
                      drho_star%dir   (character, default: outdir//"Rotated_DRHO" or the
                                       ESPRESSO_FILDRHO_DIR environment variable)
                      drho_star%ext   (character, default: "drho") the extension to use
                                       for the name of the output files, see below
                      drho_star%basis (character, default: "modes") the basis on which
                                       the rotated drho will be saved
                      drho_star%pat   (logical, default: false) save an optional file with the
                                       displacement patterns and q vector for each drho file
                      
                      Like dvscf_star, but for the perturbation of the charge density.
                      Notice that the defaults are different.
      +--------------------------------------------------------------------
      
   \\\---
   
===END OF NAMELIST======================================================


________________________________________________________________________
* IF ldisp != .true.   and   qplot != .true. : 

   ========================================================================
   Line of input:
   
         xq(1)  xq(2)  xq(3)
      
      
      DESCRIPTION OF ITEMS:
      
         +--------------------------------------------------------------------
         Variables:      xq(1)  xq(2)  xq(3)
         
         Type:           REAL
         Description:    The phonon wavevector, in units of 2pi/a0
                         (a0 = lattice parameter).
                         Not used if ldisp=.true. or qplot=.true.
         +--------------------------------------------------------------------
         
         
   ===End of line-of-input=================================================
   
   
    
* ELSE IF qplot == .true. : 

   SPECIFICATION Q POINTS WHEN QPLOT=.TRUE.
   
   ========================================================================
   CARD:  
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
            nqs
            xq1(1)    xq2(1)    xq3(1)    nq(1)    
            xq1(2)    xq2(2)    xq3(2)    nq(2)    
            . . . 
            xq1(nqs)  xq2(nqs)  xq3(nqs)  nq(nqs)  
      
      /////////////////////////////////////////
      
      DESCRIPTION OF ITEMS:
      
         +--------------------------------------------------------------------
         Variable:       nqs
         
         Type:           INTEGER
         Description:    Number of q points in the list. Used only if qplot=.true.
         +--------------------------------------------------------------------
         
         +--------------------------------------------------------------------
         Variables:      xq1, xq2, xq3
         
         Type:           REAL
         Description:    q-point coordinates; used only with ldisp=.true. and qplot=.true.
                         The phonon wavevector, in units of 2pi/a0 (a0 = lattice parameter).
                         The meaning of these q points and their weights nq depend on the
                         flags q2d and q_in_band_form. (NB: nq is integer)
         +--------------------------------------------------------------------
         
         +--------------------------------------------------------------------
         Variable:       nq
         
         Type:           INTEGER
         Description:    The weight of the q-point; the meaning of nq depends
                         on the flags q2d and q_in_band_form.
         +--------------------------------------------------------------------
         
   ===END OF CARD==========================================================
   
   
    
ENDIF
________________________________________________________________________

________________________________________________________________________
* IF nat_todo was specified : 

   ========================================================================
   Line of input:
   
         atom(1)  atom(2) ... atom(nat_todo)
      
      
      DESCRIPTION OF ITEMS:
      
         +--------------------------------------------------------------------
         Variables:      atom(1)  atom(2) ... atom(nat_todo)
         
         Type:           INTEGER
         Description:    Contains the list of indices of atoms used in the
                         calculation if "nat_todo" is specified.
         +--------------------------------------------------------------------
         
         
   ===End of line-of-input=================================================
   
   
    
ENDIF
________________________________________________________________________


::::  ADDITIONAL INFORMATION 

   NB: The program ph.x writes on the tmp_dir/_ph0/{prefix}.phsave directory
   a file for each representation of each q point. This file is called
   dynmat.#iq.#irr.xml where #iq is the number of the q point and #irr
   is the number of the representation. These files contain the
   contribution to the dynamical matrix of the irr representation for the
   iq point.
   
   If recover=.true. ph.x does not recalculate the
   representations already saved in the tmp_dir/_ph0/{prefix}.phsave
   directory.  Moreover ph.x writes on the files patterns.#iq.xml in the
   tmp_dir/_ph0/{prefix}.phsave directory the displacement patterns that it
   is using. If recover=.true. ph.x does not recalculate the
   displacement patterns found in the tmp_dir/_ph0/{prefix}.phsave directory.
   
   This mechanism allows:
   
     1) To recover part of the ph.x calculation even if the recover file
        or files are corrupted. You just remove the _ph0/{prefix}.recover
        files from the tmp_dir directory. You can also remove all the _ph0
        files and keep only the _ph0/{prefix}.phsave directory.
   
     2) To split a phonon calculation into several jobs for different
        machines (or set of nodes). Each machine calculates a subset of
        the representations and saves its dynmat.#iq.#irr.xml files on
        its tmp_dir/_ph0/{prefix}.phsave directory. Then you collect all the
        dynmat.#iq.#irr.xml files in one directory and run ph.x to
        collect all the dynamical matrices and diagonalize them.
   
   NB: To split the q points in different machines, use the input
   variables start_q and last_q. To split the irreducible
   representations, use the input variables start_irr, last_irr. Please
   note that different machines will use, in general, different
   displacement patterns and it is not possible to recollect partial
   dynamical matrices generated with different displacement patterns.  A
   calculation split into different machines will run as follows: A
   preparatory run of ph.x with start_irr=0, last_irr=0 produces the sets
   of displacement patterns and save them on the patterns.#iq.xml files.
   These files are copied in all the tmp_dir/_ph0/{prefix}.phsave directories
   of the machines where you plan to run ph.x. ph.x is run in different
   machines with complementary sets of start_q, last_q, start_irr and
   last_irr variables.  All the files dynmat.#iq.#irr.xml are
   collected on a single tmp_dir/_ph0/{prefix}.phsave directory (remember to
   collect also dynmat.#iq.0.xml).  A final run of ph.x in this
   machine collects all the data contained in the files and diagonalizes
   the dynamical matrices.  This is done requesting a complete dispersion
   calculation without using start_q, last_q, start_irr, or last_irr.
   See an example in examples/GRID_example.
   
   On parallel machines the q point and the irreps calculations can be split
   automatically using the -nimage flag. See the phonon user guide for further
   information.
   


    
espresso-5.1/PWgui-5.1/doc/pwdocs/INPUT_NEB.html0000644000077300007730000002372612341333046021374 0ustar giannozzgiannozz

------------------------------------------------------------------------
INPUT FILE DESCRIPTION

Program: neb.x / NEB / Quantum Espresso
------------------------------------------------------------------------


Input data format: { } = optional, [ ] = it depends, | = or

All quantities whose dimensions are not explicitly specified are in
RYDBERG ATOMIC UNITS

BEWARE: TABS, DOS <CR><LF> CHARACTERS ARE POTENTIAL SOURCES OF TROUBLE

General input file structure:
===============================================================================

neb.x DOES NOT READ FROM STANDARD INPUT
There are two ways for running a calculation with neb.x:
1) specifying a file to parse with the ./neb.x -inp or
 neb.x -input command line option.
2) or specifying the number of copies of PWscf input ./neb.x -input\_images.

For case 1) a file containing KEYWORDS has to be written (see below).
These KEYWORDS tells the parser which part of the file regards neb specifics
and which part regards the energy/force engine (at the moment only PW).
After the parsing different files are generated: neb.dat, with
neb specific variables and a set of pw_*.in PWscf input files like
one for each input position. All options for a single SCF calculation apply.

The general structure of the file to be parsed is:

BEGIN
BEGIN_PATH_INPUT
... neb specific namelists and cards
END_PATH_INPUT
BEGIN_ENGINE_INPUT
...pw specific namelists and cards
BEGIN_POSITIONS
FIRST_IMAGE
...pw ATOMIC_POSITIONS card
INTERMEDIATE_IMAGE
...pw ATOMIC_POSITIONS card
LAST_IMAGE
...pw ATOMIC_POSITIONS card
END_POSITIONS
... other pw specific cards
END_ENGINE_INPUT
END

For case 2) neb.dat and all pw_1.in, pw_2.in ... should be already present.

Structure of the input data (file neb.dat) :
===============================================================================

&PATH
  ...
/

[ CLIMBING_IMAGES
   list of images, separated by a comma ]



========================================================================
NAMELIST: &PATH

   +--------------------------------------------------------------------
   Variable:       string_method
   
   Type:           CHARACTER
   Default:        'neb'
   Description:    a string describing the task to be performed:
                      'neb',
                      'smd'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       restart_mode
   
   Type:           CHARACTER
   Default:        'from_scratch'
   Description:    'from_scratch'  : from scratch
                   
                   'restart'       : from previous interrupted run
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nstep_path
   
   Type:           INTEGER
   Description:    number of ionic + electronic steps
   Default:        1
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       num_of_images
   
   Type:           INTEGER
   Default:        0
   Description:    Number of points used to discretize the path
                   (it must be larger than 3).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       opt_scheme
   
   Type:           CHARACTER
   Default:        'quick-min'
   Description:    Specify the type of optimization scheme:
                   
                   'sd'         : steepest descent
                   
                   'broyden'    : quasi-Newton Broyden's second method (suggested)
                   
                   'broyden2'   : another variant of the quasi-Newton Broyden's
                                  second method to be tested and compared with the
                                  previous one.
                   
                   'quick-min'  : an optimisation algorithm based on the
                                  projected velocity Verlet scheme
                   
                   'langevin'   : finite temperature langevin dynamics of the
                                  string (smd only). It is used to compute the
                                  average path and the free-energy profile.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       CI_scheme
   
   Type:           CHARACTER
   Default:        'no-CI'
   Description:    Specify the type of Climbing Image scheme:
                   
                   'no-CI'      : climbing image is not used
                   
                   'auto'       : original CI scheme. The image highest in energy
                                  does not feel the effect of springs and is
                                  allowed to climb along the path
                   
                   'manual'     : images that have to climb are manually selected.
                                  See also CLIMBING_IMAGES card
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       first_last_opt
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    Also the first and the last configurations are optimized
                   "on the fly" (these images do not feel the effect of the springs).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       minimum_image
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    Assume a "minimum image criterion" to build the path. If an atom
                   moves by more than half the length of a crystal axis between one
                   image and the next in the input (before interpolation),
                   an appropriate periodic replica of that atom is chosen.
                   Useful to avoid jumps in the initial reaction path.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       temp_req
   
   Type:           REAL
   Default:        0.D0 Kelvin
   Description:    Temperature used for the langevin dynamics of the string.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ds
   
   Type:           REAL
   Default:        1.D0
   Description:    Optimisation step length ( Hartree atomic units ).
                   If opt_scheme="broyden", ds is used as a guess for the
                   diagonal part of the Jacobian matrix.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      k_max, k_min
   
   Type:           REAL
   Default:        0.1D0 Hartree atomic units
   Description:    Set them to use a Variable Elastic Constants scheme
                   elastic constants are in the range [ k_min, k_max ]
                   this is useful to rise the resolution around the saddle point.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       path_thr
   
   Type:           REAL
   Default:        0.05D0 eV / Angstrom
   Description:    The simulation stops when the error ( the norm of the force
                   orthogonal to the path in eV/A ) is less than path_thr.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       use_masses
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    If. TRUE. the optimisation of the path is performed using
                   mass-weighted coordinates. Useful together with quick-min
                   optimization scheme, if some bonds are much stiffer than
                   others. By assigning a larger (fictitious) mass to atoms
                   with stiff bonds, one may use a longer time step "ds"
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       use_freezing
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    If. TRUE. the images are optimised according to their error:
                   only those images with an error larger than half of the largest
                   are optimised. The other images are kept frozen.
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================


========================================================================
CARD: CLIMBING_IMAGES 

   OPTIONAL CARD, NEEDED ONLY IF CI_SCHEME = 'MANUAL', IGNORED OTHERWISE !
   
   /////////////////////////////////////////
   // Syntax:                             //
   /////////////////////////////////////////
   
      CLIMBING_IMAGES 
         index1, index2, ... indexN
   
   /////////////////////////////////////////
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Variables:      index1, index2, ... indexN
      
      Type:           INTEGER
      Description:    index1, index2, ..., indexN are indices of the images to which the
                      Climbing-Image procedure apply. If more than one image is specified
                      they must be separated by a comma.
      +--------------------------------------------------------------------
      
      
===END OF CARD==========================================================



    
espresso-5.1/PWgui-5.1/doc/pwdocs/INPUT_PP.html0000644000077300007730000005020712341333046021301 0ustar giannozzgiannozz

------------------------------------------------------------------------
INPUT FILE DESCRIPTION

Program: pp.x / PWscf / Quantum Espresso
------------------------------------------------------------------------


Purpose of pp.x: data analysis and plotting.

The code performs two steps:
(1) reads the output file produced by pw.x, extract and calculate
    the desired quantity (rho, V, ...)
(2) writes the desired quantity to file in a suitable format for
    various types of plotting and various plotting programs

The input data of this program is read from standard input
or from file and has the following format:

NAMELIST &INPUTPP
   containing the variables for step (1), followed by

NAMELIST &PLOT
   containing the variables for step (2)

The two steps can be performed independently. In order to perform
only step (2), leave namelist &inputpp blank. In order to perform
only step (1), do not specify namelist &plot

Intermediate results from step 1 can be saved to disk (see
variable "filplot" in &inputpp) and later read in step 2.
Since the file with intermediate results is formatted, it
can be safely transferred to a different machine. This
also allows plotting of a linear combination (for instance,
charge differences) by saving two intermediate files and
combining them (see variables "weight" and "filepp" in &plot)

All output quantities are in ATOMIC (RYDBERG) UNITS unless
otherwise explicitly specified.



========================================================================
NAMELIST: &INPUTPP

   +--------------------------------------------------------------------
   Variable:       prefix
   
   Type:           CHARATER
   Description:    prefix of files saved by program pw.x
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       outdir
   
   Type:           CHARACTER
   Description:    directory containing the input data,
                   i.e. the same as in pw.x
   Default:        value of the ESPRESSO_TMPDIR environment variable if set;
                   current directory ('./') otherwise
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       filplot
   
   Type:           CHARACTER
   Description:    file "filplot" contains the quantity selected by plot_num
                   (can be saved for further processing)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       plot_num
   
   Type:           INTEGER
   Description:    selects what to save in filplot:
                   
                      0  = electron (pseudo-)charge density
                   
                      1  = total potential V_bare + V_H + V_xc
                   
                      2  = local ionic potential V_bare
                   
                      3  = local density of states at e_fermi
                           (number of states per volume, in bohr^3,
                            per energy unit, in Ry)
                   
                      4  = local density of electronic entropy
                   
                      5  = STM images
                           Tersoff and Hamann, PRB 31, 805 (1985)
                   
                      6  = spin polarization (rho(up)-rho(down))
                   
                      7  = contribution of a selected wavefunction to the
                           (pseudo-)charge density. For norm-conserving PPs,
                           |psi|^2 (psi=selected wavefunction). Noncollinear case:
                           contribution of the given state to the charge or
                           to the magnetization along the direction indicated
                           by spin_component (0 = charge, 1 = x, 2 = y, 3 = z )
                   
                      8  = electron localization function (ELF)
                   
                      9  = charge density minus superposition of atomic densities
                   
                      10 = integrated local density of states (ILDOS)
                           from emin to emax (emin, emax in eV)
                           if emax is not specified, emax=E_fermi
                   
                      11 = the V_bare + V_H potential
                   
                      12 = the sawtooth electric field potential (if present)
                   
                      13 = the noncollinear magnetization.
                   
                      17 = all-electron valence charge density
                           can be performed for PAW calculations only
                           requires a very dense real-space grid!
                   
                      18 = The exchange and correlation magnetic field in
                           the noncollinear case
                   
                      19 = Reduced density gradient
                           (J. Chem. Theory Comput. 7, 625 (2011))
                           Set the isosurface between 0.3 and 0.6 to plot the
                           non-covalent interactions (see also plot_num = 20)
                   
                      20 = Product of the electron density (charge) and the second
                           eigenvalue of the electron-density Hessian matrix;
                           used to colorize the RDG plot (plot_num = 19)
   +--------------------------------------------------------------------
   
   ________________________________________________________________________
   * IF plot_num=0 : 
   
      OPTIONS FOR TOTAL CHARGE (PLOT_NUM=0):
      
      +--------------------------------------------------------------------
      Variable:       spin_component
      
      Type:           INTEGER
      Default:        0
      Description:    0=total charge (default value),
                      1=spin up charge,
                      2=spin down charge.
      +--------------------------------------------------------------------
      
       
   * ELSE IF plot_num=1 : 
   
      OPTIONS FOR TOTAL POTENTIAL (PLOT_NUM=1):
      
      +--------------------------------------------------------------------
      Variable:       spin_component
      
      Type:           INTEGER
      Default:        0
      Description:    0=spin averaged potential (default value),
                      1=spin up potential,
                      2=spin down potential.
      +--------------------------------------------------------------------
      
       
   * ELSE IF plot_num=5 : 
   
      OPTIONS FOR STM IMAGES (PLOT_NUM=5):
      
      +--------------------------------------------------------------------
      Variable:       sample_bias
      
      Type:           REAL
      Description:    the bias of the sample (Ry) in stm images
      +--------------------------------------------------------------------
      
       
   * ELSE IF plot_num=7 : 
   
      OPTIONS FOR |PSI|^2 (PLOT_NUM=7):
      
      +--------------------------------------------------------------------
      Variable:       kpoint
      
      Type:           INTEGER
      Description:    Unpolarized and noncollinear case:   k-point to be plotted
                      LSDA:  k-point and spin polarization to be plotted
                      (spin-up and spin-down correspond to different k-points!)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       kband
      
      Type:           INTEGER
      Description:    band to be plotted
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       lsign
      
      Type:           LOGICAL
      Description:    if true and k point is Gamma, plot |psi|^2 sign(psi)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       spin_component
      
      Type:           INTEGER
      Description:    Noncollinear case only:
                      plot the contribution of the given state to the charge
                      or to the magnetization along the direction indicated
                      by spin_component:
                         0 = charge (default),
                         1 = x,
                         2 = y,
                         3 = z.
                      
                      Ignored in unpolarized or LSDA case
      +--------------------------------------------------------------------
      
       
   * ELSE IF plot_num=10 : 
   
      OPTIONS FOR ILDOS (PLOT_NUM=10):
      
      +--------------------------------------------------------------------
      Variable:       emin
      
      Type:           REAL
      Description:    lower energy boundary (in eV)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       emax
      
      Type:           REAL
      Description:    upper energy boundary (in eV), i.e. compute
                      ILDOS from emin to emax
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       spin_component
      
      Type:           INTEGER
      Description:    for LSDA case only: plot the contribution to ILDOS of
                      0 = spin-up + spin-down (default)
                      1 = spin-up   only
                      2 = spin-down only
      +--------------------------------------------------------------------
      
       
   * ELSE IF plot_num=13 : 
   
      OPTIONS FOR NONCOLLINEAR MAGNETIZATION (PLOT_NUM=13):
      
      +--------------------------------------------------------------------
      Variable:       spin_component
      
      Type:           INTEGER
      Default:        0
      Description:    0=absolute value (default value)
                      1=x component of the magnetization
                      2=y component of the magnetization
                      3=z component of the magnetization
      +--------------------------------------------------------------------
      
       
   * ELSE IF plot_num=17 : 
   
      OPTIONS FOR RECONSTRUCTED CHARGE DENSITY (PLOT_NUM=17):
      
      +--------------------------------------------------------------------
      Variable:       spin_component
      
      Type:           INTEGER
      Default:        0
      Description:    0=total charge (default value),
                      1=spin up charge,
                      2=spin down charge.
      +--------------------------------------------------------------------
      
       
   ENDIF
   ________________________________________________________________________
   
===END OF NAMELIST======================================================


========================================================================
NAMELIST: &PLOT

   +--------------------------------------------------------------------
   Variable:       nfile
   
   Type:           INTEGER
   Default:        1
   Status:         OPTIONAL
   Description:    the number of data files
   +--------------------------------------------------------------------
   
   ///---
      +--------------------------------------------------------------------
      Variable:       filepp(i), i=1,nfile
      
      Type:           CHARACTER
      Default:        filepp(1)=filplot
      Description:    nfile = 1 : file containing the quantity to be plotted
                      nfile > 1 : see "weight"
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       weight(i), i=1,nfile
      
      Type:           REAL
      Default:        weight(1)=1.0
      Description:    weighing factors: assuming that rho(i) is the quantity
                      read from filepp(i), the quantity that will be plotted is:
                      weight(1)*rho(1) + weight(2)*rho(2) + weight(3)*rho(3)+...
      +--------------------------------------------------------------------
      
      BEWARE: atomic coordinates are read from the first file;
              if their number is different for different files,
              the first file must have the largest number of atoms
      
   \\\---
   
   +--------------------------------------------------------------------
   Variable:       iflag
   
   Type:           INTEGER
   Description:    0 1D plot of the spherical average
                   1 1D plot
                   2 2D plot
                   3 3D plot
                   4 2D polar plot on a sphere
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       output_format
   
   Type:           INTEGER
   Description:    (ignored on 1D plot)
                   0  format suitable for gnuplot   (1D)
                   1  format suitable for contour.x (2D)
                   2  format suitable for plotrho   (2D)
                   3  format suitable for XCRYSDEN  (2D or user-supplied 3D region)
                   4  format suitable for gOpenMol  (3D)
                      (formatted: convert to unformatted *.plt)
                   5  format suitable for XCRYSDEN  (3D, using entire FFT grid)
                   6  format as gaussian cube file  (3D)
                      (can be read by many programs)
                   7  format suitable for gnuplot   (2D) x, y, f(x,y)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       fileout
   
   Type:           CHARACTER
   Default:        standard output
   Description:    name of the file to which the plot is written
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       interpolation
   
   Type:           CHARACTER
   Default:        "fourier"
   Description:    type of interpolation: "fourier" or "bspline" (EXPERIMENTAL!)
   +--------------------------------------------------------------------
   
   ________________________________________________________________________
   * IF iflag = 0 or 1 : 
   
      THE FOLLOWING VARIABLES ARE REQUIRED:
      
      +--------------------------------------------------------------------
      Variable:       e1(i), i=1,3
      
      Type:           REAL
      Description:    3D vector which determines the plotting line
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       x0(i), i=1,3
      
      Type:           REAL
      Description:    3D vector, origin of the line
      +--------------------------------------------------------------------
      
      !!! x0 and e1 are in alat units !!!
      
      +--------------------------------------------------------------------
      Variable:       nx
      
      Type:           INTEGER
      Description:    number of points in the line:
                      rho(i) = rho( x0 + e1 * (i-1)/(nx-1) ), i=1, nx
      +--------------------------------------------------------------------
      
       
   * ELSE IF iflag = 2 : 
   
      THE FOLLOWING VARIABLES ARE REQUIRED:
      
      +--------------------------------------------------------------------
      Variables:      e1(i), e2(i), i=1,3
      
      Type:           REAL
      Description:    3D vectors which determine the plotting plane
                      (must be orthogonal)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       x0(i), i=1,3
      
      Type:           REAL
      Description:    3D vector, origin of the plane
      +--------------------------------------------------------------------
      
      !!! x0, e1, e2 are in alat units !!!
      
      +--------------------------------------------------------------------
      Variables:      nx, ny
      
      Type:           INTEGER
      Description:    Number of points in the plane:
                      
                      rho(i,j) = rho( x0 + e1 * (i-1)/(nx-1)
                                     + e2 * (j-1)/(ny-1) ), i=1,nx ; j=1,ny
      +--------------------------------------------------------------------
      
       
   * ELSE IF iflag = 3 : 
   
      THE FOLLOWING VARIABLES ARE OPTIONAL:
      
      +--------------------------------------------------------------------
      Variables:      e1(i), e2(i), e3(i), i=1,3
      
      Type:           REAL
      Description:    3D vectors which determine the plotting parallelepiped
                      (if present, must be orthogonal)
                      
                      e1, e2, and e3 are in alat units !
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       x0(i), i=1,3
      
      Type:           REAL
      Description:    3D vector, origin of the parallelepiped
                      
                      x0 is in alat units !
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      nx, ny, nz
      
      Type:           INTEGER
      Description:    Number of points in the parallelepiped:
                      
                      rho(i,j,k) = rho( x0 + e1 * (i-1)/nx
                                           + e2 * (j-1)/ny
                                           + e3 * (k-1)/nz ),
                                      i = 1, nx ; j = 1, ny ; k = 1, nz
                      
                      - If output_format = 3 (XCRYSDEN), the above variables
                      are used to determine the grid to plot.
                      
                      - If output_format = 5 (XCRYSDEN), the above variables
                      are ignored, the entire FFT grid is written in the
                      XCRYSDEN format - works for any crystal axis (VERY FAST)
                      
                      - If e1, e2, e3, x0 are present, e1 e2 e3 are parallel
                      to xyz and parallel to crystal axis, a subset of the
                      FFT grid that approximately covers the parallelepiped
                      defined by e1, e2, e3, x0, is written (presently only
                      if output_format = 4, i.e. gopenmol format) - works only
                      if the crystal axis are parallel to xyz
                      
                      - Otherwise, the required 3D grid is generated from the
                      Fourier components (may be VERY slow)
      +--------------------------------------------------------------------
      
       
   * ELSE IF iflag = 4 : 
   
      THE FOLLOWING VARIABLES ARE REQUIRED:
      
      +--------------------------------------------------------------------
      Variable:       radius
      
      Type:           REAL
      Description:    Radius of the sphere (alat units), centered at (0,0,0)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      nx, ny
      
      Type:           INTEGER
      Description:    Number of points in the polar plane:
                      
                          phi(i)   = 2 pi * (i - 1)/(nx-1), i=1, nx
                          theta(j) =   pi * (j - 1)/(ny-1), j=1, ny
      +--------------------------------------------------------------------
      
       
   ENDIF
   ________________________________________________________________________
   
===END OF NAMELIST======================================================



    
espresso-5.1/PWgui-5.1/doc/pwdocs/INPUT_PW.html0000644000077300007730000040060512341333046021311 0ustar giannozzgiannozz

------------------------------------------------------------------------
INPUT FILE DESCRIPTION

Program: pw.x / PWscf / Quantum Espresso
------------------------------------------------------------------------


Input data format: { } = optional, [ ] = it depends, | = or

All quantities whose dimensions are not explicitly specified are in
RYDBERG ATOMIC UNITS. Charge is "number" charge (i.e. not multiplied
by e); potentials are in energy units (i.e. they are multiplied by e)

BEWARE: TABS, DOS <CR><LF> CHARACTERS ARE POTENTIAL SOURCES OF TROUBLE
Comment lines in namelists can be introduced by a "!", exactly as in
fortran code. Comments lines in ``cards'' can be introduced by
either a "!" or a "#" character in the first position of a line.
Do not start any line in ``cards'' with a "/" character.

Structure of the input data:
===============================================================================

&CONTROL
  ...
/

&SYSTEM
 ...
/

&ELECTRONS
...
/

[ &IONS
  ...
 / ]

[ &CELL
  ...
 / ]

ATOMIC_SPECIES
 X  Mass_X  PseudoPot_X
 Y  Mass_Y  PseudoPot_Y
 Z  Mass_Z  PseudoPot_Z

ATOMIC_POSITIONS { alat | bohr | crystal | angstrom }
  X 0.0  0.0  0.0  {if_pos(1) if_pos(2) if_pos(3)}
  Y 0.5  0.0  0.0
  Z O.0  0.2  0.2

K_POINTS { tpiba | automatic | crystal | gamma | tpiba_b | crystal_b | tpiba_c | crystal_c }
if (gamma)
   nothing to read
if (automatic)
   nk1, nk2, nk3, k1, k2, k3
if (not automatic)
   nks
   xk_x, xk_y, xk_z,  wk

[ CELL_PARAMETERS { alat | bohr | angstrom }
   v1(1) v1(2) v1(3)
   v2(1) v2(2) v2(3)
   v3(1) v3(2) v3(3) ]

[ OCCUPATIONS
   f_inp1(1)  f_inp1(2)  f_inp1(3) ... f_inp1(10)
   f_inp1(11) f_inp1(12) ... f_inp1(nbnd)
 [ f_inp2(1)  f_inp2(2)  f_inp2(3) ... f_inp2(10)
   f_inp2(11) f_inp2(12) ... f_inp2(nbnd) ] ]

[ CONSTRAINTS
   nconstr  { constr_tol }
   constr_type(.)   constr(1,.)   constr(2,.) [ constr(3,.)   constr(4,.) ] { constr_target(.) } ]

[ ATOMIC_FORCES
   label_1 Fx(1) Fy(1) Fz(1)
   .....
   label_n Fx(n) Fy(n) Fz(n) ]



========================================================================
NAMELIST: &CONTROL

   +--------------------------------------------------------------------
   Variable:       calculation
   
   Type:           CHARACTER
   Default:        'scf'
   Description:    a string describing the task to be performed:
                      'scf',
                      'nscf',
                      'bands',
                      'relax',
                      'md',
                      'vc-relax',
                      'vc-md'
                   
                      (vc = variable-cell).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       title
   
   Type:           CHARACTER
   Default:        ' '
   Description:    reprinted on output.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       verbosity
   
   Type:           CHARACTER
   Default:        'low'
   Description:    Currently two verbosity levels are implemented:
                     'high' and 'low'. 'debug' and 'medium' have the same
                     effect as 'high'; 'default' and 'minimal', as 'low'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       restart_mode
   
   Type:           CHARACTER
   Default:        'from_scratch'
   Description:    'from_scratch'  : from scratch. This is the normal way
                                     to perform a PWscf calculation
                   'restart'       : from previous interrupted run. Use this
                                     switch only if you want to continue an
                                     interrupted calculation, not to start a
                                     new one, or to perform non-scf calculations.
                                     Works only if the calculation was cleanly
                                     stopped using variable "max_seconds", or
                                     by user request with an "exit file" (i.e.:
                                     create a file "prefix".EXIT, in directory
                                     "outdir"; see variables "prefix", "outdir")
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       wf_collect
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    This flag controls the way wavefunctions are stored to disk :
                   
                   .TRUE.  collect wavefunctions from all processors, store them
                           into the output data directory "outdir"/"prefix".save,
                           one wavefunction per k-point in subdirs K000001/,
                           K000001/, etc.. Use this if you want wavefunctions
                           to be readable on a different number of processors.
                   
                   .FALSE. do not collect wavefunctions, leave them in temporary
                           local files (one per processor). The resulting format
                           will be readable only by jobs running on the same
                           number of processors and pools. Requires less I/O
                           than the previous case.
                   
                   Note that this flag has no effect on reading, only on writing.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nstep
   
   Type:           INTEGER
   Description:    number of ionic + electronic steps
   Default:        1  if calculation = 'scf', 'nscf', 'bands';
                   50 for the other cases
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       iprint
   
   Type:           INTEGER
   Default:        write only at convergence
   Description:    band energies are written every "iprint" iterations
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tstress
   
   Type:           LOGICAL
   Default:        .false.
   Description:    calculate stress. It is set to .TRUE. automatically if
                   calculation='vc-md' or 'vc-relax'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tprnfor
   
   Type:           LOGICAL
   Description:    calculate forces. It is set to .TRUE. automatically if
                   calculation='relax','md','vc-md'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       dt
   
   Type:           REAL
   Default:        20.D0
   Description:    time step for molecular dynamics, in Rydberg atomic units
                   (1 a.u.=4.8378 * 10^-17 s : beware, the CP code uses
                    Hartree atomic units, half that much!!!)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       outdir
   
   Type:           CHARACTER
   Default:        value of the ESPRESSO_TMPDIR environment variable if set;
                   current directory ('./') otherwise
   Description:    input, temporary, output files are found in this directory,
                   see also "wfcdir"
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       wfcdir
   
   Type:           CHARACTER
   Default:        same as "outdir"
   Description:    this directory specifies where to store files generated by
                   each processor (*.wfc{N}, *.igk{N}, etc.). Useful for
                   machines without a parallel file system: set "wfcdir" to
                   a local file system, while "outdir" should be a parallel
                   or networkfile system, visible to all processors. Beware:
                   in order to restart from interrupted runs, or to perform
                   further calculations using the produced data files, you
                   may need to copy files to "outdir". Works only for pw.x.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       prefix
   
   Type:           CHARACTER
   Default:        'pwscf'
   Description:    prepended to input/output filenames:
                   prefix.wfc, prefix.rho, etc.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lkpoint_dir
   
   Type:           LOGICAL
   Default:        .true.
   Description:    If .false. a subdirectory for each k_point is not opened
                   in the "prefix".save directory; Kohn-Sham eigenvalues are
                   stored instead in a single file for all k-points. Currently
                   doesn't work together with "wf_collect"
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       max_seconds
   
   Type:           REAL
   Default:        1.D+7, or 150 days, i.e. no time limit
   Description:    jobs stops after "max_seconds" CPU time. Use this option
                   in conjunction with option "restart_mode" if you need to
                   split a job too long to complete into shorter jobs that
                   fit into your batch queues.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       etot_conv_thr
   
   Type:           REAL
   Default:        1.0D-4
   Description:    convergence threshold on total energy (a.u) for ionic
                   minimization: the convergence criterion is satisfied
                   when the total energy changes less than "etot_conv_thr"
                   between two consecutive scf steps. Note that "etot_conv_thr"
                   is extensive, like the total energy.
                   See also "forc_conv_thr" - both criteria must be satisfied
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       forc_conv_thr
   
   Type:           REAL
   Default:        1.0D-3
   Description:    convergence threshold on forces (a.u) for ionic minimization:
                   the convergence criterion is satisfied when all components of
                   all forces are smaller than "forc_conv_thr".
                   See also "etot_conv_thr" - both criteria must be satisfied
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       disk_io
   
   Type:           CHARACTER
   Default:        'low'
   Description:    Specifies the amount of disk I/O activity
                   'high':   save all data to disk at each SCF step
                   
                   'medium': save wavefunctions at each SCF step unless
                             there is a single k-point per process (in which
                             case the behavior is the same as 'low')
                   
                   'low' :   store wfc in memory, save only at the end
                   
                   'none':   do not save anything, not even at the end
                             ('scf', 'nscf', 'bands' calculations; some data
                              may be written anyway for other calculations)
                   
                   Note that the amount of needed RAM increases as the amount
                   of I/O decreases! IMPORTANT: default has been changed to 'low'.
                   It is no longer needed to specify 'high' in order to be able
                   to restart from an interrupted calculation (see "restart_mode")
                   but you cannot restart from disk_io='none'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       pseudo_dir
   
   Type:           CHARACTER
   Default:        value of the $ESPRESSO_PSEUDO environment variable if set;
                   '$HOME/espresso/pseudo/' otherwise
   Description:    directory containing pseudopotential files
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tefield
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    If .TRUE. a saw-like potential simulating an electric field
                   is added to the bare ionic potential. See variables "edir",
                   "eamp", "emaxpos", "eopreg" for the form and size of
                   the added potential.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       dipfield
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    If .TRUE. and tefield=.TRUE. a dipole correction is also
                   added to the bare ionic potential - implements the recipe
                   of L. Bengtsson, PRB 59, 12301 (1999). See variables "edir",
                   "emaxpos", "eopreg" for the form of the correction. Must
                   be used ONLY in a slab geometry, for surface calculations,
                   with the discontinuity FALLING IN THE EMPTY SPACE.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lelfield
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    If .TRUE. a homogeneous finite electric field described
                   through the modern theory of the polarization is applied.
                   This is different from "tefield=.true." !
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nberrycyc
   
   Type:           INTEGER
   Default:        1
   Description:    In the case of a finite electric field  ( lelfield == .TRUE. )
                   it defines the number of iterations for converging the
                   wavefunctions in the electric field Hamiltonian, for each
                   external iteration on the charge density
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lorbm
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    If .TRUE. perform orbital magnetization calculation.
                   If finite electric field is applied (lelfield=.true.)
                   only Kubo terms are computed
                   [for details see New J. Phys. 12, 053032 (2010)].
                   The type of calculation is 'nscf' and should be performed
                   on an automatically generated uniform grid of k points.
                   Works ONLY with norm-conserving pseudopotentials.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lberry
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    If .TRUE. perform a Berry phase calculation
                   See the header of PW/src/bp_c_phase.f90 for documentation
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       gdir
   
   Type:           INTEGER
   Description:    For Berry phase calculation: direction of the k-point
                   strings in reciprocal space. Allowed values: 1, 2, 3
                   1=first, 2=second, 3=third reciprocal lattice vector
                   For calculations with finite electric fields
                   (lelfield==.true.) "gdir" is the direction of the field
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nppstr
   
   Type:           INTEGER
   Description:    For Berry phase calculation: number of k-points to be
                   calculated along each symmetry-reduced string
                   The same for calculation with finite electric fields
                   (lelfield=.true.)
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================


========================================================================
NAMELIST: &SYSTEM

   +--------------------------------------------------------------------
   Variable:       ibrav
   
   Type:           INTEGER
   Status:         REQUIRED
   Description:    Bravais-lattice index. If ibrav /= 0, specify EITHER
                     [ celldm(1)-celldm(6) ] OR [ A,B,C,cosAB,cosAC,cosBC ]
                     but NOT both. The lattice parameter "alat" is set to
                     alat = celldm(1) (in a.u.) or alat = A (in Angstrom);
                     see below for the other parameters.
                     For ibrav=0 specify the lattice vectors in CELL_PARAMETER,
                     optionally the lattice parameter alat = celldm(1) (in a.u.)
                     or = A (in Angstrom), or else it is taken from CELL_PARAMETERS
                   
                   ibrav      structure                   celldm(2)-celldm(6)
                                                        or: b,c,cosab,cosac,cosbc
                     0          free
                         crystal axis provided in input: see card CELL_PARAMETERS
                   
                     1          cubic P (sc)
                         v1 = a(1,0,0),  v2 = a(0,1,0),  v3 = a(0,0,1)
                   
                     2          cubic F (fcc)
                         v1 = (a/2)(-1,0,1),  v2 = (a/2)(0,1,1), v3 = (a/2)(-1,1,0)
                   
                     3          cubic I (bcc)
                         v1 = (a/2)(1,1,1),  v2 = (a/2)(-1,1,1),  v3 = (a/2)(-1,-1,1)
                   
                     4          Hexagonal and Trigonal P        celldm(3)=c/a
                         v1 = a(1,0,0),  v2 = a(-1/2,sqrt(3)/2,0),  v3 = a(0,0,c/a)
                   
                     5          Trigonal R, 3fold axis c        celldm(4)=cos(alpha)
                         The crystallographic vectors form a three-fold star around
                         the z-axis, the primitive cell is a simple rhombohedron:
                         v1 = a(tx,-ty,tz),   v2 = a(0,2ty,tz),   v3 = a(-tx,-ty,tz)
                         where c=cos(alpha) is the cosine of the angle alpha between
                         any pair of crystallographic vectors, tx, ty, tz are:
                           tx=sqrt((1-c)/2), ty=sqrt((1-c)/6), tz=sqrt((1+2c)/3)
                    -5          Trigonal R, 3fold axis <111>    celldm(4)=cos(alpha)
                         The crystallographic vectors form a three-fold star around
                         <111>. Defining a' = a/sqrt(3) :
                         v1 = a' (u,v,v),   v2 = a' (v,u,v),   v3 = a' (v,v,u)
                         where u and v are defined as
                           u = tz - 2*sqrt(2)*ty,  v = tz + sqrt(2)*ty
                         and tx, ty, tz as for case ibrav=5
                         Note: if you prefer x,y,z as axis in the cubic limit,
                               set  u = tz + 2*sqrt(2)*ty,  v = tz - sqrt(2)*ty
                               See also the note in flib/latgen.f90
                   
                     6          Tetragonal P (st)               celldm(3)=c/a
                         v1 = a(1,0,0),  v2 = a(0,1,0),  v3 = a(0,0,c/a)
                   
                     7          Tetragonal I (bct)              celldm(3)=c/a
                         v1=(a/2)(1,-1,c/a),  v2=(a/2)(1,1,c/a),  v3=(a/2)(-1,-1,c/a)
                   
                     8          Orthorhombic P                  celldm(2)=b/a
                                                                celldm(3)=c/a
                         v1 = (a,0,0),  v2 = (0,b,0), v3 = (0,0,c)
                   
                     9          Orthorhombic base-centered(bco) celldm(2)=b/a
                                                                celldm(3)=c/a
                         v1 = (a/2, b/2,0),  v2 = (-a/2,b/2,0),  v3 = (0,0,c)
                    -9          as 9, alternate description
                         v1 = (a/2,-b/2,0),  v2 = (a/2,-b/2,0),  v3 = (0,0,c)
                   
                    10          Orthorhombic face-centered      celldm(2)=b/a
                                                                celldm(3)=c/a
                         v1 = (a/2,0,c/2),  v2 = (a/2,b/2,0),  v3 = (0,b/2,c/2)
                   
                    11          Orthorhombic body-centered      celldm(2)=b/a
                                                                celldm(3)=c/a
                         v1=(a/2,b/2,c/2),  v2=(-a/2,b/2,c/2),  v3=(-a/2,-b/2,c/2)
                   
                    12          Monoclinic P, unique axis c     celldm(2)=b/a
                                                                celldm(3)=c/a,
                                                                celldm(4)=cos(ab)
                         v1=(a,0,0), v2=(b*cos(gamma),b*sin(gamma),0),  v3 = (0,0,c)
                         where gamma is the angle between axis a and b.
                   -12          Monoclinic P, unique axis b     celldm(2)=b/a
                                                                celldm(3)=c/a,
                                                                celldm(5)=cos(ac)
                         v1 = (a,0,0), v2 = (0,b,0), v3 = (c*cos(beta),0,c*sin(beta))
                         where beta is the angle between axis a and c
                   
                    13          Monoclinic base-centered        celldm(2)=b/a
                                                                celldm(3)=c/a,
                                                                celldm(4)=cos(ab)
                         v1 = (  a/2,         0,                -c/2),
                         v2 = (b*cos(gamma), b*sin(gamma), 0),
                         v3 = (  a/2,         0,                  c/2),
                         where gamma is the angle between axis a and b
                   
                    14          Triclinic                       celldm(2)= b/a,
                                                                celldm(3)= c/a,
                                                                celldm(4)= cos(bc),
                                                                celldm(5)= cos(ac),
                                                                celldm(6)= cos(ab)
                         v1 = (a, 0, 0),
                         v2 = (b*cos(gamma), b*sin(gamma), 0)
                         v3 = (c*cos(beta),  c*(cos(alpha)-cos(beta)cos(gamma))/sin(gamma),
                              c*sqrt( 1 + 2*cos(alpha)cos(beta)cos(gamma)
                                        - cos(alpha)^2-cos(beta)^2-cos(gamma)^2 )/sin(gamma) )
                     where alpha is the angle between axis b and c
                            beta is the angle between axis a and c
                           gamma is the angle between axis a and b
   +--------------------------------------------------------------------
   
   ///---
      EITHER:
      
      +--------------------------------------------------------------------
      Variable:       celldm(i), i=1,6
      
      Type:           REAL
      See:            ibrav
      Description:    Crystallographic constants - see the "ibrav" variable.
                      Specify either these OR A,B,C,cosAB,cosBC,cosAC NOT both.
                      Only needed values (depending on "ibrav") must be specified
                      alat = celldm(1) is the lattice parameter "a" (in BOHR)
                      If ibrav=0, only celldm(1) is used if present;
                      cell vectors are read from card CELL_PARAMETERS
      +--------------------------------------------------------------------
      
      OR:
      
      +--------------------------------------------------------------------
      Variables:      A, B, C, cosAB, cosAC, cosBC
      
      Type:           REAL
      Description:    Traditional crystallographic constants: a,b,c in ANGSTROM
                        cosAB = cosine of the angle between axis a and b (gamma)
                        cosAC = cosine of the angle between axis a and c (beta)
                        cosBC = cosine of the angle between axis b and c (alpha)
                      The axis are chosen according to the value of "ibrav".
                      Specify either these OR "celldm" but NOT both.
                      Only needed values (depending on "ibrav") must be specified
                      The lattice parameter alat = A (in ANGSTROM )
                      If ibrav = 0, only A is used if present;
                      cell vectors are read from card CELL_PARAMETERS
      +--------------------------------------------------------------------
      
   \\\---
   
   +--------------------------------------------------------------------
   Variable:       nat
   
   Type:           INTEGER
   Status:         REQUIRED
   Description:    number of atoms in the unit cell
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ntyp
   
   Type:           INTEGER
   Status:         REQUIRED
   Description:    number of types of atoms in the unit cell
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nbnd
   
   Type:           INTEGER
   Default:        for an insulator, nbnd = number of valence bands
                   (nbnd = # of electrons /2);
                   for a metal, 20% more (minimum 4 more)
   Description:    number of electronic states (bands) to be calculated.
                   Note that in spin-polarized calculations the number of
                   k-point, not the number of bands per k-point, is doubled
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tot_charge
   
   Type:           REAL
   Default:        0.0
   Description:    total charge of the system. Useful for simulations with charged cells.
                   By default the unit cell is assumed to be neutral (tot_charge=0).
                   tot_charge=+1 means one electron missing from the system,
                   tot_charge=-1 means one additional electron, and so on.
                   
                   In a periodic calculation a compensating jellium background is
                   inserted to remove divergences if the cell is not neutral.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tot_magnetization
   
   Type:           REAL
   Default:        -1 [unspecified]
   Description:    total majority spin charge - minority spin charge.
                   Used to impose a specific total electronic magnetization.
                   If unspecified then tot_magnetization variable is ignored and
                   the amount of electronic magnetization is determined during
                   the self-consistent cycle.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       starting_magnetization(i), i=1,ntyp
   
   Type:           REAL
   Description:    starting spin polarization on atomic type 'i' in a spin
                   polarized calculation. Values range between -1 (all spins
                   down for the valence electrons of atom type 'i') to 1
                   (all spins up). Breaks the symmetry and provides a starting
                   point for self-consistency. The default value is zero, BUT a
                   value MUST be specified for AT LEAST one atomic type in spin
                   polarized calculations, unless you constrain the magnetization
                   (see "tot_magnetization" and "constrained_magnetization").
                   Note that if you start from zero initial magnetization, you
                   will invariably end up in a nonmagnetic (zero magnetization)
                   state. If you want to start from an antiferromagnetic state,
                   you may need to define two different atomic species
                   corresponding to sublattices of the same atomic type.
                   starting_magnetization is ignored if you are performing a
                   non-scf calculation, if you are restarting from a previous
                   run, or restarting from an interrupted run.
                   If you fix the magnetization with "tot_magnetization",
                   you should not specify starting_magnetization.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ecutwfc
   
   Type:           REAL
   Status:         REQUIRED
   Description:    kinetic energy cutoff (Ry) for wavefunctions
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ecutrho
   
   Type:           REAL
   Default:        4 * ecutwfc
   Description:    kinetic energy cutoff (Ry) for charge density and potential
                   For norm-conserving pseudopotential you should stick to the
                   default value, you can reduce it by a little but it will
                   introduce noise especially on forces and stress.
                   If there are ultrasoft PP, a larger value than the default is
                   often desirable (ecutrho = 8 to 12 times ecutwfc, typically).
                   PAW datasets can often be used at 4*ecutwfc, but it depends
                   on the shape of augmentation charge: testing is mandatory.
                   The use of gradient-corrected functional, especially in cells
                   with vacuum, or for pseudopotential without non-linear core
                   correction, usually requires an higher values of ecutrho
                   to be accurately converged.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ecutfock
   
   Type:           REAL
   Default:        ecutrho
   Description:    kinetic energy cutoff (Ry) for the exact exchange operator in
                   EXX type calculations. By default this is the same as ecutrho
                   but in some EXX calculations significant speed-up can be found
                   by reducing ecutfock, at the expense of some loss in accuracy.
                   Currently only implemented for the optimized gamma point only
                   calculations.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      nr1, nr2, nr3
   
   Type:           INTEGER
   Description:    three-dimensional FFT mesh (hard grid) for charge
                   density (and scf potential). If not specified
                   the grid is calculated based on the cutoff for
                   charge density (see also "ecutrho")
                   Note: you must specify all three dimensions for this setting to
                   be used.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      nr1s, nr2s, nr3s
   
   Type:           INTEGER
   Description:    three-dimensional mesh for wavefunction FFT and for the smooth
                   part of charge density ( smooth grid ).
                   Coincides with nr1, nr2, nr3 if ecutrho = 4 * ecutwfc ( default )
                   Note: you must specify all three dimensions for this setting to
                   be used.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nosym
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    if (.TRUE.) symmetry is not used. Note that
                   - if the k-point grid is provided in input, it is used "as is"
                     and symmetry-inequivalent k-points are not generated;
                   - if the k-point grid is automatically generated, it will
                     contain only points in the irreducible BZ for the bravais
                     lattice, irrespective of the actual crystal symmetry.
                   A careful usage of this option can be advantageous
                   - in low-symmetry large cells, if you cannot afford a k-point
                     grid with the correct symmetry
                   - in MD simulations
                   - in calculations for isolated atoms
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nosym_evc
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    if(.TRUE.) symmetry is not used but the k-points are
                   forced to have the symmetry of the Bravais lattice;
                   an automatically generated k-point grid will contain
                   all the k-points of the grid and the points rotated by
                   the symmetries of the Bravais lattice which are not in the
                   original grid. If available, time reversal is
                   used to reduce the k-points (and the q => -q symmetry
                   is used in the phonon code). To disable also this symmetry set
                   noinv=.TRUE..
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       noinv
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    if (.TRUE.) disable the usage of k => -k symmetry
                   (time reversal) in k-point generation
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       no_t_rev
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    if (.TRUE.) disable the usage of magnetic symmetry operations
                   that consist in a rotation + time reversal.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       force_symmorphic
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    if (.TRUE.) force the symmetry group to be symmorphic by disabling
                   symmetry operations having an associated fractionary translation
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       use_all_frac
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    if (.TRUE.) do not discard symmetry operations with an
                   associated fractionary translation that does not send the
                   real-space FFT grid into itself. These operations are
                   incompatible with real-space symmetrization but not with the
                   new G-space symmetrization. BEWARE: do not use for phonons!
                   The phonon code still uses real-space symmetrization.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       occupations
   
   Type:           CHARACTER
   Description:    'smearing':     gaussian smearing for metals
                                   see variables 'smearing' and 'degauss'
                   
                   'tetrahedra' :  especially suited for calculation of DOS
                                   (see P.E. Bloechl, PRB49, 16223 (1994))
                                   Requires uniform grid of k-points,
                                   automatically generated (see below)
                                   Not suitable (because not variational) for
                                   force/optimization/dynamics calculations
                   
                   'fixed' :       for insulators with a gap
                   
                   'from_input' :  The occupation are read from input file,
                                   card OCCUPATIONS. Option valid only for a
                                   single k-point, requires "nbnd" to be set
                                   in input. Occupations should be consistent
                                   with the value of "tot_charge".
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       one_atom_occupations
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    This flag is used for isolated atoms (nat=1) together with
                   occupations='from_input'. If it is .TRUE., the wavefunctions
                   are ordered as the atomic starting wavefunctions, independently
                   from their eigenvalue. The occupations indicate which atomic
                   states are filled.
                   The order of the states is written inside the UPF
                   pseudopotential file.
                   In the scalar relativistic case:
                   S -> l=0, m=0
                   P -> l=1, z, x, y
                   D -> l=2, r^2-3z^2, xz, yz, xy, x^2-y^2
                   In the noncollinear magnetic case (with or without spin-orbit),
                   each group of states is doubled. For instance:
                   P -> l=1, z, x, y for spin up, l=1, z, x, y for spin down.
                   Up and down is relative to the direction of the starting
                   magnetization.
                   In the case with spin-orbit and time-reversal
                   (starting_magnetization=0.0) the atomic wavefunctions are
                   radial functions multiplied by spin-angle functions.
                   For instance:
                   P -> l=1, j=1/2, m_j=-1/2,1/2. l=1, j=3/2,
                        m_j=-3/2, -1/2, 1/2, 3/2.
                   In the magnetic case with spin-orbit the atomic wavefunctions
                   can be forced to be spin-angle functions by setting
                   starting_spin_angle to .TRUE..
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       starting_spin_angle
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    In the spin-orbit case when domag=.TRUE., by default,
                   the starting wavefunctions are initialized as in scalar
                   relativistic noncollinear case without spin-orbit.
                   By setting starting_spin_angle=.TRUE. this behaviour can
                   be changed and the initial wavefunctions are radial
                   functions multiplied by spin-angle functions.
                   When domag=.FALSE. the initial wavefunctions are always
                   radial functions multiplied by spin-angle functions
                   independently from this flag.
                   When lspinorb is .FALSE. this flag is not used.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       degauss
   
   Type:           REAL
   Default:        0.D0 Ry
   Description:    value of the gaussian spreading (Ry) for brillouin-zone
                   integration in metals.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       smearing
   
   Type:           CHARACTER
   Default:        'gaussian'
   Description:    'gaussian', 'gauss':
                       ordinary Gaussian spreading (Default)
                   
                   'methfessel-paxton', 'm-p', 'mp':
                       Methfessel-Paxton first-order spreading
                       (see PRB 40, 3616 (1989)).
                   
                   'marzari-vanderbilt', 'cold', 'm-v', 'mv':
                       Marzari-Vanderbilt cold smearing
                       (see PRL 82, 3296 (1999))
                   
                   'fermi-dirac', 'f-d', 'fd':
                       smearing with Fermi-Dirac function
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nspin
   
   Type:           INTEGER
   Default:        1
   Description:    nspin = 1 :  non-polarized calculation (default)
                   
                   nspin = 2 :  spin-polarized calculation, LSDA
                                (magnetization along z axis)
                   
                   nspin = 4 :  spin-polarized calculation, noncollinear
                                (magnetization in generic direction)
                                DO NOT specify nspin in this case;
                                specify "noncolin=.TRUE." instead
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       noncolin
   
   Type:           LOGICAL
   Default:        .false.
   Description:    if .true. the program will perform a noncollinear calculation.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ecfixed
   
   Type:           REAL
   Default:        0.0
   See:            q2sigma
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       qcutz
   
   Type:           REAL
   Default:        0.0
   See:            q2sigma
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       q2sigma
   
   Type:           REAL
   Default:        0.1
   Description:    ecfixed, qcutz, q2sigma:  parameters for modified functional to be
                   used in variable-cell molecular dynamics (or in stress calculation).
                   "ecfixed" is the value (in Rydberg) of the constant-cutoff;
                   "qcutz" and "q2sigma" are the height and the width (in Rydberg)
                   of the energy step for reciprocal vectors whose square modulus
                   is greater than "ecfixed". In the kinetic energy, G^2 is
                   replaced by G^2 + qcutz * (1 + erf ( (G^2 - ecfixed)/q2sigma) )
                   See: M. Bernasconi et al, J. Phys. Chem. Solids 56, 501 (1995)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       input_dft
   
   Type:           CHARACTER
   Default:        read from pseudopotential files
   Description:    Exchange-correlation functional: eg 'PBE', 'BLYP' etc
                   See Modules/functionals.f90 for allowed values.
                   Overrides the value read from pseudopotential files.
                   Use with care and if you know what you are doing!
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       exx_fraction
   
   Type:           REAL
   Default:        it depends on the specified functional
   Description:    Fraction of EXX for hybrid functional calculations. In the case of
                   input_dft='PBE0', the default value is 0.25, while for input_dft='B3LYP'
                   the exx_fraction default value is 0.20.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       screening_parameter
   
   Type:           REAL
   Default:        0.106
   Description:    screening_parameter for HSE like hybrid functionals.
                   See J. Chem. Phys. 118, 8207 (2003)
                   and J. Chem. Phys. 124, 219906 (2006) for more informations.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       exxdiv_treatment
   
   Type:           CHARACTER
   Default:        gygi-baldereschi
   Description:    Specific for EXX. It selects the kind of approach to be used
                   for treating the Coulomb potential divergencies at small q vectors.
                   
                   gygi-baldereschi : appropriate for cubic and quasi-cubic supercells
                   vcut_spherical : appropriate for cubic and quasi-cubic supercells
                   vcut_ws : appropriate for strongly anisotropic supercells, see also
                             ecutvcut.
                   none : sets Coulomb potential at G,q=0 to 0.0 (required for GAU-PBE)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       x_gamma_extrapolation
   
   Type:           LOGICAL
   Default:        .true.
   Description:    Specific for EXX. If true, extrapolate the G=0 term of the
                   potential (see README in examples/EXX_example for more)
                   Set this to .false. for GAU-PBE.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ecutvcut
   
   Type:           REAL
   Default:        0.0 Ry
   See:            exxdiv_treatment
   Description:    Reciprocal space cutoff for correcting
                   Coulomb potential divergencies at small q vectors.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      nqx1, nqx2, nqx3
   
   Type:           INTEGER
   Description:    three-dimensional mesh for q (k1-k2) sampling of
                   the Fock operator (EXX). Can be smaller than
                   the number of k-points.
                   
                   Currently this defaults to the size of the k-point mesh used.
                    In QE =< 5.0.2 it defaulted to nqx1=nqx2=nqx3=1.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lda_plus_u
   
   Type:           LOGICAL
   Default:        .FALSE.
   Status:         DFT+U (formerly known as LDA+U) currently works only for
                   a few selected elements. Modify flib/set_hubbard_l.f90 and
                   PW/src/tabd.f90 if you plan to use DFT+U with an element that
                   is not configured there.
   Description:    Specify lda_plus_u = .TRUE. to enable DFT+U calculations
                   See: Anisimov, Zaanen, and Andersen, PRB 44, 943 (1991);
                        Anisimov et al., PRB 48, 16929 (1993);
                        Liechtenstein, Anisimov, and Zaanen, PRB 52, R5467 (1994).
                   You must specify, for each species with a U term, the value of
                   U and (optionally) alpha, J of the Hubbard model (all in eV):
                   see lda_plus_u_kind, Hubbard_U, Hubbard_alpha, Hubbard_J
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lda_plus_u_kind
   
   Type:           INTEGER
   Default:        0
   Description:    Specifies the type of DFT+U calculation:
                                     0   simplified version of Cococcioni and de Gironcoli,
                                         PRB 71, 035105 (2005), using Hubbard_U
                                     1   rotationally invariant scheme of Liechtenstein et al.,
                                         using Hubbard_U and Hubbard_J
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       Hubbard_U(i), i=1,ntyp
   
   Type:           REAL
   Default:        0.D0 for all species
   Description:    Hubbard_U(i): U parameter (eV) for species i, DFT+U calculation
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       Hubbard_J0(i), i=1,ntype
   
   Type:           REAL
   Default:        0.D0 for all species
   Description:    Hubbard_J0(i): J0 parameter (eV) for species i, DFT+U+J calculation,
                   see PRB 84, 115108 (2011) for details.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       Hubbard_alpha(i), i=1,ntyp
   
   Type:           REAL
   Default:        0.D0 for all species
   Description:    Hubbard_alpha(i) is the perturbation (on atom i, in eV)
                   used to compute U with the linear-response method of
                   Cococcioni and de Gironcoli, PRB 71, 35105 (2005)
                   (only for lda_plus_u_kind=0)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       Hubbard_beta(i), i=1,ntyp
   
   Type:           REAL
   Default:        0.D0 for all species
   Description:    Hubbard_beta(i) is the perturbation (on atom i, in eV)
                   used to compute J0 with the linear-response method of
                   Cococcioni and de Gironcoli, PRB 71, 35105 (2005)
                   (only for lda_plus_u_kind=0). See also
                   PRB 84, 115108 (2011).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       Hubbard_J(i,ityp)
   
   Default:        0.D0 for all species
   Description:    Hubbard_J(i,ityp): J parameters (eV) for species ityp,
                   used in DFT+U calculations (only for lda_plus_u_kind=1)
                   For p orbitals:  J = Hubbard_J(1,ityp);
                   For d orbitals:  J = Hubbard_J(1,ityp), B = Hubbard_J(2,ityp);
                   For f orbitals:  J = Hubbard_J(1,ityp), E2 = Hubbard_J(2,ityp),
                                    E3= Hubbard_J(3,ityp).
                   If B or E2 or E3 are not specified or set to 0 they will be
                   calculated from J using atomic ratios.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       starting_ns_eigenvalue(m,ispin,I)
   
   Type:           REAL
   Default:        -1.d0 that means NOT SET
   Description:    In the first iteration of an DFT+U run it overwrites
                   the m-th eigenvalue of the ns occupation matrix for the
                   ispin component of atomic species I. Leave unchanged
                   eigenvalues that are not set. This is useful to suggest
                   the desired orbital occupations when the default choice
                   takes another path.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       U_projection_type
   
   Type:           CHARACTER
   Default:        'atomic'
   Description:    Only active when lda_plus_U is .true., specifies the type
                   of projector on localized orbital to be used in the DFT+U
                   scheme.
                   
                   Currently available choices:
                   'atomic': use atomic wfc's (as they are) to build the projector
                   
                   'ortho-atomic': use Lowdin orthogonalized atomic wfc's
                   
                   'norm-atomic':  Lowdin normalization of atomic wfc. Keep in mind:
                                   atomic wfc are not orthogonalized in this case.
                                   This is a "quick and dirty" trick to be used when
                                   atomic wfc from the pseudopotential are not
                                   normalized (and thus produce occupation whose
                                   value exceeds unity). If orthogonalized wfc are
                                   not needed always try 'atomic' first.
                   
                   'file':         use the information from file "prefix".atwfc that must
                                   have been generated previously, for instance by pmw.x
                                   (see PP/src/poormanwannier.f90 for details).
                   
                   'pseudo':       use the pseudopotential projectors. The charge density
                                   outside the atomic core radii is excluded.
                                   N.B.: for atoms with +U, a pseudopotential with the
                                   all-electron atomic wavefunctions is required (i.e.,
                                   as generated by ld1.x with lsave_wfc flag).
                   
                   NB: forces and stress currently implemented only for the
                   'atomic' and 'pseudo' choice.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       edir
   
   Type:           INTEGER
   Description:    The direction of the electric field or dipole correction is
                   parallel to the bg(:,edir) reciprocal lattice vector, so the
                   potential is constant in planes defined by FFT grid points;
                   edir = 1, 2 or 3. Used only if tefield is .TRUE.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       emaxpos
   
   Type:           REAL
   Default:        0.5D0
   Description:    Position of the maximum of the saw-like potential along crystal
                   axis "edir", within the  unit cell (see below), 0 < emaxpos < 1
                   Used only if tefield is .TRUE.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       eopreg
   
   Type:           REAL
   Default:        0.1D0
   Description:    Zone in the unit cell where the saw-like potential decreases.
                   ( see below, 0 < eopreg < 1 ). Used only if tefield is .TRUE.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       eamp
   
   Type:           REAL
   Default:        0.001 a.u.
   Description:    Amplitude of the electric field, in ***Hartree*** a.u.;
                   1 a.u. = 51.4220632*10^10 V/m). Used only if tefield=.TRUE.
                   The saw-like potential increases with slope "eamp" in the
                   region from (emaxpos+eopreg-1) to (emaxpos), then decreases
                   to 0 until (emaxpos+eopreg), in units of the crystal
                   vector "edir". Important: the change of slope of this
                   potential must be located in the empty region, or else
                   unphysical forces will result.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       angle1(i), i=1,ntyp
   
   Type:           REAL
   Description:    The angle expressed in degrees between the initial
                   magnetization and the z-axis. For noncollinear calculations
                   only; index i runs over the atom types.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       angle2(i), i=1,ntyp
   
   Type:           REAL
   Description:    The angle expressed in degrees between the projection
                   of the initial magnetization on x-y plane and the x-axis.
                   For noncollinear calculations only.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       constrained_magnetization
   
   Type:           CHARACTER
   See:            lambda, fixed_magnetization
   Default:        'none'
   Description:    Used to perform constrained calculations in magnetic systems.
                   Currently available choices:
                   
                   'none':
                            no constraint
                   
                   'total':
                            total magnetization is constrained by
                            adding a penalty functional to the total energy:
                   
                            LAMBDA * SUM_{i} ( magnetization(i) - fixed_magnetization(i) )**2
                   
                            where the sum over i runs over the three components of
                            the magnetization. Lambda is a real number (see below).
                            Noncolinear case only. Use "tot_magnetization" for LSDA
                   
                   'atomic':
                            atomic magnetization are constrained to the defined
                            starting magnetization adding a penalty:
                   
                            LAMBDA * SUM_{i,itype} ( magnetic_moment(i,itype) - mcons(i,itype) )**2
                   
                            where i runs over the cartesian components (or just z
                            in the collinear case) and itype over the types (1-ntype).
                            mcons(:,:) array is defined from starting_magnetization,
                            (and angle1, angle2 in the non-collinear case). lambda is
                            a real number
                   
                   'total direction':
                             the angle theta of the total magnetization
                             with the z axis (theta = fixed_magnetization(3))
                             is constrained:
                   
                             LAMBDA * ( arccos(magnetization(3)/mag_tot) - theta )**2
                   
                             where mag_tot is the modulus of the total magnetization.
                   
                   'atomic direction':
                             not all the components of the atomic
                             magnetic moment are constrained but only the cosine
                             of angle1, and the penalty functional is:
                   
                             LAMBDA * SUM_{itype} ( mag_mom(3,itype)/mag_mom_tot - cos(angle1(ityp)) )**2
                   
                   N.B.: symmetrization may prevent to reach the desired orientation
                         of the magnetization. Try not to start with very highly symmetric
                         configurations or use the nosym flag (only as a last remedy)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       fixed_magnetization(i), i=1,3
   
   Type:           REAL
   See:            constrained_magnetization
   Default:        0.d0
   Description:    total magnetization vector (x,y,z components) to be kept
                   fixed when constrained_magnetization='total'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lambda
   
   Type:           REAL
   See:            constrained_magnetization
   Default:        1.d0
   Description:    parameter used for constrained_magnetization calculations
                   N.B.: if the scf calculation does not converge, try to reduce lambda
                         to obtain convergence, then restart the run with a larger lambda
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       report
   
   Type:           INTEGER
   Default:        1
   Description:    It is the number of iterations after which the program
                   write all the atomic magnetic moments.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lspinorb
   
   Type:           LOGICAL
   Description:    if .TRUE. the noncollinear code can use a pseudopotential with
                   spin-orbit.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       assume_isolated
   
   Type:           CHARACTER
   Default:        'none'
   Description:    Used to perform calculation assuming the system to be
                   isolated (a molecule or a cluster in a 3D supercell).
                   
                   Currently available choices:
                   
                   'none' (default): regular periodic calculation w/o any correction.
                   
                   'makov-payne', 'm-p', 'mp' : the Makov-Payne correction to the
                            total energy is computed. An estimate of the vacuum
                            level is also calculated so that eigenvalues can be
                            properly aligned. ONLY FOR CUBIC SYSTEMS (ibrav=1,2,3)
                            Theory:
                            G.Makov, and M.C.Payne,
                            "Periodic boundary conditions in ab initio
                            calculations" , Phys.Rev.B 51, 4014 (1995)
                   
                   'martyna-tuckerman', 'm-t', 'mt' : Martyna-Tuckerman correction
                            to both total energy and scf potential. Adapted from:
                            G.J. Martyna, and M.E. Tuckerman,
                            "A reciprocal space based method for treating long
                            range interactions in ab-initio and force-field-based
                            calculation in clusters", J.Chem.Phys. 110, 2810 (1999)
                   
                   'esm' :  Effective Screening Medium Method.
                            For polarized or charged slab calculation, embeds
                            the simulation cell within an effective semi-
                            infinite medium in the perpendicular direction
                            (along z). Embedding regions can be vacuum or
                            semi-infinite metal electrodes (use 'esm_bc' to
                            choose boundary conditions). If between two
                            electrodes, an optional electric field
                            ('esm_efield') may be applied. Method described in
                            M. Otani and O. Sugino, "First-principles
                            calculations of charged surfaces and interfaces:
                            A plane-wave nonrepeated slab approach," PRB 73,
                            115407 (2006).
                            NB: Requires cell with a_3 lattice vector along z,
                            normal to the xy plane, with the slab centered
                            around z=0. Also requires symmetry checking to be
                            disabled along z, either by setting 'nosym' = .TRUE.
                            or by very slight displacement (i.e., 5e-4 a.u.)
                            of the slab along z.
                            See 'esm_bc', 'esm_efield', 'esm_w', 'esm_nfit'.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       esm_bc
   
   Type:           CHARACTER
   See:            assume_isolated
   Default:        'pbc'
   Description:    If assume_isolated = 'esm', determines the boundary
                   conditions used for either side of the slab.
                   
                   Currently available choices:
                   
                   'pbc' (default): regular periodic calculation (no ESM).
                   
                   'bc1' : Vacuum-slab-vacuum (open boundary conditions)
                   
                   'bc2' : Metal-slab-metal (dual electrode configuration).
                           See also 'esm_efield'.
                   
                   'bc3' : Vacuum-slab-metal
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       esm_w
   
   Type:           REAL
   See:            assume_isolated
   Default:        0.d0
   Description:    If assume_isolated = 'esm', determines the position offset
                   [in a.u.] of the start of the effective screening region,
                   measured relative to the cell edge. (ESM region begins at
                   z = +/- [L_z/2 + esm_w] ).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       esm_efield
   
   Type:           REAL
   See:            assume_isolated, esm_bc
   Default:        0.d0
   Description:    If assume_isolated = 'esm' and esm_bc = 'bc2', gives the
                   magnitude of the electric field [Ry/a.u.] to be applied
                   between semi-infinite ESM electrodes.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       esm_nfit
   
   Type:           INTEGER
   See:            assume_isolated
   Default:        4
   Description:    If assume_isolated = 'esm', gives the number of z-grid points
                   for the polynomial fit along the cell edge.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       vdw_corr
   
   Type:           CHARACTER
   Default:        'none'
   Description:    Type of Van der Waals correction. Allowed values:
                   
                      'grimme-d2', 'Grimme-D2', 'DFT-D', 'dft-d': semiempirical Grimme's DFT-D2.
                       Optional variables: "london_s6", "london_rcut"
                       S. Grimme, J. Comp. Chem. 27, 1787 (2006),
                       V. Barone et al., J. Comp. Chem. 30, 934 (2009).
                   
                       'TS', 'ts', 'ts-vdw', 'ts-vdW', 'tkatchenko-scheffler': Tkatchenko-Scheffler
                        dispersion corrections with first-principle derived C6 coefficients
                        (implemented in CP only). Optional variables: "ts_vdw_econv_thr", "ts_vdw_isolated"
                        See A. Tkatchenko and M. Scheffler, Phys. Rev. Lett. 102, 073005 (2009)
                   
                       'XDM', 'xdm': Exchange-hole dipole-moment model. Optional variables: "xdm_a1", "xdm_a2"
                        A. D. Becke and E. R. Johnson, J. Chem. Phys. 127, 154108 (2007)
                            A. Otero de la Roza, E. R. Johnson, J. Chem. Phys. 136, 174109 (2012)
                   
                   Note that non-local functionals (eg vdw-DF) are NOT specified here but in "input_dft"
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       london
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    OBSOLESCENT, same as vdw_corr='DFT-D'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       london_s6
   
   Type:           REAL
   Default:        0.75
   Description:    global scaling parameter for DFT-D. Default is good for PBE.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       london_rcut
   
   Type:           REAL
   Default:        200
   Description:    cutoff radius (a.u.) for dispersion interactions
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       xdm
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    OBSOLESCENT, same as vdw_corr='xdm'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       xdm_a1
   
   Type:           REAL
   Default:        0.6836
   Description:    Damping function parameter a1 (adimensional). This value should change
                   with the exchange-correlation functional. The default corresponds to
                   PW86PBE.
                   For other functionals, see:
                      http://gatsby.ucmerced.edu/wiki/XDM_damping_function_parameters
                      A. Otero de la Roza, E. R. Johnson, J. Chem. Phys. 138, 204109 (2013)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       xdm_a2
   
   Type:           REAL
   Default:        1.5045
   Description:    Damping function parameter a2 (angstrom). This value should change
                   with the exchange-correlation functional. The default corresponds to
                   PW86PBE.
                   For other functionals, see:
                      http://gatsby.ucmerced.edu/wiki/XDM_damping_function_parameters
                      A. Otero de la Roza, E. R. Johnson, J. Chem. Phys. 138, 204109 (2013)
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================


========================================================================
NAMELIST: &ELECTRONS

   +--------------------------------------------------------------------
   Variable:       electron_maxstep
   
   Type:           INTEGER
   Default:        100
   Description:    maximum number of iterations in a scf step
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       scf_must_converge
   
   Type:           LOGICAL
   Default:        .TRUE.
   Description:    If .false. do not stop molecular dynamics or ionic relaxation
                   when electron_maxstep is reached. Use with care.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       conv_thr
   
   Type:           REAL
   Default:        1.D-6
   Description:    Convergence threshold for selfconsistency:
                      estimated energy error < conv_thr
                   (note that conv_thr is extensive, like the total energy).
                   For non-self-consistent calculations, conv_thr is used
                   to set the default value of the threshold (ethr) for
                   iterative diagonalizazion: see diago_thr_init
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       adaptive_thr
   
   Type:           LOGICAL
   Default:        .FALSE
   Description:    If .TRUE. this turns on the use of an adaptive conv_thr for
                   the inner scf loops when using EXX.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       conv_thr_init
   
   Type:           REAL
   Default:        1.D-3
   Description:    When adaptive_thr = .TRUE. this is the convergence threshold
                   used for the first scf cycle.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       conv_thr_multi
   
   Type:           REAL
   Default:        1.D-1
   Description:    When adaptive_thr = .TRUE. the convergence threshold for
                   each scf cycle is given by:
                   max( conv_thr, conv_thr_multi * dexx )
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       mixing_mode
   
   Type:           CHARACTER
   Default:        'plain'
   Description:    'plain' :    charge density Broyden mixing
                   
                   'TF' :       as above, with simple Thomas-Fermi screening
                               (for highly homogeneous systems)
                   
                   'local-TF':  as above, with local-density-dependent TF screening
                                (for highly inhomogeneous systems)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       mixing_beta
   
   Type:           REAL
   Default:        0.7D0
   Description:    mixing factor for self-consistency
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       mixing_ndim
   
   Type:           INTEGER
   Default:        8
   Description:    number of iterations used in mixing scheme.
                   If you are tight with memory, you may reduce it to 4 or so.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       mixing_fixed_ns
   
   Type:           INTEGER
   Default:        0
   Description:    For DFT+U : number of iterations with fixed ns ( ns is the
                     atomic density appearing in the Hubbard term ).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       diagonalization
   
   Type:           CHARACTER
   Default:        'david'
   Description:    'david':  Davidson iterative diagonalization with overlap matrix
                             (default). Fast, may in some rare cases fail.
                   
                   'cg' :    conjugate-gradient-like band-by-band diagonalization
                             Typically slower than 'david' but it uses less memory
                             and is more robust (it seldom fails)
                   
                   'cg-serial', 'david-serial': obsolete, use "-ndiag 1 instead"
                             The subspace diagonalization in Davidson is performed
                             by a fully distributed-memory parallel algorithm on
                             4 or more processors, by default. The allocated memory
                             scales down with the number of procs. Procs involved
                             in diagonalization can be changed with command-line
                             option "-ndiag N". On multicore CPUs it is often
                             convenient to let just one core per CPU to work
                             on linear algebra.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ortho_para
   
   Type:           INTEGER
   Default:        0
   Status:         OBSOLETE: use command-line option " -ndiag XX" instead
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       diago_thr_init
   
   Type:           REAL
   Description:    Convergence threshold (ethr) for iterative diagonalization
                   (the check is on eigenvalue convergence).
                   For scf calculations: default is 1.D-2 if starting from a
                   superposition of atomic orbitals; 1.D-5 if starting from a
                   charge density. During self consistency the threshold
                   is automatically reduced (but never below 1.D-13) when
                   approaching convergence.
                   For non-scf calculations: default is (conv_thr/N elec)/10.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       diago_cg_maxiter
   
   Type:           INTEGER
   Description:    For conjugate gradient diagonalization:
                   max number of iterations
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       diago_david_ndim
   
   Type:           INTEGER
   Default:        4
   Description:    For Davidson diagonalization: dimension of workspace
                   (number of wavefunction packets, at least 2 needed).
                   A larger value may yield a somewhat faster algorithm
                   but uses more memory. The opposite holds for smaller values.
                   Try diago_david_ndim=2 if you are tight on memory or if
                   your job is large: the speed penalty is often negligible
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       diago_full_acc
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    If .TRUE. all the empty states are diagonalized at the same level
                   of accuracy of the occupied ones. Otherwise the empty states are
                   diagonalized using a larger threshold (this should not affect
                   total energy, forces, and other ground-state properties).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       efield
   
   Type:           REAL
   Default:        0.D0
   Description:    Amplitude of the finite electric field (in Ry a.u.;
                   1 a.u. = 36.3609*10^10 V/m). Used only if lelfield=.TRUE.
                   and if k-points (K_POINTS card) are not automatic.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       efield_cart(i), i=1,3
   
   Type:           REAL
   Default:        (0.D0, 0.D0, 0.D0)
   Description:    Finite electric field (in Ry a.u.=36.3609*10^10 V/m) in
                   cartesian axis. Used only if lelfield=.TRUE. and if
                   k-points (K_POINTS card) are automatic.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       startingpot
   
   Type:           CHARACTER
   Description:    'atomic': starting potential from atomic charge superposition
                             ( default for scf, *relax, *md )
                   
                   'file'  : start from existing "charge-density.xml" file in the
                             directory specified by variables "prefix" and "outdir"
                             For nscf and bands calculation this is the default
                             and the only sensible possibility.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       startingwfc
   
   Type:           CHARACTER
   Default:        'atomic+random'
   Description:    'atomic': start from superposition of atomic orbitals
                             If not enough atomic orbitals are available,
                             fill with random numbers the remaining wfcs
                             The scf typically starts better with this option,
                             but in some high-symmetry cases one can "loose"
                             valence states, ending up in the wrong ground state.
                   
                   'atomic+random': as above, plus a superimposed "randomization"
                             of atomic orbitals. Prevents the "loss" of states
                             mentioned above.
                   
                   'random': start from random wfcs. Slower start of scf but safe.
                             It may also reduce memory usage in conjunction with
                             diagonalization='cg'
                   
                   'file':   start from an existing wavefunction file in the
                             directory specified by variables "prefix" and "outdir"
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tqr
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    If .true., use the real-space algorithm for augmentation
                   charges in ultrasoft pseudopotentials.
                   Must faster execution of ultrasoft-related calculations,
                   but numerically less accurate than the default algorithm.
                   Use with care and after testing!
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================


========================================================================
NAMELIST: &IONS

   INPUT THIS NAMELIST ONLY IF CALCULATION = 'RELAX', 'MD', 'VC-RELAX', 'VC-MD'
   
   +--------------------------------------------------------------------
   Variable:       ion_dynamics
   
   Type:           CHARACTER
   Description:    Specify the type of ionic dynamics.
                   
                   For different type of calculation different possibilities are
                   allowed and different default values apply:
                   
                   CASE ( calculation = 'relax' )
                       'bfgs' :   (default)   use BFGS quasi-newton algorithm,
                                              based on the trust radius procedure,
                                              for structural relaxation
                       'damp' :               use damped (quick-min Verlet)
                                              dynamics for structural relaxation
                                              Can be used for constrained
                                              optimisation: see CONSTRAINTS card
                   
                   CASE ( calculation = 'md' )
                       'verlet' : (default)   use Verlet algorithm to integrate
                                              Newton's equation. For constrained
                                              dynamics, see CONSTRAINTS card
                       'langevin'             ion dynamics is over-damped Langevin
                       'langevin-smc'         over-damped Langevin with Smart Monte Carlo:
                                              see R.J.Rossky, JCP, 69, 4628(1978)
                   
                   
                   CASE ( calculation = 'vc-relax' )
                       'bfgs' :   (default)   use BFGS quasi-newton algorithm;
                                              cell_dynamics must be 'bfgs' too
                       'damp' :               use damped (Beeman) dynamics for
                                              structural relaxation
                   CASE ( calculation = 'vc-md' )
                       'beeman' : (default)   use Beeman algorithm to integrate
                                              Newton's equation
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ion_positions
   
   Type:           CHARACTER
   Default:        'default'
   Description:    'default '  : if restarting, use atomic positions read from the
                                 restart file; in all other cases, use atomic
                                 positions from standard input.
                   
                   'from_input' : restart the simulation with atomic positions read
                                 from standard input, even if restarting.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       phase_space
   
   Type:           CHARACTER
   Default:        'full'
   Description:    'full' :           the full phase-space is used for the ionic
                                      dynamics.
                   
                   'coarse-grained' : a coarse-grained phase-space, defined by a set
                                      of constraints, is used for the ionic dynamics
                                      (used for calculation of free-energy barriers)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       pot_extrapolation
   
   Type:           CHARACTER
   Default:        'atomic'
   Description:    Used to extrapolate the potential from preceding ionic steps.
                   
                      'none'        :  no extrapolation
                   
                      'atomic'      :  extrapolate the potential as if it was a sum of
                                       atomic-like orbitals
                   
                      'first_order' :  extrapolate the potential with first-order
                                       formula
                   
                      'second_order':  as above, with second order formula
                   
                   Note: 'first_order' and 'second-order' extrapolation make sense
                   only for molecular dynamics calculations
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       wfc_extrapolation
   
   Type:           CHARACTER
   Default:        'none'
   Description:    Used to extrapolate the wavefunctions from preceding ionic steps.
                   
                      'none'        :  no extrapolation
                   
                      'first_order' :  extrapolate the wave-functions with first-order
                                       formula.
                   
                      'second_order':  as above, with second order formula.
                   
                   Note: 'first_order' and 'second-order' extrapolation make sense
                   only for molecular dynamics calculations
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       remove_rigid_rot
   
   Type:           LOGICAL
   Default:        .FALSE.
   Description:    This keyword is useful when simulating the dynamics and/or the
                   thermodynamics of an isolated system. If set to true the total
                   torque of the internal forces is set to zero by adding new forces
                   that compensate the spurious interaction with the periodic
                   images. This allows for the use of smaller supercells.
                   
                   BEWARE: since the potential energy is no longer consistent with
                   the forces (it still contains the spurious interaction with the
                   repeated images), the total energy is not conserved anymore.
                   However the dynamical and thermodynamical properties should be
                   in closer agreement with those of an isolated system.
                   Also the final energy of a structural relaxation will be higher,
                   but the relaxation itself should be faster.
   +--------------------------------------------------------------------
   
   ///---
      KEYWORDS USED FOR MOLECULAR DYNAMICS
      
      +--------------------------------------------------------------------
      Variable:       ion_temperature
      
      Type:           CHARACTER
      Default:        'not_controlled'
      Description:    'rescaling'   control ionic temperature via velocity rescaling
                                    (first method) see parameters "tempw", "tolp", and
                                    "nraise" (for VC-MD only). This rescaling method
                                    is the only one currently implemented in VC-MD
                      
                      'rescale-v'   control ionic temperature via velocity rescaling
                                    (second method) see parameters "tempw" and "nraise"
                      
                      'rescale-T'   control ionic temperature via velocity rescaling
                                    (third method) see parameter "delta_t"
                      
                      'reduce-T'    reduce ionic temperature every "nraise" steps
                                    by the (negative) value "delta_t"
                      
                      'berendsen'   control ionic temperature using "soft" velocity
                                    rescaling - see parameters "tempw" and "nraise"
                      
                      'andersen'    control ionic temperature using Andersen thermostat
                                    see parameters "tempw" and "nraise"
                      
                      'initial'     initialize ion velocities to temperature "tempw"
                                    and leave uncontrolled further on
                      
                      'not_controlled' (default) ionic temperature is not controlled
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       tempw
      
      Type:           REAL
      Default:        300.D0
      Description:    Starting temperature (Kelvin) in MD runs
                      target temperature for most thermostats.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       tolp
      
      Type:           REAL
      Default:        100.D0
      Description:    Tolerance for velocity rescaling. Velocities are rescaled if
                      the run-averaged and target temperature differ more than tolp.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       delta_t
      
      Type:           REAL
      Default:        1.D0
      Description:    if ion_temperature='rescale-T':
                             at each step the instantaneous temperature is multiplied
                             by delta_t; this is done rescaling all the velocities.
                      
                      if ion_temperature='reduce-T':
                             every 'nraise' steps the instantaneous temperature is
                             reduced by -delta_T (i.e. delta_t < 0 is added to T)
                      
                      The instantaneous temperature is calculated at the end of
                      every ionic move and BEFORE rescaling. This is the temperature
                      reported in the main output.
                      
                      For delta_t < 0, the actual average rate of heating or cooling
                      should be roughly C*delta_t/(nraise*dt) (C=1 for an
                      ideal gas, C=0.5 for a harmonic solid, theorem of energy
                      equipartition between all quadratic degrees of freedom).
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       nraise
      
      Type:           INTEGER
      Default:        1
      Description:    if ion_temperature='reduce-T':
                             every 'nraise' steps the instantaneous temperature is
                             reduced by -delta_T (.e. delta_t is added to the temperature)
                      
                      if ion_temperature='rescale-v':
                             every 'nraise' steps the average temperature, computed from
                             the last nraise steps, is rescaled to tempw
                      
                      if ion_temperature='rescaling' and calculation='vc-md':
                             every 'nraise' steps the instantaneous temperature
                             is rescaled to tempw
                      
                      if ion_temperature='berendsen':
                             the "rise time" parameter is given in units of the time step:
                             tau = nraise*dt, so dt/tau = 1/nraise
                      
                      if ion_temperature='andersen':
                             the "collision frequency" parameter is given as nu=1/tau
                             defined above, so nu*dt = 1/nraise
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       refold_pos
      
      Type:           LOGICAL
      Default:        .FALSE.
      Description:    This keyword applies only in the case of molecular dynamics or
                      damped dynamics. If true the ions are refolded at each step into
                      the supercell.
      +--------------------------------------------------------------------
      
   \\\---
   
   ///---
      KEYWORDS USED ONLY IN BFGS CALCULATIONS
      
      +--------------------------------------------------------------------
      Variable:       upscale
      
      Type:           REAL
      Default:        100.D0
      Description:    Max reduction factor for conv_thr during structural optimization
                      conv_thr is automatically reduced when the relaxation
                      approaches convergence so that forces are still accurate,
                      but conv_thr will not be reduced to less that
                      conv_thr / upscale.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       bfgs_ndim
      
      Type:           INTEGER
      Default:        1
      Description:    Number of old forces and displacements vectors used in the
                      PULAY mixing of the residual vectors obtained on the basis
                      of the inverse hessian matrix given by the BFGS algorithm.
                      When bfgs_ndim = 1, the standard quasi-Newton BFGS method is
                      used.
                      (bfgs only)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       trust_radius_max
      
      Type:           REAL
      Default:        0.8D0
      Description:    Maximum ionic displacement in the structural relaxation.
                      (bfgs only)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       trust_radius_min
      
      Type:           REAL
      Default:        1.D-3
      Description:    Minimum ionic displacement in the structural relaxation
                      BFGS is reset when trust_radius < trust_radius_min.
                      (bfgs only)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       trust_radius_ini
      
      Type:           REAL
      Default:        0.5D0
      Description:    Initial ionic displacement in the structural relaxation.
                      (bfgs only)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       w_1
      
      Type:           REAL
      Default:        0.01D0
      See:            w_2
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       w_2
      
      Type:           REAL
      Default:        0.5D0
      Description:    Parameters used in line search based on the Wolfe conditions.
                      (bfgs only)
      +--------------------------------------------------------------------
      
   \\\---
   
===END OF NAMELIST======================================================


========================================================================
NAMELIST: &CELL

   INPUT THIS NAMELIST ONLY IF CALCULATION = 'VC-RELAX', 'VC-MD'
   
   +--------------------------------------------------------------------
   Variable:       cell_dynamics
   
   Type:           CHARACTER
   Description:    Specify the type of dynamics for the cell.
                   For different type of calculation different possibilities
                   are allowed and different default values apply:
                   
                   CASE ( calculation = 'vc-relax' )
                     'none':    no dynamics
                     'sd':      steepest descent ( not implemented )
                     'damp-pr': damped (Beeman) dynamics of the Parrinello-Rahman
                                extended lagrangian
                     'damp-w':  damped (Beeman) dynamics of the new Wentzcovitch
                                extended lagrangian
                     'bfgs':    BFGS quasi-newton algorithm (default)
                                ion_dynamics must be 'bfgs' too
                   CASE ( calculation = 'vc-md' )
                     'none':    no dynamics
                     'pr':      (Beeman) molecular dynamics of the Parrinello-Rahman
                                extended lagrangian
                     'w':       (Beeman) molecular dynamics of the new Wentzcovitch
                                extended lagrangian
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       press
   
   Type:           REAL
   Default:        0.D0
   Description:    Target pressure [KBar] in a variable-cell md or relaxation run.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       wmass
   
   Type:           REAL
   Default:        0.75*Tot_Mass/pi**2 for Parrinello-Rahman MD;
                   0.75*Tot_Mass/pi**2/Omega**(2/3) for Wentzcovitch MD
   Description:    Fictitious cell mass [amu] for variable-cell simulations
                   (both 'vc-md' and 'vc-relax')
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       cell_factor
   
   Type:           REAL
   Default:        1.2D0
   Description:    Used in the construction of the pseudopotential tables.
                   It should exceed the maximum linear contraction of the
                   cell during a simulation.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       press_conv_thr
   
   Type:           REAL
   Default:        0.5D0 Kbar
   Description:    Convergence threshold on the pressure for variable cell
                   relaxation ('vc-relax' : note that the other convergence
                   thresholds for ionic relaxation apply as well).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       cell_dofree
   
   Type:           CHARACTER
   Default:        'all'
   Description:    Select which of the cell parameters should be moved:
                   
                   all     = all axis and angles are moved
                   x       = only the x component of axis 1 (v1_x) is moved
                   y       = only the y component of axis 2 (v2_y) is moved
                   z       = only the z component of axis 3 (v3_z) is moved
                   xy      = only v1_x and v2_y are moved
                   xz      = only v1_x and v3_z are moved
                   yz      = only v2_y and v3_z are moved
                   xyz     = only v1_x, v2_y, v3_z are moved
                   shape   = all axis and angles, keeping the volume fixed
                   volume  = the volume changes, keeping all angles fixed (i.e. only celldm(1) changes)
                   2Dxy    = only x and y components are allowed to change
                   2Dshape = as above, keeping the area in xy plane fixed
                   
                   BEWARE: if axis are not orthogonal, some of these options do not
                    work (symmetry is broken). If you are not happy with them,
                    edit subroutine init_dofree in file Modules/cell_base.f90
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================


========================================================================
CARD: ATOMIC_SPECIES 

   /////////////////////////////////////////
   // Syntax:                             //
   /////////////////////////////////////////
   
      ATOMIC_SPECIES 
         X(1)     Mass_X(1)     PseudoPot_X(1)     
         X(2)     Mass_X(2)     PseudoPot_X(2)     
         . . . 
         X(ntyp)  Mass_X(ntyp)  PseudoPot_X(ntyp)  
   
   /////////////////////////////////////////
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Variable:       X
      
      Type:           CHARACTER
      Description:    label of the atom. Acceptable syntax:
                      chemical symbol X (1 or 2 characters, case-insensitive)
                      or "Xn", n=0,..., 9; "X_*", "X-*" (e.g. C1, As_h)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       Mass_X
      
      Type:           REAL
      Description:    mass of the atomic species [amu: mass of C = 12]
                      Used only when performing Molecular Dynamics run
                      or structural optimization runs using Damped MD.
                      Not actually used in all other cases (but stored
                      in data files, so phonon calculations will use
                      these values unless other values are provided)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       PseudoPot_X
      
      Type:           CHARACTER
      Description:    File containing PP for this species.
                      
                      The pseudopotential file is assumed to be in the new UPF format.
                      If it doesn't work, the pseudopotential format is determined by
                      the file name:
                      
                      *.vdb or *.van     Vanderbilt US pseudopotential code
                      *.RRKJ3            Andrea Dal Corso's code (old format)
                      none of the above  old PWscf norm-conserving format
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================


========================================================================
CARD: ATOMIC_POSITIONS {  alat | bohr | angstrom | crystal   }

   ________________________________________________________________________
   * IF calculation == 'bands' OR calculation == 'nscf' : 
   
      Specified atomic positions will be IGNORED and those from the
      previous scf calculation will be used instead !!!
      
       
   * ELSE IF  : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
         ATOMIC_POSITIONS {  alat | bohr | angstrom | crystal   }
            X(1)    x(1)    y(1)    z(1)    {  if_pos(1)(1)    if_pos(2)(1)    if_pos(3)(1)    }  
            X(2)    x(2)    y(2)    z(2)    {  if_pos(1)(2)    if_pos(2)(2)    if_pos(3)(2)    }  
            . . . 
            X(nat)  x(nat)  y(nat)  z(nat)  {  if_pos(1)(nat)  if_pos(2)(nat)  if_pos(3)(nat)  }  
      
      /////////////////////////////////////////
      
       
   ENDIF
   ________________________________________________________________________
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Card's flags:   {  alat | bohr | angstrom | crystal   }
      
      Default:        alat (DEPRECATED)
      Description:    alat    : atomic positions are in cartesian coordinates, in
                                units of the lattice parameter (either celldm(1)
                                or A). If no option is specified, 'alat' is assumed;
                                not specifying units is DEPRECATED and will no
                                longer be allowed in the future
                      
                      bohr    : atomic positions are in cartesian coordinate,
                                in atomic units (i.e. Bohr radii)
                      
                      angstrom: atomic positions are in cartesian coordinates,
                                in Angstrom
                      
                      crystal : atomic positions are in crystal coordinates, i.e.
                                in relative coordinates of the primitive lattice
                                vectors as defined either in card CELL_PARAMETERS
                                or via the ibrav + celldm / a,b,c... variables
      +--------------------------------------------------------------------


      +--------------------------------------------------------------------
      Variable:       X
      
      Type:           CHARACTER
      Description:    label of the atom as specified in ATOMIC_SPECIES
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      x, y, z
      
      Type:           REAL
      Description:    atomic positions
                      
                      NOTE: each atomic coordinate can also be specified as a simple algebraic expression.
                            To be interpreted correctly expression must NOT contain any blank
                            space and must NOT start with a "+" sign. The available expressions are:
                      
                              + (plus), - (minus), / (division), * (multiplication), ^ (power)
                      
                           All numerical constants included are considered as double-precision numbers;
                           i.e. 1/2 is 0.5, not zero. Other functions, such as sin, sqrt or exp are
                           not available, although sqrt can be replaced with ^(1/2).
                      
                          Example:
                                       C  1/3   1/2*3^(-1/2)   0
                      
                          is equivalent to
                      
                                  C  0.333333  0.288675  0.000000
                      
                          Please note that this feature is NOT supported by XCrysDen (which will
                          display a wrong structure, or nothing at all).
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      if_pos(1), if_pos(2), if_pos(3)
      
      Type:           INTEGER
      Default:        1
      Description:    component i of the force for this atom is multiplied by if_pos(i),
                      which must be either 0 or 1.  Used to keep selected atoms and/or
                      selected components fixed in MD dynamics or
                      structural optimization run.
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================


========================================================================
CARD: K_POINTS {  tpiba | automatic | crystal | gamma | tpiba_b | crystal_b | tpiba_c | crystal_c   }

   ________________________________________________________________________
   * IF tpiba  OR  crystal  OR  tpiba_b  OR  crystal_b OR tpiba_c OR crystal_c : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
         K_POINTS tpiba | crystal | tpiba_b | crystal_b | tpiba_c | crystal_c 
            nks
            xk_x(1)    xk_y(1)    xk_z(1)    wk(1)    
            xk_x(2)    xk_y(2)    xk_z(2)    wk(2)    
            . . . 
            xk_x(nks)  xk_y(nks)  xk_z(nks)  wk(nks)  
      
      /////////////////////////////////////////
      
       
   * ELSE IF automatic : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
         K_POINTS automatic
            nk1 nk2 nk3 sk1 sk2 sk3
      
      /////////////////////////////////////////
      
       
   * ELSE IF gamma : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
         K_POINTS gamma
      
      /////////////////////////////////////////
      
       
   ENDIF
   ________________________________________________________________________
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Card's flags:   {  tpiba | automatic | crystal | gamma | tpiba_b | crystal_b | tpiba_c | crystal_c   }
      
      Default:        tbipa
      Description:    tpiba    : read k-points in cartesian coordinates,
                                  in units of 2 pi/a (default)
                      
                       automatic: automatically generated uniform grid of k-points, i.e,
                                  generates ( nk1, nk2, nk3 ) grid with ( sk1, sk2, sk3 ) offset.
                                  nk1, nk2, nk3 as in Monkhorst-Pack grids
                                  k1, k2, k3 must be 0 ( no offset ) or 1 ( grid displaced
                                  by half a grid step in the corresponding direction )
                                  BEWARE: only grids having the full symmetry of the crystal
                                  work with tetrahedra. Some grids with offset may not work.
                      
                       crystal  : read k-points in crystal coordinates, i.e. in relative
                                  coordinates of the reciprocal lattice vectors
                      
                       gamma    : use k = 0 (no need to list k-point specifications after card)
                                  In this case wavefunctions can be chosen as real,
                                  and specialized subroutines optimized for calculations
                                  at the gamma point are used (memory and cpu requirements
                                  are reduced by approximately one half).
                      
                       tpiba_b  : Used for band-structure plots.
                                  k-points are in units of  2 pi/a.
                                  nks points specify nks-1 lines in reciprocal space.
                                  Every couple of points identifies the initial and
                                  final point of a line. pw.x generates N
                                  intermediate points of the line where N is the
                                  weight of the first point.
                      
                       crystal_b: as tpiba_b, but k-points are in crystal coordinates.
                      
                       tpiba_c  : Used for band-structure contour plots.
                                  k-points are in units of  2 pi/a. nks must be 3.
                                  3 k-points k_0, k_1, and k_2 specify a rectangle
                                  in reciprocal space of vertices k_0, k_1, k_2,
                                  k_1 + k_2 - k_0: k_0 + \alpha (k_1-k_0)+
                                  \beta (k_2-k_0) with 0<\alpha,\beta < 1.
                                  The code produces a uniform mesh n1 x n2
                                  k points in this rectangle. n1 and n2 are
                                  the weights of k_1 and k_2. The weight of k_0
                                  is not used.
                      
                      crystal_c: as tpiba_c, but k-points are in crystal coordinates.
      +--------------------------------------------------------------------


      +--------------------------------------------------------------------
      Variable:       nks
      
      Type:           INTEGER
      Description:    Number of supplied special k-points.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      xk_x, xk_y, xk_z, wk
      
      Type:           REAL
      Description:    Special k-points (xk_x/y/z) in the irreducible Brillouin Zone
                      (IBZ) of the lattice (with all symmetries) and weights (wk)
                      See the literature for lists of special points and
                      the corresponding weights.
                      
                      If the symmetry is lower than the full symmetry
                      of the lattice, additional points with appropriate
                      weights are generated. Notice that such procedure
                      assumes that ONLY k-points in the IBZ are provided in input
                      
                      In a non-scf calculation, weights do not affect the results.
                      If you just need eigenvalues and eigenvectors (for instance,
                      for a band-structure plot), weights can be set to any value
                      (for instance all equal to 1).
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      nk1, nk2, nk3
      
      Type:           INTEGER
      Description:    These parameters specify the k-point grid
                      (nk1 x nk2 x nk3) as in Monkhorst-Pack grids.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      sk1, sk2, sk3
      
      Type:           INTEGER
      Description:    The grid offsets;  sk1, sk2, sk3 must be
                      0 ( no offset ) or 1 ( grid displaced by
                      half a grid step in the corresponding direction ).
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================


========================================================================
CARD: CELL_PARAMETERS {  alat | bohr | angstrom   }

   OPTIONAL CARD, NEEDED ONLY IF IBRAV = 0 IS SPECIFIED, IGNORED OTHERWISE !
   
   /////////////////////////////////////////
   // Syntax:                             //
   /////////////////////////////////////////
   
      CELL_PARAMETERS {  alat | bohr | angstrom   }
         v1(1)  v1(2)  v1(3)  
         v2(1)  v2(2)  v2(3)  
         v3(1)  v3(2)  v3(3)  
   
   /////////////////////////////////////////
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Card's flags:   {  alat | bohr | angstrom   }
      
      Description:    'bohr'/'angstrom': lattice vectors in bohr radii / angstrom.
                         In this case the lattice parameter alat = sqrt(v1*v1).
                      'alat' / nothing specified: lattice vectors in units of the
                      lattice parameter (either celldm(1) or a). Not specifying
                      units is DEPRECATED and will not be allowed in the future.
                      If nothing specified and no lattice parameter specified,
                      'bohr' is assumed - DEPRECATED, will no longer be allowed
      +--------------------------------------------------------------------


      +--------------------------------------------------------------------
      Variables:      v1, v2, v3
      
      Type:           REAL
      Description:    Crystal lattice vectors (in cartesian axis):
                          v1(1)  v1(2)  v1(3)    ... 1st lattice vector
                          v2(1)  v2(2)  v2(3)    ... 2nd lattice vector
                          v3(1)  v3(2)  v3(3)    ... 3rd lattice vector
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================


========================================================================
CARD: CONSTRAINTS 

   OPTIONAL CARD, USED FOR CONSTRAINED DYNAMICS OR CONSTRAINED OPTIMISATIONS
   (ONLY IF ION_DYNAMICS='DAMP' OR 'VERLET', VARIABLE-CELL EXCEPTED)
   
   When this card is present the SHAKE algorithm is automatically used.
   
   /////////////////////////////////////////
   // Syntax:                             //
   /////////////////////////////////////////
   
      CONSTRAINTS 
         nconstr { constr_tol }
         constr_type(1)        constr(1)(1)        constr(2)(1)        [  constr(3)(1)        constr(4)(1)        ]  {  constr_target(1)        }  
         constr_type(2)        constr(1)(2)        constr(2)(2)        [  constr(3)(2)        constr(4)(2)        ]  {  constr_target(2)        }  
         . . . 
         constr_type(nconstr)  constr(1)(nconstr)  constr(2)(nconstr)  [  constr(3)(nconstr)  constr(4)(nconstr)  ]  {  constr_target(nconstr)  }  
   
   /////////////////////////////////////////
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Variable:       nconstr
      
      Type:           INTEGER
      Description:    Number of constraints.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       constr_tol
      
      Type:           REAL
      Description:    Tolerance for keeping the constraints satisfied.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       constr_type
      
      Type:           CHARACTER
      Description:    Type of constrain :
                      
                      'type_coord'      : constraint on global coordination-number, i.e. the
                                          average number of atoms of type B surrounding the
                                          atoms of type A. The coordination is defined by
                                          using a Fermi-Dirac.
                                          (four indexes must be specified).
                      
                      'atom_coord'      : constraint on local coordination-number, i.e. the
                                          average number of atoms of type A surrounding a
                                          specific atom. The coordination is defined by
                                          using a Fermi-Dirac.
                                          (four indexes must be specified).
                      
                      'distance'        : constraint on interatomic distance
                                          (two atom indexes must be specified).
                      
                      'planar_angle'    : constraint on planar angle
                                          (three atom indexes must be specified).
                      
                      'torsional_angle' : constraint on torsional angle
                                          (four atom indexes must be specified).
                      
                      'bennett_proj'    : constraint on the projection onto a given direction
                                          of the vector defined by the position of one atom
                                          minus the center of mass of the others.
                                          G.Roma,J.P.Crocombette: J.Nucl.Mater.403,32(2010)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      constr(1), constr(2), constr(3), constr(4)
      
      Description:    These variables have different meanings
                                            for different constraint types:
                      
                                           'type_coord' : constr(1) is the first index of the
                                                          atomic type involved
                                                          constr(2) is the second index of the
                                                          atomic type involved
                                                          constr(3) is the cut-off radius for
                                                          estimating the coordination
                                                          constr(4) is a smoothing parameter
                      
                                           'atom_coord' : constr(1) is the atom index of the
                                                          atom with constrained coordination
                                                          constr(2) is the index of the atomic
                                                          type involved in the coordination
                                                          constr(3) is the cut-off radius for
                                                          estimating the coordination
                                                          constr(4) is a smoothing parameter
                      
                                             'distance' : atoms indices object of the
                                                          constraint, as they appear in
                                                          the 'ATOMIC_POSITION' CARD
                      
                      'planar_angle', 'torsional_angle' : atoms indices object of the
                                                          constraint, as they appear in the
                                                          'ATOMIC_POSITION' CARD (beware the
                                                          order)
                      
                                         'bennett_proj' : constr(1) is the index of the atom
                                                          whose position is constrained.
                                                          constr(2:4) are the three coordinates
                                                          of the vector that specifies the
                                                          constraint direction.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       constr_target
      
      Type:           REAL
      Description:    Target for the constrain ( angles are specified in degrees ).
                      This variable is optional.
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================


========================================================================
CARD: OCCUPATIONS 

   OPTIONAL CARD, USED ONLY IF OCCUPATIONS = 'FROM_INPUT', IGNORED OTHERWISE !
   
   /////////////////////////////////////////
   // Syntax:                             //
   /////////////////////////////////////////
   
      OCCUPATIONS 
           f_inp1(1)  f_inp1(2)  . . .  f_inp1(nbnd)  
         [ f_inp2(1)  f_inp2(2)  . . .  f_inp2(nbnd)  ] 
         
   
   /////////////////////////////////////////
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Variable:       f_inp1
      
      Type:           REAL
      Description:    Occupations of individual states (MAX 10 PER ROW).
                      For spin-polarized calculations, these are majority spin states.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       f_inp2
      
      Type:           REAL
      Description:    Occupations of minority spin states (MAX 10 PER ROW)
                      To be specified only for spin-polarized calculations.
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================


========================================================================
CARD: ATOMIC_FORCES 

   OPTIONAL CARD USED TO SPECIFY EXTERNAL FORCES ACTING ON ATOMS
   
   /////////////////////////////////////////
   // Syntax:                             //
   /////////////////////////////////////////
   
      ATOMIC_FORCES 
         X(1)    fx(1)    fy(1)    fz(1)    
         X(2)    fx(2)    fy(2)    fz(2)    
         . . . 
         X(nat)  fx(nat)  fy(nat)  fz(nat)  
   
   /////////////////////////////////////////
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Variable:       X
      
      Type:           CHARACTER
      Description:    label of the atom as specified in ATOMIC_SPECIES
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      fx, fy, fz
      
      Type:           REAL
      Description:    external force on atom X (cartesian components, Ry/a.u. units)
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================



    
espresso-5.1/PWgui-5.1/doc/pwdocs/INPUT_D3.html0000644000077300007730000001170512341333046021230 0ustar giannozzgiannozz

------------------------------------------------------------------------
INPUT FILE DESCRIPTION

Program: d3.x / PWscf / Quantum Espresso
------------------------------------------------------------------------


========================================================================
NAMELIST: &INPUTPH

   ///---
      VARIABLES THAT MUST BE SPECIFIED
      
      +--------------------------------------------------------------------
      Variable:       fildrho
      
      Type:           CHARACTER
      Description:    The file containing the variation of the charge
                      density at the q point under consideration, this
                      file is produced by phonon.
      Default:        ' '
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       fild0rho
      
      Type:           CHARACTER
      Description:    The file containing the variation of the charge
                      density at q=0, this file is produced by phonon.
      Default:        ' '
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       amass(i), i=1,ntyp
      
      Type:           CHARACTER
      Description:    ionic masses [atomic mass units]
      +--------------------------------------------------------------------
      
   \\\---
   
   +--------------------------------------------------------------------
   Variable:       prefix
   
   Type:           CHARACTER
   Description:    prefix for file names
   Default:        'pwscf'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       outdir
   
   Type:           CHARACTER
   Default:        value of the ESPRESSO_TMPDIR environment variable if set;
                   current directory ('./') otherwise
   Description:    Directory containing input, output, and scratch files;
                   must be the same as specified in the calculation of
                   the unperturbed system and for phonon calculation.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       fildyn
   
   Type:           CHARACTER
   Description:    The file where the derivative of the dynamical
                   matrix will be written
   Default:        'd3dyn'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ethr_ph
   
   Type:           REAL
   Description:    Threshold for iterative diagonalization
                   (accuracy in ryd of the calculated eigenvalues).
   Default:        1.0d-5
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       q0mode_todo(i), i=1,3*nat
   
   Type:           INTEGER
   Description:    This array contains the list of the q=0 modes that
                   will be computed. If q0mode_todo(1).eq.0 the
                   program will compute every q=0 mode.
   Status:         q0mode_todo is statically allocated to dimension 300
   Default:        0
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       wraux
   
   Type:           LOGICAL
   Description:    If .true. the program will write different terms
                   of the matrix on different files.
   Default:        .false.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       recv
   
   Type:           LOGICAL
   Description:    Specify .true. for a recover run.
   Default:        .false.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       istop
   
   Type:           INTEGER
   Default:        0
   Description:    If this number is set different from zero the
                   program will stop after the specified routine
                   and will write the partial result in the recover
                   file.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       iverbosity
   
   Type:           INTEGER
   Default:        0
   Description:    type of printing ( 0 few, 1 all )
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================



    
espresso-5.1/PWgui-5.1/doc/pwdocs/INPUT_DOS.html0000644000077300007730000001047212341333046021407 0ustar giannozzgiannozz

------------------------------------------------------------------------
INPUT FILE DESCRIPTION

Program: dos.x / PWscf / Quantum Espresso
------------------------------------------------------------------------


Purpose of dos.x:
    calculates the Density of States (DOS)
    (separated into up and down components for DSDA)


Structure of the input data:
============================

   &DOS
     ...
   /
IMPORTANT: since v.5 namelist name is &dos and no longer &inputpp



========================================================================
NAMELIST: &DOS

   +--------------------------------------------------------------------
   Variable:       prefix
   
   Type:           CHARACTER
   Default:        'pwscf'
   Description:    prefix of input file produced by pw.x
                   (wavefunctions are not needed)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       outdir
   
   Type:           CHARACTER
   Description:    directory containing the input data,
                   i.e. the same as in pw.x
   Default:        value of the ESPRESSO_TMPDIR environment variable if set;
                   current directory ('./') otherwise
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ngauss
   
   Type:           INTEGER
   Default:        0
   Status:         optional
   Description:    Type of gaussian broadening:
                   
                       =  0  Simple Gaussian (default)
                   
                       =  1  Methfessel-Paxton of order 1
                   
                       = -1  Marzari-Vanderbilt "cold smearing"
                   
                       =-99  Fermi-Dirac function
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       degauss
   
   Type:           REAL
   Description:    gaussian broadening, Ry (not eV!)          see below
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      Emin, Emax
   
   Type:           REAL
   Default:        band extrema
   Description:    min, max energy (eV) for DOS plot. If unspecified, the
                   lower and/or upper band value, plus/minus 3 times the
                   value of the gaussian smearing if present, will be used.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       DeltaE
   
   Type:           REAL
   Description:    energy grid step (eV)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       fildos
   
   Type:           CHARACTER
   Default:        "prefix".dos
   Description:    output file containing DOS(E)
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================



:::: Notes

   
   ::: Output
   
      The total DOS (states/eV plotted vs E in eV) is written to file "fildos"
      

   
   ::: Important !
   
      The tetrahedron method is used if
      
          - the input data file has been produced by pw.x using the option
            occupations='tetrahedra', AND
      
          - a value for degauss is not given as input to namelist &dos
      
      
      Gaussian broadening is used in all other cases:
      
          - if degauss is set to some value in namelist &dos, that value
            (and the optional value for ngauss) is used
      
          - if degauss is NOT set to any value in namelist &dos, the
            value of degauss and of ngauss are read from the input data
            file (they will be the same used in the pw.x calculations)
      
          - if degauss is NOT set to any value in namelist &dos, AND
            there is no value of degauss and of ngauss in the input data
            file, degauss=DeltaE (in Ry) and ngauss=0 will be used
      



    
espresso-5.1/PWgui-5.1/doc/pwdocs/INPUT_LD1.html0000644000077300007730000014364412341333046021352 0ustar giannozzgiannozz

------------------------------------------------------------------------
INPUT FILE DESCRIPTION

Program: ld1.x /  / Quantum Espresso
------------------------------------------------------------------------


Input data cards for ld1.x program:

Always present:
  1   namelist &input
  1.1 optional cards for all-electron calculations

Needed for PP generation:
  2   namelist &inputp
  2.1 additional cards for PP generation

Needed for pseudo-potential (PP) test. optional for PP generation:
  3   namelist &test
  3.1 optional cards for PP test



========================================================================
NAMELIST: &INPUT

   THIS NAMELIST IS ALWAYS NEEDED !
   
   +--------------------------------------------------------------------
   Variable:       title
   
   Type:           CHARACTER
   Description:    A string describing the job.
   Status:         OPTIONAL
   +--------------------------------------------------------------------
   
   ///---
      EITHER:
      
      +--------------------------------------------------------------------
      Variable:       zed
      
      Type:           REAL
      See:            atom
      Description:    The nuclear charge (1 < zed < 100).
                      
                      IMPORTANT:
                      Specify either zed OR atom, not both!
      +--------------------------------------------------------------------
      
      OR:
      
      +--------------------------------------------------------------------
      Variable:       atom
      
      Type:           CHARACTER
      See:            zed
      Description:    Atomic symbol: atom='H', 'He', 'Be', etc.
                      
                      IMPORTANT:
                      Specify either atom OR zed, not both!
      +--------------------------------------------------------------------
      
   \\\---
   
   ///---
      RADIAL GRID PARAMETERS:
      
      +--------------------------------------------------------------------
      Variable:       xmin
      
      Type:           REAL
      See:            dx
      Default:        -7.0 if iswitch>1 or rel=0,
                      -8.0 otherwise
      Description:    Radial grid parameter.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       dx
      
      Type:           REAL
      Description:    Radial grid parameter.
                      
                      The radial grid is: r(i+1) = exp(xmin+i*dx)/zed  a.u.
      Default:        0.0125 if iswitch>1,
                      0.008 otherwise
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       rmax
      
      Type:           REAL
      Description:    Outermost grid point.
      Default:        100.0 a.u.
      +--------------------------------------------------------------------
      
   \\\---
   
   +--------------------------------------------------------------------
   Variable:       beta
   
   Type:           REAL
   Description:    parameter for potential mixing
   Default:        0.2
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tr2
   
   Type:           REAL
   Description:    convergence threshold for scf
   Default:        1e-14
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       iswitch
   
   Type:           INTEGER
   Description:    1    all-electron calculation
                   2    PP test calculation
                   3    PP generation
                   4    LDA-1/2 correction, needs a previously generated PP file
   Default:        1
   +--------------------------------------------------------------------
   
   ///---
      PARAMETERS FOR LOGARITHMIC DERIVATIVES:
      
      +--------------------------------------------------------------------
      Variable:       nld
      
      Type:           INTEGER
      Description:    the number of logarithmic derivatives to be calculated
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       rlderiv
      
      Type:           REAL
      Description:    radius (a.u.) at which logarithmic derivatives are calculated
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variables:      eminld, emaxld
      
      Type:           REAL
      Description:    Energy range (min, max energy, in Ry) at which
                      logarithmic derivatives are calculated.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       deld
      
      Type:           REAL
      Description:    Delta e (Ry) of energy for logarithmic derivatives.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       rpwe
      
      Type:           REAL
      Description:    radius (a.u.) at which partial wave expansions are calculated
      Default:        rlderiv
      +--------------------------------------------------------------------
      
      If the above parameters are not specified, logarithmic
      derivatives and partial wave expansions are not calculated.
      
   \\\---
   
   +--------------------------------------------------------------------
   Variable:       rel
   
   Type:           INTEGER
   Description:    0 ... non relativistic calculation
                   1 ... scalar relativistic calculation
                   2 ... full relativistic calculation with spin-orbit
   Default:        0 for Z <= 18;
                   1 for Z >  18
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lsmall
   
   Type:           LOGICAL
   Default:        .false.
   Description:    if .true. writes on files the small component
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       max_out_wfc
   
   Type:           INTEGER
   Default:        7
   Description:    Maximum number of atomic wavefunctions written in the output
                   file.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       noscf
   
   Type:           LOGICAL
   Default:        .false.
   Description:    if .true. the charge is not computed. The occupations are
                   not used and the eigenvalues and eigenfunctions are those
                   of a hydrogen-like atom.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lsd
   
   Type:           INTEGER
   Description:    0 ... non spin polarized calculation
                   1 ... spin-polarized calculation
                   
                   BEWARE:
                   not allowed if iswitch=3 (PP generation) or with full
                   relativistic calculation
   Default:        0
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       dft
   
   Type:           CHARACTER
   Description:    Exchange-correlation functional.
                   
                   Examples:
                   'PZ'    Perdew and Zunger formula for LDA
                   'PW91'  Perdew and Wang GGA
                   'BP'    Becke and Perdew GGA
                   'PBE'   Perdew, Becke and Ernzerhof GGA
                   'BLYP'  ...
                   
                   For the complete list, see module "functionals" in ../flib/
                   The default is 'PZ' for all-electron calculations,
                   it is read from the PP file in a PP calculation.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       latt
   
   Type:           INTEGER
   Description:    0 ... no Latter correction
                   1 ... apply Latter correction
   Default:        0
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       isic
   
   Type:           INTEGER
   Description:    0 ... no Self-interaction correction
                   1 ... apply Self-interaction correction
   Default:        0
   Status:         only for all-electron calculation
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       rytoev_fact
   
   Type:           REAL
   Default:        as specified in file Modules/constants.f90
   Description:    Factor used to convert Ry into eV.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       cau_fact
   
   Type:           REAL
   Default:        as specified in file Modules/constants.f90
   Description:    Speed of light in a.u..
                   
                   (Be careful the default value is always used in the
                    relativistic exchange.)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       vdw
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true., the frequency dependent polarizability and van der
                   Waals coefficient C6 will be computed in Thomas-Fermi and
                   von Weizsaecker approximation(only for closed-shell ions).
   Status:         Gradient-corrected DFT not yet implemented.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       prefix
   
   Type:           CHARACTER
   Default:        'ld1'
   Description:    Prefix for file names - only for output file names
                   containing the orbitals, logarithmic derivatives, tests
                   See below for file names and the content of the file.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       verbosity
   
   Type:           CHARACTER
   Default:        'low'
   Description:    'low' or 'high'
                   
                   if 'high' with iswitch=2,3 prints separately core and
                   valence contributions to the energies. Print the
                   frozen-core energy.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_charge
   
   Type:           CHARACTER
   Default:        ' '
   Description:    Name of the file where the code writes the all-electron
                   total charge. No charge is written if file_charge=' '.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       config
   
   Type:           CHARACTER
   Default:        ' '
   Description:    A string with the electronic configuration.
                   
                   Example:
                     '[Ar] 3d10 4s2 4p2.5'
                   
                   * If lsd=1, spin-up and spin-down state may appear twice
                     with the respective occupancy: 3p4 3p2 = 4 up,
                     2 down. Otherwise, the Hund's rule is assumed.
                   
                   * If rel=2, states with jj=l-1/2 are filled first.
                     If a state appears twice, the first one has jj=l-1/2,
                     the second one jj=l+1/2 (except S states)
                     (Use rel_dist if you want to average the electrons
                     over all available states.)
                   
                   * If config='default' the code uses zed to set the ground
                     state electronic configuration for the atom.
                   
                   Negative occupancies are used to flag unbound states;
                   they are not actually used.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       relpert
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. the relativistic corrections to the non-relativistic
                   Kohn-Sham energy levels (rel=0 .and. lsd=0) are computed using
                   first-order perturbation theory in all-electron calculations.
                   The corrections consist of the following terms:
                      E_vel: velocity (p^4) correction
                      E_Dar: Darwin term
                      E_S-O: spin-orbit coupling
                   The spin-orbit term vanishes for s-electron states and gives
                   rise to a splitting of (2*l+1)*E_S-O for the other states.
                   The separate contributions are printed only if verbosity='high'.
                   
                   Formulas and notation are based on the Herman-Skillman book:
                   F. Herman and S. Skillman, "Atomic Structure Calculations",
                   Prentice-Hall, Inc., Englewood Cliffs, New Jersey, 1963
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       rel_dist
   
   Type:           CHARACTER
   Default:        'energy'
   Description:    'energy' or 'average'
                   
                   * if 'energy' the relativistic l-1/2 states are filled first.
                   
                   * if 'average' the electrons are uniformly distributed
                     among all the states with the given l.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       write_coulomb
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true., a fake pseudo-potential file with name X.UPF,
                   where X is the atomic symbol, is written. It contains
                   the radial grid and the wavefunctions as specified in input,
                   plus the info needed to build the Coulomb potential
                   for an all-electron calculation - for testing only.
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================


========================================================================
CARD:  

   IF CONFIG IS EMPTY THE ELECTRONIC CONFIGURATION IS READ FROM
   THE FOLLOWING CARDS:
   
   ________________________________________________________________________
   * IF rel < 2 : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
            nwf
            nl(1)    n(1)    l(1)    oc(1)    isw(1)    
            nl(2)    n(2)    l(2)    oc(2)    isw(2)    
            . . . 
            nl(nwf)  n(nwf)  l(nwf)  oc(nwf)  isw(nwf)  
      
      /////////////////////////////////////////
      
       
   * ELSE IF rel = 2 : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
            nwf
            nl(1)    n(1)    l(1)    oc(1)    jj(1)    
            nl(2)    n(2)    l(2)    oc(2)    jj(2)    
            . . . 
            nl(nwf)  n(nwf)  l(nwf)  oc(nwf)  jj(nwf)  
      
      /////////////////////////////////////////
      
       
   ENDIF
   ________________________________________________________________________
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Variable:       nwf
      
      Type:           INTEGER
      Description:    number of wavefunctions
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       nl
      
      Type:           CHARACTER
      Description:    wavefunction label (e.g. 1s, 2s, etc.)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       n
      
      Type:           INTEGER
      Description:    principal quantum number
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       l
      
      Type:           INTEGER
      Description:    angular quantum number
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       oc
      
      Type:           REAL
      Description:    occupation number
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       isw
      
      Type:           INTEGER
      Description:    the spin index (1-2) used only in the lsda case
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       jj
      
      Type:           REAL
      Description:    The total angular momentum (0.0 is allowed for complete
                      shells: the codes fills 2l states with jj=l-1/2,
                      2l+2 with jj=l+1/2).
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================


========================================================================
NAMELIST: &INPUTP

   +--------------------------------------------------------------------
   Variable:       zval
   
   Type:           REAL
   Default:        (calculated)
   Description:    Valence charge.
                   
                   zval is automatically calculated from available data.
                   If the value of zval is provided in input, it will be
                   checked versus the calculated value. The only case in
                   which you need to explicitly provide the value of zval
                   for noninteger zval (i.e. half core-hole pseudo-potentials).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       pseudotype
   
   Type:           INTEGER
   Description:    1 ... norm-conserving, single-projector PP
                         IMPORTANT: if pseudotype=1 all calculations are done
                         using the SEMILOCAL form, not the separable nonlocal form
                   
                   2 ... norm-conserving PP in separable form (obsolescent)
                         All calculations are done using SEPARABLE non-local form
                         IMPORTANT: multiple projectors allowed but not properly
                         implemented, use only if you know what you are doing
                   
                   3 ... ultrasoft PP or PAW
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_pseudopw
   
   Type:           CHARACTER
   Status:         REQUIRED
   Description:    File where the generated PP is written.
                   
                   * if the file name ends with "upf" or "UPF",
                   or in any case for spin-orbit PP (rel=2),
                   the file is written in UPF format;
                   
                   * if the file name ends with 'psp' it is
                   written in native CPMD format (this is currently
                   an experimental feature); otherwise it is written
                   in the old "NC" format if pseudotype=1, or
                   in the old RRKJ format if pseudotype=2 or 3
                   (no default, must be specified).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_recon
   
   Type:           CHARACTER
   Description:    File containing data needed for GIPAW reconstruction
                   of all-electron wavefunctions from PP results.
                   If you want to use additional states to perform the
                   reconstruction, add them at the end of the list
                   of all-electron states.
   Default:        ' '
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lloc
   
   Type:           INTEGER
   Default:        -1
   Description:    Angular momentum of the local channel.
                   
                   * lloc=-1 or lloc=-2 pseudizes the all-electron potential
                     if lloc=-2 the original recipe of Troullier-Martins
                     is used (zero first and second derivatives at r=0)
                   * lloc>-1 uses the corresponding channel as local PP
                   
                   NB: if lloc>-1, the corresponding channel must be the last in the
                   list of wavefunctions appearing after the namelist &inputp
                   In the relativistic case, if lloc > 0 both the j=lloc-1/2 and
                   the j=lloc+1/2 wavefunctions must be at the end of the list.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       rcloc
   
   Type:           REAL
   Status:         Must be specified only if lloc=-1, otherwise the
                   corresponding value of rcut is used.
   Description:    Matching radius (a.u.) for local pseudo-potential (no default).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       nlcc
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. produce a PP with the nonlinear core
                   correction of Louie, Froyen, and Cohen
                   [PRB 26, 1738 (1982)].
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       new_core_ps
   
   Type:           LOGICAL
   Default:        .false.
   Status:         requires nlcc=.true.
   Description:    If .true. pseudizes the core charge with bessel functions.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       rcore
   
   Type:           REAL
   Description:    Matching radius (a.u.) for the smoothing of the core charge.
                   If not specified, the matching radius is determined
                   by the condition:  rho_core(rcore) = 2*rho_valence(rcore)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tm
   
   Type:           LOGICAL
   Default:        .false.
   Description:    * .true. for Troullier-Martins pseudization [PRB 43, 1993 (1991)]
                   
                   * .false. for Rappe-Rabe-Kaxiras-Joannopoulos pseudization
                     [PRB 41, 1227 (1990), erratum PRB 44, 13175 (1991)]
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       rho0
   
   Type:           REAL
   Description:    Charge at the origin: when the Rappe-Rabe-Kaxiras-Joannopoulos
                   method with 3 Bessel functions fails, specifying rho0 > 0
                   may allow to override the problem (using 4 Bessel functions).
                   Typical values are in the order of 0.01-0.02
   Default:        0.0
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lpaw
   
   Type:           LOGICAL
   Description:    If .true. produce a PAW dataset, experimental feature
                   only for pseudotype=3
   Default:        .false.
   +--------------------------------------------------------------------
   
   ///---
      +--------------------------------------------------------------------
      Variable:       which_augfun
      
      Type:           CHARACTER
      Default:        'AE' for Vanderbilt-Ultrasoft pseudo-potentials and 'BESSEL' for PAW datasets.
      Description:    If different from 'AE' the augmentation functions are pseudized
                      before rmatch_augfun. The pseudization options are:
                      
                      * 'PSQ'        Use Bessel functions to pseudize Q
                                     from the origin to rmatch_augfun.
                      
                      These features are available only for PAW:
                      
                      * 'BESSEL'     Use Bessel functions to pseudize the Q.
                      * 'GAUSS'      Use 2 Gaussian functions to pseudize the Q.
                      * 'BG'         Use original Bloechl's recipe with a single gaussian.
                      
                      Note: if lpaw is true and which_augfun is set to AE real all-
                      electron charge will be used, which will produce extremely
                      hard augmentation.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       rmatch_augfun
      
      Type:           REAL
      Default:        0.5 a.u.
      Status:         Used only if which_augfun is different from 'AE'.
      Description:    Pseudization radius for the augmentation functions. Presently
                      it has the same value for all L.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       rmatch_augfun_nc
      
      Type:           REAL
      Default:        .false.
      Status:         Used only if which_augfun is 'PSQ'.
      Description:    If .true. the augmentation functions are pseudized
                      from the origin to min(rcut(ns),rcut(ns1)) where ns
                      and ns1 are the two channels for that Q. In this case
                      rmatch_augfun is not used.
      +--------------------------------------------------------------------
      
   \\\---
   
   +--------------------------------------------------------------------
   Variable:       lsave_wfc
   
   Type:           LOGICAL
   Default:        .false. if .not. lpaw, otherwise .true.
   Description:    Set it to .true. to save all-electron and pseudo wavefunctions
                   used in the pseudo-potential generation in the UPF file. Only
                   works for UPFv2 format.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lgipaw_reconstruction
   
   Type:           LOGICAL
   Default:        .false.
   Description:    Set it to .true. to generate pseudo-potentials containing the
                   additional info required for reconstruction of all-electron
                   orbitals, used by GIPAW. You will typically need to specify
                   additional projectors beyond those used in the generation of
                   pseudo-potentials. You should also specify 'file_recon'.
                   
                   All projectors used in the reconstruction must be listed BOTH
                   in the test configuration after namelist &test AND in the
                   all-electron configuration (variable 'config', namelist &inputp,
                   Use negative occupancies for projectors on unbound states). The
                   core radii in the test configuration should be the same as in
                   the pseudo-potential generation section and will be used as the
                   radius of reconstruction. Projectors not used to generate the
                   pseudo-potential should have zero occupation number.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       use_paw_as_gipaw
   
   Type:           LOGICAL
   Default:        .false.
   Description:    When generating a PAW dataset, setting this option to .true. will
                   save the core all-electron wavefunctions to the UPF file.
                   The GIPAW reconstruction to be performed using the PAW data and
                   projectors for the valence wavefunctions.
                   
                   In the default case, the GIPAW valence wavefunction and projectors
                   are independent from the PAW ones and must be then specified as
                   explained above in lgipaw_reconstruction.
                   
                   Setting this to .true. always implies lgipaw_reconstruction = .true.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       author
   
   Type:           CHARACTER
   Description:    Name of the author.
   Default:        'anonymous'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_chi
   
   Type:           CHARACTER
   Description:    file containing output PP chi functions
   Default:        ' '
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_beta
   
   Type:           CHARACTER
   Description:    file containing output PP beta functions
   Default:        ' '
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_qvan
   
   Type:           CHARACTER
   Description:    file containing output PP qvan functions
   Default:        ' '
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_screen
   
   Type:           CHARACTER
   Description:    file containing output screening potential
   Default:        ' '
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_core
   
   Type:           CHARACTER
   Description:    file containing output total and core charge
   Default:        ' '
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_wfcaegen
   
   Type:           CHARACTER
   Description:    file with the all-electron wfc for generation
   Default:        ' '
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_wfcncgen
   
   Type:           CHARACTER
   Description:    file with the norm-conserving wfc for generation
   Default:        ' '
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_wfcusgen
   
   Type:           CHARACTER
   Description:    file with the ultra-soft wfc for generation
   Default:        ' '
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================


========================================================================
CARD:  

   ________________________________________________________________________
   * IF rel=0  OR  rel=2 : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
            nwfs
            nls(1)     nns(1)     lls(1)     ocs(1)     ener(1)     rcut(1)     rcutus(1)     jjs(1)     
            nls(2)     nns(2)     lls(2)     ocs(2)     ener(2)     rcut(2)     rcutus(2)     jjs(2)     
            . . . 
            nls(nwfs)  nns(nwfs)  lls(nwfs)  ocs(nwfs)  ener(nwfs)  rcut(nwfs)  rcutus(nwfs)  jjs(nwfs)  
      
      /////////////////////////////////////////
      
      * if lloc>-1 the state with lls=lloc must be the last
      
      * if lloc>0 in the relativistic case, both states with jjs=lloc-1/2
        and jjs=lloc+1/2 must be the last two
      
       
   * ELSE : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
            nwfs
            nls(1)     nns(1)     lls(1)     ocs(1)     ener(1)     rcut(1)     rcutus(1)     
            nls(2)     nns(2)     lls(2)     ocs(2)     ener(2)     rcut(2)     rcutus(2)     
            . . . 
            nls(nwfs)  nns(nwfs)  lls(nwfs)  ocs(nwfs)  ener(nwfs)  rcut(nwfs)  rcutus(nwfs)  
      
      /////////////////////////////////////////
      
       
   ENDIF
   ________________________________________________________________________
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Variable:       nwfs
      
      Type:           INTEGER
      Description:    number of wavefunctions to be pseudized
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       nls
      
      Type:           CHARACTER
      Description:    Wavefunction label (same as in the all-electron configuration).
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       nns
      
      Type:           INTEGER
      Description:    Principal quantum number (referred to the PSEUDOPOTENTIAL case;
                      nns=1 for lowest s, nns=2 for lowest p, and so on).
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       lls
      
      Type:           INTEGER
      Description:    Angular momentum quantum number.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       ocs
      
      Type:           REAL
      Description:    Occupation number  (same as in the all-electron configuration).
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       ener
      
      Type:           REAL
      Description:    Energy (Ry) used to pseudize the corresponding state.
                      If 0.d0, use the one-electron energy of the all-electron state.
                      Do not use 0.d0 for unbound states!
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       rcut
      
      Type:           REAL
      Description:    Matching radius (a.u.) for norm conserving PP.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       rcutus
      
      Type:           REAL
      Description:    Matching radius (a.u.) for ultrasoft PP - only for pseudotype=3.
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       jjs
      
      Type:           REAL
      Description:    The total angular momentum (0.0 is allowed for complete shells).
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================


========================================================================
NAMELIST: &TEST

   NEEDED ONLY IF ISWITCH=2 OR ISWITCH=4, OPTIONAL IF ISWITCH=3
   
   +--------------------------------------------------------------------
   Variable:       nconf
   
   Type:           INTEGER
   Description:    the number of configurations to be tested. For iswitch = 4 nconf=2
   Default:        1
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       file_pseudo
   
   Type:           CHARACTER
   Status:         ignored if iswitch=3
   Description:    File containing the PP.
                   
                   * If the file name contains  ".upf" or ".UPF",
                   the file is assumed to be in UPF format;
                   
                   * else if the file name contains ".rrkj3" or ".RRKJ3",
                   the old RRKJ format is first tried;
                   
                   * otherwise, the old NC format is read.
                   
                   IMPORTANT: in the latter case, all calculations are done
                   using the SEMILOCAL form, not the separable nonlocal form.
                   Use the UPF format if you want to test the separable form!
   Default:        ' '
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      ecutmin, ecutmax, decut
   
   Type:           REAL
   Default:        decut=5.0 Ry; ecutmin=ecutmax=0Ry
   Status:         specify ecutmin and ecutmax if you want to perform this test
   Description:    Parameters (Ry) used for test with a basis set of spherical
                   Bessel functions j_l(qr) . The hamiltonian at fixed scf
                   potential is diagonalized for various values of ecut:
                   ecutmin, ecutmin+decut, ecutmin+2*decut ... up to ecutmax.
                   This yields an indication of convergence with the
                   corresponding plane-wave cutoff in solids, and shows
                   in an unambiguous way if there are "ghost" states
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       rm
   
   Type:           REAL
   Description:    Radius of the box used with spherical Bessel functions.
   Default:        30 a.u.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       configts(i), i=1,nconf
   
   Type:           CHARACTER
   Description:    A string containing the test valence electronic
                   configuration nc, nc=1,nconf. Same syntax as for "config".
                   If configts(i) is not set, the electron configuration
                   is read from the cards following the namelist.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lsdts(i), i=1,nconf
   
   Type:           INTEGER
   Default:        1
   See:            lsd
   Description:    0 or 1. It is the value of lsd used in the i-th test.
                   Allows to make simultaneously spin-polarized and
                   spin-unpolarized tests.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       frozen_core
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. only the core wavefunctions of the first
                   configuration are calculated. The eigenvalues, orbitals
                   and energies of the other configurations are calculated
                   with the core of the first configuration.
                   The first configuration must be spin-unpolarized.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       rcutv
   
   Type:           REAL
   Description:    Cutoff distance (CUT) for the inclusion of LDA-1/2 potential.
                                     Needed (mandatory) only if iswitch = 4
   Default:        -1.0
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================


========================================================================
CARD:  

   IMPORTANT: THIS CARD HAS TO BE SPECIFIED FOR EACH MISSING CONFIGTS(I)
   
   ________________________________________________________________________
   * IF lsd=1 : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
            nwfts
            elts(1)      nnts(1)      llts(1)      octs(1)      enerts(1)      rcutts(1)      rcutusts(1)      iswts(1)      
            elts(2)      nnts(2)      llts(2)      octs(2)      enerts(2)      rcutts(2)      rcutusts(2)      iswts(2)      
            . . . 
            elts(nwfts)  nnts(nwfts)  llts(nwfts)  octs(nwfts)  enerts(nwfts)  rcutts(nwfts)  rcutusts(nwfts)  iswts(nwfts)  
      
      /////////////////////////////////////////
      
       
   * ELSE IF rel=2 : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
            nwfts
            elts(1)      nnts(1)      llts(1)      octs(1)      enerts(1)      rcutts(1)      rcutusts(1)      jjts(1)      
            elts(2)      nnts(2)      llts(2)      octs(2)      enerts(2)      rcutts(2)      rcutusts(2)      jjts(2)      
            . . . 
            elts(nwfts)  nnts(nwfts)  llts(nwfts)  octs(nwfts)  enerts(nwfts)  rcutts(nwfts)  rcutusts(nwfts)  jjts(nwfts)  
      
      /////////////////////////////////////////
      
       
   * ELSE : 
   
      /////////////////////////////////////////
      // Syntax:                             //
      /////////////////////////////////////////
      
            nwfts
            elts(1)      nnts(1)      llts(1)      octs(1)      enerts(1)      rcutts(1)      rcutusts(1)      
            elts(2)      nnts(2)      llts(2)      octs(2)      enerts(2)      rcutts(2)      rcutusts(2)      
            . . . 
            elts(nwfts)  nnts(nwfts)  llts(nwfts)  octs(nwfts)  enerts(nwfts)  rcutts(nwfts)  rcutusts(nwfts)  
      
      /////////////////////////////////////////
      
       
   ENDIF
   ________________________________________________________________________
   
   DESCRIPTION OF ITEMS:
   
      +--------------------------------------------------------------------
      Variable:       nwfts
      
      Type:           INTEGER
      Description:    number of wavefunctions
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       elts
      
      Type:           CHARACTER
      See:            nls
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       nnts
      
      Type:           INTEGER
      See:            nns
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       llts
      
      Type:           INTEGER
      See:            lls
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       octs
      
      Type:           REAL
      See:            ocs
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       enerts
      
      Type:           REAL
      Status:         not used
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       rcutts
      
      Type:           REAL
      Status:         not used
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       rcutusts
      
      Type:           REAL
      Status:         not used
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       iswts
      
      Type:           INTEGER
      Description:    spin index (1 or 2, used in lsda case)
      +--------------------------------------------------------------------
      
      +--------------------------------------------------------------------
      Variable:       jjts
      
      Type:           REAL
      Description:    total angular momentum of the state
      +--------------------------------------------------------------------
      
===END OF CARD==========================================================



:::: Notes

   For PP generation you do not need to specify namelist &test, UNLESS:
   
   1. you want to use a different configuration for unscreening wrt the
   one used to generate the PP. This is useful for PP with semicore
   states: use semicore states ONLY to produce the PP, use semicore
   AND valence states (if occupied) to make the unscreening
   
   2. you want to specify some more states for PAW style reconstruction of
   all-electron orbitals from pseudo-orbitals
   
   
   ::: Output files written
   
      * file_tests            "prefix".test    results of transferability test
      
      for each testing configuration N:
      
      * file_wavefunctions    "prefix"N.wfc     all-electron KS orbitals
      * file_wavefunctionsps  "prefix"Nps.wfc   pseudo KS orbitals
      
      if lsd=1:
      
      * file_wavefunctions    "prefix"N.wfc.up  all-electron KS up orbitals
      * file_wavefunctions    "prefix"N.wfc.dw  all-electron KS down orbitals
      
      if rel=2 and lsmall=.true.:
      
      * file_wavefunctions    "prefix".wfc.small  all-electron KS small component
      
      if parameters for logarithmic derivatives are specified:
      
      * file_logder           "prefix"Nps.dlog  all-electron logarithmic derivatives
      * file_logderps         "prefix"Nps.dlog  pseudo logarithmic derivatives
      
      "N" is not present if there is just one testing configuration.
      

   
   ::: Recipes to reproduce old all-electron atomic results with the ld1 program
   
      * The Hartree results in Phys. Rev. 59, 299 (1940) or in
        Phys. Rev. 59, 306 (1940) can be reproduced with:
      
          rel=0,
          isic=1,
          dft='NOX-NOC'
      
      * The Herman-Skillman tables can be reproduced with:
      
          rel=0,
          isic=0,
          latt=1,
          dft='SL1-NOC'
      
      * Data on the paper Liberman, Waber, Cromer Phys. Rev. 137, A27 (1965) can be
      reproduced with:
      
          rel=2,
          isic=0,
          latt=1,
          dft='SL1-NOC'
      
      * Data on the paper S. Cohen Phys. Rev. 118, 489 (1960) can be reproduced with:
      
          rel=2,
          isic=1,
          latt=0,
          dft='NOX-NOC'
      
      * The revised PBE described in PRL 80, 890 (1998) can be obtained with:
      
          isic=0
          latt=0
          dft='SLA-PW-RPB-PBC' or 'dft='revPBE'
      
      * The relativistic energies of closed shell atoms reported in PRB 64 235126 (2001)
      can be reproduced with:
      
          isic=0
          latt=0
          cau_fact=137.0359895
          dft='sla-vwn' for the LDA case
          dft='PBE'     for the PBE case
      
      * The NIST results in PRA 55, 191 (1997):
      
          LDA:
              rel=0
              dft='sla-vwn'
      
          LSD:
              rel=0
              lsd=1
              dft='sla-vwn'
      
          RLDA
              rel=2
              rel_dist='average'
              dft='rxc-vwn'
      
          ScRLDA:
              rel=1
              dft='rxc-vwn'
      



    
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/0000755000077300007730000000000012341333047021245 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/WARNINGS0000644000077300007730000000036612341332557022432 0ustar giannozzgiannozzNo implementation found for style `graphicx' ? brace missing for \ Substitution of arg to newlabelxx delayed. redefining command \ ? brace missing for \oldcontentsline ? brace missing for \oldnewlabel There is no author for this document. espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/footnode.html0000644000077300007730000000213712341333047023753 0ustar giannozzgiannozz Footnotes
... MKL,1
Beware: MKL v.10.2.2 has a buggy dsyev yielding wrong results with more than one thread; fixed in v.10.2.4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/up.gif0000644000077300007730000000022112341333047022353 0ustar giannozzgiannozzGIF89a[ooo!,b˭a؅ҷ!9zj*Kќ<X6 Lvbmbl2'^}WLv兽 QPY%krMP;espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/quantum_espresso.gif0000644000077300007730000004372412341333047025363 0ustar giannozzgiannozzGIF89a                & "%' #&&%*/7)7-3!    # ) (3;4 5%,F>CLGUA gM$\$W&X/c$e*l+j&s,z,t'|2w5h7[29F7D;KFJIVTXLRVdmpZYDKGUQWYffirupU,45:9;;5<~DBCJSDKMGRS[[]WJ΂{bcdklhs{tmp|vk||{|ȆՅ׊Ӕ玔覑ٚ蘣ج榨纷ޡÄƋɍƅ˓͛ǔѝӖهΣӣժ٭ئùֲ۴ݻڷƸ淾!, H*\ȰÇ#Jp>w`G ɓ(S\ɲ˗0cʜIÏ 7ĩ͟@ JѣHWꔸo)?7BMJիXjTS~JٳhӪeؑ$G$C-صx˷/[#vF|X1b$ŝ췲˘3m;0dÊ׭6[mMVMhэL۸]7m۴ ~-[lƯiˆmpԢٓl/س9HA(x0uMoڵjW3vذh?vZ4k'6` v 6 VQSF &ias 67̇ #L0#8(8|XӜ6ܸ=qU$ރ8樣Ld;(lMϐzqXҋ/R .Wb啻K/_N˘&F4ָi(&!`u(tJzH;tEt筳{/_ .rK-:zˣR(d)Rx1YAvxu[{acܚ)>#%9p7"RfZ-N:-+,",@,Tk /U_lhw 1gM7A#G\~ 2/lhiN.SzjLlncc{\N;vֻM62/W(C-b+%V(7ۢ²(.]Jˇ- 'G-5mceH/lDqʅFs.FK,%JB"w-..,E-w0LNaNZc7DI,c.4.D Bt $:ܰl&ݻ\)IJl-q-~ 37~" -R8kAC.6}6b,k"!b.dsgf21Vf k3ĵh1ȗ{ɵ\{|*BREKj cbF74[Q|Rz т0"1C,b/)IذƉz(dAx'8YkFSj8-݉3bq;~h ɠ8!8"!@Q(![c!#Y74 k *>2Nd(0aL"a]!XބX|uD Y Nbl||C< -ޘ$CQRYĎs'ZQ4oK`&C!a@ C"̢PH![߂(INGX!;uxABÇ_@32*c4"-bƶJ76-es:tO71<kXCd:AAtjp"B1=c$RpL7à"ku+*Ҧ5` F4&vhC3lX@ ZB/}h(qAa g0`4a mC,X(q-C(ܔSn#2gw^, E$dըifӣtHqA - WS'XpD³(H 6"IyC~ Wna` i#h{e+4Зz-Gm MB[Hi)Uxp`LFWOfY kW&$ ^j@{Yg Yty!iL#q<4Fp!r׳l#-VZ'9]D ^_ښ (+I$k(!̦Ga@ю]q-;5F 8FR 65}6f@m iCA AɠHKjHE'P|Սq0&L!qXbIJ[K b0!J=F|"f$$F" ɠ⯄ _CGjMܨ#8ŠPe×ݾhOr _ܺQR3n>v%C_.  :bEjŇ~4 4 PxІ604Aaٶ o,E6a5Fz"U 88M@F0P5 MBP2 u"aE;.o%lF*AUy >VY T!(ధ&0A KXB̠5+@*'F4F25Tx114OV\ǨE$0! FP+!|vzu) 0}fqO NP`ltg2eׁV!" P{FI|xj`7zt'2 Y2 x4yFyy^؄Iq 4p 3d+hDKQi@9v@E/w}$.F ppJr p ȄNB!Qb%hs@iPGFDNMfJ|pVwB'=w[R tH@p G#G f K߶ z epI`:۳67788:OPP ˆo fElوepu ڀ\K^K wODP˳8`6p33@30{7AyрaY3a0 MUK ⴸk@PqK4˻02k@`0 ĀEI[89$ۀb~@# {ef `ri0 ɺۄh溳2 0 +B Y'ʄ ^" p&pb00 p xЋL`kr.NPQE:6й.[.7`rTi0P~M*}\&P)@PPb `~e oN ĂPJ ?;Ŭŭ7{0 Y0 Ps$% c0 ` p``Pp#`EZPL LlPp {w0Jpʗ]C @Yq0&@* q  `P. p *`p pxB o `^%uȫ10 spǀ2l (@ DV! Up' `m=@0T^@#@00*= P@P QHp̘ pE {fp9`4M}\5 AVP' @# ]p 0\@ jА & `Pސ DG%J ɝ {};P`,8 =/Icΐ]<0^)0 p Cp?`MypNq1FԟŌO;0!| # `*m&1< QN0pPom *+p5@e@ PD\ Ŏ@İxÿM Xr&@O Q@pd= a@ o I \;ƌJ߰WV>$OP P e`ߛ`ppO:` pH3Lpy@˦_q;Q|T<ڤ] 2 GC* `U<|W`B "W8sΙӗ|ԗ޴ ذB 6)gQ5męSN=}TPEEEk018lب!Ck]*c.4tB~i0/ <AaynӇOmh\E-^1*D Chc6(PbB# :|X)Qum c *(({qx:ɭ}NT (X)$c7ifz'=2P㌃`"_8"* E,#{HI6X`99}xz)Srȉk-a' @z("=)Ѱ/즀(x[V@[({.%qPZa:QVv'|[զY :(= (O}uccbr%m >RaL`23 8t-?I;8s\M*"$@7PלȘφ7!iƎjB@55 eB`,hGt4/,>д0 4AbVH(baC+GPP `(Q#d 1Ȏk D `e0C!_ [>( Pr@9(2q'0@a 9LA F->ء[؀#te8/p""2I BYin( ᐗ${HX=1b-0AǎE܂uX" !>x`+ h@ȢGIEORwLH-: |#T+N xPBd*غZ"ae^)W]%yEnrvt.r1X D"brJ 04TjC`gpm>u2Ӝc&$VFpBmTcteX,51^w@z2,g p!Y ԃMt` ֑&G6MyjC.lqYЂjnWz -F &0<\,x` B>Q1phi qThr)/nGE#DHҐ2ќ![Br@9ӗutܴB0 "Hkd!}Cڂ'Rng Td cڰt ^HYPpb0$UK֓*V b REtV[dJ N0d<09HC4 zs픞GHO"p0 aGit\ٛ>GƎtYюg9a:svC؄H_vģp >bX+G:X^b3!퀺`Af X6`"E-;B 4ZIέԉy>`KH&jiNT"!=}h0&&oIPb'(Q#@- =?qK|zX%&4&G+hlP w$02pTlܴ`1 \ABGg~Ǒ Р8`!0jn( /@~0,X+ {:m`c < oP~P*0؀4[02yJ#"X }x L@KJJ>~[܃=JLsK0T>g@cF! - } @VWǍ6,(+0y4 p|(0肌#}~x/HQQ h H $n2H{1!oЯ@Y1 Biu5~pJX7H;qĉTU݇NNu,Jx7Hwz bxg4؀-]4GQ-U- 1+1ZMQ 0'*Cɀ0p@=}p - )kڟS8`SmbC) 1CwTsWOJ _f@śNҕ؇I؄@TK=Mݣ4Nh}J=YL|x 'xh?ibR WK0>vȀVxЀ,x وvk(ֆph d5dP^hCxdɈX^lg5xʼnzx)քxxS{Af`eTF\ؚᅝ‘-~tN[D}~ya;[ICeK b]2ei<6-SH(@UHrP1(d+vXЀ|^7؟ЃM` r ``Ҥ9"uGFXvXh؏\H9؊-safB~-j.s'U܅/<7My 0pkX8pBCUFig0@ } RrsUkx`- V;No(2L| d>c!r<91XF)#L(despnVI j`+ `:nX~괄f]HN؇x(dkaJ݆HY؄n&<$.Gh?ty+& Wȸ`}XsCs y }pUAEj}?Hv 4cOdwe!%Qmhq:[lqAiV 8/w9TeJ0 vX+[6AP#a^js(xԅjD ^džnHDRJ01xZd_ A3yP5w86:W o l؃''JvIV % pX\zqy~08T^=Є;XjBE-N&lRqcȯ%NmBX"FNatN%J%Y҄I9tL" 7gs>4x0 S>U"0`atS 'L1Kӻa!`B?|%$x1Ȓ'Sl2悈aD.b.3 iRРBbU3wlp=)̓P\p+ă> a T6%,=6dS N:&,XcEO; xmey&t !f /|fSk<[oInM9 LP@19S$tJ%B~b &h$ZU'P3sE^|W`93 &t$8S>PE\bIU<+|E0E=cH W0 칧MxcM d!b@=RTh$OϽ*( *tOx 0WM*h`'-z0?iBhVO;UH02jf95]d 9+ ,T?PɴI4%II= EMPUHXH2LrC~H񡽉'EyB A3 J X04 c7bq e`O;XhX5h`@Y4i`DLA0>H @8+Bф3dJ~bvCM .)Z  cǞRr4-A``Xxc9'JzRq,Є'8 O4CHi?4Bg#b'6OtjG Q 1`&>8'7*0v)YG;v=FK“'FC||)L!|hXp@[a1` (3Pz Vsܩ5j54TP6RgCfRƜwRcQ]9%&>iʝ =֖f %<ѭD>%Z&O3 C@ld.=0 @pc-Ð57x_#SV m =q@>H%aH xXƶ*a>W$bIAyЃ~R&ԭwA>cW4`NBP8}6jaȣAM@"`"5@YE0 \vctߌMQ7 | Y  Vb$DV'GكUG ̫(U괲Uv e"A3e򒱜;m:f-f9 b`s4?p mm3 vrm۠b)śmr>~a +Pn4qwv#-06_)!p&vAxC.!=$mMS{:N5;i(AӼ6GMSA O©wDg=@`?dbhUY`U|U%B `g2MҎdUm7w˝lLws|ǻn=9Ҏjܢp0D׼Vh@HZ},Po1QF&9"e`u(?>>Sֿ>C?6S B N@Bv:Ģٓ4ﺠ l bX մem5=4h,T6XM V^ f՜{6#@  B4PX>@,@l9t=?9Z\#4FcfD;l/,4"6Pٚ!O+$@t EXC-Q=ƽ%}CxqL!BJB.$Cl;,\ B4O \x7H8->:s nca;Pp@",1lÑ5R.%SZT.ȁ0B/tK>;p|@Ʉ-{٢-ve5;w<?` t@!2`S&b.d/7B,Pd!B5Lu[C*8PEe}o[-D؁:=p H@$)B"bqVRC5#HAAB0d3ZY>@ \D4`;oܢo =ݢX`}8!4L'( b/, A<A,5æC4!BA< 0\;YbL3D D<$q.9C5,0EAA 6hӕ t@lbA)PJ]l89+hnPWpx!.`Cb&C !B&-aŞC_=D ($-A+HCSS;78C+Bg8@  AA!m0x./7e64- !.C O0!4O6@h@ Pp((<@Pz@H" ܁A,B/DtWY7.d\-Îؗ0V :@PZS[2!0$,##/D7X#?%C.!Aā!#B,0`ÄIU<#TA\8U@7On0+' A1/B!A"0\A3W15/!/0iC7H1 tQ!v/5xw1VQH'c7|2-!A )xsw7 O7X06!v!p/5lw3^f C7`C5-!"C4089j^CbB-#T8#7憲I?Cb!\82sp/<)w߸ jJ4/"@!0~yEcBWo'>)RBD. ,x0D3y\R!6D1t# 6"VJuobz6`Cn5y ps,/{Y)T/nǂ!Bs-0XCsKS7d1L,@  8v C5l5F-px/y5W d;! :.B`oq/;كxWb5-Ÿ !Ăk:6p:&n:|z4/܂kB;{.ҸeOcGAy:tݴY6W/\f-:(,[z [E:hQG&UiSOF:jU?YdJakъp 1۶nصh(um:%ZbhV]|Ot!Gzuױgkaq 5ѢuVӶ:u/c%ѡۦZh%&j*5fk!PiG [nde!^3غhv1}0ǹ螃.a$x˦jm>kYnɅ`Qn'R)JbdgZd9E̚j^|Ikd.ibSFNan!XT3atO.TI))Y@IۅXNEYfEIL|6'`m7YaOкta|+ZVc(Mٻ,Vi$wvp=cjXo]u>fVqSc DCtIv>jn)g暇~oU-Y\ZKS-=qk,m=W@~ѸoE5\l9n6 .裑֒o% 5[YZ@Ʃ`^+@q@=;_e_Dkso.ᅬMq_[z3nIrZ1J^jea -V\wAӗ&U&a>uW B%Ua!!Lk&2n(+>Z|rM?N]ly_ϥ̫ͿE${&^"(@PB.Z^ӕ4-)_>Y0σ LwAs~m834 Q8ϰH?0ܦ`t+'?gPR.ˁpUqRD%..ww2--/ 1.4 Terms of use next up previous contents
Next: 2 Installation Up: 1 Introduction Previous: 1.3 Guidelines for posting Contents


1.4 Terms of use

QUANTUM ESPRESSO is free software, released under the GNU General Public License. See http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt, or the file License in the distribution).

We shall greatly appreciate if scientific work done using QUANTUM ESPRESSO distribution will contain an explicit acknowledgment and the following reference:

P. Giannozzi, S. Baroni, N. Bonini, M. Calandra, R. Car, C. Cavazzoni, D. Ceresoli, G. L. Chiarotti, M. Cococcioni, I. Dabo, A. Dal Corso, S. Fabris, G. Fratesi, S. de Gironcoli, R. Gebauer, U. Gerstmann, C. Gougoussis, A. Kokalj, M. Lazzeri, L. Martin-Samos, N. Marzari, F. Mauri, R. Mazzarello, S. Paolini, A. Pasquarello, L. Paulatto, C. Sbraccia, S. Scandolo, G. Sclauzero, A. P. Seitsonen, A. Smogunov, P. Umari, R. M. Wentzcovitch, J.Phys.:Condens.Matter 21, 395502 (2009), http://arxiv.org/abs/0906.2569
Note the form QUANTUM ESPRESSO for textual citations of the code. Please also see package-specific documentation for further recommended citations. Pseudopotentials should be cited as (for instance)
[ ] We used the pseudopotentials C.pbe-rrjkus.UPF and O.pbe-vbc.UPF from
http://www.quantum-espresso.org.


paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/images.tex0000644000077300007730000001762112341332557023250 0ustar giannozzgiannozz\batchmode \documentclass[12pt,a4paper]{article} \RequirePackage{ifthen} \usepackage{html} \usepackage{graphicx} \textwidth = 17cm \textheight = 24cm \topmargin =-1 cm \oddsidemargin = 0 cm % to be decided \usepackage[dvips]{color} \pagecolor[gray]{.7} \usepackage[latin1]{inputenc} \makeatletter \makeatletter \count@=\the\catcode`\_ \catcode`\_=8 \newenvironment{tex2html_wrap}{}{}% \catcode`\<=12\catcode`\_=\count@ \newcommand{\providedcommand}[1]{\expandafter\providecommand\csname #1\endcsname}% \newcommand{\renewedcommand}[1]{\expandafter\providecommand\csname #1\endcsname{}% \expandafter\renewcommand\csname #1\endcsname}% \newcommand{\newedenvironment}[1]{\newenvironment{#1}{}{}\renewenvironment{#1}}% \let\newedcommand\renewedcommand \let\renewedenvironment\newedenvironment \makeatother \let\mathon=$ \let\mathoff=$ \ifx\AtBeginDocument\undefined \newcommand{\AtBeginDocument}[1]{}\fi \newbox\sizebox \setlength{\hoffset}{0pt}\setlength{\voffset}{0pt} \addtolength{\textheight}{\footskip}\setlength{\footskip}{0pt} \addtolength{\textheight}{\topmargin}\setlength{\topmargin}{0pt} \addtolength{\textheight}{\headheight}\setlength{\headheight}{0pt} \addtolength{\textheight}{\headsep}\setlength{\headsep}{0pt} \setlength{\textwidth}{349pt} \newwrite\lthtmlwrite \makeatletter \let\realnormalsize=\normalsize \global\topskip=2sp \def\preveqno{}\let\real@float=\@float \let\realend@float=\end@float \def\@float{\let\@savefreelist\@freelist\real@float} \def\liih@math{\ifmmode$\else\bad@math\fi} \def\end@float{\realend@float\global\let\@freelist\@savefreelist} \let\real@dbflt=\@dbflt \let\end@dblfloat=\end@float \let\@largefloatcheck=\relax \let\if@boxedmulticols=\iftrue \def\@dbflt{\let\@savefreelist\@freelist\real@dbflt} \def\adjustnormalsize{\def\normalsize{\mathsurround=0pt \realnormalsize \parindent=0pt\abovedisplayskip=0pt\belowdisplayskip=0pt}% \def\phantompar{\csname par\endcsname}\normalsize}% \def\lthtmltypeout#1{{\let\protect\string \immediate\write\lthtmlwrite{#1}}}% \newcommand\lthtmlhboxmathA{\adjustnormalsize\setbox\sizebox=\hbox\bgroup\kern.05em }% \newcommand\lthtmlhboxmathB{\adjustnormalsize\setbox\sizebox=\hbox to\hsize\bgroup\hfill }% \newcommand\lthtmlvboxmathA{\adjustnormalsize\setbox\sizebox=\vbox\bgroup % \let\ifinner=\iffalse \let\)\liih@math }% \newcommand\lthtmlboxmathZ{\@next\next\@currlist{}{\def\next{\voidb@x}}% \expandafter\box\next\egroup}% \newcommand\lthtmlmathtype[1]{\gdef\lthtmlmathenv{#1}}% \newcommand\lthtmllogmath{\dimen0\ht\sizebox \advance\dimen0\dp\sizebox \ifdim\dimen0>.95\vsize \lthtmltypeout{% *** image for \lthtmlmathenv\space is too tall at \the\dimen0, reducing to .95 vsize ***}% \ht\sizebox.95\vsize \dp\sizebox\z@ \fi \lthtmltypeout{l2hSize % :\lthtmlmathenv:\the\ht\sizebox::\the\dp\sizebox::\the\wd\sizebox.\preveqno}}% \newcommand\lthtmlfigureA[1]{\let\@savefreelist\@freelist \lthtmlmathtype{#1}\lthtmlvboxmathA}% \newcommand\lthtmlpictureA{\bgroup\catcode`\_=8 \lthtmlpictureB}% \newcommand\lthtmlpictureB[1]{\lthtmlmathtype{#1}\egroup \let\@savefreelist\@freelist \lthtmlhboxmathB}% \newcommand\lthtmlpictureZ[1]{\hfill\lthtmlfigureZ}% \newcommand\lthtmlfigureZ{\lthtmlboxmathZ\lthtmllogmath\copy\sizebox \global\let\@freelist\@savefreelist}% \newcommand\lthtmldisplayA{\bgroup\catcode`\_=8 \lthtmldisplayAi}% \newcommand\lthtmldisplayAi[1]{\lthtmlmathtype{#1}\egroup\lthtmlvboxmathA}% \newcommand\lthtmldisplayB[1]{\edef\preveqno{(\theequation)}% \lthtmldisplayA{#1}\let\@eqnnum\relax}% \newcommand\lthtmldisplayZ{\lthtmlboxmathZ\lthtmllogmath\lthtmlsetmath}% \newcommand\lthtmlinlinemathA{\bgroup\catcode`\_=8 \lthtmlinlinemathB} \newcommand\lthtmlinlinemathB[1]{\lthtmlmathtype{#1}\egroup\lthtmlhboxmathA \vrule height1.5ex width0pt }% \newcommand\lthtmlinlineA{\bgroup\catcode`\_=8 \lthtmlinlineB}% \newcommand\lthtmlinlineB[1]{\lthtmlmathtype{#1}\egroup\lthtmlhboxmathA}% \newcommand\lthtmlinlineZ{\egroup\expandafter\ifdim\dp\sizebox>0pt % \expandafter\centerinlinemath\fi\lthtmllogmath\lthtmlsetinline} \newcommand\lthtmlinlinemathZ{\egroup\expandafter\ifdim\dp\sizebox>0pt % \expandafter\centerinlinemath\fi\lthtmllogmath\lthtmlsetmath} \newcommand\lthtmlindisplaymathZ{\egroup % \centerinlinemath\lthtmllogmath\lthtmlsetmath} \def\lthtmlsetinline{\hbox{\vrule width.1em \vtop{\vbox{% \kern.1em\copy\sizebox}\ifdim\dp\sizebox>0pt\kern.1em\else\kern.3pt\fi \ifdim\hsize>\wd\sizebox \hrule depth1pt\fi}}} \def\lthtmlsetmath{\hbox{\vrule width.1em\kern-.05em\vtop{\vbox{% \kern.1em\kern0.8 pt\hbox{\hglue.17em\copy\sizebox\hglue0.8 pt}}\kern.3pt% \ifdim\dp\sizebox>0pt\kern.1em\fi \kern0.8 pt% \ifdim\hsize>\wd\sizebox \hrule depth1pt\fi}}} \def\centerinlinemath{% \dimen1=\ifdim\ht\sizebox<\dp\sizebox \dp\sizebox\else\ht\sizebox\fi \advance\dimen1by.5pt \vrule width0pt height\dimen1 depth\dimen1 \dp\sizebox=\dimen1\ht\sizebox=\dimen1\relax} \def\lthtmlcheckvsize{\ifdim\ht\sizebox<\vsize \ifdim\wd\sizebox<\hsize\expandafter\hfill\fi \expandafter\vfill \else\expandafter\vss\fi}% \providecommand{\selectlanguage}[1]{}% \makeatletter \tracingstats = 1 \providecommand{\Beta}{\textrm{B}} \providecommand{\Mu}{\textrm{M}} \providecommand{\Kappa}{\textrm{K}} \providecommand{\Rho}{\textrm{R}} \providecommand{\Epsilon}{\textrm{E}} \providecommand{\Chi}{\textrm{X}} \providecommand{\Iota}{\textrm{J}} \providecommand{\omicron}{\textrm{o}} \providecommand{\Zeta}{\textrm{Z}} \providecommand{\Eta}{\textrm{H}} \providecommand{\Omicron}{\textrm{O}} \providecommand{\Nu}{\textrm{N}} \providecommand{\Tau}{\textrm{T}} \providecommand{\Alpha}{\textrm{A}} \begin{document} \pagestyle{empty}\thispagestyle{empty}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength hsize=\the\hsize}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength vsize=\the\vsize}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength hoffset=\the\hoffset}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength voffset=\the\voffset}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength topmargin=\the\topmargin}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength topskip=\the\topskip}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength headheight=\the\headheight}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength headsep=\the\headsep}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength parskip=\the\parskip}\lthtmltypeout{}% \lthtmltypeout{latex2htmlLength oddsidemargin=\the\oddsidemargin}\lthtmltypeout{}% \makeatletter \if@twoside\lthtmltypeout{latex2htmlLength evensidemargin=\the\evensidemargin}% \else\lthtmltypeout{latex2htmlLength evensidemargin=\the\oddsidemargin}\fi% \lthtmltypeout{}% \makeatother \setcounter{page}{1} \onecolumn % !!! IMAGES START HERE !!! \stepcounter{section} \stepcounter{subsection} \stepcounter{subsection} \stepcounter{subsection} \stepcounter{subsection} \stepcounter{section} \stepcounter{subsection} \stepcounter{subsection} \stepcounter{subsection} \stepcounter{subsubsection} \stepcounter{subsection} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{subsection} \stepcounter{subsection} \stepcounter{subsection} \stepcounter{subsubsection} \stepcounter{subsubsection} \stepcounter{subsubsection} \stepcounter{subsubsection} \stepcounter{subsubsection} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{subsubsection} \stepcounter{subsubsection} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{section} \stepcounter{subsection} {\newpage\clearpage \lthtmlinlinemathA{tex2html_wrap_inline2354}% $ \sim$% \lthtmlinlinemathZ \lthtmlcheckvsize\clearpage} \stepcounter{subsection} \stepcounter{subsection} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{subsubsection} \stepcounter{subsection} \stepcounter{paragraph} \stepcounter{paragraph} \stepcounter{paragraph} \end{document} espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node11.html0000644000077300007730000001673212341333047023233 0ustar giannozzgiannozz 2.4 Libraries next up previous contents
Next: 2.5 Compilation Up: 2 Installation Previous: 2.3 configure Contents

Subsections


2.4 Libraries

QUANTUM ESPRESSO makes use of the following external libraries:

  • BLAS (http://www.netlib.org/blas/) and
  • LAPACK (http://www.netlib.org/lapack/) for linear algebra
  • FFTW (http://www.fftw.org/) for Fast Fourier Transforms
A copy of the needed routines is provided with the distribution. However, when available, optimized vendor-specific libraries should be used: this often yields huge performance gains.

2.4.0.1 BLAS and LAPACK

QUANTUM ESPRESSO can use the following architecture-specific replacements for BLAS and LAPACK:
MKL for Intel Linux PCs
ACML for AMD Linux PCs
ESSL for IBM machines
SCSL for SGI Altix
SUNperf for Sun
If none of these is available, we suggest that you use the optimized ATLAS library: see
http://math-atlas.sourceforge.net/. Note that ATLAS is not a complete replacement for LAPACK: it contains all of the BLAS, plus the LU code, plus the full storage Cholesky code. Follow the instructions in the ATLAS distributions to produce a full LAPACK replacement.

Sergei Lisenkov reported success and good performances with optimized BLAS by Kazushige Goto. The library is now available under an open-source license: see the GotoBLAS2 page at
http://www.tacc.utexas.edu/tacc-software/gotoblas2/.

2.4.0.2 FFT

QUANTUM ESPRESSO has an internal copy of an old FFTW version, and it can use the following vendor-specific FFT libraries:
IBM ESSL
SGI SCSL
SUN sunperf
NEC ASL
configure will first search for vendor-specific FFT libraries; if none is found, it will search for an external FFTW v.3 library; if none is found, it will fall back to the internal copy of FFTW.

If you have recent versions (v.10 or later) of MKL installed, you may use the FFTW3 interface provided with MKL. This can be directly linked in MKL distributed with v.12 of the Intel compiler. In earlier versions, only sources are distributed: you have to compile them and to modify file make.sys accordingly (MKL must be linked after the FFTW-MKL interface).

2.4.0.3 MPI libraries

MPI libraries are usually needed for parallel execution (unless you are happy with OpenMP multicore parallelization). In well-configured machines, configure should find the appropriate parallel compiler for you, and this should find the appropriate libraries. Since often this doesn't happen, especially on PC clusters, see Sec.2.7.6.

2.4.0.4 Other libraries

QUANTUM ESPRESSO can use the MASS vector math library from IBM, if available (only on AIX).

2.4.0.5 If optimized libraries are not found

The configure script attempts to find optimized libraries, but may fail if they have been installed in non-standard places. You should examine the final value of BLAS_LIBS, LAPACK_LIBS, FFT_LIBS, MPI_LIBS (if needed), MASS_LIBS (IBM only), either in the output of configure or in the generated make.sys, to check whether it found all the libraries that you intend to use.

If some library was not found, you can specify a list of directories to search in the environment variable LIBDIRS, and rerun configure; directories in the list must be separated by spaces. For example:

   ./configure LIBDIRS="/opt/intel/mkl70/lib/32 /usr/lib/math"
If this still fails, you may set some or all of the *_LIBS variables manually and retry. For example:
   ./configure BLAS_LIBS="-L/usr/lib/math -lf77blas -latlas_sse"
Beware that in this case, configure will blindly accept the specified value, and won't do any extra search.


next up previous contents
Next: 2.5 Compilation Up: 2 Installation Previous: 2.3 configure Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node9.html0000644000077300007730000001033212341333047023150 0ustar giannozzgiannozz 2.2 Prerequisites next up previous contents
Next: 2.3 configure Up: 2 Installation Previous: 2.1 Download Contents


2.2 Prerequisites

To install QUANTUM ESPRESSO from source, you need first of all a minimal Unix environment: basically, a command shell (e.g., bash or tcsh) and the utilities make, awk, sed. MS-Windows users need to have Cygwin (a UNIX environment which runs under Windows) installed: see http://www.cygwin.com/. Note that the scripts contained in the distribution assume that the local language is set to the standard, i.e. "C"; other settings may break them. Use export LC_ALL=C (sh/bash) or setenv LC_ALL C (csh/tcsh) to prevent any problem when running scripts (including installation scripts).

Second, you need C and Fortran-95 compilers. For parallel execution, you will also need MPI libraries and a parallel (i.e. MPI-aware) compiler. For massively parallel machines, or for simple multicore parallelization, an OpenMP-aware compiler and libraries are also required.

Big machines with specialized hardware (e.g. IBM SP, CRAY, etc) typically have a Fortran-95 compiler with MPI and OpenMP libraries bundled with the software. Workstations or ``commodity'' machines, using PC hardware, may or may not have the needed software. If not, you need either to buy a commercial product (e.g Portland) or to install an open-source compiler like gfortran or g95. Note that several commercial compilers are available free of charge under some license for academic or personal usage (e.g. Intel, Sun).


next up previous contents
Next: 2.3 configure Up: 2 Installation Previous: 2.1 Download Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/up_g.gif0000644000077300007730000000025012341333047022663 0ustar giannozzgiannozzGIF89aooo!! ImageMagickgamma=1,b˭`؅ҷ!9zj*Kќ<X6 Lvbmbl2'^}WLv兽 QPY%krMP;espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node19.html0000644000077300007730000001477012341333047023243 0ustar giannozzgiannozz 3.4 Tricks and problems next up previous contents
Next: About this document ... Up: 3 Parallelism Previous: 3.3 Parallelization levels Contents

Subsections


3.4 Tricks and problems

3.4.0.1 Trouble with input files

Some implementations of the MPI library have problems with input redirection in parallel. This typically shows up under the form of mysterious errors when reading data. If this happens, use the option -i (or -in, -inp, -input), followed by the input file name. Example:
   pw.x -i inputfile -nk 4 > outputfile
Of course the input file must be accessible by the processor that must read it (only one processor reads the input file and subsequently broadcasts its contents to all other processors).

Apparently the LSF implementation of MPI libraries manages to ignore or to confuse even the -i/in/inp/input mechanism that is present in all QUANTUM ESPRESSO codes. In this case, use the -i option of mpirun.lsf to provide an input file.

3.4.0.2 Trouble with MKL and MPI parallelization

If you notice very bad parallel performances with MPI and MKL libraries, it is very likely that the OpenMP parallelization performed by the latter is colliding with MPI. Recent versions of MKL enable autoparallelization by default on multicore machines. You must set the environmental variable OMP_NUM_THREADS to 1 to disable it. Note that if for some reason the correct setting of variable OMP_NUM_THREADS does not propagate to all processors, you may equally run into trouble. Lorenzo Paulatto (Nov. 2008) suggests to use the -x option to mpirun to propagate OMP_NUM_THREADS to all processors. Axel Kohlmeyer suggests the following (April 2008): "(I've) found that Intel is now turning on multithreading without any warning and that is for example why their FFT seems faster than FFTW. For serial and OpenMP based runs this makes no difference (in fact the multi-threaded FFT helps), but if you run MPI locally, you actually lose performance. Also if you use the 'numactl' tool on linux to bind a job to a specific cpu core, MKL will still try to use all available cores (and slow down badly). The cleanest way of avoiding this mess is to either link with
-lmkl_intel_lp64 -lmkl_sequential -lmkl_core (on 64-bit: x86_64, ia64)
-lmkl_intel -lmkl_sequential -lmkl_core (on 32-bit, i.e. ia32 )
or edit the libmkl_'platform'.a file. I'm using now a file libmkl10.a with:
  GROUP (libmkl_intel_lp64.a libmkl_sequential.a libmkl_core.a)
It works like a charm". UPDATE: Since v.4.2, configure links by default MKL without multithreaded support.

3.4.0.3 Trouble with compilers and MPI libraries

Many users of QUANTUM ESPRESSO, in particular those working on PC clusters, have to rely on themselves (or on less-than-adequate system managers) for the correct configuration of software for parallel execution. Mysterious and irreproducible crashes in parallel execution are sometimes due to bugs in QUANTUM ESPRESSO, but more often than not are a consequence of buggy compilers or of buggy or miscompiled MPI libraries.


next up previous contents
Next: About this document ... Up: 3 Parallelism Previous: 3.3 Parallelization levels Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/images.pl0000644000077300007730000000036712341332560023054 0ustar giannozzgiannozz# LaTeX2HTML 2008 (1.71) # Associate images original text with physical files. $key = q/sim;MSF=1.6;LFS=12;AAT/; $cached_env_img{$key} = q|$ \sim$|; 1; espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/contents.gif0000644000077300007730000000034112341333046023566 0ustar giannozzgiannozzGIF89aA[ooo!,A-޼r%扆㕶Lg@wv/1b(fS\tƝnfS)VH6vMwnt-OEq'zWEǒ5HHG'ƘW)DGi6  +[Ak[3" 2.7 Installation tricks and problems next up previous contents
Next: 3 Parallelism Up: 2 Installation Previous: 2.6 Running tests and Contents

Subsections

2.7 Installation tricks and problems

2.7.1 All architectures

  • Working Fortran-95 and C compilers are needed in order to compile QUANTUM ESPRESSO. Most ``Fortran-90'' compilers actually implement the Fortran-95 standard, but older versions may not be Fortran-95 compliant. Moreover, C and Fortran compilers must be in your PATH. If configure says that you have no working compiler, well, you have no working compiler, at least not in your PATH, and not among those recognized by configure.
  • If you get Compiler Internal Error or similar messages: your compiler version is buggy. Try to lower the optimization level, or to remove optimization just for the routine that has problems. If it doesn't work, or if you experience weird problems at run time, try to install patches for your version of the compiler (most vendors release at least a few patches for free), or to upgrade to a more recent compiler version.
  • If you get error messages at the loading phase that look like file XYZ.o: unknown / not recognized/ invalid / wrong file type / file format / module version, one of the following things have happened:
    1. you have leftover object files from a compilation with another compiler: run make clean and recompile.
    2. make did not stop at the first compilation error (it may happen in some software configurations). Remove the file *.o that triggers the error message, recompile, look for a compilation error.
    If many symbols are missing in the loading phase: you did not specify the location of all needed libraries (LAPACK, BLAS, FFTW, machine-specific optimized libraries), in the needed order. If only symbols from clib/ are missing, verify that you have the correct C-to-Fortran bindings, defined in include/c_defs.h. Note that QUANTUM ESPRESSO is self-contained (with the exception of MPI libraries for parallel compilation): if system libraries are missing, the problem is in your compiler/library combination or in their usage, not in QUANTUM ESPRESSO.
  • If you get an error like Can't open module file global_version.mod: your machine doesn't like the script that produces file version.f90 with the correct version and revision. Quick solution: copy Modules/version.f90.in to Modules/version.f90.
  • If you get mysterious errors ("Segmentation faults" and the like) in the provided tests and examples: your compiler, or your mathematical libraries, or MPI libraries, or a combination thereof, is very likely buggy, or there is some form of incompatibility (see below). Although the presence of subtle bugs in QUANTUM ESPRESSO that are not revealed during the testing phase can never be ruled out, it is very unlikely that this happens on the provided tests and examples.

2.7.2 Cray XE and XT machines

For Cray XE machines:

$ module swap PrgEnv-cray PrgEnv-pgi
$ ./configure --enable-openmp --enable-parallel --with-scalapack
$ vim make.sys
then manually add -D__IOTK_WORKAROUND1 at the end of DFLAGS line.

''Now, despite what people can imagine, every CRAY machine deployed can have different environment. For example on the machine I usually use for tests [...] I do have to unload some modules to make QE running properly. On another CRAY [...] there is also Intel compiler as option and the system is slightly different compared to the other. So my recipe should work, 99% of the cases. I strongly suggest you to use PGI, also for a performance point of view.'' (Info by Filippo Spiga, Sept. 2012)

For Cray XT machines, use ./configure ARCH=crayxt4 or else configure will not recognize the Cray-specific software environment.

Older Cray machines: T3D, T3E, X1, are no longer supported.

2.7.3 IBM AIX

v.4.3.1 of the CP code, Wannier-function dynamics, crashes with ``segmentation violation'' on some AIX v.6 machines. Workaround: compile it with mpxlf95 instead of mpxlf90. (Info by Roberto Scipioni, June 2011)

On IBM machines with ESSL libraries installed, there is a potential conflict between a few LAPACK routines that are also part of ESSL, but with a different calling sequence. The appearance of run-time errors like ON ENTRY TO ZHPEV PARAMETER NUMBER 1 HAD AN ILLEGAL VALUE is a signal that you are calling the bad routine. If you have defined -D__ESSL you should load ESSL before LAPACK: see variable LAPACK_LIBS in make.sys.

2.7.4 IBM BlueGene

The current configure is tested and works on the machines at CINECA and at Jülich. For other sites, you may need something like

  ./configure ARCH=ppc64-bg BLAS_LIBS=...  LAPACK_LIBS=... \
              SCALAPACK_DIR=... BLACS_DIR=..."
where the various *_LIBS and *_DIR "suggest" where the various libraries are located.

2.7.5 Linux PC

Both AMD and Intel CPUs, 32-bit and 64-bit, are supported and work, either in 32-bit emulation and in 64-bit mode. 64-bit executables can address a much larger memory space than 32-bit executable, but there is no gain in speed. Beware: the default integer type for 64-bit machine is typically 32-bit long. You should be able to use 64-bit integers as well, but it is not guaranteed to work and will not give any advantage anyway.

Currently the following compilers are supported by configure: Intel (ifort), Portland (pgf90), gfortran, g95, Pathscale (pathf95), Sun Studio (sunf95), AMD Open64 (openf95). The ordering approximately reflects the quality of support. Both Intel MKL and AMD acml mathematical libraries are supported. Some combinations of compilers and of libraries may however require manual editing of make.sys.

It is usually convenient to create semi-statically linked executables (with only libc, libm, libpthread dynamically linked). If you want to produce a binary that runs on different machines, compile it on the oldest machine you have (i.e. the one with the oldest version of the operating system).

If you get errors like IPO Error: unresolved : __svml_cos2 at the linking stage, your compiler is optimized to use the SSE version of sine, cosine etc. contained in the SVML library. Append -lsvml to the list of libraries in your make.sys file (info by Axel Kohlmeyer, oct.2007).

2.7.5.1 Linux PCs with Portland compiler (pgf90)

QUANTUM ESPRESSO does not work reliably, or not at all, with many old versions (< 6.1) of the Portland Group compiler (pgf90). Use the latest version of each release of the compiler, with patches if available (see the Portland Group web site, http://www.pgroup.com/).

2.7.5.2 Linux PCs with Pathscale compiler

Version 3.1 and version 4 (open source!) of the Pathscale EKO compiler work (info by Cezary Sliwa, April 2011, and Carlo Nervi, June 2011). In case of mysterious errors while compiling iotk, remove all lines like:

# 1 "iotk_base.spp"
from all iotk source files.

2.7.5.3 Linux PCs with gfortran

Only recent versions (at least v.4.4) of gfortran properly compile QUANTUM ESPRESSO. Older versions often produce nonfunctional phonon executables (segmentation faults and the like); other versions miscompile iotk (the executables work but crash with a mysterious iotk error when reading from data files).

"There is a known incompatibility problem between the calling convention for Fortran functions that return complex values: there is the convention used by g77/f2c, where in practice the compiler converts such functions to subroutines with a further parameter for the return value; gfortran instead produces a normal function returning a complex value. If your system libraries were compiled using g77 (which may happen for system-provided libraries in not-too-recent Linux distributions), and you instead use gfortran to compile QUANTUM ESPRESSO, your code may crash or produce random results. This typically happens during calls to zdotc, which is one the most commonly used complex-returning functions of BLAS+LAPACK.

For further details see for instance this link:
http://www.macresearch.org/lapackblas-fortran-106#comment-17071
or read the man page of gfortran under the flag -ff2c.

If your code crashes during a call to zdotc, try to recompile QUANTUM ESPRESSO using the internal BLAS and LAPACK routines (using the -with-internal-blas and -with-internal-lapack parameters of the configure script) to see if the problem disappears; or, add the -ff2c flag" (info by Giovanni Pizzi, Jan. 2013).

Note that a similar problem with complex functions exists with MKL libraries as well: if you compile with gfortran, link -lmkl_gf_lp64, not -lmkl_intel_lp64, and the like for other architectures. Since v.5.1, you may use the following workaround: add preprocessing option -Dzdotc=zdotc_wrapper to DFLAGS.

If you experience problems in reading files produced by previous versions of QUANTUM ESPRESSO: ``gfortran used 64-bit record markers to allow writing of records larger than 2 GB. Before with 32-bit record markers only records <2GB could be written. However, this caused problems with older files and inter-compiler operability. This was solved in GCC 4.2 by using 32-bit record markers but such that one can still store >2GB records (following the implementation of Intel). Thus this issue should be gone. See 4.2 release notes (item ``Fortran") at http://gcc.gnu.org/gcc-4.2/changes.html." (Info by Tobias Burnus, March 2010).

``Using gfortran v.4.4 (after May 27, 2009) and 4.5 (after May 5, 2009) can produce wrong results, unless the environment variable GFORTRAN_UNBUFFERED_ALL=1 is set. Newer 4.4/4.5 versions (later than April 2010) should be OK. See
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43551." (Info by Tobias Burnus, March 2010).

2.7.5.4 Linux PCs with g95

g95 v.0.91 and later versions (http://www.g95.org) work. The executables that produce are however slower (let us say 20% or so) that those produced by gfortran, which in turn are slower (by another 20% or so) than those produced by ifort.

2.7.5.5 Linux PCs with Sun Studio compiler

``The Sun Studio compiler, sunf95, is free (web site: http://developers.sun.com/sunstudio/ and comes with a set of algebra libraries that can be used in place of the slow built-in libraries. It also supports OpenMP, which g95 does not. On the other hand, it is a pain to compile MPI with it. Furthermore the most recent version has a terrible bug that totally miscompiles the iotk input/output library (you'll have to compile it with reduced optimization).'' (info by Lorenzo Paulatto, March 2010).

2.7.5.6 Linux PCs with AMD Open64 suite

The AMD Open64 compiler suite, openf95 (web site: http://developer.amd.com/cpu/open64/pages/default.aspx) can be freely downloaded from the AMD site. It is recognized by configure but little tested. It sort of works but it fails to pass several tests (info by Paolo Giannozzi, March 2010). "I have configured for Pathscale, then switched to the Open64 compiler by editing make.sys. "make pw" succeeded and pw.x did process my file, but with "make all" I get an internal compiler error [in CPV/wf.f90]" (info by Cezary Sliwa, April 2011).

2.7.5.7 Linux PCs with Intel compiler (ifort)

The Intel compiler, ifort, is available for free for personal usage (http://software.intel.com/). It produces fast executables, at least on Intel CPUs, but not all versions work as expected. ifort versions < 9.1 are not recommended, due to the presence of subtle and insidious bugs. In case of trouble, update your version with the most recent patches, available via Intel Premier support (registration free of charge for Linux): http://software.intel.com/en-us/articles/intel-software-developer-support. Since each major release of ifort differs a lot from the previous one, compiled objects from different releases may be incompatible and should not be mixed.

If configure doesn't find the compiler, or if you get Error loading shared libraries at run time, you may have forgotten to execute the script that sets up the correct PATH and library path. Unless your system manager has done this for you, you should execute the appropriate script - located in the directory containing the compiler executable - in your initialization files. Consult the documentation provided by Intel.

The warning: feupdateenv is not implemented and will always fail, showing up in recent versions, can be safely ignored. Warnings on "bad preprocessing option" when compiling iotk and complains about ``recommanded formats'' should also be ignored.

ifort v.12: release 12.0.0 miscompiles iotk, leading to mysterious errors when reading data files. Workaround: increase the parameter BLOCKSIZE to e.g. 131072*1024 when opening files in iotk/src/iotk_files.f90 (info by Lorenzo Paulatto, Nov. 2010). Release 12.0.2 seems to work and to produce faster executables than previous versions on 64-bit CPUs (info by P. Giannozzi, March 2011).

ifort v.11: Segmentation faults were reported for the combination ifort 11.0.081, MKL 10.1.1.019, OpenMP 1.3.3. The problem disappeared with ifort 11.1.056 and MKL 10.2.2.025 (Carlo Nervi, Oct. 2009).

2.7.5.8 Linux PCs with MKL libraries

On Intel CPUs it is very convenient to use Intel MKL libraries. They can be also used for AMD CPU, selecting the appropriate machine-optimized libraries, and also together with non-Intel compilers. Note however that recent versions of MKL (10.2 and following) do not perform well on AMD machines.

configure should recognize properly installed MKL libraries. By default the non-threaded version of MKL is linked, unless option configure -with-openmp is specified. In case of trouble, refer to the following web page to find the correct way to link MKL:
http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/.

Recent MKL versions also contain optimized FFT routines and a FFTW interface.

For parallel (MPI) execution on multiprocessor (SMP) machines, set the environmental variable OMP_NUM_THREADS to 1 unless you know what you are doing. See Sec.3 for more info on this and on the difference between MPI and OpenMP parallelization.

2.7.5.9 Linux PCs with ACML libraries

For AMD CPUs, especially recent ones, you may find convenient to link AMD acml libraries (can be freely downloaded from AMD web site). configure should recognize properly installed acml libraries, together with the compilers most frequently used on AMD systems: pgf90, pathscale, openf95, sunf95.


2.7.6 Linux PC clusters with MPI

PC clusters running some version of MPI are a very popular computational platform nowadays. QUANTUM ESPRESSO is known to work with at least two of the major MPI implementations (MPICH, LAM-MPI), plus with the newer MPICH2 and OpenMPI implementation. configure should automatically recognize a properly installed parallel environment and prepare for parallel compilation. Unfortunately this not always happens. In fact:
  • configure tries to locate a parallel compiler in a logical place with a logical name, but if it has a strange names or it is located in a strange location, you will have to instruct configure to find it. Note that in many PC clusters (Beowulf), there is no parallel Fortran-95 compiler in default installations: you have to configure an appropriate script, such as mpif90.
  • configure tries to locate libraries (both mathematical and parallel libraries) in the usual places with usual names, but if they have strange names or strange locations, you will have to rename/move them, or to instruct configure to find them. If MPI libraries are not found, parallel compilation is disabled.
  • configure tests that the compiler and the libraries are compatible (i.e. the compiler may link the libraries without conflicts and without missing symbols). If they aren't and the compilation fails, configure will revert to serial compilation.

Apart from such problems, QUANTUM ESPRESSO compiles and works on all non-buggy, properly configured hardware and software combinations. In some cases you may have to recompile MPI libraries: not all MPI installations contain support for the fortran-90 compiler of your choice (or for any fortran-90 compiler at all!).

If QUANTUM ESPRESSO does not work for some reason on a PC cluster, try first if it works in serial execution. A frequent problem with parallel execution is that QUANTUM ESPRESSO does not read from standard input, due to the configuration of MPI libraries: see Sec.3.4. If you are dissatisfied with the performances in parallel execution, see Sec.3 and in particular Sec.3.4.

2.7.7 Mac OS

Newer Mac OS-X machines (10.4 and later) with Intel CPUs are supported by configure, with gcc4+g95, gfortran, and the Intel compiler ifort with MKL libraries. Parallel compilation with OpenMPI also works.

Mysterious crashes, occurring when zdotc is called, are due to the same incompatibility of complex functions with some optimized BLAS as reported in the "Linux PCs with gfortran" paragraph. Workaround: add preprocessing option -Dzdotc=zdotc_wrapper to DFLAGS.

2.7.7.1 Detailed installation instructions for Mac OS X 10.6

(Instructions for 10.6.3 by Osman Baris Malcioglu, tested as of May 2010) Summary for the hasty:

  • GNU fortran: Install macports compilers, Install MPI environment, Configure QUANTUM ESPRESSO using
      ./configure CC=gcc-mp-4.3 CPP=cpp-mp-4.3 CXX=g++-mp-4.3 F77=g95 FC=g95
    
  • Intel compiler: Use Version > 11.1.088, Use 32 bit compilers, Install MPI environment, install macports provided cpp (optional), Configure QUANTUM ESPRESSO using
     ./configure CC=icc CXX=icpc F77=ifort F90=ifort FC=ifort CPP=cpp-mp-4.3
    

2.7.7.2 Compilation with GNU compilers

. The following instructions use macports version of gnu compilers due to some issues in mixing gnu supplied fortran compilers with apple modified gnu compiler collection. For more information regarding macports please refer to: http://www.macports.org/

First install necessary compilers from macports

   port install gcc43
   port install g95
The apple supplied MPI environment has to be overridden since there is a new set of compilers now (and Apple provided mpif90 is just an empty placeholder since Apple does not provide fortran compilers). I have used OpenMPI for this case. Recommended minimum configuration line is:
  ./configure CC=gcc-mp-4.3 CPP=cpp-mp-4.3 CXX=g++-mp-4.3 F77=g95 FC=g95
of course, installation directory should be set accordingly if a multiple compiler environment is desired. The default installation directory of OpenMPI overwrites apple supplied MPI permanently!
Next step is QUANTUM ESPRESSO itself. Sadly, the Apple supplied optimized BLAS/LAPACK libraries tend to misbehave under different tests, and it is much safer to use internal libraries. The minimum recommended configuration line is (presuming the environment is set correctly):
  ./configure CC=gcc-mp-4.3 CXX=g++-mp-4.3 F77=g95 F90=g95 FC=g95 \
              CPP=cpp-mp-4.3 --with-internal-blas --with-internal-lapack

2.7.7.3 Compilation with Intel compilers

. Newer versions of Intel compiler (>11.1.067) support Mac OS X 10.6, and furthermore they are bundled with intel MKL. 32 bit binaries obtained using 11.1.088 are tested and no problems have been encountered so far. Sadly, as of 11.1.088 the 64 bit binary misbehave under some tests. Any attempt to compile 64 bit binary using v.< 11.1.088 will result in very strange compilation errors.

Like the previous section, I would recommend installing macports compiler suite. First, make sure that you are using the 32 bit version of the compilers, i.e.

. /opt/intel/Compiler/11.1/088/bin/ifortvars.sh ia32
. /opt/intel/Compiler/11.1/088/bin/iccvars.sh ia32
will set the environment for 32 bit compilation in my case.

Then, the MPI environment has to be set up for Intel compilers similar to previous section.

The recommended configuration line for QUANTUM ESPRESSO is:

 ./configure CC=icc CXX=icpc F77=ifort F90=ifort FC=ifort CPP=cpp-mp-4.3
MKL libraries will be detected automatically if they are in their default locations. Otherwise, mklvars32 has to be sourced before the configuration script.

Security issues: MacOs 10.6 comes with a disabled firewall. Preparing a ipfw based firewall is recommended. Open source and free GUIs such as "WaterRoof" and "NoobProof" are available that may help you in the process.


next up previous contents
Next: 3 Parallelism Up: 2 Installation Previous: 2.6 Running tests and Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node16.html0000644000077300007730000001234712341333047023236 0ustar giannozzgiannozz 3.1 Understanding Parallelism next up previous contents
Next: 3.2 Running on parallel Up: 3 Parallelism Previous: 3 Parallelism Contents

3.1 Understanding Parallelism

Two different parallelization paradigms are currently implemented in QUANTUM ESPRESSO:

  1. Message-Passing (MPI). A copy of the executable runs on each CPU; each copy lives in a different world, with its own private set of data, and communicates with other executables only via calls to MPI libraries. MPI parallelization requires compilation for parallel execution, linking with MPI libraries, execution using a launcher program (depending upon the specific machine). The number of CPUs used is specified at run-time either as an option to the launcher or by the batch queue system.
  2. OpenMP. A single executable spawn subprocesses (threads) that perform in parallel specific tasks. OpenMP can be implemented via compiler directives (explicit OpenMP) or via multithreading libraries (library OpenMP). Explicit OpenMP require compilation for OpenMP execution; library OpenMP requires only linking to a multithreading version of mathematical libraries, e.g.: ESSLSMP, ACML_MP, MKL (the latter is natively multithreading). The number of threads is specified at run-time in the environment variable OMP_NUM_THREADS.

MPI is the well-established, general-purpose parallelization. In QUANTUM ESPRESSO several parallelization levels, specified at run-time via command-line options to the executable, are implemented with MPI. This is your first choice for execution on a parallel machine.

Library OpenMP is a low-effort parallelization suitable for multicore CPUs. Its effectiveness relies upon the quality of the multithreading libraries and the availability of multithreading FFTs. If you are using MKL,1you may want to select FFTW3 (set CPPFLAGS=-D__FFTW3... in make.sys) and to link with the MKL interface to FFTW3. You will get a decent speedup ($ \sim$ 25%) on two cores.

Explicit OpenMP is a recent addition, still under development, devised to increase scalability on large multicore parallel machines. Explicit OpenMP can be used together with MPI and also together with library OpenMP. Beware conflicts between the various kinds of parallelization! If you don't know how to run MPI processes and OpenMP threads in a controlled manner, forget about mixed OpenMP-MPI parallelization.


next up previous contents
Next: 3.2 Running on parallel Up: 3 Parallelism Previous: 3 Parallelism Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node18.html0000644000077300007730000003261212341333047023235 0ustar giannozzgiannozz 3.3 Parallelization levels next up previous contents
Next: 3.4 Tricks and problems Up: 3 Parallelism Previous: 3.2 Running on parallel Contents

Subsections

3.3 Parallelization levels

In QUANTUM ESPRESSO several MPI parallelization levels are implemented, in which both calculations and data structures are distributed across processors. Processors are organized in a hierarchy of groups, which are identified by different MPI communicators level. The groups hierarchy is as follow:

  • world: is the group of all processors (MPI_COMM_WORLD).
  • images: Processors can then be divided into different "images", each corresponding to a different self-consistent or linear-response calculation, loosely coupled to others.
  • pools: each image can be subpartitioned into "pools", each taking care of a group of k-points.
  • bands: each pool is subpartitioned into "band groups", each taking care of a group of Kohn-Sham orbitals (also called bands, or wavefunctions) (still experimental)
  • PW: orbitals in the PW basis set, as well as charges and density in either reciprocal or real space, are distributed across processors. This is usually referred to as "PW parallelization". All linear-algebra operations on array of PW / real-space grids are automatically and effectively parallelized. 3D FFT is used to transform electronic wave functions from reciprocal to real space and vice versa. The 3D FFT is parallelized by distributing planes of the 3D grid in real space to processors (in reciprocal space, it is columns of G-vectors that are distributed to processors).
  • tasks: In order to allow good parallelization of the 3D FFT when the number of processors exceeds the number of FFT planes, FFTs on Kohn-Sham states are redistributed to "task" groups so that each group can process several wavefunctions at the same time.
  • linear-algebra group: A further level of parallelization, independent on PW or k-point parallelization, is the parallelization of subspace diagonalization / iterative orthonormalization. Both operations required the diagonalization of arrays whose dimension is the number of Kohn-Sham states (or a small multiple of it). All such arrays are distributed block-like across the ``linear-algebra group'', a subgroup of the pool of processors, organized in a square 2D grid. As a consequence the number of processors in the linear-algebra group is given by n2, where n is an integer; n2 must be smaller than the number of processors in the PW group. The diagonalization is then performed in parallel using standard linear algebra operations. (This diagonalization is used by, but should not be confused with, the iterative Davidson algorithm). The preferred option is to use ScaLAPACK; alternative built-in algorithms are anyway available.
Note however that not all parallelization levels are implemented in all codes!

3.3.0.1 About communications

Images and pools are loosely coupled and processors communicate between different images and pools only once in a while, whereas processors within each pool are tightly coupled and communications are significant. This means that Gigabit ethernet (typical for cheap PC clusters) is ok up to 4-8 processors per pool, but fast communication hardware (e.g. Mirynet or comparable) is absolutely needed beyond 8 processors per pool.

3.3.0.2 Choosing parameters

: To control the number of processors in each group, command line switches: -nimage, -npools, -nband, -ntg, -ndiag or -northo (shorthands, respectively: -ni, -nk, -nb, -nt, -nd) are used. As an example consider the following command line:
mpirun -np 4096 ./neb.x -ni 8 -nk 2 -nt 4 -nd 144 -i my.input
This executes a NEB calculation on 4096 processors, 8 images (points in the configuration space in this case) at the same time, each of which is distributed across 512 processors. k-points are distributed across 2 pools of 256 processors each, 3D FFT is performed using 4 task groups (64 processors each, so the 3D real-space grid is cut into 64 slices), and the diagonalization of the subspace Hamiltonian is distributed to a square grid of 144 processors (12x12).

Default values are: -ni 1 -nk 1 -nt 1 ; nd is set to 1 if ScaLAPACK is not compiled, it is set to the square integer smaller than or equal to half the number of processors of each pool.

3.3.0.3 Massively parallel calculations

For very large jobs (i.e. O(1000) atoms or more) or for very long jobs, to be run on massively parallel machines (e.g. IBM BlueGene) it is crucial to use in an effective way all available parallelization levels. Without a judicious choice of parameters, large jobs will find a stumbling block in either memory or CPU requirements. Note that I/O may also become a limiting factor.

Since v.4.1, ScaLAPACK can be used to diagonalize block distributed matrices, yielding better speed-up than the internal algorithms for large ( > 1000 x 1000) matrices, when using a large number of processors (> 512). You need to have -D__SCALAPACK added to DFLAGS in make.sys, LAPACK_LIBS set to something like:

    LAPACK_LIBS = -lscalapack -lblacs -lblacsF77init -lblacs -llapack
The repeated -lblacs is not an error, it is needed! configure tries to find a ScaLAPACK library, unless configure -with-scalapack=no is specified. If it doesn't, inquire with your system manager on the correct way to link it.

A further possibility to expand scalability, especially on machines like IBM BlueGene, is to use mixed MPI-OpenMP. The idea is to have one (or more) MPI process(es) per multicore node, with OpenMP parallelization inside a same node. This option is activated by configure -with-openmp, which adds preprocessing flag -D__OPENMP and one of the following compiler options:

ifort -openmp
xlf -qsmp=omp
PGI -mp
ftn -mp=nonuma

OpenMP parallelization is currently implemented and tested for the following combinations of FFTs and libraries:

internal FFTW copy requires -D__FFTW
ESSL requires -D__ESSL or -D__LINUX_ESSL, link with -lesslsmp

Currently, ESSL (when available) are faster than internal FFTW.

3.3.1 Understanding parallel I/O

In parallel execution, each processor has its own slice of data (Kohn-Sham orbitals, charge density, etc), that have to be written to temporary files during the calculation, or to data files at the end of the calculation. This can be done in two different ways:
  • ``distributed'': each processor writes its own slice to disk in its internal format to a different file.
  • ``collected'': all slices are collected by the code to a single processor that writes them to disk, in a single file, using a format that doesn't depend upon the number of processors or their distribution.

The ``distributed'' format is fast and simple, but the data so produced is readable only by a job running on the same number of processors, with the same type of parallelization, as the job who wrote the data, and if all files are on a file system that is visible to all processors (i.e., you cannot use local scratch directories: there is presently no way to ensure that the distribution of processes across processors will follow the same pattern for different jobs).

Currently, CP uses the ``collected'' format; PWscf uses the ``distributed'' format, but has the option to write the final data file in ``collected'' format (input variable wf_collect) so that it can be easily read by CP and by other codes running on a different number of processors.

In addition to the above, other restrictions to file interoperability apply: e.g., CP can read only files produced by PWscf for the k = 0 case.

The directory for data is specified in input variables outdir and prefix (the former can be specified as well in environment variable ESPRESSO_TMPDIR): outdir/prefix.save. A copy of pseudopotential files is also written there. If some processor cannot access the data directory, the pseudopotential files are read instead from the pseudopotential directory specified in input data. Unpredictable results may follow if those files are not the same as those in the data directory!

IMPORTANT: Avoid I/O to network-mounted disks (via NFS) as much as you can! Ideally the scratch directory outdir should be a modern Parallel File System. If you do not have any, you can use local scratch disks (i.e. each node is physically connected to a disk and writes to it) but you may run into trouble anyway if you need to access your files that are scattered in an unpredictable way across disks residing on different nodes.

You can use input variable disk_io to reduce the the amount of I/O done by pw.x. Since v.5.1, the dafault value is disk_io='low', so the code will store wavefunctions into RAM and not on disk during the calculation. Specify disk_io='medium' only if you have too many k-points and you run into trouble with memory; choose disk_io='none' if you do not need to keep final data files.

For very large cp.x runs, you may consider using wf_collect=.false., memory='small' and saverho=.false. to reduce I/O to the strict minimum.


next up previous contents
Next: 3.4 Tricks and problems Up: 3 Parallelism Previous: 3.2 Running on parallel Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node20.html0000644000077300007730000000553512341333047023232 0ustar giannozzgiannozz About this document ... next up previous contents
Up: User's Guide for Quantum-ESPRESSO Previous: 3.4 Tricks and problems Contents

About this document ...

Image quantum_espresso Image democritos
User's Guide for QUANTUM ESPRESSO

(version 5.1)

This document was generated using the LaTeX2HTML translator Version 2008 (1.71)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html -t 'User's Guide for Quantum-ESPRESSO' -html_version 3.2,math -toc_depth 5 -split 5 -toc_stars -show_section_numbers -local_icons -image_type png user_guide.tex

The translation was initiated by paolo giannozzi on 2014-05-28


paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/next_g.gif0000644000077300007730000000030312341333047023214 0ustar giannozzgiannozzGIF89a%ooo!! ImageMagickgamma=1,%}ڋRbUbK+nj:f#a)gy5Nq+d]͈^fbjۜXL$XBXr8c)9IYi)`Y;espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/prev.gif0000644000077300007730000000033412341333047022710 0ustar giannozzgiannozzGIF89a?[ooo!,?)޼j%~㕶.LqzHir"?`)|J{Č\vSUM߬95[0Er5WxEWeCxhyfFfY)'#؈:+H4{[3 , 2 Installation next up previous contents
Next: 2.1 Download Up: User's Guide for Quantum-ESPRESSO Previous: 1.4 Terms of use Contents

2 Installation

For machines with GPU acceleration, see the page qe-forge.org/gf/project/q-e-gpu/ and the file README.GPU in the GPU-enabled distribution for more specific information.



Subsections

paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/images.aux0000644000077300007730000000001012341332557023225 0ustar giannozzgiannozz\relax espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node1.html0000644000077300007730000001011512341333047023137 0ustar giannozzgiannozz Contents next up previous
Next: 1 Introduction Up: User's Guide for Quantum-ESPRESSO Previous: User's Guide for Quantum-ESPRESSO


Contents



paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node15.html0000644000077300007730000000635112341333047023233 0ustar giannozzgiannozz 3 Parallelism next up previous contents
Next: 3.1 Understanding Parallelism Up: User's Guide for Quantum-ESPRESSO Previous: 2.7 Installation tricks and Contents


3 Parallelism



Subsections

paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/user_guide.html0000644000077300007730000001575612341333047024304 0ustar giannozzgiannozz User's Guide for Quantum-ESPRESSO next up previous contents
Next: Contents Contents

Image quantum_espresso Image democritos
User's Guide for QUANTUM ESPRESSO

(version 5.1)





paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/internals.pl0000644000077300007730000000237512341332560023607 0ustar giannozzgiannozz# LaTeX2HTML 2008 (1.71) # Associate internals original text with physical files. $key = q/Sec:Installation/; $ref_files{$key} = "$dir".q|node9.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Contacts/; $ref_files{$key} = "$dir".q|node4.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Terms/; $ref_files{$key} = "$dir".q|node6.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Examples/; $ref_files{$key} = "$dir".q|node13.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:badpara/; $ref_files{$key} = "$dir".q|node19.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Guidelines/; $ref_files{$key} = "$dir".q|node5.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:manconf/; $ref_files{$key} = "$dir".q|node10.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:LinuxPCMPI/; $ref_files{$key} = "$dir".q|node14.html|; $noresave{$key} = "$nosave"; $key = q/Sec:para/; $ref_files{$key} = "$dir".q|node15.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Compilation/; $ref_files{$key} = "$dir".q|node12.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Download/; $ref_files{$key} = "$dir".q|node8.html|; $noresave{$key} = "$nosave"; $key = q/Sec:Libraries/; $ref_files{$key} = "$dir".q|node11.html|; $noresave{$key} = "$nosave"; 1; espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node10.html0000644000077300007730000003267512341333047023236 0ustar giannozzgiannozz 2.3 configure next up previous contents
Next: 2.4 Libraries Up: 2 Installation Previous: 2.2 Prerequisites Contents

Subsections

2.3 configure

To install the QUANTUM ESPRESSO source package, run the configure script. This is actually a wrapper to the true configure, located in the install/ subdirectory. configure will (try to) detect compilers and libraries available on your machine, and set up things accordingly. Presently it is expected to work on most Linux 32- and 64-bit PCs (all Intel and AMD CPUs) and PC clusters, SGI Altix, IBM SP and BlueGene machines, NEC SX, Cray XT machines, Mac OS X, MS-Windows PCs, and (for experts!) on several GPU-accelerated hardware. Detailed installation instructions for some specific HPC machines can be found in files install/README.sys, where sys is the machine name.

Instructions for the impatient:

    cd espresso-X.Y.Z/
    ./configure
     make all
Symlinks to executable programs will be placed in the bin/ subdirectory. Note that both C and Fortran compilers must be in your execution path, as specified in the PATH environment variable. Additional instructions for special machines:

./configure ARCH=crayxt4 for CRAY XT machines
./configure ARCH=necsx for NEC SX machines
./configure ARCH=ppc64-mn PowerPC Linux + xlf (Marenostrum)
./configure ARCH=ppc64-bg IBM BG/P (BlueGene)

configure generates the following files:

make.sys compilation rules and flags (used by Makefile)
install/configure.msg a report of the configuration run (not needed for compilation)
install/config.log detailed log of the configuration run (may be needed for debugging)
include/fft_defs.h defines fortran variable for C pointer (used only by FFTW)
include/c_defs.h defines C to fortran calling convention
and a few more definitions used by C files

NOTA BENE: unlike previous versions, configure no longer runs the makedeps.sh shell script that updates dependencies. If you modify the sources, run ./install/makedeps.sh or type make depend to update files make.depend in the various subdirectories.

You should always be able to compile the QUANTUM ESPRESSO suite of programs without having to edit any of the generated files. However you may have to tune configure by specifying appropriate environment variables and/or command-line options. Usually the tricky part is to get external libraries recognized and used: see Sec.2.4 for details and hints.

Environment variables may be set in any of these ways:

     export VARIABLE=value; ./configure             # sh, bash, ksh
     setenv VARIABLE value; ./configure             # csh, tcsh
     ./configure VARIABLE=value                     # any shell
Some environment variables that are relevant to configure are:

ARCH label identifying the machine type (see below)
F90, F77, CC names of Fortran 95, Fortran 77, and C compilers
MPIF90 name of parallel Fortran 95 compiler (using MPI)
CPP source file preprocessor (defaults to $CC -E)
LD linker (defaults to $MPIF90)
(C,F,F90,CPP,LD)FLAGS compilation/preprocessor/loader flags
LIBDIRS extra directories where to search for libraries

For example, the following command line:

     ./configure MPIF90=mpf90 FFLAGS="-O2 -assume byterecl" \
                  CC=gcc CFLAGS=-O3 LDFLAGS=-static
instructs configure to use mpf90 as Fortran 95 compiler with flags -O2 -assume byterecl, gcc as C compiler with flags -O3, and to link with flag -static. Note that the value of FFLAGS must be quoted, because it contains spaces. NOTA BENE: do not pass compiler names with the leading path included. F90=f90xyz is ok, F90=/path/to/f90xyz is not. Do not use environmental variables with configure unless they are needed! try configure with no options as a first step.

If your machine type is unknown to configure, you may use the ARCH variable to suggest an architecture among supported ones. Some large parallel machines using a front-end (e.g. Cray XT) will actually need it, or else configure will correctly recognize the front-end but not the specialized compilation environment of those machines. In some cases, cross-compilation requires to specify the target machine with the -host option. This feature has not been extensively tested, but we had at least one successful report (compilation for NEC SX6 on a PC). Currently supported architectures are:

ia32 Intel 32-bit machines (x86) running Linux
ia64 Intel 64-bit (Itanium) running Linux
x86_64 Intel and AMD 64-bit running Linux - see note below
aix IBM AIX machines
solaris PC's running SUN-Solaris
sparc Sun SPARC machines
crayxt4 Cray XT4/XT5/XE machines
mac686 Apple Intel machines running Mac OS X
cygwin MS-Windows PCs with Cygwin
mingw32 Cross-compilation for MS-Windows, using mingw, 32 bits
mingw64 As above, 64 bits
necsx NEC SX-6 and SX-8 machines
ppc64 Linux PowerPC machines, 64 bits
ppc64-mn as above, with IBM xlf compiler
ppc64-bg IBM BlueGene
arm ARM machines (with gfortran)

Note: x86_64 replaces amd64 since v.4.1. Cray Unicos machines, SGI machines with MIPS architecture, HP-Compaq Alphas are no longer supported since v.4.2; PowerPC Macs are no longer supported since v.5.0. Finally, configure recognizes the following command-line options:
-enable-parallel compile for parallel (MPI) execution if possible (default: yes)
-enable-openmp compile for OpenMP execution if possible (default: no)
-enable-shared use shared libraries if available (default: yes;
"no" is implemented, untested, in only a few cases)
-enable-debug compile with debug flags (only for selected cases; default: no)
-disable-wrappers disable C to fortran wrapper check (default: enabled)
-enable-signals enable signal trapping (default: disabled)

and the following optional packages:
-with-internal-blas compile with internal BLAS (default: no)
-with-internal-lapack compile with internal LAPACK (default: no)
-with-scalapack=no do not use ScaLAPACK (default: yes)
-with-scalapack=intel use ScaLAPACK for Intel MPI (default:OpenMPI)

If you want to modify the configure script (advanced users only!), see the Developer Manual.


2.3.1 Manual configuration

If configure stops before the end, and you don't find a way to fix it, you have to write working make.sys, include/fft_defs.h and include/c_defs.h files. For the latter two files, follow the explanations in include/defs.h.README.

If configure has run till the end, you should need only to edit make.sys. A few sample make.sys files are provided in install/Make.system. The template used by configure is also found there as install/make.sys.in and contains explanations of the meaning of the various variables. Note that you may need to select appropriate preprocessing flags in conjunction with the desired or available libraries (e.g. you need to add -D__FFTW to DFLAGS if you want to link internal FFTW). For a correct choice of preprocessing flags, refer to the documentation in include/defs.h.README.

NOTA BENE: If you change any settings (e.g. preprocessing, compilation flags) after a previous (successful or failed) compilation, you must run make clean before recompiling, unless you know exactly which routines are affected by the changed settings and how to force their recompilation.


next up previous contents
Next: 2.4 Libraries Up: 2 Installation Previous: 2.2 Prerequisites Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/img1.gif0000644000077300007730000000021412341333046022565 0ustar giannozzgiannozzGIF89a# 856C@@MJKXUVb``mkkwuv!,9I8ͻ`H!@0a)ҐJUXE311]5A0,. CBl:%tJZ;espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node3.html0000644000077300007730000001052012341333047023141 0ustar giannozzgiannozz 1.1 People next up previous contents
Next: 1.2 Contacts Up: 1 Introduction Previous: 1 Introduction Contents

1.1 People

The maintenance and further development of the QUANTUM ESPRESSO distribution is promoted by the DEMOCRITOS National Simulation Center of IOM-CNR under the coordination of Paolo Giannozzi (Univ.Udine, Italy) and Layla Martin-Samos (Univ.Nova Gorica) with the strong support of the CINECA National Supercomputing Center in Bologna under the responsibility of Carlo Cavazzoni.

Main contributors to QUANTUM ESPRESSO, in addition to the authors of the paper mentioned in Sect.1.4, are acknowledged in the documentation of each package. An alphabetic list of further contributors who answered questions on the mailing list, found bugs, helped in porting to new architectures, wrote some code, contributed in some way or another at some stage, follows:

Åke Sandgren, Audrius Alkauskas, Alain Allouche, Francesco Antoniella, Uli Aschauer, Francesca Baletto, Gerardo Ballabio, Mauro Boero, Pietro Bonfà, Claudia Bungaro, Paolo Cazzato, Gabriele Cipriani, Ismaila Dabo, Jiayu Dai, Cesar Da Silva, Alberto Debernardi, Gernot Deinzer, Marco Govoni, Thomas Gruber, Martin Hilgeman, Yosuke Kanai, Konstantin Kudin, Nicolas Lacorne, Stephane Lefranc, Sergey Lisenkov, Kurt Maeder, Andrea Marini, Giuseppe Mattioli, Nicolas Mounet, William Parker, Pasquale Pavone, Mickael Profeta, Guido Roma, Kurt Stokbro, David Strubbe, Sylvie Stucki, Paul Tangney, Pascal Thibaudeau, Antonio Tilocca, Jaro Tobik, Malgorzata Wierzbowska, Vittorio Zecca, Silviu Zilberman, Federico Zipoli,
and let us apologize to everybody we have forgotten.


next up previous contents
Next: 1.2 Contacts Up: 1 Introduction Previous: 1 Introduction Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node5.html0000644000077300007730000001124312341333047023146 0ustar giannozzgiannozz 1.3 Guidelines for posting to the mailing list next up previous contents
Next: 1.4 Terms of use Up: 1 Introduction Previous: 1.2 Contacts Contents


1.3 Guidelines for posting to the mailing list

Life for subscribers of pw_forum will be easier if everybody complies with the following guidelines:
  • Before posting, please: browse or search the archives - links are available in the ``Contacts'' section of the web site. Most questions are asked over and over again. Also: make an attempt to search the available documentation, notably the FAQs and the User Guide(s). The answer to most questions is already there.
  • Reply to both the mailing list and the author or the post, using ``Reply to all'' (not ``Reply'': the Reply-To: field no longer points to the mailing list).
  • Sign your post with your name and affiliation.
  • Choose a meaningful subject. Do not use "reply" to start a new thread: it will confuse the ordering of messages into threads that most mailers can do. In particular, do not use "reply" to a Digest!!!
  • Be short: no need to send 128 copies of the same error message just because you this is what came out of your 128-processor run. No need to send the entire compilation log for a single error appearing at the end.
  • Avoid excessive or irrelevant quoting of previous messages. Your message must be immediately visible and easily readable, not hidden into a sea of quoted text.
  • Remember that even experts cannot guess where a problem lies in the absence of sufficient information. One piece of information that must always be provided is the version number of QUANTUM ESPRESSO.
  • Remember that the mailing list is a voluntary endeavor: nobody is entitled to an answer, even less to an immediate answer.
  • Finally, please note that the mailing list is not a replacement for your own work, nor is it a replacement for your thesis director's work.


next up previous contents
Next: 1.4 Terms of use Up: 1 Introduction Previous: 1.2 Contacts Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/index.html0000644000077300007730000000000012341333047036147 1espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/user_guide.htmlustar giannozzgiannozzespresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/user_guide.css0000644000077300007730000000157312341332560024117 0ustar giannozzgiannozz/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ .MATH { font-family: "Century Schoolbook", serif; } .MATH I { font-family: "Century Schoolbook", serif; font-style: italic } .BOLDMATH { font-family: "Century Schoolbook", serif; font-weight: bold } /* implement both fixed-size and relative sizes */ SMALL.XTINY { font-size : xx-small } SMALL.TINY { font-size : x-small } SMALL.SCRIPTSIZE { font-size : smaller } SMALL.FOOTNOTESIZE { font-size : small } SMALL.SMALL { } BIG.LARGE { } BIG.XLARGE { font-size : large } BIG.XXLARGE { font-size : x-large } BIG.HUGE { font-size : larger } BIG.XHUGE { font-size : xx-large } /* heading styles */ H1 { } H2 { } H3 { } H4 { } H5 { } /* mathematics styles */ DIV.displaymath { } /* math displays */ TD.eqno { } /* equation-number cells */ /* document-specific styles come next */ espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node2.html0000644000077300007730000001755312341333047023155 0ustar giannozzgiannozz 1 Introduction next up previous contents
Next: 1.1 People Up: User's Guide for Quantum-ESPRESSO Previous: Contents Contents

1 Introduction

This guide gives a general overview of the contents and of the installation of QUANTUM ESPRESSO (opEn-Source Package for Research in Electronic Structure, Simulation, and Optimization), version 5.1.

The QUANTUM ESPRESSO distribution contains the core packages PWscf (Plane-Wave Self-Consistent Field) and CP (Car-Parrinello) for the calculation of electronic-structure properties within Density-Functional Theory (DFT), using a Plane-Wave (PW) basis set and pseudopotentials. It also includes other packages for more specialized calculations:

  • PWneb: energy barriers and reaction pathways through the Nudged Elastic Band (NEB) method.
  • PHonon: vibrational properties with Density-Functional Perturbation Theory.
  • PostProc: codes and utilities for data postprocessing.
  • PWcond: ballistic conductance.
  • XSPECTRA: K-edge X-ray adsorption spectra.
  • TD-DFPT: spectra from Time-Dependent Density-Functional Perturbation Theory.
The following auxiliary packages are included as well:
  • PWgui: a Graphical User Interface, producing input data files for PWscf and some PostProc codes.
  • atomic: atomic calculations and pseudopotential generation.
  • QHA: utilities for the calculation of projected density of states (PDOS) and of the free energy in the Quasi-Harmonic Approximation (to be used in conjunction with PHonon).
  • PlotPhon: phonon dispersion plotting utility (to be used in conjunction with PHonon).
A copy of required external libraries is also included. Finally, several additional packages that exploit data produced by QUANTUM ESPRESSO or patch some QUANTUM ESPRESSO routines can be installed as plug-ins:
  • Wannier90: maximally localized Wannier functions.
  • WanT: quantum transport properties with Wannier functions.
  • YAMBO: electronic excitations within Many-Body Perturbation Theory: GW and Bethe-Salpeter equation.
  • PLUMED: calculation of free-energy surface through metadynamics.
  • GIPAW (Gauge-Independent Projector Augmented Waves): NMR chemical shifts and EPR g-tensor.
  • GWL: electronic excitations within GW Approximation.
Documentation on single packages can be found in the Doc/ or doc/ directory of each package. A detailed description of input data is available for most packages in files INPUT_*.txt and INPUT_*.html.

The QUANTUM ESPRESSO codes work on many different types of Unix machines, including parallel machines using both OpenMP and MPI (Message Passing Interface) and GPU-accelerated machines. QUANTUM ESPRESSO also runs on Mac OS X and MS-Windows machines: see section 2.2. A GPU-enabled version of most important codes is available on GitHub: https://github.com/fspiga/QE-GPU.

Further documentation, beyond what is provided in this guide, can be found in:

  • the Doc/ directory of the QUANTUM ESPRESSO distribution;
  • the QUANTUM ESPRESSO web site www.quantum-espresso.org;
  • the archives of the mailing list: See section 1.2, ``Contacts'', for more info.
People who want to contribute to QUANTUM ESPRESSO should read the Developer Manual: Doc/developer_man.pdf.

This guide does not explain the basic Unix concepts (shell, execution path, directories etc.) and utilities needed to run QUANTUM ESPRESSO; it does not explain either solid state physics and its computational methods. If you want to learn the latter, you should first read a good textbook, such as e.g. the book by Richard Martin: Electronic Structure: Basic Theory and Practical Methods, Cambridge University Press (2004); or: Density functional theory: a practical introduction, D. S. Sholl, J. A. Steckel (Wiley, 2009); or Electronic Structure Calculations for Solids and Molecules: Theory and Computational Methods, J. Kohanoff (Cambridge University Press, 2006). Then you should consult the documentation of the package you want to use for more specific references.

All trademarks mentioned in this guide belong to their respective owners.



Subsections
next up previous contents
Next: 1.1 People Up: User's Guide for Quantum-ESPRESSO Previous: Contents Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node4.html0000644000077300007730000001120612341333047023144 0ustar giannozzgiannozz 1.2 Contacts next up previous contents
Next: 1.3 Guidelines for posting Up: 1 Introduction Previous: 1.1 People Contents


1.2 Contacts

The web site for QUANTUM ESPRESSO is http://www.quantum-espresso.org/. Releases and patches can be downloaded from this site or following the links contained in it. The main entry point for developers is the QE-forge web site: http://qe-forge.org/, and in particular the page dedicated to the QUANTUM ESPRESSO project: qe-forge.org/gf/project/q-e/.

The recommended place where to ask questions about installation and usage of QUANTUM ESPRESSO, and to report problems, is the pw_forum mailing list: pw_forum@pwscf.org. Here you can obtain help from the developers and from knowledgeable users. You have to be subscribed (see ``Contacts'' section of the web site) in order to post to the pw_forum list. Please read the guidelines for posting, section 1.3! NOTA BENE: only messages that appear to come from the registered user's e-mail address, in its exact form, will be accepted. Messages "waiting for moderator approval" are automatically deleted with no further processing (sorry, too much spam). In case of trouble, carefully check that your return e-mail is the correct one (i.e. the one you used to subscribe).

Since pw_forum has a sizable traffic, an alternative low-traffic list, pw_users@pwscf.org, is provided for those interested only in QUANTUM ESPRESSO-related news, such as e.g. announcements of new versions, tutorials, etc.. You can subscribe (but not post) to this list from the web site, ``Contacts'' section.

If you need to contact the developers for specific questions about coding, proposals, offers of help, etc., please send a message to the developers' mailing list: q-e-developers@qe-forge.org. Do not post general questions: they will be ignored.


next up previous contents
Next: 1.3 Guidelines for posting Up: 1 Introduction Previous: 1.1 People Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/labels.pl0000644000077300007730000000507112341332560023046 0ustar giannozzgiannozz# LaTeX2HTML 2008 (1.71) # Associate labels original text with physical files. $key = q/Sec:Installation/; $external_labels{$key} = "$URL/" . q|node9.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Contacts/; $external_labels{$key} = "$URL/" . q|node4.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Terms/; $external_labels{$key} = "$URL/" . q|node6.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Examples/; $external_labels{$key} = "$URL/" . q|node13.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:badpara/; $external_labels{$key} = "$URL/" . q|node19.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Guidelines/; $external_labels{$key} = "$URL/" . q|node5.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:manconf/; $external_labels{$key} = "$URL/" . q|node10.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:LinuxPCMPI/; $external_labels{$key} = "$URL/" . q|node14.html|; $noresave{$key} = "$nosave"; $key = q/Sec:para/; $external_labels{$key} = "$URL/" . q|node15.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Compilation/; $external_labels{$key} = "$URL/" . q|node12.html|; $noresave{$key} = "$nosave"; $key = q/SubSec:Download/; $external_labels{$key} = "$URL/" . q|node8.html|; $noresave{$key} = "$nosave"; $key = q/Sec:Libraries/; $external_labels{$key} = "$URL/" . q|node11.html|; $noresave{$key} = "$nosave"; 1; # LaTeX2HTML 2008 (1.71) # labels from external_latex_labels array. $key = q/Sec:Installation/; $external_latex_labels{$key} = q|2.2|; $noresave{$key} = "$nosave"; $key = q/SubSec:Contacts/; $external_latex_labels{$key} = q|1.2|; $noresave{$key} = "$nosave"; $key = q/SubSec:Terms/; $external_latex_labels{$key} = q|1.4|; $noresave{$key} = "$nosave"; $key = q/SubSec:Examples/; $external_latex_labels{$key} = q|2.6|; $noresave{$key} = "$nosave"; $key = q/SubSec:badpara/; $external_latex_labels{$key} = q|3.4|; $noresave{$key} = "$nosave"; $key = q/SubSec:Guidelines/; $external_latex_labels{$key} = q|1.3|; $noresave{$key} = "$nosave"; $key = q/SubSec:manconf/; $external_latex_labels{$key} = q|2.3.1|; $noresave{$key} = "$nosave"; $key = q/SubSec:LinuxPCMPI/; $external_latex_labels{$key} = q|2.7.6|; $noresave{$key} = "$nosave"; $key = q/Sec:para/; $external_latex_labels{$key} = q|3|; $noresave{$key} = "$nosave"; $key = q/SubSec:Compilation/; $external_latex_labels{$key} = q|2.5|; $noresave{$key} = "$nosave"; $key = q/SubSec:Download/; $external_latex_labels{$key} = q|2.1|; $noresave{$key} = "$nosave"; $key = q/Sec:Libraries/; $external_latex_labels{$key} = q|2.4|; $noresave{$key} = "$nosave"; 1; espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node13.html0000644000077300007730000001502112341333047023223 0ustar giannozzgiannozz 2.6 Running tests and examples next up previous contents
Next: 2.7 Installation tricks and Up: 2 Installation Previous: 2.5 Compilation Contents


2.6 Running tests and examples

As a final check that compilation was successful, you may want to run some or all of the examples. There are two different types of examples:

  • automated tests. Quick and exhaustive, but not meant to be realistic, implemented only for PWscf and CP.
  • examples. Cover many more programs and features of the QUANTUM ESPRESSO distribution, but they require manual inspection of the results.
Instructions for the impatient:
   cd PW/tests/
   ./check_pw.x.j
for PWscf; PW/tests/README contains a list of what is tested. For CP:
   cd CPV/tests/
   ./check_cp.x.j
Instructions for all others: edit file environment_variables, setting the following variables as needed.
BIN_DIR: directory where executables reside
PSEUDO_DIR: directory where pseudopotential files reside
TMP_DIR: directory to be used as temporary storage area
The default values of BIN_DIR and PSEUDO_DIR should be fine, unless you have installed things in nonstandard places. TMP_DIR must be a directory where you have read and write access to, with enough available space to host the temporary files produced by the example runs, and possibly offering high I/O performance (i.e., don't use an NFS-mounted directory). NOTA BENE: do not use a directory containing other data: the examples will clean it!

If you have compiled the parallel version of QUANTUM ESPRESSO (this is the default if parallel libraries are detected), you will usually have to specify a launcher program (such as mpirun or mpiexec) and the number of processors: see Sec.3 for details. In order to do that, edit again the environment_variables file and set the PARA_PREFIX and PARA_POSTFIX variables as needed. Parallel executables will be run by a command like this:

      $PARA_PREFIX pw.x $PARA_POSTFIX -i file.in > file.out
For example, if the command line is like this (as for an IBM SP):
      poe pw.x -procs 4 -i file.in > file.out
you should set PARA_PREFIX="poe", PARA_POSTFIX="-procs 4". Furthermore, if your machine does not support interactive use, you must run the commands specified above through the batch queuing system installed on that machine. Ask your system administrator for instructions. For execution using OpenMP on N threads, you should set PARA_PREFIX to "env OMP_NUM_THREADS=N ... ".

Notice that most tests and examples are devised to be run serially or on a small number of processors; do not use tests and examples to benchmark parallelism, do not try to run on too many processors.

To run an example, go to the corresponding directory (e.g. PW/examples/example01) and execute:

      ./run_example
This will create a subdirectory results/, containing the input and output files generated by the calculation. Some examples take only a few seconds to run, while others may require several minutes depending on your system.

In each example's directory, the reference/ subdirectory contains verified output files, that you can check your results against. They were generated on a Linux PC using the Intel compiler. On different architectures the precise numbers could be slightly different, in particular if different FFT dimensions are automatically selected. For this reason, a plain diff of your results against the reference data doesn't work, or at least, it requires human inspection of the results.

The example scripts stop if an error is detected. You should look inside the last written output file to understand why.


next up previous contents
Next: 2.7 Installation tricks and Up: 2 Installation Previous: 2.5 Compilation Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/images.log0000644000077300007730000001154612341332557023231 0ustar giannozzgiannozzThis is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian) (format=latex 2013.10.8) 28 MAY 2014 12:07 entering extended mode restricted \write18 enabled. %&-line parsing enabled. **./images.tex (./images.tex LaTeX2e <2011/06/27> Babel and hyphenation patterns for english, dumylang, nohyphenation, it alian, loaded. (/usr/share/texlive/texmf-dist/tex/latex/base/article.cls Document Class: article 2007/10/19 v1.4h Standard LaTeX document class (/usr/share/texlive/texmf-dist/tex/latex/base/size12.clo File: size12.clo 2007/10/19 v1.4h Standard LaTeX file (size option) ) \c@part=\count79 \c@section=\count80 \c@subsection=\count81 \c@subsubsection=\count82 \c@paragraph=\count83 \c@subparagraph=\count84 \c@figure=\count85 \c@table=\count86 \abovecaptionskip=\skip41 \belowcaptionskip=\skip42 \bibindent=\dimen102 ) (/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty Package: ifthen 2001/05/26 v1.1c Standard LaTeX ifthen package (DPC) ) (/usr/share/texmf/tex/latex/html/html.sty Package: html 1999/07/19 v1.38 hypertext commands for latex2html (nd, hws, rrm) \c@lpart=\count87 \c@lchapter=\count88 \c@chapter=\count89 \c@lsection=\count90 \c@lsubsection=\count91 \c@lsubsubsection=\count92 \c@lparagraph=\count93 \c@lsubparagraph=\count94 \c@lsubsubparagraph=\count95 \ptrfile=\write3 ) (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty Package: keyval 1999/03/16 v1.13 key=value parser (DPC) \KV@toks@=\toks14 ) (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty Package: graphics 2009/02/05 v1.0o Standard LaTeX Graphics (DPC,SPQR) (/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty Package: trig 1999/03/16 v1.09 sin cos tan (DPC) ) (/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live ) Package graphics Info: Driver file: dvips.def on input line 91. (/usr/share/texlive/texmf-dist/tex/latex/graphics/dvips.def File: dvips.def 1999/02/16 v3.0i Driver-dependant file (DPC,SPQR) )) \Gin@req@height=\dimen103 \Gin@req@width=\dimen104 ) (/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty Package: color 2005/11/14 v1.0j Standard LaTeX Color (DPC) (/usr/share/texlive/texmf-dist/tex/latex/latexconfig/color.cfg File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive ) Package color Info: Driver file: dvips.def on input line 130. (/usr/share/texlive/texmf-dist/tex/latex/graphics/dvipsnam.def File: dvipsnam.def 1999/02/16 v3.0i Driver-dependant file (DPC,SPQR) )) (/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty Package: inputenc 2008/03/30 v1.1d Input encoding file \inpenc@prehook=\toks15 \inpenc@posthook=\toks16 (/usr/share/texlive/texmf-dist/tex/latex/base/latin1.def File: latin1.def 2008/03/30 v1.1d Input encoding file )) \sizebox=\box26 \lthtmlwrite=\write4 (./images.aux) \openout1 = `images.aux'. LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 146. LaTeX Font Info: ... okay on input line 146. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 146. LaTeX Font Info: ... okay on input line 146. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 146. LaTeX Font Info: ... okay on input line 146. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 146. LaTeX Font Info: ... okay on input line 146. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 146. LaTeX Font Info: ... okay on input line 146. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 146. LaTeX Font Info: ... okay on input line 146. latex2htmlLength hsize=349.0pt latex2htmlLength vsize=721.41339pt latex2htmlLength hoffset=0.0pt latex2htmlLength voffset=0.0pt latex2htmlLength topmargin=0.0pt latex2htmlLength topskip=0.00003pt latex2htmlLength headheight=0.0pt latex2htmlLength headsep=0.0pt latex2htmlLength parskip=0.0pt plus 1.0pt latex2htmlLength oddsidemargin=0.0pt latex2htmlLength evensidemargin=0.0pt LaTeX Font Info: External font `cmex10' loaded for size (Font) <12> on input line 210. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 210. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 210. l2hSize :tex2html_wrap_inline2354:7.75pt::0.0pt::9.92088pt. [1 ] (./images.aux) ) Here is how much of TeX's memory you used: 1144 strings out of 495049 14736 string characters out of 3181577 57798 words of memory out of 3000000 4370 multiletter control sequences out of 15000+200000 6376 words of font info for 23 fonts, out of 3000000 for 9000 14 hyphenation exceptions out of 8191 25i,5n,19p,185b,145s stack positions out of 5000i,500n,10000p,200000b,50000s Output written on images.dvi (1 page, 340 bytes). espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node17.html0000644000077300007730000000607212341333047023235 0ustar giannozzgiannozz 3.2 Running on parallel machines next up previous contents
Next: 3.3 Parallelization levels Up: 3 Parallelism Previous: 3.1 Understanding Parallelism Contents

3.2 Running on parallel machines

Parallel execution is strongly system- and installation-dependent. Typically one has to specify:

  1. a launcher program (not always needed), such as poe, mpirun, mpiexec, with the appropriate options (if any);
  2. the number of processors, typically as an option to the launcher program, but in some cases to be specified after the name of the program to be executed;
  3. the program to be executed, with the proper path if needed;
  4. other QUANTUM ESPRESSO-specific parallelization options, to be read and interpreted by the running code.
Items 1) and 2) are machine- and installation-dependent, and may be different for interactive and batch execution. Note that large parallel machines are often configured so as to disallow interactive execution: if in doubt, ask your system administrator. Item 3) also depend on your specific configuration (shell, execution path, etc). Item 4) is optional but it is very important for good performances. We refer to the next section for a description of the various possibilities.



paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/prev_g.gif0000644000077300007730000000036312341333047023220 0ustar giannozzgiannozzGIF89a?ooo!! ImageMagickgamma=1,? ޼j%~㕶.LqzHir"?`)|J{Č\vSUM߬95[0Er5WxEWeCxhyfFfY)'#؈:+H4{[3 , 2.5 Compilation next up previous contents
Next: 2.6 Running tests and Up: 2 Installation Previous: 2.4 Libraries Contents


2.5 Compilation

There are a few adjustable parameters in Modules/parameters.f90. The present values will work for most cases. All other variables are dynamically allocated: you do not need to recompile your code for a different system.

At your choice, you may compile the complete QUANTUM ESPRESSO suite of programs (with make all), or only some specific programs. make with no arguments yields a list of valid compilation targets:

  • make pw compiles the self-consistent-field package PWscf
  • make cp compiles the Car-Parrinello package CP
  • make neb downloads PWneb package from qe-forge unpacks it and compiles it. All executables are linked in main bin directory
  • make ph downloads PHonon package from qe-forge unpacks it and compiles it. All executables are linked in main bin directory
  • make pp compiles the postprocessing package PostProc
  • make pwcond downloads the balistic conductance package PWcond from qe-forge unpacks it and compiles it. All executables are linked in main bin directory
  • make pwall produces all of the above.
  • make ld1 downloads the pseudopotential generator package atomic from qe-forge unpacks it and compiles it. All executables are linked in main bin directory
  • make xspectra downloads the package XSpectra from qe-forge unpacks it and compiles it. All executables are linked in main bin directory
  • make upf produces utilities for pseudopotential conversion in directory upftools/
  • make all produces all of the above
  • make plumed unpacks PLUMED, patches several routines in PW/, CPV/ and clib/, recompiles PWscf and CP with PLUMED support
  • make w90 downloads wannier90, unpacks it, copies an appropriate make.sys file, produces all executables in W90/wannier90.x and in bin/
  • make want downloads WanT from qe-forge, unpacks it, runs its configure, produces all executables for WanT in WANT/bin.
  • make yambo downloads yambo from qe-forge, unpacks it, runs its configure, produces all yambo executables in YAMBO/bin
  • make gipaw downloads GIPAW from qe-forge, unpacks it, runs its configure, produces all GIPAW executables in GIPAW/bin and in main bin directory.
For the setup of the GUI, refer to the PWgui-X.Y.Z /INSTALL file, where X.Y.Z stands for the version number of the GUI (should be the same as the general version number). If you are using the SVN sources, see the GUI/README file instead.

If make refuses for some reason to download additional packages, manually download them into subdirectory archive/, not unpacking or or uncompressing them, and try make again. Also see Sec.(2.1).


next up previous contents
Next: 2.6 Running tests and Up: 2 Installation Previous: 2.4 Libraries Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/democritos.gif0000644000077300007730000002442112341333046024106 0ustar giannozzgiannozzGIF89a9Y32f06i54h64i88g;;j?>nA@pEDuHGw HJt!OIuKMw( )!)OQ{$0RT~UV-1WY.2\Y0819_\3:b^:<;Aaefc=Che>D?EeiFLjnnnHNKOrrQWuuSXyxUZZ[}}\b_eydfz{fi|w}x~hpmrosptrvvxxz߀⃆ነ䋋㌒厔⑕唗留䙚曜眝¬鞟蟥ĭ褢礨馪ꧫ쩭͵魯ļϸ믱Ǿɽ!,9Y H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶GjaT&e7nn|֣xΣ#PAGW"̹sg?aJ";0*.k# $D`!iZlVq.n( 7\³u;tCBgG1)sW400ɲ ȟ!nbP p IO#D@A( f;! !XI@24XBȰ2 !0D=ԀEGfXP>'@8`ƀBTOu*x D0uʶd~h*Gu*@uVPږxJR( One0KaVd܈68TIo!*g|@CTG:kw|(# RG8pF « ɀ F+PYT$c8TPh(ar>`L%ȗn> ·AO<˜R{@>!lm|"W0δ"A0+7|r:N4@|,>!PAD= `|!>7O>`RŒ}>%ħ=TWm51}7DF8FC࣡2D#AYI`mCѰ% [Y볊 ~'B1C?ޒ5|5ַqyL>k>YߌɆ@;c2 s*'g 뢞Wȭ 9HCi(PPC2F*G^>F AԈ7 G d67Dȭ@6H`Pd I D(0k0)I9m!#\`*X!zz,NJ8Zo4.wBA@=L\H>|HFPn'D蜏8u"BJ(5{,BIR-5o.zAL.@Hz'et 7]dxPpIz#tT8J51Y@ @RGz8ŖLm~He@BZ=WdH@~HCBCBEtM0iW1"G BO*`$)g|B"pN>TP b6x"MPx|H *`G I@lDpEr=%1tOD2=#ȇf< IDRNF%[J@Caca&J'#u"[µ"%3|t@ʉ*CXՄpEQ/l) = eH͇Ri NJPǶكcXd@qAev~xiU/8*ّ|5](T5!UH;ZtAJ !`S LKRȚ^ԐWx0'j3%:SO&1d Ž [B\ރIsPak;BߵRKB>>cV9^܀N 椄`P܈-z4PȤ1&mBYJFD2 n!GZ` ݘTkG;lE^m,{ #l1&n^4BfāN !BL&A 5>dps*} Dz f~6@!l*|"_G%|B?HwwhXF e(L6oc3*ц%+t0wFn0t# 4A-k Cy:ɇK2`뗾A4s1CӸ#}4xhQOw ճ_x8)43 7ID4O@:6ЉXtdPr$ jBhA4!JUƑaʍm(6ھ 8b!:a{N}r[^*A,tr~!UsdY@pLփuR*U͟T bd: "r!x bem;t%j #gH+V'pY0`8pW zM]0#87 !p6g1 %c5 5ʇJdH} 9/8s,tOOx\qt z FR'!(LtE i ރ|CLU_5RZ%0+FՕCsdi@Vk2 Bp's%smZ@V{'03'eP!R8Jp+| qWtRh!trpN\q w׶%`yVTX e4 &2aaiDzn6;&q"ؑ(ttt~R>"cF8 KJH\% 4Tu:pN4oɊndGKR1 {E "I P0]EqgGH'ւ54(%oJ(vhi(O WwPP'DyiZ9jL!e !B87" ̀uK Y0bsu8$A 3z3X'('8 ! $ph pp#<q X*OG{ P0A"VǢs7 ;q QD%Af(%} p +*  A U!b!R[YCY4pq Lϒ5 Ш .@BFcr`IS( b1%"( t2c iJ <^X^m3tC@;ْFZU6 apbQ8;! ${m`u ޺ЪR!%IK"?Z2@Ȓ>7CVR'JR'L8([{~0B 2 d5 ;3I U Ub'])] OO Fɕ'o8X񑧞[Q4!GRFo`2t2@;~_ JHpJ!SBTpG&;@'Ќ*9FV'{I'"A' R'YpPDC k@etKpYٷ* -P+2'ɢE&D8\ A_RF :C#\R(ڲ! ٺ yz#{.sWapNܺfs+w$ō'5 08 'L B?.!pcY?%3 *!H$Z 0 < p p >jy |˸|ˎC A mJ\E;$(D7%L< ,KkBC5F".Pɡa ~(FP- KQ267&T<T<ǃkDc4Y2G$ RABGBlѭk$d< ӓ}#"A%q[D&-# OjiHN%P q g A K՘VXp`1[lm5QQ xPpT@n qE`D@{$ :0/ٜ+QaI\ >`ܠc0 չ#O-Pd qzVp:pFVplS-E0E  EQb@ M0 ^50> A` UM E<  Ep2d}6Apۋ`g(= I E :0.@PA^B^ @0_F# XH:@ :P`H($ N%=>G@ pI`PYJ0 Eh0HZPrr`! mU A `۴[°T@g X@ q^ ōn `n T0gPI@sPS :`AET.@TN q ^0-Ӡ NP\ڲ@ wM \@^ aIV@ g0 @\v1>,P&p`pJ`"?&  9@$ .!O=@/@N`: ٠@A :DAc8^P9_V 0R/EPz0 Ӡ DPJ?VjBiܡPΠI``l@EB? Epx Bߌ3x`

Vx@:0P݂: RE0I@ 8`EO: @ ^ ! p H1 -. `c۞01N@@Ұۚ1 p0@Nc O`";xWzSW|tdt%!/ ᱒Onu*q.H0zA ;c_&sԊ":ћ3y%AY?>Il+'b:ALtPYZ=>OoA\BȇOV2^z0P֬ @kaU_1ym's6x kMDxCLntz>R++Vg"@͉) C慆k T'9 2葅 #z([= ɋmb9J"Y) uH2I"9i!ه"'zIBXdU' zCy2,..b#>m0|oi*@|z(5] O}a| X+Ch*}`MS fjST|T0 4(}UE>byA(B\(B1! A,ct$ Qe\ X2 ܉Ơ "` B,yMЮD 4tHI恕١@J0#qB11178y@Poxt2yTFP+@!L L)| K*b  ?A&p@0SE':A $@f&_&>Q !@@ Jd"gE3RPŐ~ C@,+DP,8CT!$#X/}d@,yR#41 ~BP2! o8iB>&a"[4֢}cL>щGP H0^hʷ~Jb|~L`4&$Q B3`MA&*T} a6>R|C@2S!O#*B@:/-A# ^v:7ٺ)AvS> 6U#TOqJ5uMhT|u%u؈!d@CPl5bcC=ag3LJүg# Փ|wj|`mԟvm/l~kk4q (.XIx|!vy! (ZA#C BO"Pa%$2T * N8Q%|@r9-d ?y]Xc6 > >kxGM Ds# ,@jk$><F%QjEBnOjuܡYP-A]H&5@8 #40m^.~)APgM;?Uj}A+czk¯UA!TP x. =! "{ B(od z2!! .,HHbw?8G ;`N>Ұ Vm*/ >h $ڇ#Xzȅ J+8NH4K(5L {؇è/">X㖻E];H!A=<_JEӑ‰{фixA+lc /{ LLjV؇y&yzCl+o'o Gom{DȆH_Co"3@o(p 3ˇ #xY|h9 EhPtwЁ` tPlA@ (|@jX 8@ 3" s脖# }TR0K0m9A>{$%hӘR,SpD %̲+HBJ"zB8,R `: ́ ٔ3^(m؇`%94Dg1$|y 2 !0ش$rHz bH8L#|P Ѧ)l XSx1k,ȓ<Ӧo O}Ї@Uy1q<@gP( i$dXo7m @¯;{ sE@  [t b!"и?@x(*80[Iʌv+s"!hX$=چp " |y"bК~n "("W0 2/\ГT" JJ%L%1Ђ74ڑ {pv*DhC ?@|($%"H@Ք9M[ 9[(AHy0A2V9u*rM،" nЇ9DmJ uЇl@S}VwG'pӼ!htHР{C`_ N[[O<|p0:OE; p`8٘0;w@5y%Fٜ y9 7Hq ƳЂhu҄mЙZ(=1xq(9+v|tcZhV0'o=9x 9XUhv\ȄmHUXHL0Vk0hn89P  V0Rۙ1\s,#-QU\2I2ZȄbɘK \@_@Pzؙ~_r0`RHH@iV>_}Z6 c֭!b_^ n:29tFH9)9c9c:6]@5Є}/c;-_x(gc1A?c-d5,x-M,*ȭy,/R0P'k{‡ƒ],4dɏfe5N,Rެ{{[65#A[bɐe/ N/u B$tvt"Ӧy|> 9y/ ;espresso-5.1/PWgui-5.1/doc/pwdocs/user_guide/node8.html0000644000077300007730000001551612341333047023160 0ustar giannozzgiannozz 2.1 Download next up previous contents
Next: 2.2 Prerequisites Up: 2 Installation Previous: 2 Installation Contents


2.1 Download

Presently, QUANTUM ESPRESSO is distributed in source form; some precompiled executables (binary files) are provided for PWgui. Packages for the Debian Linux distribution are however made available by debichem developers. Stable releases of the QUANTUM ESPRESSO source package (current version is 5.1) can be downloaded from the Download section of www.quantum-espresso.org. If you plan to run on GPU machines, download the GPU-enabled version, also reachable from the same link.

Uncompress and unpack the base distribution using the command:

     tar zxvf espresso-X.Y.Z.tar.gz
(a hyphen before "zxvf" is optional) where X.Y.Z stands for the version number. If your version of tar doesn't recognize the "z" flag:
     gunzip -c espresso-X.Y.Z.tar.gz | tar xvf -
A directory espresso-X.Y.Z/ will be created.

Additional packages that are not included in the base distribution will be downloaded on demand at compile time, using make (see Sec.2.5). Note however that this will work only if the computer you are installing on is directly connected to the internet and has either wget or curl installed and working. If you run into trouble, manually download each required package into subdirectory archive/, not unpacking or uncompressing it: command make will take care of this during installation.

Package GWL needs a manual download and installation: please follow the instructions given at gww.qe-forge.org.

The bravest may access the development version via anonymous access to the Subversion (SVN) repository: qe-forge.org/gf/project/q-e/scmsvn, link ''Access Info'' on the left. See also the Developer Manual (Doc/developer_man.pdf), section ''Using SVN''. Beware: the development version is, well, under development: use at your own risk!

The QUANTUM ESPRESSO distribution contains several directories. Some of them are common to all packages:

Modules/ source files for modules that are common to all programs
include/ files *.h included by fortran and C source files
clib/ external libraries written in C
flib/ external libraries written in Fortran
install/ installation scripts and utilities
pseudo/ pseudopotential files used by examples
upftools/ converters to unified pseudopotential format (UPF)
Doc/ general documentation
archive/ contains plug-ins in .tar.gz form

while others are specific to a single package:

PW/ PWscf package
NEB/ PWneb package
PP/ PostProc package
PHonon/ PHonon package
PWCOND/ PWcond package
CPV/ CP package
atomic/ atomic package
GUI/ PWGui package

Finally, directory COUPLE/ contains code and documentation that is useful to call QUANTUM ESPRESSO programs from external codes.


next up previous contents
Next: 2.2 Prerequisites Up: 2 Installation Previous: 2 Installation Contents
paolo giannozzi 2014-05-28
espresso-5.1/PWgui-5.1/doc/pwdocs/INPUT_PROJWFC.html0000644000077300007730000002605512341333046022100 0ustar giannozzgiannozz

------------------------------------------------------------------------
INPUT FILE DESCRIPTION

Program: projwfc.x / PWscf / Quantum Espresso
------------------------------------------------------------------------


Purpose of projwfc.x:
    projects wavefunctions onto orthogonalized atomic wavefunctions,
    calculates Lowdin charges, spilling parameter, projected DOS
    (separated into up and down components for lSDA)
    alternatively, computes the local DOS(E), integrated in volumes
    given in input

Structure of the input data:
============================

   &PROJWFC
     ...
   /



========================================================================
NAMELIST: &PROJWFC

   +--------------------------------------------------------------------
   Variable:       prefix
   
   Type:           CHARACTER
   Description:    Prefix of input file produced by pw.x
                   (wavefunctions are needed).
   Default:        'pwscf'
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       outdir
   
   Type:           CHARACTER
   Description:    directory containing the input data,
                   i.e. the same as in pw.x
   Default:        value of the ESPRESSO_TMPDIR environment variable if set;
                   current directory ('./') otherwise
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       ngauss
   
   Type:           INTEGER
   Default:        0
   Description:    Type of gaussian broadening:
                       0 ... Simple Gaussian (default)
                       1 ... Methfessel-Paxton of order 1
                      -1 ... Marzari-Vanderbilt "cold smearing"
                     -99 ... Fermi-Dirac function
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       degauss
   
   Type:           REAL
   Default:        0.0
   Description:    gaussian broadening, Ry (not eV!)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      Emin, Emax
   
   Type:           REAL
   Default:        (band extrema)
   Description:    min & max energy (eV) for DOS plot
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       DeltaE
   
   Type:           REAL
   Description:    energy grid step (eV)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lsym
   
   Type:           LOGICAL
   Default:        .true.
   Description:    if true the projections are symmetrized
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       filpdos
   
   Type:           CHARACTER
   Description:    prefix for output files containing PDOS(E)
   Default:        (value of prefix variable)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       filproj
   
   Type:           CHARACTER
   Default:        (standard output)
   Description:    file containing the projections
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lwrite_overlaps
   
   Type:           LOGICAL
   Default:        .false.
   Description:    if .true., the overlap matrix of the atomic orbitals
                   prior to orthogonalization is written to the atomic_proj datafile.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lbinary_data
   
   Type:           LOGICAL
   Default:        .false.
   Description:    if .true., the atomic_proj datafile is written in binary fmt.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       kresolveddos
   
   Type:           LOGICAL
   Default:        .false.
   Description:    if .true. the k-resolved DOS is computed: not summed over
                   all k-points but written as a function of the k-point index.
                   In this case all k-point weights are set to unity
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       tdosinboxes
   
   Type:           LOGICAL
   Default:        .false.
   Description:    if .true. compute the local DOS integrated in volumes
                   volumes are defined as boxes with edges parallel
                   to the unit cell, containing the points of the
                   (charge density) FFT grid included within
                   irmin and irmax, in the three dimensions:
                   from irmin(j,n) to irmax(j,n) for j=1,2,3
                   (n=1,n_proj_boxes)
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       n_proj_boxes
   
   Type:           INTEGER
   Default:        1
   Description:    number of boxes where the local DOS is computed
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       irmin
   
   Type:           INTEGER
   Default:        1
   Description:    first point to be included in the box
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       irmax
   
   Type:           INTEGER
   Default:        0
   Description:    last point to be included in the box
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       plotboxes
   
   Type:           LOGICAL
   Default:        .false.
   Description:    if .true., the boxes are written in output as
                   as xsf files with 3D datagrids, valued 1.0
                   inside the box volume and 0 outside
                   (visualize them as isosurfaces with isovalue 0.5)
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================



:::: Notes

   
   ::: Format of output files
   
      Projections are written to standard output,
      and also to file filproj if given as input.
      
      The total DOS and the sum of projected DOS are written to file
      "filpdos".pdos_tot.
      
      * The format for the collinear, spin-unpolarized case and the
        non-collinear, spin-orbit case is:
            E DOS(E) PDOS(E)
            ...
      
      * The format for the collinear, spin-polarized case is:
            E DOSup(E) DOSdw(E)  PDOSup(E) PDOSdw(E)
            ...
      
      * The format for the non-collinear, non spin-orbit case is:
            E DOS(E) PDOSup(E) PDOSdw(E)
            ...
      
      In the collinear case and the non-collinear, non spin-orbit case
      projected DOS are written to file "filpdos".pdos_atm#N(X)_wfc#M(l),
      where N = atom number , X = atom symbol, M = wfc number, l=s,p,d,f
      (one file per atomic wavefunction found in the pseudopotential file)
      
      * The format for the collinear, spin-unpolarized case is:
            E LDOS(E) PDOS_1(E) ... PDOS_2l+1(E)
            ...
      
      where LDOS = \sum m=1,2l+1 PDOS_m(E)
      and PDOS_m(E) = projected DOS on atomic wfc with component m
      
      * The format for the collinear, spin-polarized case and the
        non-collinear, non spin-orbit case is as above with
        two components for both  LDOS(E) and PDOS_m(E)
      
      In the non-collinear, spin-orbit case (i.e. if there is at least one
      fully relativistic pseudopotential) wavefunctions are projected
      onto eigenstates of the total angular-momentum.
      Projected DOS are written to file "filpdos".pdos_atm#N(X)_wfc#M(l_j),
      where N = atom number , X = atom symbol, M = wfc number, l=s,p,d,f
      and j is the value of the total angular momentum.
      In this case the format is:
          E LDOS(E) PDOS_1(E) ... PDOS_2j+1(E)
          ...
      
      If kresolveddos=.true., the k-point index is prepended
      to the formats above, e.g. (collinear, spin-unpolarized case)
          ik E DOS(E) PDOS(E)
      
      All DOS(E) are in states/eV plotted vs E in eV
      

   
   ::: Orbital Order
   
      Order of m-components for each l in the output:
      
          1, cos(phi), sin(phi), cos(2*phi), sin(2*phi), .., cos(l*phi), sin(l*phi)
      
      where phi is the polar angle:x=r cos(theta)cos(phi), y=r cos(theta)sin(phi)
      This is determined in file flib/ylmr2.f90 that calculates spherical harmonics.
      
      for l=1:
        1 pz     (m=0)
        2 px     (real combination of m=+/-1 with cosine)
        3 py     (real combination of m=+/-1 with sine)
      
      for l=2:
        1 dz2    (m=0)
        2 dzx    (real combination of m=+/-1 with cosine)
        3 dzy    (real combination of m=+/-1 with sine)
        4 dx2-y2 (real combination of m=+/-2 with cosine)
        5 dxy    (real combination of m=+/-2 with sine)
      

   
   ::: Defining boxes for the Local DOS(E)
   
      Boxes are specified using the variables irmin and irmax:
      FFT grid points are included from irmin(j,n) to irmax(j,n)
      for j=1,2,3 and n=1,...,n_proj_boxes
      irmin and irmax range from 1 to nr1 or nr2 or nr3
      Values larger than nr1/2/3 or smaller than 1 are folded
      to the unit cell.
      If irmax<irmin FFT grid points are included from 1 to irmax
      and from irmin to nr1/2/3
      

   
   ::: Important notices
   
      * The tetrahedron method is presently not implemented.
      
      * Gaussian broadening is used in all cases:
      
          - if degauss is set to some value in namelist &projwfc, that value
            (and the optional value for ngauss) is used
      
          - if degauss is NOT set to any value in namelist &projwfc, the
            value of degauss and of ngauss are read from the input data
            file (they will be the same used in the pw.x calculations)
      
          - if degauss is NOT set to any value in namelist &projwfc, AND
            there is no value of degauss and of ngauss in the input data
            file, degauss=DeltaE (in Ry) and ngauss=0 will be used
      
      
      Obsolete variables, ignored:
          io_choice
          smoothing
      



    
espresso-5.1/PWgui-5.1/doc/pwdocs/INPUT_BANDS.html0000644000077300007730000001100312341333046021600 0ustar giannozzgiannozz

------------------------------------------------------------------------
INPUT FILE DESCRIPTION

Program: bands.x / PWscf / Quantum Espresso
------------------------------------------------------------------------


Purpose of bands.x:
    Rewrite the bands ordering them using the overlap
    of the wave-functions on neighbor k points
    and calculate properties of each eigen-function.

Presently it can calculate:

   (a) The expectation value of the spin operator on each spinor
       wave-function.
   (b) The symmetry properties of each wavefunction. With this option
       the bands are not ordered according to the overlap.

The input data of this program are read from standard input
or from a file and have the following format:


Structure of the input data:
============================

   &BANDS
     ...
   /



========================================================================
NAMELIST: &BANDS

   +--------------------------------------------------------------------
   Variable:       prefix
   
   Type:           CHARACTER
   Description:    prefix of files saved by program pw.x
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       outdir
   
   Type:           CHARACTER
   Description:    directory containing the input data,
                   i.e. the same as in pw.x
   Default:        value of the ESPRESSO_TMPDIR environment variable if set;
                   current directory ('./') otherwise
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       filband
   
   Type:           CHARACTER
   Description:    file "filband" contains the bands
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       spin_component
   
   Type:           INTEGER
   Description:    In the lsda case select:
                   
                      1 = spin-up
                      2 = spin-down
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lsigma(i), i=1,3
   
   Type:           LOGICAL
   Description:    If true writes a file filband.i with the expectation
                   values of the spin operator on the spinor wave-functions.
                   (only in the noncollinear case).
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       lsym
   
   Type:           LOGICAL
   Description:    If .true. the bands are classified according to the
                   irreducible representations of the small group of k. A
                   file "filband".rap with the same format of "filband"
                   is written.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       no_overlap
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. writes the eigenvalues in the output file
                   without changing their order.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variable:       plot_2d
   
   Type:           LOGICAL
   Default:        .false.
   Description:    If .true. writes the eigenvalues in the output file
                   in a 2D format readable by gnuplot. Band ordering is not
                   changed. Each band is written in a different file called
                   filband.# with the format:
                   xk, yk, energy
                   xk, yk, energy
                   ..  ..  ..
                   energies are written in eV and xk in units 2\pi/a.
   +--------------------------------------------------------------------
   
   +--------------------------------------------------------------------
   Variables:      firstk, lastk
   
   Type:           INTEGER
   Description:    if lsym=.true. makes the symmetry analysis only for k
                   points between firstk to lastk
   +--------------------------------------------------------------------
   
===END OF NAMELIST======================================================



    
espresso-5.1/PWgui-5.1/COPYING0000644000077300007730000004311012341332513016075 0ustar giannozzgiannozz GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. espresso-5.1/PWgui-5.1/NEWS0000644000077300007730000000437612341332513015554 0ustar giannozzgiannozzVersion: 5.0svn * adding bands.x and dos.x modules * note the syntax change for projwfc.x, bands.x, and dos.x, where the &INPUTPP namelist was changed to &PROJWFC, &BANDS, and &DOS, respectively Version: 4.2 * PWgui pages can be scrolled up and down with the mouse-bar * PWgui runs with Tcl/Tk 8.5 * syntax (variables) and help files completely updated * new "welcome" image Version: 4.0 * help files updated (completely) * LD1.X module fully completed * PH.X module reorganized into new pages * namelist string variables are automatically quoted (to tell to Guib that the variable is of string type, add the option: -validate string * no more error message when saving pw.x input file if if_pos() flags are not specified. * PWGUI enviromental variable is not mandatory anymore for source package Version: 3.0 * LD1.X module added, i.e., GUI for pseudo-potential generation * CHDENS.X module was removed: the chdens.x is now merged in pp.x * the PW.X module was updated to reflect new pw.x input Version: 2.1 * A "Run" menubutton was added. PWgui is now a complete PWscf GUI, and not only input manager. Features: - management of input files - display of atomic structures for pw.x input files with XCRYSDEN - running the calculations and display of atomic structures from pw.x output files with XCRYSDEN - display of properties from XSF files as calculated with chdens.x by XCRYSDEN * PWgui version was set equal to version of PWscf so that the compatibility of the two codes can be ascertained from the version number. The structure of the PWgui version number is now the following: X.Y.Z, where X.Y is PWscf version, and Z is the PWgui patch number (when Z=0, it is omitted). * PWgui updated: now compatible with PWscf version 2.1 Version: 0.6.2 * PWgui is available as self-contained, installation-free standalone executable which run out of the box * a few small bug fixes Version: 0.6.1 * adding internal EDITOR and PAGER to PWgui (better porting to non-unix systems) Version: 0.6.0 * PWgui compatible with PWscf 2.0 * D3.X module added * PWgui is avaiable via anonymous CVS * There is now a `NEWS' file (this one), giving a history of user-visible changes. espresso-5.1/PWgui-5.1/modules/0000755000077300007730000000000012341333047016516 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/atomic/0000755000077300007730000000000012341333047017772 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/atomic/atomic-help.tcl0000644000077300007730000013025012341332513022676 0ustar giannozzgiannozz # # Help-file automatically created by helpdoc utility # # !!! DO NOT EDIT: CHANGES WILL BE LOST !!! # # ------------------------------------------------------------------------ help title -helpfmt helpdoc -helptext {
  •  Variable: title

  •  Type: CHARACTER

  •  Status: OPTIONAL

  •  Description:
  •  A string describing the job.
             
} # ------------------------------------------------------------------------ help zed -helpfmt helpdoc -helptext {
  •  Variable: zed

  •  Type: REAL

  •  See: atom

  •  Description:
  • The nuclear charge (1 < zed < 100).
    
    IMPORTANT:
    Specify either zed OR atom, not both!
                
} # ------------------------------------------------------------------------ help atom -helpfmt helpdoc -helptext {
  •  Variable: atom

  •  Type: CHARACTER

  •  See: zed

  •  Description:
  • Atomic symbol: atom='H', 'He', 'Be', etc.
    
    IMPORTANT:
    Specify either atom OR zed, not both!
                
} # ------------------------------------------------------------------------ help xmin -helpfmt helpdoc -helptext {
  •  Variable: xmin

  •  Type: REAL

  •  Default: -7.0 if iswitch>1 or rel=0, -8.0 otherwise

  •  See: dx

  •  Description:
  •  Radial grid parameter.
                
} # ------------------------------------------------------------------------ help dx -helpfmt helpdoc -helptext {
  •  Variable: dx

  •  Type: REAL

  •  Default: 0.0125 if iswitch>1, 0.008 otherwise

  •  Description:
  • Radial grid parameter.
    
    The radial grid is: r(i+1) = exp(xmin+i*dx)/zed  a.u.
                
} # ------------------------------------------------------------------------ help rmax -helpfmt helpdoc -helptext {
  •  Variable: rmax

  •  Type: REAL

  •  Default: 100.0 a.u.

  •  Description:
  •  Outermost grid point.
                
} # ------------------------------------------------------------------------ help beta -helpfmt helpdoc -helptext {
  •  Variable: beta

  •  Type: REAL

  •  Default: 0.2

  •  Description:
  •  parameter for potential mixing
             
} # ------------------------------------------------------------------------ help tr2 -helpfmt helpdoc -helptext {
  •  Variable: tr2

  •  Type: REAL

  •  Default: 1e-14

  •  Description:
  •  convergence threshold for scf
             
} # ------------------------------------------------------------------------ help iswitch -helpfmt helpdoc -helptext {
  •  Variable: iswitch

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • 1    all-electron calculation
    2    PP test calculation
    3    PP generation
    4    LDA-1/2 correction, needs a previously generated PP file
             
} # ------------------------------------------------------------------------ help nld -helpfmt helpdoc -helptext {
  •  Variable: nld

  •  Type: INTEGER

  •  Description:
  •  the number of logarithmic derivatives to be calculated
                
} # ------------------------------------------------------------------------ help rlderiv -helpfmt helpdoc -helptext {
  •  Variable: rlderiv

  •  Type: REAL

  •  Description:
  •  radius (a.u.) at which logarithmic derivatives are calculated
                
} # ------------------------------------------------------------------------ grouphelp {eminld emaxld} -helpfmt helpdoc -helptext {
  •  Variables: eminld, emaxld

  •  Type: REAL

  •  Description:
  • Energy range (min, max energy, in Ry) at which
    logarithmic derivatives are calculated.
                
} # ------------------------------------------------------------------------ help deld -helpfmt helpdoc -helptext {
  •  Variable: deld

  •  Type: REAL

  •  Description:
  • Delta e (Ry) of energy for logarithmic derivatives.
                
} # ------------------------------------------------------------------------ help rpwe -helpfmt helpdoc -helptext {
  •  Variable: rpwe

  •  Type: REAL

  •  Default: rlderiv

  •  Description:
  •  radius (a.u.) at which partial wave expansions are calculated
                
} # ------------------------------------------------------------------------ help rel -helpfmt helpdoc -helptext {
  •  Variable: rel

  •  Type: INTEGER

  •  Default: 0 for Z <= 18; 1 for Z > 18

  •  Description:
  • 0 ... non relativistic calculation
    1 ... scalar relativistic calculation
    2 ... full relativistic calculation with spin-orbit
             
} # ------------------------------------------------------------------------ help lsmall -helpfmt helpdoc -helptext {
  •  Variable: lsmall

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • if .true. writes on files the small component
             
} # ------------------------------------------------------------------------ help max_out_wfc -helpfmt helpdoc -helptext {
  •  Variable: max_out_wfc

  •  Type: INTEGER

  •  Default: 7

  •  Description:
  • Maximum number of atomic wavefunctions written in the output
    file.
             
} # ------------------------------------------------------------------------ help noscf -helpfmt helpdoc -helptext {
  •  Variable: noscf

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • if .true. the charge is not computed. The occupations are
    not used and the eigenvalues and eigenfunctions are those
    of a hydrogen-like atom.
             
} # ------------------------------------------------------------------------ help lsd -helpfmt helpdoc -helptext {
  •  Variable: lsd

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • 0 ... non spin polarized calculation
    1 ... spin-polarized calculation
    
    BEWARE:
    not allowed if iswitch=3 (PP generation) or with full
    relativistic calculation
             
} # ------------------------------------------------------------------------ help dft -helpfmt helpdoc -helptext {
  •  Variable: dft

  •  Type: CHARACTER

  •  Description:
  • Exchange-correlation functional.
    
    Examples:
    'PZ'    Perdew and Zunger formula for LDA
    'PW91'  Perdew and Wang GGA
    'BP'    Becke and Perdew GGA
    'PBE'   Perdew, Becke and Ernzerhof GGA
    'BLYP'  ...
    
    For the complete list, see module "functionals" in ../flib/
    The default is 'PZ' for all-electron calculations,
    it is read from the PP file in a PP calculation.
             
} # ------------------------------------------------------------------------ help latt -helpfmt helpdoc -helptext {
  •  Variable: latt

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • 0 ... no Latter correction
    1 ... apply Latter correction
             
} # ------------------------------------------------------------------------ help isic -helpfmt helpdoc -helptext {
  •  Variable: isic

  •  Type: INTEGER

  •  Default: 0

  •  Status: only for all-electron calculation

  •  Description:
  • 0 ... no Self-interaction correction
    1 ... apply Self-interaction correction
             
} # ------------------------------------------------------------------------ help rytoev_fact -helpfmt helpdoc -helptext {
  •  Variable: rytoev_fact

  •  Type: REAL

  •  Default: as specified in file Modules/constants.f90

  •  Description:
  • Factor used to convert Ry into eV.
             
} # ------------------------------------------------------------------------ help cau_fact -helpfmt helpdoc -helptext {
  •  Variable: cau_fact

  •  Type: REAL

  •  Default: as specified in file Modules/constants.f90

  •  Description:
  • Speed of light in a.u..
    
    (Be careful the default value is always used in the
     relativistic exchange.)
             
} # ------------------------------------------------------------------------ help vdw -helpfmt helpdoc -helptext {
  •  Variable: vdw

  •  Type: LOGICAL

  •  Default: .false.

  •  Status: Gradient-corrected DFT not yet implemented.

  •  Description:
  • If .true., the frequency dependent polarizability and van der
    Waals coefficient C6 will be computed in Thomas-Fermi and
    von Weizsaecker approximation(only for closed-shell ions).
             
} # ------------------------------------------------------------------------ help prefix -helpfmt helpdoc -helptext {
  •  Variable: prefix

  •  Type: CHARACTER

  •  Default: 'ld1'

  •  Description:
  • Prefix for file names - only for output file names
    containing the orbitals, logarithmic derivatives, tests
    See below for file names and the content of the file.
             
} # ------------------------------------------------------------------------ help verbosity -helpfmt helpdoc -helptext {
  •  Variable: verbosity

  •  Type: CHARACTER

  •  Default: 'low'

  •  Description:
  • 'low' or 'high'
    
    if 'high' with iswitch=2,3 prints separately core and
    valence contributions to the energies. Print the
    frozen-core energy.
             
} # ------------------------------------------------------------------------ help file_charge -helpfmt helpdoc -helptext {
  •  Variable: file_charge

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  • Name of the file where the code writes the all-electron
    total charge. No charge is written if file_charge=' '.
             
} # ------------------------------------------------------------------------ help config -helpfmt helpdoc -helptext {
  •  Variable: config

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  • A string with the electronic configuration.
    
    Example:
      '[Ar] 3d10 4s2 4p2.5'
    
    * If lsd=1, spin-up and spin-down state may appear twice
      with the respective occupancy: 3p4 3p2 = 4 up,
      2 down. Otherwise, the Hund's rule is assumed.
    
    * If rel=2, states with jj=l-1/2 are filled first.
      If a state appears twice, the first one has jj=l-1/2,
      the second one jj=l+1/2 (except S states)
      (Use rel_dist if you want to average the electrons
      over all available states.)
    
    * If config='default' the code uses zed to set the ground
      state electronic configuration for the atom.
    
    Negative occupancies are used to flag unbound states;
    they are not actually used.
             
} # ------------------------------------------------------------------------ help relpert -helpfmt helpdoc -helptext {
  •  Variable: relpert

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. the relativistic corrections to the non-relativistic
    Kohn-Sham energy levels (rel=0 .and. lsd=0) are computed using
    first-order perturbation theory in all-electron calculations.
    The corrections consist of the following terms:
       E_vel: velocity (p^4) correction
       E_Dar: Darwin term
       E_S-O: spin-orbit coupling
    The spin-orbit term vanishes for s-electron states and gives
    rise to a splitting of (2*l+1)*E_S-O for the other states.
    The separate contributions are printed only if verbosity='high'.
    
    Formulas and notation are based on the Herman-Skillman book:
    F. Herman and S. Skillman, "Atomic Structure Calculations",
    Prentice-Hall, Inc., Englewood Cliffs, New Jersey, 1963
             
} # ------------------------------------------------------------------------ help rel_dist -helpfmt helpdoc -helptext {
  •  Variable: rel_dist

  •  Type: CHARACTER

  •  Default: 'energy'

  •  Description:
  • 'energy' or 'average'
    
    * if 'energy' the relativistic l-1/2 states are filled first.
    
    * if 'average' the electrons are uniformly distributed
      among all the states with the given l.
             
} # ------------------------------------------------------------------------ help write_coulomb -helpfmt helpdoc -helptext {
  •  Variable: write_coulomb

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true., a fake pseudo-potential file with name X.UPF,
    where X is the atomic symbol, is written. It contains
    the radial grid and the wavefunctions as specified in input,
    plus the info needed to build the Coulomb potential
    for an all-electron calculation - for testing only.
             
} # ------------------------------------------------------------------------ help nwf -helpfmt helpdoc -helptext {
  •  Variable: nwf

  •  Type: INTEGER

  •  Description:
  • number of wavefunctions
                         
} # ------------------------------------------------------------------------ help AE_wfs -helpfmt helpdoc -helptext {
  •  Variable: nl

  •  Type: CHARACTER

  •  Description:
  •  wavefunction label (e.g. 1s, 2s, etc.)
                            
  •  Variable: n

  •  Type: INTEGER

  •  Description:
  •  principal quantum number
                            
  •  Variable: l

  •  Type: INTEGER

  •  Description:
  •  angular quantum number
                            
  •  Variable: oc

  •  Type: REAL

  •  Description:
  •  occupation number
                            
  •  Variable: isw

  •  Type: INTEGER

  •  Description:
  •  the spin index (1-2) used only in the lsda case
                            
  •  Variable: jj

  •  Type: REAL

  •  Description:
  • The total angular momentum (0.0 is allowed for complete
    shells: the codes fills 2l states with jj=l-1/2,
    2l+2 with jj=l+1/2).
                            
} # ------------------------------------------------------------------------ help zval -helpfmt helpdoc -helptext {
  •  Variable: zval

  •  Type: REAL

  •  Default: (calculated)

  •  Description:
  • Valence charge.
    
    zval is automatically calculated from available data.
    If the value of zval is provided in input, it will be
    checked versus the calculated value. The only case in
    which you need to explicitly provide the value of zval
    for noninteger zval (i.e. half core-hole pseudo-potentials).
             
} # ------------------------------------------------------------------------ help pseudotype -helpfmt helpdoc -helptext {
  •  Variable: pseudotype

  •  Type: INTEGER

  •  Description:
  • 1 ... norm-conserving, single-projector PP
          IMPORTANT: if pseudotype=1 all calculations are done
          using the SEMILOCAL form, not the separable nonlocal form
    
    2 ... norm-conserving PP in separable form (obsolescent)
          All calculations are done using SEPARABLE non-local form
          IMPORTANT: multiple projectors allowed but not properly
          implemented, use only if you know what you are doing
    
    3 ... ultrasoft PP or PAW
             
} # ------------------------------------------------------------------------ help file_pseudopw -helpfmt helpdoc -helptext {
  •  Variable: file_pseudopw

  •  Type: CHARACTER

  •  Status: REQUIRED

  •  Description:
  • File where the generated PP is written.
    
    * if the file name ends with "upf" or "UPF",
    or in any case for spin-orbit PP (rel=2),
    the file is written in UPF format;
    
    * if the file name ends with 'psp' it is
    written in native CPMD format (this is currently
    an experimental feature); otherwise it is written
    in the old "NC" format if pseudotype=1, or
    in the old RRKJ format if pseudotype=2 or 3
    (no default, must be specified).
             
} # ------------------------------------------------------------------------ help file_recon -helpfmt helpdoc -helptext {
  •  Variable: file_recon

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  • File containing data needed for GIPAW reconstruction
    of all-electron wavefunctions from PP results.
    If you want to use additional states to perform the
    reconstruction, add them at the end of the list
    of all-electron states.
             
} # ------------------------------------------------------------------------ help lloc -helpfmt helpdoc -helptext {
  •  Variable: lloc

  •  Type: INTEGER

  •  Default: -1

  •  Description:
  • Angular momentum of the local channel.
    
    * lloc=-1 or lloc=-2 pseudizes the all-electron potential
      if lloc=-2 the original recipe of Troullier-Martins
      is used (zero first and second derivatives at r=0)
    * lloc>-1 uses the corresponding channel as local PP
    
    NB: if lloc>-1, the corresponding channel must be the last in the
    list of wavefunctions appearing after the namelist &inputp
    In the relativistic case, if lloc > 0 both the j=lloc-1/2 and
    the j=lloc+1/2 wavefunctions must be at the end of the list.
             
} # ------------------------------------------------------------------------ help rcloc -helpfmt helpdoc -helptext {
  •  Variable: rcloc

  •  Type: REAL

  •  Status: Must be specified only if lloc=-1, otherwise the corresponding value of rcut is used.

  •  Description:
  • Matching radius (a.u.) for local pseudo-potential (no default).
             
} # ------------------------------------------------------------------------ help nlcc -helpfmt helpdoc -helptext {
  •  Variable: nlcc

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. produce a PP with the nonlinear core
    correction of Louie, Froyen, and Cohen
    [PRB 26, 1738 (1982)].
             
} # ------------------------------------------------------------------------ help new_core_ps -helpfmt helpdoc -helptext {
  •  Variable: new_core_ps

  •  Type: LOGICAL

  •  Default: .false.

  •  Status: requires nlcc=.true.

  •  Description:
  • If .true. pseudizes the core charge with bessel functions.
             
} # ------------------------------------------------------------------------ help rcore -helpfmt helpdoc -helptext {
  •  Variable: rcore

  •  Type: REAL

  •  Description:
  • Matching radius (a.u.) for the smoothing of the core charge.
    If not specified, the matching radius is determined
    by the condition:  rho_core(rcore) = 2*rho_valence(rcore)
             
} # ------------------------------------------------------------------------ help tm -helpfmt helpdoc -helptext {
  •  Variable: tm

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • * .true. for Troullier-Martins pseudization [PRB 43, 1993 (1991)]
    
    * .false. for Rappe-Rabe-Kaxiras-Joannopoulos pseudization
      [PRB 41, 1227 (1990), erratum PRB 44, 13175 (1991)]
             
} # ------------------------------------------------------------------------ help rho0 -helpfmt helpdoc -helptext {
  •  Variable: rho0

  •  Type: REAL

  •  Default: 0.0

  •  Description:
  • Charge at the origin: when the Rappe-Rabe-Kaxiras-Joannopoulos
    method with 3 Bessel functions fails, specifying rho0 > 0
    may allow to override the problem (using 4 Bessel functions).
    Typical values are in the order of 0.01-0.02
             
} # ------------------------------------------------------------------------ help lpaw -helpfmt helpdoc -helptext {
  •  Variable: lpaw

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. produce a PAW dataset, experimental feature
    only for pseudotype=3
             
} # ------------------------------------------------------------------------ help which_augfun -helpfmt helpdoc -helptext {
  •  Variable: which_augfun

  •  Type: CHARACTER

  •  Default: 'AE' for Vanderbilt-Ultrasoft pseudo-potentials and 'BESSEL' for PAW datasets.

  •  Description:
  • If different from 'AE' the augmentation functions are pseudized
    before rmatch_augfun. The pseudization options are:
    
    * 'PSQ'        Use Bessel functions to pseudize Q
                   from the origin to rmatch_augfun.
    
    These features are available only for PAW:
    
    * 'BESSEL'     Use Bessel functions to pseudize the Q.
    * 'GAUSS'      Use 2 Gaussian functions to pseudize the Q.
    * 'BG'         Use original Bloechl's recipe with a single gaussian.
    
    Note: if lpaw is true and which_augfun is set to AE real all-
    electron charge will be used, which will produce extremely
    hard augmentation.
                
} # ------------------------------------------------------------------------ help rmatch_augfun -helpfmt helpdoc -helptext {
  •  Variable: rmatch_augfun

  •  Type: REAL

  •  Default: 0.5 a.u.

  •  Status: Used only if which_augfun is different from 'AE'.

  •  Description:
  • Pseudization radius for the augmentation functions. Presently
    it has the same value for all L.
                
} # ------------------------------------------------------------------------ help rmatch_augfun_nc -helpfmt helpdoc -helptext {
  •  Variable: rmatch_augfun_nc

  •  Type: REAL

  •  Default: .false.

  •  Status: Used only if which_augfun is 'PSQ'.

  •  Description:
  • If .true. the augmentation functions are pseudized
    from the origin to min(rcut(ns),rcut(ns1)) where ns
    and ns1 are the two channels for that Q. In this case
    rmatch_augfun is not used.
                
} # ------------------------------------------------------------------------ help lsave_wfc -helpfmt helpdoc -helptext {
  •  Variable: lsave_wfc

  •  Type: LOGICAL

  •  Default: .false. if .not. lpaw, otherwise .true.

  •  Description:
  • Set it to .true. to save all-electron and pseudo wavefunctions
    used in the pseudo-potential generation in the UPF file. Only
    works for UPFv2 format.
             
} # ------------------------------------------------------------------------ help lgipaw_reconstruction -helpfmt helpdoc -helptext {
  •  Variable: lgipaw_reconstruction

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • Set it to .true. to generate pseudo-potentials containing the
    additional info required for reconstruction of all-electron
    orbitals, used by GIPAW. You will typically need to specify
    additional projectors beyond those used in the generation of
    pseudo-potentials. You should also specify 'file_recon'.
    
    All projectors used in the reconstruction must be listed BOTH
    in the test configuration after namelist &test AND in the
    all-electron configuration (variable 'config', namelist &inputp,
    Use negative occupancies for projectors on unbound states). The
    core radii in the test configuration should be the same as in
    the pseudo-potential generation section and will be used as the
    radius of reconstruction. Projectors not used to generate the
    pseudo-potential should have zero occupation number.
             
} # ------------------------------------------------------------------------ help use_paw_as_gipaw -helpfmt helpdoc -helptext {
  •  Variable: use_paw_as_gipaw

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • When generating a PAW dataset, setting this option to .true. will
    save the core all-electron wavefunctions to the UPF file.
    The GIPAW reconstruction to be performed using the PAW data and
    projectors for the valence wavefunctions.
    
    In the default case, the GIPAW valence wavefunction and projectors
    are independent from the PAW ones and must be then specified as
    explained above in lgipaw_reconstruction.
    
    Setting this to .true. always implies lgipaw_reconstruction = .true.
             
} # ------------------------------------------------------------------------ help author -helpfmt helpdoc -helptext {
  •  Variable: author

  •  Type: CHARACTER

  •  Default: 'anonymous'

  •  Description:
  •  Name of the author.
             
} # ------------------------------------------------------------------------ help file_chi -helpfmt helpdoc -helptext {
  •  Variable: file_chi

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  •  file containing output PP chi functions
             
} # ------------------------------------------------------------------------ help file_beta -helpfmt helpdoc -helptext {
  •  Variable: file_beta

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  •  file containing output PP beta functions
             
} # ------------------------------------------------------------------------ help file_qvan -helpfmt helpdoc -helptext {
  •  Variable: file_qvan

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  •  file containing output PP qvan functions
             
} # ------------------------------------------------------------------------ help file_screen -helpfmt helpdoc -helptext {
  •  Variable: file_screen

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  •  file containing output screening potential
             
} # ------------------------------------------------------------------------ help file_core -helpfmt helpdoc -helptext {
  •  Variable: file_core

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  •  file containing output total and core charge
             
} # ------------------------------------------------------------------------ help file_wfcaegen -helpfmt helpdoc -helptext {
  •  Variable: file_wfcaegen

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  •  file with the all-electron wfc for generation
             
} # ------------------------------------------------------------------------ help file_wfcncgen -helpfmt helpdoc -helptext {
  •  Variable: file_wfcncgen

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  •  file with the norm-conserving wfc for generation
             
} # ------------------------------------------------------------------------ help file_wfcusgen -helpfmt helpdoc -helptext {
  •  Variable: file_wfcusgen

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  •  file with the ultra-soft wfc for generation
             
} # ------------------------------------------------------------------------ help nwfs -helpfmt helpdoc -helptext {
  •  Variable: nwfs

  •  Type: INTEGER

  •  Description:
  •  number of wavefunctions to be pseudized
                         
} # ------------------------------------------------------------------------ help PP_wfs -helpfmt helpdoc -helptext {
  •  Variable: nls

  •  Type: CHARACTER

  •  Description:
  • Wavefunction label (same as in the all-electron configuration).
                            
  •  Variable: nns

  •  Type: INTEGER

  •  Description:
  • Principal quantum number (referred to the PSEUDOPOTENTIAL case;
    nns=1 for lowest s, nns=2 for lowest p, and so on).
                            
  •  Variable: lls

  •  Type: INTEGER

  •  Description:
  •  Angular momentum quantum number.
                            
  •  Variable: ocs

  •  Type: REAL

  •  Description:
  •  Occupation number  (same as in the all-electron configuration).
                            
  •  Variable: ener

  •  Type: REAL

  •  Description:
  • Energy (Ry) used to pseudize the corresponding state.
    If 0.d0, use the one-electron energy of the all-electron state.
    Do not use 0.d0 for unbound states!
                            
  •  Variable: rcut

  •  Type: REAL

  •  Description:
  •  Matching radius (a.u.) for norm conserving PP.
                            
  •  Variable: rcutus

  •  Type: REAL

  •  Description:
  •  Matching radius (a.u.) for ultrasoft PP - only for pseudotype=3.
                            
  •  Variable: jjs

  •  Type: REAL

  •  Description:
  •  The total angular momentum (0.0 is allowed for complete shells).
                            
} # ------------------------------------------------------------------------ help nconf -helpfmt helpdoc -helptext {
  •  Variable: nconf

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  •  the number of configurations to be tested. For iswitch = 4 nconf=2
             
} # ------------------------------------------------------------------------ help file_pseudo -helpfmt helpdoc -helptext {
  •  Variable: file_pseudo

  •  Type: CHARACTER

  •  Default: ' '

  •  Status: ignored if iswitch=3

  •  Description:
  • File containing the PP.
    
    * If the file name contains  ".upf" or ".UPF",
    the file is assumed to be in UPF format;
    
    * else if the file name contains ".rrkj3" or ".RRKJ3",
    the old RRKJ format is first tried;
    
    * otherwise, the old NC format is read.
    
    IMPORTANT: in the latter case, all calculations are done
    using the SEMILOCAL form, not the separable nonlocal form.
    Use the UPF format if you want to test the separable form!
             
} # ------------------------------------------------------------------------ grouphelp {ecutmin ecutmax decut} -helpfmt helpdoc -helptext {
  •  Variables: ecutmin, ecutmax, decut

  •  Type: REAL

  •  Default: decut=5.0 Ry; ecutmin=ecutmax=0Ry

  •  Status: specify ecutmin and ecutmax if you want to perform this test

  •  Description:
  • Parameters (Ry) used for test with a basis set of spherical
    Bessel functions j_l(qr) . The hamiltonian at fixed scf
    potential is diagonalized for various values of ecut:
    ecutmin, ecutmin+decut, ecutmin+2*decut ... up to ecutmax.
    This yields an indication of convergence with the
    corresponding plane-wave cutoff in solids, and shows
    in an unambiguous way if there are "ghost" states
             
} # ------------------------------------------------------------------------ help rm -helpfmt helpdoc -helptext {
  •  Variable: rm

  •  Type: REAL

  •  Default: 30 a.u.

  •  Description:
  •  Radius of the box used with spherical Bessel functions.
             
} # ------------------------------------------------------------------------ help configts -helpfmt helpdoc -helptext {
  •  Variables: configts(i), i=1,nconf

  •  Type: CHARACTER

  •  Description:
  • A string containing the test valence electronic
    configuration nc, nc=1,nconf. Same syntax as for "config".
    If configts(i) is not set, the electron configuration
    is read from the cards following the namelist.
             
} # ------------------------------------------------------------------------ help lsdts -helpfmt helpdoc -helptext {
  •  Variables: lsdts(i), i=1,nconf

  •  Type: INTEGER

  •  Default: 1

  •  See: lsd

  •  Description:
  • 0 or 1. It is the value of lsd used in the i-th test.
    Allows to make simultaneously spin-polarized and
    spin-unpolarized tests.
             
} # ------------------------------------------------------------------------ help frozen_core -helpfmt helpdoc -helptext {
  •  Variable: frozen_core

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. only the core wavefunctions of the first
    configuration are calculated. The eigenvalues, orbitals
    and energies of the other configurations are calculated
    with the core of the first configuration.
    The first configuration must be spin-unpolarized.
             
} # ------------------------------------------------------------------------ help rcutv -helpfmt helpdoc -helptext {
  •  Variable: rcutv

  •  Type: REAL

  •  Default: -1.0

  •  Description:
  • Cutoff distance (CUT) for the inclusion of LDA-1/2 potential.
                      Needed (mandatory) only if iswitch = 4
             
} # ------------------------------------------------------------------------ grouphelp {nwfts_1 nwfts_2 nwfts_3 nwfts_4 nwfts_5 nwfts_6 nwfts_7 nwfts_8 nwfts_9 nwfts_10 nwfts_11 nwfts_12 nwfts_13 nwfts_14 nwfts_15 nwfts_16 nwfts_17 nwfts_18 nwfts_20 nwfts_19} -helpfmt helpdoc -helptext {
  •  Variable: nwfts

  •  Type: INTEGER

  •  Description:
  •  number of wavefunctions
                         
} # ------------------------------------------------------------------------ grouphelp {test_wfs_10 test_wfs_11 test_wfs_12 test_wfs_13 test_wfs_14 test_wfs_15 test_wfs_16 test_wfs_17 test_wfs_18 test_wfs_20 test_wfs_19 test_wfs_1 test_wfs_2 test_wfs_3 test_wfs_4 test_wfs_5 test_wfs_6 test_wfs_7 test_wfs_8 test_wfs_9} -helpfmt helpdoc -helptext {
  •  Variable: elts

  •  Type: CHARACTER

  •  See: nls

  •  Variable: nnts

  •  Type: INTEGER

  •  See: nns

  •  Variable: llts

  •  Type: INTEGER

  •  See: lls

  •  Variable: octs

  •  Type: REAL

  •  See: ocs

  •  Variable: enerts

  •  Type: REAL

  •  Status: not used

  •  Variable: rcutts

  •  Type: REAL

  •  Status: not used

  •  Variable: rcutusts

  •  Type: REAL

  •  Status: not used

  •  Variable: iswts

  •  Type: INTEGER

  •  Description:
  •  spin index (1 or 2, used in lsda case)
                            
  •  Variable: jjts

  •  Type: REAL

  •  Description:
  •  total angular momentum of the state
                            
} espresso-5.1/PWgui-5.1/modules/atomic/commands.tcl0000644000077300007730000000333012341332513022273 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # partial check if input file has an acceptable format # ------------------------------------------------------------------------ proc ::pwscf::atomicReadFilter {moduleObj channel} { # ld1.x formatted input file should have the &INPUT namelist set status [::pwscf::readFilter::findNamelists $moduleObj $channel INPUT errMsg] if { $status == 0 } { $moduleObj readFileWrongFormat ld1.x $errMsg } return [readFilter::default $moduleObj $channel logical] } # ------------------------------------------------------------------------ # dft is a namelist variable # We need to remove dft_ and replace dft_ with dft # ------------------------------------------------------------------------ proc ::pwscf::atomicDFTFilter {moduleObj outputContent} { set result {} foreach line [split $outputContent \n] { if { [string match {*'REPLACE_ME'*} $line] } { # we skip this line } elseif { [string match {*dft_ *} $line] } { # replace dft_ with dft # usage: regsub ?switches? exp string subSpec varName # # regsub == regular-expression-substitution # exp -- regular expresion to match # string -- string to make the regsub # subSpec -- what to do with the portion of string that matches # expression (i.e. this is the replacement string) # varName -- where to store the result regsub -- dft_ $line dft newLine append result $newLine\n } else { # simply append append result $line\n } } return $result } #--- espresso-5.1/PWgui-5.1/modules/atomic/atomic.tcl0000644000077300007730000003411312341332513021751 0ustar giannozzgiannozzsource commands.tcl set ::guib::settings(filename_only_tail) 1 # maximum number of nconf set ::pwscf::atomic_max_nconf 20 module LD1\#auto -title "PWSCF GUI: module LD1.x" -script { readfilter ::pwscf::atomicReadFilter writefilter ::pwscf::atomicDFTFilter # # PAGE: General # page general -name "General" { # namelist input -name "INPUT" { # required { var iswitch { -label "Type of calculation (iswitch):" -widget radiobox -textvalue { "All-Electron" "PseudoPotential Generation" "PseudoPotential Test" "LDA-1/2 correction" } -value {1 3 2 4} -default "All-Electron" } var zed { -label "Nuclear charge (zed):" -validate fortranreal } var atom { -label "Atomic symbol (atom):" -fmt %S -validate string } var config { -label "Electronic configuration (config):" -fmt %S -validate string } var relpert { -label "Compute relativistic corrections to non-relativistic\nKohn-Sham energy levels (relpert):" -widget radiobox -textvalue {Yes No} -value {.true. .false.} } var rel_dist { -label "How to fill the electronic states (rel_dist):" -value {'energy' 'average'} -textvalue { "by increasing energy of states " "distrubute electrons uniformly " } -widget optionmenu } var write_coulomb { -label "Write a fake pseuopotential (write_coulomb):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var rel { -label "Relativistic Effects (rel):" -widget radiobox -textvalue {"Non Relativistic (Schroedinger)" "Scalar Relativistic" "Full Relativistic (Dirac)"} -value {0 1 2} } var lsmall { -label "Write on files the small component (lsmall):" -widget radiobox -textvalue {Yes No} -value {.true. .false.} } var max_out_wfc { -label "Maximum number of atomic wavefunctions written (max_out_wfc):" -validate posint -widget spinint } var noscf { -label "Skip charge calculation and ignore the occupations (noscf):" -widget radiobox -textvalue {Yes No} -value {.true. .false.} } var lsd { -label "LSDA Spin Polarization (lsd):" -widget radiobox -textvalue {"No" "Yes"} -value {0 1} -default 0 } var dft { -label "Exchange-Correlation (dft):" -widget radiobox -textvalue {"Ceperley-Alder LDA, Perdew-Zunger data (PZ)" "Perdew-Wang GGA (PW91)" "Becke-Perdew GGA (BP)" "Perdew-Becke-Ernzerhof (PBE)" "Becke-Lee-Yang-Parr (BLYP)" "Other" } -value {'PZ' 'PW91' 'BP' 'PBE' 'BLYP' 'REPLACE_ME'} } var dft_ { -label "Enter Exchange-Correlation Functional (dft_):" -fmt %S -validate string } } # optional { var title { -label "Job name or Comment (optional):" -fmt %S -validate string } var prefix { -label "Prefix for output file names (prefix):" -fmt %S -validate string } var verbosity { -label "Verbosity of output (verbosity):" -textvalue {low high} -value {'low' 'high'} -widget radiobox } var file_charge { -widget entryfileselectquote -label "Name of the file containing the all-electron total charge (file_charge):" -fmt %S -validate string } var beta { -label "Mixing parameter for self-consistency (beta):" -validate fortranposreal } var tr2 { -label "Convergence Threshold for self-consistency (tr2):" -validate fortranposreal } var latt { -label "Latter Correction (latt):" -widget radiobox -textvalue {"No" "Yes"} -value {0 1} -default 0 } var isic { -label "Self-Interaction Correction (isic):" -widget radiobox -textvalue {"No" "Yes"} -value {0 1} -default 0 } var rytoev_fact { -label "Conversion factor from Ry to eV (rytoev_fact):" -validate fortranposreal } var cau_fact { -label "Speed of light in a.u. (cau_fact):" -validate fortranposreal } var vdw { -label "Calculation of van der Waals coefficients:" -widget radiobox -textvalue {"No" "Yes"} -value {.true. .false.} -default .false. } separator -label "--- Grid: r(i)= exp (xmin + (i-1)*dx) / Z ---" var xmin { -label "Grid parameter (xmin):" -validate fortrannegreal } var dx { -label "Grid parameter (dx):" -validate fortranposreal } var rmax { -label "Grid parameter (rmax):" -validate fortranposreal } separator -label "--- Parameters for Logarithmic derivative calculation ---" var nld { -label "Number of logarithmic derivatives to calculate (nld):" -widget optionmenu -textvalue { "None" "1" "2" "3" "4" } -value { 0 1 2 3 4 } -default "None" } var rlderiv { -label "Radius at which logarithmic derivatives are calculated (rlderiv):" -validate fortranposreal } var eminld { -label "Minimum energy [Ry] for Plotting (eminld):" -validate fortranreal } var emaxld { -label "Maximum energy [Ry] for Plotting (emaxld):" -validate fortranreal } var deld { -label "Plotting in steps of Delta E [Ry] (deld):" -validate fortranposreal } var rpwe { -label "Radius [a.u.] for partial wave expansions (rpwe):" -validate fortranposreal } # } # } } # all-electron cards group AE_cards -name "All-electron cards" -decor normal { line nwf_line -decor none { var nwf -label "Number of states:" -validate posint -widget spinint -default 1 -outfmt %3d } table AE_wfs { -caption "Wavefunction specifications:" -head {Label N L Occupancy "Spin index"} -cols 5 -rows 1 -validate {string int int fortranreal fortranreal} -outfmt {" %s " %3d %3d %f " %s"} } } # # PAGE: pseudo # page pseudoPotential -name "PseudoPotential Generation" { # namelist inputp -name "InputP" { # required { var pseudotype { -label "Type of PseudoPotential (pseudotype):" -widget radiobox -textvalue { "Norm Conserving, one channel per angular momentum" "Norm Conserving, more than one channel per angular momentum" "Ultrasoft PP or PAW"} -value {1 2 3} } var file_pseudopw { -widget entryfileselectquote -label "Name of the file containing the output PP (file_pseudopw):" -fmt %S -validate string } var lloc { -label "Local Potential channel (lloc):" -widget optionmenu -textvalue { "all-electron potential" "L=0" "L=1" "L=2" "L=3" "L=4" } -value { -1 0 1 2 3 4 } -default "all-electron potential" } var rcloc { -label "Matching Radius for Local Potential\n [optional if an L channel was specified] (rcloc):" -validate fortranposreal } var new_core_ps { -label "Pseudize the core charge with bessel functions (new_core_ps):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var tm { -label "Type of pseudization procedure (tm):" -widget radiobox -textvalue { "Troullier-Martins" "Rabe-Rappe-Kaxiras-Joannopoulos" } -value {.true. .false.} } var rho0 { -label "Charge at r=0 ( rho0):" -validate fortrannonnegreal -default 0.0 } } # optional { var nlcc { -label "Nonlinear Core Correction (nlcc):" -widget radiobox -textvalue {"No" "Yes"} -value {.false. .true.} -default "No" } var rcore { -label "Matching Radius for Nonlinear Core Correction (rcore):" -validate fortranposreal } var lpaw { -label "Generate PAW dataset [experimental feature] (lpaw):" -widget radiobox -textvalue {"No" "Yes"} -value {.false. .true.} -default "No" } var which_augfun { -label "Which pseudization augmentation functions (which_augfun):" -value {'AE' 'BESSEL' 'GAUSS' 'BG' 'PSQ'} -widget optionmenu } var rmatch_augfun { -label "Pseudization radius for the augmentation functions (rmatch_augfun):" -validate fortranposreal } var rmatch_augfun_nc { -label "Pseudize augmentation functions from origin to min(rcut(ns),rcut(ns1) (rmatch_augfun_nc):" -widget radiobox -textvalue {"No" "Yes"} -value {.false. .true.} } var lsave_wfc { -label "Save all-electron and pseudo wavefunctions (lsave_wfc):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var lgipaw_reconstruction { -label "Generate all-electron data for GIPAW (lgipaw_reconstruction):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var use_paw_as_gipaw { -label "Use PAW as GIPAW (use_paw_as_gipaw):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var author { -label "Name of the author (author):" -validate string } var file_recon { -widget entryfileselectquote -label "Name of the file containing data needed for PAW reconstruction (file_recon):" -fmt %S -validate string } var file_chi { -widget entryfileselectquote -label "Name of the file containing the output pseudo-orbitals (file_chi):" -fmt %S -validate string } var file_beta { -widget entryfileselectquote -label "Name of the file containing the output beta functions (file_beta):" -fmt %S -validate string } var file_qvan { -widget entryfileselectquote -label "Name of the file containing the output Q functions (file_qvan):" -fmt %S -validate string } var file_screen { -widget entryfileselectquote -label "Name of the file containing the output screeing potential (file_screen):" -fmt %S -validate string } var file_core { -widget entryfileselectquote -label "Name of the file containing the output total and core charge (file_core):" -fmt %S -validate string } var file_wfcaegen { -label "Name of the output file with all-electron wfc (file_wfcaegen):" -validate string -fmt %S -validate string } var file_wfcncgen { -label "Name of the output file with norm-conserving wfc (file_wfcncgen):" -validate string -fmt %S -validate string } var file_wfcusgen { -label "Name of the output file with ultra-soft wfc (file_wfcusgen):" -validate string -fmt %S -validate string } var zval { -label "Valence charge [for special cases only!] (zval):" -validate fortranreal } } # } group PP_cards -name "All-electron cards" -decor normal { line PP_nwf_line -decor none { var nwfs -label "Number of states:" -validate posint -widget spinint -default 1 -outfmt %3d } table PP_wfs { -caption "Enter Wavefunctions to be Pseudized:" -head {Label N L Occupancy Energy Rcut "US Rcut" "Tot.ang.moment"} -validate {whatever int int fortranreal fortranreal fortranreal fortranreal fortranreal} -cols 8 -rows 1 -outfmt {" %s " %3d %3d %8.3f %8.3f %6.2f %6.2f} } } } # # PAGE: test # page testing -name "PseudoPotential Test" { # namelist test -name "TEST" { scriptvar old_nconf var nconf { -label "Number of testing configurations (nconf):" -widget spinint -validate posint } var file_pseudo { -widget entryfileselectquote -label "Name of the file containing the input PP (file_pseudo):" -fmt %S -validate string } dimension configts { -label "Test electronic configurations:" -start 1 -end 1 -validate string -fmt %S -validate string } dimension lsdts { -label "Use LSDA in test of electronic configurations:" -start 1 -end 1 -widget radiobox -textvalue {"No" "Yes"} -value {0 1} } var frozen_core { -label "Calculate only the core wavefunctions of 1st configuration (frozen_core):" -value {.false. .true.} -textvalue {"Yes" "No"} -widget radiobox } var rm { -label "Box radius for spherical Bessel basis set (rm):" -validate fortranposreal } var ecutmin { -label "Minimum energy cutoff [Ry] for ghost/convergence test (ecutmin):" -validate fortranposreal } var ecutmax { -label "Maximum energy cutoff [Ry] for ghost/convergence test (ecutmax):" -validate fortranposreal } var decut { -label "Step [Ry] for cutoff in ghost/convergence test (decut):" -validate fortranposreal } var rcutv { -label "Cutoff distance for the inclusion of LDA-1/2 potential (rcutv):" -validate fortranreal } } # testing configuration cards group test_cards -name "Testing configurations not specified by configts(*)" -decor normal { for {set ic 1} {$ic <= $::pwscf::atomic_max_nconf} {incr ic} { group test_conf_$ic -name "Testing configuration \#.$ic" -decor normal [subst -nocommands { line nwfts_line_$ic -decor none [list var nwfts_$ic -label "Number of states:" -validate posint -widget spinint -default 1 -outfmt %3d] table test_wfs_$ic { -caption "Wavefunctions specifications:" -head {Label N L Occupancy enerts rcutts rcutusts "Spin index"} -cols 8 -rows 1 -validate {string int int fortranreal} -outfmt {" %s " %3d %3d %8.3f %8.3f %6.2f %6.2f " %s"} } }] ] } } } # ---------------------------------------------------------------------- # take care of specialities # ---------------------------------------------------------------------- source atomic-event.tcl # ------------------------------------------------------------------------ # source the HELP file # ------------------------------------------------------------------------ source atomic-help.tcl } espresso-5.1/PWgui-5.1/modules/atomic/atomic-event.tcl0000644000077300007730000001246712341332513023100 0ustar giannozzgiannozztracevar iswitch w { switch -exact -- [varvalue iswitch] { 1 { # all-electron calculation groupwidget inputp disable groupwidget test disable groupwidget PP_cards disable groupwidget test_cards disable if { [string trim [varvalue config]] == {} } { groupwidget AE_cards enable } widget sic enable } 2 { # PP test calculation groupwidget inputp disable groupwidget AE_cards disable groupwidget PP_cards disable groupwidget test enable groupwidget test_cards enable; # this enables all test_conf_#; disable those with indices > nconf for {set i [expr [varvalue nconf] + 1]} {$i <= $::pwscf::atomic_max_nconf} {incr i} { groupwidget test_conf_$i forget } widget sic disable } 3 { # PP generation groupwidget AE_cards disable groupwidget inputp enable groupwidget PP_cards enable groupwidget test disable groupwidget test_cards disable; # this enables all test_conf_#; disable those with indices > nconf for {set i [expr [varvalue nconf] + 1]} {$i <= $::pwscf::atomic_max_nconf} {incr i} { groupwidget test_conf_$i forget } widget sic disable } } } tracevar dft w { if { [varvalue dft] == "'REPLACE_ME'" } { widget dft_ enable } else { widget dft_ disable } } tracevar nld w { if { [varvalue nld] == 0 } { widget rlderiv disable widget eminld disable widget emaxld disable widget deld disable } else { widget rlderiv enable widget eminld enable widget emaxld enable widget deld enable } } tracevar lloc w { if { [varvalue lloc] == -1 } { widget rcloc enable } else { widget rcloc disable } } tracevar nlcc w { if { [varvalue nlcc] == ".true." } { widget rcore enable } else { widget rcore disable } } tracevar lpaw w { if { [varvalue lpaw] == ".true." } { widget file_recon enable } else { widget file_recon disable } } tracevar tm w { if { [varvalue tm] == ".false." } { widget rho0 enable } else { widget rho0 disable } } tracevar rel w { set rel [varvalue rel] # AE cards and lsd if { $rel == 2 } { widget lsd disable widgetconfigure AE_wfs \ -head {Label N L Occupancy "Tot.ang.moment"} \ -cols 5 for {set ic 1} {$ic <= $::pwscf::atomic_max_nconf} {incr ic} { widgetconfigure test_wfs_$ic \ -cols 8 \ -head {Label N L Occupancy enerts rcutts rcutusts "Tot.ang.moment"} } } else { widget lsd enable widgetconfigure AE_wfs \ -head {Label N L Occupancy "Spin index"} # force the correct number of columns varset lsd -value [varvalue lsd] } # PP cards if { $rel == 0 || $rel == 2 } { widgetconfigure PP_wfs \ -head {Label N L Occupancy Energy Rcut "US Rcut" "Tot.ang.moment"} \ -cols 8 } else { widgetconfigure PP_wfs \ -head {Label N L Occupancy Energy Rcut "US Rcut"} \ -cols 7 } } tracevar nwfs w { # wfc is table widgetconfigure PP_wfs -rows [varvalue nwfs] } tracevar nconf w { set nconf [varvalue nconf] set old_nconf [varvalue old_nconf] if { $nconf == {} || $old_nconf == {} } { return } widgetconfigure configts -end $nconf widgetconfigure lsdts -end $nconf if { $old_nconf > $nconf } { # delete ... for {set i $old_nconf} { $i > $nconf } {incr i -1} { groupwidget test_conf_$i forget } } else { # create ... for {set i $old_nconf} { $i <= $nconf } {incr i} { groupwidget test_conf_$i create } } # varset old_nconf -value $nconf } for {set ic 1} {$ic <= $::pwscf::atomic_max_nconf} {incr ic} { tracevar nwfts_$ic w [subst -nocommands { widgetconfigure test_wfs_$ic -rows [varvalue nwfts_$ic] }] } # manage correctly cards 1.1 tracevar config w { set config [string trim [varvalue config]] if { $config == {} && [varvalue iswitch] == 1 } { groupwidget AE_cards enable } else { groupwidget AE_cards disable } } tracevar nwf w { widgetconfigure AE_wfs -rows [varvalue nwf] } tracevar lsd w { if { [varvalue lsd] == 1 } { widgetconfigure AE_wfs -cols 5 for {set ic 1} {$ic <= $::pwscf::atomic_max_nconf} {incr ic} { widgetconfigure test_wfs_$ic \ -cols 8 \ -head {Label N L Occupancy enerts rcutts rcutusts "Spin index"} } } else { widgetconfigure AE_wfs -cols 4 for {set ic 1} {$ic <= $::pwscf::atomic_max_nconf} {incr ic} { widgetconfigure test_wfs_$ic -cols 7 } } } tracevar rmatch_augfun_nc w { if { [vartextvalue rmatch_augfun_nc] == "Yes" } { widget rmatch_augfun disable } else { if { [varvalue iswitch] == 3 } { widget rmatch_augfun enable } } } postprocess { varset old_nconf -value $::pwscf::atomic_max_nconf; # this is dirty varset nconf -value 1 varset iswitch -value 1 varset rel -value 1 varset dft -value 'PZ' varset nld -value 0 varset lloc -value -1 varset nlcc -value .false. varset lpaw -value .false. varset tm -value .false. varset rmatch_augfun_nc -value {} }espresso-5.1/PWgui-5.1/modules/bands/0000755000077300007730000000000012341333047017605 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/bands/commands.tcl0000644000077300007730000000071412341332513022111 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # # ------------------------------------------------------------------------ proc ::pwscf::bandsReadFilter {moduleObj channel} { # bands.x formatted input file should have the &BANDS namelist set status [::pwscf::readFilter::findNamelists $moduleObj $channel BANDS errMsg] if { $status == 0 } { $moduleObj readFileWrongFormat bands.x $errMsg } return $channel }espresso-5.1/PWgui-5.1/modules/bands/bands.tcl0000644000077300007730000000446012341332513021401 0ustar giannozzgiannozzsource commands.tcl module Bands\#auto -title "PWSCF GUI: module Bands.x" -script { readfilter ::pwscf::bandsReadFilter namelist bands -name "BANDS" { optional { var prefix { -label "Prefix of punch file saved by program PW.X (prefix):" -fmt %S -validate string } var outdir { -label "Temporary directory where PW.X files resides (outdir):" -widget entrydirselectquote -fmt %S -validate string } var filband { -label "Output file containing the bands (filband):" -validate string } var spin_component { -label "Spin component (spin_component):" -widget radiobox -textvalue { "spin up" "spin down" } -value { 1 2 } } group sigma { packwidgets left dimension lsigma { -start 1 -end 3 -label "Expectation values of the spin operator on the spinor wave-functions (lsigma)" -textvalue { Yes No } -value { .true. .false. } -widget radiobox } } var lsym { -label "Classify bands according to irreducible representations of small group of k (lsym):" -textvalue { Yes No } -value { .true. .false. } -widget radiobox } var no_overlap { -label "Don't change the order of eigenvalues in output file (no_overlap:)" -textvalue { Yes No } -value { .true. .false. } -widget radiobox } var plot_2d { -label "Print the eigenvalues in 2D gnuplot's format (plot_2d):" -textvalue { Yes No } -value { .true. .false. } -widget radiobox } separator -label "--- Range of k-points for symmetry analysis ---" group kpoints { packwidgets left var firstk -label "First k-point (firstk):" -widget spinint -validate posint var lastk -label "Last k-point (firstk):" -widget spinint -validate posint } } } # ---------------------------------------------------------------------- # take care of specialities # ---------------------------------------------------------------------- source bands-event.tcl # ------------------------------------------------------------------------ # source the HELP file # ------------------------------------------------------------------------ source bands-help.tcl } espresso-5.1/PWgui-5.1/modules/bands/bands-help.tcl0000644000077300007730000001034312341332513022324 0ustar giannozzgiannozz # # Help-file automatically created by helpdoc utility # # !!! DO NOT EDIT: CHANGES WILL BE LOST !!! # # ------------------------------------------------------------------------ help prefix -helpfmt helpdoc -helptext {
  •  Variable: prefix

  •  Type: CHARACTER

  •  Description:
  • prefix of files saved by program pw.x
             
} # ------------------------------------------------------------------------ help outdir -helpfmt helpdoc -helptext {
  •  Variable: outdir

  •  Type: CHARACTER

  •  Default: value of the ESPRESSO_TMPDIR environment variable if set; current directory ('./') otherwise

  •  Description:
  • directory containing the input data,
    i.e. the same as in pw.x
             
} # ------------------------------------------------------------------------ help filband -helpfmt helpdoc -helptext {
  •  Variable: filband

  •  Type: CHARACTER

  •  Description:
  • file "filband" contains the bands
             
} # ------------------------------------------------------------------------ help spin_component -helpfmt helpdoc -helptext {
  •  Variable: spin_component

  •  Type: INTEGER

  •  Description:
  • In the lsda case select:
    
       1 = spin-up
       2 = spin-down
             
} # ------------------------------------------------------------------------ help lsigma -helpfmt helpdoc -helptext {
  •  Variables: lsigma(i), i=1,3

  •  Type: LOGICAL

  •  Description:
  • If true writes a file filband.i with the expectation
    values of the spin operator on the spinor wave-functions.
    (only in the noncollinear case).
             
} # ------------------------------------------------------------------------ help lsym -helpfmt helpdoc -helptext {
  •  Variable: lsym

  •  Type: LOGICAL

  •  Description:
  • If .true. the bands are classified according to the
    irreducible representations of the small group of k. A
    file "filband".rap with the same format of "filband"
    is written.
             
} # ------------------------------------------------------------------------ help no_overlap -helpfmt helpdoc -helptext {
  •  Variable: no_overlap

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. writes the eigenvalues in the output file
    without changing their order.
             
} # ------------------------------------------------------------------------ help plot_2d -helpfmt helpdoc -helptext {
  •  Variable: plot_2d

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. writes the eigenvalues in the output file
    in a 2D format readable by gnuplot. Band ordering is not
    changed. Each band is written in a different file called
    filband.# with the format:
    xk, yk, energy
    xk, yk, energy
    ..  ..  ..
    energies are written in eV and xk in units 2\pi/a.
             
} # ------------------------------------------------------------------------ grouphelp {firstk lastk} -helpfmt helpdoc -helptext {
  •  Variables: firstk, lastk

  •  Type: INTEGER

  •  Description:
  • if lsym=.true. makes the symmetry analysis only for k
    points between firstk to lastk
             
} espresso-5.1/PWgui-5.1/modules/bands/bands-event.tcl0000644000077300007730000000026512341332513022517 0ustar giannozzgiannozztracevar lsym w { if { [vartextvalue lsym] == "Yes" } { groupwidget kpoints enable } else { groupwidget kpoints disable } } postprocess { varset lsym -value {} }espresso-5.1/PWgui-5.1/modules/d3/0000755000077300007730000000000012341333047017024 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/d3/d3.tcl0000644000077300007730000000503112341332513020032 0ustar giannozzgiannozzsource commands.tcl module d3\#auto -title "PWSCF GUI: module D3.x" -script { readfilter ::pwscf::d3ReadFilter namelist inputph -name "INPUTPH" { required { var fildrho { -label "File containing the variation of the charge at q (fildrho):" -widget entryfileselectquote -validate string } var fild0rho { -label "File containing the variation of the charge at q=0 (fild0rho):" -widget entryfileselectquote -validate string } auxilvar ntyp { -label "Number of types of atoms:" -validate posint -fmt %d -default 1 -widget spinint } dimension amass { -label "Atomic mass of each atomic type:" -validate fortranreal -start 1 -end 1 } } optional { var prefix \ -label "Prefix for file names (prefix):" \ -widget [list entrybutton "Prefix ..." [list ::pwscf::selectFileRoot $this prefix]] \ -fmt %S -validate string var outdir { -label "Temporary directory (outdir):" -widget entrydirselectquote -validate string } var iverbosity { -label "Verbosity of output (iverbosity):" -textvalue {high low} -value {1 0} -widget radiobox } var fildyn -label "Output file with the derivative of the dynamical matrix (fildyn):" -validate string var ethr_ph { -label "Threshold for iterative diagonalization (ethr_ph):" -validate fortranposreal } auxilvar nmode { -label "Number of q=0 modes to compute:" -validate posint -default 1 -widget spinint } dimension q0mode_todo { -label "The q=0 modes to compute" -validate nonnegint -widget spinint -start 1 -end 1 } var wraux { -label "Write different terms of the matrix on different files (wraux):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var recv { -label "Is this recover run (rcev):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var istop { -label "Where to stop calculation, istop=0 means do not stop (istop):" -widget spinint -validate nonnegint } } } # ---------------------------------------------------------------------- # take care of specialities # ---------------------------------------------------------------------- source d3-event.tcl # ------------------------------------------------------------------------ # source the HELP file # ------------------------------------------------------------------------ source d3-help.tcl } espresso-5.1/PWgui-5.1/modules/d3/commands.tcl0000644000077300007730000000076712341332513021340 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # # ------------------------------------------------------------------------ proc ::pwscf::d3ReadFilter {moduleObj channel} { # d3.x formatted input file should have the &INPUTPH namelist set status [::pwscf::readFilter::findNamelists $moduleObj $channel INPUTPH errMsg] if { $status == 0 } { $moduleObj readFileWrongFormat d3.x $errMsg } return [readFilter::default $moduleObj $channel {logical amass}] }espresso-5.1/PWgui-5.1/modules/d3/d3-event.tcl0000644000077300007730000000022212341332513021146 0ustar giannozzgiannozztracevar ntyp w { widgetconfigure amass -end [varvalue ntyp] } tracevar nmode w { widgetconfigure q0mode_todo -end [varvalue nmode] } espresso-5.1/PWgui-5.1/modules/d3/d3-help.tcl0000644000077300007730000001336512341332513020771 0ustar giannozzgiannozz # # Help-file automatically created by helpdoc utility # # !!! DO NOT EDIT: CHANGES WILL BE LOST !!! # # ------------------------------------------------------------------------ help fildrho -helpfmt helpdoc -helptext {
  •  Variable: fildrho

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  • The file containing the variation of the charge
    density at the q point under consideration, this
    file is produced by phonon.
                
} # ------------------------------------------------------------------------ help fild0rho -helpfmt helpdoc -helptext {
  •  Variable: fild0rho

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  • The file containing the variation of the charge
    density at q=0, this file is produced by phonon.
                
} # ------------------------------------------------------------------------ help amass -helpfmt helpdoc -helptext {
  •  Variables: amass(i), i=1,ntyp

  •  Type: CHARACTER

  •  Description:
  • ionic masses [atomic mass units]
                
} # ------------------------------------------------------------------------ help prefix -helpfmt helpdoc -helptext {
  •  Variable: prefix

  •  Type: CHARACTER

  •  Default: 'pwscf'

  •  Description:
  •  prefix for file names
             
} # ------------------------------------------------------------------------ help outdir -helpfmt helpdoc -helptext {
  •  Variable: outdir

  •  Type: CHARACTER

  •  Default: value of the ESPRESSO_TMPDIR environment variable if set; current directory ('./') otherwise

  •  Description:
  • Directory containing input, output, and scratch files;
    must be the same as specified in the calculation of
    the unperturbed system and for phonon calculation.
             
} # ------------------------------------------------------------------------ help fildyn -helpfmt helpdoc -helptext {
  •  Variable: fildyn

  •  Type: CHARACTER

  •  Default: 'd3dyn'

  •  Description:
  • The file where the derivative of the dynamical
    matrix will be written
             
} # ------------------------------------------------------------------------ help ethr_ph -helpfmt helpdoc -helptext {
  •  Variable: ethr_ph

  •  Type: REAL

  •  Default: 1.0d-5

  •  Description:
  • Threshold for iterative diagonalization
    (accuracy in ryd of the calculated eigenvalues).
             
} # ------------------------------------------------------------------------ help q0mode_todo -helpfmt helpdoc -helptext {
  •  Variables: q0mode_todo(i), i=1,3*nat

  •  Type: INTEGER

  •  Default: 0

  •  Status: q0mode_todo is statically allocated to dimension 300

  •  Description:
  • This array contains the list of the q=0 modes that
    will be computed. If q0mode_todo(1).eq.0 the
    program will compute every q=0 mode.
             
} # ------------------------------------------------------------------------ help wraux -helpfmt helpdoc -helptext {
  •  Variable: wraux

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. the program will write different terms
    of the matrix on different files.
             
} # ------------------------------------------------------------------------ help recv -helpfmt helpdoc -helptext {
  •  Variable: recv

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  •  Specify .true. for a recover run.
             
} # ------------------------------------------------------------------------ help istop -helpfmt helpdoc -helptext {
  •  Variable: istop

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • If this number is set different from zero the
    program will stop after the specified routine
    and will write the partial result in the recover
    file.
             
} # ------------------------------------------------------------------------ help iverbosity -helpfmt helpdoc -helptext {
  •  Variable: iverbosity

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  •  type of printing ( 0 few, 1 all )
             
} espresso-5.1/PWgui-5.1/modules/neb/0000755000077300007730000000000012341333047017262 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/neb/neb-event.tcl0000644000077300007730000000045212341332513021647 0ustar giannozzgiannozztracevar CI_scheme w { if { [varvalue string_method] == "'neb'" && [varvalue CI_scheme] == "'manual'" } { groupwidget climbing_images enable } else { groupwidget climbing_images disable } } postprocess { varset string_method -value 'neb' varset CI_scheme -value {} } espresso-5.1/PWgui-5.1/modules/neb/commands.tcl0000644000077300007730000000071612341332513021570 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # # ------------------------------------------------------------------------ proc ::pwscf::nebReadFilter {moduleObj channel} { # neb.x formatted input file (neb.dat) should have the &PATH namelist set status [::pwscf::readFilter::findNamelists $moduleObj $channel PATH errMsg] if { $status == 0 } { $moduleObj readFileWrongFormat neb.x $errMsg } return $channel }espresso-5.1/PWgui-5.1/modules/neb/neb-help.tcl0000644000077300007730000002076212341332513021464 0ustar giannozzgiannozz # # Help-file automatically created by helpdoc utility # # !!! DO NOT EDIT: CHANGES WILL BE LOST !!! # # ------------------------------------------------------------------------ help string_method -helpfmt helpdoc -helptext {
  •  Variable: string_method

  •  Type: CHARACTER

  •  Default: 'neb'

  •  Description:
  • a string describing the task to be performed:
       'neb',
       'smd'
             
} # ------------------------------------------------------------------------ help restart_mode -helpfmt helpdoc -helptext {
  •  Variable: restart_mode

  •  Type: CHARACTER

  •  Default: 'from_scratch'

  •  Description:
  • 'from_scratch'  : from scratch
    
    'restart'       : from previous interrupted run
             
} # ------------------------------------------------------------------------ help nstep_path -helpfmt helpdoc -helptext {
  •  Variable: nstep_path

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • number of ionic + electronic steps
             
} # ------------------------------------------------------------------------ help num_of_images -helpfmt helpdoc -helptext {
  •  Variable: num_of_images

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • Number of points used to discretize the path
    (it must be larger than 3).
             
} # ------------------------------------------------------------------------ help opt_scheme -helpfmt helpdoc -helptext {
  •  Variable: opt_scheme

  •  Type: CHARACTER

  •  Default: 'quick-min'

  •  Description:
  • Specify the type of optimization scheme:
    
    'sd'         : steepest descent
    
    'broyden'    : quasi-Newton Broyden's second method (suggested)
    
    'broyden2'   : another variant of the quasi-Newton Broyden's
                   second method to be tested and compared with the
                   previous one.
    
    'quick-min'  : an optimisation algorithm based on the
                   projected velocity Verlet scheme
    
    'langevin'   : finite temperature langevin dynamics of the
                   string (smd only). It is used to compute the
                   average path and the free-energy profile.
             
} # ------------------------------------------------------------------------ help CI_scheme -helpfmt helpdoc -helptext {
  •  Variable: CI_scheme

  •  Type: CHARACTER

  •  Default: 'no-CI'

  •  Description:
  • Specify the type of Climbing Image scheme:
    
    'no-CI'      : climbing image is not used
    
    'auto'       : original CI scheme. The image highest in energy
                   does not feel the effect of springs and is
                   allowed to climb along the path
    
    'manual'     : images that have to climb are manually selected.
                   See also CLIMBING_IMAGES card
             
} # ------------------------------------------------------------------------ help first_last_opt -helpfmt helpdoc -helptext {
  •  Variable: first_last_opt

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • Also the first and the last configurations are optimized
    "on the fly" (these images do not feel the effect of the springs).
             
} # ------------------------------------------------------------------------ help minimum_image -helpfmt helpdoc -helptext {
  •  Variable: minimum_image

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • Assume a "minimum image criterion" to build the path. If an atom
    moves by more than half the length of a crystal axis between one
    image and the next in the input (before interpolation),
    an appropriate periodic replica of that atom is chosen.
    Useful to avoid jumps in the initial reaction path.
             
} # ------------------------------------------------------------------------ help temp_req -helpfmt helpdoc -helptext {
  •  Variable: temp_req

  •  Type: REAL

  •  Default: 0.D0 Kelvin

  •  Description:
  • Temperature used for the langevin dynamics of the string.
             
} # ------------------------------------------------------------------------ help ds -helpfmt helpdoc -helptext {
  •  Variable: ds

  •  Type: REAL

  •  Default: 1.D0

  •  Description:
  • Optimisation step length ( Hartree atomic units ).
    If opt_scheme="broyden", ds is used as a guess for the
    diagonal part of the Jacobian matrix.
             
} # ------------------------------------------------------------------------ grouphelp {k_max k_min} -helpfmt helpdoc -helptext {
  •  Variables: k_max, k_min

  •  Type: REAL

  •  Default: 0.1D0 Hartree atomic units

  •  Description:
  • Set them to use a Variable Elastic Constants scheme
    elastic constants are in the range [ k_min, k_max ]
    this is useful to rise the resolution around the saddle point.
             
} # ------------------------------------------------------------------------ help path_thr -helpfmt helpdoc -helptext {
  •  Variable: path_thr

  •  Type: REAL

  •  Default: 0.05D0 eV / Angstrom

  •  Description:
  • The simulation stops when the error ( the norm of the force
    orthogonal to the path in eV/A ) is less than path_thr.
             
} # ------------------------------------------------------------------------ help use_masses -helpfmt helpdoc -helptext {
  •  Variable: use_masses

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • If. TRUE. the optimisation of the path is performed using
    mass-weighted coordinates. Useful together with quick-min
    optimization scheme, if some bonds are much stiffer than
    others. By assigning a larger (fictitious) mass to atoms
    with stiff bonds, one may use a longer time step "ds"
             
} # ------------------------------------------------------------------------ help use_freezing -helpfmt helpdoc -helptext {
  •  Variable: use_freezing

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • If. TRUE. the images are optimised according to their error:
    only those images with an error larger than half of the largest
    are optimised. The other images are kept frozen.
             
} # ------------------------------------------------------------------------ help climbing_images_list -helpfmt helpdoc -helptext {
  •  Variables: index1, index2, ... indexN

  •  Type: INTEGER

  •  Description:
  • index1, index2, ..., indexN are indices of the images to which the
    Climbing-Image procedure apply. If more than one image is specified
    they must be separated by a comma.
                
} espresso-5.1/PWgui-5.1/modules/neb/neb.tcl0000644000077300007730000000734112341332513020534 0ustar giannozzgiannozzsource commands.tcl module NEB -title "PWSCF GUI: module NEB.x" -script { readfilter ::pwscf::nebReadFilter # # PATH # namelist inputpp -name "PATH" { var string_method { -label "Type of path calculation (string_method):" -widget radiobox -textvalue { "Nudged Elastic Band " "String Method Dynamics " } -value { 'neb' 'smd' } -default "Nudged Elastic Band " } var restart_mode { -label "Restart mode (restart_mode):" -widget radiobox -textvalue { "from scratch " "from previous interrupted run " } -value { 'from_scratch' 'restart' } } var nstep_path { -label "Number of ionic steps (nstep_path):" -widget spinint -validate posint } var num_of_images { -label "Number of images used to discretize the path (num_of_images):" -widget spinint -validate posint } var opt_scheme { -label "Type of optimization scheme (opt_scheme):" -value { 'quick-min' 'broyden' 'broyden2' 'sd' 'langevin' } -textvalue { "optimization algorithm based on molecular dynamics " "Broyden method " "Alternate Broyden method " "steepest descent " "finite temperature langevin dynamics " } -widget optionmenu } var CI_scheme { -label "Type of climbing image scheme (CI_scheme):" -textvalue { "do not use climbing image " "image highest in energy is allowed to climb " "climbing images are manually selected " } -value { 'no-CI' 'auto' 'manual' } -widget optionmenu } var first_last_opt { -label "Optimize also the first and the last configurations (first_last_opt):" -textvalue { Yes No } -value { .TRUE. .FALSE. } -widget radiobox } var minimum_image { -label "Use a minimum image criterion (minimum_image):" -textvalue { Yes No } -value { .TRUE. .FALSE. } -widget radiobox } var temp_req { -label "Temperature used for langevin dynamics of the string (temp_req):" -validate fortranposreal } var ds { -label "Optimization step length (ds):" -validate fortranposreal } var path_thr { -label "Convergence threshold for path optimization (path_thr):" -validate fortranposreal } var use_freezing { -label "Only the images with larger errors are optimised (use_freezing):" -textvalue { Yes No } -value { .TRUE. .FALSE. } -widget radiobox } var use_masses { -label "The optimisation is done with mass-weighted coordinates (use_masses):" -textvalue { Yes No } -value { .TRUE. .FALSE. } -widget radiobox } group elastic_constants -name "Elastic Constants for NEB spring:" -decor normal { packwidgets left var k_max -label "k_max:" -validate fortranposreal var k_min -label "k_min:" -validate fortranposreal } } # # CLIMBING_IMAGES # group climbing_images -name "Card: CLIMBING_IMAGES" -decor normal { keyword climbing_images_key CLIMBING_IMAGES\n line climbing_images_line -decor none { var climbing_images_list { -label "List of climbing images, separated by a comma:" -infmt %S } } } # ---------------------------------------------------------------------- # take care of specialities # ---------------------------------------------------------------------- source neb-event.tcl # ------------------------------------------------------------------------ # source the HELP file # ------------------------------------------------------------------------ source neb-help.tcl } espresso-5.1/PWgui-5.1/modules/projwfc/0000755000077300007730000000000012341333047020170 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/projwfc/projwfc-event.tcl0000644000077300007730000000031612341332513023462 0ustar giannozzgiannozztracevar tdosinboxes w { if { [vartextvalue tdosinboxes] == "Yes" } { groupwidget local_dos enable } else { groupwidget local_dos disable } } postprocess { varset tdosinboxes -value {} }espresso-5.1/PWgui-5.1/modules/projwfc/projwfc-help.tcl0000644000077300007730000001774012341332513023302 0ustar giannozzgiannozz # # Help-file automatically created by helpdoc utility # # !!! DO NOT EDIT: CHANGES WILL BE LOST !!! # # ------------------------------------------------------------------------ help prefix -helpfmt helpdoc -helptext {
  •  Variable: prefix

  •  Type: CHARACTER

  •  Default: 'pwscf'

  •  Description:
  • Prefix of input file produced by pw.x
    (wavefunctions are needed).
             
} # ------------------------------------------------------------------------ help outdir -helpfmt helpdoc -helptext {
  •  Variable: outdir

  •  Type: CHARACTER

  •  Default: value of the ESPRESSO_TMPDIR environment variable if set; current directory ('./') otherwise

  •  Description:
  • directory containing the input data,
    i.e. the same as in pw.x
             
} # ------------------------------------------------------------------------ help ngauss -helpfmt helpdoc -helptext {
  •  Variable: ngauss

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • Type of gaussian broadening:
        0 ... Simple Gaussian (default)
        1 ... Methfessel-Paxton of order 1
       -1 ... Marzari-Vanderbilt "cold smearing"
      -99 ... Fermi-Dirac function
             
} # ------------------------------------------------------------------------ help degauss -helpfmt helpdoc -helptext {
  •  Variable: degauss

  •  Type: REAL

  •  Default: 0.0

  •  Description:
  •  gaussian broadening, Ry (not eV!)
             
} # ------------------------------------------------------------------------ grouphelp {Emin Emax} -helpfmt helpdoc -helptext {
  •  Variables: Emin, Emax

  •  Type: REAL

  •  Default: (band extrema)

  •  Description:
  •  min & max energy (eV) for DOS plot
             
} # ------------------------------------------------------------------------ help DeltaE -helpfmt helpdoc -helptext {
  •  Variable: DeltaE

  •  Type: REAL

  •  Description:
  •  energy grid step (eV)
             
} # ------------------------------------------------------------------------ help lsym -helpfmt helpdoc -helptext {
  •  Variable: lsym

  •  Type: LOGICAL

  •  Default: .true.

  •  Description:
  • if true the projections are symmetrized
             
} # ------------------------------------------------------------------------ help filpdos -helpfmt helpdoc -helptext {
  •  Variable: filpdos

  •  Type: CHARACTER

  •  Default: (value of prefix variable)

  •  Description:
  •  prefix for output files containing PDOS(E)
             
} # ------------------------------------------------------------------------ help filproj -helpfmt helpdoc -helptext {
  •  Variable: filproj

  •  Type: CHARACTER

  •  Default: (standard output)

  •  Description:
  • file containing the projections
             
} # ------------------------------------------------------------------------ help lwrite_overlaps -helpfmt helpdoc -helptext {
  •  Variable: lwrite_overlaps

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • if .true., the overlap matrix of the atomic orbitals
    prior to orthogonalization is written to the atomic_proj datafile.
             
} # ------------------------------------------------------------------------ help lbinary_data -helpfmt helpdoc -helptext {
  •  Variable: lbinary_data

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • if .true., the atomic_proj datafile is written in binary fmt.
             
} # ------------------------------------------------------------------------ help kresolveddos -helpfmt helpdoc -helptext {
  •  Variable: kresolveddos

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • if .true. the k-resolved DOS is computed: not summed over
    all k-points but written as a function of the k-point index.
    In this case all k-point weights are set to unity
             
} # ------------------------------------------------------------------------ help tdosinboxes -helpfmt helpdoc -helptext {
  •  Variable: tdosinboxes

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • if .true. compute the local DOS integrated in volumes
    volumes are defined as boxes with edges parallel
    to the unit cell, containing the points of the
    (charge density) FFT grid included within
    irmin and irmax, in the three dimensions:
    from irmin(j,n) to irmax(j,n) for j=1,2,3
    (n=1,n_proj_boxes)
             
} # ------------------------------------------------------------------------ help n_proj_boxes -helpfmt helpdoc -helptext {
  •  Variable: n_proj_boxes

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • number of boxes where the local DOS is computed
             
} # ------------------------------------------------------------------------ help irmin -helpfmt helpdoc -helptext {
  •  Variable: irmin

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • first point to be included in the box
             
} # ------------------------------------------------------------------------ help irmax -helpfmt helpdoc -helptext {
  •  Variable: irmax

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • last point to be included in the box
             
} # ------------------------------------------------------------------------ help plotboxes -helpfmt helpdoc -helptext {
  •  Variable: plotboxes

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • if .true., the boxes are written in output as
    as xsf files with 3D datagrids, valued 1.0
    inside the box volume and 0 outside
    (visualize them as isosurfaces with isovalue 0.5)
             
} espresso-5.1/PWgui-5.1/modules/projwfc/commands.tcl0000644000077300007730000000072612341332513022477 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # # ------------------------------------------------------------------------ proc ::pwscf::projwfcReadFilter {moduleObj channel} { # projwfc.x formatted input file should have the &INPUTPP namelist set status [::pwscf::readFilter::findNamelists $moduleObj $channel PROJWFC errMsg] if { $status == 0 } { $moduleObj readFileWrongFormat projwfc.x $errMsg } return $channel }espresso-5.1/PWgui-5.1/modules/projwfc/projwfc.tcl0000644000077300007730000000674212341332513022354 0ustar giannozzgiannozzsource commands.tcl module ProjWfc\#auto -title "PWSCF GUI: module ProjWfc.x" -script { readfilter ::pwscf::projwfcReadFilter namelist projwfc -name "PROJWFC" { optional { var prefix { -label "Prefix of punch file saved by program PW.X (prefix):" -fmt %S -validate string } var outdir { -label "Temporary directory where PW.X files resides (outdir):" -widget entrydirselectquote -fmt %S -validate string } var filpdos { -label "Prefix for output files containing PDOS(E) (filpdos):" -validate string } var filproj { -label "File containing the projections (filproj):" -validate string } separator -label "--- PDOS ploting options ---" var ngauss { -label "Type of gaussian broadening (ngauss):" -widget optionmenu -value {0 1 -1 99} -textvalue { "Simple Gaussian (default)" "Methfessel-Paxton of order 1" "Marzari-Vanderbilt \"cold smearing\"" "Fermi-Dirac function" } } var degauss { -label "Gaussian broadening \[in Ry\] (degauss):" -validate fortranreal } var DeltaE { -label "Resolution of PDOS plots \[in eV\] (DeltaE):" -validate fortranreal -default 0.01 } var lsym { -label "Symmetrize projections (lsym):" -value { .true. .false. } -textvalue { Yes No } -widget radiobox } var kresolveddos { -label "Compute k-resolved DOS (kresolveddos):" -value { .true. .false. } -textvalue { Yes No } -widget radiobox } separator -label "--- Energy window for PDOS ---" var Emin { -label "Minimum energy \[in eV\] (Emin):" -validate fortranreal } var Emax { -label "Maximum energy \[in eV\] (Emin):" -validate fortranreal } separator -label "--- PROJECTIONS options ---" var lwrite_overlaps { -label "Print the overlap matrix of atomic orbitals (lwrite_overlaps):" -value { .true. .false. } -textvalue { Yes No } -widget radiobox } var lbinary_data { -label "Write atomic_proj datafile in binary format (lbinary_data):" -value { .true. .false. } -textvalue { Yes No } -widget radiobox } separator -label "--- Local DOS options ---" var tdosinboxes { -label "Compute the local DOS computed in volumes (tdosinboxes):" -value { .true. .false. } -textvalue { Yes No } -widget radiobox } group local_dos { var n_proj_boxes { -label "Number of boxes where the local DOS is computed (n_proj_boxes):" -widget spinint -validate nonnegint } var irmin { -label "First point to be included in the box (irmin):" -widget spinint -validate nonnegint } var irmax { -label "Last point to be included in the box (irmax):" -widget spinint -validate nonnegint } var plotboxes { -label "Write the boxes into XSF 3D datagrid file (plotboxes):" -value { .true. .false. } -textvalue { Yes No } -widget radiobox } } } } # ---------------------------------------------------------------------- # take care of specialties # ---------------------------------------------------------------------- source projwfc-event.tcl # ------------------------------------------------------------------------ # source the HELP file # ------------------------------------------------------------------------ source projwfc-help.tcl } espresso-5.1/PWgui-5.1/modules/pw/0000755000077300007730000000000012341333047017144 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/pw/pw-help.tcl0000644000077300007730000034521112341332513021227 0ustar giannozzgiannozz # # Help-file automatically created by helpdoc utility # # !!! DO NOT EDIT: CHANGES WILL BE LOST !!! # # ------------------------------------------------------------------------ help calculation -helpfmt helpdoc -helptext {
  •  Variable: calculation

  •  Type: CHARACTER

  •  Default: 'scf'

  •  Description:
  • a string describing the task to be performed:
       'scf',
       'nscf',
       'bands',
       'relax',
       'md',
       'vc-relax',
       'vc-md'
    
       (vc = variable-cell).
             
} # ------------------------------------------------------------------------ help title -helpfmt helpdoc -helptext {
  •  Variable: title

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  • reprinted on output.
             
} # ------------------------------------------------------------------------ help verbosity -helpfmt helpdoc -helptext {
  •  Variable: verbosity

  •  Type: CHARACTER

  •  Default: 'low'

  •  Description:
  • Currently two verbosity levels are implemented:
      'high' and 'low'. 'debug' and 'medium' have the same
      effect as 'high'; 'default' and 'minimal', as 'low'
             
} # ------------------------------------------------------------------------ help restart_mode -helpfmt helpdoc -helptext {
  •  Variable: restart_mode

  •  Type: CHARACTER

  •  Default: 'from_scratch'

  •  Description:
  • 'from_scratch'  : from scratch. This is the normal way
                      to perform a PWscf calculation
    'restart'       : from previous interrupted run. Use this
                      switch only if you want to continue an
                      interrupted calculation, not to start a
                      new one, or to perform non-scf calculations.
                      Works only if the calculation was cleanly
                      stopped using variable "max_seconds", or
                      by user request with an "exit file" (i.e.:
                      create a file "prefix".EXIT, in directory
                      "outdir"; see variables "prefix", "outdir")
             
} # ------------------------------------------------------------------------ help wf_collect -helpfmt helpdoc -helptext {
  •  Variable: wf_collect

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • This flag controls the way wavefunctions are stored to disk :
    
    .TRUE.  collect wavefunctions from all processors, store them
            into the output data directory "outdir"/"prefix".save,
            one wavefunction per k-point in subdirs K000001/,
            K000001/, etc.. Use this if you want wavefunctions
            to be readable on a different number of processors.
    
    .FALSE. do not collect wavefunctions, leave them in temporary
            local files (one per processor). The resulting format
            will be readable only by jobs running on the same
            number of processors and pools. Requires less I/O
            than the previous case.
    
    Note that this flag has no effect on reading, only on writing.
             
} # ------------------------------------------------------------------------ help nstep -helpfmt helpdoc -helptext {
  •  Variable: nstep

  •  Type: INTEGER

  •  Default: 1 if calculation = 'scf', 'nscf', 'bands'; 50 for the other cases

  •  Description:
  • number of ionic + electronic steps
             
} # ------------------------------------------------------------------------ help iprint -helpfmt helpdoc -helptext {
  •  Variable: iprint

  •  Type: INTEGER

  •  Default: write only at convergence

  •  Description:
  • band energies are written every "iprint" iterations
             
} # ------------------------------------------------------------------------ help tstress -helpfmt helpdoc -helptext {
  •  Variable: tstress

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • calculate stress. It is set to .TRUE. automatically if
    calculation='vc-md' or 'vc-relax'
             
} # ------------------------------------------------------------------------ help tprnfor -helpfmt helpdoc -helptext {
  •  Variable: tprnfor

  •  Type: LOGICAL

  •  Description:
  • calculate forces. It is set to .TRUE. automatically if
    calculation='relax','md','vc-md'
             
} # ------------------------------------------------------------------------ help dt -helpfmt helpdoc -helptext {
  •  Variable: dt

  •  Type: REAL

  •  Default: 20.D0

  •  Description:
  • time step for molecular dynamics, in Rydberg atomic units
    (1 a.u.=4.8378 * 10^-17 s : beware, the CP code uses
     Hartree atomic units, half that much!!!)
             
} # ------------------------------------------------------------------------ help outdir -helpfmt helpdoc -helptext {
  •  Variable: outdir

  •  Type: CHARACTER

  •  Default: value of the ESPRESSO_TMPDIR environment variable if set; current directory ('./') otherwise

  •  Description:
  • input, temporary, output files are found in this directory,
    see also "wfcdir"
             
} # ------------------------------------------------------------------------ help wfcdir -helpfmt helpdoc -helptext {
  •  Variable: wfcdir

  •  Type: CHARACTER

  •  Default: same as "outdir"

  •  Description:
  • this directory specifies where to store files generated by
    each processor (*.wfc{N}, *.igk{N}, etc.). Useful for
    machines without a parallel file system: set "wfcdir" to
    a local file system, while "outdir" should be a parallel
    or networkfile system, visible to all processors. Beware:
    in order to restart from interrupted runs, or to perform
    further calculations using the produced data files, you
    may need to copy files to "outdir". Works only for pw.x.
             
} # ------------------------------------------------------------------------ help prefix -helpfmt helpdoc -helptext {
  •  Variable: prefix

  •  Type: CHARACTER

  •  Default: 'pwscf'

  •  Description:
  • prepended to input/output filenames:
    prefix.wfc, prefix.rho, etc.
             
} # ------------------------------------------------------------------------ help lkpoint_dir -helpfmt helpdoc -helptext {
  •  Variable: lkpoint_dir

  •  Type: LOGICAL

  •  Default: .true.

  •  Description:
  • If .false. a subdirectory for each k_point is not opened
    in the "prefix".save directory; Kohn-Sham eigenvalues are
    stored instead in a single file for all k-points. Currently
    doesn't work together with "wf_collect"
             
} # ------------------------------------------------------------------------ help max_seconds -helpfmt helpdoc -helptext {
  •  Variable: max_seconds

  •  Type: REAL

  •  Default: 1.D+7, or 150 days, i.e. no time limit

  •  Description:
  • jobs stops after "max_seconds" CPU time. Use this option
    in conjunction with option "restart_mode" if you need to
    split a job too long to complete into shorter jobs that
    fit into your batch queues.
             
} # ------------------------------------------------------------------------ help etot_conv_thr -helpfmt helpdoc -helptext {
  •  Variable: etot_conv_thr

  •  Type: REAL

  •  Default: 1.0D-4

  •  Description:
  • convergence threshold on total energy (a.u) for ionic
    minimization: the convergence criterion is satisfied
    when the total energy changes less than "etot_conv_thr"
    between two consecutive scf steps. Note that "etot_conv_thr"
    is extensive, like the total energy.
    See also "forc_conv_thr" - both criteria must be satisfied
             
} # ------------------------------------------------------------------------ help forc_conv_thr -helpfmt helpdoc -helptext {
  •  Variable: forc_conv_thr

  •  Type: REAL

  •  Default: 1.0D-3

  •  Description:
  • convergence threshold on forces (a.u) for ionic minimization:
    the convergence criterion is satisfied when all components of
    all forces are smaller than "forc_conv_thr".
    See also "etot_conv_thr" - both criteria must be satisfied
             
} # ------------------------------------------------------------------------ help disk_io -helpfmt helpdoc -helptext {
  •  Variable: disk_io

  •  Type: CHARACTER

  •  Default: 'low'

  •  Description:
  • Specifies the amount of disk I/O activity
    'high':   save all data to disk at each SCF step
    
    'medium': save wavefunctions at each SCF step unless
              there is a single k-point per process (in which
              case the behavior is the same as 'low')
    
    'low' :   store wfc in memory, save only at the end
    
    'none':   do not save anything, not even at the end
              ('scf', 'nscf', 'bands' calculations; some data
               may be written anyway for other calculations)
    
    Note that the amount of needed RAM increases as the amount
    of I/O decreases! IMPORTANT: default has been changed to 'low'.
    It is no longer needed to specify 'high' in order to be able
    to restart from an interrupted calculation (see "restart_mode")
    but you cannot restart from disk_io='none'
             
} # ------------------------------------------------------------------------ help pseudo_dir -helpfmt helpdoc -helptext {
  •  Variable: pseudo_dir

  •  Type: CHARACTER

  •  Default: value of the $ESPRESSO_PSEUDO environment variable if set; '$HOME/espresso/pseudo/' otherwise

  •  Description:
  • directory containing pseudopotential files
             
} # ------------------------------------------------------------------------ help tefield -helpfmt helpdoc -helptext {
  •  Variable: tefield

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • If .TRUE. a saw-like potential simulating an electric field
    is added to the bare ionic potential. See variables "edir",
    "eamp", "emaxpos", "eopreg" for the form and size of
    the added potential.
             
} # ------------------------------------------------------------------------ help dipfield -helpfmt helpdoc -helptext {
  •  Variable: dipfield

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • If .TRUE. and tefield=.TRUE. a dipole correction is also
    added to the bare ionic potential - implements the recipe
    of L. Bengtsson, PRB 59, 12301 (1999). See variables "edir",
    "emaxpos", "eopreg" for the form of the correction. Must
    be used ONLY in a slab geometry, for surface calculations,
    with the discontinuity FALLING IN THE EMPTY SPACE.
             
} # ------------------------------------------------------------------------ help lelfield -helpfmt helpdoc -helptext {
  •  Variable: lelfield

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • If .TRUE. a homogeneous finite electric field described
    through the modern theory of the polarization is applied.
    This is different from "tefield=.true." !
             
} # ------------------------------------------------------------------------ help nberrycyc -helpfmt helpdoc -helptext {
  •  Variable: nberrycyc

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • In the case of a finite electric field  ( lelfield == .TRUE. )
    it defines the number of iterations for converging the
    wavefunctions in the electric field Hamiltonian, for each
    external iteration on the charge density
             
} # ------------------------------------------------------------------------ help lorbm -helpfmt helpdoc -helptext {
  •  Variable: lorbm

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • If .TRUE. perform orbital magnetization calculation.
    If finite electric field is applied (lelfield=.true.)
    only Kubo terms are computed
    [for details see New J. Phys. 12, 053032 (2010)].
    The type of calculation is 'nscf' and should be performed
    on an automatically generated uniform grid of k points.
    Works ONLY with norm-conserving pseudopotentials.
             
} # ------------------------------------------------------------------------ help lberry -helpfmt helpdoc -helptext {
  •  Variable: lberry

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • If .TRUE. perform a Berry phase calculation
    See the header of PW/src/bp_c_phase.f90 for documentation
             
} # ------------------------------------------------------------------------ help gdir -helpfmt helpdoc -helptext {
  •  Variable: gdir

  •  Type: INTEGER

  •  Description:
  • For Berry phase calculation: direction of the k-point
    strings in reciprocal space. Allowed values: 1, 2, 3
    1=first, 2=second, 3=third reciprocal lattice vector
    For calculations with finite electric fields
    (lelfield==.true.) "gdir" is the direction of the field
             
} # ------------------------------------------------------------------------ help nppstr -helpfmt helpdoc -helptext {
  •  Variable: nppstr

  •  Type: INTEGER

  •  Description:
  • For Berry phase calculation: number of k-points to be
    calculated along each symmetry-reduced string
    The same for calculation with finite electric fields
    (lelfield=.true.)
             
} # ------------------------------------------------------------------------ help ibrav -helpfmt helpdoc -helptext {
  •  Variable: ibrav

  •  Type: INTEGER

  •  Status: REQUIRED

  •  Description:
  •   Bravais-lattice index. If ibrav /= 0, specify EITHER
      [ celldm(1)-celldm(6) ] OR [ A,B,C,cosAB,cosAC,cosBC ]
      but NOT both. The lattice parameter "alat" is set to
      alat = celldm(1) (in a.u.) or alat = A (in Angstrom);
      see below for the other parameters.
      For ibrav=0 specify the lattice vectors in CELL_PARAMETER,
      optionally the lattice parameter alat = celldm(1) (in a.u.)
      or = A (in Angstrom), or else it is taken from CELL_PARAMETERS
    
    ibrav      structure                   celldm(2)-celldm(6)
                                         or: b,c,cosab,cosac,cosbc
      0          free
          crystal axis provided in input: see card CELL_PARAMETERS
    
      1          cubic P (sc)
          v1 = a(1,0,0),  v2 = a(0,1,0),  v3 = a(0,0,1)
    
      2          cubic F (fcc)
          v1 = (a/2)(-1,0,1),  v2 = (a/2)(0,1,1), v3 = (a/2)(-1,1,0)
    
      3          cubic I (bcc)
          v1 = (a/2)(1,1,1),  v2 = (a/2)(-1,1,1),  v3 = (a/2)(-1,-1,1)
    
      4          Hexagonal and Trigonal P        celldm(3)=c/a
          v1 = a(1,0,0),  v2 = a(-1/2,sqrt(3)/2,0),  v3 = a(0,0,c/a)
    
      5          Trigonal R, 3fold axis c        celldm(4)=cos(alpha)
          The crystallographic vectors form a three-fold star around
          the z-axis, the primitive cell is a simple rhombohedron:
          v1 = a(tx,-ty,tz),   v2 = a(0,2ty,tz),   v3 = a(-tx,-ty,tz)
          where c=cos(alpha) is the cosine of the angle alpha between
          any pair of crystallographic vectors, tx, ty, tz are:
            tx=sqrt((1-c)/2), ty=sqrt((1-c)/6), tz=sqrt((1+2c)/3)
     -5          Trigonal R, 3fold axis <111>    celldm(4)=cos(alpha)
          The crystallographic vectors form a three-fold star around
          <111>. Defining a' = a/sqrt(3) :
          v1 = a' (u,v,v),   v2 = a' (v,u,v),   v3 = a' (v,v,u)
          where u and v are defined as
            u = tz - 2*sqrt(2)*ty,  v = tz + sqrt(2)*ty
          and tx, ty, tz as for case ibrav=5
          Note: if you prefer x,y,z as axis in the cubic limit,
                set  u = tz + 2*sqrt(2)*ty,  v = tz - sqrt(2)*ty
                See also the note in flib/latgen.f90
    
      6          Tetragonal P (st)               celldm(3)=c/a
          v1 = a(1,0,0),  v2 = a(0,1,0),  v3 = a(0,0,c/a)
    
      7          Tetragonal I (bct)              celldm(3)=c/a
          v1=(a/2)(1,-1,c/a),  v2=(a/2)(1,1,c/a),  v3=(a/2)(-1,-1,c/a)
    
      8          Orthorhombic P                  celldm(2)=b/a
                                                 celldm(3)=c/a
          v1 = (a,0,0),  v2 = (0,b,0), v3 = (0,0,c)
    
      9          Orthorhombic base-centered(bco) celldm(2)=b/a
                                                 celldm(3)=c/a
          v1 = (a/2, b/2,0),  v2 = (-a/2,b/2,0),  v3 = (0,0,c)
     -9          as 9, alternate description
          v1 = (a/2,-b/2,0),  v2 = (a/2,-b/2,0),  v3 = (0,0,c)
    
     10          Orthorhombic face-centered      celldm(2)=b/a
                                                 celldm(3)=c/a
          v1 = (a/2,0,c/2),  v2 = (a/2,b/2,0),  v3 = (0,b/2,c/2)
    
     11          Orthorhombic body-centered      celldm(2)=b/a
                                                 celldm(3)=c/a
          v1=(a/2,b/2,c/2),  v2=(-a/2,b/2,c/2),  v3=(-a/2,-b/2,c/2)
    
     12          Monoclinic P, unique axis c     celldm(2)=b/a
                                                 celldm(3)=c/a,
                                                 celldm(4)=cos(ab)
          v1=(a,0,0), v2=(b*cos(gamma),b*sin(gamma),0),  v3 = (0,0,c)
          where gamma is the angle between axis a and b.
    -12          Monoclinic P, unique axis b     celldm(2)=b/a
                                                 celldm(3)=c/a,
                                                 celldm(5)=cos(ac)
          v1 = (a,0,0), v2 = (0,b,0), v3 = (c*cos(beta),0,c*sin(beta))
          where beta is the angle between axis a and c
    
     13          Monoclinic base-centered        celldm(2)=b/a
                                                 celldm(3)=c/a,
                                                 celldm(4)=cos(ab)
          v1 = (  a/2,         0,                -c/2),
          v2 = (b*cos(gamma), b*sin(gamma), 0),
          v3 = (  a/2,         0,                  c/2),
          where gamma is the angle between axis a and b
    
     14          Triclinic                       celldm(2)= b/a,
                                                 celldm(3)= c/a,
                                                 celldm(4)= cos(bc),
                                                 celldm(5)= cos(ac),
                                                 celldm(6)= cos(ab)
          v1 = (a, 0, 0),
          v2 = (b*cos(gamma), b*sin(gamma), 0)
          v3 = (c*cos(beta),  c*(cos(alpha)-cos(beta)cos(gamma))/sin(gamma),
               c*sqrt( 1 + 2*cos(alpha)cos(beta)cos(gamma)
                         - cos(alpha)^2-cos(beta)^2-cos(gamma)^2 )/sin(gamma) )
      where alpha is the angle between axis b and c
             beta is the angle between axis a and c
            gamma is the angle between axis a and b
             
} # ------------------------------------------------------------------------ help celldm -helpfmt helpdoc -helptext {
  •  Variables: celldm(i), i=1,6

  •  Type: REAL

  •  See: ibrav

  •  Description:
  • Crystallographic constants - see the "ibrav" variable.
    Specify either these OR A,B,C,cosAB,cosBC,cosAC NOT both.
    Only needed values (depending on "ibrav") must be specified
    alat = celldm(1) is the lattice parameter "a" (in BOHR)
    If ibrav=0, only celldm(1) is used if present;
    cell vectors are read from card CELL_PARAMETERS
                
} # ------------------------------------------------------------------------ grouphelp {A B C cosAB cosAC cosBC} -helpfmt helpdoc -helptext {
  •  Variables: A, B, C, cosAB, cosAC, cosBC

  •  Type: REAL

  •  Description:
  • Traditional crystallographic constants: a,b,c in ANGSTROM
      cosAB = cosine of the angle between axis a and b (gamma)
      cosAC = cosine of the angle between axis a and c (beta)
      cosBC = cosine of the angle between axis b and c (alpha)
    The axis are chosen according to the value of "ibrav".
    Specify either these OR "celldm" but NOT both.
    Only needed values (depending on "ibrav") must be specified
    The lattice parameter alat = A (in ANGSTROM )
    If ibrav = 0, only A is used if present;
    cell vectors are read from card CELL_PARAMETERS
                
} # ------------------------------------------------------------------------ help nat -helpfmt helpdoc -helptext {
  •  Variable: nat

  •  Type: INTEGER

  •  Status: REQUIRED

  •  Description:
  • number of atoms in the unit cell
             
} # ------------------------------------------------------------------------ help ntyp -helpfmt helpdoc -helptext {
  •  Variable: ntyp

  •  Type: INTEGER

  •  Status: REQUIRED

  •  Description:
  • number of types of atoms in the unit cell
             
} # ------------------------------------------------------------------------ help nbnd -helpfmt helpdoc -helptext {
  •  Variable: nbnd

  •  Type: INTEGER

  •  Default: for an insulator, nbnd = number of valence bands (nbnd = # of electrons /2); for a metal, 20% more (minimum 4 more)

  •  Description:
  • number of electronic states (bands) to be calculated.
    Note that in spin-polarized calculations the number of
    k-point, not the number of bands per k-point, is doubled
             
} # ------------------------------------------------------------------------ help tot_charge -helpfmt helpdoc -helptext {
  •  Variable: tot_charge

  •  Type: REAL

  •  Default: 0.0

  •  Description:
  • total charge of the system. Useful for simulations with charged cells.
    By default the unit cell is assumed to be neutral (tot_charge=0).
    tot_charge=+1 means one electron missing from the system,
    tot_charge=-1 means one additional electron, and so on.
    
    In a periodic calculation a compensating jellium background is
    inserted to remove divergences if the cell is not neutral.
             
} # ------------------------------------------------------------------------ help tot_magnetization -helpfmt helpdoc -helptext {
  •  Variable: tot_magnetization

  •  Type: REAL

  •  Default: -1 [unspecified]

  •  Description:
  • total majority spin charge - minority spin charge.
    Used to impose a specific total electronic magnetization.
    If unspecified then tot_magnetization variable is ignored and
    the amount of electronic magnetization is determined during
    the self-consistent cycle.
             
} # ------------------------------------------------------------------------ help starting_magnetization -helpfmt helpdoc -helptext {
  •  Variables: starting_magnetization(i), i=1,ntyp

  •  Type: REAL

  •  Description:
  • starting spin polarization on atomic type 'i' in a spin
    polarized calculation. Values range between -1 (all spins
    down for the valence electrons of atom type 'i') to 1
    (all spins up). Breaks the symmetry and provides a starting
    point for self-consistency. The default value is zero, BUT a
    value MUST be specified for AT LEAST one atomic type in spin
    polarized calculations, unless you constrain the magnetization
    (see "tot_magnetization" and "constrained_magnetization").
    Note that if you start from zero initial magnetization, you
    will invariably end up in a nonmagnetic (zero magnetization)
    state. If you want to start from an antiferromagnetic state,
    you may need to define two different atomic species
    corresponding to sublattices of the same atomic type.
    starting_magnetization is ignored if you are performing a
    non-scf calculation, if you are restarting from a previous
    run, or restarting from an interrupted run.
    If you fix the magnetization with "tot_magnetization",
    you should not specify starting_magnetization.
             
} # ------------------------------------------------------------------------ help ecutwfc -helpfmt helpdoc -helptext {
  •  Variable: ecutwfc

  •  Type: REAL

  •  Status: REQUIRED

  •  Description:
  • kinetic energy cutoff (Ry) for wavefunctions
             
} # ------------------------------------------------------------------------ help ecutrho -helpfmt helpdoc -helptext {
  •  Variable: ecutrho

  •  Type: REAL

  •  Default: 4 * ecutwfc

  •  Description:
  • kinetic energy cutoff (Ry) for charge density and potential
    For norm-conserving pseudopotential you should stick to the
    default value, you can reduce it by a little but it will
    introduce noise especially on forces and stress.
    If there are ultrasoft PP, a larger value than the default is
    often desirable (ecutrho = 8 to 12 times ecutwfc, typically).
    PAW datasets can often be used at 4*ecutwfc, but it depends
    on the shape of augmentation charge: testing is mandatory.
    The use of gradient-corrected functional, especially in cells
    with vacuum, or for pseudopotential without non-linear core
    correction, usually requires an higher values of ecutrho
    to be accurately converged.
             
} # ------------------------------------------------------------------------ help ecutfock -helpfmt helpdoc -helptext {
  •  Variable: ecutfock

  •  Type: REAL

  •  Default: ecutrho

  •  Description:
  • kinetic energy cutoff (Ry) for the exact exchange operator in
    EXX type calculations. By default this is the same as ecutrho
    but in some EXX calculations significant speed-up can be found
    by reducing ecutfock, at the expense of some loss in accuracy.
    Currently only implemented for the optimized gamma point only
    calculations.
             
} # ------------------------------------------------------------------------ grouphelp {nr1 nr2 nr3} -helpfmt helpdoc -helptext {
  •  Variables: nr1, nr2, nr3

  •  Type: INTEGER

  •  Description:
  • three-dimensional FFT mesh (hard grid) for charge
    density (and scf potential). If not specified
    the grid is calculated based on the cutoff for
    charge density (see also "ecutrho")
    Note: you must specify all three dimensions for this setting to
    be used.
             
} # ------------------------------------------------------------------------ grouphelp {nr1s nr2s nr3s} -helpfmt helpdoc -helptext {
  •  Variables: nr1s, nr2s, nr3s

  •  Type: INTEGER

  •  Description:
  • three-dimensional mesh for wavefunction FFT and for the smooth
    part of charge density ( smooth grid ).
    Coincides with nr1, nr2, nr3 if ecutrho = 4 * ecutwfc ( default )
    Note: you must specify all three dimensions for this setting to
    be used.
             
} # ------------------------------------------------------------------------ help nosym -helpfmt helpdoc -helptext {
  •  Variable: nosym

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • if (.TRUE.) symmetry is not used. Note that
    - if the k-point grid is provided in input, it is used "as is"
      and symmetry-inequivalent k-points are not generated;
    - if the k-point grid is automatically generated, it will
      contain only points in the irreducible BZ for the bravais
      lattice, irrespective of the actual crystal symmetry.
    A careful usage of this option can be advantageous
    - in low-symmetry large cells, if you cannot afford a k-point
      grid with the correct symmetry
    - in MD simulations
    - in calculations for isolated atoms
             
} # ------------------------------------------------------------------------ help nosym_evc -helpfmt helpdoc -helptext {
  •  Variable: nosym_evc

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • if(.TRUE.) symmetry is not used but the k-points are
    forced to have the symmetry of the Bravais lattice;
    an automatically generated k-point grid will contain
    all the k-points of the grid and the points rotated by
    the symmetries of the Bravais lattice which are not in the
    original grid. If available, time reversal is
    used to reduce the k-points (and the q => -q symmetry
    is used in the phonon code). To disable also this symmetry set
    noinv=.TRUE..
             
} # ------------------------------------------------------------------------ help noinv -helpfmt helpdoc -helptext {
  •  Variable: noinv

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • if (.TRUE.) disable the usage of k => -k symmetry
    (time reversal) in k-point generation
             
} # ------------------------------------------------------------------------ help no_t_rev -helpfmt helpdoc -helptext {
  •  Variable: no_t_rev

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • if (.TRUE.) disable the usage of magnetic symmetry operations
    that consist in a rotation + time reversal.
             
} # ------------------------------------------------------------------------ help force_symmorphic -helpfmt helpdoc -helptext {
  •  Variable: force_symmorphic

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • if (.TRUE.) force the symmetry group to be symmorphic by disabling
    symmetry operations having an associated fractionary translation
             
} # ------------------------------------------------------------------------ help use_all_frac -helpfmt helpdoc -helptext {
  •  Variable: use_all_frac

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • if (.TRUE.) do not discard symmetry operations with an
    associated fractionary translation that does not send the
    real-space FFT grid into itself. These operations are
    incompatible with real-space symmetrization but not with the
    new G-space symmetrization. BEWARE: do not use for phonons!
    The phonon code still uses real-space symmetrization.
             
} # ------------------------------------------------------------------------ help occupations -helpfmt helpdoc -helptext {
  •  Variable: occupations

  •  Type: CHARACTER

  •  Description:
  • 'smearing':     gaussian smearing for metals
                    see variables 'smearing' and 'degauss'
    
    'tetrahedra' :  especially suited for calculation of DOS
                    (see P.E. Bloechl, PRB49, 16223 (1994))
                    Requires uniform grid of k-points,
                    automatically generated (see below)
                    Not suitable (because not variational) for
                    force/optimization/dynamics calculations
    
    'fixed' :       for insulators with a gap
    
    'from_input' :  The occupation are read from input file.
                    Requires "nbnd" to be set in input.
                    Occupations should be consistent with the
                    value of "tot_charge".
             
} # ------------------------------------------------------------------------ help one_atom_occupations -helpfmt helpdoc -helptext {
  •  Variable: one_atom_occupations

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • This flag is used for isolated atoms (nat=1) together with
    occupations='from_input'. If it is .TRUE., the wavefunctions
    are ordered as the atomic starting wavefunctions, independently
    from their eigenvalue. The occupations indicate which atomic
    states are filled.
    The order of the states is written inside the UPF
    pseudopotential file.
    In the scalar relativistic case:
    S -> l=0, m=0
    P -> l=1, z, x, y
    D -> l=2, r^2-3z^2, xz, yz, xy, x^2-y^2
    In the noncollinear magnetic case (with or without spin-orbit),
    each group of states is doubled. For instance:
    P -> l=1, z, x, y for spin up, l=1, z, x, y for spin down.
    Up and down is relative to the direction of the starting
    magnetization.
    In the case with spin-orbit and time-reversal
    (starting_magnetization=0.0) the atomic wavefunctions are
    radial functions multiplied by spin-angle functions.
    For instance:
    P -> l=1, j=1/2, m_j=-1/2,1/2. l=1, j=3/2,
         m_j=-3/2, -1/2, 1/2, 3/2.
    In the magnetic case with spin-orbit the atomic wavefunctions
    can be forced to be spin-angle functions by setting
    starting_spin_angle to .TRUE..
             
} # ------------------------------------------------------------------------ help starting_spin_angle -helpfmt helpdoc -helptext {
  •  Variable: starting_spin_angle

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • In the spin-orbit case when domag=.TRUE., by default,
    the starting wavefunctions are initialized as in scalar
    relativistic noncollinear case without spin-orbit.
    By setting starting_spin_angle=.TRUE. this behaviour can
    be changed and the initial wavefunctions are radial
    functions multiplied by spin-angle functions.
    When domag=.FALSE. the initial wavefunctions are always
    radial functions multiplied by spin-angle functions
    independently from this flag.
    When lspinorb is .FALSE. this flag is not used.
             
} # ------------------------------------------------------------------------ help degauss -helpfmt helpdoc -helptext {
  •  Variable: degauss

  •  Type: REAL

  •  Default: 0.D0 Ry

  •  Description:
  • value of the gaussian spreading (Ry) for brillouin-zone
    integration in metals.
             
} # ------------------------------------------------------------------------ help smearing -helpfmt helpdoc -helptext {
  •  Variable: smearing

  •  Type: CHARACTER

  •  Default: 'gaussian'

  •  Description:
  • 'gaussian', 'gauss':
        ordinary Gaussian spreading (Default)
    
    'methfessel-paxton', 'm-p', 'mp':
        Methfessel-Paxton first-order spreading
        (see PRB 40, 3616 (1989)).
    
    'marzari-vanderbilt', 'cold', 'm-v', 'mv':
        Marzari-Vanderbilt cold smearing
        (see PRL 82, 3296 (1999))
    
    'fermi-dirac', 'f-d', 'fd':
        smearing with Fermi-Dirac function
             
} # ------------------------------------------------------------------------ help nspin -helpfmt helpdoc -helptext {
  •  Variable: nspin

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • nspin = 1 :  non-polarized calculation (default)
    
    nspin = 2 :  spin-polarized calculation, LSDA
                 (magnetization along z axis)
    
    nspin = 4 :  spin-polarized calculation, noncollinear
                 (magnetization in generic direction)
                 DO NOT specify nspin in this case;
                 specify "noncolin=.TRUE." instead
             
} # ------------------------------------------------------------------------ help noncolin -helpfmt helpdoc -helptext {
  •  Variable: noncolin

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • if .true. the program will perform a noncollinear calculation.
             
} # ------------------------------------------------------------------------ help ecfixed -helpfmt helpdoc -helptext {
  •  Variable: ecfixed

  •  Type: REAL

  •  Default: 0.0

  •  See: q2sigma

} # ------------------------------------------------------------------------ help qcutz -helpfmt helpdoc -helptext {
  •  Variable: qcutz

  •  Type: REAL

  •  Default: 0.0

  •  See: q2sigma

} # ------------------------------------------------------------------------ help q2sigma -helpfmt helpdoc -helptext {
  •  Variable: q2sigma

  •  Type: REAL

  •  Default: 0.1

  •  Description:
  • ecfixed, qcutz, q2sigma:  parameters for modified functional to be
    used in variable-cell molecular dynamics (or in stress calculation).
    "ecfixed" is the value (in Rydberg) of the constant-cutoff;
    "qcutz" and "q2sigma" are the height and the width (in Rydberg)
    of the energy step for reciprocal vectors whose square modulus
    is greater than "ecfixed". In the kinetic energy, G^2 is
    replaced by G^2 + qcutz * (1 + erf ( (G^2 - ecfixed)/q2sigma) )
    See: M. Bernasconi et al, J. Phys. Chem. Solids 56, 501 (1995)
             
} # ------------------------------------------------------------------------ help input_dft -helpfmt helpdoc -helptext {
  •  Variable: input_dft

  •  Type: CHARACTER

  •  Default: read from pseudopotential files

  •  Description:
  • Exchange-correlation functional: eg 'PBE', 'BLYP' etc
    See Modules/functionals.f90 for allowed values.
    Overrides the value read from pseudopotential files.
    Use with care and if you know what you are doing!
             
} # ------------------------------------------------------------------------ help exx_fraction -helpfmt helpdoc -helptext {
  •  Variable: exx_fraction

  •  Type: REAL

  •  Default: it depends on the specified functional

  •  Description:
  • Fraction of EXX for hybrid functional calculations. In the case of
    input_dft='PBE0', the default value is 0.25, while for input_dft='B3LYP'
    the exx_fraction default value is 0.20.
             
} # ------------------------------------------------------------------------ help screening_parameter -helpfmt helpdoc -helptext {
  •  Variable: screening_parameter

  •  Type: REAL

  •  Default: 0.106

  •  Description:
  • screening_parameter for HSE like hybrid functionals.
    See J. Chem. Phys. 118, 8207 (2003)
    and J. Chem. Phys. 124, 219906 (2006) for more informations.
             
} # ------------------------------------------------------------------------ help exxdiv_treatment -helpfmt helpdoc -helptext {
  •  Variable: exxdiv_treatment

  •  Type: CHARACTER

  •  Default: gygi-baldereschi

  •  Description:
  • Specific for EXX. It selects the kind of approach to be used
    for treating the Coulomb potential divergencies at small q vectors.
    
    gygi-baldereschi : appropriate for cubic and quasi-cubic supercells
    vcut_spherical : appropriate for cubic and quasi-cubic supercells
    vcut_ws : appropriate for strongly anisotropic supercells, see also
              ecutvcut.
    none : sets Coulomb potential at G,q=0 to 0.0
             
} # ------------------------------------------------------------------------ help ecutvcut -helpfmt helpdoc -helptext {
  •  Variable: ecutvcut

  •  Type: REAL

  •  Default: 0.0 Ry

  •  See: exxdiv_treatment

  •  Description:
  • Reciprocal space cutoff for correcting
    Coulomb potential divergencies at small q vectors.
             
} # ------------------------------------------------------------------------ grouphelp {nqx1 nqx2 nqx3} -helpfmt helpdoc -helptext {
  •  Variables: nqx1, nqx2, nqx3

  •  Type: INTEGER

  •  Description:
  • three-dimensional mesh for q (k1-k2) sampling of
    the Fock operator (EXX). Can be smaller than
    the number of k-points.
    
    Currently this defaults to the size of the k-point mesh used.
     In QE =< 5.0.2 it defaulted to nqx1=nqx2=nqx3=1.
             
} # ------------------------------------------------------------------------ help lda_plus_u -helpfmt helpdoc -helptext {
  •  Variable: lda_plus_u

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Status: DFT+U (formerly known as LDA+U) currently works only for a few selected elements. Modify PW/set_hubbard_l.f90 and PW/tabd.f90 if you plan to use DFT+U with an element that is not configured there.

  •  Description:
  • Specify lda_plus_u = .TRUE. to enable DFT+U calculations
    See: Anisimov, Zaanen, and Andersen, PRB 44, 943 (1991);
         Anisimov et al., PRB 48, 16929 (1993);
         Liechtenstein, Anisimov, and Zaanen, PRB 52, R5467 (1994).
    You must specify, for each species with a U term, the value of
    U and (optionally) alpha, J of the Hubbard model (all in eV):
    see lda_plus_u_kind, Hubbard_U, Hubbard_alpha, Hubbard_J
             
} # ------------------------------------------------------------------------ help lda_plus_u_kind -helpfmt helpdoc -helptext {
  •  Variable: lda_plus_u_kind

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • Specifies the type of DFT+U calculation:
                      0   simplified version of Cococcioni and de Gironcoli,
                          PRB 71, 035105 (2005), using Hubbard_U
                      1   rotationally invariant scheme of Liechtenstein et al.,
                          using Hubbard_U and Hubbard_J
             
} # ------------------------------------------------------------------------ help Hubbard_U -helpfmt helpdoc -helptext {
  •  Variables: Hubbard_U(i), i=1,ntyp

  •  Type: REAL

  •  Default: 0.D0 for all species

  •  Description:
  • Hubbard_U(i): U parameter (eV) for species i, DFT+U calculation
             
} # ------------------------------------------------------------------------ help Hubbard_J0 -helpfmt helpdoc -helptext {
  •  Variables: Hubbard_J0(i), i=1,ntype

  •  Type: REAL

  •  Default: 0.D0 for all species

  •  Description:
  • Hubbard_J0(i): J0 parameter (eV) for species i, DFT+U+J calculation,
    see PRB 84, 115108 (2011) for details.
             
} # ------------------------------------------------------------------------ help Hubbard_alpha -helpfmt helpdoc -helptext {
  •  Variables: Hubbard_alpha(i), i=1,ntyp

  •  Type: REAL

  •  Default: 0.D0 for all species

  •  Description:
  • Hubbard_alpha(i) is the perturbation (on atom i, in eV)
    used to compute U with the linear-response method of
    Cococcioni and de Gironcoli, PRB 71, 35105 (2005)
    (only for lda_plus_u_kind=0)
             
} # ------------------------------------------------------------------------ help Hubbard_beta -helpfmt helpdoc -helptext {
  •  Variables: Hubbard_beta(i), i=1,ntyp

  •  Type: REAL

  •  Default: 0.D0 for all species

  •  Description:
  • Hubbard_beta(i) is the perturbation (on atom i, in eV)
    used to compute J0 with the linear-response method of
    Cococcioni and de Gironcoli, PRB 71, 35105 (2005)
    (only for lda_plus_u_kind=0). See also
    PRB 84, 115108 (2011).
             
} # ------------------------------------------------------------------------ help U_projection_type -helpfmt helpdoc -helptext {
  •  Variable: U_projection_type

  •  Type: CHARACTER

  •  Default: 'atomic'

  •  Description:
  • Only active when lda_plus_U is .true., specifies the type
    of projector on localized orbital to be used in the DFT+U
    scheme.
    
    Currently available choices:
    'atomic': use atomic wfc's (as they are) to build the projector
    
    'ortho-atomic': use Lowdin orthogonalized atomic wfc's
    
    'norm-atomic':  Lowdin normalization of atomic wfc. Keep in mind:
                    atomic wfc are not orthogonalized in this case.
                    This is a "quick and dirty" trick to be used when
                    atomic wfc from the pseudopotential are not
                    normalized (and thus produce occupation whose
                    value exceeds unity). If orthogonalized wfc are
                    not needed always try 'atomic' first.
    
    'file':         use the information from file "prefix".atwfc that must
                    have been generated previously, for instance by pmw.x
                    (see PP/poormanwannier.f90 for details).
    
    'pseudo':       use the pseudopotential projectors. The charge density
                    outside the atomic core radii is excluded.
                    N.B.: for atoms with +U, a pseudopotential with the
                    all-electron atomic wavefunctions is required (i.e.,
                    as generated by ld1.x with lsave_wfc flag).
    
    NB: forces and stress currently implemented only for the
    'atomic' and 'pseudo' choice.
             
} # ------------------------------------------------------------------------ help edir -helpfmt helpdoc -helptext {
  •  Variable: edir

  •  Type: INTEGER

  •  Description:
  • The direction of the electric field or dipole correction is
    parallel to the bg(:,edir) reciprocal lattice vector, so the
    potential is constant in planes defined by FFT grid points;
    edir = 1, 2 or 3. Used only if tefield is .TRUE.
             
} # ------------------------------------------------------------------------ help emaxpos -helpfmt helpdoc -helptext {
  •  Variable: emaxpos

  •  Type: REAL

  •  Default: 0.5D0

  •  Description:
  • Position of the maximum of the saw-like potential along crystal
    axis "edir", within the  unit cell (see below), 0 < emaxpos < 1
    Used only if tefield is .TRUE.
             
} # ------------------------------------------------------------------------ help eopreg -helpfmt helpdoc -helptext {
  •  Variable: eopreg

  •  Type: REAL

  •  Default: 0.1D0

  •  Description:
  • Zone in the unit cell where the saw-like potential decreases.
    ( see below, 0 < eopreg < 1 ). Used only if tefield is .TRUE.
             
} # ------------------------------------------------------------------------ help eamp -helpfmt helpdoc -helptext {
  •  Variable: eamp

  •  Type: REAL

  •  Default: 0.001 a.u.

  •  Description:
  • Amplitude of the electric field, in ***Hartree*** a.u.;
    1 a.u. = 51.4220632*10^10 V/m). Used only if tefield=.TRUE.
    The saw-like potential increases with slope "eamp" in the
    region from (emaxpos+eopreg-1) to (emaxpos), then decreases
    to 0 until (emaxpos+eopreg), in units of the crystal
    vector "edir". Important: the change of slope of this
    potential must be located in the empty region, or else
    unphysical forces will result.
             
} # ------------------------------------------------------------------------ help angle1 -helpfmt helpdoc -helptext {
  •  Variables: angle1(i), i=1,ntyp

  •  Type: REAL

  •  Description:
  • The angle expressed in degrees between the initial
    magnetization and the z-axis. For noncollinear calculations
    only; index i runs over the atom types.
             
} # ------------------------------------------------------------------------ help angle2 -helpfmt helpdoc -helptext {
  •  Variables: angle2(i), i=1,ntyp

  •  Type: REAL

  •  Description:
  • The angle expressed in degrees between the projection
    of the initial magnetization on x-y plane and the x-axis.
    For noncollinear calculations only.
             
} # ------------------------------------------------------------------------ help constrained_magnetization -helpfmt helpdoc -helptext {
  •  Variable: constrained_magnetization

  •  Type: CHARACTER

  •  Default: 'none'

  •  See: lambda, fixed_magnetization

  •  Description:
  • Used to perform constrained calculations in magnetic systems.
    Currently available choices:
    
    'none':
             no constraint
    
    'total':
             total magnetization is constrained by
             adding a penalty functional to the total energy:
    
             LAMBDA * SUM_{i} ( magnetization(i) - fixed_magnetization(i) )**2
    
             where the sum over i runs over the three components of
             the magnetization. Lambda is a real number (see below).
             Noncolinear case only. Use "tot_magnetization" for LSDA
    
    'atomic':
             atomic magnetization are constrained to the defined
             starting magnetization adding a penalty:
    
             LAMBDA * SUM_{i,itype} ( magnetic_moment(i,itype) - mcons(i,itype) )**2
    
             where i runs over the cartesian components (or just z
             in the collinear case) and itype over the types (1-ntype).
             mcons(:,:) array is defined from starting_magnetization,
             (and angle1, angle2 in the non-collinear case). lambda is
             a real number
    
    'total direction':
              the angle theta of the total magnetization
              with the z axis (theta = fixed_magnetization(3))
              is constrained:
    
              LAMBDA * ( arccos(magnetization(3)/mag_tot) - theta )**2
    
              where mag_tot is the modulus of the total magnetization.
    
    'atomic direction':
              not all the components of the atomic
              magnetic moment are constrained but only the cosine
              of angle1, and the penalty functional is:
    
              LAMBDA * SUM_{itype} ( mag_mom(3,itype)/mag_mom_tot - cos(angle1(ityp)) )**2
    
    N.B.: symmetrization may prevent to reach the desired orientation
          of the magnetization. Try not to start with very highly symmetric
          configurations or use the nosym flag (only as a last remedy)
             
} # ------------------------------------------------------------------------ help fixed_magnetization -helpfmt helpdoc -helptext {
  •  Variables: fixed_magnetization(i), i=1,3

  •  Type: REAL

  •  Default: 0.d0

  •  See: constrained_magnetization

  •  Description:
  • total magnetization vector (x,y,z components) to be kept
    fixed when constrained_magnetization='total'
             
} # ------------------------------------------------------------------------ help lambda -helpfmt helpdoc -helptext {
  •  Variable: lambda

  •  Type: REAL

  •  Default: 1.d0

  •  See: constrained_magnetization

  •  Description:
  • parameter used for constrained_magnetization calculations
    N.B.: if the scf calculation does not converge, try to reduce lambda
          to obtain convergence, then restart the run with a larger lambda
             
} # ------------------------------------------------------------------------ help report -helpfmt helpdoc -helptext {
  •  Variable: report

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • It is the number of iterations after which the program
    write all the atomic magnetic moments.
             
} # ------------------------------------------------------------------------ help lspinorb -helpfmt helpdoc -helptext {
  •  Variable: lspinorb

  •  Type: LOGICAL

  •  Description:
  • if .TRUE. the noncollinear code can use a pseudopotential with
    spin-orbit.
             
} # ------------------------------------------------------------------------ help assume_isolated -helpfmt helpdoc -helptext {
  •  Variable: assume_isolated

  •  Type: CHARACTER

  •  Default: 'none'

  •  Description:
  • Used to perform calculation assuming the system to be
    isolated (a molecule or a cluster in a 3D supercell).
    
    Currently available choices:
    
    'none' (default): regular periodic calculation w/o any correction.
    
    'makov-payne', 'm-p', 'mp' : the Makov-Payne correction to the
             total energy is computed. An estimate of the vacuum
             level is also calculated so that eigenvalues can be
             properly aligned. ONLY FOR CUBIC SYSTEMS (ibrav=1,2,3)
             Theory:
             G.Makov, and M.C.Payne,
             "Periodic boundary conditions in ab initio
             calculations" , Phys.Rev.B 51, 4014 (1995)
    
    'dcc' :  density counter charge correction CURRENTLY DISABLED
             The electrostatic problem is solved in open boundary
             conditions (OBC). This approach provides the correct
             scf potential and energies (not just a correction to
             energies as 'mp'). BEWARE: the molecule should be
             centered around the middle of the cell, not around
             the origin (0,0,0).
             Theory described in:
             I.Dabo, B.Kozinsky, N.E.Singh-Miller and N.Marzari,
             "Electrostatic periodic boundary conditions and
             real-space corrections", Phys.Rev.B 77, 115139 (2008)
    
    'martyna-tuckerman', 'm-t', 'mt' : Martyna-Tuckerman correction.
             As for the dcc correction the scf potential is also
             corrected. Implementation adapted from:
             G.J. Martyna, and M.E. Tuckerman,
             "A reciprocal space based method for treating long
             range interactions in ab-initio and force-field-based
             calculation in clusters", J.Chem.Phys. 110, 2810 (1999)
    
    'esm' :  Effective Screening Medium Method.
             For polarized or charged slab calculation, embeds
             the simulation cell within an effective semi-
             infinite medium in the perpendicular direction
             (along z). Embedding regions can be vacuum or
             semi-infinite metal electrodes (use 'esm_bc' to
             choose boundary conditions). If between two
             electrodes, an optional electric field
             ('esm_efield') may be applied. Method described in
             M. Otani and O. Sugino, "First-principles
             calculations of charged surfaces and interfaces:
             A plane-wave nonrepeated slab approach," PRB 73,
             115407 (2006).
             NB: Requires cell with a_3 lattice vector along z,
             normal to the xy plane, with the slab centered
             around z=0. Also requires symmetry checking to be
             disabled along z, either by setting 'nosym' = .TRUE.
             or by very slight displacement (i.e., 5e-4 a.u.)
             of the slab along z.
             See 'esm_bc', 'esm_efield', 'esm_w', 'esm_nfit'.
             
} # ------------------------------------------------------------------------ help esm_bc -helpfmt helpdoc -helptext {
  •  Variable: esm_bc

  •  Type: CHARACTER

  •  Default: 'pbc'

  •  See: assume_isolated

  •  Description:
  • If assume_isolated = 'esm', determines the boundary
    conditions used for either side of the slab.
    
    Currently available choices:
    
    'pbc' (default): regular periodic calculation (no ESM).
    
    'bc1' : Vacuum-slab-vacuum (open boundary conditions)
    
    'bc2' : Metal-slab-metal (dual electrode configuration).
            See also 'esm_efield'.
    
    'bc3' : Vacuum-slab-metal
             
} # ------------------------------------------------------------------------ help esm_w -helpfmt helpdoc -helptext {
  •  Variable: esm_w

  •  Type: REAL

  •  Default: 0.d0

  •  See: assume_isolated

  •  Description:
  • If assume_isolated = 'esm', determines the position offset
    [in a.u.] of the start of the effective screening region,
    measured relative to the cell edge. (ESM region begins at
    z = +/- [L_z/2 + esm_w] ).
             
} # ------------------------------------------------------------------------ help esm_efield -helpfmt helpdoc -helptext {
  •  Variable: esm_efield

  •  Type: REAL

  •  Default: 0.d0

  •  See: assume_isolated, esm_bc

  •  Description:
  • If assume_isolated = 'esm' and esm_bc = 'bc2', gives the
    magnitude of the electric field [Ry/a.u.] to be applied
    between semi-infinite ESM electrodes.
             
} # ------------------------------------------------------------------------ help esm_nfit -helpfmt helpdoc -helptext {
  •  Variable: esm_nfit

  •  Type: INTEGER

  •  Default: 4

  •  See: assume_isolated

  •  Description:
  • If assume_isolated = 'esm', gives the number of z-grid points
    for the polynomial fit along the cell edge.
             
} # ------------------------------------------------------------------------ help vdw_corr -helpfmt helpdoc -helptext {
  •  Variable: vdw_corr

  •  Type: CHARACTER

  •  Default: 'none'

  •  Description:
  • Type of Van der Waals correction. Allowed values:
    
       'grimme-d2', 'Grimme-D2', 'DFT-D', 'dft-d': semiempirical Grimme's DFT-D2.
        Optional variables: "london_s6", "london_rcut"
        S. Grimme, J. Comp. Chem. 27, 1787 (2006),
        V. Barone et al., J. Comp. Chem. 30, 934 (2009).
    
        'TS', 'ts', 'ts-vdw', 'ts-vdW', 'tkatchenko-scheffler': Tkatchenko-Scheffler
         dispersion corrections with first-principle derived C6 coefficients
         (implemented in CP only). Optional variables: "ts_vdw_econv_thr", "ts_vdw_isolated"
         See A. Tkatchenko and M. Scheffler, Phys. Rev. Lett. 102, 073005 (2009)
    
        'XDM', 'xdm': Exchange-hole dipole-moment model. Optional variables: "xdm_a1", "xdm_a2"
         A. D. Becke and E. R. Johnson, J. Chem. Phys. 127, 154108 (2007)
             A. Otero de la Roza, E. R. Johnson, J. Chem. Phys. 136, 174109 (2012)
    
    Note that non-local functionals (eg vdw-DF) are NOT specified here but in "input_dft"
             
} # ------------------------------------------------------------------------ help london -helpfmt helpdoc -helptext {
  •  Variable: london

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • OBSOLESCENT, same as vdw_corr='DFT-D'
             
} # ------------------------------------------------------------------------ help london_s6 -helpfmt helpdoc -helptext {
  •  Variable: london_s6

  •  Type: REAL

  •  Default: 0.75

  •  Description:
  • global scaling parameter for DFT-D. Default is good for PBE.
             
} # ------------------------------------------------------------------------ help london_rcut -helpfmt helpdoc -helptext {
  •  Variable: london_rcut

  •  Type: REAL

  •  Default: 200

  •  Description:
  • cutoff radius (a.u.) for dispersion interactions
             
} # ------------------------------------------------------------------------ help xdm -helpfmt helpdoc -helptext {
  •  Variable: xdm

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • OBSOLESCENT, same as vdw_corr='xdm'
             
} # ------------------------------------------------------------------------ help xdm_a1 -helpfmt helpdoc -helptext {
  •  Variable: xdm_a1

  •  Type: REAL

  •  Default: 0.6836

  •  Description:
  • Damping function parameter a1 (adimensional). This value should change
    with the exchange-correlation functional. The default corresponds to
    PW86PBE.
    For other functionals, see:
       http://gatsby.ucmerced.edu/wiki/XDM_damping_function_parameters
       A. Otero de la Roza, E. R. Johnson, J. Chem. Phys. 138, 204109 (2013)
             
} # ------------------------------------------------------------------------ help xdm_a2 -helpfmt helpdoc -helptext {
  •  Variable: xdm_a2

  •  Type: REAL

  •  Default: 1.5045

  •  Description:
  • Damping function parameter a2 (angstrom). This value should change
    with the exchange-correlation functional. The default corresponds to
    PW86PBE.
    For other functionals, see:
       http://gatsby.ucmerced.edu/wiki/XDM_damping_function_parameters
       A. Otero de la Roza, E. R. Johnson, J. Chem. Phys. 138, 204109 (2013)
             
} # ------------------------------------------------------------------------ help electron_maxstep -helpfmt helpdoc -helptext {
  •  Variable: electron_maxstep

  •  Type: INTEGER

  •  Default: 100

  •  Description:
  • maximum number of iterations in a scf step
             
} # ------------------------------------------------------------------------ help scf_must_converge -helpfmt helpdoc -helptext {
  •  Variable: scf_must_converge

  •  Type: LOGICAL

  •  Default: .TRUE.

  •  Description:
  • If .false. do not stop molecular dynamics or ionic relaxation
    when electron_maxstep is reached. Use with care.
             
} # ------------------------------------------------------------------------ help conv_thr -helpfmt helpdoc -helptext {
  •  Variable: conv_thr

  •  Type: REAL

  •  Default: 1.D-6

  •  Description:
  • Convergence threshold for selfconsistency:
       estimated energy error < conv_thr
    (note that conv_thr is extensive, like the total energy).
    For non-self-consistent calculations, conv_thr is used
    to set the default value of the threshold (ethr) for
    iterative diagonalizazion: see diago_thr_init
             
} # ------------------------------------------------------------------------ help adaptive_thr -helpfmt helpdoc -helptext {
  •  Variable: adaptive_thr

  •  Type: LOGICAL

  •  Default: .FALSE

  •  Description:
  • If .TRUE. this turns on the use of an adaptive conv_thr for
    the inner scf loops when using EXX.
             
} # ------------------------------------------------------------------------ help conv_thr_init -helpfmt helpdoc -helptext {
  •  Variable: conv_thr_init

  •  Type: REAL

  •  Default: 1.D-3

  •  Description:
  • When adaptive_thr = .TRUE. this is the convergence threshold
    used for the first scf cycle.
             
} # ------------------------------------------------------------------------ help conv_thr_multi -helpfmt helpdoc -helptext {
  •  Variable: conv_thr_multi

  •  Type: REAL

  •  Default: 1.D-1

  •  Description:
  • When adaptive_thr = .TRUE. the convergence threshold for
    each scf cycle is given by:
    max( conv_thr, conv_thr_multi * dexx )
             
} # ------------------------------------------------------------------------ help mixing_mode -helpfmt helpdoc -helptext {
  •  Variable: mixing_mode

  •  Type: CHARACTER

  •  Default: 'plain'

  •  Description:
  • 'plain' :    charge density Broyden mixing
    
    'TF' :       as above, with simple Thomas-Fermi screening
                (for highly homogeneous systems)
    
    'local-TF':  as above, with local-density-dependent TF screening
                 (for highly inhomogeneous systems)
             
} # ------------------------------------------------------------------------ help mixing_beta -helpfmt helpdoc -helptext {
  •  Variable: mixing_beta

  •  Type: REAL

  •  Default: 0.7D0

  •  Description:
  • mixing factor for self-consistency
             
} # ------------------------------------------------------------------------ help mixing_ndim -helpfmt helpdoc -helptext {
  •  Variable: mixing_ndim

  •  Type: INTEGER

  •  Default: 8

  •  Description:
  • number of iterations used in mixing scheme.
    If you are tight with memory, you may reduce it to 4 or so.
             
} # ------------------------------------------------------------------------ help mixing_fixed_ns -helpfmt helpdoc -helptext {
  •  Variable: mixing_fixed_ns

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • For DFT+U : number of iterations with fixed ns ( ns is the
      atomic density appearing in the Hubbard term ).
             
} # ------------------------------------------------------------------------ help diagonalization -helpfmt helpdoc -helptext {
  •  Variable: diagonalization

  •  Type: CHARACTER

  •  Default: 'david'

  •  Description:
  • 'david':  Davidson iterative diagonalization with overlap matrix
              (default). Fast, may in some rare cases fail.
    
    'cg' :    conjugate-gradient-like band-by-band diagonalization
              Typically slower than 'david' but it uses less memory
              and is more robust (it seldom fails)
    
    'cg-serial', 'david-serial': obsolete, use "-ndiag 1 instead"
              The subspace diagonalization in Davidson is performed
              by a fully distributed-memory parallel algorithm on
              4 or more processors, by default. The allocated memory
              scales down with the number of procs. Procs involved
              in diagonalization can be changed with command-line
              option "-ndiag N". On multicore CPUs it is often
              convenient to let just one core per CPU to work
              on linear algebra.
             
} # ------------------------------------------------------------------------ help ortho_para -helpfmt helpdoc -helptext {
  •  Variable: ortho_para

  •  Type: INTEGER

  •  Default: 0

  •  Status: OBSOLETE: use command-line option " -ndiag XX" instead

  •  Description:
  • 
             
} # ------------------------------------------------------------------------ help diago_thr_init -helpfmt helpdoc -helptext {
  •  Variable: diago_thr_init

  •  Type: REAL

  •  Description:
  • Convergence threshold (ethr) for iterative diagonalization
    (the check is on eigenvalue convergence).
    For scf calculations: default is 1.D-2 if starting from a
    superposition of atomic orbitals; 1.D-5 if starting from a
    charge density. During self consistency the threshold
    is automatically reduced (but never below 1.D-13) when
    approaching convergence.
    For non-scf calculations: default is (conv_thr/N elec)/10.
             
} # ------------------------------------------------------------------------ help diago_cg_maxiter -helpfmt helpdoc -helptext {
  •  Variable: diago_cg_maxiter

  •  Type: INTEGER

  •  Description:
  • For conjugate gradient diagonalization:
    max number of iterations
             
} # ------------------------------------------------------------------------ help diago_david_ndim -helpfmt helpdoc -helptext {
  •  Variable: diago_david_ndim

  •  Type: INTEGER

  •  Default: 4

  •  Description:
  • For Davidson diagonalization: dimension of workspace
    (number of wavefunction packets, at least 2 needed).
    A larger value may yield a somewhat faster algorithm
    but uses more memory. The opposite holds for smaller values.
    Try diago_david_ndim=2 if you are tight on memory or if
    your job is large: the speed penalty is often negligible
             
} # ------------------------------------------------------------------------ help diago_full_acc -helpfmt helpdoc -helptext {
  •  Variable: diago_full_acc

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • If .TRUE. all the empty states are diagonalized at the same level
    of accuracy of the occupied ones. Otherwise the empty states are
    diagonalized using a larger threshold (this should not affect
    total energy, forces, and other ground-state properties).
             
} # ------------------------------------------------------------------------ help efield -helpfmt helpdoc -helptext {
  •  Variable: efield

  •  Type: REAL

  •  Default: 0.D0

  •  Description:
  • Amplitude of the finite electric field (in Ry a.u.;
    1 a.u. = 36.3609*10^10 V/m). Used only if lelfield=.TRUE.
    and if k-points (K_POINTS card) are not automatic.
             
} # ------------------------------------------------------------------------ help efield_cart -helpfmt helpdoc -helptext {
  •  Variables: efield_cart(i), i=1,3

  •  Type: REAL

  •  Default: (0.D0, 0.D0, 0.D0)

  •  Description:
  • Finite electric field (in Ry a.u.=36.3609*10^10 V/m) in
    cartesian axis. Used only if lelfield=.TRUE. and if
    k-points (K_POINTS card) are automatic.
             
} # ------------------------------------------------------------------------ help startingpot -helpfmt helpdoc -helptext {
  •  Variable: startingpot

  •  Type: CHARACTER

  •  Description:
  • 'atomic': starting potential from atomic charge superposition
              ( default for scf, *relax, *md )
    
    'file'  : start from existing "charge-density.xml" file in the
              directory specified by variables "prefix" and "outdir"
              For nscf and bands calculation this is the default
              and the only sensible possibility.
             
} # ------------------------------------------------------------------------ help startingwfc -helpfmt helpdoc -helptext {
  •  Variable: startingwfc

  •  Type: CHARACTER

  •  Default: 'atomic+random'

  •  Description:
  • 'atomic': start from superposition of atomic orbitals
              If not enough atomic orbitals are available,
              fill with random numbers the remaining wfcs
              The scf typically starts better with this option,
              but in some high-symmetry cases one can "loose"
              valence states, ending up in the wrong ground state.
    
    'atomic+random': as above, plus a superimposed "randomization"
              of atomic orbitals. Prevents the "loss" of states
              mentioned above.
    
    'random': start from random wfcs. Slower start of scf but safe.
              It may also reduce memory usage in conjunction with
              diagonalization='cg'
    
    'file':   start from an existing wavefunction file in the
              directory specified by variables "prefix" and "outdir"
             
} # ------------------------------------------------------------------------ help tqr -helpfmt helpdoc -helptext {
  •  Variable: tqr

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • If .true., use the real-space algorithm for augmentation
    charges in ultrasoft pseudopotentials.
    Must faster execution of ultrasoft-related calculations,
    but numerically less accurate than the default algorithm.
    Use with care and after testing!
             
} # ------------------------------------------------------------------------ help ion_dynamics -helpfmt helpdoc -helptext {
  •  Variable: ion_dynamics

  •  Type: CHARACTER

  •  Description:
  • Specify the type of ionic dynamics.
    
    For different type of calculation different possibilities are
    allowed and different default values apply:
    
    CASE ( calculation = 'relax' )
        'bfgs' :   (default)   use BFGS quasi-newton algorithm,
                               based on the trust radius procedure,
                               for structural relaxation
        'damp' :               use damped (quick-min Verlet)
                               dynamics for structural relaxation
                               Can be used for constrained
                               optimisation: see CONSTRAINTS card
    
    CASE ( calculation = 'md' )
        'verlet' : (default)   use Verlet algorithm to integrate
                               Newton's equation. For constrained
                               dynamics, see CONSTRAINTS card
        'langevin'             ion dynamics is over-damped Langevin
        'langevin-smc'         over-damped Langevin with Smart Monte Carlo:
                               see R.J.Rossky, JCP, 69, 4628(1978)
    
    
    CASE ( calculation = 'vc-relax' )
        'bfgs' :   (default)   use BFGS quasi-newton algorithm;
                               cell_dynamics must be 'bfgs' too
        'damp' :               use damped (Beeman) dynamics for
                               structural relaxation
    CASE ( calculation = 'vc-md' )
        'beeman' : (default)   use Beeman algorithm to integrate
                               Newton's equation
             
} # ------------------------------------------------------------------------ help ion_positions -helpfmt helpdoc -helptext {
  •  Variable: ion_positions

  •  Type: CHARACTER

  •  Default: 'default'

  •  Description:
  • 'default '  : if restarting, use atomic positions read from the
                  restart file; in all other cases, use atomic
                  positions from standard input.
    
    'from_input' : restart the simulation with atomic positions read
                  from standard input, even if restarting.
             
} # ------------------------------------------------------------------------ help phase_space -helpfmt helpdoc -helptext {
  •  Variable: phase_space

  •  Type: CHARACTER

  •  Default: 'full'

  •  Description:
  • 'full' :           the full phase-space is used for the ionic
                       dynamics.
    
    'coarse-grained' : a coarse-grained phase-space, defined by a set
                       of constraints, is used for the ionic dynamics
                       (used for calculation of free-energy barriers)
             
} # ------------------------------------------------------------------------ help pot_extrapolation -helpfmt helpdoc -helptext {
  •  Variable: pot_extrapolation

  •  Type: CHARACTER

  •  Default: 'atomic'

  •  Description:
  •    Used to extrapolate the potential from preceding ionic steps.
    
       'none'        :  no extrapolation
    
       'atomic'      :  extrapolate the potential as if it was a sum of
                        atomic-like orbitals
    
       'first_order' :  extrapolate the potential with first-order
                        formula
    
       'second_order':  as above, with second order formula
    
    Note: 'first_order' and 'second-order' extrapolation make sense
    only for molecular dynamics calculations
             
} # ------------------------------------------------------------------------ help wfc_extrapolation -helpfmt helpdoc -helptext {
  •  Variable: wfc_extrapolation

  •  Type: CHARACTER

  •  Default: 'none'

  •  Description:
  •     Used to extrapolate the wavefunctions from preceding ionic steps.
    
       'none'        :  no extrapolation
    
       'first_order' :  extrapolate the wave-functions with first-order
                        formula.
    
       'second_order':  as above, with second order formula.
    
    Note: 'first_order' and 'second-order' extrapolation make sense
    only for molecular dynamics calculations
             
} # ------------------------------------------------------------------------ help remove_rigid_rot -helpfmt helpdoc -helptext {
  •  Variable: remove_rigid_rot

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • This keyword is useful when simulating the dynamics and/or the
    thermodynamics of an isolated system. If set to true the total
    torque of the internal forces is set to zero by adding new forces
    that compensate the spurious interaction with the periodic
    images. This allows for the use of smaller supercells.
    
    BEWARE: since the potential energy is no longer consistent with
    the forces (it still contains the spurious interaction with the
    repeated images), the total energy is not conserved anymore.
    However the dynamical and thermodynamical properties should be
    in closer agreement with those of an isolated system.
    Also the final energy of a structural relaxation will be higher,
    but the relaxation itself should be faster.
             
} # ------------------------------------------------------------------------ help ion_temperature -helpfmt helpdoc -helptext {
  •  Variable: ion_temperature

  •  Type: CHARACTER

  •  Default: 'not_controlled'

  •  Description:
  • 'rescaling'   control ionic temperature via velocity rescaling
                  (first method) see parameters "tempw", "tolp", and
                  "nraise" (for VC-MD only). This rescaling method
                  is the only one currently implemented in VC-MD
    
    'rescale-v'   control ionic temperature via velocity rescaling
                  (second method) see parameters "tempw" and "nraise"
    
    'rescale-T'   control ionic temperature via velocity rescaling
                  (third method) see parameter "delta_t"
    
    'reduce-T'    reduce ionic temperature every "nraise" steps
                  by the (negative) value "delta_t"
    
    'berendsen'   control ionic temperature using "soft" velocity
                  rescaling - see parameters "tempw" and "nraise"
    
    'andersen'    control ionic temperature using Andersen thermostat
                  see parameters "tempw" and "nraise"
    
    'initial'     initialize ion velocities to temperature "tempw"
                  and leave uncontrolled further on
    
    'not_controlled' (default) ionic temperature is not controlled
                
} # ------------------------------------------------------------------------ help tempw -helpfmt helpdoc -helptext {
  •  Variable: tempw

  •  Type: REAL

  •  Default: 300.D0

  •  Description:
  • Starting temperature (Kelvin) in MD runs
    target temperature for most thermostats.
                
} # ------------------------------------------------------------------------ help tolp -helpfmt helpdoc -helptext {
  •  Variable: tolp

  •  Type: REAL

  •  Default: 100.D0

  •  Description:
  • Tolerance for velocity rescaling. Velocities are rescaled if
    the run-averaged and target temperature differ more than tolp.
                
} # ------------------------------------------------------------------------ help delta_t -helpfmt helpdoc -helptext {
  •  Variable: delta_t

  •  Type: REAL

  •  Default: 1.D0

  •  Description:
  • if ion_temperature='rescale-T':
           at each step the instantaneous temperature is multiplied
           by delta_t; this is done rescaling all the velocities.
    
    if ion_temperature='reduce-T':
           every 'nraise' steps the instantaneous temperature is
           reduced by -delta_T (i.e. delta_t < 0 is added to T)
    
    The instantaneous temperature is calculated at the end of
    every ionic move and BEFORE rescaling. This is the temperature
    reported in the main output.
    
    For delta_t < 0, the actual average rate of heating or cooling
    should be roughly C*delta_t/(nraise*dt) (C=1 for an
    ideal gas, C=0.5 for a harmonic solid, theorem of energy
    equipartition between all quadratic degrees of freedom).
                
} # ------------------------------------------------------------------------ help nraise -helpfmt helpdoc -helptext {
  •  Variable: nraise

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • if ion_temperature='reduce-T':
           every 'nraise' steps the instantaneous temperature is
           reduced by -delta_T (.e. delta_t is added to the temperature)
    
    if ion_temperature='rescale-v':
           every 'nraise' steps the average temperature, computed from
           the last nraise steps, is rescaled to tempw
    
    if ion_temperature='rescaling' and calculation='vc-md':
           every 'nraise' steps the instantaneous temperature
           is rescaled to tempw
    
    if ion_temperature='berendsen':
           the "rise time" parameter is given in units of the time step:
           tau = nraise*dt, so dt/tau = 1/nraise
    
    if ion_temperature='andersen':
           the "collision frequency" parameter is given as nu=1/tau
           defined above, so nu*dt = 1/nraise
                
} # ------------------------------------------------------------------------ help refold_pos -helpfmt helpdoc -helptext {
  •  Variable: refold_pos

  •  Type: LOGICAL

  •  Default: .FALSE.

  •  Description:
  • This keyword applies only in the case of molecular dynamics or
    damped dynamics. If true the ions are refolded at each step into
    the supercell.
                
} # ------------------------------------------------------------------------ help upscale -helpfmt helpdoc -helptext {
  •  Variable: upscale

  •  Type: REAL

  •  Default: 100.D0

  •  Description:
  • Max reduction factor for conv_thr during structural optimization
    conv_thr is automatically reduced when the relaxation
    approaches convergence so that forces are still accurate,
    but conv_thr will not be reduced to less that
    conv_thr / upscale.
                
} # ------------------------------------------------------------------------ help bfgs_ndim -helpfmt helpdoc -helptext {
  •  Variable: bfgs_ndim

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • Number of old forces and displacements vectors used in the
    PULAY mixing of the residual vectors obtained on the basis
    of the inverse hessian matrix given by the BFGS algorithm.
    When bfgs_ndim = 1, the standard quasi-Newton BFGS method is
    used.
    (bfgs only)
                
} # ------------------------------------------------------------------------ help trust_radius_max -helpfmt helpdoc -helptext {
  •  Variable: trust_radius_max

  •  Type: REAL

  •  Default: 0.8D0

  •  Description:
  • Maximum ionic displacement in the structural relaxation.
    (bfgs only)
                
} # ------------------------------------------------------------------------ help trust_radius_min -helpfmt helpdoc -helptext {
  •  Variable: trust_radius_min

  •  Type: REAL

  •  Default: 1.D-3

  •  Description:
  • Minimum ionic displacement in the structural relaxation
    BFGS is reset when trust_radius < trust_radius_min.
    (bfgs only)
                
} # ------------------------------------------------------------------------ help trust_radius_ini -helpfmt helpdoc -helptext {
  •  Variable: trust_radius_ini

  •  Type: REAL

  •  Default: 0.5D0

  •  Description:
  • Initial ionic displacement in the structural relaxation.
    (bfgs only)
                
} # ------------------------------------------------------------------------ help w_1 -helpfmt helpdoc -helptext {
  •  Variable: w_1

  •  Type: REAL

  •  Default: 0.01D0

  •  See: w_2

} # ------------------------------------------------------------------------ help w_2 -helpfmt helpdoc -helptext {
  •  Variable: w_2

  •  Type: REAL

  •  Default: 0.5D0

  •  Description:
  • Parameters used in line search based on the Wolfe conditions.
    (bfgs only)
                
} # ------------------------------------------------------------------------ help cell_dynamics -helpfmt helpdoc -helptext {
  •  Variable: cell_dynamics

  •  Type: CHARACTER

  •  Description:
  • Specify the type of dynamics for the cell.
    For different type of calculation different possibilities
    are allowed and different default values apply:
    
    CASE ( calculation = 'vc-relax' )
      'none':    no dynamics
      'sd':      steepest descent ( not implemented )
      'damp-pr': damped (Beeman) dynamics of the Parrinello-Rahman
                 extended lagrangian
      'damp-w':  damped (Beeman) dynamics of the new Wentzcovitch
                 extended lagrangian
      'bfgs':    BFGS quasi-newton algorithm (default)
                 ion_dynamics must be 'bfgs' too
    CASE ( calculation = 'vc-md' )
      'none':    no dynamics
      'pr':      (Beeman) molecular dynamics of the Parrinello-Rahman
                 extended lagrangian
      'w':       (Beeman) molecular dynamics of the new Wentzcovitch
                 extended lagrangian
             
} # ------------------------------------------------------------------------ help press -helpfmt helpdoc -helptext {
  •  Variable: press

  •  Type: REAL

  •  Default: 0.D0

  •  Description:
  • Target pressure [KBar] in a variable-cell md or relaxation run.
             
} # ------------------------------------------------------------------------ help wmass -helpfmt helpdoc -helptext {
  •  Variable: wmass

  •  Type: REAL

  •  Default: 0.75*Tot_Mass/pi**2 for Parrinello-Rahman MD; 0.75*Tot_Mass/pi**2/Omega**(2/3) for Wentzcovitch MD

  •  Description:
  • Fictitious cell mass [amu] for variable-cell simulations
    (both 'vc-md' and 'vc-relax')
             
} # ------------------------------------------------------------------------ help cell_factor -helpfmt helpdoc -helptext {
  •  Variable: cell_factor

  •  Type: REAL

  •  Default: 1.2D0

  •  Description:
  • Used in the construction of the pseudopotential tables.
    It should exceed the maximum linear contraction of the
    cell during a simulation.
             
} # ------------------------------------------------------------------------ help press_conv_thr -helpfmt helpdoc -helptext {
  •  Variable: press_conv_thr

  •  Type: REAL

  •  Default: 0.5D0 Kbar

  •  Description:
  • Convergence threshold on the pressure for variable cell
    relaxation ('vc-relax' : note that the other convergence
    thresholds for ionic relaxation apply as well).
             
} # ------------------------------------------------------------------------ help cell_dofree -helpfmt helpdoc -helptext {
  •  Variable: cell_dofree

  •  Type: CHARACTER

  •  Default: 'all'

  •  Description:
  • Select which of the cell parameters should be moved:
    
    all     = all axis and angles are moved
    x       = only the x component of axis 1 (v1_x) is moved
    y       = only the y component of axis 2 (v2_y) is moved
    z       = only the z component of axis 3 (v3_z) is moved
    xy      = only v1_x and v2_y are moved
    xz      = only v1_x and v3_z are moved
    yz      = only v2_y and v3_z are moved
    xyz     = only v1_x, v2_y, v3_z are moved
    shape   = all axis and angles, keeping the volume fixed
    volume  = the volume changes, keeping all angles fixed (i.e. only celldm(1) changes)
    2Dxy    = only x and y components are allowed to change
    2Dshape = as above, keeping the area in xy plane fixed
    
    BEWARE: if axis are not orthogonal, some of these options do not
     work (symmetry is broken). If you are not happy with them,
     edit subroutine init_dofree in file Modules/cell_base.f90
             
} # ------------------------------------------------------------------------ help atomic_species -helpfmt helpdoc -helptext {
  •  Variable: X

  •  Type: CHARACTER

  •  Description:
  • label of the atom. Acceptable syntax:
    chemical symbol X (1 or 2 characters, case-insensitive)
    or "Xn", n=0,..., 9; "X_*", "X-*" (e.g. C1, As_h)
                      
  •  Variable: Mass_X

  •  Type: REAL

  •  Description:
  • mass of the atomic species [amu: mass of C = 12]
    Used only when performing Molecular Dynamics run
    or structural optimization runs using Damped MD.
    Not actually used in all other cases (but stored
    in data files, so phonon calculations will use
    these values unless other values are provided)
                      
  •  Variable: PseudoPot_X

  •  Type: CHARACTER

  •  Description:
  • File containing PP for this species.
    
    The pseudopotential file is assumed to be in the new UPF format.
    If it doesn't work, the pseudopotential format is determined by
    the file name:
    
    *.vdb or *.van     Vanderbilt US pseudopotential code
    *.RRKJ3            Andrea Dal Corso's code (old format)
    none of the above  old PWscf norm-conserving format
                      
} # ------------------------------------------------------------------------ help ATOMIC_POSITIONS_flags -helpfmt helpdoc -helptext {

Description of ATOMIC_POSITIONS card's flags

alat    : atomic positions are in cartesian coordinates, in
          units of the lattice parameter (either celldm(1)
          or A). If no option is specified, 'alat' is assumed;
          not specifying units is DEPRECATED and will no
          longer be allowed in the future

bohr    : atomic positions are in cartesian coordinate,
          in atomic units (i.e. Bohr radii)

angstrom: atomic positions are in cartesian coordinates,
          in Angstrom

crystal : atomic positions are in crystal coordinates, i.e.
          in relative coordinates of the primitive lattice
          vectors as defined either in card CELL_PARAMETERS
          or via the ibrav + celldm / a,b,c... variables
         
} # ------------------------------------------------------------------------ help atomic_coordinates -helpfmt helpdoc -helptext {
  •  Variable: X

  •  Type: CHARACTER

  •  Description:
  •  label of the atom as specified in ATOMIC_SPECIES
                            
  •  Variables: x, y, z

  •  Type: REAL

  •  Description:
  • atomic positions
    
    NOTE: each atomic coordinate can also be specified as a simple algebraic expression.
          To be interpreted correctly expression must NOT contain any blank
          space and must NOT start with a "+" sign. The available expressions are:
    
            + (plus), - (minus), / (division), * (multiplication), ^ (power)
    
         All numerical constants included are considered as double-precision numbers;
         i.e. 1/2 is 0.5, not zero. Other functions, such as sin, sqrt or exp are
         not available, although sqrt can be replaced with ^(1/2).
    
        Example:
                     C  1/3   1/2*3^(-1/2)   0
    
        is equivalent to
    
                C  0.333333  0.288675  0.000000
    
        Please note that this feature is NOT supported by XCrysDen (which will
        display a wrong structure, or nothing at all).
                            
  •  Variables: if_pos(1), if_pos(2), if_pos(3)

  •  Type: INTEGER

  •  Default: 1

  •  Description:
  • component i of the force for this atom is multiplied by if_pos(i),
    which must be either 0 or 1.  Used to keep selected atoms and/or
    selected components fixed in MD dynamics or
    structural optimization run.
                               
} # ------------------------------------------------------------------------ help K_POINTS_flags -helpfmt helpdoc -helptext {

Description of K_POINTS card's flags

 tpiba    : read k-points in cartesian coordinates,
            in units of 2 pi/a (default)

 automatic: automatically generated uniform grid of k-points, i.e,
            generates ( nk1, nk2, nk3 ) grid with ( sk1, sk2, sk3 ) offset.
            nk1, nk2, nk3 as in Monkhorst-Pack grids
            k1, k2, k3 must be 0 ( no offset ) or 1 ( grid displaced
            by half a grid step in the corresponding direction )
            BEWARE: only grids having the full symmetry of the crystal
            work with tetrahedra. Some grids with offset may not work.

 crystal  : read k-points in crystal coordinates, i.e. in relative
            coordinates of the reciprocal lattice vectors

 gamma    : use k = 0 (no need to list k-point specifications after card)
            In this case wavefunctions can be chosen as real,
            and specialized subroutines optimized for calculations
            at the gamma point are used (memory and cpu requirements
            are reduced by approximately one half).

 tpiba_b  : Used for band-structure plots.
            k-points are in units of  2 pi/a.
            nks points specify nks-1 lines in reciprocal space.
            Every couple of points identifies the initial and
            final point of a line. pw.x generates N
            intermediate points of the line where N is the
            weight of the first point.

 crystal_b: as tpiba_b, but k-points are in crystal coordinates.

 tpiba_c  : Used for band-structure contour plots.
            k-points are in units of  2 pi/a. nks must be 3.
            3 k-points k_0, k_1, and k_2 specify a rectangle
            in reciprocal space of vertices k_0, k_1, k_2,
            k_1 + k_2 - k_0: k_0 + \alpha (k_1-k_0)+
            \beta (k_2-k_0) with 0<\alpha,\beta < 1.
            The code produces a uniform mesh n1 x n2
            k points in this rectangle. n1 and n2 are
            the weights of k_1 and k_2. The weight of k_0
            is not used.

crystal_c: as tpiba_c, but k-points are in crystal coordinates.
         
} # ------------------------------------------------------------------------ help nks -helpfmt helpdoc -helptext {
  •  Variable: nks

  •  Type: INTEGER

  •  Description:
  •  Number of supplied special k-points.
                         
} # ------------------------------------------------------------------------ help kpoints -helpfmt helpdoc -helptext {
  •  Variables: xk_x, xk_y, xk_z, wk

  •  Type: REAL

  •  Description:
  • Special k-points (xk_x/y/z) in the irreducible Brillouin Zone
    (IBZ) of the lattice (with all symmetries) and weights (wk)
    See the literature for lists of special points and
    the corresponding weights.
    
    If the symmetry is lower than the full symmetry
    of the lattice, additional points with appropriate
    weights are generated. Notice that such procedure
    assumes that ONLY k-points in the IBZ are provided in input
    
    In a non-scf calculation, weights do not affect the results.
    If you just need eigenvalues and eigenvectors (for instance,
    for a band-structure plot), weights can be set to any value
    (for instance all equal to 1).
                            
} # ------------------------------------------------------------------------ grouphelp {nk1 nk2 nk3} -helpfmt helpdoc -helptext {
  •  Variables: nk1, nk2, nk3

  •  Type: INTEGER

  •  Description:
  • These parameters specify the k-point grid
    (nk1 x nk2 x nk3) as in Monkhorst-Pack grids.
                         
} # ------------------------------------------------------------------------ grouphelp {sk1 sk2 sk3} -helpfmt helpdoc -helptext {
  •  Variables: sk1, sk2, sk3

  •  Type: INTEGER

  •  Description:
  • The grid offsets;  sk1, sk2, sk3 must be
    0 ( no offset ) or 1 ( grid displaced by
    half a grid step in the corresponding direction ).
                         
} # ------------------------------------------------------------------------ help CELL_PARAMETERS_flags -helpfmt helpdoc -helptext {

Description of CELL_PARAMETERS card's flags

'bohr'/'angstrom': lattice vectors in bohr radii / angstrom.
   In this case the lattice parameter alat = sqrt(v1*v1).
'alat' / nothing specified: lattice vectors in units of the
lattice parameter (either celldm(1) or a). Not specifying
units is DEPRECATED and will not be allowed in the future.
If nothing specified and no lattice parameter specified,
'bohr' is assumed - DEPRECATED, will no longer be allowed
         
} # ------------------------------------------------------------------------ help lattice -helpfmt helpdoc -helptext {
  •  Variables: v1, v2, v3

  •  Type: REAL

  •  Description:
  • Crystal lattice vectors (in cartesian axis):
        v1(1)  v1(2)  v1(3)    ... 1st lattice vector
        v2(1)  v2(2)  v2(3)    ... 2nd lattice vector
        v3(1)  v3(2)  v3(3)    ... 3rd lattice vector
                      
} # ------------------------------------------------------------------------ help nconstr -helpfmt helpdoc -helptext {
  •  Variable: nconstr

  •  Type: INTEGER

  •  Description:
  •  Number of constraints.
                   
} # ------------------------------------------------------------------------ help constr_tol -helpfmt helpdoc -helptext {
  •  Variable: constr_tol

  •  Type: REAL

  •  Description:
  •  Tolerance for keeping the constraints satisfied.
                      
} # ------------------------------------------------------------------------ help constraints_table -helpfmt helpdoc -helptext {
  •  Variable: constr_type

  •  Type: CHARACTER

  •  Description:
  • Type of constrain :
    
    'type_coord'      : constraint on global coordination-number, i.e. the
                        average number of atoms of type B surrounding the
                        atoms of type A. The coordination is defined by
                        using a Fermi-Dirac.
                        (four indexes must be specified).
    
    'atom_coord'      : constraint on local coordination-number, i.e. the
                        average number of atoms of type A surrounding a
                        specific atom. The coordination is defined by
                        using a Fermi-Dirac.
                        (four indexes must be specified).
    
    'distance'        : constraint on interatomic distance
                        (two atom indexes must be specified).
    
    'planar_angle'    : constraint on planar angle
                        (three atom indexes must be specified).
    
    'torsional_angle' : constraint on torsional angle
                        (four atom indexes must be specified).
    
    'bennett_proj'    : constraint on the projection onto a given direction
                        of the vector defined by the position of one atom
                        minus the center of mass of the others.
                        G.Roma,J.P.Crocombette: J.Nucl.Mater.403,32(2010)
                      
  •  Variables: constr(1), constr(2), constr(3), constr(4)

  •  Type:

  •  Description:
  •                       These variables have different meanings
                          for different constraint types:
    
                         'type_coord' : constr(1) is the first index of the
                                        atomic type involved
                                        constr(2) is the second index of the
                                        atomic type involved
                                        constr(3) is the cut-off radius for
                                        estimating the coordination
                                        constr(4) is a smoothing parameter
    
                         'atom_coord' : constr(1) is the atom index of the
                                        atom with constrained coordination
                                        constr(2) is the index of the atomic
                                        type involved in the coordination
                                        constr(3) is the cut-off radius for
                                        estimating the coordination
                                        constr(4) is a smoothing parameter
    
                           'distance' : atoms indices object of the
                                        constraint, as they appear in
                                        the 'ATOMIC_POSITION' CARD
    
    'planar_angle', 'torsional_angle' : atoms indices object of the
                                        constraint, as they appear in the
                                        'ATOMIC_POSITION' CARD (beware the
                                        order)
    
                       'bennett_proj' : constr(1) is the index of the atom
                                        whose position is constrained.
                                        constr(2:4) are the three coordinates
                                        of the vector that specifies the
                                        constraint direction.
                      
  •  Variable: constr_target

  •  Type: REAL

  •  Description:
  • Target for the constrain ( angles are specified in degrees ).
    This variable is optional.
                         
} # ------------------------------------------------------------------------ help occupations_table -helpfmt helpdoc -helptext {
  •  Variable: f_inp1

  •  Type: REAL

  •  Description:
  • Occupations of individual states (MAX 10 PER ROW).
    For spin-polarized calculations, these are majority spin states.
                      
  •  Variable: f_inp2

  •  Type: REAL

  •  Description:
  • Occupations of minority spin states (MAX 10 PER ROW)
    To be specified only for spin-polarized calculations.
                         
} espresso-5.1/PWgui-5.1/modules/pw/commands.tcl0000644000077300007730000004266712341332513021465 0ustar giannozzgiannozz # ------------------------------------------------------------------------ # ::pwscf::pwSelectPseudoDir -- # ------------------------------------------------------------------------ proc ::pwscf::pwSelectPseudoDir {moduleObj} { variable pwscf global env set _dir [$moduleObj varvalue pseudo_dir] if { [file isdirectory $_dir] } { set dir $_dir } elseif { [info exists pwscf($moduleObj,LASTDIR,pseudo_dir)] } { set dir $pwscf($moduleObj,LASTDIR,pseudo_dir) } else { set dir [file join $env(HOME) pw pseudo] if { ! [file exists $dir] } { set dir pwscf(PWD) } } set dir [tk_chooseDirectory -initialdir $dir \ -title "Chose directory" -mustexist 0] if { $dir == "" } { return } set pwscf($moduleObj,LASTDIR,pseudo_dir) $dir # add a trailing slash "/" set dir [string trimright [file join $dir _] _] # add a quotes set dir '$dir' $moduleObj varset pseudo_dir -value $dir } # ------------------------------------------------------------------------ # ::pwscf::pwSelectPseudopotential -- # ------------------------------------------------------------------------ proc ::pwscf::pwSelectPseudopotential {moduleObj variable ir ic} { variable pwscf global env set _dir [string trim [$moduleObj varvalue pseudo_dir] "'"] if { [file isdirectory $_dir] } { set dir $_dir } elseif { [info exists pwscf($moduleObj,LASTDIR,pseudopotential)] } { set dir $pwscf($moduleObj,LASTDIR,pseudopotential) } else { set dir [file join $env(HOME) pw pseudo] if { ! [file isdirectory $dir] } { set dir $pwscf(PWD) } } set file [tk_getOpenFile \ -initialdir $dir \ -title "Select a Pseudopotential File"] if { $file == "" } { return } set pwscf($moduleObj,LASTDIR,pseudopotential) [file dirname $file] $moduleObj varset ${variable}($ir,$ic) -value [file tail $file] } # ------------------------------------------------------------------------ # ::pwscf::pwLoadAtomCoord -- # # This function loads atomic coordinates from file. It supposes the # PWSCF syntax, i.e., searches for ATOMIC_POSTIONS keyword. This means # that atomic coordinates can be extracted from PWSCF's input file. # ------------------------------------------------------------------------ proc ::pwscf::pwLoadAtomCoor {moduleObj} { set file [pwLoadAtomCoor:_init $moduleObj] if { $file != "" } { pwLoadAtomCoor:_read $moduleObj $file atomic_coordinates } } proc ::pwscf::pwLoadAtomCoor:_init {moduleObj} { variable pwscf if { [info exists pwscf($moduleObj,LASTDIR,atomic_coor)] } { set dir $pwscf($moduleObj,LASTDIR,atomic_coor) } else { set dir pwscf(PWD) } # query the filename set file [tk_getOpenFile \ -initialdir $dir \ -title "Load Atomic Coordinates"] if { $file == "" } { uplevel 1 return } set pwscf($moduleObj,LASTDIR,atomic_coor) [file dirname $file] return $file } proc ::pwscf::pwLoadAtomCoor:_read {moduleObj file coorVar} { variable pwscf set _readCoor 0 set IA(0) 0 set ntyp_list {} set _UNIT "" set nimage 0 # read the file set channel [open $file r] while {1} { set res [gets $channel _line] if { $res == -1 && $_line == "" } { # end of file occurred break } set _len [llength $_line] # skip empty lines if { $_len == 0 } { continue } if { [string match "ATOMIC_POSITIONS*" $_line] } { set _line [readFilter::purifyCardLine $_line] set _UNIT [lindex $_line 1] set _readCoor 1 continue } if { $_readCoor } { if { $_len == 4 || $_len == 7 } { # read coordinates incr IA($nimage) set ia $IA($nimage) set len($ia,$nimage) $_len for {set i 1} {$i <= $_len} {incr i} { set Atoms($ia,$i,$nimage) [lindex $_line [expr $i - 1]] } if { [lsearch -exact $ntyp_list $Atoms($ia,1,$nimage)] == -1 } { lappend ntyp_list $Atoms($ia,1,$nimage) } } elseif { $_len == 1 } { # might be first_image/intermediate_image/last_image string (NEB || SMD) if { [string match *first_image* $_line] } { # do nothing so far ... ; } elseif { [string match *intermediate_image* $_line] } { incr nimage set IA($nimage) 0 } elseif { [string match *last_image* $_line] } { incr nimage set IA($nimage) 0 } else { # no, it is not first_image/intermediate_image/last_image string break } } else { # record does not match; probably end-of-ATOMIC_POSITIONS break } } } #/reading done # assign the "atomic-position" variables set ia $IA(0) for {set i 1} {$i <= $nimage} {incr i} { if { $IA($nimage) > $ia } { set ia $IA($nimage) } } $moduleObj varset nat -value $ia #$moduleObj varset ntyp -value $NTYP if { $_UNIT != "" } { $moduleObj varset ATOMIC_POSITIONS_flags -value [$moduleObj valueToTextvalue ATOMIC_POSITIONS_flags $_UNIT] } # load atomic-labels from ntyp_list if the "atomic_species" is not yet defined set ntyp [llength $ntyp_list] $moduleObj varset ntyp -value $ntyp for {set i 1} {$i <= $ntyp} {incr i} { set empty($i) 1 } foreach type $ntyp_list { set new_type 1 for {set i 1} {$i <= $ntyp} {incr i} { if { $type == [$moduleObj varvalue atomic_species($i,1)] } { set new_type 0 set empty($i) 0 } } if { $new_type } { for {set i 1} {$i <= $ntyp} {incr i} { if { $empty($i) } { $moduleObj varset atomic_species($i,1) -value $type set empty($i) 0 break } } } } # load the "atomic_coordinates" or "atomic_coordinates_inter_*" or "atomic_coordinates_last" table if { $coorVar == "atomic_coordinates" } { set start_index 0 } if { $coorVar == "atomic_coordinates_last" } { set start_index $nimage } if { [string match "atomic_coordinates_*_inter" $coorVar] } { set start_index [regsub {[a-zA-Z_]*} $coorVar {}] if { $start_index > $nimage } { set start_index $nimage } } for {set ii $start_index} {$ii <= $nimage} {incr ii} { # loop over images ... for {set ia 1} {$ia <= $IA($ii)} {incr ia} { # loop over atoms ... if { ! [info exists len($ia,$ii)] } { break } for {set i 1} {$i <= $len($ia,$ii)} {incr i} { # loop over fields ... if { ! [info exists Atoms($ia,$i,$ii)] } { break } if { $coorVar == "atomic_coordinates" } { # in this case load all the coordinates if { $ii == 0 } { $moduleObj varset "atomic_coordinates($ia,$i)" -value $Atoms($ia,$i,$ii) } elseif { $ii == $nimage } { $moduleObj varset "atomic_coordinates_last($ia,$i)" -value $Atoms($ia,$i,$ii) } else { $moduleObj varset "atomic_coordinates_${ii}_inter($ia,$i)" -value $Atoms($ia,$i,$ii) } } elseif { [string match "atomic_coordinates_*_inter" $coorVar] } { # in this case load only the coordinates from start_index --> nimage if { $ii < $start_index || $start_index == $nimage } { set ind $ii # pathological case: ind == 0 , but smallest possible is 1 if { $ind == 0 } { set ind 1 } $moduleObj varset "atomic_coordinates_${ind}_inter($ia,$i)" -value $Atoms($ia,$i,$ii) } else { $moduleObj varset "atomic_coordinates_last($ia,$i)" -value $Atoms($ia,$i,$ii) } } elseif { $coorVar == "atomic_coordinates_last" } { # load only the last coordinates $moduleObj varset "atomic_coordinates_last($ia,$i)" -value $Atoms($ia,$i,$ii) } } } } } # ------------------------------------------------------------------------ # ::pwscf::pwLoadKPoints -- # ------------------------------------------------------------------------ proc ::pwscf::pwLoadKPoints {moduleObj} { variable pwscf if { [info exists pwscf($moduleObj,LASTDIR,k_points)] } { set dir $pwscf($moduleObj,LASTDIR,k_points) } else { set dir pwscf(PWD) } # # query filename # set file [tk_getOpenFile -initialdir [pwd] -title "Load K-Points"] if { $file == "" } { return } set pwscf($moduleObj,LASTDIR,k_points) [file dirname $file] # # read the file # set channel [open $file r] # find the K_POINTS card while {1} { set _line [_getsNonEmptyLine $channel] if { [string match "K_POINTS*" $_line] } { set _line [readFilter::purifyCardLine $_line] set _UNIT [lindex $_line 1] # assing the K_POINTS_flags variable $moduleObj varset K_POINTS_flags -value [$moduleObj valueToTextvalue K_POINTS_flags $_UNIT] break } } # read NKS set NKS [_getsNonEmptyLine $channel] if { [string is integer $NKS] } { $moduleObj varset nks -value $NKS } else { # TODO: raise an error return } # read K-POINTS for {set ia 1} {$ia <= $NKS} {incr ia} { set _line [_getsNonEmptyLine $channel] if { [llength $_line] != 4 } { # TODO: raise an error } for {set i 1} {$i <= 4} {incr i} { $moduleObj varset kpoints($ia,$i) -value [lindex $_line [expr $i - 1]] } } } # ------------------------------------------------------------------------ # ::pwscf::pwReadFilter -- # # TODO: check is &SYSTEM exists, if not the input file is not pw.x input # (this is done by checking the existence of SYSTEM_namelist_content # variable !!! # ------------------------------------------------------------------------ proc ::pwscf::pwReadFilter {moduleObj channel} { variable pwscf # clear the head & tail set pwscf($moduleObj,inputHeadContent) {} #set pwscf($moduleObj,inputTailContent) {} set pwscf($moduleObj,OCCUPATIONS) {} # # Check if input file is a pw.x formatted ... # # Any properly formated pw.x input should have the following namelists: # CONTROL, SYSTEM, and ELECTRONS set namelists {CONTROL SYSTEM ELECTRONS} # Any properly formated pw.x input should have the following cards: # ATOMIC_SPECIES, ATOMIC_POSITIONS, and K_POINTS set cards {ATOMIC_SPECIES ATOMIC_POSITIONS K_POINTS} set status [::pwscf::readFilter::findNamelistsAndCards $moduleObj $channel pw.x $namelists $cards errMsg] if { $status == 0 } { $moduleObj readFileWrongFormat pw.x $errMsg return $channel } # # check if lattice is specified by celldm() or A,B,C,... # set system 0 while { ! [eof $channel] } { gets $channel _line if { [string match -nocase "*&SYSTEM*" $_line] } { set system 1 continue } if { $system } { if { [regexp -nocase -- $::guib::settings(NAMELIST.end_regexp) $_line] } { break } append SYSTEM_namelist_content ${_line}\n } } ## ## count the number of intermediate images ## #seek $channel 0 start #set ni 0 #while { ! [eof $channel] } { # gets $channel _line # if { [string match "*intermediate_image*" $_line] } { # incr ni # } #} #$moduleObj varset path_inter_nimages -value $ni #if { ! [info exists SYSTEM_namelist_content] } { # # there is no SYSTEM namlist. The input file is not a pw.x # # input file # $moduleObj readFileError "Input file is not in a pw.x input-file format" # return #} foreach record [split $SYSTEM_namelist_content ,\n] { set var [lindex [split $record =] 0] if { [::tclu::stringMatch celldm* $var $::guib::settings(INPUT.nocase)] } { $moduleObj varset how_lattice -value celldm } elseif { [::tclu::stringMatch A $var $::guib::settings(INPUT.nocase)] } { $moduleObj varset how_lattice -value abc } } seek $channel 0 start # # check if there are non-empty lines before starting &CONTROL # namelist # while {1} { set res [gets $channel _line] if { $res == -1 && $_line == "" } { # end of file occurred ::tclu::ERROR "end of file occurred, while reading PW.X input" return -code return } if { [string match -nocase "*&CONTROL*" $_line] } { # we found "&CONTROL" line set Line(1) $_line break } else { append pwscf($moduleObj,inputHeadContent) "$_line\n" } } # Re-order the cards in the following order: # -------------------------------------------------- # CELL_PARAMETERS # ATOMIC_SPECIES # ATOMIC_POSITIONS # K_POINTS # CLIMBING_IMAGES # CONSTRAINTS # COLLECTIVE_VARS # The content of OCCUPATIONS card is managed by the "text" # keyword, hence we have to store the content of OCCUPATIONS set what {} set ind 1 set _read 1 while {1} { if { $_read } { set res [gets $channel _line] if { $res == -1 && $_line == "" } { # end of file occurred break } } if { [string match "CELL_PARAMETERS*" $_line] } { set what CELL_PARAMETERS set _line [readFilter::purifyCardLine $_line] } elseif { [string match "ATOMIC_SPECIES*" $_line] } { set what ATOMIC_SPECIES set _line [readFilter::purifyCardLine $_line] } elseif { [string match "ATOMIC_POSITIONS*" $_line] } { set what ATOMIC_POSITIONS set _line [readFilter::purifyCardLine $_line] } elseif { [string match "K_POINTS*" $_line] } { set what K_POINTS set _line [readFilter::purifyCardLine $_line] } elseif { [string match "OCCUPATIONS*" $_line] } { set what OCCUPATIONS set _line [readFilter::purifyCardLine $_line] } elseif { [string match "CLIMBING_IMAGES*" $_line] } { set what CLIMBING_IMAGES set _line [readFilter::purifyCardLine $_line] } elseif { [string match "CONSTRAINTS*" $_line] } { set what CONSTRAINTS set _line [readFilter::purifyCardLine $_line] } elseif { [string match "COLLECTIVE_VARS*" $_line] } { set what COLLECTIVE_VARS set _line [readFilter::purifyCardLine $_line] } if { $what == {} } { #--------------------------------------------- # VARIABLES: handle multiple flags options #--------------------------------------------- foreach {var optList} { smearing { {'gaussian' 'gauss'} {'methfessel-paxton' 'm-p' 'mp'} {'marzari-vanderbilt' 'cold' 'm-v' 'mv'} {'fermi-dirac' 'f-d' 'fd'} } assume_isolated { {'makov-payne' 'm-p' 'mp'} {'martyna-tuckerman' 'm-t' 'mt'} } vdw_corr { {'grimme-d2' 'Grimme-D2' 'DFT-D' 'dft-d'} {'ts-vdw' 'TS' 'ts' 'ts-vdW'} {'XDM' 'xdm'} } } { set _line [readFilter::replaceVarFlag $_line $var $optList] } # # VARIABLE: diagonalization; handle multiple flags # #------------------------------------------------- # # 'david' 'david_overlap' 'david_nooverlap' --> 'david' # set _line [readFilter::replaceFlag $_line david david_overlap david_nooverlap] # logical VARIABLES: use only .true. and .false. #----------------------------------------------- set _line [readFilter::logicalFlag $_line] incr ind set Line($ind) $_line } else { # fortranreal --> real translation regsub -all -nocase {([0-9]|[0-9].)(d)([+-]?[0-9]+)} $_line {\1e\3} _transline if { ! [string match "OCCUPATIONS*" $_line] } { # the OCCUPATIONS are treated specially (see below) append $what "$_transline\n" } } set _read 1 } # close the old channel close $channel # open a new channel (i.e. temporary file) set tmpfile [::tclu::tempFile name pw_input] set newChannel [open $tmpfile w+] # # write the file: # --------------- # write the namelists for {set i 1} {$i <= $ind} {incr i} { puts $newChannel $Line($i) } # write the CELL_PARAMETERS if { [info exists CELL_PARAMETERS] } { puts $newChannel $CELL_PARAMETERS } # write the ATOMIC_SPECIES if { [info exists ATOMIC_SPECIES] } { puts $newChannel $ATOMIC_SPECIES } # write the ATOMIC_POSITIONS if { [info exists ATOMIC_POSITIONS] } { puts $newChannel $ATOMIC_POSITIONS } # write the K_POINTS if { [info exists K_POINTS] } { puts $newChannel $K_POINTS } # write the CLIMBING_IMAGES if { [info exists CLIMBING_IMAGES] } { puts $newChannel $CLIMBING_IMAGES } # write the CONSTRAINTS if { [info exists CONSTRAINTS] } { puts $newChannel $CONSTRAINTS } # write the COLLECTIVE_VARS if { [info exists COLLECTIVE_VARS] } { puts $newChannel $COLLECTIVE_VARS } # store the OCCUPATIONS record if { [info exists OCCUPATIONS] } { puts $newChannel "OCCUPATIONS\n" set pwscf($moduleObj,OCCUPATIONS) $OCCUPATIONS } flush $newChannel # rewind the newChannel seek $newChannel 0 start return $newChannel } # ------------------------------------------------------------------------ # ::pwscf::pwWriteFilter -- # ------------------------------------------------------------------------ proc ::pwscf::pwWriteFilter {moduleObj outputContent} { variable pwscf # HEAD if { [info exists pwscf($moduleObj,inputHeadContent)] } { append output $pwscf($moduleObj,inputHeadContent) } # BODY append output $outputContent # TAIL #if { [info exists pwscf($moduleObj,inputTailContent)] } { # append output $pwscf($moduleObj,inputTailContent) #} return $output } # ------------------------------------------------------------------------ # Reads next non-empty line from channel. If EOF occurs, then it # returns return-code. # ------------------------------------------------------------------------ proc ::pwscf::_getsNonEmptyLine {channel} { # while loop for skipping empty lines !!! while {1} { set res [gets $channel _line] if { $res == -1 && $_line == "" } { # end of file occurred return -code return } if { [llength $_line] != 0 } { return $_line } } } espresso-5.1/PWgui-5.1/modules/pw/pw-event.tcl0000644000077300007730000003315712341332513021423 0ustar giannozzgiannozz # ------------------------------------------------------------------------ # Page: CONTROL # ------------------------------------------------------------------------ tracevar calculation w { set nat [varvalue nat] set calc [varvalue calculation] set ion_dynamics [varvalue ion_dynamics] set widget [getWidgetFromVarident ion_dynamics] set all {ions cell vc_md constraints_card} set disable {} set enable {} switch -exact -- $calc { 'scf' - 'nscf' { set disable $all varset ion_dynamics -value {} } 'relax' { set enable {ions constraints_card} set disable {cell vc_md} widget ion_dynamics enable widgetconfigure ion_dynamics -textvalues { "BFGS quasi-newton method for structural optimization " "damped dynamics (quick-min Verlet) for structural optimization " } if { ! [regexp bfgs|damp $ion_dynamics] } { varset ion_dynamics -value {} } } 'vc-relax' { set enable {ions cell vc_md constraints_card} widget ion_dynamics enable widgetconfigure ion_dynamics -textvalues { "BFGS quasi-newton method for structural optimization " "Beeman algorithm for variable cell damped dynamics " } if { ! [regexp bfgs|damp $ion_dynamics] } { varset ion_dynamics -value {} } widget cell_dynamics enable widgetconfigure cell_dynamics -textvalues { "None " "Damped (Beeman) dynamics of the Parrinello-Raman extended lagrangian " "Damped (Beeman) dynamics of the new Wentzcovitch extended lagrangian " "BFGS quasi-newton algorithm (ion_dynamics must be 'bfgs' too) " } } 'md' { set enable {ions constraints_card} set disable {cell vc_md} widget ion_dynamics enable widgetconfigure ion_dynamics -textvalues { "Verlet algorithm for molecular dynamics " "over-damped Langevin dynamics " } if { ! [regexp verlet|langevin $ion_dynamics] } { varset ion_dynamics -value {} } } 'vc-md' { set enable {ions cell vc_md constraints_card} widget ion_dynamics enable widgetconfigure ion_dynamics -textvalues { "Beeman algorithm for variable cell MD " } if { ! [regexp beeman $ion_dynamics] } { varset ion_dynamics -value {} } widgetconfigure ion_temperature -textvalues { "velocity rescaling via tempw&tolp " "not controlled " } if { ! [regexp rescaling [varvalue ion_temperature]] } { varset ion_temperature -value {} } widget cell_dynamics enable widgetconfigure cell_dynamics -textvalues { "None " "(Beeman) dynamics of the Parrinello-Raman extended lagrangian " "(Beeman) dynamics of the new Wentzcovitch extended lagrangian " } } } foreach group $enable { groupwidget $group enable } foreach group $disable { groupwidget $group disable } # force to update the state of widgets by resetting corresponding variables varset ion_dynamics -value [varvalue ion_dynamics] varset ion_temperature -value [varvalue ion_temperature] varset cell_dynamics -value [varvalue cell_dynamics] varset constraints_enable -value [varvalue constraints_enable] widgetconfigure atomic_coordinates -caption "Enter atomic coordinates:" } # ------------------------------------------------------------------------ # Page: SYSTEM # ------------------------------------------------------------------------ tracevar how_lattice w { switch -exact -- [varvalue how_lattice] { celldm { widget celldm enable groupwidget abc disable groupwidget cosABC disable } abc { widget celldm disable groupwidget abc enable groupwidget cosABC enable } } } tracevar ibrav w { switch -exact -- [vartextvalue ibrav] { "Free lattice" - "Cubic P (sc)" - "Cubic F (fcc)" - "Cubic I (bcc)" { set uses 1 } "Hexagonal and Trigonal P" - "Tetragonal P (st)" - "Tetragonal I (bct)" { set uses {1 3} } "Trigonal R, 3fold axis c" - "Trigonal R, 3fold axis <111>" { set uses {1 4} } "Orthorhombic P" - "Orthorhombic base-centered(bco)" - "Orthorhombic face-centered" - "Orthorhombic body-centered" { set uses {1 2 3} } "Monoclinic P, unique axis c" - "Monoclinic P, unique axis b" - "Monoclinic base-centered" { set uses {1 2 3 4} } "Triclinic P" { set uses { 1 2 3 4 5 6 } } default { set uses {} } } for {set i 1} {$i <= 6} {incr i} { if { [lsearch -exact $uses $i] < 0 } { # the lattice doesn't need the $i-th parameter widget celldm($i) disable } else { widget celldm($i) enable } } if { [vartextvalue ibrav] == "Free lattice" } { groupwidget cards__CELL_PARAMETERS enable } else { groupwidget cards__CELL_PARAMETERS disable } } tracevar nat w { set nat [varvalue nat] widgetconfigure atomic_coordinates -rows $nat #widgetconfigure atomic_coordinates_last_image -rows $nat # #set ni [varvalue path_inter_nimages] #if { $ni == "" } { set ni 0 } #for {set i 1} {$i <= $ni} {incr i} { # widgetconfigure atomic_coordinates_${i}_inter -rows $nat #} } tracevar ntyp w { set ntyp [varvalue ntyp] widgetconfigure atomic_species -rows $ntyp widgetconfigure starting_magnetization -end $ntyp widgetconfigure angle1 -end $ntyp widgetconfigure angle2 -end $ntyp widgetconfigure Hubbard_U -end $ntyp widgetconfigure Hubbard_J0 -end $ntyp widgetconfigure Hubbard_alpha -end $ntyp widgetconfigure Hubbard_beta -end $ntyp } tracevar nspin w { if { [vartextvalue nspin] == "Yes" } { groupwidget spin_polarization enable widgetconfigure starting_magnetization -end [varvalue ntyp] varset noncolin -value "" groupwidget noncolin_group disable foreach var {fixed_magnetization B_field} { widgetconfigure $var -start 3 -end 3 } } else { if { [vartextvalue noncolin] != "Yes" } { groupwidget spin_polarization disable } groupwidget noncolin_group disable } # constrained/fixed magnetization if { [vartextvalue nspin] == "Yes" || [vartextvalue noncolin] == "Yes" } { groupwidget constrained_magnetization_group enable } else { groupwidget constrained_magnetization_group disable } } tracevar noncolin w { if { [vartextvalue noncolin] == "Yes" } { groupwidget spin_polarization enable widgetconfigure starting_magnetization -end [varvalue ntyp] varset nspin -value "" groupwidget noncolin_group enable foreach var {fixed_magnetization B_field} { widgetconfigure $var -start 1 -end 3 } } else { if { [vartextvalue nspin] != "Yes" } { groupwidget spin_polarization disable } groupwidget noncolin_group disable } # constrained/fixed magnetization if { [vartextvalue nspin] == "Yes" || [vartextvalue noncolin] == "Yes" } { groupwidget constrained_magnetization_group enable } else { groupwidget constrained_magnetization_group disable } } tracevar tefield w { switch -- [vartextvalue tefield] { Yes { groupwidget tefield_group enable } default { groupwidget tefield_group disable } } } proc lelfield_widgets {status} { foreach w {nberrycyc efield efield_cart} { widget $w $status } } tracevar lelfield w { switch -- [vartextvalue lelfield] { Yes { foreach w {nberrycyc efield efield_cart} {widget $w enable} } default { foreach w {nberrycyc efield efield_cart} {widget $w disable} } } } tracevar lda_plus_u w { switch -- [vartextvalue lda_plus_u] { Yes { widget mixing_fixed_ns enable; groupwidget hubbard enable } default { widget mixing_fixed_ns disable; groupwidget hubbard disable } } } tracevar occupations w { if { [varvalue occupations] == "'from_input'" } { groupwidget occupations_card enable } else { groupwidget occupations_card disable } } tracevar assume_isolated w { if { [varvalue assume_isolated] == "'esm'" } { groupwidget ESM enable } else { groupwidget ESM disable } } tracevar london w { if { [vartextvalue london] == "Yes" } { groupwidget dftdG enable } else { groupwidget dftdG disable } } tracevar london w { if { [vartextvalue london] == "Yes" } { groupwidget dftdG enable } else { groupwidget dftdG disable } } tracevar xdm w { if { [vartextvalue xdm] == "Yes" } { groupwidget xdmG enable } else { groupwidget xdmG disable } } tracevar vdw_corr w { groupwidget dftdG disable groupwidget xdmG disable if { [varvalue vdw_corr] == "'grimme-d2'" } { groupwidget dftdG enable groupwidget xdmG disable } elseif { [varvalue vdw_corr] == "'xdm'" } { groupwidget dftdG disable groupwidget xdmG enable } } # ------------------------------------------------------------------------ # Page: ELECTRONS # ------------------------------------------------------------------------ tracevar adaptive_thr w { if { [vartextvalue adaptive_thr] == "Yes" } { groupwidget adaptive_thr_group enable } else { groupwidget adaptive_thr_group disable } } tracevar diagonalization w { switch -glob -- [varvalue diagonalization] { 'david*' { widget diago_cg_maxiter disable widget diago_david_ndim enable widget ortho_para enable #groupwidget diis disable } 'cg' { widget diago_cg_maxiter enable widget diago_david_ndim disable widget ortho_para disable #groupwidget diis disable } default { widget diago_cg_maxiter disable widget diago_david_ndim disable widget ortho_para disable #groupwidget diis disable } } } # ------------------------------------------------------------------------ # Page: IONS # ------------------------------------------------------------------------ tracevar ion_dynamics w { set calc [varvalue calculation] set iond [varvalue ion_dynamics] # MD switch -exact -- $calc { 'scf' - 'nscf' - 'bands' { groupwidget md disable } 'relax' - 'vc-relax' { # check !!! switch -exact -- $iond { 'damp' - 'verlet' - 'langevin' - 'beeman' { groupwidget md enable } default { groupwidget md disable } } } 'md' - 'vc-md' { # check !!! groupwidget md enable } } # BFGS if { $iond == "'bfgs'" && ($calc == "'relax'" || $calc == "'vc-relax'") } { groupwidget bfgs enable } else { groupwidget bfgs disable } ## CONSTRAINTS #if { ( $iond == "'constrained-damp'" && $calc == "'relax'" ) \ # || ( $iond == "'constrained-verlet'" && $calc == "'md'" ) } { # groupwidget constraints_card enable #} else { # groupwidget constraints_card disable #} } tracevar n_fe_step w { widgetconfigure fe_step -end [varvalue n_fe_step] } # ------------------------------------------------------------------------ # Page: CELL_PARAMETERS, ATOMIC_SPECIES, ATOMIC_POSITIONS # ------------------------------------------------------------------------ # # ------------------------------------------------------------------------ # Page: K-POINT DATA # ------------------------------------------------------------------------ tracevar K_POINTS_flags w { switch -exact -- [varvalue K_POINTS_flags] { tpiba - crystal - crystal_b - tpiba_b - {} { #widget nks enable groupwidget nks_line enable groupwidget kmesh_line disable widget kpoints enable widgetconfigure kpoints -cols 4 -rows [varvalue nks] } automatic { groupwidget nks_line disable groupwidget kmesh_line enable widget kpoints disable widgetconfigure kpoints -cols 4 -rows 0 } gamma { groupwidget nks_line disable groupwidget kmesh_line disable widget kpoints disable widgetconfigure kpoints -cols 4 -rows 0 } } } tracevar nks w { widgetconfigure kpoints -rows [varvalue nks] } # ------------------------------------------------------------------------ # Page: Other cards # ------------------------------------------------------------------------ tracevar constraints_enable w { set calc [varvalue calculation] if { [regexp relax|md $calc] } { widget constraints_enable enable if { [varvalue constraints_enable] } { groupwidget constraints_card enable } else { groupwidget constraints_card disable } } else { widget constraints_enable disable groupwidget constraints_card disable } } tracevar nconstr w { set nc [varvalue nconstr] widgetconfigure constraints_table -rows $nc } tracevar assume_isolated w { switch -- [varvalue assume_isolated] { 'dcc' { groupwidget ee enable } default { groupwidget ee disable } } } # ------------------------------------------------------------------------ # POST-PROCESSING: assign default values for "traced" variables, ... # ------------------------------------------------------------------------ postprocess { varset calculation -value 'scf' varset how_lattice -value celldm varset ibrav -value {} varset nspin -value {} varset tefield -value {} varset lda_plus_u -value {} varset occupations -value {} varset assume_isolated -value {} varset vdw_corr -value {} varset london -value {} varset xdm -value {} varset adaptive_thr -value {} varset diagonalization -value {} varset ion_dynamics -value {} varset K_POINTS_flags -value automatic varset CELL_PARAMETERS_flags -value {} # unused variables groupwidget unused_1 disable #groupwidget vdw_obsolete disable } espresso-5.1/PWgui-5.1/modules/pw/pw.tcl0000644000077300007730000012444312341332513020303 0ustar giannozzgiannozzsource commands.tcl module PW -title "PWSCF GUI: module PW.x" -script { readfilter ::pwscf::pwReadFilter writefilter ::pwscf::pwWriteFilter # ------------------------------------------------------------------------ # devide the GUI on pages (each namelist on its own page) # ------------------------------------------------------------------------ ######################################################################## ## ## ## &CONTROL NAMELIST ## ## ## ######################################################################## page controlPage -name "Control" { namelist control -name "CONTROL" { optional { #-default "'PWSCF sample input'" var title -label "Job Title (title):" var calculation { -label "Type of calculation (calculation):" -widget radiobox -textvalue { "Self-Consistent-Field " "Non-selfconsistent calculation " "Band structure calculation " "Ionic relaxation " "Ionic relaxation with Variable-Cell " "Molecular dynamics " "Molecular dynamics with Variable-Cell " } -value { 'scf' 'nscf' 'bands' 'relax' 'vc-relax' 'md' 'vc-md' } -default "Self-Consistent-Field " } var max_seconds { -label "Maximum CPU time \[in seconds\] (max_seconds):" -validate posint } var restart_mode { -label "Restart mode (restart_mode):" -widget optionmenu -textvalue { "from scratch " "from previous interrupted run " } -value { 'from_scratch' 'restart' } } var wf_collect { -label "Make a single restart file (wf_collect):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } separator -label "--- Directories/Files/Stdout ---" var outdir { -label "Temporary directory (outdir):" -widget entrydirselectquote -validate string } var wfcdir { -label "Temp. directory for files generated by each CPU (wfcdir):" -widget entrydirselectquote -validate string } var pseudo_dir \ -label "Directory containing pseudopotential files (pseudo_dir:)" \ -widget [list entrybutton "Directory ..." "::pwscf::pwSelectPseudoDir $this"] \ -validate string var prefix -label "Prefix for I/O filenames (prefix):" -validate string var lkpoint_dir { -label "Store each k-point in its own subdirectory (lkpoint_dir):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var disk_io { -label "Disk Input/Output (disk_io):" -textvalue { high default low minimal none } -value { 'high' 'default' 'low' 'none' } -widget optionmenu } var verbosity { -label "Verbosity of output (verbosity):" -widget optionmenu -textvalue { high default low minimal } -value { 'high' 'default' 'low' 'minimal' } } var iprint { -label "Interval (in SCF iterations) for printing band energies (iprint):" -widget spinint -validate nonnegint } separator -label "--- Ionic Minimization ---" #-text "threshold on total energy for ionic minimization" var etot_conv_thr { -label "Convergence energy threshold \[in Ry\] (etot_conv_thr):" -validate fortranposreal } #-text "Convergence threshold on forces for ionic minimization" var forc_conv_thr { -label "Convergence force threshold \[in Ry/Bohr\] (forc_conv_thr):" -validate fortranposreal } separator -label "--- Miscellaneous control parameters ---" var nstep { -label "Number of ionic steps (nstep):" -widget spinint -validate posint } var tstress { -label "Calculate stress (tstress):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var tprnfor { -label "Calculate forces (tprnfor):" -variable tprnfor -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var dt { -label "Molecular-Dynamics time step (dt):" -validate fortranposreal } var tefield { -label "Add a sawlike potential to bare ionic potential (tefield):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var dipfield { -label "Add a dipole correction to bare ionic potential (dipfield):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var lelfield { -label "Add a homogeneous finite electric field (lelfield):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var nberrycyc { -label "Num. of iterations for lelfield [see help] (nberrycyc):" -validate posint } var lorbm { -label "Perform orbital magnetization calculation (lorbm):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } separator -label "--- Berry phase ---" var lberry { -label "Calculate Berry phase (lberry):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var gdir { -label "Direction of the k-point strings (gdir):" -widget optionmenu -textvalue { "along 1st reciprocal vector" "along 2nd reciprocal vector" "along 3rd reciprocal vector" } -value { 1 2 3 } } var nppstr { -label "Num. of k-points along each symmetry-reduced string (nppstr):" -validate posint } } } } ######################################################################## ## ## ## &SYSTEM NAMELIST ## ## ## ######################################################################## page systemPage -name "System" { # ---------------------------------------------------- # REQUIRED variables # ---------------------------------------------------- namelist system -name "SYSTEM" { required { # # WARNING: if you change the strings among the possible # ibrav values, then search the "tracevar ibrav" # section in the file pwscf-special.tcl and change # there the strings to match EXACTLY with the # ones defined here !!! # var ibrav { -label "Braivas lattice index (ibrav):" -fmt %d -widget combobox -textvalue { "Free lattice" "Cubic P (sc)" "Cubic F (fcc)" "Cubic I (bcc)" "Hexagonal and Trigonal P" "Trigonal R, 3fold axis c" "Trigonal R, 3fold axis <111>" "Tetragonal P (st)" "Tetragonal I (bct)" "Orthorhombic P" "Orthorhombic base-centered(bco)" "Orthorhombic face-centered" "Orthorhombic body-centered" "Monoclinic P, unique axis c" "Monoclinic P, unique axis b" "Monoclinic base-centered" "Triclinic P" } -value {0 1 2 3 4 5 -5 6 7 8 9 10 11 12 -12 13 14} } group lattice_spec -name "Lattice specification:" -decor normal { auxilvar how_lattice { -label "How to specify lattice:" -value {celldm abc} -textvalue {"by celldm()" "by A,B,C,cosAB,cosAC,cosBC"} -widget radiobox } dimension celldm { -label "Crystallographic constants (celldm)" -validate fortranreal -start 1 -end 6 } group abc { packwidgets left var A -label "A:" -validate fortranposreal var B -label "B:" -validate fortranposreal var C -label "C:" -validate fortranposreal } group cosABC { packwidgets left var cosAB -label "cosAB:" -validate fortranreal var cosAC -label "cosAC:" -validate fortranreal var cosBC -label "cosBC:" -validate fortranreal } } var nat { -label "Number of atoms in the unit cell (nat):" -fmt %d -default 1 -widget spinint -validate posint } var ntyp { -label "Number of types of atoms in the unit cell (ntyp):" -fmt %d -default 1 -widget spinint -validate posint } var ecutwfc { -label "Kinetic energy cutoff for WAVEFUNCTION \[in Ry\] (ecutwfc):" -validate fortranposreal } var ecutrho { -label "Kinetic energy cutoff for DENSITY \[in Ry\] (ecutrho):" -validate fortranposreal } } # ---------------------------------------------------- # OPTIONAL variables # ---------------------------------------------------- optional { var nosym { -label "Do not use the symmetry (nosym):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var nosym_evc { -label "Do not use the symmetry except for the k-points (nosym_evc):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var noinv { -label "Disable time reversal symmetry in k-point generation (noinv):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var no_t_rev { -label "Disable the symmetry operations that require time reversal (no_t_rev):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var force_symmorphic { -label "Force the symmetry group to be symmorphic (force_symmorphic):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var use_all_frac { -label "Use all symmetry operations with fractionary translations (use_all_frac):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var nbnd { -label "Number of electronic states (nbnd):" -widget spinint -validate posint -fmt %d } var tot_charge { -label "Total system charge (tot_charge):" -validate fortranreal -fmt %f } var input_dft -label "Exchange-correlation functional (input_dft):" separator -label "--- Occupations ---" var occupations { -label "Occupation of states (occupations):" -widget optionmenu -textvalue { smearing tetrahedra fixed "read from input" } -value { 'smearing' 'tetrahedra' 'fixed' 'from_input' } } var one_atom_occupations { -text "For isolated atoms only (nat=1)" -label "Order the wavefunctions as the atomic starting wavefunctions (one_atom_occupations):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var starting_spin_angle { -text "For spin-orbit case when domag=.TRUE." -label "Multiply the initial radial wavefunctions by spin-angle functions (starting_spin_angle):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var degauss { -label "Gaussian spreading for BZ integration \[in Ry\] (degauss):" -validate fortrannonnegreal } var smearing { -label "Type of spreading/smearing (smearing):" -textvalue { "first order interpolation in Methfessel-Paxton spreading " "ordinary Gaussian spreading " "Marzari-Vanderbilt cold smearing " "Fermi-Dirac smearing " } -value { 'methfessel-paxton' 'gaussian' 'marzari-vanderbilt' 'fermi-dirac' } -widget optionmenu } separator -label "--- Spin polarization ---" var nspin { -label "Perform spin-polarized calculation (nspin):" -textvalue {No Yes "Yes noncollinear"} -value {1 2 4} -widget radiobox } group spin_polarization -decor none { dimension starting_magnetization { -label "Starting magnetization (starting_magnetization):" -text "Specify starting magnetization (between -1 and 1) for each \"magnetic\" species" -validate fortranreal -start 1 -end 1 } var tot_magnetization { -label "Total magnetization (N el. up-down) (tot_magnetization):" -validate posint -widget spinint } } # insert here ... separator -label "--- Noncolinear calculation ---" var noncolin { -label "Perform noncolinear calculation (noncolin):" -textvalue {No Yes} -value {.false. .true.} -widget radiobox } group noncolin_group { dimension angle1 { -label "Starting magnetization direction (angle1) :" -text "Specify starting magnetization direction for each \"magnetic\" species" -validate fortranreal -start 1 -end 1 } dimension angle2 { -label "Starting magnetization direction (angle2):" -text "Specify starting magnetization direction for each \"magnetic\" species" -validate fortranreal -start 1 -end 1 } var lspinorb { -label "Allow the use of a pseudopotential with spin-orbit (lspinorb):" -textvalue {No Yes} -value {.false. .true.} -widget radiobox } } separator -label "--- Constrained/Fixed magnetization ---" group constrained_magnetization_group { var constrained_magnetization { -label "Constrained magnetic calculation (constrained_magnetization):" -textvalue { "no constrain " "constrain TOTAL magnetization " "constrain ATOMIC magnetization " "constrain magnetization to \"ATOMIC DIRECTION\" " "constrain the direction of total magnetization " } -value {'none' 'total' 'atomic' {'atomic direction'} {'total direction'}} -widget optionmenu } dimension fixed_magnetization { -label "Fixed total magnetization" -start 1 -end 3 -validate fortranreal } # dimension B_field { # -label "Add a fixed magnetic field (B_field):" # -start 1 -end 3 # -validate fortranreal # } var lambda { -label "Lamda parameter for constrained magnetization (lambda):" -validate fortranreal } var report { -label "Interval (in iterations) for printing atomic magnetic moments (report):" -validate posint } } separator -label "--- Hartree Fock & Hybrid Functionals ---" var ecutfock { -label "Kinetic energy cutoff for exact exchange operator \[in Ry\] (ecutfock):" -validate fortranposreal } var exx_fraction { -label "Fraction of EXX for hybrid functional calculations (exx_fraction):" -validate fortranreal } var exxdiv_treatment { -label "Approach for treating Coulomb potential divergencies at small q vectors (exxdiv_treatment):" -widget optionmenu -value { 'gygi-baldereschi' 'vcut_spherical' 'vcut_ws' 'none' } -textvalue { gygi-baldereschi vcut_spherical vcut_ws none } } var ecutvcut { -label "Reciprocal space cutoff for exxdiv_treatment (ecutvcut):" -validate fortranreal } var screening_parameter { -label "Screening_parameter for HSE like hybrid functionals (screening_parameter):" -validate fortranreal } group nqx123 { packwidgets left var nqx1 -label "nqx1:" -validate fortranposreal var nqx2 -label "nqx2:" -validate fortranposreal var nqx3 -label "n1x3:" -validate fortranposreal } separator -label "--- LDA + U parameters ---" var lda_plus_u { -label "Perform LDA + U calculation (lda_plus_u):" -textvalue {No Yes} -value {.false. .true.} -widget radiobox } group hubbard -name Hubbard { var lda_plus_u_kind { -label "type of LDA + U calculation (lda_plus_u_kind):" -textvalue { "simplified version of Cococcioni and de Gironcoli" "rotationally invariant scheme of Liechtenstein et al." } -value {0 1} -widget radiobox } dimension Hubbard_U { -label "Hubbarb U (Hubbard_U):" -validate fortranreal -start 1 -end 1 } dimension Hubbard_J0 { -label "Hubbarb J0 (Hubbard_J0):" -validate fortranreal -start 1 -end 1 } dimension Hubbard_alpha { -label "Hubbard alpha (Hubbard_alpha):" -validate fortranreal -start 1 -end 1 } dimension Hubbard_beta { -label "Hubbard beta (Hubbard_beta):" -validate fortranreal -start 1 -end 1 } # can't input Hubbard_J and starting_ns_eigenvalue var U_projection_type { -label "Type of projector on localized orbital (U_projector_type):" -widget optionmenu -textvalue { "use atomic wfc's (as they are) to build the projector " "use Lowdin orthogonalized atomic wfc's " "use Lowdin normalization of atomic wfc " "use the information from file \"prefix\".atwfc " } -value { 'atomic' 'ortho-atomic' 'norm-atomic' 'file' } } } separator -label "--- Variable cell parameters ---" group vc_md -name VC-MD { var ecfixed { -label "ecfixed:" -validate fortranreal } var qcutz { -label "qcutz:" -validate fortranreal } var q2sigma { -label "q2sigma:" -validate fortranreal } } separator -label "--- Saw-like potential parameters ---" group tefield_group -name TeField { var edir { -label "Direction of electric field (edir)" -widget optionmenu -textvalue { "along 1st reciprocal vector" "along 2nd reciprocal vector" "along 3rd reciprocal vector" } -value { 1 2 3 } } var emaxpos { -text "Position of maximum of sawlike potential within the unit cell" -label "Position of maximum (emaxpos):" -validate fortranreal } var eopreg { -text "Part of the unit cell where the sawlike potential decreases" -label "Where the sawlike potential decreases (eopreg):" -validate fortranreal } var eamp -label "Amplitude of the electric field \[in a.u.\] (eamp):" } separator -label "--- Low-dimensional calculation ---" var assume_isolated { -label "Type of correction for isolated systems (assume_isolated):" -widget radiobox -textvalue { "Makov-Payne " "Martyna-Tuckerman " "Density Counter Charge " "Effective Screening Medium " "No correction " } -value {'makov-payne' 'martyna-tuckerman' 'dcc' 'esm' 'none'} } separator -label "--- Effective screening medium ---" group ESM { var esm_bc { -label "Boundary conditions for ESM (esm_bc):" -widget radiobox -textvalue { "vacuum-slab-vacuum (open boundary conditions) " "metal-slab-metal (dual electrode configuration) " "vacuum-slab-metal " "regular periodic calculation (no ESM) " } -value {'bc1' 'bc2' 'bc3' 'pbc'} } var esm_w { -label "Position offset [in a.u.] of the start of the ESM region (esm_w):" -validate fortranreal } var esm_efield { -label "Magnitude of the applied electric field [Ryd/a.u.] (esm_efield):" -validate fortranreal } var esm_nfit { -label "Number of z-grid points for the polynomial fit @ cell edge (esm_nfit):" -validate posint } } separator -label "--- Semi-empirical van der Waals (aka DFT-D) ---" group vdW { var vdw_corr { -label "Type of Van der Waals correction (vdw_corr):" -textvalue {Grimme-D2 XDM None} -value {'grimme-d2' 'xdm' ''} -widget optionmenu } group dftdG { var london_s6 -label "Global scaling parameter for DFT-D (london_s6):" -validate fortranposreal var london_rcut -label "Cutoff radius for dispersion interactions \[in a.u.\] (london_rcut):" -validate fortranposreal } group xdmG { var xdm_a1 -label "Damping function parameter a1 (xdm_a1):" -validate fortranreal var xdm_a2 -label "Damping function parameter a1 (xdm_a2):" -validate fortranreal } group vdw_obsolete -name "Obsolete vdW variables:" -decor normal { var london { -label "Compute the semi-empirical dispersion term \[aka DFT-D\] (london):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var xdm { -label "Compute the XDM-type dispersion term (xdm):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } } } separator -label "--- FFT mesh (hard grid) for charge density ---" var nr1 -label "nr1:" -validate posint -widget spinint var nr2 -label "nr2:" -validate posint -widget spinint var nr3 -label "nr3:" -validate posint -widget spinint separator -label "--- FFT mesh (soft grid) for wavefunction ---" var nr1s -label "nr1s:" -validate posint -widget spinint var nr2s -label "nr2s:" -validate posint -widget spinint var nr3s -label "nr3s:" -validate posint -widget spinint } } } ######################################################################## ## ## ## &ELECTRONS NAMELIST ## ## ## ######################################################################## page electronsPage -name "Electrons" { namelist electrons -name "ELECTRONS" { optional { var electron_maxstep { -label "Max. \# of iterations in SCF step (electron_maxstep):" -widget spinint -validate posint -fmt %d } var scf_must_converge { -label "Stop MD or ionic relaxation if SCF fails to converge (scf_must_converge):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var conv_thr { -label "Convergence threshold for selfconsistency (conv_thr):" -validate fortranposreal } var adaptive_thr { -label "Use adaptive convergence threshold for EXX (adaptive_thr):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } group adaptive_thr_group -name "Adaptive convergence threshold setup:" { var conv_thr_init { -label "Convergence threshold used for the first scf cycle (conv_thr_init):" -validate fortranposreal } var conv_thr_multi { -label "Convergence threshold factor for the rest of scf cycles (conv_thr_multi):" -validate fortranposreal } } var startingpot { -label "Type of starting potential (startingpot):" -widget optionmenu -textvalue { "from atomic charge superposition " {from existing potential "prefix".pot file } } -value {'atomic' 'file'} } var startingwfc { -label "Type of starting wavefunctions (startingwfc):" -widget optionmenu -textvalue { "from superposition of atomic orbitals " "from + superimposed \"randomization\" " "from random wavefunctions " "from existing wavefunction file " } -value {'atomic' 'atomic+random' 'random' 'file'} } separator -label "--- SCF Mixing ---" var mixing_mode { -label "Mixing mode (mixing_mode):" -textvalue { "charge density Broyden mixing " "charge density Broyden mixing with simple Thomas-Fermi (TF) screening " "charge density Broyden mixing with local-density-dependent TF screening " } -value { 'plain' 'TF' 'local-TF' } -widget optionmenu } var mixing_beta { -label "Mixing factor for self-consistency (mixing_beta):" -validate fortranposreal } var mixing_ndim { -label "Number of iterations used in mixing scheme (mixing_ndim):" -widget spinint -validate posint -fmt %d } var mixing_fixed_ns { -text "For LDA+U only: ns = atomic density appearing in the Hubbard term" -label "Number of iterations with fixed ns (mixing_fixed_ns):" -widget spinint -validate posint -fmt %d } separator -label "--- Diagonalization ---" var diagonalization { -label "Type of diagonalization (diagonalization):" -textvalue { "Davidson iterative diagonalization with overlap matrix " "Conjugate-gradient-like band-by-band diagonalization " } -value { 'david' 'cg' } -widget optionmenu } var diago_thr_init { -label "Convergence threshold for 1st iterative diagonalization (diago_thr_init):" -validate fortranreal } var diago_full_acc { -label "Diagonalize empty states as precise as occupied states (diago_full_acc):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } var diago_cg_maxiter { -text "For CONJUGATE-GRADIENT DIAGONALIZATION only" -label "Max. \# of iterations (diago_cg_maxiter):" -widget spinint -validate posint -fmt %d } separator -label "--- DAVIDSON diagonalization ---" var diago_david_ndim { -label "Dimension of workspace (diago_david_ndim):" -widget spinint -validate posint -fmt %d } separator -label "--- Finite electric field calculation ---" var efield { -label "The intensity of the electric field (efield):" -validate fortranreal } dimension efield_cart { -label "Finite electric field in cartesian axis (efield_cart):" -validate fortranreal -start 1 -end 3 } separator -label "--- Ultrasoft pseudopotentials ---" var tqr { -label "Use real-space algorithm for augmentation charges (tqr):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } separator -label "--- Obsolete variables ---" var ortho_para { -text "OBSOLETE: use command-line option \" -ndiag XX\" instead" -label "(ortho_para):" -validate integer } } } } ######################################################################## ## ## ## &IONS NAMELIST ## ## ## ######################################################################## page ionsPage -name "Ions" { namelist ions -name "IONS" { optional { # this should be modified as it is CASE dependent var ion_dynamics { -label "Type of ionic dynamics (ion_dynamics):" -widget optionmenu -textvalue { "BFGS quasi-newton method for structural optimization " "damped dynamics (quick-min Verlet) for structural optimization " "Verlet algorithm for molecular dynamics " "over-damped Langevin dynamics " "Beeman algorithm for variable cell damped dynamics " "Beeman algorithm for variable cell MD " } -value { 'bfgs' 'damp' 'verlet' 'langevin' 'damp' 'beeman' } } var ion_positions { -label "Which ion positions to use when restarting (ion_positions):" -widget radiobox -textvalue { "from restart file" "from standard input" } -value { 'default' 'from_input' } } var phase_space { -label "Type of phase-space (phase_space):" -textvalue { "The standard configuration space " "Coarse-grained phase-space defined by few order parameters " } -value { 'full' 'coarse-grained' } -widget optionmenu } var pot_extrapolation { -text "Extrapolation for the potential" -label "Type of extrapolation (pot_extrapolation):" -textvalue { "no extrapolation " "extrapolate the potential as a sum of atomic-like orbitals " "extrapolate potential with first-order formula " "extrapolate potential with second-order formula " } -value { 'none' 'atomic' 'first_order' 'second_order' } -widget optionmenu } var wfc_extrapolation { -text "Extrapolation for the wavefunctions" -label "Type of extrapolation (wfc_extrapolation):" -textvalue { "no extrapolation " "extrapolate wave-functions with first-order formula " "extrapolate wave-functions with second-order formula " } -value { 'none' 'first_order' 'second_order' } -widget optionmenu } var remove_rigid_rot { -label "Remove the total torque from internal forces (remove_rigid_rot):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } separator -label "--- Molecular Dynamics ---" group md { var ion_temperature { -label "Temperature of ions (ion_temperature):" -widget optionmenu -textvalue { "velocity rescaling via tempw&tolp " "velocity rescaling via tempw&nraise " "velocity rescaling via delta_t " "reduce ionic temperature via delta_t&nraise " "\"soft\" Berendsen velocity rescaling via tempw&nraise " "use Andersen thermostat via tempw&nraise " "initialize to temperature \"tempw\" and leave uncontrolled " "not controlled " } -value { 'rescaling' 'rescale-v' 'rescale-T' 'reduce-T' 'berendsen' 'andersen' 'initial' 'not_controlled' } } var tempw { -label "Starting temperature in MD runs (tempw):" -validate fortrannonnegreal } var tolp { -label "Tolerance for velocity rescaling (tolp):" -validate fortranreal } var delta_t { -label "Temperature rescaling (delta_t):" -validate fortranreal } var nraise { -label "Rescaling interval (nraise):" -validate integer } var refold_pos { -label "Refolded ions at each step into the supercell (refold_pos):" -widget radiobox -textvalue { Yes No } -value { .true. .false. } } } separator -label "--- BFGS Structural Optimization ---" var upscale { -text "Max. reduction factor for conv_thr during structural optimization" -label "Max. reduction factor (upscale):" -validate fortranposreal } group bfgs { var bfgs_ndim { -label "Workspace dimension used in the PULAY mixing of the residual vectors:" -widget spinint -validate posint } var trust_radius_max { -label "Maximum ionic displacement in the structural relaxation (trust_radius_max):" -validate fortranposreal } var trust_radius_min { -label "Minimum ionic displacement in the structural relaxation (trust_radius_min):" -validate fortranposreal } var trust_radius_ini { -label "Initial ionic displacement in the structural relaxation (trust_radius_ini):" -validate fortranposreal } group w1_w2 -name "Parameters used in line search based on the Wolfe conditions:" -decor normal { packwidgets left var w_1 -label "w_1:" -validate fortranreal var w_2 -label "w_2:" -validate fortranreal } } } } } ######################################################################## ## ## ## &CELL NAMELIST ## ## ## ######################################################################## page variableCellPage -name "Variable Cell" { namelist cell -name "CELL" { var cell_dynamics { -label "Type of dynamics for the cell (cell_dynamics):" -textvalue { "None " "Damped (Beeman) dynamics of the Parrinello-Raman extended lagrangian " "Damped (Beeman) dynamics of the new Wentzcovitch extended lagrangian " "BFGS quasi-newton algorithm (ion_dynamics must be 'bfgs' too) " "(Beeman) dynamics of the Parrinello-Raman extended lagrangian " "(Beeman) dynamics of the new Wentzcovitch extended lagrangian " } -value { 'none' 'damp-pr' 'damp-w' 'bfgs' 'pr' 'w' } -widget optionmenu } var press { -label "Target pressure \[in KBar\] in a variable-cell MD (press):" -validate fortranreal } var wmass { -label "Ficticious cell mass for variable-cell MD (wmass):" -validate fortranreal } var press_conv_thr { -label "Convergence pressure threshold \[in KBar\] (press_conv_thr):" -validate fortranposreal } var cell_factor { -text "This variable is used in the construction of the pseudopotential tables. It should exceed the maximum linear contraction of the cell during a simulation" -label "Cell factor (cell_factor):" -validate fortranreal } var cell_dofree { -label "Which of the cell parameters should be moved (cell_dofree):" -textvalue { "all = all axis and angles are propagated" "x = only the x axis is moved" "y = only the y axis is moved" "z = only the z axis is moved" "xy = only the x and y axis are moved, angles are unchanged" "xz = only the x and z axis are moved, angles are unchanged" "yz = only the y and z axis are moved, angles are unchanged" "xyz = x, y and z axis are moved, angles are unchanged" "shape = all axis and angles, keeping the volume fixed" } -value { 'all' 'x' 'y' 'z' 'xy' 'xz' 'yz' 'xyz' 'shape' } -widget optionmenu } } } ######################################################################## ## ## ## CARDS: CELL_PARAMETERS, ATOMIC_SPECIES, ATOMIC_POSITIONS ## ## ## ######################################################################## page latticeAtomdataPage -name "Lattice & Atoms" { # # CELL_PARAMETERS # group cards__CELL_PARAMETERS -name "Card: CELL_PARAMETERS" -decor normal { line lattice_type_line -decor none { keyword cell_parameters CELL_PARAMETERS var CELL_PARAMETERS_flags { -label "Cell parameter's unit:" -value {alat bohr angstrom} -textvalue {Alat Bohr Angstrom} -widget radiobox } } table lattice { -caption "Lattice Basis Vectors:" -head {X-Component Y-Component Z-Component} -validate {fortranreal fortranreal fortranreal} -cols 3 -rows 3 -outfmt {" %14.9f" %14.9f %14.9f} } } # # ATOMIC_SPECIES # group atomic_species_group -name "Card: ATOMIC_SPECIES" -decor normal { keyword atomic_species_key ATOMIC_SPECIES\n table atomic_species \ -caption "Atomic types:" \ -head {Atomic-label Atomic-Mass Pseudopotential-file} \ -cols 3 \ -rows 1 \ -outfmt {" %3s" %10.5f " %s"} \ -validate {whatever fortranreal whatever} \ -widgets [list entry entry [list entrybutton "Pseudopotential ..." [list ::pwscf::pwSelectPseudopotential $this atomic_species]]] } # # ATOMIC_POSITIONS # group atomic_positions_group -name "Card: ATOMIC_POSITIONS" -decor normal { line atom_coor_unit -decor none { keyword atomic_positions ATOMIC_POSITIONS var ATOMIC_POSITIONS_flags { -label "Atomic coordinate length unit:" -textvalue { "Cartesian in ALAT (i.e. in length units of celldm(1)) " "Cartesian in BOHR " "Cartesian in ANGSTROMS " "Internal crystal coordinates " } -value {alat bohr angstrom crystal} -widget radiobox -default "Cartesian in ALAT (i.e. in length units of celldm(1)) " } } table atomic_coordinates { -caption "Atomic coordinates:" -head {Atomic-label X-Coordinate Y-Coordinate Z-Coordinate if_pos(1) if_pos(2) if_pos(3)} -validate {string fortranreal fortranreal fortranreal binary binary binary} -cols 7 -rows 1 -outfmt {" %3s" " %14.9f" %14.9f %14.9f " %2d" %2d %2d} -widgets {entry entry entry entry checkbutton} -onvalues 1 -offvalues 0 -optionalcols 4 } # -optcols {4 5 6} loaddata atomic_coordinates ::pwscf::pwLoadAtomCoor \ "Load atomic coordinates from file ..." } } ######################################################################## ## ## ## CARD: K_POINTS ## ## ## ######################################################################## page kpointsPage -name "K-points" { # # K_POINTS # group k_points_group -name "Card: K_POINTS" -decor normal { line kpoint_type_line -decor none { keyword k_points K_POINTS var K_POINTS_flags { -label "K-points type:" -textvalue { "Manual specification in 2pi/a units " "Manual specification in CRYSTAL units " "Automatic generation " "Gamma point only " "Manual \"2pi/a\" specification for band structure plot " "Manual \"crystal\" specification for band structure plot " } -value { tpiba crystal automatic gamma tpiba_b crystal_b } -widget radiobox -default "Manual specification in 2pi/a units " } } line nks_line -decor none { var nks -label "Number of K-points:" -widget spinint -validate posint -default 1 } # if nks=0 then enter the mesh and shifts group kmesh_shift_group -name "k-points mesh + shift" -decor normal { line kmesh_line -decor none { group kmesh -name Kmesh { packwidgets left var nk1 -label "nk1:" -widget spinint -validate posint -outfmt " %d " -default 1 var nk2 -label "nk2:" -widget spinint -validate posint -outfmt "%d " -default 1 var nk3 -label "nk3:" -widget spinint -validate posint -outfmt "%d " -default 1 } group kshift -name Kshift { packwidgets left var sk1 -label "sk1:" -widget spinint -validate binary -outfmt " %d " -default 1 var sk2 -label "sk2:" -widget spinint -validate binary -outfmt "%d " -default 1 var sk3 -label "sk3:" -widget spinint -validate binary -outfmt "%d " -default 1 } } } # elseif nks>0 enetr kpoint coordinates table kpoints { -caption "Enter the coordinates of the K-points below:" -head {KX-Coordinate KY-Coordinate KZ-Coordinate Weight} -cols 4 -rows 0 -validate {fortranreal fortranreal fortranreal fortranreal} -outfmt {%14.9f %14.9f %14.9f " %14.9f"} } loaddata kpoints ::pwscf::pwLoadKPoints \ "Load K-point coordinates from file ..." } } ######################################################################## ## ## ## PAGE: CONSTRAINTS & OCCUPATIONS ## ## ## ######################################################################## page otherPage -name "Other Cards" { # CARD: CONSTRAINTS group constraints_group -name "Card: CONSTRAINTS" -decor normal { auxilvar constraints_enable { -label "Use constraints:" -value {Yes No} -widget radiobox -default No } group constraints_card -decor none { keyword constraints_key CONSTRAINTS\n line constraints_line1 -decor none { var nconstr { -label "Number of constraints:" -validate posint -widget spinint -default 1 -outfmt " %d " } var constr_tol { -label "Tolerance for keeping the constraints satisfied:" -validate fortranposreal } } table constraints_table { -caption "Enter constraints data:\n constraint-type constr(1,.) constr(2,.) ... { constr_target(.) }\n\n(see Help for the format of \"constraint-specification\")" -head {constraint-type constraint-specifications ... ... ... ...} -validate {string fortranreal} -cols 6 -rows 1 -optionalcols 3 -widgets {{optionmenu {'type_coord' 'atom_coord' 'distance' 'planar_angle' 'torsional_angle' 'bennett_proj'}} entry} -outfmt {" %s " %S} -infmt {%d %S} } } } # CARD: OCCUPATIONS group occupations_card -name "Card: OCCUPATIONS" -decor normal { keyword occupations_key OCCUPATIONS\n text occupations_table \ -caption "Syntax for NON-spin polarized case:\n u(1) .... .... .... u(10)\n u(11) .... u(nbnd)\n\nSyntax for spin-polarized case:\n u(1) .... .... .... u(10)\n u(11) .... u(nbnd)\n d(1) .... .... .... d(10)\n d(11) .... d(nbnd)" \ -label "Specify occupation of each state (from 1 to nbnd) such that 10 occupations per are written per line:" \ -readvar ::pwscf::pwscf($this,OCCUPATIONS) } } # ---------------------------------------------------------------------- # take care of specialities # ---------------------------------------------------------------------- source pw-event.tcl # ------------------------------------------------------------------------ # source the HELP file # ------------------------------------------------------------------------ source pw-help.tcl } espresso-5.1/PWgui-5.1/modules/dos/0000755000077300007730000000000012341333047017303 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/dos/commands.tcl0000644000077300007730000000070212341332513021604 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # # ------------------------------------------------------------------------ proc ::pwscf::dosReadFilter {moduleObj channel} { # dos.x formatted input file should have the &DOS namelist set status [::pwscf::readFilter::findNamelists $moduleObj $channel DOS errMsg] if { $status == 0 } { $moduleObj readFileWrongFormat dos.x $errMsg } return $channel }espresso-5.1/PWgui-5.1/modules/dos/dos.tcl0000644000077300007730000000302112341332513020565 0ustar giannozzgiannozzsource commands.tcl module Dos\#auto -title "PWSCF GUI: module Dos.x" -script { readfilter ::pwscf::dosReadFilter namelist dos -name "DOS" { optional { var prefix { -label "Prefix of punch file saved by program PW.X (prefix):" -fmt %S -validate string } var outdir { -label "Temporary directory where PW.X files resides (outdir):" -widget entrydirselectquote -fmt %S -validate string } var fildos { -label "Prefix for output files containing DOS(E) (fildos):" -validate string } separator -label "--- DOS ploting options ---" var ngauss { -label "Type of gaussian broadening (ngauss):" -widget radiobox -value {0 1 -1 99} -textvalue { "Simple Gaussian (default)" "Methfessel-Paxton of order 1" "Marzari-Vanderbilt \"cold smearing\"" "Fermi-Dirac function" } } var degauss { -label "Gaussian broadening \[in Ry\] (degauss):" -validate fortranreal } var DeltaE { -label "Resolution of PDOS plots \[in eV\] (DeltaE):" -validate fortranreal -default 0.01 } var Emin { -label "Minimum energy \[in eV\] (Emin):" -validate fortranreal } var Emax { -label "Maximum energy \[in eV\] (Emin):" -validate fortranreal } } } # ------------------------------------------------------------------------ # source the HELP file # ------------------------------------------------------------------------ source dos-help.tcl } espresso-5.1/PWgui-5.1/modules/dos/dos-help.tcl0000644000077300007730000000651312341332513021524 0ustar giannozzgiannozz # # Help-file automatically created by helpdoc utility # # !!! DO NOT EDIT: CHANGES WILL BE LOST !!! # # ------------------------------------------------------------------------ help prefix -helpfmt helpdoc -helptext {
  •  Variable: prefix

  •  Type: CHARACTER

  •  Default: 'pwscf'

  •  Description:
  • prefix of input file produced by pw.x
    (wavefunctions are not needed)
             
} # ------------------------------------------------------------------------ help outdir -helpfmt helpdoc -helptext {
  •  Variable: outdir

  •  Type: CHARACTER

  •  Default: value of the ESPRESSO_TMPDIR environment variable if set; current directory ('./') otherwise

  •  Description:
  • directory containing the input data,
    i.e. the same as in pw.x
             
} # ------------------------------------------------------------------------ help ngauss -helpfmt helpdoc -helptext {
  •  Variable: ngauss

  •  Type: INTEGER

  •  Default: 0

  •  Status: optional

  •  Description:
  • Type of gaussian broadening:
    
        =  0  Simple Gaussian (default)
    
        =  1  Methfessel-Paxton of order 1
    
        = -1  Marzari-Vanderbilt "cold smearing"
    
        =-99  Fermi-Dirac function
             
} # ------------------------------------------------------------------------ help degauss -helpfmt helpdoc -helptext {
  •  Variable: degauss

  •  Type: REAL

  •  Description:
  • gaussian broadening, Ry (not eV!)          see below
             
} # ------------------------------------------------------------------------ grouphelp {Emin Emax} -helpfmt helpdoc -helptext {
  •  Variables: Emin, Emax

  •  Type: REAL

  •  Default: band extrema

  •  Description:
  • min, max energy (eV) for DOS plot. If unspecified, the
    lower and/or upper band value, plus/minus 3 times the
    value of the gaussian smearing if present, will be used.
             
} # ------------------------------------------------------------------------ help DeltaE -helpfmt helpdoc -helptext {
  •  Variable: DeltaE

  •  Type: REAL

  •  Description:
  • energy grid step (eV)
             
} # ------------------------------------------------------------------------ help fildos -helpfmt helpdoc -helptext {
  •  Variable: fildos

  •  Type: CHARACTER

  •  Default: "prefix".dos

  •  Description:
  • output file containing DOS(E)
             
} espresso-5.1/PWgui-5.1/modules/pp/0000755000077300007730000000000012341333047017135 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/pp/pp.tcl0000644000077300007730000001444512341332513020265 0ustar giannozzgiannozzsource commands.tcl module PP\#auto -title "PWSCF GUI: module PP.x" -script { readfilter ::pwscf::ppReadFilter # # Namelist: INPUTPP # page extract -name "Specify property to calculate" { namelist inputpp -name "INPUTPP" { var prefix \ -label "Prefix of punch file saved by program PW.X (prefix):" \ -widget [list entrybutton "Prefix ..." [list ::pwscf::selectFileRoot $this prefix]] \ -fmt %S -validate string \ -validate string var outdir { -label "Temporary directory where PW.X files resides (outdir):" -widget entrydirselectquote -fmt %S -validate string -validate string } var filplot { -label "Output file that will contain the calculated quantity (filplot):" -fmt %S -validate string -validate string } var plot_num { -label "What to calculate (plot_num):" -widget radiobox -textvalue { "charge density" "total potential (= V_bare + V_H + V_xc)" "local ionic potential (= V_bare)" "local density of states at E_fermi" "local density of electronic entropy" "STM images" "spin polarization (= rho(up) - rho(down))" "|psi|^2" "|psi|^2 (noncollinear case)" "electron localization function (ELF)" "charge density minus superposition of atomic densities" "integrated local density of states (ILDOS)" "electrostatic potential (= V_bare + V_H)" "sawtooth electric field potential" "noncolinear magnetization" "all-electron valence charge density (for PAW)" "exchange-correlation magnetic field (for noncollinear)" "reduced density gradient" "product of density and 2nd-eigenvalue of density Hessian matrix" } -value { 0 1 2 3 4 5 6 7 7 8 9 10 11 12 13 17 18 19 20 } -fmt %d } var spin_component { -label "Spin component (spin_component):" -widget optionmenu -textvalue { "total charge/potential" "spin up charge/potential" "spin down charge/potential" "charge" "absolute value" "x component of the magnetization" "y component of the magnetization" "z component of the magnetization" } -value { 0 1 2 0 0 1 2 3 } } separator -label "--- Options for STM images ---" group stm -name "STM" { var sample_bias { -label "For STM: the bias of the sample [in Ryd] in STM images (sample_bias):" -validate fortranreal } } separator -label "--- Options for |psi|^2 ---" group psi2 -name "Psi2" { var kpoint { -label "For |psi^2|: which k-point (kpoint):" -widget spinint -validate posint -fmt %d } var kband { -label "For |psi^2|: which band (kband):" -widget spinint -validate posint -fmt %d } var lsign { -label "For |psi^2| & Gamma: save the sign(psi) (lsign):" -widget radiobox -textvalue {Yes No} -value {.true. .false.} } } separator -label "--- Options for ILDOS ---" group ildos -name "ILDOS" { var emin { -label "For ILDOS: miminum energy [in eV] (emin):" -validate fortranreal } var emax { -label "FOR ILDOS: maximum energy [in eV] (emax):" -validate fortranreal } } } } # # Namelist: PLOT # page chdens -name "Specify Plot " { namelist plot -name "PLOT" { var nfile { -label "Number of data files (nfile):" -widget spinint -validate posint -default 1 } dimension filepp { -label "Filenames of data files:" -start 1 -end 1 -widget entryfileselectquote -validate string -fmt %S } dimension weight { -label "Weighting factors:" -start 1 -end 1 -widget entry -validate fortranreal -default 1.0 } separator -label "--- Plot info ---" var fileout -label "Name of output file (fileout):" -validate string var iflag { -label "Dimensionality of plot (iflag):" -textvalue { "1D plot, spherical average" "1D plot" "2D plot" "3D plot" "2D polar plot" } -value { 0 1 2 3 4 } -widget optionmenu } var output_format { -label "Format of the output (output_format):" -textvalue { "XCRYSDEN's XSF format (2D or 3D)" "XCRYSDEN's XSF format (whole unit cell) (3D)" "format suitable for gnuplot (1D)" "format suitable for contour.x (2D)" "format suitable for plotrho (2D)" "format suitable for gOpenMol (3D)" "Gaussian cube-file format (3D)" "format suitable for gnuplot (2D)" } -value { 3 5 0 1 2 4 6 7 } -widget optionmenu } var interpolation { -label "Interpolation (interpolation):" -value { 'fourier' 'bspline' } -textvalue { Fourier bspline } -widget optionmenu } separator -label "--- Spanning vectors & origin ---" dimension e1 { -label "1st spanning vector:" -validate fortranreal -start 1 -end 3 -pack left } dimension e2 { -label "2nd spanning vector" -validate fortranreal -start 1 -end 3 -pack left } dimension e3 { -label "3rd spanning vector" -validate fortranreal -start 1 -end 3 -pack left } dimension x0 { -label "Origin of the plot" -validate fortranreal -start 1 -end 3 -pack left } separator -label "--- Number of points in each direction ---" group nxnynz -name nxnynz { packwidgets left var nx -label "nx:" -validate posint -widget spinint var ny -label "ny:" -validate posint -widget spinint var nz -label "nz:" -validate posint -widget spinint } separator -label "--- Polar plot ---" var radius -label "Radius of the sphere (radius):" -validate real } } # ---------------------------------------------------------------------- # take care of specialties # ---------------------------------------------------------------------- source pp-event.tcl # ------------------------------------------------------------------------ # source the HELP file # ------------------------------------------------------------------------ source pp-help.tcl } espresso-5.1/PWgui-5.1/modules/pp/pp-event.tcl0000644000077300007730000001202112341332513021370 0ustar giannozzgiannozztracevar plot_num w { set spin_component_text [vartextvalue spin_component] ::tclu::DEBUG "Plot_Num ..." switch -exact -- [vartextvalue plot_num] { "charge density" - "total potential (= V_bare + V_H + V_xc)" - "electrostatic potential (= V_bare + V_H)" - "all-electron valence charge density (for PAW)" { widget spin_component enable widgetconfigure spin_component -textvalues { "total charge/potential" "spin up charge/potential" "spin down charge/potential" } groupwidget stm disable groupwidget psi2 disable groupwidget ildos disable if { ! [regexp {charge/potential} $spin_component_text] } { varset spin_component -value {} } } "STM images" { widget spin_component disable groupwidget stm enable groupwidget psi2 disable groupwidget ildos disable } "|psi|^2" { widget spin_component disable groupwidget stm disable groupwidget psi2 enable groupwidget ildos disable } "|psi|^2 (noncollinear case)" { widget spin_component enable widgetconfigure spin_component -textvalues { "charge" "x component of the magnetization" "y component of the magnetization" "z component of the magnetization" } groupwidget stm disable groupwidget psi2 enable groupwidget ildos disable if { [regexp {charge/potential} $spin_component_text] } { varset spin_component -value {} } } "integrated local density of states (ILDOS)" { widget spin_component disable groupwidget stm disable groupwidget psi2 disable groupwidget ildos enable } "noncolinear magnetization" { widget spin_component enable widgetconfigure spin_component -textvalues { "absolute value" "x component of the magnetization" "y component of the magnetization" "z component of the magnetization" } groupwidget stm disable groupwidget psi2 disable groupwidget ildos disable if { [regexp {charge/potential} $spin_component_text] } { varset spin_component -value {} } } default { widget spin_component disable groupwidget stm disable groupwidget ildos disable groupwidget psi2 disable } } } tracevar nfile w { widgetconfigure filepp -end [varvalue nfile] widgetconfigure weight -end [varvalue nfile] } tracevar iflag w { switch -exact -- [vartextvalue iflag] { "1D plot, spherical average" { widget x0 enable widget e1 enable widget nx enable widget e2 disable widget e3 disable widget ny disable widget nz disable widget radius disable if { [string match "XCRYSDEN*" [vartextvalue output_format]] } { varset output_format -textvalue "" } } "1D plot" { widget x0 enable widget e1 enable widget nx enable widget e2 disable widget e3 disable widget ny disable widget nz disable widget radius disable if { [string match "XCRYSDEN*" [vartextvalue output_format]] } { varset output_format -textvalue "" } } "2D plot" { widget x0 enable widget e1 enable widget e2 enable widget nx enable widget ny enable widget e3 disable widget nz disable widget radius disable if { [string match "XCRYSDEN's XSF format (whole unit cell)" [vartextvalue output_format]] } { varset output_format -textvalue "XCRYSDEN's XSF format" } } "3D plot" { switch -exact -- [vartextvalue output_format] { "XCRYSDEN's XSF format (whole unit cell)" - "Gaussian cube-file format" { widget e1 disable widget e2 disable widget e3 disable widget x0 disable widget nx disable widget ny disable widget nz disable widget radius disable } default { widget e1 enable widget e2 enable widget e3 enable widget x0 enable widget nx enable widget ny enable widget nz enable widget radius disable } } } "2D polar plot" { widget e1 enable widget e2 enable widget e3 disable widget x0 enable widget nx enable widget ny enable widget nz disable widget radius enable if { [string match "XCRYSDEN*" [vartextvalue output_format]] } { varset output_format -textvalue "" } } } } tracevar output_format w { # also take output_format into account switch -exact -- [vartextvalue output_format] { "XCRYSDEN's XSF format (whole unit cell)" - "Gaussian cube-file format" { widget e1 disable widget e2 disable widget e3 disable widget x0 disable widget nx disable widget ny disable widget nz disable widget radius disable varset iflag -textvalue "3D plot" } default { # induce a trace-action on iflag variable set iflag [vartextvalue iflag] varset iflag -textvalue $iflag } } } postprocess { varset iflag -textvalue "3D plot" varset output_format -textvalue "XCRYSDEN's XSF format (whole unit cell)" } postprocess { varset plot_num -textvalue "" }espresso-5.1/PWgui-5.1/modules/pp/commands.tcl0000644000077300007730000000053012341332513021435 0ustar giannozzgiannozzproc ::pwscf::ppReadFilter {moduleObj channel} { # pp.x formatted input file should have the &INPUTPP namelist set status [::pwscf::readFilter::findNamelists $moduleObj $channel INPUTPP errMsg] if { $status == 0 } { $moduleObj readFileWrongFormat pp.x $errMsg } return [readFilter::default $moduleObj $channel logical] } espresso-5.1/PWgui-5.1/modules/pp/pp-help.tcl0000644000077300007730000004115312341332513021207 0ustar giannozzgiannozz # # Help-file automatically created by helpdoc utility # # !!! DO NOT EDIT: CHANGES WILL BE LOST !!! # # ------------------------------------------------------------------------ help prefix -helpfmt helpdoc -helptext {
  •  Variable: prefix

  •  Type: CHARATER

  •  Description:
  • prefix of files saved by program pw.x
             
} # ------------------------------------------------------------------------ help outdir -helpfmt helpdoc -helptext {
  •  Variable: outdir

  •  Type: CHARACTER

  •  Default: value of the ESPRESSO_TMPDIR environment variable if set; current directory ('./') otherwise

  •  Description:
  • directory containing the input data,
    i.e. the same as in pw.x
             
} # ------------------------------------------------------------------------ help filplot -helpfmt helpdoc -helptext {
  •  Variable: filplot

  •  Type: CHARACTER

  •  Description:
  • file "filplot" contains the quantity selected by plot_num
    (can be saved for further processing)
             
} # ------------------------------------------------------------------------ help plot_num -helpfmt helpdoc -helptext {
  •  Variable: plot_num

  •  Type: INTEGER

  •  Description:
  • selects what to save in filplot:
    
       0  = electron (pseudo-)charge density
    
       1  = total potential V_bare + V_H + V_xc
    
       2  = local ionic potential V_bare
    
       3  = local density of states at e_fermi
            (number of states per volume, in bohr^3,
             per energy unit, in Ry)
    
       4  = local density of electronic entropy
    
       5  = STM images
            Tersoff and Hamann, PRB 31, 805 (1985)
    
       6  = spin polarization (rho(up)-rho(down))
    
       7  = contribution of a selected wavefunction to the
            (pseudo-)charge density. For norm-conserving PPs,
            |psi|^2 (psi=selected wavefunction). Noncollinear case:
            contribution of the given state to the charge or
            to the magnetization along the direction indicated
            by spin_component (0 = charge, 1 = x, 2 = y, 3 = z )
    
       8  = electron localization function (ELF)
    
       9  = charge density minus superposition of atomic densities
    
       10 = integrated local density of states (ILDOS)
            from emin to emax (emin, emax in eV)
            if emax is not specified, emax=E_fermi
    
       11 = the V_bare + V_H potential
    
       12 = the sawtooth electric field potential (if present)
    
       13 = the noncollinear magnetization.
    
       17 = all-electron valence charge density
            can be performed for PAW calculations only
            requires a very dense real-space grid!
    
       18 = The exchange and correlation magnetic field in
            the noncollinear case
    
       19 = Reduced density gradient
            (J. Chem. Theory Comput. 7, 625 (2011))
            Set the isosurface between 0.3 and 0.6 to plot the
            non-covalent interactions (see also plot_num = 20)
    
       20 = Product of the electron density (charge) and the second
            eigenvalue of the electron-density Hessian matrix;
            used to colorize the RDG plot (plot_num = 19)
             
} # ------------------------------------------------------------------------ help spin_component -helpfmt helpdoc -helptext {
  •  Variable: spin_component

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • 0=total charge (default value),
    1=spin up charge,
    2=spin down charge.
                   
  •  Variable: spin_component

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • 0=spin averaged potential (default value),
    1=spin up potential,
    2=spin down potential.
                   
  •  Variable: spin_component

  •  Type: INTEGER

  •  Description:
  • Noncollinear case only:
    plot the contribution of the given state to the charge
    or to the magnetization along the direction indicated
    by spin_component:
       0 = charge (default),
       1 = x,
       2 = y,
       3 = z.
    
    Ignored in unpolarized or LSDA case
                   
  •  Variable: spin_component

  •  Type: INTEGER

  •  Description:
  • for LSDA case only: plot the contribution to ILDOS of
    0 = spin-up + spin-down (default)
    1 = spin-up   only
    2 = spin-down only
                   
  •  Variable: spin_component

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • 0=absolute value (default value)
    1=x component of the magnetization
    2=y component of the magnetization
    3=z component of the magnetization
                   
  •  Variable: spin_component

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • 0=total charge (default value),
    1=spin up charge,
    2=spin down charge.
                   
} # ------------------------------------------------------------------------ help sample_bias -helpfmt helpdoc -helptext {
  •  Variable: sample_bias

  •  Type: REAL

  •  Description:
  • the bias of the sample (Ry) in stm images
                   
} # ------------------------------------------------------------------------ help kpoint -helpfmt helpdoc -helptext {
  •  Variable: kpoint

  •  Type: INTEGER

  •  Description:
  • Unpolarized and noncollinear case:   k-point to be plotted
    LSDA:  k-point and spin polarization to be plotted
    (spin-up and spin-down correspond to different k-points!)
                   
} # ------------------------------------------------------------------------ help kband -helpfmt helpdoc -helptext {
  •  Variable: kband

  •  Type: INTEGER

  •  Description:
  • band to be plotted
                   
} # ------------------------------------------------------------------------ help lsign -helpfmt helpdoc -helptext {
  •  Variable: lsign

  •  Type: LOGICAL

  •  Description:
  • if true and k point is Gamma, plot |psi|^2 sign(psi)
                   
} # ------------------------------------------------------------------------ help emin -helpfmt helpdoc -helptext {
  •  Variable: emin

  •  Type: REAL

  •  Description:
  • lower energy boundary (in eV)
                   
} # ------------------------------------------------------------------------ help emax -helpfmt helpdoc -helptext {
  •  Variable: emax

  •  Type: REAL

  •  Description:
  • upper energy boundary (in eV), i.e. compute
    ILDOS from emin to emax
                   
} # ------------------------------------------------------------------------ help nfile -helpfmt helpdoc -helptext {
  •  Variable: nfile

  •  Type: INTEGER

  •  Default: 1

  •  Status: OPTIONAL

  •  Description:
  • the number of data files
             
} # ------------------------------------------------------------------------ help filepp -helpfmt helpdoc -helptext {
  •  Variables: filepp(i), i=1,nfile

  •  Type: CHARACTER

  •  Default: filepp(1)=filplot

  •  Description:
  • nfile = 1 : file containing the quantity to be plotted
    nfile > 1 : see "weight"
                
} # ------------------------------------------------------------------------ help weight -helpfmt helpdoc -helptext {
  •  Variables: weight(i), i=1,nfile

  •  Type: REAL

  •  Default: weight(1)=1.0

  •  Description:
  • weighing factors: assuming that rho(i) is the quantity
    read from filepp(i), the quantity that will be plotted is:
    weight(1)*rho(1) + weight(2)*rho(2) + weight(3)*rho(3)+...
                
} # ------------------------------------------------------------------------ help iflag -helpfmt helpdoc -helptext {
  •  Variable: iflag

  •  Type: INTEGER

  •  Description:
  • 0 1D plot of the spherical average
    1 1D plot
    2 2D plot
    3 3D plot
    4 2D polar plot on a sphere
             
} # ------------------------------------------------------------------------ help output_format -helpfmt helpdoc -helptext {
  •  Variable: output_format

  •  Type: INTEGER

  •  Description:
  • (ignored on 1D plot)
    0  format suitable for gnuplot   (1D)
    1  format suitable for contour.x (2D)
    2  format suitable for plotrho   (2D)
    3  format suitable for XCRYSDEN  (2D or user-supplied 3D region)
    4  format suitable for gOpenMol  (3D)
       (formatted: convert to unformatted *.plt)
    5  format suitable for XCRYSDEN  (3D, using entire FFT grid)
    6  format as gaussian cube file  (3D)
       (can be read by many programs)
    7  format suitable for gnuplot   (2D) x, y, f(x,y)
             
} # ------------------------------------------------------------------------ help fileout -helpfmt helpdoc -helptext {
  •  Variable: fileout

  •  Type: CHARACTER

  •  Default: standard output

  •  Description:
  • name of the file to which the plot is written
             
} # ------------------------------------------------------------------------ help interpolation -helpfmt helpdoc -helptext {
  •  Variable: interpolation

  •  Type: CHARACTER

  •  Default: "fourier"

  •  Description:
  • type of interpolation: "fourier" or "bspline" (EXPERIMENTAL!)
             
} # ------------------------------------------------------------------------ help e1 -helpfmt helpdoc -helptext {
  •  Variables: e1(i), i=1,3

  •  Type: REAL

  •  Description:
  • 3D vector which determines the plotting line
                   
} # ------------------------------------------------------------------------ help x0 -helpfmt helpdoc -helptext {
  •  Variables: x0(i), i=1,3

  •  Type: REAL

  •  Description:
  • 3D vector, origin of the line
                   
  •  Variables: x0(i), i=1,3

  •  Type: REAL

  •  Description:
  • 3D vector, origin of the plane
                   
  •  Variables: x0(i), i=1,3

  •  Type: REAL

  •  Description:
  • 3D vector, origin of the parallelepiped
    
    x0 is in alat units !
                   
} # ------------------------------------------------------------------------ help nx -helpfmt helpdoc -helptext {
  •  Variable: nx

  •  Type: INTEGER

  •  Description:
  • number of points in the line:
    rho(i) = rho( x0 + e1 * (i-1)/(nx-1) ), i=1, nx
                   
} # ------------------------------------------------------------------------ grouphelp {e1 e2} -helpfmt helpdoc -helptext {
  •  Variables: e1(i), e2(i), i=1,3

  •  Type: REAL

  •  Description:
  • 3D vectors which determine the plotting plane
    (must be orthogonal)
                   
} # ------------------------------------------------------------------------ grouphelp {nx ny} -helpfmt helpdoc -helptext {
  •  Variables: nx, ny

  •  Type: INTEGER

  •  Description:
  • Number of points in the plane:
    
    rho(i,j) = rho( x0 + e1 * (i-1)/(nx-1)
                   + e2 * (j-1)/(ny-1) ), i=1,nx ; j=1,ny
                   
  •  Variables: nx, ny

  •  Type: INTEGER

  •  Description:
  • Number of points in the polar plane:
    
        phi(i)   = 2 pi * (i - 1)/(nx-1), i=1, nx
        theta(j) =   pi * (j - 1)/(ny-1), j=1, ny
                   
} # ------------------------------------------------------------------------ grouphelp {e1 e2 e3} -helpfmt helpdoc -helptext {
  •  Variables: e1(i), e2(i), e3(i), i=1,3

  •  Type: REAL

  •  Description:
  • 3D vectors which determine the plotting parallelepiped
    (if present, must be orthogonal)
    
    e1, e2, and e3 are in alat units !
                   
} # ------------------------------------------------------------------------ grouphelp {nx ny nz} -helpfmt helpdoc -helptext {
  •  Variables: nx, ny, nz

  •  Type: INTEGER

  •  Description:
  • Number of points in the parallelepiped:
    
    rho(i,j,k) = rho( x0 + e1 * (i-1)/nx
                         + e2 * (j-1)/ny
                         + e3 * (k-1)/nz ),
                    i = 1, nx ; j = 1, ny ; k = 1, nz
    
    - If output_format = 3 (XCRYSDEN), the above variables
    are used to determine the grid to plot.
    
    - If output_format = 5 (XCRYSDEN), the above variables
    are ignored, the entire FFT grid is written in the
    XCRYSDEN format - works for any crystal axis (VERY FAST)
    
    - If e1, e2, e3, x0 are present, e1 e2 e3 are parallel
    to xyz and parallel to crystal axis, a subset of the
    FFT grid that approximately covers the parallelepiped
    defined by e1, e2, e3, x0, is written (presently only
    if output_format = 4, i.e. gopenmol format) - works only
    if the crystal axis are parallel to xyz
    
    - Otherwise, the required 3D grid is generated from the
    Fourier components (may be VERY slow)
                   
} # ------------------------------------------------------------------------ help radius -helpfmt helpdoc -helptext {
  •  Variable: radius

  •  Type: REAL

  •  Description:
  • Radius of the sphere (alat units), centered at (0,0,0)
                   
} espresso-5.1/PWgui-5.1/modules/ph/0000755000077300007730000000000012341333047017125 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/modules/ph/ph-help.tcl0000644000077300007730000007515612341332513021201 0ustar giannozzgiannozz # # Help-file automatically created by helpdoc utility # # !!! DO NOT EDIT: CHANGES WILL BE LOST !!! # # ------------------------------------------------------------------------ help title_line -helpfmt helpdoc -helptext {
  •  Variable: title_line

  •  Type: CHARACTER

  •  Description:
  • Title of the job, i.e., a line that is reprinted on output.
             
} # ------------------------------------------------------------------------ help amass -helpfmt helpdoc -helptext {
  •  Variables: amass(i), i=1,ntyp

  •  Type: REAL

  •  Default: 0.0

  •  Description:
  • Atomic mass [amu] of each atomic type.
    If not specified, masses are read from data file.
             
} # ------------------------------------------------------------------------ help outdir -helpfmt helpdoc -helptext {
  •  Variable: outdir

  •  Type: CHARACTER

  •  Default: value of the ESPRESSO_TMPDIR environment variable if set; current directory ('./') otherwise

  •  Description:
  • Directory containing input, output, and scratch files;
    must be the same as specified in the calculation of
    the unperturbed system.
             
} # ------------------------------------------------------------------------ help prefix -helpfmt helpdoc -helptext {
  •  Variable: prefix

  •  Type: CHARACTER

  •  Default: 'pwscf'

  •  Description:
  • Prepended to input/output filenames; must be the same
    used in the calculation of unperturbed system.
             
} # ------------------------------------------------------------------------ help niter_ph -helpfmt helpdoc -helptext {
  •  Variable: niter_ph

  •  Type: INTEGER

  •  Default: maxter=100

  •  Description:
  • Maximum number of iterations in a scf step. If you want
    more than 100, edit variable "maxter" in PH/phcom.f90
             
} # ------------------------------------------------------------------------ help tr2_ph -helpfmt helpdoc -helptext {
  •  Variable: tr2_ph

  •  Type: REAL

  •  Default: 1e-12

  •  Description:
  •  Threshold for self-consistency.
             
} # ------------------------------------------------------------------------ help alpha_mix1 -helpfmt helpdoc -helptext {
  •  Variable: alpha_mix(niter)

  •  Type: REAL

  •  Default: alpha_mix(1)=0.7

  •  Description:
  • Mixing factor (for each iteration) for updating
    the scf potential:
    
    vnew(in) = alpha_mix*vold(out) + (1-alpha_mix)*vold(in)
             
} # ------------------------------------------------------------------------ help nmix_ph -helpfmt helpdoc -helptext {
  •  Variable: nmix_ph

  •  Type: INTEGER

  •  Default: 4

  •  Description:
  •  Number of iterations used in potential mixing.
             
} # ------------------------------------------------------------------------ help iverbosity -helpfmt helpdoc -helptext {
  •  Variable: iverbosity

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • 0 = short output
    1 = verbose output
             
} # ------------------------------------------------------------------------ help reduce_io -helpfmt helpdoc -helptext {
  •  Variable: reduce_io

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  •  Reduce I/O to the strict minimum.
             
} # ------------------------------------------------------------------------ help max_seconds -helpfmt helpdoc -helptext {
  •  Variable: max_seconds

  •  Type: REAL

  •  Default: 1.d7

  •  Description:
  •  Maximum allowed run time before the job stops smoothly.
             
} # ------------------------------------------------------------------------ help fildyn -helpfmt helpdoc -helptext {
  •  Variable: fildyn

  •  Type: CHARACTER

  •  Default: 'matdyn'

  •  Description:
  •  File where the dynamical matrix is written.
             
} # ------------------------------------------------------------------------ help fildrho -helpfmt helpdoc -helptext {
  •  Variable: fildrho

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  •  File where the charge density responses are written.
             
} # ------------------------------------------------------------------------ help fildvscf -helpfmt helpdoc -helptext {
  •  Variable: fildvscf

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  • File where the the potential variation is written
    (for later use in electron-phonon calculation).
             
} # ------------------------------------------------------------------------ help epsil -helpfmt helpdoc -helptext {
  •  Variable: epsil

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. in a q=0 calculation for a non metal the
    macroscopic dielectric constant of the system is
    computed. Do not set epsil to .true. if you have a
    metallic system or q/=0: the code will complain and stop.
             
} # ------------------------------------------------------------------------ help lrpa -helpfmt helpdoc -helptext {
  •  Variable: lrpa

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. the dielectric constant is calculated at the
    RPA level with DV_xc=0.
             
} # ------------------------------------------------------------------------ help lnoloc -helpfmt helpdoc -helptext {
  •  Variable: lnoloc

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. the dielectric constant is calculated without
    local fields, i.e. by setting DV_H=0 and DV_xc=0.
             
} # ------------------------------------------------------------------------ help trans -helpfmt helpdoc -helptext {
  •  Variable: trans

  •  Type: LOGICAL

  •  Default: .true.

  •  Description:
  • If .true. the phonons are computed.
    If trans .and. epsil are .true. effective charges are
    calculated.
             
} # ------------------------------------------------------------------------ help lraman -helpfmt helpdoc -helptext {
  •  Variable: lraman

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. calculate non-resonant Raman coefficients
    using second-order response as in:
    M. Lazzeri and F. Mauri, Phys. Rev. Lett. 90, 036401 (2003).
             
} # ------------------------------------------------------------------------ help eth_rps -helpfmt helpdoc -helptext {
  •  Variable: eth_rps

  •  Type: REAL

  •  Default: 1.0d-9

  •  Description:
  •  Threshold for calculation of  Pc R |psi>.
                
} # ------------------------------------------------------------------------ help eth_ns -helpfmt helpdoc -helptext {
  •  Variable: eth_ns

  •  Type: REAL

  •  Default: 1.0e-12

  •  Description:
  •  Threshold for non-scf wavefunction calculation.
                
} # ------------------------------------------------------------------------ help dek -helpfmt helpdoc -helptext {
  •  Variable: dek

  •  Type: REAL

  •  Default: 1.0e-3

  •  Description:
  •  Delta_xk used for wavefunction derivation wrt k.
                
} # ------------------------------------------------------------------------ help recover -helpfmt helpdoc -helptext {
  •  Variable: recover

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  •  If .true. restart from an interrupted run.
             
} # ------------------------------------------------------------------------ help low_directory_check -helpfmt helpdoc -helptext {
  •  Variable: low_directory_check

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. search in the phsave directory only the
                     quantities requested in input.
             
} # ------------------------------------------------------------------------ help only_init -helpfmt helpdoc -helptext {
  •  Variable: only_init

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. only the bands and other
                      initialization quantities are calculated.
                      (used for GRID parallelization)
             
} # ------------------------------------------------------------------------ help qplot -helpfmt helpdoc -helptext {
  •  Variable: qplot

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  •  If .true. a list of q points is read from input.
             
} # ------------------------------------------------------------------------ help q2d -helpfmt helpdoc -helptext {
  •  Variable: q2d

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. three q points and relative weights are
               read from input. The three q points define the rectangle
               q(:,1) + l (q(:,2)-q(:,1)) + m (q(:,3)-q(:,1)) where
               0< l,m < 1. The weights are integer and those of points two
               and three are the number of points in the two directions.
             
} # ------------------------------------------------------------------------ help q_in_band_form -helpfmt helpdoc -helptext {
  •  Variable: q_in_band_form

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • This flag is used only when qplot is .true. and q2d is
              .false.. When .true. each couple of q points q(:,i+1) and
              q(:,i) define the line from q(:,i) to q(:,i+1) and nq
              points are generated along that line. nq is the weigth of
              q(:,i). When .false. only the list of q points given as
              input is calculated. The weights are not used.
             
} # ------------------------------------------------------------------------ help electron_phonon -helpfmt helpdoc -helptext {
  •  Variable: electron_phonon

  •  Type: CHARACTER

  •  Default: ' '

  •  Description:
  • If equal to 'simple' electron-phonon lambda coefficients
    are computed for a given q and a grid of k-points specified
    by the variables nk1, nk2, nk3, k1, k2, k3.
    
    If equal to 'interpolated' electron-phonon is calculated
    by interpolation over the Brillouin Zone as in
    M. Wierzbowska, et al. arXiv:cond-mat/0504077
    
    For metals only, requires gaussian smearing.
    
    If trans=.true., the lambdas are calculated in the same
    run, using the same k-point grid for phonons and lambdas.
    If trans=.false., the lambdas are calculated using
    previously saved DeltaVscf in fildvscf, previously saved
    dynamical matrix, and the present punch file. This allows
    the use of a different (larger) k-point grid.
             
} # ------------------------------------------------------------------------ help zeu -helpfmt helpdoc -helptext {
  •  Variable: zeu

  •  Type: LOGICAL

  •  Default: zeu=epsil

  •  Description:
  • If .true. in a q=0 calculation for a non metal the
    effective charges are computed from the dielectric
    response. This is the default algorithm. If epsil=.true.
    and zeu=.false. only the dielectric tensor is calculated.
             
} # ------------------------------------------------------------------------ help zue -helpfmt helpdoc -helptext {
  •  Variable: zue

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. in a q=0 calculation for a non metal the
    effective charges are computed from the phonon
    density responses. This is an alternative algorithm,
    different from the default one (if trans .and. epsil )
    The results should be the same within numerical noise.
             
} # ------------------------------------------------------------------------ help elop -helpfmt helpdoc -helptext {
  •  Variable: elop

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. calculate electro-optic tensor.
             
} # ------------------------------------------------------------------------ help fpol -helpfmt helpdoc -helptext {
  •  Variable: fpol

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. calculate dynamic polarizabilities
    Requires epsil=.true. ( experimental stage:
    see example09 for calculation of methane ).
             
} # ------------------------------------------------------------------------ help ldisp -helpfmt helpdoc -helptext {
  •  Variable: ldisp

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. the run calculates phonons for a grid of
    q-points specified by nq1, nq2, nq3 - for direct
    calculation of the entire phonon dispersion.
             
} # ------------------------------------------------------------------------ help nogg -helpfmt helpdoc -helptext {
  •  Variable: nogg

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. disable the "gamma_gamma" trick used to speed
    up calculations at q=0 (phonon wavevector) if the sum over
    the Brillouin Zone includes k=0 only. The gamma_gamma
    trick exploits symmetry and acoustic sum rule to reduce
    the number of linear response calculations to the strict
    minimum, as it is done in code phcg.x. This option MUST
    BE USED if a run with ph.x is to be followed by a run
    with d3.x for third-order terms calculation.
             
} # ------------------------------------------------------------------------ help ldiag -helpfmt helpdoc -helptext {
  •  Variable: ldiag

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. forces the diagonalization of the dynamical
    matrix also when only a part of the dynamical matrix
    has been calculated. It is used together with start_irr
    and last_irr. If all modes corresponding to a
    given irreducible representation have been calculated,
    the phonon frequencies of that representation are
    correct. The others are zero or wrong. Use with care.
             
} # ------------------------------------------------------------------------ help lqdir -helpfmt helpdoc -helptext {
  •  Variable: lqdir

  •  Type: LOGICAL

  •  Default: .false.

  •  Description:
  • If .true. ph.x creates inside outdir a separate subdirectory
    for each q vector. The flag is set to .true. when ldisp=
    .true. and fildvscf /= ' ' or when an electron-phonon
    calculation is performed. The induced potential is saved
    separately for each q inside the subdirectories.
             
} # ------------------------------------------------------------------------ help search_sym -helpfmt helpdoc -helptext {
  •  Variable: search_sym

  •  Type: LOGICAL

  •  Default: .true.

  •  Description:
  • Set it to .false. if you want to disable the mode
    symmetry analysis.
             
} # ------------------------------------------------------------------------ grouphelp {nq1 nq2 nq3} -helpfmt helpdoc -helptext {
  •  Variables: nq1, nq2, nq3

  •  Type: INTEGER

  •  Default: 0,0,0

  •  Description:
  • Parameters of the Monkhorst-Pack grid (no offset) used
    when ldisp=.true. Same meaning as for nk1, nk2, nk3
    in the input of pw.x.
             
} # ------------------------------------------------------------------------ grouphelp {nk1 nk2 nk3 k1 k2 k3} -helpfmt helpdoc -helptext {
  •  Variables: nk1, nk2, nk3, k1, k2, k3

  •  Type: INTEGER

  •  Default: 0,0,0,0,0,0

  •  Description:
  • When these parameters are specified the phonon program
    runs a pw non-self consistent calculation with a different
    k-point grid thant that used for the charge density.
    This occurs even in the Gamma case.
    nk1,nk2,nk3 are the parameters of the Monkhorst-Pack grid
    with offset determined by k1,k2,k3.
             
} # ------------------------------------------------------------------------ help start_irr -helpfmt helpdoc -helptext {
  •  Variable: start_irr

  •  Type: INTEGER

  •  Default: 1

  •  See: last_irr

  •  Description:
  • Perform calculations only from start_irr to last_irr
    irreducible representations.
    
    IMPORTANT:
       * start_irr must be <= 3*nat
       * do not specify "nat_todo" together with
         "start_irr", "last_irr"
                
} # ------------------------------------------------------------------------ help last_irr -helpfmt helpdoc -helptext {
  •  Variable: last_irr

  •  Type: INTEGER

  •  Default: 3*nat

  •  See: start_irr

  •  Description:
  • Perform calculations only from start_irr to last_irr
    irreducible representations.
    
    IMPORTANT:
       * start_irr must be <= 3*nat
       * do not specify "nat_todo" together with
         "start_irr", "last_irr"
                
} # ------------------------------------------------------------------------ help nat_todo -helpfmt helpdoc -helptext {
  •  Variable: nat_todo

  •  Type: INTEGER

  •  Default: 0, i.e. displace all atoms

  •  Description:
  • Choose the subset of atoms to be used in the linear response
    calculation: "nat_todo" atoms, specified in input (see below)
    are displaced. Can be used to estimate modes for a molecule
    adsorbed over a surface without performing a full fledged
    calculation. Use with care, at your own risk, and be aware
    that this is an approximation and may not work.
    IMPORTANT:
       * nat_todo <= nat
       * if linear-response is calculated for a given atom, it
         should also be done for all symmetry-equivalent atoms,
         or else you will get incorrect results
                
} # ------------------------------------------------------------------------ help modenum -helpfmt helpdoc -helptext {
  •  Variable: modenum

  •  Type: INTEGER

  •  Default: 0

  •  Description:
  • For single-mode phonon calculation : modenum is the index of the
    irreducible representation (irrep) into which the reducible
    representation formed by the 3*nat atomic displacements are
    decomposed in order to perform the phonon calculation.
    Note that a single-mode calculation will not give you the
    frequency of a single phonon mode: in general, the selected
    "modenum" is not an eigenvector. What you get on output is
    a column of the dynamical matrix.
                
} # ------------------------------------------------------------------------ help start_q -helpfmt helpdoc -helptext {
  •  Variable: start_q

  •  Type: INTEGER

  •  Default: 1

  •  See: last_q

  •  Description:
  • Used only when ldisp=.true..
    Computes only the q points from start_q to last_q.
    
    IMPORTANT:
       * start_q must be <= nqs (number of q points found)
       * do not specify "nat_todo" together with
         "start_q", "last_q"
                
} # ------------------------------------------------------------------------ help last_q -helpfmt helpdoc -helptext {
  •  Variable: last_q

  •  Type: INTEGER

  •  Default: number of q points

  •  See: start_q

  •  Description:
  • Used only when ldisp=.true..
    Computes only the q points from start_q to last_q.
    
    IMPORTANT
       * last_q must be <= nqs (number of q points)
       * do not specify "nat_todo" together with
         "start_q", "last_q"
                
} # ------------------------------------------------------------------------ help dvscf_star -helpfmt helpdoc -helptext {
  •  Variable: dvscf_star

  •  Type: STRUCTURE

  •  Default: disabled

  •  Description:
  • It contains the following components:
    dvscf_star%open  (logical, default: .false.)
    dvscf_star%dir   (character, default: outdir//"Rotated_DVSCF" or the
                      ESPRESSO_FILDVSCF_DIR environment variable)
    dvscf_star%ext   (character, default: "dvscf") the extension to use
                      for the name of the output files, see below
    dvscf_star%basis (character, default: "cartesian") the basis on which
                      the rotated dvscf will be saved
    dvscf_star%pat   (logical, default: true) save an optional file with the
                     displacement patterns and q vector for each dvscf file
    
    IF dvscf_star%open is .true. use symmetry to compute and store the variation
    of the self-consistent potential on every q* in the star of the present q.
    
    The rotated dvscf will then be stored in directory dvscf_star%dir with name
    prefix.dvscf_star%ext.q_name//"1". Where q_name is derived from the coordinates
    of the q-point, expressed as fractions in crystalline coordinates
    (notice that ph.x reads q-points in cartesian coordinates).
    E.g. q_cryst= (0, 0.5, -0.25) -> q_name = "0_1o2_-1o4"
    
    The dvscf can be represented on a basis of cartesian 1-atom displacements
    (dvscf_star%basis='cartesian') or on the basis of the modes at the rotated q-point
    (dvscf_star%basis='modes'). Notice that the el-ph wannier code requires 'cartesian'.
    Each dvscf file comes with a corresponding pattern file with an additional ".pat"
    suffix; this file contains information about the basis and the q-point of the dvscf.
    
    Note: rotating dvscf can require a large amount of RAM memory and can be i/o
          intensive; in its current implementation all the operations are done
          on a single processor.
    Note2: this feature is currently untested with image parallelisation.
                
} # ------------------------------------------------------------------------ help drho_star -helpfmt helpdoc -helptext {
  •  Variable: drho_star

  •  Type: STRUCTURE

  •  Default: disabled

  •  See: dvscf_star

  •  Description:
  • It contains the following components:
    drho_star%open  (logical, default: .false.)
    drho_star%dir   (character, default: outdir//"Rotated_DRHO" or the
                     ESPRESSO_FILDRHO_DIR environment variable)
    drho_star%ext   (character, default: "drho") the extension to use
                     for the name of the output files, see below
    drho_star%basis (character, default: "modes") the basis on which
                     the rotated drho will be saved
    drho_star%pat   (logical, default: false) save an optional file with the
                     displacement patterns and q vector for each drho file
    
    Like dvscf_star, but for the perturbation of the charge density.
    Notice that the defaults are different.
                
} # ------------------------------------------------------------------------ grouphelp {xq1 xq2 xq3} -helpfmt helpdoc -helptext {
  •  Variables: xq(1) xq(2) xq(3)

  •  Type: REAL

  •  Description:
  • The phonon wavevector, in units of 2pi/a0
    (a0 = lattice parameter).
    Not used if ldisp=.true. or qplot=.true.
                   
} # ------------------------------------------------------------------------ help nqs -helpfmt helpdoc -helptext {
  •  Variable: nqs

  •  Type: INTEGER

  •  Description:
  • Number of q points in the list. Used only if qplot=.true.
                         
} # ------------------------------------------------------------------------ help qPoints -helpfmt helpdoc -helptext {
  •  Variables: xq1, xq2, xq3

  •  Type: REAL

  •  Description:
  • q-point coordinates; used only with ldisp=.true. and qplot=.true.
    The phonon wavevector, in units of 2pi/a0 (a0 = lattice parameter).
    The meaning of these q points and their weights nq depend on the
    flags q2d and q_in_band_form. (NB: nq is integer)
                            
  •  Variable: nq

  •  Type: INTEGER

  •  Description:
  • The weight of the q-point; the meaning of nq depends
    on the flags q2d and q_in_band_form.
                            
} # ------------------------------------------------------------------------ help nat_todo_list -helpfmt helpdoc -helptext {
  •  Variables: atom(1) atom(2) ... atom(nat_todo)

  •  Type: INTEGER

  •  Description:
  • Contains the list of indices of atoms used in the
    calculation if "nat_todo" is specified.
                   
} espresso-5.1/PWgui-5.1/modules/ph/commands.tcl0000644000077300007730000000144412341332513021432 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # # ------------------------------------------------------------------------ proc ::pwscf::phSelectPunchFile {moduleObj variable} { selectFileRoot $moduleObj $variable } # ------------------------------------------------------------------------ # TODO: check if input file is a ph.x input file # ------------------------------------------------------------------------ proc ::pwscf::phReadFilter {moduleObj channel} { # ph.x formatted input file should have the &INPUTPH namelist set status [::pwscf::readFilter::findNamelists $moduleObj $channel INPUTPH errMsg] if { $status == 0 } { $moduleObj readFileWrongFormat ph.x $errMsg } return [readFilter::default $moduleObj $channel {logical amass}] } espresso-5.1/PWgui-5.1/modules/ph/ph.tcl0000644000077300007730000003355112341332513020244 0ustar giannozzgiannozzsource commands.tcl set ::guib::settings(filename_only_tail) 1 module PH\#auto -title "PWSCF GUI: module PH.x" -script { readfilter ::pwscf::phReadFilter #writefilter ::pwscf::phWriteFilter line job_title -name "Job Title" { var title_line { -label "Job title:" -fmt %S } } page inputph -name "INPUTPH" { namelist inputpp -name "INPUTPH" { page files -name "Files/Diretories" { var outdir { -label "Temporary directory where punch file resides (outdir):" -widget entrydirselectquote -fmt %S -validate string } var prefix -label "Prefix of data file saved by PW.X (prefix):" \ -widget [list entrybutton "Prefix ..." [list ::pwscf::phSelectPunchFile $this prefix]] \ -fmt %S -validate string separator -label "--- Output Data Files ---" var fildyn { -label "File containing the dynamical matrix (fildyn):" -widget entryfileselectquote -fmt %S -validate string } var fildrho { -label "File containing the charge density variations (fildrho):" -widget entryfileselectquote -fmt %S -validate string } var fildvscf { -label "File containing the potential variation (fildvscf):" -widget entryfileselectquote -fmt %S -validate string } } page calcs -name "What to Compute" { var ldisp { -label "Compute phonon dispersions (ldisp):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } var nogg { -label "Disable gamma_gamma tricks (nogg):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } var ldiag { -label "Force diagonalization of the incomplete dynamical matrix (ldiag):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } #group nq -name q-grid { # group nq_grid { # packwidgets left # var nq1 { # -label "nq\#1:" # -validate posint # } # var nq2 { # -label "nq\#2:" # -validate posint # } # var nq3 { # -label "nq\#3:" # -validate posint # } # } # group iq_grid { # packwidgets left # var iq1 { # -label "iq\#1:" # -validate posint # } # var iq2 { # -label "iq\#2:" # -validate posint # } # var iq3 { # -label "iq\#3:" # -validate posint # } # } #} var trans { -label "Compute phonons for a single q vector (trans):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } var epsil { -label "Compute the macroscopic dielectric constant for q=0 (epsil):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } var electron_phonon { -label "Compute electron-phonon (electron_phonon):" -textvalue { "electron-phonon lambda coefficients " "electron-phonon by interpolation " } -value {'simple' 'interpolated'} -widget radiobox } var lrpa { -label "Compute dielectric constant with RPA and dV_xc=0 (lrpa):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var lnoloc { -label "Compute dielectric constant with dV_H=0 and dV_xc=0 (lnoloc):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var fpol { -label "Compute dynamic polarizabilities (fpol):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var zeu { -label "Compute effective charges from the dielectric responses (zeu):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } var zue { -label "Compute effective charges from the phonon density responses (zue):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } var elop { -label "Compute electro-optic coefficients (elop):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } var lraman { -label "Compute Raman coefficients (lraman):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } var search_sym { -label "Perform mode symmetry analysis (search_sym):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } group ramanthreshold -name "Thresholds for Raman" -decor normal { var eth_rps { -label "Threshold for calculation of x|Psi> (eth_rps):" -validate fortranreal } var eth_ns { -label "Threshold for non-scf wavefunction calculation (eth_ns):" -validate fortranreal } var dek { -label "Delta k used for wavefunction derivation wtr k (dek)::" -validate fortranreal } } ##separator -label "--- Potential variations ---" group dvscf -name "Potential variations" -decor normal { # to trich the chek_gui only var dvscf_star #/ var dvscf_star_open { -variable dvscf_star%open -label "Compute potential variations at all q-points in the star (dvscf_star%open):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var dvscf_star_dir { -variable dvscf_star%dir -label "Directory where to store rotated dvscf files (dvscf_star%dir):" -widget entrydirselectquote -fmt %S -validate string } var dvscf_star_ext { -variable dvscf_star%ext -label "Extension to use for the name of dvscf files (dvscf_star%ext):" -fmt %S -validate string } var dvscf_star_basis { -variable dvscf_star%basis -label "Basis used for the dvscf files (dvscf_star%basis):" -widget radiobox -fmt %s -value { 'cartesian' 'modes' } -textvalue { "basis of cartesian 1-atom displacements " "basis of the modes at the rotated q-point " } } var dvscf_star_pat { -variable dvscf_star%pat -label "Save displacement patterns and q vector for each dvscf file (dvscf_star%pat):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } } ##separator -label "--- Perturbation of the charge density ---" group drho -name "Perturbation of the charge density" -decor normal { # to trich the chek_gui only var drho_star #/ var drho_star_open { -variable drho_star%open -label "Compute charge density perturbation at all q-points in the star (drho_star%open):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var drho_star_dir { -variable drho_star%dir -label "Directory where to store rotated drho files (drho_star%dir):" -widget entrydirselectquote -fmt %S -validate string } var drho_star_ext { -variable drho_star%ext -label "Extension to use for the name of drho files (drho_star%ext):" -fmt %S -validate string } var drho_star_basis { -variable drho_star%basis -label "Basis used for the drho files (drho_star%basis):" -widget radiobox -fmt %s -value { 'cartesian' 'modes' } -textvalue { "basis of cartesian 1-atom displacements " "basis of the modes at the rotated q-point " } } var drho_star_pat { -variable drho_star%pat -label "Save displacement patterns and q vector for each drho file (drho_star%pat):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } } } page misc -name "Control options" { var recover { -label "Restart from an interrupted run (recover):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var low_directory_check { -label "(low_directory_check):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var only_init { -label "Calculate only bands and other initialization quantities (only_init):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var qplot { -label "Read a list of q-points from input (qplot):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var q2d { -label "(q2d):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var q_in_band_form { -label "(q_in_band_form):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } var lqdir { -label "Creates inside outdir a separate subdirectory for each q vector (lqdir):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox } auxilvar reps_type { -label "How to specify irreducible representations:" -textvalue {"with start_irr/last_irr" "with nat_todo"} -value { start_last_irr nat_todo } -widget radiobox } group irrep_spec -name "Specification of irreducible representation(s)" -decor normal { group start_last_irr -name "Range of irreducible representations" -decor normal { var start_irr { -validate posint -label "First irreducible representations in range (first_irr):" } var last_irr { -validate posint -label "Last irreducible representations in range (last_irr):" } } var nat_todo { -label "Number of atom to be displaced (nat_todo):" -validate nonnegint -widget spinint } var modenum { -validate nonnegint -label "Index of the irreducible representation for single-mode calculation (modenum):" } } group q_spec -name "q-point specification" -decor normal { var start_q { -validate posint -label "First q-point in range (start_q):" } var last_q { -validate posint -label "Last q-point in range (last_q):" } } separator -label "--- Atomic Masses ---" auxilvar ntyp { -label "Number of types of atoms in the unit cell (ntyp):" -validate posint -fmt %d -default 1 -widget spinint } dimension amass { -label "Atomic mass [amu] of each atomic type" -validate fortranreal -start 1 -end 1 } separator -label "--- Misc control options ---" var iverbosity { -label "Verbosity of output (iverbosity):" -textvalue {"short output" "verbose output"} -value {0 1} -widget optionmenu } var reduce_io { -label "Reduce I/O to the strict minimum (reduce_io):" -textvalue {Yes No} -value {.true. .false.} -widget radiobox -fmt %s } var max_seconds { -label "Maximum allowed CPU run-time [in seconds] (max_seconds):" -validate posint -widget spinint -fmt %d } separator -label "--- SCF settings ---" var niter_ph { -label "Maximum number of iterations in an SCF step (niter_ph):" -widget spinint -fmt %d } var tr2_ph { -label "Threshold for selfconsistency (tr2_ph):" -validate fortranreal } var alpha_mix1 { -variable alpha_mix(1) -label "Mixing factor for updating the SCF potential (alpha_mix(1)):" -validate fortranreal } var nmix_ph { -label "Number of iterations used in mixing of potential (nmix_ph):" -widget spinint -fmt %d } } page q_k_points -name "q- and k-points" { separator -label "--- K-point mesh + shift ---" group k_points { packwidgets left var nk1 -label "nk1:" -widget spinint -validate posint var nk2 -label "nk2:" -widget spinint -validate posint var nk3 -label "nk3:" -widget spinint -validate posint } group k_shift { packwidgets left var k1 -label "k1:" -widget spinint -validate binary var k2 -label "k2:" -widget spinint -validate binary var k3 -label "k3:" -widget spinint -validate binary } separator -label "--- Q-point mesh ---" group q_points { packwidgets left var nq1 -label "nq1:" -widget spinint -validate posint var nq2 -label "nq2:" -widget spinint -validate posint var nq3 -label "nq3:" -widget spinint -validate posint } } } } page suffixCards -name "Suffix cards" { line xq_list -name "The phonon wavevector" { packwidgets left var xq1 { -variable xq(1) -label "xq(1):" -validate fortranreal } var xq2 { -variable xq(2) -label "xq(2):" -validate fortranreal } var xq3 { -variable xq(3) -label "xq(3):" -validate fortranreal } } group qPointsSpec -name "q-points specification" -decor normal { line nqs_line -decor none { var nqs -label "Number of q-points:" -validate posint -widget spinint -default 1 -outfmt %3d } table qPoints { -caption "Enter q-points coordinates and weights:" -head {xq1 xq2 xq3 nq} -validate {fortranreal fortranreal fortranreal int} -cols 4 -rows 1 -outfmt {%13.8f %13.8f %13.8f %3d} } } line atom_disp_line -name "List of atoms to displace:" { var nat_todo_list { -label "Indices of atoms (comma or whitespace separated):" } } } # ---------------------------------------------------------------------- # take care of specialities # ---------------------------------------------------------------------- source ph-event.tcl # ------------------------------------------------------------------------ # source the HELP file # ------------------------------------------------------------------------ source ph-help.tcl } espresso-5.1/PWgui-5.1/modules/ph/ph-event.tcl0000644000077300007730000000506012341332513021355 0ustar giannozzgiannozztracevar ntyp w { widgetconfigure amass -end [varvalue ntyp] } tracevar ldisp w { groupwidget ramanthreshold disable if { [varvalue ldisp] == ".true." } { widget lraman disable widget elop disable widget trans disable groupwidget xq_line disable groupwidget nq enable groupwidget q_spec enable } else { widget lraman enable widget elop enable widget trans enable groupwidget xq_line enable groupwidget nq disable groupwidget q_spec disable } } tracevar lraman w { if { [varvalue lraman] == ".true." || [varvalue elop] == ".true." } { groupwidget ramanthreshold enable } else { groupwidget ramanthreshold disable } } tracevar elop w { if { [varvalue lraman] == ".true." || [varvalue elop] == ".true." } { groupwidget ramanthreshold enable } else { groupwidget ramanthreshold disable } } tracevar reps_type w { widget nat_todo disable groupwidget start_last_irr disable groupwidget representation_line disable groupwidget atom_disp_line disable switch -- [varvalue reps_type] { start_last_irr { groupwidget start_last_irr enable } nat_todo { widget nat_todo enable groupwidget atom_disp_line enable } } } tracevar nat_todo w { if { [varvalue nat_todo] == "" } { widget nat_todo_list disable } else { if { [varvalue nat_todo] < 1 } { widget nat_todo_list disable } else { widget nat_todo_list enable } } } tracevar qplot w { if { [varvalue qplot] == ".true." } { groupwidget qPointsSpec enable groupwidget xq_list disable } else { groupwidget qPointsSpec disable groupwidget xq_list enable } } tracevar nqs w { set nqs [varvalue nqs] widgetconfigure qPoints -rows $nqs } # help postproccessing (hack for help of dvscf_star & drho_star structures) foreach ident {dvscf_star drho_star} { set obj [_getObjFromVarident $ident] set id [$obj getIdFromVarident $ident] set helptext [$obj getOptionValue $id helptext] foreach elem {open dir ext basis pat} { help ${ident}_$elem -helpfmt helpdoc -helptext $helptext } } postprocess { widget dvscf_star forget widget drho_star forget varset ldisp -value .false. varset lraman -value .false. varset elop -value .false. varset trans -value .true. varset epsil -value .false. varset recover -value .false. varset fpol -value .false. varset reps_type -value {} varset nat_todo -value {} varset qplot -value {} }espresso-5.1/PWgui-5.1/pwgui.settings0000644000077300007730000000521612341332513017764 0ustar giannozzgiannozz# ------------------------------------------------------------------------ # DEBUGGING ... # ------------------------------------------------------------------------ set ::tclu::DEBUG 0 set ::tclu::DEBUG_FILE 0 # ------------------------------------------------------------------------ # GUIB settings ... # ------------------------------------------------------------------------ # regular expresion for the for the endlist-string set ::guib::settings(NAMELIST.end_regexp) {^ &end|^/|^ /} # string to write for the end-of-namelist set ::guib::settings(NAMELIST.end_string) { /} # case-sensitivity of namelists variable names (allowed-values: 0|1) set ::guib::settings(NAMELIST.varname_nocase) 1 # format for printing namelist's variables names set ::guib::settings(NAMELIST.varname_format) { %25s} # support for undefined namelist variables set ::guib::settings(NAMELIST.variable_support_undefined) 0 # case-sensitivity of input (allowed-values: 0|1) set ::guib::settings(INPUT.nocase) 0 # add a trailing slash to dinames (allowed-values: 0|1) set ::guib::settings(DIRNAME.trailing_slash) 1 # whether to use only file-tail for filenames (allowed-values: 0|1) set ::guib::settings(FILENAME.only_tail) 0 # ------------------------------------------------------------------------ # PWgui settings ... # ------------------------------------------------------------------------ if { $tcl_platform(platform) == "unix" } { set ::pwscf::settings(EDITOR) PWgui set ::pwscf::settings(PAGER) PWgui #set ::pwscf::settings(EDITOR) emacs #set ::pwscf::settings(PAGER) {xterm -e less} } else { set ::pwscf::settings(EDITOR) PWgui set ::pwscf::settings(PAGER) PWgui } set ::pwscf::settings(HTMLVIEWER) PWgui set ::pwscf::settings(EDITOR.list) {PWgui emacs gedit nedit {xterm -e vi}} set ::pwscf::settings(PAGER.list) {PWgui {xterm -e less} {xterm -e more}} set ::pwscf::settings(HTMLVIEWER.list) {PWgui} # launch XCRYSDEN as (allowed-values: standalone|notebook-page) set ::pwscf::settings(XCRYSDEN.openAs) standalone # not yet used ... set ::pwscf::settings(PWGUI.geometry.remember) 0 set ::pwscf::settings(PWGUI.geometry) {} # ------------------------------------------------------------------------ # PWscf settings ... # ------------------------------------------------------------------------ set ::pwscf::settings(RUN.prefix) "" set ::pwscf::settings(RUN.postfix) "" set ::pwscf::settings(BINDIR) "" set ::pwscf::settings(PW) pw.x set ::pwscf::settings(PH) ph.x set ::pwscf::settings(PP) pp.x set ::pwscf::settings(PROJWFC) projwfc.x set ::pwscf::settings(D3) d3.x set ::pwscf::settings(LD1) ld1.x espresso-5.1/PWgui-5.1/pwgui_reformat.tcl0000644000077300007730000000565212341332513020611 0ustar giannozzgiannozz#!/bin/sh # ---------------------------------------------------------------------- # PROGRAM: pwgui_reformat # PURPOSE: reformat the input for nice lookout of a particular PWSCF module # ---------------------------------------------------------------------- # Anton Kokalj # Jozef Stefan Institute, Ljubljana, Slovenia # INFM DEMOCRITOS National Simulation Center, Trieste, Italy # Email: Tone.Kokalj@ijs.si # ====================================================================== # Copyright (c) 2003--2004 Anton Kokalj # ====================================================================== # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 ANTON KOKALJ 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. # if { [info exists env(PWGUI)] } { set guib_dir [glob -nocomplain -directory [file join $env(PWGUI) lib] Guib-*] if { $guib_dir != "" } { set env(GUIB) $guib_dir } if { [info exists env(GUIB)] } { lappend auto_path $env(GUIB) } lappend auto_path [file join $env(PWGUI) src] } else { puts stderr " " puts stderr " Please define the PWGUI enviromental variable !!!" puts stderr " PWGUI should point to the package root directory." puts stderr " " exit } # # Usage: pwgui_reformat PWSCF_module input_file # if { $argc != 2 } { # look into the $PWGUI/modules for allowed PWSCF_modules cd [file join $env(PWGUI) modules] set modules "" foreach item [glob -nocomplain *] { if { [file isdirectory $item] && $item != "CVS" } { append modules " $item\n" } } puts stderr " " puts stderr " Usage: pwgui_reformat PWSCF_module input_file" puts stderr " " puts stderr " Valid PWSCF's modules (PWSCF_module) are:" puts stderr " " puts stderr $modules exit } else { set module [lindex $argv 0] set module [file join $::env(PWGUI) modules $module $module.tcl] set input [lindex $argv 1] if { [file pathtype $input] != "absolute" } { set input [file join [pwd] $input] } } package require Guib 0.3.0 wm withdraw . option readfile [file join $::guib::library guib.theme] startupFile # DEBUGGING set ::tclu::DEBUG 0 set ::tclu::DEBUG_FILE 0 # # do the reformatting .... # namespace eval ::pwscf {} namespace eval ::guib { #set moduleObj [simpleTplwGUI $::module] set moduleObj [embedGUI $::module .] $moduleObj openFile $::input $moduleObj print 1 } exit 0espresso-5.1/PWgui-5.1/BUGS0000644000077300007730000000024212341332513015524 0ustar giannozzgiannozzBUGS -- known bugs. * module/pw/: if ntyp is changed the status (enabled/dispabled) of widgets associated with the ntyp gets always enabled BUGS ends here. espresso-5.1/PWgui-5.1/COPYRIGHT0000644000077300007730000000167612341332513016350 0ustar giannozzgiannozz ============================================================================== * * * PWgui Copyright / License Information * * * ============================================================================== Copyright (C) 2003--2008 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. 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. espresso-5.1/PWgui-5.1/INSTALL0000644000077300007730000000524112341332513016076 0ustar giannozzgiannozz ________________________________________________________________________ *** INSTALLATION instructions for PWgui *** ________________________________________________________________________ The PWgui package comes in two flavors: (i) STANDALONE EXECUTABLE, which runs out of the box (but works only on the platform for which it has been built) (ii) SOURCE PACKAGE N.B.: for the usage of SVN version of PWgui see file INSTALL.svn ________________________________________________________________________ (i) Installation instructions for STANDALONE EXECUTABLE ________________________________________________________________________ For zipped pwgui-xxx.zip package do: * unzip pwgui-xxx.zip whereas for tar-gzipped pwgui-xxx.tgz package do either: * tar zxvf pwgui-xxx.tgz or: * gunzip -c pwgui-xxx.tgz | tar xvf - To launch the program type either: * ./pwgui or * pwgui The standalone executable is always available for Linux platform, and occasionally also for Mac and Windows. ________________________________________________________________________ (ii) Installation instructions for SOURCE PACKAGE ________________________________________________________________________ To use the source package you need required Tcl software, in particular Tcl + Tk + Itcl + Itk + Iwidgets. PWgui requires the Tcl/Tk version 8.4 or later. You may install the software from your OS distribution. For example, for GNU/Linux Debian-based distributions, execute as root (or sudo): * apt-get update; apt-get install iwidgets4 (this will install also tcl/tk/itcl/itk, because iwidgets depend on them). On RedHat-based distributions, the analogous command is "yum". Hence: * yum install iwidgets Alternatively you may install ActiveTcl8.4 (which has all the required software built-in) from: http://www.activestate.com/activetcl/downloads/ BEWARE: do not install the newer 8.5 or 8.6 version of ActiveTcl, because they do not contain all the needed software. The version 8.4 is mandatory !!! Once your computer has all the needed software, your source package is ready to run. You only need to untar the PWgui source tarball, i.e.: * gunzip -c PWgui-.tgz | tar xvf - or * tar zxvf PWgui-.tgz where stands for version number. To launch the PWgui program, type: pwgui. You may add the PWgui root directory to your PATH. If you would like to copy "pwgui" launcher to some common place, such as /usr/local/bin, then you need either to define PWGUI environmental variable so that "pwgui" will be able to locate its root directory (i.e. source files) or alternatively hardcode it into pwgui lanucher itself. espresso-5.1/PWgui-5.1/pwgui.tcl0000644000077300007730000000455312341332513016711 0ustar giannozzgiannozz# ---------------------------------------------------------------------- # PROGRAM: PWgui # PURPOSE: tries to be a GUI for the PWscf # ---------------------------------------------------------------------- # Anton Kokalj # Jozef Stefan Institute, Ljubljana, Slovenia # INFM DEMOCRITOS National Simulation Center, Trieste, Italy # Email: Tone.Kokalj@ijs.si # ====================================================================== # Copyright (c) 2003--2004 Anton Kokalj # ====================================================================== # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 ANTON KOKALJ 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. # if { [info exists env(PWGUI)] } { puts " PWGUI : $env(PWGUI)" set guib_dir [glob -nocomplain -directory [file join $env(PWGUI) lib] Guib-*] if { $guib_dir != "" } { set env(GUIB) $guib_dir } else { # we arrive here, if we are using SVN version of code if { [file isdirectory [file join $env(PWGUI) .. Guib]] } { puts " " puts " It seems you are using SVN version of PWgui/Quantum-Espresso." puts " " puts " For the SVN version you need to do the following:" puts " * cd into GUI/PWgui directory, and" puts " * execute: make svninit" puts " " exit } } if { [info exists env(GUIB)] } { lappend auto_path $env(GUIB) puts " GUIB engine : $env(GUIB)\n" } } else { puts stderr " " puts stderr " Please define the PWGUI enviromental variable !!!" puts stderr " PWGUI should point to the package root directory." puts stderr " " exit } # # all initialization stuff should go into init.tcl # source [file join $env(PWGUI) init.tcl] # # now go-ahead: launch the application # wm withdraw . bind . ::guib::exitApp source [file join $env(PWGUI) src pwscf.itcl] espresso-5.1/PWgui-5.1/init.tcl0000644000077300007730000000132012341332513016506 0ustar giannozzgiannozz# # Initialization stuff for PWgui # package require Guib 0.5 namespace eval ::pwscf { variable pwscf variable settings set pwscf(PWD) [pwd] } # define here all pwscf's namespaces ... namespace eval ::pwscf::edit { variable edit } namespace eval ::pwscf::menustate {} namespace eval ::pwscf::view {} namespace eval ::pwscf::run { variable run set run(mode) nonblocking ; # possibilities: nonblocking || background } # load settings file ... source $env(PWGUI)/pwgui.settings if { [file exists $env(HOME)/.pwgui/pwgui.settings] } { # overwritte default settings by user-settings source $env(HOME)/.pwgui/pwgui.settings } lappend auto_path [file join $env(PWGUI) src] espresso-5.1/PWgui-5.1/AUTHORS0000644000077300007730000000015612341332513016115 0ustar giannozzgiannozzAuthors of PWgui. Anton Kokalj Also see files ChangeLog and THANKS. AUTHORS ends hereespresso-5.1/PWgui-5.1/README0000644000077300007730000000757512341332513015741 0ustar giannozzgiannozz ============================================================================== * * * README file for PWgui * * * ============================================================================== This is the PWgui---a GUI for the PWscf set of programs within the open-source Quantum ESPRESSO suite for quantum simulation of materials (see http://www.quantum-espresso.org). PWgui is written in [incr Tcl]---an extension of Tcl scripting language (hence no compilation is needed for the PWgui source package). However the package depends on the [incr Tcl] and related software. Therefore you have two possibilities: (i) to use a standalone executable which run out of the box. Works only on the platforms for which executable has been built. Currently the following platforms are supported: Linux, Windows, Mac. (ii) to use source package if required Tcl software is installed (see SOFTWARE REQUIREMENTS section below) See the file "INSTALL" for installation instructions. CURRENT STATUS -------------- The main purpose of the PWgui is to facilitate the creation and manipulation (editing) of input files for PWscf set of programs. It is possible to run the PWscf programs by using the GUI. This feature requires to set the path of the PWscf executables via "File-->Settings" menu (tab: PWscf settings). The GUI can also use the XCRYSDEN program (http://www.xcrysden.org/) for the visualization of atomic structures from the pw.x input/output files, or for the visualization of properties calculated via the sequence: pw.x-->pp.x (when the property was saved into an XSF file). Currently, the following PWscf programs (modules) are supported: * pw.x * neb.x's neb.dat * ph.x * pp.x * projwfc.x * bands.x * dos.x * d3.x * ld1.x (atomic) Directory structure of the PWgui source package: src/ main source directory of the PWgui modules/ GUIB definition files for PWscf programs (modules) lib/ libraries used by the PWgui images/ icons and images examples/ PWscf example input files doc/ documentation COPYING ------- The PWgui is covered by the GNU General Public License. Note that the PWgui uses also some external Tcl software, which is covered by modified BSD-like free software licenses. The material included in the directory external/ is the Tcl-related software. For the corresponding license see the file external/lib/copyright. All the material included in this distribution 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. These programs are distributed in the hope that they 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., 675 Mass Ave, Cambridge, MA 02139, USA. NOTE ABOUT THE STANDALONE EXECUTABLES ------------------------------------- Standalone executables are build using the Starkit's SDX utility. These executables are starkits---a STAandalone Runtime tclKITs (http://www.equi4.com/starkit.html). The Tclkit license is the following: "Tclkit is a combination of Tcl/Tk, IncrTcl, TclVFS, Zlib, and Metakit. Metakit is open source, using an X/MIT-style license. Tcl/Tk, IncrTcl, TclVFS, and Zlib have their own, BSD-ish open source licenses, so in my understanding this code can be used freely, also commercially. When Tclkit is distributed as part of a commercial package, copyright attributions and license terms for the above need to be included in the distribution. A reference to the origin of Tclkit is appreciated but not required." -- Anton Kokalj (tone.kokalj@ijs.si), Mon Jan 23 12:28:40 CET 2012 espresso-5.1/PWgui-5.1/pwgui0000755000077300007730000000426412341332513016132 0ustar giannozzgiannozz#!/bin/sh # ---------------------------------------------------------------------- # PROGRAM: PWgui # PURPOSE: tries to be a GUI for the PWscf # ---------------------------------------------------------------------- # Anton Kokalj # Jozef Stefan Institute, Ljubljana, Slovenia # INFM DEMOCRITOS National Simulation Center, Trieste, Italy # Email: Tone.Kokalj@ijs.si # ====================================================================== # Copyright (c) 2003--2004 Anton Kokalj # ====================================================================== # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 ANTON KOKALJ 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. # if test "x`type readlink`" = "x"; then # no readlink cmd; make a function-substitute readlink() { echo `ls -l $1 | awk '{print $NF}'` } fi pathname() { file=`type -p $1` if test $? -gt 0; then file=`which $1` if test $? -gt 0; then # give-up file=$1 fi fi echo $file } pathdir() { file=`pathname $1` while test -h $file; do file=`readlink $file` done dir=`dirname $file` ( cd $dir; pwd ) } if [ -z "$PWGUI" ]; then # try to guess the PWGUI value export PWGUI=`pathdir $0` fi echo " ================================================== This is PWgui version: `cat $PWGUI/VERSION` -------------------------------------------------- " if [ -d $PWGUI/bin ]; then echo " PWgui: using the \"$PWGUI/bin/itkwish\" interpreter " $PWGUI/bin/itkwish $PWGUI/pwgui.tcl else echo " PWgui: using the system default \"tclsh\" interpreter " tclsh $PWGUI/pwgui.tcl fi espresso-5.1/PWgui-5.1/examples/0000755000077300007730000000000012341333047016664 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/examples/atomic/0000755000077300007730000000000012341333047020140 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/examples/atomic/pt.pseudo_gen.in0000644000077300007730000000122312341332513023235 0ustar giannozzgiannozz &input title='Pt', zed=78.0, rel=2, iswitch=3, rlderiv=2.50, eminld=-4.0, emaxld=4.0, deld=0.02, nld=5, config='[Xe] 4f14. 5d8 6s2 6p0', dft='LDA' / &inputp pseudotype=3, lloc=0, file_pseudopw='Ptrel.RRKJ3', nlcc=.true., rcore=1.2, rcloc=2.5 / 7 5D 3 2 4.00 0.00 2.10 2.40 1.50 5D 3 2 0.00 -0.20 2.10 2.40 1.50 5D 3 2 4.00 0.00 2.10 2.40 2.50 5D 3 2 0.00 -0.20 2.10 2.40 2.50 6P 2 1 0.00 -0.00 3.30 3.30 0.50 6P 2 1 0.00 -0.00 3.40 3.40 1.50 6S 1 0 2.00 0.00 2.60 2.60 0.50 espresso-5.1/PWgui-5.1/examples/atomic/pt.all_electron.in0000644000077300007730000000031712341332513023553 0ustar giannozzgiannozz &input title='Pt', zed=78., rel=2, xmin=-6.0, isic=0, lsd=0, latt=1, iswitch=1, config='[Xe] 4f14. 5d9 6s1', dft='SL1-NOC' / espresso-5.1/PWgui-5.1/examples/atomic/rh.pseudo_test.in0000644000077300007730000000041512341332513023433 0ustar giannozzgiannozz &input title='Rh', zed=45., rel=1, rlderiv=2.50, eminld=-4.0, emaxld=4.0, deld=0.02, nld=3, iswitch=2, config='[Kr] 4d7 5s2 5p0' dft='PBE', / &test nconf=1, file_pseudo='RhUSPBEnlcc.RRKJ3.UPF', configts(1)= '4d7 5s2 5p0' / espresso-5.1/PWgui-5.1/examples/d3/0000755000077300007730000000000012341333047017172 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/examples/d3/sample.d3.inp0000644000077300007730000000076612341332513021476 0ustar giannozzgiannozz &INPUTPH fildrho = 'fildrho' , fild0rho = 'fild0rho' , amass(1) = 1.008, amass(2) = 12.011, prefix = 'pwscf' , outdir = '/temp/tone/test/' , fildyn = 'fildyn' , ethr_ph = 1d-6 , q0mode_todo(1) = 0, wraux = .false. , recv = .false. , istop = 0 , / espresso-5.1/PWgui-5.1/examples/neb.dat/0000755000077300007730000000000012341333047020177 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/examples/neb.dat/neb.dat0000644000077300007730000000046012341332513021432 0ustar giannozzgiannozz&PATH restart_mode = 'from_scratch' string_method = 'neb', nstep_path = 20, ds = 2.D0, opt_scheme = "broyden", num_of_images = 11, k_max = 0.3D0, k_min = 0.2D0, CI_scheme = "auto", path_thr = 0.1D0, / espresso-5.1/PWgui-5.1/examples/projwfc/0000755000077300007730000000000012341333047020336 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/examples/projwfc/sample.pr.inp0000644000077300007730000000045112341332513022744 0ustar giannozzgiannozz &PROJWFC prefix = 'pwscf' , outdir = '/scratch/tone/test/' , ngauss = 1 , degauss = 0.03 , DeltaE = 0.01 , Emin = -10.0 , Emax = 4.0 , / espresso-5.1/PWgui-5.1/examples/pw/0000755000077300007730000000000012341333047017312 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/examples/pw/ni.band.in0000644000077300007730000000163312341332513021153 0ustar giannozzgiannozz &control calculation='nscf' pseudo_dir = '/home/giannozz/New-sesame/pseudo/', outdir='/home/giannozz/tmp/' prefix='ni' / &system ibrav=2, celldm(1) =6.48, nat=1, ntyp=1, nspin = 2, starting_magnetization(1)=0.7, ecutwfc = 24.0, ecutrho = 288.0, nbnd = 8 / &electrons / ATOMIC_SPECIES Ni 58.69 NiUS.RRKJ3.UPF ATOMIC_POSITIONS Ni 0.0 0.0 0.0 K_POINTS 28 0.0 0.0 0.0 1.0 0.0 0.0 0.1 1.0 0.0 0.0 0.2 1.0 0.0 0.0 0.3 1.0 0.0 0.0 0.4 1.0 0.0 0.0 0.5 1.0 0.0 0.0 0.6 1.0 0.0 0.0 0.7 1.0 0.0 0.0 0.8 1.0 0.0 0.0 0.9 1.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 0.0 0.1 0.1 1.0 0.0 0.2 0.2 1.0 0.0 0.3 0.3 1.0 0.0 0.4 0.4 1.0 0.0 0.5 0.5 1.0 0.0 0.6 0.6 1.0 0.0 0.7 0.7 1.0 0.0 0.8 0.8 1.0 0.0 0.9 0.9 1.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.1 0.1 0.1 1.0 0.2 0.2 0.2 1.0 0.3 0.3 0.3 1.0 0.4 0.4 0.4 1.0 0.5 0.5 0.5 1.0 espresso-5.1/PWgui-5.1/examples/pw/si.scf.in0000644000077300007730000000165012341332513021026 0ustar giannozzgiannozzSi Silicon &control calculation = 'scf' restart_mode='from_scratch', prefix='silicon', tstress = .true. tprnfor = .true. pseudo_dir = '/home/giannozz/New-sesame/pseudo/', outdir='/home/giannozz/tmp/' / &system ibrav= 2, celldm(1) =10.20, nat= 2, ntyp= 1, ecutwfc =18.0, / &electrons mixing_mode = 'plain' mixing_beta = 0.7 conv_thr = 1.0d-8 / ATOMIC_SPECIES Si 28.086 Si.vbc.UPF ATOMIC_POSITIONS Si 0.00 0.00 0.00 Si 0.25 0.25 0.25 K_POINTS 10 0.1250000 0.1250000 0.1250000 1.00 0.1250000 0.1250000 0.3750000 3.00 0.1250000 0.1250000 0.6250000 3.00 0.1250000 0.1250000 0.8750000 3.00 0.1250000 0.3750000 0.3750000 3.00 0.1250000 0.3750000 0.6250000 6.00 0.1250000 0.3750000 0.8750000 6.00 0.1250000 0.6250000 0.6250000 3.00 0.3750000 0.3750000 0.3750000 1.00 0.3750000 0.3750000 0.6250000 3.00 espresso-5.1/PWgui-5.1/examples/pw/cu.scf.in0000644000077300007730000000104412341332513021017 0ustar giannozzgiannozz &control calculation='scf' restart_mode='from_scratch', pseudo_dir = '/home/giannozz/New-sesame/pseudo/', outdir='/home/giannozz/tmp/' prefix='cu' tstress = .true. tprnfor = .true. / &system ibrav = 2, celldm(1) =6.73, nat= 1, ntyp= 1, ecutwfc = 25.0, ecutrho = 300.0 occupations='smearing', smearing='methfessel-paxton', degauss=0.02 / &electrons conv_thr = 1.0e-8 mixing_beta = 0.7 / ATOMIC_SPECIES Cu 63.55 CuUS.RRKJ3.UPF ATOMIC_POSITIONS Cu 0.0 0.0 0.0 K_POINTS (automatic) 8 8 8 0 0 0 espresso-5.1/PWgui-5.1/examples/pw/cu.band.in0000644000077300007730000000156112341332513021154 0ustar giannozzgiannozz &control calculation='nscf' pseudo_dir = '/home/giannozz/New-sesame/pseudo/', outdir='/home/giannozz/tmp/', prefix='cu' / &system ibrav = 2, celldm(1) =6.73, nat= 1, ntyp= 1, ecutwfc = 25.0, ecutrho = 300.0, nbnd = 8 / &electrons / ATOMIC_SPECIES Cu 63.55 CuUS.RRKJ3.UPF ATOMIC_POSITIONS Cu 0.0 0.0 0.0 K_POINTS 28 0.0 0.0 0.0 1.0 0.0 0.0 0.1 1.0 0.0 0.0 0.2 1.0 0.0 0.0 0.3 1.0 0.0 0.0 0.4 1.0 0.0 0.0 0.5 1.0 0.0 0.0 0.6 1.0 0.0 0.0 0.7 1.0 0.0 0.0 0.8 1.0 0.0 0.0 0.9 1.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 0.0 0.1 0.1 1.0 0.0 0.2 0.2 1.0 0.0 0.3 0.3 1.0 0.0 0.4 0.4 1.0 0.0 0.5 0.5 1.0 0.0 0.6 0.6 1.0 0.0 0.7 0.7 1.0 0.0 0.8 0.8 1.0 0.0 0.9 0.9 1.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.1 0.1 0.1 1.0 0.2 0.2 0.2 1.0 0.3 0.3 0.3 1.0 0.4 0.4 0.4 1.0 0.5 0.5 0.5 1.0 espresso-5.1/PWgui-5.1/examples/pw/al.band.in0000644000077300007730000000450612341332513021143 0ustar giannozzgiannozz &CONTROL title = 'band structure of Al' , calculation = 'nscf', restart_mode = 'from_scratch' , outdir = '/home/giannozz/tmp/' , pseudo_dir = '/home/giannozz/New-sesame/pseudo/' , prefix = 'al' , verbosity = 'default', / &SYSTEM ibrav = 2, celldm(1) = 7.5000000000, nat = 1, ntyp = 1, ecutwfc = 15.0000000000, nosym = .false. , nbnd = 8, / &ELECTRONS / ATOMIC_SPECIES Al 26.98000 Al.vbc.UPF ATOMIC_POSITIONS alat Al 0.000000000 0.000000000 0.000000000 K_POINTS tpiba 28 0.000000000 0.000000000 0.000000000 1.000000000 0.000000000 0.000000000 0.100000000 1.000000000 0.000000000 0.000000000 0.200000000 1.000000000 0.000000000 0.000000000 0.300000000 1.000000000 0.000000000 0.000000000 0.400000000 1.000000000 0.000000000 0.000000000 0.500000000 1.000000000 0.000000000 0.000000000 0.600000000 1.000000000 0.000000000 0.000000000 0.700000000 1.000000000 0.000000000 0.000000000 0.800000000 1.000000000 0.000000000 0.000000000 0.900000000 1.000000000 0.000000000 0.000000000 1.000000000 1.000000000 0.000000000 0.000000000 0.000000000 1.000000000 0.000000000 0.100000000 0.100000000 1.000000000 0.000000000 0.200000000 0.200000000 1.000000000 0.000000000 0.300000000 0.300000000 1.000000000 0.000000000 0.400000000 0.400000000 1.000000000 0.000000000 0.500000000 0.500000000 1.000000000 0.000000000 0.600000000 0.600000000 1.000000000 0.000000000 0.700000000 0.700000000 1.000000000 0.000000000 0.800000000 0.800000000 1.000000000 0.000000000 0.900000000 0.900000000 1.000000000 0.000000000 1.000000000 1.000000000 1.000000000 0.000000000 0.000000000 0.000000000 1.000000000 0.100000000 0.100000000 0.100000000 1.000000000 0.200000000 0.200000000 0.200000000 1.000000000 0.300000000 0.300000000 0.300000000 1.000000000 0.400000000 0.400000000 0.400000000 1.000000000 0.500000000 0.500000000 0.500000000 1.000000000 espresso-5.1/PWgui-5.1/examples/pw/ni.scf.in0000644000077300007730000000602412341332513021021 0ustar giannozzgiannozz &control calculation='scf' restart_mode='from_scratch', pseudo_dir = '/home/giannozz/New-sesame/pseudo/', outdir='/home/giannozz/tmp/' prefix='ni' tprnfor = .true., tstress = .true. / &system ibrav=2, celldm(1) =6.48, nat=1, ntyp=1, nspin = 2, starting_magnetization(1)=0.7, ecutwfc = 24.0, ecutrho = 288.0, occupations='smearing', smearing='methfessel-paxton', degauss=0.02 / &electrons conv_thr = 1.0e-8 mixing_beta = 0.7 / ATOMIC_SPECIES Ni 58.69 NiUS.RRKJ3.UPF ATOMIC_POSITIONS Ni 0.0 0.0 0.0 K_POINTS 60 0.0625000 0.0625000 0.0625000 1.00 0.0625000 0.0625000 0.1875000 3.00 0.0625000 0.0625000 0.3125000 3.00 0.0625000 0.0625000 0.4375000 3.00 0.0625000 0.0625000 0.5625000 3.00 0.0625000 0.0625000 0.6875000 3.00 0.0625000 0.0625000 0.8125000 3.00 0.0625000 0.0625000 0.9375000 3.00 0.0625000 0.1875000 0.1875000 3.00 0.0625000 0.1875000 0.3125000 6.00 0.0625000 0.1875000 0.4375000 6.00 0.0625000 0.1875000 0.5625000 6.00 0.0625000 0.1875000 0.6875000 6.00 0.0625000 0.1875000 0.8125000 6.00 0.0625000 0.1875000 0.9375000 6.00 0.0625000 0.3125000 0.3125000 3.00 0.0625000 0.3125000 0.4375000 6.00 0.0625000 0.3125000 0.5625000 6.00 0.0625000 0.3125000 0.6875000 6.00 0.0625000 0.3125000 0.8125000 6.00 0.0625000 0.3125000 0.9375000 6.00 0.0625000 0.4375000 0.4375000 3.00 0.0625000 0.4375000 0.5625000 6.00 0.0625000 0.4375000 0.6875000 6.00 0.0625000 0.4375000 0.8125000 6.00 0.0625000 0.4375000 0.9375000 6.00 0.0625000 0.5625000 0.5625000 3.00 0.0625000 0.5625000 0.6875000 6.00 0.0625000 0.5625000 0.8125000 6.00 0.0625000 0.6875000 0.6875000 3.00 0.0625000 0.6875000 0.8125000 6.00 0.0625000 0.8125000 0.8125000 3.00 0.1875000 0.1875000 0.1875000 1.00 0.1875000 0.1875000 0.3125000 3.00 0.1875000 0.1875000 0.4375000 3.00 0.1875000 0.1875000 0.5625000 3.00 0.1875000 0.1875000 0.6875000 3.00 0.1875000 0.1875000 0.8125000 3.00 0.1875000 0.3125000 0.3125000 3.00 0.1875000 0.3125000 0.4375000 6.00 0.1875000 0.3125000 0.5625000 6.00 0.1875000 0.3125000 0.6875000 6.00 0.1875000 0.3125000 0.8125000 6.00 0.1875000 0.4375000 0.4375000 3.00 0.1875000 0.4375000 0.5625000 6.00 0.1875000 0.4375000 0.6875000 6.00 0.1875000 0.4375000 0.8125000 6.00 0.1875000 0.5625000 0.5625000 3.00 0.1875000 0.5625000 0.6875000 6.00 0.1875000 0.6875000 0.6875000 3.00 0.3125000 0.3125000 0.3125000 1.00 0.3125000 0.3125000 0.4375000 3.00 0.3125000 0.3125000 0.5625000 3.00 0.3125000 0.3125000 0.6875000 3.00 0.3125000 0.4375000 0.4375000 3.00 0.3125000 0.4375000 0.5625000 6.00 0.3125000 0.4375000 0.6875000 6.00 0.3125000 0.5625000 0.5625000 3.00 0.4375000 0.4375000 0.4375000 1.00 0.4375000 0.4375000 0.5625000 3.00 espresso-5.1/PWgui-5.1/examples/pw/sample.pw.inp0000644000077300007730000000121512341332513021724 0ustar giannozzgiannozzPWSCF sample &CONTROL calculation = 'scf', restart_mode = 'from_scratch' , verbosity = 'default', / &SYSTEM ibrav = 1, celldm(1) = 10.0000000000, nat = 2, ntyp = 2, ecutwfc = 30.0000000000, / &ELECTRONS / ATOMIC_SPECIES O 1.00000 OUSPBE.RRKJ3 Ag 1.00000 AgUSPBE.RRKJ3 ATOMIC_POSITIONS alat O 0.000000000 0.000000000 0.000000000 0 0 0 Ag 1.000000000 1.000000000 1.000000000 0 0 0 K_POINTS tpiba 2 0.000000000 0.000000000 0.000000000 0.500000000 0.500000000 0.500000000 0.500000000 0.500000000 espresso-5.1/PWgui-5.1/examples/pw/occupations.pw.inp0000644000077300007730000000511612341332513022776 0ustar giannozzgiannozz &CONTROL title = 'band structure of Al' , restart_mode = 'from_scratch' , outdir = '/home/giannozz/tmp/' , pseudo_dir = '/home/giannozz/New-sesame/pseudo/' , prefix = 'al' , verbosity = 'default' , / &SYSTEM ibrav = 2, celldm(1) = 7.5000000000, nat = 1, ntyp = 1, ecutwfc = 15.0000000000 , nosym = .false. , nbnd = 8, occupations = 'from_input' , / &ELECTRONS / ATOMIC_SPECIES Al 26.98000 Al.vbc.UPF ATOMIC_POSITIONS alat Al 0.000000000 0.000000000 0.000000000 K_POINTS tpiba 28 0.000000000 0.000000000 0.000000000 1.000000000 0.000000000 0.000000000 0.100000000 1.000000000 0.000000000 0.000000000 0.200000000 1.000000000 0.000000000 0.000000000 0.300000000 1.000000000 0.000000000 0.000000000 0.400000000 1.000000000 0.000000000 0.000000000 0.500000000 1.000000000 0.000000000 0.000000000 0.600000000 1.000000000 0.000000000 0.000000000 0.700000000 1.000000000 0.000000000 0.000000000 0.800000000 1.000000000 0.000000000 0.000000000 0.900000000 1.000000000 0.000000000 0.000000000 1.000000000 1.000000000 0.000000000 0.000000000 0.000000000 1.000000000 0.000000000 0.100000000 0.100000000 1.000000000 0.000000000 0.200000000 0.200000000 1.000000000 0.000000000 0.300000000 0.300000000 1.000000000 0.000000000 0.400000000 0.400000000 1.000000000 0.000000000 0.500000000 0.500000000 1.000000000 0.000000000 0.600000000 0.600000000 1.000000000 0.000000000 0.700000000 0.700000000 1.000000000 0.000000000 0.800000000 0.800000000 1.000000000 0.000000000 0.900000000 0.900000000 1.000000000 0.000000000 1.000000000 1.000000000 1.000000000 0.000000000 0.000000000 0.000000000 1.000000000 0.100000000 0.100000000 0.100000000 1.000000000 0.200000000 0.200000000 0.200000000 1.000000000 0.300000000 0.300000000 0.300000000 1.000000000 0.400000000 0.400000000 0.400000000 1.000000000 0.500000000 0.500000000 0.500000000 1.000000000 OCCUPATIONS 2 2 2 2 2 2 2 2 2 2 2 2 1 1 0 0 0 espresso-5.1/PWgui-5.1/examples/pw/Si_band.pw.inp0000644000077300007730000000167612341332513022015 0ustar giannozzgiannozzSi-bulk band test &control calculation='nscf' pseudo_dir = '$PSEUDO_DIR/', outdir='$TMP_DIR/', prefix='silicon' &end &system ibrav = 2, celldm(1) = 10.20, nat = 2, ntyp = 1, ecutwfc = 18.0, nbnd = 8, &end &electrons &end ATOMIC_SPECIES Si 28.086 Si.vbc.UPF ATOMIC_POSITIONS alat Si 0.00 0.00 0.00 Si 0.25 0.25 0.25 K_POINTS tpiba 28 0.0 0.0 0.0 1.0 0.0 0.0 0.1 1.0 0.0 0.0 0.2 1.0 0.0 0.0 0.3 1.0 0.0 0.0 0.4 1.0 0.0 0.0 0.5 1.0 0.0 0.0 0.6 1.0 0.0 0.0 0.7 1.0 0.0 0.0 0.8 1.0 0.0 0.0 0.9 1.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 0.0 0.1 0.1 1.0 0.0 0.2 0.2 1.0 0.0 0.3 0.3 1.0 0.0 0.4 0.4 1.0 0.0 0.5 0.5 1.0 0.0 0.6 0.6 1.0 0.0 0.7 0.7 1.0 0.0 0.8 0.8 1.0 0.0 0.9 0.9 1.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.1 0.1 0.1 1.0 0.2 0.2 0.2 1.0 0.3 0.3 0.3 1.0 0.4 0.4 0.4 1.0 0.5 0.5 0.5 1.0 espresso-5.1/PWgui-5.1/examples/pw/si.band.in0000644000077300007730000000160112341332513021153 0ustar giannozzgiannozz &control calculation='nscf' pseudo_dir = '/home/giannozz/New-sesame/pseudo/', outdir='/home/giannozz/tmp/', prefix='silicon' / &system ibrav= 2, celldm(1) =10.20, nat= 2, ntyp= 1, ecutwfc =18.0, nbnd = 8, / &electrons / ATOMIC_SPECIES Si 28.086 Si.vbc.UPF ATOMIC_POSITIONS Si 0.00 0.00 0.00 Si 0.25 0.25 0.25 K_POINTS 28 0.0 0.0 0.0 1.0 0.0 0.0 0.1 1.0 0.0 0.0 0.2 1.0 0.0 0.0 0.3 1.0 0.0 0.0 0.4 1.0 0.0 0.0 0.5 1.0 0.0 0.0 0.6 1.0 0.0 0.0 0.7 1.0 0.0 0.0 0.8 1.0 0.0 0.0 0.9 1.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 0.0 0.1 0.1 1.0 0.0 0.2 0.2 1.0 0.0 0.3 0.3 1.0 0.0 0.4 0.4 1.0 0.0 0.5 0.5 1.0 0.0 0.6 0.6 1.0 0.0 0.7 0.7 1.0 0.0 0.8 0.8 1.0 0.0 0.9 0.9 1.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.1 0.1 0.1 1.0 0.2 0.2 0.2 1.0 0.3 0.3 0.3 1.0 0.4 0.4 0.4 1.0 0.5 0.5 0.5 1.0 espresso-5.1/PWgui-5.1/examples/pw/Si_scf.pw.inp0000644000077300007730000000160412341332513021653 0ustar giannozzgiannozzSi Silicon &control calculation = 'scf' restart_mode='from_scratch', prefix='silicon', tstress = .true. tprnfor = .true. pseudo_dir = '$PSEUDO_DIR/', outdir='$TMP_DIR/' &end &system ibrav= 2, celldm(1) =10.20, nat= 2, ntyp= 1, ecutwfc =18.0, &end &electrons mixing_beta = 0.7 conv_thr = 1.0d-8 &end ATOMIC_SPECIES Si 28.086 Si.vbc.UPF ATOMIC_POSITIONS alat Si 0.00 0.00 0.00 Si 0.25 0.25 0.25 K_POINTS tpiba 10 0.1250000 0.1250000 0.1250000 1.00 0.1250000 0.1250000 0.3750000 3.00 0.1250000 0.1250000 0.6250000 3.00 0.1250000 0.1250000 0.8750000 3.00 0.1250000 0.3750000 0.3750000 3.00 0.1250000 0.3750000 0.6250000 6.00 0.1250000 0.3750000 0.8750000 6.00 0.1250000 0.6250000 0.6250000 3.00 0.3750000 0.3750000 0.3750000 1.00 0.3750000 0.3750000 0.6250000 3.00 espresso-5.1/PWgui-5.1/examples/pw/al.scf.in0000644000077300007730000001100012341332513020775 0ustar giannozzgiannozz &CONTROL calculation = 'scf' , restart_mode = 'from_scratch' , outdir = 'TMP' , pseudo_dir = '/home/tone/lib/pwscf/pseudo/' , prefix = 'al' , tstress = .true. , tprnfor = .true. , / &SYSTEM ibrav = 2, celldm(1) = 7.50, nat = 1, ntyp = 1, ecutwfc = 15.0 , occupations = 'smearing' , degauss = 0.05 , smearing = 'methfessel-paxton' , / &ELECTRONS mixing_beta = 0.7 , / ATOMIC_SPECIES Al 26.98000 Al.vbc ATOMIC_POSITIONS Al 0.000000000 0.000000000 0.000000000 K_POINTS 60 0.062500000 0.062500000 0.062500000 1.000000000 0.062500000 0.062500000 0.187500000 3.000000000 0.062500000 0.062500000 0.312500000 3.000000000 0.062500000 0.062500000 0.437500000 3.000000000 0.062500000 0.062500000 0.562500000 3.000000000 0.062500000 0.062500000 0.687500000 3.000000000 0.062500000 0.062500000 0.812500000 3.000000000 0.062500000 0.062500000 0.937500000 3.000000000 0.062500000 0.187500000 0.187500000 3.000000000 0.062500000 0.187500000 0.312500000 6.000000000 0.062500000 0.187500000 0.437500000 6.000000000 0.062500000 0.187500000 0.562500000 6.000000000 0.062500000 0.187500000 0.687500000 6.000000000 0.062500000 0.187500000 0.812500000 6.000000000 0.062500000 0.187500000 0.937500000 6.000000000 0.062500000 0.312500000 0.312500000 3.000000000 0.062500000 0.312500000 0.437500000 6.000000000 0.062500000 0.312500000 0.562500000 6.000000000 0.062500000 0.312500000 0.687500000 6.000000000 0.062500000 0.312500000 0.812500000 6.000000000 0.062500000 0.312500000 0.937500000 6.000000000 0.062500000 0.437500000 0.437500000 3.000000000 0.062500000 0.437500000 0.562500000 6.000000000 0.062500000 0.437500000 0.687500000 6.000000000 0.062500000 0.437500000 0.812500000 6.000000000 0.062500000 0.437500000 0.937500000 6.000000000 0.062500000 0.562500000 0.562500000 3.000000000 0.062500000 0.562500000 0.687500000 6.000000000 0.062500000 0.562500000 0.812500000 6.000000000 0.062500000 0.687500000 0.687500000 3.000000000 0.062500000 0.687500000 0.812500000 6.000000000 0.062500000 0.812500000 0.812500000 3.000000000 0.187500000 0.187500000 0.187500000 1.000000000 0.187500000 0.187500000 0.312500000 3.000000000 0.187500000 0.187500000 0.437500000 3.000000000 0.187500000 0.187500000 0.562500000 3.000000000 0.187500000 0.187500000 0.687500000 3.000000000 0.187500000 0.187500000 0.812500000 3.000000000 0.187500000 0.312500000 0.312500000 3.000000000 0.187500000 0.312500000 0.437500000 6.000000000 0.187500000 0.312500000 0.562500000 6.000000000 0.187500000 0.312500000 0.687500000 6.000000000 0.187500000 0.312500000 0.812500000 6.000000000 0.187500000 0.437500000 0.437500000 3.000000000 0.187500000 0.437500000 0.562500000 6.000000000 0.187500000 0.437500000 0.687500000 6.000000000 0.187500000 0.437500000 0.812500000 6.000000000 0.187500000 0.562500000 0.562500000 3.000000000 0.187500000 0.562500000 0.687500000 6.000000000 0.187500000 0.687500000 0.687500000 3.000000000 0.312500000 0.312500000 0.312500000 1.000000000 0.312500000 0.312500000 0.437500000 3.000000000 0.312500000 0.312500000 0.562500000 3.000000000 0.312500000 0.312500000 0.687500000 3.000000000 0.312500000 0.437500000 0.437500000 3.000000000 0.312500000 0.437500000 0.562500000 6.000000000 0.312500000 0.437500000 0.687500000 6.000000000 0.312500000 0.562500000 0.562500000 3.000000000 0.437500000 0.437500000 0.437500000 1.000000000 0.437500000 0.437500000 0.562500000 3.000000000 espresso-5.1/PWgui-5.1/examples/pp/0000755000077300007730000000000012341333047017303 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/examples/pp/psi2.pp.inp0000644000077300007730000000037312341332513021306 0ustar giannozzgiannozz &INPUTPP prefix = 'pwscf' , outdir = './' , filplot = 'pwscf.plot' , plot_num = 7, kpoint = 1, kband = 14, / &PLOT / espresso-5.1/PWgui-5.1/examples/ph/0000755000077300007730000000000012341333047017273 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/examples/ph/sample.ph.inp0000644000077300007730000000037312341332513021672 0ustar giannozzgiannozzSample input for the PHONON (ph.x) program &INPUTPH amass(1) = 1.000000, amass(2) = 2.000000, amass(3) = 3.000000, prefix = 'pwscf' , / 0.000000 0.000000 0.000000 espresso-5.1/PWgui-5.1/pwgui_reformat0000755000077300007730000000372112341332513020026 0ustar giannozzgiannozz#!/bin/sh # ---------------------------------------------------------------------- # PROGRAM: pwgui_reformat # PURPOSE: reformat the input for nice lookout of a particular PWSCF module # ---------------------------------------------------------------------- # Anton Kokalj # Jozef Stefan Institute, Ljubljana, Slovenia # INFM DEMOCRITOS National Simulation Center, Trieste, Italy # Email: Tone.Kokalj@ijs.si # ====================================================================== # Copyright (c) 2003--2004 Anton Kokalj # ====================================================================== # # # This file is distributed under the terms of the GNU General Public # License. See the file `COPYING' in the root directory of the present # distribution, or http://www.gnu.org/copyleft/gpl.txt . # # # 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 ANTON KOKALJ 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. # if test "x`type readlink`" = "x"; then # no readlink cmd; make a function-substitute readlink() { echo `ls -l $1 | awk '{print $NF}'` } fi pathname() { file=`type -p $1` if test $? -gt 0; then file=`which $1` if test $? -gt 0; then # give-up file=$1 fi fi echo $file } pathdir() { file=`pathname $1` while test -h $file; do file=`readlink $file` done dir=`dirname $file` ( cd $dir; pwd ) } if [ -z "$PWGUI" ]; then # try to guess the PWGUI value export PWGUI=`pathdir $0` fi if [ -d $PWGUI/bin ]; then $PWGUI/bin/itkwish $PWGUI/pwgui_reformat.tcl $@ else tclsh $PWGUI/pwgui_reformat.tcl $@ fi espresso-5.1/PWgui-5.1/README.developer0000644000077300007730000000616012341332513017712 0ustar giannozzgiannozz ============================================================================== * * * README file for PWgui (and PWscf) developers * * * ============================================================================== *** see INSTALL.svn for how to run SVN version of PWgui !!! FOR PWscf DEVELOPERS: UPDATING the PWgui MODULES -------------------------------------------------- If some new variables have been added to a given PWscf program, please update corresponding module definition files, which are located in modules/ directory. Before committing changes to SVN repository, please check that the updated module works!!! If you face troubles, please consult tone.kokalj@ijs.si. WHAT IS A "MODULE" IN PWgui ----------------------------- A "module" stands for the definition of the input of a given PWscf program. The description of the input is specified using the GUIB-definition syntax. Such a description provides two items: (i) it defines the input-syntax, and concomitantly (ii) defines the GUI. The modules are located in the modules/ directory. Each module is located in its own directory. For example the PW.X module is located in directory modules/pw. The following files are located therein: * pw.tcl - main module definition file, the rest of the files are source from here * pw-event.tcl - implementation of event-driven mechanism * pw-help.tcl - help file describing all the pw.x variables * commands.tcl - auxiliary commands used by file pw.tcl Hereafter such files are called "module definition files". HOW TO ADD A NEW MODULE TO PWgui ---------------------------------- Let's say we want to add a new module named "mymodule". We have to perform two tasks: (i) Write the Module Definition Files Create a directory: modules/mymodule, and therein a file mymodule.tcl. If needed create also files: mymodule-event.tcl, mymodule-help.tcl, and commands.tcl. For the syntax of the module definition file see some existing modules. For example, see files in modules/pp (easy example), or in modules/pw (complex example). For further documentation see also: http://www-k3.ijs.si/kokalj/guib/documentation.html. (ii) Inform the GUI About New Module Now we should edit the file src-tcl/pwscf.itcl, and add the following line on the proper place (search for addModule string): $gui addModule module mymodule "MyModule.X" \ [file join $env(PWGUI) modules mymodule mymodule.tcl] { {{MyModule.X Input File} {*.my.inp}} } We can also add extra documentation for the module. Let say that we have an INPUT_MYMODULE file. We can either copy this file to directory doc/pwdoc or alternatively we make a symbolic link. Then we edit a Makefile and insert the INPUT_MYMODULE support (the purpose is to convert INPUT_MYMODULE to INPUT_MYMODULE.html). Now we execute: make input_html (this will create the INPUT_MYMODULE.html file). Finally, we can edit the src-tcl/pwscf.itcl, and add the following line on the proper place (search for addHelp string): $gui addHelp help mymodule "MyModule.X Input Syntax" \ [file join $env(PWGUI) doc pwdocs INPUT_MYMODULE.html] -- Anton Kokalj (tone.kokalj@ijs.si), Tue Feb 17 08:41:05 CET 2004espresso-5.1/PWgui-5.1/images/0000755000077300007730000000000012341333047016313 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/images/pwscf-logo.gif0000644000077300007730000002540012341332513021060 0ustar giannozzgiannozzGIF89a#٥Ўɇw֗V'kG:l6ܶϸK0%T ծ1Wz{zu~lll|}ԷٯܧwwΨ٨ㇺfv٫xfgɇgof̹tc|w½ʘWXЈWvyd~eyzpťs%49'|>pQ(qye&A)e(p)( J&P}%O p<YzpT\ U\ d0 +K<0 ǰ ?L @ # ɰcQR KpE9 ~ T.Pv;V!j]0 #M0NwpP@{`Iw:3 v}VEAk"䦤&)JîJf81JT"&$mQjn,M"@I@QP`|}p @a (Uߐ+ а P 3WaP  ǁ !OtD X p  S T'.4X5S{0 +p dO `$0 焖Vr`ՊQKd1-xIpJ|6 ?PL*J"̜h[ɧ;y*3oDA*KjYa OG@Z0Ӊ`L# `ؐ ! PU u, Ƞ 0 @wP :G DyP P P) 0 S 3Ұ b@p TpS0 0Y+`5 M' 0 P m0|rF+bO=@= z#@P? *ϬP `&@Ql ?`[A>nh{1 IyᯠAoK`vBLX+a+ sy q0;t@P ` 1` XD Ǧ` @ E": PВ؉ Pޡw v > qM@mN ?TGMP# \p 7N c l ̀L""f Am{'P1-CDPAPI`J&p&HNɌM 5\*K^ \"^72J|^BO@. tWc F U +P U L Op (.  HqA2h@Sަ P ֠ bO   p  t0 {Pu0fPquJ Ӿ`Q򏘰DqPw1~I(D9(%fhe 5 @=`AwžkK.%As=C@ O=0$E52-`f"moxx ؙb߄KN+MPdQPcq @[ b ` O Ӑ  g .T  `uۍt ˎ.> seYp ˮ | c΋V |zYp+P p bո$ pO0ɛ@0d*r,\ʮ#(QE_ C`OOJnK~I0B8Ekp.$4@ C@APF/8b"@@PX3͊ %CHo]D5,D<^aE&H'",̈ 3(; 4$%$Q9Ǎ.'tiJsQ4hW9V^v-4%.Т z &XzMcJPoRdq Yŝ.=0# :.9+cr&T] FGic+0& 79p!v`ՈP &o[Vs?jCT[-w.u 9]xˍW^P— &`2)B;8bI $I ,q8YvQ'hYeVaHcPnekOP1 _b RPCVw, PE)>1 ` 0;TaF7ux'UV :a.p %q8x/;<Ѝq9OX H9b9cߓ:`%h\pu[- P B jJP:|$## 5/x.J+ L/( p($ B $\@BB7/ `<c {E)B 7]hZ!@)`- !4^&FP [+axE-N! T [F% ],7A3l* ߈-tNzXE*%VJ0C|n`a;Աch`G8:&:Q=mw@B ,$S W=z$j6* HBTPnd ET@&ЀCظStAj4xy`$<xj)USX&y(@ ! =Q yЂ'q,dx$`fxF4@ &(& eL  хZF3F a/b1\ܼ6[H*\ Dfߘn/ mC;P/@!=ڡ# ,\ ޠD'Z=v\Xё06_T {Y p}զ`. N?b" aSpO{*AHN`AB(ѻ H&xN H5d ʫ"q;pAxX@O "N|CCьO&BtU%a YP#  <Ёp^Ih:l11* d/0;> `*Qt ڀRqEl+p6uģh` 5pcpMlρEY>,I}sҩ.}+v z TGH! AV e+L28"LC| wC .{؄$p]H1HQ `RB``VH,H[ Hk('1@,Y(iiH3U-51f(aQdX@[y DH6g8]uhg(V`h/0`j24Ȃq@"Nxw8NuXwu8=b)s)Zk=(ۈ ,:|2 X>BoloЃ' L-gmuHEhhQma=[VU4K1ЂWpHKjbex2b;!gH3HL _ЋPR/iu4(rk؂4`Vz,pP7Hu`shx8J@8s8,lv`BЎmP8xy q II`;I" >* =(D$P) +A8E 8 4?\qX=ED$lց="`$ !@ P) x 8I(CH; ! `DHX64ЃeLF%j0NWx؄jTh1(e/ȃ^XIX*`Ix6 P0bRNxNpAi?fXQI2PL*008+ht0/p'0{6(/H2HsXnxxsq0xOԎiو N `1ՈxI)_}I``*֌XDB $P$[!!%BWLAh.0 XGX$83-0O)„Ha%P(pQ.Ȃf-O^(kWx`NXRx8pVXQ@iH%PL7+p.(pQihE/ZkhiIeh$ppH-*؂-(x p.BshT.2!xPcX{x0XNNX)8R@Utܛb,*8 8Q$1 *ـXCI 4BX@@=;G2HJ3݅רoUQ8_iH<oeX%S--*S# a-_llQUe9@h-DM+hGHL.(IQ؄'(?0H f(-K bUK@ߜ@Pd/о18UpY'^@ p-ēm؅^(WHZjLc*_M`Tu<4`j(Hx|lu0h0-$q0{{ur0Sh"jl;espresso-5.1/PWgui-5.1/images/pwgui-logo-old.gif0000644000077300007730000121675012341332513021660 0ustar giannozzgiannozzGIF89a|w  &%'+-,('567&$-ABGGF6"HGw@@-SNMA/fKEOQN4OSUTVS>TWZVWkG,TT[_bM6``]SBE bfjagubd`TgnvjnpspnlhisptvZ:nu}w}s~gJlQ{x{wwis[uu{|`&s灉{֊~ ƓKѓ9ӆƕŚ`Иv˚}wǜ͘Ǡú¥͛͞Ǣǟ¤êԤ:Ɯџ˦˻߷ɢ맶ʣϪР֝ݴׯ˛״ưӫͮXׯң䫿ط贤ө༿¿ϼֳܰܳپtܮչŷǾlj֨۷!Created with GIMP! , H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳF}@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳh.Ƕ۷pʝKݻx˷߿ LÈ+^̸ǐ#KL{3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνVKӫ_Ͼ˟O?>Ͽ( x>& 6F(!Thfv ($h(,0(4hcPx>&uDiHr(ޒL6P.YϔBգ=#;39|y:s7甉dy;ӥXYԔQ|矀ZڔTVe~74㨣Di* $XjivtcOU ꪬZ=3+ijB⫯]k&lX1쯚e =Uv3;j2 鯐,묱+[o`,{, Z jfk'[g+;짢)[@ɢM,~O>gv)$r< F:c?,B4L/$|N?QXg\wW=_L6jg"m7su_-|v#q3'o*t>Wng͗B褗nz]8x3Ժ.d7dZ/ᩣ8>inG/v3Ϛo>΢o+G=9;} {ÀoPqspW8>y48䥮ė@JpOF3:[af0aD8̡wHؑyGH{sKa}EaX,JEu5pH:x̣> IBL"tTɠE2Q pH01|#nlp :Mg9ݑŦp^ ՝p7 Ժa FW l]_2"IzQ`W>m F i(,~As 5օ-A  ? wS>F@ơ7@dLfFȣx~L6f>`1t~/6nܱcF HƐC@pc#9q.~(6p5F0"N-AG:Šm7@ JH'~(pPr,^z|`x\:^Ocﰶ1q#zTc6 P]p 4[&|4T $٠Ȁ0с 8T'{4:| Tp_`F0t(Cv &` ` q[ ud7h]j`uHg;( 4`(HE(?mwhxy nـl8GـnW'jۆ9xf0 N1 `h&A@Ad+[ (XO8x ɠLEX匂n` MB4Kij,X8X,ǍA4 ^ T3]^s&eȂPJIfkkv&0n8]Y8(, I -z ҆ ;`k G`4@u^ @LJ@)xȦ[ &`+P0c cr P ik@ln@j=r=6 `KSИaX@cmA( ډ j 0` ` @IZɐ Ր @ ` hɞ4gs4MB7Ҕ꺮ڮ0"im[P1`e`&m uz5f P Ke 3&0 +E|^0 zXf3hQ '1ApJ Ze Z6=Er Ӧ_хF\JYP ;cP9(PsB I}@ pb$ҙZ`FНM ; z z y;w H x ʫ kP ` Fثk)d8Łr 0 Klpl 0:ݸO`C]^mbɋ{6dpl;.m F0Հn 0tq3J' Ykw{P;Op {٠(@q+P4RZ橌Q-I ی̓ ƝP>W_*f@X5X{X2FP8|0qPIگ.#/>/EWAښ1yoAr>ߘ VG[#JBƐA#- c |#<Z@B#p/ JG[dTJc0Pxh#vh5 +?P!εbHIp'hBоmot/}}u#c4L p^ "O~ П7ixSo_"K. W~Ϫ"qf9?Gp ` iHzc0:,)cD Q@ xGBL8h)YF#J|R,.}2I~*ʛdaC0&E}dóIұaBc4PAtI@`QGbfIm*4tcys*C5v~dꧡ&ISK&{п\k踑: Var^`- j40-JӰl5Qq}Z@ n]w߅7^yԯRh{˸ A֥*(2 v,sCʂfɼ)}.6x4>׺[w^$e}[9%Tb `cbCh8Ne9xn)`7}uDcjnd~N`T/ߍ:Ki (E.$0%&|{GJX^?Nu+74rb'9֝ #ܐG_ڡ%{}fqv|koQto5 \m@Cp)' 륂LhIoܙgyvꝸssqmM~e_|i|e۹Pf4| Ij[ w/F3 +Bp3Dh;}*, ?(&trޥJ7ԟ>x8 *7 @X)s8#ۙяt( P&fH#f2qXi`|.5J RV-L\C!as(%1YAVYA "` xa%yxpp F1Qxi(o "`<1SG~X3<*2uJPe$Si5#BBVXV005i@%uA7U@sP ޱy @ qL_, ܭ: x/k3r-4`עuJF?RLniNPh`* Bq:E\Q[z] Jd [HE :{G T H0f!-# 資Q#>V%̗n4*l`D7A{ˊ7Au3.Ǧ,ly\6GQ tuZ0*5XC.xG oTA}ĠyxS4i0 co~+`"[%?2t (Z@# `>pp(@_0a[@:c(3(x{D?3sˇdlA Q8Ԁ`( (Ѐ|QXrӇk$4F`;ꚅ'X-Ě3%0\9.3%ȆCY#D?Cs@Ȫm*-<@pkRYGH-ϻ0N5{-Ϋ]+(h#d(݃E0Hz/O\E]0,ฮZcd4N}hd؞Ή<sK}ȆQd$l5 |Ȇ{{<*pd|G ÒB`#91Ggd.feTvOUV^d1p {9 `^6]`F\6fcNٗgebbe\ R`!ofkF if%iNflИ羐faVd盈_uvfyfбJH϶ ûœ8XQ4 ©yar^rfx~FgoVigzng& . xp UX-@qL]hk.hh&&jhfnjn6bfd61PYe lk׬J` Bɢk$+d-6 ,^8̪ʶEhI ]l+#׼SV U T.ݔ41м;^mKmGf=s0XXhE .Hj`TfvfzT` w-4Z m^Ykm"ąn&Ptf:oPlMW D=h^Hm fEXAIt,KLMt'H[O q`+IR6Vw%  Pv,%[R0qWuy`a'b7cGdO}wXWHKWRPqCJdeo0{^(-/=M^xw&z%<O~ݣ~(`> ~F hOn(` h eb~O8Rc.xcCڨc2!1& ⸠3)%A#Q:߀dJ4Z@R٣m% 蠜K."%\^c]( fL269ڣ\BYf:(hs=4xh*cPɡHlKcZ>Fh,7zY$kd>P~,(k3쮼8!E=M*]8*x 388$F `r Oy}BL,G:1!  g"{2)2-21<35|393=3@N30oXF1Msaޤ#;󎪎~v=D + =Zvƽ6h|x ٍpjnO;ΤE:8OhaaCtk9{9衋>:饛~z* ё`5m7wl2;Эk=MzvXsq7?aǹN7h<9b Oӎ>?? I]`F*x тR";gnsL4IPxrֹ< Joy=q^l * k$] c(Ұ6avEyZ qcxqYYP5'mċԆÙ nw=8Qi=5n|#Ɓ H3kT*@9a5qUSU5.2gY<3zc 9]hGF<%*SU|%,c)YҲ%.s]򲗾e. )F1;vu$c72cPV2-s^2,1f>3Ӭ5y@Rэoă ؝+a~͞,AІ3}٠/K>pqISҭ&:Mi[fZ>]iM{S}Kԭ4[MjYZӡu)c=\֤5_rթN_'fuS=Rx?1x~tJXRع6?̭s{>UgÛӵ6IMn|WFY9fHYE/ZQ0h4ŭtylyӚƦa ad4&OkBspg(o9w\$)yer<3)? |>.'y=Eyҕ.Pgϛ^u5jb>tJ_T?~6zǝ15,&YdB=;mM󪷧Y޳w^:w'\z$DFDN$EVE^D4C7iO4F:HdG؃IJAK=â)8a%uCM%XP%YY%Z%FX[%\ƥ\e4= D:tC7CI%``&a$JBD1EKbRT?~&e%@^+`@tg~&h&hb|?94e`kj*d>+ 'knv? pgghg-C{}49xnNg2lb 8uvwjV=C9Apvq"'zvf <؎PХЌ x57i lfg(ƨF"NOA#_`ܦ.)6i+C 'q.Vi (&P8xA8)dAf:S)Ʃ2p&Z Ĩ@8)Ü*&j) $VREB5~Sefn*vjCJ8\Ch(*@*P Ab]杧*檮ZdAăUžݹkf &.+6>+FN+V^+fR=9'*+ 0(B6|֬ʶ֫+櫾+k"0adQ&j6,CƯ~Cr=/ - ,'-$:%/07?0Y1pi///#Piě1 0 6vdC װ 07T- 0 CB3ׅ g'1a<~ U>9!WĥfgA(jq҂V.Vqu`[ꡡzC*:Xj-CrqIS 6qVNB$$O2%Wr4$ngZpފ1)]1*2VQs, P}C02ѲRr3C-[4"+¹q/B23=.4s<$n' , n6ОΜl&:SHՀMQ (`A%Ȯ75utHvb_e¶8Ǹ8?ySg6bF+T 4~t8_ XB3|H?9t{ZUV9@n|"wEX>Z Idf 9V9:DU74{$Sعø3#>Dx^s񏻁~)rn:wo: |:feU 7C;@)rVڂ[1zE)M/x9.??&U;ġar sLTD [!{S];go;w:5룋1zcåc%h;׻;AC _Ԩ<Ȯ4ŋ<Ǽ<׼U<¢or:zk0ݷn=A[O=S=;=ǁӣ<DJ;<>nbY>ZC]7}}>C>Ήb%& kwG>Ѓ~,H6/%B}( vcj6v> \T9uUQ ʛ㴁RJ,@B'PS8JW2P@⩋lX;zolz{8?>@2f,5-5oy[P5c<LGtvͻ]3H ACaӹgO{ hL0[fEONk "h2m\O;lYg>6ǪE՛ɜiջo_N= d Az1,zƾE?PQ!D҂ƙE1PM9OA UQI-SQMUUYmWaUY=퇟30p'Lh _up0I9`miΘdͺҩM z{W]yiHJ ds鑨fveux%˪˜jq\V>IswU9~xIWם:NY]aYiqYy矁Z衉.}gQ&CFWʎM(Q'}]Z9[n95)_f[;Ѿ d%0*K)H6́d⑚pXGu$adŪNq*S49љβ#Hx593 Z0qD0z?6(_@=2kt+iKS=g]v~𔚱({;٨F{Fk -I^:Mw߷Kp4{[΋g<x8䱒ʋ:FMny#p Wzݛ|7|/w}O' ],[ƀ#A!lXCqOKDе5\V=_tJչmr,:$ l^a0NjA D!ä/%fcp0IA;]*q"/q)c-Q=Q$1K1D1AQO1&'t.ƥLd\ 1u!lC&4@N/X$3bdp 4鯎d0@z-D9k 7'N Q+^KP(Ѐl)ͣ6c)L,JsĶ.+C"Џj ꊤ)t #g[+B]:jCrRⳙؐ4)9PBAS _5cޒ( =Ec P^àvJ3S|4H7e`@5, GA´LY5ZO##3#uZ3Rظ[W4HA\5]u]ٵ]h%X P  1O` \8g\Haˆ,fa|SJ)E( u:5Oe<%APMT!X#bjbzFB T ="d,fI`'gO\m:8$rghw/iviꡏRE*+pufOX ЇbOvb֮΁&nvn6nzthxۼ6C{oy4oarHppf4b/r(x[|Hp&(t">o(WkMuuowh&@]ufDew}w]Ѹ>3R _QbS5;3O.(iUvVL njOJx||ϗ|a}˷}SqMh=5c!&@rscG`]m8*G .mZ6D A8S⧉-b ɎU7f\(xgC}*a`cUUVDžB؅OE5dA!vPLL #N"x8xuxfzD I Яu-!HL*,/#lj5ڤqS°b,SbC6 !@ !xxnXK rK,NzꐵȌ6>l. ]b ..Fm_0R{B%C.^aa-vB-*%&IXٕE'gY%_U̕cs-e-2MCY;TQ-L͙ٙ=r5˵rBEaADhפd~l9P ?084)cSG9,J5$'؟LC ÝsQR'N pC&O)q :טes4RA:3Z ^s( ,el++<ky]V:!e @& ܅B9]^R+J d/LEar57cFmӾ9%̤M*]Yt'f)9hq'sBu?$L #%O}tH3X#mu9Z)0FR6Q=4Y4eM㌁ h*`+h QLKq5ڤLHrEOz)­I1xH1;{(!*P2iƀnp WHS'Nqj3үMnlXCpԄ:E,7M- 'N^5Ȃ5r8$F H[2#:*= Ɏ$>4A:E|(iʯCCMKIMDOP) %lqCb51yǟ<ü?O>C[RE<\'Esa9LZalZkg7դ>һu@P* @FJQ|5'ra viH'44z:B)o=&D't}'7f5TY gIDCɢjƊv Ş$RqُAKX'M%|ߍM̟0hdu;Sj ȣx52H;ʿa=0.YDtKVETAL\ʝu/K8*&y44<ɷ#7#^$UYMqBԶ)`3%#{zWǁ!Ծ!v#!>"KAG D?C>"L ]!?%'&Nh h`PDNip;B4BB4!^"qD~ b|_ B"پ?uJD\vjQl5njdݙS*X5_*Iޣ!8BA=i["XmLPk=z赃/^7H`*ZD&Zɼ|X7/vGl=|'޽vեdI,E-[:v0;Q-mTiML5V B 6رd˒}7ؙjznιX"1f7 !C[5vjBVהi9Ө{2dLwV/ٴkwJ 1zݽMqŋ ~=鳗 q ,` <Cqٻ>ۯ?faBw HA"Р%<ٸAq>=У>-P4 o! 8Ns)x@=܉8wp1 l8TOX% C \y@0@by P@A;X>IWjɥcP`ґAY'[>ڣh>p s]ifuQ,Ғ7cϓi rJf:d\$U%$c9nz7`h 8=*>LND˰<Ԛ6en o+eQΙϓZ7O3j,b Ks( +_kB=.1ì2=Lr_*r0wL`y6ߌs:(ss$C@yI8^PB*8>-_uZ5PaB 4xGl@E2@!@ΆUm`;׬x5ۼmxOlT ߁ۼ Px Мx/4;2 u;؉eZv|R`Ùl1zT?xv fƇ)>Horվ;4rT{}߽EcQ׳bL2װV}U=֚ y$z*swYij0<7l|E2ꆺ#+_=X+:*#N̄*l Y8 <K$M\0D,"zpGmhd(v,B@f-!-v$48q́>(hq tGv ٴx3-@1Dbl7lHAc:6hlf4&V*f]^yW²8<k,m)v`*yp9qirG/x{p汉&mkc6x^8xʓ{㞧-hG^t܇;Gq4 d#~l0XԢŎt oJ>AC%P{(71Aq4Mkǜtx@f-t46ʒ笞LOOZ],:zӬjPjΟJu&fg#y( לAp$+p!!8Z791M44{IOBsCTX™kyGiUX0/,Xvݘ_I,`: 8Ǚ:eψ(p{fg@@~N_J3`B^CO`B20\4=1Tִ.Y5Pw|p_#-zl{zPЈ.4_`}jy&Xx:w ?@>P</ZH=y&}|&`- 7| ɄC Aʤ*e߈oixMHkO!A+0X'#8ܔpNb^p8ȯJLpr.<⋖K}Tկ.NkQQH9&ak fR7F[/t 4֐5#Ge3D- ax !>!mp #й؂sǏ0bPƧȭ"l! Ġz!u ]ôMmoEp@rz e w-R`q8u~1GpQp \v@Hx`{!uM"rxmQpia#[{hj`j Jh@ 1}79Wi pzQoxu%Gr~4{Gp4@i@gZwj6Xi}|6XC }ss; Vilox~HXyfnt@:('-;BqGp'&^ '8oxrp^G)rq"xx)qI)lPHٔx` 6Xp:3VpXhp(1$(usQZ 2t17AO0!iVr"01*,dru6UwuƘR7qU2؉vAUq y_EqY!ovY )8p$gxv@Sx^vbFtř 7VWj{{1ƐH ސ 1`{帐1p&r=y wXI kܙX "bcyj&"m0/@WWii*&P^#I@7+j4 >p;6(@U䟓VX R sLd.I&+p&8pXdif)M^1ƀxX=i,bJ p0mrOs:O9? R`Pxc@h9nCqIGy1p/P(DzpM ¦%tZk"nTJnIa9ɇvʇ:ʫQxxʫZjNjl0sCnrb>t@s*銮wZ2.|zXxgP^1PRWLjcs&+ ~ơYzjޑ )i Pƀ PݩBN{v9 b6p@;iXRVW ;k%nR 0 l jY Pn&nP+pHǶ::ij4P }yA v'ctL0zaV1/&!tA OJJ'"RA һkKۻ[K㫾{﻾{PBP? &RB\0lb %`VU#op{||KA{&>0IZz WLn7pH j>6tC!T;u@@UӁCO*'QD mB+Dԃs?1DWA}RA 5+@O,M=-#STeReU*:e-` ;[69cW<"!;WL0+@Z 3jli40ԤNw3GAU`]P]=pPZVƋ1`ns;~&׌@ac "`^&rBMb0?(ӒlD6w| 0 0P t%"PY[ӼLQ Y-":CnIɐBWNFJL<&}/%5P7At=4#v\A8tDQUՍA(tH5  mG0RU39TvߜA1@1ݎD5rb}@k"LDS#n .@T(!Ts$%5؁}`6y%9 `|Q&pi̝I@҇ pӔFz;{F4?P=W<RGH2r~a : !9uj Tl̚G p "3x۲0F&rOn`Pנ Qlҷ; K:Jzƶ~gɛ\eͳp.0. qMtoå\Pq` @!Ӯ.(_fI 7ȃYJdaf!]ev H CՀK7TߔXǻ-jAXnal?2pKK˻QXMR.﵊5O9>Yn^K_&NoseS3&O<y'baVR6爵n p:X2"R4C_iVnh1%Nygj%oJ "ᄆ1?MPc 1 ^@T0A~ @ܝB`Pp`66&EmVP*j9?JۢTΔ EW 8-80Ld ` ` v]X  @.a\RVE˥{޼zI]X”7p'<5у =vl'`j馳4{g:.$;a0qn7ZFPvG>70$% QGh%p @q}D`cbj:R͐J9\^{faL{`p #]B+ukIK|0' 5Ҙl"JvR=Gt '} |PL4t9'v9'HX!X!QF{ɛ^5oXVePQA.=  ] 2!^{K(}_1@]wJh^__2Y *F*I. eGYs(x$*7OӹKKͨGN)j*rT6C 0R٪۫j䡂@\|e}0V6<2c6B{2ﺮ^0B6J;$(0G$(|YJqA ^pL=b :-,5hJKG6q c$7b@ģh@T;̵ؑp0D+laԡt&byqPP&Z%-]8;Ѿ /V V@"PK19Πu ^kX5$2b׺ HHB]| ,"DR:58$ZS%\fqYRdS2f9kly.N5[ dS#rr¢A8TJyG7-XmJUHp¸`Ǚ)yx^ilp)B@;=뙲5(k[V=zq MU[ڠWS< =y7:0$X@6M1&Z\Op8dCуTkJΞ5 5-S<\B/DK<8g8J9܁DxИ0XЂ j!T{ e\۪|=Yy1=ΖGe/ړI3:;BQ gW&q!rHrS'/zrPoa/wȠ==YO{>Ѐ" l#: [ ]J+]p=a .(tMao(qՉ ߏ Yph#3xtZf B5:RLq!6 ;%%,1Ycz¹tUTĆQahۈ>QZkXqjs8H,~r$JE|a c/[ɘ`0/ІCaJhŘbƾ N3t˙ũj2c6w4mtJv&8c- , fZؑRy;]89I-p gg>9$8KSg=g)!&Tl̕pBܟ#TT@6IO -h>O{h8{O#t=~ g~%l^()ui>ta`dO 7 JG}TpFȊd;64Ln> @iPo1}Acpj@FIq |;tY,A@jyL> >?1*H o@xpDN+ȇ!$J$/2997|C8|J:955CC8+!"x8>th 9H(Z,>#BBJG$A#"D#p+DHq(28AJ/;TC6C9Ø9|PKǶ\HDFt۴Mj(V$F@SES< KEFo_ F۔ {NBtHJK JAdSZq42al t"ˏ{ %4/-iY Ї }ALD5鐧zȇ %3R=]*lp95tCs88$$Ӕ^5`VbU4a _t/d-V6 ڶ}Vt@ST Ù|H<9ɇv:HyxJ?]W1x}%Cƣ)w W8,ju @@^ X R2&H ЇqXYqٔS? YUI%ْuXIOՌX9xAP(E=Eُ]ٝYUZ  ٪kYY4YYY Ce[5*p0`IQ`Ӝ!-598+ӻ7ZQ`eE*D-(!r06D-81Ց9UZiɼ ؟SeT$} yܘUQH @ʕ  {Rm{ ̈ {ӟݍTɉ܅8S?-I#XE*Mfe-m_@ex_SE'VY3%R ɍz@Z1&Y8J%;8 UQ2x6Qئ[ .shApœ"h+b#^=b%  МٳrdK:q$zO140#t$b T*gS~c8~6x%c/.:0c<<˥ j!Z0e pzC5?!*4 sd3Q55D.1U7 ՝9"p!Xu8(^ZsPu ]wxpZ`&h!6=tŒzIm.%QS͠ }%_U(, `5#70Zjݯ]h*$MB$ץ&U*蘽)?y)[{ >p;&}czO~#ic993m^;K`tȨ A5.}* apH87ꞨX=y6F6QXI:Υ;vJ᫰#N]džS)i~[fs!ExyӴ"]DNp!%#9 0{U6V+MQA֥e Ѐ޴s_&?Zk]:=EV7`"P֘7^J 7s2 {Aw8XBuRIwgY ^b1T`8^$zihu_&9 /,zaqc^9[9q۟)שzaΦo~aM]=E˩9 t jwھVq0(IQ0kqs=cH8s9d37&ؓx1. EK-=vll?du;֧lI;(K(Kקq[ay$aRA u8\wxQ*][ mbu0҇Q"nKxM(֍*2jps7ʊ*B]6wx馓6 n.jHY_jI瑬#|3^k ָ3RsxV_U BQM^ Tiq 8e2$7yNqh$9nyO`r y:ۚ dlAY%Xћ b=9>^>H^` n t(;>rz4Xq0;c;m8pFx9H [ۆ ;uh&@6Zݖݑݬ&}ۓ c ' } N}|}}r`z(  pd-Q5}vsxFjS^ z+0m26Ѐ2-Zp̲8L'>` p"<(nFѺvx/cwу޽y۵K75cfѢe,Yq(d={e PE*X*lhe=y$9ڻ'={>4XpN1]"{Γ J 4 "#.dvHP@,y2ʕ XlȜ;KL`%J5-z ٶt77p܈cF>x*ɝg5cpM']ToƲϬd؝.XXHsŷ#wﲟhay {i,\T[ARXuur8;D#F$HEH[Q';0N*|`o*z<{٧}3gIR PZ) B ;>)oi? ]x a1^F) oW2ר5sN'(Xcܲ/l,&q>vl] -I5FgV!j=}> M31Ҍz>8렓>A | n9<[ZI88!3~SawuMO-2vx[X"436Q.$zX~tKިȔSNMN]9{ϷL|}>{Ow!aji^&௏>w<}hU05Z1b@~1 1]>|%/Bn`,1K|_=QO'I8lr"}KGE-(~18衳q/|Pbf!^݅,4=-1| _:P1*c{PqCz9J,fr#[ f0_z#}h$`C"2nBK8XtDl!%ɽ]{[d G!1^H@BZ7&0xo ̙P%8D2e;=A3Ҝ&5iMiR״&pD_^ 0+" ,7!i9 b,k5F|%K$&'ԧIBR\Pfs|g'u9Qas\.1OO*$(ޭNvcJ'oARإ22E"rD Nq ,Ƣ̪(AiAP}H2sÔF W>ڑ v]#HƲJ׻#&C]SX<>^40bP5n@BF7^ 5Ш A¨O(mY&G6İY4+5Zl/ah}`nvh HhFp /0 8dpAƷ営59 @A"B40,ETѩI 9IQ͉H A M2@܁|ĄjHiƵWH2 CmDdP#عʡl!zxV͉pD8C87ȡ M-a b;D݅D z]X !=Y.E]$n끝DYD;PZݩ ԉ(U"%'ZGIODl DMAB| kY=XTU<&ТhTJA0@ A : 95<á!핑|9J)==&;PBHߺ &ĠVd5EÌBZVꄔ_]#RX _ݡ'8T+`P07  ̤,MҤ$MAOL$OM* Pc<yf[n ԤLM^Hѐ qMn\P>a;l <բN 4V"!j &b= Ra($/lAxDTdVbfȇ4m<KU6Е9U?ZQ ` 8K5$K$j9ۑD:Εȿ\K #!_ޝCw(\fH(e]m ^ftnE])"$⊰B2gԥvtv'-AH IMrijtX<ԫ`J72?D;\=ՂJFn6VUVdsNPXš: գ͠s-P=cV<QR(AYHeT Y@Az DF肢LIanf1&At DAiB©)i(ȖRnƷ9gV J䤮Uaa֑%`ZBLE$Z"V-B&bm*av_V $ @Bdj#ytne7dNvm10Ńꄤ DB$,4N0]C:$-D2L+aV 8ΑLkF(&^vG),HʡgkH!}¶g'~aE]v'ۡ]J||B'}Em=;PHelBzx"JD, c cflvo 1/>qGl;Ǻݭȳ=^qϷC=|lV\X@eDtElq>q>`G> E_èC4r,l݀Nd6DA r-te5rRDA8>CKAU)8#ߎ_SXHE,_T^C& }L-D6L6_sL|^38gs9#b :#*n 7&8$ F :46/$|*ŭԞ$A#;?IzEz- Ä.{rÍ G{3'tÀnʴk:,sq=#'O5Ӑ>E8i0;<$ă2:sHˋ M{bW A 'GDN~_NA!u$5qDs!4u94F5CvCT ARGYCyS"iO$8(C!bXPQ1VY['1Q=`B]<R:T6@FӚrhEĆ PٌyLbKT@9@EBy8P hvÊ^z >ԋG+M6i+y,2IzG PQ嚪OsiQDjX/O=Ђl #C6@<{^xh| ЀSD\8Ht, /]NB5tB$0B)Lkb74+9T@V IMS 5DTN<26S\TNJKk?4꛱xQ+\"A(^Cd)+>`› ()8 \p_!^Bt1\y5#{#Ԓ^d)ES k!J"hdIvR& ˖-=c2hjع$~CjIjhU)қ7Dax\:xK7{7W #;yٵ)>ڳϭbMx6,y%8c% ?_81*" 3y%8dIGzd8g""%xiҰ"Gy*ƍ0hH-hH6:1 S=P@6fY!Ȉyt`hN>d a¯M'Z0QOVVb=Z"Jt Oh>x YYkH-ygC!\5"(Kyڌ34u׏ "$r\xyqE|jGaJX ~߬p`*(ͱ!#ȈˮQ&uԌkFC[RƐM$62a2X"[ Hx""ڰDZCyj'`A;vʍQ9oh _qNNo"eHgιHH0:(ofi9.5 [xFkwϴ$QWkd0XƮF!?h#WRҏrF%7We~saJrI'&7LIeNv88\I\s-S쵁>OHb.?N7A <> uy#u"O@ \a"87ne' W#.yl&:;K'd"ӝ(!,50h:y"rJT/~}q*Uq@ t*ZP8 {I11+\`Frm*1T X^L%,<,Rd"&q^ mRb~ qGtX9 F O3d$m opB;Ap_#]3ff$G9lCƓ.t|_:Ԙks~"SD(9&2LMIS>QzےT=FPl(%Q8z lЀ NjOi ̙Msb$x rDQxXNbG'41b\}|7:. quA]WBذ':6vt`@ Ē3Ub&*)vKGtCB©3bk{CJS. l#A,h8>upg&xu=D9HϾsd$ہIHTl9MҊgb{.lA!tԉS'`oHF/; N$zmd}È%E լO݈\^Bըc޵y84Z.Sda;G8IdZ-t!IV\bK|U)mrS:}Aصm 78) ؠ ±pUJŖ܍΁@,!2[ ~Ec˜Β1$CD-<ΐE-v+Jb%Q hiCXtHD:3E*a d+v, Jv3vjZK"5iKbkRPč GW53qnd\J$}<@Rt$Ixյtp$"@*Cށ.ۃ[ӯ'c}6;R'J7`Գ3~ښ{HHjJx!#6ȃX\SHj{K Rw=q~ 9{qJH|64@dV9&wtO mU Z1 R $NaN zeT"@2`ߌ!%AGR+&m"[b ̂ JԴ\R*\M \0,d1{1#GB-܂qrd'q]iy.r/o,RA2-,, />/'R2q1 ,/S11;l&/p"A5Ws5K.D0#$a/.D<@oS"4f? a''.w AgI!:0SA&a/>)d,{Ь:Bh w>?3@-t뢑R#֌܀ VO 4 h䡾('nQ `"1?@.b#L XI AJC JBA~T64##u ^BC$qA gIAsKBHTO4PK/R 0P@/@-4_0,ƌNMMO1HCQ.OMS1=#1 0; ..O)W%xVS R 4nO9!fԃZ'="UJ-+tti>0%&#pBB+t!N 5NN'aU2A;>x>=3=[:S5VV]YU2T<3U%NY5HabWUc:y>#G6Od0`{ mrpB"Ld;840~ "1 D Lm*X+>&" ܠL`֞ 2.D J({$W`&0,$*+Qg􁭐jٞ$gn~ V9tAbԔDv.nA+) ub)*fQ@_s=ΠĐjjw3 J"1"JDwWv"xx$"hSa ~P5ֺzWvgaXa0/ۨ).gI$xg7auF;5 ܠyw?|s\aZ?n,lᄁzjE pvvk.gEKykM&xQDyDyKMJfzg؅dO8c -dKxt8 cu,AMg f>msˊƊJ;nSRoVϬpڮD"nDBW#j xh%a2tGy(# "܆+Gy!LLV6L9~h%/m K;DDfIEPtCw)X_RtuBu=w) Aw%2fv-c~^Hf&9BffV1q$ը`+i`FV10 7ֹbFB9\]~w>ՠ`tblp.C8=o ƽ ->F3 SF|dkyu Kt +Q&zR͹/EWt1 ,L`} @([d]$SdÔ8F:a,97r:XuF- @I>ކ:{K5͐5U358n$-+nE'3a8ZXقbR`L!7A"F;;cÊٛoZCfWƼ<:pk?lTjS\,VT͊JJkJ\c\%Nh#Լ!ۊ[PeO Cc- @[{E@rh=HV8YRUY ݅ ӍY*lGo1A#%#8S x\LfF圎P[_uzFJ*}0%\^ZIEca0쨝 )隮F `e8dcخ]~e\˞q̟qnBƧ D+Aם(6z;d!.alhAt:.Ϡܩ31rg :ka#j ~G^]ųis 䝞fe.ȯ}:lNJ1!` hbUNXV2X. HnJ͚  ΀,1<  [>R0,Y;8#UXP.寑y~o )#9-Ӂ}#ּ[fnd)u`uBՠۥ)Lj >B[B:cF$IȾ&PpǏj|H\|; 7pص];z :bvȱ.X`D˘q JȮy%Ukɒ۹&7i3ค-#KHh7lzK8a6ZAW{ HN݌*yDzқ %=ARlp40%݅+ExďGbê3;pϠ-G\,]*l_vm Էo_1AAGNf\A~)4Pa5qdDzI 7PA'!TDF 4aN@A7'%3 4|y%l0Q̣p䱁rI6`t5 #qg\:UgdUX`p |  ((*ʨ*@HdP\5DO=4Gui\Y]l ]Xe*^R:*F !IQmJc3a(pEd7h9M9ȔO9P@ErQSMSƗL6]->QT<3,&lSO7F*#X5&1l_$6QK ֩~窮i& W˾ƬxB)C3VL7LsZ"zXAl<KÓ 7"qmb 4΢qGX-פR#qml@7\8>P]x %#SON I xմ_b7Ȁ>(ᆔ٨ىӲ0;7@S⨣MS9@h觯~:-H&פ=yYܑ`? xŽVL`!*Qk#Ã1 x\Os0R1a E Ʌ*x=9 uf> zTʙACo YICT y#{fWVr!oQWܕ*iG=uI);6%Nun#4CN" M5xK\/F͎xE:~&4 gG8nO7/}?a@3hخZ"1]0hWpcyRG:u} rΉ&kwJ'?QD6xl>> Xy '+;9=Fi @"Iu`Kܠ a y@|O{rІ:RP_2!J#˨Fz H6o(- #u#QRX,BB@ޱi b :d8,#Lc8#W Lяz)R2I9 R(C%74.^Ⱦ*~=!`˽9 2uEl*WjnOхځ ݲs5"Q8_L& </X aR֩zamF"Tbjz; Q;.k&2_ȗ$S\ *YS#45DF,vѤa\pY4D [! 8TW0U+o d Ɣh%**Nj4S4 H94fx3IMKi!LjRz1$VpOəqn ^!SYYjS0^eG,xcn6B^NO_T^[#!Q0-qgA+ `07:KqZ;("`27%b9Wp 'c$1P `[L0qB!Gb)Q'79qn"peeff3v}9- szRS(af8t(jHeHt(a>t#|Pwb` "O.~B|,;Ww8+:|[-;)vCd0smZ~@1SF-]am1v@q rzwz! W4S( 1-wit  aAW{&*wȷx3u |Gx)~67~ˢk:&|h+WϦ\qǀ4X&;'NE7q_dq&)X"03 `(B qP@Ѵ q0z=c\: P% 僑C9&`$Q/ +ӡ,Qb4s:8Vs3%>AG((r듖oaDch )6 ~}v7a|) Q'u!Qu7o)8| Xw[P "!VXx'ȋpe,pp1A /.a 41@`@ 8$4rR a$VsXyڹܩς3Wr+_l P;&$]Fp@7r[$O%_C?b7hDr PTK5qV" = .''8+ ͥoQ96`7$$-?!PYu^Jq`[F"!q,ʦ)4PХ0b:dZfzhj@,;P rw*ixO` ;*7_ʎ55 4ֈ E }y/,'3&s㠙hᇊ*|  p ggNzQphi<}ecq0@*ǚIlD @c v1gRrH{"~1F~y}v:sqZɈ>3'1ѯb(u|ٙ a1+(D:[["7`[uG B4"p(K71`." );!%@i׀0 &r2I 4 P BgO&ƕ 0 ?Er5yI#.980K;> &# (;z;/0f,Y*aԧ~0B= UpC--0-,0(0-0&0&-˹ [K;/`pj X` OEлۻZ` b"s%<k7*`)k3"hODPu s/j-Zhpz؛k,w/(Ay3wFRfOxB;E e!0` oJ)zMeJPA"3HE3RedA SG~ Y+<KA\E8FfćCxʡ";" V|X"I2sQg0 Bp100UXP@Jдn|{Lo jRJqe$ٰS;q-vetΊCY H-ՔZ1~K,~+W}^٤ҪmӮ=c٬=V۶}۶ P^;=n@  ]]T y nnzȍQb lƍ]Mo;gl G`2Pmt/@$N;=!7kP ꗅ1`r`a\C0k1&@/@0'>ANgP Aߺ ^; si!Hj Pn`CNܿNYW]N_CN#%sp]d䮖 FvNY`]ngfo9$Hv2|>`b©衞ƞ.rIeN{Ğ!~8dQ1|L6/"<⛬᜶zV ?9*/@̻| D,o%"V.l4`1`Ws4C`m,+o;ng?P>Ɋ =.o_ 22oh_/aC@o,x c@h0B)*4ذ" ҈A"))FH\SL5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EmݾWn">śW^uX] %W1[v5t C uFAf~\AhҥM\խ={gڵ1f Wltmmbr.L<Ö|ypۧW^^xZ/^dݿ_|dȈ%CfUY/@C[ ? 9ϽY>Z@QD<?c1WHDfCFq )G/#H!\c:PDSNEWjYL6dJ+̄ ۫/EpA m$L2ed4lcfKM3ݫ@Yj?)j\Y:P%9 =1ܰSk/M5;LT@lDL|Z#⨓V=;3D-U6]3OSy%kF[oHSe/3ZW_oRdyAd,y[}8`&X|Ǟyg{'b{睆ygy%~b{>`'E=8yfY_cGf{9Ny~GxivaGvyy6xh}y~~vG{.mf\4S<%V;oadFeFm 'uGiqm&q!dkaזcC8h׆X~1gva6w^QGA^`třᙘf}yzgya蔱{isi~svikO>c}wwx)V4C}m FF4!,b*3 $H3ϝ,;A~G;"fO !sdv3Fw8x9aqT z*{^1tx_Wxpat=aUcNC! 3X葲̝ @r5&O$inPGƞ(qs`81spn s:W펒sxkܡ:GB6_tDuTdwDV>m  :^%ʦ3 1;61Kb(+X>IƉ dR4&2;gk&Ȥy*b'ŤiLۛ`|t 5b>by4HF#Db'wusP4K#pf>6]~4/yˆo}Yu/ڏmx?O#[4XZ%ZwX0 #]˒{,X[ nu#.Q R|K2*Є2;4":9rt(Qm@Ȇcs礶O#+kaf]`ɸ(^71=]Y!Xɾ=5ءō+0Uu']rCέ ! %!K9CPv d _yy:O|%a%}ʣ:ȭ5s_ѧ~BφG3.pް6<ώ= `3O+>R=쓠^?;6jS?@a$4JL,rD9)\AaA ADA,@|A99AlAA!LDBIB%,jG؃DpIGJ؄MOSXS@*څ];|aC>ѱa,$Ct&-dF7J8J"*hQx[DaDdBE&ªqD%tJXD h DThKEͳL$Ut=p(EI,Z!\CC;Z τK|BIN 0&O0Aw`-LI]\jyϫz,ī,v5(0pl7`pXHL0ly|D Pmtѕm/zOg` =(07p#XOjJ4DAS lpZF&tLkp >m3<`#DklQƩ:edwLvX~ &؃{=|W;#=QBL\9ͣw(TsĽAc7E%J!&@8 8L8ЁS7XT8]LفJTQH7ʫOBF x `a-ŲBr Bq]st(LP\Lڝ7%%- hOAAAޥ^}qZQZz_D]AƧYKxϞP(-HЄQp8CVb V_gEՕ]h[ZAųaޡ}UWK؃QUT@"g@y_U%b@z^lLuR3[5}L]dJl _UTVa`lAX[!rȆ/|OZ*QH6duGeAٓSl,9n5i5lXr@]-S˵GLTFY[FR7Ik\#gr(rP^2AX5zh}Gp^μw>PH0Z.^h4 n_F 5^5TEU[hs 3ЁUSAeΖ|&krvGյY((W ZI$]dm\ #6,„$N2A/NEƓE\'EmAlG,}=00n%8MNNÊŅ_ț_LCcxnQvD\կMLJAm]R8k]Uݢ5XS>Mn8fL?h="%$s4KdJ~^At=&XAh VHP;Ngɭch / [ɒ,;T:MrhLQWidvkF^SgifĄX;bҺ%`7x$nc[MH#qlqKoJ< Al;c* f#y?+X7K PIoP~,QsR3E{?J/k~˜r@d V10;A`6(t>a߹s$i Z?3=CүA2i[k9JCRP tXiP8?B,L(!A3kc!~q(8K.U8A"6`8v˗_,.l0R1d/~cƅkVP35UGt=eu֎] f#؜]XOi}܀#M#} 7pb)J. cuMv ۬Cs5\~:sMZ>\-M`A ?xm QMb2'B$DoA M̂F !;j#J`F,s5:!= zՔȎ<}l?*ЁĐD! I @B%!Sp8;*T[GɑTr1u.'@юx@h@N]M)yg 7T6)1p"G@ @A*PxIV Z B$ʺ.1@1Xځ]0ȸ)3kjWsY 9Ei0Q'`#qj$q䨚YG-GI[+E"gմ]&l0")Φn֟za-s<,f,3ز=Lf,x33\|f<qs\g|^39Є.+S6Z΍n38=(CCm)< T⢭F=*q.p QҾٗ|4[@GIȾȵ?߰¥2JY Th"WXe_W9C5pZB!#"tB) \-~rT/(G1`ߘ Y =^a A]PBC@!Kɀt+A$ lt-HdITëBON!%\xDԊa1HHLO"4Q\aD5ÉSA ܑ d 5XH\B5]m]TCI @U ]aY:ZY"W(!%#`BNQ, P#BTe@\|pl%4#S iD`+X-]`EH\"Db0%@P5eU݇C֍Y: Xǐ8Y ]A] ("6]XKX$jU\ K١OnMZLYٙ_uYQRٗuVSY "ZTyqߖaPFO<7>: "|[&H&ppªB+N+x.qG,,G.TCJ_%VYLkMʴ% r I ǀ'a3$/p, HIM 8 6A@Q7ܨ̜͙ %+(0.v[](Ui&:6Ɲ" A&,tI֜ y3dDT]'7pLf{ p J5R#/H7bXGƦG5,1!ҎؖBXoM -50I,B,VGd"#$.ie %f%Y՟RgjXޓ*d2%*eSWd 5$Z#$# B"e.\JB'%'p)`ᴚ)_`r*b?QYr %sL l\A,x,Y%Hf X ̵+R~ğNc5bo٠ݨ%/g7᧢8H$h!2+(EQ Y`1x7(aJuCl(AUA&d;dP&0B(@ɽTL^)YzC,-Jg%Q5ݗd#S-# nхURPiAX+ \U\Hl❔'T7 ܆fbt!&hk:SiB$1IOx}A e#d/:ںEZ#'&$5);t$6]*-v q(|o2nV]oߦ^sկ/=p^= ps D BX-qMfDN%11 8[O0CA3c "7eV6D60C-`(`@ 2捠7pCNjvvI _Kh1&tbr0E0I?lsi9)(ȣee)uxic?Ju]Ud *aaΆ0qo931$+4vq/k (+':0RP L~ . +VCGS1Įt,Ai0)Eb$IjP=6!l- =58 ?nv\.Ht 5v:(}=@&D@ƇF F5ޝ +^mxDJӴ~x&bL[#Kb@#_7 &TH!.d ?P(gq!JN#^^'9͈ȗEh׾2,kEk'IwSN9lg>[Oq㜧Ϣ2l"p`ږD8bp3 bzc)&8p3eWkS,uAqTf4[B  , |0d1|PGj#`l{xV HB:-onlx"= u`c6uADdae^t&ɓmzkl7t6XvG5.O=%1nf/o& Sҙrj;?k۠[f-D&I^giXN"c2m,j2DУ#o2M&qꞌfk&Rg 3:ZMxP|A֨r@ ` @rćA!`Pn.AhNneh!ޜ A,.G "p M  䯈O nA,h Q Z~d 7<.*P &, &Qkl p^Ol^!pjǂP܌ǸBޚ*|DN I0(@ pPز,(0֋Qq֋p)YDi!ha-( pp-q I /y 9ip. *n۬OPN.1ϱ$ e@p16 Gq - /upkƧI:|nf/))r*)***++,,*²,Ѣr+*)%-)b-"/B*K&er."h&205p"ã3$bcI`,ނ.Ѳ*2+i#anpJ4ppAb p ~BC4VaI@E7{NAr3-8C.؂^z"5ѱ3I0O8/G+0|ơ.9w;WAP;F=EƳ ӱh_htH@(>y34F4Ga W-?"QuAQ5R%uR)uRQ#)*Q5RSQSASIS7URCuQ;5TUTWQTKU3TaVBT+gc0,pԦ2Cpp44uJʡVMUS95U5[uuaXoa|A5WsְA!a]A!)d)Ari.d)5*..١)+_5a5Q/4a!V*aa2Ҳ)cBb!e+#`RfTvВk B)VVz!.*=){d+Ve6jƯa^V^_Ҡ.Amr6hcfZ,.V3enc"r3B`UhdliiVagdcrl)_73grrs)viu+/6e`IqebIefW+kJBjU[U5VuZiwwUxqxU}ZwxTOTʡJ!3z}0.CYw{g{U|wXq}7bmaaa~\S9b?uEv cre ap!gVftA6mj8)f-Ve"-u5xsׂ#AdE7hw 8vbE9Vta'gXf1f9v#)xfBXQx%j6dXg w؆e8'aaRew8wxo9yd#W#Op)OiN,5ِ6)32mmVnr;𡈁89A+9( )(3D#4rjU]7֎a )l|qEّ-OrYG9o읷 p=gNHǘìWI>Y=RK 9JڡY=DQs/GڐyeyǹgꙘySfE:qZzGYaٞmяڧY9޶-11Zĺ Kpa!wʲTRƪlMڭ:#ZZ̺ONz3[(z [(2 ` @ X] @ ` ` l[ws[ v{Ƅɑ1R(ݚK;;eO ~۶ @ ` `@ [ ` $l [#UnE;'zG[ak/;+ܪ#||"U.(ZZ={0:(r&{۸ . í:(sοz6JK=m%~)?~3~w=;G=i@a>e4 ?@D@j^@{sy>w~{^a>a}>^w>懞k^~_e^s>kAپ~s>ms_?me~_)  ~ M9^;?gWe?cg9umi?7Mks띿__?we}___ݠ;_>_Ç~  <!ă +Rh#F9^(!DF$COT #A[TiS4hsM7}%ˏ1: ”&3N֭\z)رdk6ڵZE6Wrڍ[ BDm(5O 'y1bЕXWN=wϿ(;$(AEh9G /rFaS 0h7B̰YpgAma6J_C=vh6x$O#l5s &ٸn5~y:DKV_pes}wfigtIVYf5VuuYppGaFW`hFd wQ4tNȝ6fG!H@ԙdiaX}N2)$%$ae!eXG!d´˕9U1Sv.dQK9CBzJ(RvYD㝋:_AN:I詆iyWI.)jY$DkƩji Klb B lAjZ ns` .hK {zV(0/+/&̋nkolh ,o 1a,ڸ {q.V/Ì1ܰ" cop ۼ]ڡ{q?J3.:29C|u"[32!1n0p˛r|hw\v$whn[\4K-oRXG{5ۡ Iks 4}.##0/|@<'<3o'<O|G+?/~+BϾw >⛐>a~>~~w> ؽe/ @2d;XA# gs}+a H>z1 XC /4ݷ)6"?P ?H'`Eb.|ԓ1Fo$FPaP#hG;z=Y>~̣#HHA~T!I@q|$ `HIQ >nAJP+Ue-oYK&ಕ~,${H4 ndRl3Oy]ғ̣Jgl%+y)p򏗄d%OI@T'1LӔ)YH 5f 'YLNUe6ʀ^Œ(.Ѕ.4L%2MHqђTe#ɹV\eH)Qt`5hk̂ &NqZ"E. xo}sk8cq\(m_ >-6mpCEn+rhx(n9qjG:1D8B %A C"Ɔ&(Mxq+~V"0t+p#X,;`*+FQԢF01 >6\=ꢶsc*b -6[n^ׁpt.;ю.k.<< rA[`o|Cp'}\~ɚ5;QZ,|j(FbcqQp@w~Gj'G5JbN6ne<Ơ|SxsűdjfG5mGXũb0Ր4V] hTpmZZR4cwӦ -{_W Ր h  Zms} 7SuY_୎ey]bzw{\.}Kal.^Xj ج&ʎ\ݑǚ8 XaaH N͵ P \=f ° &+a 3^ Ja_1uU ?\xܝ e p>ڍٗsPɤn_PeȀ0f<ڰ ʌ ~P[J Z|,o<-GZW/Z=oZ\XEkyץtwvboGh7آu:GzR 﨣׸j`_mPV z"5zv`HԻj Pykhcdz@7__9_| >ε'٩.+9 fo 3(\y}{@ c~ ڐϠPEhl : I p&6mgo֠ǪP;j. Jy_YK DVŪUXbłQ;!g԰q-\rm㸍t%#(QĨaĎ@1DB)OLE\pehWb9@8s̭h7/!'DjI<)Gtd@j O?!*"oJjFEMFVGVCA5a*3̛YN2)`ZFfZɑN X^iaI!(kǛ<}N2̋¸382;8$ѬyJ-"zk.hd{}盁&Zh͊F/IF2:Oʣ9*7-&L5Ƅ!f3WH 8$R89SңqSO{vA*'p5cyFJkF-: Akxab1Z=0$rsF_Qp$gvy%GaMB!W+9h~ܐ?lUܝɑp=F٠za/ugB3C ADJ 2 mhccٮ}Rm$0nc2$2IliKW!O )QXIX3(E"EK&K3E'W l#)P 9fWI;KVb-GbE)P&!rAi9_*:63Xh aZ)Ǝa "tgsX#&)Q ':kY%bXBU-pD0w_(!JpDu' a#w`рz; "6Gg&4H- "y#0&ߚmaơgb^16i&؃u+l"+4KZgJU\dI*O&,ENJ T_]A,D=P0C#zf%{CeK, L+ۏ|Kl M8Йȉ[ R@<lJ4;(MA"T El{X95ߚbD PjZ);d*[P"ۨث$DUm(RkMgY3fҔP `9, |SYUpSY#QX[aB^#=ddUS@DWd3tWuC>O @K\My叽6 EjA,qӉXIl+IE Lb*=T51{B(N ]]?k`11cfM8,2 .MZSCZ†bMb{FaEҊ!%k >aM>2I)8/aŲb89n\M5, oN8ZZF[zF4784@MZNhy\hRرCfXDHU6ٗpn}R)t1,9#'n`M0Z?SE೾-b(In$2Kxk9],IƆ\䣽;ReCȩѬO9{'Ha+A\xZj[`uS7]*qi@B@XvO@;eٕ*CJEɝąXX1ɉG-pb8B*֨8K~?\BDP-ajMZ[Z) 5c!bS8Zdf.귕^= ? R`f{aTGPEP-/)՗HsDE82UPo7f8+s#M؟XX+؍î~9IJDRa#% (%QQy#^Y<2}գKׯ69"X $ZKkZ2*AʄL.Ȗ>qS!P-+?FN],Zg(kZX(Gh؛ZPSSp݅Vhb;܀Ö?/E+@ހd}?褽O0&5ZbPLل?h Ǿk"Lv?S5y/,^%)ړ<5Uk*  Vqn EV6MVу^E8T>]aqSP` ?nNu 0 hB9ڡ A  ރGz_DXQEE)|ly\ ,݄U= 8 ;WH"帢j5JwaHC<Р:B:p`k7`dp SoX Igb`ЈXh"-0 Z܀,=<Kլ̒" -N;c)\`R0Tȅ}D\ >*3Gv{jXrzb8D("` +8@IN`y"j3(r.GdY:Qrh-6ҺZxM7,[ J]xͣ)m$^S;TI@)!/M 9䃆%C eeF_UH~X *}/!w9X(bX˺[EX}U "@_QGP &$foZ7kp')X؄'XK$r8퓓g8a$ kVP]_Gu~a FLp`YHyg~LvQ~k oe* x(Q6p$~ ƭګZb#FClϨQڳgqVnݺtإ+'n䶒&OnMb,)Bl!6QbDkHԉT- _[ERCI9Q)8HIR#)NVZJԮZvJ$ UaF3f}a"d3+XȞU dHR;,()RVp;w rȑMD+Y+%Tf7ҘDD#JQ.;3"5~)Q(RFC3F * +lY[qYnc ў{01nR쁈T-YpArԲ#Tac!z1^DT8UwH {8" %w A+`H")r/Ǭ 4=SK)*`eP.T1PC$3m)Q|qRD 3q"k#%"q"#1VH)rJ(DA&2ZuU+K E$M,H{4g"yv'iv.HU-z1k miXZ%as"řǧ22g";#F矪dB tV0Y BYJtb! 1ԗn}  oҋoۑ p ;# O; 38a0̕nb & s8|$26=d74È Txc Pd3L07lpHX12cM4J%:FҘ83R8&Q bC@LT 1 4?v ZiKY()Zx-dh. bTE 0 3PA[ IK,@8I, pC"լ`C 7d3TZ؍ӟ*4 +D"ĘH$D 1N0SM[CE0D,#b&7 q>bN)b-!@A1 /yF8lD`4&x~H"n1؀ ZFTlC 15C0 AR.we@H5qRPO2 T!S†^=k HcGMFSD(Ba(^ ʼnSB#]X30B6^\8h;5W" F0RDj';Y*ҌNy4w$@˔SJOViL^L+W}\5q0a31f6eMor8YrshD'7˹5s={3>O~3=AtnX< *H 6 c:vAh}3*]@Y}\">RTei>yϞ 6b$c6C$`:T  [|Ա9U7`ۮZ<0 *(dUUj\< c1QUѯV\1|` SI\A/(]1^| 6"lx 6arl#KF12*#a[6H|T`*JI8PYZؠ# DHQ:Q bD&2pC"`5;/'$t\@ `$C`Q]S{P  IxA61gqW 0@(NAR=6jR$!Ba%ga4h"gZB>,E٤'jWJb"S=QbbYF բOSR+dGݝ6jޮlisNYQ| L0(H.4/?GD$kGgC2Snp¤PB]^^XI+㊰ $௚ň* qå.G@yk^Z6zWf';{fk~&A=y\G@ P 0qS A(Jٰ7t浸m_c%ǵ~Vna0nе!7qbH?5Ppl9"{sRFl|[UH+Ra#ppX4z$cH5!]4P XA2T"a/LDP p09R\ Ġ`{R>r@_XT<}QUD{6JA|R JFtﰋN6 n|M#Ba=hNӃ 1S@Bhw“|$:b1,D%[ЙVt`5쁍(y wL:a4,Cw$A- 1\B=DR]ToY8B=#}]٠BXC2XΙ)0R,10@Cƭ¡$BN BU@[PB\ɉi\9`+p=B.K)(ڗA$DIDSa oA-B4B1T " ƒ 9\ """ "="!&L"j5"Y'a$Vܳ!J bٌGS+v7@@5C}C=`B`B1@ 9`^Ŋx"IPbk.p#e*+9;Cqױ"@2`";$BɸG$|_}, #x75g)A!Ę0: p\h^}#[613-1h+,7d "" y(#H6< tC`W:D|m $5B`F`C>[mJl|$àe/^|( a+HY* $Db*B1 h)" A:b-0)1@gYCp])a{nj8D AI@Yܗ"]5: h @kAV ,M%QdB@ &pnp€$51<ٍl}N-\M31&y ,vH$eY$ (B,) zI )D-lt p;/{vgHI2 Ae1$3 tF3}BG$@ I.M8?BAܧ`eboN')x"p3x|tºAOJz$B-#xBxI1%'٘ J@Zo|&Y:}jHo!Y!ZXA=9$ :+)eZ^qP~b!jR&l Xn3 1fQjH0lxaLA;I$F2aGA?"b\BmQ#j.*'mX bHE@#8I8"n0ĔS(a0DHqXD[%Gir~%f 'b dBL?8DP4<qdE~Z=0C DJ8ML1eVZe_|9cU`BAg?#II$MaERXr`ffY<XplmaDq?CaNHD`F4N JsUamG669oɨ2rT A*0!<G2U@8G5†}#~1 CLj;dG=^$À(3,P DE01 6TyWdxo!HF3( mByf719\ D p)".hf Hq&@u2QgHbR5jT7H:#f! *X(J-w^q %"ך@@̔C%A Z@;glF5AVp8.VA vQRJ .bM<8_sOrȶL$i:bB2 j38b4D0!< D8c !5Z&;Pj D@JX2Q $:JCcfUBRX !&w8*,)0tXDR/ri9jM>yI (LVb0^WtLSA$ GM'9̙NiLn g#6k ׬~UNKPE(jF0 f0ALXp*l*fdLAlB, eʤ! :ȩr̠!O2a`nl`@ B! e?E (; <| fax$kv``*zdG CAaDаԬ#dZ(!cQH囼Z!A6L>j _Ơ>&/^+b!qaXna 6a;@@ 6arra  !7^x$!VH `h 4:lThN #0?4 B#Լ^G!V zb"Ynbc$!}0,AF A-`FG+ UL `/^@<$rCᕄhF8ȯRh C @hP!7V`*AiNA68*ܮFdDF39o3qIl 7 ANKL9C;o|..$OdJ3q7f K&h$!JbDon!*|Xq<;lPc.v:V!j6`ɣ@[Y9A -)`@r\劬>@jI:c0rhJ!;. Nr!2$4/Jl@ Dm4#T)ձ@-"D rj@5m:2Ha&jjj]kY `S">a`-':byJbKC1$ r!ª4Ƭì0!j&` |h@G!|fh *A  *Gy\$@ FVaDK^`XH AltXK{ %xihlslJ{ @ ؆.]O4ؖBq8` ֭:  @#a  Y" n` xڮi #bX#a;b@xdnOξ"ah9Rjۦ $6bn2:#jA3B&LI4. * 8:Phm`pVe 8eR"6nFaao?:F@{@ r75j^Lpm?:dFPNRժQ} E lZ[u!{a[ӁsH3ߺ{/"k;#@Mr["(_5"Xt>bvm|"bڒ!H ?؀ `)W G*$FD5`ǽ7؀J^PA *e1AV1m./Zl* m W "@P"p+(Ehxqǚ>t &~@A={nD`IM{l0ƞS\T6l܂nvmXcvX10DCbZb)\bʵ1bc:D"[!ԘQڢ+V PTaC6~m+ed[0sgO=F9:ujժ\gCcl lA|HvEby Omܹ+]+V,\>2$ +"Wg± Wp 67bRQkYkhTıpm;J{LQl.+&B*BEVvì@ &@E0uѥQp LQ%H/hQF| RB] !#6BR*HZ&$71<Ʉ($BJlHhn"$HH QY~p:"(g Prg'pb)\S 7g5АdȤH$H"8#IJ'RK-u0c+iA]A93Hr#CaYtzY",jH$t &dhL1Ő62y~Z˝w>J5CN:S锣/ 0/ <l \s/c1n1'0Sp)˲-'N94Ϝ35/9׌92u#[0T0\fѥXb 2Ş5js=bC 7AĶjJRf'j""Ig)\è8ĉ\ 3K)JqԒ@-j-C  rm3f{3רbwH&#+K0[] 5jalz_l&xK,ֲI.)zY+H$\;F5QNw*Fh06G%/",JUY`SB,Q XhU.b_+O]Զ ޹Q\!Vpm$Y`?p @#bC,bA NѪm#W.Jg\ 4{FӀ)626qڃ!ִ&CiO$(A IP+ٌH?׬W,ۘ {1*C J`. Z#+0JX1/&5#6L|1.l, rL8A$B.r1BE^ \,iEXNjXC` 3\Ij"(8̫Qc.CP!<=Q2)N8Fb\Ŋ#KR4zir3^b h! jLb4)mq T2kԕR{eCf<|{T8)G܁XĪcs&ypnje.0]C0Wlxj1  c&`/M:C:qpe0h`Xt&I"pۚ$8 |_ @iD-|Ǩ6D1ܰF.61DbNaPLFYgH=e,-iL<) /JeZI]|uTzED?U Dؾbba䂮ϰ.eg ?+D9@?ְv|XJ61{}`Xұ瑉"˧@ZhF7:R-@zu=jQߣԟG}N5?{֤^=kQZԩV?kaײ5skO^`0UWup \5c"[Ñ6)a 7!^xVVM$$!KX l5f$( 3 Ic 6mm[U|X)7KCkb oxy`KU5=3]-Q5l#ƘP5Q>šӝ'ۀ\2˨mSmW+Ű]\eRGP7Н%Nw9nj`+Qi8E)^9{qAp+^֋M1n d4ѳJ .ԪzU1<] R8 cRw{/Mlݴo!&l\@c@%qZ%QRbߕE"MQMe&kGa.n'7sFS~;B`i7p'\|ЎHT :L/کIR(%F f9pVaec!` ֠Cr,W}Q'-AJ 'w--Q]+:D[DT$*-I /B Q'/`Zc:eD.ݳ  @J dVy9\`Fwpj>$rLB`XzYWh+n|E tJОI70Y,e&!8g9fI 롌)P >`=p@@p)p p PpKxr'jH ''*|p P yd &BӃI>bF % *Prxs;Db L*)Avt bfb.)+pκW0 }BU :2yۡ2I 36 3%k++2 Z:ñ 5263™!Th ? Ni$ӳ#[OB[3F[i i1V7[@1Ui3Afq5Jsx=tI \8eĕ`hmP ySRB{+*E-5yWsczcA!9RiD[hs9? 0:jus`aVzgC(sg}amJT ;))sBR ;=f_7SyrIKGڧ$8u2hۊp kdUsc_;,B #}J *Ce'e&dM eDpZWF{l(yo{O2OO&1XN62hO>Vh\=Nb=1䄶V1N53Q2 2,O}p 3̒ g}fsxYR-n!93'gbtcD|_x«T2E[ ˛Tsw#2Б㠱rML1?( C1?P~+;qWB1wc`,]>DD/fz_>Qpr(W/}@ɡV =Ks!&/<oAq S0DmRBx5X#4MrC3Rf{Srr,-'^='wre8S&k&qP )Uץp)4~@ pjfrRw< ĕA{Brpt`n#6 n2E}>B%H= ;Ty5B~ݕƺXA ,"tI{\eRzL=~{Au;[ @ O'1@W+2?#cɑF|iOO7"#L 10BP\6M?KQe `0 0 yV0 U J& ?rUB[5F\@&O}7 Հpg+u] }M;uXÚ>B56&tBmٖ(t?XV' z {%04P fԸݜCh-x"qbIB4@p5V. w_ LT fR@V Rqfz?C4 KϋB07K'~`c<E;eIP'+ feSWSfݬܼYJp00@ $,_jؕa>lNtw&T 0 0 } D )/&zo0 ioBPU;}nڰ-'_p[L$L=̀D N]1,юD_*П Cd֫ y<(q8<奛R03 $T&I OjUZ =uIvDO\`*,\\ s/ 0SCi@KiF֜ܰ/oOO3 0ʬ> TD` TbT  NJ T  ` ց LkJ 6&6@9n&:qJ h_fc8K#G{iSS CZVjذq.(PqCָ1+;"U^ąK6qbQ0b۶hRq=ǍŤHRFQ5]'ϟ=:Z: LncĈcjϞ yb4BJUzV7o؞ V̙2aJ|UKn0br;5f-zEnI>-*O)L(#D0%JQ(Rb"X0"D 66gpczJZ,&DHb/k5c;# 0A  G$y$P6iH"GP1h!;Gp8DxEPp;`P,\p &lф``j!ej[eϢv&1ŤΏDZ=a$G*dEN!;R!XbAdDPHbXjc&>,(NTH2*`B GiMjeRS+S8a'\l!Big6\c69DĚrafu6rʁ6e!'ZgYn6\oRYLLafui\oZn7l7`e6>xɆnxtGioP0f`mdI=ֶqZRk5\yf˥lP%mY`(L'p{&XB1F0Jk `N) o>nޮE *b@ *0-0ԱPNQP]Kix1(.UKFP!LgRB<3A tH†eF`oPlC!D#Mu'p 0A=~ś`%`b)LASd67u;8E(*1RtP-P!@^<KFxg!Tym naWi)XʼnIDfx^?KG1LP/,j7и*1T e ZӲֶġjK`Z:uTcnX:0$SUlQ]?ӑT\˂GBPv,ԡ ]XC*zx>*ɨB3 `,:P&{h;\ zA4 K%v(t eNQ.rƩS3@48fܘZR UB b:7C6щMb X"TBEJ kb먪5P`hCX@  p[P6ǘa\ }ؐZo)U6VԤQ \+|`{QjyH Bx:`ELf @1$M!-b ]ܢ5j0k$7~S:)N.?!H( ! ’S(PUWw |/8I!SHgUq>82%A^ @=hP)9I-a@ H 3|h`W!\! C"l:D"P+1E!EpE03K}WKp貗!ϒoV橯rհY0^pk.|H URг4[`4*H*FM󗲐.pQ BlU8)mR \pEa2nT=vBePcv}jnr= D{`>MnBnG=~/Hx=S|x6:`cCHяKA:< tKpOb 6r$f@gI)R[#V3)N߆@D,Ә4v}ϖԶ>b0ҙ9wo&*U5"p.;Ux{a 5 xF1Nr)*I/XPy*$QkzS_>^1PQ!7y2\q L%Q(P؃QRHQ(ςpFHV"Sx"IgZMX0`8sʬ9[=%MI*0(P!0ESxJ넾aDH؄bH`XbHD*\Fh1]"uy;Ua6PCx.JO&hOęV؅]8&E챊SXXfnxD>4TMǶdcoXuX6`dEHKLq iZTd=nx)!DiQ"eAuXqXV''}}}pztcBN=9vXBI`Lt]˔!I3qT>wR&`"t-VtP+7w1B %*HR%$B )Ra7ܰ3H# "(1Pza x 0Rؐ6̵aT@g_a pÎ%#c0xt 0DxG" " )rJI Qc8BCI-u"8X _ )xR-r`.0Ä& bֈCLP\xÎ8^3"HɠI#J@K# ""BJ]+7` a U(b]0^v71L9DA81Y1&0I@h0L諊E&`?C2t>C \?a\>i>C TrCC?H.T >>41+lCH$U8PC8[<.*^,̤/&ه):0> `4@IB)8=fG<5#D L|A$* ʭBł.8aJ.* \1GsB11 /l1s3@E%2C)Ut1Q8 "|艊NUp%HI )D07C-}AϺ.$h]F-#  1B0To2/4mBH1HVP4`6| `C~uM2g5)A! q$Hl)P21C,As!6XLԂYPJ8sz8 B PR+ pAA8V,ī@0APALFAI9¹ۙf*nVBF*0K1rI8B)p (hn1 I)`Zl1DC80N}E4n8BX« UHĀD%BB * A(0C1R#H6EWR[1gbHA%t)B$BHB -%p&H)LB$@.×,X0LuC-DuE8h J ]dA5,n8*<ԃ `< <CV(70j:@b>,*8$7l@`œ2 A5$+6*-â2*=.r./r+217#1#1i2#:B@5lr:p$i5$"D)C=` #4*;T",2Ür5d5\PH4"YD ~@6h13!+./'04x `r.BD"ؾRm ĭF BI p?ZJʝ2#LP!0&0#*So#0#.*H/.b(ƥ93B ,z܀!pB(۹@F6ڠ<4@2ڶ1"lzmRA%6칣D-Q$U ETNW:t*װ_ 3fb CjD4@$VH VلI 43&7CDA&0|QZ.~0<{y!Db.Lr&R74,WHR1J(֋BX!ZX(ֱMzL!AF061 CԹC%);~̦1ƨhqN" *T^AEJRnDbc|bN$xXN"& DA 5ָA8&C: $DC&` bMĔ!=Y#!8:fBYA&flȑi `PV#fI'rarb)%@u ak@ 3*o':HrjTdY'f9<,TY .vS`W78lD,KsYc6Dfe%cPGpP|)]{~Yn.I2S_Ŵ?]~ԁUqBk$D{s%JaH!B^narB,/`/1fkXⰖ8d\̔(%N!P ajAbhL^1>Ɛ6tbc9TA<` @ wbmsV"L)' BC:#c0kTs@|>!kko%hlBadq1B!6I#r1Di\ 24sz=/S,2O+zRBkD ìVUAP^Ԓ2lsNa0:`%/t8kF!L裺Vl:aL mL)7mp\tpbHg>P2so@*b!˜IFs<1mT"L1P)n'*'&O:ҫb"!orm:/@\sT$̧ͰT̀-!,5D!AFqQ7#NQ&aD<d!cQƴиD0fnj𾮠6X$O֡҈bE`*=H# NY؁Wu\$\ӡ5[N\u\Gr]\}] \ I$x!<=:x Ks-ZAŀT/43fs%OtBAD6ܰBGdUb~M FLE7*ڎSޘJbC @;cA (6=0%Vb:Ĭ VVAj P*biqf˙V`cA%CN7P j!> 0~TB*x^EmsVaI7:02- 7p"qCjbܒ$@r06Iue,uSRw*@,Ԫj,͋,a#a0b}WAp (|TOvɸK]gab8ܲ!vq AF&x0xdTAT=:.G +a7Ob>|(6ngSn_WSAR҄GX~O588ݸxXxxx8yb7͸Tb!UZY-Ja Ndkadw[ckO(Oo#8t*gpPpNS:!ojcDrcbAӔYӔpYK>]"/#!>0~lBgTtj~V%bs^+>p1+P"6ObLjYB؊j_nj&B(@'tVBTt_~9q8svs_}mx6La᩽380ZwZt#x|EzGz,+~냥u y6'#6X"Ez4lXtZ+),vHgL9A]ZYAd#i0xd0={4dS.SLkNfdc6 ;z[=Wa;a;۹;{*,M ᛒ3{I.A:N/wdp LxO,fM<#3gE0ϩExCT<\JTCn9KȘ"Yڬs !Q盜͙*-'4c2׍Xn1xa}Bn 9ty6kܰ\o 0 ApW# 76Sr}rp!2p0aёه±~ (tJL̿woO<yyKq<=";著|: [zwGh ZaX{WԪϝzb!ɒJ2JÁMx)\9m SW 2`ъ&XKB}ل꫕Y[e C0"0av̱T5.JյG9]::0Y{ǃrQ4XX埻]Q>Ǹ\[\8\O[\An>+/!A0:VU8$'y Jx.)a>=va[/wZadwArj\-w`hXA y~Dƺdֵ\:}1ow < %B;Bώroa>;iڗ͏3gѪ~na|s}:22iPU̎FeǒMǭ);jzd817z<ِ쑔(Md$OL$ c]mą# l81s2ũ!IrY+.tLJ7k~Ozxށ|x2΂TaU7Ĝ)M @0 XPC5܄s`YqKX#)Zwf!B 'p'I+",h.e]'R!p0rJ+ ecX4,4i1lC"td#%Gqŵ[DN)'n馜vNc͏bC 4̸8狷RI%HE(@ZCL-MB\ "faF˚aQcƴNKah[j|lQC BQ(%r *ˊ]J1ʽ)#*T1PDuW *R ){4˭jD1>"(…餦$"KM|b}vy!{`IG Ew5"aIAR 8.ДHܴOu]s.̝ .܂wV0&g58Kl4(D%vӎ3H"?9H`U(F5ܸܲb. SL1]75T .a{jH5~GF!q{VS hBH9I#e'h%@Se 4hM,QaasL(t !SJ5^XօE?a hV>~1dHA < @%'BYO EH5Q G( Sh* î0c&74.aNE0Xi,S<GKU"N+T&!r:q[RNr9CVQ`m+2=f@#U۩ !iY.1D)y')J1"gQqJS*(FѯAF:x]ڙ m\,ԒqE*R:H\ AMTLD.V>-zJ2 mLZ"(ʑ7=6[E` 9֧ sP!7Q bʱ"]dǽx|`.SZf!4ϸ&I As/V(^/dG1U|c'=$1F KA8)nizL'&Ș*KDNJd_3!J!p,V[ftZey-3ƌ&ҍ\'N?9i2x4eg|,= F1bl1')JD(-L8ɦ(j&4sbi:c#հ /o ]3 rKo~r4c-dS.Q 3]TjuG 0;VU҃ HD%C/ , 0D1KT`QjD $JXvU&! #&`S ֣"EU* ' 3;xE;Teq|e^c#D CK2 @HM ZUJMKa*@;K;ǫɻċ[[SË p-4 5TCr*p廧狾{*{dq @ZPǗ_W`{=yZ*. < 1'F+R %2/S:9u,MMAIiX Ҡ z Y0x ƿ| %,00?$b&P}Q&&LSUwP611/3`"7] iذ*WE). ZL 0 \u+(@E &c.a 3C SUTQ_ӁW1]!AVe~?&./&c- `EQI[brќG)mxȇâ+rpT(` Lb<)ܰP2l{+6st-*d5/ ϷrE&L/fQ6XxXw/,R]^ aY~C<Ѐ P ŰȻ+ϋ+˛} ]Aľ;ᡯ%-&)m)M%;"M#+5= JepV:,*=tG!oJ>R0#TȜ$g v\0 UĿf- ' &Q g'~pEa,8T}HQȂ؎dP  <  Fwp 7Ai V2=А!@ p  O U|4Q-{v`pQ6h-p,7XrT8MP a+V?'M$ P!ZCF}Pl.ג1l2Z9TE5hKr33gЧ]1P"  `K'}4Y+CţR*̗p h+e{Qߒz9 @I<"Z T<0G. 8呣 X"{NK&2 +Jn٣3~TDѸ,ixqD7ZL ms7g U11G ǀ g"% ?[@ҙB2}t!ҚtA!qӢNA7BAI*~!HvBg!s @/"2 x3]ӟn ɱ(5>}Ir6n %  gEk jVEcb gR#z@1(G Zuĸ޸l& `{d*%{ @ cSPD Z-!'A xi`oac LZyQn ZeT2-PLi{31u& bgŐr$P9ST u.Id3|2oKwQSfA_B0hR,0*4::KLЗ.Q 0SDt./nzhs!+S/'w";:ؼVZ(ڎ\s*&F6Ns1˹iSQV9(&cn`NT;k{2Xkb2{6s21=u(r0_C5)lJ~@X~p hW[s5r?[?OU\(ʥK7`u K(`Ar LHAr#EJR)RDʕ+֭[ ;vKfdRV68mԹ&5؞Q ZMhԴm$Ȑ!J&Md'OPU2hӴm.8q۴A&۷ݵkcpw{\rµꔤ={sg{?~mY#D:$Ѡ !zMekSЖ1UGMZj9|PTJXMb%kQndDGQzF!;w 1fuhcϧ/Lcǯ&LlE: *ydO9b&-l,UPYC<`95h,?p:Jdo?HqMs<&EaS ЅQPD%P1|DmD`+Q &C 7ؚXۨF5nY / \O*Mg8M\0PGbmda h<8V&q6El5yF(~j!" ##$IĂ4J$rFJVҒ`l % LabS&jdI( F zF9{%)`CjE,kȄ nd0Kjzܵf.)\YÞԠ3r jXkEyAz@%XÁJ%IUwyIVQCz+q 5qbd'Ǻi͘',R}HِuS+cG$KS.Z2 p-o☩@q '_ 4\8d*R䜴*Y1,lJR9~Mm.pֽ€]O)1gM(J(h Z΃ʯ\̜$("$c_\`3kbД8+Ei-pЩ.IAD2ڹG0óۣLa泇R"Ɓ1pkeZ+2տ \-ԃB bkJF{$rQXvᐉ!FMWH*)~Q·\DT[zô5"Bc喛p( &L\&aNa Z )p 뉅QNAjJK+iI&Jc4H˦nxtAzx|z`AlAAAAԇwȆW\`feP6R)`B,Bx³0 0 C1(a=G Y_*Ù*-Դ- m7>C?ik8X`\0BE@j РܫĦٕ\qNy7DHP<fðcȅH: RV[Y%1LWxZdu0bMHF$C #FH*GAGDS7#\_aGxcǬb؍]`z ;70+$!p:* rRDTha9V a`D4bk=V1Ϲ>!7yk:tB-vPFf ClȅPJNh˥MJ' LXwW>b؍dY›TIuCJTX IĦ|KX[%O`g7@\F `4I@̨@xt ؕ#UP3{W 5dbc( `'R52m[XNNl(AܼM-AܤN߄l+A,ld݌|u Z, I0DFͽGF ZmԠ3\Et_JU[-,DH7pF !8@7pk]u]jI9]2ly;X\mk#HB!.(:D epP`rI)QRٟM5M'{ VY4嚝YYڜٛ4`p&{b4Ԉ*[QIg:zBzBjж6C١ah\&  \Ċ[ 7_+u>ȊM d(" l@ z5` gd$Gő[K/x6 >/ڤSG&$IР%e䄦A[NDL PCX&D@pj85x̂ Ԍa݃[2*D P ;JE"y1{U~W-VAb XL4N#q4n44q a>r"f9Apb(m'!tZȪ qo&pϸDC(؝ .7K0 9tûg{vC xxðFE@nu mjT.JtA ZrXA2n$;]Fݥ3bÍgE ՙL,0ZX1S8ӹWDȱMMyC ^S ^64 } / "lJL $Sj{ԹW%kٴŌEy\/3QI:~a N܉Viqh! RHHaz(ܚS@Vh?p@#A$EMzJɤR҃(K;0oo!k j Eh w-D1N$4b`_JI%nʺ#bXLiB;J"$qqb{&oR4/AwuN4|"Q [ȳu(o=ۡqr:ᚱil Hx,IF8۬P)],x V}[_}ap[ua8 SMH9w[h ;YX"1Ɛ\Fيक<@O!|L`tNHb(CU 6`vjO5 "5k C_13C QΝ=y8#r~ !JR˖(=$M*Iԩ8"vg'c^@TZbrhqX8rdJ. U"RPt,)%ufAz f Q`Xx'T '/RXj0! OÍ 8(bvc8#ψ/n1m}A Ri-W)욋xE"!, s &,a Wñ2"A"S.Ơ!,! {xy*aBªK<" ^/ʒHA4(e(m%*“bm x-F;"E=)ZSPAw(74\oZf-u"1H! Q]AZd&j!5\a8VQ)g,|Z D`h8 TdpUA8+MyrU0: u*3=M( ,հNIauĂ(PD#b⅒ (#yr$ejNJ8% K,?i($( ?d*% I)?cygB\(ޢC?ҟ~Qx#>3ң>Ɓ & n %(p P + oHh @DYY2`:mC8"•=2`$1FJ<M4''BBT 1-0x Aĸ0LÝ٠( h@qA KYhջ]Moр"pp@ "~,BKA @lM6@)0 ! <6BgՈ@ l! p! ΀L^1pCE .6 H6P!ĊЀ-@X!rlB!؀tOZ*X*XE2JF%@&.$22#'Do4$oWŇaq\$OOuB2:`A'H #HOSHp|@TjDiFn)T@08X7)ba+H]ql‰ǜdev^ ʨPX6C'L'$LWȉMC2 0Qͅ!ЅpȔKϳWq\GAI4S~pTJeG)cڱ]iChRkeFe%6૰)8cBfdJdRfeZeVf= tAC5(( T P3t Gv@.HhFGdDQ%%2 T bQ 'C gjX LT*'BtR`.`t4 S/D %&'tHPA#+B-v #JTqeV"PUJ A.L"iri&0.LC1 @h)8hB-AMrڀ@pN<7$.R8%@B{}p@h@DA1@r6A†>Yj-TA@ #G8HH$B=T2&^,.(f@pbJ%œ$G""0qQcY*AanuN Tn0 YH1@`F0ȓ,,wHoT~#p'^JJ,.B0/fݪiG1 *PC#-m҆mIH9,Қj JD7HC+TX9C" @؀*dHkA,d 3 < ͘ b1Hʖ -jE.l#<Dɼc!R#?E*y%|K蚋''j,4v% /P$DA]S00f\XlHLq 0pA$V +g. ALCA6`B @XT  GNLRpn5<6k:x)hA1#p< 0 \N^ ވu H@ TZ"x\0"Ln@@J" 3D(`cҘY?醤r1m]8d>k)grl,qpl$gG1rvq RorQHp2ru102L%g\(@!%&LAS,:0i%cy!L"\XʊIgegH„ .jP;&Dd38FGbbIU `†Dxa/"&b?O+bp DX# ÔOX!X/& ^ SL$^@V I;! 5h:B )# V`" #3Ɛ PCa%`B x :x Ԡ،=Q% DNN p\8%NEc:m@\ 8fG;Xa;SN9ND! Df`? nŗ\?*$de]0lxA; =V^n EbDC 4J cYި#:(V}ab Wb `(D .]XAl+` YIPL )+D%(qC<C8  k% B{nE*THVpm(>Zp:pmIr<Oh?'yOzR L&BL.Vq \bhg>ǎ((#vs RBO@SGOJH;ԁ$Ńp%r<\Cpp!jq >^cMN1D%=Diq-r`hH4: jB 5؆\Œ\t(D:A !H=TmJFfQv$mjO"nj#)oRAQSJ HQXEA ,"4 b0";Tl#G8!!#` Lm=s6S<s X&o3H-a% Nd ^x0V VxBuje BW1%Ls { \L"Z1 B(޸T@4uGf;;0AC ~^`&lS;$"i#'2~` @P)Lc8_``ី26.F .n l C@ %tc6'Hª : 92R)`+V`  2ƀ)Z(!+%$E t -^bA D``wx'_bBp2 l /(aZ(^@^@ @%Nݠ @"^-H ZTXqn3ወjnJDXJ$l 2$!l ,$rr!xiaADREn!bnaāfC',x7Ȼ6&76#Vk? Cw| a$$M2L!qJemh|n軶(8n!±CAU Xc$cn.Z*!c,,[ցځ,+cn-2L!L„-,Ò/!/r/2//ҡS @NN!@ VA VTZ#^b@Ah`T2!2OA*HPa ?L1QNA^ (! ΠZi`Oj'Xa`TO&[dAv ݘxoP},\ 0 K А)|xE=OvkO orAl0A DZ~np ps1Çpkt1%p|:d-!b0Tx|(bpH!llHANDAA6v1&Dkzm@k'h^`nv 8Va`@ @@ $zG`kB$S <@QƀkxFmk"XNZ>+2 Bh0:aB ·.xHpA*N%n(lM%f&f'OB36$B-!@Dՠ)bj!JhA.mmWA(esan"mb6f%$!0T'sDbhq38O]5`'a9$4FD$AAbݣ5vh{S*8V/Vnnnv\/oa} ʡJ3A_A  r ~5`@Aja >AhU6Dp`Vj u%3:iV d>`s^`%J J&A Sk LPO=L=mh >@ k m`?$tF)d:l$2! Pv NAeSa8p@ O~OOCm:an!We_l@ js>(AF!ʑao@A:f TXkf@va(@&\H:kb2O++ivG"tl6a8vNH:@ J#X"$xL q`o) `}'t"l2G%lzö{O4` r0ft$ t X7` "s>@^`* bZa]-.╘bwwb(&uǁkm&'j*Tc|1!CX5 .R lc i-*WF f O>ۦ5/"' "$Q>!퀢i/~4ȝ*WBwbi1~mfCO2j(b4FCv4toCTeV5j|zw *W,Ү]nppWNo wpKp꒮M..[򞌄Mb84xژ ~pL:l'Pp Į̮5TF`5Aa89?$nny)e A A b &@L`p@˸@ Z>:A]Г;K^tn%L6b?bаX)\b!*b"ea`qnP"f}Jl v*cw@طj!09 aSP1ǀA8သP-m<$ZAnBT`%!c _L:@(v#b P"p)X)q~Ev$ǘp0$pavO8J!dkP8 MO"` F@`b@eRbwǤ jBv`El(i^ tgVF rUϮࠠ hQ@ W 2xQO !5䢆>0UaC#2~O B!P`(w (9aDĢf*8&kڢgiUgF 0ac<A IAĺù2vq=o^P)Y†Oާ۸mL6t!3:(2yi(AaaK;l'*0*A߸Fv.;^;#[dGri:d DY+~t;DLCid% C)@RFǑ=p^s )~F &i ` / @Ġj>: &J`5I%C fMP_@6&(UMBH ʹ"FN]G8B(0bVH~K+ԁ+x2l,1ѥeܢ2RC^G&aܴG,bNtD< Z-pABkgX#>$.Xdd? TxD{D'TD:{t 'Vux1V`;t:8żr\؋g=cLASj,J#_0bqA4ɨiRNm9&<rS'*A RP.xӼt0u fYQ3\gCJa+@גc/s"}<6e{mdW f$`fmb[2V񈱨A[6l"\ P5'A+7,28^P8HY؈l ڴK/B!ȃ \A+C,b2 HLp/|a NE:T8J!чtV$ ш>1 |CX0BTfTG70DPa L""nЁ"V 8{ g( aqo@QvqSpP .dVlGW A oAԐM7bd5[vRb j``~k  Ɛ@  F % 4Z-܀ fBU@HzQ{'R7QH%! It7 A ~Lc/?y \w hi$ 09 LD>h"O+:N:s.u\sz]$aK^~ E-i2=aFf)klW2T6b,eF2%#_1T_ֲ>cP^DNch#P6ݑ`7`7QDlx/@qH TaY[Vɦ7&@\0 (~@vD+@ vEs24e&u+/(h{}@^BgK0`Fe0e0^@c;58+'6ӄdR`b/4&LoTR7e±  %z[SAX"XF ize8L` o@m@PAMe_Q)B"$- }f yquX @<B Z1 ?$j}$"Iȅ E0 6H !H+1c&@ &_ (i&WB@ {75/0Uhc!eeanAL>h:/lpQ6@~3"0c0nN&-d'wH'@q@K`eTc7/0Α ͒ >IrD-t~@)tJE.KUNg领8@pOp  QE2klA]te" 0 JQ#Q@2"wfevQ! P Ru/WVk , S&V9TTky^ry&P.tx.Op 0wO ZBSj%S,À P08 ذ[1|Rs}[/|X! | # 2[.S1@5ʹY5/ P%bz  "xFF gdπ 9K ۰55P >pR060r a  .Z2Y—yds$ y /usR/)6̐ ~Q83zR)TTy+KLPCz@99*27e(v w{KP PU&6&$1ANyER >>@ p$y vwkiP8 8o DJCC< 5=*sPtQB Pb{VBjU60{ FJ@@ t J(W(kPY(aGT~q)Cذ ѣa-O]xqD S/jq(sa jx0-ipv@ rj(aptectdtar#p @pbYL1iRGF 0POgwtIwvur7/P @  QTixia %:\镕HBP"$DgPoi*uzcřrS\gyϠ @;CHv K'oB0G*F' UhYEp 0~$4% 066 uS 05ϹٹI2pXTк  (.*eK y Nj᰼̻ ` 5 @  ګ5ś[ '@/Z;\jdc\I 1 *:@`KP#: P@ `Pp`6`nJlD6{XRlFBZ ^yjB<淥F@ R}R@ P .1s2 #;y x30N B,MQ%R 3y aVZ mc< Y3D(uJTb7NHBXC& D @@KHDzAF Bā4%ȯʖZQ\G#azP@\*5iQ_B`'*LE*G$x -ײ7z:O- \ md 0 |yt[7~R25 ɥI߃FAZI'K5*/$QugzѨP((\{P%&P>B3ո7V3l\N uQUM,1 x2[2:o `Wi[*P SHMԶO JMհRݺSկSWʹdf` lD/e%J GS,{p0P } 4@Űؠ +=G a09CVySṗĀ"61JTY!0};`ӕAЕ":n*7pr\%VF-3!( .FJ0'M'f!F 2E< ŀ{P +6 ` .o  0 x1,sy Ɯ{pA[PPg'}p4u,0@@(FjTQ Vp YJda: T )t&f HuIaxP 8 ia;LTܵ 2JaFlEA]xrՏ`+]N Rk!w`l-31Xt','P'6 J P< uaڌ 0-Ty) 5'2'%;atNdt J[O.%(T8.Ndu@g?NeDKJg|gz'2 5-np ~ @~3Vvz5JKn7c٘鑾Ku4sRU 5b|Ȳ _,-6Оhs A Q.霦WY20X1[ t 0a3Ȳ/h [+‹ i6 0x~(0w,S'-/q7n<ÐV $$ ?U.B?7KIz})j}1(/@_@a0#& &sr~9sŐ #\ P 0 /1n? o ɥ0yS{` G⨖jv `!=<-5dvN z-{3@ Z7 a I/6 L,(A!XgO9E h6s#Ŧ%πMuP;WH"Tl;gߣ eg~<0bP ++e^v?F=js'С :!J IXЦM%qĩ$8PZabtB*b=cH:(DϞ=yA#7I;DH$I(#S8Y̔Vri%2DCH"o"J:)$STu1cZV] 2z']e1ń9F_pwsS8M& 3Z עa&C!c >a+CcHrGJQrc0hZHQc 1^K ޘ0=27Ơ5̰ch -8(ф CZ{m02>YI^pP%VQw_5E&TmDPÏløzBd:CF D~bc"h)ovq;0J$D!;$ŚU@q[T4R#/5nQٞMg!9_.`㑛q?rZD+-a15#_nVp"V' q\HDž"HBj/4G1 YH@|hD6 %l WF^WQc^QY`'{b5?jH⊆qNt: E `I+2O1=,LHR@0APL b5I k5詏gZ`(!(a(#(w9x.IhBbĥH{Fa5J]H2D.f3\ iCFTd)<8(ILoQ"w :\Q..r)PpNJ_مp!0-fD&ihZv1dhpp! `K*qcN{H>D)8*ѕ˘> ?BI}183up tJĊ!urH# %y+E 8E Zv5nfDSgф*NbHjH ׹s-* [2Ǡ)?MDI;o!Bks&`2GG0 $M.)IB"8E.<)]jЛ".&=ՌLY eCbHN2J:ъFd?Lf< -i#(F i+X# >0OXW$)805^!: iJ?,g.Qnz  ozê pIf&cC \ cIHM,Bqy(+@EB)_x5 nX8)!?fjjbs,\j R2h1Z&0,2z \ %Fۊ-uKcZ)guY)[4ѕH[ظH ^pU0 KP ~pTrx.&Tq &§M-Q;r.D53ArPh@:! MPmo^J(wQ۬:؄v_7Or{U ^uC (Y,qx,BRϋ.w߸435)zWq 3XvQ{I5R l+jZ|9"M. UZ%Svb1'DJMfo:("E(GhM86?A 0mxGs&oH/"j KMS *siU|i jiC=Xޫ`;P8y䐙ʭIY 9<7L.'~"Cq1=l0)32ѫ+`ؑ7y @[XgnXqؼghUxW8BCQ ꐦW(< )'*öhD;චC`9yfiUh{{3IZ`""/*ˡ4Js.j-@:DɨZMV +x9 =0*PF-ӲRcN(?ى D$B !r@D;ỻ/Iq.)k8pRqb0 b"yc . 2C0|I `_:X(똉ܟb0 7CR@S #ęÈ9P \Hpbs<Uf̅)CJr,q /E܆kP(=0k +BD@? J@C;P7x ;eI6+3XEr kꍙLqn%KL۴9Y]Qp |4@7HRoX7AT0PPZ +BI*ATMErQ+Zhg `,?jHIGݒ fuV{֒yFPa9˚=K2iPKQW v!,Q"vB0 ڪՐlWl0bB8rHh^^vU_]b^E]}b'^*bxX<}m!H$z` 0UZh#-6ޔuco=`D&2lQBHȭK\ yW]UaMX8kAЉHZ`RpB iy Hɲ<*Thx̛WigVn}nc2;BňX)QJxG838`_8>#'qrj&n֙ fV xa^p[x,2NՙSy5Kڢ>M7gH 2c fTBB*D@h,'˥ GP݄c_9+3hGV ݋~Y|e-Z_0''`"Wq(0.*YMe?e DШ,ڢbX ijL-: 65_Ҝ@ki;4]]e pՐiEd!OR%2d;,ڻel(S8?S65QA H/R-0۷FZclxC@hJ(TnH-ؖ_%i- kQJtE=lE=i`fȗIEm}nBL$_PE/n/1_aEq>.!1+ĜQҖ k`XxS`6Hy-{@H,IЫ?"D`EP Qi`3akI TқcY#urR LH45HqB 1xh90p=LfZ rBaIx^3͹ǀ\U0o3!q#7j"F4@ :SbH^圐$C+{bUr9ɂ+NP3)5t[0i&CP"SaR@1xumD8^؄ENj.չQ[J䋵A %Ʋ^>\i"c(oh{ڟ1 fJx:3L<BVPXЅs wucxM+MdS(2 l%pI ʠryܮdrpI!Қ LIWܐ"хBW/PvyuȚ| F5&)K YðG3!kLE(I֞SJ LrUަqQ0B,9}& R,hc؃\7u,lC7B@!L~sJD_ZE-!m "/.Nx"\We : 3doE)J HsKr(/_&)7cƮH) UtI$] 6lIPҴ MX:,Da nrkTbCBbnAȴi-!qfE@ ` 1~)ĀL7յ^Z Q 0ی0ar& / `P8480 ba5-lIjzeeաRP;CE$H$AbϸL!oX3eEE,UX;fp;b1Lq5L㦂ft*VVZJ39k]҄4#b jtqFp!D1.a_:%[օxD\ W<"ϼFWRa)|G) (|GB+ # ሒgy2*n2芮0dZ E([$.dp?) k,RvRhҦmw"hng&d2wl :A >vJNh))wjmv'nri"g' 1hJA\A(Dj*3*A$(*(^ji(f֩,bJ0D¨g(E6To(40):")n.w*Anhfljnz2BR&|BkrB."ָ֘`MFik*֫ k l 4J,V Ţ 2lbl.ŖlRɦj,+B̊Ū ڬ ,,r,jll6Ѯ@,,l ,b-l~lj,ԮmкlӺ,Ȗ-ڞ>-߶-m⭿,&-ܶlŒ-z,-k֊mن->-^ nNJ-͎מ  NJn..JN.nƀ@ Hî >JB/fn/v/@z//r/no/oʯj@//گ~/o*Jp20o:p/pSp&0 ׯg w kp0 oS c /߰p7pnp/qsp/ p_psSq,) AAl;)+* AV*#7r71G#{'&G("1nq$):8#~'1̀ 2 &k23)(3)1B.Ar#2(7-߲5[3 -kK^-8 2 3: k6? nr'ss/שj==@32#(35[336s9r55? tf3/?G4<5H[sI53.3 \t.@6D@sFk3W`#h|%p(tǗB%tƓ$h<)yӗ<xx!L!$L4QB'4$P'pIP5q'=%xB=8!$BГz#4?y!47b }7C%)4gK}'uRgA=U$eKf9<69=uH%}5U;YnRAtWw:![Xq[ @\/Qp>!"0f$Th!C&4r$ 9UҤF8Ig 3c|yP'N>Pbs8Q4=O35?? g$GЎ4G(.]SLq%^O}M/ᾢZ;aO(979t)T̀ڨ8Fӧ53HHk;_AHGi':%7^)T(}Mćz]cB I 9x%,W/J+STyA+?C ࣎ң&6*BCy<+ɓIRh XJLAEW4Ea|QShcl0"=+&)@j9")a)/'CC 9D A,}4/ R=Xк C 1b3!I"YN8T/*ɤF8ڲ61z s@b!o̎(@ɻϑ$'tϖZP0r$c*8ЋP(Mj!&.|2-=5xj*Ckw7HzDGnIC-$.pԃ3#J4NJB71b*o 1jP + ZZm wmCA5'WTIH~bd \Px\o92hUMќuQ+o\t#9\BqI8K9"S@I/qir3]K^2gt1 Vj;!*NyTHL~6ï 8&CJ ΃(10P$a}D)Ĝ<I>3=n(29NJ0/y; {0 \VBkbӥu)pĝd Vls].):׿N[N|⭔5n'/!ġO|䭕x[z®`K_׻ElK;y# ՇDA!"p@`lDq)!ђhb"Ӗu[{ZĭmMKrhH IB\ŨSƐ1<)qf5JC.G18zD( q /KQ.NЈ nwtOZ/pq{@ b8Cy녪*=k1(۔ZCH\Bn8-_) GФ)ˤ)ȌJWPJJ6T-C$E08ǩwy5`Q+v!VnE.raD"ѧ4sA#OB&9Y32/ES<3V%Ͳܛ|YTNl:N8ΰQqXPoF eլId6:,K[W!^ÁlU9"% FkjRe2l\#948\' N\oRTf_VWY$sÅg$[baIՎP$oJ;~ b㸰Vڣ6xm=Qs+gC0L9g`e ='ҏvU|^DJ>hmra("&YYX-s0'o@(&[*!ʉOLafL#§\bH&NN*d.Xl\l>"`zuDJ!e| $.:"( 0| 00B0KhN 9JXkTAP\koF L:#\'^@rF ;ք #(}*aN lZ nЮ0+P%2I^g^m}hH26$>ѳ&aд:4on 1>H.EMh zD귮AGLf! Nhf6L[:(<*JHjt)t.G]aM"rJd<%l NX"vl Dܾ?u~+2;.%c#>$L.ϴ*NRnpifP(þ|^#/s"JFuJgu.8 n62.!H8!-=!-.bI!6R_4~BԀXHf0' )I'Xs_~C$tHgώ#/8EhdN+ 2 %L S>nq&!|L}+܂ۂ f j:J*(B;B|M-`H'/YKĠ Nr n_FL(KHgDƮJVzĀE)bABRiڤB-Izh '6cX8pC b450j\rLV-g+B$jEj =F"<&A ̢Y&!ҀU!.\ @'N5h? ]{KU)@YҨr*+nÍ6BJ `cɐ|VR%B;BDd:2FSFga hx4փyFVI G AGNhN>3R$g`c_吨9 mn49%!RIToNalPdžl Td_bI@}@BDO4 ֶ@Bͤ=3vlf&dsT&.ɰ dVFtDG gV`"vSMUŠ'2'df`+6ZWC[j MG"t /=:HqNE4nT`?/N@ DEV @t*zT@R5\$eZrSŘO(!|fnW\X狄E(K $ $[\c8 Z$ufT ])Xp&@ =pUO-2V]C5ts"+"W rXW )dG{5vu&IF~f$} x Wtaf@ BQMTIiHp{`v^YsB HcE춵jwI@A]6'XTD"BevBGSrvj m"ojFm"K: ` V@a&ن^zMn$j5y|SgJ<&aayȀ PTpA^rY ×j I%@ HdIVb=VR6AgXnwtI5&5|rsjCyv;V=TξΤcWwL%L !r ΀ t* `&L 5@5Hd~m\s]L̵`Iʅp(>й d Жa2hr\6ugNvJ̀DŽf)*Aac$J+$K o7 Hy!Aٚ/UfʝFC˃7IdQvʫ=h DEȆbvs(^,D-RvlB!'/^kI/zJj I> rr &`"sj{6lD+*)+eMN6l$+g@`]r*`f"jjBs|i ][SCY\#ksrϏ+76}2hv$![{f.Së80@ѶI闼N׼VxV:]BD#n4L_!z7o%bh6EM"U#,dr)A]RjOln_|ҫ/ˣ\% :aoL^}y+Oʱ6co|8SraHc*hi+yxc3}sHȶc̽m~SYxo(ev׌dY6lxP&=o8 37p{V6|/TӲ(HlH!CM=nM6?r˫t_<>*T`C6DԩUNBu**S>bL"1SK^׿0/v1}dU`zs!MX$R$ Fz]^y^G' FUt*xwP2'|rGPb#'pb'rK.RJyd"L9b *6ޘB!ag|^!F dwX^#HwܹwYYdI$J+TV)'Ar$|A1{e\qEAo''5~2ɍ7 YG J蓈.*e>޸ыGbgWFY%Difj fFi_+jL%ZTM"dH ~k$m$..oImB0%J0҇Lh~mkw9Zq+ Qw8!}{,ͭI sA]4zYdF(%aSq65k^!RT_DVTC.~~}݈ ODNz@>Շ9$B{ȯ>#\dA'FH(yjO.n1c5C ʂ(dVPB,Ez2Q' Rq#TZcP8%TsaF3Na'iNE,S?TiHwsj(KYJʢF5L6{ K$7ISA*% ac82A](ǺI )*щV dKBQ7z'NAF9(#oX2JiWDN:D A_.d&MUBBEGťLHPh+a] Pšu Rf)DRHR!1єN!VBqqJХwu;`!|s'G(bb:YݪW2Bsa!gwr¨u*JNrlYj)]V^sG+wr0Ń8;DjaB cBN0X<+S@*H`*Fzbr"69 @ys&D:%!vJ!c:%(K ĂSq ˫C!8B{ֳq2$NU愅W۫_ 9 d @r<-Pgz8 i5tg#n5BESrISث^p*&d"S90a>^&C$r kvQ*DFbۨu8ؒz *X.Nj+<+TwA:'>GAy.l+I9W!.FS.|CHnZ]!q^ kHF ): ڒo8$"r𺘁ށp4ڄZ^mkنmY}MV•.ozJٻUu?>( 7-"#^U刁ٕxؓ"@qt^*ЂǕ8n!ң>WR=CG0kkZ zHW]#)*Mz{,@OTFpumK5qcƕTDt#GګXU 'wj{P&8u(sE #Ɣqt\[d-ق5ЖfrHNawU S!b"Sl/`3qKT `" DM!N@Q]wt+U{\Rdb>b#Bw~[Y}ɕ8vM+ ) X(l#1Qo46SbAR-6rDgj`Ƈu6a1vvhofs gpjoe.lwA-\q(:5-aPexfuW HWl;'/@ `ʱ]̡yupGey A\<46vc s5?Ig~RHQ>Ngwp/V% SC/G(<,K  Z HO0xg{'aΧ*avc~.3ua YфzF#0%P eٔMJhhXw--^@_%$ 8` o::ߒ6OrX!7w&T`VwS@`Çvafc@-  -%q xЖ6Z6C{x9w`,ۅ8G˃?1f"fur=1y5u!6SC*tg[@k& P_GHSx_ =ٕQ}6|sI5~Bk9\W`3]ɑs:U1!S!hUV D" Ӈ .ZATq7|0 כ3B0RaԔ`U٩LӰ Ίf.ua6d3qjSh&A(ubfLDq_p*5RY@8(A"RpѪa3dKzi*fޝ6}|QJ@R? \å:v;uշz`\ KB(3 - u]03K&-k:Xق;`D$pi%Ua(c%B%ХysI!U/e\kBrz"$Q%L '##Z}rB#8޹ :K͕P+?%0aDWw[!&` $tˌIԲm\&rHn;JucC&16{ܗjC98b;\Q0SLܨq ^MqxFdٲҿZ1|Zڹ PDVz?R~0}n[,w!7&2]X."h$LMp wpiˣmE! y.~p ܹ DtU`>0sQ!TY$O8aҹpf_f:fS6~g2/pZ+z xA?J<ɣxÀ꦳U޹MwV}Q?(7?n})ejWU \ꫛ@ YdDpIH0jF/ Fi4O$a @2p #2 FEHrPio9(?j/ C (,nqռڼiU0YnKS*m6'B&Đ%-L"bH‚-M\m_n勬_~مVc-bRkְB-&3ݾzZY޼pi_}mWd><襤KS7*nXD(q$D|2ѥ>|i=7jQL98(ycC\n HJpD$N"*"5+kWۺl8[K>ǚ:  r/*סlU VDbY*I*++5,B?f:贑nmY(5V#z8<^;? C(2IXZE9#" Ůo0Zrш=T lF(G# 4qX(O=#Y2JS02_PFuɐ) /r \C'*)!Đ*QCs0/11HD=v>lra _B7Mh~ cI5 zHt4LXT P3<`@]rUrSX̓(GLeBE# ֋J^Br0HMz>Q2,!pA R{vD;8@Tfσ) dDLc ]%<#ɸ_ KX1N".Ű7Pl)% p,dϘ]//XGO NUjq;%t }&\$oZ8ΎU TXMOg3(xRJr qrQ9*9H0VD"˱LaΡ Y.{K~uIb4ȄÔ# ٿӼۑjL3J;*ڥ BqG?&'BCI07r0Qyۅce ] 4o:1F99-+8`*xRx,*Ȳ,q:ayz9#Dۦmʥ@l\:4R̻^b b#ey2ʣ`#@KC; 6*\C3:4!.ALZ)$۶K1Iُ- Oܥ?0I0[oO }'>8>ॶCk28K2X5JP=-¢ި!hq|ELB62(\*^Z?X ;4ڍP G>*ȳda!yH>(3/(/ʓTKm CZ QȪAApr?8 326 bl)ȑX1"*̩+P\]8XC89H \I )Z+C ~*  B@ :y q+*sxkㄪ(r/D '2)+?[aD8^#B;Zʼ@Ht' DM̎IײNnʂBHڦCCq#,zRA%.I)s3,Q1 2J0" E 弸]ʼ!^E e^yaK fC 5F;jF.B J=N8 'Es 4PJ)\)KDAOP(NHuA3(-QD@p@,D:aC ,,J@_:3Ûٸ C)ُ+D3TDʖT14#UO5<(Ol,FwLZ/;&Se)>0Rr|P;O0 P : <' 0zŪXjQ [)F΄X_X3 T jţ2*Tr)#2fPI:RIUB @L[Z! n (8  TZ>0ӯcҒ1w,9&]STȏ[Y1ݏ5@0S]35#8#LݑP@ wc: bVj2 hb?qNJ$4/V?[B8hW\׎y'3g@"R2JΊbaOx+] //( EL^R)/IFͫ-Z;QQ \xGNܽyUZs ?J{ S^=!ye8}WDp3'mZYCBc198٦8b`b 8JQ>.5N۴ />5/6' mC䟛 14ªD5Dk-4j<0"C06 ,ь+ɼ!E-#Fc\Ki0#^=p?2C:@9l *eJK<'[EsH\Q1a֊z8ccf8e({AgŏZ( U bhʻ!ׂK+H]`f9^egh]}rQ0]RZ;ZeWZ>?Cbл~!HՋai~g9N@PI!U8 i˓5\` J{&h I1AG_MD @s-@,m¡ՑѻƇ+Q}>)jx筘!C_ғ06Ya'm̅i4@C,Qiܕ⫱ԸQ@UA)V8؃DLK?F,kk2U(gx{xf.lOOl}ilui9,Iې3LD417`Κ?B'C)pIދY}AH蜊iZp5e;US6a{FpBX~ |rGİG.@T Z@ BUTBh! Tz=8Y_gb =h96rj0r ___ы&g+ Y@X)[09<B SEU͉ zp%$Or&]@ce=x &Ը>V:( `"6r6 Yr?nrY.E=yI ˈeU(\W=H1\8iE~5PIJohJ{Dh@z)E~n4gPݰY)ltRUfapr @ %X~=)ZM.v68SZx&?4ь2͠ Ӄ J(>:2v X+ؐfmf=9!F't''e*RK,g_+5 D|K."{r|q]űzZŽ:]kƞaPG5Q!pHpr]x9j.B/ nqgY:d qvz,G4҈'n\j0C >]hqhjbBc gG iTHlH_ Q@ CgУ -i\H!5twq8j95A )VD #>$A=# pT*UY&i?u@Ldb>ac,=1XHE'>1ӈZX-ja+bv0bt p|rA/mY#*(TTU '*A 9!C8A jrvhZX,a  傊\\+E}@"o!RgR"a!cBv.q"I JjeV|3!^18*LndH Q1*xDf;uHl;>>i'7QP5MݛT/ 돭l76++cBT'B!DZpV_VD!. ;6g5a3y\95yAC4xwifGBT6; R,8L SP8⇝,4myӧϔ< 6r aVUK%8Nj"COO~DI-i7͐GLU-)Zq qaKmhqC&AtiOQ#M Q!}cw:zN6x`QÕXxzQ S{fy:!b%BO# u3nr[qi5G]ZPvD2A>d!v ɑ:f>孈*7pL3A c΄ʾ0p g_:{paSqD !pɌ70R->m"Ӈt@0BlIBh؏Nw|aHe lMW\Ŋm#Ȍ-oPh[(ԔU#)Jב׸EpFƝ $HvYȏ HUf.,1C!A ěDkՉe(ēa҅U!LBnR ΍YKL^P5ݐs!rS0ƎdEL4b,>ұ8MK^LxI{QRJ&aRԑ] V=PeXLT ۣEpEp פG-EސqBħ5׼3$SMXX-=D)B,<dh21Y9M%#JI^fIfFL4BUʝ) @A(SCT\|ЄTDAr5X[w\Hi0Υ焎 BCߔaVH#`I}.h0$Ƞh%^ܻ]/Mo~ܐAƨULUua(QTO LU,eTEXPqpM`'̤N\O P"Bhʭ\|aM'LP(A`MPe:0iw`_(Oqx!WȒ(8.142Lti09!Nǁl ]%`DnNo< &GMp%'BdZjTwvٜ\B CE +If0bmnL'46Z. caRa10z1/M^L%UTBhhA8Q$ ZB]^Ȩ,LUhm(34̆6(jY^ƤEBשg8F% p`_.’h0h^05PÆz/(iNJR..L*`fLKFFtIe_h-,J#(DLD(# m JKMM*ԪPNlj!FT,l )eI}0,2,4`6@C>Ꙩ0z`1,*k\ڞ_DTHBFN#ЄdNcύFV!NTHBiK%p}}*^e j< M`N*Nk-äE]j)./)śv¥pFgL5輆N%B1MYj@K*R`ɎˎGlUi[R1L4l2h6RTjlDLE`P,jRR앴 Wƴnzڇނ)B#='L̆ʡlĪk.<%V,!nz >] EA[Z|f*!3<3t+2 BF1D CZU 00`'QEҟ} )`x0/ /,n1د/,205!403,\0d/)'|nm!o$[}/`oϲoOp[W/ 2<3`Bo0ް//VPDgpFѽNWtoYI{,N0Ă$J oiWžA" #8#ܪMʂ-PNuN5HV+w Z R_ˆ"/4lCoC8r86h48/H*"0h!ϯ0uFm +"_FT)M_"lQ6F'M%q4]$ovk/&p"/UmDN8B0cUo +w.1#rmEnFWtRDlB.$#8¬l=MH>,<򭆇)nBX.dj!14¾Fd1U3(˱=nT=؅6"/`oo PjftxVFGrH+R=0miL_Ltگ *hVg0-Ҭa0{bʡo/ )&2&^,i0ig5UNU)vXЪ-`cAlD 5-fZ.{µeWvU_˨"j S`ԁۡ X^nʛ)*L1,!A 0!(B"6"o#d[dDք)GjlD߮3REUiY1d o#_lZ.|I6f: Ȏc4ĥ%e:F8,1Ld|D; {RLHKa&o/}B`*BV쉨HpAjv|A䌁J)Ηi\Pe}R,ȎAP^cOmFns^Lut/j$q3B9'SN4hCb3xR&ldz]ƞ_`k f(;yQaŪV^%KGJ='MIxqJJ$ޕKB^ڌEŴDUţD{\ )^eLk#1 E5} $,O#:\EB:9捬B- wQ U!Byo;F/_AۉH=SOӴa[ ɛUh<-֪d!d&xuf01¼!YPk>˞ 7Ъ[q{.B~WlӉƧGx9+B8*ED"n苓b[Su^ߐY *S8M2QC*QrHSĈ88UF[cH#E*iR*:#̏ej5zܩADC9("E< lQ,O&;$y5$FT=4׌/YO=xSΟ@ 5 W.⋫YNB̘;zة;ٓPoq#i*B>UTŽHr%Kװxf5kt o} G!Cw =$RÊ|1{f[vqۖcdXшdVj1\c=g= Tg|BRx )f`165M;CLI92BX'pfF;y_pQE0"j+C "زJGHDMN$*Z"\j%饱8k?֨c> NS2($8>KDGnܸX '5ٮAccԵ/0T ǰT;&NDE]vFi9\(C"OHc 4P--B[<flZd? sbb/68M8y*I)ST;S(ZN) 8>T#Ҩ#3;ި o=@-;9M _)&Iq mm Cd n!=tK|BFNH˅q+ܷ`;/ˊ6`E+S(I?Kk?^%3^\FdStI0M9NїroE?$_{[YlQ1pq IK8 NNZBlDm+] O'Yj@a΂E=8pecIfk)6(S,Q6d8dCB(GPP]c_dF. (\h˼ `>YXzt)L8 A l 1PTRf))-t9D}!D!u Zӎ8 HT<”bg#Abァ& xjLBhn:񑐴dO-C6Kx+H3(AK]17D)PA NXMy3f8`/I-pH 7$XŪZu fC{ YHG>sE'O֥E YtN jmlha7bItX uĖ|$(^oNWBaEW b5;~ &|-tueIMh )A uq^fL\"eV<ZIM(CACI Ț3EyYs GRZMD!c0JT$l 냤0G 1` ҰWoكDu<[#;6Go􍨍mhc䞱mpV7xh0GżQ|lml/ Թm&] p yk$^a z]+\y_re=_E1ps;ހw fB7  +m{lB2D:!dN7xrb읮*-\{ L*C7A _6ZTy?hB^F^]%{}!,NRl)d==\M bz Ys O #Cϗ[ֲ ,W6E| _HTf\f&XfœlZG9E}Pؿ/Oop49Ϳ-f~ 2U!e+SC[afo|/ү-p̯< ؔFrFb^$6*Z B~@2`JހB?4ίDBV@N }ЫjekE.c.jleߖ\8Ɓȡڐ᪠Dأ͎a\ j6v{ #"dT sЫB-2DFNGe(lgKJ8 r;A.LcrJʠlkNa(4fF&edpF(PZa9D(R$(RN ű99,Cς"(ĶjH4~ t. Hp@@7$!(APE \U0 t M C.0@(*!Z "a`cLgvͶR n.~ u/_ĩ/KZ: ȔQaA++ae~<ĒAR+Q+$BB.6eCtJCV`2 8BɎ((!!w ` ˁܼM#ؚ"4G.e6,(7MHrd!]oގUae}# T'[JZujup;6"uFκw \"/!:Q-'Bk,jk &ACvDU$Ruw$.aŅ(RI02&fir9|/,wF7i$=t.wk,uq(cN]=bf,2"n24&&0W[!D{Ǣ+i !ZdZɶ:,qH/0O|וb!ܯiIдXRrH(k-w{Ŕ,mhe)dAf,C]Y r]ۯ.gd/8(PH.q Bm zY i 6i j@ .N1d.Ҡdp d8x{$s9-6lC G'>oX[۲CwTN;(+}$#{9B{b.%+BWfD*T+Z{RRB0dKM ^*!fgwAЍ٭)N?"%!zduE2,ddO |Q#-~.C>Oޅ+9hh(R!T)Ode@f40` g @ { KҀ;RUK o'ov~@g uY v.fHX *uFw [C-k$. RE )K( "Ĺ> +O~Bɲʸ>y.(׵;*YUy o&/lemyN˗ū 5Hܘ˯ҧWp|'kpd=$kGz/ged*Hɷ9I,奥(tۇV4MD)yİ(옺dMaPF<U(׶5Y_eJn1s7F'?(NjhI#Y\h+HAת'" BDJ z*ȩaNz ŋZʈ -p9(Qє;u3fL=}b':z t蟢:#C Ij`V=th)O:;61fƬYkƋ/_"f;zܥ옯\.}Ic~yA"s!D =:Di8QrPlCO*^[I:޸Zt'gP9|'4?&yyҠ ZhUfSĮQuUov+Ys}ĥ V,3V a>qI !vjmY_Jmܦ n 3R1vI[|)6GilU]Gq1Hxq`D^A$qb. L0,ɡ/P&bJgQ%$%SR3S 9%hKɦNLfSLfqJQnkwpqpTr!Km#R\Rdq\YVa ZkXM4T$Q.CL50!Ix=7B$1a0F.TJ)4]D ` L/-e)t F,aIz3xDI>sR1!dA %H-fhD!0i#4 Mq4+ЩWC+$ |Se8QM8k)V?#-TQS!TE5__XE1J`NR(u !&@Sl1ͳJRvl_[#KQ'Du'@ɉsyj(98J^J*| ccVّVZKa~ t.:|" l`3-i]k*#VAUPbwTNI5mh4iI1zSD>YK^${aN<$wՠDhxb NlD"g,Ѓ@+8|mb08 Rw!CLB`QfcZ w89Hcz2An VAF<Hg"ed"IAE(Ѻ'Je"< 2~-g43YjsҌ=]pQ#JI1(MP;u$Gx?*c{Ȫ'u0,%Ym[a~'AI YUL(^%@;Rl%h6̤hmF\kIؠn[*烡 (EHJ#4y@p.THa+TA FW``配z"!B,uLN}MU"h T RQ^"P\~! v\C/k5 VbS=$u{$õbb(/׀%"'jPPfGdWD.=\^Y%JSȂgn*ȵvT U0paW `%c5{1])q "A;(~|AeLYЀ5U E+/( _TniQ@d[dUv YߎE*wHbvr=d'X냰+sEsBPqWD]Ycis 1_vb8\BR'e!i\$m5=( 8b)!H{ a X䆭no JOS THkPxs,(#$Jp46D("PT4uч&H'*Q s_]xUubъ`V`7/n a2 hXܹk"XN9ڗ1CWyDV)Q_G HO1G~qh|Ac#cr?ۑi0D{aRVb L@TUCC1T d8CP @P{G#pA[+G;nSeb{l\Oct!uR@.RQW! _udЀh517SB WY!\ "8 ؁ ,g6c-K0H+xD+u`P&W8R]N  P,mw1۠ F1Bf<р P4%1Ѣ"u c7vtz vwD wwv <# IJ -׈eq sVf=! PzP p Dys(Rn|v}ej hiv ]!< H -R\@`%$91YC)dt80Wz{,ǰv QQI \g$h{Jw^t;wNSZcbvV UBwwzvtvw7{}[tJw 8N XC rZeE XV =t}nS1U+ux*xNM@ xMyNiD &G$c3Ƃ4~TQ(uu.< )3!-3'WG < b&WH&#i K-gwc70(|thGA~%;@XbH[H[0 Lw'-! P "ub,f%fр_Gv#x~ Eɑwhה[1 ' x.sU4]V bFVb7VPщ FE PTz7}XopmIB ֙i` 1R؈b>Ѡwg !Ï{SzБvWTDu:4}$ \y#@ WN)*) PS yѦ 0@LNa m]5Y?bTbT,?O'H(y'%tГQ5@{`X#NaZ)#NHy)F3k c?!%Y*KCЬKpDirD54I`z"'N`uCU``S`J|<ewanZ*XP dﵞ`hF\b/4eGcy!=#\5XDZ3 & N]^eA$ 2 e_ gbidK\KH(tc(44;0KU9< c\+fQ p Z:j3qu!!^"3vPfpM5yPl@FX޳pC#\2uYf6{rtf+ipN5e7Ú]Q@ E_T 37rAd7wumY [jZ *T0 r۸;$N'5&OAVZV\Ub21l4Q"%h>b!,P Q\sja%>׵]$ L @FD Qd?\[U 01#!T_hR'l2GDz*XL'W'GmnyvyRR 2)/r*/\}2+CPTT@qsRVDHTEh2\!el5 ! 6+ c **@ ȄK aJ(PIHF1H@`ZXuNi 91>rdA˃2t3zPa(: ?# WN|XЩAXQ3=`UU!DR#Q q?A 0},˸Q>a5N|p 68<9D'վ)tһ592Z5נes[$Y{"Ap,z :B(1 !u  {::s F"Er3 eώ,F?^1#r"3)Aj @ 5@p_<LD=T'X,؍Df`X<|bpR(4D(^ _ 5:A"3) +/FFzBg/f*/u䛹0VZ~ZCPaPoR6 8): R #>-T(6*{DZD|/66b{f++O&n> ؀tk̰,#?= &vyG=]&N ER4Ӡ*j3 c63G+b bxSee\\4G5ӿ#56or<,2q H@B"CGI~8MTX3Xpa!q $"yLAS_Zd.dg5 [$^j ` on P˰[%%V:qa ZBJ $W!V#Oo^ ˀ S^E!D5 1 q#Jj&ob'CHĭdDeܕ +"EXDb*jp ǿ AC㨲b7g/64410/S8Ke} H [AHG 5#Hx p@ p p⎐ᷬkp alDKmbL/Ƭgbtt{3@<&8->7QqhڠUs6gs"#3\VȘ9i@46["kBeG401sZi'NLq:eS'SBT;cx˗o6^\G̝:|݁h%C&iLJMj+WUNmrD2tgϝC:uZI$JQ`N u@OzbЧAS oZ*1pٽkVݹHB1 xD>l͜JhN8Uj&NeKw%VZtha8?!DNĉ n[pY^zٹ|*X5ft2V3‡틶\xi}].ޭTqb,>,2CBdFK-!/ZVM )bh>Ypbc%ni &X!pG't! r%‰+p*B/X#5Ĩҋ)&b*XÌ5ಊ!X;Vyo>;oJԐB1"'P)}2/¸ GcQGb 5.C5,ݴ:t1P胤$0,$=Z:Cf-BXn5x%; ֎UJI8p8>C%Cd0/Cb\C 5WG`ʍ8M/S5 u(<uSk)WY%^!dI$AdbXj-PidN|CrEJ4WV˩E)a*A'ބM*!HDM"h-7b6Ì*ӸHB1XCX=0C[0)F..KYrҩ>R.GZ3*84Jf j R9VsNy*al? )?vé,@x)%;(j MqҪjª8;_ )&at 8V5NUƏe6[%;]rnu>bʫh+ok貿=Ŋ3=絨:ӗU{NƉP!_G!\hh/q؂>h#̠1Qk4!6;n aIL5&t,L! Vba.AvwGSRL))5łs71E3 It|8qSaVN)CD*,eTw(%Bm,} '6 NO,rPCֲp2`ch"ᅢj"av=0h@..{ k`F5kjL}F{\Zf0l aD*"<%~Qml{@92ȲPo+$ aym2Qf "#!j MBR%0!LS SD-AV1}UFa Xbc&pU$ e5/rOxKRT,/KiX/OSaZSUI8Tvq]YN㻦 Tv'aO4%.%.A-;S+1&$AULRR 0 n>j&9I0^T:(D1e1JbS O했T"]":lep]\ֵam1bKPVrQCѢf f1H'DvYnd PCpI7Ph! Qx$ U9Q.znjOPEd khl;/6t]$`biS\ZGIP?-jn)WZY dS~*'Bƶk_"&N.~w6qh^'7԰ ؀3]o fw w>O3A盢|vsw{uwb⮦) s`0*h6ޢP ')Nn,TW V%q[!=A BqSF.2|6_ ~u|;Ov-cG_aSR; w Ч9ӵ Q ]rJx GJPC0rQEG JȄL]7X*25c/XIG@BKSh;8@X5I < ¹(s7ȷUэ_b.i00J۰;Aيv w /+ SUXh7` S؃8 kE=[X4A 8a]_bђ):U x0б arZ0r9 \cZb+s:7 Xx 5쫽ۼz˼_ȍ U بa`[`|.#\>C9,P-YƎɎVDz, TKlL]C\.:,=;*Q8SJs*_0?A"&J$#)$)K1.5 AJB3>KԶU؃>+.$qA)G 6ʴ+0K q%Xt@Q(tͨZAXY*TTI707؃`I7 8HLM8H`J8ai7Dif'y@:$ļ vi$˴L5zK3C' $ռz*JHh  G:U0=5F _X<:bЃa_I5=ل)C`8iQMy*c8{*i)t u dLBQCp1rN5.˴1݃P $_Z=BG8RpX]+RTaz ԉ*Vyřܡ=M8XRbј:g%y%L݈6j>11=5( >h¨sE$AM xYDJP(R7y{Rc@Swr3ڃL=@`DH?w)޹ rp0 hq 1=d+/}(MU!GWp.I:x=IIaC鰑DеaU4/zGEՓVj 4cv\ GX ?&}S()C+JÆ5I5X+X17Y!XOn1j kbbp.@9YD!̂12NуPQYKsE3#]a>-7>(K.Ӄ7h;xNA7pEK"r[DY]>-eLDѿ1e|Y_YM;M;5O ZEBhv/Rܣ胖x`b-VfpAB F1pUc)څ&1Q KtJX"D.)23 ڔa&1K * *RV 1\װ/ j]G a2ȼ Q뾦]FIhQBGPxb ȸ8D/~9~VN,i DKSm/qh#H n/yU vT z_֋vNX5@DLx/ȏ(WDtثpt cʦd IU{!#!Jqo~Mk"E1zݣchB9&!M/)Ihl,Ֆ9]`S+gsi[[N 2H[F>;bm/T)iΙgi0L15y1(garv$_1xQ5s!qYe6zy̹ݔ_0rR983MҤ]ZB8 ug.IPkā_A9fE^/ 갏ÐB!v.>S[AÖ L`hPc7GH-Ju^*RR yUt9k==`\tKVw3`aKқ N_=U`ЈMMv=](ht[  xc |k1ЅPIL;"a E  b[fb:]Fi`x\BTQkT!̍`x\ ˆZf9n:c]C9!PJ':d8Id+8\NIfaC+M)Xwe'DTξSŎ$֋`0E@grr|QsLJ$$J>PÀ|ӑݡ|@[ ]72:}!/r8pSqBILy+/*Zr[1@2oDb$sBB8fms:bl?qα,i`R-mׅxTxW! KI!Bh61lx)SbWqkթ;RxR/%Uz#:2>.5"K<}Ċ,aǎ•Vb *UJRx#N 7A8ZTӶxխn][~9+\MZď2QƍAރPb '\u6q*ݩCN6uBejذa^:,W[N\5wUҥk/_ŎՖc˗+:vfcg׾ v fذ`}{oo>.S;= U,n7pt--1g1r)$N% UTQG8"H,"ʲb°⋲QADKDI9.ULQGdkQ'r3`Pre`Y$J*8\l{H$eJ\dqW\q^^j1k(ꨢj8IqGiw iqHB!H!zd)(k$hjvQpQ_<~1F~E^H'~yŝ#ڪRJ,aDF訊qLzG jbHzH!4d2k-CBTnֱ)etWm53,u23gsStATRX -4cC7$#H= iEnV,t*v}mĒKk䅤z8zpOhQCy4"tIW&HCxDuFB[eĹޛ=^uIщXҡ!c(BhcmkC53l?/Є]͘}AMpn1Aչmhf6 NHPQR4 YĴ'v ac1L d CВ*V e0HRDdf<~[#(/+ a`.!QT5R]3C Y O D|%8a ʣa ʚ%J,;(+vCRGz]+%1Gi IJ⥨0_ҔfKS: )JD4)P'CJ"ܰaNB@a0Etz?f/kDW+:XMi>ىҨf")Hё!Z~$8]`p` جΜ%)'r\La=?$"ETñ ,-)D 3 9DqD ZJgezaU4|%跌TH_ҏb"JyWXŎtxF4"}ŷQD/8 jsИITx=R7h퉪}6^KZ+"[/=XigqbGtoz\Z[  t򢦪(F+Ta n7.'Ha :**OUB%D)pg|)R$D6/ *q l`L$c,I5Oq+)(|=jTԣGMaÁؔ*UEb!&1C|}Vy7&d@$c쀈D\RadK!JEHKWf?:I^@L~&31\杲e% NS"(> S?}/-AۿM~[O)BPn(GxCҮ*՜hF09{2cʦ:T V#6Љm4wUC"!%a@/$5IujH%B eCKȄ*I&q HۼzJANzbS3QT9 P/3ˎrRf Lh"*6FAb3Lc\|+O2DhHHɲՒH(B]Wɡy)^ ?̟/%\橣(j7S~ԥuaW DJ :MB b&Ԃ`I*א ^t. _1l\O1P1lmv1B(X%,hX" YlBaXS%"IS䜂* ܂*\-h`^|\f%]0 ٨ĀDJM-AP!$ld%QTiwA[pME爍,F0|_ ]P\MBbEC!5D(!% Ch".ј\Y=L0Da(串GL@/LqzPrtsT^Eج]lԧ==6bU]d5z.L$ [  ו؉>#R| 舐HA՝z=ؤ L$ މ|MxGDd-)YE )q'8!ԁH{$dD1KTOԴ}USLTM Llcai5NV9XŽ##$K\O~_]ŤHW0%2E IKDRfJ5mMhSLhdBl쨎f)L)iD Ǣ5]LcqES(tIuIV(AȎU A8"d MAdEqb@ MW4jȢt>fF"p,I }R@AN#AAAIB.*DK| w~\A 5$Ɲy+"ւB'\"<#BjxB$P 5Ӻļͣ0&NHLPT҄6%vPe^$t& ))D*ե^{+O_ Q5Ӿr1N1&¤٬6FҦjVيoI)"uU[UJER!PH}':XxRM >3P؍(삂L4.Ȃ)B1p`nl(H^T}K5`z\1Cu$.f|&rW(eW\o花# mgڬ@4Gn)D}0 ǂ Cu\G1̌FG&/Rt`Gl).$'Nʕ",$(DEb\t.HANPNtH.Rii,u0 ѝ)dFyddHƝhy#H},i$g\e2 M!B|Dԥ%I I0ʯD-5NĘ [ )!lK )ErJn-r ]fA{٫$]+i?A Sxް(h!0Ph(bG׬E; {y(2==&#LDGlWmpNcBh6VE]謑BV}2474%p {).Ȃ'3BW-`.܎aFd[F-d\l";(qy.'9MB pJKhfd1΂$V'hR V\dVZj>,1$C/IostIIFš&%[wgS2vzDN!S8*Jg< ErHVk5>HH'܈u/Ibp 5H{{sc?=~B)}}~fqW|fEB#3'%6S`˞i\3l5TA7\[TlMyt~nk?T$&bR@w kA30RcQ(q@xt'VYɒŊaBE<6MŊ#fԨF*tI%NΘdʔ+W\Nr M+UZҬK>LET!sF Q^œs˟_Ԅz 5LiS'b͞b٩M<2k]wwq8c`5'=wreŋӇ@@ 4iBH#l!Ԇ<ʳT,ƽUvr^#5c761t‡ 0/aP_ΚuԬøʁܩ'O;m\YqKc"… A$pSη\ Bk% }0 b9Fcafeh howܪ+T͔![)#O)$-pC7咋e !0,b qcY$fS=[9:C>sFsN>DQ=!jem"X|r8JMZ$IJ-sbr!c|qCdVS>3CDC?1>C>6b6 %H݄4e8TTiŔVZ6. @':5C6è/1*Xs>&#JDYr0Z N9r!M!Bʅ/*/aPD _%T؍+1l Mz@\(R4iQJ U eL"ӗBX+A=z8OzĀ1G術y̓>i}YτfJQJ IAMrUhB8$&#E<tEL_(T!te z@*l$kA OoR,Z&-\܆oaBN[U~1 VULH풗Q K(H`^fV\B8QʱH0 '^XJ2E%O^SA1ӌ0Dyu >l$Np9! 5BP-arBѶ'g L68!11!MPpJ!XH]  cC}Ox҃Ä1i]b>'Afv02>aN{D.RJmL 5!t;}Y> F~IQÐ0/AO`Wu{qyؔ@M&AF>u1$< 08pT*J, KP$2%S0UR klc1{ ¬}D4_ډPti KZqٵ&PF=`e 6ynDuBP}"Bwa'bLڌEilu7n|ax3L-i"wQ-5x0b^hZi)i%% $y<#AMI΁kq nKB0r YbUvpek`Ɔnq lRz\"0d-!_"9~ě! DyǕx&%IF^+(q\lbMPԓBx|標R^ tY_;9wX?98K[*8;ΤpDq>^"o`L+Hxþ0p YBMfy'+LVr( zJIv  q̒E+ VWyAބ#! Rsۘ|VD(bq2TPljxS3l k*"NT"ǕhNƩc_E vG%bp$LQHֵ*W" )7BSث5s3T#KaAr_\0c_wo=& 6qOH4l*T!Ge҅.C^Ϩ23| kO-&ZJO0ovLP:ʬ,GyNvnc$'mmB8]OOrK̘A^dT(l'DnLK&D\ H=O)z.- "!"Fb#N!Jmkh ! V ` `Xmx wO1@x$q @rZK@DDrv#0|耮+)v" `{-)o1~x0"++ }a$46A 4Oψ7$A ] };CX%hjB^kkJ=NO[6O^dHD+Z[FCj˪ ϤeCLY*0&w=칞*lPIm')⽦h> ~OdR&Ū&xBO&e,H"3h(]6+#uڅ,R2Cl2H,IRXǐ',hJ"dI.KAUPJS@ XfP^EDN6P!~,+H-Y-ũ$<)gPb 3M!EsLb N!jŎ]厂a8$nȨHDa,tB-!H&!F p'&xBq};' <|'sC-6ZIv,ެ,T- Y(wTJ2>c!NT8A!T!zEF"zBPLKdI^ddt8hDآV n-Tb_{L&$I>7|:UyCk^6L%<"_F+z`hy+ GXVĶl+{Fe˼T!,1%8B^B*z$%]l)D$]VcN|58#7 2[KY :qNO (^ZPNL\Q}__vBLG ):,yC. 7ja&3׺9(QB$H#WnNW@)ga IYU0čƱGd KTBTa;8DNDL;|8~^sؓ7*#US0dCH+FVޥ+6 "ˡ$[~#.C `3d3>gG FGp5EdVBP/-D9肂LJaM'vc}sv(c|0L10PC{C܅X@W^ "#nI9~옕ɲ( UY.Z(Srªu-bJc+3Blg udːmHJ4%L'c+vsVCVMN]+VYZ~V֬k ߣqhۧF$͗s+G8 HN9h.M59L'q:w4aOPUEeEL8CuQGe84ܡsvaHb@'U6+L3M,Ҁ*1ɍ6l0V^)0F^eaJe\rFK$KLN٦IL&N\AWTQWA^ :h^g}9t٨0S!ǝ&BzKvyeHZ%XydI:^|k_1^Ucj+aJwkaA 161;)ĂJ,TSXW+DnyG38ƱaFu-H {8"#,K_1zc%k*{\o`BIȆb \CJ֊jvLjW6߶m)"3~#Q84N8 da*b*B}HR&%.UQ/JRag.͹gsں-C]V RbjuH؏?d&_1"5uRyWmK6+Po3sZ@ܝGL,1}srR}x\m k)Vm{um[ CgKZs ދ5@s omFµuF?QoH#<)m$d01 Jcް;o`7Qأ'z]l7"D-\iV! i{bCj-w鈐O )^7XoتI&cZRItA& ( 7Q] 43 uA,rܯj|pz <ic% P>TzCB(juM,Y IHRHe% 8/ >fB&Pt$4>T]KskȘ# qW*w/uJ Y$B4($!5NdbJ^sO3FT ~jd2t =rmUedyx1K 8Xp/A 0$LJJ za ,7!s Da rx`Å*B*-H~ڝR(%T4y*Sru:T@ OaQƵ1E]텂|_ܡG <թ#ur" >!~E[նÓks)Hà6*:A>UdujHT'ۺ,ny{kdMY$Pb4k!| •I)uI <4[B{+-q 7*L57A ?qHVtJϘFHH5 ,iiءxT )f D8 aBL0$(XB}(D xc ܄0,lMkN!@d$y2!K/i!րI>i =4LJS&;YI58*']DSrf.RS1Nq5gǙ49/AO.d0kI'43Ƙ j v;Ŝ  zAIns9*E0U[QQY 6:.ւy?Q `` А @>EYQdq SXJ'@W!9go;ql1Gd\ZAA%#1B%G)̰Q"^k7mv϶ `xS`EDk5EL{\uPGEEXT,\|AG]xx`,d.7 `ag N ))a21H%#& O pNz bfcffg{TM{H4fT F q G恥mvdVKXQ ~GLwQ+\`0_f#yIaVMwe'WIU04+^`fPpl*V_NW`"&zl!ScTaVsU|*p-dsޖv?$uзpsR%VpswIJ7S7XSƅK;}\8lĞ]Jv6$Ipp%sO;u5&Va3q9:ǧ=/7oϗ&!q  jX-BRC"PpUG~nrBTGk̮wpUN B~{a , uƉ mmQ>07ڣ ٧}0U@Q=W_Ů (Sc<ꦡܳa ! #y$1e0l7BuQg]%zluv%$m%Ǡ  ?28vk=Mm(>-᝛[c&38Om~5l AJ L{Q!aZAb۵oAn2Հx@t j:[ 7uEި\g7*8BB6Euk٥5vlu0Z=ʸ\d}/RxԸ#۹i-ΝG (nIRIR4JQQej)e1eѳF͗|رs $E(q%ʓ)ON[k,YcVW_cmt'?wd:u1O@}5ȐBBtСJvZزe̞A6ڲaNm:sUE |N#/ڋj;fV1Jm$0JCĐZ n)9EVrJVJԋJ]Q5 Ei 'BB%8h X‰f v%)#\2 | dBmQSL T3eWb,(܈!p!b 50V+XZɉN8GV 16a)B53 8i1;C\)i|=D\Z%7y; S8_26 r3ߋCyOe7YS߄uq3dmlZ'eP1-4; o@VFO~ *8(C KS묛OSV)In|;^f7M1!!IL%j1g8;aPwיKN2҆$.IC*Td kTJ+Rȕ}ԙ%+d ! 2Wgϝr1,HE(dJA`6'|PΥ0dTj$1gVERuW<ըȇQaķteEv]5b\}`jUKh$&-8R5[nhV\.ȋ^¨Ixp`-:X(a4X2YA {@AI0T2-#8Tw3fԘ@ 16/TKє6M NAL-S%"P4DO cB2z`Ӄ=Zқ(t5"qLA&ΒsUN=C bNeԹuZ5jS=Dz[Hs0ǣuxJT߁##eLcPUL .~3WЉ@B )MErӖp/m2*`vZ cY>H d( lNQHT fTpm˥!vɳ# * HkAz.AqfqKGèG5kvҘ4S#G#'||e'V̈ wL94 A D@P,Y.WKXBrpմ̭-PV#i3}9<$aCD!Q"mfngE%0MA" #xD I[h7NHC=9gk^ 0ħBG;JTz<t u%kA/u1٬L“$'eJx,TnNsX=X)8Q-Nz)PF|u0NF~6j{MG8AnGt? fWщ0.ce4>JnX`:*m V~>J;&%7mq`/4)5P$=ؗQKOʱ" 0 0U{8`!;> w8vyЙ8\61hmyB+@+X瘔蘃?+C؅ykᚆZh]@91s@P\xxb@,Yk.-q Rs Ʋ.+ ND3OEQm(E9ERԆT܆SW,mN D2X9:!,YNDEP|E)IP/2 BJ ; :*BjO0=ңs=j7BCYxS)*nC($$\HjQ NkȆMG` {|1=8Mk Qj=Ks4OZ^<^+BHA8o$-SX EnppІ(`"$,};O­ -dW PES[EXMk@ EX =R ]ER- OTb@[XPmA )skܛ] ņ pΩLZjM2.U26/=SA0$s%YuG4MD99%TIN=TDJ5T?Ө`VH`(E;[=[uWѓO9ӭPMEj ٕ]Mᙠ)" ܫ#z ' XCȃ  @۫0@WI\mx'YӃ5p0# ;8 ;p9B̛Dp5) Ĝq 1pXp ML_kğ hJCܠ63x1i& _ z@] z݃ 'Ol_217b41 փ4;@M<|WD+0 = Z$[f\CpC> O:7B6L# րDRH:$O S$LCJ灞7H,#RQCOeEeS`*M73ٙ00™ݸ."t2,Pz-hJal(J,&N9yԐ?pI "- JfmNm6Jk0\ cD"P脗btzϾAQ `- I1yNF{^IPN'BZNKq#V=pK/JA .m()W=9I\Y S7$nqhgIdtδ{|IQ[u!)IX]bsaD*;/YB…`8曓s|Wl C3IƪĀqh構Hq tkPn5GXS[`S`3H4///Zn+1yr:FB8:.iuL` >voxԜVALGrLLBobAA8"YJh pNc'V^FjB'iHQ0Uqf,RY} x=к%*D߰xBa0$!|ms-Yﷂ3 >f$)9.ɠ)O!&f ,zёS[xM,skY%IezJN$Eh(MX0rWݎ[f0Ch |!R2l(F >3O>| q%R)OLҤB ԣP>iʩ塞95$CCYN 2$,>jh!p(%.QXyJ)*#Q 陴T\w\RF=6􉕰iЖ-װ=+lbj̞Q 6j=fОUV3fC,שMm-{lSk[)ԩSL"E*xW!_+VUrł羦 VX0ڷgFL13̊N=/Vm2ekAvJS|b1_!S fhwWHRpx\UE\W腉'zkFauF]QztG<M5SKD!!N=II% r '7\oWb\pmHwQ6걣d:a!bQE8E (2ZαF5G|QPz Q}2.L6LVZRK-\ gpz\,s8'R{tW1Àg1.{c,gЈfpj`X.&ۘƉIJ)nqU1,v,&5Y35Tc3fV eL0geXik'T" mZk,\.P'l1sv16 ͍'6XcY5HM.r\u,\wł u[BR3eO 4#Mi^!B fx%)\@^ (8 N~r8AxH L(E_``6%o !0Jo!1%I7#+s GLɅ #a,CEG2 (1iUP`)1Q2(GHG, a.|qewZ5Xl{|E,؂+D[jO.bqgN˒+Z6Wvpz2D Uo3 T2fװ},3I5LfH[-Q oj 6^l8x/8^4eNw^vJꐇ<"dE-jTS4ɤ08QQ Yxj T45= ײQx X>+ HdQln`&6 pkJ!Q%,KY $qDS;LJ  0!x~Q)(SA," Oy +~gVl1qLL\f2c,JMlB&&K⥬3VRc%k&c2U}|vOhr1fd4׺2[LTMX2Up#7| p808QSpc iJ iTL"X>G6fԤJS$Lňp),}鱰"HpQrIOzG:iH YBS¢=BAKy m͈OE Y":NIfjMrYc'+Zm@xb@4cF+Ykhg~u&4tyx4{ƽAP|36ؐ3>WNxs)aLilDΪɍgbu'bڠPdLj> |_ם U@-;&֨(*,.ui\ Q)IGf D(A|]2Jը;D#$w[p;w#e Li I8ƌSIG .TJ r~efF5Q},2`nd\[<\yoc G]rzNp%g:rg*ɏ Ʋ9 31&Be?[F[ tKC{0o d I f`9aCWp!)JDqaZ" Ȼm ZGܾaNr*ZHMlKk @IZ80 !Tj!FԇHه؎x|fJ]M ض`J#O9F{s>X>1ZZ2:/3)+]h.NeB^m?8r8C9r7.6(: q B6_861PRf G[hREҁ2iμ@6x1_ .- 6B%ԉAH HALlJѱZ[1'0E D^'N!'-Rႎ0a^p'p'В'|o*b+"!~µ!B+8,8b+(b+a&*X\.J)+VȂ0bLyR`Е,,C>.`9 `6`]/nb6,C9 {B[B 1][O4 >)(KcGl "."2I00#4+drlAʼnpHdޥH ^4BG!@AP=ɒ8!ER8%a')B^o8o܂/|ZAM>b l!H]RKH,ERH^RR܁^*!(wZEIDE\BElH|,jōxD4[0zȋ)Q\6q?=_L92`N0z`nL4/[%4#`8C9.bf //ff;cinq`&6e.܂sJsth Y@te`f_gv&h:.r3EEJ8]hTB] oVXՅ͵dKq('6%10F.H*4!].Y aC-f"h  0jca3JeR3>c[RGuzn6FO~`__e``.g(J)jdIxQHBd`|dvHB*ᡗA <|4ODRFIdSot'$"fJ^۬(33ZvsEUtQE$L8EI!SH: ȭEydEHWxah++4i[B[ w 1|dKPK?Lpi;9(kfe5&cf-CvF.ԟk8z;V3- }L iB3`yFkvOB(f!c<ϒ$h<2t0(lŠ?ia -ĪZ:1$A-ȣXCISBa՞͋m ie-dGxPZIdUYVPTOQN, |aPWR}P0NBFRR#P8$(4Bأ)~T)F"LBJlY~%t_芡)L]VlѪn6dVeZ Ԃ#sxs0;B DVFq(~d%Mq![ tBvLwK=˖5vf 1x̗t(j f4O+U df+{GbwRL~oMG-Mw(,0:77@+Ѐް .OJbxhAV쑯 j[7UJD6H8Wm! \+nOļQ4OP<!IO"~MKh]uJ[1ktjpY*rynXfHPKMw05ٷvʮ oc2n1t qoP;tf ˡ9klR{qTST/j:B MP / QG\X 5\ķĸ-NSL7u\ɈL2IPHڰ끄܁زK 06A4Ӵy-ZIͳ>7' qߛr$GȨBڤ{v4rgGr%~T5$x<7C%5ъy)Ux[oj/ @pD}7/*wFG_w\1 4(?xCOfxђ7 k1OҲҘ2=[AH=8[ZԋD=;͊MLQ#pŠsՋV!ES$DP޺dsS3=GP~-9JMZZBXAB́B1Ѿy|hFe\SQCV}OZ䜗Hqp  IpC)d_({)%fFs+fXƶ\01%o# RitUU[5]P,THX%U {% BNIa}Q!C("锩Gݹf5uhǎ3S>|8S$=fӱb5bԬ2*W)^"ƋK)#F:|hyF[ 5u)\H=U,j7=NjUZVU+_•p`|`̆+v3ϰUV7ѣEWv4lYku*'ogjkڴeaԈƱYZП= ;֠UΌ[c~ }zU6TX{ ,q~]ֿ7.cbHSΛҔk9fJ D&DP5fQgc*c]1D=> I;! DI&D$E%dIB B,-'!D.2,2)1Ҡ&9L#3HB "*3H$Ee]XBY9)ZBH$4>#ǸќÆ:n!BQO=R}ˬ; K:>j Ȁ-F8ֈ1]fÎ@chđ=@ 3jZb+ %8W+}7 z]{M}7"C`B#KBL r-rȁָC#8:Ɏ5HZC`,";HXZ]Ry4 "/CڦDNcbQ>+&i%BU`VU/XkWk׸ ֲ~#"L;M6cm-VI)05 ;l(ʹR8.rs**)Q 5ʙ搊_88Ñ#7_N\L2)< Q@$8Bhđ Hd\:! AB S M( DXCɢP%6GD#ho>)Q4C:5Z(]lӉN*!o) '`#|2FA[Җ`fw2kmSp<ӷf4YG0Emb-5_rU\2׺儜>// & Ї52`6‡>\C!FC$V. -td#w`Ym#kb1\$_E摝D&Є6X=!Q2>1 j{X#|eJaj(Nqr9nx 'k 1 Ư6*,,@Ñ\=ɜ5ń63{b:Ё8rrO:Ԡ۩R9ltyN.QrNޢեvY L-^ b1O&VXtڷG8Th X"zD%"gա*#YEQ%EHY )V$Q\N?Pť Hli O0-':Ppw+[Unr'51ir$NP3F% @pI0DTl(48Fu8U啨DRӪJժu}o5BTˀ WeWdEcXsF8uW[d7@ޑukվA-Q*96vg@\:8!꼂xc]UBwDVJR @¨!&ab68AnILTre>r8$KxÏLI_C4Bug A“S"Ŕѷz)#rdy`#>qI|%,uK^^1WNc3@^LS*ֵpzw7 i4Vu*4U.k_fVb;=ꈁSv{? GPk_{i8xohg5ZE-7H@`|%b%űtyj I9}Saj'(`(T)99SB_F+Mk Blp;AV@*nuTB@'du /)X!wS_qxܫи+Qx$(}`T;8|U=_ZQ \&m56yz{W ?F݂Q 8nG8Q$6qAڀO!;A aرﮝ WG"\&ұ?`z,Ә 47M Ͷh >anKda΄G \B(l+ '6KB@OQLJ2K}ʧ b F-|g{N$*LE"j_M+"aXAC/jx0b!nB2105qe3<%s8Mހjya,Īm n VX(sFCޔBK58E5/ mjuUfFR.Q@$< <>D4N!D԰!^ K{eDD+)`g)iq{d^b  DOP !N6o>NZ Pa PpkI'qGvadaY!I(Q"bԠb8h3~ٔ(S9Kr.Φ2RcTBj/Jr b,jmqw !5t喝!:2N4 Z C54' 'D#z z Ȥ `'@'/_ LD ̯+€/JJHˤ$D&kMr(/R *ހ-@j|ޠb00b `Q*02MCHh1ME*b|⇀jd"H!>r-qrmC0(Q؆/* c?nt$.BgZ^/O8v/2nO:5yR*SABxxø&mql&25!=AUp/&sʓXB tP3ܓ4PL5#ND&~F(xB(RTES 6?! D3BXуRk=m*A<63Bj')GjG<6`Dkbo*K(h  @bC ` " 6F t?HBHTaԵb<ȷ2ROam't@NYY玊vox(u7v1p9{%t6hكF6J68U-pP11= 4#|QYW:&ZCaٰX82/b/hJiPg iOCC44'@ubH'8(8"%Wq(D {eRd`S$K$D!$/eM})+nѹȬRM,$*MbI"HR@PK@)&@ "{PR1oqnrC@Q%.V&lUXF'*#Ee}RD& q'ď&w)FF?hjEqijl R q"UhC<L0 ?ب@`0WuX{_?*#<ÿN7ZE7k=V^a> k42cXY Xf½Z~s ej͚\N8Y j\ryů}DDErDl#̒a ~,.̜#XI͚~ޙr&&r Iw.E/ř){4$W …kզMHDTbROI|xeɡ.O^Uk)ε,*\sUKkTv`rX1f1޻jɐ-+V1h qC Yme䝷|A_qk(Fʱu)*gyk8+9hᢛnC oؒ t| ~G{FHp-^K#K o'-MCk,zwuVvӗ<7Ko<ҏ t! )DA-F$8 PEjA|8al41B6" | 1)GdPkG؊VBbٚ>!|X^zX#TCZ@V :bcQpCSQc] xkdwIWhE5y D! WQ,24)y \,ևy #}0D!:V#>H A ]~S$(LtC\Ʉ`a[AE(RIR+$0 BPL%vbFs;!;k8F G 1>XkX $Bͩ>t-v3KZ6/ B j Hչ5ơVnpS1X]Kkfw ꖃfwuUHldgXW ^A 5: y q<*vzp4+ R  GV2G կR*uFfĦ&n)JD*RiFSecmqnbGf`Jp =dbP% B'T%*A(OȢǐPi熺$0ysHvPD'Dn$٢EMijo,z]` n5e}qNH2QHe,dXR Rه9+uվ5ъS3NY/k`X+3bf f#>AC= Jx@$F%4޹̓\L&+L jRrV[pITyBDt8PLZC0AZ⿫*ZC8'hCY"#8*6Ej?"{H6& .HXw̍/=4[/0j@s,'K[r]J-n~^Pc91EHdN#{S^N҆vm Sϰ&5.|G@ Ҏ[ I i)f{K;6[otH[ӮݛLu,D0#p%H _r1XH_]H.7Mb N#HENHݜn;De%&~1Eư mI !M[k3 pAu;Իw߽k w0n،?G|qBZ5i5lo;k3voN:7<íy_xX'^j~Ž}S,z%)\Ic7D:HD1L A24i`TH4́_3ž T, ?$8xAn\oPf^rpQyhHgvd!qaU  sSq"8$Xw 'x 6y v9q vmHlR9noz7 "Ȃ9K8w ll1m poVomv:ǰ:1pFTi7S!mox' pϰmKHwLȄL^Rovmol kGqw /`!W0p0Z($#grvaroFoP"g!8u0%n5Qd.@ 5IFv CHLK&!@%tXW}PN;ׇ}<ddPvv+`w:pDž:Ezg o _mHF Ay1%0qs-Ŏ[6Hօz BF*m@n`qb{LP{-i{7WƧb.&.6/YW`0зY86}F QACT9jr35cB >$r&Qh0g|VGe$uQnYucrj#Qj0brdXtqi^,s˱Q_a="FqnR'Snl6 sȄa`y9Ezh w2oVwp "'(d2h S,wGaRvspƛw;x'wzv6ocHRdp8+{0{R/N0c6o1Rc`Sg)ipWo$?Mg ~bMq+װ!հ 4; }AeK$N5P} 5H~"A1 G fY 9FʎQ &q+Yz#=TMHm~nwlpmmg |&9|R/{*ٟW{S`X|"8bʓG#tcc>!}6}$S*^b F ԡ 0FoK ct! T (HP3ڢTdϸP}s;;11 pjlmqw2p GlT(X"y1qҺA)v@{ DW7w-#m H {.Lے+y/S@/״.dPkb2/4@6K9j"TҗSDp @ ˤA21figRѵzAXc0`X;#)٪fc{jHx#UWJ$ yA  p ӆnؐ숧cHpQ*/lđQ Vib,{ƺA D a 2A 3GnRkvyzݒhEzp~DZjXv8$W{/K%nqboPnbоdpfKL$y P p  S 0 uQG~O 2}@1Ea&T3ѬPNf m-bSpÛšKE !yXJwȱ1nLjQT6SYS xRKQzQ?e9/W)j$|#͟紣LJ0aPӟ$#ah9헗z#?kӟQ1h $ o ʥSu^Ao X]6Ta6|QA1^֙8oQ%6[޺*YzY]5!XÓyYR 2x MG:hqOǢϛp!|>R=QH`RHo C h,&ːjVzEWs]dqe!a^3K`< cJnQ`#n#iiuP{Ld3D| ?atHˠ Mt )T T}]ߔ[|&T"NLL` ԂCo:wetvU6nrH=z /FyǒGnLW낎rfXeX} /G/+0q6bWpJ.67:ЇK 4 0ڬPG0ze 2d6t eD& 4I35ps878Lj10ʧ!70oо{Ih}*Xpc#  X 11 `,9ZĚmdž _}H^h+ <Ԡn>_2:%$$ 6vsHQ>HN\41+ yFأnT` Cғ&fJZ0Hr$jkp8B6;KUP%ov*AL"(K\3$,PP@B?P;yOXd3un/S /''&ouf#4 AY1~^KYLT[/CM5X cC' 3"4&p181u 8Pp0^gLRZM$CRj>48f ~"Z@f!K6T64"'\аaۆYUNBU,VMdjUWj}rU\ ;RƐU2W0Ă+Ffaǖ-F1f̊E3ب=fA^=!m]zVLceZVlڠQötթtь*TTA|ƍ$sᤉ`E-T(4iZ^:nTVi;*ܮW͂5Uܧ5ǥlTUBٶ}{)[ޘ)U\^;2f5H/8^̌G ;ع(! *dhҡI(UI.TGr+F =",DB5̰I⫏I1Ѿ9ɏBJ6oSY2\3H4LCK- zkaT!%$eX-Vj% %brRlh:'&.[f:,*B +Z--DTp LIT63㤐B*5 4,.}5T0>XSM#:0U= ѣ>\-VQ4k- ;1ec|洯:\Z1N*dQB0d:89̰pX2n:3(cuٵ<1:5ԸC)eUj!(_r!eCPc/w^vy/^@[yZSljhT.T%Xh漲(/pi.`[J)hZsiydNѴ)-dZ.vRj\aY'fzJ얽6QPM^r0F™Zp)F82;h鱎Z:ljʚ4˿L7ҍ$+ڡ$x% U% UNP/*N 3cut:5N>>I\|!j|nن٦~:FVZ䤾CDQ|t+z#"4={# Ufm=OG4h,n)5 4ɐM2Y{r4ID%$ mBxtX;&aU4"pvXn'[Q2Hhg3R.H4f$-*Ԙxę)P$1M0wНh,Kp& N`:.93\5;_5k]3û`a S)H;B"$A f):\rSəB:NuV !CBE."BsÛ~hPC|HPq,OEb,/ʺE'U6TъiJQgh0ER”)L H? #FI,wNAF%0GgB_4S~81=␲ȨLY&BihRL0QT6UkT 5F ]$+1a,!*1赼u!S,IMU}HӽV?a kՈJ5Z: _ȯY!7[J+=znC RSz [a(Ca+R&ӤLhҨY q2U AQa$R)ofu&[j^:8UVE1Z +.fo]jMվnDGQzcQ AUj!@z +CxP+! e`fN pH(g]+\!$zaϑg橆?bXboB&8`ÒISU!I F|3CD1ILڼ^QXOhĸLgZ3}뙘r.ִoq 3 NQT70ݶarė:&&1 _t5'kXw K(AS+NfS6mj&`V(TG0Սo~$Rg ;GX Ԝǰ;8#Ԡ&UWkZ?xe5*^.7NU) ]鰚s\덪[ !6wM"L CIHRG)vܕb($Q߾[f80taRČ01 IiߨPoUʷ(B)jM +>X|_4~kX)8!Q/r)*ϩԥbFQ#1 ,/p:/%L {`F`MY050ŀ S@P3 |{@X=ɨ-Y6g/*ב501U9,ʛUH:(4o"# g8 QsBdk0i{y tMh8n bJP7t#\ۼ0 01* :/` e)C; D+RD#Nq@a;?1DJ㘗9;5{!R锘ӤC4Oh9bxk-ۂjpc[ ?_F:c[Y[:s:TR9E0^0Y; "<64)b;D5¡jɡ  8CȒ$ʋu{7 B5+`#X #|bBb ׻AI+Aҽ;z,)$I92!۔02N9Q=?>_kkk +ːF \8zt3f&K)G(@%xC(:7!Gxrr,eڑ/T<ځAGX;3,95̋FB" 3/\+y+bb7DrB0N8&G[C  C õC+4D (MDz[AqEX*GBGHLQcSp3pDD;Jߛ+Jy+yPfZM:, l2ьe9QjžIy+F:>%Sk %ɺrDbJw8H8؃7{bڍqMȣ`ɣr%;k݊7+}i8U5 VòiV&9"|AG[(/+[&L㷮@ q 68j@(xG(aG"-Mo|;J = Я"a3&b3 0=(v]*ْjp.h+I91 ZOꩃX:=Z)%d_FXASP[؅ b ^O@UWT 2NP[^^Kn !fɘ[ј E;ن26QVc3 -ڑ8G҈V ^WZ-+.u , v6r 0b0c5l.b%d>?FKF3lIrQ:eFh푐QV_bbQpbrYȐ i[E=4H |5x2C8<΅aJ )͘ x~NQ$V ca8V kpX|t ਙUXs(X xE,p󪑺y ~fjVcV4N }<G4`P7BymfkF~b蠘h\[Uei`UPU`-نMȿI뽂OQPK:Kb9Jk G; R"in]ei8ih_PV@BUeJX dUnT 9Od(O 5Oh )oC\h (pQ"$cf8o*UPVq[ v^ B S E qJ@l06pp2vrffXX50AI)>.sCL Ѻ>Ք]OO.Tr.RIbd`4A>a闞 6VnTiyEIDUgyL޼xV׊ #q d6g6 kro4|WR_}*Zң0}۰!ES6nl^m(r~"# 6z!r.",w.(*“b#?@m}mgWfZI e V^-֪lg?F#K3csI6$O4դ> `'\؅N)mg^y P•I&ѺisI?&#?`hS I@] \2O~ {m'51{+n%SZL9vR&p R'58T];u$0S3;^;j,Hs'9FiNq!Nуcr9_((߮+څe Z3 42E5Vj"4K@ 5ň̌an 7j Jpڡ7C%_Uj:%@Ubʅ!D\!E b`Î ceǎ-6ٲg*AFm%5VIN8w铙I#o=VlXbǂr$IGJdjի jp…VEZ?WǍKFm$gԪaf.j֤3;dFe;~'JҤFMdiғ8q2e\w8qN"eIU/x 5kGn]:飇?zQĚ'dBkO**TO>|t~7zԱ%x`~}auPrJFle]MNQ׉~dd^Ȑ;:R$PmBVG"-IBJWa@RD 2Q,Xj"Hpi0%3i*4$-4bl>ddT1SOA+I6VՉT%$94F:C[p Mzb5qͫ`c9O,333% .Lb! Hh'}'ך)H+q!-sV taƃ}x}!tMꭸf z=I}|"*u_ :҉ q' weR`MM*Հ4/&N0L0hYIRI%R/k0_=q.Ԟj R:B9%& L2dMl. I\OӞn(:%O|n$(!Q™B0/dAc.W)L*sAЙ>Å1}kR.3 B4T}[ /*$f`3c¤տ` X)1 "ĸl,(I3ZUyM0/àxRXtGWa %T 4Rʿƣ Hޢ!(Z0"5N#`rڕ2-Vf`Pf.Z_ȥ"QB$yX6GQ#[R%d`Nn`l|a(L%2J2 CB@ߙHK4@'KxC 06LT8D=N8b djSձ $:+]y*q>!&1ER ㉊"x: 9pA;k"84_bK G6el f $me6>Y~̬#'FNZ!3oAm!:H8%&cK8X],%dܶbY H(?P*anԸA:U̎PVa VΤ0,dQm@O}BeTj5*`YK+ZCFUŅ)<1vU 􀈞!i F$B˓ؐX! *a%0)Tj[/4/.ZqJTED%C ~YYW٤# F$}RxEb1BJv_}!yd),bn 缆p2X1<+;c.KIajI(+aǂ\"~͈MlE߫>Bf0qd #F O87bA%0}h*jDmruT¤֭!qgLCo@Qx~w<@3jjMoxÏCJ ђ[e{8  -GjߐVVk+^(v \!۞#Cnё\{\FYL bb/OTTlچ~Zt<[Z C˵8s )|HR!mKHD ZIuΕuECHC ̺z 6Fһ-8Dg~2\|nykYڗחSPb$`j_%ex "J&mXo;\R/1AUÖ|Zs*m;k4Im2hO%c0 UG@7niNCL%%KH^Եmk]34+ K$lN!9q(FfYmNC p/ضК[#xrJkҡ};GU$툫 5B rЂf;.j? R-X0-|_\50`Ê͊d\FYE 'L ìz*Ѷ z,.̦m6QCLG\啋IMhrn8q2'rL([>vk>&#Rj`&+DS) CPmLYSٵFH2]bd9MGr$s^*fer);bCe֩@ޒBBjZnҔ_4FaHLɉ8L*988c9b$7`$eJũer6(.!hLƪLU =Vv:o]u(U8ǮXuժ!4KuI|l%|WjFh`e}嶚SVBXfXee!|[$[gBJ*j*888|jFΩb+ ܤ B*By*CŒ꒎pl(`EռSO<*Q@ʖbj2fcC,FNj);*5FLl'5JHYD T UQaOgңD~*"jq*aZ*`fE\ill,Y*.EąoM34E1Qo Oqz8,2ddX!-` zsQ#V[x`X:̈BE-B)_]HiqN!N" DGO1}D,( 3 *t3: fAbmRXGؠ 9u8b/N}$E0N*jy80]6դpG2ZEɾ1. _mEJq,GGqS=稚NHO(ۙ Q2Tc'XG|%G՚h^EĆE\ub2d* U^J K) qˏHݴYhz#NA܂.@4FtuȘb5`}M967ؒw4Bt )8Oyu~|I)*K-Qm,ç{T@k!0rhsRr `6_y& NR^AEq7Mwi"N/DOkYPYT D,1@-blØ,͛/BU!#XݽTLſXݳ؏|4 .NSB`lQC-t 5l煻85\T^ SwKY7d4tI[̴#DZMV0%OӐjU,͹4u798x58FoO]M1tr*wWSX+뮢|ήSy@g9tVn송 P q0t81KGqHp~ڊhx,kFyATaˉR,QM:_4l_nۘH4J1B'LI3[EW02zKꞂĸCX7vDUƢ϶RCM0jIَȌBTf! }wgg$M٤WwFƳ{,'Ȥtkr(wj ykp‚L\ՂZ79M}W\GJ{Au|Ѷs}5PW5u ʾoSp#Of[-I+QfXtAh:j4BgAAiz ʾq0цo@T8J/xa5>(qMuTGϚ?}@Q$>#I<ƕ>Xc\#FO@$PO<yV\pztح[Vرb̾V [5k֪q#ذ3fwvŋev=vl#ImdXJ6AVb B )ZËȦ>lCB J8dB 1đ,i#Xl& M:CPBAK1Bs5\ZaD+ڊ ߪ 0%3'N:qq2G,cSM!hFz<%Ubq?*\VC\|6t ⸱jjrn0Ӎ˶bh Ɨb<0L:;,PD3-\byjieXԔ[h4˚--вTStĘ2>h$=5O.a% 1B 8]C pHX% b+ .ȉ%Rh!R܆0((p -(i=JD>XO3~8!8h=)—E CC)B@T\ '=~7goO|S@ "q0h7`tsh0g] X2c&EnrG8:EiTXzZh^ bP5l 1r eҴug;Etl3#bƘMb3r O *.4:qI,SrY)u/xUbqqiG !;EO ~A fpIaadP0'P RNAP 1$ 0l!^42|gˆDt$,C0YL !u0OQ>qInQhI -)"Z8G|it_ `u 1&VA pSi7VpPKM,Rq*I+n8`i֠*30M.6cwuH<UK.Ռn{1>WʸClqAEԝh38g<}Zf1h+V4~ SWu`sТqpc`{ \Acc\-}T 滶KH -JP3q{_qLao~ۀoy1Cv旁"fOIweQK( CaEpXbB? WUK&5gbm ϶aDo. `Ȋ]Lxlʦ~gc^/ g8tl\f00>$CC,C?NAHNiO2 5Jc5\YD/XYچT:Eb.>%!ya|ADqPZcMCHfkkaKQqd)IcKYBm M-4glhA?LBs/L%nH8CFMN!ӢYLeAhrrOq,-M .p{i.(?>a?>ݒfր]R_hA*&@DIŪ b !oƴ't`bmvLgrDJDl$Bx,cN(x3d44\HNbUIb~mJK5t3&@=ehFM.CC]nU΀4nI/D+l3+mBDZȱHt +Z1NFjA+Ifr)FCLǴU뢞aS&b/FtEإv8B<^__&鑾 ;&&a`R $ RQRb93Af ;'" d $-#Rbv>PgRWC":_ _zC̃x$ H kD+NpLsLS"ţC4IĵITAVJ*1j\3|fHBEI iIbFP>TLH]s $SecХve£vvS4^|x>$,xJTJeU!#:%lf6e&24EJ1v~hd0~fB1Cv%@P'DHhզUZ NNDdVĭHl+C c~>ggӠL! ig$0OWWd)毺dtIT\pL7SM]5 15H5↪f_dqt"Gb+좄6e6ӉPAa*vbLwx<-j`;P s6 Da&a:y7 Ll V,uS"A2fc<XEdp)"jg#2<|ߌW-#Zu`h!`;EDvy"1kHuǵtRp3sIxrT%t54V!2(GB(^**kBk tM`i(u05u @a#b%6fjwwgw7^<PJ  0fAT!6g'WC|#2R"'NNZ$NNȖl3pCDOXiQZ%JSYa1oT!82l1KmCk7 Nd~&Y]c3M4TF:F3BAo9p5K`,CquY<7jB IVJpBqpq5u"A`sxf/y92X\ !uV&VI=| aB # aݪ`b*y=La :& {>Ta%{n)株0:wbvBJf)¤%x_ހڅ ^xxtg ޺:O@!`uU?!X,W@&:&hd! 0:lŖj4$p2pl[)Cs_-LUtI:לS9ʃNB9J[gFmuFhD.GĕQaz/ɀ TFWƱNŜZ\!PVa1cf4VW_[Ilڽ}z\<-ȂT0nP'u#Xӭ/&r ` UU9y:>`fbzb4O)@aHz*!fc<_d2Uw@bWM" Bǖ"@V;hw@VLdAt{Hg[<Ͱ+A2M@2-ӀD4<4…5~ZeJg܂tzTvS+u );61ܮIw^zcڀʦ୹ ~\!T"$F=;y;B 4{2H2٭ ӤFOW*jP克dst+4T0v+nC8LMDٓ]$F[]{FҤuD,HPQ`cQbs\ >#''t~q(*16~4p[%+p!ѱ6t"UۻԼ!<$%z {[rawٲ#$!Tr\\ aF >IfC f{ B5 bBU XVU[r)\,W{"ɡEf C&Ɛ*uހ_ ]#>~#T5jl+Js&>=q`;㙙ET *GJ**t{a~Xk87$A8}=}aY']*66\աcYPGy {(C "T' `X! _{$u UXVZ+\;"&2X.\rݺkX` +ذc33b~LU'J9 ) Pᦫ=j(XN*C0B;ފ1WǕv WJ23fЖ-f m1"KV ek^VO: m'UZFZ ϝDefgǚ;MȘ? qƘkfvy?:r!E9sCF/oϊծcӦmf buԈ_ob_q`x^\QESTqV.UH^qg(_x_2H3(cbkGdHIdLy?Q>ց$:Q :(p$|('(),O}v4A6A 5>62&iu:nBP%UI(<4*[lbj#J--KKD R3PAeJ(o oU gM2"WL,|1NAxbWG.wG.%_| o'(o!_Tc4H^ax bvY\V}RHNGy!I-jF|xյ/.׭4d4ٴSn%*o.N?' )ht Ւ*|Wkk.fQ{幋 %L"^ˆ0ZɊW2.j)y0#[R$1$ an =x 8>pHUH%A B$8 c\>jZ 3/\'!`60^ی&S J:\ ul'K TP se&g:zy I:\d/\Ji6D gZAUnQ9r|eIuT=nU@BxL@)`BxD.! !hU  %k3r=HA,v8T]V_'P`"Av3 Ua b^Z`-v@'խb`  8A6BG%\ AP]( QGbS@RX8%"aK/$!!KP~ 0DaKxD0^ c]&= DFN|X7\A&úHK;!D/̮`60! 4|D\~@E`e#XYsxS-F+TaN{"?~NqemڨTճ. +llHj̱M('#])~-A}x,0]p9]1WdA$8aI }/5 F,4 Bt1SŸ3q[fGAQQ 84E8 *bc'* 1 1ѨIJ lVo+ Fxm$/ :u 1He;AH! `RF( 00 [%& `ep4@ X  @ Vv  8p`c):|3|TQ s C#<Þ* vj0̰ yRE &bP"Zj3 0Q Z6 /j JMB[!$7R0`gKx!$‡q !s>ry]ɘ+I}f'#هw32jz&PYIbYW8`]{x6pfp"x7!vP"gb,`S&u@h" n' c& m`Tp 4p V~ 1`Wpw=f{R@+ 8 .  Fbs 0r  3sP Aae /`:H@ M8@V8-t3#g^HR8-P$s8qz wPNuкtC0065 a`_P , pWL@~p  a L{ ǀ Lr{L0FPYp +L6; _ 7sjAbN{e@~gx<p $| 4V80~kry4fZCIMg 9v9f']!r3,\uN`Yp\C#7Z@Ƈ#{U @#Ty&@7] JL8W8]!}L" &T_2؄Yk xG.@ wp@[ |jpuլL~VD 0٫,CP{)px/a@70Y CLD[j\+0TURp wk,~ p>L`_!j և(BŀT а B r{-II<K.|S;s ewࡀjq"fuAC xAPA+M`m-NwN@Kiep42+ ! xL0\ٶaJ {,JI. UCPDE\ca+} N = 0 rm-lly DΈ*pLٛ)bzȖWqC\߉hd鸪a4.*?e6l\5q15qШo=~ W w6`ta& "q Is _nR7 e_ 3a"T07Bp Psxp 4C4n~`0'HxF.tTV> J`BFB6(x8S`wT؄pN  Mk j'"dؼh'4;#;I0A6=dwZgA (e g6./7I\:  ͣf/ jE4mH|ePxjA WI৆(^# IcոCu { P7/4@_oVoC csq-(4`B@B^cp5"U0U ҜR{ \p[Ҫ s3pap׺ ?3J L`/xN[ 34H >s$\hŊ3$)Ç%>:H@.]bu) S@cN4#J lxcʕ)SA ,:tWP/^$Kx eN1ba TA2&PabŗJ$ "9%ɑlri 4y!ƘXJ_~N1C )jNXØ`N-FU arҕ`|`٫bŎ 3fߏ^"I*IB4}7hۄ+p lOSL9eB +\PH9U:0\ZQ%\JT[R<p%;c a. kNxbAS 3A ¸D"as!&DdaBYaShehpb=aeA=!>A!9g 3R.:X=}Bf_T~fcb %Pɉ"b@ҫF*D5p=8'c 1A X5XAYb2a r ʉ%()b(:0lb@*⃮ݬ8Ҫ&gň1Xc*V o /(*xU;@,5XKbhk10RiapUh {hdzᢑpaKD%/ryb4? -SʓeYAcNAP%$ {0JL[!(-5!V* &O+6d %1A1T*%;: Uc)%jaf[}iBTPN!g|3*4xʘh,c!X:c)(釪oZIDbj ie)$Ë `^0J+.d$3Q00a kpQ0N0a.x#"VPlShH+P6 \T"E,nE'^DZ\spA ,1sEI=)yƌ4f0{ 8-05tP%JDR@!$TIb~& yB2NXhFw\Bǹى"b"z!)j@ ~ET#!+ T iP@BR#AehC. i 0q x( Dmh@M4BM81F.:RP6I m@ڐ6QdE H\:aHv ! @!d1NH`'( p0` j.hOX/ Nֻ.U1dd?| @@3 4=A sX 5}C! u,Շ2 B`ǧ=,)ND,Ё!lE1V۽30Xd$bX[ؔ{b V0V'u LjiD'Fي׭0E+ovɨ@E[HAV06B9N.jJ 6h /H5fǷ-sL4~X1Aˀq?8B@`b^0\1L 0 E! [A#r xKH#>>=Y}eP\K`' $"$I([Vk 0WX fa(*\e/ p~ЇT9 c1[ƲI(0{R,S:E(| P.j9*6a%"z0&PC-(DP #&C .=j,O/(lP#¤1]L t%(3j$Bޫ;JqCw1ѽ;e+ v#3c4pN8/=_Xy{N”7*TQgFs L$ne`Ƭ1G"/0WQETE`\xt3Z 8"-@ ʌV.D;PV^z,@~ı1%u Nx *Ka"@re'\¯ D 7BhgiBL5N{jJ/\! 맥-'|D#8Ya8m6Ao0y e=>P:pCԡ'aVdA]A0@dQ %5-֣g0tb2.QjX(jQX!`Y8tڃ(mxںꮭaJe5/?S7\("/|Un"&PP98OɎ\Ja(HفGX NS0mSH5_%P\HaZ( *( `$3cF?) 2-> 242K D$ha|!Cɂ0P0* *X$X0>?* %`ZCcp4JX>?Ӏ! %<ؐy[DȮWX*@ꃁ )r&X\`dc-(Bic"c)6g`Zq㥍Ki&sCa#\TXR2ȖkɷVFT~5]$ 72%<".!Y6h#8ɶ>%Qb@$˅!Mi<%UFPG??P `& [)U6y\X>\;?fZPx!Wӆ_2{Am9K8hOqXx>PYIHZCj)( [ ^i1pK*"(! {rr)r*1H Y[1h p蜂,׳Q۳񖊁=\ Y! ʊ+hGI?Rz M:<2CylII(c0w!H;1IA)[hY?`J308$TйNNJ 4Q:SH5(Y9"YB_aCP\D D@T-1 %x'Y=0j1;uS %H +r& MIS|+!>M3>JF;@<0NTTJ8Ox5XY `S0Xq,Rӵ,U[h4u[XX]P_I瘑2I6DX8"J$jֈGrMQF"!qR Ȥ)Y8RH ei\Uו<8)5HQI8?Ȟ!@  GͅG!ȃb䈅P?!\XᎼU^oSG0I)lf {ɓbxKLɘchIS +/!20< S&ѵxa tq챊J B5@ w+@*2Řձ0PnYjQ<윖rfg%+rr g] ȖիI`-Pݤ=201ჟ.؃Ii:AK5EG )Nx%P=@Y $)RR8%S !M P-DX=I CX+<I h#(@1Ib:'S>)_a+,> -#ѭ2XKBtCD!9Dn 0XNe!' !OSp5MBVuKfNPS$I0왌G@?pGP/`?8 لU`XTUk%TipK]``@x`x@X=z,@%$J@H ZMQ˱"R"- lJG$%#5 15s%%qq#_[NfC8Q!?")P Q&X/8{A9[x[JXh[܌ =9e8Lf(ShLBA1aІ@bPC Y 9੹0 l!{!%1½:0a1({qXt!؋na}}^ 8yIv) B֛M5/*Sm :2f&l<\PpY!TiTfV{Ī`5:#|!=&\ứ6/` &J@ S6dnMH0`i!P]_RxډU1h [@\$[C)c=-//+CfChd.ߒ2$PU 2H3]$J bH2VQJSS؏NƁV)=*IZDX#jԀUsycxa[#۠T5qr'_6b C]HjNf>uq LJ¤A٤ Qby#׉W 8U8j98j|ʩSА[XArM`\85%PbP9T0YI)\BB$a?6&c%&fqg 0YIX ?0\My CAD(^.|9 * )Xh]$ 1(d=C;\21;D/ߧmꕹ% "aWtyXa^p蜗Ux)MPMZa~1 * O_0TSX1Vc )eV葠jа)I30vvGNp ;w$QEM.`N;64sj{Hm:ej$*T$pcX\cVkرG6 /èŤ D<Lj0!e4hH5XcǸ& fVmC!SN b 1qSΘb X)SGSȐ"f9|Y1"HK+[0ʥΗ"X"LUbuiKDs*U^dɒ*\ q|A{ʕ^pŋ'l5UW3}bdaBD,vqS'NcxA@z7/Fh6F7ۜ 7Ƃ]8/b 20z/]x3 _ $Saxlp4&aʴD an8ȄZJ`@PLXx%m-z`Bs3!^@D*eG"Hf6qM#-'ZyXXN- ,Zb޺ SL{ҏΤ4i?atԠ|uP q)bVPCoVG69$'-8UZ Rr&T,؀6x6QUBfS7ȃab n`*bKnp!( Ml`ՅYzYɺ (l`*V3r!@ 6JV!&*P UPVH F0zN̰'Ρ ced&`=ؘ3> Ʊ2z!in} ~8Y,q,Yc;8V! t͒&8I0ɴNA<f ^XaT 5658Ld)xץ-/l2x0gG:vkW| ?^e}:!k/ ̹u ۣBUJS3M R 6)HwV" Jq [7Y"n1 4+F ƖxRt)R =si$3RL o7!SK)APx");a S@"Ԡ@B(d[)I*TMSŵ͵z;٩![D$ - %eFљqQqR4>eh̘j mh8~rjlC8䷁ml#G80oy{>8|'yΣ>|y#ysE "{PF<3Le_ ZL6 SCE! 1?A kXC0@ }b=,L9t ^zAf:eyB ,x'BM}Ő4x ŠK0!pVe\ zFjުMjFB.@C}]^%62ϩFB+܂HDaݥ,0pJCqqJ-u% HICU@C8 IACQUh))^X i4BؕqL`T`v cA`ct !g" Fg 8`jeL(Tb]Au/z~A2_0cAA|A3A4ցiT18B+DDI*XXJ+*.6ʩD]JC )H.aM1€/LI,^0a CU0ď be$6 b"dH^"ɂ;NDJTDA:JJJCM]MJTJM!BAd0YNQx1] "GJd.(&tF2*JJ+ T~QF :i 5PY5\FB\GaH^^e`*"_J\9v*%LȬ0i9cM _tcuNGe~'|',Bw%@e|T.E"AdRfn)z4T7`j^NB瀂U<F0 NKL!cF\MV( X 8QNI9QI̡qɉ3D\%gMM]^3pzAx[d({R%^&|"i|v)+b7D+Fb-"؅mgp0HBB-Be;B;NFTNC΅j(cnq8 G%WV,%DUN2 adGb5 h^ި4HW]~Kj :P!MdNddhX$ IBY~ pňQܞM*&IJщ TʯnJM'R,zŵ2Cߩe$T%]܍ "뾞柽2D]]PǖEdbmdiAF$Č!y*ԦmHHnoЬ-LEpMnFqbqq"bpP\d9!4k,Iakrh)h`&vlCVhv'\Xl l\M-=BJk}'U"JFЉA! <ނ.k-XT-0IӵJ Gz!xE )~%L$ҭ(6h4B%X ,NцiA.s_tlcJ2*.'ڥTB!"LI);B.Tʩh,0̝d|Ȃ@&D.⫞ b¶k +}L p6KdfS]xN͝ɐ\\`*a6۞J,ªI%ӛ LY*椦xm]Eu0T&RrWf Ӻq:Xǭ~ȣ!8-.*-`dz@$^WzAT¦d/xg,!x2Flu$..-nN,s̬l:rs4(X5LZ.* K^ &fv..xX^z. r3X:ܕ{9R!T )Q"Ċ=%8)B#I  KH詹2*8D* A,L8qz13BQk2s[4ff)鬱.04TC6X}+LAtF#.rr=o VN/3M.E OZ.&LhI.ʪS~<ɚ )ɝL&LC3#ͱ鰢ZD1ʂGCfS, lQQYjS9Ajz *! =ݶ`+vcC$bpkp\F#efCG_$7m7=qR&yNJ66?I"Sf䩀.6{/+7ȇ&eƶs[>wHqt 6j;IAn˜!+3#uv $ jWA pBfh.}ShE, UαVj-\Xn [tžuۗ\Æ=Yfg  Ѣ+|bJBT\>[ #s,{s;"e1ɓOi|2SZRPCmX[ͷ`b yĐJy$;Cd *n3%"?UPT+jF6قх_~ގc1Nyl#fYeG:I*,(䲘a`:AV lM" D*j (c > rH!" NVŴXbMn;ar&LNC/B p򉉝pҩSwi h(nj֩)+Fu5֚jB⃐Od9VV>DdWRIQ>eMMC4TT-ST)-S֐&!,w]j"z-"Vfe n e!n.z*bbl*9bGmRN0TQdE [QKhS咣fga&;sN , 9 Ӡ"$"&Thki(Z2h!l&L&Ziԩ|r"fΩz(HJ)V0%,\n C= #<YMM;9[T/ 5KSMaӹzbr -昩F9bfʢ+@2F_C3L^&ıw ePP|Kx* eVDK1n M`(~NS\V3KIaøM0wvfHb/ lbpT n! 7H6`\X,k $L!Qg"渷[piWaEr8c#%&X 0 UڀLLN*CX*J8a hfa| p |SԘVXf- 2UB61FdY>4 p5B"-㔘!'A#XE1h D )}^>p3RG% r &~ ,c`E >iFZVjbH\lH d+wZ. "W0|`4Tc(,Od /0^@' `B)ʬ(*J@ l%(JB+\! gȂr/( _@)|#*K@)_Vdt;Yf>Q}:1SHFR1:P.vq( %DKҪ۸j$#YPzm}Qb~9Rw&%`'L06F菄] dJNUa)M2_} SL0An Ʋn,Ȓce obX(gáhEOTJX6r!TB 5R&PB" hXAl0=(bL) 2H #c7 P l@C{#<QjDf6q%h"pB h8MȅT3Mtb1'wR(q&|`T0l ^X @r+KA; d, v,0&hG ^v FEZq,`j%t8PK U*4@ذ&pe)84-;ܛq 5zG'yACKACb1mvv΍ ' 9v~# AaRh+StB3YY(|z'$~R"᫁ .b cRݱSu#(1DcDsllhUކ^e?u $a" ; J!mCB |t%Vk#6acJ :Ag D`m(SV/| Ԁ\{+!q*M2Tab+2"?28L3Q?eb`\e Y½UR`sQvq)7rC~#Gk9hpnnn"PϠὐNΏD<Ġ+ڏĶ.?PLcQ`#bz gԎK&h,(ϬIt 3|鸎\6`X-Ƃ7V aꪰA~ma:`APaAh ʬ!Hn !ɤ A aaA pJ@>B#PD@qD ϟ hi QnHj A P@!nL :a `lXrbDQDr`L /`@Ғ"ټV@?@lXaT/`̜@K>1r 6gLiV ~CTƠLa!Ԧ fFL`Znn _rJ$ DQ U@P#f%ƆrA7XpA{8d 9 'j,H^kΰ%(a `% V$LMel" 6Ϯ>6" brjNS/ 2Ya sVn/+1! D` X ҼN4@44Oa_bzp8(LAEJQEh?sfT)2.ū~#ǢJ+9Rkv6t37կ?@8S9GhfP5o5Z.Szsz#GRJK|ap(c2lģŽ4ipȻVA nIVt$J a@@V2Vāē!}`I@V A*@ P : Ha CNažA^LmLa * q O6N `  e $ɺi@6©ABGL@ b m" n F Zer` J(&rF B*BY @ @ @P XIR&fp6*h@Q`pA(RDV # bڬ^ VZ!aI"pIaI8:c 6 olnI, n!NL81*H>$a1J#b^HCVACg4+zCf EU3 VmUHplJr F"Pj]lL2^" Ű&!.%nns KYXL s&+U`pb% BN"V"**m4 wla J싿2c:Ee%j@`#u!6 7.+07.LֆCL,,khav,;|P-s˯ùB2+e+\Bz5ch\EEKp6`wK*6v:F̩B.2<cn` U B `$l(A @ `QA ` M JET7~& HaLƯ | & %T r!:%$A~CA`ۘ`. E.jD`p&@ 2O` ?nQ|aՖR~L c8DFCA Nna `VDug'&Je&qxeEV`4N&LY7B%VXBW7U C8A ` \ku &!BjP!a{ @  ,! `` `,6ɾ, LTaŘTԘ@ : A Ze M! @ xC eV 3! Q ^f @ TL TnL H! J{HIi:^ 暀f*fj'%k *6t# ) &A !"\Bۤ:qZT o j4&i$kp OsK|C8-T糭c=;bB=^G~01 㸘zAed8Eƅ?V?"vkvZ-A_i'i nL_` θ> @Ǭn %Jj!@ (EM ̠a$t{L z'`ŬlDN$mjVk~O!5mv($mBEm *m>V_5mg"H-ogK~VU;*Vf& g8@JAz/b)R;0DB|">D}Ѓ0c<ܧ2ФK/4hFS޾%+C8`(!8 7܁"T &"J+CtAVL1EbXQbWဃ S'FV`XsNx34T,{-s6]Ib)6) *]_G6vjo0˙r;B# "wBu(oZ J,ڷc ܲ-ᢋٿ &B챇(M00L5`s OB47eJYS>@*a T0 B(cQ8[` !-qA 'G @^pTW)Z G&{*0)ϬbCڦ`HT l*x Ta &NoX$f X^X0 8 h0azf\E/pt"Zk0A%5\ )hzs= 0@Xˠ̐ RA6Q < 7T wg 0J@ הMqDCQ] HY ؐ 4t& Vq`7` 7 @hB @ D !ۀ NŰRJP NX۰cp ڰ T /xЀ :B` R 0828txCX xX\n# 6@a4~_"Р0$P1 z ذ `Q ?h@'!hd30+JUU/BxC0hQ bjz-3W8.! C , xVwk|PK+j0 .sC j-7`p1 bwb,a"VH#VP` h@A T0M4 a0p N c0 ax ~TJ GB5w ps B0? *!6R# |c LWw; 1 0a~o;MP{ y۠ +aR5aTܱSPI,kbS3Tee -".-hHVet SUe p epb@/3@/,pwXm851# 3(VNJP ^ @@لXE` Uc5Y5qђdCP  bi+6ͷ6|;e17-Cr@`8 KRVH XFU@а [h ly5C5 !;6fC|}ҧ20H a%EBa ) 0b8 ˠN/\o N+ a1Y$垱r`Bnp0g Pp4 SK XP 0̰ yڐ 5/؞J"mw )0"6mbt87 P " T`R NȚ1@pI&Hhk,1 u3 tJiMjb,0uzPaV.d 9Ќi 0 8dTD27À fJ w] p'a@ uh-7eG@_ʚ7(@ c `@a0 M 0M7AN :)5n wa/76p ;{x YdD0 B@ ːlUIKy ~e9#BՒ"8(h-O5#q-ْvj%h"+) upc.ы.ANv,#1sP_`/i"Uw ؃SZOxp(5q([dӒD ) # j6ĵ6p\2AsAu;Z! aٯJiꙺ)9  6ugR# cћ ỵK᜞;cY $-`;5{"C) 2B60 /@Ű j0;k ϰ N$J Eh 4&ܰRBP `@L  plY-$Rw` P E'wO4puh p& \}*Jg@ C0ÐWE UىE"wa1j!I !+u8NE,080 kgTX pi$ aaBPssO%j`\b `wp!eP_rˆ ɯȉ4&w`j`aH\ / Z)R " ˆ؄,YP-6 BSr6zb%T}gӺ}=j q2%ds Cɭىp w%-9E#֋q"@E-)B#O8Uۂ8-rvnw bU.zûF/c NGCi01xZPyX: Yϸ{ QÆmx5Ws_0_ `)b*bC>\T %9Y)(9Mh|Z{ܽ:Sܐ:ܚ[=r#|k)-;'>2P8-\|Z9cp<لI B/rR   :;YMG@(e p&SN07@ ܠ $! R} ق(" $ + uw@~sh! Cp(#`m٪p LHͧ ! 9n |,f6(pOVEŀM"P ` ~ktϠK@- 5Lrt~`/pwp_bubə/7b`p k 6 T bS8 6p=bWjaP p ?` ZBOZ;L ĐoANX ܰ~ ejPYL@pBKs"p 6tPsr B%7P3::O6$&p6) Jpc A+)?%曠J9նSIP'A @pnN`rnLnQUxy A~Nev|`/ 1SpGpG8`uK0"xXKP_p@4YjᑕAm8q P C ,d3 %at A4q &i 555н P ڢ6g (3} %s$%Ȭ# Pq4#&4tgj4f4 a&(mh:w(߿ @A| ߒBffC srVJf/-}tL!ECuFRd9-\rMX,5Vƌ<+L$fM%1RP4T0!dHfrѡ %{h˘ j ^p u̗/p0q!:Q:H!&&gaDɍ6l!&*t!ѩM8q:ө=e+`*UACf9*Vc@T`Xb)YTW*]|v5ԘmZ brݱA VلCZ:5fƇ7Ċ!NĔ)3eF ,@A^/DbEG 8pG~Q^ %D06 JIP9%c }[E*[;D+F$RkyjIi%:fl HD D\p .H)&@D `bb C Ҳa!DX!&%Ԑ&L!/!ƐĔS:1<)A !P%Ub#oiUV!LS )`B\B'0c%WW npxu: bL o {XcH"v" ' b ubV9 b@x9UYgDa$%^la:`fX‰b Ib FEkYњjXc9&c`~ yKDDC*+GjfwgGl/$hO OQSPPXZ1STi]L[6H#!-Vk:MdSN\6$,D Mt%f{9ƍ+J믦;$|:j>aQ*je6+yD^On#06Uc]|(!gBbhKDrU@~x)R)~G.& WB_~g!% 7Dc VЖ)A!``B =E-Ì֨0@!n`Lxp @G/pN x6hcTEM1 M,C$n kp _,cX<8-Ip6@_šp L kK uG&iAD`CIh 4UTDocR# m6z$E"d~ clA20@Bkbf)k#T&ծLYZ(t Tv$ T܂ 8C, (J LqSdy4g10QEF5a C|A$ȂV3 5$$`Lh0) Y@h(Cuf q# P >$C#'hɍ,x !TyB $djC]-SWX4Ug}H`?ɐ az[`.v9C&x;#[4l#nvc<5ub BzF.طg49~" YT)PE'qouW lphRbpm_ 8$A#tZ I¨jO(R=pFuboj3G@Pc* F-Xl*c/q _CۥHw+axFs5QE7V0π2 (X46w@Ee䯾p- ^f{Dq 6r4oF*əMd#1~QR*ܭalh4z d"[EKd$yCI;T^G`a.1F\yOZY{ iOBwBZ(dU ͡[| uPnHK m"3hب4ރT|8Yeuo!elʪ%xlI(0fDSU=͠KNZ qfO4㴂d0RT]EƅUԖhG)Z, YEQg9G~4qw\ 3hYm,5,@Pԇ)< Tm`)\! ~Xo*ܱoT0ڴEDX2fpkc%msvi87Ys-l,NJl.hKSbZØr+~ ^wqϭ^$ēf] NsE5 T[Ÿc5mHz.q~qA"#Eb6I7d# ǰoVHNX`b@ .틶jn,!]p82_ ٌ* p2"+*_ H*P81/5{=04DS4EHcOKOQhO0ۜDz7u+>\( ʅ [[ dѯ_SY 2B@9< +ʭr碦p2 ꚸKBΠ$ ) IbHSND^I(+TE12۸+øZii`99ga9g1? <(*$B05Cn,0r r A!J/Q ꛘYݚd" 碜MCB <]@GPt.A)_  ʹI +-hh ɰ4{K''zK /ʯ>鄿X.N߁ ĪHÅ2Tc1ʹɾ4z c3 #cKt1_<<=[78u3C`Y؅]V(DdStL$JJ ʽf8M0!r0/N58;) Oe !;?4LӦy;Mrq<K‰.>,J̈́k _5R4E8*QcS9`EX$Pэ9R9E9/XBC죛<% ;MR) hJ 0M;,@4,m@< "s?&ˬq#%+B&T37K+[R$37P47M,1̲kC"N APS,͂r,H 4 S& ZLԤKH0jXg1 sf%˚2}.V.۰mV|-;VnֲVKq0,T̼krAU;SK9Ub=WVDWtgϑVlp]XP2!rrݰSس/xU\Q?IxCD#a0ٓ=YD N(Rշͱ10qVlWi%WV {]\NQ ȥyUy DUr4{J K¡/T:E~YMWiOk \CXE1MN,UV|QQ@s`+0=4B`]8;*Q;{Qu': Zכ]tգEZ"_Ƃ8US AD ]9;u;BDDJ$;]\V L4?02ePV/c l0Mm]]Y=at5KunUgHK! ia̰ζ$IQ'z]'mX^1ې)͉}>0e^] Z-r6.UfH/8@+4AXٕ5,NcVRy4KK6-cEa {[(2>.DmO@_#.USzEqzZ ^5b[ϻ}բEפշ乥=`6ľ=ո8>9Hr2ة@34?MA̽AoERA;UXTLa %K4aIeSN ɲ.u[ͬ] UU V`7ѐɽE LNɵ\ҤeہM`F.ahQna^TEPU hmzU^X U=F^%Jت+!Rc%䯺 c@B)nT@C:sYTo8aЯрш0bB\XCX.1J }L}|aGq[`/B 1BiTX/i`B&3;3 kbm 1yF )1R;#(88>c NE|KSZ u쪛j/->mT+@ BLܮmә^(&3aPS Zbje-"-j6NG᪄̡&T`;_@1w2S8V)c0\.@Ʌͳd\O(rDTXmevъK]\ QS!9or^䭿ل!2L=3ݐXAHův/҅F+\ Fhl. 5ڵ1Pah]#[{w-"0@m?&g#2#pB%()<蒡ҝSM3В2:&_%y5'#3Dh+\8 XH7X 87yH2 2D9X!@pBm)` zxJG32!㐻ǔ   *`h0p"ЪtG;SGwz.S0`/*z32Wa0 {)?#-*FTX ZGXG !z5_~0>;QzOzQ2\d62`h e)#J)C^xd'0a⊊"^ Rʋ0hhFB1Xq!_psc +)X!+`XqNaPI sL.^1t%D$=$&?BVи=c3iéCDQڵ_)d)DR\d"'JatgS$rD ,Wؠw[rf (a0i%laI;-xҭ//tGIʪu+׭u>y_n»wN6Q{(;u ˭T ?t˷?*2* B.r`. 0Lslar 0/IL1"S #T˄訣E"w#-"6Хw rnc42 `!H jd tGHсyd1Üܢ*L4D~ &0Hr0*-J+T P6tP 21t2h %0jؠ'ͮbQe8ԑ%~b"t^xN` |"(, KPq"( B)hc\ܐBIq-@ŢJx .* jH6@1܀ 8 "SLQ/nW. I$Oa묗eX!AO+MBnz344b^ `DD'DJC>UH=w0*w|1 zG4H !~yb.H2DI b1rrCX:B: RXjA#.pag&CG @ r 5xD: ;$j&`#w#W֨Aa-YA~Q.ec5PH)@Tu=\A(â u) ^Q9fG;юu*:M;\9$J;x{FcḆȡ1y S葫X_1;R.bbXT^(D::46$ Ͳ%RYB$`L&ҢT r`2)26_#\F4袎PA'hC bZ9, Hae)' `[)g34UT( e a ]URnPB Pp0GRJ':ǭ5©P)sCB+"EB m+V1@Ce 4"p1Hmwx i"*u?X  &4$Y(d2yeJU(C(4sV&H /dd )TX2 /`(A @Ji)SP× 1t5HBe8*.sVI/q Jƙ~cHC@D 9t>ՙsR:b\G N@h`K~V4 WVYQ%>K pb8D!_ `0ЁdBF`ʜ÷"`Bl%!CN!f!B q,.8l^)",<0A|ft_zBQ86$)Z !} \j $ANU8F.~ъ9;-YhKLTiE m -CX :}NfD%8HuK%3B7P+̱XhE^ydtdb?.Zل7N"n)S GpݜD,F Sذo0D'4j~QtVbOe \xQ8S3ąj;pD(NbUm)ʲiD9a;a +ڹNv"xBp)(l=D,TϷdDv_UB@Ec`t&cFT $'ZFDPSʔt &@ o)OF!0% D(!A 0)ZTHDs)^pئ0J%zFx`'Dш$dxL܈Om0p*3Vdc@QFL{A2NzwN!(Dh'"[bUsfu 3|U!Q@483A O$)Jw\ dAu A'$#@T&Q d!>6 hsk@CBb4`./º 6BVx 2*`R/o&ЀlUݖIg'$BŒiʅ]ik qjV(Ю4^l*g,qpB rqonW/pՒp9A#T8 aTA8A<3Am8ӎ < AspVKϰP(1@)t$T-#µbC/60r /6 ',JP%z0{ح! gBΙ]}) ԓ==QK)|^+ѩ*8*D ͞H. |iQ䂏m2-TgAF$qInq>Cp (d1ouVY0A PxrR+eIuV']u|\v0܀86j|R6/'lÉ*,{%|I! +_#(1p #ݵv̕4,Bt6<`06P(6qt>4`2L } ()*4zi{w$&5"`vcn&B.P . /۰dBC0P‚-d JTz4c68BUIh첏u| Fy{*F["X p, A#ոx |BϬA (CX,H({.PT5P@'00aCa)ps*l4J ۱rqSw@PCHAqB/C!PA(HXRy$L@t{B! ?)Ba݇hW$"l%B.* ,8C.CdJ< HUtEV`@ kG 1_d9ȫp D9Nh8|\N1J^ N%XȺ- +4K+4 >b J JI- 1VV@ %D[q@W'X6HM>\T̤ >C +?a ۹Ë!l0Ő?&¾%?H")^4CV(,J(ALc%YGfz >A!}t;(yddSĉPJT|jA \ZYE\y!G.%ŗ_%lxVpdjDƲA!^|IIm\Ĉax&xN מN6F.F!2VeWS<>cTa61_t*\c D8%O i|i1ϔe+[E;n8üP 8>`[r Dė[0U:?0cc8?Ä nౄ_qkbSHJ"|fTW#|Ibl@ fR^._"8B@/TdOjvigy1H 1 0B؀6PR$! I: 4*AKC /N|8a\ |hF|Ň߰/uqdx³G!REў0C-iAAq "¸\ğ[(K1>' dAOKr )u]"DF hjxAJdD$)20P2Z"! 3&||A"B'Y`UBJ\(N*#!bܢL $DH B%(F1Ap-Fj OE7 N NP&)R@@fV @ a ਜ~8 mT abòzÇIT{A+"B=`TH~!d]Xp{F& P,1F )؇ h%)h[&J*Q I,<ő6K !Xn35I WP)C H)aL(LM9PqpXhN# LpQ!D¶66QrD_Gkd'8St@)t ړ™% \a0O|1E^h "ð4ȟaw \ *WMm(*qܢ?\BX87br""1y6PT&Ȗ9F:AI ּC5 ,2 P ff&;œG2)l8:Ec-VAC`|ĪP,wA@n\w؄! C]1:\cKn!"hz)5=+ zSJ $JwXuYuЪ)rBE}& ip1{8B(ׁayFq*W/5į4`kwF(Q!;$\'X4m]͢&H^PBJV ncB%ƗI( )!baPM k, ˼L K$&&D`F`aFb&6!d'榯HNNa̷&rlNBpVA ZgB b!GjᕎzG 'ZV?x6q){ L!da0F Cx0p2# a Dc*#4< Ƃ E Mn~r/nD b +gf` :6X# ji ePZ1+0 82xL` *R<NMsʌ ʯ`N 3:I%HֲDa:p&/p&n(kikD*!"BA %GcgH! tW hi+A g\L. :gAXD@6t#-pa $=G{CbXbp$}H##g$<D|قD}*4%iqs?qb0G+`g!p@nK*{nAP)T;A>C<(!䢬: |DjC6! b, 0t!6O#-)\NCe Ce3A2xm Q6X f ;`۱Ā,9.p`75= V,! tA@A!_@KO"POby#L |H.@ba,@1CHBbB҆4 b*AUL` bD*.Ff$f@ H#6a'MFLTah$JgU FR'6AXra@?%Pn Bgdz* 5EShSd66L`&rEN2I% fv`B@b>^X"WfC RwVU C` Y A:|x0u L4` Zcr!!H *L OoڕVn@U* X`z'A;ȿoh+GLP'V@ PFZ! },l(GV`؊[B,hLT28C@Bed3dL OM.*aUA}ư&`}/_fmk|t &Boz4fBG#&(dllr".)++wP/; Dh*Ya` bp#PBV" >n$:!H* (R(xH$a)aect)<8A DZYpCl~Kb S bz<-bCN /VOɁY,ҴA:@ rsϢDk a|ݜ6G5&#ԚjCc.qİr=b!w8)?yQZW<-H l $ty5pa0*h` b 8Fƀ0* $=8fD Vap )j6?㜚V0|lclC`: uVC@@98!= *`g•[X`c&k^] b!4-f9ha @Zm gDVa,]B;H;V a -(D* &=2 p٧` x 4f`y͕cfXA>6~t XWAs<~ !W}Y@⥠NP r5`  @=O~ 28 Iq8 C6n=(Cnd@fU|@ z2. ,|?Иl[>aim^ԠLy{i[ XA@WJX'N8T`C,pX`)8LTC #8_d ^ Ō!,D<\1cL"ϥ9N6xS!/*Tвap}YaESЖ-sc !J11h\ʲb %Rg|A:,`ҳ &wLU2 +N:W*ut $);ѡLZ /n 2!tZhH `\ e{*&:8vlӡxʕ$6,q>f 7bcc{~f+qɆdC*Uⴉ)u' `p)= ZhƂJ+a+B∷-Ds/+t,-\HqSAs E%˘„kaU.cP`4Rń,w!2C1B6UNHq`%%8/h.sL1/Y~O qW%|A2GT''5ţ:K13u"WP"L{$I2wUrʇH"rW)Q^JɊ|Nut1(*j 3/2hwS4*tNDC8qV 1 q `yT/z,/lT|aEU/ DyJ/NQ|ĶMH㾶Nl]JSHsJU|#$tSA2Wn)֣6؀vJHk9 K8L_'4JY: 1`"iV%mFu0W#蝑\'9Eh⌅}a6ĺmXX:C".AP10 v갻b%v79@|wA]N I#&qR;UpSmO(lh_ŀn9cro"mwX]Qک%ѿUsɇxKczf^w>n8#Z0B+`BфΩYD "4# 7a mz;*~E<'GH~{FpZOanoK/0=C[Hg/r()w @3%?D0cmj"ɲ~%OJϛ6""}sYJ}2)_B( 0׬ E 6@${;Fq kuW{#R"&s` tGJGGT}}jtPJP}P'u\6~]v.~ k`ug" t "/ cDaGdh2BiMEYRhݖS1H) 4CbRa>u}ot&PUcKcvDulBjb b7vg%G~ ѱAvtB(yR1Y-Wh%#H2hG#77^+BvFwnn|DP pox"q'7 Q|qWqqwQp5pbAt Āi惊s|؄wr@m)Vsv ej|j'ofkeePPR7f Eouk1fVAǶA Fʘ rbhrĠSŠh*uY0K@p`% exZUI\^`E {N@y[NP6Gc 9DRvW*䐉h2sFi)|։2ii' LJ|`nVtI4P yW/ohXz9JR!E]!%1H @^)rGW.|i"bm(/) n(ځjlt}Ov Ve_aw.b h&EEFs'5tTlbh(iUImN,rçrx"ŀ `t i0 9u\b 9q !OWe@ wxy9yo4\|SqqAGz"ɘ9Lɨ{hw)Y)ta)|ƖDAjae(u$JKqUau҂2vs(GczU 8 P 'jjey}߲OttiۮX6uX!r &)ub$fel0h fhԦmiLhswwVh3rHY+rbJVcz}J`Sg~""f^Ķ'9**,&mڐHs8|Y9wA&sGtI 5ګ qhqw!%$Ջz JЖ(ѐy8 #w `T|~`зD-*nJeT?wKтl " ɘ5hy*Ehʷ֝k {wĠm$ VQ `oPsPp3`pp ' } P墩u3Ru:y$[\ccNjpctt{r{{ϩ/hHmm }Jë9ljeh4OrY3uUrf~ɛ f kvWƩ]A)akA$>߸҆D"U<.Uf Xd Fqwn{xm͉B'䴑60_#_-elβR@._V ~(%RnՖSo+zC-31 ۀ%4nmߚN=y#gKm(fD E q hVyA byE1*O ޚnd.1 (_xo p@A/^b;%CJ  f ?XRAO\Ugo%7*qg|`vpQX duiAY–-!4%N6h j Ǝ%IReNPy2U͚t)b锉J*TZ-m+*ƺ.| ˗cذa̢;!eu83hx]ףEnRLmecTarҎun|1a|2u!:$R%I(Ir_=%$=P(LYmfj6^m7raN9sN-C.ET(1dI؛QߛQ8c8)C +bI%(c)J+/-K0Op - f㚃esJ1N~ENvdo=nO+B૯BQIϿPB1'8 ЦSB1m4Xc6UfsPdJOjksXKS9;+V8o@ G${Tֽ uM֘" '‰$6k %v )CI3v먃9OdMV/]eeR\VzUW_zaOC e?g+iN8щ4 3 URqLJFЅm?gqbIjxl뭙 m)tYTخz[~E[ -JˬcIn-̺En`eal^я@cFDlD Yf{$Mtj&πZ3;4pa;+F{YV2\`|xIp݂OKYE*U(A@C;f< )swtĎ<jpBq\R*^vn48EyEWAPxknaGAQf{ BC#X5z pk؆MfM]YJa3 pvQE,bj mV^ͣ@z8p4C&TpiM#93<*d$e;[Hc-+2_9h$`?az! opY^uC6 m֜TӟSk@2{x"`kT Wޚ[5)(S> 3Z_;,]2 |cXVK~[)OK`2)uWQn۷ȆxC^.k 8e*iMFU?G{~]|UI s%aXP0eKYR(QV%`QŎY g_i$rX5+ |tFe#sd:yl KaUT &ߊA7X4p[07n+Wr I!|8r~nȥ) B4G-~69z&6J8Yp{^oJ\-P-xH J!3@+9!5$]+[ٺWaI;XLnD#ʤJ~w#dWmtpd f#y裞&2@)hB7t,[p2ҫ~፽ 4*1r9JqL:a soߡMSn-q2}ߒط)Ei#wUI7X->Q*7S3sM]˖i596+aF+1/dS0ᒜrߪ8M#z)h<Sqъ%z?ұ7*:}S UX#Ý 1Ɋ?*<:19\ ද T8QS1C*i9niC< /?$+kzY*q)4+` 5,Ȣ ` C8'ҥ%DXY! ;N1C M%R!<(};}";%T=% 牽?r n N*%{@J6 OSDT 1 bX QI 1GkIP1<˜Ayd{j! IpFB (Q:YȋjXɼ0YdHD;YgZQ39 \ўAE2}37Q8&ҫ;!"Ѡ˭4d))K8+! HR@mR)ҳlRiR_AJPOCT!SqILA@JUh@# (T+R@e!_t_ɘUd8;C MPYLE:] S (P&BuԈE5>RR:_pdqL5SOx dVC=l᤹s1Κ@LU0aO0/N(qH EN# )U < >11cP|gEb1EJ&5U L 08HG4H uѹ1 RUw} }ɶX/5S5S!s> M(G< IыQ9ԓ!Z/ܠ$j^Wk!-K+ 8k#qf) "ϡJܱ@ѳeUhY7ecNebgjqwGɶۊuĦ\hS8=8 dz105 8ʨ5UJvNbXnɮqyL*XiQ:̒BP%z)047!Yhԃ ":dRGYevLFC/:ʩY1{2:hÕZwÇ$2(#-؅fb/J2IB"zKOLwR-=\=ׯ<D%΋O{jO5BΣHLCI?QmhHA][l F㘽f퍙YeQ"ܯzFOExޠ7G&bZtkyx<$mR 7ӳFHOL]MKIw -hLѐt{ fO1/Zf7yNtKn0((5V""bF4d=80+ H,5)J 蜣>0+"4sfo414 g IlHfJ'/jxbQq_HG[1A[xXo1|"}&ֻMҌP2GMO{w?塍a$j0:Uzuҳ: N[,dC&^r.ob] v`%A>;P.]:V3fZj̒#qc|=+ʓ^!=ns"C> 9$I4s)OI"TiѪV7Q4G8u$v'S`;:%nߺm )vqjK\\!Hb5U"D׭NJ(=3C@2 )NM3 z$SȆu\UT]n2װŎUdF1fϞYnYtꈧ#NXp`| vL|`Xe(q ˯p(:N5"F=UEmU%aUR&>XlR!mɅJ,]J,-4|H=Gthc%TI'螎4-.!ZFݡOuSE!"qIXVp%sXQc1eI%sAosG#5=7]tgr$51ģ*PT`RMSPdԀz jUd!%FVZ!\mehvݒK+&*40iGTCq̊gz)|ᢊY6eH p!hԀEUL1暫D^r)a!iIA|Š0Ns̿ f#wCNkrL',ukw\F^wm >t! 3TVEԨf5dv[ʡ]>rRɭg57D8bX'aO#kSQN]?5O,UZX*\r۬*Ci3AEf`5h1Ťc. Þe2d.tJ~R`S~+ %& 챥͖o )R$r@U׫DKc4JL)4ݷ '>q~4rgR};%_LĺrYsfpN ҈OBbՁ2X"axV#5K%-iAdGIHWDd (T1X(&$J<,k"Egmx"!Lt"iTDpÚcFIFx() a?I YC &A SpBҵ7j Yr02Qҗ./ac:+>G=\OEư]G9SszeD1K+@)i)t-\TQH2!vhvNgnqx6ha%bDT"("jN"⬌A*X#]pI4! p 4!"Ģ&gۥ܂.wI,I,(iF8c%GYsOĬ0KQQI,C77DXKIV NG*ũh&;MU\&/CшP0GyΊƌuyW$ 8fԋVNO!e:RT).A4$vP9guC$2zRd(<IE$|8)|µӍn F8Yjch/a0Olp3TFMO1&ECzI aS׵uJyDVXGX"uBM[tǡe>1Hp'3-&v΄s51^7ko3XEZBъ fn.r'υ& ޏS8E6c mP9p5\ek< \F+"'*0 ̓f@z1OdnuQ3ָI rv : ڸMȹkȐT  o9"Ϩjd5Q P"aSڄ#xH18Am#LkbQF"wj08F}uAf5b׵&"!ItF+f&Qh2 t$C׌Bۅ.l2i#D UZ-9ΉRu@^s'g&vm<pD# raKn`1L%S$ z2dKi.|#G^'UsaH~I|AYV5~(_]+e8=WaH YZŪTt'͛[$7‘07_\W;Mte*1ߵ`lT+%Ẋ؜"+Kr۵v29}6_x?G=۬-_-XPg^(Jۘ; ٭H#QqCAyZ 4P qC` ^` s.'4,)Z)F.0%YOtYKR0+D! j!A. __ }M,5X%b`4#xYCAeA_eOBl2'L!YPlke-‹n dbUě 0{ہ.]q3a\'%rNzbf^*R%\ԧ)8EFg@lU$q\ЅE.Ă !"mW,eY]ۗmb\~Ykf|}XL'FYg陓łtƒx$lZakB.gXɅ=yG2G$l(Fb[GXRc#DCKHDex*R R]IRڀcJL]\8TC5$G\$$F K,^E#jpKdeH'µdnQ@#$W-~ɗ"fg[[' G0Gl4GCt C!M\ɑ*̀AHNNT똅: чVbNL*GTalǓȩB)}'P,!\NfµpDETP!$VkH(. .X!Zى'*y KcPEdG(t`>ZkEWrBEBDFIE8POtQt"\o6̘FNͫ8]]$zXPBtd#ecB|L!j@GoeSi<Xl8x$!tB^yGp4@LdD0#H,C< .LD戤E TxAI\ˑ$ n )h| Y ӇtB!LK pͨHsTT Bn>M#  *.$BڄOx [\A\-& ԫt9(f Cgn&"%+ZQA"!xB1\CalDrlvmtGx볼 CTIRkO7 @@T*UdY,EW' qplrOF1C-܁R3$ll$}ܯ /^ǂґ HI"$q2s bA.k#5'ԉ!P)FsM+.rlxDLH,'AE%E.:afʪ'ta$!C! #a%>3$e*Cy{,D($ƶ҉6EJgR69Y:E! )F-4pUrĜ{"{*\ @0m*%|D|BKĚd^H,  ` |%0 Ѐ@^ H,Y 0!gI`P 0 A’ O.pGȱG2/%Kl>1G.  Bzp+*d^< 5 8 ڀ8#B@O ,rfrw@/UXX '0ň,K>FN<*K(|(e_)IDO.6#(_U :dҡCxO$#nrNLU*@4֝+VKVبhY\fլHgֈ͵ȱ1fL1y!cLt`Ip:RXd]87,dI?cIz/6@c(!JwLh OL@TH *=4^pdSS;uji:*<4ËGjkX;2[4lYhe(%"B?|e[…_aU(%:a-ɐ(J$q*H":X +qll9b XK.K>aE&YeIa lK>`bj0(#)@ _@a| zJ`ӣ>yH !%&M)$T4NQLQG*I6*N*98qkE\bQa޲͍¦g`@l)`| 4ą@xQ?lX)D(iSIU*TE(yÎ2H`sQG( 0b>l#äL$Y!V,T06(a Ri*SnDGc#$@JD&|Tmh2TJyDzMU8NRuMs:ZҪWS XVbaodod"91\.Å:dS/H2(DNjSWUR%%~,pYteDHyExgH.fNVUFC)E5ea),5E mhN3᎜DColINB5~C%xT0@RU s K [TB wDŒ\ذF-bPC ! ?l*S$1Pq5bE %o hj%` kC$ F$BkP^q V9`-50AHS(=}`-% IWćO{؃ QH;l`x \"8F(|H ]?h`l2(4>ppAAWpMA0zQb|$NB UXC%TAIa 0rV R@CBNPţP\dZDAh@#.m]r +F#ː-`=}c^N@PHf 1 [uR$J%4Skp"G854`pӄa 3 _&1 I?- r{Y\vd,`ϑ;-K4ItSLy\륓M9^yk5^1&'Kj*)#9XEW_k, rJsJ8\l hhuՏPzAeeta5 z!RW_f&(*F!ʄngF2GXqC*~Oh|F. )PA Jp6am B ^lh)qFu5ĄM B 0: 801d?4԰Jz+%J0`HhEgVAe{"`S n@Xp cUz@bcL\@# q &43Am0c]0_&7( ڂh,J`,5cX6'-@)@u" f,:#1 3 8=sX+4z8Pjf' J6n!iSϠdHp%ty6 * U)f4KAWf ^],#z50! O"P!MФ,IA @Ep`!,ڒ%7X 8$0 `@2@/X &A/(Kd!w O?xzK0t0uCK W/a,a?^)BoLorJp"΍~E OBύf& "*D&4a;P9Ρ>TD6B~%P΍.[cg9zܿ[fYUT΁t YVPq)6HPJMKb\Pl)Oݎ RF$y@r'7;$/JLb*q~֨O^R;A\nd(#f#A"#4`Fl `:ˊA*$-/).K=4d D pA 7@H`V-jDl6ddV~` +hdOB$e3!{t!4n @`a`] VD mf``A G fOPLa L@:8a1LG@FDp `fD O:| p4@ > ` qApג;ԌD < OaV`̠jh bw6uAJQ,BQI  n @ &P@8>`PqLN+PLg86r 4@ɤ4RukS79nOUnOO L!~l8s6 >CPA.W`8*`Fn $!0h/A >rDti dZD TG@` *AUXIl@@ @(z rAH7V!JlL! μ# L n`8&NAU }0l@ aE2 p`n`zjaXUb"F<ȁrWN6ªdh"ZSP%%!dJD' lɣ`+~kEn+BVjDB6Eh+j3le *9#r:ܴFWxԀswM~bIkf Nn+|~€'6a 8~".L: : 8!ɖVZ N1؃ V>da` ֘:2 Vr!A  4`Fv8\+(a,fez(JaV5vVaD` `fdGxGFVLX Bʠb` vAvw,1 I*樘jYq%:w9 Va8 !Pk!fJGa"C8x 2* ڍG4l&R^#a5R "(Pn@VbTHh{|Y҅! 4$* >`h!\ *xM$H$dGW@6 4<g @<z >b3e*dW (6W`^4`w'!(՚8Bf=dg@:aY@{~t "<,r8AzR4߫ `fzCLs\ \8t8J`%a Ll e& opGĀڨjπB&dεA2sQjh.Sg~&SFh5:eN;FPU Viǰ*MWrX9W\64ܠ( pUl++LJ֪<7V!兆 caEnjjh?0:bО;wH5BJ(9:5$%1Ny+IZ2 -XS9s;ϥ|D Aˇ9Vt1IY5VrXq,;+\J[PU2#!+D@C'VzPCQ)_~܏L(ZJ !d;6Mn>6$=dJ*='iNb *P t" .pe8Qr"/d/aBBSB%% p7.P &0t!w҇ aH}Lb "$\a & RJBI"oP!bLęhVlZV)gre|xn(*l8CUT+ .Ҥ!'0Ǥz0)!Mz'Gvzު"j~lGɔzI 'Q⫯UR '<%'l,'pbJ' **jPʢK+ P 1rLˮz~+"Ԫ"{(+O &BR& d"&T00 VQ.d,3/Km:uel-"9%7$ Am 7 y䁈,ܱwH 0 j&$iH'Jh7J@((.E  0atЁ!53z(.xǷ^ܲ/ IYTK=!2#|5"EO l*LGR7TB8LH"0CO&VشBQ3W,h0^_|R_!YE6Ue^ /"HPQ^9l]sB/T5$D[0".La;(}]0>T;َVQW{lJt:"@D(*a;xd iv8'ƄIHA%r1o-!4>x8R |DX]bfxt!R{p 8CA66'n2F H$(e+V"0@R! 1eB&MrJ'WNt tOV5flR~zU*|Ѽ}D0;tiR)1z*/SUgjW*!Gڦ$,f9@'=Q!Ϸͳ[z%}R@3h Ʃh\Xi+ЬbФcøwc,c4h=/#Ш[V_hDN,v0 > )0A@Eƅqa\ Oh@H#4n1&HCস2oaZU,_ܛߺÊhfb+,T61b8BV a</X)| |#F7)[JHPCR ?|@auq;@\4.=|P t!a4\,ߝ d 'F1p~c߷xs`0Nj2{^yV50$!Hg)> *8a{R .23 °B +&iaHdEsG L1B߷CNpυq;ð [ ? -9& ^`_+t+t$ `+C",B,q ,8&OBp p:"b+` (aoC !g?W oÀ W&p?7 p0pHp Dps R x@zڠR@rR& VRbz1`Np;6 q&0r 2`  h4={' 2l2zr2Vpoo[Do[8 ekYl+,b ᔌʨȲ Ѹh"m9W(O9,D-yuE,1j'uR!?$ҊwrWFp؊ M+ ,,VւҌʂϘ,ɢ,Nɢr׊7ygpq+ 1B@21`u&`7@qV/Wx7?w 8& cu ^  j`R`)y8  W@#+`i7'w` UL 'Y dw5=B40$׊`to+f+@^I*t~`v@WP^0BT ДOyL ` +07 UP6])R36s4 "V9b lЛGYx9uRG<@0<Z(qe 0g(/06=I#1!3`p7#>y"pN7sY `/@6@m36 J#jLlbP"kЁT * b5S0HW,ØT 1)!paJ a3/Rp Ca#)yT0U6 &N7pop1!LRB +2^#c >3h rp - pJhhy2==p 8€opqythe8zv,2, l,ш8 -8Fmڈ6re b0E!"0j?"U,qqhvxoqxGe_p^+^ "ZR I8RUK1a# :o @_pYp\0Smw@W`Hj `#ְA _a0Sp_p :86wL UVJ;+kpry:KQaQ2+.x pWC6LK>O۶?\wYwP @f_ Rpp c`3:a c; C[p0"CWc@DpB{w !hKk|P{pvVrq&Ap `ÁoW@("W ^Pk80{hkkp<K=+`; pVh&D'd !7Ҷm+"+ $ "?, 6ɔܶjAAq)k**2%ZR"+T+L^+rllZ-N:-l P(WȠȒKuQ-ɤn,c헆-RᙽjvAQYgvIoMȂoRhwN(-xNfvϷ ~U3 j>_A#^k6*'Q2*`ο联,B^ 5$Am3$b &u)z@PXn!QH/0c3B){#?m9z9rպpɨ~9^2KάӪSNKAso~록4g M/P,,ٵ2m6,/0AK2?r9(cWQf0 X֙^}T лVȆtA'4ީz]0-AF5fRBS.Ydm@ R!G;$t!!D D" MhE3R%I8qJNL4 *S3gl =} OtݺSPM+QI}mS'O a!x0m =zQx(@/r44 NDp فN1e$X$?̸1ŕ1YM4̊4PUЪBt3Cc9";dVK VLͩ]fDJ}A X@*21)U26|2: -x3K 8+2평JC 2C̲ʰ X簂Xku]w^w-CWXkV ϥ| _Π814J Qˋ@T 9(:FD(4]BSd3?StPDSdMJg_kJҬ :"c>k *sCs;8ȤEޘ1p"UT1Ɇf520I3v QTM*%ȆcWJF/(Ґ#?8N\ZJ߲Ȯ'B"(^36C$tI9z@e K|񫍑NJ3?U X=Ik,?ݯ'8 G*Aڢ KC"vQCD#2ZBV1SZif`#<](ّ'[ x(P'Be8Β)E҃mVq: FQpä9En]xDʄ2=aOuNܧp~t&)0%* f0R-P<I$DY3zpã15R>K!GEҏC,iLWz ܚHT(ʞT 3MNE !$"FR8PN=v˜$Ics _( eEӒԣ%U/R:`Cl=2AR%kī_oqҠئLKuUuhg! '֭\e%D!O\h e\(5Dmjw%cqL=zҏ #o][&):I#l&A ZI\S 爐T׺%G%$ҴB`b$_4ukmSbܶ}\gJ>=rruT'#,e):$= qݐhv.|J>2,\h[U^MIZ H3֦(=0~VܶHq:7GD=,%QO;+e4FٺV=Sf݃&^=Ub[ jS~x 4#-*P֐TF8#s thF7ZЀeLҊqq[ي33*`p8ѕIx$\Y5U"A^\ڵ=tUzibGИFmib'4u+Jmep.fW&tp֗cq"q,+8QY׵#%~u;#q_N)61|b)V'H} :R׾u-L1=lg_ؐ=ڊ176%w'G{"W&ސ w};BѲ*9DpMc8{3MpC(S%^Xs^q;nWO}'/^"D(C*RG /L輖iυ Wի͉mS]} u~*4Jiғff`2JvT4wpNsts/؊S6*ZłzkMQ#cBH郤ʖr.<˳k3#+C:CGغ q#;J zSԕX\8+Z+:+hi {$"2>< r*P2..T3}SUH ) k|9W{7 / #_x\z )5Kf)+ &}QB8H&**b pi.A@&쐄 It!Jq7Ҫ!\؅=/9Gyg稢H)ʈHBA`E .XŻ;Eۣ'Ƒkh~J2;ɓ9ғ"9Gh➲ (آG h;NjH74HB4x7IJ%>WK}q j\H I<4RX8q&(HQ|$/A$=p`LI؈*Vìr~YRQ `JL DQ(-QqH)G"ܢpBx_z*)gٓI_&IHXde2G,(- +Aɧ6%YBb >y &2KC@+(͍YJ `.Y-Ҙ;0 Q0!v3aT`aq2ރI0<"!Ҝ|IPцM(&Gb j?H&F@KJ8Mh'8 2 -@]I9 ()`GULEHI=@7PEHEhHK;9;cΆ#yP7lDQхM ݩ %{e(,wI!!Kͻ G.ydՈ(:,I2UV:P|я 穖 1ک)131C dAm- aeTr?9(Z@J1m9Q؏U'Q?T8*B[JqtV\l1s (}~ ٝy9[ґR _Fld!I =S@G T5928q=0!~4vTUL}O] 1X]Q]D?]T`t$ה_%( 119V r^"(p239F'a<켉k%pG`EL0b#AGTW Omݼ۩%S$T  ▒I,aИ0d_~Q츍{qxpk 촾Qjf)V ^ ]DSe;偑qi;ԍ]g=cU40I ;DkPOPI8PBM.jP,(V#i 3]hU,ge|D+si2 -Ivu0 *#fZ540FH@#(THf}V4syCx i.b%o-&\/^#n}yIapI袸MRf``SB9) Ux p-e]1ٿѝč4?eO>aև"tD;w&sIM/[ޭ"o ޡAif-UԃB/msK{ISL@v m M p _ o S@QFKQKP,Dh@`>NB7F04h F G I0I .ugf*Lp> X ̑ :Wy\Dc_d tiڐ !"u $5xcrx :u";WvV"웎3?~ŞjI /\k-a8j/D?\? w(.nu 8@ '8.ZD`QgV0Uh B8^k3szx--z,ꖋfnä%/ ,*3zY g&fh}2 gp2& ګ\1#ݏxS!ᰳ7vc}! )tZ.1&0EIQFFp ;07K9 ɡ˞ѐ QlwWU{xc!؟-~Js jx(CC&"2TB&qD(!BRD(hH$*4I&J8i)L jZbVteժZvի,aÎױRvX۲8EПB pR߉NlÈA; 1Ȓ'KF3ɌYLYbDŽRU QÒnn횧'J==q [6ϛ<}4*W~YՖ_F|ٱnbЍ7_~ɠ2uHև gkOyV퓓l9mĩ(Q2SŠ0 sX V$!Zx\Jtم!AK+'V%nyR'0VR|ݧ_9n o=>eJTUUUp_-gYIsԍG]Zm")+G#~7$7x&l6)'*KԀX-C\IM[mcVc7S'%pSP=՛U.^h5̢ѝEt= Uz)I).aO1x39Zgƌ@bfYutrjzQI1#P7pG9L&C)' -$ WM.lMV[O>)iUY.VN-[4L.'w5F 6W$38 }W$\ '((%e;H:XF`#Bny+vFom ` 1tSD"1Ԕ8ZԫVQ]&~5lJ'$oOŢ $wUȲTˎ.iŎ;:4~/5S' ~$*651IJ5m0m&59uKSƧt{ Dޢ~Tl,2~3} 햺d4q [=5yc`JrG<&&DSd"N_QZѕ}jҊX*sn!حv8YQy#9q$i k{$1G*Rb$@*U.r Ȃ-VNע]d1bAE1WCQ> C :vC @1?*I$1H"aIO.ݠL ]1EQIʝ$IQآBVBmEbqF%H:ʑD>,sTȁD5G%0a bP[ҩummZ[4dhdY#eHTqdK]ro"G*2z|f3)D 5xͅh3%AjJd';QH|(|QҠ)Å*jU$e}DRXJBZ]S"=ؑԃ3% MRIFzrC7] ^PE)&w"t)>يNRRnӽr.R21e' BUFu31̅lT!@XC`E4ݐ ;IأOUM=QBqKAnk","BWDپV,7|!\[/nZ,pd&)+Ȅ {d{C*T|z@Hӑ I kmҗvRizQ.THὡue^7PA!Z9ޱwd~*kNS"ȽGáDL!7dp8?QKN~2i !ى0`o1jelKZĭ* q)_/6t\O^Af6eAVSB>UO.9-kN`RGd!J˺^W Vwj ȇtF[;?$n$=0AYNP=O]Ft3UOuKZxs[lwH$ KH.r4 Z ѱC3U)G $hKj;p !X"T-fէHWjq"D׍9b"W^ b`m[ԧftBnt&dDz= On`ǴsexĽenOoe~kjYs sZI-'NuiYy[E!&X%ozb?C2ɇ)3OҦp+;ː˂:/qt$Vo#j;}s?R^ AߊX#L%(Xh D(ljk:iw=WrS}q-I/jƵT0f1qL$@W.> A%ĩDIɚT ׵TAܲSq U-QˑZUtIɅ\UX!41]D٭헊i@N!pHI<`FIPPGI)[L]ݝ8Z USơСWbW Ӫ5]J^̕, qWwOܽ]P,IN4mU}ӝa7E (1PIYMRqL.SV|WMWx @9ט)UB-|-BA~غiHDK[M\18!Y’ : ,ف*y *TV`.]v}YPm!*ɗ!ɛ2=٠FDMVh Ĭ0-B\1Aai| zJetm.!?B% V5~3љFF%W%6ZX57$'$"&& &ɇ.KH'QX@EUPmZPIWi '[:ƣU%]S୥ ^C4F ȊHNdOvPBԂAQ]ɥr T e+a%D"))d2TS=M5˽H\WRrL qfgȈPB|QdcTAUcD$f}P[(U`K | N=*&Ʊ!ɒ(baY8L@=\D1W!"~ݚ!V900v(2~'h%2($f_]?va`}g *ő3 栭qTEd6U!F$LhmD?2bP̊jAgSK5=eYgnf㦱N)Ni| ќa%E%B|ښKDL֩ƌ`ОOԟNP %H"%REe[۵wnQB '<}YTcAZ8GN\PZ E8G OhTRq%aU^4Ļa]JL]` \ o@BB J IdXR̡ itT+ Y¹EZ$JuqI=jVCzNEE$_@ҩd ))ށ(ȁ,I("0XkNbZO[N/HǷK.EΏ.z B2Eݫ뻵lKDޗJ-jQ%!9 TtY1OfkvmQǷElDDELZFlKd$LYXIUo.)]FFNFE0.ZSE,˸yDzG-̎Kͬ᠇J@DKīrt]-Z^Q$!2eV\@ٝypnm\%gm__!, ˸ЌXl08Fc 3 E55WM{ ?N)Ԓ~L|_Shy2+qZ,uFq/KvK#oIl-GHrފ%DJIK 01@Kh4b53 ut lB@h@s@d)?!Tr)+" C2Y$/! hLHtZ{,GlrXD3&M0QЅ).R1X1d'HqP@ZMk@ D:O⇛Zm3b]2Wx/5[[ICMas[cs/00$-S˪FքY Nj\moS0붢,W tl6[o=W{,UTwk "7DPȯ u/pIɐ&i CRr0`pN<5gulIbI\SF4l:,LO0P^-qRX -ln ؾrUH%^XBA`G=RMdq5e@^R+mP49+CVd8*yh"x+ Eqr"qӅ5e[vGkEKKhNkITLhM'|Bˇ('(l:pi;l+zNRkpp-y0yWq,YtB]_DbcE`TExDK^:Il8`hPloy.S^I !=ʀpW,yH%[-DV^XT+_ߖoB$#̭t HY OFo^rݢ=*=ΓsR mIOj${\s %^y4,]Z>*}KtT_b.y*#dNRR/VD'.V_ Bb>=aFK*ڽv+.y"Fc+qц&%*QM>Wc4RVgB$8K[5TDt'7/]ZFcљojgphɼ|bџ0E' ")r!ظ-=D}ӂ爀T**aB,sv̘a+@%nwn*~hGSu>@c(!D :D aBIRDIDN/fԘ*TZ@]!TwsgZ EPÄ&<%{o.RqqɎ$AlJMO+UƜ9NHrn)4.SjUa*Gi"Ww:P7Cu{<0`*9$=4Ufϳt)*AY0e =.TЗ[ [2 M4̬*q5+JQ-.>FI8DM6Q6MH9MVRSNYENOieQG5E%2ty{)Bcp(4LY"oț%p LeK0 Upd:3b=O*mRNЊq7jvЃP&:[;&Ki&TU%A)EZ*YʷlD#u7/D(<.#&I}1O ,Hd%Uh՞\lpɟZłHR0BNTIՕqOwy? TxDK1KdI${EsIu&Jެx+LHaR93t' 1)lڝ'h1* ZL lj%C-jRP >)M]SX<Qz}uŤ-PL:].@ EAvE}ĩ`V-4U1HABIѕ1, v]Hb58$!x ],I<.'+XMs,)VHiO>t,hdڋ OOWV{`2BX&15 ɏ&p5aVUQ&lc~&Nu]a^vo]{QW'/B$$ [0 IHT\0EiPQ J._z`W\E[~D%$"E3H_qy'd|a@8o6`NnWZa"R&cZQ"<Ж$Gd~$S^gq:Q+Q.ԸC<0<B:|;Om'=;#)4'J0ņӶL ?1Q1n.4"0Pۅ s ԅ~Q%T!e"LA4oWm Ln @v#߂ghm0m̠.R>^^ C`TLWx""lb 1!,Q''Rq|Ȇ"eQF" w[#6 mfg%TeobÈ̖pr!׮V,q|j ȊxQv9Ѕ/Ecn%Tgfbl,ʬ4RqxYq^\"tO"1< 2̆ NĢx7,6r&jBo(z v.nǽ//*nɖ*+% }vNгD3`QsJc3dAn!ܼg՜:Š,üg$#ʄAA!@f"AO }7"vݤB6d|d%D0Rp gPè<326=oZG)tb2C?Ϭ?-7e{dMĤ8:ZKBDv,!Ȣ*%9j §;2GGK^)$Г^us&NEc?lb jSHL@ELĺtP,Zvvܭ:NDJ/xꢆKbv/::tGr1CHDإ#XaIdShB=s=4xJlJ9nG,r(EUX `䴓/R)Al ;)afmty=cgJtIUgV3G.rԐLl))fcPB0W7ATL p1FBUT ?gH>aWKh WjE^d"=(}*ˌVD^~GelDp#FҸJ22x.?' _Rh9q48K'‡P138)dEtGZ, l+x|l*\:\l#$LCTвnsxa}bV9# M+>)Z ~-H K ņArM/Q00^0\0d6;LUtNHS2R%ֺ—v'C*jw k"87c~ic8lj8f Cpff0]jni9 ,L$aiVON*ր665Z+a?aaQas̗4FgvI`vBe8snChih>"k~@l<̖T4^ӑ#=qJQ!SX*vti|)T)XNvkkGR/lo˾ 2$g"%h8}AYpJo|?$^#+rWBNk~~7kSSb.x l-Hw#2uQʖbx׋䢍-"xdbYÕ,uP9ZP/{IB>"t7dIT44?8m=\p:B(Jsr!Da؄ T 4*6hVA#JN$%+t7[V$G_/~h,]FҁơljNpNJXAJOMZ@&iur8VyB>T&T*tKd5y Dw>@Y(<#]BۅmI  nEJO@Yh$&%Z}+b+ydO"kg8X~ 0 x$m^f񖻄s?\_;KM$xK~xNec w~G HZWtkKK/*y50顖"vQH ֹ="dvfHZb+[Pɼx-w+bX͂/nx#0%Gjz{ t{C]RPTz|KTx)Y !QӢV6B1cZ&z"x)S=z憗Ĝ}x)`) N ޼%^Ӗ1f@$/^Ca;;Q:ȇB3j+6Jz&a5tX+w;~xl\/HkU˘rVbW8d9Qر4p~fJ T(YXe戓_$DYd +wװ[ϚtSqhwzs[ele}/.rI %2r\Lϝ4† 4lǏ~(@ .!36x2,#PNhb2/"R!h$ąXmW1r[͙r)qJ\]Abzb.-e B3HMvbB߂n  aB&Ġ!iJWb}E VI%`}E('t‰'(Z DcFZtdGB]3__cFXYy1 'xB$ t"'nzs8 ]^g]˓"⒜r*/&Y` HY2 !f;UBy6≋T'hU_ "Z!װnlizK2vidȂ$Ln*0;YZj~[ȍc*HYxK+U&UB;1ˆ5ҵ{+vq2Hr"z+/wo赂:s"))$盛}% WsVŚW(ղciGurU)$rr1LPhWMC0 Dg $-,kS~31ШPs d<,67Y 2vivt.ԌLT/<`S>ս!%(4,mX_ɚ~%17Xr^(-u肭߽MHnk*RVln8](3v VM4 LM~ъ0&*q|UֵJxbzՀ3m,n+ꬍE#0$L"SArVSk_e@́EaA!FY ,DTz5Q V]&C6tS" 0Oej~XNT'h3BOԛ3pjal񏇺ԋ ͜3pRc!#1EJJ`<ɘa ;,?d*g!JD;!Hllc)([<vzU""ȧ8j)72*F"w^" S E'lO)NR1*ET U~E L|E".*H0LIyփtB\劤a䲦0JM^SvWA]$S!ʉvSPEʊ_Cejm2+UbUz u4 qAVfyg[wq: #LB3*"N !ߞ( (LUJ$UclQ'>Owvx+Fo#,F?t4(Ajzh!Y·bXrfuPv\H"V_t[w(1CBarVg6 ʲ6acl8 hQKqiG p+ziF^Hj0aWjHjh*G1mE&ng ]p"Ay J}<d-zqxK~4B 9UoeoڞXxXj(Ivi}:`Fj`LT!69Ȣ,ox(}c1xdy/&pCg6AtU“mX011faXHMYv reGvj8嫭SJw"5?-mo pCW)JVOB@st}{Q9{ՠMQOthC.NZm*BmC@xY^Cq:`M*0ZojaK1 w"c m4Kd@&dbW?VLz] $Rko;z_jiNQ"6 E k4tblkKc y a1tc7Bdɖ&D"1Jv1_8qfE5 v'9q(1&S1 T;~Xyz HbHXf`Q;fmh`4g:"vwP:Ƽ ǛF7$=R `F+jzA1UI@CJ J!>+rvX,,r1’|r2; xiaUwayMW6g[tEж+16x3?|3d C B\*u3bR"# T"XD:Bn5 Nۑ @ 5JNf %UQ6c{2dqN4 Ǥ%ǃ%@. P)"Vaxg `lXIz[$4@V1wTF`i1Z]!"Z@ PTV7^Ȥ# SgS" 5VA0AK[Uq<1R8ʻӒ-?ғSfu7dM!.LNM.!*H< D%LXk[sz1QaQΨ'\17Fck-yOkt>u  ZQ2LJc͢qkF"XW oU_{r1-r#յxh t Ý =I7a+i*@,8N2.1Lm9 EODC*b L$: 1ųRSNt.BNC'22#yή ;;C4H OWNR4+ 3 AN3! c^/*كbMs"Z$TzrXy+1S,b1Ӏ#+23Kp2[7 [3N~D+TF ICM),=>e1&-EǑ?p}qhydk7x33<4E=-'4 a"R-F1noG=¿b` 6a4im-HzfU~Κ"q2~$"3V*`": q/ M(!]ă0 值A]E~k͌2 IV8a5Hk)=4GG7B. fE*%î%X2@δrER,;%ѹRnťp,'l'2]\O%9ֳ62=DPAw#'DŽD8 dXbd [r#?\~"w'"g7=;=7_BZ_t'!F5҉zH?7s2 $"O`dBV.=N9b:QSQټ79zf$ m(b[}@xin@ik涥H0x8@; PqC{ǀ"sgpa̝ܗ _Hh!]$V-|i2r!oX < "X?B:TСG mXJETd'(MTҔ)N>BeJOhj\*VԨ`G-z'\nzKVOYW[jk֭[=jeMqĥ B4,mL8P!*4iRȑ )qT$&_؜;r+1v옯>RzV+\JmIUNv.apaC to:{WogsD!FqF8dB 5S'O&oRf'T8饳D'ӊ"ba j#+2>K5` .=.= ˺Sq;NXhNJCC̢F@joKr&iI&T<*_ɔѨ&b$\\ ӗ\n_i 미QP5< 6}J\Ve*T-p+BPTn3+RjjEj*d"S?td4"<ʨ",\B뾳ͰVcS50YX٬RO@RSnJHGJQVr'S1;, ?6ȐCdyc&%N6ד~YZLUc]E0bfb!&/E6ZHqQPk,Nz!2:.砻+!Q8!YVebŬ>)6&w$Ӱhr6`}Q sO ڐG5,Sa;Ekuz:Dh&l0CC(^QBz>l 4p+_u40d̷_zjACRS[>w>N!CQFzCtBҫ$hEB%$/&mKMlBZе|Y~BX>"D(!b_P'݁h9B_'\eaU@!nۑ!p!ۈtdF_V*\l܍lra/O 1vf*R$jR#$At*m,&3aFBU,p uNƅ!P$W0Y'7L1aIiM,]fֲ")'/\)8PNŻRAv/sx'Xe3,闀P3 Ph&,bB :הL`nɡ:eE۸FOaQtⲐLg|F 扤)R'"s2@{LtXb`T >= NJʠI ʈ͍f # )b89M!8sYdH[dR)=wha`=Sj_nK%2p_E0~d-HpNQ[ "k!oQ]B|R8(z+"$L1Ofl,@U%_A rÖR>To Q[:ng-xh *RH=hզeN̞22N $ԉBOh\Sc-„>TePY2v˃kḅS wE;n偑v,"S'0qLK>A& v]P-*@3Z Xl=EWBsm@K+WsHC#9U)y}E1;:W[<&Q\ S4+X((SդdEVVB@Xx6}?4 f,c2\~Xj}1_"+ӱd_ K5{{zBʊ C2ga.*[K;S??ܥ_%ˑI 4]05@PB[;IGxBۃ'Bx/-³DQ!$Ic(*[?$KAfA s?ЅPS $ I`!ܓ/뗔 Bc;/m  F8tA#?,K?{z5A@EA@ V@#hB@D\ęBIFD)L8.0ä! i)Pç DA?+,?XT[!F«ZDl,ْFBHCƅkFD9xaHhLHK. O CK1$쉏#DcоWLZT?(G >J`@GfEllJX4?jEhP\I{J\_AaxCרʫ<l@+$IMMHJh O$,ny:R?i5zTʢ4J J{4?}eʨJ=LʬdC҅_ !Ce2#URGx]SzK-<#T*# :CR<aE}D?f It?t}|`Ƙ; C%9`c4R%6 ) U A$b# БZ>mE|$cJ_ahJ\ᡵh-F,yBل-,dK}5/H܍ IDA]pg\άdNah\D#ML,,4 UR)uR*Ҽ6ͨ 7ڞ$SQMD!D[eƄ 6I#LJ;espresso-5.1/PWgui-5.1/images/pwgui-logo.gif0000644000077300007730000077331712341332513021112 0ustar giannozzgiannozzGIF89a    (  : 4   K -"3 !$  +#!)#L )F)&W ' %:'%$!*')3!$0")))-$ ( B!@(L#:$#',/(-2.S V -)31#m <'+Q"107)173c! 1-601e#B,2e#%N+!&57>/4)P*,;1+=4=:!;+ ::G0.#<$`+!^,(% c,}')v-D;KEF EAv1 a36&F0r3+DD*H+{5V;8r5&i9>BB>D12-r61$LM&LH(LC00(O.PC902a@6m>(\%TULN%*TO9$*UK0SR#WQ5:2V4;U'1W@?=SP,\,dIDKPOC&MShm$Wt;{6P!_=G &lNx)' `m{B b*{Th촠!Iz ćcyCHL&:PHW=AL^ Dt7LA40T`8N- -}ӟEB N|iĠ 8 IFfP#b$7 O{_P~ F Ezˣ7>$ h?O"EIH07bkCc65y_J_1]s=xa~ǐs 1~Lfyfi$Y~~O:^ń5hXIMFRwq HF{ȴ/9id֎pHb9fJc^QL\GM,˕3-v$uࣳ0-vl粤hdUC˜ƣ,ZR((!?+v(t9\X.౏M@ YNͬfsm4KL`vwM-cɘ62'jV ,eu6rLjl'Z x2VuĢeT(IE pg;]^&I?*ޫZTV$V9;̝rKHy >UU$-Zj/IW`c^k݆8Tj!_CUc3kܒض(m`Züv0\LBb8m^v IDoSbbv%άe+\@+d?S䮇{e[ \E^=h7}6b-#`#2)=-kP)>[oJ֜*i}.:A׷Rg2Ӗd. (- {;G]v^5ʒ#Pd#xDmf, $5edشRcqLb\)^ӳ/lFkMz-ouڮLc ~Haz5Í6dL+3!AZ!r\v66Lԭ-J!mvƳyaG8D#xs0_9(I{-nzkh{y݀YE+bʻ=bZ@<%K[̲ܾ)\Z]Rccc[ꃱװWLJn}t}E7tY4W3V{&{c2ra泫B9Dx.u{:])N7J]n6 SPB%TwlEr͐^rc}9ݒ*Sltr[V05?Q^\_Lalz& (Dzaw0gW;}kuk\`rs,r{R7TzDa|CGS3>[DLHz CDGTGz RS>߄{(I+z (UTAc=<=9ÃуR>G;j.։5dQ,YZ4 eWD&Lדmyvxnriщ7/W"NTY ;r# bwV%ygYfB3*Xmss6;֒OY;Q9;gugl{ W+grOQ#A]y:)-[!Fc2-&j3s\r,ڜ[> uk(vĹ)FKVc}cehdH\=<::0*k%Ggm\֢,:wydj-2C}QyHj05-Z-Wpy+h7s㖖SScX *6SQoz90Jgs5tV3B9EC]c#%)9[]Qxx Af"Sչ-o):YޖTYydYȢR*Qtmb,)b;4ZGfSّIԗia9g1".wAo~H*z 909:ɘĕJEVe9vّ:lAig")ᒔ}6:vbtK&c]˵[ qJUv0:xՉ5.1^#-smdHkU6&&-{;7[I ǃ9y4()_fc=eYG(IYD[;H&EAyTăKANfC$H;;HHn@"F)&A+DCʉRo^b|E"tKqt?_TXr.W%DM&;D驾~W.c2񽵪䄽GBWϫnbNě>+cHՔ>TLKIۻhJ+(6C<;|c؅G,>Jl甽o4{=DBG,@"L/&BfLg)Ԋ/scCzqEZ5;4'UTTe~L%q6U铀z1T$XwRvN ρcH9p\R}4==LƎt%U}&hSªĻT,K{c|A\(د8b~"}Vec5۳iF-*ϫHĝYٽ[-1}#. /Jc > /k-u3$u%F~ k aESFf-B9" t )v|\9ΖhZb4,~'ryί~D> ٜL(&YLMn"@P NԌ3|q4=ĂȴU(p$ZTO$]z!tGԎEe7M)V/c 03%D$񀖏|MG94?K$LA|;:-"Aĩ续+U^ό͐z2D5-5>UNfػFknBJӍEDXlG3؂ߤz|rR,?D؃oxI9=_=6|Jܓ?r?G\ G$$xv=Hݨv.UicC3km%`26YcraX#Ǎ7LPD I0tH̩Q+<醭FBER ֪mD7qmv.0z @\Qvٵrnj]xݽo=wGݠۯl[oO$- ²A>/ /0C4@J5BdB5D30(#Q= FKF[$#QG7d#0Cv$@,ƣ\2,IlnDzL rCk?ʢ43o@>8>{N: -;{?E,bSCt@Q85!loL3)k>;S4/rYĵGrKI+s%X*wlR }uٝVqY^UZRXm-ɻ]pPUkGQm|1NmRF LyWTҀ--L%4IWcXJTR$_9+qXC-묇ヒ*7p\N7vB.C$umZ :i7hZhqti_DQٟڬuhhޙH fz.wS<[/;v@_=յS 5fSմ=`HƘdkԒeSK3s`7P[^yt{ϣv ư誡2h l$kH,sݑ:Šx6_2;g_'n=@ /w4x_Cᄅ Lgniql@f ùmJ ǂ" UÐ(%9Mr" r0KP$': P!6ta BCЇ?b8D"шGDbD&6щObA Ȅ%lC2t B҆$daNBF5ff j86R5"H4Ff 0 AXs&4&DGF6Rf`)6]"m,h𒳑CH0!e*xJb)BT򕱬))\Q!)-DZ,1a갗dH-\a5crhBL&IiMk2sYu+;q'=Mh2Yg>)oSDAPsbg.wX2_DH.#^f+ u5EJzi|! NsMujR's0]p U&>e*5`Xeؕu< 5z{QtwVխo둄3ŵXf%+Z(IiDqTzbp:>Y]^eYb K3p#6FYk ̩*Y8W!6Jg>K_Lz_U;TԵIz҃lJW#TZeiĵkt;]UkPBt+\k]ƴ@jDU}B{Xk]McJzg@J[j3QSk?OHڄI5!~3g[!8޳8#/͚B jWwUsG]!?V0;qqv6>ʌT1<ȃ$)LhIKjҤ)Y|s,fOJExB<3#*y&%QESݏ^1'Jb 410UPZ4fM/z'񉰆O0 LG!M*Z~(A]ʼn/Yi[ 'g?#PW,cM3ߥ+%ȢNʢR$()s11: P[z Ѝ1: Œ ] 0[ %F mT!5^聚}}Y`YٍT^ގ<(Y% eULHx0M;PڪEu$c8ņ5xb[%) ]ڥF*ǓU!"+>+&",WܼkR2ap\cRN&m2TREP14vKc [WV`v)f,(-nb``0 %2& e_6_uc팖M$XFYc94Vl(>&j{\5cYff:= oi~-p+ yǿ˴+0y QS61-SeGlk -kˊ6mhQPwU%WԎpfWԌTϠj?fn聠6:mhn)0^MbmvX;XnƆGqP̼m߆|icPMa6?-Ϗl}2o* 1ov^Cƒiyc Z"KR+]>\⡆ĒXz\P&B!B#zzVp="Jl+ „G!Ĉb3f3訃Nj5)iƎ/nlQ 2;d&N1aY1'ЖD-ҤJaR@&у*֪WfEUk֯^(ۤ fϢ=bշn^eEq.}׫زNhX"*vU*#nXԦ]b26EFfTQ爠i_ cJO >d&gj ulɊz> B *頪:뫏 p+k 뱶ګæꫦJ;h뮷fKl jz-4.B2kךjZ.z+n㦥P-آv{j*.+)/X51YoEٺi + K -Ȝ\։3Ϝ)bvJI# iCwsɨU&P%Ta uW%hZ^AM㙥Eh`gv(hE4 LTx{ؼ5kjL(8i6rl:,O&3ʶjj˲pJB# 6,/3_=/{{JlW:Kũ"tcЪ4(]vĂ;Nvwh Ybi_Jr;Mw[ï]N|h5; q_;䶮nrL7%Qi:\FPL=aX>$x@ts; k%% `4àVa:QU #@}0z,HVdF<-v̪հbS HE޳ zk^R.zK,գ>zsvEx ^SeE,ȴ}4ECpb Ig!w!mjUƕn)x hARGߡ7MAoպc7ã/Y<}QM}#ec`WK-umE2zs{Ik2PB.AdY\v} ԞT{%.kX& \WHr{EWFUT`I$no[+#GDk:%Btq&7iFi\3--@fG9҃6M^e f_s{.w MP.eh؄(0]ldg7IxCܺ5vHR]# bs $$(7 \D)Pt;"GEbA$pAa /=:v6Opm,4&rSdIíphCxq|n$!J$NmվZ18)SK8MOI~qё4i(EZA"'G9r W.-56ҥ\fmv!7Wks6HUxf/J$dTLI vە"~sru;7 oZ%ѼOy`FXD' G9_ v{YX{N烿 xğt^U<~ıg|ɳ~8:0O/[* k}|.O{qכײH.{}F@0^o^h EE]9`vݝAMEnB^`b؅U|>EjItlѠ} $ 1` C}J5gѠОVMJL]!6U OX_F9ˬROPEՏ~<d[Yc c*ŎNENW1n4$D`01bƌ156fzNO9U!,Fa:`M gM0l cAd S N `\ܸ 4.bf !D`.~g 87vト ! H_SуA|2UPQda`N!%b&"U1PydMEH$IJI2"+4KHLLLa!F9f.Q $ڕ!d.b@~!Bʢ <`/Q #/@SH/cC:!MgLآ6~ V 5ZfY"TDZjx:)e9X#;]* E*de%b<T#6ҋ6 !CD[AV;fnf`|$lfK$mKΦmk("+olGWk'bRiF֤e&4uRfcu:fc/#V#TX :'HGZ3bhM4QYY^2"ze9J} I1\`U(=^FLua!!j&X1FkQ" shp:L&H*" f '~qRrҍjf 'JM~(Z"e"TF逮V82'#Z [bh᧙` ZiՉU@]E*,jo!(| 6;rUj+lE^K8A6AF$ .j*^6`**;*C[C6B4^"6_ k)œyu 1^x|T-&P!@G騛N 9JUknY뽊*%ޒZ-+5kq^Eݫº6,îêZ߅=!`vl ƚ N`4B.z`oYL٥j~]EYŠEZU jEK8FD]02WfbնFGD^ќQ\*B.dC;hL(dqh{0!\B[!KM0] Kxɖ b?~W6`*b_&.ZKHFlnpFLL4[yɄHآmo.oɞlomƦAM@-WnA^] m quΕ0mΖ|8PJVFL;6ck8ؾbnf. SJmێ60l\F(0l*G(B**0+d pp0w0Cv/Ƹp{  p6vgp D 0=lNutE*j1O%8Yg> 41eg3>QkϘfM6IXI֜]~/ >}o@io4byQ añZ11$)apBΧp*zhϐvQN( b`  6m2ÆNB/m?13{T숦3lܭ0giѢ d!bphEͬdfi!fFҏfMj5caKE, f}Iiq'/eH1eҠ #ڰ ^#C 0"M=y 'qg#KfՖuDt1^@c gJ?[#|m}*) (RC ,'3C[1p2:2T;W= s+W-YuZX&, h&*0<Y3 ;<ftrՋQ&,֏u_tJ>WZs-nYgZUݤJ} KoYGH϶Gϓt5涧#وtA,[mlyF4tj6!Z2HȄ_FC18DOEZ5j@dMM|{u}7Ww[h"u$8lW+[U/vp8b/6;sdd{ftAό<?wZst:Y}tx4>IFF!4 y7lK#m8s Vs؀Ɇ>#͖> Q033xB@XƔ޾C>J˿HT2rLuh:ˆA &:}%>Lh 7<8L"4qBl$;$]zzPBst`j}jhm4?/?̅PW(ݓL\oWH_00vA\(mbbaU(ZKȻ@EonF(1+DtL+?Hl @yS9K O`s9?ݾS{Fs9 `nnEj 3KszG5;Pj*EF@o Mk,6dȷFS/[<ZX\-Sݻ#ULA[}T,]gT%}}ݳ= Vۋ=>Rhj1 s4bƔ4e/cC\>AȔ9m20>E|!*lBYA*8UH|,Gsz\)+%j_ [/jkK @xH1"ˆ'fbG282eG -n䘒Ɏ„R#ˊ*dEO O-YTiSB7jUa3kW''Uxi]ՕQƭ5-Ď7+Vsbؽi+zDh ;FK/YlJkh GZĉ*5ziGSZW^8rEƞD]Y\ԟRYSX!<yqX7b*۲g1NE11<G[Vƅ!CbC yGhJMG=+V7=ص[ו%1cd4ui B8u-cEqdZ޸2q9dR}S7Q'Vۢdt"4y/NpS*DxdS &uXg/hȚ"iKJ f ` G_s9x̤$= .Dn$<8! //R0 N|e0԰ M jV {"+ c P9 r(4r1ZeuVѠ릤i(DjOD(p>DbHDGpdR^PX,ȍFĶ~P <ȚEJd5lXp1V)tdC'ফ2q]Ȑ5 ṛ]?V< I 2=L 7a1L!?ϔp EnC /T ϯONdHDI<9,Sduq$CqD~P g$ m eoHbE +7M^E2&*#X.2X!@.#il(1%-0Va0o,4o@M)+ЌŒRɾz*nPo0kP2 εlZ@t 6V "6UmnӜt6u39S9988/ 9 :9pkAkxt v:8l8=[85]+5)BB5WӱP.+Ȁ`">?S!&tS.mA 5Y0ǫ?$Bӿis̜ =7_;s$ κL89M3Pm;u PMsPUրoG PUP ;ωhTbKMC%k^SN 5VUyTC|lK @K4V&+Y GI~(GPBCo~#E(F U2// 25^91eX>rE> DR Q#VjT+s!c8"Pd5e% 2f4VaCCr6"*gUQ22"%Up/f/4 D%JCiO8D5Uw*$?k*%qȏxE#xw'ň,nDFt1or C\C'Dvwdy$eݕJ9iMVCVK/2(|1G5EO!yAFSʡ`1C`!hb#n0cשu =R #d+R[Tw7.sk&zk^Fu$fx&6w9 k<у>m4@yywA^AH=whQR?vI&{6~=@ iF}vq`!8 Vl|C^:Ǘa1'E{5rH*nwn>.s! S_OwZ)/Q}dJ{uF lnV>Hc] eVㆅ90)Al8 u;r~o&[rAFğBEynZ{kRzݐvqO:/=qpM$_[;-ڒrxڂ+Jdvw&(%8$RI4rYdb^Y+dyİF -҅CJodĤj]wYY+RzcÚYvc{7yw˃ lu/2dh Yy⊸]䂚ix}dp=d+&.+z&wrw0'4mVCIg+as2*D h۹N$KU@#4W!RIZϵjBdt/ X5׀ȬZ+ >C-1L?g DRҊ_UKC1WWEuX3!RTZ[|5mEgtt#|H$h ɭʱ\"|$H"Zj@C0b[B'є'Xb90~ԌbHh33l_愶Al>]6;ΈK F53>3uC;=:M9S8U}960===7}u}IJܴ.+C)ٕNhSʚ3y5͉z)(ȉٜ&K[˽!ޭ\z@! ^3J2-2b7z%"pG?C^ 9WH# 794>+ Nq2'OwnXW :F6Eh9SV`3lEdw9)r!vD)'B9pIy;R@>`uBj#dqᤨZ0Ѡ=hE)$• U~@iR%˙ Yx1F<{3СD}ʰICLee4jT4QjVUz+ر^c-l&l٦} 7n\fϞՇ/|Vvją{u\4dZL/>z!rU{b>͹6A%Ŕ+*Wn˺Uagz/`ذzQL DyiSlI[:Qs7FzJ%sP~{g޿O2~  (?1/Ҁ} ir`}}a{Ѷ&gFavI&ԂL'9dBGKE-1\E!6z ,QSz9>$ڍh,Gm%d>5 X5eb`re]jU]rW[n%gv gsh^g`UZFuac՘^>SHqJn(H  ?'UG@nt Dܗ x92y LITjyy΀/D'Gi5L2Q +)xr%/yA55EpQ)F·WP߲b¼-3?ōJCY $vde4251@0`cLP8zBJF) Y.zM9֐"` '+ pR`ؔ5e,W 7B 3drԄ 9j =F`Z[Ot1jZ;ihMB:&"-[>4jtn*WMnMZײ)hZp&bgVPS#ҭQJ˞RT08zU)GSԼqyPUa A`aȬ.B**fb#ce[r(vMHZV/Y=h="```WyfpDr|Y+c@XVV|)LbB]pvhy.ەKݞUw2Hmyt^IURٮtϯmjebaY+sE`yY<%)4U/J,fɡh&rjUpBN"2ǖ4^ ^ѕt —0ĽvsM^ qVr++B-f6Z3њcX+phB`Z5XF 9t4*A'bi,P Y<AE`dq©-~n)5߶iOr8y-)S;8l{qBzKBӽq01S|i4OpHӱTѕuX(}"&(ŚcÑ5#VY|²jOwK_6Y v{)&HygTlbx7ݯZoV_0IB;ԉ]dHM$ߏ$6'J%K]q䦇O|Yw>fVlѤ`,_n1\2]]8XP긍qʗOrlSCwd7/ sex)V5v (H&yPo&o+41vEQYOB"Pwk-zV!xl 1.A%H,ׂtxGy`-ziFd !c,(kgxdi{TGGt_p|~=|χey[nq~w2kFrwx}-'\/w\}%\l`lChxCCȈU~CBOP2PO'B/OTC5h͑d6AM` bWԊNhAD=sc LNMM%Nl:=;#?S$/$GNJgF;FI3C<$Îϣ<S'KJ;3HmvcLЋՃ;IHNM :, ;Fh.KN%^?Ѩk48FkG$Gk4CӎS>c⨎ID<=zԏ|<49ذ$J?HW C8>ɐH);I8Y3: ԘÜpVF%]&Dg20TlSwAZPDnC5/Ėa cCKs9TوJi[ڕ4U ZJӠ QIuvfu[huȡrtB77`ght_)}_؅Ba2$UGQ6dwoiQ&{[ך/'23x+.6/-x-|Ǥn2!@xG75lChy(},2fy?x=z/ThdZdNo jAE+n:6 %Mz(el-$a08a@Jux)X"9(ag+V",ҪoQjox*&^ztps:|j緡f#\)~ٗ j: }1+9[`}~xǥfZ\F&7I~qfAaa1Np)uu; jKBo }sSx:Nj0t9VHjm7Ёm0#/ aoo&pZ dk1$%iI{S{X{X<]>w]Zs%f^HKBׇ/3˪:K}ċ ɫHP+v:\'C.BQ,T}u\xR]Ip7E&\BRƸK[V2 y*{ :qd ֪xz3Q+ylb A HVL2!!s4UxWwNpa Ӱ_A_h2A=qtWˢe4p]4*G.\I+@[Rه}.0;\ 2Л[ }H hTIulw\7$lk4H0ƃj?5:h >a14)s`xko |-II)L96参;ު^vU yx Nst%Is>Vq(igC Aq8m(bqArA u–Cm@Nѝّ>TmڧکtPЯ]zLWUYЎ,ЏٿC(~EQ vN1tr1p־4ٽ_9 i`g._]_QRGNUl7?d 88$b`#EXXM0)+(q&BX. Z iԤG2Wt~=]*3ft#pd(6wsvلMMljxSۺ=*y\j[ۻ]j˫jO@B v`HL.FO9]7<CxfhsNmNy~% A@0I3zGhB{BbWB ]\.]Z^P Nμn8kp L Sp+YΠmy\PKIЪ`}{Gmju1`6_!G G .gf~!bKaR8xD)&c/`9PA{H":!q/Ώܶ{9o85oq't~(/1TQdcPv\v<NJ J^嫏O O?M^﬿ Fj ZC%5eooSf8x-/r_1.)x~:pƀjX>_ $6lyh`C%zXE-"#IAl4bd"?9d،A!DfMImdINZժUbԧ4)Jy>1Dٳh(,[qѶKYy/z Rذa,Wxcȑ&|6lgС;!MZtiԨ۠a؈ƱF,6طun8q±;>#a޶{K.\6iׯ8Mқ=sp:jկWIxT1]yxбZk,TprAzI"0FpʬD*=C;JĦ޻$}@*;cG&2XYEF (4#=(B6'"lr҉'hxK(oBhH0;($Vλ骳.E㰻9±BB©EPpTҼpL pS$O+ 2coUV[5/T4VԾbm8v.8 65X6R+5d:Js&]YnX4hJKo%WKDHKd^z뵗d%Iw_d;Uf 4 6Vѳn8BJxLclM$zmFܰA kyhșg޹{Py$ɘ<)VC,wDV2M-Lj4e{31lW|M:*[U6X#ֻ40P\Od V^^_ q{evwÍu\t;_6}sҿӍ݃rQ7s4t=qImnK[bP~;[eG?5\o\Z7|?e}o|_lXOU4?㍁+1DV `T62CP6Tʄ26`=Xl`R&HvdGu8CfQ$8ANXa͕4ySK4/mGEL_ E\ܔU Rd=,Fn^V>0Qc,,tÄFW,y+\&wG<./wGܭ.uCy8{n^{@f] (J|[Mwɗ8*HcҼThx (?7pd[w\Snr%US9ˑO}*Xka k)]va n &R,S8UE&jVF3S,^k5͚{BiEnWMFȞ},ZPEzT">7$DZ/7 0p7bVԏkko[p&EdɃlpʯQEoҐm#l Ybldip-\6͆CW86\ILG25R ]bX1~EX ذK19(47ΆgM(Z(Ei'4dYZu*^-g]4Yͬ-M6c8ٻ?tnlE*Pr,"Ժ&=ʛ!:Vogߌ5%WJ|iL0Yi~'R2Cԣ.Q|jT::H`?Χmmk Uj1UE ?h`CbATfvWuVLvpl[D8Ms[6vr / 1ռ4F}Txi&ߺH 8"V$F dvoY>ė}{zS>\_&Fnu[CsGšbՖEtڍ^ݎ;y."&z1qI_zSH7 c}uUuX[[ENv}vT!q͎bccدNͯ~wU@ޙT :NCuRCQo1(E*<F d^|l0ݑ7Ɇ4L/|h XOE\e%Y9$x0pj9kwE)jڏ))Ե Oo3=5b@4=)q>k>=ߛʛFF |;<𻫪;;_"1I{YbY>>ꡗ1Vqyf١ qU`4cϨ*C*;ƨ ۰I)/Ĥ1lw(C3tqH4 px7|C8C5bHp=C[CY@)0D1ЕȰɊ*{!#JD2*_#9S8˄֛Vk8.N;Е10DmD0/@`>C=dC^E6C` F6TC5Ȍ\LnD*s†4GDŽLz9$G6($c!Hn9Ǵ RA|ipMܤɣ@;!ha1K˴Sl\kN)?b(:$DJ0J LʲV$z &iOg)gr,ȱ V,O47NĝI9EX ;>TU[ռZ Vխxٽc VKTѽ0RŰK mSq3`l[tm X<Г9(-F\E;~mXLʁ؇ϑ]-PX\,b-EʭmT͵ ^^$֤:}ZBu۾:VД)[-^7 [Z9$D:=+Dڂ1HI֌(g=% LV+4+Q 7]>7EE<ׂXX_W³ 50 U$Q9_5_l$x!YeEeRi\R6NvOVi<ǒΛcI6ܛdJՉdݛyYLaElޥm^}9chB0TBdW=?Ny؊h1ⶄdWdp>dx*Nhxk,bkk`ɵ~b`a>,zbl~CQsFȅl7Llg|Vl>l슶a\7`kfɻKkhЅ\ f.d=Pja}& 6P0F^n@1h9i!,9v a9̽@H mZ]j}ZU(S /Yj+l=Ӭi`"h5>kQsp3=6 O5&Nٵ4-lgP/;q/q/Y_p oN ? GbppfpqG>BGqo4UY>z^UER)SY 6>o:M5o&6!}=r<%tEFoge {e Ø,0L,8dB'OC:Lt8%)kr|ԋqOp!c{#mVO$tJq<:WUoЦ@4r^u|-r_va?\?SZuX_Jou vhO'qSvJtmtfG=Pm)_PLr* Z0SUx_Z& nKIYͲDJQ5p$BOm3OQBIxowob$gPomypHQ,]xctXQ`hwVyoZpf/v?sr[vzu'uyyVwzujoo yz(74yc/:r ./tօ/nx%TH4ZY Oo37x_hikG&O=?@oo|ih(z4fkO}_}JOz#zuo:֯}W}Կ̯l|g}wPs2#nnů{8+|%G7{'?l 05/+/7 K]SsU>$4`$ Q\LCp'p;rDžKhBL8/Q^?O>z&OW6v ]̍6oH}TfƢFt)ӦNBuq*ժVEͪu+׮^aC'/#βfi})P@7An)fWS:nD>UkI%x43,Y1[ؠ٢y3͒1Ҧc)e5#Wq[ڶo& i4l 7Ӹ#o8͝fx:֯cώ0 g~l=㋑/p. oBghp!TJ&TFŕGHĒPMKm^ X'6ŖQhe=` &߂ ڨS W~g|%M`7"݅iWV2e1Xl!l]v \8k>٦sw1F9Nae2ZJ)BB4#b)8ҀSc*1Zj2:jk9?ID;Z;JHR, +MzӎꍵRiڊmۮ[/⛯ۭz.Z-R+ׂ[C3qj2zjλ`J/Nˊ:2ԁG7g{9o =tYto&m'~IvL",$lygk} sӍ򾠦LoȖZkbcxI$ÎK*,<91Z \l裓W砯^ 7{/u/Nr, #cRX7I\ǜ/g}̀*sO L+M9C3?h}|Vmmrl/7ⱍ[V3!*SҦs˂SH=ɌLtD RXOvk]}xQeBBeI-CKiQk!1u8|혫)}\BvxCaJ'F,2PBEIrg;nl#Ч>5i{ Ȁ XE+Nլ%ǁ4"eX2ZeGR "*4("y4:)N)ҟ:Sa Urp !,JQh%PZ\1ΪC㒥կ5b$Hֳ5`Wϡַ5*W:WuӲ_fD%:[*8M"V<W6Ed. LY?3P8O: zj^(FQU'(k'O M_lSmSpf:3k\!p~2FuT$!J t%Aff0d;^ZtcY)ҙsB Z:ɷUZ;@G:2o^$Ű|WɇG?nS5'GBOͱ:٤]JViEQJjLֈڄ(iYe8 _ '͸|<RyU܉ύ]UQᙒ":9ʾEeŸ0QS6IQL!!k9:R!az=aXཞ T υ`ʬZ `jb2~0(MS&@_dXhD-]|] f9Kg_y_"fafy$I ld)W=ɓ_0W)53QL EleM0ya(R'7O&"\L9JMބ` ܽ^<˯mӦ a"1R ʤM lԔ8^8h IOA]*Гh"AΥ$2& Om˯^=$#ffAV%QM2I7>"6jca =MIcdad˴P&$0R)UUfAm $͢:"h%iyf9R(̢y%f-F+bDMb9:ڐL feI㒝Bc?R]82eMe 68h<)`D &߽!hR 4J1x0/$ Z=n,'s*'U#taɔ ($&K3]Đ ʽ9faT&J 8& *fHJd9*dYV+$z!8O"afk"&`e"B^guL]nLȊsQ .-zǍ-Bh(@! iji)2i:(hIiRh AЍ׬^^JAAJW|C7dlY.jJV".QriC(ã وMۆYh]{ԕMU Dqj > Y|EGu";Y=8<ۚ8<2GEИŐy(![Db^.nb^%L26[{h28Hqq*V>Ji(k(ړ*"B$hihҨ.Y^PE~(@CXŮbuUF,+!(lklh,ج҂YrȒl"-lGq5ڡG[PA쪢 zU '"2uw|LAEFZXٖAtZ(|q5AN0 ]NjYqC>C14Z2n-Pbb` .Rt~F)"n64e<ڄUh)-GĭۆZڒC,*+zwpuxxm4XU Y1m4KƠ..ɔ,mB&׌l˶,ʪ,+Ζ-s%V::dWlCU;5@CS0+_0ks nf`BO-[,:Rz5(;‹ȴ楝"!9Vdjifm \ K ;١=eLeJ# : Ry_rԸc>oxv Th$xniAzjMtTadBJ TA1 k sV 2$X8AJK"൒NJ ?&@^tT.n\^ >\KQVKT}F' P6qz ZMU&U2([tje r [r^nTKCw2%_06O{CK83{34\s:{ PaB#<5r2}rƜJ\Jf3 c+r8VSQܞ"%-r:ڔќ 7wye)$3$HV{MPO)BN2D״4cuPA$AQ'$5QQuQ uOcWktVtMa-ߢ \1fIGdȠ I#4HGpV̌uDFw0QKgL6r_t@3hI J㳀n2av1<#31rh9s7pvkiv[qh#v]Rn2ړ_o\˭_KkDj<ϰc x5DCwp ߓDb^EeBzQ8-C Fr!2`M#j NӱuIPWuS?xPxQ/xR'x x;UT7Oc5!%waf waCyk7b$"(Kiwbexuct C#j r/w`Z1 wBse'>(rJlyvk{jg707X9sUJ6z22Xwe%7qGBVC 9 _w!ϴb䌥RKE|GTJ#D N2Gzx$B 5us8kP?S7{ 1P MAE |цwxei|owC %;X 4ߏ7T;: |z+dq h$Uyl'k9_v78j[G|ۏn!H9d" 7ˬVSbK@<@ͮwOC~3Ʊ{|΃4uR:z S/= Qo}/}s}WׇKu_G}z:;U3̻;#r5OӱO}⇏S*jG<jڎ;rK銁#M.O>u @9BKsmkFuԚH%J)L5ݔSK=P?RM55tN&TW%MiZm:3t5^dJB*b]f}hGP/vi1!aietU6v^w块$|vHb_|`wX^;Ua'l%Oa!ދ7Au]i=bղ[lծ&ojmvp*jJ#;_uEn=:|VU]58_ꪭ묭Ѯ%&e챽>P3SIZT4mOKebRIe't'yܛgfe6\"Z4VK9%lLjedO=PV/$=t8Amuߝ}vuAyu;=,0#SjVZ7әgdI.WgpÉ5QnPv{SlT絲P.@>bC[)F'#F28A~}|c9Gs ׷b9$L-VÿnjQ"ДIt?3qDTGd2RTŅ.Ԝ-ETlIXW~F7q;*[Us-Xd9<[E\Y\!)Vq'9diIy4I,;̡ bȐa YSkr׷Vj<4(5Eek SaD 2pnFg9,pfJқ4 HIn6 9oCA|M ;dD]U.K^Eu\Up$ 7I"Cl֐arO &,ș |c<6Z tlWBRu͎v.eLeڰt,uZS61m׻HO5.OLQ>%ʇB8gw^R<́@Q1{J!A[tgVZTxӆ)jHm}&8qub5OdHLf0=f1Y~mgiQZbu`0%fŨ:s BZЭ" s [.n; . m+j殶Lp##Vrxj ^)M>XB ;+z-'/Y/ 4 +]Jɣ=P+<J!v_) OT<\jpWG'T9A6 ݤ7GFOӽGCJ!Eh].t]BbCruťnpgq\[j. v3v MZFp2F{ZӦшEhG?ґ#GӘv4i8cΝM\2n{[gW׹e-jZַw t+\aJV}lg#{<t ֶn${]rػB;U=1l lONiCG҆6T>Q^p78CGSjbebSq\剸'^C$9zSBD.Ryg- tY斺ԗnovMmp'^؏m~.$~;֢i W]O\RZ3G[҉W|)_LÝľu'ٺռwt3|>+_9?#şxY(UJ{=U./% r Pgxc =0JpN QLGPl4KQN A֤JoشآM1}Xx&~,hb'=ţ!%e% .뤯 .ieK1cq9a83=Q?"эv$5$ ^.q`#g#O}@!h|!  \Cer|y@HC1*Qڔ L2q/0 Mn0 0bMZ ڤp-R2#)R=|83*G )ˋ\Q"7p\g#G@#}#Aapc%/%7]hr܅Xv\28c#1SE%K`sr*+S t4SYReJg\3˓q3Q5R +@K2x3֚04AAi/A'BAqtbSQ ^2">>ItbE=kƟX΅=_Er<_yd36Y]x#vT&) ts771JQJuJI2wn6?H;<*S(RGGFXujf2\=O;4?p@-@C?  AլBI B#B*R/S3US7R% T'mxNUSUUU[U_U]U`A uD_0D-o (, ' < X%xɞ?U PQ(oT,/G$Uh$N]O4\uA̕X52u5Z[YGq?'uXU?1CTqDU\VOUUUeS.eCf!SSkfoӔ!*uӦa gS#ecihviTi1hKh]hOU 1kep KD STb'IOn?!Wva \&*#G^GŢ.v(nr[(lBP<¢pWᢨ7"dvo36-q5Z XmccrDʶDokR-eOvj6jҠviz)yy҄V{g/+IhaΤ̬1 4  0N3ՔY0J2]O-3+G}q+gE,cEiuOQ)E)t/4pXu7t#s;siΩtOIArLc <?PE{a O3YIP H/.K~p5}ѷ5LV+.lWΘ+)lWf1N}]P~wlA0d`OG<ZDP)JBo# tBDON[j>/q{I' bXA%yyM9C=O"XxO,ee88Zt,YYA~,Cyx :C;,(bbXg\pyEsBPْF0/41Vf-53P-l1 wkЌ Q ZD|m0XRtKZAz0vW5IG)<Fx,g?AϷңڧD9*·[t},Į(`LGҧJF'*0(0A)$Zt.J#~lpwJg0;安  g;|,2ZzM-(`G1` Qѷ/|p0q @DWD9iz@yZ :B9([W!9:/ WxkzXKB:ט]0@3%ZE3wX@Iи̛LK;|1L B᪲Ilt M IȮ "jAtby Р#Jt{z'\x> ʛ<#lDA'.AkD:* xhZ{'|k|;<CZ" nЉ K@_4ne۠|;W@%~ڐ_ځ{6ٙNlllش:]BhmAɿ[~X ֺql}nAxiE7;Ʀ+k )od e鵒aN?9Jo܂&(6b ˩~ɳ ". "ȍto~MeoR< F(:\]RRԻ}kym6ݦ׺Tٙ2 (׿| z R lp%FC5>3:LǂzJr]^N,ϟ iWA5\ӧɆֵm΢EӺ׮%!  8=d¼зA3Ρ?ܺw`̘An:w왏~]{wY7G8$RYo9sk5[AŚj jU8tafeaKnWI@ -bbYGd}׌"LZmhZq]B7oEnX)9Q9#P?q5\r`%4d*.B,l -hb&tih~B¦qjsXCvFZVJ顇'mijjWbC:D ,&k  hJ(*,giy-̺L2-d-pڞ)* GYuca9k8oޛC8+0/'})0/`Xȋ]sH^q'カ2n{H͆|l(p,t稤ʚbb%:ĪvԤՐ+L`7Z:Jª9*Ū}A'h|xxb Miws])Ѹލ+uegyٍ5-:|ZKخ-^q*zwk^y8n)B˵|jS|J^|׵*n\gw=/8|[qF 7T#?6 ׆V,*P|{TJSbV"qOBV)ґd$$y/CƏ|ZyRO݂h:ұPٵ51_KjejMbt`q!"+QQ:bHMQh(T"Z(^J RaTX.Ppeaٸ18 B8t`{DӇմ4qNdfr 9DjUZԢsc&:QiHcARG;xi NCη :Bšc6 TJ#duO$ ƲPZ+zhGKZ|BgVaigK[6Dنn;]9aFEH4EtTsWsIOM$kA2'dΓ JEDvѳL͂Yjtk%G5F@k+~6=pmغ6DdCLsڪhxMsry5YJ66.[blvŲF0"QC*r&;Cb!L"Pβe(hLThNbr*\EN Yi,]<@> ` V7 PI+9%S حKV!cNy`xa.Y 3"=Gk#r,(C54\\FcxzbC;99ә6}f;;A*S+ζuBi7$l+_O⿂͜+WFʜ^oz}:޷-\DU}BeZZ0W#Ecg֖Yb,ϸYπtˬZ@Na ]fU ~}3S<Aw,ۂS0)B%PQawYǿl'5xF~:F=j/nqSz*ijkQc+rJ"rI6|nU8|c>K|w&sX#Sz~s'bޜ+b,[&="R #^PCi8zJ0a[OG0dYC"3 +e߇Ԫ+:rLAXގ:l ~@~RRU~'s.$.1~.wwgT7?[TS|| X}GHqw|× pwr{wx{'MR{4{:z8X{;C#bzBXFxHU{5؄9w&TJ[%XH"Iփ=8>(f^[RF}N2v`RqsH~0 G.Sg01uyxyh3tr83^Nԗ/|f؅Ba=9t^8}9 ?ZHHgq $z$$BOhWg؋׋Iy=(UuuKdQS3%H҉8X/!`/ScS4/#IטHc1% 1/J$/Rh*0^3IPG菅D^HJHtdt/9384ō<1R4Zw7sU%ʸUCt6'294y8yCrWpnԌqBx+W 0-J5tx"QS3X**!pX!0Z)#=yhjhɖ=ts/_H3:=w1rYcӖgɖ/nie]ɕ]d_v.4D0Ԕt uHi+)iUd ) Mp9Y7yz㖛ٛFfIZq")4kZ)[+\MW;Y_!#fa$"+PCtHP)/Hii>ٍRiUОX90J^^ e sҞI0xS×Ӡʞꉞ,lj(J*w#ޖXo Lu5lҜI!XvYVzVX\FfP2B##!iQ&BL3LŁ5j*ZF"7H/:Z^Zj>ڠc>{9ڨ ZSZ=𹩞z:> /'>zX *ͣGavj4"b"j*ˊ5 1 dZhI]ښp۱.;$tiW)::ADzL4*".ZơLa5},GETF9T+-4Od3IuWی+w 8_b==flBI9 /h=·c4r4<ˁ"si|~Csl2-cU?ʊK8EyLԙ7F9-ƚqY_ej2}w՛*+/Ĝhֳ17C=՟yS#KyyłíKθݺ=/aɻ;1j/pلj"ր w<.#!@YRY ;ıә@(.96ZZ.Ȋ[ML|J*_-+^Wp=utvl}.l[0=(/*jHxm)& =M> 4M=z ɟJ-i1.h6~ !^nD~.".㝫e?{@+M\&"mFd=Gf hy%)F*Zmcޔ^DF0Է"޸҃(mBV^5^S͑Fi~-j.6=:؞-I$Ꚛ="K'{긮賠(J:+5./1inHn૽#J"M疻k]vn:jKB`bbܠI PtOyB}@Ӯw*R%},(T }?]SSנ6=񁘡%|1)>I^ܰ&M ]B:{؋}ؿ+F+5;8?0{K˘Îm%ߴ#=$0m㹘񝈉>(j-?˃ԙC.4~9HuN7(B |LʮKދ4?]/J\l͚j/N+D߱(+欻R1K0D++;1IoL򨻩^RX0 ͛?](|Hf.ul|mzRŃV[q|Xe͖͙VZ#|6n[#N{7^1U뷯߻ &aƍO{ץKV.\̝~>Vt׮Y2Zuꩭ>Jl=WySn)]\\xp#$zD>$r!6daAž-Z+S 5s3o }zܿ_|훇@~< @OIAhP" j0>(9#Q8^(HźTljѧ@͵0GQ) y4JGꉴDˇB,ؚ.:2,;,l klkRIJJ*q-!>b%I뉵֐r JtQ#_B \ ƚP4?-ID@dC4!,$d:ﶣ%;5 se?_ a%uE6Ye]fEiZibouƙa%wYΝŕG]w߅7?^{KUTMTC*8@-ؤG;n-8b'=.8c7x= CdM GB夐0[F CYy++gwI+2:iFzikhzijW3J]Vj`Ǔ.9!y,:;=ub.O6$_-w"}^7w]tg)wp[n5[k]thutՕXh̓CB)c Kw+%t$+$%lFJUj2fBSab M̞"g2Dg1Uts+J MKAeC, KVrGNQR< IDpЍ JH{ R#*#Jub81<-u)e:S;cNuSԧN¨,NmQ&(E2zGꄂrH=A9D.6 2cD.ֵ0k*vJ$- ^y(9̔`HD"ZHA%N66Rh[m I;5<%'`IfIN:V2f襚t ^L;g nsY~' ,.e9Jvcpl`{ 2e- qX0y[&IrDB"j1`#5|ZӚ޹c%k#Ś?J{RUdP}jS攎v4jӠv-p a k'B.0r)TWT=LV[ r Wы#՗~_~m|Xݓ@`ɺ&/B2OqXbO5i@\.)K䠷2n,#r3Wiak0a#:&j3]:+ZJ F ^ZeaCؗe.k(94\2ʵ(l;DL,m|}1bUC6Ȍiki^"DU⟞x)1uN\7*ȆW}JmnrglW9Ymnv#й^s\{DƑp%$/r /@ S0@TWB.31M % oH2.slٲl)rfQ;[hn_LCIŭχ~[m:\J/% ZWw2KFt~9'g*5\gjS&O:;P#'z'M>3!*q&ꫀ拾 |>8c @.+>뾳3(3܃7 =BHz=ñQh=r <`[;B6̳˶C *r'()B^B+̜+-y"v)ʜ,r13&RA9hp o;a0t3Tv@XᗎXSHJD軺pLF8`!a,T!AbAqCtӳ-@!ivzh&8@Fe>!(WĘ@Ę-AKJ81IșHX4sٰaͱpsAyH%B\C5DC#$1$(B0t.T+$+—ɘta^")q"1$-ɘ$ɡ$t!ʤȉdJ<ʐH8։pʭp1tvŋDs 3s8MD} ˺I jG㗈9ʦi+ҘLuG(oZLgJ94<0(A! ˸ĻκS 8 I"k4s)gxʭJ #;CʃIlJJ41IrBraXɛT9 p=?U;-T95t5nlӌCS2T*3!S0C5׈G|tR+R,չ\'eR&~:x֨7Bϲ|S5*5\m)ZA02=Q2fmVnP [ !4[P>Zh"wqRT=U*EUX&RX%YjD%*@0X-yQauWdMѝ*weh<=<;W z׎towQHy=_5]s]Ck7>DBpVg=muE̽# cP 2S՘z2-؉mR-U[ΐ-˜EP7v*끷gڜ dJ@ H6Z &[o#_ ۰ZC66Qd)54%_)._˼)48KQ)1:^m $X'T*]B߽(ubj]Jҥ]yzEE=FR6ڭcSFb5%&;Ee:P0*:=d23((=.CCpL sр[y{dL ^a{I-PxdDIUNpeV{D_4eУV)t\aüx` h,a8N`ƌx(Ea<_#=vv=6GR*`MdaXWvgXK-cڼPl4!$@ G l!%'36 IG"b2{c.?c'uP7Vit㝍]r=U{H䌎xIU2YL|&Az(¼a=*7(4S=I& >e\ۂ+XpTEȂ!tD @cEDGI^댽G,({gx,>Jcl?d_9e Ìj.2p1džl$mʧgZ1ȁSN忦mڞg#gDO֥8eTKN8'бfP8Aj.  :@Y.)@c"˭J<Ayj̜lpM$z;iw`wꁛo=PWif[ ` G^ndppfFY5>ɕCiEGHm@t DnG叭$^<D [ppP(tqqq^iHYɖɛ|"Zө0,1seI1*r/r>_+S1Ker%Wt*ukȷL?#Xq'GTKHtc.J/Pyp7\u77E$4ip/mHKwDp2_t̤gB|N WWk pvwwLnwM4wuzň؈['wM&7UURe^kp/=aLgDQ]'ߎea' YL1 _$%>s zxy^ÞnD"5t]>#$ yVgnsQ0jKmXzFċ߾.,VٖҁۺD|F\wKyt|tu G^u{GGpblMn'K*xرF&aqro{ywU~|n}}}O6JFNXRې́,p|zurub}FUy̭9Dg3D8=7E@An+P򈒰Z}VI~Jc$MVVNƂ,9r`hC%N\hƌ(`B![d)eː!%(1aF2gҜ1̛ s%P=c#iҨ%25Xs<YGʔ6lw~i2_|x%wE`%]vځ]ԙ%R'L[n"Q$@XM=ڊVfe9$Tc$dfmf^8TSPW`#U $K5[ke1DaUWPp^O6Shi`kB/$J&Q<6QedaFR苗O=آ"b:⦘1TYgfzWs*k]W'z`#`g^{! yzF$%%XNV%8\ax& q,(C2pi RIzpЊu)CEj?Z(,VĂZlOJ2v9'UZ›5^#iDkugi)3$?dŀ^vhi69:s:YjAV￴m];VRQ+d[`FPPum2Rt!+ѥtd]#$e5d]xt]ޒ_+}\>u]v1e 6ٳ={ XIS[U',.*|DћZrtSKu'Ull[̇k$tY6A|IhÆ0FK(a3ś.wYHEpv{VsR qs?sCǕ bH!YsGIT\Jp2lα88(BXVT!Y8B!qg䗑,k vdc[dGh_'˘f-܈aHb_&6| ) H:!Jʟo& p$$T[6ώ+L3 ox.f!{9wʔ3ew=1Dc82{$bq\$`\ijn,8 _ŝK *ЀӝGhs@ݹ7O搝9# ϩэqmdb֒|]sjik*1A*6 i S됺4D8BIqo>1̕pДR*~˚|lCz#r i!HB*2L񎳙y3}jt&6Mv(jDn@TR%IP]lgq4u#SY!au,l+zgAVۺb8嬮r2> ZboSͿN[[`麻 vv0vRJd5TL˜|wdVn-0,JMSXed0,&)mb`7[]^'pL!Zx59ʴ-ne{[؆NaS7q9 ZvO` yz;S]5g#+Wkyʠ{55ĵ#]M XIS7-ڋ]LؾݫbϻWkV}{Md밆K˥TdmM#ߢ-prP+>aM 'w q Y"wʺ'c]f-E`nbӛ𦆥CP[SՌru!7ÝSsKDWh>}>pE+ {gmfj|m+/KYKqm8<3 Gu(~bw=wK֛w 0n[ۯ1eqz ޗy e;"֍hEۦͮ#alVcG%,TFIهXizoN4k]LW&gH]QSҚ7fw&1vr'kxƧ\-DvuqWsAٻiG]bmkb0$nwg\a]ۚ<]h1`~&{7/WwkwZɎM)/9WeDT! <`qئ ۬QŚPZ\x[iאF F$1QqVmy@+@ǽ\!&Ya!!laSmy^ٚq N!^UuI :T_),^ 0RZX% 9FLBU ֗t#T ְUܡ}ba&J1 Lf̖@Q "@"."@"//b+"0mQ``(@"VSQ`I))a!M5&*`&:(&PhA#-bC "]$ W =↵UJ̫-4viWM3$ai#@bTcM[ᙔ ]Ԣ-a ^q  $ H IȀ $@2&ƤHbݴIKH,E}2–@91JE9^SNdJi7MeCaBV9?aS9WnP2.grgV{q XlΆXߍ[kZllgh*"-zΘ#Y,be*h^ajv\BmmjԈ̊>w'J!3'rlm-Ӣ[׊h.|'q>fT"8^(|bjzml[ jҗfE^%џ"LF ܮ-}%[٬<m& )oWY% 펬BZ#$)UX¬no}ͩUrJ"xO$ hܒOPXޭ5/Jcزfobao-I(؍7LZƋZP5Nn-n`JC#*/}١:-n04c! `H<.?L Hf(oN1/F@Kcgq>P>q+vo6 1cbÞ5 oHplJ P2ܒ6(_o@3r;a.(+[1?mBF(1rl̠n+H(z)h!1"]232/2:J /r12s$~81"r'ĸg'!g#C3p+z'Vp;?3]_h>o?JZq3<dz1cBf]:"XۇqDG63NF.?+1D4LѬHhs9T@w1yK"BT("ju?3[٣F"CtWVM>s1Y[%.gru õز@ uN_1ђ_A.un'BP0a10Hkعߪ[d26B= ֈZGfwp^cRVeS>/jCx%_ކ5dSER(mK+l,7Knfvg44^>su`ZivQ}N,*hu?G^;o6Wl~wvZrTv-grb)d 1b|Gx{e˛~+iox^ev.xZZ[,pk17vR.jsisMA+իyi?8wc'uZC7q_{(ޕcy1xe{͚|87xxxt6KkZݙt`?ok"-o@CAp+/`N zxkSyU ux^[0,zJ jUgc:L:ֺprzzϠ;#z9ztuo6z渖tgf?^M{;{#d乵+:ck»f_T~q^{ھ_O۴g*G9zgV*wsz{vm( :F5y8+^|lVzc{WȳŇ˧S{0ۼ/1y k #ֽ﷓3C;j7vwA#śC^~wfK8 =:}y"cDL. Ҷۏ벷3coy4s{>3E;2qN|G=j7k'o뷵}zF0 gk:< )ŗK}t/ϳ8׸C&&릻2X2P =+$3tt?ZqO?@ h AxP`88bEB|8`A ;~Lp@Ƈ1Ty"ǎJ6Q:qა_)En&ePMmPѣJ"jՍ E V['v5K)ȱo$vbDwsbě7'miFw3NQbah+x(¼2Ό3DM)k·N3*MK,8˞>&5SJE=Wr˴1<Lܖ݌xsJՑ[OY]ĎO~3̋'^w%řGmM#gʕ!ժW/@%"0-B9> `ۄ;b Ԕjkb%j\8m(>Z׺Wo6`Un*/Wψ4lT}Z0@ӳv<&}5JԇW8ɳwG2ܿOKo$rħaK>_Wa/dn4]hl6^ˠnGeir[vZg-xMEiI[ mKV0k\Ӡ7a[VD G0̐n6RD.̗ oȬVէl)ď=<f͑0 _JdF޹q9) gVeБl( Y)/<]["$F?Ul]qtFDq+6$M!fǖj%Tlj=f ŕ, %0AD}P=7_,%>M8l T@d0ƳA=O~nvWlj _[B~N.Jm6Rx‰ks!$AX ND7Ev2{nVHS䂧 MU&Jj@JHy$Դ;ʞQo `;=7.D~RIī 0z=9Cjc'"bUc!{Ƙig=gE1@mQmպ"&)S'n5J'#=Rцk1nmB&PL`$D $))@`l['Ttjdj7#M$[T"vuZ:J3͑* ѾBy##eHj16$r&IG>KC<)Һr-Q`>H;MINI]ɋA *} IV*jb_EB6y‚[y 62y oKu"w I2ɲl2 P:-bnlvkWMfΓ X@$:V{=Lͬ`&pAMYL)2AŔ'gkN{;JPDf-v$d<q)]ccvM2<(F&gM{\7<~H7{׸^Wى@2EamcFQ;jFMCR 6 2گ`NDtTX$B$1UQwN#L6~A3UuC%=RF[PK1oW7j$F˜FXfԑQl36 1 ,֠y7X!(xy8kCj,ͦ8)wc &s9xDeF7JN'Du0RcbQߘ)uKD6 oALOQI,/XH؀ HOK>|X!BO5qθsZՄ3#XՓx#s'jtRϰcLI0Y([Չ}wyvB%+8V6$^,uY&Bp e;<:IjOquʔo19BcW;"Ymruv u8 6v`)bI # Џ{YGkd9&ț|x uH.\koB;آ:.bEW0:_n ;9zgs5sZ;IS#1tQ4N5q9CzLJO;;tzZ 3Ŭ WbT;ta &@ #Yj`@6,8!\w7AGQ.5Ǘ)8EݷOE2ǎv/Nab `>T~k3s![f6F4='#0ytbd+?7v:\IU|DxC$b9'kٳT(pFO9b\KPgM=Csz5}+" G> jBt5쩵z2g ꫞aF# ܿ>ˊ=z9n``Ҋڷ"@L bѲ9ܭY}y&"@247{#{ w$fzt^4QpJ(]lp%Ϫ}Zw*f( ~wsdsNLٍ59eqBv>loy!Z8P R ˅^k+8b4p`A<AXHFBCaɓ(xY`K2't8AD+Q#ʼn!wo#XPaBn:Z ,hw;1-+ mۧoGЏA}GZwNXAMp]jE@љVTL5q)ٕIA A{dMsusdFXT5q7q@_ ğG/a-&t'cbUQmeH蚌U6z%F\ 5Au52D#Ugm@el@dcn\jӖ\#B԰eR٧F|j$h=ho Y-+:mm^'bHh/%'a'h\u m,"s1+{e}Fv"Jо*DbYbUfiKK wZrZvb&U I(M` 'ʆ {[DZ[I@ -C!BnK^}UgÚZu:EѹPm{nۨ;po^;IcOS֟te[wnҴԗj'aJ@ r̻.VvL>50es@i*+7x)cehYp({:bkҍjD X]gvL?;)zFmC>F|{N2YNc?>bf2z<]ʾu M7Ø%Ue~ױ? hmI!  1d&{SNV/LbғHxIzGNp `"1G4•tU 7#XuF pAI%xXSJܰԦ.YaF_jIXK X%EY )dNJ<ӗ:ox /ڔICbx*dF>,%rdKh˖lLez̼Mh;JFZqpE2.Ӝ#3әDx'G( 0%vϠGs!Ydk)¤HsQ ûa@ZaRn@R4GN `Vǣ!>#Q5{xrs JZW̔k6TJT#!7'J̀0d$6WSv[YZ 0P\ #]: 4jWKʈe,R;%?Ҧ[!'V]ӵŵ ^`2tVZ.tn$(~H}\@Z.BPe(I ʗe/LB^uHTIbhuWCl\b}V(aZҵ*uM!xq)Hv R# x*U@ٸ#%#D;P{*ZuY0\VWuR0[e'C0E*9)0U<3n|@uk}") hNzԢV%ԏ_\fڦ\KRؿM-|X J~-@^(0SS6*![Ǻ4It3X@ Xs.PmD?Iw؅N=~ yZ*R]wWUolvuxBΪw8i%#iaug8پY@b}>O-jL*^8(%+ rNRjC?y^2gJGVMStGZkl;f_r9;HW"|6>!9Ur/NIhr.mZU2d'LH<ώMz_'V˯)j.lX_U[.Ielt!0 o*RL'tqk\TEkBd:AA, Ka{2; m%/kT#][(ttri1!B{rSG^1==,Z*5M_x/$oU4|Es!T3SŲOׅ}a=!0(J'3:b09j$ok8bgxmps#;Uwir&/:C7YA`pCaJoȳ8KX:2_Qm;eN>AjHb/m0HHh!hf+22=(fi02$u˸h2]h؄37m~*!3%%]'fq6:1+HS hՈQkTOI\,hсg(9s  +NO'Dj:m8QN5=`h&Qf3$z&PYs#e"1[&J&%g;hIcoM'V5riL^]O]ȍhlT~ȇLe)іi8=DYc3F8 XIl%QbtȗD eYDw uy)P˹F t2IBI̗9{2hudϘwO%@{sjI9NAɛe&hC;Hpi~W#h1"svDIUGB3juK<ՙtM\)xN^!fam_?   UlY87*`|ɁR)p,?UEuveIq<)ILY4™V} %Cd3Ujq +oy7#IR eI ca~jP1ٟbJUx`% 3g-1tu&LW?tB)lA0!ei[ٟd>f-8Qȫ$%f4&Y~&:+)a!TRY9jYX =%FAz*-ʊl%g @Uy$@W?3sy)~HVFaAs auL ZQIY\XTYz" ȲYqHZ٥ht:*foӳxŃvz*Q)*OCKOVG(u`ؤK.!~Oxg4q( a1'a#V("vJXV(>-Sw&J ͪ ^D^&5M^Gnw^:}(ՁBݭ-k$f@^pe݃׍y}w|C hS}.pMc=~kiou]<4H6]= |?ximj%Q@N*2& N7 X EuNxv?>=^½,={XQSom`Ax$f<=`߼KUikh±?7x>7鿖_ϝEZYh](K Ila*LCQl[9Aj/[YG%xonϝPJ?s Y*S8TMR0WܡW #)Z/CQ060)aߦ"Qob%HJ{. +V Hp@@6EH(XƎ "AI$AP-b!"c"ܑCL`҅%.Z#͍ ⴉ WB%РMZPݻ1< ܺ4irWXѬ u gK& *(ҺKDɋa&-u&E73ʕ2pzS]O7t+워?< 9]`>xyU,:fM¦^vqrp8X (Rk | -[~.8 2o(Jċv \h;,D`t b{n `R4*  Ɵ(F6q2 +ѐDjV fʪR{ܑˑ\zPF"R#Br62WDPAͪO",? \J,P`@ R1IFcP9̒-m:GI|&RN#&S /a1%hӣZ;l&P` h?tSfG;-ҩџ`T؊2fQ2Lœ%x(ݶLTH(_)`$8J /< X u2X h8"ƔTT¶p{pr&8SQ <1-8=+3VL 0xnkCh/9ʥ#WڦxL񨻸(ؿ~U%2L79^G3$hI_Hk4)2|c &w VmJ2OzL /n{\ishY˕҄77Ei:S$g i `0͐BOG egqt.! dF9ԆUk҉>DSLK4LΈ>ҢjR,F4_`UPrg[8@0{( .t:U1A1Aű3W]X$yD ox)LwZ=$(1[$ "+~$ʸ|ƮUiuĢ0)&%Q"g1s~ў+fQ ΐ'$(`ihD1 9[$HD>jR"ڡ?{( G1R Ȥ6DePUU DLuEL$LxK渱6wqPLG5>L%g@Nh:`dMш&Q*+L+-=ي(fiKiz =D0hPSULI.xq"i.uGLt䟭T&X -sl)njny5f@~'xʂuI#~Wu)%I<[m$Эp2 #eD1tdE, IbK/1ˮ&%p p)`5g%<.i pMa@?|$1GldyFJ.[sD,)Wy܉g0b1է$Ƶmоn6fE 3xd'\Wj`|g)bnף?=S_߻ 'Gq.nU4n[*7e}˃Ziש)dJ}@;GoM+dC;u2![3 (d(⨈ @Ջ x[q(F+@٢ڒy'*A` Ys;<<X=\kA @dtd;8qř+$u(Ah <+c"7y AB0 : $ tC= ȀBsy%1aC!9¶D8ı⪿&M,H@XDk 44 ט322.?V{C;dF|4<]T:-,t CK BXAIB*1 By29f[ T Q$r,MBGl8(FHHBH< RB$F@gd\t!\HR 3?j :9t'TRИq7}(]=2yHS\RtS&u Qd{M7ǣP'Jd5Uʷ(U.R(hnJ88=TG ZU[ P@ӯ0 U`T8D,ҵĕ2TѾ(̤נ 5oLڰ֋P>(4t JωUPN֡[25J` An%۪ٓQZP94*XC=<:PHWUȾ-ѬX8<]H%TӞ˅؋4Z媸IGI\S5כL}-ڨ7YE#l =;5'*E(_*978ٟD8"[p89\=E_!`<~;sE"UP@p'xxP UKƮ NC_Fj߈T(| 8E6:< 5a-_#]ata~}C`8M$Zs1B%_Bs5`'Vb~ v_9tm*c-C4;KHbMau @(~ v_t[H=#)vˈ5d3Էd+AP* -H5,'*v2ԕd ఍ػ2ֲ5X5ů>s7c*(vN5d&UH&: `E;eE8I`Ql(d&2N@t;Ac9vrȥe[k)&SãwnS$6h%0r/2w.Eeh!xgv"&b&61b2iHdH"@U+@d@n^9Bc>iSa|`' $p;W(Ei!&hr6`&X>ㄜ)aPC?D۲O7`9(&xr 1&jL~9pDt&>j,O.Sn)r>PdўM^Sc>\ē/&fhZ>U~3:}Ug&.8(&HGG Y;v*V|Ѯd&vێ"ik M_n\+$ HW|K6ѦZ~p߿֠ž]"OtQ({.&pxEӕ PC5r^l"i;膛j'p\F_f{q!( >/i&^%`/z=o8_'#=upa=(kȩ`Ja~*:Kj%3 X')uᲶ04V,m:ٮ^pY,`.a>MbFGrVsxuL7`]Zs. nPDO)!0=1u'Xțy}u`v85W-p^"XNH5uX7w\V0p64{mx|/ܚK/ ޙ)> p |ZM2{G /sYHzT.X֨?0]  `r~+9KAC۷(kW t{maUUv((p*THpp 0 0pB> Qa…`p , sL"D`ŋbi*D3f\aCB6RH%+)sP:y06M8pA;&/F9lA kTzۜg}. r +/cd9_ kSTU8E0¥ -XCJG)@:Ҕ'*`غokSaC}wm*H͙v9Z,M l ~3Rh<8f3J&$;k6Lz@6 f%ɽq-1(9 I GPr-iW9WQlK8f#'k¨;ܥb`b!F`?*"2qq # ԀEMhCC.zlP?D@dbTd̀bbBEtwDhAiNIn7z! Ye%V"{곋(msGĆrq&F 2"TGX.$EB 9@cKd!S[> $ dMe(g8C)Uu D(DODk `Pe52=EVV:WmTg.4-Q7.2 B0lଡ଼6HvKQlQSZjD;Z6n9;[eo[bLմe$J>9\FӜWoKG*>9V Ig; j4hu9  uHh@dwj)&8 LP:ờ1&( XIR  *I:'|.&n@N=|N<1㝘n)i .t1m0i h *!"qlRtꌓbmu(Cq7.CA2q>^a'p̔ 4gb:{xiH@cDaƁ1 p).pPޖ9+)'YN~A3\^SVzS)QͩIj/ꞓF.svdV[ /61r?2`pia3!ؾ43 h `aD 6uVh٫m2/i;5 Uh7N+/p222~Lw8%eydV$~޲08!LМKOZs}b'Kq,Xaq"o9B w6]0*Lq}2d σEռC4!4`ˆg5K M~ +uNGZծqHB|'hLLvAc`3R=aXzh*Darm?*x F\7;ap0G(eVASN(Bݓ}Q9@`_@ Dl4  XI@>Q 엯IHl@ x ~U _ @@%)ϕdIDXԙҵԐ~^ I|YHzF X_`Ne[X p%`T0 _KZ[I }a`QƼ_8퀷hav Fgmb9 $_ M@LdѽT!*FO\)\_#H\0v!rG :[ (Ǚ4( oRFt#Z@9)% Gܓ1b1`ސU mNyHA/ 0. X@-aXZ&D=LKS 7(B$Dd9JXd=^Huq6aJu伋Q̒dRFԀ$`#}`pO6-A e"f, ȱ!S<a¤DW$ dLň `S@D(!&[c& ]J@0MSf?bJi2ej%g2I"MfLS~|%R:D`b J A'dqK߭Ac-fo x`bx@w^`psbؑ$zVb[nDfnI }4OGid%}Wl4&axE`~{J!~tHhyAEq^|;ehFc`M GʖП&\TV!@J@bg([&laIDpӀ}L<4n˒ffx$ch f, cb>@ާ ^l*V-Vm츀a6~9M8@F@D,j2XHh^*}쯶h۝IG *ǍSu\~)&tzǙbg|&v<IDn8 lgeԇLUR@C|fxVaFHm0Ĉ :m&{iHC<6 }.F NpI\j<`h+~Shh鎐J> Hm*"يGoБk2kN*{΅n|E TDL j~AE\pY"5 k}+R?Z Æέk=J˚0}=/,Ijq]0n~ɎynHN.oȬN"od ZAqeaǎRc7 @9Zn &j(+&Q"wjv4Y&ÈԀ0ŮekD/*k@V.肬9 j؅lVjI$FC"@xDr KhHD*660x UT(nIA95$s2׺ Txcn,/}Y^G a%GǑKuQL/OsLE `W  I&tʇt=F4YEKt9EՖ u/:ZEDzqASbK(!^ l,CPcBRM TCԮN3?> "ձEAj}M]4\uA@"!#o[﵉47CRa?5b@+iv|2C!T$ _4- RtU#]ȔJvYR`40wsIl6)Z p2AuW$ʈ Rjn#q6Z0SQsQx Z94H'B3_ PP'Dʴt^2Zl<]_A wGyЀL ||w}#\x7^IPɆ HG)R9lv?tTxzKj j~^u,&CZNՓ;trQakioS 7U7$u[!mǼyk5Cvjy/)^q Syu;`F۞6~75- _ *XH;9WzzXkM zL[:u+zYnTR߸o:wöL2Z|WuF'l7#&0B[y((@||AH߱;5K[Z(d{_k7@{} W^pt?{;(At^w%Q[r"A/M* b_ӛQ|IA;M]ᛆl>]v7/ 9<{{E0">} A@a;wX8 `x+A }Mأ~x̞>;> tZ[oµ[9.rPȎ*v9B "d/3b#2#G*0f&SAx(P*/hPg PlބSQT!",XFɌ]tQk^]% &2l(Qְ0C*PiLT1;& ɰ[ǒQkqupaܶt^ㅅz qT`D %W_!+Yb+[moу8U7"`M,EVe+R(r-cNى0yFg芘:huoO 1Ra6{ \[a:hPKJA %hJ,3a2nx6@*!SdD!J|DiKނq3hl@pбS2i"k N{J#EK0`K ע ò 3I jLs:6vX`Laֲ B$!gtA3Ư/nNHy+Ւ֘eK!jXY#6Lb;<華&.q`JD#3ԨЌtR:{N"wP)|}g/$>C 'dK*.=/#H42l+$t)4Y*G(Dn`5$(AG(l%6M2FtZ7W aġzXDE=U Z8J x<]YR]e),9Pt(P-cx ]xC9RJ"kF4Y[Y.Q4IOd^@' Z"sL>+37ID`AEj= NHxFӧԩ@lP7 $u2hRPESb@x@=QjB&D)}h y a͍ME5Ma j \}_oXYLyF^U:vqRk#AfOV;Jy4/UԺ !2qQ$Wd.m)Ҧ6<#D[U,C$\f91B]׀/(5Qz45+aEjK l3*&orj [Oq\/bK}L^qGT^7Q T>^l69A#t+Թ"-])٢4mUlcv{BuU]ɅfݵMF~*#BJXK+*wMN ػ+ Hd@so <&R&{`8@k&sՕ[  SXFsUX\Tx(&#%79P#k2p0)L! S+Uqdq)| LHؙ;P#c섘C L( Ͽ1o5_/~(@$'{"=UP$P×OA z' { -EOjKx_4pCA Nx0D;"T`a&s4+K<Ѳ !iw9X>9$ z& p%IIP̸4 Lzπlڳ]T jtI=dwBI"ODz(Wb ^@|"/J#;LB"UJ !p0/J` lP4p$P6 @pDHBj!RC2!`@d 0r^\ Ԃv_ 3NC ~$@ |@0 ]o@ ]^`B.b7* Mo+'#R/,p> 3Q@ .U 5qQ_HbPR @*pƘ`<0? DOi_ di ٤ g !g N qO (.M2/F</kE08&dJߦ Ro\Ob X Ԁ A"]H)lB 1%Qq#elƞ@ i,@hH*O1{ޱ 32#+%#&% `.00(` bhR<ODѭP i@( Q#- @N䦒*M X+cQ)< ݈Pf/dDD{Kh=0$SLLjF(_MePwCT=UN~g@5@8s7{I'8Q2= ɦ`j:f箮&`1 +u|.5BiS>+vnqFu3=R@ kIV'(t .4Sik"+KZ7 UUG*/UV7ƮY6!h\O%ĈGd&xh0&Āe:3:Y/;Ff4^A{h0j~t (+pSQ_B;Y̵N,n&=MGOFH*EYb_hw_,UNPbI^%bl,22#3YY a5__oشh 3I6gKvY35w^xqQoB.Rꀥ^.UdzdTRyDy׳}k^]Hܣ?О*j_6ɚ.V9Wx,:w5BjF܅ꅕY3im>m:-b 6 :ΘǢԊ.Z&2KXϋ⚓ .H5 F؜\R;13إ54Y:JI\VMˍ̪FԞ_CR13:ՠ٪$傦Z |h9x >:Zz^*&խặ^N(܌ie | T9պڀ0ʑ[ddiwx-4 7jjx2L)'q.=E#*M| G% ^̺pdCZڤ=huҵ*F` $T <ѨV&-p1B9Sc;K@{B-V7[(h Nr:M2cuvi}ۖa9j99;.`{9S=`ț[2[s}%´ͧYh c,XBczX]Z=; UkMM!OKɛ q+FU#Zʥ|2Oz֚&@A(-gvYͽVs8`:';kBDpЍ*ܲ [S3*KtƢh^1M!b)ڨ#:\]Lzj\j;Bp" O0#NUax܁ @   P \XX  `)) qѶ]b T@A˝' ݛ'<mJQ7n^4̼QkB" * @ M Ԡ@^ gY< f;o'B9Nż%^]_>{]@ `} PL4 b=hE^ƛ˾'z'~sjejP]e `}#l"lt#SK~<{i``'^"B^8@7URUCn`!5W*~Ǯ# R , f&qd1}$G9Gnb/ |S_@ *C7A%A(SF2TT\S1hL9IR6e4M7}r!CFO%N i$FHn$$F i@2eX|cm>6{+&7jmceMJ71Xp(h5 bR\,`0 Br4e~s= ͞L^x8;}ŘE*/Hc*eY)&ȉHP'B} фbvnϾ|¤{h,n+e\8 0YHJ@bXEq.sItZ5eVcot#[ 37EP}eL~7mƐp" t&"qBM'$u7 ac(u01ZhTSItՔ\G'Ҥ)Z09(@ e`U dQ)J0r էꡭwA}ɞ( YZ#uǙD;D T, 去ZJł &64_>0AVn`BQ<×Mo&Q؞ 2E4kƚ^Hfn:òʽ;' QmB*5#lwk.TX#rw0a`0d_mH']?  ftGrB U7靨[--6Ze}4}In AbXZuۍ/0B]>um3^y` 䅂.?KMz"L`:,(E׷'KYǯ.v~{KDcN* v#]Qsl=ز/T{ O~P:ck]DSA֐ib ݎ4l'إqQY5<([g |eJx uI7e1ĶյPRf o!;x ` frv/ 0ʔՋ SRkH&36@7iL"w#tgk!U-#NiH7״s F1CDHD'ED^B&Ѧ.dhtF wC ϪAđ.\7˹~p0tXlF4}FMLNXb$h#tbn;x'x~磧2lNk(ag*1 ]k*5(.qgJ,zqA9wJ ]Xx؝*Si{@\I #}Uz"\iɺa (߶ ;iU7>+e݄PEt,U*'SSnt\w4Lr,3$um(^vhOɲ~#5U=uOLFa }leu ]S)^,=7Y{S>Q`JpQzЭw͹ >p@XN:s]SY&YiIxe ,VJ6MSی/BR ۏ/Z@wAcYQ6ʐ?QI`*![V>7OA̤XrfhU#oD:Px`"ܜz׾d\0h5[QkXHMEs™l&[t,"}Jo]$;QxuwdHp J/{Kx&L"W #Q1Ynäa %ʌM.80.@ @ ~֙ ?z/F:9 @n%3A. c 8hD1D4r$U}H$əD ^:Qj SAU6À>d=H0j p (9q)6cYN4lQu)H dF3z<{!4T"(@f$ _ >pz~銙w(8!r@μ5^  poeWjކl~ңPs~E`C.%wSq}!'J'r0jD&@;n](Pirv4Y1'qBx~Se#=VC&bA&.0qR3GEwyBHvsyPA%=G]gZ Ms`1;3sosZan*r< | byxuj /lA/78H?qS;a4ƃQPЇ)r{.jt56Ap8+%Asz8MvLV;Gv8=J8%=X2q‰X.ȇ! %!X&@`7%SҳK,&M!, V瘌(8OH8 F3 ,00V):81!,ч }e{ 9AE8ظ\8Tf_P3r(%Ubqu NPR,>h8L8Q>Y<8)!b`!6RY+X_07cBY!,gɇK"j]mt:t8&ayRiTwr~XjTrBc"t5u17A6h7'Erh8 0ň*;x6M)y46`gU,Q )RRȃ080A9Qp Xcݩ6]Ù0QOCXc&Y8&0&r)u#)ydP֩,SZ I{Y)2C.J02 dRXӣ< \I& IJ+,!")| i9LXÎkʦhQfB =EƷl)-r} ^VR"Jٟ)* ɦ^(Ʃ3ɧ05,b )ӹ2)7arcDy}(QpEU(Q0韲YwAg Jڧ0d bi)>z]י^旇){*i)`, $BbsBX+%KAq+8B,U|*  $0\!'c`&L=[[j`AgԳRy2 ,7lP5tΒ˧#XRKQ5LR$_,Vm-Gϳ2RKe<%EwTTml,@ۜ'EMt40RSݝ7 k$t׾H7'^/Q-O,Q=JyN1+NY@Mި,P<&Һ>AD-4*mM%0auγ-!q*0"/_-7+';ZT^E2^.8ä 1rJE$8gt@]>#'tl"NV80!h7PBztAPn|ǁ9ࡎyO@>0٤(MM&^d&1>@Sc-\.ܶ;뭡ktWrpn$? V:i!"Lp2cI-.1^]tF>ش]ļ1B@w\^*!wfR3}Z/,L@V>piQOOnOS/˱cM,﷽$I Bw#N5_/$QEH~bjc瓛y S^to&/n(vt.OZK(FR&:mo4 ]5L@;O=\Tlh/)bVW-s>Baց;nMd%*s40P>O9bQ4](u3i"OMv6-8A`cm<?0`rE?~}_pVT4ܟsCqP@u^wAm]S0 2Vq#|Ⴥ.~ڰ ?c2!nMIEK.J8Q Lh̸L|eb(bFCn1^جCR!GZ!wZ#d1_&x3'.Dʓrbp`L eê X^k:P MHW0ek&:}&!ŗCeqƎ̪1 sTސIi*5~PL98!T`@*n8,Ԟ?S<^!:f)⋊ Hb`BL{B5ʅH*O RЁ4Lؼn^ 2'| $M9 f +DXEAc@4ad7 $a 2C7 -2Z7FSG!hJ/Oү|MT)P| 9OM@?54AP4SM; /" EK=6 Xq WIrՑĀ 2@1Bo5OF3FUDZmBQ/5YGeGTѵ5 IriL)Hx30B}3M{5QtN n1dP(y\YmӃe4`LIqD&tW'\u%yFV:mDؒMvgoUMs=,C26@ބ8;Zk@&x5CvcBTe7*7Y̶#fPCkB4w4I<0>dUY2np$Ww|/bTG*YҘ%B&94}A639B? 8=wD20w_}kO&⍗UQ'.{#eCԉ5X mފ#@xB{R] S3$FuJi |[PcEN ĄA BacO|LFoJ+R e4Ⱦ҃9Eii) ե8A #UWoDKN@5+{yDc1 g)B*3̓d)BJ+ȕ!RJH;d`/*RT"X7\'kd#J}P%+51D1Sx DAF.RԧXI))mx$$)-iwp!)DrJMDnbjqB8 +FMihrtPPRF"/o{C5$.37-s|CY{`Imd6Ύy897{Nd! >TtG#e6HDo eJ@&s_mi!0-EN􊈌iW98/@*Bv<"p- zb>zR(Xu O=1HnT*YJ 1*Z*@u ;}&PYX8@h+D 5  t,;%Rˬ $ٓpD*Zђִ Xq r+ضUK_6 g2,g)Ñ 8hӾFikck (w2w%nVX2\jE+!Ce['@ ]Fgܱk P(a».3 8uzw܇90h 9r #96,M`D](.Zp\"BHG|͞FFDM 9=&xQ$?$Z&o,.$ &n1eΠ[6!eSlBDG!K`,ŔVocYkPml{b:3uPx΢4x?[R[]YLzk [p-~"g[mjcڍf Af3@-El`-op PVծ!xk#zAҐݡK\-omw>@` @D>3[bVIG8L,(}7FL D$79Fb 0Xxh#p )T !q{B9xfk_S\ N8A"0dGyÚ`!ȯW:qU@E2񯙐v?K=\.P(QDeˁri͎$Yh%(950 b@*p$ID`kV6~f&_Crc>9)&4pBw$t20Aϙ|/ ՙ"'9L0䍜o?q۹+=Csܘ?AÿYs?ɣ& z;< 8{>1$ ?E@pܳHh 0ۀ x0˜"%, #`$/nC1r5ȸj{1d x X>ȃ;&42{܃x`;-p'(.(C.< <C&xꪁ5TBS! B×ؼȸ )˷0ܷ{>d(WLC< 㼮@ C+3. F͂&ps?%("Et[:Ēs)@FR œ#$pD8jE惂/h;J@72(H ës D1us h/JAlGU 5F<<.2|Hi70|Z>dǪCq `;*K8&h@F'HHS2,dIHՓ8Q{?xȽ!I=؁ -SJzkPJ(éd|@.BHr?}̝x <KI傁xh+EXH Yyt7GJ 1xm=Ļͤ=TtH?`LS,>0dLہh"SH,mbFt"@GHM4HѫT)HF{ 43UaTHfH?dLCuh)`DĨ(Ru ɼא/wĪ@D L|CN=l;Α|s Np Ϩ0(# B\L(ˍ(GD Ц ,|ωP1 ;;| Bp | M-iѯ -ʌP|'h΃=0$ فnJG޹4Nؤ'QdM0FqS@L$Hb4U4s& uk{ ]ILɾ+ǔd> Ԋ-TpEF}|ӒT2($$N:dLذ/R- uNQ)H-$8[t+P>u+DՒ(5 Y-_Dx Qž&N ((G-WE\cUF%f8%$U6EZƲ5LT=6^Bs+'J*ժVP" K@kQ_Fq1Le}gtN ^3 x(z%ޓ)_` lJ%!]2}`;TC>9H_@Qjk2B+: `Ex$a'(aFY5!N=\eB=Y9:aHL!"&`$6a'k!bTv`#$K(0E:2`C5"b2շK0n9()_?A{'uX)F"9@H89x4b'@2 9H 2*NR*>fO_~5f尝#Y. L c. 05Ka@{I`R5VyfhnW6bukf">`K-R&S& R:gcb^- x:M\+uڢezRX$FHG acRNn *x[_}fH?;,B#L {Q\}P)1X%m CNvNɬ&.RTctU VxRi5׶]Ğ#D5kL؄̫# N'2H&i#k9X #nW5ERؖPkY@ }>W>35Sl^JQlg 5mjM¶|^.d(X9㞶k]+@X3APlJQ$Y)89n0>ȽnnX}9脠^N(4Uڜ]nm#,JN)x[NP|/hpv.fXH]>+)Mٍzj j~j_բ&+>mⰧԫjKi#4#lڿ(l1iJ)n9,I/ T%(R1'2?"l 16hDߡ@ 9CЁI'14Aj<@J DgtnTtmKt3ttp~kB.uDRosҋ@oKϰF@t+510VXaQ7o_ds8Njo2O$tN3hNTF,16VA vp tl[Gs~Ko[Kz|ߊ  @v@'YwMf bܧ8J y6xXGx˪sK,*z4@zfw1d_kEZ2u/=DBCNdglXM Ȑm=i\ԑ{oWO^LȬ8ϲ`:jdhZ? wgO{zM }ķ)flh?vO-OC75HO>O|}sgool+/P .o.;ύ'ydgV}2)SH!CF B(\i BvP"U(&@b E *Wd49#%K/=DII)_$1bRa凞c˚2nƝ+F|i)Ju*5sn6>e7V֍I;ԩeG3s"'ug=w-`%^'4G)ȠEz#T=iOAń9!?JvtjC],X+E,#pbB+XuEGHr(  UDT" X좋&<1qzxA/ }Ѓ(G5L0:*a+U(b\"I}x˨B$  ш s?0b((,411VBplcl4aIF!<,p" MT~^҉<$Go$#bRd)JiDP L olc156S%İ B>?<9&8bu F8ʱ|q!BbwմAdH̊G4cI5NE]fvBL !& PMB<֌ggzbS]Y*gC[<eAV(YlZXER6Wɉr&8QBAn$>/R"dW;Q ѱC(4ƶ~ |_5@Nd^YId]|O1LL4É (eHDOĸ`TJL_&d] 쀊5DN8^^@EOe-ѓm F a uK LH Zh!ID]\׭A 0>]-&]J`a g 'z |tR#>">]CPf_ @ڥ`@̀m_H5I H,6Ԁ#l6#|[Xᥑސh \Ѕq`3]:=6R6 B^!:nW^܅H#%#Z]Le6ĵAͩI0PFa 6#dd4^X fL"hvA G.]LL!]Gn |%XA q`c F CALFf 8e@ROdБ]"A *ecn$5N`l@W2b5Zd RJaN\31A I%I6,~!Ff̀n lF3QAL7͔g&b=JTcxvDC$Ҝ" Kdt(…A Qt~ $h5eLNE+raA!sb ,ڽ,@s!S(aLAlbH'qn~#u*B&[Lh:lx@Q~ѩLWR_ydiE Kݪ ]M&Eh<^mXHHt (`Sڹ㵥 O]s%Lr%R(-Ke8{KTڴ)iT&\ D^i1_wBi5@СlDMrgquJepXJM_`4.' V 0A%I&ABHHjIl"͝2,{J$~e~lvɒɞ=:!䅈H( T1&mliV_I ͩݙ2Q8]V>e^RaKIN hI f p('dں)F@!Dtdf>.rM& `1ji~.fԅ^Ii퉢.-.t00&j>9 8.*, .œh h9`)DoD@F l .Im&"ZbgθTIcDiN$ǙvS\pD6&lr~SLTo&2A>$)`nF 1@,D{e(A@n [*Ln XeƮ񺴅ڶnn DD)@0 3F >%>= `/-A{./~p1N}M.N9@̦Mtrv)r^ ^ؖ;:@GQ2l) ̆ D Āg2sSh[T*7 H Pb5.E L̆Lq s ܆g쨊PE9[2MH2U&.6φ)bhDs,\89sR: hK A<cBj{>*S gsQeB0 cĜHK@:E&k"FаJP4,AR% PȢ$`KVk9\ lXQR2Ps,TslJGuKAGʒEg8Ťeh[+,ײ˅UN Mp1n pr8wIIJ=vP1Nqpr.^IfFp?f||/S8_ PT{!BH(H(RHgzkwx%'lNwL( !'nw{;{tL w|oB02gDyB{{gT& @x_RQx_E'-ӭ}ڈ L(x*ňgYz4x"#(B [;ٗ KUs g`4By/BX9~_&Pķ7AWFy x9˖"q9(h xBȉ%7,b}xRl*g? < #'&lw%'@H19)B Ȁ x֛@80 ́ͅ#0x!,(N $:nUkvd;EĚ; <:]e[yR{B#ߠ?6U,{o Ԝa\{!h/1GxW|?i|CBY{zȓxu8((B|wr@Q9ۅWŽX{U}!A {=l|9#z|,3k{'c7 зox*p|&@Rح8i9WNa=@x84 (&dV s,7+y^>< 8qdzł/ ㆙ p"2g|>T&]PS0853 4~ [Q{] @6yJ>arwl&Xӿۨ2 t:@pj䈠7ɐQĆ h†2} 9 )fƌ X(HL(;\RS6 ӦM`J*1g֔(2L(Cjlаkŋ`U N$ +u L2Yƨ(2T&9ї.ڴV΄ƍG`tG)B,{6-zsd[b,ݙs&r ׵Y3g&>4h iDXI9 ۶/ȞMe2Ϧ]ՌܰOr`hH;.R i#pC f tdhR?xo 04pc;*> z#1BhhH DBJ1O,1[JEڊ/cB ,/|/P`1vAꬓ= F4 A:ԳOd!,ZR)0T (L냓O'tL;sT^0DO9 T^.Yƒ64<>DE RK5ՅRB %8I:&8NXauO@m-n_3\qkH A 4UVfUBZS( QZm2^VuO[bCՕEI{ׄ ;W~)_KXBĐèt(* tBbEb%kB  H3LV„ 0n!dp8Z%Dޡ@P cN҄ A$}f ƒ0@mYZ[2oA boRcoݼz9Q @( \ojmϳipS߾7m63N ٕ dO\Ah)ŝr9^FoQ5Ma>!(LO/%&`,rX h 53l\yS`S+1Ni54H'k4ũci] fAAړM g1> kN}' fa3 6@^ih!  pA,'v L3 dw6bZyQl@6 '1t:a"=V5a~e o/X9j27- o(Ff)!:ҙtx'-m&sdo1vbҴ: t%Wgq䄩y) &E .NQHX$:ѕnOl6@V]6x0A &vJf>sYV&Yȁf0uD6H;/,50lgMo3LTj9™zz&0()"-bq H:*$! YP1BFE DNd\jԩ)҉U@LuJoX,}lMmTqJ5Qy[Ufщ4= EBB}m2UzشEL}*T-VIIՏyx]tJxKZOjjALH)=Kޖ4L3U%Dn@ĈJKHI@6n*-XQF*(Ekbrwa\e(HeӦ"/2Ӿ)rSeQS-ťVPʼn39x΢AA^y)KQ{ "dXAGɰ=LAP _șTH\NYbMmq )wg#^|5o|.N0Aq*9(˴yp4Ͻx&d;_´j 7߃gF,^|o%n( r/eh&O !dv#4o,DHTO+=B'7v "6P:pŠ?00C LPPbP\/4.1H~/OM>B#0*/4On'{(/>/&Dhoȯ' ֮ Om''06NO0ha*/=@oi  цԏd븏/*]>^q3Z" P@b|'˩i` #`%#$x?B`q $_1e/G$5vc,-w1g}1`^c7#$H=5#5q7X%%Z' QIr OCHH!uqN!B{PR#y$#?$eIRGLbBq$s`7VWp1Lqy']q Q2)K5N2 pr3ȭ1"r{b3̲$Q)r'q<²G>Nrz ~!Q &b-1${1ArxS 41.2g>fO gY4Q$5/29ER o6ҭq7p S1 $r-E-qfDnpQ4^B` (e5]k( ܕj IWpgD4b[ ֠ h 2[  4 Y3 ֤U&zVvR=W.2i, |l FEoHS` 4 T(W o34pepe&6]P$ ` |l۠ #Nr 3f7s @'}zwZKl`\PecM"nG0v۠c <[ `N8hylbjuj$t`.w K@jBJ t}IX'z`>J n `{w9`vM኷ߖmŠ~)D.ЪGwTEsw kn wA%MҋO\8D 9YNC! rIS:-$Qli`P(b@Di$7T @5u[5~P`hq iWG.hbf.hxYlP&KÑDl H d~]  9kIrgYy8XpS$~&F ^)yE. :AmxdAx9Ώ%dPN7{(tv J cdQ“yDf⓷gfvlY9tky[ǘ٠ H$ns3Aœ~X 됐% O9y9fXM, 㛵A(=@࠙i:+ H96-v }@Clv%BywX,r϶cN Ԁ |kYA8zz -aYYS:rYY $ `T䑃uAS혻fZҨt.2m@! Y\;Z Vj0RQU)T7& v @fxwl9; ;+lE1 oE$&C}UbJT-&Vbpqoװ,]; wW#࠵;\b;ۑ9 ܸ 5RM­E tÛφVrTM<ܘ)?˖M{*}5z\j]NtƤK *lM !]ܲŝbxZ{怞A qi<9J|Z%fPEkϱiD |9DzӼG\}Є ͱ慡?ټ9WwiO$CuLґsz,(Սil0J983ZItʶ&0kpؿ !JdZ9قۘ ̓w MAqf+0D}!'PT"@3)M7ߘ?Sd\zP囂T /QqƓ tM7ᵥIbfQa΢^l0)|` Lo\{ .huB*8E 8_&b=#Z|%zyҧ$GtҦ@b FI(@4˴|N$lzPfvt&XR%?U* YդG<!re/I˶1gUi6A݄&TYL_AꈬֳXJ&9kٺcWKpr.gVDaB9jߣ, & +먇g5KcH:M0l-МPf dBu KP*kTޝ9Y-IМFvL邦) |t5vmpUI$l!@D\ p16 Br, vpk|&yL0C qx'"eopW $8JV1X08xL#FTŶKԶI0`O!QG!yTNamyeHj (V:Ef}٦DSm(i}V"Z'af(fVP̨҆O1*uP2Y X•caYUGn$Uv˒tUA?MM 3h 8lY!.{nbUcե~ٖgY &$]sAg1G⎻S+T0Ln 년b8شbz 2Rr [ r_q"rZb#SeO EzHp2GHvVsaqrH^B#1F|lDNn=GNk;-NR-t2՜\'+хnoWzU 'u,%; R(3UUr [ ,D鳎bq), 9V} 2ǖ~Hw2;V]O-*&Ļ´ϼ|s<*,/b砬H 5G3 n>K꺹NcPL 6b*y,we toV?]Y@aer`(7dcʈE,dV$#JP@`DT*xA p`N@ȖFtn)0 N /A PD$3#d C@'̡ @"7#L; 0'4!cF\gY"1F:@v3.b3-kCl5La kDG# ~ 8uPC)8@ёd$+iMQœ7z RPg$!) E%`ж9"kgaJ)"2-IM:set'T͚q '`DDF76|`1ZA qpM7B4AI'd C&FL)5r !z/6r25IX0b Sld9Q"QCPD#4Ei,W:Nac43Rʊ {"iV,8_)V&R ["˖^'ӨF6s$pꃜ6 =;TMf=j`K'h߲9ueWKQđ"dcdgEHPZd1GBQ/P)-K[q|R)hn*P;f 0 |(h㘗e+(}~QInb7}삨7^1FdBfp/(fa^,^vLE(ڀjҍo*C 4&?20`.yy5jmpEKɑ M(R2y@c>&X/}A `ǼCn߫P v=Pa;)tL\BI!fM>edށkIfX%4)Pb>H eq6$ Nh#8ecX|xݽAN@|E < ְ[nNTaـ8M0#y]JˠU^]hM4pZgePe`B.T v*/U+kT(w^oy⮴dv#'Gٽ7 mi` 0% p\\iWKTy\xb1߁`3+ #8`ktR oee[PO/(AN`Zr`d (Yvķ`Plj|c.KC7iT1 55v!ZO , u朞/h7}|cR\<א:2 {5#` @2Ns5 Ꮖ|u`L>wz xFy}y/Gzk]5|m\yQvj!z0Uwj%Q egvsm0L@s5&n7JLRIhj @}@gL #$^Lw[;(x'k70j_gf4~G6HkwKQU|n4db/p gk ͖oR臌n0@FfWJ|uP0`u'nW]>؆kcFqwMP`1XQd/SOz^ofg\-f0kus/AxpDveCe| X^ЇlHHpHE3f48SN ^ tց6]e{_h>=yBď[g}z[wpSBpB@|NFxb7wy3E`vXn0LygV`/88wJuMɁǘpCrY4iZJuI|9(8RM*[W.Z `_woSHr:ʡ膉HsvXC_%! nEFu bm^h}wE>5f]/:T:[ npUnyꔌQm]S()cz|SKJvCrX:Suz|j0ДR djRa:eVBm JiyyZvpWkfg0pvRpOPwdʚ#h (|ЎPJʧ:zpvdeȚRq]u)PxuZpH$})bףTl[kjZt SYٔZfyZ+7iS oZ  ' Zn +kk'm潑0q*#(JQO[蛾 > k+۽[ 3 |Ya{+7 y@ ?:f A5Gyc(񻽇 L,?";кDN"0LSK K{7, |a=AV?CCl5 0`Nu Í۳*9<;S 4-?,@4";C@7 ;`;C!ϒ{z!C !;= ,KѕzE;׃ǒ%,gˀk!!*lǜ`|[d//gǛ fټ ,gJB ?4ыy) V<UtTDŽJB=tz=T3eӂ3gI}]REaz|&-0W\P*(ԡlO{ҌżJm}ؐ\,L}rJ',̡ͧS[I k @?_ ?ςiQ'>˖Ctd/N)):q U1bB;cߋ{>M͝]bt$o'=cx.&|>_. Wl$䇾J"jnx.YX柮 eȽZVho[4!S z#~RPؤj PNUJqc2ߡQK:Rs$Ս}L`,K:D O~ށC-Ƶ})zж+! _r~͹2gVaX!/9ɖNU N?=qyέ=NeFTG3Z](!zĭx\1G+by}o!xMޜNzxbM*|PZ>N@>c D~ Q)蒾 0Ʋ __뜯bJi?o0@Ƣo^DNAޯuM"8Q,Z$Peq3NhxQ YИ2̙C)H TĔ)#GN \ĸcHF!Czdɓ%G̤/dxg>*Ŭ9, TȢ#‚ ,^)"(Mz\Y&FUi/:y~&h%RD!LҥX.d(Ubի`K6i,ؒO$9Z,+f/8" "SBN'zԒ6!TIRJ̦ 59)&04HX YS8k3Pa*=Xu &"o"@6Y<գ6Z.#߭1nݶ۴V1\5D94Qw/hy 5X+Z3=0:&ڥj)mDp!F+-إX81mL$cZ ~ʊ[c;lP.߀>hۚjК2,d7xZ-)"HiŠ٦J nA6ɺ,E;/Thd0nh-= {#=KWb1T:8KCǤudʙ d!<]M9Ĝ!v>FqsL '"!Eŋv )bX)\1:yO>C`{ +T`|U\D yʓGU:SXX`$#AC7kI,n @E!Cʦ"6is",E,RO!b"Š$. aIJֈ6<#9!B@RRzX?f HDV 9F:TL$IQY$%(DQe%"]늲-@G^P 1cq,(CdD IQơQ(h5h:1|%,Q=' =9*DDP, 04%NQEgǚT\P*tRkX)+jTaBfD 2QDWdi.ٛMp3@ jH9A`SJD6ԡTK:JM@(6ՙ+3H 5UkĐt";9'k/<nH'FGp6% i>OA'݀%6q5duM*BIq6j$7ms_[ Tg\ٞ LiJb nw F qA)W jtW%.AF~ڭmӼćWxA ֠ ޒQ,6+׽%~qR7щJ!Ӈ%|eD )~&)RgB0De~y :Ѥ ^k"QDPq?.'"#874 AX+:n)?>-50<$:d!q{@`))31 @@m?p4C+)8&8@HaSA|!"Fht9 Z Ŀ@?[kk+>-Ĺs7p K2p<@$ki␟S ӳӫĨmӆ{Rɢ; x!fqαŐ C6H)Nhľ1mERK[<HEd:0-"DKs4F2PFftM&>j7X9ـ >)3\lGHM4ƒ;N|GKFQtqFꛃ98Ll4Zds{{IHFl:DĻ]A6`D+8+ I )@ 1Iy{SBM{Lj JhLPX[L.Ō?NrEL˺?p2 " wy.d>B-J3شDKAP3˴úM̾j> ȉU,O 2PLd6AG^D<ӈ(Nt@*؄{~R6O6BTEė{aEdD6`#GsE P*ZeȒLE: D,>Bt <l`D$OP0.Ž+ pQU9MJT*-$PI |dPD#ὧ0#< H2)=цDr:||$ DQ25Su"9PHĪS=F{ )]$-F0P38Jȍ i`L5ԪtPC-p1- #lUr)U;R_@20V8PdGmVRQBBYEMH0R^S3:Wzm?0 @*V P7VYU9լ#JAOOw joW;hWQ{Mu4*(FW*pCL E]-VtW `R}Ӌ}> %Pp6 TEsQDkD}},B҄9889ÛS볉tTaq$4ǴET.E25~J< G˾U qxEH.,C}QEG:F̵RS6\ )Z',]ڝp5ۙTrDu[uQ1ԏܼ'Mxmz]2cݮ^ Śe*5@U\--UR+ȪxYڮ5i^p'P)h>@ּUV98G1pl\WVTm5XZR%` Mݻ`6}M>j#$RՁ9h A)^ `]\tWlŻ"KQִ:5rvڡ$O!=1Q'M]H%a%KH(`$h ܧME0^BhBAE$rիm Vs+9) $Qbe:VV%LL\>H+#nT~4\MP)P6.ԩ@PbM8hFpL =qHlRhKX > dy`SFE%g^H+MGK+WtЉ>+"Y@53ǐ~P:@Zfb-h5yCLr䔇+5=ˏg%$E2>n#q쐓H det^i39]}B E9q"Fn&(PYa*%PF9XKSNE6APX^Hn/@H ;r ~>\Q.ѳF@m7&8ggFZ]\UO/d%6{7!oS;> h7# p }"0ULxp:6@ .β^oLA;5XT҃٢QpKp3O0p )C2U^ 2n!7-=5P"H:3" 5H?J=HqJ2P#P1poq3cMppLp6zp6K%gx(/)+%:Q bQAqFA/7p D"2-]86$Wr.^!`7rzn@8HI,Q! UQaoWءuq7-$'s=OBC6'^U C^NX5r8B W*FtM9F6JrbGr%v&ڻBf8O\:<^>IP9#7 '[\^6.#zwQ^xNCx'^K/)KmAp5C_90hB wq%{c!KCvQ{C>yg6~"b%\TzFz23vy'z3B~'7APhBC +{ױ8|K#v2uTDG+$jV2 YN~sb ^|b'B9y(,;O=ШtQA@ M}-2L?`o~⟓B@~dHsT/*UHN?qau$P M4J"+HذѥJ.]rOBd>) ^>Yˍ}D*Vk񺡒8cHmb4Ё Vg6DuwW,R-9tqkOzd!0bD&D$V-Tx0P6 vf<5(wnQICXdi`e%k6rEʓ_&*"D6HhAM i'K8:4hQD꒬b(I,)Ddk ^q[o:hږ{;6#*)qH@jL\\/|\Fm#&G!׆"fB $x+|_ b }8aDDa] j`%tVr$z^Irĉ, GGbj4ဗ1(HbPAeb~GbFʔ9iƶ&m:1>Xo`GI~oD VG.YP"r ^:0EvyfDb} ‡&dlG>є䤈*$SVɑ}hs g'ly_1AI.yT}ފD\ƉJPJ()BeL:8@]JEQ+k_ IRKLj:lǒyh;%'@KgeNpe (N\ VL o#sBR [(H9C k"⊚s9 ]ֶ()"1.:KIKo3es LZT)k$Z\3 ЇQ݄ƛCNu e+g=z&:Ҟ"{9!emk$ e.MtgyP;( )xÍֺ́34Fӓ.9.|O/wS,X(`0JMK#`!X.0&fc8?#) eyW)(9@[ 0QxfC9ͷv@%.XlŔc"\'HONT4 Lw )le@.PpwP! rR<#ۂR%= TC6Ux@8-4EPM0,LtIĒ#,)ѱhF;R)xǼA V p&^=lE FDPU4N˺44@7b:Ds]8 jʰȇwZv=Sj̣\ l N(]V$zQ|C$^ogξU 3RV& B%,x.wK*wĘHEt hebPr,VuL chQ_v u(]\ŽjzYW_a:}iX m#NaTTH X0Մ7ҦLf0}Ĩv- :AcI gԿ` SaW.;yٞm)9 $+v]E'bB#UfJTDI;9:꽚+Lˈ6&I[r oY &UvJs=6 CnM޲2Մ~P5 Tm5)TZ[U;g%8?TW1 @~ƽhC^0V/ t ѣ߲Z d|If W7"FP $::i|l, o f?x)Fn hF3MܑYЃ;'I )hx^0CsY6=aP`*¶ jeb}뚬aTx^\et MN٢y~@cwV<]9v\|#EpN+ uϒS$ٿcDPnТlE0 fCJpZG&#kFWIȄLgyHujC0h"цrDf\>z%{vGHRhn*G)e(AN& wփ((XhtgQvFnjg`VS2'rlpjÙb )}_gYa)P!#.! b zϊiQi1&pNUV%8L"FSz )ez˗)@B`iBdCl4bd5⦢n. jd&B"G!ǁiii1*pj+V`İ-i] b9+9iN`yI *)dWBU\b,v[+0B! &%q3P D+6ީ !c"U#: ,U r@oĢ& HTAxQVʎl!aSΧF,+G+)U>^<,j."*ö.J Vrd u,-Ӿ!J:좂(¬JR<.֫"-lvYeLkQ( d@ćIk lV H]V.OT꾶.Z='fmG0.@nj+ɜ.ʆؽ.θoNpu- |AB,|fXtڝ\u/jy,QT], HX1 Mn.5[XVn>AVmɇ<6ll%(!oQ( ԕKL/OK\Hni DBT $@v)INaV]AN3n`^zbD>ЏO lf,ޢkB|.k UpX0,1U@Xɍ/.T$Om0 ?$'$%CZ-)8 d.B)#>QAkiHGn8 B.L3)|Ў}-CXys03|AT C,r>1 Ë==O4WA"03 |D/,?JLs)ʰ$IR9s|33V*X "֖QH1IJ0# 1 Q'2#s/$E/$r IP#XL30s]WmܖJ<+l͏=鋑52B%pHJH"Y10.PpV6lHMWWe˂]O-Cf .oms0 @0vcX -I-_[QXEeON nHX+2;sa2)o[0kOuO,_La4=qLw~Uɑ$Z 0O3JhǓx~w5Sp4fO7!ŷr ķ ] mIesG_/*-MIJAQ |XP)φ7όgOnwL@)i_:xJ.5/ͣU uxFmB,8Q_g/)iyl̦rybc3!S K83}vG2781cw,uuo3sxw3Oc'7xl˹tCO41xGIcu+w:MۛMOݭmS:x'JE zfq5{ɨ[,UPq0L1 jeCCR_=lԺלUGqN;:8B,Rq51S8AvכXPN;gW3 I|{rc/V#̞Z#<'omBUOӬ;3;] ?/ [ͨWSHn+O}}AeVhl.)fH~1'pA){'(%QHe~n:s~>c'~>[/Tm^4%[&*cD&3EzHok~scz$jIVŊ?W'^4K :rRJ ,x+`6ѦM42ǐ#KtD ~bÈYѠMrBHQ`BzL#M1 tXH#V"pBcy gN DZSKPdr˺wf&T(vlM^ȘҥI1n޹tKWdʏ`U!İ<.:q_pZKUHсD ۱e L%ɖOvrM|OĔ's^Qw2~aK;R$^J鿕KD [,īz%Y,A?VK<ϣ@u oD9B8AN:d>Â*I$.;??͒n4HND!I)2,yJ0)PzrI)pR,NR"pBRԲ HjԜ**Kt PbٓK d=.It3(+[谡NR-E)ԭDD MFJW`GK 2W)Ķ ;ΦNdN{+8QkX8 $fro: /n]hrWMT_,R tM`C~H7~a^ *8 1( 9H9X*@ ;XCBi!v >8#6ڨc>a7~h'Ω7zvÍc6N9dKA@F hCb @$ڙ燳4 l@lV 1఺7;'D 68C7\/0 2 ?q !MFLqY ˶d[ϝ9o$J7=iѣrrmP;YydkƨzxX^@_G7)uNPҵ6cXвB8|r"Y(2q^6EaDAnaYu}`؄98LCPl@׈ uL<"?0/ a@]7i8!^6TaPOVx_C!eyVfɇ,j<4S2L|Pƀ< ֐q8ZU=n{z۬p8mCþ 1/g8#jbwZ+]mo m>y3roMpi:D|'b X\ƸN}h`>nɆ0Pq{4ob 8)$Ch7KY>ne!QUynP<)Jth=zA|n} Xj׆zVH)%VP@jLD"@iR( #51ȁf3`Ч+k|4et{*E 뽱dP6 nlB ,3bD+>yʜiQ,HwobA lЅnk B̴~5  YmsHO+$pncَy})AYX9& p02\P8H Ea*P8OP-qL<11֣)YW+< g/3jorK,J/MsE ʀ`C1)2*eu8'CB!US6`3KgQsH$#ҷM 1 U!5Q' g64$Ö8E|L0wS~eŽ)Ah3GA4b7x{dl<NFP$(QDևBXsm@K{5ky"pkN#EnN C#:LFs[2w,s6Y3>bBM33dl+p(Dml>~2fi?.*hFscxRnzKȔt}z(͒g>l/!"x_[9{mdzW|mNs[\׵<>tHE $-{1q}}m#.7aEY&0VQbj/K~i5hƱD]"d{ t.'[sD!x*=(L^!;~Ӽja{[ X)0HD |d,ƿ'˰'X;}G/4s f~/L}n}sC$|Y:vr}6B$uka{B4ϸǢb b`r ~(Lt E<gA$@`˾#FtM(Oꬦ,WDMMi0#2vm"T`6 \Na  Lta,!0wPbG/ /dpP#epXǓ n?>Np0 nodo 1-vBm"tNn Gqpל .ۦvc^q'֮=j<zAPJ0/jV jf c, &g8`^8MtTa7Z"ɺ+ܺ*h q2F  L./Pjl>Rn/8 `A  IE@t 1?hupB#7PĀ#joHZ{AXrz Er&aA@o22j(0$w<.Qqn2.uk@rt"!& RCBQ1-j` >k3mz &Ac/=&2R4/ 3zbD%@ P8Q ! Br.fpXd'cI F$ZTs5wAZr:'܀ JѬ Df8s;i8z>G(GϦ*!|Ґ!9;"D!&55Ss ~`۪ >C2-8 9I("9h?3p4m @Μf;IC a!5 `ے1ܳ^݇&f".? zڲ#ClB9#0R1r /ak~M8Mp  AO/)TBqNNo2C^JnoFtƸFM-MT Fqn\R- FAPTQ!똖aOW5OAVT"-N]D%aX\S+%LM=RFTIB  's tUb#2VapI K3A~uFuA ޴X _:R1`KUtJUT[aU\T\TkUuFfc[st4Vr#!badu H&C "`!4!8AZIUF *5nJv_c.F!R9pVWÂ!Pa$VceuOwJڀ-=HgAh:nn@ iSDC"NFbA&3"b%c w KG`;A ԴR.g8/uh? 5ZfE5 8U( Tk[u#OQNVz 8M9R Wu3$JOWgbuC3/!>2B{B ,w{Y2L`M f` F)Wbc2VU'ɦ' -- C&+ Xa /$iR\`/vVԸw72'i'ų,(Xw0wSjOXͷX3zT#!]b!HGSB~cO]ք74fÈbxk0XuQa i!X+4=XvVUqkG X~03rPà[a% Mf,'!Vtu)iV7x@ʐɷX'&r147~#*Y  ^2XĀC0܇ko{ vr`ӻ4{RÝf![Z k/Ӛb:ڋv*[:C;L÷[h;~@R| 5o@ijgw@$E@~`ʍ;wt|jZ?kjX9 |tnүRڋA#;3aarZ/b )|6ahԽ{b@ N" {R()ВmҚz?RC3A .L|VӑgY,ag%}}!= `ݛ&{o€ ի[[A`==v[} 2s-;ڧ l`#ACgTD?@ٛ [9Û m F`(% } ʽD>][⧀^f2oO&i9(knF"* z`/25ᑱc/v|~`P3'ݷ~͝m~glck޼灞` =} ث>⍝9պmȎ)~y2 v>e{c.0^սa|#;˴Җ -g(HƝ/CiǿՆܧ`/^`3=R#@ <ԛ`b?gn 9r獛7ݸpF*Ur$qb9gLуFgB YN7r:Vb\hbM M`M]@wi:4'Pj@aqႃ /ThFQ`A2Rq˗&#e˳spG9>f\PQڨE_mJ_hʂ Ŋ^Qs(d?-ֲJf_ԃTU%Eu|`IF8s pᜰLԃ3u<ȑuμ(Bp 8X@T^La KZk>sJ,C'埥le2]DTS5]KvSOI L(v IqrH~[m6GUq5WV1DUJSPJ` JHNa}"KgTbtJq H`zwT9CX" 7Ȃ [Q2ӐGF 9iէeez^~ #zPEvبd54iE1E,f(g,kQMAi]wQa_]B:Հ\I&"Z͍,JE 6+,Y[ U^kDTP! jn(ǠfֆrMD]pfط 0p #r%xAUՒY%;<j 4ANe-z ٖùUۂӸ G|rO_es sTMDMԬDw]nk("H˫i6;҇$d" *OfNQe`Yb5m5)kO=Hb >VI!򍙈g-ʞrsƢ(A E3V>66V&3+,DX )Wy2᮶155n uuoGg |&tPVIv@D>W<'.<8`% 3G8 T_S8fM3V PO\`TP`9 D؃ n%'`2BD m$Ě7Q,l! B0r Hu"G|I?B"#) H@:>" rmWa5f`x"i!3xL%N^K$$w-9AnddKCFV{^v(gE,7Faa-BcE: FdG x+x #Tc_d\N 0(% h@N|D!nb"& F7Ë=Sb'j"jĎE ]'ЇQ":t hɤEy*3?Q6 N_'ID¡|)5XJl@ܐFhXoAֲL+M M6ìxŴ,yz,$R3xM0H+i;AEm` [cp#‡p[# !Z+H6ՈEOL,c_ˌM0Ы,gH !%+J!6<b>VfV]$3iVkpQ;ZTlҴ# ɪuh5vmtjbm]}Ǽ3+à6sm}f7.uoZ/kW !Hz=B0; l ]V'p@N,7T ȵ['_j6_#b*ǭ%Иje=!9F0&|=1@;蘛H%Fɸԧn tOtج3 C8MtF 6 c;i 5cqd_v GgXksƄ w{XCƈ b|ܲ7 ڱpw  о8->'%=h_3DZ]b ]Yȅʓ 4;Lz)^znY:͑<)B7LڞêMب(I+N}@))0M锯|"Sn yɚWSZJrbnqSJṯ%2:=bУ*{"h#hnk72JNI2fɛz !hއ~zwڙJ2Q s :k:j:)&x06Xz >H*J/ ոrP:*z65 |)↛BmZjI2,}s)0 a WK$˷5$[k] fˬ7ƶk2_zk+^r=`Uc3Tเ[#;YtVjxY֙z35*;9Q|P(nЉJ<شSy7JGC˕ī뙊BMJk˶zv3vxJ?)Tn':y;zx9s!w!2-ƉgC)z=c R˄W;IA2ֲy[V۳3:dCuY5fWޅ[]q BeN"q@eW$qPdzɤ醗vLx ]_,YfYgDdeSت nLuLWʴSǃ0}l.vy'PeYaj]D"QQBJS{\̅1~26J'nQb1!뺾ۚ~j- +$ aCFNq \gJJ 2􎡃y29e0KnH^2.d͎3E f omy/OC'? P 8 N)n)> <^}^@Ro@DNtޢD*(J kPdfQnN.2O K;~1EoTd.9N0lWv)] C:^z M.S ǥ0NF޷(.7y@  P0}3Y0o`'>V@BT(¾-*@爵 1gA+AT% :5S@"!`J6u6I$HMDٱ;J9bPLR'TF]E7!Rn"@`r2,hꍬӤA'$K(CH96 $PhÊ0bωBQJ>H;2N )+jB ;N%#+TrH"ۍC $fH+M1  S̃B> %`Q:@RM*IVlpf@8Pú4 $k%pc@#1T9$HAb5Zc2prW:&HbdofwBTʗYV(kwфʎX)++Fe KQ*YDi8#e jn_N s^ Th*A & Ceco Jc=T:JΌzj@ޔR i:S"РObk1gm;|ޯ5d6cĦ?((\O^CW5p7Ἓ:Z__ZB9TMz)5maGb' G;Ķr0$yKf|SY/$`~b LS:?{E1Ѡ2{\-Js=Zw emqp"yrY(˗[܋fȱ-2wQfsquc%5!Bu ޖUF"HTx1 8baBR@ #1#Pqvq7m"p*:GJN]"*U VP8˳))#&)fps'XV jdpZE'ԑMPH-SIG!a^Rz]2xBB䔳`hB H22_rDG&)F,>yاҎCmbya Peq&$! 5z8scdf$wbr.tՐ5aa^+uY+qAya(` қȁAA J7sMFɵ.]]ijh,JYqFhN7(|we z$i/qiKHݸF3>?CэPZ SQQmX}*/#9`%勂-.,gb+Ԃf<8؆Ȱn,[;X] o$ap&riV0/ln1Q7(EJ́nNGI~P =AxO Ri802cg6%jI`(3].el| 3H\=!4$n YpȼF\!;a޻AӮ6Eoi8$6! r{@!++׃k6e ‰6ۙFYFvXZ>Rmvޅ~ 1QQX2݁ȉx{lPYwjTEԇ[NTw}Eֵu}_'ح\kZ79-CL#c6('k;k==1( Op/F`>[T!.Y?ۿB:#@Ƌ::4s:`7< S@۶46C;ы>;̛>b (BЛ8+A2Y= cxY⼯s7ĿI4#<{:.T0<= 3{AٳBO(زڲAkGCW@íf47Ժ1P Ũk;c  25#C`k꣼S;$ ǒQ;v?3X>K6B6~bCBWӟ#{Ϋ3kNp,rQ0t;?<)p1yOzܷփ1i9 a#33k?s36ڂtN0r%;F4,=)7x y@J8fB*<} ,;AIKp.7hLX<بŐp˺x N:$0)K8˃pɂ 'c#D$Llۄ6q-CAQ@|˃+ѼƄL΂do,;R)A((/GK7x۲AުHȝ!3DH{ɰJlÊ?脢cMcHf :Vk2Ko((L,K3$P=[' AAK8p%-ECi5$6 QʏQ(0B$R"U#$]Rx҂yǗ@%*,E(n+]yM,X*/9Cӂ@6856 $ӡ$AM0 <>l}Q.ѥSXp-W!yD T#7ԯ ;ZKpd: SҐPC$rY=uUNE((>7x)6& ፄڐ)T`BP %:2h=#6]Dl-WNR8 y $WLUMuE:HaTSW|3I$"%GO5ӝ\*$%1Pr\S$F1\#pTU-A(Y8gy ) ms%5`37XEMEM725H-IARKѪ#U0 [R^-2hVKEW`EP `u$LRKѰD%Bh6ER$Y%W@VK(`TM%EeI0[ !1Eu:MH$A2@8mŝڏPǝ ʭ)0 1ڃєzT/UI#^;^mMV=c­Y`&Xۑmք2R_KȆEYMM)]$hן|͵Ѡ29EVVd-?սښ@]ۄQ 3Y(ƕFF@EP-\|`IDYM`HB]FEh6@ [SزBx'NF`* A-B׷X ]^m9۰ő# 5x9AFx[M() `9\[X޻p݈^ a#V;Se;Z%2LY'(_VOH0`P]e\*X^e^X^PYcb.Z|=gm]ffPO['rݡ, [f f ]rft5WO&wKw9`h.-O黨g\*F`^R58?bZl˽;> gPpfvvE63~ `6i')nZ`dJe3i9gES7Nc~-'2㙭 .vbicf05bFf#]rT)XjnV ~`YhլaEnDd:l a28'VS.ȥ2EBԻX&(Lv5p\; nVѡi2]P jQ.]#pe`5nTdk0d1nN^f(6DPv'g:YژiMpnoRn{ ])="]\I5 (`(!as%1>˖1fVoN`&(of `]p)T>bHLiq6j! g&)!酕#Xf@%ٽxrE`*u [*P/GAߘ(s]˖偺!.[ U3FOX?UsCb1+7wpHOY;3X>7j7 ^f&J&cU>xggKvphW@&f^8?;LJrJ cpGA`t 8vdXvh:jw|}DR&XfP;5wtWGApw߄JcG^voN=}_>)@oӆRl:ivowOOcgfĒ~xGȠi?c?xo>.w=tʒʆcy5y4쌓s˩Uo 0@3hOÑ [K"wO3\ǚ/,W3voK (wx vPjz+œ8srV -K$&FG,0b} Yp֭N6hF&+2kMvffq0ɒ6:h@rDM'bK4IФ֓}>jZpH+aAt-v];Ts9t&jq!X/Kl6{eHn׀bPׁQr rGw"'H{kuh(('Dx%i܎GIWcTYy'(ÝW)"*d}JzSQ 4:(xࡇ#TI,8zR%JZ#xz)} ()>ɤVJ@  (CQEA 5 #̏&r*Q/A D(]j%zqn:Nغam}"cQ:+F5EMCկ2"klQA-@Vj&tA:ik覎ta/R|H:bT &Kl2a)opІLʤq:&툵Q*ʮ2`¼B[3LܬF"̾+3hݼQr X KʆtBJڊ[(~Rq/9 lx7^"$8(JlQߞAF!}, +S qRȢg1K#*izCz/u :K OO5!wOBԧ@XÙ7}%F;,D P(Iy3)FʃGļ P/c":(q`$V hYhD#q< xyd*P-EMpqkz6ø)a]|k%Q I/Ԙ9] Sn9P]S #2CYE6G:fkSG$yz\wixĆwҎDؒ~=Wϝg&(JRbqd!Bھ8kQWKA'k>ЈVV7ǜ{-K,Ѵ|BM,xkpⴕˍRP_֥y_,mdĐKe`HA}R,  Af1]쉕LiDÜ\QVtʝ ꜵ Na ͠, A nR9B MPJ2 Ȕx'ŊSi^6@k ш ad4 f` FHu,UtΤڥUٚ#K8GHu! Ӝwd "=iʒ$^ \ ᨽ\4Vh!t/P JH"XG!%@3˜cY fc#x/ƞ8$]w蚡c@?a3&Xe`ߩ|A#IMHY}x$jDH} M+a[E ܀Zu0BQO ||BMfdZd[z$R&DDb 1@O iY%I~R%Y6%Hg$I" 1VGݤTL@[ZZZ2_[QKPXn ʎPW~TGfIB%ZLw- UHG0xBYv}IQ$R$lZkv&HWwhd ͔i@H|&xJҦئl朘IkNfWdpbeMP@ DejĦH'~@gz'|ztp'OzwOx& )NRhJŌ)pj1"HN甲hm…^gh% `lhNbIEz6I6>*Jh&N8jvV (^%j*K\kNQ H /ikbI* 1w4AL"tL *Nʠv %L]%Sk$+kxBNDzR̠;⫾ks,l+ҦD.,ahMҫZlzRǤ@!Idnh.C0BDpl:+l캊H lr,tMa>ĽF0L,,-Y6b$1}-blMz&-ۆ`A,]^%խQA؂6N'Hn`cʂn-ɒn' vD!-Z;kEX_u޻mz$.Nٽ򓺾+Snݕ a8C(fl,zAf9U"oB#HlvĬBm n.z҈`oo2 omJ4-C% RUo`o6-D-CW m--٢؀kn^/E-C".1 6./4"^.̞ؖ#*nݕ˝COfun m~.G; фq5pS O+#n{DZ(-έ:,%Ϣ$2ps'")2pB?S'm"4%1ҘuX0'A':2KY`_dxHR2K6 .>Sl vja FX^s&/nK__ 4/A5L akds*vٮp{F,21oL6Js"(vk+5H(KBݏbQ<ھ3l (Bݗ1g#d?G*~gcv B@ttҧOz5^ F4 '#"\0^?ZXFRI%&<֫N,%9A@i"5JWF`b%KQMqH~ڰÈv)B yƹ}+TrT@bm QұMl)*Q"kG{IIr"Ō }Xz2AA[Z]ƚ1 kpua[n~ͻ̛y2ZU:q~"/j=?aXcI "B*iAC qz9pB< ʐK@:AO(v@vA2qnq!0B Ct;1E=ģ SXP%)cQD2H!1K&5qr9"Ap*B D"BGA^.RE0X CF8M4FQ FF㔓NB-{AR/D)J,G, %HeO_ kDLN_TSM)MRqQG1 V%[NTԒ-DؾH)91G5oIT#m1EeeCe%/U][ܵWBftǍ$!e^|%ӗmuh? 4OG*FG-ZR\PYa>B9r9o mIUIELE8E$˜o54E68O R/v*J,A$A`馩a2QAd1N}5m c [czD-_8Q'c'L9 PGv9z}ÍC|+h}F mv[? Ie]va18C@qaF{P~q&HpBbf0=DRbQ{tJQ}yoŇYtxrP8ir0= t\$PѬj8C=pfn< tn!t^D`Ohp-ꤠ^v#0i)NtBhϠ}Ej4AR-/ڔ3 x,Ŀ٭Pe%nixg RTBbL{r SJP~!΄g@Ҕ(-W)uWΘoC*_B7:Y y 6m CdJˢ E;NH6ZRABQy, a la jCj"ZH5z{2|tه5nU8M tk'@dƀJ̫a j{\UC:$ j8}VgaLFJMR+^5GvkaP,S]QwB7tm˜ʲa\@hX䂑uX|t;xջ@xĈ T( E=sdxA3*":ҒRp$pX3E&}[w% =bm5]f+9Wz@ +=4wm=nfd{crJClᛢ5p?)QNW@f<[ &$5᡿͡gyEB^@i 5kdUgͬK& \Y̲ PC/\5.z3!E}`a^}FFjZé궾 BhUL]*|DulРMn`9nZ ["۽qog/3K#)ULZx˵  W`g4ʚ޽,7B7"4/ծdN]0pB{Z%c'EGfBƞ8Ux=ކP;yh t#s25ZafHgL+\GĞPuoHs%!{:\?CD%x 4w?EpXʣOSV!]WE}zJBSA'3;s>830lCE>ۀ7w31o1 s0SCYؠ\35U4/.BRtxBE!tHc908DA+W*[4I*M7@+tN)K=/i2Lt {:8CML"MOYs" A1TA-CS6CK#,!28-9%K9# 86}6=p5>K zA-c$,W;83V3XX"QZ5c!U/s|a1Au0B]q]1a>3;UZ-3)3g+@6>6_g%uA}*V-C/AtE=`8< `b\aT4UO"A9Ԕ$eQ!eUve;Œ>2RRkVk]#"N+t,e C+ ړ1I}gUCk-vV5^%5do/>7p}C+DoSFNL`!-4N!@ Gsk#hz^j\!h@x ^ucW`Awzwa6AҢzGyo&bXg}Twwxܢ~Wy?O{zwazW&Z-Vw{U7v t x VB7~xBbQ`v{xu1 @ Pt }x!} ɞ6Z38PInSɃlXy׆4albSe"77`WӅCkt $8U^x.uxeR y8xu7-7&T;8|xeWxseFOA ! u@WLZАx4VyW (U,`tx0o|ejɿ@G -`A@!uw{[ yx "fFĮwFhX I+n~g`ySWyzwA fO . f:ه97Qn-z~U OKyøSXw}Cx ?!\CE8 ixy/(׎}U CȠIy SZ9F{}˿}m#9Eق)ҘmG غyi.z{Z7Ǒ_`zUxau <ғ:]د:G'/C4& `{9y [àۘљ%H-3yUD?XϘ|ߦ 9׶W9a!8[Rúr;5Dc e"F([ Ԡ}`z C @O1bR$"9π[ z 3z{ebT<ƖjV"|»noӹzYӹ Щ!aW8 j\G}|Mv:A!Ѭ=ȑ[ wXMw< _z8h|GڷL `Lz\W3ڂy :u7 4ۮIˬϛA@}v@ JZśϯ9&Zz[;z(ٳ|x[RM[k0$ UkݪZ;A \}}|SѼP`^gJ ̭},p^{Ucܻa{ʻoәZ]']s|nM֤-!{; ܪ=g`g%!]"Ngyޫꜗٙw)3zygb@uܟsU)` -*S&ֆǁٛȅ7sr9S!8{@ >g I}@e~bϧ?xE=/x9=˷磻tݠ?g]ք#(Az8A?XKr4A_w\ y-Y (9}<*@xi`d\Usz7a bgǁ纨@,h$*R:gLB#"=8ǔ32#R]k֋#=}̘ 4څsb&uc <{9(3g.ѤV=RP,)KgBB~ e,u͛Vz%폷r4c(ʩ&&=q 6M2iԈ/_=uI5+%*x;z.sBDYhVZi5P$ :tZF1$ S(uPCPB N9 EM0pRGk'mw!H'_+r2CaV Rtā *IK,A&:Ff%`jgf]$[WU%aS8p5T5մ>30 G<-|%2\x^% lANr@hE*GNzC,MgA*G4FfNq3rύO^MqO<-3Nn9J#|'w~V褏驫EoO:DA(XфL8{}{͗l39NyFAt" N #8i *Pц3BxiN~z !E PHt)pܻمQP;7 .qSC?:-3 :F֥Kt(^yb 6t'7 }w]$54' D攸D ${=)V\ qD grRz0;PoLnG74qqA P@DEăDH#":0L<p.GL|jHU:)2Atb%WB.?WhSv(5m5v˨Fkttqꎦ:(]A 谫LrQi`B(d%~f"H R*.dT*WF%{HVE Xmz+aEPiim>97؄eU`,z`U ΩZn'NZt_v(=7!M u=j;&Qh"Ãz^vc, lG8:_:jH}()z8ON? X 60c4a2HIiXP t!g@nsь SM1ጊ eR40Clt<`Ke>zѪduу賦=|pZ*Br*U P͔0 kҗ gOd]Pg@zPVD.hf4v kDk@ ~I1kd;}'fq]0 : N7#mҳʅp[@nCpVit F~|>zSwVBƾJM.X ܅iůM_5\ѳu+q")=]V~G)|g~7j&&Fmwk6}R) Waxum0kq6mN .hW! t(Sw8hi ,q!q&G,7wI^u`tűxwQt\rGyyV0x6q'2)sтhMH2OzѦ7xq~ŷyX{&hbXN(#(egz" !zzY\t!~Gyt"j )60R#H{wǃՑ0Zh~qwnX+h׆1iGwGiP~'\]8'xG+/0I7/&'؎e5b Tigh|{VzW}rp!n XJHm/t08Rgu+8,F"iq'(Sw"dqe؆Hը/O82z(~}8؉Wl1CwfAkH_6@Ҕ~'mGx%X ~H0R`e6Q yxv&s9^(|%u`2؏B禘Bi)hنw}LfIyxgdJqkd1*&J GEg9)%晪pY @Bɚ:&J*םIzit<IuB)#Y69ɑ gja']Ι:aҙq6uu! v:r.W1$Iw 61i銃`tZ8Y ʃVX'9/1J0 BZv6zو088򈒤[6pP*jIsvI궧 *]ܵ !9Ue8Pc cI9:S(сfh|A*B 1}pW <3FiB*wZZ8uorC:=j PWELJGxUZ S^62 eOǰnW ˬN 0;C6Hj8T!mӅݵ98ODӭDN }QZ{8,۴u FaOJWFKGKFrk\to {k}۲!N* =˩Vb K65` ~+ɃG;8.QMU{#:$VDzNG:jK- 8A{ 9`=UDG@FCӳW:+)˼{Bq<;ۻ۽+C}4j@ t(q؋q!U;ܾ\OG< CX$[vE9k SS EEDq Ibk;V뛸)8ˣʯ6;'e :M̪{J+f{1x@+E=IP+(пPD|Iͣ=\ ʁn Vx2hB-g5r8}AĔ? E5i<|g\F'o[qgm8hr jo9Qq,Z(_e \P>8gϽͥ&ẍ(g_JکXPUyPe TxѼ}<ܢ~׊y *gyi:@J^Y r@޼-'^|S­|GkBVߤ~b}'#*]]n@~>A]+MD`gY&iɍ2p,m5 j@١im(R9ebCN KT`䛽y &2i6N2D9Iejsu.јx dy{Mu9#f+D &Zp}Aj$V-le =+ rp¸~n꬞ξ%fjBLK^ϰn)}Ƙ.j 3Rtƍ2 "?A^ :"ܣܐ rb eBb"5mm `2g  r!Y`ڣ|(wob@L / w6/ )3j⡮P {zx͛2ˡo5ˏ&ew!Z깝mb0U&R"ġ2xƍ=4nlD*Vfך"+yQ<9 tҷ+4ef71j$Iqrx'\.t܊҄a&fdᤏcm.o*ɍVÔ*tD-d#.oKIfɤJl`b@ M.+:1:?A"V8Gvs-Kh Ý31! *2,͜*'a$M  l&J ,Km7=, Ƨv$@k*27t?OzA YnKKFj+7ZUԚ7ħ]1 4I6c::lHh+MXe 81Xd/#^ 7.4<^MF`j&Z_̈NDAEQܳ cʰ %3dڠ|ݸ\Ӷt'ɯ_MM 3Qۗ@ʠ`Fx%k@]]@)D 5XRE Dm׭3$xiL 56Zve=b`yY`(f & siW)fPu\)׍d"e.:>c U7&`^M8T fi֊cB} m{g$wxuCGYovte2۞sd_5{:Ʒ\~K4$.v} ɬևMR"@d:LSAXKaюjQBd*x/Y`'D%BS|'.qER8QMd"8[@ъW): L`BX€]5 (1 Gc >8D!#+(*^]E/:$'DVI6QE%6'prh!:ԄrlxYr!" 4b %-IL>[#%+9P&T\"'8ᔙ33o7b)Kn(@$"*FbjQ\ RH2'$E.rQZ(P&]\CϘF:C!>!\* 6QYvM8&tQiT%+Nj;fH N2("QHm"9f F3)*K—ra<%& X03ϊNtB jЋbeTeK3U>&%  22UbC*-4wNzQ}FG +|[Q^d,1Ivh43׃^a)olfR[Q q[,+Z-.An\S:Ԧ$2ѹR}mu0uV .mJ җPcYQP׸{%Y t)Q1$l︧>F+&)ma`ҳ%/*:^~6s]+2TUq|{\~ >%0Ӫt+Wky))ot(SIpm13 WC%j/щ6W/ZNO.)B'W=qӼh14+kY"7ieF9֩-5Eh49GXgLNg/h6GIeA;#Գ'3@);@ 6fmË R}iچ9VjD%}sKy [ ˍt #d8؀MNߍymdhG[Ag\4#5 ަx[s_\\ rKІ{;fu6g'\\2bõ͈O\lC!Pkb!wN^-ޅ`o6k+\Q8lKqvtaalbEX2p\!3n#7߈3Lve0u85,U7;9Qho hZb}z0^xr5,щmxM+8'Af@ࢇv3s;f鏢Ml"q}x[}ꇠxUHmGJ@g0*=I=M4s2=+H8wyz&1Hx?6Mi?'f=Ch9 j4;拂؅76DA븫i+Ɉ>:s$@>k'>k+8/XȃA6Pv{3A4ssDh"d$C @) ; ;0)2x]=8= 0>Ä V#1S ;+@`@O<~8T=jC6h/=8b,p4|34AUж@ܯxOx;kDY=K<ۈG4C`qY@G6zd#|(?SB*>TAoD–ۓl02dsPt3HTF;H<=银a8FP9i=UBed 2EكD=dH`IC9@D( ~܁KAʬ8 |[I47N`|LS}ӓ|ODdLʤFL`iXK\<1TE4̯=sGȗ(F)ȋ47EVDļ:94A/ƂT$܄H:KD3; ɉ`!E*GUhF718O A8JēDOփI@9GNLGB`.6Jԓ@I< |Pj#o$N3Q$K`LQlZQel8P!KI?D(i E7L9ҌD!-؛8GHlEǥƸMK>*/RXӔJ+L̤SNKA"9MlF;-$Hx7(7KB>O6TE{)+͉FC\G֬s+Dh98Mu 4Eݤiʘ1USJ'Qƨ#S@3Tl]E[ŧi՜!DRS3ƨU b3jO$hA\I̫ P"UG8WM9+HPBEp̡Q/m>| @:T~0@?Q\mSH%WNK!BXlF$]|=FxX1J=w,/)Z`$W]R:ь Q&`,!BmnʢZ&.q:tc[u[8İO8azK0QuF/RP6$(~J[۹"\ p܏P'O\K XKжBE׳-G#JM(ν ]m"N@9$hHư%iA m]i^-j6PTsKu͉>#% [Z\%'sDUu|=鹡O0i[$`-HE7^{_" _8ƽ۱)]?#%0V`M}kX\ _aeWƅ6WAJ `#H\߄ ,nI|%][k=>`bU z]]PFu"C&8,xe*2dr) dAO68%uۂdم (䓊]coR{ DN4$)fHd)"BUޫj=e;ėi*"`INRޅQݳ^ `@UB$j^(%e$eOe_eMQnedcƸㅁ9`nkNld /X";WFgdX%epR( vބ馭WoRrdޗ]^0fIe.h {FЇ2gdVayM\%q^Ee6@YP( c+YgHJ}6dAf .Z2PFavd>"d~1ThIVhzjh^"6{$ehI#^]u""xc8bbMvUW$8]Z _w+f"9U&cTT&Z7B:[6f3gʆ܀+X5_<\RV^EΔpT`iZbv^YŶ&H_l\sl8i`nO~ͪs> .]ҝoȖl\Ffpx_G:^\mU(J &D] TuhMh*KYU Lcg-%a q5qo9L4hV# %n~徺C H\ Vx& 7޶~WQvM(h`^+qm$Y7߶Z]2' GttQt oBPr9}Z&K9 AږԷ@XmXX(r8Wt1 #̧Fj+-c1S7FX_@, I\ǟl1#@v058昩(}UkvYM`XD9Xur7QbԕJ"_b/pzQ|/ulwwv`Ag7@p ~H= 'LWtz[SXvA "XgÖˋr4IFQRy#R-mˑTPuDFJ#Oփ獚33dISFdԛVDE%kbξز̋ ÙT/L'KM|ϡ˛G&էDM2NիO8i1`&r^Y946.lIQoj/tiS{zUueRKehS|49pTE ^lir`~g-h@؀a UM%Ta56bS_Hhtr-6 F_IkB8׎D©~b#VGTe5UކQetG%o(!Lc‰~ip\0`rDBTJ៽BYOGjOuTsSGD2BK'EeZ*[4jJ$YM_jd1TY 2롰KyX,]"Րve[kc5 -Ӳ% ]ڀdKo#rYRM:Twu.5r/fу 4@j٬ƭ^ ' L0KDEq8k kw 'QKt=v!O'su}07u;1#LK2 ۴f3l:[Il ^~j] j2h!۽nmDч,ͨuuM7eC[H@9 '9/KTH!z=/:z6^23N.NF' N(gt,sWzB ){t!}@6 4abXn 4M`hR3@ NZLgHh ]2tʪD:8fy9h6GL )P zD)-6 Z '^+}9"l-q;a 5a,dq5.Ċx 5(A ѨXE*(%b$u<:1aC~|11QNfzpe!rֳ>DY*j*5ņ !AD)HfIRpb;ܑ%鶕rlOƸtԉ>- " 0!H1}aF+AUC&%`p;O6Icrc b R,'W! @hg&Al8 Orݚ@3x4G"`&aBPD ҨfM[iRI)u%#`>\c:,e+*De;;Oh #얃(Q|îwҦAOb`Wޓ\ͬg={YfBbk:جhe R%>`+jж" 9 paՀ6JVe#\ɭ})[C$mnFwc;ېֶj^"Åg׾q52wncOXR`efar"}yW[ jHxbx(vDHGnE0V_77}0l! רD }|ZC'Wŝ1}Kp񕯘T쫔śVoy5(&)h̦֬XPW Lq`cJkpo dK["bukg8÷85[@;,fE,hic-y b{h ~m; 7wH{fس؞v|b>{ˮ7#`+6zv3)"" NҔvdx%Xn)]ܟJ$ Pʠt_ QSOTQ"HۈFZJe!dAxbUKʅ,M.6'X!K@42Oʐb:ͥ)@ %iVrg.#D zdaef#%B;RfD% 9$hffJ^f j¦W#Ey,sPF'H66#f&<"S} #9K#cfʣOG~%%RʧVE>U^U~j% @A@YP&(tdSflD,,y&W X3FPP^ O:cIVShJu`Rjn3yѭgҧQ> Z*i%eVg¦c`S>ˆnԘdxBa"[rdH'bjVcDbx @S_ RJB T˛ s.SBBYz&EoE_zhz SrVcDh[G'uΥ#ܦ_(UV[# ) M^D4>Z6R cfzŝ)d,9prqހ `2沎?D#: oV!zF$8=ʨV„(F#e\fW$TՒ2Ϋ\Iil~YI%eczGJ&a,Y]"E~Ԫ*VBF Rb#” DP!hQjB,R.Drd*fl u,,fȲ w^bD UR:lʌj2"b"zjBއg2&hm~9J|VJj?21Bn>zJF~F[R.A'0beZn Xf#by+)J`Ɋ2QBoJ i$"BU$`f]k* 6..EUxF,,`a^b|2[&b,FN$ӪEn[TKlR2FUoQ0nB2o'w0LkjN,iYNRp|^P^-F,&`_-QN3qЭ1]0j`hq^ŜTڱ'Lѕq? \!-N+Cq  #%'^ە 2##2ځrȭ1\58Er7$Xd+m()"۲'K܌)d!^u1X%,qnT+ȂR0H2w"sq3ρ0 ]QBrW^Ͳ4O#{y39s!38#= ]?߂'k^uh;#51!3s72>81A$ %.@%$,^ $Er A\8[KQ4L7G1WYp-X]4QO2J'LV%ON3E=4t4#GKכUCab1\Rc : %TFsqg9WtNsvL53S]i5S'5uZRBH񝘵hf`5U75W[!K[pNd/4 ى\`N/ /cB2YuB`bSϴ\66iWuS̶O_=i3pc[;Bn'c66kCtS7u%lKx6k;7ljT6By+ oB`Ym&,Xd7NWywrSxvyW>xtiw/x7;/vIJuÍ40|LuPfctտjlhFx{xYJxK9Z B!Px\Bv,K1I?(4y cɜ`J o(p9A!0'xF6R)ṕ[yhWM'"\sX/ydyUl% ynN:Mb Hqʥ0C@l#o0'|zg#p꺊z#SFzSzDPJSD;% . &WWKNR ´z)pzaXաUTػKb 0!HXT`D ]~AD’CŞ?|Ѭ?wDlL'+~DLPŤY *k>hcwdTD j$ҼՐOw-֚웗(B't,TGG=B͛!!UEUTl(Af:"ٵkbr7nT`FGbJجC'V  ͉Tg9r1yf 3ň25夘)(K{ =s2I|9ʌ$',رZ SJ1|Hv+œdL9g|> tOX7W8Qc#\'%-D5< #K:c1K. /قޖBDmXd]Q(%z>].3SL:``Hiak!"z"n.ȻPi3"+‘PYɡ4;<|$ Iz)tM`D$C3CRk>8DG.[pF:p"ND)2Ѝ$9l.~̭xJ@6ѤC:!N*S?Sq7Cz Ҍ+ ː j 9/*T6*9e RDȠhòrE1LTƒR%E8h>*p\H~K>ܦB(@:R-| 2<0Aq-?G*!N;p|9P&9>ߚ'm;(MDpWK.'<^;#BõX:(LG]Of#ZzZnm;-0nh;2-ţבe(%tGH4暁2 nX5%@Ӆliw:rvҋFݘD7+@9^6ڜbZePԫ9^儓¹ -9i2!sVnXqҍk*H"1V %J7ӇגS)'af^՘+6>%Kt.NдԷS-L :*8Y_z:amNk 8U% *ԉO\Р1J\1!7rJ1x8b$O ',D"1 X ?fA,7 f RЂ+|E+BV(L 0Z9HrL/*È@jXM({N`Xp#'4B?#!ˈEq#iT(6@1Kl&(&8 >="1XHQZb+qvZT!_yPD1t6A!L8.(  5asiJ@ʊqBo:%)FDO11JO)(r# tβTq_/*֮nPYXտ֬!'D =z@hb jx^+Ҳb_z&!cQ=d*ADmlO ₦jJW*RD,VZJ=j7"@f?&OrIm*LZN(w ]^v_+NP>{ٓ*ռHlz1ڊcmjqWWMjb \MIlqVpi߀X^U zJ">tI1?@Agg"Y~&vPб)QBBKefY2ڕK\gNsۉ],kQˮ)Ì E3S:kfr.h!s@qBsX6t@(d9ՆհڎёVs1KJje|k4K23aWF5 V1\MvA| 7"kISƮ"֥Ml̹P5cn%́,/3Hb D:Cd7m.Nx>H I:vL'Gn1"^@D|>CVqO9uьiD\m)8DHnWhG]5%nxq& ыnzWӏ#WM4yjH߼: N su:A߄4n6%}:Q6<7 I8HQDը5e`O /3JM\@gPv!VI?ʁlD{k̋BFugͻ f7kH̴P0}+Hr3*xF4|IfmPPdOKnh}CEuvPA/nN'@a `e Fr.=@ }D'#Oy$L|pe BPiAO6rBoRB}4$+F=j+>0 oSoTچ" `@P[P(01g&U$C8 ]+*O CXo' ^u ^ 1vOr L~Om(֏:0$ 9`=NOr$<^p_v#t2h/sf@E/_*4o.o#\螦+qrq 1m 1qME_rb_mQD!iA"f1#6?6Ѥp&".M%+q/ੲ Em0E%:i !oP2 0' =Fr EDp,%b&1=n1FEhR#ɰw(Mb/)_2%KP "nr ].&%'(D2F"(# 0t8q D& -cT' O+14q0[&k20S/2`2!F&5's6[ DpOS.xmڇ4<.c0sV99/291=v'>NKQ""s4;3 X3:aw:krmQ*8!_|0,~+ 4|p#GO)->%3>se8S 4<~O+CAQ0Q!=$ 24?spq934NsP4E"{f0` ^$0&G32CTH1s.W 6UP9s Lu~MUIQu0RF"5t/ Ӱ[P1DjRP'nbЬQY52 RT"6F `\Tu=ajhjrDo>3G@)mZA7L5@KҾ"KbY!CX%Py"BuOs2[ZD0P]g1eVbWH]ɇ6B/4K6kSsV[`(UuA_BRJN WI__K!3S`q$6MUVXEQ-V0_f7v\IOHo@29I @lllO2le0=kNArn%Cmmvlp ,n V 'oqrkbl^Ha^ sxnw7tIh xINWLKZw+o#v'oA|]qC뾸jzpyLx;gĬbMWnfo%~|wOJ}K {Vױq|!5EAC,8qJ;!;!j5H!@à vyIk8v~x9 XtղVePs^)r# Bht[ ydeP)3t{؀qGTnan%v%oxAzWwmčXY<"8V7xrDR qsuwmé ٬bA{Wbz@W!(N78btVxxEvEuEvXn@|n$XbJQwnwomW+Xߏdi7W*8Y˪bX1y{ߏ58L`< OK8v/gX#4 6 IPBi؆i zm$o#=b:\SS E`i*Ϡ fڦ VBCL@+[Zbb^#~zLe.`).yz4 ڦ $FA ڳi8@"yQ[>%v۫MZ{+{9 0jt#9<$z  QcBnE, YU € ۦ Z2hEbFլzIdOԠ]?AeaC @ ^W[x|_h B @_3 Ls@kw`}Z{Y\o[IP.,;acaו `CV'{vJ󻬉iqMq!h:{ : "u#fdw@ٻKT{vQɭ X@ "Y$(=:J@)">2@Q@< ,L?c=G >X]@؇؏*ٓ@ؑ]ٓ2]5&@Կ3 cܻi۵]GO3 a[ u7 *]څ^ٙढ़ڋ] `7`۳}K^ 9p n ]9 ]K  H6= > _ >^y%ݧ֥c^+)`+`hHQ?!.ya} #j2`^J^~>فw" 6+y^~i B |/^g=A*`9#_ؕ~iM ?&^I ߿= O/{K޵>9 ^ m_ PN_}˿-N#>hXяuL+ ՛ `m-8 ԰1 aNlش9vLT:u$R#FTD|HC6V"ѣ 2qBa)' pȐo*"QP JBԣor D7X8@@fX˶-*Ti}[ z0aFG %4\BQ9T +X@9Æb V޷qHCټ_EQJ< KH9ذ3 8 |`zZ rצe5tP[nWJ4PuOlBtD)1t JMU\ OTPE}AJrf )v[{\[^=`}"8P֡p cfCݠ'X v$bCA@.¨V cX}J^%g\yXUEAU_4HagsT$|e WYmIu%A#\.0sǨU/\R2ƫ^ojj/[nqC&9HQxЄ#}A*%DC&=tD\F=PE"H{Rk("k `qB1ZQ_Ńax(x&xC ݡ(pkkxzw &}UWrXAL;̇CQ``F J0A6m^YCN Pf`dYI"t TH2!CiWZʩK]ͫ\;`blr&2]P-0v% eI)9EZ8r_EhXU\!ZЃ)́n%G4&5."׸nt{ܚ8B juaے( F D M2hJ7F$"r@:]_B2j8`&֠>82h.Pa,:$X+P ByGAPW' `|#M<Ȱ0ad0K QDp8 0o8y &pH{0`MЇVׇb#0 8 2e@mw}d?h!B+91 e##bwg']\U\p ,X 0,En a` WT,yl_D0-ւEy pyǎ%H u)N0{0 N0  L0 L=~U9 ]7S43Y|&W8V-T<9}R7iBOUW;ٓP ʃ4ᒆO1U5yN%r4 9 N œhS B0{tS"0PP(=B9~4K\Y8[H5 AN<@"PVk1W'9iA#&5216 =%K!ʜFYLTBːR1QN53Qĕc*aP`7LD"P %Z E6-5!BQ#Wnq| 6=ªOBH%|@&ZD9ZL+PgyALq  B44 )=ci!yJ+BpWAgBE)0(3 pRy|5`䁝k KhQ}K^B;k(p9/ @TzP ,kpCP<NP| CC;ʣHC5ZC+I+Ii*>0HxSWڦh4-0S`gzuV0Rm53=p4ʪ9J0W(Wk0)J.DhYZSo5gRR[ B[~۷c誑]ZBO<.epP GA  GIkп652YkK= ;z4Ua3կâg@Q9{k)00{=G>[z#|c0oaV+;6ɶm;"0{+0@kPPaU}TޙG{C09d<a0`T(nLL\@th )\;AƗ< jX#9f6@@;?D=D~7D=:*j ' IVS:Cqta k̨7k 5/`^I O:"6i4o"8^t@1Вz[7\<=31]i;{&LH|U[3XeNM > X%(WL q!VI!)I+ZN P4̜7]ߧem9\ a(n8rJKҺ9QE&ݘ0 (K>S`} A 0m7jͼ\0iQڎL൳ e sMмT K *n7n <(|jkRL@}ʸ˱¸A:\{?Ip;< +s]3@/) u=g*u@̢W z0 n< pE4Nh;(s׭AYV1#_Q"<1R2oBlm}/]1b{g*ThbѢf1&9K![$KD!O7 c_  A@'EeP e6]SF tܷ5qOP~*K"}`q *)BAePXka\S°p |Fpw CNeEg&@#PAp(@g7"S6 4X{[`Cins3Ih1e~DeK0{`0PL1 Dg^N%GkUEeq˫'Gk0M k/yOa!" R X_d>{5)uA 0TO wHowmWոvHlvL_\ 1໾+M0 `|0 IpG %G`3 2@|?z8@ lkѡ_| J$@̻w`87BO1 \~P\}6G{ˠA悸 Hb( N֐@ v '`k\O{&~(?7-H05/8p2%9{ @Om$n܀?Ym޼mL`%pA3U&^Hm (H@c<~!.E>qL<xQ0u@;v& )()?>U(&SeC]:̑HwXUǾ]q!H"%wI%Jw, L'2t#' d.>op{5TBLmX hyʌEo1 ⸖57q|@uv{ù.)2E XX.kE GQ:ȠB&8n 8N Ǹ*`!xD!e,^TD5~*H8 P2%;yqSZh A n +6 .naWڄWK3O܌O7|O3fvYCf`tzP$v&UI1f.ef*tR|(UPPAmZU`Y'` 1Ѥ>X4FaaFcwO^}4a5 Ā%$X0נhu^CH[r Fq J(E7"m7`G&1 [&zRxe\Euh9PeBq!%(mS'(ebaW]ؕ! (\ԑ_`=n~~5`i6΀ Ɔ@FnV(Ř`Q$H9!"``Yϳ DXPm*\]Gw ^f;DB:ȗi]&CqՁA[xH\Ew J8wvWCަ~U;*-cM 2RYaCGE&HT^Bm6@(b!8c ;Z2$ Kv& d6Q?nv(PB. ]k0P" 5cx8 C"^##BX F@Tq6'ɜ/. @|Hz`MpI"pX(>q zNgʐ/ \ |WjI" 1a"k`@"5V“dF8z8/x tJP2Poq#J=ҕn&꣉20d,jP#SRV2eK9KD0!& ,Z@ H4@tTV}%k*SȊf1Lc5L:˘bĸ&PBJs $. 7*L AtAU @ B )WpsK#=P)tUv%CMhĢhH{˪#+M΄f>uOf3҄!b6@ l2(A ) Oxzl=is - >3D%;([*~p?GxR(@?w.3 f0(\Ə(í7ix2A| [P)O #U\q5 Nbzu+~RT +Zk4 } H,9F) 5PKmgf )@~[R/[>71k.)ƨԶ#Al-.uPqѢʬ^zuz_4NuTn ?y10t/KyAƝ"e HwԺ Hv~]nr05A(Sjgy_CŽBC!Xu%h\e8m0顄kcbkcua>'fĬ);$ppi:Cx*~3U/YJ<z3 ؖ(>+9?Ȼ AsYCkEc4N_%XLE(Gac{RcWf[5VCe{b1_S%!7`hb2&_e'f3Cgke@ʪ6#Z#J+1 bZ GW/@># $!9( &p=G,ucI:jeXB€7KZ!Zـn1#EX(CEGH` ;G:0!+{Ǫ >:C >WF*$GsěaIΡQpjk> 2*AE`+ j,rD3=l\?>jFƲcD0iȟ~C;4 >拠相XҾ[+!$1ש12"z 2Jó+C|>:<` 8</!E(Y>d< "(yqP;3٥ԃ kn4"/WzٌMlld4_z/,4܅VXB`Be12(deKlCM7C_WMKpX+d5&D$8#*ăKF?L-d6D$=`ĉ0)!ӪO%PJ9{}.Z:+RU @r*J8Ǻ ,"juɗP.icXw!@cD*4KF;̉#? .ˆ25Kzqǧ ""KeJ G,P +9Q)יѥQ.D)ɫ@Iľһ.J1Qxɫ`p$+)ڪ9[|Qm)Ӡ\>7;r*d*JսZ !a%'HKğ1rQ hdIRYOKTm#BPΩ(#uJs*L(ݽM;07758E$ khXp9T2VRXDln(X%<4Vz7RCC\B4$&dQBUlCOtГ= WKOMZLZU ;*18Y/O@Z~ȀxYĹ8K(hR8+S°  !HUTQʺ \<*zڳ-Px<){Ze۞(}3B@M 3K.Rj팱ҌMJ뫞&]`( 8pqZA Zհ07􍜫]0~E\UXbߥ@*Y1- 5[*p`](j EXt=[t 5E5\3]KFh:$`^`K/ ؄Axj(5p΀E+>mQ8P- "=ʽP)QMZ! *Ѐ\deXsC%]'csUj 01#ӪoFxH 5 (]Ր! cyK0NTX/Ri[A03ײNZI~xC;.gΡu'X[)_zdPe@ 4 Ff I, eXa f~݄0ah2ײ ۥu9A۰ [n:E&hƊ8Y|#?1$a 7Suy ~뇌 raf5XOa&E l ~ȚSx'Xb ,G#-;1# +~θ 9PPpb~hZcɰ^2ޒbm,qLʹ2Q, up!xVrBa)oE:GIo8e ʹ:AK&:d4TvpKȥP&KMaxb5_VT5e^fe O0\2F{8Q@h>Xk'wb2x1J9 y00g+M6y!@X"%{_{ᩬá@+$5='ĺ, )R=)]V3:G|N. sp~_J.V?V4y_Ҝ}$Ǻ#æu9,P8s5?KbBW,rLӟ<3̀ {YU2lz#PIDUDsi''5X6W]eoo&a$\JIنT糳!y*tyk{⒲LWCmh("&n, 4 8E͎dSI3{__*B/ Ya&hq+<g@1&{qԀ]r>2hfg?O+TTg-s L5n:臌A )$6ޘ=1&"̓ˆ0 Yj!VR)yXzH `!f &n&i!`r&#]%Jؠg%vR* Ra]S}_߹RQ$;GRq@T 0lSy4YI."$1hlR+()Ԝ]-@wtxLjT΃* I8kb.:֜!0ZBWn1\TQ 4X fW$V@! b ,l3؀ D1%B"RHkWU¼Q\$P%@/Yi\cǐԋ$HɣY|U{ DŽ_ $6 dcXXR-Dyqc1R K1B(ih `64qT5.rdבbL#r2\JfuQ1U䝧*Vf7ŨbFGtC)90[j M\; Jd DԂdyD_r|A^`8`+S;Wo#8#.qS oDjpE]3)M]mZSW ><.r=Q "̸9ΑˈAPwe&.tOw>7AH7.qS>#c(|\:Y-?]x0'x߰ tTEha bE.ruS4 ux2){֡c̦:yn(sEHfYrD*^]0#?uJP48Qb^P0~_u5e/zs^{F[6@d8$I$c#< c7R@X$ O}Ac$I]@:[6RL#C:CEE^$UdE[NFMF!2:@CĄ9c#A":aT \B"#(w Bq#Eq,GeF$b"#`TJR(3UVA1cW # !\Y6كb2m[%0Q9B),\A#TEgV\#A$ \5hQC0-r+b-ɱ g,2q&DBoE b."ݢQ+vbtgY.x^u6r#72f姲]Zܧ~Ӱ0Ԁb:P^ThOEEg0'2z秅<"~h>.YBٯ On(v_dZ:0B0,$`tBr#HV| M}HYf)1MhL D&")FvRG^&8 DXQH6"[;:`C%삓q`idd)$b)@I*2(DyҊh~"a+Yۧ9U" a*,qZTyۚJ)\hܪg dhiiYP!AlA+B+5h6Cugw2yjxn+y+^pVom Dgt.v6vVuvþ2I@B)Zb&y)I gFEh $JU)fvll-j, B~A€1AiZ:i`HR,M+J,|d^"HL@ꁖН-"i1i-Qj 0~@bFȆn^_ Fih^Ywi.B)Z6nc ~ȝ%h^.W}R RjƩ~Ri oD+jA)&gef=B% +Ё l&3+R&x++WĢbot2bI aQ xx`@m"vjȅџ@"e H|`.T姧M.SE?j1>D]=`יaYH1"A.jz>\ 3@ee~\XXWIg:@1₡"DL![hʨ2ښp*G~(;@eaV$A'2$JeHD@|!*! K+,k3-V/2 3m0 s$3b4˧435cs7rd,DS/Df)/gPzx/ja/8t%8BA+`lځp/80GpEv'x0'! hB4RLpQg!vv"1F0r{=/s1sxF@֊"AP3?;f6C !܁!j5'}zq|$ %' /W@VV6_2@M v'6/2FҠf~fe~hg5䀷h 2_ )@ )aqx sS .2#K>y 5h"(lk׍pBtow@/\&y3 3"s |__:#3m#$8w vaWUiGfAA+x"A3FC4DWH#IT)B/4Cst!AlHc&I#׺5d9rM  QggS/H91,ȁN#b\ ‡  'Tbuހܹ ˆ=}=$D\A] T-\7';#%s5B%U$_PfM*ze1Z^{1@ߢFR H:$A#B3tn3:H{'$8&N&xQ`S.Hzq+#%AA`Y޶O{<\+_{Af|´s|~1¤iLqT6`YFtv~f$tco.; BA#l:: He|5-|p_Dz Z r-UU{e$$y=l;7:= D:@tWrXoxM7-l{F=e~@5ǃ_C'!h*haj~-|3B'A/>t5l$ޜEx@,r&x=:4۾ %4 J߹`繞#=P7%vY WW[; #@$YeI A vQx"$0ĉDt1$%OHx E 2eKJe(1&.n@ѹS ( K[]{EhS;}JFG!)AAט(, )v "b!Z+A. ],2BfMpJ+n4S(B:mR7QWPP]ƐXM 2D!ji?C9;fi"\&HXl튚>~\*5ךUz#>jOxRVg7zwUu#Z6PGBr #'f!lq<Ţ1 uAQBŤ&Ǚf&BI-7^Vym^k%y}Ji P.Yr8l r r˄E $_n*Yx5s&a :Ⰲ3qb"#<IQ(϶1XBm˸ Ԗ!c\#kۨY9^t[ R&ԜA\rNfw?]a6w,^'JM@[%)˩JL!o[+ R@tqswݗ[UoH7(@P=0qi )9P -b1V4ࣟlܹRx  ߷U-TYOb@X81z7"72! ݀Eպ02<<ף2ze ёR9QQ q5gK`nP`0 XpЃH3Aeq[_Qhw]l䶱fH*bgU5ٚ}##rYjh<69}c |C)8Y!ns)GF`u^ #8Ҡ b2>*T|TOŗFW&>xO XAl7.foYқ.'9LohU]%YW`@-qb^| >зtirXuĽ#er#L:0b6D.9mK&,u/fn7ҵLWF-;i7@͊` 3ۅn:-!QQ+W f{4` Ylev}խZmBe[e llʶQV~g!w@r{H?zIg~ǝ/Bj"Ɣ(oO`\À)Bc+$EDl;j+ !%2:V a/rjБzrj[V`8@%>U"R$$$*a` 8 N(q!sr''}#'R%L!'s,Fn,7/( & <~ $*O'.X*[1̰# .pq֋A 02-϶!Kbqa>'L c*>XZ.)e 2 6(b2/3&(Jj6Sra\6Q'd3:$O;;;@Sv(X1S#%ÑTYK]+>6؈we`>ѷE( ^ljj`ԁALi;S.2CIDKT=_ @@ V^Ե ԳEVFA϶WP+B T6aXEYŕH @!Q ؓXʀ Ezܢa$Xҭ6]FgVjMTGb.T0Z-yBdm{a@j``W n}8.)BV`nBVDldbֶLGhVnu_ /i6` o,h2in6Wz0T`ޒ K%"HElv"l몶hpp. o4I0q/W8.G#ü l'/oDTynJ' #I`.6HknmWhmZ4wd&f~''^D/k +48Xh,-J ȠaS@lv Oؤ/f_[WhŲOLEg\=E $ʠZT Y^6fAA8g9Qh$"c`a&b&.67pWWHu+gj,bv T!ZШhC8 G_@L)vٸ2J! Unu6m,'L|rXкQ1F/֖x7$8oɪT.  mtwwoQeQ?yqs@7JeJ9%Dzg -BW~X jLqw!DY"y}E9艑i Y)D%~ݶOu8~bYI@KFQȂGQ4X_Hł/X BZT0_֤HXH|놡8qeSDYXL Iv: !XZhhd"lc Sjn)tk`WזRHyOK&f^Pw2'YWKwiE D AieK73ךq'A׍9K,zR /w^"M'"%` (y@[ZAJd7ZI6'Ķ~) Q5fSRr];&eF쟝;Yj;pGjk:y:F.$:pZC@Z3x]q+FvXhccئȨ%Z8 ;2lh>aϔiB}85y"۠ww^Xjɭn f/i/F| b({-ymiIzO# Bیܛȿ.C#Dma{3c:tx-+d;4ꗃ(Y?ېmwp0#.!z2Ux7"=>}q1=^ pK_^âLpk8>=!)3,x9mYHȣ?K?M`^(DMS.dÙnP3xeUtt͛:}G H?~LE(bilXXd,mjڦݥI̎e O=+5pI(VjXk [VشP/m"26o617&ԩfi(_XROtˀB(wܸtnuyNQʷaMH% Ri{ Sjɒ *8|YbCࠝfpf nQreW ν!Ff7O r"Gn iƅA`gmÄ :#|B.Ew(DDDZ/ѦG# nRv(Ȝztvl { r <̥ '=AJʹ"pQxEB]*qy,CdCʧf"_@ =d>ቈ ئ(t.E% Df;4$*0Q+"o&"0嶆p)Ghqh,Pthl1EB 0D"c*TEdPΦ$}6 ; (PJ/42%tI3]]%;9 P4sME'Y[}#Ys}RaapUb5VY`9ݻauE{u48pEswE!WDfXciHoً=PĩH2kL ۀ(|L:` ȸ`H;ܹ20vQomYk D<wpC޹uLeϏ*82d_ԿBNɃcOGAHjv4A2=-z6 Tp?1uE wj*p2p ִ"p"H? 4 ( C@ET #(Lek" 'DNK1zŏ<(CT!' Gr%wx'uJIѻCLTUÃ:2C;$0vPHJ}p\/F/$tԡ0m VHe2DJ@*D52HӐ*L+3?x FSq0Fa/{F1f .aq t/#/0"(,"Mђ*I$6>Q N( Mo:7+'Hza^Ը6k_E,=sQT< q )0rʢ+`|KtF!RX=J/bC BgpeD {ёn>0hB(=5^NG>BmH ?@h@fjPBg 3+V&jMpi24$3EЦ! < @.fF'sO.\j selkB(:<`\ 喰#X8!k,? Raqqž|0PaO`B 䮌ЬV͘}x*E +2 Zu^ yQVۅnv Q6$BR ӓ"EDuHRBvK]`Ev +ZХ' wA'x\2O0\#N|!@hi Tƈ(*Cǩ"0r(IoA Z#Lv;*pݤ`{Q\BWĢF3dQf`pE."Vm7N\%/mqOzɶ%ӎWW=1`SZU oT2ZBeT9(VdCwȌ\t`'|6sj |x~Jv"w,#Xv5?q`*[VX2ʱmKiZ xDX37SnfvG5\EAxcDXBv Ό"_x3_}of|ѴGU)v >+?35(sC#!"e >ч+| ;oK՗AHyG5=('W xfw~8;ޜe5UffVfW&ID@w0*a+GҴgtgBǁ~GQ&MnEiY󐁰مHgDweC {vD]&ܥN ""kv8uz+SGJ0s( |E~MgKTBohFQQ7n6RV|"sanA ,do2%noNTo_0qsW8 `Fz`TsS%:@9W+:GwX3r#WrHp@s5gs^s(U Fq@':I׊$rhXVD%50*q  X XЋRIpU/z$>EcSC F<H5Q .A;j3[ӒD7W5 *]ԅ#KCCKY9)B)2±/+0𗼿2Բ&z; qwKYe3ʮ( *Cxbev c&VFü'#Aܻ A69x!OK n'PN/ `{eky.ŝ@C(—j,(PN0N00ù uC/ Og9;00!ῡ۹/s5L# ;I NHB{akG=ǒ#@ PNpw !;x/֪dMLP'كȳa.!6Y,-O4JLUPۻ)n5n] . Aʥ40&C Z\g5|6[P լ`)X''m{ݬ dDL g{h % r#e1Np8h/O0+-[⛹FCJ{M ẪJ˘adu[VP5"ҋ+:с;TS\k`SQt:f'pQfВs xo֌tT'@Ȕq<}g M"{]I}$3 @J̯%6uL}"<dYnYIY6\\ k@Vjr`-oX2n^A5yW0/74C&r9WHz5]{sB7EY x[i}&vzL>!fYʀS]Uv[]6zucG:fnKj򘘅ue5B<$"[puovDwF^>ثc#O>{Oa/a `t> Rw8\QGώ֜(#Wmtc-oQa{fn n*F^^0l @:qB;2ysPu q_LIePTTp@z/|?XsPg0-GH~_XePI>3 RAnc-.v2)zq`g~vBrh}F([†fYN#[n@. gbrZlxO}cǮGgA:~ZlJ~bj73Án G `!%d26P4oPIF +v48@ GLZ2 `Ƽy̞e(A"HP@) FFg ;V.9tGߢj(Ҵ5VTDyԼ 9Ł M8\mfR-~ { " D HiRMwlpt fsTa@Ln A F*S#D<9z C†.<* 4QABʀ 8 @pkF?q7zt /gHG 9&#q&v 12 *b0C9ԲK/Ô 9Q9 9F=4B`r22ErPBKT˥RS@e昃"<`XʩD D`~u("# -h`NG%7 fia Wu  HE[HmhfuT$-ޜ ige[sf^GYceL`~jP:w ly" Uc *8OI*y*|7-XW^񵥒f*Y5cM9`Yyg>k sXA]#h-4L/p=ۍ?6l[n>i7ЬF/%#eFX_Ke()`aPVuhe]"2p7ީ1hLΘ;uRUU2U ]gV@unW$!p|*]>lЂp0+Cq:V&(x]tE);cuH $ҏmCO&p(K*LRTt(Bj((ܤ3HGS3a XT@IQA&v ѥ ' FTy[0g*n7 \t2B~@X2seX`b ѭ#0Yjr;DN؆Ѱ%Qryd#Avdyшhn!Wh6H2SÄmrf0*Bocʤ"5 PTj^<}⊔+jWC&BJLvP,pKU0R`[ Yi46 F:-(tx0L'4Hq'XDsE6zӉTD)Xc r,|MtmoZA=^%F1 TGm<@_+fK=>; R>T@yk ũOa$`QLD;R7oEzߍ׾)HC%I MkNh@,!ÝJ|Dc+&eN(ajA@0E;p(QI(D >BV@U}D}-yd2>!^pB,*ɕ- QR*L; S ( mE'9ߋb\&;L{adL! ͜^2vu;)7o&4,:ȗ,]8$r%P UjI8b`@xِY&Py:"vr! ` pZt #5}(o(k\}qe `b p#)v7>-딻d:esQ-5.ry-UIS5!K`gI" pҫt0ub{|k_aֲN!%~Yv"hI6`$&b֊m#R t!?E"}{LPo}?ӃyPK?Bş[j(As!#wT?+8 `6k"3!Fn6T w @.rV$FrKPQ"V@?zԧ^u娖wnxAsec/No҃ٮ\JwhSCyĵeHZcW:k77Rv foA6L"tc8IXJ*v7IOjg  88h߭&pcNpP>D0(oy+.#QkoY]W}T vo]'*(7S;@`? l?۽.S7t[@|ZKK5O@ TxAcADP|A} PP&̷A7C@6DX7 ̓ %5X/:B.B'8CPEB X>Ms٪-:ѭ>ţH+Cr ;< 豴S;F.93F6l8L:>C[9ׂ51.:= ؛;H2cjqET»/#EK.KK2F;STFkFVtWXES[<üko뀔A)D @Gl*R2=TF!Dӽ+>gTaLS XGvT*)9lD| )D6äS< .ҙ F{8g,/Cƥ PͫDs;H$KBǙ{szlqBĵq`s`Gʩ7dK6'AfcȬ.4*0 1 C8!K!."*ak +j *;SK0F ZL<ӨCUCMҴJ9T4 Z|47TOE8,/lI#⬴Vs$dtMKj$Nk(q  EXHܘf y<Դ.K#)CN/Ӕ NV5̟ P83TeO+Dy YP;0siPi5P P$IO}NlQ{P7p95y7pR/-K)pČL8Z#d6}/8d9L@8-MǪ˿B'xT&HL\4E9 /|$=5˼xGN%ۉ):ġPT܊-fJR[eSK$5NMl\ MRS(YuR0!]G[; Vb/`ILO4MقtEcW;)0fq{Mn^9h ~-iuϣWKtVPW(5r sX[ Ԛư~uiHёH X 0"Z&Z1Ec=jQQU XUY=RnYuR(ew8=Ze 7(#YX JR=R 0 [3M,NX)T53Ĝ>e'@65GT})LF L9DQM*JdS|Toe3/ F}$%*xG.XYUL[]N+ݲs}h5^Fއ-}1 M(/ =]eM u7:z͈^}%o^N{%ܔոuߋCrպ/p._%N]&ّ(<{ VIH;yY nWS`-*7 ^y,᙭Y3},ے_"Ċ^Ri[1 SۼE\(c\ͭJʵ\ezXHf\R5)C˽@ \E`ߐu N`?^P6WMN7@]`Bl^}dHMVXg$LRGdcd(xG Rx_eH*M:fVge5uO7HU_\`cQZ;jVeeifx~f`$pEY8Of=hc(d-J0fGde_>*XW:dkh8Jbh]:b 3 N,^ISVR4^NbLV玮Yֱ"歬J.g"I+nXH۵01U+уbYP̝Ed@d4ͭ[3ܴV)8Bh$WkN@#@SC>cp KTc`d9_Up7@լ;O:.ޥN=b.FxnJ_?$> N((n֎&>.;B3AT n0PO[W[Pgy5> ^Om~?xm =Y*oX|N΀|GWfkhO8_r0~qJc+(7Q$HJV7>rlr5_3A6'[Z5L^@۳>F=QpvkA?dîCN6kc:O>#Pt8~3؟>wxu}lW\Ⱥ cwnK&oPJ0nN$3ZVxu@/=&ƃu!7ab^$ pzWFivNj<>Q0pl9=[VoyUWh3=icgq r5h$xGHw6`z4(1onww[uq?n/ K xtѾXڶМ-(d>sȥR^Ѐ/D8`ٟT@T)}gUea@oӾPLn_7-,C#1)h_($fVoi&^_=3'svΚ_aw>" `  !r$= ^1$ 9 nWI 8A6^ +xwL~9~nKfʱn:‡W\:_K~P Lx{sSiLx/nA=QS `Zw $—fR+1ʭ+KxBf&p7|^:_ZֱdoǢ֟e)RѨh`D MhCִ@j GezZ4 i?ZrtBr J$%sR0v5L`X"q(78Z^mArR-Bm oys! ^ 7p -MH$La(TxO پBpM'XEa GX1+,a3q x@" 8+-c?+LgY7A\f^Qb'KYd2*xkB>+<`&4 KQfrY|Q:/A i x},hCW`ssb^Ǭh+{c#;%6zov\bэb p37Xo"nޞ'}^i./?!W&mn0#+.`Jp&Z60*Ԣ~A6W7@*փO`|Q^D w"q97!gޤpݴ^V9=>qE[Ѳ7d7";RY$ PIqw6{M8LYQ Ův1͵FYS@|Q>yW<02Gh~5K v}QܺI Esj(ыyG ȠWҭ l@&v`HM+jΛl4R/_U' 䒧*d{~]Mdc^Y_8aPđ]jq]!pM]: c8L1NX/ѓ \!@&MU^T \V=ÈE HTU9͎ha4pa @YV }z@5˔!ČHs%t!]Pm0_)Eـ#G#" =(D8&DTڸMND@(BKI`N!OF@0@02@!H/^@0^#P `o D},Pk /0cN#)5@@;_i` a u)c"Pȟ B tDVY9Y- .VzAE4!#I3F0}_L$`ML@$dFvd6"3(`VN?ׄx"Tz$aa h% %ٞi q=x)bGq9"$*A\ԐȐ48@0R@ P`]JMmD `2@X$8J+1wȟKpa; cpa6F`f`2@x+bUE9&kKdMm gG4m7(jLVe@9_&0@\fL92@mB4aoR_pQs _?$D$Cx@v>'t2@CK "FUYf`gD.$x溠 p&AdF1T8cB o֧sc")mhNJcgph~c|'UVP~?9AA)AFǘQJ e%AV؈HH\Υ (A!T$G~G̐6vyԈ Avj2~'QgleDf]cdKJF7cO7# 4fkD@_RmB#"$^(+eN'/#]p@cm)n(ToukFgO'~s H Dc b5 0(~dK|ov4MA(@*օc%6x(+11y+" 9ijɁZFV!H@Aҁ4l^#Lɚl||Xʺ,WވhCAǛm޼QmyUB#GPW`LP)`@\AٶA۶ĽJDTٚ-տ؟ nʕFI]\b:dA \sޖm @ʁDAhc-D k-@ lݫ=9ܽ /^DEP- XΚnm٦mt,AUXDAxo '-pܮPxְ,t\ 5G<HgIJ9ğY َ/T|ofo.VjK9M,Ro. 0e^ٺ( :!]D0 pb_ReIcAHql=tg/} ?Fά#G֪J́%xy݂',6%'!1Z}H!q#Tm$Co$q34C۱I9ztaAXA+2^A %ز-لq~1#0'j2,^ kAAΆږa M32Z`İ**-@9@)8׋p^2'$!=%2/+.^@vA%B.< 6g6a%pǍ39s,t]C_P,DzUB7_ ;#$22>۲&x%E0@SB4f+gA@~̬x3.HQqaqsA99m HݗRWxH3,_n./XxX#h-$AZ d3 |}T»JZGYst!OݝWIH)jXUs2v Գ>4Gt^ &4XP|݀0lt _q|uU_vfZJ7q&&۱BrvK˲(.C0h&[yyBx3zhw!r2)"{ ['߂&Oy]Bb%{G_m9AbȀ_bp`vN{x@/Dvv%gA+6@Z/΂im?3,g`UN_ɯF[\t @xNw]h xtxg8?iMPĉ݄ fqbzTr}Aͩcៀ'?n4 &>@g L@!P|zї$2TcF2v̐.8L@ +7vt (.Ǒ7PnKIpp@BFذ0AԁEtYruI+6dwvRF2*G-]ݡ2*\Ə7cZ *4co8u9J(~ƍ/d auLAI<`ִɓ%K4jKXpaê4j֮a#BC5ht|JH7 pVիYf^U'qg!@\BiN 0h|L h#6)P% )RB+ 7\Lp,GjTtpѧ6F(7BI)ȩG,ϗ*!R.{PrJ+RAB15j.Rd)(7&4džt%$pd8QhDKP+J̲:ʡ"FVRɱ TEեYsnvǜ I(!SCo+[ͽs̴\"Wz/1R!o?녯kQ%CpzNTE-Sǀ Ho;Xds"uxA@2**_/QJ|rR(ǮUj[XVx*E`7xCyb]H/c@'kV"e Bw@| LTaw T t'%}8Eф!LDp)t~57ymI{MSI漦ZժF<280 I6tb>h)p 8 )^)Z(I/fJe*Og˲$*~`iR3vTWfoڊ2w BƈdzT3h/R y7H.R>aA- (KRxÜ 'Oyh3P'/"!K8/GumZk^"=opgË(<1!MQP/(Cb#c BmQO1RS(>)O\лŶ8e,HQN)}1!RV}pBk/LCŸ!4Q`SC6Gd$#Gvg_0 #>SOfP2{xJG ;)_q WG;Rr?Q n+5A#)p\|Ņ)(1JT]NQ an`F8xU}( O/"!B[>x&au[Bp!)kBPJt׻/yk^JEpK p |7\x︾0 osV6r%<%# 0_GoD'wxB}qz/r.%#5ؿT& Q|WU^r=_++DIm>PIszL9(6 Np/OFȁ =4} a<tnaWP\x:{` 8=VZ:u)h zSlEB.vk 8\lhw=h!']G4IMSӆeT`0QqfDxj@06m@)w\:Usk=·Ѻ\ ϼw9CJ~Jw]kf0My(wqq^g!%u!'6i֧,gC;guh=c Z:6O`/t#01bzz5 9N9 aZkOEN7d 'yž]v$ );OO3z;jrq'L7 /rֳL|{^݊6J'0DYb]WT# FjZѷV:$q6{"؄/nL-O۾D Lr(b > or D@Ym1P:|,LN,C;0  o@ `0`j"Pb 03`V@D(jD2~m\M~>`@|\gcd.QꮼpAp Y" X(ݨ"(Eq2DD6+ⱖh,SXˢǂsPq2&,!|E'YJ(BQHq1C*c(GjVgMV+x vq2gR|fр]]EyQ@"`!-Ҏ R!0,QFR #q"?1d 3,a芎|.*b`48j47`8 -f 30EIn0 pn܀~r;0nrnA 1 mrh(P"+>RDPD vg1B'1(H*2'qrG1:j11 1 2T.~1q &H8c.QIf*@ p1a36d66@:Aq|0 vr0,Or=ߑ`yns :`< V }@_|= ]#< 7gAh!۳9sQ027 `#?2S$'X?1B+0QGUu^WbNQD=MU5+$`/X! *tYRaݓ%+%e]2F,66;K;K {ۀ۰y;[;sۺ[A{m{Ͻ%`#e/ a-[߈MUلM`3.{Yͻ<g;[Ù=9L;7< ;暮+R0nz0%ɯ* !ʩ8}̧ N XKռ,j[N a; ;/NOr*(/Ϟd(é{ k{-Ե%\8L,[p ]ŃA=ԡ;'==A" 4=fMG!v :VT[!884= =w E5GwlmKMOU;,8٥y Xء]䎺/ب=gz]CⅣ4ޮ.[1QIR!*Ovdi.<\ye7|iڡh|jC8^ڮԼ@4MlM2nu߀LҾtھY, <^x483Ch8yq7?>Q6sYso:Bݙ}ɷ|o؂W oqS)TwAŇ17a1~1aM?Z'c_QQ+V@oeqdSsvs%?DM;YOA|k6'=c `a~"92R a/-u8CVDS>ܱf[ K9҅kxd39cN蜡5Bn8_O@/Tx&A%!*R@zlß#*Q}'wK}@DJ}͈i3@Q|t! f0Єn5M hD ,0"P.H j l,?"8ɨ! fPoG?51d$b ~!kmZI⨅Jl#ʔ;D֯-"~Uk/H 9^'+_ [ܑ,S2 x)@^5_#(C6^5M[՜į^%'I+FD SP[Z&2[r %+8v}g] oC%V=v#k%CV.(M|l.)æZc5Cו~͑VG]-t zbD|YjU~8 WRGS@3">4 DC,}-`%5|*]éj?t!%p>{N&+)^ы6~vA^ &A>mMi(KX]f Bc9n'8F|vC;UӃ9e}4y6hǕ@+*^QYGdDұt~t^5sG^=2 FAuFilN4p؏vD[mm3Ja.:sHMw%C,RXШ&K>Z_8^,Nx,%ҒeX,mIgXFگwAg+bW0u{]8VQ[x*I>WCAFKDl<9APĽNA bz5!ى7-Y#$E/dO:a ɠ5(CȞ? վ xB'qBӸ\)*aY9@pn9!Jp/]Ԋg|%/OтԭDa"L뽽;b}д"l勞)~rd! `^Liۨ L.b}H/#7}ne'`Dx}~{ր{"P݁%"~ zFQgR0IW*pvWQP x#{xogTPjL?0}'|h>gH󂮇(ez,8NW$1  1tEGtl/QutX'lt7B0.PpE17USzzf@ o|92p#0' J:c{" y$zr?`o?0/C;x(P p'`:~'ٸTFphyf8qi7dP𐖈?eaݘh:8' |3\"'pP hQ֑&r8` >Ɏzh ((+9֒ >XB25#Pp.,%(Wi:?'|jPeaXeueqtNuT@t<~rul8u<sapN@_fk8 vtl kq'hxud0Vll!#@g~Yx ~F|P^i&!xzPLy1<ҍ@%0+(mǹ{w4#)}Ɯ5+pk 'q?H gxz%P‘x 엟bg5`p`A\t>oףz?wS8 xA"0:YxRZYI4LQʡ49x1y悮7;?X YY1פh4fIh V:U ZZy P3@٣xRo #rmVP`tQ<9= uIQuSb0*y vMw.nr白 h1nrfgv"Qa`Jv <)f*{My٥pP+בfs}๎kQ!fpܢyW:JT|Na]ʡ'0|rVj`YG(p' 0ڡ֒GR"ڮ$g'J i'@&N:sJ/zU!K' 8tT/")*mY6jhWzr oxW}-'k_ @}eg)ɮ#ѨșzjJ{QɁ _Kq@u “> ІZkJO'û;pPyl`lHp1%}py.#n+}G Ĺp E0+. P@ouH4FgU|&$'5/P,W9p4UPU w 7t0y!~k 8[@-<@/~A^ilp& %eC Rg$M K`d Cۧ8Am PxPQ= 2E\#0ȑ  k0UC ]4BbMSTh|jFm֖+pBAm wZ\=7 RBLV7vR H GO=ڤM RlF%Eˢih;~wʍ2L=f #۰ '0ƥ`+tŶ4ڗ``0M˛U ] xUj-ժ@WPn:d@2Yp!_=Z\.lK7]PA4]T7 L5 8$HL ?x' 5pa-Cp͡Y9mBΛfQ00R@Vb\OłH/@\KPPP԰ ru #P mQpQUuQ] Gt@#g,eU E c~^"KHp <yʧ춚p]Pٚ.e  +P[ @ʷ0k0֚.@*? 7+аڴFڇ֞.LA#APXAbܥ ((083s#'յN00 s0S0k -6BӞОBc.a B`է>밽 `[ au* k^ZD[ a~5n9kյ^cJjE#07`3f-* >۠˷`hq$j=8P0Z?T Z`nPִ~ ­P~/J+Ծ TIPzo֣b Պ 1 ~ |,&\qbly Ԡ /rP\;P;QQtTkƏB<"у {V+vNb1ErWjw-"qW)7A}p /ghIE&n֌`E' .p#?Ea%9vcٳVWUQ(APh|Iw>m e~,;o|;I6F(0 | u "npՐ@Zƿ+@xH" +!|Hײ;j)ɤ,f րh\R)3BAQI:P!I10–H2TGآky@$ 27 HRI"| BE(Q(HrFj"=/ )ܓ[BQ`Q<NQGE&p`$SФO=%]ѦTjvDVeU`vB 9Vw *T@4Kc Ac5LC"Z$k m[/p /x[?El qjϵ3 LPXFedYX SY!.2$b9:C"o b=mJ)Oۮ2p*A, ЊjP,2`N(Lߎ^J3$搛 DJ(`ì<zZ Fp5~^p 7/R'i+-``6`A(bXR1;D*֩j9ls6xFpap&@(| /ğ6+h SNPnr@(Ӿ BhA]fҾ~(h5.RⲚSA*TK5€*dAڔX%"]gp͚G²@| q$MHd7&':[ p]dljF>ɬ4CFhV {? 9-f75ɒ $hTӈqSq'zKTƞs Nj`+:ڊ,βA7-o"X". ~Pa@6 %\ `jOD02eʶUo2H`5 -,d`Bp:pAqN$pش*^35N@L``d(|C`ʔ&g ̤)lsWf.C|%6" `qc䀬9QnvjbFe1"oWxH:2OT¿<`#o?60 qP0be>EäS#:T w( u !$YL0f[NȒ N|ȓ= ~8؞mҔy)&y ul3qI@x60L7 D cԢI oڼS4a]Je9ӆg"Ba2Vt47݊T.pGdq@g T@5+dUYdU6}OW[⧗e2_<43'yHt21l 1 v!yƘYb !5W~`(}uC4vGٰ`[)DQ\D&֩d@e\|cofVDT9=4]7}`P]Ίڅ0 SB/_^ K0"#&v L`?(xE_QK{%>1O]U4wYՇ0yٝ%-wvry\SIaXL_NqKAJ!? Ozu q%QP %yP9TA?uވ  mh5‘&=1uL=u˜ :ЉdSD' XD Cف&0uhJ x&I,R\!ӐsWDH@UCsȀqd0Ң' `ON<4ŴIGDHf`CH4Hd:)(0cjH 1 Ȉ9`ZHz:Y"TH;iaH{<G<˻Oks 0<ЃC0N8$Q0Ie ;#o*J=PF8)ίm)C#?() Q9Mp Qw Fy-W])9 ؽ&B A12!\5PEVd`- [ !Q  MF^PK3`0/c7*V]ٞr-uX @[ *XPB&8^ڽeȨ'0d=c`x$͞:*;S$Y{]%O=I $"T-@[z MX,*0a- \AO2$gKYC=Ŭ ^eJYX&ݢ*R_z8D_ _̼"(CT^xX Mg2ߨH!xUu@^8H dSBڪ`eƢ?8 su2քHx^c6ބ`pNȾIbnW5M) c%yb-~r!Wk.#Ȋq3g1(\@p6QhyJ~-9=Y`R{L=; 3$!&Mkx =Y@[EWXZ{2I&r+-ANRϦω2JAc[HT#_'sd@= BaxP]E|_P5v7@A^r;fal1eRj'ᅪb }Iפ AcGZvh1{H eW(OL `yPPӮ/܆2GmMf C]o So޶5kaP a<F"9%8\# 0"б 1Ip`A/0j@P#F e &M_af,,FeTeR*5 уF7jG7߸y1oyU#Gx6ovtJ>zu4[ 9A`Q*FN[EnK(e<.\(iKO.`޿P! 8(_>06܀/7EQ n 6lD7܀~<1? >q~t)A",I:+X'"a P"AAts"`20$.VA]x~fh $y)?,3<|Pj% p .L #t"a@=P?(=hkITV!ޖXkjpbZjeagxdvhzf 'A%^eU"q+ǜsD.yd\p$L&h|Q"i[ykI2Pa4z{W[e`V# |O5CDpP 䴂]VqD$O)e~R0`l$`>}&z3KGw4DLh>O.S"I3VU,V$U#Ѽ!QHZ*6T$VT5~2I,K+@QS7MMO1畲8qfjl-+^:扡-؄Pӡ.x[Z;e"#Y,f2zp)bы"kb9ڈ! ;8iՖP` =: C Vt-K O$% J?~ _@A(a ?FВ̊ "A8@aVb%?KB=eJ2}1`(!3 WMa$ "x@1_b]R#1$D*)G6 ߽d*y(OB4$ub{A;/ fD#bA8T<Ȼu0A Q(b`k82e̻g*Z/lE~ m5[_{1Q= /UA J$9׹]+)Xt_V_"D•E`-kbIRe $P,oK3 0xWi&ވ @$ =a "-$5Se:m8.|,$wKoBV`iAui/HA J |ve+UӢvQX׊8y0JKh6u8jSA1h^ΒQLc&7A :e+{°xEC Wvr^ .Zѳ;~k;֍nni1$ G\hAP02j9@$2g@.z/@^pձ3W 1mhmjZ #dx(Q+?(+̩yuw) =OFwۋx.XKȁD?w;+#p jKG@ӍC>؝V{k(?L Y݁0PAp J H̊ Yق$ZvW ýE 9,OT\@}W<("LĹT #d JD(PaC\aPD C0B VԀ̤ͬpE72Tь"sI$"pEL%JԸ|(V-qAc|4M\]U]lƝ ȅ03P6&բ- āI4fBfb нѹ7zAs-55c3BUb^y,]YA0}DDPHtA"%"T}aI$0-ᡀFT'AxFIŗD`Ќ @ AX$E`n6(C|D<|dH(D䁘DCF |(dEY"u lXfYFZڂQ(!B0@ ~̓D_tVJDTBD_I:,X!l$ l*^T*^ 0:Dl^M(a@ZHҪD :Gy,W!tXB1j50CZpD#U"j)cH+;aP*j*_;8*eQ4jiI/ lf:,% /mDRXe&p8j LLH[^uMhĿur!Ȕ܁0r@B&0MR S$B|k=d}뙜IZXk  4oSW '6|50D nuIKjuՉy$\*RۈDq+谕?RG?ll!@$wa*e2]"is=_%8[<oK@$qpmh*tVQ#k51 HA-EDE* 'DGD7M//Xa/l0\[s͕/bů#h:ϝ/&Ja+B%\Fc}hp'`,tB#tix'Іi@ P(P U(̗ }Ks TN@Q`̪ ĪO G_,Kr!/]hUeOD+<@tqDPC qYsR 68NCtLOwDMueRW@}X YdSu| 8oQu{5u65LO;5J@!K i V˭b=}L~1YsSgGHhΣ [93m).Ȧa37A@qƋ7o$B=2T'!o AF $ Ɇ ./LM0( *@ϒ[´< *&k**(K8N@6yZ;A> K)T-Es"8%R꒴?JsRLQKтS_0Uރ/=.Ntu6 .X‚A?;= +La7].V*3Nkd=kCWAE2-9c}QFCxXeQkbeXē1ԃI,eRC,K$UR#VIlR"3HS7o{ץ0:/*a2o-ߩVu79ZT[z1vϭltճ&8 \[;J}[?0@,&'A(yŃӢ zBAAS-yG)L4cFKQ2$ "$'],!TX.W8Yxi4pp,%% ḍM)Oe>Şy 'H(p#GnP6GgApRJljxIQғ~pKP5j`B0$")K` U6C.< M]jS;ǶD%dtRTFzTUU1,T+U؁P?M@J`>͒d~f_ϩ zТ˵~Jrjfe*kM;!T`49o3T͙z P! bؘH Gߧ O&FQB:c#DDv |3L#0c){[I] s8YmQw>u+}rT Gnճcp "X Ѓjs=5o{"{ tQc q&{~4^yUxeJks;eeڒE\ӫWmGG(`tw߫/#A԰#hG>U.8Ώr]^9ZqF5[\r={hOdX4(DD$OQ ?8\UZ~Mz@9#/#V&fdb`]RЍTrnBdN=$oXNop)0Lt.l:EABm,'@:( rbZ0ئ BGA@,Fws#,/N  /BPvG/Ue-pAN2pj&` }n(ʰeyfsZw^/ wDI'&FHODJOP?Q ҏDF .|fnLo #O^NLoCc mdslt(QꬢO #(t. 1Ϸ0X8P31z"PpioRwQ 1eմl>P_o  2 q %:pv|\O``18nO%cp2!?r^R<2pS@=wԠ{01g:ԏ@OJD⾲DԒRN$``./2n[HJDJ2" Q/*1% RG2ۑ djmdA@"+4K$r՞bT8)O(k 1`',3%1 Yp37s. 9ornbsV5A8\ e %3 7N:18- k3-H8ٺP#5sS;=܆*:S̢zb`O@㉼.px'}7{.V$P2UR:V# ]38t0)O=9њ"h *R+]Q-Qv-7fPt-UTX` ` .Sh@$hvQLbH^j (naJ[*8+ؑ7[% rh K'87z҈ 4cȨ nɎ ԰h\=Q" 4_|`.F% PUK( T@PIOQhPj 4f!/ 7 &URh*THW5SՀȩ ,R̅ZRTX&S>2F3̺^˩"ZZ+Z*f^S5XI򨎪 \c\w>?j3=2[u_J YâPK@T@cTB(8\DEE[~DRd!F}6 nnlb"jŦR*Z*ƚbjiY jJOiV*R{U\67nZn[,55noaa"oZ8! XnIR9S7 ARC6q23s`WuRUrrS /s _w諊W0K˜T_@jBj`7w,ΤRfKn^ pww@xWxHgUdID{uc\Ȭ`L6WKw a`AFAsi4zy`Ofd7)7KEUI(aG(ԭv75:+b0_ x@f8 F6c loae^: TtnV j 5 gq/|*Vvl_kcJ0wBH!bb*tTp`PnXA%S0RE`Z`:s "w@^y 4[cxU8,`%`6`,C\&1 r!lTa E L RY,@G5P]+Nn@ ٛ)H9B΢URP6Γ.Uٞ@25LҸ499m˴ jҚe" t vX's @Apk '+"[bPZ`O9 #lU894Z{ڝ?P@UBڢSPEq ګwPu"'Ca AGI)LR)ƌ5 1ZDa7%[s4u.GJ!6/ T !0µ[gxbpvڝ @,Wz5jYu5 N`4j5#c? B Z,JӾq+!`e 8C5@q\y#CY<2tg,"ǓQ#* P` xI7e'3ǥ9%)\7FZ\#PA#ں-8ڭ<@ƁA&@Pw<'˙kZU&3Rě|`T_o#RϬi`ȼ %6ΝZO<\!\ύPUkbQS2 bAG43Q 0"؏ >a rGEٝ`J{bSX[3IO y#zF{T(Be G;Ez [çEWd69\ u HӾAN4כm5ÚQ\~ 0^$Z}#e5-`2C9*+iU< @C@<}}`Yi^ɗ3)` H#o)n@A35 T5|ﬞ济yf `TI~k󞟹;E95pM?%y>"Y'Sԑ~1Di_l9!Bm*@m؏ * Gu2 } h _}=g:¶ʑt# #t{ڛW,GzE͔):lD X`QTx"dh91J' e z4ВϞj0g (~@yCUW%>"Ҥ_"@OU5I.q#(3R1 H<ҥ3u)_H zu\M@ر\C+C\,Xd(1ץ%dK^>1:rڇ2((fӲex3蛸Ż+{y`6)2]T` z|2)o@Byu݁q-]%RQ$w^e$buR}! Qr 8dԂU[ŅPt:`C("iQI!4,4Ie^vBN@&L0uDIN9X9 z^jAoQI,\h3BoxEM:x GzhnШ#6h\騚Q!gc(~4஁`tZcK/#Mz UKLi^Vs$ I˓=5]3ͼ`1QZQEvڥG$<אƟqZ\q*o+Ւ`-W~F}T%P;$V ?'_X-sX0![AHpACy׿0è89\tP爸!40WI(Lh.zǛo7t@C8܁ ydepY Է҈UL8x8ydkK9ġ[[yss ? :}8P.b ~ ؆{/uCpΤ^YG,}eAFYqƗ{=XrJl~>ܟ!s~J*K%*Yu*~nqKTb ?QO$0_'xOlUh18JpBxPuI# 0VR(eI@2@:,% An@bֺu ιalma37CP AE#,HQc6"H/bPq-kI!EA~4,fx"(Qa ` [(pb,d1% =Tmd1(sBER5uU(_p~F-GML!|%ĀERnL6籌7l ;T7Z˛P>a1˰ls(1'b DtENX:ّZbOC8! *DaLM/H& S$.B +`1Ag7|^ĄZ2$Raj-0 +H *HJ7]- >թpW,_@*PX֞rRCU% O 6ui}clDqȚ|Mbq/XK%@舴US%*& ' <4bD#x[6լBXjҔn1Cu3΀UT`9'>NBZjӍ$%lVK0G*nl@Z~;HTZd?ees6ԑ<"Gdc pF&8$+hg++70 ~,c "!b 5쀓e*"x9g;9dcxD &(؆̏Q&8[硈XZ -!0`+@{_8`0(9j0 -y 2s%~(NW;o7й$I_fcyp TԁClD)08W:myH:l$ԉcYF;j\v<[t:v[{Ўvf+..u{S_ڗ%J8fY,i|@#tK%` X@Ҷ]qgDS~hੂ oEE)/pB c0!Xyl$h%yH~X)6\lWK p p]<ְkz.Su]ZNXT 9[0H3J>`HKFG(b˃"Jxd '|F ݬH &弾 C@BN -Ya5KA} tncFq <ƲI#^8kH~" {_B@v@cvlO J`b2"c~ڤhDD֗Eܗf0m1260 Pis6pOR#(Hb&;jK111X<146"*A#uP3%)65u&(/+X8-8-6oL脂2*J`,0q'{,j'gppYcw'4khY1g)47)n)(szr0s"(*s舉h(sш>tJwu%4PIhx!Q'D^04-Kuv'h$e|<_h{/wv}m}c!4 }4-Lp% h˗k$x(vFȄ&CTzDQ]xgh&2@0DHD6Fz8|(x5Q՗{G|Axd(!GH(|16-X;9!H{r46:w 13=!gQ(Y1 j4Is(VYqe#W-mfYi3V8Ѓ_ A7\]ىB A -FNh!Oh./Q#ZXryK(2dXWwl膑EB|)Iٙ9rh)9g*~shr1I)ssh),r`yYx &eX8R,]Ez!`Ӄ_GiZ5>!-L+&@Tx6Ĩ\a{hcTw 0@`}q}y250 =SPfBjfg s`Eu{DvUb_?u#L@$!})1ؗygAV'4h<* !cKA`#:-AXD0C`Fyٲa(A(q ]o!by#$Xɂon i8n%%riB2D]e v !z*6}&uH"n kr'Z l8jɚ5'JY*Rj(8#4M#a!aIUԩbeH:i40"-r_CB$XZ1"YAk}1DE.7FXvq]8Fѱ!~c_J-O:h`fKAtf0NJD57@JFKgu(*G|䩤*yjQˋ[!QU-DFꐌG;x!ʲG)6j֣e͙a72CtNpf bja9挂;ږ* P"kVh)n :k ໷jrX`Rvǻ9[WRкsZZq6 AZxpq Z佯 sGBUB6 0갊^ EPff1!$HdDF%"Ji aI=!LeU#g61\wgeW %K=I$$Z5eβ/ku^| ՃUD#1CbA¾tI}'ceB&`MAa2ʲF;p4(d00d#{wLD3kHi{$# EL/*cgIyK4^eXaS/ɀPFFt˿|6W1> ̿I,Woa[+TʛZaGȬ̺ TW ̗SңP<ι@uZd-{| QSp , GpYm,Ј YWAZ  !-=Z# w1F,e|y! v QW!HEPșt U G}F=lD JJ{V WqE,?/e\(l2N$y0|imQ`X4f6rzig`=|Cl9`HlPP&PMH%-V 1R+ uʾLLکXtk|<ؤ^-G=ĬdP?0K@c=j9!ɃE}JF*iV֌O`u/VFӳݱ̾7R˾=OPcΛ -WDPGXӱ,08V4]$R\=P?LvK\0Y 0ț @ kX> K@ =s # Ľ#= zr'W8s4wr3ޕR˩.pv,x6GiH&_dAng牭_N[!-ōCԤewDy;F̾J7Dm+-1ax_N.2f\3qwaaaw~.vxN_yz Mgoj!X/`u{h*ӳڤu^u=Ѯ+ ;03F&ei(yp'ec0`$b6oa+8+:w!f _!\6Ey3% 1$o2^kG KS%o',FWO,;[8@/r/r [N[(?`so/( ?/?Q 4z/@` 3^vJApe٥'v>+*R4ibjvXu6g3g]`y`gEn|a`y_wre?!ЮgZo޳{b\YzXԡ7Ү!-<|PuG d5v 3A \fCE`<\C,>XƏ." J!Cm<0PA7ɋ& @6u@Y 4W`n! (ΚuۜqpAS|aߜ%l_q kSR5kWv-;x^~˭[Yml)yS۶/.44oཅbʔ$Ǖ/Ѽ9 ¥K ?}lop卛7zs׮=z:}_{}ԣ J02( ŠyEQJ JyqKy>GXYCQ)(IEbr䇉\z +I'"e"G /ؠ(((ÏzaɮzD1F)vhz`~yRQ'>5'``؀$ JuJf+!qpq$+ B9E\Ҕ [DVSAiGKë(f ֈt6' !fDXh]aU"8u k#Ha > 0 h5R.d6ā@*pd>7ϋ p80 d f0+:8 Bu}H}MѯkiF~WdO5qA+JpŘEuZu(\#σ2hwQhMǸH *2dy \X %-dRqܠtjG1ePCk $9TĀ꿧0`|Ixa% X?HW"u!0<1 N`\-XLF JQM .Y;tZZc31fbV3ڒΖ) ~rpD4"[kRɬHs1s) 2tNS'`:/ `P,X4cEBP2Tb(#LęF5Y*AIQ>dzcSAdJԖ/X̒ڲ %&hC#XǥQ=j@&c)IAzgqVJrlk_W~uDaDc X>AOpp:QehAuPV/Sia-ZsBala{[.- no@[`iQ@ We3KK T+ZRܽ)/1…B{;٦FGednWǽ-Zޮ77mt%[p".wcڬvE/hZB`U(#pk\׿jr=XЕ-|+[1@ WЫؽum&YL^`;ظ2or݇A]@X(~ ,WK|Grv/QdϽ}+eYb| _-lVdi՝|oqxoqvǘNκַRD mJAQ2 X :ka<Ŵ[D ک;ilb(QӸhd^&/z(!0p䲤+灞?Q j 0(+j"#D1Z"-`4A$,ț ELtBh'8*#$H#LHQ471CZD=PCɘC>*9r%L*I, ?;H\,B$l>X2tD=8DR[,;{Db" xH2;qtcGhqsE)3әi\BF\>LA ز/,id'LE3Kp"˲sqLƯ#G 3<'󠍴0KP2Z"d?ν'U .d",[c%\[0 aݝ*ãDs,^ $dRa9ֵ&edMaEε;<e4dND2.^D5cSY7^(Pif@.`bcF:FmBUj^dcfTQat"}NK>[F6` YEat=g&2FO<=HKRZ0Y]sZJ0وn\G-ۆf=hJPz}˓e=JzVC$d .[R``JּGпUU^4ڥN}X臞鎮Vb=Ѕ^X U>4KЃF^bFjܨWh.C^~VZ뛮Jl0F0~l&ix.knk<,.XSEimGx^J[݆mFlG땍ulV]ŮmU~RX4@nڵVkv-Vho6Fl}nlNb#jojo}u=i1>NPJjNpDQliGhpF24nmNh><ﭽhOq>!w񭱍q&%WI PvjӎguUr1q,se's1'CP)8r1϶>rKpF\5胸2ОA>&AqPt/oo b$KGGPDtEOaP,uuPmVV'J5q3/Ю+MBr\/_h+rFj~-ZgĞ,h!p)J7jv@d&uEseWYss[F4r* BHgi'wgr;xVI9$Z*7lFs&J?nG+_s ռV{Nv[Rpr5Ќ/ЀD}Ovgf0ʛItr>lp:x9tQl V'tAFfkujlxA/o'r7PI\7u䆝u&{jXyC2.oz'{~r>zlE JP֍r7Pi֣{4*Jg#}1 /b$MŽ 1z(Kn@f8`G=SFc/*9v9 5R,U1{эıD NbQsaRMjW{N.P2/H,sP3ï^mVGɊدސOCz`N阫н}8qAB6E#䥩WG ŁxuO>&v?dbrZ7:A||Y_xٷW\x4F_|fqTX~ŇVdE݃䞉2FE&EBu&OFumztKeXb.QFu8^wSoWGOK4ŵSٕ|)&^N*DCBDcdiՋD[~}fsqTYZD;դ9$qg,͹Y*ac+]BuUPyH`ZJi^ka}ҫk%k9kX,kݝ'-: N^^+ -"kʆ 츯k\v,[ j{.^`K æ[ok*o"|oX`K.n,Ļl#S[p ̟\.+ ˚/q]k 3ۂt KwsϷ/]jH=Zof(Lq=#"(""I\E-fh"c"$ы8 B4sPC'P09#cNF4Y"UL@촚6jWt4MnRJYdGE=!%y:~NJS%{%P7 *kX(89)I/,a|13.|$,sȔfBC)$&щ\"kGb~3h":M5%*Q̌vCE<ݙQPNx2JI$V$7Rh.QzZZ:&N ؋- T#8UEc!+JZiViJ!8T[dUiM!YS^VFՊI6gUlo4:UQ`]VU3/GqPnFiZ%BZ_[J]Ŗ6Bg޶}'|׾65[4!0>YIɳ0O+%K@ՙ]`Sb>C-N Q#jlW ˍmlLD=5?r#r\dX-Q"d&?=\DehMw|Vvc$yEarXl389a3\c./_Ȝ\('UПŽlg-&2{FKoYrQy:ŬUS8_e3+BOul}k:.&XZ֐r1G:һf6+\e7!;qA_Iڇf=lk{u\j;f}lO+ވDxc7.|e>.M \s8 ޶0`oa0x''('-H&`cNvpm;x>9 {.ɤsO{:Askvϳ;=SS9OYTzщ\{Y{jGsi |͝{󞸴 Kǻ>w-E|${ǏW e{~;mqA6)߾y5˾ɫ7뮘1טZw|W5}gۗs6F8єk#Yʊz#D%iҰ\T%U`I`D\ YA9Uwyyi Y URtjTCD T |TAҊ-Tل kTXΖaXft!f! ak!Ua+3m2v g_[f H TrA`HHxI| RS-" rQ*; No Ҡu;iƱETdH"|eV"H+׉YOIi(؂A%G.A/R"}b~#́8!x"$`_#J5JZMrabqR]cI &05Pl#r69"(0/y?>|Ty@!Rbi IdbCGN,Nr41F}i6eD33щ9){W9f"*e2=}ymPbl>(A#=a0W Q2%Ad'ƣaS^AmE"I$T*TeUdPYeWGV ~@aPA>F(CzTn!XdLQrb~0$`F"B ވ^ٝe^&I_1af|蝦-MfjMȦOf klܔYn &qf9о&!'jܾ]lMuwnMlgp8Px wn&{5v,{._g'ŧ|_vژQ~>jrj-p-˻t~\ԝv艦KRkKhpL5 hn]+h0N͵h(mN.hΎ(x(ܖB)irh3(th X,Ͱ^hi)蹬ii^hՠ$j')q6FLN:̰蜑%i~۴,*V*NX'8[6ZգW IShAXbuăgFT+X ) Z!_2F7Z%ۖu nQ*&RɭVOfD P쐛tJ9EkF^"¿۸k4ŹB/TڽjCHDylFHf`(,mҗƎ쁲vȢ+/fl]^,ʦ|QM, lZx"ejllYy,A ˆxnB,  ƎHæm]4Fâ-b@ ,7a"BLn@Vlfdzn B&AN2In-H(."- l8DF/nTn<]bnKvHn, %N$ڮ禉=,mblDb#Qu+n$F+^Ҙ2nR ʾ_JjZ/lަ {on /1y Dm/4C30cZ..f1:1>`R+Xq1gp{+rqT {U`./:0721$/@CLq"3!CX`/#7~l*$B7;tC2-aY,ùzp2 C7G.;•"{i 3CDsr%B,2,w)ز.D4#C,DX "1> 0)1 w.a!jeT'2.s;ۮD`FqA0=2D3/׆E=q_=1DD?OrCDqEcɲKs5#-4%7O7~0HHACK5l,ko{q,Tk!QOr%i#6aDH X6ZuX-# \.()r=Yr8B,+n\#u8D74gAr2/t ;AcwCtCgˈ o3IJs7C|j85Er:0\tJCGҵIu_X(qrw÷Rvs7r|nbx~Hr}6Fzc^U=lz_^')X\oJSD/mutoX"]o~BtO%볇鋍'[ _k\g0Bk b[0;$gL6Uu'r8o6ƾ5rJ;C6F5`S t<6 zxQ9nNg zCȰ&0˟_7z$+7;iK9cԄu ڜzyfi]W::}-,z:\ަ{?OgLwv- ;+{ ; Ǻh3XzJK:P{ሏߺ{(Ж:{10i\;w{3.Ƒ_ ;{ݙζk96Ør/ir\g0#%|gc+ds,965,s 6w,pB\pw,s(̳|cs/21%`swgB%`3i{=6οF,#dAG}6,;}k94z?;릴ǽ7)z&s e)\G՝*߿O{؝szxzG#:}݋z [{7zC~އܫ;烾\Og&\O7Oͨܳ_c;v-L )g> ;߾< <*Lj?O~o;{_*r5|Ļx޽놬%Gà ' ^Vp`fz2!Y "s"8k[ A֫[K }O>&hW:]#Ȳ`LvcT)Sd+i,XUT=t .J_|yFXz57)Gzc^4vH7F #qϊݸ[e7Zȡ{ߒ <躷)羙ypg²={'^Lb^Gם7b抱KY]q}{x!Wzz~/o~45,6s6ӊ 3|{4ko0yңЛRNJ.NDE9T7o:i tq! 0?JTpAcE+/7&$*&$z.Nd! )*"ˋB*H97nH&>X̍Bw= !R")YxE( )PNR`<: ow @jC:EM%>85UV6pfn_-W`)*bT 32g崵+gy3gy瓄:yI(WN.`ǘ0Gģf鷮1y뫞/FEi;e4Z岦]H> liTۊl42l!2 mW 6? P5#P9S!A ƃ(捊l TTP[#d1P%7%M#(yS55SҔ!Iqb5Qk G2)) +GfXTiG[}?<961O=y~ymW/|inRc<2K^77nPzeΒv`ǤK;5jno_ݶmJzx%K=JFk?^wi Wgwlk=J<{=[/'M]0 x/]q?x i[nY ./|'^۷aC_10uˑ¿ᡍ$K4q}s$ 13Xdu>;+b|ɤ~;R ;Ȣ{iO. !!U/= o͈O @ CϚH ~`bQ떾:J& G$'1 qd QO6BPy-0q08R c *`o0J`18nIQc=`fP_*QN1 Eq?y/$e0Zˑm0 K &6C<1epIP!1 QR"C !ձ!O#% !QAq$ "GE2%%Oq" P0"Db%;1!&'2$a-&#K%  @!%$U*!,e+q,/,5+,r..#-*/r>޲..R2Q2]Q-+3.Q00/s$2!7r47+R- K4'#A&m61 2C*5/, R ϱ"=s%0$6839c޲9I3S:Q3<\4R89s!3S =5Qj`sBH@P*51S<;2S>@_R5?ϐ?r##3T.۰Os: @ q e30As?`PDG1؄p^pX+ oG P|/ʏHoՆl*p4I'4I KEoI48T}TJi'̔]kTS2@tOdOTKCM uBN.EP5˒P QTJ?-tR#5;pS# O/OEJJ68KTwHoV4IN5WOQl|G]GI_5EaMYOQHULIVwJJTVK1 UWw[R-uMu\ɵ\\;5 bH^n_]u] RN_t)vU_Ց`EVobߔJt>+=SdGVd!3 1dW6<4 wvVF֮?,0od˜% RRRkntӎ& 鳨х0H1QQ߷,ԗ\^a󊕣&܏~Ҋފ0}@)W5;(됢vvMᳩWWįeȶΪ//((YZ\e\Āxyz㖦Æ<l馛u\Æ |a's~xϠ~`(衈~aϟzNz=榜v駠i@ꪎ*묳3%+IhgGg&i&{w&Vka-*,҈覫_'\+:_#L ?G,r ^2ld#"Eђ1}A0,4lN`3$`.-I}2{$/m,-F"xX#\wFB?4P5 @$zϞxҪ*h݇ҽw6~ʭꤕ e-WnB ^ ?w+6tNب^.;M<ň%ud|֣u`"ЫU*@=+_ C`0L`2 dT0 1`*#:G8^ JA f 2:L 2PB p o H@"pc\^2 FH DG*`+W?F Js 8c, } =qg.hF#Ql XaLXC}V (饀hA]$ " Mb gt )a،! J x G\,KxP+07U&ҕt,,|f4YR0s+a>TֳHl1.@R x W Dc Pn . 9680+ c:Ġ'0F?M@23Xj`sDO~ @ z T* eC!Jdd̑NM*!Ϯo S@ J|#p W8T p@p@ 4AJъ7J VԨ9 (H@!SH(A"'E:0 pi'O@l3jXxlptA5Dk02Pk U]@D0n+XG"lF. m]wt= ϩ  SշjvC87LaC)vBҖFڝvOSw+RDLWu1  iO0Cvwee]rň!$y":b ,qka\6"bb R;: z[f^v"f6i@S9@QgB@cϜfV9< ZҘ90QU!".t04X*PA4T-ug @>Aft '8ýp,e'^oB 8Zt$ʸ(jYԐJ{̐Rw;C\ф ՑK)zmV92m͉LwyGPVdi9/|* {J:(GJEάd*(\" @0 tVP9Ե`5,P X` [ַ~s=R:, 0f`Wemu.I€A*n~E=9N0HhE|BP=<cE= Z A c *{WW\AxUnĽgP\άJ 1[ SagH cyqQw{uNLox`@ گޒ5/{u^=c0! ϙ`)jp-j} A@tOku[03`` 0 :c栀Zuupewl vE ѰSo )d cho2EFv7Q0XGDUsUz\@ڃ?%q'r m DžinGWM@LOSdp7g%B-1(C4X 6ݧnpRyX 2|R!Qq!2"т D,6C@t l t@ NgP` 8hhU hkU7uS "]ЉV&8$rdw!}`$קYVD+c@ 2&D]@4 S* @GuzwnGb22czSpd/KGha$'OY V!CdF$D@רHR1U3 UH0SPw㈏`C LtLK @@  0;6<Ët P pX ӕ `hPȋ v @)ɘ$KRJPu!TMEtTDmptquPDMPHHJ3d`DwR DP8 KYQDwBhАӷxY]z9|LbqFԏT XU sC >W(g0kQGuZhh\H eEQ؝O%9QV` ciiilp$Y2\52L1"1rOv:<Ob ɓ<%CP2VOPDuMoA( (ڢ;!d`E*c0pS!PUzdl=K$@@FyPJ*š)jabР 0T ]!rUV hb`!0 shc! 3bS9O<T` <Ry 멋Yk@s"" 0VW**q> j =iO2+}4-JKy;n\oCbZ&+C  ЧuFKkS  : 69K> L'$k @a{ë,3ѧ{ѝp3 ]Lja#ֿ%"n {Njȫ kojPE6gdhB0?:Ciz# qu` 4X.G0 q@'zGp2xPGUðoЎY /U/oTM"z0`]0Paq6l{2'2d TAUJR!d,rf|ђ$E0 pJ> (u E{9QÝ:hv zSHGIL; p&A`K HY~ bX>tFbth,DG 4mJG.WSaSd & Fm+t8MBdtSq`xqsc3J9$ TIQ՝SZ[)hY ]q)@˷f΄􆸀@!qeVAr2ěkӎDzUn* `q&p@0PFDV ̆dQ|Q`XPT&C``s0}B3 @g b*0^oaP`]0+3>gC0 Zi3oU dlAٓK~SD m\Cg .eTlM*E@ !%\dA?RlWQ`aڨmc!@ >vu+pAYoqs-V EC3RguXu p"QxM]%@Cڈ2 d}pQOQOڝ^d[ Nݟ$,uM30ɨZ#; 0 FE" vsHQ*̫CۿjRI9$ 40O愕ȣJ ʿ:8Fs,rn/@0szup*&+3j ߩ j sc7Hk8A nMa ^xq*,h<#jʨ<9ª #N ܦ]`Ƃص dNՍ.iʼNNݩOna$ *KmR~.#: _Z$~Pwk ѨBYp탟  *  Byh# N= bQ: !O`V p )==;T_V2Q*8wa HIBK:Xr-B(pQkO~5u!''1Oߗʨn2Ա  {S`#&j'zB<紐]zJ仹Sor 0*˺z?O/6o_o{۾oyk?L.`0j;u>o??˾ѡN4X`*R?ØQ{-~iőBb0]R˙1i޴N<pJ\EETRM>UTU^ŚUV]~D"!AJL Ta\1`Uʨ^BW^HXbu -̀&C3Q`Vf!%˪0cҥMFZj֭]}Xb5nU5gA˱Tˍ"?̐ o< 7{@7 I'BG$DOD5- AfM D2LGJa #B`C#͒PG'2J)$-8Qܺ.KaE=㚚J)D ̢4 3O=O?4PA%PCE4QEeQGtRǞ{ >aB`@& RUWeUW$2I$8K=BW$ ^%XcE6YeeYg5zWk{}(@ .S 6\q3$5Skս6vߵVxP^c7_}c4 0P1}Nt E7Sd8c7c.O3 ЀC2WLF7,X9gw- ?}@ƹG&LPyf8AoL:kb%%޸$tu.Hgl;oY $~&ȻxAV聨>K(.J!7s?=tG'tOG=uWgu_:~˞OnfR ؇'x< `mgSxu{{?Y6]Q!P>N ?~]3RǴx۵0OC`<9D!*K'A Ł /@n&O:B0# 2B 2P&sY2t! _hbz14! eP ʹ DC@K h ł4xxA3 K/glxFe;"N(/%F‘[,ib]CDBѐj,$"00$ $9I$!lԻpR$T2Q0I`<|)$)J,h=hbd09L ,rnxY`4L3)rAv5˩f7nV%愖J)gӞg* (@}3 3*lPThNT45ttV PYQ9ӣiU0i}R]DӶaԊu^:QtDJQQ.8!jPL N0IaAM#ե SdE]GpB4TլgEe{ !9v /wpAuWT`3 ^yElbXPZ%`B9ilf7<]Jjj5< 瀫 *`1UUV k=w;\-S &+T`*8Kɫt]`` \RK n%[ 8jKo|;%* U*ˀwinO9ͿFPmu|"4}X̲A^EtRndDos*=LG~ pp$zn ƙ͚Uqǡ( XWd ?xDtm;.ZPŬjx\.@a.!r̼ywO#A=?%"!Iu٣ c=e?{/ULEѮoϮ..W6G:|H=~{`S֟~0*? B6!\տRb/*#*9[I PP]?ÿ @Kg򿧃)8s{/ܘ0+`tlAq@ީ b;\7 q ̗:lA@$T%LBqPjB!Lɰ )/p$,3D4T3 8!29l-#<ĕ/H@+:@<TP25TDHC508?VXADu!>w(Tث>APQ$34Hہ2ak?1=_k:$OO%L[V.:+]]WȀ (_Yl臦y "."qKZTU єas,bccJ61 _z,!(o+nn-r={^ mn1le)B(BWjw(cPlR* !XN>b~ t:|`XX8y:Z.p$16 %MdR8CB GULY=c1A]W n|T*Cow *:`O0| h .HW8W|.,#XQRz|a q1hU8B\q?d1_am{׃oPqR9,gIH%=s(@c&<BH, %t)CKCab4Oٟua.L>3DBy-:KH]`RgecK jd$Q]89C035I]ID:a9&eKMISY3Y>٥}uwg}5e'xC䡩^z(*jV)\ąwm/A`-P:d؂!xٌ5*$h!GV)?*FX&e! ^9jQAXX>&Bl-HȀ4zw_)6*jI*:ޙc7/zR(Z@u/ <0|0 +0 ;0K<1Xc"ўtb#е1ǣ6Ǧ@Ju4\s*tܖ <͗ gmwTKD"&E4D=E-PWt"M5ѥTҾK6m68=7qwPFG5]7 >8Op8+8;8K>9[~9k9[s:0i^fBș%Jzʱ*J:uh.;=;㿖Q%?;K6+λKIx; 3wCѳ̹C~'9!99޾i99u{ FR NCs4 MfL٧4&;1xC !ug @ֲ/ 8H QFT:p( BZ (*qM0 %:"[(%2A] @0̰p~[&F2f| bgFu|$$#IpVtP 3T-L'9%*SU|%*qQGɥ. da#%ifC L5) )PשNWf* 3Y)-0]6$qCB*_Z ,cLYOv im<,j%{&tf0ƭP!J]R8_B M$zvdR~$$]8uiFi?oC)c69YՁ6rEtx_!oy};Po\ wl suo * D"މC)&>f/@h!.N`Ԙ{%{.9]>r0-w+rs<?9u.|3.P Z Y=AI+hA/enJ&IQ]oyF+.-(Djߔf<_BDP& ?ɫ()gF Oa#&6ݸY xdܙ"}d9D,Ͼ=k+uPSf#XRc=ʷ?qS3M|%N$8A`N 8LL(Is,`M8E!( Dڃ OMP=`<&L f=8o  !%PP҄K 2FPabt )\-!:DJT C2!dum (1h9p_"^!!e !5):_uiub_m Rx\a؟N9B ~+:`032f,]U|aK2`(`tLpOp tQe>&<6c>Ж!>zA1c!P !N$ERxĦclGMHm"GNVAfq"KbXIlMޤ&MdNrPN,Z ӭ3TĥU呔} B %=PhDTHa^ى0 JvDTϘ%ՊDPOYFT^gQ|ݍTQybfYeH`ebIUMrA|R}&^P nM)&llfk~.\+@&x$AHŒ$WtE&s&kB  MdmnGG*PU1m~v r6'{:'PYxGAtPW(ɹQ,ݥepieYDh-hP)KGXHubj CYimX@k-R [B:|S<@L&Ǵ5A-Z䕸TGDt^VlEEImIg{n)GЂe@ozGfpp^fބV( ^o$:y+h݁ MBgw)@Zކwjm.PHlNj&|Auؽ eխWYљ~bdhW2Ӊ`済KrS8auꮲF> iIНfYxh _=TB|P $趩Ek.ZԻZVWDHԞiH |ɽlMTzOV|^ٺIViTW8C#&w)oЃnFdȞip:jQW !ǪlK6'*Wu1t62gu@HD*jm&-sJ'lmjnm$5Tb*gX%^ ;qaGUZJeIق.fNj>.>B: >@C̄GXH\چ,{\\iezVr I eH ]MXHsXbVlX,Y%).Lgp@PݡQ1.)pAź=Lqr(*ꡙogw/kJmp&9"PWo: MI)M]n%w4IDSV~0Z8;45HXi[w#O]k \o`] PM# {IQL!(Jr?;/<'@{xa#vc#<zo;; ߼X,Eh@`Sʛ7AMt6HCw @ỏD5Tf!T)Ü|04~ˉ0 R ßk*rt@ةou5SD\PD[8ìFBٿ<޶!8PՀW_<Ȕa†kTW]h%"W? Yz+*/rW$Ծ;+k$C#(@2%nw8I؆}FeX}\'qXǤeRҫcrAQOi.Me,ҋk/o\m4% :B:<@@p A8 4cF,`HLJ2HTa.D:JReK)K23nEc+Ĩ#HќP!16b+1XiŜ FbXȡF-+fp U]%EA(u@xA.RFDqePr0{Ь)qȄ5KiӧQ1bre6Æكl@敚wiyɔIBAǏ?IC 3R b>}%.\OVea%#@ sREA|䵂H,LCx(ο$⪒lP TP`DF ;NEROХn ÅCcKoA N"CdQJ:[O-K.YK.us%\oFӱ@L %p14hE)KV)jj!*ˇG}*CZ`c9a$I"LkRS0Ƣ獻ZyCT˜ 6j@Ua)4P>e4B G0Ѝ6Xt tB!0CrH$22m6D_}w(#KXaZW6j)82.l4}#)“;¼nR/̔cOpgJ&U%B6N M%| ai0`ޚ따{I~ʳC:f""БLZm{.;yqV̹sclڴ>T/sԝ+*]rCI#xö6#Oj\/}0)+cE;e=n]jhz2 ]Փ ?P- E#Oj 3)R0ču)./j&p  t:j5 kkF̔c0v15"e2#1 $XE8f-Y$ 2E>ڎp$Ե:P*\3IJv HBX\V&fO}JӠ2>Y\(8Qq-Nv8pjk^>p &3a.K\!C':#G . 48鍸@ UQBEn0;Q-e:@%AIzDbe; 3#71&1ob GGQDt"> 1c̓sL0TXѨtkf5245 "x]lǀx dX޵{V$A,fFt2XeP06C%:Q^*t=gddW٤%ye I, rirrhT8˹f 4C`"%n00p4GB循)eM$Y G5f( .XtbHjqNw}ZE8&ybSZm&pNYk 1HB :L.hA.`9  ybyzBJBGXښof@O* x5 -m0F-|ac 0Q0`?=`cLjrW< >..|4072qȈ 뷽<.E/9p~0{@_hbJ].ϙug=<K`0!Lj@ύsYI׻ow?@sdw?4.^Z Z4hg@ᚏpj6,3C"(xr@ؠEfu:1A3vE|B pkVZvC^a[Ӑ~f6`4wc-_< Θȃq :` =avxO(B/wA(t]I,.57PE,b.-CVav+F9\*c&fo䄮nU}fpA* X4 KԣFLfBn&8D{FPK;0 k|lA '*i<* Ip=pLK # i0 *nEu@ZA^a(,#o'Nb饄-B@|axr%VwBϼDѼؠQ/J*#BeP؀ dJؼϗ>FDA OePDm'6 *AhJ`2"F:Wo"}PddB>LfyhB> ʯܨ%a$,*>09$%hll2;&A@`aeebQ%#8`9J楸c F+'y{'p mmkk'L:B)@ d:hKD^'X @".BQ*>0xϼ6ؔ/$z#>%ĉe:|$)%"|ZA^"l`f .)/orD0lA :/GQHY&64('F96975*S{0R?rȥ;bE4IH%&<.!"!M8$` *L,q'&L>~!aB2FqR%?@:rkMJ C0`u0q^jа i<FpxDl#I)wRER &E/KlFOaD XSwQiN;%9Og3aIV׌S؀{@ R~'5hae XTRDE4q~LSH.3ohQ)[;`$Q3L-laa*4&b$RqSR)7R_#b `ƓTj)aFZ;zr2k@;!/2iMp5P >-LqH Yf(b^A7tEGvt  X[T"Nwk-A5B ll#Aw9E)DtU'mSy_m"׬z7a{NG,'n :?z}$+c@NJ@^h6 e($ӏ 2`첕3Oc}u {x}a}~E)x`|3髶JA F ZXR؆ Xqͱwwt؇}W#[79A@k}xWi88|7חs'9@I̡߶Ë8>4\AAC8x8y[tuY$c!x ꒟C+?Yx)9;Uה MXb9+׀« NȖrQ ьէڈFuu*b}̣Y<͙Qpl@KSlض!PM |-,!(t:;nB"TT |28 -4zNB Ԇ>Ŋ BCTKBFLFN|94PkJT@ G9 m.j9//.-J!,V}Y{aF8x i_S,¤lOK5!~86- Q ¤LQ֋f9".xX{s @$BߒѡCtBz`2 U = > as3smK8`͎nB Lsq+ؼ!#cxWÓ<3 !enВj~{C[廊s攡E9A| \EyZϪ[gU?TQ9CB`YР}@W!}%o9  xaBXv/#-'cAfM v6c$ U\qGF U!QG!I`qm!%Jd^KfHe5 "qVM(DEBK!DLRbNI M4ѐ@@HN!W!$)ReN;y1+bLVc)#A' h 1 t_DBD$E pkɔ]iC ^u'%*%9B@TQq:μwj+뮾"1LXaZl)VZVݙvaLg}=_ &x޸B-j0CF.G.<- AS_,4+5Qq4@u'u xf鄲3#Lq"{nJ9fJ'&bg0Ma^fu>wMP bf&@Pd )Qs0$O֍9G?)!@ /?ɿB=0ȱ.ֲ 3δB} 7?b{Uv|~en- [8 `:<6k`(1O*(O`1+ P1H? 4 oZZP$JmA!f&}gO2tD E1E&JSlŧE=cE8 jT#٘71n|cf@-M'!@k#:K|$\CAZLcY:ցO{CVv$$5).Yi0$2 @A!JQ62J6P d)g[znoP&qxFB֡[(2 aQpp2g9 :ÉNqs[x0쉅,'Y N{Y8ѹ! </C=aR̦3iȏtv4dH먀Ԣ_@4@ъ ЇbC: ]D @32K8ґo A Vge*k+D6.T?&ՉUU$$nURejYIHK,9˷u|_ vp%&"xRSl1=(Z/f)xY8v@.!K8dVŲOW rC kX&mn :ן ө^K:Gbf=ja9F`,nf:SRSinHE: GO&$.8U= W͑d9.ʨ5@ Sĺ2ᄠ5kDAa'1PX ("wZ"8K/&m;#wq&}c@8c*o $vjEy%:wt7) . ;=1j?#4}SEB3hv{,,8@sh5"-EvTF!{]s ?$!RF=ssD@vA}F3 ɸoߢq҅1 AAqͱxh+,)weq.Aw26Da&2 N}q:*ہ`q{a'O#E"s1Bt5H.Nً,h5r YDGؐZ 8f.Gw6xtp8p#78"&g:BeXBcIG" g^H8$',0 :HWb:#;S6%i0O4p4tW##e_|lA eP?XD[sD`qGe@8X}BF3[tu @V}Qb:k=eTcF#WTk܊ tj$o~;JpxqJw@`I%9K M4g~SyS Y$}˳ ,Tnht*\r+"L~yOj,(Op`\ .sk?R*״ኳȱ<Ћ =K _0TSq5ҷT˳ CUQ [1,c*S\[21 s" 6l H]\ Q` tM SMU=]rO Z C]]-ɻum]a 2vq!7 J6v;^gD'rA ;sx28/*8b{`>ʇIlp8) x3,Igi>F_C\!0~R} 5_ ʛlW۴ʟV~Aݛ% 't2q+<H/A]*CwoR/^*>M&ldn4ѕ`Hb8S!  @3Oռm4QE$b[MO͊6F+ݖ0ݝ݅?:01t>Nv:xju#rz- MWob#4,7^Հ#Eq  ai dh`X|%`͑y'u!~E ggD";DǟC!} ބS+"hr w_ lPg6 H2iExZ^3v$Hj:9ðg|*`IEpH j*N/l&[)!P k@q%%Vb0iD3RZml=<|Rqݴ'RGW)>|~S9BA~m̊C6 c^ NqCVk$12ewѕ3/[ڇ"W[0̱-D癞oF!2.c!"GW}O4xUWD'0N~R ы/` [ KNJXL0]z $ĢE/2cƌVP<E \"4\đM4͊W>^ g ,X:QI E2Gh5jHdNS.xF]6}PFiS^X G !^SrBiOʪjK4uI0&4`U"z(O 6˜ff˩41fu:z)R scT%zZ2c":(1aӀgcboZ2a! XQeyA?g081C@-҃~fCʩ! }آGR,6[ҾN:뼽Rb( Ŏ(#k ͈K|lr3's 7pojZ ъ"kzȜRp#Y6VR(" [d%)^ h64ظ^O)^0ucaVt6GKXWuFHtљ^{ldWXw9~0wmzP M%WaqB B`=La IXA 9B39g~_;`2Č:@j!iO&JQ:0@ @n=# HvPĝH@ryD\VaO,ka|[%3~<-*.RԄEpUpo{qTJҼWX"qRWd5)h]fK^3SM3:#PtC4P=ϨP$h~S_eҏP G(:tdG  13i  5,v؁tQg/aD;(X8"J?MnG.H-+hUC"ՑX=zUBҧT%kW#a9ىsNNbsOV'ĴX)wםWEIM8{^ MՌk1?T 깦\vW,*+cd( Z^*= 2Kv?kCpkvr'iPSzzQZ)7{4J !AL5J>(o0P23}0h@H %tVB0c Y`*(AR =}" GCA+m=BтVC&dRAث`4#0ZղXJT{ضI'br}֯K?38xU^7=KSݎ<5G >@2A90/0^m5 {do~3"JO|Pa*1L(cc &8/E7u}mm^mo9okO忳NZLʈ !G Q/؏K,W!P_-  (<VxMHLc:4g0a6Fkt#p;<ڋɛ0-@GU" $ɛIIIɚI21Oۋ|JB.A1ԫQ+%s iZPʧ4@# X,@܂l#D{P-ep CDP2E1p)1Ȁ p#L )I"z2y  dZ=\l???8Ûhs?? "NSMQ%,T4N\0V@07xPoFNEPmRN{aNhuX (zNN΍T(7OapPBNG 8A$`a<@uȀa0i@PLNDNP <k(a(GpzD0HNЇ̴7Ѓ PO$E_; @\Q+RVBԃUX(35S4-S=HS7]S56-Sz(eLNp!`.Ae`*lT,uGR\TJR8A%AuRTGTIRS=UV MTOu=̩F 4z`Wh( Pي"2H!"V0[Y[BԂT(+mTQGUF]ZRKTwTxEwSwWtWuT|]WSu*eSWXe =õx1 XX ؗQ\PXXVxj2Gu@Eًى50{$|x4l7X;\UV8X@IZ|t2)aE:exha(6([6O=GXGpv ZHA* !5Y؊XUL1VЪu*(qu\ɭ\ʵ\̝\gX٪Սi&±K4#EJ$=R(K@IIԫ}ݰݮ2N5]E]@Ta]Y,`0P4ޘ]z&^P(>2N ;"CYJjݪ"B_C$D_H*Ib$E$IOO>>Z~u`zЃeg4G ` 6GM(&z8}`f, M``~`a8ZO`[``O`zvH*I*$aaa |F# >[EЃ6v`7~c7~|o, #, dB.a9n΢-Z'bnvc~b'Ed'.^dVc;FGDc eR\cO~c4^e]nRQ6FNOU,Z4vcae$#HiJF/nS^elF6XP6l>oft^gungve_gyel8vfzw~agsn7enh~hhhhhhhhhii.i>iNi^ini~iiiiiiiiijfh,j>jNj46uR~jjVnjjv6]6jjd~jO|jIvRvaTa `]kΨH%=fVHjv뫎k^V~ǎ⯎ȷk&kȞjNN^Ž͆fjʎlN.j#e"`mlf.mf~mndvh6nlnn~nlOvln^Ͷ覇36"T nooN06V~o8LѾ p1_NJ-&p&&p|Jt8qoXqo,HKoN>pPqgo7sW8ofroqMqqfrrpr-738s,7+7*s"p%OŇ8W(X%W8H9GFot I9SrMOHuR/ur-OPWo"(0">0tMs8W[֜WaWQڭ][JYv[:YXgwveWcGPSeggvnvdawe2eϜ:T'DډvJB(v~cw,|~8dHrHgqς, qEcWv7GVjvZׁW׃M3s/O'yO$BC(r/ *ȜbDžHrvmyvP,!0aG8":+V f4X:0$d˳6)6e \zB>Al \Jo T`=CLQ_WG1]: aH bh@ns!CPD"+a B|3|Bt'j<Вz0 /1(/C| HsTgnP Zb\+\Ze,iQeHMiBc7V+tЍn|A)c: gP#y'* hdا:֓WIE摲tckY0(FaVch=?Y yȢ!-[TB$.֮5nx#PKtMjpB0@ C)% ZЍ0h1P^Ћ 0#!!:W6st_ު/PĊk8B1iҠ \AzKHc'(G@A4 !z n 3.Ns>B1V' +VÀ0sWi6Da6Oz3̢Q Bp\_7h7^D26`yY.i+4ˬ?QyxMSM<(AlgF MX9"`EйA4f;Yenp>TPf#{51P*σf>6(Pu>#C %="rB-`=oY3]H#܍ a9| >c,̋aT h@Ă4/ <۴[ XA"O9G0KaΨ@OVpReL=͇e34+##|@38 RJG$@40!-U@ 8A4 0{FI5[ȠIYL qX`MlbmfHCʕ `鈎tf @6Cvՠ490@kNʆ`+ MkpW; M5` xD9eꀂ`fN"!aE5? 1f<.0`XCc2_bq';zS<;N" Ԣ> F|N $,&8\ +4D(>؞;Fhȉ?ű5PtC>ae#8B Z #p .C 2AB tP2 Q %=M@h-(0eM Ch?O ,@B鈮#0, A( tτJN2êЈ8j\(r}a}[GƂ>B5`5||4*0XÞ^[* ?ԽA9yjފpR NԆȆ p&fœML t4 Q/D‚GA+\X=j"Ù 5@AYKm\2 \Uv1n * uC {`\M yu6@sM6[!}f@/0xl8YL> { p;L d:{Px4pKyլQtן#He3臡K:EQ 7.$Qec+@$d6w$ ͬ _h: XC33 wр (S h6MN!uy;Ҕэvu]wt+ݼKIf[6T{Lg['!ט! !v >V#78"q̥;U-8?;,ӭL@h *93("OV3T~,Ws8Ya8<ޱs@A7y( [{uOA42mN͏e6jMyec R֙Y,]剭%$0B A M@TM 0& j7j/HA 1WNHDipՀn>-@?qnZ\HZX D'?攩 $-ffqh; 5b;$ ayy[w>}n. Z'  VC /U`őZLLhkyo2s >jm e?BrRv '0G[cdCއ%:vw^a(A _B 3 `GKv'(~*Q8'`&+ 7EnN XI hu&*Fh)jL9-`#"3@"2N:} h04>`>'B :ݎ ONX''kD+8,'ŮNaN8 V(']oQcK@ֱG,R ./L0yP`@1Lcbt&4 h*+Mn2st&2Mj"S<8řLufsT'5LlЌg9M0 eh P`Ld֙~#5&z45qGQJܢcЅ`rJYR|*oIq o>Ps,"hC=1jAHn68Wr恇6  8=`S< lP"[h@ E Wxd  F M"닞ARC@! Wx W@(5FD2s@@ eE7=m'|p38¬A3n!FlYVI(Fq f_3̢vAmoG@\,N P!6zj%WGUn[*P;P&L r1Q Q((:L>|k-" g/6 aƮBQ:^A`Z EN `TH 𤍬nj&P!HO33ff7`;P:ugFF ǴasH;\tİN჉,p@zy ZRu"(*5R(`* %fD\(BlA#3+HWSf@%B,^xD#"iݎS. vn.Lb XDt  !P9|2A3dʚ`,a"V9ǭ5xO^(P<0!.] SJEoXLX0|Zg{sPV# cR"Ў  @P"f R@!gO7 X` X0[zy7G2 9' z@$B emf|]ElMU(O o *7LfiXɗ2҂չeWfv7I?-- Кؒm:M" Ӑ` X$*J Rc^r|׸/"wҠ ߖTKJ 4a#ʭt tQay'P xEtb `F.az  Ng y k# e0$8eB6nbDFrN,!d>%ZBaF0F!Glau@AFT nϦ ݀"_PT/B:K#" Q8"A`1>ߊ XHb`cX!NQ#H߰ $N99&P+fU$mF`'pbL! jk`CjD ET'RBdVX%3!^烔%m: )OM$b FaBT$;1)C"v'n'K!@m!AbBs&(B½ H5bvIp+Ub+|/b+CiҲ+f7xcV),ph-X+B*.f)FX 2 3 lS102:2938244ߕf@_4t'K`aJ&%"d <^Ëtbv L> <+C'ZAj"#24N^.U2:_;,f3dՋ(V9!9`iGAh t j&6eV[+bu<+K:j#A=ZR_SV2#nz 3TLm,ZTTdhz6aVhMP_34CG`< azFtg`jsS`` $NhIZ8r;zPaEhM@t `k+u=bHz)!$d=CUVh:nbj_7sΧTOqR*g|F,)В-2h-2f66-u,c*pdU+.b.c,Wik`l 0lV1J@33Z3a1zFj^AtA8AABa z(>xG A{NBwl hḘxl#Go fAX^#l:} 9!{gwZGiC`TXO_|::lz%Rp&_ 8mAq` fY` |"Ęw,ြre;'%WƁ "'fT ^a㘘َ* `d"ET$YTHZ ('aDT9_alHO@K&'`Ř^U:7v'xˠw!n ŠGR)_Їg:UdQ!Orđ9% |eZ ꥋAyZH 4(Vw C)u8x+d&ZBRVf/iֺ%WUӒ*8Rffx+/I1(cl(-cЦ[1 1!l ˀ-C{p @C58jb`T!>a BVt٣#gdU8ĨA@{Q$YEF-kyr׷ip_jVYL9 :^E rdJơ:zNO`ؒa,rzUe琊#GuJE2µ\|,޻З{TrUwRgZ.Қg].8ԃfE?x- ,0՟*\pzC ZK tk(2f#22,;2|u:s8VK&\A0* a *@B@^εLr'}\ [y-gΥůѧ..|jT%&A!EчOpy9ϵ^[-(~%-@q:%=yC>.³*'ɕWES5k^8>ap8]&=y>`d]~ y->Gއb/xY).#%;>_|χ-^y|V4[^'Y~ǵ%?A~y)6*mP pV_upAMӎ p%r,b@՚_ja >ʠFq#0]ٌ _t-Ё !!a!. X!擢 0aJgSt$DXА!#Bd.\:|: CY'cD1"+ |&:MK)bBD". /bt#є.:}TCY"m3(GKat**P8:7P:N۔:ڄ@SQzDܑgO5WM₇=UiW9+AB ~ܺװc6I׶gס};m޾xqfl"5rK%$_61 8LFi>Jt.za4fM hF*Ҫ֜A_ e_n"fZX:SY~/c֫ s4뿂.ji  nFvu;rJa`I~E]c!90iA pk|_̡"HL"`D%*Lt"8*FFD*6qN"a(bhDc՘F3Zp" 8 رṿ;яyL4< y9},$H4V#%ՈD3.dFRr2=Bz2hZT%(m[:Q$"M J]L1JU[e.# nzf8_0r~8Nvg<۹vSt<)ySLg>OꓠLBO (C'JъZͨF7юz HGJR$ Jzπ5(@%P}>4m(D9ч39}ӗuC%PizJE*URXIѫrSՋRէ.]My:St*D jӝ2iMOrPkK:VpSxmbX"jmlRĊxEdWJYfnլ^;ڦխzE]q̶d-mAק5m+n++ZVs;Q+Pjs-pKǒenצV.5Z{6*rXֶ̾kj\nW-XWӞ -d+_NEac[TپVnv^u%o~ *wݼNXu0w _l]+z;azOw3O/`:ί-;2V.c.9KZnyk \Wrb6$L0߲n.3-5Yԣ&3L[sF$ >yD4&e6χ&yN2Аd gJ7|tGRSät"gJBGZϋ޳C GCu45Li_ʙ͙/X^^ DK޵}]:կ5jD2l,Wfq[FdmFZխl4e pc7p7WxGgx%.9p 8'nWz 1sz؜¸ͅ:ox89|zycNuzJO:^2wschJ̩İ w{د.t\Ƚt]Y>S >>89ѓv;_8ȟ^9WvnW" /:v; -x+z/yǽ7=y>-r/~k맸_wAa,V,(- x hg/8 A P[0$ F`) Ђ `&7 2>@ r2`>?ePqXpHhHe.ְHF e@`V#(#8 )hFPh lȆP6(p)@ ~2 ǀP Ђ0@`AAZ@ %a-h 4(raAP\N_$͐g`  P'P擉Z 8Y`mXa[ HA\؁  ^ H  /T7@X茳Ȏ腠H8 n48Ap4Phɑ &X+Y+I2! X19  =I+~3EiH(`2I +11.JٔzBޒ'M9hI0 a9 aO2& 3ԐR@XP x77PN0 m V` e 7[_`i/P&!%P%r*yX~臾 L qQx(ehr *P`>p\i idHܸ/20c0e@i\9ę قm 0ci @X[ȕٕ_iɜ0i.*@'` 0 #I-(8ԉ\ ʠNP9$ -#!0` 2 x ڰ ] I * Y(1R')(/3+(}2”2mD1Jzs++C2]z+ff8ȉxeș0dy(RJҁCXFX }ٗԡ[ i @ )!0 Л)hȂʈCP㰇i*1@ 20 ʈ$20e` 'ЛP!BY222`)I9Yz؂ N0Jc0N[@e@_`K (d%A(ʛJ¹ 蠒 (&Qi 2:ɱZ7 ZZ@:Z j^ X# .xl+V2kԂC1AI/{SX悶R31ik/²²// 9ò-#-Z#0"1lA"۴)*;[X ki*7X0wIFH PCQx+P&NB** Kګ*{21 >1*I@P[Y-(eh$ɜY 0YX X ˳$)<)HR ٛ7 ]KJRX R p 2; Л:DxZ:蚱_s:ۨ;+*zQ<0[E{>i/N<ꚅx^HL+&* +(13.'-j3p3~R| 21ɔ\ɖ|a F yY8(y-ά LX̅GjbXM֢͠F<"5R, 7r"' ~{ M7"X2%P"1b$!D؈ؘ\ٖ}٘]( ˜ 5-,գ!+C`7`>7P'N% c8 ɨzo 35}Ь M2!Pp{ c L }J}#ϋY خ' :3. PX/H `7 Oܯ ̕ b{զ PwL0i `[P ;Y\YKj.j z3|Y~@ 1*蚸 ʎ, %b .?y ]X.l膜n3p3}L+ ?zz?/.茌 Ia*.In'릌r/C(-m'NSߙ|r1~ ?g]ɴlAK aY>`e[0\zQ܌Cܮ#W3킠+|B> ʳH,` 99-9pFKO 'e/&gek܉|G!BPiE+%fͲL@fp2Q()?=Ct,ͭ[xK[8m!RBVAʼnJZ, fC ˂3)!C^1nƌIՓPTl6_a6L`ZC}Ut} "/d1+VLڕ%̰xCZL|;Sl['2N1sHUOf嚲%iaQa1Ei+6ޜkW8ܡesۻ?N~bC+{ٙǟ?Ǐ?3$=.k5B($D{ʫ" CjBH)^:1E( ZhF?doGzĢ G!yTPh [^䓪JI-4N,#;H&H,+&#riǜh 'J؉nƉ- c&<lj<*BJ44>$40(.ʨ)J+ %5(BH!e?`M[`p)Q5/,+`5ED <܊m&+T <*K_V01>LKT&lJj>2+l+ aĚ`*p WS@cr/bŶ,HrD0eRPe髏h9go:SkA{y<Ӯtid~^ a>‰]0C ;,t, ,y*qHÃ$2qҥVkT2/Ь/;Q4BK] $-^lᖂT]|ۧp܃-'l\*!!*ItE` TJv`GD]dA9F}K+Ѽ]'7eJ*.0uωpgmюTmBIej<o`Od0~ DK`$ٜK0҅OsQ.6gƐceJ^`ά<;hsV9򍤉T#Z(שZ# gUCMYc_ږԧfm:PGT6}eU][U:խ5WY:KckV: .Pe3nlh+;֖mkp@6]s/־6`flŠ1StLr$ L #T R # !ALTFqn< BfhHe-MD.'KIGRN,Ra"h3rǣ -+Q(`[G%^sgl쪹0=wrZd[Z'WCOKZ{u2I'ugeyr#{|y9.DdaK[ls1ɖ-s.ɱa8_^*lc3kog z}sj=RWR^Q<B'?XZ{6}j+lWwmn>.@?St7v;q{6\ctRႵX-C\.>1乤 1+:/j!ȥ^‚>[X$h2 Xj=1 3Z@ m𕀢 /#4_ 0;k"0+0kb(˨?+21 hBvR^_M@[c/n'BA0Ri?,S'Ÿ RNu !Hl`O,y B, _"!1: ,8ēhBnIJ$a6+J,#Ⱥ}<~?2 H`Cڏܘ؂(,h[hl3ziH "(  z+DJ n b#EO4C*U ϻҨ8Z9M,F[(I0-OŒzuIH HMHpW#8bP'"cP x#yƚgW 'X=S/QӨ1Н@# /8(X-08,%@o&!ax'' :B2Y8 $ T ΋y[irFI,T[$QM 'j`A1(C/UJ(nZ<)lK`S)$Xgl!#Nɼ  ,TX]( Ѓ]b@8m : pXM9 2\E۵_e+qڻ1 =_++ @A - y^ِ Ј$ H+vۜ` `>o8>[%@fTf1͈WI,`I;[}y؇}ygOL:ugn_,$XP=P`hugXLVz0CzBWY9B!=0XMP7ZX%phLr%(qi"P jBP B#XtЧT, 6@A`}/ma(ЄaPP.ZU`V1m("HeuPz뎪ՌNΉU Vz(BYԃ ;q`P.k<g T ¼~aKJd 0:U2aPa aɼ&" XV_nz ޡ)Hl^!nUЃ8 1tHIkCd($1'j54 - SE؇)ۄk@cqJpl`,zkp `ubOpAqS!*+Qvx%qtn˸mzmOpGH7h ga -$jM vVPVȶsC3Gsux'`6d{8uö:d"E+Cs1S8<m z '.v>tx8Nw!>(a6gzx@2PbB U~#M0aH0K[x#\gT+(a(1-@v(I`=pf 3(m20(d[K0vcȆb#z# jaxf1r\Lle|.Pv"k?v"v1M'hC3o\kL=$JvbwXpyK z[8TǞ聕kY<8 +{ñz2ƾpSx.;]baH4o70>{?@+@{0{3@wï@wG@gK7:'?j fÅ607x871 m4wn37qSgk6<|5sIx4?8=; &LjJQR'JpJO0 M !HFM0zؐfX}.+x r +%Y2#[^(3b$!BpD^ ׬Zv9W2>ZeR,^d!62*9Pq \2m4mt"DEl^kW!BŠJ9@,e!g DCGetlS^2 pR% Eh;Z%pҮD LN&,7x A)fEZ)/6k,ڴ׾eЛYYVg%(e|쇥߱[*Urw L`k/Sy!Ij>~(cj8c@keA{H˵ IYgEIA_cj736`)b,1,H#58*/uX@ &0$QJd:3UR%=/Q l2! 0ĘM*NLd:_C`bNd@k:Ji$cyác@0QXN_EW e-=؎-0< '7VFh *CabB% |kjFDt 'I$ /V]-,_%:Y* -T?h&R: M*8$w߶b 5 QZƶa5*r:駿w ~h.nkFo?N>lC 8s2'w:i!?7'&/'9?S7"P"(A95Jb&pLO:AѦLOa BpL"A@IT sMXA )G0 C |6)0#]HT'2 XlxTGA g"3!`P6@^aX=` BBV^0J*4(H`ЀJ/7Ŏq$L('Ù2&QP ݕ¸6|KYPhwmTL&2(C%`Ja& (X8BRU0аH"b|"Z Wt$bv2M%MB[@%! [".i2dH7  h)HQip7n1 Cf@(CU(baq2QE@EEp0a(tShJpafZG!RU L& DX܈- ޭ *X9tu sezCL6jS %36җ㘥BaAb}9EMFCammJS +n'(\9pƵms{ iJ΍,L2d =LΠG@ C B0 60#CA!BD-&ZQFF1APtUſ kD- L5Cp-4c  [l/@'R~hV=J*zڀ(bt"r8ŖYGp,C,"ʆ` oX`a-Y,0S\<[v!B0C +X9`B5яoLb'`IXJ0猍yȘI[hCUEvE=n$>M_b`h'v%zz J Z ' a:` .ր 2`P`gi[lAm'X#͈ 7ʈ:Tѯ~t}Ũl%I 9| E\Yŀ/u @.¹Jv ~D-:@ ->mt+:yU+9^#C",<7^hǬܩS=U:ֳ\J0%So;&s(cR 0&ΠYh2 ̮b2N@& #/ArDŽ3jݗVzA D]6 U*4+5h(8jJ2+d[hKpym¼4YfIvQ?v`!$ ,!`7h `J(YB1\*_Ep.,(`ֈ[z#Ks"Npųͮ>`}jA?  lF3$RdDekL"hCFtQ3(PJe 8ŅE3<C@`'8_DYμh848A8_b4ZL \JA;T)aML@LUbPC`1Ȏ\X& F8ٴ$LE=T:@=(\Bu:$N*ULm0?\9T7L] SfWqBɋCB5XsG# l di5[HV[ Uߔt<iVѹXj/X-#363bmIDWaCOi= `B!:9@ɬ90 8x_nۥI=C)#:* L.e@P8pB r6xNLhCmF=Y3l = A_8q᪠ `!dh d@% T"lAYdŶ<4saQ"Iߣ0K4FM)2ľ8A![$@T `A!4 L$A3\l GHV0GlMD@Cp0$@ʀY4@ 0d r+L_d!&ȃIh(BT2`!T3M@ we7&4"-'\ȨY$'(X=6!L*nqL =t%ҢC'0 :gLB[1rZU-]qY$Nby!p<-ʎkscՆE^ʣ4˲CތC̢%V(S5X@q|l1$3樎2b i i2(Έ9C2++t22PC:PCC+RJXW:ג)+&(*)LBa)8@CWT ^d' !pPPe$_7XK?L7NĀ ,B^N-| 4B#d}ji (Pl6XDChm4K1Z`!4$ &饅cL KĀ001?lA l]A@?6 =80dTNDB BXL!`Z$Zd6m9T 8 C;Ѓ22ЃL4 M9AHA K\fH! ȀuK4bJ P T1܀E;@9$E,z.)Ba95ؘJ!/"\\a-~wfklaC!nºScQX$^,(V)R`Ȣ 6G\C3@2I>I(.,i)&/o"B).~oo/.t3/ .H.]`B0X./@ )H~oJo /."BL_BXd=E P& "tI3@[E3E3A̫V%w4|(JϾ<ADROApC1 CoKkGoX/C3@&DEnT0x_3/[zLɀV%LY'L o8'^CD-?X"\Ey8 f2?'f'\pwGfA$%Gr|,GH(bV>B0H;$GI3q\ieialɼnF3hC#1fpHoOQˈO5TKTOo"V.5i:\ITiL0YG䔦9tx5:ꐲ_XjV VI΀ïl$dcdT$a/wuNR Ђb 0=pBaApC;3j(r K|p86*t"eѤ2B2.YwΨCEJ1p+8FhC;,NDGTAAĮ_2*f B1LL 0 ԃ:X"$Ed7}v@\hwn6 g 1( &"WM34.K4ƤRJfb)(ڔ0 YȀD'\q~.4,䬾F-@o''Ɣ,[!1@;TvlZdAJ $nXmiDI8cieLe乣l}/P;k8k/Ndā|E%@Xs._WGn&J/Xz5...H)[c5Rr̬V:tUZ9&ɖr&ܵ7_I:-5HS-D6_tKLv-D&uɆUL62}MyI~f*1d?4mCAFv=h< NB=-6 hrE@&;k0HZ6pc8ef3X0րlΗ8(Wl3ю3hh_`M4&XAa|B#.Ck@1l1.#-ӴF<фX6-*M,c=-E(3TI\E80` K6GlB@H?$aAq*l:4̄3樴^[M@!Ԡ60N}UU#XVO - &,.~c9)ʡB́d?Vx}(_@o)4V&3dPC!FhaE *4F7F!B.iaJLCl=8xœCjHO7 yФ"EdTve.j (3I0yyl.Z^֬\cͲdhizcR`Yh H GqJÖ-NCծɐ3çm.3ɉ-Yb兢8Pn)VGnh4EFkt 譢G m|ɻ+EEnxSE! ̣ǭouڼyebB]9`PDezjRa~>P.a> ѥFAE^8b0:ma g捹, moka+$urWbc(N| _,@macZL$Ӧvtˀ!ё,bJjƉ4aBH%Nk|IEb N~#@"`=pBj+>)2TKUP-RRIBd[ !E_&DXaII&y,f|,(/*caJj@n KmhA׮lhik̟fh6gcئZkMl-A2!r $1 b}A%Nȥ@&^H.bIbz&Kfe9D{ `G ,0YaIZp2M`(@jnz2Жv(CƺzO| =!Z종z8O#4ҟc^PǴDD`J8`-a!+ tpC֛!|-Ɗ~iKQkOLO /~(i/[@Aahi,,!{Lz6ǚ( ( +cmiC,!:M,%:Q EZJX 3AWyAd>7H7շhlx~qyA"@@=VAE$W=t"0\QB%`0זrf$ 0 @Iɣzx H`%!M(e(A TGUAB~b5qZw$E }lXD?n`I HHrW $hZ8^џ,i  B(Јnu d8,y-ko̒6i ȃ:v.2uK6Ʊ-d!In,:{HM\3/c&7ILQӚ7Y9 u3lyΡi&A {ӝG"p]`"y0[A{G .Q400*`hި_8 6>Sɣ`]p $`1%)tT$1 ( ڀ"Ɨ BzZ8tz3_ЀN$ODȠA BYc@9~сnЎUu qn-"@"WT%O=dxmO[%YyWg%a@(.2ٸݳqnĕ̓ |I,`8X0٦j#a,,$O)+fEnJtvߌ# &Mٲ-y!{~=1BbԪ p$|g +(#FHFA??9&EtƖN;ThK96^02!hlh, v!..!R%(/mNj4N&ΔЬNe|@ >b*:T* "r i beޮδ&|aB-^b0 rp|~< Ga ]1 o(b! n A@, @9 kH(❒1!* X+YbQR΋ƍ4JJ 1n`6ɓF` ?vd*$(ȐF,}Htp`F񬪪hoq_PUpN-fR  2!  gor! r"v#1n`x`/#s#QF$W2$̤EȁpHo kp އ&+@00E o!a'߉-F. }LO'u' ِ a%a4K%& d 4 2i @|bJo#p 0J-تy&#C`/ߊ b1/ɡ8Z!i:CHX16M3 )4`akAHB|eUn*@W|S<.X`$[FÓƱ[౳R%,~4[K|4C\Fi 7'(5߯ 1A'@ ,'rHHH4I*b)b!J˞"I%!J JJ_"nK4ʠa$}LiA`r@e<5ya:hA2@?Z ~d8$E s*/w j n:t~^  @2Z[ڎ\!1TGUoNAP @M*$ĖQ,Dn+A@VUNdXeeVdEVb(` J `gb&ʣ NlEj.!(&2Z2*)πz;1k_.p]&]0.0,OĠ eĩNKIbo[ITd4%:d2"JL),Rf4os%" \ч\3Pq tui!:b!_^QhfFӘ `xJ8!a T Ej-x*U[ |0p8kȤ` Elڨ !Abl%_*K&M5$<i#B`[ͱ j @v PMT[3HLWJF(b `$tU Au)8IƁaOKVu_&) "|N@[TߨH\vZdetVfceXY{4? I'6:j鄾%j-V7G|ea[FjO| -ytޅ>⠅b!Jd4fw#f&okb $ȩp$P>$B)'bs,sw! bf`0ts&Aԍ{%jz*f/ҥ@l:z7*m. ӎ7x9NNEddEkn#4[UiHֱx f@ 8Lf85闇KQ8:xq<1:Y:\GmX**r@^Q F謁bCuάhSpaڢ˗E_8c.`Ve$=xwvPde]!afKfiieb%VbgH!ʎ?b)PU@$4:B@taqޥ2V3NK5zK0jʨU[]# Aj&ȺKGq[[  ́dTb"F9'ԡ"W2b  L$`^,,#B }%g; 5h(6n> Aش U~ZH lI~F#cS6p221-.ZְoċZM`!7&#oU148 Nk2va !hYy/bQeT*&jmw܀{St/:Zv9 {ܯhIެBGd qn4 چOnfs8m~b /o ҨAdX:>B |A  &A,oKв@c輭D_ ֤: E^҈uA M4CX?0)`8[  @\T0gtAŶ !$R)syL"`I97qBoYʦ;"NByaJ^BBJl٬q96 9Cb;^@ ˑж+Up`Ι\Y EPNw 2wCYxсx'A4|AgkT +[4:n> $zƻr[z#fc_X[4Է6>چobREs~ /uJ Ȫ0 +&.*ŒP՗ƨ=L&Xcѧz(~_ZsҖ /  [Hk6PgH.*bEYSAEa 4".|i>L E `NX`B!y|x<4Dh┍f5k%cF'htJdqļxASl bdM!X@\VnPtBzN:\V#"T:' *Bآ/KleF0y@Ԇ b9㩠uQK\+tYB\3D?ypނ 'aw TbF"gʏ(?s?Y7@jPe&ٔ~N=@ 4U(?-դ1ZIaL'EDfJjLpB^ʀ2$c1CXAՂ,#!@V aCHLP 80D'P0@2'9-O@,X 78qNR ,p @ XQa #FAVtp!`&,Y/ ]@ Т b b-q_0!Le)XdD@&Ju_Pi`G D0&PI-PQL%%w!ءA$[1&3&b[|#L1*b @[@bE r# u p c7&@<*sNء # &b TBzXT8$Ȉ8M%CXP,,Cà h `P>@>׀z t@M P*rUk*DpNz^, epy>eP*@ rX-A"$u߂.մ$2PfG  zh [G &RZW 7Z* [ NEI`E= h00ʠyh|=ik$Pu eWg" fMkC+Ӥkܳ g&pRY 5Xd+h='q6H3@$ jzY # & b+љ(l^#%'00Vf` 0&0EГ0 Kal ֔Y|0 W ' LpQt  /`$1)FU;~!* P.3LPƳ< œp%/J X" X jb1Иy]衁w >h_qWt"5!?0~&GNp e@a"Ƙ0qNRQ-2 c'A뗃O} pB & g{%p= 'H { rhP cb T [5 F}a FaR(!$ P|ؑX',G 08JA J}|'qA }qٷa<EG %0Eфwf& PGPe0ϻX|d$by2 , Wg"Pp &D&Ip2;{T.z3Z<a & @'4 RfaXeB/0 b" 0޲$Ǡ .P Y/0 7@ +#&!/ \%,7}qirF0V1>OR [8׭^ Iżwz]`[ +`b)[p3}\s A pIc!'[| `qp JcWRCbBB pI mZ3"/V0VYPE`JV%𢶠0"'ApϐXIX$ ymپW1͌fr ǀ9SIv 3Q" ɱ H1IQ$1,2<െeXXF @d1ة AB , [+{ P%ʠ_QBb B^a҄3,fwB ܆@=p$e fi @BYШ/i(e0&'zXn*,f"M Ag !'&<;kmM% ćkFPpX̆7yL0 M2<ްP\a"W ` g,)> hrzodE, Zٝ}qcܫbl  g?gj[re/Ǚcaa b`C`MC* Hzưs[\Q% | }L@1 @KGKpP,H7[ A JA;;D P >)+^ #PMr/@ Y}YI+D /0+1`Bj XhxZ9&p G |?+Hqm#]U^[pyX yCM4Va%(/b*#*@QuN@ K5xb*<_qWQ",f.XGVPw`'++r >1V0EA'^(,&$ E`=㜐c);=e>vBfd e2"Jg>ڿ9!ºX$ Ó  r!/}I01C|FL& !,^+P\lکq iJ8838v/:*0S> :79 H87P% 8 PJI9SV ` @P<"0<(,/0y%x+a %0$Max^$BsyT'Pt0"70c0"cQ@0 17 `&B { PS#'Q$ ʲLE+1^ĉa :BS5ϧvh E\+ҢbtYyBY̔Uƭ&YB& xH.QpYI͋#/eJ)VԢJf,6Ϛ% BًFlƗܐ:E*"Cg8Hԫm#QfDԯ]~^d(&7I.dQWm/O_RVm2fIeㅓ sfԨՊΗ }QEڴVVe6Ea^@.1^ ҄/+: gR "ŏ IQ `B&9&*kҸ4:B)#l|ᓁIk 5Nbz^Vxa!xP[PLfabI.(y`8<ą\<tLAV-tQFa )E+zϮO*([L)}xa:#Sf Zh,j/N"G5y#;1DPL!wICaBj+srƖl);2FJODO^#mD&ՎIyoCw91AN^(B&]nS+d1"b0jŖ"v(/gVh& oTF:I!٦I=e^؆O5, ,ߖ"cj[IwtѥTƉ]$°0BOJ6;'ƪmN*g-yA@jmF3/+Ŋ1T[ + Է$ r;KT HI30Dۄ~5,|ڽ/|,``fZX,R҆;63ʟbPd Iԩui !s4G\fH.P |M47J*8#X &@ʠLTM EB q+H@ oTǯ^Bh82!(jL9$5I搒1,2 AX! aX+GQsd aGpyԣ!xG?1F ^=JPGa$(|l+ 1W#G` c0H aC PHVabX _R" XAp[#؊;H$ᇑ!L`f_bZ/^=t@gTbp3$T0H#2 ?]`{,?C2 4#%-LH_D0!KG:!L-l)3ֱY) h]DN ۀ2X9#QF9롈#S'gph`C1N`rFG>Ov /I`H?TiFM ~ ʨ*RCCYpv6O,C;J0l{2`X3A*v" " 0FN,&U)וat,8UO$YU`$&xwq"x!3~Sa D;41 yhcQv"pAQ+t&/ PADqLxхS+@<BІ.2ad#(.Ujj[h!8KSB0B&@#&h0H'eteEGRflGK&ё2MRF kqθ =C5)L(eSb>Qz$4 =hC?2уdt"yJHQ̏~ AW='x)}c &* (#q HI@k4 )1NmV 'ZY bE0a< -$Ra )aC =xmQ6d깁{dA$t$ԦV|;~cx `0 B?>~G0v {I=88R"//Pc\v'ӝ!KJ6#[gmry[FKaᤵBHl,71=}na0#/XQ]ʰ,mp1+l(#洪n!ގib݉)p[ 6~\"(BhADؼ0# L ^fl^>{R 400`ٮ o! ΀ Iup|!s6a m 7e@tߢa;,+[Λ ѱ(p˫x(j225M([ 9pҘUh,Ps IRK>s@%Sa Gz&=0aaxB֣Yxk I@*5;=HH4I+@B-R4,1+-P)C1#<2*4s0(( h Z#+it±_fc!D@[@8,ho(?(TgHKuS"PuKhK8?xȈNp(eD "$ f H_O^ R$Pp,0˒]'p! rrpVԂuCbt"#YT(R(#[x ժ" 8 l kOOy +FEuH{NP"(2 ׈% (|چ@l~B #nJBD[N, L'UpZkʘE__(Bx F¹Z>xX,نII簂2ЏwGB&,Kf_ ]̱Mt99Bh+:- b v4ꂳleT_# iD>S؋Hb‚0Hnd>H\zq62|P\Dp fm&"tq _ WCfo.o6oc6_t`of:oo:Js% ,q3 06X>0? B01\lYn4@gN}^U!x Ɛظn۬@ J|'.LMFk[hHMm 1"&,PIаXзT,($讌$6Χ| RHxFqzG  !qvpK ƟȈ>-(hJ(bwxj''nlt[hѝوR*9'"zf觱 }b,C6f>  %7 t;vdtq BS^ }̟P $kaSEETD!yߐǕ}^gbDe ז ]_7G k7oX%B m85Dx-7(xEi#Ǔȓ8x%/IndfOfe^XKB|[G reB"$r0_1vhnV?gp>jYteMtnnEp,XanDVgu~&|}j5C(#__"& 4 iD[ VtbwX*ҁz m/(^Sy3/VlE[Zo@yQ䧄`q Q~^s݅T̳F[p0ނO/݈la_qk+h>oJ{'i.^g][Qb-e+ɶmJl+QVNز5vA#O^bVhCm]5kFYo1b&#%H/A?~|8m5n(i>bRו-_¤yΜ T!R envm ~*0DŽ›6]CZwd9/Iԟf$N6լSR-lگcvݫ[ΐpŇNVx—v֍3o>H-}ZҤJ-ƜtxtA"_~2RM+_"]#-TrK% ^PI ޲ r]% :817Hb$r3 $C ېM Id/lsTF( y>"C;#?BʰIQ :`e.s< DR 'G6Phe'2QQq™3w♊1 w (vBĠ3v.2юd;#54N@7tͦNG.ȃF'N8i;hTU |'އk-ؐ/GRe1$5ٖP"T)(j蠆&ۨ˶8l76ʭ1t8{k /\5xhZK$XqA[Sc/'-$e.]clܱ94<~zM~O7MVҗ(>hKJٚ :Yñ5Yćc?0tawrx/GƑ}?7uηre];>]vEלuC78VP8qc?4S\N gZZх$Q!x"F%7/Oʰ Q!͉ޏϼ36cNCql  dOO$RT'S6$(|NXSWvZlNpD'E" 5+diZpBXr .^Ѩ|~GÌԎMҖKhfa %x%,d3Z:Gay_Q2٢bZf9EN uMԶ[`A׫6B8CQx2 .Ybǿf# c:x]RWSH1Ilb\Is >Uj'UdA2*62*!W)S&')9p qx6J GjR!3?3/C\ca*YN%QHXbPfqޜ1p{gqܩHzӎ>OHǞkrٜ$yS:$u3 ʄ rJ3 oXXI cHibҐ[(ɣQӚ0Ul4{%ꞈ~lY{zQ53{h>UG*! 񐴐GC9ȁw86q ]0fAp؄(P_H1Nh~r:p7+;jy`WhC΀^Wlah 0S#4sQS#aSm @˂L C-Vm^㭍;"4' Fi@0DOCP"o}p9! Fy죱p8x#!(ȼULዩJ`*̝)<%"pC}02 & x$@P{[퇻-?Z@O'vqQ`JE;<`̢XhWl/H-SD8(!z6ZIO1]@pYqjE 2$W ٸMW= @48BU_Q .yR_YW<Ւl䓠d5Lf 4 fO;=e+'.'?2SԨN<_$K/@$m"<|:?mKQ7'$]0I(-iKC_7mzݚᦣQA}Qq xRM U;!Ub1:z_ԎӇ>2@B |Aa&H;;-HU _E `-`Q <Cx¼ MH?X :B^7|F]Ú1Њ-Sp܌l $xA 8 EaA$84 S:t544·  c Aa}5J}"#VW hK-VqEK '~ }EP dD@'Ud6K.'lP~ŜG!\B!Ud*AɇAY-/tihi^>= e8##999c9##+92;#.=<;2@3G||O dB*dAD2hFB5@D;h]@6G$xHHHHI$Kэӯ\ʥNZ<`HWx|$%]B6P<¥ddMyIz Q~Q `- (]L9eC Qzt7$C=ڣCE_ D#a^RG; B mߍ` `J;dxOrJb9B=#Dg,P\O8 &, ~-ĎS.8mC>b exAx pAMA,.PtQPR8)!^RxDn%J#^EL|8-ŜyKXDZE_0h01 H?4^-ɇA&7p ?t$0@::Σ`f>c&=clc>hl掺; > i")!$@I'gyRBFSZD:eP 5!-@_udGKd$H$9))L¤ TQGh^XeGO~H$PUjir;P>@gaATZc)9@d2xC%&^7ʉ̞JL**R⊞0]U$* t-f`:dh$--4 =kQLf ܀-8CTh N*hV8:$@2`&Jb~J K!x6xkr-stƧRPRPLȩxل$| Bz6@TUU|6U",igx44DAKg܀Հ hVVm·e_ZH[~L]rr&18ZhCc9c9)(; ;(^-=׎틞NY?pޓ^u!arБ @pC?T[V[mPb4M|`% ֟$  Eh!i~BFAzA\C15!~ΌU3t IYHVQ+?Cxǁ!NЩ4 r3P*utumdLFlWpIUq1ƠlJrxl}QD;!"x'#.bȱg۩;ttb6*y{m!ЍA3P$=6&[c<=򲣙o|^NL 8L&RDLC#6Dx@p@zt6#8z;I> >ﺆ@fVH{kZ238\,WH4˜R͖|p95D#)|Ҹ`A4 P/T/21e8L)A/:C'̞sO'Au(ypU_.4Wz͡ל-tơaxGMHUCS+u3u=ԃ-w!=APp+kàJ]CF\RuXimW;DdLtʀ 5`ss!~z2=MXOC V xi؂g}>y .P }B&AӴvGklٛ-8 4Έ@e2}*FXF8j۵lͲK 8&yfL1ȐqKEC1ac!J&ۀ'C0"[/t҅Ȋƍl%nT "2HUSҋo 0pm5nL*ƶ$F\ ]Bv:ۊP_EmJ*4(4Pi(4Y&Y9ɛO:9[Yt狦;Rzt"mu^Ʀ~Xܸ1憕b7xS?7ݲ2?+#-h (@-L"zp;$/+l1Ƕ9o| ' y~|1ȓ: nzN&*T%hB A,NӒ,Nbl9 4>YSb+sBj$AZ)4 1.-8SL[-3vԤM7 х#+iǖB.Rit+dTTQTR!uTp- >iڑtRy0ʨ]4HOr89f|)fݖnpery \te`]sy`xu\x=tC!d7$ē,' Ie6"#!dao@΂`M6ky* wܹn&d$f9f譆؊8Zk g1[83Lx~Uv|ucGn#'viR|BH!J~TJ` 6I'2@!0bM ^_1/ZCpîe0m&ʠ6j<‹&p<*4,n7(C[2D,an! h1% Dar n@ Be{h( Ff^UBD^ fLB 4M ҜyZy(wuᡥQ$Hkt \:֌b/ugjY KHCO 2~P(*qUb/ .`PB;_nҸ;D[Ҟ0~,0f1 C zCv;#d| kr ]_/_p4_7hݚd&gAZ]r;²r1O'S7oHYJ1s+c5h7 Yβ8=r]_J2fq9JGauQcҩ:(C92uE%w\`b,v ov/N|oq3"6@ qC(YY؂|1WDHE?dhQe (=g]p~]ĞJ4idIeS[A`tMDoCX2x:ֱn.]Y#aF6ۑδ#ErgB,tcLF1o|(dH(G{0GeI>ru? w3' I1fEi m:G9L`T| GnHa76@ YvGkvdDP|SWqGvnYY-q.HQآ|-_cBZ_ҡ~u7u UD\B;.I}pDHv#dBf`R0o$Ȇ; 0 `(| 81ҕݘ+O3G_di ~2ЭnD{HU0*L#f;B2A_a_U2*Vk o|_eᷨݠ0X!) hbxt͉ ӎ?HcI|} A=v.iF6C:/Cpm,cu&ƪCv:Hcc# <ARHO|A@P` DC4:as0܍j$"hv R>"8`HapPe8A P$d<Ї MLSR6tA7jOX7UFE5~cud@0'W Xx. Yd۸ A|H! hN"bkN r!zqtQ"SvAnP'[qf` $W@4~a( 4/5BhN fFf -$ E‰LTR!CCCz/@gt8/ /0Ǿ)V|! P PQd >T^7kZ !6a.pD%j"&2&nMub jpB~:#J"_J㷶DNoL$^Av6d .+A7+_, CGrB !Q*t#NrnFl"°on` 1 .| M\RD. 0% O1 !0 pJ230\JKbݺX>4 8A jM(7ZUDTbݮJ L 2R着4) }lԂHADAh*FD!%lQ??A!? ʮb@A 㐅:#4 FP5;;PA.pC vgiǒ?>a EgL-t;T~D(`bYqb/|$Hc;cPc C0uH=ŠѣSQ$/BGb6nvDUGnm Oc"o1#}Ly O f<xLZJhihLAN 2#10LL4dzROP3^7Đ0 f5ͮCQX7_%x|~ TV89 Uldv0 Xx#_E|+m#X)'`(D%ZBDdd%yceA@<* ж%,o! ,PF^+@.:nUmQ^J`{!/[Corl >1Eڇ愭&G$jM9B'mʠ2$Ѩcl-.1w0)l2.yNJΧAF>iC[GK۴M[^baV^If{ 8aAAH``W+۹4̹cO3F:oeX9wԛH+{F=`^4C;R!D'Q :#j @GD@cg12@fС 4ASǵ ^ 4A@ n`V%.O^jQA4)/qs22<gqz>{^J `B^@F4Ad`ʀǡ'^\\h.^6erС@^@q@A`G/! |o"# $1q~l^~Sbv@`s!%ao^C#I=. ʪ 0k$+c$K}A! ҭ0@IVh9Iب`AKǻm:%P JHL _})SS4Ҷk-ٚ5CY 揜ɓ&eӵm>?d9`_pRYӍH0O?6PBGIt2@xK\l!Y–ckSN_hz~r.(VE+[FtAf6xdI'ѹǏ/~b@˘3k938#h#G{!ll {AO^hN[oYEve xtLi*ƗVf^ъhYͨTk Ir"ـhH(3 I!@V7d-f] idRKg85P3^JWCVJhhJ1X&b`eB!Ɉ"zKDR;gq?1$ HGR[oI;pN{iC4505ʠ$c  Xuùevz`C3aaN nZ8D ]h/{6]h#7I0:4!$+_:Qq&K<*r VZBMB>(~;ETC` Uĭ-E2dVQl74QI"&t-?Œ0 maBv1N= Fp S؎myqU'B[C#$*Xj@8 ޢXDCW]6@9 800TX#R-]Qx`KSX w>-!x5&uDsO1PAp:0o@ZO%#8GPe B EXP =bC5c}r+`,$Erm2rfg)K Iv1 U.` $& Ű sk1Lsj/Sdlk3c-IrՂC0 \1Y_  M1,Ԉf)8AM5~ V.1Y07(sp"`'%o7+R8v38S]S9'lP Hh PQ?o zc"8u-`;:S`t {A" "I`/y p! #  L wrՃ%z v `"@! +>PU"$G@r*!ZSÀ+x!rt\B2Dl`D.@@2.VN` /mXPK U){7_$_\9_ml0kJ W. ֵO9A5ra#2ED ,Dp:`,?~PaZA =,Z P#D>Jb+΀xi/ )}/ T`QTD2 GpH "zT&Bx Sa/\ p P:0 Gx/ѴGOR0SXK #~PVPp_JVOVCKLuREkшI2l$3IV3҇>0 !G,/N8mMhަ]Cwqn3;d *p `jYy@ U{s.eXuo Ǥ< UJTj<[8 tPF#1P@G@ 0%SP@ ɐ@zr(q:p6Q͠.@ h r0 7p*#ZPhWwl`Tq 0`=2L@T@%`&r @%~PX+| ЬBHBқE D  %. F2,t.ql8 І0_1 90_9p cpc0;37 d,r Hr2 *0X^1 B%c\T]kB 1e I1(P@@D"EBz*(b C g& z ! /p]X £a"! c`]p =Rp0]!&hR)[{Ը8sg6kgL'aF amX4_6+ Xp{{ P `HAQ*m!4)0`NḵGTp,~zc玷y]!}0).@z7 -l,~\i` V`GP }:O5>A p .b>x$!/a2aBRe "I TC9V3e'R22~y =[" r#BHJ-^z,@XRp v eZ*"()U/ţm.Äߣh'ȋ}L66Zн5fuRլ)g'=yƈak-%|kFҥLڨ.]iە'JlN=K*6?*>2-4Ei}YL+8U!| .ԠPvXՆ5k8/e_!97uIVO:q:n(Q[rRTl4=8rYirֵyjI]:ȅ^vݟk?]xұ[r Ǻ{R3ᴈ7FlBΈy^P&bAÖ'E^uR=^DȆ$RI-Ě!>;HM_\e#EiQ_D )$Eh'g0E\D"eg1(sEagĈo6며5\7S0qB6i`~т e*@M=*M^ JS=B>gܪM^8ȺB٤\68f6,I?[Q.M6J eW]p"%B g։"B#J z4!"+$(>!g N$*X؂N!50\-FB3 SDa YːSiH$$\omT|Mdhi~ 'p4j"Bu@4NX3(amŊ"sgm%]w -RRf I+ѿJ%TKb(!1-86&f0m @'Ӽ扬 [J`_>)2^٠^Ǭ 8v8ѥ4ZGN)n#:K`|CkhAY%Ni]fo4"| @ vV!dz0K $s.ta UhBp-qOB6 ."єr=\MӐ|ѣ<Iy($ QA>. ⫄ U?*)!1Ю10Q75DOG(@=3-M<#qfLPD(G ͈ рH^ЀE"/6QaX$UJ\ (P-j1/ [ՊW&M?+&4zBdG%70iI %Q)2 x5W3~iazh]*$'4ֱE F40{5h %/`rD&q刋tX5."L+~0P Q&1 c4Yb0Mbc) ϹcQE?$6*tZ&tb(PQمv@Sp"Eg4@[7REpQdP?bd|YG ցf0+FnvCǮ/,hVwkR^$E3ڊaF=eq ~lGr@ !XC}%xtZBg!hb+ |1t:Cuo E@?j0 Ihy&!lA,yp ya0Ч(, @@VBHUhx#eHD>0!*C|N(Bdچ~0!&5P#Fqc. :DWB@!*CzXf! *BWE~ j*MBG'_ <ZK.&Џq!.#?#J" $P(A a$k05UxB"v *Et`&`z@ӊЂ2~F0.pA4 jqp(Ӭ#GUX8p6*T&c0uBp0qjIY8:Nk]cYBy8%\ YR|. jV%ZϚ -(qK Bu*slKp 8Bz|41pw7ٕ`5>;  bP%mÊd#^[fk<$ Ͱl]D]}źiN[֢6 k^>%gG{Վvn电l]EJF޳,PF```ecA谂?ތKw_mbv<7޸-qpI3LXU_e QA$HF*H>)r7(_-"fz'qF n;# »:1JXBdTD!JV҂ bT,+ȶMk8bk蹞@T@4&Q @ Qn$3suAA*j=*+,hȩ bOؖ#m>v _H5H[!(U(B H(}}X 3y[湅h;(S nzIvۍxjhT&VAa}P8+@K1 \ٕM P;q[هLLqL@Dہ7hEwptlwٛ c;qd;p0 GC3q<;VGGyGVyĄ''70Ȃ$HHr`Ȇ$OC rH#B4HrȻ̻H?ybp]7tH;H?x(=1=&E&&I&E(a ?_d(+8>+ B(FR9KLz`z/BhiL)'0H\ZGI?H=8810D`ATۼFpLn8L,̽[ g/IzăCmXUWHl*NfRc7)Q#1P51͗pc}=*a _H+X8)Iх[nd_A*Iaϸ" R*0 ZeuY0ԛ|\Т @O4^ 49_ʜt Th7I o 7y2ٰPиg ]؆C`~:MxJ蘄%8ݵ 9+mE'pbH߰&:.y ƐD xĔTI'h5a:+q%8~8 Xqbg꾐x#@:0ձ]T+΃Ⱥ+|;Pm l˫vB@Ͷ[?~]I2DCe % '=_'FcKUڳՖQ5$66_X7&5i>1X7y'y1(8.-X U2Bn,Z716-J<ْȋ`HzPcri(0T?LOtѺG d+X_^tvЉb j =؅b謦k:4*H4-(hp 5q.or(^I5v+_X%Wf KH/* %-njP s~h_:};yz-(X۳y|- JݸKvri FQx : i'(uiuPeQPm~ e<.Br]j GR寏Ǜkp;hWQ<.OvGϊ)mHBj0_T@F ZJ` RIlx}"}kI.'YL2 A &s2ֱMn oe0,e3g.'U UU֫GUTiqn]jY\nz]bP Qz kcUH˴TXhΜ U^ -\"눤J:u7&!o[ a"cS?N $ߤ,6aw !BIT˱ةu*x;qNIb*_04+FL']N 3-U'"nEd'Pm!>,:+e77| !5YH#͉jE -d?$`MVE37hu1x''W/%`b1S6Тe35a"ҍq!yM1X5fv )!'}B͑ӎŰWLV`ٸ 94L xcc7Y͠ӌ٨Y^K15TZqıq c4fZHE.JKĴDL6XtZv10`^#SubNdM`ZK1J&:嫻`e#ت-%r4M3q1Ԑ%T]j6_L„IX4D3 xc]s O>T? R |D 4p OAVZӈYUcN/-F'e w%"q]IxwI_}:cQ4}ͽ[E/˂EralkŰI&utn2"C?ŠˆO r۵z*i_Wct~9\ϺwjDG!/XlNG#XcNK#Z.vEƆ JTww/`hG;۩ISRq>ы, B U{HB䐄ON~S &}“Fh8 xa:0ΐ 6.KoE,jF\r#F0 _hC! "9@NEV$bp!fahR7XD tq}/*"1aCC!E! @ry$/~8b &dKjqF*}WrLm '/"Ebf~8B ? Vh)B=JQJ?*@ [/~ $'51  %&P#Wc cpG714fD%nN,f(vvRg`g` < 쓟DPgB-,F"@ 4d7i$?F [B  XZCϑSGG|Crx6~Dа\␅xR.D pCch6 %HA~Jаmd5ِn I+kB.D!2B1o2v9#=:Js:4:588h]BcY.uD,*bB#@S3؂Qmyj0W)cGInIeil6Q?tC/<. 3;C4U},%)+D"WeJ+zֲ19DyIvQRKm&5F#WBN~F0B | N'$<ەX;L9!-kl&AE$pF=bzK^÷?_6"ۍ `!FChG_JB==Njb6 lDS'nJ7Ј8 *8:4&a'H؅/z<#i ]DF3qu3k㬖f"?N;]i\SP WȠ} ~",5qn؛($#\PK0*mD_p3JN|;1xЛ8w_Qkh ,$5/LUYQu[D+*?>os) o h$5Rzc! Z.9[|Di&h., ^YDEr蝔ɨT\F)Nģ@]u\c.[L|]S҅z"QF=aBc1p{EXU/XңkE.3۲=ϔN}FWuy/A 2 b4-4 ?|e OAWrPITq<|l@H,VJch9#jgĠPp:ǰ".됃u{!OV/go %a|>\TQoJT~VVV%vB Cb ]d`G4 iᐱY3О9P'8 $?ifu]j-' BTR% 6O?>TbpK495:G&הXAQ`FO΅mhoJc; ꔻ뮰x6xӸ[ZP61°VGE@AIȲP ʖv $6K%ŵIVƵKh\J乢Jd6bbڐ/g,6P5X,9PHi5`A\]d.Xa%':.(& \- crm{ʠ$d8!@A ,pKYnBi-Ϗ@ Xq`hυ@OiޙbR\@"(:tBcV~DEkt^^T2':J zBwl&JKa>*ݡ~BF O_RC6: MEY`O&HlmZƁܪЄM\16B^A5,i;XN}B * bҐjh< TZK< LDa%7Dy6`h' " SB 5$\LLOn `ޤ^{u~d SnDs=ADkb0ElЏQ;˰D3݂`hQXARE}nF3QdB4-HœBws}|W>_EXtGPND@GPHȈ9\| ĚEIj  &I8қ>c~co<֣ܿ}3{֟/΋|=kC>s=~ۯ|>G\C?c|0h hӿ ?@h8`AM/ L F<"EJ$pcƅZ!G%-6(cA-#rrƋ3oISȒ91݈sbš,]:ѦE3Y$J fŪեAAwb kt*WG5Z&juVl̢Tݨ-|qjDu]#MC6e^U@Xβ<-4idV :GvmۧM,lUU3sNhԞS'/6ض#>[*z[xН.h֡~]zhWa/0=g6V`Ɏ.߰N. .8&.B N{-7 P$6QFG3Jo;9]tPJ̌ j2 E0.,d 2K1ԘL3'E!S"HCNDNhV&C!emjc?lW?نa$H9UX}NGiuR}NTVe5mbo5WbI)%#QzPc# yKs ]5NmCˣe"!;RWq|!_c`/M&P37x;0)D#e)6Db"/U8$$GTd$(2K«]bΉsa/N8J>UC ͥ3k|D(fVKWl*E5M&S@& "hjRT:O*T"H|@BzB (k.ϚRa+$_:QbYI6j]=s+}|BIraJ* !!E=2r]7b#C+hg]ȂC8E$A6*T}#C?{sY<bsOU81!npk~|lt.%Qե'8O(ny"IBqtAkNq/'2Fxc'Gqcc\pL,{FLvd.|'KOB1$"Q8@!6x֠X6nP]Z#%VJ;5 +LtqIV5iMi5f`)hE;㡱>0KU$Đ41dx3'k_*Vq HŴURz՚9zR`ԥn-fL9VcY^ i~=T,  2`&0jR:Ո0I-Xz~ MAeD@ c¹_žyr]ÂX!jF? =!C2VWT*@Pήslpb۳g.hOZ8v2tDنщznb9@CqۏC-C~oKOz2d|at/[l"7!QLlgx1̹l\Y3_mms>X=x%:>1m(0 E,)RQ^| fGbvX,8AWNW)b5ڳSy8c!=ĉRQ/;%xݞ@lVY϶:"ߗN %\źk]Р&*Ravnji\kꮺ>"wNU*oh~R_T?ۯvk^[F˵5ϥ.=ݬp=NW?5AР|R6 iZ'0+-`@M*ֈL/jh(@<0 p01.( 6!  0 p A 7a Ș` Ž6i Ű  n Ԡ  jP+ ދPP p0ppOm ppPlrra n Z*PEN慄!rJJ  뷎˸K a ! ՊaȨpp P E HpP`f T чް = o! q hoOϥPF^E\:M|j6Vr (D-h&+&q&u n'+'[ Hi஥"ժ"c#J^nn$g:MPVaLɿ l 0 pШ L /,djRNؒ  .lNata 35s33;ܡ39Ӟؒ ~ ː AnAd*r! p(qk cA*0 s !0Q+p2lLӔvaS @R63s6mS?  ! 3 pdP6@|!H)S%be ⠱0PEE> `Î直 7 s *6{3@}a (1*i -,Ȩ>SSH26uj!>|1(]J#/|# Cw{ jӊ+$&iԾAՌ*F PQYRRS QRoL{v4T:#3r)xL:l鯺:X G!pV.4Li H/GmչzHWđ* 5tI~! A35]54ȽH%7aq5X1_ॠ<=LJ\]U@,)n P$:)c׳!¬,+PK3jWYb]O> ,dO+a˽| & nv_9HZ <,ϬpN+/8 Vx&g#TIhNd%u}aϾ\"bFHd^A'nʠv΅VH`yhpSGa% _.7zyWXLz`ު)mLwdr\wuxtv+y}b`rmЈWuWZxaLiil܅Nwt,2˶ O>3c۶mxn=O\x)dYU9肥.l^  SʌN kqu8+ K eȷFa5Fk=V8 |Nj(A8G'8 cQ< o{OH|h_fPZ㧬YIp,0q:^TE Ra\j/t."t jA4D/Vb|vHΨVQUU|}]x #̬bX9B+Z>V' 7rwD*~h(Tԙq΅WewGx;y a׾_Wbvū@Xl'k,GgtUI⥈pJ 1V 7i7ct[DYQajЅ8> k )Vv Q- G/ e|& I9誝&q%}ȍʎkxšzJova!Gk9GsVfŽ(Ɯgdk[ HR^%Hˉ؅vTfleTʺ[LrgƲVn#j9c&Velker6 .< M+G<҇ʢꖕʺ$zWhSČvaթү>Ufx!{{4W`zvYlX&U>u/yx@ g  ~wwxFs_tex9 R*5M4;l0PO-B ia!Ҡ>:%*"Pxᢇ&D("g F]DY!O\W(ʗ\6Rhw(\rGʼn_mۇy&:>+Y$Oߌu}+%%=<-}}&`v>26 uv5?S+H > > *InHnygPB7"T^}+`;&6e(EHTM*iGQIq LJ^eV&f J H<OR8T!4"S!׃ȃv#I1˕:,4m؇OKp--d!JI"ha6u|ґ$*q׺md.vhcFg-r>ӔUpHsu<"~8([1]9h.Nh 7c~.1^7v v.tqF.G^`b6y裓NlҷvY4i+,Oxǔ.cPo=밣yN\6(h3B6 $h喑$!wT W U~؆/B?l 70n‘ >!ɠal,O7j;ܡ q:ʑG:YrС%N m[TA!L *֍1wTB;.q(0i`B "Hx ,ȀqHNlR`>̤;5ff @I%,Eb @ )lJKuGel1d]R *P-UE;q~0 irڔ%5QxQK&8&vɅؽpoVӚ&1) X{hѠkc)胶7" d4i(AZbyǍtE/ Ҍ% )@GD( /0[a&4/#vWhxq +XayܯХZO-:iB?ӦNC@[*6NP)5(K|k?cpqjeAY1` ς}e kWn50Md O0'; Hv:ˡ;(]HZ֯ 2.vh!g38ns&CCmb>LDOiȣtVMU)j0f iHI](Y:odڦB܏,t3*2(՝cOWKЊ+DJ i$Q[S:qJW'쳉>g*-C>~EZ&/1 4s3L 9j1 {逘kQlCޔ3 Hc:xe  DDWe3pǔSohjX+~}v.xY4` ?x| w\cA"஬ e;ӛ͛lj[7M:LZv4a>1O|%1Bo|AZ*&AzB"#KZⱨEp1C \Y=c:9Sr'!/9TޫT%OYCT!\B2S$dW=b+.Y-J BXN-6 P:~ifwnNS t3nPS7#oG}caݸ B@=\>|mH&mۜɭy%ڍr,9lF!!$Ҭhqm/>F#ن7"4@b!X"D#7 G-)@JjRo_AUyFiݽ  /Ư OOFu"Sxp$ H-Y5eaJSh&!R9T AP KB0Ctt(! r~~k1 `[skkUKr r`qHVt%K(KK3NXcj9r4DžQ/gbswk/ AG'a3y /Q%DUFDNn[uZ"umr$]]g6v76dCbUcO-1cM#"Trfr{q 88yQ XP iq F#$%x5h{6M$b|6!@X7#Wm$4RxHMT+& XNbfѡe{"zFiU@@yB#8hnY$%zem[aqŃ(}>I-t2 B*3 t3]uc*,C EgzR%$5yt00vF2Z!=0ZLr' Yh` 4`Vv2I~Sp31x0pq2hiHqnƆAepxŠzeP 2.RUfYcjjdqZ)`%('(!}Zg-AnU$-v4uT7;~]Ǜ^w:y-4$w"ndi>ewnQ O5CxFՎ2z%Zih-G!P@FAA[Br8`%g,-gQx' 1Tep'Y|˒"f!M ᦓI_ `L02_2> w_yׂ߰ 3H5+*++3"yYzdz8,`;In=u'(urhVP 3{3",U/ ~5 QѢ2* QKp%($12@gt6CB @>MGGNrtT GYaZVd8sQ4psZny@V@'Z6 *@lj+ hb؈t.62nU܁m^,3 Y(F&-"SHih+0tfZ؇b98!2zh7=yE%*$RO$"Yme鱀ʢhb,S@({y}$20 m 22(1@}r2 ^ӂ~0$EGj]fL* C2P/$p U, ihfy೤c'Cij nIHA:n!r 3B`kp[B ZЅ Ak *>tFAX #Og!7%w.G`s4We2\p(9!qHC'A1 I@b!$|2ga Ӳh$uB!b)K%Y6^tO3 3 >|i0?l:)jT:R+ip9C ]>>8R:sL:ps#eO+y ,p 8C:!\ sĮY<9K7?Ju(>0" Ih 1k@1S  *uL` A $IJ CXsL\?u#ܠ =:b 9Pn%4m!1Hi)Iֹyr>tP̸\?%BBp]9] ( (Bc`v0Kpa3.`I` 3,72T?ו* 01~,rO30rAǙ*,@Л@Hq 7B T$㠼 1sݬȯMH\`  Bۑ$3gPglץ3&cЍ(DY @Uݾe.rUV$FC8Q=I.+=$ /A*%XCr Xr72"l<BPD~3##1ra34Q0RvA;QX: @wr\7@ж-ЊB]/$qzL 10$!㒺)$Dl]ADju3x*hc3USM=\BN.4]!ҊM>^Fc9h-FP[QEotJ5S;"c9{mJ4jWaΔQJUN|ɞȰmW{QTߑ#39]'g4M7Q 1@ 񘒩}ԧq=7 rA׵%jW00h?MIh0Gigg]UaA9NQش@uH\t@Ė3A1D*= |})XP[{ ;sh9j(`e xR;9zǫZЄjoۮq #/AqK:ۜA:va_nMb6.}&3' K-`4A%%ZG@(c1(chsQQ! w9A5tl<30RڕyJ~+B]~QGxbHH.- 86MBy+ϡ<,CD֭KPNI %CHVaO_Q~6&,*]ZB%DKHUĊ]Tz&9s6Ȣ\hY7gm=X߾1(I$#2dbvebTmXUb-K[RM$gZВw^رvl$B-sǥ˒H [|E"7*!EAϙS?&יlدMh&WAN ѫqĈ>E9.j̓;dJ(&J dNɅbic9F PĿA~Yt4ZhjIB;~DkKcqD/%9O#.D/9Qkpqş #ZSE4ל1:}i?kMGW;#,w$DwoZEyF /NCM05}k"X-&rTa%/hXt:*QvWhURăO_!:T)B! E3(@MŽfL%+FЉ*]O@` GaR%H_&À%6 6Űx8;KCJEO z\`,D!aRubȔbuhĤRAd ,ư06IQ$LdIar,R,n*u1ANaMjj;IƞƸ>nQNF#/te;U.yNySLX@\1taMl╂Ӑ2tGT gUj;%)H$5 qM"bRx"YI~֑yZI+=Wr~57f.;- јJ"mMD:霮o8>1P٦ЎIvU"L9GK+'z`c(M]h c,JWVo(z !z>'AЩ@+; cP.44q"yUpI_RG ی3]N6vc _#brE7Z%9o֡,׊Tm\C(DC1}=C@ EOAjfKnѰ&IsD?]wrq$9A Q;'b1DQ84˃9\1L.OxBթ $g"ja ,рqj6_$NFgirE>fL _Gѳ"7xh*?`)t3ц< .MIqgPN{x /)/J&D:՝g#DЎ<0xPP*' 95BrfM*^ElAcfZ8!`{v]CP;vwYV58( =r>|b&r3Rlb싧E]}Y;yM)Vg-E[ #X|n}a ΑISK(m.ҽPݤnN9$iҗKii<&J׬쪃ЇaXa9-vbOsF#JU7)ߏW1u h_ѕ`Oc0{(,h[ȰȚ)B?H o cBXq(x ;8p'0st+hhJy4)҈.雈`sqB2 ء009C 8*!c:<0˰kh$9S1@< 2 ," ;AtsA/0'.ěӺ[H7DſT>K,EI"#(0Em۱K@ 9:65\$XW_I4;D=T;.A ik}]6㏌0Db:(*(0,` T)OC#."qP ɾ R( ? ) j1W"35yhIzG2K!Y7Z2)09BNଙ `A.!Jƛ؆h_fói;Ik˶p,? E8rHJ0M2+0g09 !sq` )Z4X`q|.,QT vh :.AII:aK(cԆ@ƫùb2Q9jDD0#)2K,*< cM/KӦc 1N+뼁F0366zMRHS*@ yNL-1>a\[$_a )l촂F*P٪IzтY :V#ΐhk,ѢְЩ L E$`>*y$8"O9ʅ]yu`3BJ撤"PJJ6$RRíMx i0Pʩ0S-F҂q@ &9  &!Dv׫sTlQO!1=ȡԵ`VVW ~^aǔ|W ~`&5+-h9`M-&8Q-(4[~ *K9HsHʚE 2mCd'>_9 _[w&Ǒ{!nΤg@lyNHU ᑵ-03 '4$ lm6Ze(-vVrXff>MHnh$Э Y$^SZX% X,| tvtpZj*bd"px>Av}saStgʏ7MabZ[i卮akxn TMX~ac*&kۅ}~ g cO> 1 8#zp'Н.]~eѠcM-]=(Q B_X o눕}|- ,^ Mkuߦ)wʼnIػvqs;n{_p<\WhPoo$.' N} ~n^W5Y]:7۷c^GC94 !?hg_A)1|@~G""%23,2SO2iOL:$J!P)IdDbC/~T&C?2 [R7lx9$̖OA AG]tvM1ڐBPadёTm!eщ3/;Ώ?&V{vŨYauƏ[('1ԧ[6d}35`K!5 Sj1P-ڐ9ߙV@ƍkMwMC0dC VG~xaG?e"K545 @2(":t#~"\Д7< ӠW1QWeI&.f:k@wߘ-QUFv{ISd\ɛhg0פftĺVh`m֖~12[nuju&%? /E#"!\g)\X 4VHS]`r䲎q%?\FrDk01=v&1M.4r!nyve2X 'M4L@D:,20NH=G~窱|ANO*?RyC^40)7㩘\IfbAjZ~>lyG۩>'%ף o] 6/ ?B QĠ+17‎-C;cgDz͙%PHXo 8Jp?,csR[kd->YZCq }MNr$ a(!m%3z;] SBU΄CNX:f}(.PA+|nrKd";:Gy <$jN 0p{I1!BL))]23'?&@P!D,`e²37,Grh k CFIpsQ3nicjM;1`fLZlSK8%*1۰E=Im!َ3qnhc8"oM$ҞBS a>|P;H!Tt/ZЂ [`,8QE&GrȚ;#GHg/1f2M$`kŒ6e`?A)1! я~ qOr'%P3 A~ s-0 oȴSN}|#Ԩ;gtQ,F#rQJa[`-hGDL&PK4J#!Iq O?Y$!mXBIA4R:U߈R5nd =:I$rDL@'Y4*'Cp{cEk^ӹ=/XQrp )dαSY~&>~ی46`/#SwX 8xηR' 7 2/Osc Yp" z KQO[Kiݣ6-̄18>it3[39Yb3MotX0e:\ ZP _ UⱍZNe]D؉vrxh?JPεa-W0o&VCls-A/ܽϚ81J?"JV浘UP]D`[g =('`T} He(_ 7{d$(IIȴ5sh$MtVyeT|!8T "HNXp5 &(E 0i!u9B<ġU("EfehHoVsVaJiZ%uBWtYLƣDׁHYJaց9 TĎ Ěӄ}BE#4]̅ݐ,RT8q!)$FH IXҕ"h:Ifܥ ),/-B5AN-uMԯN餠/dg|B'NFіkOPp9/4KY-dAڟMy:8A}LT/|QIG߃G;Z5P3fD#4 [<5.NȝIu]Wu Q5܀ٚM9$A;Te$Q Ў|“\EP)ԑэ=!yT YKL@JkIT"؄PNh$4` pRTliyuVA }=DW a 퍀`?c eiz`f ͉%)zWM N}PX iPgʌ XZ\D#eA#\&mbeIȌ}1Wt&R&hZHAtЦmf6B#fNj} j9|Ab!6$zAbW7}6 BCf]<[@OIO ʂUN dD8 Xȃņ9C$8x$@2xCd@D]) 8%Ҟ:dOlxJYLDKd;LVPTH%O[[Te܂#8$?t b@ƒ@;lB {LV49n ] A $)VdDg#LTV*2O*7/=Ђd>4 2qD6põǵↀuIAkDtDnlmF삵rǻFmpw`++ ^L2iɹތ;kk⫼rC6HlbjöiRq0*E?BBJ_m$, Ń$ a0K,4@;AE,R6CUXuת혠őòa$!T-B2$^+kl5[tHrfz6ٿ9A#DL؄)Kě]*ОR˜TS$&&X-8 :ZfbK>Z^ Ep܆nf.C8%G0H2Wl~1 S?C#ϼ'L?&|i">I[~ [X~R(9EcndI!E[Uȹ+unVF@GȂhSF(INʅL mbt&}([Y<Gd N+"D~4ߦ|kSq0G9 %-Q ,>)pvp&3m0) ?0>EXE?4cN"6Pcxz6D `pD4;E1`GYjʹ$aE&m8Zr#:hجO!—z6TCTtހ8C*(W9CUQ.O!ڛ 9^ix(::,7CIc&|4̴fL/5Pѐ KRVi9IQ lBv[  Y?D!`>N~NpQ B-: 3( B8[p , 044) 󈴄Rczo1Ō Aq("‡ġ.]^'1id;! "0ӍJ}4M1]C Q{ i8t'NF"l}ܴY\VNA2<2(  Cv>A{ B jAB4v!ҰQ*Ҋ-!3el1H#:959R#8BP]P8p||\m59\eUTeb\nmpv!DL ЩrZUڤ-HΩ4 ݬ hҊ*40z+#2Ўo``:$JRXM)'i jj8r\49*A@6,lFgtY#HoÏ NJ书bRB=,6%e"C<DBm$P/h.Ǐi9$pm@~iນ*rGJ:ң->(E[!+$s"p=-o= m=:Xln])]Ga/l!IÊdCя'aO~Nq1r-䦑dd0slLG͊1 "F5{䳛Eqvִ ARP#@ F*"n: 4 [H*PV9* jt~AbZN*`b؋"c yAZ:ƎPxcַCEj[ys ^C%f,?K\T@$& i0D Ra'A!i$'IOXk[G[Qʥը&DZ!Qn2+ `!YC*u}E/T]X @B>X?DEk|i5dFH"4C@r$-,"9\c A`Phsq[z@"tAQ՛S%RL1d+@Aƀ,`8 jB$ltʐ)Gng0G}- .ktzQqsZ @PA t4faX Y2iZ8 u>66/7qɎ ӏO1 J%5kXI4v,h:ӞUD m砊99pbC$b+QӰux[VqdZY2dE;bT|%B< t4";.&P^ȏ1S!5 h@s/*[Tz'SJ/"dS0ũ3A >>6VB2$7dlpêJP8$hEV-U݁"( #*7푏 30*1:U|2PPcZUwHguE )"ʸ}_.FfLhX{f$؛jeȶJ fv-jykϮR*d"npV56Pw2oA U(c':K9HbRk[l6 y.pi+~!癘YAg:Ke/Tn|VU`ṦYkfct+87⤈2^T",DD&neKuw;e)qow'úEOlD4aGE*bhx%O7,oǸQv˰ cMW!?M0G,ȂfmAk! !|~KfAMBC)b`>Nڡ}LF$P~!ZQl{LH3!48J@Z!bhd(Ta@ a)LNJ4F4ԥek oH?]ځ|ǜ&6#:cK&FA{Bm|p]֣D`Jy&i4|!I}I% v !)9$a9`)9Xqr܅c(:Lꢛc6p|>H+XX$8N}6O^VPQ#H6w؈V 2|/T-OC*cFǂOR1 y3^Df!I&ާ ̶` r d'1&0r6X;)W7I+LP(kap D2* +1 C WEUh5dbP N+PENa:zWWIjL0{cb*c4 :O)4:$xb"ZO7y7NE·X gS.!T.R/b9":&>F F&M*{\*DI@"$"Xy"ڳ>d d iBi*"?8$P*3 )cQFhQ8T*8EID!˳T?l7mO4τ Lx2n|>'\ .. ouuA!Y#G+bHeUm.zOjp i4&LLa A64MS!dPP WU`^=p6sA7(W$TMФ?-3B(@\epHX<$t+Cey 7>#$#瞢n fAQhZq \NRB%.U u7fVI&EXDl }Z!}j bp.;Pn/Bo646nTU̱!.*-e?oPX4" g:KmVg{ K \2y`ҍFtDSET"Ouoʫmg.<ua#H/3"oE7xM >dn h*? CniO΄kl\4⦠> 2xD[愂!2 h r r!agw7PrYL3Q&nȲCvK٪}k-RM'.gI+rX {Lw4_C2 U55 YUXSJ+BN$JNWpHmq\ $I >e~Bbe( )B4mL|e]~ae#fs\vy:xg4$8v g62?X:1 %*κeLB8yl!f;tCe+| }aU ?^IٮF~}Ŕ8]GUi+GRWp=0/XР·F&Jmjn`r369q]C ;B%Z 6l#;PyIi*-x ѯ[^nD؅%!pM{M=,|0UF0 0ќ/m] rjX=#`U'78˄FF[[Y03AgGwX8j3sOjִA-R2# B~\ Y%^"lf#kjQdZdTd U aUV6eE"Q1TVV``0V\aW>ZZ66I[L)>)D7jM%DTxe'Ce"s:' qJո EbBb8cr">f()tDfQ;ݦ)lk[k.=?+&3WI{}!OjOH{'KMwoمxԀ iXuZw odٝO V H I 9U½1n@cJDy4T{VOp!;! #j v"TH[n$ gRŹ WI&O4!cKJ kUgwrG2 J6Ag!g"˷JJڜvn>"iJ ?!j05㜮|޲j`22Xn! = 2Ơrৈˬ|TpT`TҐ6g6UM+L+E a6MKpmT 3vDz:(@=RdHXf=:ƹ"Iuk#~˞TSQ{׸H!7Zc 4G+6G"RG.\/#0!J*c?AOrάK@ r(gVd]|lA"ilA{isoquϯ$ϖ2AHdrE9GWYI @&K>aRpT-; ݞrJ }KJ&n7lޅrK`smʦuOP ۩dAf (Nt,/-D/ ,KJFl-gm|׆jbNil͵JKJlѽF,c>!= .Ko"J8 n'_YeP!]+'!O%=":WHr!vZK%a C`Zie`]#BYxZYtFQ \nTJ.Pa6rO&D߱6 iQ42d|C7Wb7U Hq\c1[DDˢEn d+KlWC\ >_ bi$iTr6'ɀsfq^xawvhӈ;l=Dmisb( tA]=!e<1 ^#15Lv5&6R.p 5hA9;6}euɢ|C Dm]{pZmKplXN~Uu#b ej=&{el1$W૰& ^"T :i$q2(*L>2ϳ.D $8L>Ǥe6#" 6ب.*1(m_jeVL GԳ* |"]DttR*rN!Dq_KVaL:T>/U8܀8L/2O3pCCF#lt< 7QYU($JW`(: -Wܰ\TRrxvmz*\7&k6I/- %R/Wz[#s#uSV]?Twiih1ha;O~UK8 >TR.aE?W*[ȏ=':Q׍YfyVzp1K^aT~9Q!cXd4IMjZ PEyԣ}$tsx/HVbgIAx) `K|\5*4 YMlJYБzTsDVsBuOo5CKصfNsyP %(xX=ore ӡ6.etrnU \yDE^EH]ԴS(MM#܎ 5CJD~ u a"\G9LfX7a_+Ӛ2V>멽G4hYKn|#j7JFl\=XI{ `qWOVŻy4m"@z0G;Y|*+ \c Ȃ7Z$u?kZG8$##F-Cs28e.3at%[i-s!1cü]. J=ֵ>EA ї$D|[âIJ~U0,jgLTs \;(po'jt'dnJU6hh/{W|L:jф[4ۀGTc.c' cMؔk1.cU*U0XXeU)?l e)#TDAe%SA&\(pl'S3H uVX)2lP@t%vBU 6@h&ĵ7VBohu[p("vBqVpeXnRhFZhRF4:A:5yr V0ŀP! " lCF?WF=G+c^+א r^H7GB,{t,ϲ,GԒ_`/0 PH,igvvB~@aԋm"\) JzeWeNw0o0)m1MRbx&4LO1rXNG;y8`zzGTT}'ba!zxJΈgbPKxKc((D NP\WhA>yI~h*$I#O|qiiXRC=GWLmRX @GPHu$QkQs6<r&7pli8S?8=AB7:A5B)+]iE4.12 nV"87t'q8>)o(\B'~ q`('N9qp/s8I*!*p)AT70w'"w c 21EߕsE+ 2+ i `,Gw,`. wP @d.` /Ӳ% A*ə034L%7xYfa"a1s5`1*5*э/L_1`L80zNUkMVdd:0JIJT]֌0lADr@c15KX XsR(PCdg68*y@v!C&!>x}) #y'eDq=p#P%@$sy9#:!"$qek[a bTLEXMQ "FruI8qQSpa}mq$E/7驞!| 0>HDdJ=% Z9BhYX0p0 1VAr>p:`ٚڭz ٚ Zj2 %b']%9+@`2E[D<) а  si{B-w4 L0qЭ0&.p` "+0."eR rPz`  gn1 2*٘SLWi)7!7941f6.#@ƶ7 pl;,N N. !14@I @Dei`Ya6h?-N $&4Rꪭz+p zY!Ż>+:QQAŰT:' 2P;SdRHsi [Gpq  h ]yX.+[1 qJ N6Pt,#,pþÄmT"cpQ2Y AbwAB;+`ޚ*6 ATWtj3 g$+ɰ ; i,yt_bv. آxyPĶp-+/{-1h, !߹.NC˯GW3D$y!5s$1V"'122A.ci2-2 =%L9:ʬ,sӀ5RN0촼i&85BdO"wR.E2qih61T فb9 (:#K쯱:˭qCs!#kQU >yxav2γ A G7plJ< [ q7pϥ>)7"/Y::+@a:Y<}K[7Hs'Ao* um{ؚ0(NM։"©{8sN R).7Bw w ]Ią"nHEUs*Fd(ؐؐ +e$ 8pr{,gG30 ! xviڥ-G@."c7& fN 4<݄wN âgJ+O,fG'rxmFx cuSPe e=a=( 4N]eߴHJz0D*VKR&fy5:K % 3=Rg"EBi>G(҅|'~duV ^Sg偕US jvG:6!`BQ*wp@YWzATnF5gU[êEu~#a:u:m|MA/ ^N-fiYS,ng>$Q1h@l UؑQrmoJ*ba-(y'yUv 5 jYց79*S E]~U5^"=WFZ% t _,2/pЉxx,etv_ ڠ칀IOrdoPn Πek1QIQ}#|bhxGgf9 4JΐaXʩO 1 s<~PPPy~eaZ7e,b]4i6Xyo7F$J`sM"{h"Ew/2'~J nn>[AOp:!.tl.MtkDk ]ߠ pP잘M7_tDIr0siڰmo|,jn.m*׾mIl#WEi)DBo6!B &R9JUL5ŻY:ε(^:P_*01YBr‚׶\kv?ڟٖkz+ap+5Nv9qD7'ԫ_?mݹsO[b}~Xu֖JwїۡM[ާ-8U$A/IHUAS$ɅP"%C%D% Dq{6jG4ڡڰ܀#8{%a2!&{N:'1;ָc5%=[E[Sm#~tď64p;Cf?[SRƝc(p"蠃ԺJ'8 =T8+ 4L:'Ld-~䡕H *!+Mtv ;0Q|eVe4 jŖZiHch@dCsUre܅]e\wql/O^*(| (X#(A}h<mOB [`-jJ,Tefv#x'0+j"Zǩ*iR!",b:2RK{vk&X̮֫Ʈifv̨E;LFZg=ނ6p PctȡӦv0ꮂm̜UZQm^컄v^{8#yFXY\APxN9iy = (J*Mµ4kL+Ja#`۱>}zȇ"I%_ ǩۅS2߆X3-^*әS:3~h)-xlpS*+m86)NMN/T %n,d9)1V%0Fm!LRq]`Aȅ0 KHVE|8K%Vj[Vg!HW9]AKsf0r ̐ \`|jEz\ I!oܚ^%ꖻŃ&dh6\2BQ˨Ln;ې'@Iq`$,y9ZDjNS/[`^rplX І2(H0C!BT̀mюzO#7-r5 D5DQj W8L]'S1s|i& 7:p8A-ut;YBCކ>+(zѻѭFQd 8iP?B oԾ\CW8mPJ-|u?VaHzQ<5j|ė#6$+Cb7NxO9- tТBd% oe)Jֳdсf4HT{ ScV'T VB{Xfñfޅ !R T቙cxf&8 T/H"[f\u:b],4B$B]D(˴aP( Qu$ąHB6c" -/B3΃-:Qb)p~*F>SD"")C(=ua+;2EaQx*#^G: s&$ & ]nDw/$c7o0A_i9̑#.0g);I%mh!XŊӱϧcw O~2^ >%JVs)F ЂrkA׾";E -(Jn8nh>$I7} 4  gX"ַm#,hVti^jGn]¯ۮ tB~a˝nǎޘD&x#8+,\ڳ0-Z"ǃEiΪצ.<<8w=%X1_ک zvʾ";&2S*L/ hE :լbΈ$s [1 4jց5kF=g3k jҠEG\K"=SK +V6),mHصSPS5^{(, 9g颒lAk(S~9[k+تC!Z#E :+9ɲ,J]~-,<2~7!*5>#3\7㫾C9&Y?E[Ț1$C248@C8Z,ۅO_pˆ8Іv ѩa#6gɖų0+#L0▧ I;RwQ#y C?BAWDW{q8l8VYۘ? >J`(K%Ɉ& ^0 1A҈> $(^T+7Ak2gFmuTR <ტ)2&I%Ti Q<BH?Y@*]h&:!ڂ|ɗD!xMy8ی8P8ђʼn(?#\Y*!Ă  NG CHDnl8ʢ:ʖl hITe8sQwSx4E $x!EOQ\_(yyh/ v(?cM[PA_X o*Iٰ / J`Ep+/ H&0 O($&pZ ؋mQqrȉɌЌ$Pp/B,i5icA2"`88ؤF V Cjԏ?)}K2[)BHߑ@) i GL.|8:6 !e Y> $ ʹ!QIfhMZhS]ED(A0jElu&iS ҈$ʶ%BM$DJw!?e!M߬4Ꞿ)ʹ6\J]yAN币mXQ=*ڐ!KTEVݢn9<:ϐ͖Hry OTY;E<ңE Zw){ɇGP?hʁ( ,0 %OB&r ㉄FȀ ʃ2)s"YОpuӁTК(-᣼TBȋ@ U}ǃ0)2=+=2 g:!2"хk(AXuB-Mؔ!8,@p iŌRl5kmԵ崽T%RXQN;@<)Ґid S-k5Z-\"kB1K]wm,I5b( NcZ]G}[\ _\zM'L)uM„!tDzMA(7m][<>Q*u $0dQI:IoX3$Yh0PsstY#T|Y?R$ <# iho(NAK Ⱦd,?X&ZZTP%j0S #V] q q gG!)զ+%Q,ڭRPΐPu*41O L®z!TfLZXN9 QJG܅eM:bT:J<)Q.PBK2-{贻\Z_v[1 ,BVfNf]]洰}nؑ{XT݅ˆ3]IPff8gW@a:<@ҁ f^% ?HQ^SUdgAb0"Ð3%fHrQٳ>uQ$Q,bA;O02~@m3?

;1Q(UR&loR l' Jy3(Ru6Mx&(N>(ǿ5 JᓐP8X61E ,0LS|]TBK\Xs"n=C$a%)2(q3!,$^=NTI@ հ)S-jbCNwJqn^` ? ")$jC3vdfmI^Vu܇meaEAI@6\>4FaYrI??#[5$-cI2bIZLAS#D[>b"L8 8T-R^.-bK;7D6O?kbb|#+EmT@*zbzyEzJٝujCM, - :::6 8=VG-ذVmp2l$IZ>Q-ÏOh.rv(hhƤA'p'Mvo in)M:Z6l@(n;2jˬ2 M bLSr%?+5-"OJ9 R%aKU֢Uuw1xp̭p/'`9IFYb` .C'OCg!vxߩ75jc A;ނGnVv;G{psGI8,v,,FO=,B[޶CI)oH Fȃa+ˋDd0d|?bM:sn }R(HnRG驰J.P&p-6ȨQ Z 30 Ȣǽk\l4݋,\vBЂIm~$U:"DrY/C-,(3"*%մ,BNkK * KDfVpNt4 +76'NrilOweVttl,bÊMO,Y]I1,aB^,_x hѡG"U]q8]%ҢdBJR(QaRkibϖ}! J9)Xp@mqIN}ԪiMukϟY{ M0q@=zPY5Wx5`38Z8 4΃:XVTV[$nזZ.u\|OeK9VX5CKS1|6irHj")[ 07䐓Fe2T6i)\j)̙&Ϛp!*sr'*H$91G> j -k.`!&DSM`f$|YSM!I!CUEF0DĺPG#GG iT X|r'S5x7q7Ba" -PP8%lCJ I8=C ŚC JD*eրJ`idS%aBgrM1btaU2r$ք? f\u}B]7{75B!e1WuL7`AgZ$BGHy!ZJ&$>C2[lF[mݖ$7:9a_Ebs+%4dHdűV.h[.w }F{·M;`S>kTOSJm$g1DSW]d,V=TM'?|ŗI$Kqs9W*8pt(!+1iaja[MKf1Ic%? jT#! P4ea4 8E.!I{rG3L0q?*F1ᯕT%0Rn&GrK*@=D>CUD,❒$bpDD;4 V@d -n2H4|('z NE\֑TxkI!D#qPubڞ  (II~~C. ,U '@@Έ fyͬP +(A Ü8uCBb ^;K~_L^/K-&yh&Oœ6A~PE P*'-I t84G{'/R%!bS)TN,&7=D[1πJ( rLq*N@ "ʏ0_f0*LV#c>7Q6s{v眹av{ev&f au\tng:b)svW,F ׁ/0g'AGvi,_$ʸskJs"S8@ܜÌ!i{1g:Iߙ\ uڥwukښԨBxD3U\G!ș$:!}mg;Z`>\ Ub9F?PͶlJ+oZD3yi_CbDkp$!lå%E,т $F[JGĨ7ipl2a" M\iݝ`]DYըƏU|Cr]A5o!} 7#9_:JR\cاQ롑&aVHH$HG|w>([(h,h(xC?T>02?x)?l˜)>l&Ø)-p( tx (")LDeE8ļK=$(*P$j<,*`8C;8::E^PTKQG9Yʽʬ\΋c\6 PELÿh*Aa$) dG*hOE(a/6COAV/'݀dЈ,hYeǤŨaaBL_XPLQNG@6xƌv e`WaiBX,[$I|I$3n##  |(kvXEkN{a~(xEʬONh4 [YI(r[8膤Ҋǀ,E\r,_H hx(hL:+I֜Kp'኉~(hA!H!Z)Vi)&>i~.>.e?\V GʗiZ S~j@(7J*փvW*l5xTͮLΫO@ӊV ^bDlDC̋h$ĆİfH"E-"u Lp&Gb)13(d)1/sbnDUfq)gi [wΠRSn '$ŁHȉj\\Npfi>!SLfC*x NW.8*( ΨhJOKLׂQF·%6$r*,Q!KO]wOY?u.1]1h*Sf{`lVrTC /IC BԡK-r/ǎZh}sIپ dCI4^rTdChW|0WF'!,Q`o,rLp }142e'#ٶ#NUDULgCN,9G_|RJT\+dLX#;)\6eSVCHAFpU;q7/qqgMٲNpϭ,`LF vNn`RiLpQL„7 uJhVm}U~WC' lT vs5uN1Me]&)Oux&c1Q5]5vs (UItڍI$rXqSbA|6~eH2:b8SQPk[%&ez7uh<ޔmЄ`tlc4oB7߬ UO;Udi- jO;}qbw[!7/fM.Lh\7B9ݤWMs12BlC;)Dw*O|롻L+7a~``/q FUdc@GumQ+{(qX'ACV Vz0z!c!xz`H qQDL-7ADʱtL#`۾S A54 G%*9yR `J/L"9d*bYVbp oR8'~csfpl@&Xc#k>GNA1e0:ly:kBWЈH#~ fPE\,)IKj)1ƘđolÝ" P,DSFߵOs϶ /KCD[࿎y;3@:$@ ¡}*T UW ߾ qc%.th$F6M_J v*6Us\̙sd#G| ?#NliFV3tT:k+-N:vg˶S2m?u.b-f؍FVhEpvISUP)&ȼHkd ,+'wq+%F,i B?zQ?x$k Kj*йJΪjFf*=љjN=+3QՊ( Iۺ+/+n&{MeT:iAg SqIxS4<%Ye=lIWQvU" P$H0-XE)aW_bBHiḌ=$hWeR7"*""#6H}mèo Z"Z"k(۩#TIJxYO"!QE\VtD$7-loH$%y .]TB&e,#ĘF4QLp#d HG|K&!JV%T L8,nY8D ȃ{QJ@my<^&b`a 3L0NL4%C TV V͡mm#&1(b@@ M`iv -h3lHJL8"""$,ZEj 90GgL !!*@ !s/l i^ԖTbX`2fBRv2$i!-TH4`hh I KvY)5n ` 0$phe@dvB'tMq𪨰"(9 Y~•DbWCث5jTM` ]A\rO@9OU m_&A{5Pkar;T% ~#oɢ} -qXğ&E"!#èF|=&+c"{MmM z6 &aai0/``a_T v,9ka$eԲ,y!\"xm;Yb&ę;v;/`@~ DhD?x587"ƣ:BL20Y$zQA {g 4|Bq\[ Iwq%!8Z^؟Xvlb\5|a 4'1111f3PK_@88~Hҕv-YvF ̤3kosf׮9=_ݰVU]c<>U]Xټl 0PI/B hKP ;Y"־qG.pY-n n(pS\9J2e08%J&Pm̭@͕..8 -Jv+!N~"PEgUpOVp*M¶|e`Р=,P=/n(͖%$P+DT d H3Jgu^ÅjǦNXBWt 'DBLwtWND X6`(:;;;ą\ƥE] ajN]e]"b^`##ee龡@o`d XDP䇊+ l$ZDINK%d,փq==B|P-,-BmҚ0$P,Aab :! 28ɒ bN  ځDj:c4 v,lfb%R52|b'b&8|Ý杜lVBoc&pep[Hq=X#=Brz#G.F pRrtBA$4&ABfE ?C .WZLX`& 6 #Gf *jg{waB?^ON+gۡp-ʤ#?C+iiONI#f|bR?//d{ JNB*` |\U&`hl,H`)/CߐŢSR2/0.>=>/'SN0t*>@fBjpRZ1\@Ab#F9L E$:i %">bc#[&>8~*/B!&F&t`gp7HVgBR OCCjvlvw@1Yfrfd*6y`J$`FP@nآ$$+JMKbqBI}@r#z, 8R=Kxax\Ub/eNR>"Q&0{WP0tᣬI%N\0V X&p)¦l% /$.~%0⾕C !757Z%, [Z_h97n7#dJ&@[0x6! F`YFD$.BM|MS?e&e>UL#@40D0p BEϧ0dS.n@j3Vk\1v"kMUb7d4 k 9:GL_pi !<Ѓ{PfeV>,#-ڡL KeŦjA:AZA^LA#^%b:vRDr%0M!O;v$-GH.H+tQ?VG7..6sbW߲IQwK2|p*TNn=n skJTBiDI V2"kkn f8np9醄\#]\"e?:R$/m-<͵T%ilTF44uB$&%v4B,dV8$v2tD>5s΢>)# T{r**Py=3u#,֤I%>йJYUyVKgxdDO0K v|oq|H^znjTQyדw~'58`UlB^H iNk wN]Od5%.5vN66rSPB/_#8[nҥP]E(bl+.dTa#j(AY+3IB?&,P2e@I?rMHL؎^F*5EXln 0$K/3:yiza ւH!ߑ3 kQB#bl7dG8z,nf49fG:zh;_c|A&TZJ=fyځ 7%_yLf&¯A$$un–i&]1lvB WrtM"7oAS}r(M*< /1?AAkJ0 uͰ2̨p *qk**cJ KԘ 7ÌaovdVFDxolOlY 'V O6ʛ#감hp\]!<ռ]57 k+0d 6nnZFt l5ֱ<t<0aP@n@PLP  J+r̊/kҍlHa aIVV#lRt(.btTao`do;C"ޅ_*E؄hkРϼ]׋tJ>ۘ)j?~R6=6EXVxabFTS4 y P,1#r/R̪S]ĂLA k)쁚/MƀyÕ8̱򊁲`>Ĩg|Nvr>>>J3GvлUS5MAN>C. $^#B^̨ ˻$ ίAaм+ܫ]'a+ b$}޵^HkעmÄuMu2||߱ (PLPlY\l#*"eg|싾Q (}RݮY@%]tvLoxك𢽵:;a"} %jMnt,EalĉF75ɍX`SW_ ~U3Mt܉'P5mZ%)\Hљ\DTL˜ 7k}1+ްro]ڴA"2d-NhVZkFfTΒś7 X#.pFJwNٟ7͜4*ftZk]v8$[3g͟IެMb>2ԫ3^}1ĻBNv|9Sv*V'Brodo~}Dp3 r=$SIIB!6z*Rq &XV*a"thbVrd$VZTV>/yy@Jt(@ A9eBBtN1TM (1M7 %Zo[%Xf-Np 8ɂ9Yu5&YpIyӏ Ry'e|ZF{|GH#v cuX3C<7(]l26}b 䕠T$sBRKmN|mb.!RAURHo!G֛^/!_Ap${X^}.I]TUiF`!68lmc)ρ$h 6uZm[{-WƤM{Z_}jN\ lIbqyl^L4xtRa6+fCPFbIc!XpB x7I)dE}W"AkaQr"ztRH!|L)HR|R/ΨJ䑼_|.8RdO^h7|?vcLyL>K.Փes ?CZ:MD]\ / tDn:,JCXF 0[(PC8^!n ؂"84]\p3 Bc8%;a bЬ+f5ێqd$㷼6\!bUK"(^r%s/U_wmT`؇/OlK01P^2cX27)(%*᭙᷌nֻQDV)0VB$"9Hf &+5ot mxN6BfY7Ucv]1 xL9POVM{!!g^dʄj2B%éâ9) ahQƓ d mfrH7RDTIRR(D ; _x +E0.JRľ`IPI_xU&6kGqiH[82(N2!1H6ԓd 6%b([T9LCtm?"ɲw-ҵt ʲTE89(#b co q!7܀3wknR*HA ,_u̻LH&w ;p{7͢'dfJeyrʛ9%*vJKj(xHC1]c([Nl}ehKSYND9!آwMb=vdL0T\ 纩6X{Emȸ0r ɯLUS[{^5N?MDM1gAAh1YJyJ35)4Tg踲XԨVJR}VRyR լ~f5Ѳ`Ir8#ً 4eڼޡfL"SA):ikMCk^MAQbbu&EBFnsEn [-i4.nt..ƥ\G2 ҵ<g$h5$RTNTWE ^$'e2u1RCrF.#3_ 'y2"b%b<<cp40LwU Y5u5AM״ d9TkT ӡ ,l)zdQ+rb!pUQ(`؈k8N L7wMgL8`  Y0fJ!K!:SR=7gfs3"i: a$="dujj > ! Z%Z !%h 6ڸ %0VT P@L?S$Y0k}ȊɑHO舘1TSN7XpPӉ tuxA 2يw9 pNᕉ0Jfg\.r.Jv\/p%8{$NuiQe!$`Z/?4!gR$Fxzgr&S!PFXh_KDs$"/<`CVyR4L0*aCDlbU6: EcPQv'W p΁(NxXePaPa1  МPN`wC^t1cYq   q6#Sgt.ѓgG[!S`$.9<،@ujqqj@Xǰ p ǀ נ":zv8װLp;ʣjBGe 9ɜQ*xTx &L vYФYPt]d(AO L:)* Yё2[ "M.VIG박υpH"I>]cHXrט%A8q;qS;!?10;G1i6Q$q9}6Xs4g,ՋX?_Kf'e vQaX6+YMNC i81( ym׉YV %Aua Y;!;)@LLEM!kq.)99د3鯪M)@O!Q,F!;9|ze#޳=Cq%P4zJܸ 1?7LZ{7=߰fhq' 4r yppW뉊9YB5 ^}ge@PPPbSmYB 0,6Y`֠)8ҡ )uN7eofFmtZp\c\ /*p]p0{%xg CG$xg{ mZP",QZ~m]6,q—k 7% X!`XtN4:l*%щfaN+w+v 6P)qB2P @ EEEoRFFld \\X9pF{PuU^^IT`"ӐqÃQ\UrCXF@JG1g"vXp4Ol3u;L˱A V+,klށP^BMCC:*bXZq7fD499l(qND(gW84bq~bJ pr*Jf y2*p`s2[19::@@TFrx hܨfiPT}i$lOSFV:gB[.FD-Ybdud#9:ǂ5lvQ4ĔL~7ЦY[m,OWg~Qq1 n5oE (.bһzGW\GBI T),x0Ι$r&_ƧP1QUyB{գ/_VK&LX#B~@(]ld1Գ~PѰAY* mee&)҇C2esNAQ +  DE]fwdUaaSܒsgFwWAM,&h0 ktW_2Cլ3C2J,wzq6=tFzv)9SsƉ`شڡM(h`i]{FQTR%SS1a\Z@ F=uqOB^YN`71X2 )/B.XVPD*mcaLN -+ZL~ q`Pñ nn]od-Fl4KǕr <ǵ{\!8#$YCΎN>N21rV^J`#^61o,e.RmgXLL3Q*Csg#"#Z\4bNMXy8)nSt 5 Q1oA- lst KWAw9YK_w1ڗ5]1Nbbejk=Wl7/ % *ruo23[h==QrI<{&w=aƢHAip %>N0K{;B{$ېz=1ЛbuN+#4N>^lr^wNuxvȰtBg(6.7!fi¸,FZ F\[Eh-٢-5.%KQI\ʵ\r`;']EΌƆ}iLJS 6DA Nkp A"S(8pH"T\$=Ӳ%6l`j$I'霢9?vا~+S]O?MmWvSj-VЧa%ۨQ1mdŝ1js'ٻ_ZA#CF?J>]̧z ˴liƹgʕC mrSgޥO}n'c*b7n]Vm-:4`bƜog[hS^⻴xs@YeKsd*$DLlpdPA%~QB( *#AQ~<~9d}Dak2eC]]9fD|FpCDIQ[\QS<_j

--/Zk-vΧRʱg:h: o&:hbj'A詷jA;+ N:ZI3⳩gdNZIo;Ϭg$uZ#\n]_*(dt;H 0Wuر@&a ~ f2,i͝4tIDyߤcr߄v~j}c6?؄uDiVi뢿~Ѣd8Kr$-I7 n$m@I ^dY}s_ gZքAaF1` ,"UQU=ReCUPU9+Z!rB@B4x TB'(w;(CC1XM "7R %T kL€_.;4 q4 B+7Q9z`O rr@B/nfR dmLsˠp+86WNMxVS,@Bh2 !Ԉִ0pGҐ]Mx^_Fp P }Z,놷o,5c7bpxB 76H]#.PKS]:N|LE4</bQ"ݡ("O=v>xӛ`öm[8)BZӘTbA.t![q'M.L 4lNGmqJS&+h B=P;TE-bV b 8 `Ss!լGRL5OixE0e݂Ԩ4"hJH@y Ѐh&_)D%X?`a saX@vR5 O@%w)-8gW B[3LN d:a e/&㗙T57&[K#hne0aj͓KxINO ).]ǙTE|TL$#4!bHHEpA<}܅;n!"cY" #3FMQfF*dp'%F ^iV2R kGh0/t5a1 b0F4l(cVi>EfNx0]FD·=ܚFM2F#Tr>uk]wT! g*IU˖U`*@wWխxdCIK;37A "2b- @ HFv2 [#)2q@  $0z| U" K4,~q[L[ƴ0,p+VPɬ<Կp[aeP۱8z&b R&L`)!89JM`^( 8 YP3o62^zS絯}*RTLWlxk{z Q聞,8% 2/V۽`D BØ5xàX C0]X SBC0V#иG؎K R\\N5̵NaUHVɿ(?@i6?6`Q"aI}ȝc4)4q[-PqA$yI⺉98;?D:8xyx!x$8 !ʪh>ظ4H˩* >+ :S:K0FЊà~k|ɒ@ ˏYˑC3cˌ D;ƌٛ  3b(g\ 2#Ïij -A^]l_d p@3S65#dk˃`y,\|ʧb5[ >3llkT:;18[>\ ؊0? '90KP<  _zpOĔPY?eK)C$V᫾Z!Djc#2Tk؄(#~X' q <Ž~闗藑ʏ`}H,ASR_ȸĘ8KAˣSj]0KpG\ñϡ ό12tL๯B*(QOP/Q RLT:LChL5th Pk4 U5\D,?@ ڣȺ܋-\Vٛ\|8[x+fa9AW17xUv(=k,|,:*CY%1LK8 y8Hk45ӭL1%$ 5|V{3T:=H)hT^L9?d?M5_SQ;S١RY"IbAWnh "'nшwkV7h<7 +%5J$Ac9xQXR۫X%ǯӋS8 L;PōOSjlOˏE6-v*g%UY=zʐTyOp0&Ѱ{=DqUli%Ҧ,2 W](H8bH yH9v EjIEx͈|"B [kH_Ala))3}ض,jI  کm}DU] ^-c1&ҕU? 9IaM44 ˤPÖ)/ݥmjE^* CFkB46@ћX^H-laIwpZp3To% ImlɉH\z7k ȧ [%TAy)Ҿ*~(,hB% h؍] q-,Y\hˉe=LL=Ll2ݵ1]qqHb:+** =a %Y+q*bfdb*mf=ub0 0pMP E@T8`9' ǃ}hpHp0H_.6:˺y<ܹ_] ]`Q&qVcn"v][;*i,;ĥ\j @a8暮sdNf&ey0؆pTIkcSޡz!Š$#^)ck,j)II5# NA1*#1ӑ<c2goP2N y@F9yX*Lb+f7vc!n>N^8pڅ9δLK M"P^zY-[TɁ:,>#(Đ[x<񆇮_k00kߠal.:ڙeInqT)`J~Dq7&&^oڦ E[HbFpX޵ۊ Q\ } ^.m~%g&m%^ g6S ʋHXY6=|چ2ca3SWcd"JI&cm閃pRp7| 0BR(S @H8~Wv ԤQ3Tvx +4;507fs]A:ԠӍ:[9ky8;65>èXaT>SlAi}-Skk1Wxx4rpN P9,5E2 }sVO:yI!!03fcIfA%tt9c\FRRxDKD Dw'Ñ ]0=YL<LT4{3KM{ݲ4y: |e?;p:2#(6TP_8QVbHkQWQɉQd^1"HZ,u^lI02!z/ﱾ1RXxİݐ1RX9pXQYu w_4I{$ mXԮݧ?CXLb=ը+*ZԦq]y )2[]%iIr~^LjƹY]NKD]h|!E:P/dX0a1BY8qbEcuc]<$˔(yvl/Dk|JZ")Tp:ߧ2);rD ]999`I:,IirEDN.yn%jS[7lóL23.]i1C+9+<ֵN7iQzɳbv:,-'ݮ\ib[NK VB;Q=TT?O#C2l@T 94CiGX&_`JšM1PX;DBYfEFUv2DNVAa*ب*jeerG?GKe15s; tZ(0z 6FihG`6Z@! 7\uU#7LDcQ GR6r!歹t6ی+$`#%Ք h@!?8mM{A mPZb#mUߊIhSJ?T 1N2e OeuQ1h<5X" MU(bFlԢX@Q's> N1ql =lO=%hd(UA@F$G ZfYJ%iQ4ZllNulr-DZEyN2I3Cl)N_#x㭗xԅ'y&mrl^{QH|rnᅖYdJS%`~$k؄:Sb '" $:D\Y1.ڗ~|ZOS$fE[fJ&iY>8Yb[=lL[l4J!@-57'[+2xMhO飒d:)I6 ~|ns!UH9"cPթX%R`$0 d`ŋ9S ]C) jd1J%.P#qE:k P,3YMlpwP~F`ksj+D؊tch疏=5ى] . Ȣz4 alG?~HP^e`miK $E&)lI;c&p9Wrnp/8(==u v ;AOtlnhZ>Aƽb)I`'e.&O0W%k0NPby9h1kG ρ[Q*B~nux!IH8HR> -w7ЄVER*3,4YRMϼĥ/Ezf I&7a:L`"1Tgk[Zqklb,/>1QԣD?L-B )dbsT CC]de+J$%.! [BHLyɏ҅r 79l."2ϬK#p~8[2@r\HB8~%~c9Y, - _ƑE\ēfLV.`NDlF'6[DUa ˦e2`!C)}fjNqE$hH Ӓ=6խL`g#`)=clٗc:ԥ0c(`Znoܜv] =r ChR'٘cAB,'dfxTr*eY\;:0l)eQ+6Nqppsm2)ơi!EsC$F f< (RHKJ=5-rp(#'DPN֒S|=AՒMܷ MN+]&S3mnhx;`>ᗧ.k1шkTVo`g{Ѷ}L3'{[غN;F`Apy}^KPV,TLAS\--nzjɄg# e;Ҁ4 ZP  ;`ddRxv΂=WNCG!m (VN^4C6 :DŜ![Yy` [E_]W\j9Ȍ-Jp༱[ûM̩Yr,}M1ˡ,^| :4M:F2Mu > 5\C%7 : @pH!tܞ(CtD>#ʁOhu`"?I)C#DYU] ߼Nߝā<`AM@)K*:^C5],r`6f-onT8c#8j'aIIh;jOJM݈u= qC6C8$@7Mm>)}2)CjAg,4AlEp`༈k٠ܘ1+[ "HIHDN~ FEG&،@ ?$v]ש[^[QրHlQX*TP.^<,LU PVK}PpCXh.I?Ŝ| fDTe8 HT>#5e'h:FP)\ l(x܄hh JpC%\CO}4H8*h)@@¼Ty4UdUhG`Et|J`IƖQpaIـ{y`ptɆyEA^l)zqJ؃n7AFFk +^ِUet*MXE#A1ÂB(NC1bɕ='l {^T.`І&u.p rn{}1Gr )- @s{{;>24t4dHF}9V\:cǧX3QJbt7v|vcL,\\7w.$64YL-i{[?,qIɐPU?񨱓uBD=i Rryn |+e ,93`fhF=~>WnFE)Բb77 70Cl^Tk4oCzÚ=5TGSU`!rU' ]NdU| EP)޹ {+;+{?]U/'ØGmU]Sj哅ݳ{'\؅`T& hLH߁Kkn|m-_@z?9@v?77g؇ );-O D.9 #gZ հ_*DŽ/ۇo(|HjuC$WDIfC+WJt&>aDIN5mNh-ڌV3t4kś7 & jpYR7cf1y&Z-v w66+ֶ밓]i5ZҤG>5+V Bl lMiRiէHR#*ت$stB(&7 ͭkiFAxi^РA g9P-Rqs|Ǎ+ld_m+0' Sv]"|,ʜ *2'Iy+kʋj F"Ƽnh3 s]EB Ջ̩**$4 `jʐrȎDlT~觝vDC~kъ:wqf!̲oCkA͡j*J0|8\P0:%P(U6ih`X F9u\8bp[xbx;:9hiN!吆fQkUn!W R" r{C? QB)/28~' 8O!ͳ~E_a_4xq广/7yT,[B̚(faC`/i ~qզ6*Q}TGЪi)<N+e y\jiU`#X9ل""+Zȅ+'" J@%b qN(-R$3 R'`76MxjI]@<:+ QP!LLA-(ݓ Q<>o$)9IhG׎2tR~Z:ƻ.*(eWI OP2|`Chq0z1:(D<œgk"D PBPAU$!eEe*l@@mnV- O˫#ULv۸Œuv,i:NU.Uno)moxjK*2]H1{tF i,aݻF*i}_?c}dVrrq-DgJߕ0{ް=HBu[ ^'pc*IAP'FXM8:QB<챽ӹY<MRW%dUNi>?Ob;ފ?Roҗ82_Tvy+cݧyc/zI_ i*sBs9mJUd6` CsU҄ +0co@sֵBD!!Va%JdȩR cl" eZG_Hږv = d < Mfέ2 -h·f+6mL ÷vj H^rj)ѮLJ'N-¨-P6G rBԚ&^21!}䓶~*JxhMdPy$a«6j) œςJCeF(T@4kY@w%ȭn$mO6n,&a:6bHYnCr!i!Ĥ-T@Ńn&8kP 6 (XʆY B!815ĨT^M$7M c*@ c(4mŐR&5[a% F?ڢ[PoD\G/#03Ad¸޵ҫAAB3C*J,tAP".tZX/u[S)?n\s8)OyG#_CtT=+d,s4D54 eK$>@eda% )$,B2tB;*TJ@t4saCDVEaj4F`jU #I63%XhiH%vI!&8e&nZZ%oO5Mφ_p0tla ~6irq'"ǿg= eRI2m2]YftatTWa!!ôjPpڨ*kZ3q5PXN>qK dJ Nq/rpcxDYQ)Frp8Ha& X*` r9~3S^mb?~"rVr!0 8S. ' ea*Ѻ d⊙TMw᪑h(Ih`X+36tX ]tJ}$ix^niJw̄ey{ 30th\?Χ&~9[]]A߻5rȜtl6$mmbU!ŸҦ |8S; Lx'y+FbF3jъmV:Ӧmט]NHr+k6'\tDm|'%JG}9@_P4Å6|,-RxMm$K'-mIe\pe-ʘTر0~Tέ[$[Kn8Ԝ7ͻ(K:eF\̙)xtb+Dar Hsa,C)$'G$s$qBeխtp;2~#\**UPc>rI\5x b`.t4$x`.8:Hrɭ ؜r4J@7"J|s5\s- \7g#h%)K=M16ዓ= R5TQX:4D\SQ#dVH[FFfewig{ѵR;|O> 6I1[mva(ۢ>R~)Jާkё߃~8M >  !G`qXG$>QP?UDqIeXYkmdcmK,W^+$ONPRA@nP=9oSF$U?iвS=QDLD.] B :8:SLc|YėgP' !GܠdDS^Nf61Ǵāq[N3g,\>;\3<'//޶芔V2d1IY_#`)_k6ɭ7G>sxpSg^́ |߀ &G.?(&4N+Ay :"y(v (Fߴx)(&5cO\Ǵq4{ٸ#O|V2_=/=U{e Y A^{н;7{M?ZͶ*8' 6lbaǢ EGUʀJ*!O# TH"l$ V \'!CȰWR q,(ÙTD! 4-Y3e$GB2d ukȰYxIJd45Z&5I,4x#Hʬє =x*t]0 6(N7p$  *iA,[}|6 n0q\ gęp' О됃 1GMbP0 NSeQVdKCdZG't"HFU?qĀ]C')Iz Z!E^&\G(=ưܑ2s%1 4jrD*״A`(DЇ!Ѓ/ pu\+1Bs :胈V(!T;M @À/NGx6ޢ"/ ej=6凛-go`O$E@P5)B\h*i񾀹FbMǢ~e_:L:[S0ԅ)[dMN@Zn1VxKz[a "P Ce>QDQԖiv٘YK _N8BL}w9vl½X6t|E/Q2p ؐ %Ț2d8(r\Xijy~d6%  r srx# hA.%26P y+DD:#b*xo ɈsoeEdwM)hg.sx,3{)d1c[;ت'+ @/ l |C<&ȂCRy';vޫl󝧎jD϶P=ykC<^ fҏNB )9=ؘeGl 3| 6S[qM{Z/C.b۰E}"l*G)e/ Ij50q0tޓ&c'-#N@wE0 .w'w l8P?mB3@)t: ),rPzq?AGp|3~!r P~.B%@\NH%B= C,6`EcB؂tܢ 9 JNp 2@ 7a @^xׅ^`X,_…r^Ĩgx#n⋾؀$fGN` ӑzy /A:)  lqgDdqȖ00 Aʀp0⑁X797qA {A EG|zzڴ / GKly!̴0P@߀( L nl#@;"vuDaP @~~$3R%R/Wr iS0b&t$[&0C4q03dw2tw~" @1(" dp}j)-X@'r"r"" wBI7QeN ( >*B VԔM)`S+T.F2TR]R/Չhj1atV4q/ VO"N2Wr%.H1%_?qs0晆ypx!G'tߣ-&s hsfuY0cFc pdR&D hPۂ P -!  Dp;r GPX TGP` r t E{2"0g0P X@( P . sb& ّ( z7 m sI9{ r 1b!K .pAppol.@npSե f_ؑW.wJ8pmaPN` 1) w Dp&7hp&:P  O)*a3J.`_S'u h%ch!!I q i"0 XD Zi% 1kcsF? "Y d-({''Lm~ڥ ] 2y:_W6BA\H!P ~9 )zΠ $ @( aЊ/ulPD@F SDR'ADIfoa#X L$~` Vi:Q]8,LV(չ2C'0SE-щVrTFDc0P^0 ) W!c'~/p2j EP!  `K0D {P oPz  o1@Se ,4wwAbJ o@(PJ!R?V0 Pyxes5. զѦcn z op% ƍ rJ_Zn:PP_lpe;6 iUl Bl * 22& <zbF 6(K> ð < t)1l}t0g)ؠms@@mj/\^LUz i1" X0 &  0Ph QٔjQ@_Д 0 I`u _cvqskJ.9qLP$9W[rQ_8r\dX/`y^2׉HWGk$#r: s W fUQ00g  alQ p%Q/ps p!u/qpo /r~G|Auz&Yp \4z>v )!`0 sNa0 j x/!W _!'!/\"j#uٔ zAc8 /  d^' 0 K%+7V^6l5a/a'"ߏ!lXjoG gqzM27_Ir._PPaL  rEU&#?( G%V_h^׻ 4E0 /102/&_00"9 s^x'80oq8ї(|':- ;ߋB((oJP Z=UR lEh _}MɁ@! F,NB IRLP]k P_Q(b~R/^0 360 ujv{-q##˨q2$˴:ѴQA]hYRd%вeeRS1[PS0R0sVX6`PJ!`4j@3@#oG GJY5p@p 5q|$oPH@l@K^ʜdXxr S. ͚Bؠ)J8p!+Τ_`dMrd+ wo*/ ̸D 9! B8e+y ocv+s _ N5c sc2jZ!+j3(VsF_LP 6 $u\5?RtGTQ&?~ #_!u##(%ow25]c@ H\!z1F4~01 I1po%T?NL}B8 <(zRn}@J@͔R}^J ]) `*{ƝݫA00fB083f+NYUB"4/7G Ţkǰ`$ MREؼ8.a .R 742F6wlجtK&hu&lxB'f5%K*:To2(:ԧFZhm@aʔ!bw/9 m4I0:XĩRt҄t@,ޜ08Mŧy1LL*k<;c =d=D0JJF M a8p pS$9E -4aCx|xTp9T UqYVSex 1\PT\e|rтxLML\ؑAp5V9e\F9gdЏPp"piTB^ 0@\N:f"&,`c*͂"NlvAM4tH'*!Nk!$&3e2 ⋯VZbEihj(`횉BV,*:rMa<ĿSNY#[9PM5EqM6McN8 ܉|һ M4S"DS(pB"|dE qP%}A'cb'y:`rɲB ,4b+,"+ʀ6E H"UT[24%`Cfɦ] ݩŀl1;*ݲNc ΪkT>Fe,Ѵ!mJ蓈B,K/+Rj Xi%`+,|:ռY[+e[?}Ѩ~>A#RAbVye Х]xݗx]M]!Oh¸Pq#]ƙa(@ >)]3,iV9dOJ@8%[yaYViO=gMu!5:Q^Gȇ 8j =/xMP(BCT!H"sA5 B$0F2 لTB C5b'n e#9JP$Ph@q C~o\q[-'{ MeF"8G6In/NG~BE p $>ѹ!CQ]v;q]P ЉhK7T;Qgq c*6k)KtD>bNMaN0PQa&x.-n}.,x|CE,p 1`5Zw 2*Fϋ̡lca <C0$$$qCbPrQ \[ dt:]hu+e ܱ w NQlqE1dwD/dPJMd :tT QBBQV4-vKVҹ m[n|nJYRb - BӡLNq-HB r.FlD )Û\&>0)`+8)x[臁":ڇ`ӷ]ãj8BsBb #*C*AjS_KY (ҴR+P ZЅHIR +,pYQ@tZ' Іbpޠtf Ba8 yxȅRBCadr8GX 䚆98@8h <$H9xVupلabab፠hyGH!?׳*PxEs y Љl(mp a ] >of?Ȑrh ̇A ,&S_=Dc&fR[HoFfFndr{*`mb4.c'9⌇$f$@M.L)臥6?ٓbmxIeVQ7t @ Y `xKfiB]<$LiL9 C= ЅC+ @ ǐƨv+`~8k `14P( viDknk tV>Oe-&l|(%` h苍4(!#/  !x.c1.x>3(QMJDjT鋣FZSB%MR-N=FvFnfb U Mi8 p;T h0#C ﴾@dnoR( Cn2OXf0ASnf79lfflA &!-Oz31)1$Y(axwP ZcqIQihoIb8W8q uX`59i` nQD(hj l;ei7?(rk6#(cP,yP,jױsOo3"ieaO!>0#h3,=R2af)i9bB;@:@1_ֺuHuxm Qd7. b lb!$*,rdD^ 7Ђ;m)4r+1r |@ƈN?0 t"^ 7 _4~ky<xZ_T$jsj=)U+ع$MZ. ,fɇfW29pAGm楿K0S.p /jߐB!ئזkdlx`?u{HITxjE#]$jil6F)5RORQ6€y^VN` Bz{CBPQ'}[J!&|32yׁ>\j5k;>߈hW4ysA^?>c7{Q΂B|1k"MBԞzuW7};~LO(/{9mħ7Ep;ephp2 *sa>swEO+VxF`4Mo hR&,X}ϦO씉O<EbÁR:J. #Q[PJMc8+X'qqB+lbw5Fm~m'>[yJ+QBaM7є'e׊q欫m^KFPFK]r]lEB# O# G&]ڜio*]`}+y$ tPa> hƍ=HxTE?6p#Y3W`W_} DK }v؅K;!EFS;:}R5flV h2ji#=Uml(oe/%_ :QV8eN*&MN*e5Z"ێڬlC ]r``VBxSM&eX:kx-J-?ơVXc)Wٜi6'!QGEbQJ'衇0xZə6bšM1%"wC Ⴖ m{PC.!BmGkZD䑕KH01c4YO|O~h۫t)mUa(alD@F$mdqck9lBב8^u1$Fa*Nc%>ӉًYA*GSO'H-ۀEՏ$2̑PrI> gq1לRLAWtl'6Q(QAr.Gl Q|J]*ԫOU7q > &f!VYe_#?\dPSN+"g(>+lWc\#_u9x_LlHꨯ^U&إퟬ8&т&<$h6J:6dqFM^kjf oS\̒<"a\aSя:Ahr\Ulph5АV)Q-5stю$g?s8u%g!* md*V諌ƿf2"]:Xհ bKU.נ,CKlzbȠrKr$U :4;$2}1Ţ}FMԬa+W#IF-G"G6Hԡݶs}ULt ­5[>2y]rD™ 0dE*F;ZFz+ݓD!y0c^ǏN$L]jt&]IMY;՜%B:"E|dˑ$IScӺsgtɺ14 tbّ#8,`$ h &E)Tj.c[pbBal+M:&k _4v_ 90l7b [EFª( e厖CZXĹ5G ٿu[ QEv1di&LbPIQTDc>񡚉K<+*Fa:S:(HCچycKx42mz'- 0sP!JtHY6;qbMRmH,,Ly*Aْ81 rNS0/ [N<nT_yZ"[i- L#~|pVǪ88}r؋3bfR WUJ&zPQTԀ>Db(+Anldc@$)3I.hSƙDe{bI&;XF'aJldِͥeBA?ba&I1nљ&K7B0Z&,B! Ҽ%72 4C& = BHÆz|q8B@ahBۈ?dlF$][`0d6 tN 2z;ܴaȂךX ``qYG㤁_1qT.Jíp(aƴ0 kthIG883 _( D^/ޤ=4\J ZLbzžkCRdOE*X:~A`׺PvZj&B}yD>s,a +BJyPy w6# h${ؓ)XBlhH IMm0s6]5Ea(f%3cnw+cQ`.4kCAƦ7^PjBa0T.vwbfpGߠ2@TjJJg{dەifg@d)PƐ8J\^2csLR(*UV^\v,Ww Fb8Y&h}E~e]2c䠥%MQؑTN5!n&Hc*,-!AIB |&h楍CBdk~aO>*ABh]3^$&aȩE&D&QN S%@e&4'X٠kƁ.4>Ғ$e@;lC,BKB'8gth",B6XD =$C085- , :&W@!A%d[#Fl`#ԃ8>6x&$- #K!n2-$e€3a\&l8 **k&G*t@* , ,\N4%7h4T <4x&"îA;5b#:8i4'#i2.% ,4>h]'@'@]& @!)Fh)#A,I]:@ U$3ÅB ԃ*(3ZtBPNX6Ae, B',3ă<o`#@ DJX m;~,#TD,֫*z AR 6<v 4@5Q #*82`2 mr Ð-ы{6`P pj&8R,H KЌTM|ɗ`ZS< Uq7(5F8t/WBsZ4ȇh~ΗH ݠ. >񌰭"e<(eBÝ$Akd[ 8-q1dvh : Xx v70k([=r.V!d[*[ &<0h$`nxG{B.D ʃ-n1(_])B<4B=h&j DQBL@$,RT܅6Օ6 0L Л[i\]w$*ghQyGZO\{TEX'D>/W2; D_cI5yŊ`SL*6ҥF@zQR׬qY4ō!m$ Mq͉-SoŜD|F6YiD6?ۊ l% ;[ D>o`׮_]eS"S)RVQ/}O.Zqh)xe3mhɧ2Y]jAEVq~ #M[}'taH/%J,2 oߜT M?EVPkꯋ|)_8×Θhm2N%Rq(MƉ]1҄C!K Ʃ$|"._Qv$ŗvD" ~ڡk~zzTQE2gyk+—xa'Yh-X1)-F>=d)S^>Op`MM4FC :(n;%?%3;_ cP%$5h)HC8d3/48=bДGN]Յ9 i thI5nfv*wهmHʏ]pDM=D`e~dh"Hy*mm$0]4*L1UЉǶ@&(sRTwyFy}CV`c>vD[>eр۪:h,mgŪ*m>E[I+K`b dMk*%+) 'r Mؕ&BCu'"*8*y }*]n{d $W_vm'd-g^=p*0Z:B=ؽTaGEM.FY㬴"(/:sG3J;MpH"S:2F49[,F_R|d=HB8X4=9ߠ4p IrdoUKEQ" >V/w$86YPQ?AIH=QRoqhF TtdE(bP]Gq @c$-R;/ŐP#/lk mY5FI6dyٔ$Te5ĹHB1CScw 1Sb cxB43AvޏCXFnrLV y8yNd"h'N:T&`H@jLgC10͑"9XHH; I&D|F\ ͳ^ Nuzy73lOZ:FokѲcN갆5N!Ha'IBL!ƫ;WuE! 0Lg"I5qb%H|Q+Kfai @(nAvGb"CE # |GP QpUAaQpadžW`_ D\E(X҈u/^OABhɇD@ & -GYk(q(@$s d*z2U(&S#yfC>hcf%_dh"4f^v' zw}_,©M0䰽/DD%dOa˟C`v]P$E$TϨp TC4 {Fɜ^ 5::ܱC撋[y#~IȆ ж6un7W[cܑ坆ˑvWT2Kͤ ή/ď [(PɂXbnA"lh\*aY%_ZZڡ N ",A#|bmknC &&n   (6Y a.`"F>qZ֎ɔ&#>`#a0fe/ 0|&aUl? d a  !G8wr$@1cA!,NJAh'9Ln4! @@N.9``gtag6"B t. fH q'I. A4a wA n b@%,lAb@P"| cHL #a Cgheؠl,Hvŕ؍e /i.n0Jd4A *o^ $FGhP(UII.4_DFoڴ*z6bLJ9bF(Cw..zE ba6^K"/Eff FFs"x?KA/>*"ܒ`~WCi\^*EW3 eSEX`ULWLQ57aFbF [Id[6ɒ\|2tP(ZE8fڲ~vmXv,J`WLat+v%CXD.Q.rZ,&4i*h_I!W*`FD!A.bMHxHafj4"8 \΅^rIA7n>* lboc)"oVtCl@; :QS"5'/!!totClgOaN!pG"%2)vnh @$܆ "`(uB/J5A Z \u@7`\F-u!E2Q~\T}%'()d"NUq6(~_EWm3 pT,A` Ȗ2`FBReJRbh !8"|!a`M3q@ J]t2H4Ds=G&eAq2QX7JJ p70爋'\x8|V)ؠ5B3 R%F=ɓ n ! +WpsiDsmaD\fFXn_$/cnBcCYcHnA(B\B$?@I$+N_*$f `HXd`|a֕YYځYb ™>!+b# S#9Ǖ,f 5OT61р"gqv?C 楖a$*lp6dreATmvEYfә 1)g7Q\#@b+^UF煰|0@ݡv㾔7rug9l6t)/Tǘ֯Iy c \@e奖ی,azF#tWa aϴ.t :*w_R6gJӂc3 1%I#g&M2O6v"e(^C"2rqBZe:YEhD72\ s D>?y2& ^J\9@c|"bZԾV7bgPvJJ0"!Ȯy m y&@Ǡi!}\Ʊ!* CH&ґ:aFY$Yz喪eZ.,xS0\ ni *p]z=t=7[kNFNzu6%rN;tVW(th[`p dx|{ƔsmYDXaYd`&λUg`nUƿL kf`"ݕC>XaҡK -eY8O_ؐh;uVj3eP>l::.sw^)(R-@/_-U$_PP B㐗Fc7B>$䏺>l2坨ˢ~ 1D:d^ N vJr.؜t0n!<|>hA~D1T ?~T?까A=2n E6aAZ};%9#/UxWҜJ6;C&}}h؉=)D/K5D)E)8th#+sD!6f/14b@N;(×} Cbv"Rخ_D8voGhJ; ˧)\ҥbf+v 7.hPmƌ:Ɖ6w2:0j8j& ?_d<)CD#WذCm6cY|+KyX-ƷL,eCp8N:,pfF7&uͅiyFfHeg,ٴnѶq;È rY498obMN48+lphġ8w3ZYtWO?~g'2`C)qJ4a| pAFQdcQfYwBagifljxp\ ?gɰC `)C$_*SKy-QetQiUU}wʼnkrCجÚn'ęfuҁtg a /BG*B>s! 0ǥnAӝg\ UxyUZ3IB'y%WE#XKX _7zOtCQcMYu\faJbxřcheӈI l?+-$LI7J+{R^D5Tdtl1;pt'.\`QM91wux 7ߊ%hɖo)L|qqqX<Rg:'7uJJ!S])P6N(Wk[|p"Z` 64,^ r-@La x6ܗ脉NrcU0X8ǗA&tS?7pSKb&|k>MMcg=qz`{g{*g p<'AVJg%ʬr6#'mr1$9Jo},]4N U(LiSV-iK9pLFl"G'5IIy UG>I_F(!HDRl~f¯dQ'NBBPJŠ4bR ӅhC! B2j;$Ovb"z 豍C qIb|QX d> Jؗjr 4^hH̸]HŨhb,0g\#t٤w6)t@)lyE-HaxP/ Q(} \%k&T%~c)Nd4lQPDI6HH9SQN$! XG! u@1gy =O[hGA}M$ /yDH1:I|#d~hp#"*o,M఻.vS4SݔxtG>Vʼ*#D * 5lH"KI KBENK\&; uB~~ޓ[ID_@!Q${#[@5s% 3OFc$[~ b!ֱ$3۰\bW?6%+AK@mveBRPDn1Fs?6Ҏu%?cJ>Di unnVF#@-2M6F+b&7-+x Qa@Xu)P/Ѓ/:1 kbЄq$PP tx&"؆61(c_#dQ0 UƋ`M"64 :8N" zy@IH0xl$Aʘ0 AQP V(Jz T 5Fsjv8R kn*% rlGR2ftm<@({V6JkkHv .`p Lܠ|/`e(`F DpFI |Aq wg$ H|`B$[WgZ~lV5XZU uluG'h_Q3Љt Dk6v1Dv y@ǐ`G`F*V `°q ŨeZ`ZTw5%ZqUZ` !^WV[^ʂpIGB!!1/MXw:jryFg%I&EV^ugeEQDX3Q@$E }zD7{_!$p@mf#{m&IP`g` YPa ]ck5Xg  /` e$7))7Kdp< ' > bG 0?i0CC`k9 ٸC0fFP@lKl P iFF>M%9\vpp5f/P~P !ʀhf_t}D9 )5I$۶ Iנ `0 o|ڔ]ۖ f] cP( Ȇa(thGRllq" V`hSw  a\=@rkbGdtq@t PXDM9-CE6t$_GaG Yyp5ۀWUHIWVcWGWOB8H' 1 IƜ?ɒP ۖ7 PT(]p `.C VZp tW(WZ[5PwevDu(DHI4 *P `CD!Ű w I P pZf%aT I >AGuG D ܔ PYҥIh G @ Jztm.z  HT B;wЪU(=8 K0R FN`1AaaF-hfIf0k p0 pI&80 chKbe 8P`W  `=>nh Dcet` *EhمI Fw {HI KCGh_@G VQ PW0HE p5uI۶ @$p`00s[^jG]IIHE1aXP''ӟl<ʓl0mc9m mpdFࠚ) dt@ 0搶 nMUD v $@G0yn Dz4 0 nhZ0PE} v <%pmJU2T $Q $fY 4К`N€OAiZzZ7r%[۰tUH:ʡ#|q Eف7rLl zq2kml€a /V@D E  [ j` |w ZG 1VX|k@R LV|PcGS S? 5 1aۀ8)a` G1 OY c |bG6 R(J`!z JP!` r @I1mf!3`Z"~ Ћr bG0@;m>G 2 fI?r 09ҨbŢ fjG@sFa67a $ prk2cӰ&GӠ) i 2 i;2 m/;vSQ 9 ߬51KGP* "\5aـ((]%}&sy d djc " 7S`aP ߱m׀ct < 1у rP;VЋ% h0.Gr j+`(IpP@m6g5r oֽ?𜏀耂1cP/K 3h4Ц5a8 >-< }a.&aHJdi.} lS c ]~ 25A0[}Lh#z?XPcJ*)a+}7hG^ +%NGҲE 'ޘQ(^ڰnX hnz0˱ 9.BE#v=B#B#D,ߚGv!I9xCc;Q rF'Oq  S MzqK!_W>d Ʒk@GZdO  zd+EY(y̍NQlg(d(R]A BhP\ĕl[C_N/@.I #t&6~R #k<  zkӲ/U](p ,]}TPE.B͚qu }hOw Tp@c;Ju~ Ư$2ɃBXaȻFQE[`hzq<]"ytis;wz^:2;nnu,1f6"6ӆ`SHGx jUOdyq*W\qxZ:L*=eÆͅV.:>rQ[QMN>M׮pȥht cmZN.f.nwqT_^HӧqAB*TvaE *Ƿ[|mM tdvESh'cS~.-x{nEGVL0e aMmT0cwhJTT fCa EImQF]ə*b!kU!G]80m,ꈖ^̝C!2#Y`H\pR/4B#8؇!7݇*vB0lEEL$  Ew8C(_<# U1`V+93Rr0Pj%b~*U | H=t Y csTA 6 4A4Q8+3`P\K㹆L&_c%84*b)˜6r l`;܅LVYUFT!H|ς ¤DHi_4p[֖!Z VC1.q}(7oA -vr,,_i fCmt(Qbɯ@0M4"h/>CϠnA(H!c!>BVbz&Uvl q1UBytQ yɡ#%ZksdI! H%ɕ|2[p4\paPmViJfv <ѭQق#i.DZEL`$8dԒ$3,1F!MjNS)bZE[yC 8/P-L眈EGub֢ (b-?)=^L~`y0[x#W!L41 9=s2^)Ii IfhȆ؊I0rO1 `)6V#M4rwPQ`~ZQ ךy #.Z֎'O^CnX2$"\%x-rdl)풶,(ݒk4lx |(J>Ĭ[K/* 8J~U53NAF`A4U>c8M?@#RrQ}0#\CVD =4Z; UAa~%6\0q { ` (W10JPCFɶZR'~ YB],Zv)"S`c.TU-q)qZN\C2qOvᄟt'`8t# ^Q;!5׿"ʯ \"-ȵN PU!Da:Er;mcOi؄PCAr"!xІ ;D5,а Ggά5 FP0=`0xL#j| 6䄖%f|f8܉*͝! cJԮ\6D Fk "xHc(J\ ![B62;!49rȬ""(yPLstd6 v^JpZ 6<.%t]P|<xЄG蹥bXh/?' w(b n8/M>A0ԨP=)x}P'x9'؆+Hx$EX647ah6@Ѕc Ȉ@/  ֺЂ~I xl6X OP D,p uS9j (|`3Ć9фSi鈃:*͂ mp6@ pF6m$фI k#ܪkyTx*?BR)3Z bLb_,шy+Ĩ,`', n8)M#a`ȃ<[8wj5(.ڐ: 9 RZ.~=(1bFp>xw ؤxMlЅy8]PFZ~ kml1Fܑm4by 3B6aȭm$&mh4~`=, #$(+Aeh#܅b Ԇ _8؅_9$ɒlx6PK')?U4@M2ߐh sS%M@ 8S@jÆnqJ?6s %%%%)%|W l8DɔK_]ȆX),ؘr= q&8&pP [G?`Ecmb8_A##`iu81zaM&Mt ɾĂ'b8GR+V |:u79SJjD)-lD:X _Qq ]|"ty`TKgrJzzJbjL($M>GȭBػ_NE b~`QEY.Q0ǘjOF66 4TKZȆ<`͆t!U@Aу]脧` "@t֎`"ȂhtXVEFpi-g$[ȆNU()$6 r~0GЃ"Ѓ$'e8bXj~ [ wV]FVtHWt#E`f&X=Ȃ,@/1$ItRiu~؇( % a 8" FLi%(aX:) IZb͍VoE4 6k}[t٘E~Ѓ%quV6QxMcЂ} ;SMtOU$Ox ?(w5 MX-X=: =|ݷ#tH[Egiapj6O9\]ù 3Yh sC80 ^o)Qx[I̆3 exl(YEYHˆ"]Z%"8 [U\R'Cܝ%E8G=FX8`GXM ydE5t=‹ @M{E`c[řJ\ÂOwhFWUK-TK޼;$ILVt,͑̆ xUm@H?ش PJܜ;yy*z9;P4~]n+־tcZc,㑰8pE&&PiqѶ?dLZ?<c>aNdA<^4d_>JH=eZ-{e-1gB,Q%T. ab!=ݙ0yxJ#58dKN;ͼn(FhrD B^P;IG ` jk !^%wDLo s|PHQHO\N6&6yhXfL.CSB1RT+/ WH' g%Dy11+09)хC|& d;&L'nG.l:(a{g@T; hdZ"1,Ğ &A8Fb:,W!цF_u90Q;"s6샲9Ð;##("j!z8*6F$J( ggg$G(oh.o8Q`%cp'`^f_f|R ^%m 4ﶱa3l'1BI<`4cڰw C!9w!@6̶g˚,zb#.qQ| -<ϒp+bMg)i?x)9\^Ɔn +?/R8Щ-/DCDͤincJO|8ƏJ,@'bKm~П[uX_W?JjF*S~Py wzq|[4'4tM3!u|TLZ;%«Ϟy}>1eo~so@fג 6إmڴ, ˺/HԶ.Rp1!^0`f^|u)(A4!TO< Pf@i3^y7SMSPI/RZiREv>VN 7I'1/*JhDL3Scv=$$$y}TWESӖmd$n On(oXzyq+)OLP&v0(w uA6"㞠9KVZU[&kUm%7WՏ d`Q!IVm])PVǩĒKhh5X` B?%5yXciAfWOU55DZIFQa}a%KR!o0__8 'N7Ӝ@ZAۮgwUic4)JjR䨤W- қD1L6ɃӧS xv&{^ɷK?lےD2o2)uY>m;mM4v;i e-!R׻p*zJjJE)2U#R}"y@͔u5I7Q26|?i9856Y'+TEayOUd.WI3-A d=Q7m &Uz Db#E&L@.(Uz#ܑ*#$tH FB5$! Є3Dhh?Z>-M2!v>%+((. FE*YZF,_a[V DqZ((4 uB&""H ' d.'MBs㜍C-q׮ΊH$)s}Vj䖐C-xJ&6Qe&uIQqn(jQzw UhfFJMZxWϣ̝o.]) KY Zt0KgRtd蠅N{dA PSf!HB3Ӥէ:Na Kb )&4lbrIL>!n P62upKiԧyESק֨JeSJԿ";/q`j?[ϖ hhf0j\#i 6洨=->|NjۨEkb}:ȊɟG?D3Ǩl?>8fZzXozkeAvR2bөVjnzبB+Arǟ,%P! 1~^̾t/6"&1qL$ c3/L;L!mTTc xId\C+j|[6]as4jZt%D,KK] ^~80=sJMsV*ƃG~Xkh0릜Uwшv!s#NNq!d*@ƂrkN|eăF{:fZpǾ~0x[ vot6RP0]m"Z[R5Qo wW->nri,ca/VlFj w3;|, :u6 ܮwe"Iq~b!B%sBA/0à( @KT^m. <jQpp=c45y1OyS5qO\%u!w8]\l&UcJ^nt[cf!ueINMdA9YrU*lxFX@InaE220+A9ShAPÃߐ0K8>9+cRx~gɖ)m@pbH13J;na{-9,MQRBb^f!mbmɊKN@pN >PILO@ p-xwUahA )@<` JcYEPN@Tva(^EgĮ$` Fᣐ0 HpT=!?YMOOf ĩ1@ʬlGtEˀ⎰J)[/E$ Τ>ԓt( ϚЄΉ6}@0j5Ż"j лa\P|P,bG]@dCm_Qh_ǜQ i4RZE!B!IlD#S.$D>9IXuPNMvT LPA{{IƟ5E~R V q$TH1)A^1_QiBQ`&5^@@v`@- OFFcDnIIh<AWP8G1bᒌ"E@ b6r@-O'qN1TIDc>*ЫI _KD?AZ ^Fpm!/Bu4O ^JQV0( iU|MATP Wj\@)Yy' ;# F$X>4 `1M0%4̲dTƀ ]EƼؑyHE4T? B(ƒܤdbLK>% utdOT vȉwdbi'JT* [ hF#82"0G 8 GG@K,bAGM&PԀBa gGSEb(.EjY#|#4r BYkVŤ4ʥP %FovZpnt)V}͏PymgLNQLH@ hygzjL|'-`E*HK&|,Ŝ9͢:-K-&E,Ÿk>6a{b|*=i箼&dvzHe j ;YIޓo"??ɍi&i*!0kDŹGi @IHJlYn"b=Y?D#AɐRplE8fmfFU^H1ZR>VJXIH0眆de<2jPrR^茢)흄GPlBE$ "IL(+ҁ'Ą` 5kΣ7VtN.Jkt,5ߑG `ڦ8bJ@W)!^G\Ʈ/V% /{<ѿkN ^ PQN9)BPTJNFJe@VZ$IwO## rJM$-`[rJdBMKK:+V^/DmY>ueS\wfX]K.bCԖN5!#r68A6n(.%gŝE UK9S࢘F)rEEGn g! ]]2O!TU3-%K#p$K\Mr4ٮ.)NϘ)C![_X6zhE<~&Tz)2o"/Or02<)2\ Z>`/nNۛ,9Ԉ5՞:۲:s20 FG>D.5j߁1ʉQr@Y_zbs;xw7jQ5e%r77OEZnK !&47 45Ss-}=J<GtsoX-dS (ES2:lb:a/z?؍;k|\F)#^~倜>SŸR^"ﶵ<+~%KT Y?l^E\LCSk>7^V'~~ƁW/Ӷ#xq? & Ӳ=!DMX1YeB ;Nv9c0-l ˆNƌ&w7 _"I:2e?HmI4lpx3؈q)J4m&*] j%u.]iۥ͠j&T$[ċUql}J7ɗ0S$UMĊo69s>?|%eh6M?Л69vL^kPU-l`ɢ-1NBluGmJq/7y9MП'~?ѡEFXjyUyfK-{`DmԥpG#:c+H2ɸ$emؐ}(CCˮO`#okJ7ݜ!Zh-H&8Ftن0B3,?ȧ'OO\L%JȊ6l)%ІH(2"4 08g();mq p a.CTNn5bs԰nQOoqЪ.$mdVu I)/TJm l|K2׌*"}h(##4㗀!ZFvQ6́smXtq~l$;R(*1>Ĕ;:j:ᙄ<3 7Cb5DoO\+Ɋ@OHp9J@! ق2{e0vJp]%lTTUW;{p W$6O% 4`mvҝSPؐT" ťBt؛|ldQ;(*{™S:*ㇽ13d?N~#CE$VO~⧵męǩ0L:SJHDHȎqHF,A|#_*N>Z5j@՛^#赌SX%dIM(umW,wJʪ5¨"I9+KnV 2f6$U$ mǰw: 9)IX ը"2.?O4 j@/FFYի!L׏A$M +J!cQ6P%Z@{-ׄ&T7R`r# XY/gz[pHB&V,%3 Ġ5QCAd1!;!*8u;q멊?won/4 I`8(<7'7lhvkmh׾^ve/nF3ljcԞvp:{+w9A N]ew)ǯTDPy!g ';{=f7Ѷle "~D@7wJu| c"?щW7R}u‡IÞ'lWӾqrc*;ώKbX0jV ,Cz |8A:Zǎz&h%2&C>)I3?QJy*h `G+t2Hσܒ2& @#CƁkZ'|$O*4U+~ȣFs&^<-%O@*8RA !Q(g#g &l(#S*㬲cIrEe~đ,cQ0l:L0L/f>,OpN$-(MHFieƀ$#LjF4J6oYa u_@n|=d0vA D@m;A<V_%&fGԨMc_-#Tu֑CweB@؀uYvvogk;xw1+\nx" `@]dM@n)nAӣ hz%tC,}en_$JbPv!R> Ǡ4t5F$pjĜxj=B VXfVn@n,F,a1I _ nrak15\SZ4 ҃1S9ND! (=Z.ćwu<{q(:,TVaXh2jx?U64H8j$zpp=j``cfa|؉"gÆ/~$2hEtD^`C, A6ڳE>օ"<'Ak< `&tWWau.3`ʑVsa5H;XIj+-䣊""k19]c5bEpmQQBPh.5Q=M)da(zy#YGDV~{y6͖T~ %,> &t0CƔګ$Ne"7T7@zs/ѨU!HP6Ďv`vfv{8X$NjW8`k>xٻzDZ|O%x=3ΘN-2&TW1DxO#ELSeB中WdmbȥXDCIkbpOQftva@A Jnan2=! rc `k P`a&yI` A^AYjA\B2d@ J}Aô6 H4EzJ,z[=Fac b@ o =:aTA  a?H4;Ap0`g|a@a2@\@ K^vUSxW)yK2oW׽dݻ) @q a'@R!rPAt6!|0"4A!aƬHZ2J}U3H֡@`2@@T2a6! 8TAni,Hb0Am.A! Pa?A`g@vf9ob ^vdǹ䆜gn#d ^Ёӛ&Nr # "(2R./v}C&(C&|}@ ?D㢪 ]Ev)C ]9VӶkA~}|GFJ?~JdY"˕'OF*VP1t5rgT 7y]eMSd[,b!GэY$JENIР목H2hKk#Ek{,ǻ8r}L2Ə_ϊT\M?4aL6׮jtJ꒬ qT͑îe[T䅦Oz d`$ofYDoX#t_!|2k8;2!V.nPuP &x~0, pDat(Yx378yf*&Q&\OZ[FtŽ-S*<2Lh bGdHD1l#/&G2##1H@@]0К0R !&θS0t5Q3pMUУ Yp\Iص:R0zÞ&df Y6*?†Z 7 M F-VKR-^HGra(oG \py3I%|fVr*u ~oI;&  l'qlv-TQQFMFiUDkq5Ta pg3 SO;!ßMlp]4?A\ Q(uA@U;NpS ānь3U0Nđ0qÑ;>6STK.T)T%BJ!/&lkyE `!WW>PE1T1=UX8/-b` Cc@}P5D~0!v]K~PPKG_PɌڂ *Z.=hE0zr!4! qЂws.k.zpGF`hCPS~y H!e%xAR"z`(6WEN%?@UsШbOG!:FY.k@n#Yيے lD.2$(oߜb칣"H* p}QV  bO%(70`%(=JQZ-%~vS2nm,t8AfV$9Y K`R%| OvelRAL8BN]c t! C05!ļHTs.l ;\J 0a&%x(Li!IE?ixzg1N82!( 1S qF* gA^@C2)}1;U$e0XDTQ{F:N!pAmc)D4 RAD؜Z(J+}Wy0Ikl|AxLX-3Nq1HtDB4b)P#”"h(I%-nMo=LBKIPkp QG$slOڢ'ą\@%!ɸ[zSb;p WfEݮ96Zj/pA B$IU<!RhZI1nάrf/96U v hL#R,E V_]ȷ \†*8Ē QI)BBD($BOќT43t d{!(OkR[co-AM}Pޓ EgPJN_O(#\ !+A ~!C=r=lqZV*PG}rۭA9dP? [ >2qHӲL#@A1aZ7D"+*#h!n i8UO9aCؽNaڃN+=*뀓& 9H/O{6! c(3'3)-OwvY~Zag(3tq _I ^`9ihhFivii >R,⁽jf1Aj,jwr5X02XP tH1Z_Fl#l[FiVlWF 1 iۀbW1&mWu2PmC V7Y7pgNaWgYJQ̇2ELUoTtZ&%iU0>dVFx<W۠xR2qCG;0'@El5DDaZ /G T~2P " GstFtpTU[ N_Jf`7*J ~!2#uE@!DR#2/--ڥŕUa(O`liX~3 E ~26p `_6p`lpeV29l6zCT!Mk N@MhZsHO&UAAEZAst Zנ P'/M&y0*pZ AzVe~b~b~~?p ,!%O"5a(u;Et8yO9`&l IȄhl<9 )M6jfb0A0Ob/k%_EOPLJɖT&hh`1lIW&Rt5$3O8x; l5IKc T1cVP-oEU&iK(30 p xiguHUW:1N!4!1SW% 6G i(yt;cޡ Xw7B[RZ8W} y0d_I6\fa fX7Jɨv\\]Ռ!4.a`]2 ҌXgK)5YV^I$ F۰e}Ř_sh`yf`Dwz*00^Pb2|UWm[#2SD $9\sUAUW I _}9a`ΰ#GD ]. p WJWf~8 i?J @@2X{G2sVm#;VxeP9g`j[dylfV9죁>A %E FNn1- kNTD!tKD6Й j4>`@CuZnt1> opW@UGPh_%@PFi%yTaqR$"0Nz Y@@/ ZyU@UPꅯ1H0Pԑmo(t4zNP>~}Q 8JB 2uvܢp .mgz-d0!t 9jTRl P:&yd_  {ۓcZ`j9De 9 T gZ|E;j z802&QTd/d%L_6 9w~p],ςKafGIL#É{k:PIt4_glh>L#atP'aDKN@{q두 s!L澤_擖|z2APVBa/2 I`0 S 0*h`/h $p ԁ` ʱXTDZXh Tpy'En&ubb6G6(17 נQZbw? Þ'Eq` 9{TO!Pq w R? "#R\C?A" BH0oװ z\2 9=GE`! E%4z & "\2J:c/0DQ2\*LP, 1C@Fˣ"Yq ƬC yQ T:3 TDƟ9aET%  (0G90JP L3'\G(|a/ 9!aT'b1N,O,#0VQ0qb2C!Z2G*toArt•MT>qa40v0#8AMV"qd/l ͌sr@;YD Gð Ś`ZShNA0 vNE E@ -aѷ- Ap%-E-\ۛ( Q}s!0zTLa c^Q!l`? ߧ<6## 0L+е5!@cCATRE0 = Eб  '| 1 aTd  {܀A E=U0G0b3Q16 Iݫ@ }2!=)|» G DT D`8{ z S 0E0Rn"R zR,IBZ-~hƔ5m=ɋA^HN&!aY|+30rj cWm@11T'0;'Pm^5o]<-%ǀPf$aP3@5 SjDs02`"㳸!P GU!gC2K 7*g}7paBO&yy d9tS xXkKXșeO L}4Z}Fh[0 xe^;~\-}-g\K1Gd+5'tUǠO!QXKfhwhV>Pl CP+1jqI0"傴(%KO2+ti_y P}LV}C_r;l %  >-:-.J !fO;ipO _R8s ؼs_ mjh fiVYJܿ9w~z&EjZ`0ֹq#W3Ï15_ .B,ԯ$ I=")麆1.;~厣H!IbŮm| Ə3=ryQkɑG<&+ҡ ڶ>_Co~6;c<͞ sJ*-y-g7xKy *PE"B*T1j?~]~G5y}oܛ̕vqޖPu"/Ta,_oo 4L3%8.;尿<\) h!B"/8("lF*rÎ ~J+46;oͣҸrDnm>HEqrH>1$9M;Dj#:i6C=yvڍ(J>9-藅*;d+ƪ͍D\o=%*T=H((KB)FB*  l )l4:XC-Zi=e:ZV=+uZQ]_F+璣=nD2Iۄ,Dͭnӻ%Rb*XQ܆uS,bxXb l%\Ad\p3  kT%T<=YWGRxȹC*Xm$jɭ:+<ʊu`ώuQ gesM4nHLul$I%.wһ6XUC9Z;uWS)R*_&7k)2Ou9[TuQ;H6]֏>utT 7V2 I6D5hMSMfOwsD#CRGjRHy(*ެŪOwJ DQN@.g+\'; FXMdo(cKքFFvA)rC*-Z(O`@EUpbLA 3 C'P*A$4,ҔֽQe$uztbrW|Q*rdԓԞN`"GP>dZp2ȥT :T1RMe.[x-Tbr_XAiԉ$&GrxB~Mf% iyt8@Ǚ\oN{xmRZDWFY qx1Rۨ>wd"W,Iҵpf#椒?mk!!'21JYRg$ -h$|P>>S~,7"u4!u" 0 MF}kJ",@8P\rj* X*¾X8F<[[Azc6"RR9ZLp'vp7]pcg+YְUk6zVO3Z$q[ )׸ǀӰG84'O^]Z¥DrWUFYٵ\P[:m,k}@SQb{>RaB)iKp6ƺY5a+Y*c) 9)i_pi%TIџx.j:5 \fֵJvgkW0/A_ 頷 ;ln~$b%3Ct)L,2qG1+`{֭nB^ v1E0ܣz1YRqq|YH7z敳\+vErAF`:yE+Z]wsс;"~γa$}aH3Ҕ24t a kħ{B:ЧhgwSXH$bi{ؠ v+XYw)v2pi-8 ZuFh%Mny׿vݹcs*Q4U?B"L'Ddd 5kc anRGŽu:^JO:IZ9;v_ȎU&yYvK(ϸf!:˙k;|ඛJ+r~dGl]W{lo]nШKH ǂl Kd/*&85e#1` ۄ[8ۘ#C0J k-Y:/$ x'")J7!&l..n ~H̳[ڰc3Ι/҅: ,AV) -rİ`Zyx@萯'6} BQ a;F4@p)89I4 HÐb6 6hsp a1OJJ-' 2PvᏕz _Q?6QqI1*j4D.(yB ~؆pipq8_̝xp b09ceBG!G\R4lE@qFG JT &N r/ єP&ǯ鞚 ʛy'H]Q)ic$# l=D 0/:Ƿ<'(_(º@bq'8AZ՚lAE `Q[!Ȯ$G3;30[%]gl:,0W, Ŀlѡ jL̜Ia Y7;J RɳHCiII!qAd#Kɡ-j"ZY:(*3HPKb!$9I@$JG RvaQ$`ɚbh/*+Ê*z题( MZ*8:k( 1L6Z 2N̩CRtl>49!hKLIy8#[!O\D "9 ϳG7K2 N('D<>MVST *B ]uƈ?1f\:elM a<:ӕZTG IBpBz2 _%)L- Z:M-/u5ĸЯ,#]XFV!4F1?0[P'lDUչ Ғ& _ htl)CU6aɗR/vc#С*r˳#>A ɩilZi0ZRWlL99O{{LVA1tArpAEWB RF"y_ ɱ֥U<.Aٛ4QRl=n\TX!h^ M!.%8M2Ԥ N.s:̳.\޼!p$Τ /=`Q*DŚ(x1KJ*;B׀ۓx+d*GH j i,kOW*PtPL*ў]L ~ ~LHICtAa$╰L2Xa΄u:$Y+{Qs]!7ݨMљZ?y iɢ@(RD O[Y9w@}EmyR×q ]\Jim[pHӺ)2# 9墤Xy!#z'UUYV)E| ~_  ))}"MۗÁ ͚Z:MYS2EKˣ2t$BLLG,աrQ̕y؀N=(r<:]~PhS̓$Z)"U #p k%&Ap" $ν(HOO#eI+ y#ǥcQ]# $u_t}S,FW1~ 0XgY;5U3r@Vt8VCpAsPqa CE;'ͪrn;<;=ót^8VS=3;{ 1%F$!b;FDVg)psrVgAX\7F;`7v7>95k8=C@=M΢3Ҋ舎;;ùk$]$KC:fioDk&@cdP›5z;iTK);F:{y+( O=xeB1&{=vhAl.ʆ'7HbcXm3ttN5;Cxn5^3lr-i/n"ak7`O!;b )&B;1@UT8yvo{l++:Q5zc~Niy~Jlfa m.h n"kHo^OP9StK7=.hjYۅ[5&fnyS'd;|ӷGi/{1Q=V9pY4U[k6fry꾃;ĺ ~r.Q=Bqkw8n8#+i8a+  5(=O4~Q~D ܇&*ݺo]90e*'ILE))`A,DPCݶo[eȏ hfʔRTi<6U⼉P 9f9OnnЯyBΝ?!vwy̘J|¾۷`T]ԍU#(gݺ$G*ԩSN/>иwSMHN)J4u^qe)['윶wNM7 r8R-RSeuU@ R6V  ^ 4 a'p"1't@6b 7->EnAwOTr BURQ gBVy)fiCnREv`"<z٘pUI}HW l@"hqLEDhYY5ZVFDX EB`vDEWG#^?hI^`I%RS}85N[QRfY>%S_Q eX ZpqXs&1p[^:"KSUԕ*k-SS52p:n嗛mGZj4ϢP>`=%g"ajc˩yDHTg`e:OGj\Gi-|)MOGiW_Y Z=G !VPB %57A4bcۨbX̼3lVejM S 5eӞF_ -[YQwL*_ R' v'M3{װgo< ()4PlRmTLEUUZY:ZڒjQHvNRz#Ma*w~DհK3'SH}h]TVVk@M?WjemuurM<PrzWM59c/ի7@Ä0PV~|QKSN:fY.]đxU$t{M87(I?aݰb*uz5%gJr˜ME~c \𡇈hD_Cp#)! uTٖoLW 11j$Pp sXJc$,/YSaڂFx+#^V%~CNjY1ڕt7E28yR.9Cΐ4_ ?OO!SKN?)L'lhs0X3 f7aRnpR*ӖΔ6.pT/xrmJ*Y6-ݰ~1UvX Ln1ȉ-@A*PQS4iMqVT/]iOSʓ -CRG+:K-@jQEd Bpl? ,1G9eo69b~n$BfuXSvh-+Jڲ7FZWu X!Wk9cUPs7,tмJĵ/mKVTʄW +|ƿrH^T5Ϲ% uX=Z(j 5))Zmѳk`-aʅ-ؐԐ *zKNUPϹsa(`dJC`iq)Ę|C%WƓ)KV2:l"򕽬e, a2kq &dҤ]#yJHBj'$ڎMdTe3cWFGlfCh8fn\^ T\O Uc+qYӺֶ&`'GYUvͼ-GZ҈2K6Ė(#g6YnfwVA$uU{:=fA۱wMk`'9n ^<}-+v|xz7X2'o8C̭0[ DɴT%I|!X^1^y;VVp˒u`hB(C8ED}yFDɄ ˜DRLLo@T1T@ȼّ9_SN nίPm :UB 8I:($*HC'@t!`Yx x͊IbFԍ nHЌdNlCR ;hIŧuBYM%V$V87C(Nd!7H ÌNN\O$}$|<1#Z勾'1NH`mxp a 57)`XL` "J dK@E>zHq'>@>D%M|-;" mcЍ^F^]ꆌ__ĄuM\LP(?PNhyI+"7\d4.҇EْM;S ЉF?&vXM0A'z9d!+n|naҼ>|9%O/^L uEZB cZp1,)I|κK--`Mct'F;!/GAK!"Đ:[JI_0Ty` D$ReK1Bhs |fGJH2RW̳r%G0HHJʐ|jj<. S($7RF8 X\LTSNc~LEE]G_ Ӏ+_7 L e!LQjhLV>bSHnFt+)IN$\Dcީ*aJ$-k6^gCklM&)&<͐!hTK1:WEr '@dޡb"F9YaKLr4ts`tH?TGT_EbrPE%tB%FE,4xmǀlt,Ė_ ׽ X5hl,Xm lMC9SRSlFg02늧H!hD._ƒb`hZv".m 8j×GftXx>] EEoK:>>٤{lԨnd;%E6ⰦÜ68A׆GERp,(I~,( /.S!8n=,)*DBZrD{hPOO+LOc8|U;u| c\$pu?nζ}{.K<W=>ʽNUX^%0r ˫)C*۳ܰ{=}s+L9 j) 災KTLt_*R ?~h%e6gxQdȏ oB$Kal7nTNt243Ȥ 6.kҴ2/B{ezSI*am&f˗E26A1Q"0U=N6aNwf]טً{o7%\?amH}(A0'$&:h:;V̻ʾ1@B' .ՂzDYH7Ŧ*j$~(o:!Æ萌"## K 8K5w+A+&PkXF1Brc?{suh uz !7<$!;"At7$찣$DA;D4s//ۉ4R C` )sL"jJi /鬳jbK+LХW%yF]gc:H Rn\0#>뎑G)5sҗU*bU]Wa%ny[S[}}:F8c)oM}t6""?*jnd*Ҳ u饩B7U@# X=]ލV|z.~bv:<sGv 6a|BBú4iFNˬJeލ=O_ QМo)u?fM"U9C:å,}\ G4l] F)vSˣ0t}P@J*P )ʋOrCFF@Tu4S)%ܭ,A^rJbY-RkӳYߥ ??wj !l?,b'Yx։J¡̈TAMƕDbMwجq)4/ћ25o&I[TD%qF@a'=I#⚟5`],`O}EN T1A!cGsC(MMx9ͯdB|MAd^5tyx|i Kz{Qn`tB-7p*DWi5HZD4pLZ")HUidgJDh&Lbl~r ̄yj~'77D]qtܮiH C@P*kYPI jjQb([.ifXg3x3'<ٙOtd?~" (? JPntܠ;Jَ d$퀌ŭDՌILҳuC}DPƴEjA ST8Dÿ62U ' )fĺCEZJ2:oS{4 Pϼ 5h6W©ȁ*rZ&((!Q`PHUd.j[wκRѦxAiwUsg)T~ADC&f( T~0G K-&B"Ò2pY\X:Ҳ5:qzxNp?P6&0C Y `&ƠE_2o- q6#/eB)~)0v~#!%p^9.1 :&( )D5(;K=.@8FhgbLj$N̐G "H(Z|0 B/$!.+V)4j o`cji҄Fn$}ė)~DHԘ $|CW,' Uz"E:( :%>LB?ї| OR!q!DȈ89Q Q`px:묈(qD`=椴Q> q{`y\e,Gfhf4>+ݮA2FM"or ^'! "cb8BEc3*&G DVǏhF}0_ZĖC/X>&hK1-[&woJQ\)-3'F&d.({ h! O`PDi2P,$ sq,.Ə)MLGFs",[w:!u'x\SPIQ6 XbY#ER^ h ?kiY`ΰ7ca Θۜ#w6wMddbTгRGx'uDGZygop1"$4AB@iu$"3]+j ;oBHaiSpN:u[Nʤ . T@pHLslɈ:%1;z2*6AUX-GmnCaRo w z5,J ǪDrEx-` ]ǰv\#JgAr6R6H/. /C-|{'T*_F>)1ALsbDP ŚF DJxzW瀎{w*Dk|w͉A8c-PfgHj@@ d(FVsJiu}Nԁ A/ޮ{8Fk)g\(+!OdHD!6pZP222B⥞/΁؉,fD"Yvb49@ &AweJSd~E/ԮF TS.4,d,JtL: !ʴnv0nAV(+L;nǮ`ꉼ&깮K̘yƢ׆àye-94 0s00k(EI kH.̝ L js  +P䏢0#+GI ʶI)PvȅNK!ʡͣCj6mM|--ެF߬|+kp^ZOI*[ TjplR_찬"m +oϠ(ƚ+*$5uh\4d,xV+n ym,0M -jJz!* ( b(ֱ˴92..rѼ ߌ2JЌj͐ꙩYxnDa꘢$lX0֪m;`i\8/ Ŋ٘+L͟C*Į.970Om0b r.- -*Z+N r mӠmٰD,6*f j2pI};rm*;Q:hz\("Z۸g$Úxx>ix?fI DK,mun͸\'#Q$3ך; oҀ Xiq&!pd"EPZ:;/m-hU`%fV KXT;cjYEV@OWHbg:uTM:sq"{A}H31"&p}d 7dQoYe7!{CYaC$Ar[^BQ~*8W]nV敄uq ]^Q=E!MY'vH"aU#*b#q[Q%zz$",3CW yTUeCvE=VB*D(IMW+{-x< ~;N"Y>27nhunwHr5l:Hɏ$TP>HYr1Y&ؤBQz2Su?ڳnF0V @%?JI$=ޤߥhgl>=m#a)Or$)slmcVA?41w,!B ^{x.]cisDP.bm&><$Dȑ3 f̗rS(IBp$%Nv\WK3'_~Y=t(IXEuXĚ'-?~L VaÆ'KJS#7'c2:-i&"zx>%1c*+F++[ܗn5֭&I.4+U׽ᦄ^NSP̞:yԩ5 ̥]Zѭa~ͥ}5_91"qfUKw|1mD2 _c0)V U'FNM)2lsrf])Yh? tA]#!AY`Ub_xh|va9GmhO< T9TT8 T>Uqlu\~YhdY\b@Il]sD ^|qgk&yBSM0dT;$q&aSO[S oBEUVS>蕕bM>utbtfʚw{w->4lR y]IR{+%g\]G:<R ՠRJ9ehm[й!V/y8z_>ӈBK=)NZ%V F(VXT_D[t%^^oVv6M4IE,)ÔR蛱K/}SMK\N9W`e5ky[c*؛6vE)Hs`hxFϮDmO}hS>Tq`qV[ 1w̦^Qv`npϪS䢄L[ǾK-S` wiWt?eBh|}&/_¬'1 WcfipIJ@}2#Bˍ1 ;9ZtGPIN'Agt4+ .3N\5_ܐ9;espresso-5.1/PWgui-5.1/tests/0000755000077300007730000000000012341333047016210 5ustar giannozzgiannozzespresso-5.1/PWgui-5.1/tests/run-tests.sh0000755000077300007730000000165412341332511020514 0ustar giannozzgiannozz#!/bin/sh module_message() { # Usage: $0 module echo " ============================================================================== * * * Running GUI($1) tests. Please wait * * * ============================================================================== " } file_message() { # usage: $0 file echo " -- Testing file: $1 -- " } run() { # usage: $0 dir module module_message $2 here=`pwd` cd $1 for file in `ls *.inp`; do file_message $file $PWGUI/pwgui_reformat $2 $file if test $? != 0 ; then echo "an error occurred for module: $2 , file: $file" exit 1 fi done cd $here } #for module in \ # pw \ # ph \ # pp \ # projwfc \ # chdens \ # d3 # do # run ../examples/$module $module #done run ../examples/pw pw run ../examples/ph ph run ../examples/pp pp run ../examples/projwfc projwfc run ../examples/chdens chdens run ../examples/d3 d3